From fd731fb48015a46c2f60ab92244aa6ccd5b0ccd4 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Thu, 20 Nov 2025 05:55:18 +0100 Subject: [PATCH 01/28] Add initil quarry with working (seems like) mining, first pass on model --- dependencies.gradle | 4 +- .../utilitiesinexcess/ModBlocks.java | 2 + .../utilitiesinexcess/UtilitiesInExcess.java | 2 + .../common/blocks/BlockEnderQuarry.java | 335 ++++++ .../tileentities/TileEntityEnderQuarry.java | 254 +++++ .../config/blocks/BlockConfig.java | 3 + .../utilitiesinexcess/blocks/ender_quarry.png | Bin 0 -> 2028 bytes .../blockstates/ender_quarry.json | 8 + .../models/blocks/ender_quarry.json | 986 ++++++++++++++++++ .../textures/blocks/ender_quarry.png | Bin 0 -> 2028 bytes .../textures/blocks/models/ender_quarry.png | Bin 0 -> 2028 bytes 11 files changed, 1593 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java create mode 100644 src/main/resources/assets/utilitiesinexcess/blocks/ender_quarry.png create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/ender_quarry.json create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/ender_quarry.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/ender_quarry.png diff --git a/dependencies.gradle b/dependencies.gradle index dadaf6e2..419fe657 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,7 +34,7 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:GTNHLib:0.7.7:dev") + implementation("com.github.GTNewHorizons:GTNHLib:0.8.9:dev") // TODO: remove MUI1 dep when the implicit dependency // TODO: in IItemHandlerModifiable is removed api("com.github.GTNewHorizons:ModularUI:1.2.20:dev") @@ -46,4 +46,6 @@ dependencies { compileOnly('com.github.GTNewHorizons:Angelica:1.0.0-beta62:dev') runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.31-GTNH:dev" ) + runtimeOnlyNonPublishable("com.github.GTNewHorizons:Angelica:1.0.0-beta71-pre:dev" ) + runtimeOnlyNonPublishable("com.github.GTNewHorizons:Hodgepodge:2.7.17:dev" ) } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index ad5a3c95..381eddf2 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -1,5 +1,6 @@ package com.fouristhenumber.utilitiesinexcess; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderQuarry; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -104,6 +105,7 @@ public enum ModBlocks { SPIKE_DIAMOND(BlockConfig.spikes.enableDiamondSpike, new BlockSpike(BlockSpike.SpikeType.DIAMOND, "diamondSpike"), BlockSpike.ItemSpike.class, "diamondSpike"), UNDERWORLD_PORTAL(BlockConfig.enableUnderWorldPortal && UnderWorldConfig.enableUnderWorld, new BlockPortalUnderWorld(), "underworld_portal"), END_OF_TIME_PORTAL(BlockConfig.enableEndOfTimePortal && EndOfTimeConfig.enableEndOfTime, new BlockPortalEndOfTime(), BlockPortalEndOfTime.ItemBlockPortalEndOfTime.class, "temporal_gate"), + ENDER_QUARRY(BlockConfig.enableEnderQuarry, new BlockEnderQuarry(), "ender_quarry"), ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index c6c8987a..c1654af7 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -1,5 +1,6 @@ package com.fouristhenumber.utilitiesinexcess; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; import net.minecraft.util.WeightedRandomChestContent; import net.minecraftforge.common.ChestGenHooks; import net.minecraftforge.common.MinecraftForge; @@ -124,6 +125,7 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityTNTGenerator.class, "TileEntityTNTGeneratorUIE"); GameRegistry.registerTileEntity(TileEntityPinkGenerator.class, "TileEntityPinkGeneratorUIE"); GameRegistry.registerTileEntity(TileEntityNetherStarGenerator.class, "TileEntityNetherStarGeneratorUIE"); + GameRegistry.registerTileEntity(TileEntityEnderQuarry.class, "TileEntityEnderQuarryUIE"); lapisAetheriusRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new LapisAetheriusRenderer()); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java new file mode 100644 index 00000000..6c5ad034 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java @@ -0,0 +1,335 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockEnderQuarry extends BlockContainer { + + public BlockEnderQuarry() { + super(Material.iron); + setBlockName("ender_quarry"); + setBlockTextureName("utilitiesinexcess:ender_quarry"); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public int getRenderType() { + return JSON_ISBRH_ID; + } + + @Override + public void onBlockPlacedBy(World worldIn, int x, int y, int z, EntityLivingBase placer, ItemStack itemIn) { + super.onBlockPlacedBy(worldIn, x, y, z, placer, itemIn); + + int direction = (int) (((placer.rotationYaw + 45f) / 90f + 4f) % 4f); + + worldIn.setBlockMetadataWithNotify(x, y, z, direction, 2); + + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof TileEntityEnderQuarry quarry) { + quarry.setFacing(getFacing(direction)); + quarry.resetState(); + } + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { + if (worldIn.isRemote) { + return true; + } + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof TileEntityEnderQuarry quarry) { + if (quarry.state == TileEntityEnderQuarry.QuarryWorkState.STOPPED) { + BlockPos inFront = offsetByForward(x, y, z, quarry.getFacing(), 1, 0); + BlockPos farFront = offsetByForward(inFront, quarry.getFacing(), 64, 0); + farFront = offsetByRight(farFront, quarry.getFacing(), 64, 0); + + for (int i = 1; i < 256; i++) { + worldIn.setBlock(inFront.x, i, inFront.z, Blocks.diamond_block); + worldIn.setBlock(farFront.x, i, farFront.z, Blocks.diamond_block); + } + + player.addChatComponentMessage(new ChatComponentText(String.format("Set up work area from %s to %s", inFront, farFront))); + + quarry.setWorkArea(new TileEntityEnderQuarry.Area2d(inFront.x, inFront.z, farFront.x, farFront.z)); + quarry.state = TileEntityEnderQuarry.QuarryWorkState.RUNNING; + } + player.addChatComponentMessage(new ChatComponentText(quarry.getState())); + } + return true; + } + + public static ForgeDirection getFacing(int meta) { + return switch (meta) { + case 0 -> ForgeDirection.SOUTH; + case 1 -> ForgeDirection.WEST; + case 2 -> ForgeDirection.NORTH; + case 3 -> ForgeDirection.EAST; + default -> ForgeDirection.UNKNOWN; + }; + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityEnderQuarry(); + } + + + // TODO: REMOVE + public static ForgeDirection turnRight90(ForgeDirection dir) { + return switch (dir) { + case EAST -> ForgeDirection.SOUTH; + case NORTH -> ForgeDirection.EAST; + case SOUTH -> ForgeDirection.WEST; + case WEST -> ForgeDirection.NORTH; + default -> dir; + }; + } + + public static ForgeDirection turnLeft90(ForgeDirection dir) { + return switch (dir) { + case EAST -> ForgeDirection.NORTH; + case NORTH -> ForgeDirection.WEST; + case SOUTH -> ForgeDirection.EAST; + case WEST -> ForgeDirection.SOUTH; + default -> dir; + }; + } + + public static ForgeDirection turn180(ForgeDirection dir) { + return switch (dir) { + case EAST -> ForgeDirection.WEST; + case NORTH -> ForgeDirection.SOUTH; + case SOUTH -> ForgeDirection.NORTH; + case WEST -> ForgeDirection.EAST; + default -> dir; + }; + } + + public static ForgeDirection turnRight270(ForgeDirection dir) { + return turnLeft90(dir); + } + + public static ForgeDirection turnLeft270(ForgeDirection dir) { + return turnRight90(dir); + } + + /** + * Offsets coordinates to the right based on the facing direction + * + * @param pos Current position + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the right + */ + public static BlockPos offsetByRight(BlockPos pos, ForgeDirection facing, int amount, int vertical) { + ForgeDirection rightDir = turnRight90(facing); + return new BlockPos(pos.x + rightDir.offsetX * amount, pos.y + vertical, pos.z + rightDir.offsetZ * amount); + } + + /** + * Offsets coordinates to the right based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the right + */ + public static BlockPos offsetByRight(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { + return offsetByRight(new BlockPos(x, y, z), facing, amount, vertical); + } + + /** + * Offsets coordinates to the right based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the right + */ + public static BlockPos offsetByRight(int x, int y, int z, ForgeDirection facing, int amount, int vertical, + boolean relative) { + BlockPos pos = offsetByRight(new BlockPos(x, y, z), facing, amount, vertical); + if (relative) { + pos.x = x - pos.x; + pos.y = y - pos.y; + pos.z = z - pos.z; + } + return pos; + } + + /** + * Offsets coordinates to the left based on the facing direction + * + * @param pos Current position + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the left + */ + public static BlockPos offsetByLeft(BlockPos pos, ForgeDirection facing, int amount, int vertical) { + ForgeDirection leftDir = turnLeft90(facing); + return new BlockPos(pos.x + leftDir.offsetX * amount, pos.y + vertical, pos.z + leftDir.offsetZ * amount); + } + + /** + * Offsets coordinates to the left based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the left + */ + public static BlockPos offsetByLeft(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { + return offsetByLeft(new BlockPos(x, y, z), facing, amount, vertical); + } + + /** + * Offsets coordinates to the left based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the left + */ + public static BlockPos offsetByLeft(int x, int y, int z, ForgeDirection facing, int amount, int vertical, + boolean relative) { + BlockPos pos = offsetByLeft(new BlockPos(x, y, z), facing, amount, vertical); + if (relative) { + pos.x = x - pos.x; + pos.y = y - pos.y; + pos.z = z - pos.z; + } + return pos; + } + + /** + * Offsets coordinates backwards based on the facing direction + * + * @param pos Current position + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset backwards + */ + public static BlockPos offsetByBack(BlockPos pos, ForgeDirection facing, int amount, int vertical) { + ForgeDirection backDir = facing.getOpposite(); + return new BlockPos(pos.x + backDir.offsetX * amount, pos.y + vertical, pos.z + backDir.offsetZ * amount); + } + + /** + * Offsets coordinates backwards based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset backwards + */ + public static BlockPos offsetByBack(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { + return offsetByBack(new BlockPos(x, y, z), facing, amount, vertical); + } + + /** + * Offsets coordinates backwards based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset backwards + */ + public static BlockPos offsetByBack(int x, int y, int z, ForgeDirection facing, int amount, int vertical, + boolean relative) { + BlockPos pos = offsetByBack(new BlockPos(x, y, z), facing, amount, vertical); + if (relative) { + pos.x = x - pos.x; + pos.y = y - pos.y; + pos.z = z - pos.z; + } + return pos; + } + + /** + * Offsets coordinates forward based on the facing direction + * + * @param pos Current position + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset forward + */ + public static BlockPos offsetByForward(BlockPos pos, ForgeDirection facing, int amount, int vertical) { + return new BlockPos(pos.x + facing.offsetX * amount, pos.y + vertical, pos.z + facing.offsetZ * amount); + } + + /** + * Offsets coordinates forward based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset forward + */ + public static BlockPos offsetByForward(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { + return offsetByForward(x, y, z, facing, amount, vertical, false); + } + + /** + * Offsets coordinates forward based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset forward + */ + public static BlockPos offsetByForward(int x, int y, int z, ForgeDirection facing, int amount, int vertical, + boolean relative) { + BlockPos pos = offsetByForward(new BlockPos(x, y, z), facing, amount, vertical); + if (relative) { + pos.x = x - pos.x; + pos.y = y - pos.y; + pos.z = z - pos.z; + } + return pos; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java new file mode 100644 index 00000000..e41ba0d7 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -0,0 +1,254 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import cpw.mods.fml.common.FMLLog; +import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import org.joml.Vector2i; + +public class TileEntityEnderQuarry extends TileEntity { + + public static int STEPS_PER_TICK = 40; + public ForgeDirection facing; + private Area2d workArea; + public QuarryWorkState state; + private int dx; + private int dy; + private int dz; + private int chunkX; + private int chunkZ; + private int brokenBlocksTotal; + + public ForgeDirection getFacing() { + return this.facing; + } + + public void setFacing(ForgeDirection facing) { + this.facing = facing; + } + + public Area2d getWorkArea() { + return this.workArea; + } + + public void resetState() { + brokenBlocksTotal = 0; + this.state = QuarryWorkState.STOPPED; + } + + public String getState() { + return switch (state) { + case RUNNING -> String.format("Quarry is currently mining at %d %d %d, has already mined %d", dx, dy, dz, brokenBlocksTotal); + case STOPPED -> "Quarry is stopped."; + case FINISHED -> String.format("Quarry has finished after mining %d blocks", brokenBlocksTotal); + }; + } + + public void setWorkArea(Area2d area) { + workArea = area; + dx = area.low.x; + dy = yCoord + 5; + dz = area.low.y; + chunkX = dx >> 4; + chunkZ = dz >> 4; + } + + @Override + public void updateEntity() { + if (worldObj.isRemote) return; + if (facing == ForgeDirection.UNKNOWN) return; + if (state != QuarryWorkState.RUNNING) return; + + int brokenBlocksTick = 0; + + while (brokenBlocksTick < STEPS_PER_TICK && stepPos()) { + if (!isInBounds() || this.chunkX > 1000) { + FMLLog.getLogger().error("Tried to quarry outside of work area at {} {} {}", dx, dy, dz); + state = QuarryWorkState.FINISHED; + return; + } + if (worldObj.isAirBlock(dx, dy, dz) || worldObj.getBlock(dx, dy, dz).getMaterial() == Material.air) { + continue; + } + worldObj.setBlock(dx, dy, dz, Blocks.air); + brokenBlocksTick++; + // breakBlock() + } + if (brokenBlocksTick < STEPS_PER_TICK) { + state = QuarryWorkState.FINISHED; + } + + this.brokenBlocksTotal += brokenBlocksTick; + } + + /** + * Are the current dx & dy & dz in bounds + */ + public boolean isInBounds() { + return dy > 1 && this.workArea.isInBounds(dx, dz); + } + + /** + * Are the provided dx & dz in bounds + */ + public boolean isInBounds(int dx, int dz) { + return this.workArea.isInBounds(dx, dz); + } + + /** + * Step the quarry working position by one block + * @return True if we can keep moving + */ + public boolean stepPos() { + dy--; + if (dy <= 1) { + // stack is done, move back up + dy = this.yCoord + 5; + + boolean resetX = false; + if (dx + 1 >> 4 == chunkX && dx + 1 <= workArea.high.x) { + dx++; + } else { + if (dz + 1 >> 4 == chunkZ && dz + 1 <= workArea.high.y) { + dz++; + resetX = true; + } else { + // next pos up z is a new chunk and maybe oob + if (dz + 1 <= workArea.high.y) { + // just the next chunk + dz++; + chunkZ++; + resetX = true; + } else { + // the next z slice + if (dx + 1 <= workArea.high.x) { + dx++; + chunkX++; + dz = workArea.low.y; + chunkZ = workArea.low.y >> 4; + } else { + // Finished with area + return false; + } + } + } + } + + if (resetX) { + // need to move x back left towards/to bounds + int toMove = dx + 1 > workArea.high.x ? workArea.chunkOffX.y : 15; + if (dx - toMove >= workArea.low.x) { + dx -= toMove; + } else { + dx = workArea.low.x; + } + } + } + return true; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + facing = ForgeDirection.getOrientation(nbt.getInteger("facing")); + state = QuarryWorkState.values()[nbt.getInteger("state")]; + dx = nbt.getInteger("dy"); + dy = nbt.getInteger("dz"); + dz = nbt.getInteger("dx"); + chunkX = dx >> 4; + chunkZ = dz >> 4; + brokenBlocksTotal = nbt.getInteger("blocks"); + + workArea = Area2d.fromNBTTag(nbt); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("facing", facing.ordinal()); + nbt.setInteger("state", state.ordinal()); + nbt.setInteger("dx", dx); + nbt.setInteger("dy", dy); + nbt.setInteger("dz", dz); + nbt.setInteger("blocks", brokenBlocksTotal); + workArea.writeNBTTag(nbt); + } + + public enum QuarryWorkState { + STOPPED, + FINISHED, + RUNNING; + } + + public static class Area2d { + // The corner that has the lower x&y + public final Vector2i low; + // The corner that has the higher x&y + public final Vector2i high; + // The width of the entire working area + public final int width; + // The height of the entire working area + public final int height; + /** + * The relative x offset to the chunk grid, + * with vec.x as the extra space to the left, + * and vec.y as the extra space to the right + * */ + public final Vector2i chunkOffX; + /** + * The relative x offset to the chunk grid, + * with vec.x as the extra space to the bottom, + * and vec.y as the extra space to the top + * */ + public final Vector2i chunkOffZ; + + public Area2d(Vector2i first, Vector2i second) { + int lowX = Math.min(first.x, second.x); + int lowZ = Math.min(first.y, second.y); + int highX = Math.max(first.x, second.x); + int highZ = Math.max(first.y, second.y); + this.low = new Vector2i(lowX, lowZ); + this.high = new Vector2i(highX, highZ); + this.width = highX - lowX; + this.height = highZ - lowZ; + this.chunkOffX = new Vector2i(15 - lowX % 16, highX % 16); + this.chunkOffZ = new Vector2i(15 - lowZ % 16, highZ % 16); + } + + public Area2d(int x1, int z1, int x2, int z2) { + this(new Vector2i(x1, z1), new Vector2i(x2, z2)); + } + + public boolean isInBounds(int x, int z) { + return x >= this.low.x && x <= this.high.x && z >= this.low.y && z <= this.high.y; + } + + public void writeNBTTag(NBTTagCompound nbt) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("lowX", low.x); + tag.setInteger("lowZ", low.y); + tag.setInteger("highX", high.x); + tag.setInteger("highY", high.y); + + nbt.setTag("area", tag); + } + + public static Area2d fromNBTTag(NBTTagCompound nbt) { + NBTTagCompound tag = nbt.getCompoundTag("area"); + int lowX = tag.getInteger("lowX"); + int lowZ = tag.getInteger("lowZ"); + int highX = tag.getInteger("highX"); + int highZ = tag.getInteger("highY"); + return new Area2d(lowX, lowZ, highX, highZ); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof Area2d other)) return false; + return low.equals(other.low) && high.equals(other.high); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java index b1070d77..0980d670 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java @@ -82,6 +82,9 @@ public static void registerConfig() throws ConfigException { @Config.DefaultBoolean(true) public static boolean enableEndOfTimePortal; + @Config.DefaultBoolean(true) + public static boolean enableEnderQuarry; + @Config.Comment("Cursed Earth Configuration") public static final CursedEarth cursedEarth = new CursedEarth(); diff --git a/src/main/resources/assets/utilitiesinexcess/blocks/ender_quarry.png b/src/main/resources/assets/utilitiesinexcess/blocks/ender_quarry.png new file mode 100644 index 0000000000000000000000000000000000000000..4912f4e9eb3defe584e68c34e02228d183615fa1 GIT binary patch literal 2028 zcmV-P)978d1k~0bsLxI=@M-$GQNk3UdL&2^*)? z8^?9o05HAyp{jXLrye+fFb2RSqJkg*Y}-;zE~KTMVCLSe9zaE8{9F!zx=5{&^=uJ9 zs0C1_D`)@}nO@Y_xLPy;Kv6LuAAr`(z5CKT@V+{y1t8_b=uq{6I_6tIRz3@G^#g4H zO0)|U187))2Y|z4luZ96faO|%nfDCfnIhT+ z-s&B!yG+Ygs{r^+nc}K0L>OiF(N39KxUI@6Jr0k^<*^6=Z_EzmC4fZqH3CS@sBM=H zF^HjOW`lN_!Lmr~2h1K8z%+~NQ5Mh=00AO^BK4fkvyZF@0HzN`FNNpNoCyMOt-D7Z z2_QBN+WFfj)1O0xn1Nj&>c=ESuLCjwY@2Lor2z2tb|Un}F&uL}KmY@C2UM1da)JEq zaJF>-$X@j;)>Y`s`D*S2mFgl(KXj={ijD#K0J5S5gen#QeYr@qKw1K_$G)TMqZUC> z<;ia!M*(1vveTk|HAU4#Y8}pem;bUeD_>UNri%5kUoo=}IRWHlwJ-pFVU|+LYs~R( zkYal#(7hYC$<-~97C;x^KguoQp}k@2raR7A9&ivEkv_t;$QdQjPg20_6h0 zjm~8PI5yCy7AJb9!iBmrvf=@)1@Mj7Dp2IPA<%l}+gn*|3 zRAg+&XGywjsRckT02m5pHt#tb0P9W36XBtvcZY1t6d$eR_I;#1*Yj>rxTbyFXEa<3#OwqiCjhf-cf1MU1Lc3d=Mn&e zed=qHecuNlENfKcTKD0k1eJLq3Ml|+*wsPGyw0U3x3}hBQ(OazwE+7sFKiFbnB~K# zJ5oDRPF$%NV0ZA}$u4=Xr2x*$hMq543IMUde#?YsO1XdyfE}dt_1m&E`CK7@UlwNM zp9}zZ{bc}{{UU&62SHy4A*{J^-wsYT0PgZw4g#=iRHhz>0f1E^SeXF$2AOdQzin|0 zsK}w}Tqyu3qb|&jul^znz(}65EP(A`5kvrl68i@!C>H?ASYw+2nsD47EU#SnTclQ( zeeWzE0EFkzj`wkW4#Bz99E^xQu!%1ViMy3D027r#K!Aac-z_tXKE9-*n0o&yw z0QN^xv`GLIQsMGlU~xv4E@dr1188;%@&ahARya7w9zp-Z& zV!II9hVVNd0Eq1(6CmS6FNEgLoUQY1im5CB402K3!)&1y`&S$QJIQl)9tr|b5t)6p z8SFSI%q%tlLPtNNgJAm0P;=8^6J{AQEy1)JUdsc({X6gD_o#2(!3VN5xjD({ut>

-P)978d1k~0bsLxI=@M-$GQNk3UdL&2^*)? z8^?9o05HAyp{jXLrye+fFb2RSqJkg*Y}-;zE~KTMVCLSe9zaE8{9F!zx=5{&^=uJ9 zs0C1_D`)@}nO@Y_xLPy;Kv6LuAAr`(z5CKT@V+{y1t8_b=uq{6I_6tIRz3@G^#g4H zO0)|U187))2Y|z4luZ96faO|%nfDCfnIhT+ z-s&B!yG+Ygs{r^+nc}K0L>OiF(N39KxUI@6Jr0k^<*^6=Z_EzmC4fZqH3CS@sBM=H zF^HjOW`lN_!Lmr~2h1K8z%+~NQ5Mh=00AO^BK4fkvyZF@0HzN`FNNpNoCyMOt-D7Z z2_QBN+WFfj)1O0xn1Nj&>c=ESuLCjwY@2Lor2z2tb|Un}F&uL}KmY@C2UM1da)JEq zaJF>-$X@j;)>Y`s`D*S2mFgl(KXj={ijD#K0J5S5gen#QeYr@qKw1K_$G)TMqZUC> z<;ia!M*(1vveTk|HAU4#Y8}pem;bUeD_>UNri%5kUoo=}IRWHlwJ-pFVU|+LYs~R( zkYal#(7hYC$<-~97C;x^KguoQp}k@2raR7A9&ivEkv_t;$QdQjPg20_6h0 zjm~8PI5yCy7AJb9!iBmrvf=@)1@Mj7Dp2IPA<%l}+gn*|3 zRAg+&XGywjsRckT02m5pHt#tb0P9W36XBtvcZY1t6d$eR_I;#1*Yj>rxTbyFXEa<3#OwqiCjhf-cf1MU1Lc3d=Mn&e zed=qHecuNlENfKcTKD0k1eJLq3Ml|+*wsPGyw0U3x3}hBQ(OazwE+7sFKiFbnB~K# zJ5oDRPF$%NV0ZA}$u4=Xr2x*$hMq543IMUde#?YsO1XdyfE}dt_1m&E`CK7@UlwNM zp9}zZ{bc}{{UU&62SHy4A*{J^-wsYT0PgZw4g#=iRHhz>0f1E^SeXF$2AOdQzin|0 zsK}w}Tqyu3qb|&jul^znz(}65EP(A`5kvrl68i@!C>H?ASYw+2nsD47EU#SnTclQ( zeeWzE0EFkzj`wkW4#Bz99E^xQu!%1ViMy3D027r#K!Aac-z_tXKE9-*n0o&yw z0QN^xv`GLIQsMGlU~xv4E@dr1188;%@&ahARya7w9zp-Z& zV!II9hVVNd0Eq1(6CmS6FNEgLoUQY1im5CB402K3!)&1y`&S$QJIQl)9tr|b5t)6p z8SFSI%q%tlLPtNNgJAm0P;=8^6J{AQEy1)JUdsc({X6gD_o#2(!3VN5xjD({ut>

-P)978d1k~0bsLxI=@M-$GQNk3UdL&2^*)? z8^?9o05HAyp{jXLrye+fFb2RSqJkg*Y}-;zE~KTMVCLSe9zaE8{9F!zx=5{&^=uJ9 zs0C1_D`)@}nO@Y_xLPy;Kv6LuAAr`(z5CKT@V+{y1t8_b=uq{6I_6tIRz3@G^#g4H zO0)|U187))2Y|z4luZ96faO|%nfDCfnIhT+ z-s&B!yG+Ygs{r^+nc}K0L>OiF(N39KxUI@6Jr0k^<*^6=Z_EzmC4fZqH3CS@sBM=H zF^HjOW`lN_!Lmr~2h1K8z%+~NQ5Mh=00AO^BK4fkvyZF@0HzN`FNNpNoCyMOt-D7Z z2_QBN+WFfj)1O0xn1Nj&>c=ESuLCjwY@2Lor2z2tb|Un}F&uL}KmY@C2UM1da)JEq zaJF>-$X@j;)>Y`s`D*S2mFgl(KXj={ijD#K0J5S5gen#QeYr@qKw1K_$G)TMqZUC> z<;ia!M*(1vveTk|HAU4#Y8}pem;bUeD_>UNri%5kUoo=}IRWHlwJ-pFVU|+LYs~R( zkYal#(7hYC$<-~97C;x^KguoQp}k@2raR7A9&ivEkv_t;$QdQjPg20_6h0 zjm~8PI5yCy7AJb9!iBmrvf=@)1@Mj7Dp2IPA<%l}+gn*|3 zRAg+&XGywjsRckT02m5pHt#tb0P9W36XBtvcZY1t6d$eR_I;#1*Yj>rxTbyFXEa<3#OwqiCjhf-cf1MU1Lc3d=Mn&e zed=qHecuNlENfKcTKD0k1eJLq3Ml|+*wsPGyw0U3x3}hBQ(OazwE+7sFKiFbnB~K# zJ5oDRPF$%NV0ZA}$u4=Xr2x*$hMq543IMUde#?YsO1XdyfE}dt_1m&E`CK7@UlwNM zp9}zZ{bc}{{UU&62SHy4A*{J^-wsYT0PgZw4g#=iRHhz>0f1E^SeXF$2AOdQzin|0 zsK}w}Tqyu3qb|&jul^znz(}65EP(A`5kvrl68i@!C>H?ASYw+2nsD47EU#SnTclQ( zeeWzE0EFkzj`wkW4#Bz99E^xQu!%1ViMy3D027r#K!Aac-z_tXKE9-*n0o&yw z0QN^xv`GLIQsMGlU~xv4E@dr1188;%@&ahARya7w9zp-Z& zV!II9hVVNd0Eq1(6CmS6FNEgLoUQY1im5CB402K3!)&1y`&S$QJIQl)9tr|b5t)6p z8SFSI%q%tlLPtNNgJAm0P;=8^6J{AQEy1)JUdsc({X6gD_o#2(!3VN5xjD({ut>

Date: Fri, 21 Nov 2025 21:44:58 +0100 Subject: [PATCH 02/28] Build a semi-generic chunk loading class --- .gitignore | 1 + dependencies.gradle | 2 + .../utilitiesinexcess/UtilitiesInExcess.java | 7 + .../tileentities/TileEntityEnderQuarry.java | 30 ++- .../common/tileentities/utils/LoadableTE.java | 191 ++++++++++++++++++ .../utils/TEChunkLoadingCallback.java | 24 +++ 6 files changed, 252 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java diff --git a/.gitignore b/.gitignore index 5e80e0ae..dc96fe2b 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ addon.local.gradle.kts addon.late.local.gradle addon.late.local.gradle.kts layout.json +libs/ diff --git a/dependencies.gradle b/dependencies.gradle index 419fe657..e2e8c465 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -48,4 +48,6 @@ dependencies { runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.31-GTNH:dev" ) runtimeOnlyNonPublishable("com.github.GTNewHorizons:Angelica:1.0.0-beta71-pre:dev" ) runtimeOnlyNonPublishable("com.github.GTNewHorizons:Hodgepodge:2.7.17:dev" ) + + runtimeOnlyNonPublishable(files("libs/ChickenChunks-1.3.4.27-dev.jar")) } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index c1654af7..a9fd579c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -1,8 +1,10 @@ package com.fouristhenumber.utilitiesinexcess; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; +import com.fouristhenumber.utilitiesinexcess.utils.TEChunkLoadingCallback; import net.minecraft.util.WeightedRandomChestContent; import net.minecraftforge.common.ChestGenHooks; +import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.MinecraftForge; import org.apache.logging.log4j.LogManager; @@ -68,6 +70,9 @@ public class UtilitiesInExcess { public static final String MODID = "utilitiesinexcess"; public static final Logger LOG = LogManager.getLogger(MODID); + @Mod.Instance(MODID) + public static UtilitiesInExcess uieInstance; + public static int lapisAetheriusRenderID; public static int blackoutCurtainsRenderID; public static int spikeRenderID; @@ -166,6 +171,8 @@ public void init(FMLInitializationEvent event) { if (Mods.CraftTweaker.isLoaded()) { MineTweakerAPI.registerClass(QEDCraftTweakerSupport.class); } + + ForgeChunkManager.setForcedChunkLoadingCallback(uieInstance, new TEChunkLoadingCallback()); } @Mod.EventHandler diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index e41ba0d7..85ec79a8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -1,17 +1,20 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; import cpw.mods.fml.common.FMLLog; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.util.ForgeDirection; +import org.jetbrains.annotations.Nullable; import org.joml.Vector2i; -public class TileEntityEnderQuarry extends TileEntity { +public class TileEntityEnderQuarry extends LoadableTE { public static int STEPS_PER_TICK = 40; - public ForgeDirection facing; + private @Nullable ForgeChunkManager.Ticket ticket; + private ForgeDirection facing; private Area2d workArea; public QuarryWorkState state; private int dx; @@ -21,6 +24,10 @@ public class TileEntityEnderQuarry extends TileEntity { private int chunkZ; private int brokenBlocksTotal; + public TileEntityEnderQuarry() { + super(); + } + public ForgeDirection getFacing() { return this.facing; } @@ -78,6 +85,7 @@ public void updateEntity() { } if (brokenBlocksTick < STEPS_PER_TICK) { state = QuarryWorkState.FINISHED; + unloadSelf(); } this.brokenBlocksTotal += brokenBlocksTick; @@ -119,16 +127,21 @@ public boolean stepPos() { if (dz + 1 <= workArea.high.y) { // just the next chunk dz++; + unloadChunkShifted(chunkX, chunkZ); chunkZ++; + loadChunkShifted(chunkX, chunkZ); resetX = true; } else { // the next z slice if (dx + 1 <= workArea.high.x) { dx++; + unloadChunkShifted(chunkX, chunkZ); chunkX++; dz = workArea.low.y; chunkZ = workArea.low.y >> 4; + loadChunkShifted(chunkX, chunkZ); } else { + unloadChunkShifted(chunkX, chunkZ); // Finished with area return false; } @@ -176,6 +189,17 @@ public void writeToNBT(NBTTagCompound nbt) { workArea.writeNBTTag(nbt); } + @Override + public void receiveTicketOnLoad(ForgeChunkManager.Ticket ticket) { + super.receiveTicketOnLoad(ticket); + loadChunk(chunkX, chunkZ); + } + + @Override + public boolean keepsItselfLoaded() { + return state != QuarryWorkState.FINISHED; + } + public enum QuarryWorkState { STOPPED, FINISHED, diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java new file mode 100644 index 00000000..cdb71c78 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java @@ -0,0 +1,191 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.utils; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraftforge.common.ForgeChunkManager; + +import javax.annotation.Nullable; + +/** + * Base class for TileEntities that need to keep chunks loaded. + * Handles chunk loading tickets and manages forced chunk loading through Forge's ChunkManager. + */ +public class LoadableTE extends TileEntity { + /** The chunk loading ticket used to force chunks to stay loaded */ + @Nullable + ForgeChunkManager.Ticket ticket = null; + private final int selfChunkX = xCoord >> 4; + private final int selfChunkZ = zCoord >> 4; + protected boolean selfIsLoaded = false; + + public LoadableTE() { + // TODO: Check why loads 0, 0 sometimes + if (keepsItselfLoaded()) { + loadSelf(); + } + } + + /** + * Forces a chunk to stay loaded. + * Skips loading if attempting to load own chunk and keepsItselfLoaded() returns true. + * + * @param chunkCoord The chunk coordinates to load + */ + public void loadChunk(ChunkCoordIntPair chunkCoord) { + if (chunkCoord.chunkXPos == selfChunkX && chunkCoord.chunkZPos == selfChunkZ && keepsItselfLoaded()) return; + if (requestTicket()) { + ForgeChunkManager.forceChunk(ticket, chunkCoord); + } else { + UtilitiesInExcess.LOG.error("Failed to get ticket to load chunk at {} {} for Mod {}", chunkCoord.chunkXPos, chunkCoord.chunkZPos, UtilitiesInExcess.MODID); + } + } + + /** + * Forces a chunk to stay loaded using chunk coordinates. + * + * @param x Chunk X coordinate + * @param z Chunk Z coordinate + */ + public void loadChunkShifted(int x, int z) { + loadChunk(new ChunkCoordIntPair(x, z)); + } + + /** + * Forces a chunk to stay loaded using block coordinates. + * + * @param x Block X coordinate + * @param z Block Z coordinate + */ + public void loadChunk(int x, int z) { + loadChunk(new ChunkCoordIntPair(x >> 4, z >> 4)); + } + + /** + * Stops forcing a chunk to stay loaded. + * Skips unloading if attempting to unload own chunk and keepsItselfLoaded() returns true. + * + * @param chunkCoord The chunk coordinates to unload + */ + void unloadChunk(ChunkCoordIntPair chunkCoord) { + if (chunkCoord.chunkXPos == selfChunkX && chunkCoord.chunkZPos == selfChunkZ && keepsItselfLoaded()) return; + if (requestTicket()) { + ForgeChunkManager.unforceChunk(ticket, chunkCoord); + } else { + UtilitiesInExcess.LOG.error("Failed to get ticket to unload? chunk at {} {} for Mod {}", chunkCoord.chunkXPos, chunkCoord.chunkZPos, UtilitiesInExcess.MODID); + } + } + + /** + * Stops forcing a chunk to stay loaded using chunk coordinates. + * + * @param x Chunk X coordinate + * @param z Chunk Z coordinate + */ + public void unloadChunkShifted(int x, int z) { + unloadChunk(new ChunkCoordIntPair(x, z)); + } + + /** + * Stops forcing a chunk to stay loaded using block coordinates. + * + * @param x Block X coordinate + * @param z Block Z coordinate + */ + public void unloadChunk(int x, int z) { + unloadChunk(new ChunkCoordIntPair(x >> 4, z >> 4)); + } + + /** + * Forces the chunk containing this TileEntity to stay loaded. + */ + public void loadSelf() { + if (!selfIsLoaded) { + loadChunk(selfChunkX, selfChunkZ); + selfIsLoaded = true; + } + } + + /** + * Stops forcing the chunk containing this TileEntity to stay loaded. + */ + public void unloadSelf() { + if (selfIsLoaded) { + unloadChunk(selfChunkX, selfChunkZ); + selfIsLoaded = false; + } + } + + /** + * Releases the chunk loading ticket and cleans up all forced chunks. + * Called when the TileEntity is invalidated or the chunk is unloaded. + */ + public void invalidateTicket() { + if (ticket != null) { + ForgeChunkManager.releaseTicket(ticket); + ticket = null; + } + } + + /** + * Requests a chunk loading ticket from Forge's ChunkManager if one doesn't exist. + * + * @return true if a ticket is available (either existing or newly acquired), false otherwise + */ + private boolean requestTicket() { + if (ticket != null) return true; + ticket = ForgeChunkManager.requestTicket(UtilitiesInExcess.uieInstance, worldObj, ForgeChunkManager.Type.NORMAL); + + if (ticket != null) { + // Store TileEntity coordinates in ticket data for reloading + NBTTagCompound tag = ticket.getModData(); + tag.setInteger("teX", xCoord); + tag.setInteger("teY", yCoord); + tag.setInteger("teZ", zCoord); + } + return ticket != null; + } + + /** + * Called when the world reloads to restore the chunk loading ticket. + * If keepsItselfLoaded() returns true, automatically reloads the chunk containing this TileEntity. + * + * @param ticket The restored chunk loading ticket + */ + public void receiveTicketOnLoad(ForgeChunkManager.Ticket ticket) { + this.ticket = ticket; + if (keepsItselfLoaded()) { + loadSelf(); + } + } + + /** + * Override this method to determine if this TileEntity should keep its own chunk loaded. + * + * @return true if this TileEntity should keep its own chunk loaded, false otherwise + */ + public boolean keepsItselfLoaded() { + return false; + } + + /** + * Called when the chunk containing this TileEntity is unloaded. + * Releases the chunk loading ticket to prevent memory leaks. + */ + @Override + public void onChunkUnload() { + super.onChunkUnload(); + invalidateTicket(); + } + + /** + * Called when this TileEntity is removed from the world. + * Releases the chunk loading ticket to prevent memory leaks. + */ + @Override + public void invalidate() { + super.invalidate(); + invalidateTicket(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java new file mode 100644 index 00000000..fcd45c48 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java @@ -0,0 +1,24 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeChunkManager; + +import java.util.List; + +public class TEChunkLoadingCallback implements ForgeChunkManager.LoadingCallback { + @Override + public void ticketsLoaded(List tickets, World world) { + for (ForgeChunkManager.Ticket ticket : tickets) { + NBTTagCompound tag = ticket.getModData(); + int x = tag.getInteger("teX"); + int y = tag.getInteger("teY"); + int z = tag.getInteger("teZ"); + + if (world.getTileEntity(x, y, z) instanceof LoadableTE pump) { + pump.receiveTicketOnLoad(ticket); + } + } + } +} From b5f938ec3fa9a6b91e35a5a6469501299363261b Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Sun, 23 Nov 2025 00:12:00 +0100 Subject: [PATCH 03/28] Finish chunk-loading logic & restarting on reload & correctly get distance to lower x boundary --- dependencies.gradle | 3 +- .../tileentities/TileEntityEnderQuarry.java | 77 +++++++++---------- .../common/tileentities/utils/LoadableTE.java | 33 +++++--- .../utils/TEChunkLoadingCallback.java | 4 +- 4 files changed, 61 insertions(+), 56 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index e2e8c465..5d5b5729 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -49,5 +49,6 @@ dependencies { runtimeOnlyNonPublishable("com.github.GTNewHorizons:Angelica:1.0.0-beta71-pre:dev" ) runtimeOnlyNonPublishable("com.github.GTNewHorizons:Hodgepodge:2.7.17:dev" ) - runtimeOnlyNonPublishable(files("libs/ChickenChunks-1.3.4.27-dev.jar")) + // For debugging chunkloading + runtimeOnlyNonPublishable('curse.maven:chicken-chunks-229316:2233250') } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 85ec79a8..1efb6ace 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -5,15 +5,12 @@ import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.util.ForgeDirection; -import org.jetbrains.annotations.Nullable; import org.joml.Vector2i; public class TileEntityEnderQuarry extends LoadableTE { - public static int STEPS_PER_TICK = 40; - private @Nullable ForgeChunkManager.Ticket ticket; + public static int STEPS_PER_TICK = 400; private ForgeDirection facing; private Area2d workArea; public QuarryWorkState state; @@ -25,7 +22,15 @@ public class TileEntityEnderQuarry extends LoadableTE { private int brokenBlocksTotal; public TileEntityEnderQuarry() { - super(); + state = QuarryWorkState.STOPPED; + } + + @Override + public void validate() { + super.validate(); + if (state != QuarryWorkState.FINISHED && workArea != null) { + loadChunkShifted(chunkX, chunkZ); + } } public ForgeDirection getFacing() { @@ -36,9 +41,6 @@ public void setFacing(ForgeDirection facing) { this.facing = facing; } - public Area2d getWorkArea() { - return this.workArea; - } public void resetState() { brokenBlocksTotal = 0; @@ -53,6 +55,9 @@ public String getState() { }; } + public Area2d getWorkArea() { + return this.workArea; + } public void setWorkArea(Area2d area) { workArea = area; dx = area.low.x; @@ -71,9 +76,11 @@ public void updateEntity() { int brokenBlocksTick = 0; while (brokenBlocksTick < STEPS_PER_TICK && stepPos()) { - if (!isInBounds() || this.chunkX > 1000) { + // TODO: Remove after this has been tested by others + if (!isInBounds() || this.chunkX > 1000 || this.chunkZ > 1000) { FMLLog.getLogger().error("Tried to quarry outside of work area at {} {} {}", dx, dy, dz); state = QuarryWorkState.FINISHED; + worldObj.setBlock(dx, dy, dz, Blocks.gold_block); return; } if (worldObj.isAirBlock(dx, dy, dz) || worldObj.getBlock(dx, dy, dz).getMaterial() == Material.air) { @@ -150,8 +157,8 @@ public boolean stepPos() { } if (resetX) { - // need to move x back left towards/to bounds - int toMove = dx + 1 > workArea.high.x ? workArea.chunkOffX.y : 15; + // the distance we have to move left now, lower if we would cross the high x bound + int toMove = dx + 1 > workArea.high.x ? workArea.chunkOffX : 15; if (dx - toMove >= workArea.low.x) { dx -= toMove; } else { @@ -167,14 +174,15 @@ public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); facing = ForgeDirection.getOrientation(nbt.getInteger("facing")); state = QuarryWorkState.values()[nbt.getInteger("state")]; - dx = nbt.getInteger("dy"); - dy = nbt.getInteger("dz"); - dz = nbt.getInteger("dx"); - chunkX = dx >> 4; - chunkZ = dz >> 4; + if (state != QuarryWorkState.FINISHED) { + workArea = Area2d.fromNBTTag(nbt); + dx = nbt.getInteger("dx"); + dy = nbt.getInteger("dy"); + dz = nbt.getInteger("dz"); + chunkX = dx >> 4; + chunkZ = dz >> 4; + } brokenBlocksTotal = nbt.getInteger("blocks"); - - workArea = Area2d.fromNBTTag(nbt); } @Override @@ -182,17 +190,13 @@ public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("facing", facing.ordinal()); nbt.setInteger("state", state.ordinal()); - nbt.setInteger("dx", dx); - nbt.setInteger("dy", dy); - nbt.setInteger("dz", dz); + if (state != QuarryWorkState.FINISHED && workArea != null) { + workArea.writeNBTTag(nbt); + nbt.setInteger("dx", dx); + nbt.setInteger("dy", dy); + nbt.setInteger("dz", dz); + } nbt.setInteger("blocks", brokenBlocksTotal); - workArea.writeNBTTag(nbt); - } - - @Override - public void receiveTicketOnLoad(ForgeChunkManager.Ticket ticket) { - super.receiveTicketOnLoad(ticket); - loadChunk(chunkX, chunkZ); } @Override @@ -215,18 +219,8 @@ public static class Area2d { public final int width; // The height of the entire working area public final int height; - /** - * The relative x offset to the chunk grid, - * with vec.x as the extra space to the left, - * and vec.y as the extra space to the right - * */ - public final Vector2i chunkOffX; - /** - * The relative x offset to the chunk grid, - * with vec.x as the extra space to the bottom, - * and vec.y as the extra space to the top - * */ - public final Vector2i chunkOffZ; + // The distance to the closest lower x chunk border from the high x bound + public final int chunkOffX; public Area2d(Vector2i first, Vector2i second) { int lowX = Math.min(first.x, second.x); @@ -237,8 +231,7 @@ public Area2d(Vector2i first, Vector2i second) { this.high = new Vector2i(highX, highZ); this.width = highX - lowX; this.height = highZ - lowZ; - this.chunkOffX = new Vector2i(15 - lowX % 16, highX % 16); - this.chunkOffZ = new Vector2i(15 - lowZ % 16, highZ % 16); + this.chunkOffX = highX - (highX & -16); } public Area2d(int x1, int z1, int x2, int z2) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java index cdb71c78..4b8daeb4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java @@ -15,15 +15,26 @@ public class LoadableTE extends TileEntity { /** The chunk loading ticket used to force chunks to stay loaded */ @Nullable - ForgeChunkManager.Ticket ticket = null; - private final int selfChunkX = xCoord >> 4; - private final int selfChunkZ = zCoord >> 4; - protected boolean selfIsLoaded = false; + private ForgeChunkManager.Ticket ticket = null; + private int selfChunkX; + private int selfChunkZ; + protected boolean selfIsLoaded = true; - public LoadableTE() { - // TODO: Check why loads 0, 0 sometimes - if (keepsItselfLoaded()) { - loadSelf(); + /** + * Initializes this class after the TE is loaded. + * Makes sure the TE itself will stay loaded if requested. + * Overwrite and call super() to load your own chunks after readFromNBT() is called + */ + @Override + public void validate() { + super.validate(); + selfIsLoaded = false; + selfChunkX = xCoord >> 4; + selfChunkZ = zCoord >> 4; + if (worldObj != null && !worldObj.isRemote) { + if (keepsItselfLoaded()) { + loadSelf(); + } } } @@ -34,7 +45,7 @@ public LoadableTE() { * @param chunkCoord The chunk coordinates to load */ public void loadChunk(ChunkCoordIntPair chunkCoord) { - if (chunkCoord.chunkXPos == selfChunkX && chunkCoord.chunkZPos == selfChunkZ && keepsItselfLoaded()) return; + if (selfIsLoaded && chunkCoord.chunkXPos == selfChunkX && chunkCoord.chunkZPos == selfChunkZ && keepsItselfLoaded()) return; if (requestTicket()) { ForgeChunkManager.forceChunk(ticket, chunkCoord); } else { @@ -102,7 +113,7 @@ public void unloadChunk(int x, int z) { */ public void loadSelf() { if (!selfIsLoaded) { - loadChunk(selfChunkX, selfChunkZ); + loadChunkShifted(selfChunkX, selfChunkZ); selfIsLoaded = true; } } @@ -112,7 +123,7 @@ public void loadSelf() { */ public void unloadSelf() { if (selfIsLoaded) { - unloadChunk(selfChunkX, selfChunkZ); + unloadChunkShifted(selfChunkX, selfChunkZ); selfIsLoaded = false; } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java index fcd45c48..82adccf4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java @@ -16,8 +16,8 @@ public void ticketsLoaded(List tickets, World world) { int y = tag.getInteger("teY"); int z = tag.getInteger("teZ"); - if (world.getTileEntity(x, y, z) instanceof LoadableTE pump) { - pump.receiveTicketOnLoad(ticket); + if (world.getTileEntity(x, y, z) instanceof LoadableTE te) { + te.receiveTicketOnLoad(ticket); } } } From 8a06a13659cc085de16ef45f7eba03ad228a92c3 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Mon, 24 Nov 2025 01:24:30 +0100 Subject: [PATCH 04/28] Add dedicated eq config, Implement item & fluid storage logic, fix some bugs with chunkloading, more mining logic progress --- dependencies.gradle | 4 + .../utilitiesinexcess/ModBlocks.java | 5 +- .../utilitiesinexcess/UtilitiesInExcess.java | 4 +- .../common/blocks/BlockEnderQuarry.java | 38 +- .../tileentities/TileEntityEnderQuarry.java | 599 ++++++++++++++++-- .../common/tileentities/utils/LoadableTE.java | 48 +- .../config/blocks/BlockConfig.java | 4 +- .../config/blocks/EnderQuarryConfig.java | 26 + .../utils/TEChunkLoadingCallback.java | 6 +- 9 files changed, 631 insertions(+), 103 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java diff --git a/dependencies.gradle b/dependencies.gradle index 5d5b5729..0e6a6c80 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -51,4 +51,8 @@ dependencies { // For debugging chunkloading runtimeOnlyNonPublishable('curse.maven:chicken-chunks-229316:2233250') + + runtimeOnlyNonPublishable("com.github.GTNewHorizons:WAILAPlugins:0.7.2:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:waila:1.9.15:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:ServerUtilities:2.2.5:dev") } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 381eddf2..6ea4e6f4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -1,6 +1,5 @@ package com.fouristhenumber.utilitiesinexcess; -import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderQuarry; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -14,6 +13,7 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCursedEarth; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockDrum; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderLotus; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderQuarry; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEtherealGlass; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockFloating; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockInverted; @@ -48,6 +48,7 @@ import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderLotusConfig; +import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig; import com.fouristhenumber.utilitiesinexcess.config.dimensions.EndOfTimeConfig; import com.fouristhenumber.utilitiesinexcess.config.dimensions.UnderWorldConfig; @@ -105,7 +106,7 @@ public enum ModBlocks { SPIKE_DIAMOND(BlockConfig.spikes.enableDiamondSpike, new BlockSpike(BlockSpike.SpikeType.DIAMOND, "diamondSpike"), BlockSpike.ItemSpike.class, "diamondSpike"), UNDERWORLD_PORTAL(BlockConfig.enableUnderWorldPortal && UnderWorldConfig.enableUnderWorld, new BlockPortalUnderWorld(), "underworld_portal"), END_OF_TIME_PORTAL(BlockConfig.enableEndOfTimePortal && EndOfTimeConfig.enableEndOfTime, new BlockPortalEndOfTime(), BlockPortalEndOfTime.ItemBlockPortalEndOfTime.class, "temporal_gate"), - ENDER_QUARRY(BlockConfig.enableEnderQuarry, new BlockEnderQuarry(), "ender_quarry"), + ENDER_QUARRY(EnderQuarryConfig.enableEnderQuarry, new BlockEnderQuarry(), "ender_quarry"), ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index a9fd579c..f3612ff8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -1,7 +1,5 @@ package com.fouristhenumber.utilitiesinexcess; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; -import com.fouristhenumber.utilitiesinexcess.utils.TEChunkLoadingCallback; import net.minecraft.util.WeightedRandomChestContent; import net.minecraftforge.common.ChestGenHooks; import net.minecraftforge.common.ForgeChunkManager; @@ -17,6 +15,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPureLove; @@ -47,6 +46,7 @@ import com.fouristhenumber.utilitiesinexcess.utils.FMLEventHandler; import com.fouristhenumber.utilitiesinexcess.utils.ForgeEventHandler; import com.fouristhenumber.utilitiesinexcess.utils.PinkFuelHelper; +import com.fouristhenumber.utilitiesinexcess.utils.TEChunkLoadingCallback; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.FMLCommonHandler; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java index 6c5ad034..fd1f88ea 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java @@ -2,8 +2,7 @@ import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; -import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; @@ -15,6 +14,9 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + public class BlockEnderQuarry extends BlockContainer { public BlockEnderQuarry() { @@ -43,29 +45,31 @@ public void onBlockPlacedBy(World worldIn, int x, int y, int z, EntityLivingBase TileEntity te = worldIn.getTileEntity(x, y, z); if (te instanceof TileEntityEnderQuarry quarry) { - quarry.setFacing(getFacing(direction)); + quarry.facing = getFacing(direction); quarry.resetState(); } } @Override - public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { if (worldIn.isRemote) { return true; } TileEntity te = worldIn.getTileEntity(x, y, z); if (te instanceof TileEntityEnderQuarry quarry) { if (quarry.state == TileEntityEnderQuarry.QuarryWorkState.STOPPED) { - BlockPos inFront = offsetByForward(x, y, z, quarry.getFacing(), 1, 0); - BlockPos farFront = offsetByForward(inFront, quarry.getFacing(), 64, 0); - farFront = offsetByRight(farFront, quarry.getFacing(), 64, 0); + BlockPos inFront = offsetByForward(x, y, z, quarry.facing, 1, 0); + BlockPos farFront = offsetByForward(inFront, quarry.facing, 64, 0); + farFront = offsetByRight(farFront, quarry.facing, 64, 0); for (int i = 1; i < 256; i++) { worldIn.setBlock(inFront.x, i, inFront.z, Blocks.diamond_block); worldIn.setBlock(farFront.x, i, farFront.z, Blocks.diamond_block); } - player.addChatComponentMessage(new ChatComponentText(String.format("Set up work area from %s to %s", inFront, farFront))); + player.addChatComponentMessage( + new ChatComponentText(String.format("Set up work area from %s to %s", inFront, farFront))); quarry.setWorkArea(new TileEntityEnderQuarry.Area2d(inFront.x, inFront.z, farFront.x, farFront.z)); quarry.state = TileEntityEnderQuarry.QuarryWorkState.RUNNING; @@ -75,6 +79,15 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer return true; } + @Override + public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { + super.onNeighborBlockChange(worldIn, x, y, z, neighbor); + TileEntity te = worldIn.getTileEntity(x, y, z); + if (!worldIn.isRemote && te instanceof TileEntityEnderQuarry quarry) { + quarry.scanSidesForTEs(); + } + } + public static ForgeDirection getFacing(int meta) { return switch (meta) { case 0 -> ForgeDirection.SOUTH; @@ -90,7 +103,6 @@ public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityEnderQuarry(); } - // TODO: REMOVE public static ForgeDirection turnRight90(ForgeDirection dir) { return switch (dir) { @@ -171,7 +183,7 @@ public static BlockPos offsetByRight(int x, int y, int z, ForgeDirection facing, * @return New BlockPos offset to the right */ public static BlockPos offsetByRight(int x, int y, int z, ForgeDirection facing, int amount, int vertical, - boolean relative) { + boolean relative) { BlockPos pos = offsetByRight(new BlockPos(x, y, z), facing, amount, vertical); if (relative) { pos.x = x - pos.x; @@ -222,7 +234,7 @@ public static BlockPos offsetByLeft(int x, int y, int z, ForgeDirection facing, * @return New BlockPos offset to the left */ public static BlockPos offsetByLeft(int x, int y, int z, ForgeDirection facing, int amount, int vertical, - boolean relative) { + boolean relative) { BlockPos pos = offsetByLeft(new BlockPos(x, y, z), facing, amount, vertical); if (relative) { pos.x = x - pos.x; @@ -273,7 +285,7 @@ public static BlockPos offsetByBack(int x, int y, int z, ForgeDirection facing, * @return New BlockPos offset backwards */ public static BlockPos offsetByBack(int x, int y, int z, ForgeDirection facing, int amount, int vertical, - boolean relative) { + boolean relative) { BlockPos pos = offsetByBack(new BlockPos(x, y, z), facing, amount, vertical); if (relative) { pos.x = x - pos.x; @@ -323,7 +335,7 @@ public static BlockPos offsetByForward(int x, int y, int z, ForgeDirection facin * @return New BlockPos offset forward */ public static BlockPos offsetByForward(int x, int y, int z, ForgeDirection facing, int amount, int vertical, - boolean relative) { + boolean relative) { BlockPos pos = offsetByForward(new BlockPos(x, y, z), facing, amount, vertical); if (relative) { pos.x = x - pos.x; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 1efb6ace..e060d2ee 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -1,17 +1,55 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import cpw.mods.fml.common.FMLLog; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraftforge.common.ForgeChunkManager; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidBlock; +import net.minecraftforge.fluids.IFluidHandler; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joml.Vector2i; -public class TileEntityEnderQuarry extends LoadableTE { +import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; +import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; + +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyReceiver; +import it.unimi.dsi.fastutil.Hash; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; + +public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver, IFluidHandler { - public static int STEPS_PER_TICK = 400; - private ForgeDirection facing; + public static final int STEPS_PER_TICK = 400; + public static final int ITEM_BUFFER_CAPACITY = 256; + public static final Block REPLACE_BLOCK = Blocks.dirt; + private int storedItems; + public ForgeDirection facing; private Area2d workArea; public QuarryWorkState state; private int dx; @@ -20,44 +58,43 @@ public class TileEntityEnderQuarry extends LoadableTE { private int chunkX; private int chunkZ; private int brokenBlocksTotal; + private final HashMap sidedItemAcceptors = new HashMap<>(); + private final HashMap sidedFluidAcceptors = new HashMap<>(); + + protected final EnergyStorage energyStorage = new EnergyStorage(EnderQuarryConfig.enderQuarryEnergyStorage); + protected final List fluidStorage = Stream + .generate(() -> new FluidTank(EnderQuarryConfig.enderQuarryFluidTankStorage)) + .limit(EnderQuarryConfig.enderQuarryFluidTankAmount) + .collect(Collectors.toList()); + protected final Object2IntMap<@NotNull ItemStack> itemStorage = new Object2IntOpenCustomHashMap<>( + ITEM_BUFFER_CAPACITY, + ItemStackHashStrategy.instance); public TileEntityEnderQuarry() { - state = QuarryWorkState.STOPPED; - } - - @Override - public void validate() { - super.validate(); - if (state != QuarryWorkState.FINISHED && workArea != null) { - loadChunkShifted(chunkX, chunkZ); - } - } - - public ForgeDirection getFacing() { - return this.facing; - } - - public void setFacing(ForgeDirection facing) { - this.facing = facing; + resetState(); + storedItems = 0; } - public void resetState() { + state = QuarryWorkState.STOPPED; brokenBlocksTotal = 0; - this.state = QuarryWorkState.STOPPED; } public String getState() { return switch (state) { - case RUNNING -> String.format("Quarry is currently mining at %d %d %d, has already mined %d", dx, dy, dz, brokenBlocksTotal); + case RUNNING -> String + .format("Quarry is currently mining at %d %d %d, has already mined %d", dx, dy, dz, brokenBlocksTotal); + case STOPPED_WAITING_FOR_FLUID_SPACE -> "Quarry is full on fluids"; + case STOPPED_WAITING_FOR_ITEM_SPACE -> "Quarry is full on items"; case STOPPED -> "Quarry is stopped."; - case FINISHED -> String.format("Quarry has finished after mining %d blocks", brokenBlocksTotal); + case FINISHED -> String.format("Quarry has finished after mining %d blocks, still holding %d items", brokenBlocksTotal, storedItems); }; } public Area2d getWorkArea() { return this.workArea; } + public void setWorkArea(Area2d area) { workArea = area; dx = area.low.x; @@ -67,56 +104,19 @@ public void setWorkArea(Area2d area) { chunkZ = dz >> 4; } - @Override - public void updateEntity() { - if (worldObj.isRemote) return; - if (facing == ForgeDirection.UNKNOWN) return; - if (state != QuarryWorkState.RUNNING) return; - - int brokenBlocksTick = 0; - - while (brokenBlocksTick < STEPS_PER_TICK && stepPos()) { - // TODO: Remove after this has been tested by others - if (!isInBounds() || this.chunkX > 1000 || this.chunkZ > 1000) { - FMLLog.getLogger().error("Tried to quarry outside of work area at {} {} {}", dx, dy, dz); - state = QuarryWorkState.FINISHED; - worldObj.setBlock(dx, dy, dz, Blocks.gold_block); - return; - } - if (worldObj.isAirBlock(dx, dy, dz) || worldObj.getBlock(dx, dy, dz).getMaterial() == Material.air) { - continue; - } - worldObj.setBlock(dx, dy, dz, Blocks.air); - brokenBlocksTick++; - // breakBlock() - } - if (brokenBlocksTick < STEPS_PER_TICK) { - state = QuarryWorkState.FINISHED; - unloadSelf(); - } - - this.brokenBlocksTotal += brokenBlocksTick; - } - /** - * Are the current dx & dy & dz in bounds + * Are the current dx & dy & dz in work area bounds */ - public boolean isInBounds() { + private boolean isInBounds() { return dy > 1 && this.workArea.isInBounds(dx, dz); } - /** - * Are the provided dx & dz in bounds - */ - public boolean isInBounds(int dx, int dz) { - return this.workArea.isInBounds(dx, dz); - } - /** * Step the quarry working position by one block + * * @return True if we can keep moving */ - public boolean stepPos() { + private boolean stepPos() { dy--; if (dy <= 1) { // stack is done, move back up @@ -169,6 +169,336 @@ public boolean stepPos() { return true; } + /** + * Tries to store the resulting resources of the block at the current position, + * and store the items / fluid to the internal storage. + * + * @return True if we managed to harvest the current block, false if we couldn't / weren't allowed to touch/harvest + * it. + */ + private boolean tryHarvestCurrentBlock() { + if (worldObj.isAirBlock(dx, dy, dz) || worldObj.getBlock(dx, dy, dz) + .getMaterial() == Material.air) return false; + + Block block = worldObj.getBlock(dx, dy, dz); + return harvestAndStoreBlock(block); + } + + private boolean harvestAndStoreBlock(Block block) { + try { + // TODO: Use "shouldPumpFluids" or similar from upgrades + if (true) { + FluidStack fluid = null; + if (block == Blocks.water) { + fluid = new FluidStack(FluidRegistry.WATER, 1000); + } else if (block == Blocks.lava) { + fluid = new FluidStack(FluidRegistry.LAVA, 1000); + } else if (block instanceof IFluidBlock fluidBlock) { + fluid = fluidBlock.drain(worldObj, dx, dy, dz, false); + } + if (fluid != null) { + return tryStoreFluid(fluid); + } + } + + // TODO: Use fake player? Make sure to use fortune upgrade + // We can accept that the maximum stored amount is sometimes overrun by fortune + ArrayList drops = block.getDrops(worldObj, dx, dy, dz, worldObj.getBlockMetadata(dx, dy, dz), 0); + if (!drops.isEmpty()) { + return tryStoreItems(drops); + } + + // Block just has no drops + return true; + } catch (Exception ignored) { + UtilitiesInExcess.LOG.error("Failed while trying to harvest block {} at {} {} {}.", block.toString(), dx, dy, dz); + return false; + } + } + + /** + * Tries to store the provided fluid in the internal tanks + * + * @return If we could store all the provided fluid + */ + private boolean tryStoreFluid(FluidStack fluid) { + int toStore = fluid.amount; + for (FluidTank tank : fluidStorage) { + if (toStore > 0) { + toStore -= Math.min(tank.fill(fluid, false), toStore); + } + } + if (toStore == 0) { + toStore = fluid.amount; + for (FluidTank tank : fluidStorage) { + if (toStore > 0) { + toStore -= tank.fill(fluid, true); + } else { + break; + } + } + if (toStore == 0) { + return true; + } + } + state = QuarryWorkState.STOPPED_WAITING_FOR_FLUID_SPACE; + return false; + } + + /** + * Tries to store the provided list of items in the internal item storage + * + * @return If we could store all the provided items + */ + private boolean tryStoreItems(ArrayList items) { + int toStore = items.stream() + .mapToInt((item) -> item != null ? item.stackSize : 0) + .sum(); + if (storedItems + toStore <= ITEM_BUFFER_CAPACITY) { + for (ItemStack item : items) { + storeItemToStorage(item); + } + return true; + } + state = QuarryWorkState.STOPPED_WAITING_FOR_ITEM_SPACE; + return false; + } + + private void storeItemToStorage(ItemStack item) { + int stackSize = item.stackSize; + // Use an arbitrary size for all items of this type (type, meta, nbt), + // since we store the amount as the value + item.stackSize = 0; + storedItems += stackSize; + itemStorage.mergeInt(item, stackSize, Integer::sum); + } + + private boolean fluidStorageIsEmpty() { + return fluidStorage.stream() + .mapToInt(FluidTank::getFluidAmount) + .sum() == 0; + } + + /** + * Tries to eject internally stored items & fluids to adjacent containers + * + * @return False if the adjacent TEs changed without us noticing, and we need to rescan + */ + private boolean ejectStoredToAdjacent() { + // TODO: call markDirty() + if (storedItems > 0) { + for (IInventory inventory : sidedItemAcceptors.values()) { + if (inventory != null) { + for (int i = 0; i < inventory.getSizeInventory(); i++) { + ItemStack slotItem = inventory.getStackInSlot(i); + if (slotItem != null) { + // There is already an item in this slot, see if we can merge with it + int canBeAddedToStack = Math + .min(slotItem.getMaxStackSize(), inventory.getInventoryStackLimit()) + - slotItem.stackSize; + if (canBeAddedToStack > 0) { + ItemStack key = slotItem.copy(); + key.stackSize = 0; + + // Do we also have this item type in our storage? + int storedAmount = itemStorage.getOrDefault(key, -1); + if (storedAmount > 0) { + int toBeAdded = Math.min(storedAmount, canBeAddedToStack); + + ItemStack modifiedStack = key.copy(); + modifiedStack.stackSize = slotItem.stackSize + toBeAdded; + if (inventory.isItemValidForSlot(i, modifiedStack)) { + inventory.setInventorySlotContents(i, modifiedStack); + + itemStorage.put(key, storedAmount - toBeAdded); + storedItems -= toBeAdded; + } + } + } + } else { + // Empty slot, don't mind us + Object2IntMap.Entry entry = peekItem(); + if (entry != null) { + int canBeAddedToSlot = Math + .min(entry.getIntValue(), inventory.getInventoryStackLimit()); + if (canBeAddedToSlot > 0) { + ItemStack item = entry.getKey() + .copy(); + item.stackSize = canBeAddedToSlot; + if (inventory.isItemValidForSlot(i, item)) { + inventory.setInventorySlotContents(i, item); + + itemStorage.put(entry.getKey(), entry.getIntValue() - canBeAddedToSlot); + storedItems -= canBeAddedToSlot; + } + } + } else { + // Not sure why, but it seems our inventory is empty even though we thought it wasn't + // Lets re-count + storedItems = itemStorage.values() + .intStream() + .sum(); + } + } + } + + if (storedItems == 0) break; + } else { + return false; + } + } + } + + if (fluidStorageIsEmpty()) return true; + + for (Map.Entry entry : sidedFluidAcceptors.entrySet()) { + if (entry.getValue() != null) { + for (FluidTank tank : fluidStorage) { + if (tank.getFluidAmount() > 0) { + int toStore = entry.getValue() + .fill( + entry.getKey() + .getOpposite(), + tank.drain(tank.getCapacity(), false), + false); + if (toStore > 0) { + entry.getValue() + .fill( + entry.getKey() + .getOpposite(), + tank.drain(toStore, true), + true); + } + } + } + + if (fluidStorageIsEmpty()) break; + } else { + return false; + } + } + return true; + } + + /** + * Get the first item & int entry in the storage that we actually have something of + * + * @return An item if we have any, null otherwise + */ + public @Nullable Object2IntMap.Entry peekItem() { + for (Object2IntMap.Entry entry : itemStorage.object2IntEntrySet()) { + if (entry.getIntValue() > 0) { + return entry; + } + } + return null; + } + + public void scanSidesForTEs() { + sidedFluidAcceptors.clear(); + sidedItemAcceptors.clear(); + ArrayList loadedAdjacentChunks = new ArrayList<>(); + + // TODO: Load cross around if some side is in an adajcent chunk, only for the duration of this scan + for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { + int directionChunkX = (direction.offsetX + this.xCoord) >> 4; + int directionChunkZ = (direction.offsetZ + this.zCoord) >> 4; + if ((directionChunkX != this.selfChunkX || directionChunkZ != this.selfChunkZ) && !areWeLoadingThisChunk(directionChunkX, directionChunkZ)) { + loadChunkShifted(directionChunkX, directionChunkZ); + loadedAdjacentChunks.add(new ChunkCoordIntPair(directionChunkX, directionChunkZ)); + } + } + + // TODO: remove adjacent chunks that contain a valid side, from loadedAdjacentChunks + for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { + TileEntity te = this.worldObj.getTileEntity( + direction.offsetX + this.xCoord, + direction.offsetY + this.yCoord, + direction.offsetZ + this.zCoord); + + // TODO: Upgrades people + // if (te instanceof IQuarryUpgrade quarryUpgrade) { + // + // } + + if (te instanceof IFluidHandler fluidHandler) { + sidedFluidAcceptors.put(direction, fluidHandler); + + } + + if (direction == ForgeDirection.UP) { + if (te instanceof IInventory inventory) { + sidedItemAcceptors.put(direction, inventory); + } + } + } + + // TODO: Unload chunks in loadedAdjacentChunks + } + + // TileEntity & LoadableTE + @Override + public void validate() { + super.validate(); + if (state != QuarryWorkState.FINISHED) { + if (workArea != null) { + loadChunkShifted(chunkX, chunkZ); + } + scanSidesForTEs(); + } + } + + // TileEntity + @Override + public void updateEntity() { + if (worldObj.isRemote) return; + if (facing == ForgeDirection.UNKNOWN) return; + if (state == QuarryWorkState.FINISHED && storedItems == 0 && fluidStorageIsEmpty()) return; + + int brokenBlocksTick = 0; + if (state == QuarryWorkState.STOPPED_WAITING_FOR_FLUID_SPACE + || state == QuarryWorkState.STOPPED_WAITING_FOR_ITEM_SPACE) { + if (tryHarvestCurrentBlock()) { + state = QuarryWorkState.RUNNING; + worldObj.setBlock(dx, dy, dz, Blocks.air); + brokenBlocksTick++; + } + } + + if (state == QuarryWorkState.RUNNING) { + while (brokenBlocksTick < STEPS_PER_TICK && stepPos()) { + // TODO: Remove after this has been tested by others + if (!isInBounds() || this.chunkX > 1000 || this.chunkZ > 1000) { + throw new RuntimeException( + String.format("Tried to quarry outside of work area at %d %d %d", dx, dy, dz)); + } + + if (tryHarvestCurrentBlock()) { + worldObj.setBlock(dx, dy, dz, Blocks.air); + brokenBlocksTick++; + } else { + if (state != QuarryWorkState.RUNNING) + break; + // energy cost for moving but not breaking + } + } + if (brokenBlocksTick < STEPS_PER_TICK && state == QuarryWorkState.RUNNING) { + state = QuarryWorkState.FINISHED; + unloadSelf(); + } + if (brokenBlocksTick > 0) { + markDirty(); + } + + this.brokenBlocksTotal += brokenBlocksTick; + } + + if (worldObj.getTotalWorldTime() % 4 == 0) { + // Move internally stored stuff to adjacent blocks + if (!ejectStoredToAdjacent()) scanSidesForTEs(); + } + } + @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); @@ -183,6 +513,27 @@ public void readFromNBT(NBTTagCompound nbt) { chunkZ = dz >> 4; } brokenBlocksTotal = nbt.getInteger("blocks"); + energyStorage.readFromNBT(nbt); + + NBTTagList tanksNBT = nbt.getTagList("tanks", Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < tanksNBT.tagCount(); i++) { + NBTTagCompound tag = tanksNBT.getCompoundTagAt(i); + int slot = tag.getByte("Slot") & 255; + if (slot < fluidStorage.size()) { + fluidStorage.get(slot) + .readFromNBT(tag); + } + } + + NBTTagList itemsNBT = nbt.getTagList("Items", Constants.NBT.TAG_COMPOUND); + storedItems = 0; + for (int i = 0; i < itemsNBT.tagCount(); i++) { + NBTTagCompound tag = itemsNBT.getCompoundTagAt(i); + ItemStack item = ItemStack.loadItemStackFromNBT(tag); + if (item != null) { + storeItemToStorage(item); + } + } } @Override @@ -197,20 +548,111 @@ public void writeToNBT(NBTTagCompound nbt) { nbt.setInteger("dz", dz); } nbt.setInteger("blocks", brokenBlocksTotal); + energyStorage.writeToNBT(nbt); + + NBTTagList tanksNBT = new NBTTagList(); + for (int i = 0; i < fluidStorage.size(); i++) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + fluidStorage.get(i) + .writeToNBT(tag); + tanksNBT.appendTag(tag); + } + nbt.setTag("tanks", tanksNBT); + + NBTTagList itemsNBT = new NBTTagList(); + for (Object2IntMap.Entry entry : itemStorage.object2IntEntrySet()) { + if (entry.getIntValue() > 0 && entry.getKey() != null) { + NBTTagCompound tag = new NBTTagCompound(); + ItemStack item = entry.getKey().copy(); + item.stackSize = entry.getIntValue(); + item.writeToNBT(tag); + itemsNBT.appendTag(tag); + } + } + nbt.setTag("Items", itemsNBT); } + // LoadableTE @Override public boolean keepsItselfLoaded() { return state != QuarryWorkState.FINISHED; } + // IEnergyReceiver + @Override + public int receiveEnergy(ForgeDirection forgeDirection, int i, boolean b) { + return energyStorage.receiveEnergy(i, b); + } + + @Override + public int getEnergyStored(ForgeDirection forgeDirection) { + return energyStorage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection forgeDirection) { + return energyStorage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection forgeDirection) { + return true; + } + + // IFluidHandler + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + return 0; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + for (FluidTank tank : fluidStorage) { + if (resource != null && resource.isFluidEqual(tank.getFluid())) { + return tank.drain(resource.amount, doDrain); + } + } + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + for (FluidTank tank : fluidStorage) { + if (tank.getFluidAmount() > 0) { + return tank.drain(maxDrain, doDrain); + } + } + return null; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + return false; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + return true; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + return fluidStorage.stream() + .map(FluidTank::getInfo) + .toArray(FluidTankInfo[]::new); + } + public enum QuarryWorkState { STOPPED, + STOPPED_WAITING_FOR_FLUID_SPACE, + STOPPED_WAITING_FOR_ITEM_SPACE, FINISHED, - RUNNING; + RUNNING } public static class Area2d { + // The corner that has the lower x&y public final Vector2i low; // The corner that has the higher x&y @@ -254,8 +696,8 @@ public void writeNBTTag(NBTTagCompound nbt) { public static Area2d fromNBTTag(NBTTagCompound nbt) { NBTTagCompound tag = nbt.getCompoundTag("area"); - int lowX = tag.getInteger("lowX"); - int lowZ = tag.getInteger("lowZ"); + int lowX = tag.getInteger("lowX"); + int lowZ = tag.getInteger("lowZ"); int highX = tag.getInteger("highX"); int highZ = tag.getInteger("highY"); return new Area2d(lowX, lowZ, highX, highZ); @@ -268,4 +710,23 @@ public boolean equals(Object obj) { return low.equals(other.low) && high.equals(other.high); } } + + protected static class ItemStackHashStrategy implements Hash.Strategy { + + public static final ItemStackHashStrategy instance = new ItemStackHashStrategy(); + + @Override + public int hashCode(ItemStack itemStack) { + if (itemStack == null || itemStack.getItem() == null) return 0; + return Objects.hash(itemStack.getItem(), itemStack.getItemDamage(), itemStack.getTagCompound()); + } + + @Override + public boolean equals(ItemStack a, ItemStack b) { + if (a == null && b == null) return true; + if (a == null || b == null) return false; + return a.getItem() == b.getItem() && a.getItemDamage() == b.getItemDamage() + && Objects.equals(a.getTagCompound(), b.getTagCompound()); + } + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java index 4b8daeb4..54f8d0f9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java @@ -1,24 +1,26 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.utils; -import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import javax.annotation.Nullable; + import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.ChunkCoordIntPair; import net.minecraftforge.common.ForgeChunkManager; -import javax.annotation.Nullable; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; /** * Base class for TileEntities that need to keep chunks loaded. * Handles chunk loading tickets and manages forced chunk loading through Forge's ChunkManager. */ public class LoadableTE extends TileEntity { + /** The chunk loading ticket used to force chunks to stay loaded */ @Nullable private ForgeChunkManager.Ticket ticket = null; - private int selfChunkX; - private int selfChunkZ; - protected boolean selfIsLoaded = true; + protected int selfChunkX; + protected int selfChunkZ; + protected boolean selfIsLoaded = false; /** * Initializes this class after the TE is loaded. @@ -28,7 +30,6 @@ public class LoadableTE extends TileEntity { @Override public void validate() { super.validate(); - selfIsLoaded = false; selfChunkX = xCoord >> 4; selfChunkZ = zCoord >> 4; if (worldObj != null && !worldObj.isRemote) { @@ -45,11 +46,17 @@ public void validate() { * @param chunkCoord The chunk coordinates to load */ public void loadChunk(ChunkCoordIntPair chunkCoord) { - if (selfIsLoaded && chunkCoord.chunkXPos == selfChunkX && chunkCoord.chunkZPos == selfChunkZ && keepsItselfLoaded()) return; + if (selfIsLoaded && chunkCoord.chunkXPos == selfChunkX + && chunkCoord.chunkZPos == selfChunkZ + && keepsItselfLoaded()) return; if (requestTicket()) { ForgeChunkManager.forceChunk(ticket, chunkCoord); } else { - UtilitiesInExcess.LOG.error("Failed to get ticket to load chunk at {} {} for Mod {}", chunkCoord.chunkXPos, chunkCoord.chunkZPos, UtilitiesInExcess.MODID); + UtilitiesInExcess.LOG.error( + "Failed to get ticket to load chunk at {} {} for Mod {}", + chunkCoord.chunkXPos, + chunkCoord.chunkZPos, + UtilitiesInExcess.MODID); } } @@ -70,7 +77,7 @@ public void loadChunkShifted(int x, int z) { * @param z Block Z coordinate */ public void loadChunk(int x, int z) { - loadChunk(new ChunkCoordIntPair(x >> 4, z >> 4)); + loadChunk(new ChunkCoordIntPair(x >> 4, z >> 4)); } /** @@ -84,7 +91,11 @@ void unloadChunk(ChunkCoordIntPair chunkCoord) { if (requestTicket()) { ForgeChunkManager.unforceChunk(ticket, chunkCoord); } else { - UtilitiesInExcess.LOG.error("Failed to get ticket to unload? chunk at {} {} for Mod {}", chunkCoord.chunkXPos, chunkCoord.chunkZPos, UtilitiesInExcess.MODID); + UtilitiesInExcess.LOG.error( + "Failed to get ticket to unload? chunk at {} {} for Mod {}", + chunkCoord.chunkXPos, + chunkCoord.chunkZPos, + UtilitiesInExcess.MODID); } } @@ -123,8 +134,8 @@ public void loadSelf() { */ public void unloadSelf() { if (selfIsLoaded) { - unloadChunkShifted(selfChunkX, selfChunkZ); selfIsLoaded = false; + unloadChunkShifted(selfChunkX, selfChunkZ); } } @@ -146,7 +157,8 @@ public void invalidateTicket() { */ private boolean requestTicket() { if (ticket != null) return true; - ticket = ForgeChunkManager.requestTicket(UtilitiesInExcess.uieInstance, worldObj, ForgeChunkManager.Type.NORMAL); + ticket = ForgeChunkManager + .requestTicket(UtilitiesInExcess.uieInstance, worldObj, ForgeChunkManager.Type.NORMAL); if (ticket != null) { // Store TileEntity coordinates in ticket data for reloading @@ -180,6 +192,18 @@ public boolean keepsItselfLoaded() { return false; } + /** + * Check if this TE is already forcing a specific chunk to stay loaded. + * It is advised to load a chunk that is required for the TE to function properly, even if it is already laoded by + * another mod, because that mod may for some reason stop force-loading it. + * + * @return True if we are already loading this chunk, otherwise false. + */ + public boolean areWeLoadingThisChunk(int chunkX, int chunkY) { + ChunkCoordIntPair chunk = new ChunkCoordIntPair(chunkX, chunkY); + return this.ticket != null && this.ticket.getChunkList().contains(chunk); + } + /** * Called when the chunk containing this TileEntity is unloaded. * Releases the chunk loading ticket to prevent memory leaks. diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java index 0980d670..665358e4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java @@ -13,6 +13,7 @@ public static void registerConfig() throws ConfigException { ConfigurationManager.registerConfig(CursedEarthConfig.class); ConfigurationManager.registerConfig(EnderLotusConfig.class); ConfigurationManager.registerConfig(GeneratorConfig.class); + ConfigurationManager.registerConfig(EnderQuarryConfig.class); } @Config.DefaultBoolean(true) @@ -82,9 +83,6 @@ public static void registerConfig() throws ConfigException { @Config.DefaultBoolean(true) public static boolean enableEndOfTimePortal; - @Config.DefaultBoolean(true) - public static boolean enableEnderQuarry; - @Config.Comment("Cursed Earth Configuration") public static final CursedEarth cursedEarth = new CursedEarth(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java new file mode 100644 index 00000000..f485a721 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java @@ -0,0 +1,26 @@ +package com.fouristhenumber.utilitiesinexcess.config.blocks; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "blocks.ender_quarry") +@Config.Comment("Ender Quarry Configuration") +@Config.LangKey("utilitiesinexcess.config.block.ender_quarry") +public class EnderQuarryConfig { + + @Config.DefaultBoolean(true) + public static boolean enableEnderQuarry; + + @Config.Comment("Energy (RF) capacity of the machine.") + @Config.DefaultInt(10_000_000) + public static int enderQuarryEnergyStorage; + + @Config.Comment("Amount of fluid tanks, with one for each fluid type.") + @Config.DefaultInt(2) + public static int enderQuarryFluidTankAmount; + + @Config.Comment("Amount of fluid (in mB) that can be stored per tank.") + @Config.DefaultInt(128_000) + @Config.RangeInt(min = 16_000, max = 1_024_000) + public static int enderQuarryFluidTankStorage; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java index 82adccf4..0d99ce83 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/TEChunkLoadingCallback.java @@ -1,13 +1,15 @@ package com.fouristhenumber.utilitiesinexcess.utils; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; +import java.util.List; + import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.ForgeChunkManager; -import java.util.List; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; public class TEChunkLoadingCallback implements ForgeChunkManager.LoadingCallback { + @Override public void ticketsLoaded(List tickets, World world) { for (ForgeChunkManager.Ticket ticket : tickets) { From a02c5236b2532b4afd7f1d7f790276e5778b22f6 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Mon, 24 Nov 2025 22:01:49 +0100 Subject: [PATCH 05/28] Make mining logic accept more cases, add energy cost, fix weird stackoverflow from chunk loading --- .../common/blocks/BlockEnderQuarry.java | 9 +- .../tileentities/TileEntityEnderQuarry.java | 124 +++++++++++++----- .../common/tileentities/utils/LoadableTE.java | 6 +- .../config/blocks/EnderQuarryConfig.java | 5 + 4 files changed, 105 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java index fd1f88ea..5127bf12 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java @@ -7,7 +7,6 @@ import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; @@ -63,10 +62,10 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer BlockPos farFront = offsetByForward(inFront, quarry.facing, 64, 0); farFront = offsetByRight(farFront, quarry.facing, 64, 0); - for (int i = 1; i < 256; i++) { - worldIn.setBlock(inFront.x, i, inFront.z, Blocks.diamond_block); - worldIn.setBlock(farFront.x, i, farFront.z, Blocks.diamond_block); - } + // for (int i = 1; i < 256; i++) { + // worldIn.setBlock(inFront.x, i, inFront.z, Blocks.diamond_block); + // worldIn.setBlock(farFront.x, i, farFront.z, Blocks.diamond_block); + // } player.addChatComponentMessage( new ChatComponentText(String.format("Set up work area from %s to %s", inFront, farFront))); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index e060d2ee..e28fa602 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -8,8 +8,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; -import cpw.mods.fml.common.FMLLog; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; @@ -19,7 +17,6 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.ChunkCoordIntPair; -import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.Fluid; @@ -34,6 +31,7 @@ import org.jetbrains.annotations.Nullable; import org.joml.Vector2i; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; @@ -58,7 +56,7 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver private int chunkX; private int chunkZ; private int brokenBlocksTotal; - private final HashMap sidedItemAcceptors = new HashMap<>(); + private final HashMap sidedItemAcceptors = new HashMap<>(); private final HashMap sidedFluidAcceptors = new HashMap<>(); protected final EnergyStorage energyStorage = new EnergyStorage(EnderQuarryConfig.enderQuarryEnergyStorage); @@ -86,8 +84,13 @@ public String getState() { .format("Quarry is currently mining at %d %d %d, has already mined %d", dx, dy, dz, brokenBlocksTotal); case STOPPED_WAITING_FOR_FLUID_SPACE -> "Quarry is full on fluids"; case STOPPED_WAITING_FOR_ITEM_SPACE -> "Quarry is full on items"; + case STOPPED_WAITING_FOR_ENERGY -> "Quarry is missing energy"; + case THROTTLED_BY_ENERGY -> "Quarry is running, but not at full speed because of missing energy"; case STOPPED -> "Quarry is stopped."; - case FINISHED -> String.format("Quarry has finished after mining %d blocks, still holding %d items", brokenBlocksTotal, storedItems); + case FINISHED -> String.format( + "Quarry has finished after mining %d blocks%s", + brokenBlocksTotal, + String.format(storedItems > 0 ? ", still holding %d items" : "", storedItems)); }; } @@ -173,15 +176,34 @@ private boolean stepPos() { * Tries to store the resulting resources of the block at the current position, * and store the items / fluid to the internal storage. * - * @return True if we managed to harvest the current block, false if we couldn't / weren't allowed to touch/harvest - * it. + * @return A boolean tuple of: <Could we work & harvest the block, Did we skip this block> */ - private boolean tryHarvestCurrentBlock() { - if (worldObj.isAirBlock(dx, dy, dz) || worldObj.getBlock(dx, dy, dz) - .getMaterial() == Material.air) return false; - + private boolean[] tryHarvestCurrentBlock() { Block block = worldObj.getBlock(dx, dy, dz); - return harvestAndStoreBlock(block); + if (block.getMaterial() == Material.air || worldObj.isAirBlock(dx, dy, dz) + || block.getBlockHardness(worldObj, dx, dy, dz) < 0 + || block.getBlockHardness(worldObj, dx, dy, dz) > 100) { + return new boolean[] { tryConsumeEnergy(0.0f, false), true }; + } ; + + float hardness = block.getBlockHardness(worldObj, dx, dy, dz); + if (tryConsumeEnergy(hardness, true)) { + return new boolean[] { (harvestAndStoreBlock(block) && tryConsumeEnergy(hardness, false)), false }; + } + return new boolean[] { false, false }; + } + + private boolean tryConsumeEnergy(float hardness, boolean simulate) { + float costMultiplier = 1.0f; + int cost = (int) ((hardness == 0 ? 100 : EnderQuarryConfig.enderQuarryBaseRFCost) * costMultiplier); + if (energyStorage.extractEnergy(cost, true) >= cost) { + if (!simulate) { + energyStorage.extractEnergy(cost, false); + } + return true; + } + state = QuarryWorkState.STOPPED_WAITING_FOR_ENERGY; + return false; } private boolean harvestAndStoreBlock(Block block) { @@ -211,7 +233,8 @@ private boolean harvestAndStoreBlock(Block block) { // Block just has no drops return true; } catch (Exception ignored) { - UtilitiesInExcess.LOG.error("Failed while trying to harvest block {} at {} {} {}.", block.toString(), dx, dy, dz); + UtilitiesInExcess.LOG + .error("Failed while trying to harvest block {} at {} {} {}.", block.toString(), dx, dy, dz); return false; } } @@ -285,7 +308,6 @@ private boolean fluidStorageIsEmpty() { * @return False if the adjacent TEs changed without us noticing, and we need to rescan */ private boolean ejectStoredToAdjacent() { - // TODO: call markDirty() if (storedItems > 0) { for (IInventory inventory : sidedItemAcceptors.values()) { if (inventory != null) { @@ -399,22 +421,25 @@ public void scanSidesForTEs() { sidedItemAcceptors.clear(); ArrayList loadedAdjacentChunks = new ArrayList<>(); - // TODO: Load cross around if some side is in an adajcent chunk, only for the duration of this scan + // Make sure the directly adjacent blocks in different chunks are loaded whilst checking for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { int directionChunkX = (direction.offsetX + this.xCoord) >> 4; int directionChunkZ = (direction.offsetZ + this.zCoord) >> 4; - if ((directionChunkX != this.selfChunkX || directionChunkZ != this.selfChunkZ) && !areWeLoadingThisChunk(directionChunkX, directionChunkZ)) { + if ((directionChunkX != this.selfChunkX || directionChunkZ != this.selfChunkZ) + && !areWeLoadingThisChunk(directionChunkX, directionChunkZ)) { loadChunkShifted(directionChunkX, directionChunkZ); loadedAdjacentChunks.add(new ChunkCoordIntPair(directionChunkX, directionChunkZ)); } } - // TODO: remove adjacent chunks that contain a valid side, from loadedAdjacentChunks for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { TileEntity te = this.worldObj.getTileEntity( direction.offsetX + this.xCoord, direction.offsetY + this.yCoord, direction.offsetZ + this.zCoord); + ChunkCoordIntPair chunk = new ChunkCoordIntPair( + (direction.offsetX + this.xCoord) >> 4, + (direction.offsetZ + this.zCoord) >> 4); // TODO: Upgrades people // if (te instanceof IQuarryUpgrade quarryUpgrade) { @@ -423,7 +448,8 @@ public void scanSidesForTEs() { if (te instanceof IFluidHandler fluidHandler) { sidedFluidAcceptors.put(direction, fluidHandler); - + // If there is actually a TE present that we want, keep this chunk loaded (if it is a different one) + loadedAdjacentChunks.remove(chunk); } if (direction == ForgeDirection.UP) { @@ -433,7 +459,18 @@ public void scanSidesForTEs() { } } - // TODO: Unload chunks in loadedAdjacentChunks + // Unload all the temporarily loaded chunks + for (ChunkCoordIntPair loadedChunk : loadedAdjacentChunks) { + unloadChunk(loadedChunk); + } + } + + /** + * Remove / replace the current block. + * Does not check for anything, should be called after tryHarvestCurrentBlock() returns true. + */ + private void removeCurrentBlock() { + worldObj.setBlock(dx, dy, dz, Blocks.air); } // TileEntity & LoadableTE @@ -444,7 +481,13 @@ public void validate() { if (workArea != null) { loadChunkShifted(chunkX, chunkZ); } - scanSidesForTEs(); + /* + * preferably we would call scanSidesForTEs() here, however + * the contained getTileEntity() seems to always re-load the chunk at this stage + * which then re-validates back to this function, eventually leading to a stackoverflow + * Instead we add a null inventory, so that it gets rechecked later + **/ + sidedItemAcceptors.put(ForgeDirection.UP, null); } } @@ -456,12 +499,16 @@ public void updateEntity() { if (state == QuarryWorkState.FINISHED && storedItems == 0 && fluidStorageIsEmpty()) return; int brokenBlocksTick = 0; - if (state == QuarryWorkState.STOPPED_WAITING_FOR_FLUID_SPACE - || state == QuarryWorkState.STOPPED_WAITING_FOR_ITEM_SPACE) { - if (tryHarvestCurrentBlock()) { + if (state != QuarryWorkState.RUNNING && state != QuarryWorkState.FINISHED && state != QuarryWorkState.STOPPED) { + boolean[] harvestResult = tryHarvestCurrentBlock(); + boolean wasAbleToHarvest = harvestResult[0]; + boolean blockWasSkipped = harvestResult[1]; + if (wasAbleToHarvest) { state = QuarryWorkState.RUNNING; - worldObj.setBlock(dx, dy, dz, Blocks.air); - brokenBlocksTick++; + if (!blockWasSkipped) { + removeCurrentBlock(); + brokenBlocksTick++; + } } } @@ -473,13 +520,17 @@ public void updateEntity() { String.format("Tried to quarry outside of work area at %d %d %d", dx, dy, dz)); } - if (tryHarvestCurrentBlock()) { - worldObj.setBlock(dx, dy, dz, Blocks.air); - brokenBlocksTick++; + boolean[] harvestResult = tryHarvestCurrentBlock(); + boolean wasAbleToHarvest = harvestResult[0]; + boolean blockWasSkipped = harvestResult[1]; + if (wasAbleToHarvest) { + if (!blockWasSkipped) { + removeCurrentBlock(); + brokenBlocksTick++; + } } else { - if (state != QuarryWorkState.RUNNING) - break; - // energy cost for moving but not breaking + // Check if something has stopped us (out of space / energy) + if (state != QuarryWorkState.RUNNING) break; } } if (brokenBlocksTick < STEPS_PER_TICK && state == QuarryWorkState.RUNNING) { @@ -488,6 +539,12 @@ public void updateEntity() { } if (brokenBlocksTick > 0) { markDirty(); + if (state == QuarryWorkState.STOPPED_WAITING_FOR_ENERGY) { + // We were still able to mine some blocks this tick, so we don't consider this fully stopped + // If we fail to harvest again at the start of the next tick, it will be set to STOPPED_... either + // way + state = QuarryWorkState.THROTTLED_BY_ENERGY; + } } this.brokenBlocksTotal += brokenBlocksTick; @@ -564,7 +621,8 @@ public void writeToNBT(NBTTagCompound nbt) { for (Object2IntMap.Entry entry : itemStorage.object2IntEntrySet()) { if (entry.getIntValue() > 0 && entry.getKey() != null) { NBTTagCompound tag = new NBTTagCompound(); - ItemStack item = entry.getKey().copy(); + ItemStack item = entry.getKey() + .copy(); item.stackSize = entry.getIntValue(); item.writeToNBT(tag); itemsNBT.appendTag(tag); @@ -647,6 +705,8 @@ public enum QuarryWorkState { STOPPED, STOPPED_WAITING_FOR_FLUID_SPACE, STOPPED_WAITING_FOR_ITEM_SPACE, + STOPPED_WAITING_FOR_ENERGY, + THROTTLED_BY_ENERGY, FINISHED, RUNNING } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java index 54f8d0f9..75508ef1 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/LoadableTE.java @@ -86,7 +86,7 @@ public void loadChunk(int x, int z) { * * @param chunkCoord The chunk coordinates to unload */ - void unloadChunk(ChunkCoordIntPair chunkCoord) { + public void unloadChunk(ChunkCoordIntPair chunkCoord) { if (chunkCoord.chunkXPos == selfChunkX && chunkCoord.chunkZPos == selfChunkZ && keepsItselfLoaded()) return; if (requestTicket()) { ForgeChunkManager.unforceChunk(ticket, chunkCoord); @@ -201,7 +201,8 @@ public boolean keepsItselfLoaded() { */ public boolean areWeLoadingThisChunk(int chunkX, int chunkY) { ChunkCoordIntPair chunk = new ChunkCoordIntPair(chunkX, chunkY); - return this.ticket != null && this.ticket.getChunkList().contains(chunk); + return this.ticket != null && this.ticket.getChunkList() + .contains(chunk); } /** @@ -223,4 +224,5 @@ public void invalidate() { super.invalidate(); invalidateTicket(); } + } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java index f485a721..3d865068 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java @@ -23,4 +23,9 @@ public class EnderQuarryConfig { @Config.DefaultInt(128_000) @Config.RangeInt(min = 16_000, max = 1_024_000) public static int enderQuarryFluidTankStorage; + + @Config.Comment("Base factor of RF that is used per operation. Is influenced by upgrades & block hardness.") + @Config.DefaultInt(1_000) + @Config.RangeInt(min = 100, max = 1_024_000) + public static int enderQuarryBaseRFCost; } From 3ae85b25a07d37c26550f08c7efe964592801837 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Fri, 28 Nov 2025 01:04:24 +0100 Subject: [PATCH 06/28] Add first pass of ender marker, need to actually use in quarry now --- dependencies.gradle | 2 +- .../utilitiesinexcess/ModBlocks.java | 2 + .../utilitiesinexcess/UtilitiesInExcess.java | 2 + .../common/blocks/BlockEnderMarker.java | 112 ++++++++++ .../tileentities/TileEntityEnderMarker.java | 208 ++++++++++++++++++ .../common/tileentities/utils/IFacingTE.java | 21 ++ .../utils/ForgeEventHandler.java | 18 ++ .../utilitiesinexcess/utils/Tuple.java | 20 ++ .../utilitiesinexcess/blocks/ender_quarry.png | Bin 2028 -> 0 bytes .../blockstates/ender_marker.json | 5 + .../blockstates/ender_quarry.json | 5 +- .../models/blocks/ender_marker.json | 197 +++++++++++++++++ .../textures/blocks/ender_marker.png | Bin 0 -> 641 bytes 13 files changed, 587 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderMarker.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/IFacingTE.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/Tuple.java delete mode 100644 src/main/resources/assets/utilitiesinexcess/blocks/ender_quarry.png create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/ender_marker.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/ender_marker.json create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/ender_marker.png diff --git a/dependencies.gradle b/dependencies.gradle index 0e6a6c80..4d95a685 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,7 +34,7 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:GTNHLib:0.8.9:dev") + implementation("com.github.GTNewHorizons:GTNHLib:0.8.15:dev") // TODO: remove MUI1 dep when the implicit dependency // TODO: in IItemHandlerModifiable is removed api("com.github.GTNewHorizons:ModularUI:1.2.20:dev") diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 6ea4e6f4..2223f1d8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -13,6 +13,7 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCursedEarth; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockDrum; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderLotus; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderMarker; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderQuarry; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEtherealGlass; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockFloating; @@ -107,6 +108,7 @@ public enum ModBlocks { UNDERWORLD_PORTAL(BlockConfig.enableUnderWorldPortal && UnderWorldConfig.enableUnderWorld, new BlockPortalUnderWorld(), "underworld_portal"), END_OF_TIME_PORTAL(BlockConfig.enableEndOfTimePortal && EndOfTimeConfig.enableEndOfTime, new BlockPortalEndOfTime(), BlockPortalEndOfTime.ItemBlockPortalEndOfTime.class, "temporal_gate"), ENDER_QUARRY(EnderQuarryConfig.enableEnderQuarry, new BlockEnderQuarry(), "ender_quarry"), + ENDER_MARKER(EnderQuarryConfig.enableEnderQuarry, new BlockEnderMarker(), "ender_marker"), ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index f3612ff8..465be6ef 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -15,6 +15,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; @@ -131,6 +132,7 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityPinkGenerator.class, "TileEntityPinkGeneratorUIE"); GameRegistry.registerTileEntity(TileEntityNetherStarGenerator.class, "TileEntityNetherStarGeneratorUIE"); GameRegistry.registerTileEntity(TileEntityEnderQuarry.class, "TileEntityEnderQuarryUIE"); + GameRegistry.registerTileEntity(TileEntityEnderMarker.class, "TileEntityEnderMarkerUIE"); lapisAetheriusRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new LapisAetheriusRenderer()); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderMarker.java new file mode 100644 index 00000000..4a2fec9a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderMarker.java @@ -0,0 +1,112 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.Explosion; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker; + +public class BlockEnderMarker extends BlockContainer { + + public static final ForgeDirection[] HORIZONTAL_DIRECTIONS = new ForgeDirection[] { ForgeDirection.NORTH, + ForgeDirection.SOUTH, ForgeDirection.WEST, ForgeDirection.EAST }; + + public BlockEnderMarker() { + super(Material.iron); + setBlockName("ender_marker"); + setBlockTextureName("utilitiesinexcess:ender_marker"); + setBlockBounds(7F / 16F, 0F / 16F, 7F / 16F, 9F / 16F, 13.5F / 16F, 9F / 16F); + setLightOpacity(0); + } + + @Override + public void onBlockPlacedBy(World worldIn, int x, int y, int z, EntityLivingBase placer, ItemStack itemIn) { + if (worldIn.isRemote) return; + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof TileEntityEnderMarker marker) { + marker.checkForAlignedMarkers(); + } + } + + @Override + public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, + List list, Entity collider) { + this.setBlockBounds(7F / 16F, 0F / 16F, 7F / 16F, 9F / 16F, 13.5F / 16F, 9F / 16F); + super.addCollisionBoxesToList(worldIn, x, y, z, mask, list, collider); + } + + @Override + public void onBlockDestroyedByPlayer(World worldIn, int x, int y, int z, int meta) { + if (worldIn.isRemote) return; + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof TileEntityEnderMarker marker) { + marker.teardownConnections(); + } + } + + @Override + public void onBlockDestroyedByExplosion(World worldIn, int x, int y, int z, Explosion explosionIn) { + this.onBlockDestroyedByPlayer(worldIn, x, y, z, 0); + } + + @Override + public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { + super.onNeighborBlockChange(worldIn, x, y, z, neighbor); + TileEntity te = worldIn.getTileEntity(x, y, z); + if (!worldIn.isRemote && te instanceof TileEntityEnderMarker marker) { + marker.checkForAlignedMarkers(); + } + } + + @Override + public void randomDisplayTick(World worldIn, int x, int y, int z, Random random) { + int meta = worldIn.getBlockMetadata(x, y, z); + for (ForgeDirection dir : HORIZONTAL_DIRECTIONS) { + if ((meta & (1 << (dir.ordinal() - 2))) != 0) { + for (int i = 0; i < 7; i++) { + worldIn.spawnParticle( + "reddust", + x + 0.5D + ((double) dir.offsetX / 4) + dir.offsetX * random.nextDouble(), + y + 0.7D, + z + 0.5D + ((double) dir.offsetZ / 4) + dir.offsetZ * random.nextDouble(), + 0.5D + ((double) dir.offsetX / 2) * i, + 0.0D, + 0.5D + ((double) dir.offsetZ / 2) * i); + } + } + } + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityEnderMarker(); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return JSON_ISBRH_ID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java new file mode 100644 index 00000000..61154c69 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -0,0 +1,208 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.Nullable; +import org.joml.Vector4i; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.IFacingTE; +import com.fouristhenumber.utilitiesinexcess.utils.Tuple; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +public class TileEntityEnderMarker extends TileEntity implements IFacingTE { + + public static final ForgeDirection[] HORIZONTAL_DIRECTIONS = new ForgeDirection[] { ForgeDirection.NORTH, + ForgeDirection.SOUTH, ForgeDirection.WEST, ForgeDirection.EAST }; + public static final ConcurrentHashMap> registeredMarkers = + new ConcurrentHashMap<>(); + + public final HashMap> alignedMarkers = new HashMap<>(); + private ForgeDirection facing = ForgeDirection.UNKNOWN; + private int activeDirections = 0; + + @Override + public void validate() { + super.validate(); + if (worldObj.isRemote) return; + // Always update the marker for the current position, for world load and stale cases + getRegistryForDimension().put(new BlockPos(xCoord, yCoord, zCoord), this); + } + + // Helper to get the marker register for the current dimension + private ConcurrentHashMap getRegistryForDimension() { + int dim = worldObj.provider.dimensionId; + return registeredMarkers.computeIfAbsent(dim, k -> new ConcurrentHashMap<>()); + } + + public static ForgeDirection turnRight90(ForgeDirection dir) { + return switch (dir) { + case EAST -> ForgeDirection.SOUTH; + case NORTH -> ForgeDirection.EAST; + case SOUTH -> ForgeDirection.WEST; + case WEST -> ForgeDirection.NORTH; + default -> dir; + }; + } + + public static ForgeDirection turnLeft90(ForgeDirection dir) { + return switch (dir) { + case EAST -> ForgeDirection.NORTH; + case NORTH -> ForgeDirection.WEST; + case SOUTH -> ForgeDirection.EAST; + case WEST -> ForgeDirection.SOUTH; + default -> dir; + }; + } + + public @Nullable Vector4i checkForBoundary(ForgeDirection starterFacing) { + Tuple secondCorner = alignedMarkers.getOrDefault(starterFacing, null); + if (secondCorner != null && secondCorner.getKey() != null) { + Tuple thirdCorner = Optional + .ofNullable(secondCorner.getKey().alignedMarkers.getOrDefault(turnRight90(starterFacing), null)) + .orElse(secondCorner.getKey().alignedMarkers.getOrDefault(turnLeft90(starterFacing), null)); + if (thirdCorner != null) { + return new Vector4i(this.xCoord, this.zCoord, thirdCorner.getValue().x, thirdCorner.getValue().z); + } + } + return null; + } + + public void checkForAlignedMarkers() { + ConcurrentHashMap dimRegistry = getRegistryForDimension(); + // ArrayList staleMarkers = new ArrayList<>(); +// for (Map.Entry> entry : alignedMarkers +// .entrySet()) { +// if (entry.getValue() +// .getKey() == null) { +// BlockPos alignedMarkerPos = entry.getValue() +// .getValue(); +// worldObj.getChunkProvider() +// .loadChunk(alignedMarkerPos.x >> 4, alignedMarkerPos.z >> 4); +// TileEntity te = worldObj.getTileEntity(alignedMarkerPos.x, alignedMarkerPos.y, alignedMarkerPos.z); +// if (te instanceof TileEntityEnderMarker marker) { +// setAlignedMarker(entry.getKey(), marker); +// marker.setAlignedMarker( +// entry.getKey() +// .getOpposite(), +// this); +// } else { +// removeAlignedMarker(entry.getKey()); +// } +// // staleMarkers.add(entry.getKey()); +// } +// } + // staleMarkers.forEach(alignedMarkers::remove); + //alignedMarkers.clear(); + for (ForgeDirection dir : HORIZONTAL_DIRECTIONS) { + if (!alignedMarkers.containsKey(dir)) { + for (Map.Entry entry : dimRegistry.entrySet()) { + if (entry.getValue() != null && entry.getValue() != this + && !entry.getValue().alignedMarkers.containsKey(dir.getOpposite()) + && entry.getKey().y == this.yCoord + && (entry.getKey().x == this.xCoord || entry.getKey().z == this.zCoord)) { + int dx = entry.getKey().x - this.xCoord; + int dz = entry.getKey().z - this.zCoord; + + // Don't want markers right next to us + if (Math.max(Math.abs(dx), Math.abs(dz)) < 2) continue; + + ForgeDirection markerDirection; + if (dx == 0) { + markerDirection = dz > 0 ? ForgeDirection.SOUTH : ForgeDirection.NORTH; + } else { + markerDirection = dx > 0 ? ForgeDirection.EAST : ForgeDirection.WEST; + } + if (markerDirection == dir) { + setAlignedMarker(dir, entry.getValue()); + entry.getValue() + .setAlignedMarker(dir.getOpposite(), this); + } + } + } + } + } + } + + public void setAlignedMarker(ForgeDirection dir, TileEntityEnderMarker marker) { + alignedMarkers.put(dir, new Tuple<>(marker, new BlockPos(marker.xCoord, marker.yCoord, marker.zCoord))); + int prevActiveDirs = this.activeDirections; + this.activeDirections |= 1 << (dir.ordinal() - 2); + if (prevActiveDirs != activeDirections) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, this.activeDirections, 2); + } + } + + public void removeAlignedMarker(ForgeDirection dir) { + alignedMarkers.remove(dir); + int prevActiveDirs = this.activeDirections; + this.activeDirections &= ~(1 << (dir.ordinal() - 2)); + if (prevActiveDirs != activeDirections) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, this.activeDirections, 2); + } + } + + public void teardownConnections() { + getRegistryForDimension().remove(new BlockPos(this.xCoord, this.yCoord, this.zCoord)); + for (Map.Entry> alignedMarker : alignedMarkers + .entrySet()) { + TileEntityEnderMarker markerTE = alignedMarker.getValue().getKey(); + if (markerTE != null) { + markerTE.removeAlignedMarker(alignedMarker.getKey().getOpposite()); + markerTE.checkForAlignedMarkers(); + } else { + BlockPos alignedMarkerPos = alignedMarker.getValue().getValue(); + TileEntity te = worldObj.getTileEntity(alignedMarkerPos.x, alignedMarkerPos.y, alignedMarkerPos.z); + if (te instanceof TileEntityEnderMarker marker) { + marker.removeAlignedMarker(alignedMarker.getKey().getOpposite()); + marker.checkForAlignedMarkers(); + } + } + } + alignedMarkers.clear(); + } + + @Override + public void invalidate() { + super.invalidate(); + if (!worldObj.isRemote) { + teardownConnections(); + } + } + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + if (!worldObj.isRemote) { + teardownConnections(); + } + } + + @Override + public ForgeDirection getFacing() { + return this.facing; + } + + @Override + public void setFacing(ForgeDirection newFacing) { + this.facing = newFacing; + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + readFacingFromNBT(compound); + } + + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + writeFacingToNBT(compound); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/IFacingTE.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/IFacingTE.java new file mode 100644 index 00000000..e36c3289 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/utils/IFacingTE.java @@ -0,0 +1,21 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.utils; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +public interface IFacingTE { + + ForgeDirection getFacing(); + + void setFacing(ForgeDirection newFacing); + + default void writeFacingToNBT(NBTTagCompound nbt) { + if (getFacing() != null) { + nbt.setInteger("facing", getFacing().ordinal()); + } + } + + default void readFacingFromNBT(NBTTagCompound nbt) { + setFacing(ForgeDirection.getOrientation(nbt.getInteger("facing"))); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java index c1d13dd3..3b585c70 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java @@ -6,8 +6,11 @@ import static com.fouristhenumber.utilitiesinexcess.common.items.ItemInvertedIngot.INVERTED_INGOT; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; @@ -38,6 +41,7 @@ import com.gtnewhorizon.gtnhlib.client.event.LivingEquipmentChangeEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.event.world.WorldEvent; public class ForgeEventHandler { @@ -150,4 +154,18 @@ public void onBlockBroken(BlockEvent.HarvestDropsEvent event) { event.drops.clear(); } } + + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload event) { + if (event.world.isRemote) return; + + // Clear the entire dimension registry + ConcurrentHashMap dimRegistry = + TileEntityEnderMarker.registeredMarkers.get(event.world.provider.dimensionId); + + if (dimRegistry != null) { + dimRegistry.clear(); + TileEntityEnderMarker.registeredMarkers.remove(event.world.provider.dimensionId); + } + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/Tuple.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/Tuple.java new file mode 100644 index 00000000..c3fa65b9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/Tuple.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +public class Tuple { + + public final X first; + public final Y second; + + public Tuple(X first, Y second) { + this.first = first; + this.second = second; + } + + public X getKey() { + return this.first; + } + + public Y getValue() { + return this.second; + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blocks/ender_quarry.png b/src/main/resources/assets/utilitiesinexcess/blocks/ender_quarry.png deleted file mode 100644 index 4912f4e9eb3defe584e68c34e02228d183615fa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2028 zcmV-P)978d1k~0bsLxI=@M-$GQNk3UdL&2^*)? z8^?9o05HAyp{jXLrye+fFb2RSqJkg*Y}-;zE~KTMVCLSe9zaE8{9F!zx=5{&^=uJ9 zs0C1_D`)@}nO@Y_xLPy;Kv6LuAAr`(z5CKT@V+{y1t8_b=uq{6I_6tIRz3@G^#g4H zO0)|U187))2Y|z4luZ96faO|%nfDCfnIhT+ z-s&B!yG+Ygs{r^+nc}K0L>OiF(N39KxUI@6Jr0k^<*^6=Z_EzmC4fZqH3CS@sBM=H zF^HjOW`lN_!Lmr~2h1K8z%+~NQ5Mh=00AO^BK4fkvyZF@0HzN`FNNpNoCyMOt-D7Z z2_QBN+WFfj)1O0xn1Nj&>c=ESuLCjwY@2Lor2z2tb|Un}F&uL}KmY@C2UM1da)JEq zaJF>-$X@j;)>Y`s`D*S2mFgl(KXj={ijD#K0J5S5gen#QeYr@qKw1K_$G)TMqZUC> z<;ia!M*(1vveTk|HAU4#Y8}pem;bUeD_>UNri%5kUoo=}IRWHlwJ-pFVU|+LYs~R( zkYal#(7hYC$<-~97C;x^KguoQp}k@2raR7A9&ivEkv_t;$QdQjPg20_6h0 zjm~8PI5yCy7AJb9!iBmrvf=@)1@Mj7Dp2IPA<%l}+gn*|3 zRAg+&XGywjsRckT02m5pHt#tb0P9W36XBtvcZY1t6d$eR_I;#1*Yj>rxTbyFXEa<3#OwqiCjhf-cf1MU1Lc3d=Mn&e zed=qHecuNlENfKcTKD0k1eJLq3Ml|+*wsPGyw0U3x3}hBQ(OazwE+7sFKiFbnB~K# zJ5oDRPF$%NV0ZA}$u4=Xr2x*$hMq543IMUde#?YsO1XdyfE}dt_1m&E`CK7@UlwNM zp9}zZ{bc}{{UU&62SHy4A*{J^-wsYT0PgZw4g#=iRHhz>0f1E^SeXF$2AOdQzin|0 zsK}w}Tqyu3qb|&jul^znz(}65EP(A`5kvrl68i@!C>H?ASYw+2nsD47EU#SnTclQ( zeeWzE0EFkzj`wkW4#Bz99E^xQu!%1ViMy3D027r#K!Aac-z_tXKE9-*n0o&yw z0QN^xv`GLIQsMGlU~xv4E@dr1188;%@&ahARya7w9zp-Z& zV!II9hVVNd0Eq1(6CmS6FNEgLoUQY1im5CB402K3!)&1y`&S$QJIQl)9tr|b5t)6p z8SFSI%q%tlLPtNNgJAm0P;=8^6J{AQEy1)JUdsc({X6gD_o#2(!3VN5xjD({ut>

g8nzNT31~(CTrC*xTT-d@lQ2WBiU+%`S3_K ziGXispGD&!40){l; Date: Sat, 29 Nov 2025 04:46:44 +0100 Subject: [PATCH 07/28] Move TileEntities into their own enum, Fix rejoining world for ender markers, implement usage of ender markers for quarry --- .../utilitiesinexcess/CommonProxy.java | 1 + .../utilitiesinexcess/ModTileEntities.java | 98 +++++++ .../utilitiesinexcess/UtilitiesInExcess.java | 67 +---- .../common/blocks/BlockEnderMarker.java | 6 +- .../common/blocks/BlockEnderQuarry.java | 261 +----------------- .../tileentities/TileEntityEnderMarker.java | 138 +++++---- .../tileentities/TileEntityEnderQuarry.java | 53 +++- .../utils/DirectionUtil.java | 253 +++++++++++++++++ .../utils/ForgeEventHandler.java | 10 +- 9 files changed, 502 insertions(+), 385 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/DirectionUtil.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java index 12dbfe22..2d8fcedf 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -34,6 +34,7 @@ public void preInit(FMLPreInitializationEvent event) { public void init(FMLInitializationEvent event) { soundVolumeChecks = new SoundVolumeChecks(); + ModTileEntities.init(); } public void postInit(FMLPostInitializationEvent event) {} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java new file mode 100644 index 00000000..26e7b2ed --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java @@ -0,0 +1,98 @@ +package com.fouristhenumber.utilitiesinexcess; + +import net.minecraft.tileentity.TileEntity; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPureLove; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRadicallyReducedChest; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRainMuffler; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRedstoneClock; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySignificantlyShrunkChest; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySoundMuffler; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanEnergy; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanFluid; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanItem; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityEnderGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityFoodGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityHighTemperatureFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityLavaGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityLowTemperatureFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityNetherStarGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityPinkGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityPotionGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityRedstoneGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntitySolarGenerator; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityTNTGenerator; + +import cpw.mods.fml.common.registry.GameRegistry; + +public enum ModTileEntities { + // spotless:off + + // make sure to leave a trailing comma + REDSTONE_CLOCK(TileEntityRedstoneClock .class , "RedstoneClock"), + TRASH_CAN_ITEM(TileEntityTrashCanItem.class , "TrashCanItem"), + TRASH_CAN_FLUID(TileEntityTrashCanFluid.class , "TrashCanFluid"), + TRASH_CAN_ENERGY(TileEntityTrashCanEnergy.class , "TrashCanEnergyUIE"), + DRUM(TileEntityDrum.class , "Drum"), + PURE_LOVE(TileEntityPureLove.class , "PureLove"), + CHEST_MAX(TileEntityMarginallyMaximisedChest.class , "MarginallyMaximisedChest"), + CHEST_SHRUNK(TileEntitySignificantlyShrunkChest.class , "SignificantlyShrunkChest"), + CHEST_SMALL(TileEntityRadicallyReducedChest.class , "RadicallyReducedChest"), + MUFFLER_SOUND(TileEntitySoundMuffler.class , "SoundMufflerUIE"), + MUFFLER_RAIN(TileEntityRainMuffler.class , "RainMufflerUIE"), + BLOCK_UPDATE_DETECTOR(TileEntityBlockUpdateDetector.class , "BlockUpdateDetector"), + CONVEYOR(TileEntityConveyor.class , "Conveyor"), + PORTAL_UNDERWORLD(TileEntityPortalUnderWorld.class , "PortalUnderWorld"), + GENERATOR_LOW_TEMP_FURNACE(TileEntityLowTemperatureFurnaceGenerator.class , "LowTemperatureFurnaceGeneratorUIE"), + GENERATOR_FURNACE(TileEntityFurnaceGenerator.class , "FurnaceGeneratorUIE"), + GENERATOR_HIGH_TEMP_FURNACE(TileEntityHighTemperatureFurnaceGenerator.class, "HighTemperatureFurnaceGeneratorUIE"), + GENERATOR_LAVA(TileEntityLavaGenerator.class , "LavaGeneratorUIE"), + GENERATOR_ENDER(TileEntityEnderGenerator.class , "EnderGeneratorUIE"), + GENERATOR_REDSTONE(TileEntityRedstoneGenerator.class , "RedstoneGeneratorUIE"), + GENERATOR_FOOD(TileEntityFoodGenerator.class , "FoodGeneratorUIE"), + GENERATOR_POTION(TileEntityPotionGenerator.class , "PotionGeneratorUIE"), + GENERATOR_SOLAR(TileEntitySolarGenerator.class , "SolarGeneratorUIE"), + GENERATOR_TNT(TileEntityTNTGenerator.class , "TNTGeneratorUIE"), + GENERATOR_PINK(TileEntityPinkGenerator.class , "PinkGeneratorUIE"), + GENERATOR_NETHER_STAR(TileEntityNetherStarGenerator.class , "NetherStarGeneratorUIE"), + ENDER_QUARRY(TileEntityEnderQuarry.class , "EnderQuarryUIE"), + ENDER_MARKER(TileEntityEnderMarker.class , "EnderMarkerUIE"), + ; + // spotless:on + + public static final ModTileEntities[] VALUES = values(); + + public static void init() { + for (ModTileEntities te : VALUES) { + if (te.isEnabled()) { + GameRegistry.registerTileEntity(te.clazz, te.name); + } + } + } + + private final boolean isEnabled; + private final Class clazz; + private final String name; + + ModTileEntities(Class clazz, String name) { + this(true, clazz, name); + } + + ModTileEntities(Boolean enabled, Class clazz, String name) { + this.isEnabled = enabled; + this.clazz = clazz; + this.name = "TileEntity" + name; + } + + public boolean isEnabled() { + return isEnabled; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index 465be6ef..11d6b47f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -1,5 +1,6 @@ package com.fouristhenumber.utilitiesinexcess; +import net.minecraft.client.Minecraft; import net.minecraft.util.WeightedRandomChestContent; import net.minecraftforge.common.ChestGenHooks; import net.minecraftforge.common.ForgeChunkManager; @@ -12,35 +13,7 @@ import com.fouristhenumber.utilitiesinexcess.common.renderers.BlackoutCurtainsRenderer; import com.fouristhenumber.utilitiesinexcess.common.renderers.LapisAetheriusRenderer; import com.fouristhenumber.utilitiesinexcess.common.renderers.SpikeRenderer; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPureLove; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRadicallyReducedChest; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRainMuffler; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRedstoneClock; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySignificantlyShrunkChest; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySoundMuffler; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySpike; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanEnergy; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanFluid; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanItem; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityEnderGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityFoodGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityFurnaceGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityHighTemperatureFurnaceGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityLavaGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityLowTemperatureFurnaceGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityNetherStarGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityPinkGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityPotionGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityRedstoneGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntitySolarGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityTNTGenerator; import com.fouristhenumber.utilitiesinexcess.common.worldgen.WorldGenEnderLotus; import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.compat.crafttweaker.QEDCraftTweakerSupport; @@ -83,6 +56,10 @@ public class UtilitiesInExcess { serverSide = "com.fouristhenumber.utilitiesinexcess.CommonProxy") public static CommonProxy proxy; + public static void chat(String text) { + Minecraft.getMinecraft().thePlayer.sendChatMessage(text); + } + @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { GameRegistry.registerTileEntity(TileEntitySpike.class, "utilitiesinexcess:TileEntitySpike"); @@ -100,40 +77,6 @@ public void init(FMLInitializationEvent event) { .bus() .register(new FMLEventHandler()); - GameRegistry.registerTileEntity(TileEntityRedstoneClock.class, "TileEntityRedstoneClock"); - GameRegistry.registerTileEntity(TileEntityTrashCanItem.class, "TileEntityTrashCanItem"); - GameRegistry.registerTileEntity(TileEntityTrashCanFluid.class, "TileEntityTrashCanFluid"); - GameRegistry.registerTileEntity(TileEntityTrashCanEnergy.class, "TileEntityTrashCanEnergyUIE"); - GameRegistry.registerTileEntity(TileEntityDrum.class, "TileEntityDrum"); - GameRegistry.registerTileEntity(TileEntityPureLove.class, "TileEntityPureLove"); - GameRegistry.registerTileEntity(TileEntityMarginallyMaximisedChest.class, "TileEntityMarginallyMaximisedChest"); - GameRegistry.registerTileEntity(TileEntitySignificantlyShrunkChest.class, "TileEntitySignificantlyShrunkChest"); - GameRegistry.registerTileEntity(TileEntityRadicallyReducedChest.class, "TileEntityRadicallyReducedChest"); - GameRegistry.registerTileEntity(TileEntitySoundMuffler.class, "TileEntitySoundMufflerUIE"); - GameRegistry.registerTileEntity(TileEntityRainMuffler.class, "TileEntityRainMufflerUIE"); - GameRegistry.registerTileEntity(TileEntityBlockUpdateDetector.class, "TileEntityBlockUpdateDetector"); - GameRegistry.registerTileEntity(TileEntityConveyor.class, "TileEntityConveyor"); - GameRegistry.registerTileEntity(TileEntityPortalUnderWorld.class, "TileEntityPortalUnderWorld"); - - GameRegistry.registerTileEntity( - TileEntityLowTemperatureFurnaceGenerator.class, - "TileEntityLowTemperatureFurnaceGeneratorUIE"); - GameRegistry.registerTileEntity(TileEntityFurnaceGenerator.class, "TileEntityFurnaceGeneratorUIE"); - GameRegistry.registerTileEntity( - TileEntityHighTemperatureFurnaceGenerator.class, - "TileEntityHighTemperatureFurnaceGeneratorUIE"); - GameRegistry.registerTileEntity(TileEntityLavaGenerator.class, "TileEntityLavaGeneratorUIE"); - GameRegistry.registerTileEntity(TileEntityEnderGenerator.class, "TileEntityEnderGeneratorUIE"); - GameRegistry.registerTileEntity(TileEntityRedstoneGenerator.class, "TileEntityRedstoneGeneratorUIE"); - GameRegistry.registerTileEntity(TileEntityFoodGenerator.class, "TileEntityFoodGeneratorUIE"); - GameRegistry.registerTileEntity(TileEntityPotionGenerator.class, "TileEntityPotionGeneratorUIE"); - GameRegistry.registerTileEntity(TileEntitySolarGenerator.class, "TileEntitySolarGeneratorUIE"); - GameRegistry.registerTileEntity(TileEntityTNTGenerator.class, "TileEntityTNTGeneratorUIE"); - GameRegistry.registerTileEntity(TileEntityPinkGenerator.class, "TileEntityPinkGeneratorUIE"); - GameRegistry.registerTileEntity(TileEntityNetherStarGenerator.class, "TileEntityNetherStarGeneratorUIE"); - GameRegistry.registerTileEntity(TileEntityEnderQuarry.class, "TileEntityEnderQuarryUIE"); - GameRegistry.registerTileEntity(TileEntityEnderMarker.class, "TileEntityEnderMarkerUIE"); - lapisAetheriusRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new LapisAetheriusRenderer()); blackoutCurtainsRenderID = RenderingRegistry.getNextAvailableRenderId(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderMarker.java index 4a2fec9a..7a2ca845 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderMarker.java @@ -18,12 +18,10 @@ import net.minecraftforge.common.util.ForgeDirection; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker; +import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; public class BlockEnderMarker extends BlockContainer { - public static final ForgeDirection[] HORIZONTAL_DIRECTIONS = new ForgeDirection[] { ForgeDirection.NORTH, - ForgeDirection.SOUTH, ForgeDirection.WEST, ForgeDirection.EAST }; - public BlockEnderMarker() { super(Material.iron); setBlockName("ender_marker"); @@ -74,7 +72,7 @@ public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neig @Override public void randomDisplayTick(World worldIn, int x, int y, int z, Random random) { int meta = worldIn.getBlockMetadata(x, y, z); - for (ForgeDirection dir : HORIZONTAL_DIRECTIONS) { + for (ForgeDirection dir : DirectionUtil.HORIZONTAL_DIRECTIONS) { if ((meta & (1 << (dir.ordinal() - 2))) != 0) { for (int i = 0; i < 7; i++) { worldIn.spawnParticle( diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java index 5127bf12..4aab93ea 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java @@ -14,7 +14,6 @@ import net.minecraftforge.common.util.ForgeDirection; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; -import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; public class BlockEnderQuarry extends BlockContainer { @@ -58,20 +57,10 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer TileEntity te = worldIn.getTileEntity(x, y, z); if (te instanceof TileEntityEnderQuarry quarry) { if (quarry.state == TileEntityEnderQuarry.QuarryWorkState.STOPPED) { - BlockPos inFront = offsetByForward(x, y, z, quarry.facing, 1, 0); - BlockPos farFront = offsetByForward(inFront, quarry.facing, 64, 0); - farFront = offsetByRight(farFront, quarry.facing, 64, 0); - - // for (int i = 1; i < 256; i++) { - // worldIn.setBlock(inFront.x, i, inFront.z, Blocks.diamond_block); - // worldIn.setBlock(farFront.x, i, farFront.z, Blocks.diamond_block); - // } - - player.addChatComponentMessage( - new ChatComponentText(String.format("Set up work area from %s to %s", inFront, farFront))); - - quarry.setWorkArea(new TileEntityEnderQuarry.Area2d(inFront.x, inFront.z, farFront.x, farFront.z)); - quarry.state = TileEntityEnderQuarry.QuarryWorkState.RUNNING; + quarry.scanForWorkAreaFromMarkers(player); + if (quarry.state == TileEntityEnderQuarry.QuarryWorkState.RUNNING) { + return true; + } } player.addChatComponentMessage(new ChatComponentText(quarry.getState())); } @@ -101,246 +90,4 @@ public static ForgeDirection getFacing(int meta) { public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntityEnderQuarry(); } - - // TODO: REMOVE - public static ForgeDirection turnRight90(ForgeDirection dir) { - return switch (dir) { - case EAST -> ForgeDirection.SOUTH; - case NORTH -> ForgeDirection.EAST; - case SOUTH -> ForgeDirection.WEST; - case WEST -> ForgeDirection.NORTH; - default -> dir; - }; - } - - public static ForgeDirection turnLeft90(ForgeDirection dir) { - return switch (dir) { - case EAST -> ForgeDirection.NORTH; - case NORTH -> ForgeDirection.WEST; - case SOUTH -> ForgeDirection.EAST; - case WEST -> ForgeDirection.SOUTH; - default -> dir; - }; - } - - public static ForgeDirection turn180(ForgeDirection dir) { - return switch (dir) { - case EAST -> ForgeDirection.WEST; - case NORTH -> ForgeDirection.SOUTH; - case SOUTH -> ForgeDirection.NORTH; - case WEST -> ForgeDirection.EAST; - default -> dir; - }; - } - - public static ForgeDirection turnRight270(ForgeDirection dir) { - return turnLeft90(dir); - } - - public static ForgeDirection turnLeft270(ForgeDirection dir) { - return turnRight90(dir); - } - - /** - * Offsets coordinates to the right based on the facing direction - * - * @param pos Current position - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset to the right - */ - public static BlockPos offsetByRight(BlockPos pos, ForgeDirection facing, int amount, int vertical) { - ForgeDirection rightDir = turnRight90(facing); - return new BlockPos(pos.x + rightDir.offsetX * amount, pos.y + vertical, pos.z + rightDir.offsetZ * amount); - } - - /** - * Offsets coordinates to the right based on the facing direction - * - * @param x Current X coordinate - * @param y Current Y coordinate - * @param z Current Z coordinate - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset to the right - */ - public static BlockPos offsetByRight(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { - return offsetByRight(new BlockPos(x, y, z), facing, amount, vertical); - } - - /** - * Offsets coordinates to the right based on the facing direction - * - * @param x Current X coordinate - * @param y Current Y coordinate - * @param z Current Z coordinate - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset to the right - */ - public static BlockPos offsetByRight(int x, int y, int z, ForgeDirection facing, int amount, int vertical, - boolean relative) { - BlockPos pos = offsetByRight(new BlockPos(x, y, z), facing, amount, vertical); - if (relative) { - pos.x = x - pos.x; - pos.y = y - pos.y; - pos.z = z - pos.z; - } - return pos; - } - - /** - * Offsets coordinates to the left based on the facing direction - * - * @param pos Current position - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset to the left - */ - public static BlockPos offsetByLeft(BlockPos pos, ForgeDirection facing, int amount, int vertical) { - ForgeDirection leftDir = turnLeft90(facing); - return new BlockPos(pos.x + leftDir.offsetX * amount, pos.y + vertical, pos.z + leftDir.offsetZ * amount); - } - - /** - * Offsets coordinates to the left based on the facing direction - * - * @param x Current X coordinate - * @param y Current Y coordinate - * @param z Current Z coordinate - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset to the left - */ - public static BlockPos offsetByLeft(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { - return offsetByLeft(new BlockPos(x, y, z), facing, amount, vertical); - } - - /** - * Offsets coordinates to the left based on the facing direction - * - * @param x Current X coordinate - * @param y Current Y coordinate - * @param z Current Z coordinate - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset to the left - */ - public static BlockPos offsetByLeft(int x, int y, int z, ForgeDirection facing, int amount, int vertical, - boolean relative) { - BlockPos pos = offsetByLeft(new BlockPos(x, y, z), facing, amount, vertical); - if (relative) { - pos.x = x - pos.x; - pos.y = y - pos.y; - pos.z = z - pos.z; - } - return pos; - } - - /** - * Offsets coordinates backwards based on the facing direction - * - * @param pos Current position - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset backwards - */ - public static BlockPos offsetByBack(BlockPos pos, ForgeDirection facing, int amount, int vertical) { - ForgeDirection backDir = facing.getOpposite(); - return new BlockPos(pos.x + backDir.offsetX * amount, pos.y + vertical, pos.z + backDir.offsetZ * amount); - } - - /** - * Offsets coordinates backwards based on the facing direction - * - * @param x Current X coordinate - * @param y Current Y coordinate - * @param z Current Z coordinate - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset backwards - */ - public static BlockPos offsetByBack(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { - return offsetByBack(new BlockPos(x, y, z), facing, amount, vertical); - } - - /** - * Offsets coordinates backwards based on the facing direction - * - * @param x Current X coordinate - * @param y Current Y coordinate - * @param z Current Z coordinate - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset backwards - */ - public static BlockPos offsetByBack(int x, int y, int z, ForgeDirection facing, int amount, int vertical, - boolean relative) { - BlockPos pos = offsetByBack(new BlockPos(x, y, z), facing, amount, vertical); - if (relative) { - pos.x = x - pos.x; - pos.y = y - pos.y; - pos.z = z - pos.z; - } - return pos; - } - - /** - * Offsets coordinates forward based on the facing direction - * - * @param pos Current position - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset forward - */ - public static BlockPos offsetByForward(BlockPos pos, ForgeDirection facing, int amount, int vertical) { - return new BlockPos(pos.x + facing.offsetX * amount, pos.y + vertical, pos.z + facing.offsetZ * amount); - } - - /** - * Offsets coordinates forward based on the facing direction - * - * @param x Current X coordinate - * @param y Current Y coordinate - * @param z Current Z coordinate - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset forward - */ - public static BlockPos offsetByForward(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { - return offsetByForward(x, y, z, facing, amount, vertical, false); - } - - /** - * Offsets coordinates forward based on the facing direction - * - * @param x Current X coordinate - * @param y Current Y coordinate - * @param z Current Z coordinate - * @param facing The direction being faced - * @param amount Number of blocks to offset - * @param vertical Number of blocks to offset vertically (positive = up, negative = down) - * @return New BlockPos offset forward - */ - public static BlockPos offsetByForward(int x, int y, int z, ForgeDirection facing, int amount, int vertical, - boolean relative) { - BlockPos pos = offsetByForward(new BlockPos(x, y, z), facing, amount, vertical); - if (relative) { - pos.x = x - pos.x; - pos.y = y - pos.y; - pos.z = z - pos.z; - } - return pos; - } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java index 61154c69..25e7d5da 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -1,6 +1,8 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; @@ -9,10 +11,12 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Vector4i; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.IFacingTE; +import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; import com.fouristhenumber.utilitiesinexcess.utils.Tuple; import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; @@ -20,8 +24,7 @@ public class TileEntityEnderMarker extends TileEntity implements IFacingTE { public static final ForgeDirection[] HORIZONTAL_DIRECTIONS = new ForgeDirection[] { ForgeDirection.NORTH, ForgeDirection.SOUTH, ForgeDirection.WEST, ForgeDirection.EAST }; - public static final ConcurrentHashMap> registeredMarkers = - new ConcurrentHashMap<>(); + public static final ConcurrentHashMap> registeredMarkers = new ConcurrentHashMap<>(); public final HashMap> alignedMarkers = new HashMap<>(); private ForgeDirection facing = ForgeDirection.UNKNOWN; @@ -41,32 +44,14 @@ private ConcurrentHashMap getRegistryForDimensi return registeredMarkers.computeIfAbsent(dim, k -> new ConcurrentHashMap<>()); } - public static ForgeDirection turnRight90(ForgeDirection dir) { - return switch (dir) { - case EAST -> ForgeDirection.SOUTH; - case NORTH -> ForgeDirection.EAST; - case SOUTH -> ForgeDirection.WEST; - case WEST -> ForgeDirection.NORTH; - default -> dir; - }; - } - - public static ForgeDirection turnLeft90(ForgeDirection dir) { - return switch (dir) { - case EAST -> ForgeDirection.NORTH; - case NORTH -> ForgeDirection.WEST; - case SOUTH -> ForgeDirection.EAST; - case WEST -> ForgeDirection.SOUTH; - default -> dir; - }; - } - public @Nullable Vector4i checkForBoundary(ForgeDirection starterFacing) { Tuple secondCorner = alignedMarkers.getOrDefault(starterFacing, null); if (secondCorner != null && secondCorner.getKey() != null) { Tuple thirdCorner = Optional - .ofNullable(secondCorner.getKey().alignedMarkers.getOrDefault(turnRight90(starterFacing), null)) - .orElse(secondCorner.getKey().alignedMarkers.getOrDefault(turnLeft90(starterFacing), null)); + .ofNullable( + secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnRight90(starterFacing), null)) + .orElse( + secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnLeft90(starterFacing), null)); if (thirdCorner != null) { return new Vector4i(this.xCoord, this.zCoord, thirdCorner.getValue().x, thirdCorner.getValue().z); } @@ -75,32 +60,36 @@ public static ForgeDirection turnLeft90(ForgeDirection dir) { } public void checkForAlignedMarkers() { + this.checkForAlignedMarkers(HORIZONTAL_DIRECTIONS, false); + } + + public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyValidate) { ConcurrentHashMap dimRegistry = getRegistryForDimension(); // ArrayList staleMarkers = new ArrayList<>(); -// for (Map.Entry> entry : alignedMarkers -// .entrySet()) { -// if (entry.getValue() -// .getKey() == null) { -// BlockPos alignedMarkerPos = entry.getValue() -// .getValue(); -// worldObj.getChunkProvider() -// .loadChunk(alignedMarkerPos.x >> 4, alignedMarkerPos.z >> 4); -// TileEntity te = worldObj.getTileEntity(alignedMarkerPos.x, alignedMarkerPos.y, alignedMarkerPos.z); -// if (te instanceof TileEntityEnderMarker marker) { -// setAlignedMarker(entry.getKey(), marker); -// marker.setAlignedMarker( -// entry.getKey() -// .getOpposite(), -// this); -// } else { -// removeAlignedMarker(entry.getKey()); -// } -// // staleMarkers.add(entry.getKey()); -// } -// } + for (Map.Entry> entry : alignedMarkers + .entrySet()) { + if (entry.getValue() + .getKey() == null) { + BlockPos alignedMarkerPos = entry.getValue() + .getValue(); + worldObj.getChunkProvider() + .loadChunk(alignedMarkerPos.x >> 4, alignedMarkerPos.z >> 4); + TileEntity te = worldObj.getTileEntity(alignedMarkerPos.x, alignedMarkerPos.y, alignedMarkerPos.z); + if (te instanceof TileEntityEnderMarker marker) { + setAlignedMarker(entry.getKey(), marker); + marker.setAlignedMarker( + entry.getKey() + .getOpposite(), + this); + } else { + removeAlignedMarker(entry.getKey()); + } + // staleMarkers.add(entry.getKey()); + } + } // staleMarkers.forEach(alignedMarkers::remove); - //alignedMarkers.clear(); - for (ForgeDirection dir : HORIZONTAL_DIRECTIONS) { + // alignedMarkers.clear(); + for (ForgeDirection dir : dirs) { if (!alignedMarkers.containsKey(dir)) { for (Map.Entry entry : dimRegistry.entrySet()) { if (entry.getValue() != null && entry.getValue() != this @@ -120,9 +109,24 @@ public void checkForAlignedMarkers() { markerDirection = dx > 0 ? ForgeDirection.EAST : ForgeDirection.WEST; } if (markerDirection == dir) { - setAlignedMarker(dir, entry.getValue()); - entry.getValue() - .setAlignedMarker(dir.getOpposite(), this); + if (!onlyValidate) { + setAlignedMarker(dir, entry.getValue()); + entry.getValue() + .setAlignedMarker(dir.getOpposite(), this); + } else if (!entry.getValue().alignedMarkers.containsKey(dir.getOpposite()) + && (worldObj.getBlockMetadata(entry.getKey().x, entry.getKey().y, entry.getKey().z) + & (1 << (dir.getOpposite() + .ordinal() - 2))) + != 0) { + // Does the active store for this marker not contain us & but the metadata does? + // Suggests we reloaded with previous connections, + // and since we would usually link from "this" to "entry" unlink (just from the + // meta) instead + entry.getValue() + .removeAlignedMarker(dir.getOpposite()); + entry.getValue() + .checkForAlignedMarkers(); + } } } } @@ -148,19 +152,37 @@ public void removeAlignedMarker(ForgeDirection dir) { } } + public ForgeDirection[] getActiveDirs() { + List activeDirList = new ArrayList<>(); + for (ForgeDirection dir : HORIZONTAL_DIRECTIONS) { + // Is the bit for this direction set? + if ((activeDirections & (1 << (dir.ordinal() - 2))) != 0) { + activeDirList.add(dir); + } + } + return activeDirList.toArray(new ForgeDirection[0]); + } + public void teardownConnections() { + checkForAlignedMarkers(getActiveDirs(), true); getRegistryForDimension().remove(new BlockPos(this.xCoord, this.yCoord, this.zCoord)); for (Map.Entry> alignedMarker : alignedMarkers .entrySet()) { - TileEntityEnderMarker markerTE = alignedMarker.getValue().getKey(); + TileEntityEnderMarker markerTE = alignedMarker.getValue() + .getKey(); if (markerTE != null) { - markerTE.removeAlignedMarker(alignedMarker.getKey().getOpposite()); - markerTE.checkForAlignedMarkers(); + markerTE.removeAlignedMarker( + alignedMarker.getKey() + .getOpposite()); + markerTE.checkForAlignedMarkers(); } else { - BlockPos alignedMarkerPos = alignedMarker.getValue().getValue(); + BlockPos alignedMarkerPos = alignedMarker.getValue() + .getValue(); TileEntity te = worldObj.getTileEntity(alignedMarkerPos.x, alignedMarkerPos.y, alignedMarkerPos.z); if (te instanceof TileEntityEnderMarker marker) { - marker.removeAlignedMarker(alignedMarker.getKey().getOpposite()); + marker.removeAlignedMarker( + alignedMarker.getKey() + .getOpposite()); marker.checkForAlignedMarkers(); } } @@ -198,11 +220,17 @@ public void setFacing(ForgeDirection newFacing) { public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); readFacingFromNBT(compound); + this.activeDirections = compound.getInteger("meta"); + int dim = compound.getInteger("dim"); + registeredMarkers.computeIfAbsent(dim, k -> new ConcurrentHashMap<>()) + .put(new BlockPos(xCoord, yCoord, zCoord), this); } @Override public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); writeFacingToNBT(compound); + compound.setInteger("meta", this.activeDirections); + compound.setInteger("dim", this.worldObj.provider.dimensionId); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index e28fa602..3c179eb3 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -10,12 +10,14 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; import net.minecraft.world.ChunkCoordIntPair; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; @@ -30,10 +32,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Vector2i; +import org.joml.Vector4i; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; +import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; @@ -107,11 +111,56 @@ public void setWorkArea(Area2d area) { chunkZ = dz >> 4; } + public void scanForWorkAreaFromMarkers(EntityPlayer player) { + boolean foundMarkers = false; + for (ForgeDirection dir : DirectionUtil.HORIZONTAL_DIRECTIONS) { + TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + if (te instanceof TileEntityEnderMarker marker) { + @Nullable + Vector4i scanReturn = marker.checkForBoundary(dir); + if (scanReturn != null) { + // Pad work area by one (inwards), so that we don't mine the markers + Vector2i low = new Vector2i( + Math.min(scanReturn.x, scanReturn.z) + 1, + Math.min(scanReturn.y, scanReturn.w) + 1); + Vector2i high = new Vector2i( + Math.max(scanReturn.x, scanReturn.z) - 1, + Math.max(scanReturn.y, scanReturn.w) - 1); + setWorkArea(new Area2d(low, high)); + state = QuarryWorkState.RUNNING; + + int estBlocks = (worldObj.getHeightValue(dx, dy) + 5) * workArea.height * workArea.width; + player.addChatComponentMessage( + new ChatComponentText( + String.format( + "Found ender marker fence boundary, setting up work area from (%d %d) to (%d %d). Should roughly contain %d blocks.", + workArea.low.x, + workArea.low.y, + workArea.high.x, + workArea.high.y, + estBlocks))); + return; + } else { + player.addChatComponentMessage( + new ChatComponentText( + String.format( + "Ender marker at (%d %d %d) failed to set up a fence boundary.", + marker.xCoord, + marker.yCoord, + marker.zCoord))); + foundMarkers = true; + } + } + } + if (!foundMarkers) + player.addChatComponentMessage(new ChatComponentText("Found no ender markers around quarry.")); + } + /** * Are the current dx & dy & dz in work area bounds */ private boolean isInBounds() { - return dy > 1 && this.workArea.isInBounds(dx, dz); + return dy > 0 && this.workArea.isInBounds(dx, dz); } /** @@ -121,7 +170,7 @@ private boolean isInBounds() { */ private boolean stepPos() { dy--; - if (dy <= 1) { + if (dy <= 0) { // stack is done, move back up dy = this.yCoord + 5; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/DirectionUtil.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/DirectionUtil.java new file mode 100644 index 00000000..41ebce93 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/DirectionUtil.java @@ -0,0 +1,253 @@ +// Copied from U25Core +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraftforge.common.util.ForgeDirection; + +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +public class DirectionUtil { + + public static final ForgeDirection[] HORIZONTAL_DIRECTIONS = new ForgeDirection[] { ForgeDirection.NORTH, + ForgeDirection.SOUTH, ForgeDirection.WEST, ForgeDirection.EAST }; + + public static ForgeDirection turnRight90(ForgeDirection dir) { + return switch (dir) { + case EAST -> ForgeDirection.SOUTH; + case NORTH -> ForgeDirection.EAST; + case SOUTH -> ForgeDirection.WEST; + case WEST -> ForgeDirection.NORTH; + default -> dir; + }; + } + + public static ForgeDirection turnLeft90(ForgeDirection dir) { + return switch (dir) { + case EAST -> ForgeDirection.NORTH; + case NORTH -> ForgeDirection.WEST; + case SOUTH -> ForgeDirection.EAST; + case WEST -> ForgeDirection.SOUTH; + default -> dir; + }; + } + + public static ForgeDirection turn180(ForgeDirection dir) { + return switch (dir) { + case EAST -> ForgeDirection.WEST; + case NORTH -> ForgeDirection.SOUTH; + case SOUTH -> ForgeDirection.NORTH; + case WEST -> ForgeDirection.EAST; + default -> dir; + }; + } + + public static ForgeDirection turnRight270(ForgeDirection dir) { + return turnLeft90(dir); + } + + public static ForgeDirection turnLeft270(ForgeDirection dir) { + return turnRight90(dir); + } + + /** + * Offsets coordinates to the right based on the facing direction + * + * @param pos Current position + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the right + */ + public static BlockPos offsetByRight(BlockPos pos, ForgeDirection facing, int amount, int vertical) { + ForgeDirection rightDir = turnRight90(facing); + return new BlockPos(pos.x + rightDir.offsetX * amount, pos.y + vertical, pos.z + rightDir.offsetZ * amount); + } + + /** + * Offsets coordinates to the right based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the right + */ + public static BlockPos offsetByRight(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { + return offsetByRight(new BlockPos(x, y, z), facing, amount, vertical); + } + + /** + * Offsets coordinates to the right based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the right + */ + public static BlockPos offsetByRight(int x, int y, int z, ForgeDirection facing, int amount, int vertical, + boolean relative) { + BlockPos pos = offsetByRight(new BlockPos(x, y, z), facing, amount, vertical); + if (relative) { + pos.x = x - pos.x; + pos.y = y - pos.y; + pos.z = z - pos.z; + } + return pos; + } + + /** + * Offsets coordinates to the left based on the facing direction + * + * @param pos Current position + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the left + */ + public static BlockPos offsetByLeft(BlockPos pos, ForgeDirection facing, int amount, int vertical) { + ForgeDirection leftDir = turnLeft90(facing); + return new BlockPos(pos.x + leftDir.offsetX * amount, pos.y + vertical, pos.z + leftDir.offsetZ * amount); + } + + /** + * Offsets coordinates to the left based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the left + */ + public static BlockPos offsetByLeft(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { + return offsetByLeft(new BlockPos(x, y, z), facing, amount, vertical); + } + + /** + * Offsets coordinates to the left based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset to the left + */ + public static BlockPos offsetByLeft(int x, int y, int z, ForgeDirection facing, int amount, int vertical, + boolean relative) { + BlockPos pos = offsetByLeft(new BlockPos(x, y, z), facing, amount, vertical); + if (relative) { + pos.x = x - pos.x; + pos.y = y - pos.y; + pos.z = z - pos.z; + } + return pos; + } + + /** + * Offsets coordinates backwards based on the facing direction + * + * @param pos Current position + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset backwards + */ + public static BlockPos offsetByBack(BlockPos pos, ForgeDirection facing, int amount, int vertical) { + ForgeDirection backDir = facing.getOpposite(); + return new BlockPos(pos.x + backDir.offsetX * amount, pos.y + vertical, pos.z + backDir.offsetZ * amount); + } + + /** + * Offsets coordinates backwards based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset backwards + */ + public static BlockPos offsetByBack(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { + return offsetByBack(new BlockPos(x, y, z), facing, amount, vertical); + } + + /** + * Offsets coordinates backwards based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset backwards + */ + public static BlockPos offsetByBack(int x, int y, int z, ForgeDirection facing, int amount, int vertical, + boolean relative) { + BlockPos pos = offsetByBack(new BlockPos(x, y, z), facing, amount, vertical); + if (relative) { + pos.x = x - pos.x; + pos.y = y - pos.y; + pos.z = z - pos.z; + } + return pos; + } + + /** + * Offsets coordinates forward based on the facing direction + * + * @param pos Current position + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset forward + */ + public static BlockPos offsetByForward(BlockPos pos, ForgeDirection facing, int amount, int vertical) { + return new BlockPos(pos.x + facing.offsetX * amount, pos.y + vertical, pos.z + facing.offsetZ * amount); + } + + /** + * Offsets coordinates forward based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset forward + */ + public static BlockPos offsetByForward(int x, int y, int z, ForgeDirection facing, int amount, int vertical) { + return offsetByForward(x, y, z, facing, amount, vertical, false); + } + + /** + * Offsets coordinates forward based on the facing direction + * + * @param x Current X coordinate + * @param y Current Y coordinate + * @param z Current Z coordinate + * @param facing The direction being faced + * @param amount Number of blocks to offset + * @param vertical Number of blocks to offset vertically (positive = up, negative = down) + * @return New BlockPos offset forward + */ + public static BlockPos offsetByForward(int x, int y, int z, ForgeDirection facing, int amount, int vertical, + boolean relative) { + BlockPos pos = offsetByForward(new BlockPos(x, y, z), facing, amount, vertical); + if (relative) { + pos.x = x - pos.x; + pos.y = y - pos.y; + pos.z = z - pos.z; + } + return pos; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java index 3b585c70..e82b2ba5 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java @@ -9,8 +9,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker; -import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; @@ -25,6 +23,7 @@ import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.event.world.WorldEvent; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSpike; import com.fouristhenumber.utilitiesinexcess.common.items.ItemInvertedIngot; @@ -34,14 +33,15 @@ import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGluttonsAxe; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemPrecisionShears; import com.fouristhenumber.utilitiesinexcess.common.renderers.XRayRenderer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.AntiParticulateShovelConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GluttonsAxeConfig; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorEntityLivingBase; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; import com.gtnewhorizon.gtnhlib.client.event.LivingEquipmentChangeEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.event.world.WorldEvent; public class ForgeEventHandler { @@ -160,8 +160,8 @@ public void onWorldUnload(WorldEvent.Unload event) { if (event.world.isRemote) return; // Clear the entire dimension registry - ConcurrentHashMap dimRegistry = - TileEntityEnderMarker.registeredMarkers.get(event.world.provider.dimensionId); + ConcurrentHashMap dimRegistry = TileEntityEnderMarker.registeredMarkers + .get(event.world.provider.dimensionId); if (dimRegistry != null) { dimRegistry.clear(); From 044d53b441c9fc11adf214adc3f72564959d5c4e Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Sat, 6 Dec 2025 22:18:55 +0100 Subject: [PATCH 08/28] Add initial version of upgrade models, Add marker modes and start on complex version --- dependencies.gradle | 31 +- .../utilitiesinexcess/ModBlocks.java | 6 +- .../utilitiesinexcess/ModTileEntities.java | 36 +- .../{ => ender_quarry}/BlockEnderMarker.java | 24 +- .../{ => ender_quarry}/BlockEnderQuarry.java | 11 +- .../ender_quarry/BlockEnderQuarryUpgrade.java | 42 + .../ender_quarry/IEnderQuarryUpgrade.java | 6 + .../tileentities/TileEntityEnderMarker.java | 166 ++- .../tileentities/TileEntityEnderQuarry.java | 20 +- .../blockstates/ender_quarry_upgrade.json | 7 + .../models/blocks/upgrade_speed_1.json | 701 +++++++++++++ .../models/blocks/upgrade_speed_2.json | 831 +++++++++++++++ .../models/blocks/upgrade_speed_3.json | 961 ++++++++++++++++++ .../textures/blocks/upgrade_speed_1.png | Bin 0 -> 1376 bytes .../textures/blocks/upgrade_speed_2.png | Bin 0 -> 1553 bytes .../textures/blocks/upgrade_speed_3.png | Bin 0 -> 1604 bytes 16 files changed, 2776 insertions(+), 66 deletions(-) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/{ => ender_quarry}/BlockEnderMarker.java (77%) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/{ => ender_quarry}/BlockEnderQuarry.java (87%) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry_upgrade.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_1.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_2.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_3.json create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_speed_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_speed_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_speed_3.png diff --git a/dependencies.gradle b/dependencies.gradle index 4d95a685..71cad413 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,25 +34,30 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { + compileOnly('org.jetbrains:annotations:26.0.1') + implementation("com.github.GTNewHorizons:GTNHLib:0.8.15:dev") // TODO: remove MUI1 dep when the implicit dependency // TODO: in IItemHandlerModifiable is removed - api("com.github.GTNewHorizons:ModularUI:1.2.20:dev") - api("com.github.GTNewHorizons:ModularUI2:2.2.16-1.7.10:dev") - api("com.github.GTNewHorizons:CraftTweaker:3.4.2:dev") - api('curse.maven:cofh-lib-220333:2388748') - compileOnly("com.github.GTNewHorizons:Baubles-Expanded:2.1.9-GTNH:dev") - compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev') - compileOnly('com.github.GTNewHorizons:Angelica:1.0.0-beta62:dev') + api("com.github.GTNewHorizons:ModularUI:1.2.20:dev") { transitive = false } + api("com.github.GTNewHorizons:ModularUI2:2.2.16-1.7.10:dev") { transitive = false } + api("com.github.GTNewHorizons:CraftTweaker:3.4.2:dev") { transitive = false } + api('curse.maven:cofh-lib-220333:2388748') { transitive = false } + + compileOnly("com.github.GTNewHorizons:Baubles-Expanded:2.1.9-GTNH:dev") { transitive = false } + runtimeOnlyNonPublishable("com.github.GTNewHorizons:EnderCore:0.5.0:dev") { transitive = false } + runtimeOnlyNonPublishable("com.github.GTNewHorizons:Baubles-Expanded:2.2.2-GTNH:dev") { transitive = false } + compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev') { transitive = false } + compileOnly('com.github.GTNewHorizons:Angelica:1.0.0-beta62:dev') { transitive = false } - runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.31-GTNH:dev" ) - runtimeOnlyNonPublishable("com.github.GTNewHorizons:Angelica:1.0.0-beta71-pre:dev" ) - runtimeOnlyNonPublishable("com.github.GTNewHorizons:Hodgepodge:2.7.17:dev" ) + api("com.github.GTNewHorizons:NotEnoughItems:2.8.31-GTNH:dev" ) { transitive = true } + runtimeOnlyNonPublishable("com.github.GTNewHorizons:Angelica:1.0.0-beta71-pre:dev" ) { transitive = false } + runtimeOnlyNonPublishable("com.github.GTNewHorizons:Hodgepodge:2.7.17:dev" ) { transitive = false } // For debugging chunkloading runtimeOnlyNonPublishable('curse.maven:chicken-chunks-229316:2233250') - runtimeOnlyNonPublishable("com.github.GTNewHorizons:WAILAPlugins:0.7.2:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:waila:1.9.15:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:ServerUtilities:2.2.5:dev") + runtimeOnlyNonPublishable("com.github.GTNewHorizons:WAILAPlugins:0.7.2:dev") { transitive = false } + runtimeOnlyNonPublishable("com.github.GTNewHorizons:waila:1.9.15:dev") { transitive = false } + runtimeOnlyNonPublishable("com.github.GTNewHorizons:ServerUtilities:2.2.5:dev") { transitive = false } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 2223f1d8..0a6677b0 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -1,5 +1,6 @@ package com.fouristhenumber.utilitiesinexcess; +import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderQuarryUpgrade; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -13,8 +14,8 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCursedEarth; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockDrum; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderLotus; -import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderMarker; -import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderQuarry; +import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderMarker; +import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderQuarry; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEtherealGlass; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockFloating; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockInverted; @@ -109,6 +110,7 @@ public enum ModBlocks { END_OF_TIME_PORTAL(BlockConfig.enableEndOfTimePortal && EndOfTimeConfig.enableEndOfTime, new BlockPortalEndOfTime(), BlockPortalEndOfTime.ItemBlockPortalEndOfTime.class, "temporal_gate"), ENDER_QUARRY(EnderQuarryConfig.enableEnderQuarry, new BlockEnderQuarry(), "ender_quarry"), ENDER_MARKER(EnderQuarryConfig.enableEnderQuarry, new BlockEnderMarker(), "ender_marker"), + ENDER_QUARRY_UPGRADE(EnderQuarryConfig.enableEnderQuarry, new BlockEnderQuarryUpgrade(), "ender_quarry_upgrade"), ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java index 26e7b2ed..5bfc28b1 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java @@ -40,31 +40,31 @@ public enum ModTileEntities { REDSTONE_CLOCK(TileEntityRedstoneClock .class , "RedstoneClock"), TRASH_CAN_ITEM(TileEntityTrashCanItem.class , "TrashCanItem"), TRASH_CAN_FLUID(TileEntityTrashCanFluid.class , "TrashCanFluid"), - TRASH_CAN_ENERGY(TileEntityTrashCanEnergy.class , "TrashCanEnergyUIE"), + TRASH_CAN_ENERGY(TileEntityTrashCanEnergy.class , "TrashCanEnergy"), DRUM(TileEntityDrum.class , "Drum"), PURE_LOVE(TileEntityPureLove.class , "PureLove"), CHEST_MAX(TileEntityMarginallyMaximisedChest.class , "MarginallyMaximisedChest"), CHEST_SHRUNK(TileEntitySignificantlyShrunkChest.class , "SignificantlyShrunkChest"), CHEST_SMALL(TileEntityRadicallyReducedChest.class , "RadicallyReducedChest"), - MUFFLER_SOUND(TileEntitySoundMuffler.class , "SoundMufflerUIE"), - MUFFLER_RAIN(TileEntityRainMuffler.class , "RainMufflerUIE"), + MUFFLER_SOUND(TileEntitySoundMuffler.class , "SoundMuffler"), + MUFFLER_RAIN(TileEntityRainMuffler.class , "RainMuffler"), BLOCK_UPDATE_DETECTOR(TileEntityBlockUpdateDetector.class , "BlockUpdateDetector"), CONVEYOR(TileEntityConveyor.class , "Conveyor"), PORTAL_UNDERWORLD(TileEntityPortalUnderWorld.class , "PortalUnderWorld"), - GENERATOR_LOW_TEMP_FURNACE(TileEntityLowTemperatureFurnaceGenerator.class , "LowTemperatureFurnaceGeneratorUIE"), - GENERATOR_FURNACE(TileEntityFurnaceGenerator.class , "FurnaceGeneratorUIE"), - GENERATOR_HIGH_TEMP_FURNACE(TileEntityHighTemperatureFurnaceGenerator.class, "HighTemperatureFurnaceGeneratorUIE"), - GENERATOR_LAVA(TileEntityLavaGenerator.class , "LavaGeneratorUIE"), - GENERATOR_ENDER(TileEntityEnderGenerator.class , "EnderGeneratorUIE"), - GENERATOR_REDSTONE(TileEntityRedstoneGenerator.class , "RedstoneGeneratorUIE"), - GENERATOR_FOOD(TileEntityFoodGenerator.class , "FoodGeneratorUIE"), - GENERATOR_POTION(TileEntityPotionGenerator.class , "PotionGeneratorUIE"), - GENERATOR_SOLAR(TileEntitySolarGenerator.class , "SolarGeneratorUIE"), - GENERATOR_TNT(TileEntityTNTGenerator.class , "TNTGeneratorUIE"), - GENERATOR_PINK(TileEntityPinkGenerator.class , "PinkGeneratorUIE"), - GENERATOR_NETHER_STAR(TileEntityNetherStarGenerator.class , "NetherStarGeneratorUIE"), - ENDER_QUARRY(TileEntityEnderQuarry.class , "EnderQuarryUIE"), - ENDER_MARKER(TileEntityEnderMarker.class , "EnderMarkerUIE"), + GENERATOR_LOW_TEMP_FURNACE(TileEntityLowTemperatureFurnaceGenerator.class , "LowTemperatureFurnaceGenerator"), + GENERATOR_FURNACE(TileEntityFurnaceGenerator.class , "FurnaceGenerator"), + GENERATOR_HIGH_TEMP_FURNACE(TileEntityHighTemperatureFurnaceGenerator.class, "HighTemperatureFurnaceGenerator"), + GENERATOR_LAVA(TileEntityLavaGenerator.class , "LavaGenerator"), + GENERATOR_ENDER(TileEntityEnderGenerator.class , "EnderGenerator"), + GENERATOR_REDSTONE(TileEntityRedstoneGenerator.class , "RedstoneGenerator"), + GENERATOR_FOOD(TileEntityFoodGenerator.class , "FoodGenerator"), + GENERATOR_POTION(TileEntityPotionGenerator.class , "PotionGenerator"), + GENERATOR_SOLAR(TileEntitySolarGenerator.class , "SolarGenerator"), + GENERATOR_TNT(TileEntityTNTGenerator.class , "TNTGenerator"), + GENERATOR_PINK(TileEntityPinkGenerator.class , "PinkGenerator"), + GENERATOR_NETHER_STAR(TileEntityNetherStarGenerator.class , "NetherStarGenerator"), + ENDER_QUARRY(TileEntityEnderQuarry.class , "EnderQuarry"), + ENDER_MARKER(TileEntityEnderMarker.class , "EnderMarker"), ; // spotless:on @@ -89,7 +89,7 @@ public static void init() { ModTileEntities(Boolean enabled, Class clazz, String name) { this.isEnabled = enabled; this.clazz = clazz; - this.name = "TileEntity" + name; + this.name = "TileEntity" + name + "UIE"; } public boolean isEnabled() { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java similarity index 77% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderMarker.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java index 7a2ca845..c6c69dae 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java @@ -1,4 +1,4 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks; +package com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry; import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; @@ -10,9 +10,11 @@ import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -69,6 +71,26 @@ public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neig } } + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { + if (worldIn.isRemote) return true; + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof TileEntityEnderMarker marker) { + if (player.isSneaking()) { + if (marker.operationMode == TileEntityEnderMarker.MarkerOperationMode.ARBITRARY_LOOP) { + marker.boundaryForArbitraryLoop(); + } + int newCuboidSize = marker.increaseCuboidSize(); + player.addChatComponentMessage(new ChatComponentText("Increased cuboid size to " + newCuboidSize + ".")); + } else { + marker.rotateMode(); + player.addChatComponentMessage(new ChatComponentText(marker.getMode())); + } + return true; + } + return false; + } + @Override public void randomDisplayTick(World worldIn, int x, int y, int z, Random random) { int meta = worldIn.getBlockMetadata(x, y, z); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java similarity index 87% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java index 4aab93ea..970beed1 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java @@ -1,4 +1,4 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks; +package com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry; import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; @@ -51,11 +51,14 @@ public void onBlockPlacedBy(World worldIn, int x, int y, int z, EntityLivingBase @Override public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { - if (worldIn.isRemote) { - return true; - } + if (worldIn.isRemote) return true; TileEntity te = worldIn.getTileEntity(x, y, z); if (te instanceof TileEntityEnderQuarry quarry) { + if (player.isSneaking() && player.capabilities.isCreativeMode) { + quarry.isCreativeBoosted = !quarry.isCreativeBoosted; + player.addChatComponentMessage(new ChatComponentText((quarry.isCreativeBoosted ? "" : "Un-") + "Creative-Boosted Quarry.")); + return true; + } if (quarry.state == TileEntityEnderQuarry.QuarryWorkState.STOPPED) { quarry.scanForWorkAreaFromMarkers(player); if (quarry.state == TileEntityEnderQuarry.QuarryWorkState.RUNNING) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java new file mode 100644 index 00000000..3f5acdf3 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java @@ -0,0 +1,42 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry; + +import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class BlockEnderQuarryUpgrade extends Block implements IEnderQuarryUpgrade { + private IIcon[] icons; + + public BlockEnderQuarryUpgrade() { + super(Material.iron); + setHardness(1f); + setLightOpacity(0); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public int getRenderType() { + return JSON_ISBRH_ID; + } + + @Override + public int onBlockPlaced(World worldIn, int x, int y, int z, int side, float subX, float subY, float subZ, int meta) { + return 0; + } + + @Override + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[3]; + icons[0] = reg.registerIcon("utilitiesinexcess:upgrade_speed_1"); + icons[1] = reg.registerIcon("utilitiesinexcess:upgrade_speed_2"); + icons[2] = reg.registerIcon("utilitiesinexcess:upgrade_speed_3"); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java new file mode 100644 index 00000000..423e57d4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java @@ -0,0 +1,6 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry; + +public interface IEnderQuarryUpgrade { + + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java index 25e7d5da..f42cbdc9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -2,19 +2,24 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.joml.Vector4i; - +import org.joml.Vector2i; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.IFacingTE; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; import com.fouristhenumber.utilitiesinexcess.utils.Tuple; @@ -29,6 +34,9 @@ public class TileEntityEnderMarker extends TileEntity implements IFacingTE { public final HashMap> alignedMarkers = new HashMap<>(); private ForgeDirection facing = ForgeDirection.UNKNOWN; private int activeDirections = 0; + public MarkerOperationMode operationMode = MarkerOperationMode.DEFAULT; + private boolean hasChangedMode = false; + private int cuboidSize = 16; @Override public void validate() { @@ -44,7 +52,15 @@ private ConcurrentHashMap getRegistryForDimensi return registeredMarkers.computeIfAbsent(dim, k -> new ConcurrentHashMap<>()); } - public @Nullable Vector4i checkForBoundary(ForgeDirection starterFacing) { + public @Nullable List checkForBoundary(ForgeDirection starterFacing) { + return switch (operationMode) { + case DEFAULT -> boundaryFromThree(starterFacing); + case SINGLE -> boundaryForSizedCuboid(starterFacing); + case ARBITRARY_LOOP -> boundaryForArbitraryLoop(); + }; + } + + private @Nullable List boundaryFromThree(ForgeDirection starterFacing) { Tuple secondCorner = alignedMarkers.getOrDefault(starterFacing, null); if (secondCorner != null && secondCorner.getKey() != null) { Tuple thirdCorner = Optional @@ -53,21 +69,95 @@ private ConcurrentHashMap getRegistryForDimensi .orElse( secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnLeft90(starterFacing), null)); if (thirdCorner != null) { - return new Vector4i(this.xCoord, this.zCoord, thirdCorner.getValue().x, thirdCorner.getValue().z); + return Stream.of(new Vector2i(this.xCoord, this.zCoord), new Vector2i(thirdCorner.getValue().x, thirdCorner.getValue().z)).collect(Collectors.toList()); + } + } + return null; + } + + private List boundaryForSizedCuboid(ForgeDirection facing) { + BlockPos otherCorner = DirectionUtil.offsetByForward(this.xCoord, this.yCoord, this.zCoord, facing, cuboidSize, 0); + otherCorner = DirectionUtil.offsetByRight(otherCorner, facing, cuboidSize, 0); + return Stream.of(new Vector2i(this.xCoord, this.zCoord), new Vector2i(otherCorner.x, otherCorner.z)).collect(Collectors.toList()); + } + + public List boundaryForArbitraryLoop() { + ArrayList stack = new ArrayList<>(); + stack.add(new StackEntry(new LinkedHashMap<>(), this)); + Set markerChain = null; + + searchStack: do { + StackEntry entry = stack.remove(stack.size() - 1); + + if (entry.current.alignedMarkers.isEmpty() + || entry.current.alignedMarkers.size() == 1 + && entry.current.alignedMarkers.get(entry.lastVisited.getValue()) != null + && entry.current.alignedMarkers.get(entry.lastVisited.getValue()).getKey() == entry.lastVisited.getKey()) { + entry.current.checkForAlignedMarkers(); + worldObj.setBlock(entry.current.xCoord, entry.current.yCoord + 3, entry.current.zCoord, Blocks.brick_block); + } + + for (Map.Entry> otherMarker : entry.current.alignedMarkers.entrySet()) { + if (otherMarker.getValue().getKey() != null) { + // Has not already been visited + if (!entry.visitedMarkers.containsKey(otherMarker.getValue().getKey())) { + @SuppressWarnings("unchecked") // Same type + LinkedHashMap visitedMarkers = (LinkedHashMap) entry.visitedMarkers.clone(); + StackEntry stackEntry = new StackEntry(visitedMarkers, otherMarker.getValue().getKey(), entry.current, otherMarker.getKey().getOpposite()); + stack.add(stackEntry); + + worldObj.setBlock(entry.current.xCoord, entry.current.yCoord + 2, entry.current.zCoord, Blocks.tnt); + continue; + } + + // Check if we have completed a loop by arriving at the starter from a different direction + if (otherMarker.getValue().getKey() == this && entry.visitedMarkers.get(otherMarker.getValue().getKey()) != otherMarker.getKey() && !entry.visitedMarkers.isEmpty()) { + // Append the last marker + entry.visitedMarkers.put(entry.current, otherMarker.getKey()); + markerChain = entry.visitedMarkers.keySet(); + break searchStack; + } + } } + } while (!stack.isEmpty()); + + if (markerChain != null) { + UtilitiesInExcess.chat("Completed marker chain with " + markerChain.size() + " entries."); + ArrayList pointChain = new ArrayList<>(markerChain.size()); + markerChain.forEach((e) -> pointChain.add(new Vector2i(e.xCoord, e.zCoord))); + return pointChain; } + UtilitiesInExcess.chat("Failed to complete marker chain."); + return null; } + private static class StackEntry { + // A map of previously visited markers further down the stack & the direction they were visited from + LinkedHashMap visitedMarkers; + TileEntityEnderMarker current; + Tuple lastVisited; + + StackEntry(LinkedHashMap visitedMarkers, TileEntityEnderMarker current) { + this.visitedMarkers = visitedMarkers; + this.current = current; + this.lastVisited = null; + } + + StackEntry(LinkedHashMap visitedMarkers, TileEntityEnderMarker current, TileEntityEnderMarker previous, ForgeDirection previousDir) { + this(visitedMarkers, current); + this.visitedMarkers.put(previous, previousDir); + lastVisited = new Tuple<>(previous, previousDir); + } + } + public void checkForAlignedMarkers() { this.checkForAlignedMarkers(HORIZONTAL_DIRECTIONS, false); } public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyValidate) { ConcurrentHashMap dimRegistry = getRegistryForDimension(); - // ArrayList staleMarkers = new ArrayList<>(); - for (Map.Entry> entry : alignedMarkers - .entrySet()) { + for (Map.Entry> entry : new ArrayList<>(alignedMarkers.entrySet())) { if (entry.getValue() .getKey() == null) { BlockPos alignedMarkerPos = entry.getValue() @@ -84,11 +174,9 @@ public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyV } else { removeAlignedMarker(entry.getKey()); } - // staleMarkers.add(entry.getKey()); } } - // staleMarkers.forEach(alignedMarkers::remove); - // alignedMarkers.clear(); + for (ForgeDirection dir : dirs) { if (!alignedMarkers.containsKey(dir)) { for (Map.Entry entry : dimRegistry.entrySet()) { @@ -190,6 +278,45 @@ public void teardownConnections() { alignedMarkers.clear(); } + public String getMode() { + return switch(operationMode) { + case DEFAULT -> "Marker is set to establish a rectangular fence from the first 3 in chain."; + case SINGLE -> "Marker is set to establish a cuboid of length " + this.cuboidSize + ". Sneak + R-Click to adjust size."; + case ARBITRARY_LOOP -> "Marker is set to establish a full loop of markers that make up a rectilinear polygon back this marker of arbitrary size and shape."; + }; + } + + public void rotateMode() { + // Don't change the mode the first time, want them to be able to read the default + if (!hasChangedMode) { + hasChangedMode = true; + return; + } + int ord = operationMode.ordinal() + 1; + if (ord >= MarkerOperationMode.values().length) { + ord = 0; + } + operationMode = MarkerOperationMode.values()[ord]; + } + + public int increaseCuboidSize() { + int nextSize = cuboidSize * 2; + cuboidSize = nextSize > 512 ? 2 : cuboidSize * 2; + return cuboidSize; + } + + // IFacingTE + @Override + public ForgeDirection getFacing() { + return this.facing; + } + + @Override + public void setFacing(ForgeDirection newFacing) { + this.facing = newFacing; + } + + // TileEntity @Override public void invalidate() { super.invalidate(); @@ -206,24 +333,16 @@ public void onChunkUnload() { } } - @Override - public ForgeDirection getFacing() { - return this.facing; - } - - @Override - public void setFacing(ForgeDirection newFacing) { - this.facing = newFacing; - } - @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); readFacingFromNBT(compound); this.activeDirections = compound.getInteger("meta"); int dim = compound.getInteger("dim"); + // Can't use getRegistryForDimension yet since worldobj is null registeredMarkers.computeIfAbsent(dim, k -> new ConcurrentHashMap<>()) .put(new BlockPos(xCoord, yCoord, zCoord), this); + this.operationMode = MarkerOperationMode.values()[compound.getInteger("mode")]; } @Override @@ -232,5 +351,12 @@ public void writeToNBT(NBTTagCompound compound) { writeFacingToNBT(compound); compound.setInteger("meta", this.activeDirections); compound.setInteger("dim", this.worldObj.provider.dimensionId); + compound.setInteger("mode", this.operationMode.ordinal()); + } + + public enum MarkerOperationMode { + DEFAULT, + SINGLE, + ARBITRARY_LOOP } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 3c179eb3..0688b01a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -47,9 +47,10 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver, IFluidHandler { - public static final int STEPS_PER_TICK = 400; + public static final int BASE_STEPS_PER_TICK = 400; public static final int ITEM_BUFFER_CAPACITY = 256; public static final Block REPLACE_BLOCK = Blocks.dirt; + public boolean isCreativeBoosted = false; private int storedItems; public ForgeDirection facing; private Area2d workArea; @@ -117,15 +118,18 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); if (te instanceof TileEntityEnderMarker marker) { @Nullable - Vector4i scanReturn = marker.checkForBoundary(dir); + List scanReturn = marker.checkForBoundary(dir); if (scanReturn != null) { + Vector2i firstCorner = scanReturn.get(0); + Vector2i secondCorner = scanReturn.get(1); + // Pad work area by one (inwards), so that we don't mine the markers Vector2i low = new Vector2i( - Math.min(scanReturn.x, scanReturn.z) + 1, - Math.min(scanReturn.y, scanReturn.w) + 1); + Math.min(firstCorner.x, secondCorner.x) + 1, + Math.min(firstCorner.y, secondCorner.y) + 1); Vector2i high = new Vector2i( - Math.max(scanReturn.x, scanReturn.z) - 1, - Math.max(scanReturn.y, scanReturn.w) - 1); + Math.max(firstCorner.x, secondCorner.x) - 1, + Math.max(firstCorner.y, secondCorner.y) - 1); setWorkArea(new Area2d(low, high)); state = QuarryWorkState.RUNNING; @@ -562,7 +566,7 @@ public void updateEntity() { } if (state == QuarryWorkState.RUNNING) { - while (brokenBlocksTick < STEPS_PER_TICK && stepPos()) { + while (brokenBlocksTick < (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1)) && stepPos()) { // TODO: Remove after this has been tested by others if (!isInBounds() || this.chunkX > 1000 || this.chunkZ > 1000) { throw new RuntimeException( @@ -582,7 +586,7 @@ public void updateEntity() { if (state != QuarryWorkState.RUNNING) break; } } - if (brokenBlocksTick < STEPS_PER_TICK && state == QuarryWorkState.RUNNING) { + if (brokenBlocksTick < (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1)) && state == QuarryWorkState.RUNNING) { state = QuarryWorkState.FINISHED; unloadSelf(); } diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry_upgrade.json b/src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry_upgrade.json new file mode 100644 index 00000000..ca5fbcf2 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry_upgrade.json @@ -0,0 +1,7 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/upgrade_speed_1" }, + "meta=1": { "model": "utilitiesinexcess:blocks/upgrade_speed_2" }, + "meta=2": { "model": "utilitiesinexcess:blocks/upgrade_speed_3" } + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_1.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_1.json new file mode 100644 index 00000000..4b111cb3 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_1.json @@ -0,0 +1,701 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utilitiesinexcess:blocks/upgrade_speed_1", + "particle": "utilitiesinexcess:blocks/upgrade_speed_1" + }, + "elements": [ + { + "from": [2, 7, 3], + "to": [4, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.5, 4, 8, 4.5], "texture": "#0"}, + "east": {"uv": [11.5, 5.5, 11.75, 6], "texture": "#0"}, + "south": {"uv": [7.5, 4.5, 8, 5], "texture": "#0"}, + "west": {"uv": [6.75, 11.5, 7, 12], "texture": "#0"}, + "up": {"uv": [12, 4, 11.5, 3.75], "texture": "#0"}, + "down": {"uv": [12, 7.25, 11.5, 7.5], "texture": "#0"} + } + }, + { + "from": [3, 7, 2], + "to": [4, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 11.5, 7.25, 12], "texture": "#0"}, + "east": {"uv": [8.5, 11.5, 8.75, 12], "texture": "#0"}, + "south": {"uv": [8.75, 11.5, 9, 12], "texture": "#0"}, + "west": {"uv": [9, 11.5, 9.25, 12], "texture": "#0"}, + "up": {"uv": [11.75, 8.75, 11.5, 8.5], "texture": "#0"}, + "down": {"uv": [12.5, 3.5, 12.25, 3.75], "texture": "#0"} + } + }, + { + "from": [3, 11, 3], + "to": [4, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9.25, 11.5, 9.5, 12], "texture": "#0"}, + "east": {"uv": [9.5, 11.5, 9.75, 12], "texture": "#0"}, + "south": {"uv": [9.75, 11.5, 10, 12], "texture": "#0"}, + "west": {"uv": [10, 11.5, 10.25, 12], "texture": "#0"}, + "up": {"uv": [12.5, 6.75, 12.25, 6.5], "texture": "#0"}, + "down": {"uv": [12.5, 6.75, 12.25, 7], "texture": "#0"} + } + }, + { + "from": [3, 3, 3], + "to": [4, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 10, 11.75, 10.5], "texture": "#0"}, + "east": {"uv": [10.25, 11.5, 10.5, 12], "texture": "#0"}, + "south": {"uv": [11.5, 10.5, 11.75, 11], "texture": "#0"}, + "west": {"uv": [11.25, 11.5, 11.5, 12], "texture": "#0"}, + "up": {"uv": [12.5, 7.25, 12.25, 7], "texture": "#0"}, + "down": {"uv": [12.5, 7.25, 12.25, 7.5], "texture": "#0"} + } + }, + { + "from": [3, 7, 12], + "to": [4, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 11.5, 11.75, 12], "texture": "#0"}, + "east": {"uv": [10.25, 8.75, 10.75, 9.25], "texture": "#0"}, + "south": {"uv": [11.75, 1, 12, 1.5], "texture": "#0"}, + "west": {"uv": [3.25, 10.5, 3.75, 11], "texture": "#0"}, + "up": {"uv": [12, 2, 11.75, 1.5], "texture": "#0"}, + "down": {"uv": [12, 2, 11.75, 2.5], "texture": "#0"} + } + }, + { + "from": [2, 7, 12], + "to": [3, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 2.5, 12, 3], "texture": "#0"}, + "east": {"uv": [3, 11.75, 3.25, 12.25], "texture": "#0"}, + "south": {"uv": [11.75, 3, 12, 3.5], "texture": "#0"}, + "west": {"uv": [11.75, 4.5, 12, 5], "texture": "#0"}, + "up": {"uv": [12.5, 7.75, 12.25, 7.5], "texture": "#0"}, + "down": {"uv": [12.5, 7.75, 12.25, 8], "texture": "#0"} + } + }, + { + "from": [3, 11, 12], + "to": [4, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 5, 12, 5.5], "texture": "#0"}, + "east": {"uv": [11.75, 5.5, 12, 6], "texture": "#0"}, + "south": {"uv": [11.75, 8.5, 12, 9], "texture": "#0"}, + "west": {"uv": [11.75, 10, 12, 10.5], "texture": "#0"}, + "up": {"uv": [12.5, 8.25, 12.25, 8], "texture": "#0"}, + "down": {"uv": [12.5, 8.25, 12.25, 8.5], "texture": "#0"} + } + }, + { + "from": [3, 3, 12], + "to": [4, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 10.5, 12, 11], "texture": "#0"}, + "east": {"uv": [11.75, 11.5, 12, 12], "texture": "#0"}, + "south": {"uv": [12, 1, 12.25, 1.5], "texture": "#0"}, + "west": {"uv": [12, 1.5, 12.25, 2], "texture": "#0"}, + "up": {"uv": [12.5, 8.75, 12.25, 8.5], "texture": "#0"}, + "down": {"uv": [12.5, 8.75, 12.25, 9], "texture": "#0"} + } + }, + { + "from": [12, 7, 12], + "to": [14, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 4.5, 11, 5], "texture": "#0"}, + "east": {"uv": [2, 12, 2.25, 12.5], "texture": "#0"}, + "south": {"uv": [10.5, 5, 11, 5.5], "texture": "#0"}, + "west": {"uv": [12, 2, 12.25, 2.5], "texture": "#0"}, + "up": {"uv": [12.25, 3.75, 11.75, 3.5], "texture": "#0"}, + "down": {"uv": [12.25, 9, 11.75, 9.25], "texture": "#0"} + } + }, + { + "from": [12, 7, 13], + "to": [13, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.25, 12, 2.5, 12.5], "texture": "#0"}, + "east": {"uv": [2.5, 12, 2.75, 12.5], "texture": "#0"}, + "south": {"uv": [12, 2.5, 12.25, 3], "texture": "#0"}, + "west": {"uv": [2.75, 12, 3, 12.5], "texture": "#0"}, + "up": {"uv": [9.25, 12.5, 9, 12.25], "texture": "#0"}, + "down": {"uv": [12.5, 9, 12.25, 9.25], "texture": "#0"} + } + }, + { + "from": [12, 11, 12], + "to": [13, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 3, 12.25, 3.5], "texture": "#0"}, + "east": {"uv": [3.25, 12, 3.5, 12.5], "texture": "#0"}, + "south": {"uv": [3.5, 12, 3.75, 12.5], "texture": "#0"}, + "west": {"uv": [4, 12, 4.25, 12.5], "texture": "#0"}, + "up": {"uv": [9.5, 12.5, 9.25, 12.25], "texture": "#0"}, + "down": {"uv": [9.75, 12.25, 9.5, 12.5], "texture": "#0"} + } + }, + { + "from": [12, 3, 12], + "to": [13, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4.25, 12, 4.5, 12.5], "texture": "#0"}, + "east": {"uv": [4.5, 12, 4.75, 12.5], "texture": "#0"}, + "south": {"uv": [12, 4.5, 12.25, 5], "texture": "#0"}, + "west": {"uv": [4.75, 12, 5, 12.5], "texture": "#0"}, + "up": {"uv": [10, 12.5, 9.75, 12.25], "texture": "#0"}, + "down": {"uv": [12.5, 10, 12.25, 10.25], "texture": "#0"} + } + }, + { + "from": [12, 7, 2], + "to": [13, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5, 12, 5.25, 12.5], "texture": "#0"}, + "east": {"uv": [10.5, 7.5, 11, 8], "texture": "#0"}, + "south": {"uv": [12, 5, 12.25, 5.5], "texture": "#0"}, + "west": {"uv": [10.5, 8, 11, 8.5], "texture": "#0"}, + "up": {"uv": [12.25, 6, 12, 5.5], "texture": "#0"}, + "down": {"uv": [12.25, 6, 12, 6.5], "texture": "#0"} + } + }, + { + "from": [13, 7, 3], + "to": [14, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 6.5, 12.25, 7], "texture": "#0"}, + "east": {"uv": [6.75, 12, 7, 12.5], "texture": "#0"}, + "south": {"uv": [7, 12, 7.25, 12.5], "texture": "#0"}, + "west": {"uv": [12, 7, 12.25, 7.5], "texture": "#0"}, + "up": {"uv": [12.5, 10.5, 12.25, 10.25], "texture": "#0"}, + "down": {"uv": [11, 12.25, 10.75, 12.5], "texture": "#0"} + } + }, + { + "from": [12, 11, 3], + "to": [13, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.25, 12, 7.5, 12.5], "texture": "#0"}, + "east": {"uv": [7.5, 12, 7.75, 12.5], "texture": "#0"}, + "south": {"uv": [12, 7.5, 12.25, 8], "texture": "#0"}, + "west": {"uv": [7.75, 12, 8, 12.5], "texture": "#0"}, + "up": {"uv": [11.25, 12.5, 11, 12.25], "texture": "#0"}, + "down": {"uv": [12.5, 11, 12.25, 11.25], "texture": "#0"} + } + }, + { + "from": [12, 3, 3], + "to": [13, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 12, 8.25, 12.5], "texture": "#0"}, + "east": {"uv": [12, 8, 12.25, 8.5], "texture": "#0"}, + "south": {"uv": [8.25, 12, 8.5, 12.5], "texture": "#0"}, + "west": {"uv": [8.5, 12, 8.75, 12.5], "texture": "#0"}, + "up": {"uv": [12.5, 11.5, 12.25, 11.25], "texture": "#0"}, + "down": {"uv": [12.5, 11.5, 12.25, 11.75], "texture": "#0"} + } + }, + { + "from": [7, 12, 2], + "to": [9, 14, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 10, 11, 10.5], "texture": "#0"}, + "east": {"uv": [12, 8.5, 12.25, 9], "texture": "#0"}, + "south": {"uv": [10.5, 10.5, 11, 11], "texture": "#0"}, + "west": {"uv": [8.75, 12, 9, 12.5], "texture": "#0"}, + "up": {"uv": [12.5, 4, 12, 3.75], "texture": "#0"}, + "down": {"uv": [9.5, 12, 9, 12.25], "texture": "#0"} + } + }, + { + "from": [7, 13, 3], + "to": [9, 14, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 9.25, 12.5, 9.5], "texture": "#0"}, + "east": {"uv": [12.25, 11.75, 12.5, 12], "texture": "#0"}, + "south": {"uv": [9.5, 12, 10, 12.25], "texture": "#0"}, + "west": {"uv": [12, 12.25, 12.25, 12.5], "texture": "#0"}, + "up": {"uv": [12.5, 9.75, 12, 9.5], "texture": "#0"}, + "down": {"uv": [12.5, 9.75, 12, 10], "texture": "#0"} + } + }, + { + "from": [13, 12, 7], + "to": [14, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 12, 10.25, 12.5], "texture": "#0"}, + "east": {"uv": [10.75, 0, 11.25, 0.5], "texture": "#0"}, + "south": {"uv": [12, 10, 12.25, 10.5], "texture": "#0"}, + "west": {"uv": [10.75, 0.5, 11.25, 1], "texture": "#0"}, + "up": {"uv": [10.5, 12.5, 10.25, 12], "texture": "#0"}, + "down": {"uv": [10.75, 12, 10.5, 12.5], "texture": "#0"} + } + }, + { + "from": [12, 13, 7], + "to": [13, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 12.25, 12.5, 12.5], "texture": "#0"}, + "east": {"uv": [12, 10.5, 12.5, 10.75], "texture": "#0"}, + "south": {"uv": [0, 12.5, 0.25, 12.75], "texture": "#0"}, + "west": {"uv": [10.75, 12, 11.25, 12.25], "texture": "#0"}, + "up": {"uv": [11.5, 12.5, 11.25, 12], "texture": "#0"}, + "down": {"uv": [11.75, 12, 11.5, 12.5], "texture": "#0"} + } + }, + { + "from": [7, 12, 13], + "to": [9, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.75, 1, 11.25, 1.5], "texture": "#0"}, + "east": {"uv": [12, 11.5, 12.25, 12], "texture": "#0"}, + "south": {"uv": [10.75, 1.5, 11.25, 2], "texture": "#0"}, + "west": {"uv": [11.75, 12, 12, 12.5], "texture": "#0"}, + "up": {"uv": [12.5, 11, 12, 10.75], "texture": "#0"}, + "down": {"uv": [12.5, 12, 12, 12.25], "texture": "#0"} + } + }, + { + "from": [7, 13, 12], + "to": [9, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 0, 12.75, 0.25], "texture": "#0"}, + "east": {"uv": [0.25, 12.5, 0.5, 12.75], "texture": "#0"}, + "south": {"uv": [12.25, 0.25, 12.75, 0.5], "texture": "#0"}, + "west": {"uv": [0.5, 12.5, 0.75, 12.75], "texture": "#0"}, + "up": {"uv": [12.75, 0.75, 12.25, 0.5], "texture": "#0"}, + "down": {"uv": [12.75, 0.75, 12.25, 1], "texture": "#0"} + } + }, + { + "from": [2, 12, 7], + "to": [3, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 1, 12.5, 1.5], "texture": "#0"}, + "east": {"uv": [10.75, 2, 11.25, 2.5], "texture": "#0"}, + "south": {"uv": [12.25, 1.5, 12.5, 2], "texture": "#0"}, + "west": {"uv": [10.75, 2.5, 11.25, 3], "texture": "#0"}, + "up": {"uv": [12.5, 2.5, 12.25, 2], "texture": "#0"}, + "down": {"uv": [12.5, 2.5, 12.25, 3], "texture": "#0"} + } + }, + { + "from": [3, 13, 7], + "to": [4, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0.75, 12.5, 1, 12.75], "texture": "#0"}, + "east": {"uv": [12.25, 3, 12.75, 3.25], "texture": "#0"}, + "south": {"uv": [1, 12.5, 1.25, 12.75], "texture": "#0"}, + "west": {"uv": [12.25, 3.25, 12.75, 3.5], "texture": "#0"}, + "up": {"uv": [3.25, 12.75, 3, 12.25], "texture": "#0"}, + "down": {"uv": [12.5, 4, 12.25, 4.5], "texture": "#0"} + } + }, + { + "from": [3, 2, 6], + "to": [4, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 1, 12.75, 1.25], "texture": "#0"}, + "east": {"uv": [10.5, 3.75, 11.5, 4], "texture": "#0"}, + "south": {"uv": [1.25, 12.5, 1.5, 12.75], "texture": "#0"}, + "west": {"uv": [10.5, 5.5, 11.5, 5.75], "texture": "#0"}, + "up": {"uv": [4, 11.5, 3.75, 10.5], "texture": "#0"}, + "down": {"uv": [3.5, 11, 3.25, 12], "texture": "#0"} + } + }, + { + "from": [2, 2, 6], + "to": [3, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 4.5, 12.5, 5], "texture": "#0"}, + "east": {"uv": [6.5, 4, 7.5, 4.5], "texture": "#0"}, + "south": {"uv": [12.25, 5, 12.5, 5.5], "texture": "#0"}, + "west": {"uv": [6.5, 4.5, 7.5, 5], "texture": "#0"}, + "up": {"uv": [3.75, 12, 3.5, 11], "texture": "#0"}, + "down": {"uv": [11.25, 4.5, 11, 5.5], "texture": "#0"} + } + }, + { + "from": [6, 2, 12], + "to": [10, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 8.5, 11.5, 8.75], "texture": "#0"}, + "east": {"uv": [12.5, 1.25, 12.75, 1.5], "texture": "#0"}, + "south": {"uv": [10.75, 3, 11.75, 3.25], "texture": "#0"}, + "west": {"uv": [1.5, 12.5, 1.75, 12.75], "texture": "#0"}, + "up": {"uv": [11.75, 3.5, 10.75, 3.25], "texture": "#0"}, + "down": {"uv": [11.75, 3.5, 10.75, 3.75], "texture": "#0"} + } + }, + { + "from": [6, 2, 13], + "to": [10, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 9.5, 4, 10], "texture": "#0"}, + "east": {"uv": [5.25, 12.25, 5.5, 12.75], "texture": "#0"}, + "south": {"uv": [4, 9.5, 5, 10], "texture": "#0"}, + "west": {"uv": [5.5, 12.25, 5.75, 12.75], "texture": "#0"}, + "up": {"uv": [11.75, 9, 10.75, 8.75], "texture": "#0"}, + "down": {"uv": [11.75, 9, 10.75, 9.25], "texture": "#0"} + } + }, + { + "from": [12, 2, 6], + "to": [13, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 1.5, 12.75, 1.75], "texture": "#0"}, + "east": {"uv": [11, 7.5, 12, 7.75], "texture": "#0"}, + "south": {"uv": [1.75, 12.5, 2, 12.75], "texture": "#0"}, + "west": {"uv": [11, 7.75, 12, 8], "texture": "#0"}, + "up": {"uv": [11.25, 11, 11, 10], "texture": "#0"}, + "down": {"uv": [10.75, 11, 10.5, 12], "texture": "#0"} + } + }, + { + "from": [13, 2, 6], + "to": [14, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 5.5, 12.5, 6], "texture": "#0"}, + "east": {"uv": [5, 9.5, 6, 10], "texture": "#0"}, + "south": {"uv": [5.75, 12.25, 6, 12.75], "texture": "#0"}, + "west": {"uv": [6, 9.5, 7, 10], "texture": "#0"}, + "up": {"uv": [11, 12, 10.75, 11], "texture": "#0"}, + "down": {"uv": [11.25, 11, 11, 12], "texture": "#0"} + } + }, + { + "from": [6, 2, 3], + "to": [10, 3, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11, 8, 12, 8.25], "texture": "#0"}, + "east": {"uv": [12.5, 1.75, 12.75, 2], "texture": "#0"}, + "south": {"uv": [11, 8.25, 12, 8.5], "texture": "#0"}, + "west": {"uv": [2, 12.5, 2.25, 12.75], "texture": "#0"}, + "up": {"uv": [12.25, 0.25, 11.25, 0], "texture": "#0"}, + "down": {"uv": [12.25, 0.25, 11.25, 0.5], "texture": "#0"} + } + }, + { + "from": [6, 2, 2], + "to": [10, 4, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 9.5, 8, 10], "texture": "#0"}, + "east": {"uv": [6, 12.25, 6.25, 12.75], "texture": "#0"}, + "south": {"uv": [3, 10, 4, 10.5], "texture": "#0"}, + "west": {"uv": [12.25, 6, 12.5, 6.5], "texture": "#0"}, + "up": {"uv": [12.25, 0.75, 11.25, 0.5], "texture": "#0"}, + "down": {"uv": [12.25, 0.75, 11.25, 1], "texture": "#0"} + } + }, + { + "from": [12, 3, 4], + "to": [13, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 9.5, 2.25, 12], "texture": "#0"}, + "east": {"uv": [2.5, 0, 4.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.25, 9.5, 2.5, 12], "texture": "#0"}, + "west": {"uv": [2.5, 2.5, 4.5, 5], "texture": "#0"}, + "up": {"uv": [4.25, 12, 4, 10], "texture": "#0"}, + "down": {"uv": [10.25, 4, 10, 6], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [4, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.5, 9.5, 2.75, 12], "texture": "#0"}, + "east": {"uv": [4.5, 0, 6.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.75, 9.5, 3, 12], "texture": "#0"}, + "west": {"uv": [4.5, 2.5, 6.5, 5], "texture": "#0"}, + "up": {"uv": [4.5, 12, 4.25, 10], "texture": "#0"}, + "down": {"uv": [4.75, 10, 4.5, 12], "texture": "#0"} + } + }, + { + "name": "base", + "from": [4, 3, 3], + "to": [12, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 5, 2, 7.5], "texture": "#0"}, + "east": {"uv": [0, 0, 2.5, 2.5], "texture": "#0"}, + "south": {"uv": [2, 5, 4, 7.5], "texture": "#0"}, + "west": {"uv": [0, 2.5, 2.5, 5], "texture": "#0"}, + "up": {"uv": [6, 7.5, 4, 5], "texture": "#0"}, + "down": {"uv": [8, 5, 6, 7.5], "texture": "#0"} + } + }, + { + "from": [4, 4, 13], + "to": [12, 12, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.5, 0, 8.5, 2], "texture": "#0"}, + "east": {"uv": [4.75, 10, 5, 12], "texture": "#0"}, + "south": {"uv": [6.5, 2, 8.5, 4], "texture": "#0"}, + "west": {"uv": [5, 10, 5.25, 12], "texture": "#0"}, + "up": {"uv": [7.25, 10.25, 5.25, 10], "texture": "#0"}, + "down": {"uv": [12, 6, 10, 6.25], "texture": "#0"} + } + }, + { + "from": [4, 13, 4], + "to": [12, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 6.25, 12, 6.5], "texture": "#0"}, + "east": {"uv": [10, 6.5, 12, 6.75], "texture": "#0"}, + "south": {"uv": [10, 6.75, 12, 7], "texture": "#0"}, + "west": {"uv": [10, 7, 12, 7.25], "texture": "#0"}, + "up": {"uv": [2, 9.5, 0, 7.5], "texture": "#0"}, + "down": {"uv": [4, 7.5, 2, 9.5], "texture": "#0"} + } + }, + { + "from": [13, 4, 4], + "to": [14, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.25, 10, 7.5, 12], "texture": "#0"}, + "east": {"uv": [4, 7.5, 6, 9.5], "texture": "#0"}, + "south": {"uv": [10, 7.25, 10.25, 9.25], "texture": "#0"}, + "west": {"uv": [6, 7.5, 8, 9.5], "texture": "#0"}, + "up": {"uv": [7.75, 12, 7.5, 10], "texture": "#0"}, + "down": {"uv": [8, 10, 7.75, 12], "texture": "#0"} + } + }, + { + "from": [4, 4, 2], + "to": [12, 12, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 4, 10, 6], "texture": "#0"}, + "east": {"uv": [8, 10, 8.25, 12], "texture": "#0"}, + "south": {"uv": [8, 6, 10, 8], "texture": "#0"}, + "west": {"uv": [8.25, 10, 8.5, 12], "texture": "#0"}, + "up": {"uv": [10.5, 10.25, 8.5, 10], "texture": "#0"}, + "down": {"uv": [12, 9.25, 10, 9.5], "texture": "#0"} + } + }, + { + "from": [4, 2, 4], + "to": [12, 3, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.5, 12, 9.75], "texture": "#0"}, + "east": {"uv": [10, 9.75, 12, 10], "texture": "#0"}, + "south": {"uv": [10.25, 4, 12.25, 4.25], "texture": "#0"}, + "west": {"uv": [10.25, 4.25, 12.25, 4.5], "texture": "#0"}, + "up": {"uv": [10, 10, 8, 8], "texture": "#0"}, + "down": {"uv": [10.5, 0, 8.5, 2], "texture": "#0"} + } + }, + { + "from": [2, 4, 4], + "to": [3, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.25, 10.25, 5.5, 12.25], "texture": "#0"}, + "east": {"uv": [8.5, 2, 10.5, 4], "texture": "#0"}, + "south": {"uv": [5.5, 10.25, 5.75, 12.25], "texture": "#0"}, + "west": {"uv": [0, 9.5, 2, 11.5], "texture": "#0"}, + "up": {"uv": [6, 12.25, 5.75, 10.25], "texture": "#0"}, + "down": {"uv": [6.25, 10.25, 6, 12.25], "texture": "#0"} + } + }, + { + "from": [1, 5.75, 9], + "to": [2, 9.38, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [1.5, 7.75, 9.5]}, + "faces": { + "north": {"uv": [11.25, 1, 11.5, 2], "texture": "#0"}, + "east": {"uv": [11.25, 2, 11.5, 3], "texture": "#0"}, + "south": {"uv": [11.25, 4.5, 11.5, 5.5], "texture": "#0"}, + "west": {"uv": [11.25, 10, 11.5, 11], "texture": "#0"}, + "up": {"uv": [12.75, 2.25, 12.5, 2], "texture": "#0"}, + "down": {"uv": [2.5, 12.5, 2.25, 12.75], "texture": "#0"} + } + }, + { + "from": [1, 5.75, 6], + "to": [2, 10.37, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [1.5, 7.75, 6.5]}, + "faces": { + "north": {"uv": [10.25, 4.5, 10.5, 5.75], "texture": "#0"}, + "east": {"uv": [6.25, 10.25, 6.5, 11.5], "texture": "#0"}, + "south": {"uv": [6.5, 10.25, 6.75, 11.5], "texture": "#0"}, + "west": {"uv": [6.75, 10.25, 7, 11.5], "texture": "#0"}, + "up": {"uv": [12.75, 2.5, 12.5, 2.25], "texture": "#0"}, + "down": {"uv": [2.75, 12.5, 2.5, 12.75], "texture": "#0"} + } + }, + { + "from": [9, 14, 6.62], + "to": [10, 15, 10.25], + "rotation": {"angle": 45, "axis": "y", "origin": [9.5, 14.75, 8.25]}, + "faces": { + "north": {"uv": [12.5, 2.5, 12.75, 2.75], "texture": "#0"}, + "east": {"uv": [11.25, 11, 12.25, 11.25], "texture": "#0"}, + "south": {"uv": [2.75, 12.5, 3, 12.75], "texture": "#0"}, + "west": {"uv": [11.25, 11.25, 12.25, 11.5], "texture": "#0"}, + "up": {"uv": [0.25, 12.5, 0, 11.5], "texture": "#0"}, + "down": {"uv": [0.5, 11.5, 0.25, 12.5], "texture": "#0"} + } + }, + { + "from": [6, 14, 5.63], + "to": [7, 15, 10.25], + "rotation": {"angle": -45, "axis": "y", "origin": [6.5, 14.75, 8.25]}, + "faces": { + "north": {"uv": [12.5, 2.75, 12.75, 3], "texture": "#0"}, + "east": {"uv": [10.25, 5.75, 11.5, 6], "texture": "#0"}, + "south": {"uv": [3.25, 12.5, 3.5, 12.75], "texture": "#0"}, + "west": {"uv": [10.25, 7.25, 11.5, 7.5], "texture": "#0"}, + "up": {"uv": [7.25, 11.5, 7, 10.25], "texture": "#0"}, + "down": {"uv": [10.5, 7.5, 10.25, 8.75], "texture": "#0"} + } + }, + { + "from": [14, 5.75, 6], + "to": [15, 9.38, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [14.5, 7.75, 6.5]}, + "faces": { + "north": {"uv": [0.5, 11.5, 0.75, 12.5], "texture": "#0"}, + "east": {"uv": [0.75, 11.5, 1, 12.5], "texture": "#0"}, + "south": {"uv": [1, 11.5, 1.25, 12.5], "texture": "#0"}, + "west": {"uv": [11.5, 1, 11.75, 2], "texture": "#0"}, + "up": {"uv": [3.75, 12.75, 3.5, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 3.5, 12.5, 3.75], "texture": "#0"} + } + }, + { + "from": [14, 5.75, 9], + "to": [15, 10.37, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [14.5, 7.75, 9.5]}, + "faces": { + "north": {"uv": [8.5, 10.25, 8.75, 11.5], "texture": "#0"}, + "east": {"uv": [8.75, 10.25, 9, 11.5], "texture": "#0"}, + "south": {"uv": [9, 10.25, 9.25, 11.5], "texture": "#0"}, + "west": {"uv": [9.25, 10.25, 9.5, 11.5], "texture": "#0"}, + "up": {"uv": [4, 12.75, 3.75, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 3.75, 12.5, 4], "texture": "#0"} + } + }, + { + "from": [6, 5.75, 14], + "to": [7, 10.37, 15], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 7.75, 14.5]}, + "faces": { + "north": {"uv": [9.5, 10.25, 9.75, 11.5], "texture": "#0"}, + "east": {"uv": [9.75, 10.25, 10, 11.5], "texture": "#0"}, + "south": {"uv": [10, 10.25, 10.25, 11.5], "texture": "#0"}, + "west": {"uv": [10.25, 10.25, 10.5, 11.5], "texture": "#0"}, + "up": {"uv": [4.25, 12.75, 4, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 4, 12.5, 4.25], "texture": "#0"} + } + }, + { + "from": [9, 5.75, 14], + "to": [10, 9.38, 15], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 7.75, 14.5]}, + "faces": { + "north": {"uv": [1.25, 11.5, 1.5, 12.5], "texture": "#0"}, + "east": {"uv": [1.5, 11.5, 1.75, 12.5], "texture": "#0"}, + "south": {"uv": [1.75, 11.5, 2, 12.5], "texture": "#0"}, + "west": {"uv": [11.5, 2, 11.75, 3], "texture": "#0"}, + "up": {"uv": [4.5, 12.75, 4.25, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 4.25, 12.5, 4.5], "texture": "#0"} + } + }, + { + "from": [6, 5.75, 1], + "to": [7, 9.38, 2], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 7.75, 1.5]}, + "faces": { + "north": {"uv": [3.75, 11.5, 4, 12.5], "texture": "#0"}, + "east": {"uv": [11.5, 4.5, 11.75, 5.5], "texture": "#0"}, + "south": {"uv": [6.25, 11.5, 6.5, 12.5], "texture": "#0"}, + "west": {"uv": [6.5, 11.5, 6.75, 12.5], "texture": "#0"}, + "up": {"uv": [4.75, 12.75, 4.5, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 4.5, 12.5, 4.75], "texture": "#0"} + } + }, + { + "from": [9, 5.75, 1], + "to": [10, 10.37, 2], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 7.75, 1.5]}, + "faces": { + "north": {"uv": [10.5, 0, 10.75, 1.25], "texture": "#0"}, + "east": {"uv": [10.5, 1.25, 10.75, 2.5], "texture": "#0"}, + "south": {"uv": [10.5, 2.5, 10.75, 3.75], "texture": "#0"}, + "west": {"uv": [3, 10.5, 3.25, 11.75], "texture": "#0"}, + "up": {"uv": [5, 12.75, 4.75, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 4.75, 12.5, 5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "ornaments", + "origin": [3, 8, 3], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + }, + { + "name": "center", + "origin": [8, 8, 8], + "color": 0, + "children": [32, 33, 34] + }, + { + "name": "plates", + "origin": [8, 8, 8], + "color": 0, + "children": [35, 36, 37, 38, 39, 40] + }, + { + "name": "symbol", + "origin": [6, 8, 1], + "color": 0, + "children": [41, 42, 43, 44, 45, 46, 47, 48, 49, 50] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_2.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_2.json new file mode 100644 index 00000000..e729a6b6 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_2.json @@ -0,0 +1,831 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utilitiesinexcess:upgrade_speed_2", + "particle": "utilitiesinexcess:upgrade_speed_2" + }, + "elements": [ + { + "from": [2, 7, 3], + "to": [4, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.5, 4, 8, 4.5], "texture": "#0"}, + "east": {"uv": [11.75, 11, 12, 11.5], "texture": "#0"}, + "south": {"uv": [7.5, 4.5, 8, 5], "texture": "#0"}, + "west": {"uv": [4, 12, 4.25, 12.5], "texture": "#0"}, + "up": {"uv": [11, 4, 10.5, 3.75], "texture": "#0"}, + "down": {"uv": [4.75, 12, 4.25, 12.25], "texture": "#0"} + } + }, + { + "from": [3, 7, 2], + "to": [4, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 4.5, 12.25, 5], "texture": "#0"}, + "east": {"uv": [4.75, 12, 5, 12.5], "texture": "#0"}, + "south": {"uv": [5, 12, 5.25, 12.5], "texture": "#0"}, + "west": {"uv": [12, 5, 12.25, 5.5], "texture": "#0"}, + "up": {"uv": [11.25, 4, 11, 3.75], "texture": "#0"}, + "down": {"uv": [12.5, 5.5, 12.25, 5.75], "texture": "#0"} + } + }, + { + "from": [3, 11, 3], + "to": [4, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 6, 12.25, 6.5], "texture": "#0"}, + "east": {"uv": [12, 6.5, 12.25, 7], "texture": "#0"}, + "south": {"uv": [7.25, 12, 7.5, 12.5], "texture": "#0"}, + "west": {"uv": [7.5, 12, 7.75, 12.5], "texture": "#0"}, + "up": {"uv": [13, 5.75, 12.75, 5.5], "texture": "#0"}, + "down": {"uv": [6, 12.75, 5.75, 13], "texture": "#0"} + } + }, + { + "from": [3, 3, 3], + "to": [4, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.75, 12, 8, 12.5], "texture": "#0"}, + "east": {"uv": [8, 12, 8.25, 12.5], "texture": "#0"}, + "south": {"uv": [8.25, 12, 8.5, 12.5], "texture": "#0"}, + "west": {"uv": [12, 9.25, 12.25, 9.75], "texture": "#0"}, + "up": {"uv": [13, 6, 12.75, 5.75], "texture": "#0"}, + "down": {"uv": [6.25, 12.75, 6, 13], "texture": "#0"} + } + }, + { + "from": [3, 7, 12], + "to": [4, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 9.75, 12.25, 10.25], "texture": "#0"}, + "east": {"uv": [11.25, 0, 11.75, 0.5], "texture": "#0"}, + "south": {"uv": [12, 10.25, 12.25, 10.75], "texture": "#0"}, + "west": {"uv": [11.25, 0.5, 11.75, 1], "texture": "#0"}, + "up": {"uv": [12.25, 11.25, 12, 10.75], "texture": "#0"}, + "down": {"uv": [12.25, 11.75, 12, 12.25], "texture": "#0"} + } + }, + { + "from": [2, 7, 12], + "to": [3, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 1, 12.5, 1.5], "texture": "#0"}, + "east": {"uv": [12.25, 1.5, 12.5, 2], "texture": "#0"}, + "south": {"uv": [12.25, 2, 12.5, 2.5], "texture": "#0"}, + "west": {"uv": [12.25, 2.5, 12.5, 3], "texture": "#0"}, + "up": {"uv": [13, 6.25, 12.75, 6], "texture": "#0"}, + "down": {"uv": [6.5, 12.75, 6.25, 13], "texture": "#0"} + } + }, + { + "from": [3, 11, 12], + "to": [4, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 3, 12.5, 3.5], "texture": "#0"}, + "east": {"uv": [12.25, 3.5, 12.5, 4], "texture": "#0"}, + "south": {"uv": [12.25, 4, 12.5, 4.5], "texture": "#0"}, + "west": {"uv": [4.25, 12.25, 4.5, 12.75], "texture": "#0"}, + "up": {"uv": [13, 6.5, 12.75, 6.25], "texture": "#0"}, + "down": {"uv": [6.75, 12.75, 6.5, 13], "texture": "#0"} + } + }, + { + "from": [3, 3, 12], + "to": [4, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4.5, 12.25, 4.75, 12.75], "texture": "#0"}, + "east": {"uv": [12.25, 4.5, 12.5, 5], "texture": "#0"}, + "south": {"uv": [12.25, 5, 12.5, 5.5], "texture": "#0"}, + "west": {"uv": [5.25, 12.25, 5.5, 12.75], "texture": "#0"}, + "up": {"uv": [13, 6.75, 12.75, 6.5], "texture": "#0"}, + "down": {"uv": [7, 12.75, 6.75, 13], "texture": "#0"} + } + }, + { + "from": [12, 7, 12], + "to": [14, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 1, 11.75, 1.5], "texture": "#0"}, + "east": {"uv": [5.5, 12.25, 5.75, 12.75], "texture": "#0"}, + "south": {"uv": [11.25, 1.5, 11.75, 2], "texture": "#0"}, + "west": {"uv": [5.75, 12.25, 6, 12.75], "texture": "#0"}, + "up": {"uv": [12.5, 7.25, 12, 7], "texture": "#0"}, + "down": {"uv": [12.5, 11.25, 12, 11.5], "texture": "#0"} + } + }, + { + "from": [12, 7, 13], + "to": [13, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 12.25, 6.25, 12.75], "texture": "#0"}, + "east": {"uv": [12.25, 6, 12.5, 6.5], "texture": "#0"}, + "south": {"uv": [12.25, 6.5, 12.5, 7], "texture": "#0"}, + "west": {"uv": [12.25, 9.25, 12.5, 9.75], "texture": "#0"}, + "up": {"uv": [13, 7, 12.75, 6.75], "texture": "#0"}, + "down": {"uv": [7.25, 12.75, 7, 13], "texture": "#0"} + } + }, + { + "from": [12, 11, 12], + "to": [13, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 9.75, 12.5, 10.25], "texture": "#0"}, + "east": {"uv": [12.25, 10.25, 12.5, 10.75], "texture": "#0"}, + "south": {"uv": [12.25, 10.75, 12.5, 11.25], "texture": "#0"}, + "west": {"uv": [11, 12.25, 11.25, 12.75], "texture": "#0"}, + "up": {"uv": [7.5, 13, 7.25, 12.75], "texture": "#0"}, + "down": {"uv": [13, 7.25, 12.75, 7.5], "texture": "#0"} + } + }, + { + "from": [12, 3, 12], + "to": [13, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 11.75, 12.5, 12.25], "texture": "#0"}, + "east": {"uv": [12, 12.25, 12.25, 12.75], "texture": "#0"}, + "south": {"uv": [12.25, 12.25, 12.5, 12.75], "texture": "#0"}, + "west": {"uv": [0, 12.5, 0.25, 13], "texture": "#0"}, + "up": {"uv": [7.75, 13, 7.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 7.5, 12.75, 7.75], "texture": "#0"} + } + }, + { + "from": [12, 7, 2], + "to": [13, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0.25, 12.5, 0.5, 13], "texture": "#0"}, + "east": {"uv": [11.25, 2, 11.75, 2.5], "texture": "#0"}, + "south": {"uv": [12.5, 1, 12.75, 1.5], "texture": "#0"}, + "west": {"uv": [11.25, 2.5, 11.75, 3], "texture": "#0"}, + "up": {"uv": [1.75, 13, 1.5, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 1.5, 12.5, 2], "texture": "#0"} + } + }, + { + "from": [13, 7, 3], + "to": [14, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1.75, 12.5, 2, 13], "texture": "#0"}, + "east": {"uv": [12.5, 2, 12.75, 2.5], "texture": "#0"}, + "south": {"uv": [12.5, 2.5, 12.75, 3], "texture": "#0"}, + "west": {"uv": [12.5, 3, 12.75, 3.5], "texture": "#0"}, + "up": {"uv": [8, 13, 7.75, 12.75], "texture": "#0"}, + "down": {"uv": [13, 7.75, 12.75, 8], "texture": "#0"} + } + }, + { + "from": [12, 11, 3], + "to": [13, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 3.5, 12.75, 4], "texture": "#0"}, + "east": {"uv": [4, 12.5, 4.25, 13], "texture": "#0"}, + "south": {"uv": [12.5, 4, 12.75, 4.5], "texture": "#0"}, + "west": {"uv": [12.5, 4.5, 12.75, 5], "texture": "#0"}, + "up": {"uv": [8.25, 13, 8, 12.75], "texture": "#0"}, + "down": {"uv": [13, 8, 12.75, 8.25], "texture": "#0"} + } + }, + { + "from": [12, 3, 3], + "to": [13, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4.75, 12.5, 5, 13], "texture": "#0"}, + "east": {"uv": [5, 12.5, 5.25, 13], "texture": "#0"}, + "south": {"uv": [12.5, 5, 12.75, 5.5], "texture": "#0"}, + "west": {"uv": [12.5, 5.5, 12.75, 6], "texture": "#0"}, + "up": {"uv": [13, 8.5, 12.75, 8.25], "texture": "#0"}, + "down": {"uv": [8.75, 12.75, 8.5, 13], "texture": "#0"} + } + }, + { + "from": [7, 12, 2], + "to": [9, 14, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 3, 11.75, 3.5], "texture": "#0"}, + "east": {"uv": [12.5, 6, 12.75, 6.5], "texture": "#0"}, + "south": {"uv": [11.25, 3.5, 11.75, 4], "texture": "#0"}, + "west": {"uv": [12.5, 6.5, 12.75, 7], "texture": "#0"}, + "up": {"uv": [12.75, 8.5, 12.25, 8.25], "texture": "#0"}, + "down": {"uv": [13, 7, 12.5, 7.25], "texture": "#0"} + } + }, + { + "from": [7, 13, 3], + "to": [9, 14, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.25, 12.5, 7.75, 12.75], "texture": "#0"}, + "east": {"uv": [8.75, 12.75, 9, 13], "texture": "#0"}, + "south": {"uv": [7.75, 12.5, 8.25, 12.75], "texture": "#0"}, + "west": {"uv": [9, 12.75, 9.25, 13], "texture": "#0"}, + "up": {"uv": [13, 8.75, 12.5, 8.5], "texture": "#0"}, + "down": {"uv": [13, 8.75, 12.5, 9], "texture": "#0"} + } + }, + { + "from": [13, 12, 7], + "to": [14, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.25, 12.5, 8.5, 13], "texture": "#0"}, + "east": {"uv": [11.25, 4.5, 11.75, 5], "texture": "#0"}, + "south": {"uv": [12.5, 9, 12.75, 9.5], "texture": "#0"}, + "west": {"uv": [11.25, 5, 11.75, 5.5], "texture": "#0"}, + "up": {"uv": [12.75, 10, 12.5, 9.5], "texture": "#0"}, + "down": {"uv": [12.75, 10, 12.5, 10.5], "texture": "#0"} + } + }, + { + "from": [12, 13, 7], + "to": [13, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 9, 13, 9.25], "texture": "#0"}, + "east": {"uv": [12.5, 10.5, 13, 10.75], "texture": "#0"}, + "south": {"uv": [9.25, 12.75, 9.5, 13], "texture": "#0"}, + "west": {"uv": [12.5, 10.75, 13, 11], "texture": "#0"}, + "up": {"uv": [12.75, 11.5, 12.5, 11], "texture": "#0"}, + "down": {"uv": [11.5, 12.5, 11.25, 13], "texture": "#0"} + } + }, + { + "from": [7, 12, 13], + "to": [9, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 7.25, 11.75, 7.75], "texture": "#0"}, + "east": {"uv": [12.5, 11.5, 12.75, 12], "texture": "#0"}, + "south": {"uv": [11.25, 7.75, 11.75, 8.25], "texture": "#0"}, + "west": {"uv": [12.5, 12, 12.75, 12.5], "texture": "#0"}, + "up": {"uv": [13, 12.75, 12.5, 12.5], "texture": "#0"}, + "down": {"uv": [13.25, 0, 12.75, 0.25], "texture": "#0"} + } + }, + { + "from": [7, 13, 12], + "to": [9, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 0.25, 13.25, 0.5], "texture": "#0"}, + "east": {"uv": [12.75, 9.25, 13, 9.5], "texture": "#0"}, + "south": {"uv": [12.75, 0.5, 13.25, 0.75], "texture": "#0"}, + "west": {"uv": [9.5, 12.75, 9.75, 13], "texture": "#0"}, + "up": {"uv": [13.25, 1, 12.75, 0.75], "texture": "#0"}, + "down": {"uv": [13.25, 1, 12.75, 1.25], "texture": "#0"} + } + }, + { + "from": [2, 12, 7], + "to": [3, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 1.25, 13, 1.75], "texture": "#0"}, + "east": {"uv": [11.25, 10, 11.75, 10.5], "texture": "#0"}, + "south": {"uv": [12.75, 1.75, 13, 2.25], "texture": "#0"}, + "west": {"uv": [10.5, 11.25, 11, 11.75], "texture": "#0"}, + "up": {"uv": [13, 2.75, 12.75, 2.25], "texture": "#0"}, + "down": {"uv": [13, 2.75, 12.75, 3.25], "texture": "#0"} + } + }, + { + "from": [3, 13, 7], + "to": [4, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 9.5, 13, 9.75], "texture": "#0"}, + "east": {"uv": [3, 12.75, 3.5, 13], "texture": "#0"}, + "south": {"uv": [9.75, 12.75, 10, 13], "texture": "#0"}, + "west": {"uv": [12.75, 3.25, 13.25, 3.5], "texture": "#0"}, + "up": {"uv": [3.75, 13.25, 3.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 3.5, 12.75, 4], "texture": "#0"} + } + }, + { + "from": [3, 2, 6], + "to": [4, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 9.75, 13, 10], "texture": "#0"}, + "east": {"uv": [11.25, 5.5, 12.25, 5.75], "texture": "#0"}, + "south": {"uv": [10, 12.75, 10.25, 13], "texture": "#0"}, + "west": {"uv": [11.25, 8.25, 12.25, 8.5], "texture": "#0"}, + "up": {"uv": [11.5, 11.5, 11.25, 10.5], "texture": "#0"}, + "down": {"uv": [11.25, 11.25, 11, 12.25], "texture": "#0"} + } + }, + { + "from": [2, 2, 6], + "to": [3, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3.75, 12.75, 4, 13.25], "texture": "#0"}, + "east": {"uv": [6.5, 4, 7.5, 4.5], "texture": "#0"}, + "south": {"uv": [12.75, 4, 13, 4.5], "texture": "#0"}, + "west": {"uv": [6.5, 4.5, 7.5, 5], "texture": "#0"}, + "up": {"uv": [0.25, 12.5, 0, 11.5], "texture": "#0"}, + "down": {"uv": [0.5, 11.5, 0.25, 12.5], "texture": "#0"} + } + }, + { + "from": [6, 2, 12], + "to": [10, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0.5, 11.5, 1.5, 11.75], "texture": "#0"}, + "east": {"uv": [12.75, 10, 13, 10.25], "texture": "#0"}, + "south": {"uv": [11.5, 5.75, 12.5, 6], "texture": "#0"}, + "west": {"uv": [10.25, 12.75, 10.5, 13], "texture": "#0"}, + "up": {"uv": [7.25, 11.75, 6.25, 11.5], "texture": "#0"}, + "down": {"uv": [9.5, 11.5, 8.5, 11.75], "texture": "#0"} + } + }, + { + "from": [6, 2, 13], + "to": [10, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 9.5, 4, 10], "texture": "#0"}, + "east": {"uv": [4.25, 12.75, 4.5, 13.25], "texture": "#0"}, + "south": {"uv": [4, 9.5, 5, 10], "texture": "#0"}, + "west": {"uv": [4.5, 12.75, 4.75, 13.25], "texture": "#0"}, + "up": {"uv": [12.5, 8.75, 11.5, 8.5], "texture": "#0"}, + "down": {"uv": [12.5, 8.75, 11.5, 9], "texture": "#0"} + } + }, + { + "from": [12, 2, 6], + "to": [13, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 10.25, 13, 10.5], "texture": "#0"}, + "east": {"uv": [11.5, 9, 12.5, 9.25], "texture": "#0"}, + "south": {"uv": [10.5, 12.75, 10.75, 13], "texture": "#0"}, + "west": {"uv": [9.5, 11.5, 10.5, 11.75], "texture": "#0"}, + "up": {"uv": [1.75, 12.5, 1.5, 11.5], "texture": "#0"}, + "down": {"uv": [2, 11.5, 1.75, 12.5], "texture": "#0"} + } + }, + { + "from": [13, 2, 6], + "to": [14, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 4.5, 13, 5], "texture": "#0"}, + "east": {"uv": [5, 9.5, 6, 10], "texture": "#0"}, + "south": {"uv": [12.75, 5, 13, 5.5], "texture": "#0"}, + "west": {"uv": [6, 9.5, 7, 10], "texture": "#0"}, + "up": {"uv": [11.75, 11.5, 11.5, 10.5], "texture": "#0"}, + "down": {"uv": [11.5, 11.5, 11.25, 12.5], "texture": "#0"} + } + }, + { + "from": [6, 2, 3], + "to": [10, 3, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 11.5, 12.5, 11.75], "texture": "#0"}, + "east": {"uv": [10.75, 12.75, 11, 13], "texture": "#0"}, + "south": {"uv": [11.75, 0, 12.75, 0.25], "texture": "#0"}, + "west": {"uv": [11, 12.75, 11.25, 13], "texture": "#0"}, + "up": {"uv": [12.75, 0.5, 11.75, 0.25], "texture": "#0"}, + "down": {"uv": [1.5, 11.75, 0.5, 12], "texture": "#0"} + } + }, + { + "from": [6, 2, 2], + "to": [10, 4, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 9.5, 8, 10], "texture": "#0"}, + "east": {"uv": [5.25, 12.75, 5.5, 13.25], "texture": "#0"}, + "south": {"uv": [3, 10, 4, 10.5], "texture": "#0"}, + "west": {"uv": [5.5, 12.75, 5.75, 13.25], "texture": "#0"}, + "up": {"uv": [12.75, 0.75, 11.75, 0.5], "texture": "#0"}, + "down": {"uv": [12.75, 0.75, 11.75, 1], "texture": "#0"} + } + }, + { + "from": [12, 3, 4], + "to": [13, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 9.5, 2.25, 12], "texture": "#0"}, + "east": {"uv": [2.5, 0, 4.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.25, 9.5, 2.5, 12], "texture": "#0"}, + "west": {"uv": [2.5, 2.5, 4.5, 5], "texture": "#0"}, + "up": {"uv": [4.25, 12, 4, 10], "texture": "#0"}, + "down": {"uv": [10.25, 4, 10, 6], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [4, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.5, 9.5, 2.75, 12], "texture": "#0"}, + "east": {"uv": [4.5, 0, 6.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.75, 9.5, 3, 12], "texture": "#0"}, + "west": {"uv": [4.5, 2.5, 6.5, 5], "texture": "#0"}, + "up": {"uv": [4.5, 12, 4.25, 10], "texture": "#0"}, + "down": {"uv": [4.75, 10, 4.5, 12], "texture": "#0"} + } + }, + { + "name": "base", + "from": [4, 3, 3], + "to": [12, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 5, 2, 7.5], "texture": "#0"}, + "east": {"uv": [0, 0, 2.5, 2.5], "texture": "#0"}, + "south": {"uv": [2, 5, 4, 7.5], "texture": "#0"}, + "west": {"uv": [0, 2.5, 2.5, 5], "texture": "#0"}, + "up": {"uv": [6, 7.5, 4, 5], "texture": "#0"}, + "down": {"uv": [8, 5, 6, 7.5], "texture": "#0"} + } + }, + { + "from": [4, 4, 13], + "to": [12, 12, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.5, 0, 8.5, 2], "texture": "#0"}, + "east": {"uv": [4.75, 10, 5, 12], "texture": "#0"}, + "south": {"uv": [6.5, 2, 8.5, 4], "texture": "#0"}, + "west": {"uv": [5, 10, 5.25, 12], "texture": "#0"}, + "up": {"uv": [7.25, 10.25, 5.25, 10], "texture": "#0"}, + "down": {"uv": [12, 6, 10, 6.25], "texture": "#0"} + } + }, + { + "from": [4, 13, 4], + "to": [12, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 6.25, 12, 6.5], "texture": "#0"}, + "east": {"uv": [10, 6.5, 12, 6.75], "texture": "#0"}, + "south": {"uv": [10, 6.75, 12, 7], "texture": "#0"}, + "west": {"uv": [10, 7, 12, 7.25], "texture": "#0"}, + "up": {"uv": [2, 9.5, 0, 7.5], "texture": "#0"}, + "down": {"uv": [4, 7.5, 2, 9.5], "texture": "#0"} + } + }, + { + "from": [13, 4, 4], + "to": [14, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.25, 10, 7.5, 12], "texture": "#0"}, + "east": {"uv": [4, 7.5, 6, 9.5], "texture": "#0"}, + "south": {"uv": [10, 7.25, 10.25, 9.25], "texture": "#0"}, + "west": {"uv": [6, 7.5, 8, 9.5], "texture": "#0"}, + "up": {"uv": [7.75, 12, 7.5, 10], "texture": "#0"}, + "down": {"uv": [8, 10, 7.75, 12], "texture": "#0"} + } + }, + { + "from": [4, 4, 2], + "to": [12, 12, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 4, 10, 6], "texture": "#0"}, + "east": {"uv": [8, 10, 8.25, 12], "texture": "#0"}, + "south": {"uv": [8, 6, 10, 8], "texture": "#0"}, + "west": {"uv": [8.25, 10, 8.5, 12], "texture": "#0"}, + "up": {"uv": [10.5, 10.25, 8.5, 10], "texture": "#0"}, + "down": {"uv": [12, 9.25, 10, 9.5], "texture": "#0"} + } + }, + { + "from": [4, 2, 4], + "to": [12, 3, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.5, 12, 9.75], "texture": "#0"}, + "east": {"uv": [10, 9.75, 12, 10], "texture": "#0"}, + "south": {"uv": [10.25, 4, 12.25, 4.25], "texture": "#0"}, + "west": {"uv": [10.25, 4.25, 12.25, 4.5], "texture": "#0"}, + "up": {"uv": [10, 10, 8, 8], "texture": "#0"}, + "down": {"uv": [10.5, 0, 8.5, 2], "texture": "#0"} + } + }, + { + "from": [2, 4, 4], + "to": [3, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.25, 10.25, 5.5, 12.25], "texture": "#0"}, + "east": {"uv": [8.5, 2, 10.5, 4], "texture": "#0"}, + "south": {"uv": [5.5, 10.25, 5.75, 12.25], "texture": "#0"}, + "west": {"uv": [0, 9.5, 2, 11.5], "texture": "#0"}, + "up": {"uv": [6, 12.25, 5.75, 10.25], "texture": "#0"}, + "down": {"uv": [6.25, 10.25, 6, 12.25], "texture": "#0"} + } + }, + { + "from": [6, 4.75, 1], + "to": [7, 8.38, 2], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 6.75, 1.5]}, + "faces": { + "north": {"uv": [11.75, 1, 12, 2], "texture": "#0"}, + "east": {"uv": [11.75, 2, 12, 3], "texture": "#0"}, + "south": {"uv": [3, 11.75, 3.25, 12.75], "texture": "#0"}, + "west": {"uv": [11.75, 3, 12, 4], "texture": "#0"}, + "up": {"uv": [13, 11.25, 12.75, 11], "texture": "#0"}, + "down": {"uv": [13, 11.25, 12.75, 11.5], "texture": "#0"} + } + }, + { + "from": [1, 4.75, 6], + "to": [2, 9.37, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [1.5, 6.75, 6.5]}, + "faces": { + "north": {"uv": [10.25, 4.5, 10.5, 5.75], "texture": "#0"}, + "east": {"uv": [6.25, 10.25, 6.5, 11.5], "texture": "#0"}, + "south": {"uv": [6.5, 10.25, 6.75, 11.5], "texture": "#0"}, + "west": {"uv": [6.75, 10.25, 7, 11.5], "texture": "#0"}, + "up": {"uv": [11.75, 13, 11.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 11.5, 12.75, 11.75], "texture": "#0"} + } + }, + { + "from": [1, 6.75, 9], + "to": [2, 10.38, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [1.5, 8.75, 9.5]}, + "faces": { + "north": {"uv": [3.25, 11.75, 3.5, 12.75], "texture": "#0"}, + "east": {"uv": [3.5, 11.75, 3.75, 12.75], "texture": "#0"}, + "south": {"uv": [3.75, 11.75, 4, 12.75], "texture": "#0"}, + "west": {"uv": [11.75, 4.5, 12, 5.5], "texture": "#0"}, + "up": {"uv": [12, 13, 11.75, 12.75], "texture": "#0"}, + "down": {"uv": [13, 11.75, 12.75, 12], "texture": "#0"} + } + }, + { + "from": [1, 6.75, 6], + "to": [2, 11.37, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [1.5, 8.75, 6.5]}, + "faces": { + "north": {"uv": [7, 10.25, 7.25, 11.5], "texture": "#0"}, + "east": {"uv": [10.25, 7.25, 10.5, 8.5], "texture": "#0"}, + "south": {"uv": [8.5, 10.25, 8.75, 11.5], "texture": "#0"}, + "west": {"uv": [8.75, 10.25, 9, 11.5], "texture": "#0"}, + "up": {"uv": [12.25, 13, 12, 12.75], "texture": "#0"}, + "down": {"uv": [13, 12, 12.75, 12.25], "texture": "#0"} + } + }, + { + "from": [1, 4.75, 9], + "to": [2, 8.38, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [1.5, 6.75, 9.5]}, + "faces": { + "north": {"uv": [6.25, 11.75, 6.5, 12.75], "texture": "#0"}, + "east": {"uv": [6.5, 11.75, 6.75, 12.75], "texture": "#0"}, + "south": {"uv": [6.75, 11.75, 7, 12.75], "texture": "#0"}, + "west": {"uv": [7, 11.75, 7.25, 12.75], "texture": "#0"}, + "up": {"uv": [12.5, 13, 12.25, 12.75], "texture": "#0"}, + "down": {"uv": [13, 12.25, 12.75, 12.5], "texture": "#0"} + } + }, + { + "from": [6, 4.75, 14], + "to": [7, 9.37, 15], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 6.75, 14.5]}, + "faces": { + "north": {"uv": [9, 10.25, 9.25, 11.5], "texture": "#0"}, + "east": {"uv": [9.25, 10.25, 9.5, 11.5], "texture": "#0"}, + "south": {"uv": [9.5, 10.25, 9.75, 11.5], "texture": "#0"}, + "west": {"uv": [9.75, 10.25, 10, 11.5], "texture": "#0"}, + "up": {"uv": [12.75, 13, 12.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 12.75, 12.75, 13], "texture": "#0"} + } + }, + { + "from": [9, 14, 7.62], + "to": [10, 15, 11.25], + "rotation": {"angle": 45, "axis": "y", "origin": [9.5, 14.75, 9.25]}, + "faces": { + "north": {"uv": [0, 13, 0.25, 13.25], "texture": "#0"}, + "east": {"uv": [11.75, 7.25, 12.75, 7.5], "texture": "#0"}, + "south": {"uv": [0.25, 13, 0.5, 13.25], "texture": "#0"}, + "west": {"uv": [11.75, 7.5, 12.75, 7.75], "texture": "#0"}, + "up": {"uv": [8.75, 12.75, 8.5, 11.75], "texture": "#0"}, + "down": {"uv": [9, 11.75, 8.75, 12.75], "texture": "#0"} + } + }, + { + "from": [6, 14, 6.63], + "to": [7, 15, 11.25], + "rotation": {"angle": -45, "axis": "y", "origin": [6.5, 14.75, 9.25]}, + "faces": { + "north": {"uv": [0.5, 13, 0.75, 13.25], "texture": "#0"}, + "east": {"uv": [10.25, 5.75, 11.5, 6], "texture": "#0"}, + "south": {"uv": [0.75, 13, 1, 13.25], "texture": "#0"}, + "west": {"uv": [10.25, 8.5, 11.5, 8.75], "texture": "#0"}, + "up": {"uv": [10.25, 11.5, 10, 10.25], "texture": "#0"}, + "down": {"uv": [10.5, 10.25, 10.25, 11.5], "texture": "#0"} + } + }, + { + "from": [9, 14, 5.62], + "to": [10, 15, 9.25], + "rotation": {"angle": 45, "axis": "y", "origin": [9.5, 14.75, 7.25]}, + "faces": { + "north": {"uv": [1, 13, 1.25, 13.25], "texture": "#0"}, + "east": {"uv": [11.75, 7.75, 12.75, 8], "texture": "#0"}, + "south": {"uv": [1.25, 13, 1.5, 13.25], "texture": "#0"}, + "west": {"uv": [11.75, 8, 12.75, 8.25], "texture": "#0"}, + "up": {"uv": [9.25, 12.75, 9, 11.75], "texture": "#0"}, + "down": {"uv": [9.5, 11.75, 9.25, 12.75], "texture": "#0"} + } + }, + { + "from": [6, 14, 4.63], + "to": [7, 15, 9.25], + "rotation": {"angle": -45, "axis": "y", "origin": [6.5, 14.75, 7.25]}, + "faces": { + "north": {"uv": [13, 1.25, 13.25, 1.5], "texture": "#0"}, + "east": {"uv": [10.25, 8.75, 11.5, 9], "texture": "#0"}, + "south": {"uv": [1.5, 13, 1.75, 13.25], "texture": "#0"}, + "west": {"uv": [10.25, 9, 11.5, 9.25], "texture": "#0"}, + "up": {"uv": [10.75, 1.25, 10.5, 0], "texture": "#0"}, + "down": {"uv": [10.75, 1.25, 10.5, 2.5], "texture": "#0"} + } + }, + { + "from": [14, 4.75, 6], + "to": [15, 8.38, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [14.5, 6.75, 6.5]}, + "faces": { + "north": {"uv": [9.5, 11.75, 9.75, 12.75], "texture": "#0"}, + "east": {"uv": [9.75, 11.75, 10, 12.75], "texture": "#0"}, + "south": {"uv": [10, 11.75, 10.25, 12.75], "texture": "#0"}, + "west": {"uv": [11.75, 10, 12, 11], "texture": "#0"}, + "up": {"uv": [13.25, 1.75, 13, 1.5], "texture": "#0"}, + "down": {"uv": [2, 13, 1.75, 13.25], "texture": "#0"} + } + }, + { + "from": [14, 4.75, 9], + "to": [15, 9.37, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [14.5, 6.75, 9.5]}, + "faces": { + "north": {"uv": [10.5, 2.5, 10.75, 3.75], "texture": "#0"}, + "east": {"uv": [3, 10.5, 3.25, 11.75], "texture": "#0"}, + "south": {"uv": [3.25, 10.5, 3.5, 11.75], "texture": "#0"}, + "west": {"uv": [3.5, 10.5, 3.75, 11.75], "texture": "#0"}, + "up": {"uv": [13.25, 2, 13, 1.75], "texture": "#0"}, + "down": {"uv": [2.25, 13, 2, 13.25], "texture": "#0"} + } + }, + { + "from": [14, 6.75, 6], + "to": [15, 10.38, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [14.5, 8.75, 6.5]}, + "faces": { + "north": {"uv": [10.25, 11.75, 10.5, 12.75], "texture": "#0"}, + "east": {"uv": [10.5, 11.75, 10.75, 12.75], "texture": "#0"}, + "south": {"uv": [10.75, 11.75, 11, 12.75], "texture": "#0"}, + "west": {"uv": [11.5, 11.75, 11.75, 12.75], "texture": "#0"}, + "up": {"uv": [13.25, 2.25, 13, 2], "texture": "#0"}, + "down": {"uv": [2.5, 13, 2.25, 13.25], "texture": "#0"} + } + }, + { + "from": [14, 6.75, 9], + "to": [15, 11.37, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [14.5, 8.75, 9.5]}, + "faces": { + "north": {"uv": [3.75, 10.5, 4, 11.75], "texture": "#0"}, + "east": {"uv": [10.5, 4.5, 10.75, 5.75], "texture": "#0"}, + "south": {"uv": [10.5, 7.25, 10.75, 8.5], "texture": "#0"}, + "west": {"uv": [10.5, 10, 10.75, 11.25], "texture": "#0"}, + "up": {"uv": [13.25, 2.5, 13, 2.25], "texture": "#0"}, + "down": {"uv": [2.75, 13, 2.5, 13.25], "texture": "#0"} + } + }, + { + "from": [9, 4.75, 14], + "to": [10, 8.38, 15], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 6.75, 14.5]}, + "faces": { + "north": {"uv": [11.75, 11.75, 12, 12.75], "texture": "#0"}, + "east": {"uv": [0.5, 12, 0.75, 13], "texture": "#0"}, + "south": {"uv": [0.75, 12, 1, 13], "texture": "#0"}, + "west": {"uv": [1, 12, 1.25, 13], "texture": "#0"}, + "up": {"uv": [13.25, 2.75, 13, 2.5], "texture": "#0"}, + "down": {"uv": [3, 13, 2.75, 13.25], "texture": "#0"} + } + }, + { + "from": [6, 6.75, 14], + "to": [7, 11.37, 15], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 8.75, 14.5]}, + "faces": { + "north": {"uv": [10.75, 0, 11, 1.25], "texture": "#0"}, + "east": {"uv": [10.75, 1.25, 11, 2.5], "texture": "#0"}, + "south": {"uv": [10.75, 2.5, 11, 3.75], "texture": "#0"}, + "west": {"uv": [10.75, 4.5, 11, 5.75], "texture": "#0"}, + "up": {"uv": [13.25, 3, 13, 2.75], "texture": "#0"}, + "down": {"uv": [3.25, 13, 3, 13.25], "texture": "#0"} + } + }, + { + "from": [9, 6.75, 14], + "to": [10, 10.38, 15], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 8.75, 14.5]}, + "faces": { + "north": {"uv": [12, 1, 12.25, 2], "texture": "#0"}, + "east": {"uv": [1.25, 12, 1.5, 13], "texture": "#0"}, + "south": {"uv": [2, 12, 2.25, 13], "texture": "#0"}, + "west": {"uv": [12, 2, 12.25, 3], "texture": "#0"}, + "up": {"uv": [13.25, 3.25, 13, 3], "texture": "#0"}, + "down": {"uv": [3.5, 13, 3.25, 13.25], "texture": "#0"} + } + }, + { + "from": [9, 4.75, 1], + "to": [10, 9.37, 2], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 6.75, 1.5]}, + "faces": { + "north": {"uv": [10.75, 7.25, 11, 8.5], "texture": "#0"}, + "east": {"uv": [10.75, 10, 11, 11.25], "texture": "#0"}, + "south": {"uv": [11, 0, 11.25, 1.25], "texture": "#0"}, + "west": {"uv": [11, 1.25, 11.25, 2.5], "texture": "#0"}, + "up": {"uv": [13.25, 3.75, 13, 3.5], "texture": "#0"}, + "down": {"uv": [13.25, 3.75, 13, 4], "texture": "#0"} + } + }, + { + "from": [6, 6.75, 1], + "to": [7, 10.38, 2], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 8.75, 1.5]}, + "faces": { + "north": {"uv": [2.25, 12, 2.5, 13], "texture": "#0"}, + "east": {"uv": [2.5, 12, 2.75, 13], "texture": "#0"}, + "south": {"uv": [2.75, 12, 3, 13], "texture": "#0"}, + "west": {"uv": [12, 3, 12.25, 4], "texture": "#0"}, + "up": {"uv": [4.25, 13.25, 4, 13], "texture": "#0"}, + "down": {"uv": [13.25, 4, 13, 4.25], "texture": "#0"} + } + }, + { + "from": [9, 6.75, 1], + "to": [10, 11.37, 2], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 8.75, 1.5]}, + "faces": { + "north": {"uv": [11, 2.5, 11.25, 3.75], "texture": "#0"}, + "east": {"uv": [11, 4.5, 11.25, 5.75], "texture": "#0"}, + "south": {"uv": [11, 7.25, 11.25, 8.5], "texture": "#0"}, + "west": {"uv": [11, 10, 11.25, 11.25], "texture": "#0"}, + "up": {"uv": [13.25, 4.5, 13, 4.25], "texture": "#0"}, + "down": {"uv": [13.25, 4.5, 13, 4.75], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "ornaments", + "origin": [3, 8, 3], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + }, + { + "name": "center", + "origin": [8, 8, 8], + "color": 0, + "children": [32, 33, 34] + }, + { + "name": "plates", + "origin": [8, 8, 8], + "color": 0, + "children": [35, 36, 37, 38, 39, 40] + }, + { + "name": "symbol", + "origin": [6, 8, 1], + "color": 0, + "children": [41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60] + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_3.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_3.json new file mode 100644 index 00000000..c721e553 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_3.json @@ -0,0 +1,961 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utilitiesinexcess:upgrade_speed_3", + "particle": "utilitiesinexcess:upgrade_speed_3" + }, + "elements": [ + { + "from": [2, 7, 3], + "to": [4, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.5, 4, 8, 4.5], "texture": "#0"}, + "east": {"uv": [12, 9.5, 12.25, 10], "texture": "#0"}, + "south": {"uv": [7.5, 4.5, 8, 5], "texture": "#0"}, + "west": {"uv": [12.25, 5, 12.5, 5.5], "texture": "#0"}, + "up": {"uv": [13, 5.25, 12.5, 5], "texture": "#0"}, + "down": {"uv": [13, 5.25, 12.5, 5.5], "texture": "#0"} + } + }, + { + "from": [3, 7, 2], + "to": [4, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 9.5, 12.5, 10], "texture": "#0"}, + "east": {"uv": [12.5, 10.5, 12.75, 11], "texture": "#0"}, + "south": {"uv": [10.75, 12.5, 11, 13], "texture": "#0"}, + "west": {"uv": [11, 12.5, 11.25, 13], "texture": "#0"}, + "up": {"uv": [13.5, 0.25, 13.25, 0], "texture": "#0"}, + "down": {"uv": [0.5, 13.25, 0.25, 13.5], "texture": "#0"} + } + }, + { + "from": [3, 11, 3], + "to": [4, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 11, 12.75, 11.5], "texture": "#0"}, + "east": {"uv": [11.25, 12.5, 11.5, 13], "texture": "#0"}, + "south": {"uv": [11.5, 12.5, 11.75, 13], "texture": "#0"}, + "west": {"uv": [12.5, 11.5, 12.75, 12], "texture": "#0"}, + "up": {"uv": [13.5, 0.5, 13.25, 0.25], "texture": "#0"}, + "down": {"uv": [0.75, 13.25, 0.5, 13.5], "texture": "#0"} + } + }, + { + "from": [3, 3, 3], + "to": [4, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 12.5, 12, 13], "texture": "#0"}, + "east": {"uv": [12, 12.5, 12.25, 13], "texture": "#0"}, + "south": {"uv": [12.5, 12, 12.75, 12.5], "texture": "#0"}, + "west": {"uv": [12.25, 12.5, 12.5, 13], "texture": "#0"}, + "up": {"uv": [13.5, 0.75, 13.25, 0.5], "texture": "#0"}, + "down": {"uv": [1, 13.25, 0.75, 13.5], "texture": "#0"} + } + }, + { + "from": [3, 7, 12], + "to": [4, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 12.5, 12.75, 13], "texture": "#0"}, + "east": {"uv": [10.5, 4.75, 11, 5.25], "texture": "#0"}, + "south": {"uv": [0, 12.75, 0.25, 13.25], "texture": "#0"}, + "west": {"uv": [10.5, 5.25, 11, 5.75], "texture": "#0"}, + "up": {"uv": [13, 0.5, 12.75, 0], "texture": "#0"}, + "down": {"uv": [0.5, 12.75, 0.25, 13.25], "texture": "#0"} + } + }, + { + "from": [2, 7, 12], + "to": [3, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0.5, 12.75, 0.75, 13.25], "texture": "#0"}, + "east": {"uv": [12.75, 0.5, 13, 1], "texture": "#0"}, + "south": {"uv": [0.75, 12.75, 1, 13.25], "texture": "#0"}, + "west": {"uv": [1, 12.75, 1.25, 13.25], "texture": "#0"}, + "up": {"uv": [13.5, 1, 13.25, 0.75], "texture": "#0"}, + "down": {"uv": [1.25, 13.25, 1, 13.5], "texture": "#0"} + } + }, + { + "from": [3, 11, 12], + "to": [4, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1.25, 12.75, 1.5, 13.25], "texture": "#0"}, + "east": {"uv": [1.5, 12.75, 1.75, 13.25], "texture": "#0"}, + "south": {"uv": [1.75, 12.75, 2, 13.25], "texture": "#0"}, + "west": {"uv": [12.75, 2, 13, 2.5], "texture": "#0"}, + "up": {"uv": [13.5, 1.25, 13.25, 1], "texture": "#0"}, + "down": {"uv": [1.5, 13.25, 1.25, 13.5], "texture": "#0"} + } + }, + { + "from": [3, 3, 12], + "to": [4, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 2.5, 13, 3], "texture": "#0"}, + "east": {"uv": [12.75, 3, 13, 3.5], "texture": "#0"}, + "south": {"uv": [12.75, 3.5, 13, 4], "texture": "#0"}, + "west": {"uv": [12.75, 4, 13, 4.5], "texture": "#0"}, + "up": {"uv": [13.5, 1.5, 13.25, 1.25], "texture": "#0"}, + "down": {"uv": [1.75, 13.25, 1.5, 13.5], "texture": "#0"} + } + }, + { + "from": [12, 7, 12], + "to": [14, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11, 4.75, 11.5, 5.25], "texture": "#0"}, + "east": {"uv": [12.75, 4.5, 13, 5], "texture": "#0"}, + "south": {"uv": [11, 5.25, 11.5, 5.75], "texture": "#0"}, + "west": {"uv": [12.75, 5.5, 13, 6], "texture": "#0"}, + "up": {"uv": [13.25, 6.25, 12.75, 6], "texture": "#0"}, + "down": {"uv": [13.25, 6.25, 12.75, 6.5], "texture": "#0"} + } + }, + { + "from": [12, 7, 13], + "to": [13, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 6.5, 13, 7], "texture": "#0"}, + "east": {"uv": [12.75, 7, 13, 7.5], "texture": "#0"}, + "south": {"uv": [12.75, 7.5, 13, 8], "texture": "#0"}, + "west": {"uv": [12.75, 8.25, 13, 8.75], "texture": "#0"}, + "up": {"uv": [13.5, 1.75, 13.25, 1.5], "texture": "#0"}, + "down": {"uv": [2, 13.25, 1.75, 13.5], "texture": "#0"} + } + }, + { + "from": [12, 11, 12], + "to": [13, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 8.75, 13, 9.25], "texture": "#0"}, + "east": {"uv": [12.75, 9.5, 13, 10], "texture": "#0"}, + "south": {"uv": [12.75, 10, 13, 10.5], "texture": "#0"}, + "west": {"uv": [12.75, 10.5, 13, 11], "texture": "#0"}, + "up": {"uv": [13.5, 2, 13.25, 1.75], "texture": "#0"}, + "down": {"uv": [13.5, 2, 13.25, 2.25], "texture": "#0"} + } + }, + { + "from": [12, 3, 12], + "to": [13, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 11, 13, 11.5], "texture": "#0"}, + "east": {"uv": [12.75, 11.5, 13, 12], "texture": "#0"}, + "south": {"uv": [12.75, 12, 13, 12.5], "texture": "#0"}, + "west": {"uv": [12.75, 12.5, 13, 13], "texture": "#0"}, + "up": {"uv": [13.5, 2.5, 13.25, 2.25], "texture": "#0"}, + "down": {"uv": [13.5, 2.5, 13.25, 2.75], "texture": "#0"} + } + }, + { + "from": [12, 7, 2], + "to": [13, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13, 0, 13.25, 0.5], "texture": "#0"}, + "east": {"uv": [6.25, 11.5, 6.75, 12], "texture": "#0"}, + "south": {"uv": [13, 0.5, 13.25, 1], "texture": "#0"}, + "west": {"uv": [6.75, 11.5, 7.25, 12], "texture": "#0"}, + "up": {"uv": [13.25, 1.5, 13, 1], "texture": "#0"}, + "down": {"uv": [13.25, 1.5, 13, 2], "texture": "#0"} + } + }, + { + "from": [13, 7, 3], + "to": [14, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 13, 2.25, 13.5], "texture": "#0"}, + "east": {"uv": [13, 2, 13.25, 2.5], "texture": "#0"}, + "south": {"uv": [2.25, 13, 2.5, 13.5], "texture": "#0"}, + "west": {"uv": [2.5, 13, 2.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 3, 13.25, 2.75], "texture": "#0"}, + "down": {"uv": [13.5, 3, 13.25, 3.25], "texture": "#0"} + } + }, + { + "from": [12, 11, 3], + "to": [13, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13, 2.5, 13.25, 3], "texture": "#0"}, + "east": {"uv": [2.75, 13, 3, 13.5], "texture": "#0"}, + "south": {"uv": [3, 13, 3.25, 13.5], "texture": "#0"}, + "west": {"uv": [13, 3, 13.25, 3.5], "texture": "#0"}, + "up": {"uv": [13.5, 3.5, 13.25, 3.25], "texture": "#0"}, + "down": {"uv": [13.5, 3.5, 13.25, 3.75], "texture": "#0"} + } + }, + { + "from": [12, 3, 3], + "to": [13, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3.25, 13, 3.5, 13.5], "texture": "#0"}, + "east": {"uv": [3.5, 13, 3.75, 13.5], "texture": "#0"}, + "south": {"uv": [13, 3.5, 13.25, 4], "texture": "#0"}, + "west": {"uv": [3.75, 13, 4, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 4, 13.25, 3.75], "texture": "#0"}, + "down": {"uv": [13.5, 4, 13.25, 4.25], "texture": "#0"} + } + }, + { + "from": [7, 12, 2], + "to": [9, 14, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 7.25, 12, 7.75], "texture": "#0"}, + "east": {"uv": [4, 13, 4.25, 13.5], "texture": "#0"}, + "south": {"uv": [11.5, 7.75, 12, 8.25], "texture": "#0"}, + "west": {"uv": [13, 4, 13.25, 4.5], "texture": "#0"}, + "up": {"uv": [4.75, 13.25, 4.25, 13], "texture": "#0"}, + "down": {"uv": [13.5, 4.5, 13, 4.75], "texture": "#0"} + } + }, + { + "from": [7, 13, 3], + "to": [9, 14, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4.75, 13, 5.25, 13.25], "texture": "#0"}, + "east": {"uv": [4.25, 13.25, 4.5, 13.5], "texture": "#0"}, + "south": {"uv": [13, 4.75, 13.5, 5], "texture": "#0"}, + "west": {"uv": [13.25, 4.25, 13.5, 4.5], "texture": "#0"}, + "up": {"uv": [13.5, 5.25, 13, 5], "texture": "#0"}, + "down": {"uv": [13.5, 5.25, 13, 5.5], "texture": "#0"} + } + }, + { + "from": [13, 12, 7], + "to": [14, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13, 5.5, 13.25, 6], "texture": "#0"}, + "east": {"uv": [11.5, 8.25, 12, 8.75], "texture": "#0"}, + "south": {"uv": [6.25, 13, 6.5, 13.5], "texture": "#0"}, + "west": {"uv": [8.5, 11.5, 9, 12], "texture": "#0"}, + "up": {"uv": [13.25, 7, 13, 6.5], "texture": "#0"}, + "down": {"uv": [13.25, 7, 13, 7.5], "texture": "#0"} + } + }, + { + "from": [12, 13, 7], + "to": [13, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4.5, 13.25, 4.75, 13.5], "texture": "#0"}, + "east": {"uv": [13, 7.5, 13.5, 7.75], "texture": "#0"}, + "south": {"uv": [4.75, 13.25, 5, 13.5], "texture": "#0"}, + "west": {"uv": [13, 7.75, 13.5, 8], "texture": "#0"}, + "up": {"uv": [7.75, 13.5, 7.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 8, 13, 8.5], "texture": "#0"} + } + }, + { + "from": [7, 12, 13], + "to": [9, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 8.75, 12, 9.25], "texture": "#0"}, + "east": {"uv": [13, 8.5, 13.25, 9], "texture": "#0"}, + "south": {"uv": [9, 11.5, 9.5, 12], "texture": "#0"}, + "west": {"uv": [8.75, 13, 9, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 9.25, 13, 9], "texture": "#0"}, + "down": {"uv": [13.5, 9.25, 13, 9.5], "texture": "#0"} + } + }, + { + "from": [7, 13, 12], + "to": [9, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13, 9.5, 13.5, 9.75], "texture": "#0"}, + "east": {"uv": [5, 13.25, 5.25, 13.5], "texture": "#0"}, + "south": {"uv": [13, 9.75, 13.5, 10], "texture": "#0"}, + "west": {"uv": [5.25, 13.25, 5.5, 13.5], "texture": "#0"}, + "up": {"uv": [10.5, 13.25, 10, 13], "texture": "#0"}, + "down": {"uv": [13.5, 10, 13, 10.25], "texture": "#0"} + } + }, + { + "from": [2, 12, 7], + "to": [3, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13, 10.25, 13.25, 10.75], "texture": "#0"}, + "east": {"uv": [9.5, 11.5, 10, 12], "texture": "#0"}, + "south": {"uv": [10.75, 13, 11, 13.5], "texture": "#0"}, + "west": {"uv": [10, 11.5, 10.5, 12], "texture": "#0"}, + "up": {"uv": [13.25, 11.25, 13, 10.75], "texture": "#0"}, + "down": {"uv": [11.25, 13, 11, 13.5], "texture": "#0"} + } + }, + { + "from": [3, 13, 7], + "to": [4, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.5, 13.25, 5.75, 13.5], "texture": "#0"}, + "east": {"uv": [11.25, 13, 11.75, 13.25], "texture": "#0"}, + "south": {"uv": [13.25, 5.5, 13.5, 5.75], "texture": "#0"}, + "west": {"uv": [13, 11.25, 13.5, 11.5], "texture": "#0"}, + "up": {"uv": [13.25, 12, 13, 11.5], "texture": "#0"}, + "down": {"uv": [12, 13, 11.75, 13.5], "texture": "#0"} + } + }, + { + "from": [3, 2, 6], + "to": [4, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.75, 13.25, 6, 13.5], "texture": "#0"}, + "east": {"uv": [11.5, 10, 12.5, 10.25], "texture": "#0"}, + "south": {"uv": [13.25, 5.75, 13.5, 6], "texture": "#0"}, + "west": {"uv": [11.5, 10.25, 12.5, 10.5], "texture": "#0"}, + "up": {"uv": [11.75, 11.5, 11.5, 10.5], "texture": "#0"}, + "down": {"uv": [11.75, 11.5, 11.5, 12.5], "texture": "#0"} + } + }, + { + "from": [2, 2, 6], + "to": [3, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 13, 12.25, 13.5], "texture": "#0"}, + "east": {"uv": [6.5, 4, 7.5, 4.5], "texture": "#0"}, + "south": {"uv": [13, 12, 13.25, 12.5], "texture": "#0"}, + "west": {"uv": [6.5, 4.5, 7.5, 5], "texture": "#0"}, + "up": {"uv": [12, 1, 11.75, 0], "texture": "#0"}, + "down": {"uv": [12, 1, 11.75, 2], "texture": "#0"} + } + }, + { + "from": [6, 2, 12], + "to": [10, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 2, 12.75, 2.25], "texture": "#0"}, + "east": {"uv": [6, 13.25, 6.25, 13.5], "texture": "#0"}, + "south": {"uv": [11.75, 2.25, 12.75, 2.5], "texture": "#0"}, + "west": {"uv": [13.25, 6, 13.5, 6.25], "texture": "#0"}, + "up": {"uv": [12.75, 2.75, 11.75, 2.5], "texture": "#0"}, + "down": {"uv": [12.75, 2.75, 11.75, 3], "texture": "#0"} + } + }, + { + "from": [6, 2, 13], + "to": [10, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 9.5, 4, 10], "texture": "#0"}, + "east": {"uv": [12.25, 13, 12.5, 13.5], "texture": "#0"}, + "south": {"uv": [4, 9.5, 5, 10], "texture": "#0"}, + "west": {"uv": [12.5, 13, 12.75, 13.5], "texture": "#0"}, + "up": {"uv": [4, 12, 3, 11.75], "texture": "#0"}, + "down": {"uv": [12.75, 3, 11.75, 3.25], "texture": "#0"} + } + }, + { + "from": [12, 2, 6], + "to": [13, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 6.25, 13.5, 6.5], "texture": "#0"}, + "east": {"uv": [11.75, 3.25, 12.75, 3.5], "texture": "#0"}, + "south": {"uv": [6.5, 13.25, 6.75, 13.5], "texture": "#0"}, + "west": {"uv": [11.75, 3.5, 12.75, 3.75], "texture": "#0"}, + "up": {"uv": [12, 5.5, 11.75, 4.5], "texture": "#0"}, + "down": {"uv": [12, 10.5, 11.75, 11.5], "texture": "#0"} + } + }, + { + "from": [13, 2, 6], + "to": [14, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13, 12.5, 13.25, 13], "texture": "#0"}, + "east": {"uv": [5, 9.5, 6, 10], "texture": "#0"}, + "south": {"uv": [12.75, 13, 13, 13.5], "texture": "#0"}, + "west": {"uv": [6, 9.5, 7, 10], "texture": "#0"}, + "up": {"uv": [12, 12.5, 11.75, 11.5], "texture": "#0"}, + "down": {"uv": [12.25, 0, 12, 1], "texture": "#0"} + } + }, + { + "from": [6, 2, 3], + "to": [10, 3, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 3.75, 12.75, 4], "texture": "#0"}, + "east": {"uv": [13.25, 6.5, 13.5, 6.75], "texture": "#0"}, + "south": {"uv": [11.75, 5.5, 12.75, 5.75], "texture": "#0"}, + "west": {"uv": [6.75, 13.25, 7, 13.5], "texture": "#0"}, + "up": {"uv": [12.75, 6, 11.75, 5.75], "texture": "#0"}, + "down": {"uv": [13, 1, 12, 1.25], "texture": "#0"} + } + }, + { + "from": [6, 2, 2], + "to": [10, 4, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 9.5, 8, 10], "texture": "#0"}, + "east": {"uv": [13, 13, 13.25, 13.5], "texture": "#0"}, + "south": {"uv": [3, 10, 4, 10.5], "texture": "#0"}, + "west": {"uv": [0, 13.25, 0.25, 13.75], "texture": "#0"}, + "up": {"uv": [13, 1.5, 12, 1.25], "texture": "#0"}, + "down": {"uv": [13, 1.5, 12, 1.75], "texture": "#0"} + } + }, + { + "from": [12, 3, 4], + "to": [13, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 9.5, 2.25, 12], "texture": "#0"}, + "east": {"uv": [2.5, 0, 4.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.25, 9.5, 2.5, 12], "texture": "#0"}, + "west": {"uv": [2.5, 2.5, 4.5, 5], "texture": "#0"}, + "up": {"uv": [4.25, 12, 4, 10], "texture": "#0"}, + "down": {"uv": [10.25, 4, 10, 6], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [4, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.5, 9.5, 2.75, 12], "texture": "#0"}, + "east": {"uv": [4.5, 0, 6.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.75, 9.5, 3, 12], "texture": "#0"}, + "west": {"uv": [4.5, 2.5, 6.5, 5], "texture": "#0"}, + "up": {"uv": [4.5, 12, 4.25, 10], "texture": "#0"}, + "down": {"uv": [4.75, 10, 4.5, 12], "texture": "#0"} + } + }, + { + "name": "base", + "from": [4, 3, 3], + "to": [12, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 5, 2, 7.5], "texture": "#0"}, + "east": {"uv": [0, 0, 2.5, 2.5], "texture": "#0"}, + "south": {"uv": [2, 5, 4, 7.5], "texture": "#0"}, + "west": {"uv": [0, 2.5, 2.5, 5], "texture": "#0"}, + "up": {"uv": [6, 7.5, 4, 5], "texture": "#0"}, + "down": {"uv": [8, 5, 6, 7.5], "texture": "#0"} + } + }, + { + "from": [4, 4, 13], + "to": [12, 12, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.5, 0, 8.5, 2], "texture": "#0"}, + "east": {"uv": [4.75, 10, 5, 12], "texture": "#0"}, + "south": {"uv": [6.5, 2, 8.5, 4], "texture": "#0"}, + "west": {"uv": [5, 10, 5.25, 12], "texture": "#0"}, + "up": {"uv": [7.25, 10.25, 5.25, 10], "texture": "#0"}, + "down": {"uv": [12, 6, 10, 6.25], "texture": "#0"} + } + }, + { + "from": [4, 13, 4], + "to": [12, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 6.25, 12, 6.5], "texture": "#0"}, + "east": {"uv": [10, 6.5, 12, 6.75], "texture": "#0"}, + "south": {"uv": [10, 6.75, 12, 7], "texture": "#0"}, + "west": {"uv": [10, 7, 12, 7.25], "texture": "#0"}, + "up": {"uv": [2, 9.5, 0, 7.5], "texture": "#0"}, + "down": {"uv": [4, 7.5, 2, 9.5], "texture": "#0"} + } + }, + { + "from": [13, 4, 4], + "to": [14, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.25, 10, 7.5, 12], "texture": "#0"}, + "east": {"uv": [4, 7.5, 6, 9.5], "texture": "#0"}, + "south": {"uv": [10, 7.25, 10.25, 9.25], "texture": "#0"}, + "west": {"uv": [6, 7.5, 8, 9.5], "texture": "#0"}, + "up": {"uv": [7.75, 12, 7.5, 10], "texture": "#0"}, + "down": {"uv": [8, 10, 7.75, 12], "texture": "#0"} + } + }, + { + "from": [4, 4, 2], + "to": [12, 12, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 4, 10, 6], "texture": "#0"}, + "east": {"uv": [8, 10, 8.25, 12], "texture": "#0"}, + "south": {"uv": [8, 6, 10, 8], "texture": "#0"}, + "west": {"uv": [8.25, 10, 8.5, 12], "texture": "#0"}, + "up": {"uv": [10.5, 10.25, 8.5, 10], "texture": "#0"}, + "down": {"uv": [12, 9.25, 10, 9.5], "texture": "#0"} + } + }, + { + "from": [4, 2, 4], + "to": [12, 3, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.5, 12, 9.75], "texture": "#0"}, + "east": {"uv": [10, 9.75, 12, 10], "texture": "#0"}, + "south": {"uv": [10.25, 4, 12.25, 4.25], "texture": "#0"}, + "west": {"uv": [10.25, 4.25, 12.25, 4.5], "texture": "#0"}, + "up": {"uv": [10, 10, 8, 8], "texture": "#0"}, + "down": {"uv": [10.5, 0, 8.5, 2], "texture": "#0"} + } + }, + { + "from": [2, 4, 4], + "to": [3, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.25, 10.25, 5.5, 12.25], "texture": "#0"}, + "east": {"uv": [8.5, 2, 10.5, 4], "texture": "#0"}, + "south": {"uv": [5.5, 10.25, 5.75, 12.25], "texture": "#0"}, + "west": {"uv": [0, 9.5, 2, 11.5], "texture": "#0"}, + "up": {"uv": [6, 12.25, 5.75, 10.25], "texture": "#0"}, + "down": {"uv": [6.25, 10.25, 6, 12.25], "texture": "#0"} + } + }, + { + "from": [6, 5.75, 1], + "to": [7, 9.38, 2], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 7.75, 1.5]}, + "faces": { + "north": {"uv": [2, 12, 2.25, 13], "texture": "#0"}, + "east": {"uv": [2.25, 12, 2.5, 13], "texture": "#0"}, + "south": {"uv": [2.5, 12, 2.75, 13], "texture": "#0"}, + "west": {"uv": [2.75, 12, 3, 13], "texture": "#0"}, + "up": {"uv": [13.5, 7, 13.25, 6.75], "texture": "#0"}, + "down": {"uv": [7.25, 13.25, 7, 13.5], "texture": "#0"} + } + }, + { + "from": [1, 5.75, 6], + "to": [2, 10.37, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [1.5, 7.75, 6.5]}, + "faces": { + "north": {"uv": [10.25, 4.5, 10.5, 5.75], "texture": "#0"}, + "east": {"uv": [6.25, 10.25, 6.5, 11.5], "texture": "#0"}, + "south": {"uv": [6.5, 10.25, 6.75, 11.5], "texture": "#0"}, + "west": {"uv": [6.75, 10.25, 7, 11.5], "texture": "#0"}, + "up": {"uv": [13.5, 7.25, 13.25, 7], "texture": "#0"}, + "down": {"uv": [7.5, 13.25, 7.25, 13.5], "texture": "#0"} + } + }, + { + "from": [1, 7.75, 9], + "to": [2, 11.38, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [1.5, 9.75, 9.5]}, + "faces": { + "north": {"uv": [3, 12, 3.25, 13], "texture": "#0"}, + "east": {"uv": [3.25, 12, 3.5, 13], "texture": "#0"}, + "south": {"uv": [3.5, 12, 3.75, 13], "texture": "#0"}, + "west": {"uv": [3.75, 12, 4, 13], "texture": "#0"}, + "up": {"uv": [13.5, 7.5, 13.25, 7.25], "texture": "#0"}, + "down": {"uv": [8, 13.25, 7.75, 13.5], "texture": "#0"} + } + }, + { + "from": [1, 7.75, 6], + "to": [2, 12.37, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [1.5, 9.75, 6.5]}, + "faces": { + "north": {"uv": [7, 10.25, 7.25, 11.5], "texture": "#0"}, + "east": {"uv": [10.25, 7.25, 10.5, 8.5], "texture": "#0"}, + "south": {"uv": [8.5, 10.25, 8.75, 11.5], "texture": "#0"}, + "west": {"uv": [8.75, 10.25, 9, 11.5], "texture": "#0"}, + "up": {"uv": [8.25, 13.5, 8, 13.25], "texture": "#0"}, + "down": {"uv": [13.5, 8, 13.25, 8.25], "texture": "#0"} + } + }, + { + "from": [1, 3.75, 9], + "to": [2, 7.38, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [1.5, 5.75, 9.5]}, + "faces": { + "north": {"uv": [4, 12, 4.25, 13], "texture": "#0"}, + "east": {"uv": [4.25, 12, 4.5, 13], "texture": "#0"}, + "south": {"uv": [4.5, 12, 4.75, 13], "texture": "#0"}, + "west": {"uv": [12, 4.5, 12.25, 5.5], "texture": "#0"}, + "up": {"uv": [8.5, 13.5, 8.25, 13.25], "texture": "#0"}, + "down": {"uv": [13.5, 8.25, 13.25, 8.5], "texture": "#0"} + } + }, + { + "from": [1, 3.75, 6], + "to": [2, 8.37, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [1.5, 5.75, 6.5]}, + "faces": { + "north": {"uv": [9, 10.25, 9.25, 11.5], "texture": "#0"}, + "east": {"uv": [9.25, 10.25, 9.5, 11.5], "texture": "#0"}, + "south": {"uv": [9.5, 10.25, 9.75, 11.5], "texture": "#0"}, + "west": {"uv": [9.75, 10.25, 10, 11.5], "texture": "#0"}, + "up": {"uv": [8.75, 13.5, 8.5, 13.25], "texture": "#0"}, + "down": {"uv": [13.5, 8.5, 13.25, 8.75], "texture": "#0"} + } + }, + { + "from": [1, 5.75, 9], + "to": [2, 9.38, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [1.5, 7.75, 9.5]}, + "faces": { + "north": {"uv": [4.75, 12, 5, 13], "texture": "#0"}, + "east": {"uv": [5, 12, 5.25, 13], "texture": "#0"}, + "south": {"uv": [12, 6, 12.25, 7], "texture": "#0"}, + "west": {"uv": [6.25, 12, 6.5, 13], "texture": "#0"}, + "up": {"uv": [13.5, 9, 13.25, 8.75], "texture": "#0"}, + "down": {"uv": [9.25, 13.25, 9, 13.5], "texture": "#0"} + } + }, + { + "from": [6, 5.75, 14], + "to": [7, 10.37, 15], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 7.75, 14.5]}, + "faces": { + "north": {"uv": [10, 10.25, 10.25, 11.5], "texture": "#0"}, + "east": {"uv": [10.25, 10.25, 10.5, 11.5], "texture": "#0"}, + "south": {"uv": [10.5, 0, 10.75, 1.25], "texture": "#0"}, + "west": {"uv": [10.5, 1.25, 10.75, 2.5], "texture": "#0"}, + "up": {"uv": [9.5, 13.5, 9.25, 13.25], "texture": "#0"}, + "down": {"uv": [9.75, 13.25, 9.5, 13.5], "texture": "#0"} + } + }, + { + "from": [9, 14, 6.62], + "to": [10, 15, 10.25], + "rotation": {"angle": 45, "axis": "y", "origin": [9.5, 14.75, 8.25]}, + "faces": { + "north": {"uv": [9.75, 13.25, 10, 13.5], "texture": "#0"}, + "east": {"uv": [12, 1.75, 13, 2], "texture": "#0"}, + "south": {"uv": [10, 13.25, 10.25, 13.5], "texture": "#0"}, + "west": {"uv": [6.5, 12, 7.5, 12.25], "texture": "#0"}, + "up": {"uv": [12.25, 8, 12, 7], "texture": "#0"}, + "down": {"uv": [7.75, 12, 7.5, 13], "texture": "#0"} + } + }, + { + "from": [6, 14, 5.63], + "to": [7, 15, 10.25], + "rotation": {"angle": -45, "axis": "y", "origin": [6.5, 14.75, 8.25]}, + "faces": { + "north": {"uv": [10.25, 13.25, 10.5, 13.5], "texture": "#0"}, + "east": {"uv": [10.25, 5.75, 11.5, 6], "texture": "#0"}, + "south": {"uv": [13.25, 10.25, 13.5, 10.5], "texture": "#0"}, + "west": {"uv": [10.25, 8.5, 11.5, 8.75], "texture": "#0"}, + "up": {"uv": [10.75, 3.75, 10.5, 2.5], "texture": "#0"}, + "down": {"uv": [3.25, 10.5, 3, 11.75], "texture": "#0"} + } + }, + { + "from": [9, 14, 4.62], + "to": [10, 15, 8.25], + "rotation": {"angle": 45, "axis": "y", "origin": [9.5, 14.75, 6.25]}, + "faces": { + "north": {"uv": [13.25, 10.5, 13.5, 10.75], "texture": "#0"}, + "east": {"uv": [7.75, 12, 8.75, 12.25], "texture": "#0"}, + "south": {"uv": [13.25, 10.75, 13.5, 11], "texture": "#0"}, + "west": {"uv": [12, 8, 13, 8.25], "texture": "#0"}, + "up": {"uv": [12.25, 9.25, 12, 8.25], "texture": "#0"}, + "down": {"uv": [9, 12, 8.75, 13], "texture": "#0"} + } + }, + { + "from": [6, 14, 3.63], + "to": [7, 15, 8.25], + "rotation": {"angle": -45, "axis": "y", "origin": [6.5, 14.75, 6.25]}, + "faces": { + "north": {"uv": [13.25, 11, 13.5, 11.25], "texture": "#0"}, + "east": {"uv": [10.25, 8.75, 11.5, 9], "texture": "#0"}, + "south": {"uv": [11.25, 13.25, 11.5, 13.5], "texture": "#0"}, + "west": {"uv": [10.25, 9, 11.5, 9.25], "texture": "#0"}, + "up": {"uv": [3.5, 11.75, 3.25, 10.5], "texture": "#0"}, + "down": {"uv": [3.75, 10.5, 3.5, 11.75], "texture": "#0"} + } + }, + { + "from": [9, 14, 8.62], + "to": [10, 15, 12.25], + "rotation": {"angle": 45, "axis": "y", "origin": [9.5, 14.75, 10.25]}, + "faces": { + "north": {"uv": [11.5, 13.25, 11.75, 13.5], "texture": "#0"}, + "east": {"uv": [9, 12, 10, 12.25], "texture": "#0"}, + "south": {"uv": [13.25, 11.5, 13.5, 11.75], "texture": "#0"}, + "west": {"uv": [12, 9.25, 13, 9.5], "texture": "#0"}, + "up": {"uv": [10.25, 13, 10, 12], "texture": "#0"}, + "down": {"uv": [10.5, 12, 10.25, 13], "texture": "#0"} + } + }, + { + "from": [6, 14, 7.63], + "to": [7, 15, 12.25], + "rotation": {"angle": -45, "axis": "y", "origin": [6.5, 14.75, 10.25]}, + "faces": { + "north": {"uv": [13.25, 11.75, 13.5, 12], "texture": "#0"}, + "east": {"uv": [10.5, 3.75, 11.75, 4], "texture": "#0"}, + "south": {"uv": [13.25, 12, 13.5, 12.25], "texture": "#0"}, + "west": {"uv": [10.5, 4.5, 11.75, 4.75], "texture": "#0"}, + "up": {"uv": [4, 11.75, 3.75, 10.5], "texture": "#0"}, + "down": {"uv": [10.75, 7.25, 10.5, 8.5], "texture": "#0"} + } + }, + { + "from": [14, 5.75, 6], + "to": [15, 9.38, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [14.5, 7.75, 6.5]}, + "faces": { + "north": {"uv": [12, 10.5, 12.25, 11.5], "texture": "#0"}, + "east": {"uv": [12, 11.5, 12.25, 12.5], "texture": "#0"}, + "south": {"uv": [12.25, 0, 12.5, 1], "texture": "#0"}, + "west": {"uv": [12.25, 4, 12.5, 5], "texture": "#0"}, + "up": {"uv": [13.5, 12.5, 13.25, 12.25], "texture": "#0"}, + "down": {"uv": [13.5, 12.5, 13.25, 12.75], "texture": "#0"} + } + }, + { + "from": [14, 5.75, 9], + "to": [15, 10.37, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [14.5, 7.75, 9.5]}, + "faces": { + "north": {"uv": [10.5, 10, 10.75, 11.25], "texture": "#0"}, + "east": {"uv": [10.75, 0, 11, 1.25], "texture": "#0"}, + "south": {"uv": [10.75, 1.25, 11, 2.5], "texture": "#0"}, + "west": {"uv": [10.75, 2.5, 11, 3.75], "texture": "#0"}, + "up": {"uv": [13.5, 13, 13.25, 12.75], "texture": "#0"}, + "down": {"uv": [13.5, 13, 13.25, 13.25], "texture": "#0"} + } + }, + { + "from": [14, 7.75, 6], + "to": [15, 11.38, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [14.5, 9.75, 6.5]}, + "faces": { + "north": {"uv": [5.25, 12.25, 5.5, 13.25], "texture": "#0"}, + "east": {"uv": [5.5, 12.25, 5.75, 13.25], "texture": "#0"}, + "south": {"uv": [5.75, 12.25, 6, 13.25], "texture": "#0"}, + "west": {"uv": [6, 12.25, 6.25, 13.25], "texture": "#0"}, + "up": {"uv": [13.5, 13.5, 13.25, 13.25], "texture": "#0"}, + "down": {"uv": [13.75, 0, 13.5, 0.25], "texture": "#0"} + } + }, + { + "from": [14, 7.75, 9], + "to": [15, 12.37, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [14.5, 9.75, 9.5]}, + "faces": { + "north": {"uv": [10.75, 7.25, 11, 8.5], "texture": "#0"}, + "east": {"uv": [10.75, 10, 11, 11.25], "texture": "#0"}, + "south": {"uv": [11, 0, 11.25, 1.25], "texture": "#0"}, + "west": {"uv": [11, 1.25, 11.25, 2.5], "texture": "#0"}, + "up": {"uv": [0.5, 13.75, 0.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 0.25, 13.5, 0.5], "texture": "#0"} + } + }, + { + "from": [14, 3.75, 6], + "to": [15, 7.38, 7], + "rotation": {"angle": 45, "axis": "x", "origin": [14.5, 5.75, 6.5]}, + "faces": { + "north": {"uv": [12.25, 6, 12.5, 7], "texture": "#0"}, + "east": {"uv": [6.5, 12.25, 6.75, 13.25], "texture": "#0"}, + "south": {"uv": [6.75, 12.25, 7, 13.25], "texture": "#0"}, + "west": {"uv": [7, 12.25, 7.25, 13.25], "texture": "#0"}, + "up": {"uv": [0.75, 13.75, 0.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 0.5, 13.5, 0.75], "texture": "#0"} + } + }, + { + "from": [14, 3.75, 9], + "to": [15, 8.37, 10], + "rotation": {"angle": -45, "axis": "x", "origin": [14.5, 5.75, 9.5]}, + "faces": { + "north": {"uv": [11, 2.5, 11.25, 3.75], "texture": "#0"}, + "east": {"uv": [11, 7.25, 11.25, 8.5], "texture": "#0"}, + "south": {"uv": [11, 10, 11.25, 11.25], "texture": "#0"}, + "west": {"uv": [11.25, 0, 11.5, 1.25], "texture": "#0"}, + "up": {"uv": [1, 13.75, 0.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 0.75, 13.5, 1], "texture": "#0"} + } + }, + { + "from": [9, 5.75, 14], + "to": [10, 9.38, 15], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 7.75, 14.5]}, + "faces": { + "north": {"uv": [12.25, 7, 12.5, 8], "texture": "#0"}, + "east": {"uv": [7.25, 12.25, 7.5, 13.25], "texture": "#0"}, + "south": {"uv": [7.75, 12.25, 8, 13.25], "texture": "#0"}, + "west": {"uv": [8, 12.25, 8.25, 13.25], "texture": "#0"}, + "up": {"uv": [1.25, 13.75, 1, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 1, 13.5, 1.25], "texture": "#0"} + } + }, + { + "from": [6, 7.75, 14], + "to": [7, 12.37, 15], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 9.75, 14.5]}, + "faces": { + "north": {"uv": [11.25, 1.25, 11.5, 2.5], "texture": "#0"}, + "east": {"uv": [11.25, 2.5, 11.5, 3.75], "texture": "#0"}, + "south": {"uv": [11.25, 7.25, 11.5, 8.5], "texture": "#0"}, + "west": {"uv": [11.25, 10, 11.5, 11.25], "texture": "#0"}, + "up": {"uv": [1.5, 13.75, 1.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 1.25, 13.5, 1.5], "texture": "#0"} + } + }, + { + "from": [9, 7.75, 14], + "to": [10, 11.38, 15], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 9.75, 14.5]}, + "faces": { + "north": {"uv": [8.25, 12.25, 8.5, 13.25], "texture": "#0"}, + "east": {"uv": [12.25, 8.25, 12.5, 9.25], "texture": "#0"}, + "south": {"uv": [8.5, 12.25, 8.75, 13.25], "texture": "#0"}, + "west": {"uv": [9, 12.25, 9.25, 13.25], "texture": "#0"}, + "up": {"uv": [1.75, 13.75, 1.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 1.5, 13.5, 1.75], "texture": "#0"} + } + }, + { + "from": [6, 3.75, 14], + "to": [7, 8.37, 15], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 5.75, 14.5]}, + "faces": { + "north": {"uv": [10.5, 11.25, 10.75, 12.5], "texture": "#0"}, + "east": {"uv": [10.75, 11.25, 11, 12.5], "texture": "#0"}, + "south": {"uv": [11, 11.25, 11.25, 12.5], "texture": "#0"}, + "west": {"uv": [11.25, 11.25, 11.5, 12.5], "texture": "#0"}, + "up": {"uv": [2, 13.75, 1.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 1.75, 13.5, 2], "texture": "#0"} + } + }, + { + "from": [9, 3.75, 14], + "to": [10, 7.38, 15], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 5.75, 14.5]}, + "faces": { + "north": {"uv": [9.25, 12.25, 9.5, 13.25], "texture": "#0"}, + "east": {"uv": [9.5, 12.25, 9.75, 13.25], "texture": "#0"}, + "south": {"uv": [9.75, 12.25, 10, 13.25], "texture": "#0"}, + "west": {"uv": [12.25, 10.5, 12.5, 11.5], "texture": "#0"}, + "up": {"uv": [2.25, 13.75, 2, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 2, 13.5, 2.25], "texture": "#0"} + } + }, + { + "from": [9, 5.75, 1], + "to": [10, 10.37, 2], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 7.75, 1.5]}, + "faces": { + "north": {"uv": [0, 11.5, 0.25, 12.75], "texture": "#0"}, + "east": {"uv": [11.5, 0, 11.75, 1.25], "texture": "#0"}, + "south": {"uv": [0.25, 11.5, 0.5, 12.75], "texture": "#0"}, + "west": {"uv": [0.5, 11.5, 0.75, 12.75], "texture": "#0"}, + "up": {"uv": [2.5, 13.75, 2.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 2.25, 13.5, 2.5], "texture": "#0"} + } + }, + { + "from": [6, 7.75, 1], + "to": [7, 11.38, 2], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 9.75, 1.5]}, + "faces": { + "north": {"uv": [12.25, 11.5, 12.5, 12.5], "texture": "#0"}, + "east": {"uv": [12.5, 0, 12.75, 1], "texture": "#0"}, + "south": {"uv": [12.5, 4, 12.75, 5], "texture": "#0"}, + "west": {"uv": [12.5, 6, 12.75, 7], "texture": "#0"}, + "up": {"uv": [2.75, 13.75, 2.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 2.5, 13.5, 2.75], "texture": "#0"} + } + }, + { + "from": [9, 7.75, 1], + "to": [10, 12.37, 2], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 9.75, 1.5]}, + "faces": { + "north": {"uv": [0.75, 11.5, 1, 12.75], "texture": "#0"}, + "east": {"uv": [1, 11.5, 1.25, 12.75], "texture": "#0"}, + "south": {"uv": [1.25, 11.5, 1.5, 12.75], "texture": "#0"}, + "west": {"uv": [11.5, 1.25, 11.75, 2.5], "texture": "#0"}, + "up": {"uv": [3, 13.75, 2.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 2.75, 13.5, 3], "texture": "#0"} + } + }, + { + "from": [6, 3.75, 1], + "to": [7, 7.38, 2], + "rotation": {"angle": -45, "axis": "z", "origin": [6.5, 5.75, 1.5]}, + "faces": { + "north": {"uv": [12.5, 7, 12.75, 8], "texture": "#0"}, + "east": {"uv": [12.5, 8.25, 12.75, 9.25], "texture": "#0"}, + "south": {"uv": [12.5, 9.5, 12.75, 10.5], "texture": "#0"}, + "west": {"uv": [10.5, 12.5, 10.75, 13.5], "texture": "#0"}, + "up": {"uv": [3.25, 13.75, 3, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 3, 13.5, 3.25], "texture": "#0"} + } + }, + { + "from": [9, 3.75, 1], + "to": [10, 8.37, 2], + "rotation": {"angle": 45, "axis": "z", "origin": [9.5, 5.75, 1.5]}, + "faces": { + "north": {"uv": [1.5, 11.5, 1.75, 12.75], "texture": "#0"}, + "east": {"uv": [1.75, 11.5, 2, 12.75], "texture": "#0"}, + "south": {"uv": [11.5, 2.5, 11.75, 3.75], "texture": "#0"}, + "west": {"uv": [11.5, 4.75, 11.75, 6], "texture": "#0"}, + "up": {"uv": [3.5, 13.75, 3.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 3.25, 13.5, 3.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "ornaments", + "origin": [3, 8, 3], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + }, + { + "name": "center", + "origin": [8, 8, 8], + "color": 0, + "children": [32, 33, 34] + }, + { + "name": "plates", + "origin": [8, 8, 8], + "color": 0, + "children": [35, 36, 37, 38, 39, 40] + }, + { + "name": "symbol", + "origin": [6, 8, 1], + "color": 0, + "children": [41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70] + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_speed_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_speed_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f692e53a0f81fec60fd6911f3741e34946928d GIT binary patch literal 1376 zcmV-m1)utfP)|;W2V*y>Cd}E z;xm(%iK3}ffUSKLsp)qqmqR6TR8$7(DD;U<@yuIUqD)$oB-(RG_#B z0kEGoVH#)Z@6MkM{d{BLlW0wGL?iInw>F$Ua$<6ILCkk>^=7wd5gmHIW|g0gh+`Xs z24qhi*A7~p|4zDb_4X%`RK)@8_a|XXeT{lek3$=x#c3R zL!E%r-5RRu5Bi_l2egTp0;W0vyT52sFa^|j!|Mwo!>vqC180GNH3Axi?}TT__}^iw zC`BOzP_LghjZ3n>kHV9s8-^){S6!1zq;aaw+e|;z1>Z-%l)&QN5euL%Q+^S<9tea6 znC74{hCh8Qw14)?57E|J>uUw6i38XWzCD9u|KMhj0#7XuR;$AC>wzE<0x;DH@SsgT?HF+N0!b$@fTbN< zW0ONk_*Awprao*t=+j)ir|KI54n{q*iL~9AM|J#O z7^SR!l~=Xm*GV6Tn35rmW1O!7vJB(YD(uMoSe3p8Yl3~rWPlz7NP%C20YZt4n)i;C(;DRIgNgeO-^;zxna+rqBK5^TC_y9ZHKwIb`GE zf!h8*-n<{)0ahtJxikP%UAo`AV}?EAA4*Fu4KOwGm)iD^H1?tQ%eU{7D}9s`(A)J( z6*~NPF!7lF@`8G~kQ)Q&ptpIv0~m%gz_sFAa-pk3fTMj9NzpznFp8NOB)Vn*y~pAh zTO6{s7iM2IjtzAH`8|(};0^Bu=Nq~p4axwVrzNE0r1rBzzs2r9*nO(Dl8%sY?S0^J zPVG1)Y6}Fn+WtIEj@}@s9hbJf(;!no zGP{t=EC3yV7ke+>+tQSK3qC8uS%BVy;mWNJ}PSfK(@t z0vsCxAPYRoVm-jr8(t|G!;?F=#B(ve>!Ir7+|S>s+6F4od#SQyq70BWPfN#jE8p92 zDTe`%=hjI`8eWp0i9snGtNm_4TcLYXWouc@1)ww^&^);%!O#PwF(_*IUw?{ifBfvF z+Pc>Ix=AjDkRAs>VYW|+pg;qpFNc9l7(l8MAOHgW#+ypwbI26b5+`l|DaMq2v8vYs z^!)&{L}j2GMALiZOeQ?Q7Gqp%e6D0Z2C)0vz;J+AGS>;xka+{tgff>Yv0cf$0VEkb zJ$_YHf~woT-dJ*97f=R}qOdrN3-f&v?c{steDpFr0kRoEljURG^Id-Xe{1;})nG=rz z(p=(lOdWtZHV-&yBo8z(10$EgCWxGB0U#H10rd1C4N`@c>2NE!dDq%s61gydIr#yF zS@)C|M{Yd8wNohy((t<@`#IvTaGEWplg%dHsIZW*=1)dg zeCQ&C!FrvJBu&i<)HSl}5OFfJ6|55?n-q8OkkkyhU|k#RR*lc*fl{wdQD9KXkV!bl z0CWD%c^tLB_x`xVc-14cIYYyR;(0$PP@Ho&<{X{ry{l>qPem})E5ku0n3{gym5wZp z;Rad2sGA&ISD$ecXp2K{*N^A#NCF+gULrk=8Hck0c#K1gq^aq50(b>`27}&jDF{-| z!4Ry`y+|FNBR6unI?U(-2{EJ62x&+m*kvVch>c(xa);J-V(7`QY7;iyql;Oi~cr%)bN+#Rf_^IVCB02USX zR}w5a;eJv{n~96;Cj4vk5B@0m&{fLs?tO`;%(D9Y7UHMYXvV)dsYY)s`0 zHw3qgz7Q9=WB*ZnCw^y5d0izq=OeX+8Xn}%u>?WraeWA(caSb&oa3(RuNcDt9hcS< z`GIh#YX%0qO?*;efz4iD2fx4n>*X+(vZD`I>GIrXe~5(3-qctE$8T@YL3G1P|8sz)*0R8v z^5%yx=4_8$%2pBP|KUNlK!C#ypSyWeJ)D65L()HInap2cr}?HHlx&4l15l51Y5?kS zP7Odk&Zz;Y$LV_#otRTmn% z2t{ZY6|z%sDP6mf3W`{aQl$%n7DT<@eL3;w_P+bmm!x?~zeV4Bx%VaSoqNuA{%*6s zSFe7e4j}h%#ybAKJZ~K@|M!v342@EywnHCok5FNHfM$2kQt9fA#u%>Gs>5_H_ga3w zQMz)19LVC&Z>PSsPI~b271`$bj{lS!GLAp3*5q;YRL(fQ^Ri0qLWX(>OC#%abL{`1 zd$QE$NVNc9=Rk2GLnrBlJij~l4}~B#0s!$N6 zrHePn7g7N1r(JN(bBzy-{%ZVuf9H`ry5a~Ox==rCjmRTRz+@UGWH$|xZ40I-5$;bG zDSx{x39vf8LfNrhy8Et~@z*AXrACw-QKbs00YhUySSQt51f?p;GoOpZr@~2L4fP6R$kj{oePqEo6 zfE@oA|IteT9n%2)1@(u|#oUKF0rGt#>MxA&7y`x-C~XJE0Y?p2oq%7=7puQ~LmQrR zJ0^gG_8P6;g(sJs_rmuh%F`iZgFEHMHL6613Wa_Bv}<0w{5^n|1K4y-0s+`uHcI4$ zETn6LD~8vjF&(k)Xdx;_4Hl^-z;n#L6UW9U*SzkN8sM@)XAJ-I_r~!DkDtq9D{6gg zLTox5_cMI`zK&GK0jIyZ-pDb)1Y9hE)_R)&bpc#;0))7Q@qzkP&Yz6g+cU`^ihFZrPBIRNT! zg-9BaV9%biDx33JV2VWcO&!Yi`#Iz-7;{dw?rNCBYZLRbdwkv%il6`};T~ z>FpuOK_Uergo@)Op%olLgY=Rh3!AZ_xL|J|?k%oc$2Ub{V#hAE3J?sc%S*KGeNWUK zP8i9#s=2N@f=k0pP;-A395H@PemHUtaODy*+Oq)JV7`8i@HnI%2y_Jrx-`%PF0jl_ zo|SEJ;4mfrROABk#lR&QVEhr?jrC&-XOszs5YD{|G*781n6LQoJ6 z3x*#&t_X{OhsV_yl(;`W%C{}xLg6uCMR=tACo^Yq9#{x`%+5`v< zzJ0Y`5@XZia{xkwa6n*O{pD*OKMX?Lb832n&>HLwu(8%`z z`vfx}9RxMpRKyCvhFHzhh!B4AG66OIhLE75%<2#n;&oO#)BgsUSlRTDt1%U1buOp7 z_q$#MLT2f)MN!JtX1z2mp={amub z_sfQ+h~8L$7{@i{;C}E3zFP&p%l1!LAsQgJ$;D-2Hu!Es>vr_SOC-VZKTT1e<5&RH z=QtJs^*N3OKz)wS00030|6r+=kN^Mx21!IgR09Cd_WW_S4s}NW0000 Date: Wed, 10 Dec 2025 05:39:10 +0100 Subject: [PATCH 09/28] First version of arbitrary quarry regions, only semi-stable so far --- .../utilitiesinexcess/ModBlocks.java | 6 +- .../blocks/ender_quarry/BlockEnderMarker.java | 6 +- .../blocks/ender_quarry/BlockEnderQuarry.java | 3 +- .../ender_quarry/BlockEnderQuarryUpgrade.java | 4 +- .../ender_quarry/IEnderQuarryUpgrade.java | 1 - .../tileentities/TileEntityEnderMarker.java | 107 ++++- .../tileentities/TileEntityEnderQuarry.java | 430 ++++++++++++++++-- 7 files changed, 490 insertions(+), 67 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 0a6677b0..42b98601 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -1,6 +1,5 @@ package com.fouristhenumber.utilitiesinexcess; -import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderQuarryUpgrade; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -14,8 +13,6 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCursedEarth; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockDrum; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderLotus; -import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderMarker; -import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderQuarry; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEtherealGlass; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockFloating; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockInverted; @@ -35,6 +32,9 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockTrashCanFluid; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockTrashCanItem; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockUpdateDetector; +import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderMarker; +import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderQuarry; +import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderQuarryUpgrade; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockEnderGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockFoodGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockFurnaceGenerator; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java index c6c69dae..5ab31f1c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java @@ -72,7 +72,8 @@ public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neig } @Override - public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ) { + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { if (worldIn.isRemote) return true; TileEntity te = worldIn.getTileEntity(x, y, z); if (te instanceof TileEntityEnderMarker marker) { @@ -81,7 +82,8 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer marker.boundaryForArbitraryLoop(); } int newCuboidSize = marker.increaseCuboidSize(); - player.addChatComponentMessage(new ChatComponentText("Increased cuboid size to " + newCuboidSize + ".")); + player + .addChatComponentMessage(new ChatComponentText("Increased cuboid size to " + newCuboidSize + ".")); } else { marker.rotateMode(); player.addChatComponentMessage(new ChatComponentText(marker.getMode())); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java index 970beed1..5b6da2d3 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java @@ -56,7 +56,8 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer if (te instanceof TileEntityEnderQuarry quarry) { if (player.isSneaking() && player.capabilities.isCreativeMode) { quarry.isCreativeBoosted = !quarry.isCreativeBoosted; - player.addChatComponentMessage(new ChatComponentText((quarry.isCreativeBoosted ? "" : "Un-") + "Creative-Boosted Quarry.")); + player.addChatComponentMessage( + new ChatComponentText((quarry.isCreativeBoosted ? "" : "Un-") + "Creative-Boosted Quarry.")); return true; } if (quarry.state == TileEntityEnderQuarry.QuarryWorkState.STOPPED) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java index 3f5acdf3..0550fd0b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java @@ -9,6 +9,7 @@ import net.minecraft.world.World; public class BlockEnderQuarryUpgrade extends Block implements IEnderQuarryUpgrade { + private IIcon[] icons; public BlockEnderQuarryUpgrade() { @@ -28,7 +29,8 @@ public int getRenderType() { } @Override - public int onBlockPlaced(World worldIn, int x, int y, int z, int side, float subX, float subY, float subZ, int meta) { + public int onBlockPlaced(World worldIn, int x, int y, int z, int side, float subX, float subY, float subZ, + int meta) { return 0; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java index 423e57d4..6a620737 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java @@ -2,5 +2,4 @@ public interface IEnderQuarryUpgrade { - } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java index f42cbdc9..259c3489 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -11,7 +12,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -20,6 +20,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Vector2i; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.IFacingTE; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; import com.fouristhenumber.utilitiesinexcess.utils.Tuple; @@ -52,7 +54,7 @@ private ConcurrentHashMap getRegistryForDimensi return registeredMarkers.computeIfAbsent(dim, k -> new ConcurrentHashMap<>()); } - public @Nullable List checkForBoundary(ForgeDirection starterFacing) { + public @Nullable List checkForBoundary(ForgeDirection starterFacing) { return switch (operationMode) { case DEFAULT -> boundaryFromThree(starterFacing); case SINGLE -> boundaryForSizedCuboid(starterFacing); @@ -60,7 +62,7 @@ private ConcurrentHashMap getRegistryForDimensi }; } - private @Nullable List boundaryFromThree(ForgeDirection starterFacing) { + private @Nullable List boundaryFromThree(ForgeDirection starterFacing) { Tuple secondCorner = alignedMarkers.getOrDefault(starterFacing, null); if (secondCorner != null && secondCorner.getKey() != null) { Tuple thirdCorner = Optional @@ -69,19 +71,27 @@ private ConcurrentHashMap getRegistryForDimensi .orElse( secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnLeft90(starterFacing), null)); if (thirdCorner != null) { - return Stream.of(new Vector2i(this.xCoord, this.zCoord), new Vector2i(thirdCorner.getValue().x, thirdCorner.getValue().z)).collect(Collectors.toList()); + return Stream + .of( + new FacingVector2i(this.xCoord, this.zCoord, ForgeDirection.UNKNOWN), + new FacingVector2i(thirdCorner.getValue().x, thirdCorner.getValue().z, ForgeDirection.UNKNOWN)) + .collect(Collectors.toList()); } } return null; } - private List boundaryForSizedCuboid(ForgeDirection facing) { - BlockPos otherCorner = DirectionUtil.offsetByForward(this.xCoord, this.yCoord, this.zCoord, facing, cuboidSize, 0); + private List boundaryForSizedCuboid(ForgeDirection facing) { + BlockPos otherCorner = DirectionUtil + .offsetByForward(this.xCoord, this.yCoord, this.zCoord, facing, cuboidSize, 0); otherCorner = DirectionUtil.offsetByRight(otherCorner, facing, cuboidSize, 0); - return Stream.of(new Vector2i(this.xCoord, this.zCoord), new Vector2i(otherCorner.x, otherCorner.z)).collect(Collectors.toList()); + return Stream.of(new FacingVector2i(this.xCoord, this.zCoord, ForgeDirection.UNKNOWN), new FacingVector2i(otherCorner.x, otherCorner.z, ForgeDirection.UNKNOWN)) + .collect(Collectors.toList()); } - public List boundaryForArbitraryLoop() { + public List boundaryForArbitraryLoop() { + // TODO: Has issues with markers that have more than 2 connections (uses not boundary not intendeed by player) - + // maybe limit to 2 connections if this mode is used and propagate that other markers in chain? ArrayList stack = new ArrayList<>(); stack.add(new StackEntry(new LinkedHashMap<>(), this)); Set markerChain = null; @@ -89,29 +99,44 @@ public List boundaryForArbitraryLoop() { searchStack: do { StackEntry entry = stack.remove(stack.size() - 1); - if (entry.current.alignedMarkers.isEmpty() - || entry.current.alignedMarkers.size() == 1 + if (entry.current.alignedMarkers.isEmpty() || entry.current.alignedMarkers.size() == 1 && entry.current.alignedMarkers.get(entry.lastVisited.getValue()) != null - && entry.current.alignedMarkers.get(entry.lastVisited.getValue()).getKey() == entry.lastVisited.getKey()) { + && entry.current.alignedMarkers.get(entry.lastVisited.getValue()) + .getKey() == entry.lastVisited.getKey()) { entry.current.checkForAlignedMarkers(); - worldObj.setBlock(entry.current.xCoord, entry.current.yCoord + 3, entry.current.zCoord, Blocks.brick_block); } - for (Map.Entry> otherMarker : entry.current.alignedMarkers.entrySet()) { - if (otherMarker.getValue().getKey() != null) { + for (Map.Entry> otherMarker : entry.current.alignedMarkers + .entrySet()) { + if (otherMarker.getValue() + .getKey() != null) { // Has not already been visited - if (!entry.visitedMarkers.containsKey(otherMarker.getValue().getKey())) { + if (!entry.visitedMarkers.containsKey( + otherMarker.getValue() + .getKey())) { @SuppressWarnings("unchecked") // Same type - LinkedHashMap visitedMarkers = (LinkedHashMap) entry.visitedMarkers.clone(); - StackEntry stackEntry = new StackEntry(visitedMarkers, otherMarker.getValue().getKey(), entry.current, otherMarker.getKey().getOpposite()); + LinkedHashMap visitedMarkers = (LinkedHashMap) entry.visitedMarkers + .clone(); + StackEntry stackEntry = new StackEntry( + visitedMarkers, + otherMarker.getValue() + .getKey(), + entry.current, + otherMarker.getKey() + .getOpposite()); stack.add(stackEntry); - worldObj.setBlock(entry.current.xCoord, entry.current.yCoord + 2, entry.current.zCoord, Blocks.tnt); continue; } // Check if we have completed a loop by arriving at the starter from a different direction - if (otherMarker.getValue().getKey() == this && entry.visitedMarkers.get(otherMarker.getValue().getKey()) != otherMarker.getKey() && !entry.visitedMarkers.isEmpty()) { + if (otherMarker.getValue() + .getKey() == this + && entry.visitedMarkers.get( + otherMarker.getValue() + .getKey()) + != otherMarker.getKey() + && !entry.visitedMarkers.isEmpty()) { // Append the last marker entry.visitedMarkers.put(entry.current, otherMarker.getKey()); markerChain = entry.visitedMarkers.keySet(); @@ -123,8 +148,8 @@ public List boundaryForArbitraryLoop() { if (markerChain != null) { UtilitiesInExcess.chat("Completed marker chain with " + markerChain.size() + " entries."); - ArrayList pointChain = new ArrayList<>(markerChain.size()); - markerChain.forEach((e) -> pointChain.add(new Vector2i(e.xCoord, e.zCoord))); + ArrayList pointChain = new ArrayList<>(markerChain.size()); + markerChain.forEach((e) -> pointChain.add(new FacingVector2i(e.xCoord, e.zCoord, e.alignedMarkers.keySet().stream().collect(Collectors.toList())))); return pointChain; } UtilitiesInExcess.chat("Failed to complete marker chain."); @@ -133,6 +158,7 @@ public List boundaryForArbitraryLoop() { } private static class StackEntry { + // A map of previously visited markers further down the stack & the direction they were visited from LinkedHashMap visitedMarkers; TileEntityEnderMarker current; @@ -144,7 +170,8 @@ private static class StackEntry { this.lastVisited = null; } - StackEntry(LinkedHashMap visitedMarkers, TileEntityEnderMarker current, TileEntityEnderMarker previous, ForgeDirection previousDir) { + StackEntry(LinkedHashMap visitedMarkers, TileEntityEnderMarker current, + TileEntityEnderMarker previous, ForgeDirection previousDir) { this(visitedMarkers, current); this.visitedMarkers.put(previous, previousDir); lastVisited = new Tuple<>(previous, previousDir); @@ -157,7 +184,8 @@ public void checkForAlignedMarkers() { public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyValidate) { ConcurrentHashMap dimRegistry = getRegistryForDimension(); - for (Map.Entry> entry : new ArrayList<>(alignedMarkers.entrySet())) { + for (Map.Entry> entry : new ArrayList<>( + alignedMarkers.entrySet())) { if (entry.getValue() .getKey() == null) { BlockPos alignedMarkerPos = entry.getValue() @@ -279,9 +307,10 @@ public void teardownConnections() { } public String getMode() { - return switch(operationMode) { + return switch (operationMode) { case DEFAULT -> "Marker is set to establish a rectangular fence from the first 3 in chain."; - case SINGLE -> "Marker is set to establish a cuboid of length " + this.cuboidSize + ". Sneak + R-Click to adjust size."; + case SINGLE -> "Marker is set to establish a cuboid of length " + this.cuboidSize + + ". Sneak + R-Click to adjust size."; case ARBITRARY_LOOP -> "Marker is set to establish a full loop of markers that make up a rectilinear polygon back this marker of arbitrary size and shape."; }; } @@ -359,4 +388,32 @@ public enum MarkerOperationMode { SINGLE, ARBITRARY_LOOP } + + public static class FacingVector2i extends Vector2i { + + HashSet facings; + + public FacingVector2i(int x, int z, List facings) { + super(x, z); + this.facings = new HashSet<>(); + this.facings.addAll(facings); + } + + public FacingVector2i(int x, int z, ForgeDirection facing) { + super(x, z); + this.facings = new HashSet<>(); + if (facing != ForgeDirection.UNKNOWN) + this.facings.add(facing); + } + + + boolean hasConnectionTowards(ForgeDirection dir) { + return facings.contains(dir); + } + + @Override + public String toString() { + return String.format("(%d, %d | %s)", x, y, facings.toString()); + } + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 0688b01a..2ede0118 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -1,10 +1,16 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities; +import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Queue; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -32,18 +38,19 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Vector2i; -import org.joml.Vector4i; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker.FacingVector2i; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; import it.unimi.dsi.fastutil.Hash; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; +import org.joml.Vector4i; public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver, IFluidHandler { @@ -54,6 +61,7 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver private int storedItems; public ForgeDirection facing; private Area2d workArea; + private Queue nextWorkAreas = new LinkedList<>(); public QuarryWorkState state; private int dx; private int dy; @@ -118,32 +126,96 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); if (te instanceof TileEntityEnderMarker marker) { @Nullable - List scanReturn = marker.checkForBoundary(dir); + List scanReturn = marker.checkForBoundary(dir); if (scanReturn != null) { - Vector2i firstCorner = scanReturn.get(0); - Vector2i secondCorner = scanReturn.get(1); - - // Pad work area by one (inwards), so that we don't mine the markers - Vector2i low = new Vector2i( - Math.min(firstCorner.x, secondCorner.x) + 1, - Math.min(firstCorner.y, secondCorner.y) + 1); - Vector2i high = new Vector2i( - Math.max(firstCorner.x, secondCorner.x) - 1, - Math.max(firstCorner.y, secondCorner.y) - 1); - setWorkArea(new Area2d(low, high)); - state = QuarryWorkState.RUNNING; - - int estBlocks = (worldObj.getHeightValue(dx, dy) + 5) * workArea.height * workArea.width; - player.addChatComponentMessage( - new ChatComponentText( - String.format( - "Found ender marker fence boundary, setting up work area from (%d %d) to (%d %d). Should roughly contain %d blocks.", - workArea.low.x, - workArea.low.y, - workArea.high.x, - workArea.high.y, - estBlocks))); - return; + nextWorkAreas.clear(); + // Do we have a simple rectangle as defined by two points + if (scanReturn.size() == 2) { + Vector2i firstCorner = scanReturn.get(0); + Vector2i secondCorner = scanReturn.get(1); + + // Pad work area by one (inwards), so that we don't mine the markers + Vector2i low = new Vector2i( + Math.min(firstCorner.x, secondCorner.x) + 1, + Math.min(firstCorner.y, secondCorner.y) + 1); + Vector2i high = new Vector2i( + Math.max(firstCorner.x, secondCorner.x) - 1, + Math.max(firstCorner.y, secondCorner.y) - 1); + setWorkArea(new Area2d(low, high)); + state = QuarryWorkState.RUNNING; + + int estBlocks = (worldObj.getHeightValue(dx, dy) + 5) * workArea.height * workArea.width; + player.addChatComponentMessage( + new ChatComponentText( + String.format( + "Found ender marker fence boundary, setting up work area from (%d %d) to (%d %d). Should roughly contain %d blocks.", + workArea.low.x, + workArea.low.y, + workArea.high.x, + workArea.high.y, + estBlocks))); + return; + // Or do we have a more complex rectilinear polygon as defined by many points + } else { + // DEBUG: Clear work area of debug blocks + Vector2i low = new Vector2i(Integer.MAX_VALUE); + Vector2i high = new Vector2i(Integer.MIN_VALUE); + for (Vector2i point : scanReturn) { + if (point.x < low.x) { + low.x = point.x; + } + if (point.y < low.y) { + low.y = point.y; + } + if (point.x > high.x) { + high.x = point.x; + } + if (point.y > high.y) { + high.y = point.y; + } + } + LinkedList subRectangles; + + for (int x = low.x; x <= high.x; x++) { + for (int z = low.y; z <= high.y; z++) { + worldObj.setBlock(x, this.yCoord - 1, z, Blocks.grass); + } + } + + for (int dy = 1; dy < 51; dy++) { + for (int x = low.x; x <= high.x; x++) { + for (int z = low.y; z <= high.y; z++) { + worldObj.setBlock(x, this.yCoord + dy, z, Blocks.air); + } + } + } + + for (Vector2i point : scanReturn) { + worldObj + .setBlock(point.x, this.yCoord + 2, point.y, Blocks.brick_block); + } + + try { + subRectangles = computeRectanglesFromRectilinearPointPolygon(scanReturn); + } catch (RuntimeException e) { + StackTraceElement[] stackTrace = e.getStackTrace(); + StackTraceElement lastElement = stackTrace[0]; + String lastFileAndLine = lastElement.getFileName() + ":" + lastElement.getLineNumber(); + player.addChatComponentMessage( + new ChatComponentText( + String.format( + "Ender marker at (%d %d %d) failed to set up a fence boundary: %s - [%s:%s]", + marker.xCoord, + marker.yCoord, + marker.zCoord, + e.getMessage(), + lastElement.getFileName(), + lastElement.getLineNumber()))); + return; + } + return; + //nextWorkAreas = subRectangles; + } } else { player.addChatComponentMessage( new ChatComponentText( @@ -160,6 +232,257 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { player.addChatComponentMessage(new ChatComponentText("Found no ender markers around quarry.")); } + private LinkedList computeRectanglesFromRectilinearPointPolygon(List points) { + RectilinearPointPoly poly = new RectilinearPointPoly(points); + LinkedList subAreas = new LinkedList<>(); + UtilitiesInExcess.LOG.info("Starting subarea compute from {} markers", points.size()); + int color = 0; + + while (poly.canFormRectangle()) { + FacingVector2i rectMinPoint = poly.shiftPoint(); + + if (worldObj.getBlock(rectMinPoint.x, this.yCoord - 2, rectMinPoint.y) == Blocks.diamond_block) { + UtilitiesInExcess.chat("Point-Info: " + rectMinPoint); + } + + // Is this a bottom right corner? + if (rectMinPoint.hasConnectionTowards(ForgeDirection.EAST) && rectMinPoint.hasConnectionTowards(ForgeDirection.NORTH)) + continue; + + @Nullable + Integer highXBound = null; + @Nullable + Integer highYBound = null; + for (FacingVector2i higherPoint : poly.remainingPoints) { + // Don't include if y is below our minimum y or on the same as what we already see as the lower y bound + if (higherPoint.y < rectMinPoint.y || (highYBound != null && higherPoint.y > highYBound)) continue; + // Do we have an early simple turn left? + if (higherPoint.x == rectMinPoint.x) { + if (higherPoint.hasConnectionTowards(ForgeDirection.EAST)) + highYBound = higherPoint.y; + // Don't include points for x bound on the same x (left line) + continue; + } + + highXBound = higherPoint.x; + + if (higherPoint.hasConnectionTowards(ForgeDirection.SOUTH) || higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) { + break; + } else { + // Preliminary y bound + highYBound = higherPoint.y; + } + } + + if (highXBound == null) { + throw new RuntimeException( + "Failed to find right side boundary of rectangle starting at x " + rectMinPoint.x); + } + + boolean foundBetterYBound = false; + var iter = poly.remainingPoints.iterator(); + while (iter.hasNext()) { + FacingVector2i higherPoint = iter.next(); + // Don't include points below our minimum y, + // Don't include points which have an x outside the x bounds + // (in theory higherPoint.x >= rectMinPoint.x is redundant since rectMinPoint.x should be the lowest + // available x left, but is there for visibility), + // Don't include points with a y value that is higher than an already present high y bound + if (higherPoint.y <= rectMinPoint.y || higherPoint.x < rectMinPoint.x) + continue; + if (higherPoint.x > highXBound) break; + + if (!foundBetterYBound && (highYBound == null || higherPoint.y > highYBound)) { + highYBound = higherPoint.y; + } + if (foundBetterYBound && higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) { + if ( (!iter.hasNext() && higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) || (higherPoint.x == rectMinPoint.x && higherPoint.y > highYBound && higherPoint.hasConnectionTowards(ForgeDirection.EAST))) { + highYBound = higherPoint.y; + } + } + foundBetterYBound = true; + } + + if (highYBound == null) { + throw new RuntimeException( + "Failed to find top side boundary of rectangle starting at " + rectMinPoint); + } + + FacingVector2i rectMaxPoint = new FacingVector2i(highXBound, highYBound, ForgeDirection.UNKNOWN); + + // Finished sub-rectangle, add it to the list and remove all points on the edges of it + Area2d subArea = new Area2d(rectMinPoint, rectMaxPoint, new Vector4i(0, 0, 0, 0)); + + boolean isLineArea = subArea.width <= 1 || subArea.height <= 1; + if (!isLineArea) subAreas.add(subArea); + + HashSet containedPoints = poly.getRemainingPointsInRect(rectMinPoint, rectMaxPoint); + for (FacingVector2i containedPoint : containedPoints) { + // Is point on the top edge and has a connection to something further out that isn't covered by this rectangle? + if (containedPoint.y != rectMaxPoint.y && containedPoint.hasConnectionTowards(ForgeDirection.EAST)) { + // Was point connected to the left boundary that we moved right with this rectangle? + if (containedPoint.hasConnectionTowards(ForgeDirection.NORTH)) { + containedPoint.facings.remove(ForgeDirection.NORTH); + containedPoint.facings.add(ForgeDirection.SOUTH); + } + continue; + } else if (containedPoint.y == rectMaxPoint.y && containedPoint.hasConnectionTowards(ForgeDirection.SOUTH)) { + // Point is on the top edge and has a connection to the right, leave it for later rectangles + continue; + } + poly.removeFromRemainingPoints(containedPoint); + } + + if (!isLineArea) { + // DEBUG: Draw new sub area on floor + for (int x = subArea.low.x; x <= subArea.high.x; x++) { + for (int z = subArea.low.y; z <= subArea.high.y; z++) { + if (worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.wool || worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.gold_block) { + worldObj.setBlock(x, this.yCoord - 1, z, Blocks.gold_block); + //throw new RuntimeException("Overlapping sub-areas detected at " + x + ", " + z); + } else { + worldObj.setBlock(x, this.yCoord - 1, z, Blocks.wool, color, 2); + } + } + } + } + + // Add the new points on the high x-axis that might be relevant to future areas + if (poly.hasRemaining()) { + List newPoints = new ArrayList<>(); + // Determine facing of top right corner + FacingVector2i topLeftCorner = new FacingVector2i(highXBound, rectMinPoint.y, ForgeDirection.UNKNOWN); + if (containedPoints.contains(topLeftCorner)) { + rectMaxPoint.facings.add(ForgeDirection.NORTH); + } + if (poly.maxY == rectMaxPoint.y) { + rectMaxPoint.facings.add(ForgeDirection.EAST); + } + + + FacingVector2i bottomRightCorner = new FacingVector2i(rectMinPoint.x, highYBound, Stream.of(ForgeDirection.EAST, ForgeDirection.SOUTH).collect(Collectors.toList())); + if (!containedPoints.contains(topLeftCorner)) { + newPoints.add(topLeftCorner); + } + newPoints.add(rectMaxPoint); + poly.unshiftPointsToRemainingPointsIfMissing(newPoints); + + } + + if (!isLineArea) { + // DEBUG: Show points used for area & remaining points one above that + for (Vector2i remainingPoint : poly.remainingPoints) { + worldObj.setBlock(remainingPoint.x, this.yCoord + 2 + subAreas.size() * 2, remainingPoint.y, Blocks.stained_glass, color, 2); + } + worldObj.setBlock(rectMinPoint.x, this.yCoord + 1 + subAreas.size() * 2, rectMinPoint.y, Blocks.wool, color, 2); + worldObj.setBlock(rectMaxPoint.x, this.yCoord + 1 + subAreas.size() * 2, rectMaxPoint.y, Blocks.wool, color, 2); + + color++; + if (color == 16) { + color = 0; + } + } + + UtilitiesInExcess.LOG.info("Added subarea at {}", subArea.toString()); + } + + return subAreas; + } + + private static class RectilinearPointPoly { + + LinkedHashSet remainingPoints = new LinkedHashSet<>(); + ArrayDeque stackPoints = new ArrayDeque<>(); + private int maxY = Integer.MIN_VALUE; + + RectilinearPointPoly(List points) { + points.sort( + Comparator.comparingInt(FacingVector2i::x) + .thenComparingInt(FacingVector2i::y)); + for (FacingVector2i sortedPoint : points) { + this.stackPoints.add(sortedPoint); + this.remainingPoints.add(sortedPoint); + if (sortedPoint.y > maxY) { + maxY = sortedPoint.y; + } + } + } + + void unshiftPointsToRemainingPointsIfMissing(List newPoints) { + @SuppressWarnings("SimplifyStreamApiCallChains") // Not supported by modern java transpiler + List missingPoints = newPoints.stream() + .filter((point) -> !remainingPoints.contains(point)) + .collect(Collectors.toList()); + + if (!missingPoints.isEmpty()) { + List points = new ArrayList<>(stackPoints); + points.addAll(missingPoints); + + stackPoints.clear(); + remainingPoints.clear(); + maxY = Integer.MIN_VALUE; + + // Same logic as in constructor - sort random remaining pool of points by x & y, then add in low to high + // order + points.sort( + Comparator.comparingInt(FacingVector2i::x) + .thenComparingInt(FacingVector2i::y)); + for (FacingVector2i sortedPoint : points) { + this.stackPoints.add(sortedPoint); + this.remainingPoints.add(sortedPoint); + if (sortedPoint.y > maxY) { + maxY = sortedPoint.y; + } + } + } + } + + void removeFromRemainingPoints(FacingVector2i point) { + this.remainingPoints.remove(point); + this.stackPoints.remove(point); + // If we removed the max Y point, recalculate + if (point.y == maxY) { + maxY = remainingPoints.stream() + .mapToInt(p -> p.y) + .max() + .orElse(Integer.MIN_VALUE); + } + } + + HashSet getRemainingPointsInRect(FacingVector2i low, FacingVector2i high) { + HashSet points = new HashSet<>(); + for (FacingVector2i remainingPoint : this.remainingPoints) { + if (remainingPoint.x < low.x || remainingPoint.y < low.y || remainingPoint.y > high.y) + continue; + if (remainingPoint.x > high.x) break; + points.add(remainingPoint); + } + return points; + } + + FacingVector2i shiftPoint() { + FacingVector2i point = stackPoints.removeFirst(); + this.removeFromRemainingPoints(point); + return point; + } + + /** + * Check if we have remaining points to process + * This does not check if there are any remaining points but if there are enough points left to form a rectangle + */ + boolean hasRemaining() { + return !stackPoints.isEmpty(); + } + + boolean canFormRectangle() { + return stackPoints.size() >= 4; + } + + boolean hasPointAt(Vector2i point) { + return remainingPoints.stream().anyMatch(p -> p.x == point.x && p.y == point.y); + } + } + /** * Are the current dx & dy & dz in work area bounds */ @@ -586,9 +909,14 @@ public void updateEntity() { if (state != QuarryWorkState.RUNNING) break; } } - if (brokenBlocksTick < (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1)) && state == QuarryWorkState.RUNNING) { - state = QuarryWorkState.FINISHED; - unloadSelf(); + if (brokenBlocksTick < (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1)) + && state == QuarryWorkState.RUNNING) { + if (nextWorkAreas.isEmpty()) { + state = QuarryWorkState.FINISHED; + unloadSelf(); + } else { + workArea = nextWorkAreas.remove(); + } } if (brokenBlocksTick > 0) { markDirty(); @@ -615,12 +943,23 @@ public void readFromNBT(NBTTagCompound nbt) { facing = ForgeDirection.getOrientation(nbt.getInteger("facing")); state = QuarryWorkState.values()[nbt.getInteger("state")]; if (state != QuarryWorkState.FINISHED) { + // Current work area workArea = Area2d.fromNBTTag(nbt); dx = nbt.getInteger("dx"); dy = nbt.getInteger("dy"); dz = nbt.getInteger("dz"); chunkX = dx >> 4; chunkZ = dz >> 4; + + // Possible next work areas + NBTTagList possibleNextAreas = nbt.getTagList("nextAreas", Constants.NBT.TAG_COMPOUND); + if (possibleNextAreas.tagCount() > 0) { + nextWorkAreas.clear(); + for (int i = 0; i < possibleNextAreas.tagCount(); i++) { + NBTTagCompound tag = possibleNextAreas.getCompoundTagAt(i); + nextWorkAreas.add(Area2d.fromNBTTag(tag)); + } + } } brokenBlocksTotal = nbt.getInteger("blocks"); energyStorage.readFromNBT(nbt); @@ -656,6 +995,14 @@ public void writeToNBT(NBTTagCompound nbt) { nbt.setInteger("dx", dx); nbt.setInteger("dy", dy); nbt.setInteger("dz", dz); + + NBTTagList areasNBT = new NBTTagList(); + for (Area2d nextArea : nextWorkAreas) { + NBTTagCompound tag = new NBTTagCompound(); + nextArea.writeNBTTag(tag); + areasNBT.appendTag(tag); + } + nbt.setTag("nextAreas", areasNBT); } nbt.setInteger("blocks", brokenBlocksTotal); energyStorage.writeToNBT(nbt); @@ -777,11 +1124,11 @@ public static class Area2d { // The distance to the closest lower x chunk border from the high x bound public final int chunkOffX; - public Area2d(Vector2i first, Vector2i second) { - int lowX = Math.min(first.x, second.x); - int lowZ = Math.min(first.y, second.y); - int highX = Math.max(first.x, second.x); - int highZ = Math.max(first.y, second.y); + public Area2d(Vector2i first, Vector2i second, Vector4i shrinkMatrix) { + int lowX = Math.min(first.x, second.x) + (shrinkMatrix.x); // Side: left + int lowZ = Math.min(first.y, second.y) + (shrinkMatrix.y); // Side: bottom + int highX = Math.max(first.x, second.x) - (shrinkMatrix.z); // Side: right + int highZ = Math.max(first.y, second.y) - (shrinkMatrix.w); // Side: top this.low = new Vector2i(lowX, lowZ); this.high = new Vector2i(highX, highZ); this.width = highX - lowX; @@ -793,6 +1140,16 @@ public Area2d(int x1, int z1, int x2, int z2) { this(new Vector2i(x1, z1), new Vector2i(x2, z2)); } + public Area2d(Vector2i first, Vector2i second) { + // Don't shrink anywhere + this(first, second, new Vector4i(0, 0, 0, 0)); + } + + public Area2d(Vector2i first, Vector2i second, boolean shouldShrink) { + // Shrink equally on all sides if requested + this(first, second, shouldShrink ? new Vector4i(1, 1, 1, 1) : new Vector4i(0, 0, 0, 0)); + } + public boolean isInBounds(int x, int z) { return x >= this.low.x && x <= this.high.x && z >= this.low.y && z <= this.high.y; } @@ -822,6 +1179,11 @@ public boolean equals(Object obj) { if (!(obj instanceof Area2d other)) return false; return low.equals(other.low) && high.equals(other.high); } + + @Override + public String toString() { + return String.format("[(%d, %d), (%d, %d)]", this.low.x, this.low.y, this.high.x, this.high.y); + } } protected static class ItemStackHashStrategy implements Hash.Strategy { From f2d8e922a841a25d473ea98c6887eec498659668 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Mon, 15 Dec 2025 23:15:05 +0100 Subject: [PATCH 10/28] Stop with the current approach, try an edge based one next --- .../tileentities/TileEntityEnderQuarry.java | 184 +++++++++++++----- 1 file changed, 136 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 2ede0118..433be497 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -246,8 +246,16 @@ private LinkedList computeRectanglesFromRectilinearPointPolygon(List computeRectanglesFromRectilinearPointPolygon(List highYBound)) continue; // Do we have an early simple turn left? if (higherPoint.x == rectMinPoint.x) { - if (higherPoint.hasConnectionTowards(ForgeDirection.EAST)) + if (highYBound == null && (higherPoint.hasConnectionTowards(ForgeDirection.EAST) || higherPoint.hasConnectionTowards(ForgeDirection.WEST))) highYBound = higherPoint.y; // Don't include points for x bound on the same x (left line) continue; } + if (higherPoint.y == rectMinPoint.y && higherPoint.hasConnectionTowards(ForgeDirection.WEST) && higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) { + // Don't take a left turn as the end of this rectangle + continue; + } highXBound = higherPoint.x; + if (worldObj.getBlock(higherPoint.x, this.yCoord - 2, higherPoint.y) == Blocks.diamond_block) { + UtilitiesInExcess.chat("Point-Info for color " + color + ": " + higherPoint); + } - if (higherPoint.hasConnectionTowards(ForgeDirection.SOUTH) || higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) { + if (higherPoint.hasConnectionTowards(ForgeDirection.SOUTH)) { + if (higherPoint.hasConnectionTowards(ForgeDirection.WEST)) { + if (rectMinPoint.y == higherPoint.y) { + break; + } else if (highYBound == null || highYBound > higherPoint.y) { + highYBound = higherPoint.y; + } + //break; + } else { + break; + } + } + if (higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) { break; - } else { - // Preliminary y bound - highYBound = higherPoint.y; } } @@ -279,8 +303,11 @@ private LinkedList computeRectanglesFromRectilinearPointPolygon(List computeRectanglesFromRectilinearPointPolygon(List highXBound) break; - if (!foundBetterYBound && (highYBound == null || higherPoint.y > highYBound)) { - highYBound = higherPoint.y; + if (worldObj.getBlock(higherPoint.x, this.yCoord - 2, higherPoint.y) == Blocks.diamond_block) { + UtilitiesInExcess.chat("Point-Info for color " + color + ": " + higherPoint); } - if (foundBetterYBound && higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) { - if ( (!iter.hasNext() && higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) || (higherPoint.x == rectMinPoint.x && higherPoint.y > highYBound && higherPoint.hasConnectionTowards(ForgeDirection.EAST))) { + + if (higherPoint.hasConnectionTowards(ForgeDirection.WEST) && higherPoint.x > rectMinPoint.x) { + if (highYBound != null) { + if (highYBound > higherPoint.y) { + // Found a boundary that would close the rectangle on the right side + highYBound = higherPoint.y; + } + } else { + highYBound = higherPoint.y; + } + continue; + } + if (higherPoint.hasConnectionTowards(ForgeDirection.EAST) && higherPoint.x <= highXBound) { + if (highYBound != null) { + if (highYBound > higherPoint.y) { + // Found a boundary that would close the rectangle on the right side + highYBound = higherPoint.y; + } + } else { highYBound = higherPoint.y; } + continue; + } + + if (highYBound == null) { + unsafeHighYBound = higherPoint.y; + } + + if (!iter.hasNext() && higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) { + unsafeHighYBound = higherPoint.y; } - foundBetterYBound = true; + } + if (unsafeHighYBound != null && highYBound == null) { + highYBound = unsafeHighYBound; + } } if (highYBound == null) { @@ -309,15 +366,31 @@ private LinkedList computeRectanglesFromRectilinearPointPolygon(List containedPoints = poly.getRemainingPointsInRect(rectMinPoint, rectMaxPoint); for (FacingVector2i containedPoint : containedPoints) { + // Keep corners on the top side (if not present, will be added later below) + if (containedPoint.x == rectMaxPoint.x && containedPoint.y == rectMaxPoint.y) { + if (containedPoint.hasConnectionTowards(ForgeDirection.NORTH)) { + // We were the connection north, that has now moved up with this rectangle + containedPoint.facings.remove(ForgeDirection.NORTH); + } else if (containedPoint.hasConnectionTowards(ForgeDirection.SOUTH) && containedPoint.hasConnectionTowards(ForgeDirection.EAST)) { + // needed? + containedPoint.facings.remove(ForgeDirection.SOUTH); + } + continue; + } + if (containedPoint.x == topLeftCorner.x && containedPoint.y == topLeftCorner.y) continue; + // Is point on the top edge and has a connection to something further out that isn't covered by this rectangle? if (containedPoint.y != rectMaxPoint.y && containedPoint.hasConnectionTowards(ForgeDirection.EAST)) { // Was point connected to the left boundary that we moved right with this rectangle? @@ -326,23 +399,29 @@ private LinkedList computeRectanglesFromRectilinearPointPolygon(List rectMinPoint.x && containedPoint.hasConnectionTowards(ForgeDirection.NORTH)) { + // Point is on the left edge and has a connection to a lower rectangle, leave it for later rectangles + continue; + } + if (worldObj.getBlock(containedPoint.x, this.yCoord - 2, containedPoint.y) == Blocks.diamond_block) { + UtilitiesInExcess.chat("Removing point at " + containedPoint + " for subarea " + subArea); + } poly.removeFromRemainingPoints(containedPoint); } - if (!isLineArea) { - // DEBUG: Draw new sub area on floor - for (int x = subArea.low.x; x <= subArea.high.x; x++) { - for (int z = subArea.low.y; z <= subArea.high.y; z++) { - if (worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.wool || worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.gold_block) { - worldObj.setBlock(x, this.yCoord - 1, z, Blocks.gold_block); - //throw new RuntimeException("Overlapping sub-areas detected at " + x + ", " + z); - } else { - worldObj.setBlock(x, this.yCoord - 1, z, Blocks.wool, color, 2); - } + // DEBUG: Draw new sub area on floor + for (int x = subArea.low.x; x <= subArea.high.x; x++) { + for (int z = subArea.low.y; z <= subArea.high.y; z++) { + if (worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.wool || worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.gold_block) { + //worldObj.setBlock(x, this.yCoord - 1, z, Blocks.gold_block); + //throw new RuntimeException("Overlapping sub-areas detected at " + x + ", " + z); + } else { + worldObj.setBlock(x, this.yCoord - 1, z, Blocks.wool, color, 2); } } } @@ -351,7 +430,6 @@ private LinkedList computeRectanglesFromRectilinearPointPolygon(List newPoints = new ArrayList<>(); // Determine facing of top right corner - FacingVector2i topLeftCorner = new FacingVector2i(highXBound, rectMinPoint.y, ForgeDirection.UNKNOWN); if (containedPoints.contains(topLeftCorner)) { rectMaxPoint.facings.add(ForgeDirection.NORTH); } @@ -359,28 +437,22 @@ private LinkedList computeRectanglesFromRectilinearPointPolygon(List remainingPoints = new LinkedHashSet<>(); ArrayDeque stackPoints = new ArrayDeque<>(); + HashMap> xMarkersByY = new HashMap<>(); private int maxY = Integer.MIN_VALUE; + private int minY = Integer.MAX_VALUE; + RectilinearPointPoly(List points) { points.sort( @@ -402,14 +477,16 @@ private static class RectilinearPointPoly { for (FacingVector2i sortedPoint : points) { this.stackPoints.add(sortedPoint); this.remainingPoints.add(sortedPoint); - if (sortedPoint.y > maxY) { - maxY = sortedPoint.y; - } + this.xMarkersByY.computeIfAbsent(sortedPoint.y, k -> new HashSet<>()).add(sortedPoint.x); + if (sortedPoint.y > maxY) maxY = sortedPoint.y; + if (sortedPoint.y < minY) minY = sortedPoint.y; } } + /** + * Add new points to the remaining points if they are not already present + */ void unshiftPointsToRemainingPointsIfMissing(List newPoints) { - @SuppressWarnings("SimplifyStreamApiCallChains") // Not supported by modern java transpiler List missingPoints = newPoints.stream() .filter((point) -> !remainingPoints.contains(point)) .collect(Collectors.toList()); @@ -420,7 +497,9 @@ void unshiftPointsToRemainingPointsIfMissing(List newPoints) { stackPoints.clear(); remainingPoints.clear(); + xMarkersByY.clear(); maxY = Integer.MIN_VALUE; + minY = Integer.MAX_VALUE; // Same logic as in constructor - sort random remaining pool of points by x & y, then add in low to high // order @@ -430,9 +509,9 @@ void unshiftPointsToRemainingPointsIfMissing(List newPoints) { for (FacingVector2i sortedPoint : points) { this.stackPoints.add(sortedPoint); this.remainingPoints.add(sortedPoint); - if (sortedPoint.y > maxY) { - maxY = sortedPoint.y; - } + this.xMarkersByY.computeIfAbsent(sortedPoint.y, k -> new HashSet<>()).add(sortedPoint.x); + if (sortedPoint.y > maxY) maxY = sortedPoint.y; + if (sortedPoint.y < minY) minY = sortedPoint.y; } } } @@ -440,12 +519,17 @@ void unshiftPointsToRemainingPointsIfMissing(List newPoints) { void removeFromRemainingPoints(FacingVector2i point) { this.remainingPoints.remove(point); this.stackPoints.remove(point); + this.xMarkersByY.get(point.y).remove(point.x); // If we removed the max Y point, recalculate if (point.y == maxY) { maxY = remainingPoints.stream() .mapToInt(p -> p.y) .max() .orElse(Integer.MIN_VALUE); + minY = remainingPoints.stream() + .mapToInt(p -> p.y) + .min() + .orElse(Integer.MAX_VALUE); } } @@ -481,6 +565,10 @@ boolean canFormRectangle() { boolean hasPointAt(Vector2i point) { return remainingPoints.stream().anyMatch(p -> p.x == point.x && p.y == point.y); } + + int getXsAtY(int y) { + return xMarkersByY.getOrDefault(y, new HashSet<>()).size(); + } } /** From 01ea578c6bd2b2cd862414cc0c9aa21bb585c2f2 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Tue, 16 Dec 2025 04:07:36 +0100 Subject: [PATCH 11/28] Move to an edge based sub-area forming approach --- .../tileentities/TileEntityEnderMarker.java | 18 +- .../tileentities/TileEntityEnderQuarry.java | 500 ++++++++---------- 2 files changed, 218 insertions(+), 300 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java index 259c3489..33597163 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -54,7 +54,7 @@ private ConcurrentHashMap getRegistryForDimensi return registeredMarkers.computeIfAbsent(dim, k -> new ConcurrentHashMap<>()); } - public @Nullable List checkForBoundary(ForgeDirection starterFacing) { + public @Nullable List checkForBoundary(ForgeDirection starterFacing) { return switch (operationMode) { case DEFAULT -> boundaryFromThree(starterFacing); case SINGLE -> boundaryForSizedCuboid(starterFacing); @@ -62,7 +62,7 @@ private ConcurrentHashMap getRegistryForDimensi }; } - private @Nullable List boundaryFromThree(ForgeDirection starterFacing) { + private @Nullable List boundaryFromThree(ForgeDirection starterFacing) { Tuple secondCorner = alignedMarkers.getOrDefault(starterFacing, null); if (secondCorner != null && secondCorner.getKey() != null) { Tuple thirdCorner = Optional @@ -73,23 +73,23 @@ private ConcurrentHashMap getRegistryForDimensi if (thirdCorner != null) { return Stream .of( - new FacingVector2i(this.xCoord, this.zCoord, ForgeDirection.UNKNOWN), - new FacingVector2i(thirdCorner.getValue().x, thirdCorner.getValue().z, ForgeDirection.UNKNOWN)) + new Vector2i(this.xCoord, this.zCoord), + new Vector2i(thirdCorner.getValue().x, thirdCorner.getValue().z)) .collect(Collectors.toList()); } } return null; } - private List boundaryForSizedCuboid(ForgeDirection facing) { + private List boundaryForSizedCuboid(ForgeDirection facing) { BlockPos otherCorner = DirectionUtil .offsetByForward(this.xCoord, this.yCoord, this.zCoord, facing, cuboidSize, 0); otherCorner = DirectionUtil.offsetByRight(otherCorner, facing, cuboidSize, 0); - return Stream.of(new FacingVector2i(this.xCoord, this.zCoord, ForgeDirection.UNKNOWN), new FacingVector2i(otherCorner.x, otherCorner.z, ForgeDirection.UNKNOWN)) + return Stream.of(new Vector2i(this.xCoord, this.zCoord), new Vector2i(otherCorner.x, otherCorner.z)) .collect(Collectors.toList()); } - public List boundaryForArbitraryLoop() { + public List boundaryForArbitraryLoop() { // TODO: Has issues with markers that have more than 2 connections (uses not boundary not intendeed by player) - // maybe limit to 2 connections if this mode is used and propagate that other markers in chain? ArrayList stack = new ArrayList<>(); @@ -148,8 +148,8 @@ public List boundaryForArbitraryLoop() { if (markerChain != null) { UtilitiesInExcess.chat("Completed marker chain with " + markerChain.size() + " entries."); - ArrayList pointChain = new ArrayList<>(markerChain.size()); - markerChain.forEach((e) -> pointChain.add(new FacingVector2i(e.xCoord, e.zCoord, e.alignedMarkers.keySet().stream().collect(Collectors.toList())))); + ArrayList pointChain = new ArrayList<>(markerChain.size()); + markerChain.forEach((e) -> pointChain.add(new Vector2i(e.xCoord, e.zCoord))); return pointChain; } UtilitiesInExcess.chat("Failed to complete marker chain."); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 433be497..7673d27b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -1,16 +1,16 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities; -import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.Comparator; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedHashSet; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Queue; +import java.util.Set; +import java.util.TreeSet; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -25,6 +25,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.IWorldAccess; +import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.Fluid; @@ -43,7 +45,6 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker.FacingVector2i; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; @@ -61,7 +62,7 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver private int storedItems; public ForgeDirection facing; private Area2d workArea; - private Queue nextWorkAreas = new LinkedList<>(); + private List nextWorkAreas = new LinkedList<>(); public QuarryWorkState state; private int dx; private int dy; @@ -126,7 +127,7 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); if (te instanceof TileEntityEnderMarker marker) { @Nullable - List scanReturn = marker.checkForBoundary(dir); + List scanReturn = marker.checkForBoundary(dir); if (scanReturn != null) { nextWorkAreas.clear(); // Do we have a simple rectangle as defined by two points @@ -174,7 +175,6 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { high.y = point.y; } } - LinkedList subRectangles; for (int x = low.x; x <= high.x; x++) { for (int z = low.y; z <= high.y; z++) { @@ -195,12 +195,12 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { .setBlock(point.x, this.yCoord + 2, point.y, Blocks.brick_block); } + List subRectangles; try { subRectangles = computeRectanglesFromRectilinearPointPolygon(scanReturn); } catch (RuntimeException e) { StackTraceElement[] stackTrace = e.getStackTrace(); StackTraceElement lastElement = stackTrace[0]; - String lastFileAndLine = lastElement.getFileName() + ":" + lastElement.getLineNumber(); player.addChatComponentMessage( new ChatComponentText( String.format( @@ -232,193 +232,88 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { player.addChatComponentMessage(new ChatComponentText("Found no ender markers around quarry.")); } - private LinkedList computeRectanglesFromRectilinearPointPolygon(List points) { - RectilinearPointPoly poly = new RectilinearPointPoly(points); - LinkedList subAreas = new LinkedList<>(); - UtilitiesInExcess.LOG.info("Starting subarea compute from {} markers", points.size()); + private List computeRectanglesFromRectilinearPointPolygon(List points) { + RectilinearEdgePoly poly = new RectilinearEdgePoly(points); + List subAreas = new ArrayList<>(); int color = 0; - while (poly.canFormRectangle()) { - FacingVector2i rectMinPoint = poly.shiftPoint(); + List activeSpans = new ArrayList<>(); - if (worldObj.getBlock(rectMinPoint.x, this.yCoord - 2, rectMinPoint.y) == Blocks.diamond_block) { - UtilitiesInExcess.chat("Point-Info: " + rectMinPoint); - } + // Sweep through y coordinates from bottom to top, skip last since we handle active spans after the loop + for (int i = 0; i < poly.yCoords.size() - 1; i++) { + int y = poly.yCoords.get(i); - // Is this a bottom right corner? - if (rectMinPoint.hasConnectionTowards(ForgeDirection.EAST) && rectMinPoint.hasConnectionTowards(ForgeDirection.NORTH)) { - UtilitiesInExcess.chat("Skipping bottom right corner at " + rectMinPoint); - continue; - } + // Find spans at this Y level by intersecting vertical edges + List currentSpans = poly.findSpansAtY(y); - // Is this a remainder on the lowest level from a new rect? - if (rectMinPoint.y == poly.minY && poly.getXsAtY(rectMinPoint.y) == 0) { - UtilitiesInExcess.chat("Skipping lowest level remainder at " + rectMinPoint); - continue; - } + // Try to merge with active spans (greedy vertical extension) + List newActiveSpans = new ArrayList<>(); + Set mergedIndices = new HashSet<>(); - @Nullable - Integer highXBound = null; - @Nullable - Integer highYBound = null; - for (FacingVector2i higherPoint : poly.remainingPoints) { - // Don't include if y is below our minimum y or on the same as what we already see as the lower y bound - if (higherPoint.y < rectMinPoint.y || (highYBound != null && higherPoint.y > highYBound)) continue; - // Do we have an early simple turn left? - if (higherPoint.x == rectMinPoint.x) { - if (highYBound == null && (higherPoint.hasConnectionTowards(ForgeDirection.EAST) || higherPoint.hasConnectionTowards(ForgeDirection.WEST))) - highYBound = higherPoint.y; - // Don't include points for x bound on the same x (left line) - continue; - } - if (higherPoint.y == rectMinPoint.y && higherPoint.hasConnectionTowards(ForgeDirection.WEST) && higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) { - // Don't take a left turn as the end of this rectangle - continue; - } - - highXBound = higherPoint.x; - if (worldObj.getBlock(higherPoint.x, this.yCoord - 2, higherPoint.y) == Blocks.diamond_block) { - UtilitiesInExcess.chat("Point-Info for color " + color + ": " + higherPoint); - } - - if (higherPoint.hasConnectionTowards(ForgeDirection.SOUTH)) { - if (higherPoint.hasConnectionTowards(ForgeDirection.WEST)) { - if (rectMinPoint.y == higherPoint.y) { - break; - } else if (highYBound == null || highYBound > higherPoint.y) { - highYBound = higherPoint.y; - } - //break; - } else { + for (RectilinearEdgePoly.Span active : activeSpans) { + boolean merged = false; + for (int j = 0; j < currentSpans.size(); j++) { + if (!mergedIndices.contains(j) && active.matches(currentSpans.get(j))) { + // Extend the active span vertically + newActiveSpans.add(new RectilinearEdgePoly.Span(active.x1, active.x2, active.y)); + mergedIndices.add(j); + merged = true; break; } } - if (higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) { - break; - } - } - if (highXBound == null) { - throw new RuntimeException( - "Failed to find right side boundary of rectangle starting at x " + rectMinPoint.x); - } - - if (highYBound == null) { - - - var iter = poly.remainingPoints.iterator(); - @Nullable Integer unsafeHighYBound = null; - while (iter.hasNext()) { - FacingVector2i higherPoint = iter.next(); - // Don't include points below our minimum y, - // Don't include points which have an x outside the x bounds - // (in theory higherPoint.x >= rectMinPoint.x is redundant since rectMinPoint.x should be the lowest - // available x left, but is there for visibility), - // Don't include points with a y value that is higher than an already present high y bound - if (higherPoint.y <= rectMinPoint.y || higherPoint.x < rectMinPoint.x) - continue; - // Stop if we are outside x bounds - if (higherPoint.x > highXBound) break; - - if (worldObj.getBlock(higherPoint.x, this.yCoord - 2, higherPoint.y) == Blocks.diamond_block) { - UtilitiesInExcess.chat("Point-Info for color " + color + ": " + higherPoint); - } - - if (higherPoint.hasConnectionTowards(ForgeDirection.WEST) && higherPoint.x > rectMinPoint.x) { - if (highYBound != null) { - if (highYBound > higherPoint.y) { - // Found a boundary that would close the rectangle on the right side - highYBound = higherPoint.y; - } - } else { - highYBound = higherPoint.y; + if (!merged) { + // Can't extend this span, output as rectangle + // Check if bottom and top align with actual boundary edges + int lowX = Math.min(active.x1, active.x2) + 1; + int highX = Math.max(active.x1, active.x2) - 1; + boolean intersectsWithBottomBoundary = poly.intersectsWithHorizontalBoundary( + active.y, lowX, highX, worldObj, color, this.yCoord + 4); + boolean intersectsWithTopBoundary = poly.intersectsWithHorizontalBoundary( + y, lowX, highX, worldObj, color, this.yCoord + 4); + +// subAreas.add(new Area2d(active.x1, active.y, active.x2, y - 1, +// new Vector4i(1, intersectsWithBottomBoundary ? 1 : 0, 1, intersectsWithTopBoundary ? 1 : 0))); + subAreas.add(new Area2d(active.x1, active.y, active.x2, y - 1, + new Vector4i(1, 0, 1, 0))); + color++; + if (color == 16) { + color = 0; } - continue; } - if (higherPoint.hasConnectionTowards(ForgeDirection.EAST) && higherPoint.x <= highXBound) { - if (highYBound != null) { - if (highYBound > higherPoint.y) { - // Found a boundary that would close the rectangle on the right side - highYBound = higherPoint.y; - } - } else { - highYBound = higherPoint.y; - } - continue; - } - - if (highYBound == null) { - unsafeHighYBound = higherPoint.y; - } - - if (!iter.hasNext() && higherPoint.hasConnectionTowards(ForgeDirection.NORTH)) { - unsafeHighYBound = higherPoint.y; - } - } - if (unsafeHighYBound != null && highYBound == null) { - highYBound = unsafeHighYBound; - } } - if (highYBound == null) { - throw new RuntimeException( - "Failed to find top side boundary of rectangle starting at " + rectMinPoint); + // Add unmerged current spans as new active spans + for (int j = 0; j < currentSpans.size(); j++) { + if (!mergedIndices.contains(j)) { + newActiveSpans.add(new RectilinearEdgePoly.Span(currentSpans.get(j).x1, currentSpans.get(j).x2, y)); + } } - FacingVector2i rectMaxPoint = new FacingVector2i(highXBound, highYBound, ForgeDirection.UNKNOWN); - FacingVector2i topLeftCorner = new FacingVector2i(highXBound, rectMinPoint.y, ForgeDirection.UNKNOWN); - FacingVector2i bottomRightCorner = new FacingVector2i(rectMinPoint.x, highYBound, Stream.of(ForgeDirection.EAST, ForgeDirection.SOUTH).collect(Collectors.toList())); - - - // Finished sub-rectangle, add it to the list and remove all points on the edges of it - Area2d subArea = new Area2d(rectMinPoint, rectMaxPoint, new Vector4i(0, 0, 0, 0)); + activeSpans = newActiveSpans; + } - boolean isLineArea = subArea.width <= 1 || subArea.height <= 1; - subAreas.add(subArea); + // Output remaining active spans that can't be extended anymore + int lastY = poly.yCoords.get(poly.yCoords.size() - 1); + for (RectilinearEdgePoly.Span span : activeSpans) { + subAreas.add(new Area2d(span.x1, span.y, span.x2, lastY, new Vector4i(1, 1, 1, 1))); + } + color = 0; - HashSet containedPoints = poly.getRemainingPointsInRect(rectMinPoint, rectMaxPoint); - for (FacingVector2i containedPoint : containedPoints) { - // Keep corners on the top side (if not present, will be added later below) - if (containedPoint.x == rectMaxPoint.x && containedPoint.y == rectMaxPoint.y) { - if (containedPoint.hasConnectionTowards(ForgeDirection.NORTH)) { - // We were the connection north, that has now moved up with this rectangle - containedPoint.facings.remove(ForgeDirection.NORTH); - } else if (containedPoint.hasConnectionTowards(ForgeDirection.SOUTH) && containedPoint.hasConnectionTowards(ForgeDirection.EAST)) { - // needed? - containedPoint.facings.remove(ForgeDirection.SOUTH); - } - continue; - } - if (containedPoint.x == topLeftCorner.x && containedPoint.y == topLeftCorner.y) continue; - - // Is point on the top edge and has a connection to something further out that isn't covered by this rectangle? - if (containedPoint.y != rectMaxPoint.y && containedPoint.hasConnectionTowards(ForgeDirection.EAST)) { - // Was point connected to the left boundary that we moved right with this rectangle? - if (containedPoint.hasConnectionTowards(ForgeDirection.NORTH)) { - containedPoint.facings.remove(ForgeDirection.NORTH); - containedPoint.facings.add(ForgeDirection.SOUTH); - } - continue; - } - if (containedPoint.y == rectMaxPoint.y && containedPoint.hasConnectionTowards(ForgeDirection.SOUTH) && !containedPoint.hasConnectionTowards(ForgeDirection.EAST)) { - // Point is on the top edge and has a connection to the right, leave it for later rectangles - continue; - } - if (containedPoint.y == rectMinPoint.y && containedPoint.x > rectMinPoint.x && containedPoint.hasConnectionTowards(ForgeDirection.NORTH)) { - // Point is on the left edge and has a connection to a lower rectangle, leave it for later rectangles - continue; - } - if (worldObj.getBlock(containedPoint.x, this.yCoord - 2, containedPoint.y) == Blocks.diamond_block) { - UtilitiesInExcess.chat("Removing point at " + containedPoint + " for subarea " + subArea); - } - poly.removeFromRemainingPoints(containedPoint); + for (int i = 1; i < subAreas.size() - 1; i++) { + Area2d currentArea = subAreas.get(i); + Area2d nextArea = subAreas.get(i + 1); + if (currentArea.width < nextArea.width) { + //currentArea.applyShrinkMatrix(new Vector4i(0, 0, 0, -1)); } + } - // DEBUG: Draw new sub area on floor +// DEBUG: Draw sub areas on floor + for (Area2d subArea : subAreas) { for (int x = subArea.low.x; x <= subArea.high.x; x++) { for (int z = subArea.low.y; z <= subArea.high.y; z++) { if (worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.wool || worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.gold_block) { - //worldObj.setBlock(x, this.yCoord - 1, z, Blocks.gold_block); + worldObj.setBlock(x, this.yCoord - 1, z, Blocks.gold_block); //throw new RuntimeException("Overlapping sub-areas detected at " + x + ", " + z); } else { worldObj.setBlock(x, this.yCoord - 1, z, Blocks.wool, color, 2); @@ -426,148 +321,157 @@ private LinkedList computeRectanglesFromRectilinearPointPolygon(List newPoints = new ArrayList<>(); - // Determine facing of top right corner - if (containedPoints.contains(topLeftCorner)) { - rectMaxPoint.facings.add(ForgeDirection.NORTH); - } - if (poly.maxY == rectMaxPoint.y) { - rectMaxPoint.facings.add(ForgeDirection.EAST); - } - - newPoints.add(topLeftCorner); - newPoints.add(rectMaxPoint); - poly.unshiftPointsToRemainingPointsIfMissing(newPoints); - - } - - // DEBUG: Show points used for area & remaining points one above that - for (Vector2i remainingPoint : poly.remainingPoints) { - worldObj.setBlock(remainingPoint.x, this.yCoord + 2 + subAreas.size() * 2, remainingPoint.y, Blocks.stained_glass, color, 2); - } - worldObj.setBlock(rectMinPoint.x, this.yCoord + 1 + subAreas.size() * 2, rectMinPoint.y, Blocks.wool, color, 2); - worldObj.setBlock(rectMaxPoint.x, this.yCoord + 1 + subAreas.size() * 2, rectMaxPoint.y, Blocks.wool, color, 2); - color++; if (color == 16) { color = 0; } - - UtilitiesInExcess.LOG.info("Added subarea at {}", subArea.toString()); } return subAreas; } - private static class RectilinearPointPoly { - - LinkedHashSet remainingPoints = new LinkedHashSet<>(); - ArrayDeque stackPoints = new ArrayDeque<>(); - HashMap> xMarkersByY = new HashMap<>(); - private int maxY = Integer.MIN_VALUE; - private int minY = Integer.MAX_VALUE; - - - RectilinearPointPoly(List points) { - points.sort( - Comparator.comparingInt(FacingVector2i::x) - .thenComparingInt(FacingVector2i::y)); - for (FacingVector2i sortedPoint : points) { - this.stackPoints.add(sortedPoint); - this.remainingPoints.add(sortedPoint); - this.xMarkersByY.computeIfAbsent(sortedPoint.y, k -> new HashSet<>()).add(sortedPoint.x); - if (sortedPoint.y > maxY) maxY = sortedPoint.y; - if (sortedPoint.y < minY) minY = sortedPoint.y; + private static class RectilinearEdgePoly { + + List yCoords; + HashMap> verticalEdgesByX; + HashMap> horizontalEdgesByY; + + RectilinearEdgePoly(List points) { + // Build edges from point list + Iterator iter = points.iterator(); + List edges = new ArrayList<>(); + Vector2i current = null; + Vector2i next = null; + while (iter.hasNext()) { + current = next != null ? next : iter.next(); + next = iter.hasNext() ? iter.next() : points.get(0); + edges.add(new Edge(current, next)); + } + // Connect back to start + if (next != null) edges.add(new Edge(next, points.get(0))); + + // Build list of Y coordinates with points sorted by the lovely tree set + Set ySet = new TreeSet<>(); + // Build vertical edge map for x & y lookups + verticalEdgesByX = new HashMap<>(); + horizontalEdgesByY = new HashMap<>(); + + for (Edge edge : edges) { + ySet.add(edge.p1.y); + ySet.add(edge.p2.y); + if (edge.isVertical()) { + verticalEdgesByX.computeIfAbsent(edge.getX(), k -> new ArrayList<>()).add(edge); + } else if (edge.isHorizontal()) { + horizontalEdgesByY.computeIfAbsent(edge.getY(), k -> new ArrayList<>()).add(edge); + } } + yCoords = new ArrayList<>(ySet); } /** - * Add new points to the remaining points if they are not already present + * Find all vertical edges that cross the horizontal line at y */ - void unshiftPointsToRemainingPointsIfMissing(List newPoints) { - List missingPoints = newPoints.stream() - .filter((point) -> !remainingPoints.contains(point)) - .collect(Collectors.toList()); - - if (!missingPoints.isEmpty()) { - List points = new ArrayList<>(stackPoints); - points.addAll(missingPoints); - - stackPoints.clear(); - remainingPoints.clear(); - xMarkersByY.clear(); - maxY = Integer.MIN_VALUE; - minY = Integer.MAX_VALUE; - - // Same logic as in constructor - sort random remaining pool of points by x & y, then add in low to high - // order - points.sort( - Comparator.comparingInt(FacingVector2i::x) - .thenComparingInt(FacingVector2i::y)); - for (FacingVector2i sortedPoint : points) { - this.stackPoints.add(sortedPoint); - this.remainingPoints.add(sortedPoint); - this.xMarkersByY.computeIfAbsent(sortedPoint.y, k -> new HashSet<>()).add(sortedPoint.x); - if (sortedPoint.y > maxY) maxY = sortedPoint.y; - if (sortedPoint.y < minY) minY = sortedPoint.y; + List findSpansAtY(int y) { + // Collect x-coordinates where edges cross + Set xIntersections = new TreeSet<>(); + + for (Map.Entry> entry : verticalEdgesByX.entrySet()) { + for (Edge e : entry.getValue()) { + // Check if this vertical edge crosses y (exclusive on top to avoid double counting) + if (e.getMinY() <= y && e.getMaxY() > y) { + xIntersections.add(entry.getKey()); + } } } - } - void removeFromRemainingPoints(FacingVector2i point) { - this.remainingPoints.remove(point); - this.stackPoints.remove(point); - this.xMarkersByY.get(point.y).remove(point.x); - // If we removed the max Y point, recalculate - if (point.y == maxY) { - maxY = remainingPoints.stream() - .mapToInt(p -> p.y) - .max() - .orElse(Integer.MIN_VALUE); - minY = remainingPoints.stream() - .mapToInt(p -> p.y) - .min() - .orElse(Integer.MAX_VALUE); + // Pair up intersections to form spans (inside regions) + // Assumes even number of intersections (entering/exiting polygon) + List spans = new ArrayList<>(); + List xCoords = new ArrayList<>(xIntersections); + + for (int i = 0; i < xIntersections.size(); i += 2) { + if (i + 1 < xIntersections.size()) { + spans.add(new Span(xCoords.get(i), xCoords.get(i + 1), y)); + } } + + return spans; } - HashSet getRemainingPointsInRect(FacingVector2i low, FacingVector2i high) { - HashSet points = new HashSet<>(); - for (FacingVector2i remainingPoint : this.remainingPoints) { - if (remainingPoint.x < low.x || remainingPoint.y < low.y || remainingPoint.y > high.y) - continue; - if (remainingPoint.x > high.x) break; - points.add(remainingPoint); + boolean intersectsWithHorizontalBoundary(int y, int x1, int x2, World world, int color, int actualY) { + List boundaries = horizontalEdgesByY.getOrDefault(y, Collections.emptyList()); + for (Edge edge : boundaries) { + // Check if [x1, x2] overlaps with [boundary.x1, boundary.x2] + if (x1 <= edge.getMaxX() && x2 >= edge.getMinX()) { + for (int i = edge.getMinX(); i <= edge.getMaxX(); i++) { + world.setBlock(i, actualY, y, Blocks.wool, color, 2); + } + world.setBlock(x1, actualY, y, Blocks.stained_glass, color, 2); + world.setBlock(x2, actualY, y, Blocks.stained_glass, color, 2); + return true; // Our span is contained within a boundary edge + } } - return points; + return false; } - FacingVector2i shiftPoint() { - FacingVector2i point = stackPoints.removeFirst(); - this.removeFromRemainingPoints(point); - return point; - } + static class Edge { + Vector2i p1, p2; - /** - * Check if we have remaining points to process - * This does not check if there are any remaining points but if there are enough points left to form a rectangle - */ - boolean hasRemaining() { - return !stackPoints.isEmpty(); - } + Edge(Vector2i p1, Vector2i p2) { + this.p1 = p1; + this.p2 = p2; + } - boolean canFormRectangle() { - return stackPoints.size() >= 4; - } + boolean isHorizontal() { + return p1.y == p2.y; + } + + boolean isVertical() { + return p1.x == p2.x; + } + + int getY() { + return p1.y; // For horizontal edges + } + + int getX() { + return p1.x; // For vertical edges + } + + int getMinX() { + return Math.min(p1.x, p2.x); + } + + int getMaxX() { + return Math.max(p1.x, p2.x); + } + + int getMinY() { + return Math.min(p1.y, p2.y); + } + + int getMaxY() { + return Math.max(p1.y, p2.y); + } - boolean hasPointAt(Vector2i point) { - return remainingPoints.stream().anyMatch(p -> p.x == point.x && p.y == point.y); + @Override + public String toString() { + return p1 + " -> " + p2; + } } - int getXsAtY(int y) { - return xMarkersByY.getOrDefault(y, new HashSet<>()).size(); + static class Span { + int x1, x2, y; + + Span(int x1, int x2, int y) { + this.x1 = x1; + this.x2 = x2; + this.y = y; + } + + boolean matches(Span other) { + return this.x1 == other.x1 && this.x2 == other.x2; + } } } @@ -1003,7 +907,7 @@ public void updateEntity() { state = QuarryWorkState.FINISHED; unloadSelf(); } else { - workArea = nextWorkAreas.remove(); + workArea = nextWorkAreas.remove(nextWorkAreas.size() - 1); } } if (brokenBlocksTick > 0) { @@ -1206,11 +1110,11 @@ public static class Area2d { // The corner that has the higher x&y public final Vector2i high; // The width of the entire working area - public final int width; + public int width; // The height of the entire working area - public final int height; + public int height; // The distance to the closest lower x chunk border from the high x bound - public final int chunkOffX; + public int chunkOffX; public Area2d(Vector2i first, Vector2i second, Vector4i shrinkMatrix) { int lowX = Math.min(first.x, second.x) + (shrinkMatrix.x); // Side: left @@ -1228,6 +1132,10 @@ public Area2d(int x1, int z1, int x2, int z2) { this(new Vector2i(x1, z1), new Vector2i(x2, z2)); } + public Area2d(int x1, int z1, int x2, int z2, Vector4i shrinkMatrix) { + this(new Vector2i(x1, z1), new Vector2i(x2, z2), shrinkMatrix); + } + public Area2d(Vector2i first, Vector2i second) { // Don't shrink anywhere this(first, second, new Vector4i(0, 0, 0, 0)); @@ -1242,6 +1150,16 @@ public boolean isInBounds(int x, int z) { return x >= this.low.x && x <= this.high.x && z >= this.low.y && z <= this.high.y; } + public void applyShrinkMatrix(Vector4i shrinkMatrix) { + this.low.x += shrinkMatrix.x; + this.low.y += shrinkMatrix.y; + this.high.x -= shrinkMatrix.z; + this.high.y -= shrinkMatrix.w; + this.width = this.high.x - this.low.x; + this.height = this.high.y - this.low.y; + this.chunkOffX = this.high.x - (this.high.x & -16); + } + public void writeNBTTag(NBTTagCompound nbt) { NBTTagCompound tag = new NBTTagCompound(); tag.setInteger("lowX", low.x); From 46ff99d90e83204b2dc066403cba1ce7ad091c15 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Wed, 17 Dec 2025 04:19:02 +0100 Subject: [PATCH 12/28] Arbitrary marker system shrinking, implementing with actual quarry workflow, fixing some bugs --- .../blocks/ender_quarry/BlockEnderMarker.java | 3 - .../tileentities/TileEntityEnderMarker.java | 54 +++-- .../tileentities/TileEntityEnderQuarry.java | 210 ++++++++---------- 3 files changed, 136 insertions(+), 131 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java index 5ab31f1c..5635e648 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java @@ -78,9 +78,6 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer TileEntity te = worldIn.getTileEntity(x, y, z); if (te instanceof TileEntityEnderMarker marker) { if (player.isSneaking()) { - if (marker.operationMode == TileEntityEnderMarker.MarkerOperationMode.ARBITRARY_LOOP) { - marker.boundaryForArbitraryLoop(); - } int newCuboidSize = marker.increaseCuboidSize(); player .addChatComponentMessage(new ChatComponentText("Increased cuboid size to " + newCuboidSize + ".")); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java index 33597163..5c6473d9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -12,9 +12,14 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import net.minecraft.init.Blocks; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.play.server.S2APacketParticles; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; import org.jetbrains.annotations.NotNull; @@ -54,11 +59,11 @@ private ConcurrentHashMap getRegistryForDimensi return registeredMarkers.computeIfAbsent(dim, k -> new ConcurrentHashMap<>()); } - public @Nullable List checkForBoundary(ForgeDirection starterFacing) { + public @Nullable List checkForBoundary(ForgeDirection starterFacing, EntityPlayer player) { return switch (operationMode) { case DEFAULT -> boundaryFromThree(starterFacing); case SINGLE -> boundaryForSizedCuboid(starterFacing); - case ARBITRARY_LOOP -> boundaryForArbitraryLoop(); + case ARBITRARY_LOOP -> boundaryForArbitraryLoop(player); }; } @@ -89,20 +94,25 @@ private List boundaryForSizedCuboid(ForgeDirection facing) { .collect(Collectors.toList()); } - public List boundaryForArbitraryLoop() { - // TODO: Has issues with markers that have more than 2 connections (uses not boundary not intendeed by player) - - // maybe limit to 2 connections if this mode is used and propagate that other markers in chain? + public List boundaryForArbitraryLoop(EntityPlayer player) { + // TODO: Has issues with markers that have more than 2 connections (uses not boundary not intended by player) - + // maybe limit to 2 connections if this mode is used and propagate that to other markers in chain? ArrayList stack = new ArrayList<>(); stack.add(new StackEntry(new LinkedHashMap<>(), this)); + StackEntry lastVisited; Set markerChain = null; searchStack: do { StackEntry entry = stack.remove(stack.size() - 1); + lastVisited = entry; + // If we have no discovered aligned markers yet, or the only discovered marker + // is the one we came from (a single back-connection), refresh discovery so we + // can populate any missing/stale connections (e.g. after chunk reload). if (entry.current.alignedMarkers.isEmpty() || entry.current.alignedMarkers.size() == 1 - && entry.current.alignedMarkers.get(entry.lastVisited.getValue()) != null - && entry.current.alignedMarkers.get(entry.lastVisited.getValue()) - .getKey() == entry.lastVisited.getKey()) { + && (entry.lastVisited == null || (entry.current.alignedMarkers.get(entry.lastVisited.getValue()) != null + && entry.current.alignedMarkers.get(entry.lastVisited.getValue()) + .getKey() == entry.lastVisited.getKey()))) { entry.current.checkForAlignedMarkers(); } @@ -152,7 +162,27 @@ public List boundaryForArbitraryLoop() { markerChain.forEach((e) -> pointChain.add(new Vector2i(e.xCoord, e.zCoord))); return pointChain; } - UtilitiesInExcess.chat("Failed to complete marker chain."); + player.addChatComponentMessage(new ChatComponentText(String.format("Failed to complete marker chain, with last marker at (%d %d %d).", + lastVisited.current.xCoord, lastVisited.current.yCoord, lastVisited.current.zCoord))); + // Spawn particles to show where the chain broke + for (Object obj : worldObj.playerEntities) { + EntityPlayerMP playerMP = (EntityPlayerMP) obj; + double distance = player.getDistanceSq(xCoord, yCoord, zCoord); + if (distance < 1024) { // 32 block range + S2APacketParticles packet = new S2APacketParticles( + "flame", + (float)(lastVisited.current.xCoord + 0.5), + (float)(lastVisited.current.yCoord + 3.25), + (float)(lastVisited.current.zCoord + 0.5), + 0.0F, + 1F, + 0.0F, + 0.04F, // speed + 400 // count + ); + playerMP.playerNetServerHandler.sendPacket(packet); + } + } return null; } @@ -402,11 +432,9 @@ public FacingVector2i(int x, int z, List facings) { public FacingVector2i(int x, int z, ForgeDirection facing) { super(x, z); this.facings = new HashSet<>(); - if (facing != ForgeDirection.UNKNOWN) - this.facings.add(facing); + if (facing != ForgeDirection.UNKNOWN) this.facings.add(facing); } - boolean hasConnectionTowards(ForgeDirection dir) { return facings.contains(dir); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 7673d27b..b715b198 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -17,16 +17,16 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.play.server.S2APacketParticles; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.IWorldAccess; -import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.Fluid; @@ -40,6 +40,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Vector2i; +import org.joml.Vector4i; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; @@ -51,7 +52,6 @@ import it.unimi.dsi.fastutil.Hash; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; -import org.joml.Vector4i; public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver, IFluidHandler { @@ -95,7 +95,7 @@ public void resetState() { public String getState() { return switch (state) { case RUNNING -> String - .format("Quarry is currently mining at %d %d %d, has already mined %d", dx, dy, dz, brokenBlocksTotal); + .format("Quarry is currently mining at %d %d %d, has already mined %d blocks", dx, dy, dz, brokenBlocksTotal); case STOPPED_WAITING_FOR_FLUID_SPACE -> "Quarry is full on fluids"; case STOPPED_WAITING_FOR_ITEM_SPACE -> "Quarry is full on items"; case STOPPED_WAITING_FOR_ENERGY -> "Quarry is missing energy"; @@ -127,7 +127,7 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); if (te instanceof TileEntityEnderMarker marker) { @Nullable - List scanReturn = marker.checkForBoundary(dir); + List scanReturn = marker.checkForBoundary(dir, player); if (scanReturn != null) { nextWorkAreas.clear(); // Do we have a simple rectangle as defined by two points @@ -158,63 +158,35 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { return; // Or do we have a more complex rectilinear polygon as defined by many points } else { - // DEBUG: Clear work area of debug blocks - Vector2i low = new Vector2i(Integer.MAX_VALUE); - Vector2i high = new Vector2i(Integer.MIN_VALUE); - for (Vector2i point : scanReturn) { - if (point.x < low.x) { - low.x = point.x; - } - if (point.y < low.y) { - low.y = point.y; - } - if (point.x > high.x) { - high.x = point.x; - } - if (point.y > high.y) { - high.y = point.y; - } - } - - for (int x = low.x; x <= high.x; x++) { - for (int z = low.y; z <= high.y; z++) { - worldObj.setBlock(x, this.yCoord - 1, z, Blocks.grass); - } - } - - for (int dy = 1; dy < 51; dy++) { - for (int x = low.x; x <= high.x; x++) { - for (int z = low.y; z <= high.y; z++) { - worldObj.setBlock(x, this.yCoord + dy, z, Blocks.air); - } - } - } - - for (Vector2i point : scanReturn) { - worldObj - .setBlock(point.x, this.yCoord + 2, point.y, Blocks.brick_block); - } - - List subRectangles; - try { - subRectangles = computeRectanglesFromRectilinearPointPolygon(scanReturn); - } catch (RuntimeException e) { - StackTraceElement[] stackTrace = e.getStackTrace(); - StackTraceElement lastElement = stackTrace[0]; - player.addChatComponentMessage( - new ChatComponentText( - String.format( - "Ender marker at (%d %d %d) failed to set up a fence boundary: %s - [%s:%s]", - marker.xCoord, - marker.yCoord, - marker.zCoord, - e.getMessage(), - lastElement.getFileName(), - lastElement.getLineNumber()))); - return; - } + /* + * // DEBUG: Clear work area of debug blocks + * Vector2i low = new Vector2i(Integer.MAX_VALUE); + * Vector2i high = new Vector2i(Integer.MIN_VALUE); + * for (Vector2i point : scanReturn) { + * if (point.x < low.x) { + * low.x = point.x; + * } + * if (point.y < low.y) { + * low.y = point.y; + * } + * if (point.x > high.x) { + * high.x = point.x; + * } + * if (point.y > high.y) { + * high.y = point.y; + * } + * } + * for (int x = low.x; x <= high.x; x++) { + * for (int z = low.y; z <= high.y; z++) { + * worldObj.setBlock(x, this.yCoord - 1, z, Blocks.grass); + * } + * } + */ + + nextWorkAreas = computeRectanglesFromRectilinearPointPolygon(scanReturn); + setWorkArea(nextWorkAreas.remove(nextWorkAreas.size() - 1)); + state = QuarryWorkState.RUNNING; return; - //nextWorkAreas = subRectangles; } } else { player.addChatComponentMessage( @@ -235,7 +207,7 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { private List computeRectanglesFromRectilinearPointPolygon(List points) { RectilinearEdgePoly poly = new RectilinearEdgePoly(points); List subAreas = new ArrayList<>(); - int color = 0; + // int color = 0; List activeSpans = new ArrayList<>(); @@ -267,19 +239,22 @@ private List computeRectanglesFromRectilinearPointPolygon(List // Check if bottom and top align with actual boundary edges int lowX = Math.min(active.x1, active.x2) + 1; int highX = Math.max(active.x1, active.x2) - 1; - boolean intersectsWithBottomBoundary = poly.intersectsWithHorizontalBoundary( - active.y, lowX, highX, worldObj, color, this.yCoord + 4); - boolean intersectsWithTopBoundary = poly.intersectsWithHorizontalBoundary( - y, lowX, highX, worldObj, color, this.yCoord + 4); - -// subAreas.add(new Area2d(active.x1, active.y, active.x2, y - 1, -// new Vector4i(1, intersectsWithBottomBoundary ? 1 : 0, 1, intersectsWithTopBoundary ? 1 : 0))); - subAreas.add(new Area2d(active.x1, active.y, active.x2, y - 1, - new Vector4i(1, 0, 1, 0))); - color++; - if (color == 16) { - color = 0; - } + boolean intersectsWithBottomBoundary = poly.intersectsWithHorizontalBoundary(active.y, lowX, highX) + && (active.y != y); + boolean intersectsWithTopBoundary = poly.intersectsWithHorizontalBoundary(y, lowX, highX) + && (active.y != y); + + subAreas.add( + new Area2d( + active.x1, + active.y, + active.x2, + y, + new Vector4i( + 1, + intersectsWithBottomBoundary ? 1 : 0, + 1, + intersectsWithTopBoundary ? 1 : 0))); } } @@ -296,36 +271,40 @@ private List computeRectanglesFromRectilinearPointPolygon(List // Output remaining active spans that can't be extended anymore int lastY = poly.yCoords.get(poly.yCoords.size() - 1); for (RectilinearEdgePoly.Span span : activeSpans) { - subAreas.add(new Area2d(span.x1, span.y, span.x2, lastY, new Vector4i(1, 1, 1, 1))); + boolean intersectsWithBottomBoundary = poly.intersectsWithHorizontalBoundary( + span.y, + Math.min(span.x1, span.x2) + 1, + Math.max(span.x1, span.x2) - 1) && (span.y != lastY); + // Always shrink top side on last rectangle + subAreas.add( + new Area2d( + span.x1, + span.y, + span.x2, + lastY, + new Vector4i(1, intersectsWithBottomBoundary ? 1 : 0, 1, 1))); } - color = 0; - for (int i = 1; i < subAreas.size() - 1; i++) { - Area2d currentArea = subAreas.get(i); - Area2d nextArea = subAreas.get(i + 1); - if (currentArea.width < nextArea.width) { - //currentArea.applyShrinkMatrix(new Vector4i(0, 0, 0, -1)); - } - } - -// DEBUG: Draw sub areas on floor - for (Area2d subArea : subAreas) { - for (int x = subArea.low.x; x <= subArea.high.x; x++) { - for (int z = subArea.low.y; z <= subArea.high.y; z++) { - if (worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.wool || worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.gold_block) { - worldObj.setBlock(x, this.yCoord - 1, z, Blocks.gold_block); - //throw new RuntimeException("Overlapping sub-areas detected at " + x + ", " + z); - } else { - worldObj.setBlock(x, this.yCoord - 1, z, Blocks.wool, color, 2); - } - } - } - - color++; - if (color == 16) { - color = 0; - } - } + /* + * // DEBUG: Draw sub areas on floor + * for (Area2d subArea : subAreas) { + * for (int x = subArea.low.x; x <= subArea.high.x; x++) { + * for (int z = subArea.low.y; z <= subArea.high.y; z++) { + * if (worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.wool || worldObj.getBlock(x, this.yCoord - 1, z) == + * Blocks.gold_block) { + * worldObj.setBlock(x, this.yCoord - 1, z, Blocks.gold_block); + * //throw new RuntimeException("Overlapping sub-areas detected at " + x + ", " + z); + * } else { + * worldObj.setBlock(x, this.yCoord - 1, z, Blocks.wool, color, 2); + * } + * } + * } + * color++; + * if (color == 16) { + * color = 0; + * } + * } + */ return subAreas; } @@ -360,9 +339,11 @@ private static class RectilinearEdgePoly { ySet.add(edge.p1.y); ySet.add(edge.p2.y); if (edge.isVertical()) { - verticalEdgesByX.computeIfAbsent(edge.getX(), k -> new ArrayList<>()).add(edge); + verticalEdgesByX.computeIfAbsent(edge.getX(), k -> new ArrayList<>()) + .add(edge); } else if (edge.isHorizontal()) { - horizontalEdgesByY.computeIfAbsent(edge.getY(), k -> new ArrayList<>()).add(edge); + horizontalEdgesByY.computeIfAbsent(edge.getY(), k -> new ArrayList<>()) + .add(edge); } } yCoords = new ArrayList<>(ySet); @@ -398,23 +379,19 @@ List findSpansAtY(int y) { return spans; } - boolean intersectsWithHorizontalBoundary(int y, int x1, int x2, World world, int color, int actualY) { + boolean intersectsWithHorizontalBoundary(int y, int x1, int x2) { List boundaries = horizontalEdgesByY.getOrDefault(y, Collections.emptyList()); for (Edge edge : boundaries) { // Check if [x1, x2] overlaps with [boundary.x1, boundary.x2] if (x1 <= edge.getMaxX() && x2 >= edge.getMinX()) { - for (int i = edge.getMinX(); i <= edge.getMaxX(); i++) { - world.setBlock(i, actualY, y, Blocks.wool, color, 2); - } - world.setBlock(x1, actualY, y, Blocks.stained_glass, color, 2); - world.setBlock(x2, actualY, y, Blocks.stained_glass, color, 2); - return true; // Our span is contained within a boundary edge + return true; // Our span is contained within a boundary edge } } return false; } static class Edge { + Vector2i p1, p2; Edge(Vector2i p1, Vector2i p2) { @@ -461,6 +438,7 @@ public String toString() { } static class Span { + int x1, x2, y; Span(int x1, int x2, int y) { @@ -884,8 +862,10 @@ public void updateEntity() { while (brokenBlocksTick < (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1)) && stepPos()) { // TODO: Remove after this has been tested by others if (!isInBounds() || this.chunkX > 1000 || this.chunkZ > 1000) { - throw new RuntimeException( - String.format("Tried to quarry outside of work area at %d %d %d", dx, dy, dz)); + UtilitiesInExcess.LOG.warn("Tried to quarry outside of work area at {} {} {}", dx, dy, dz); + return; + // throw new RuntimeException( + // String.format("Tried to quarry outside of work area at %d %d %d", dx, dy, dz)); } boolean[] harvestResult = tryHarvestCurrentBlock(); @@ -907,7 +887,7 @@ public void updateEntity() { state = QuarryWorkState.FINISHED; unloadSelf(); } else { - workArea = nextWorkAreas.remove(nextWorkAreas.size() - 1); + setWorkArea(nextWorkAreas.remove(nextWorkAreas.size() - 1)); } } if (brokenBlocksTick > 0) { From f3639c432efb8864e21fe0922b66d68ece1e70de Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Thu, 18 Dec 2025 04:35:23 +0100 Subject: [PATCH 13/28] Limit loop markers to 2 links even when restoring --- .../tileentities/TileEntityEnderMarker.java | 170 +++++++++++------- .../tileentities/TileEntityEnderQuarry.java | 10 +- 2 files changed, 110 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java index 5c6473d9..65912e50 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -12,14 +12,13 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import net.minecraft.entity.effect.EntityLightningBolt; +import com.fouristhenumber.utilitiesinexcess.ModBlocks; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.play.server.S2APacketParticles; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; -import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; import org.jetbrains.annotations.NotNull; @@ -68,19 +67,24 @@ private ConcurrentHashMap getRegistryForDimensi } private @Nullable List boundaryFromThree(ForgeDirection starterFacing) { - Tuple secondCorner = alignedMarkers.getOrDefault(starterFacing, null); - if (secondCorner != null && secondCorner.getKey() != null) { - Tuple thirdCorner = Optional - .ofNullable( - secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnRight90(starterFacing), null)) - .orElse( - secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnLeft90(starterFacing), null)); - if (thirdCorner != null) { - return Stream - .of( - new Vector2i(this.xCoord, this.zCoord), - new Vector2i(thirdCorner.getValue().x, thirdCorner.getValue().z)) - .collect(Collectors.toList()); + for (ForgeDirection dir : HORIZONTAL_DIRECTIONS) { + // Don't check the direction back towards the quarry + if (dir == starterFacing.getOpposite()) continue; + + Tuple secondCorner = alignedMarkers.getOrDefault(dir, null); + if (secondCorner != null && secondCorner.getKey() != null) { + Tuple thirdCorner = Optional + .ofNullable( + secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnRight90(dir), null)) + .orElse( + secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnLeft90(dir), null)); + if (thirdCorner != null) { + return Stream + .of( + new Vector2i(this.xCoord, this.zCoord), + new Vector2i(thirdCorner.getValue().x, thirdCorner.getValue().z)) + .collect(Collectors.toList()); + } } } return null; @@ -106,6 +110,11 @@ public List boundaryForArbitraryLoop(EntityPlayer player) { StackEntry entry = stack.remove(stack.size() - 1); lastVisited = entry; + if (entry.current.operationMode != MarkerOperationMode.ARBITRARY_LOOP) { + // Set to arbitrary loop mode to avoid automatic linking to more than 2 directions + entry.current.operationMode = MarkerOperationMode.ARBITRARY_LOOP; + } + // If we have no discovered aligned markers yet, or the only discovered marker // is the one we came from (a single back-connection), refresh discovery so we // can populate any missing/stale connections (e.g. after chunk reload). @@ -113,17 +122,20 @@ public List boundaryForArbitraryLoop(EntityPlayer player) { && (entry.lastVisited == null || (entry.current.alignedMarkers.get(entry.lastVisited.getValue()) != null && entry.current.alignedMarkers.get(entry.lastVisited.getValue()) .getKey() == entry.lastVisited.getKey()))) { - entry.current.checkForAlignedMarkers(); + entry.current.checkForAlignedMarkers(entry.current.getActiveDirsFromMeta(), false, true); } + int realizedDirections = 0; for (Map.Entry> otherMarker : entry.current.alignedMarkers .entrySet()) { if (otherMarker.getValue() .getKey() != null) { - // Has not already been visited + // Has not already been visited & we have not already queued 2 new directions from this marker + // (avoid markers with >2 connections) if (!entry.visitedMarkers.containsKey( otherMarker.getValue() - .getKey())) { + .getKey()) + && realizedDirections < 2) { @SuppressWarnings("unchecked") // Same type LinkedHashMap visitedMarkers = (LinkedHashMap) entry.visitedMarkers .clone(); @@ -135,7 +147,7 @@ public List boundaryForArbitraryLoop(EntityPlayer player) { otherMarker.getKey() .getOpposite()); stack.add(stackEntry); - + realizedDirections++; continue; } @@ -162,24 +174,30 @@ public List boundaryForArbitraryLoop(EntityPlayer player) { markerChain.forEach((e) -> pointChain.add(new Vector2i(e.xCoord, e.zCoord))); return pointChain; } - player.addChatComponentMessage(new ChatComponentText(String.format("Failed to complete marker chain, with last marker at (%d %d %d).", - lastVisited.current.xCoord, lastVisited.current.yCoord, lastVisited.current.zCoord))); + + player.addChatComponentMessage( + new ChatComponentText( + String.format( + "Failed to complete marker chain, with last marker at (%d %d %d).", + lastVisited.current.xCoord, + lastVisited.current.yCoord, + lastVisited.current.zCoord))); // Spawn particles to show where the chain broke for (Object obj : worldObj.playerEntities) { EntityPlayerMP playerMP = (EntityPlayerMP) obj; double distance = player.getDistanceSq(xCoord, yCoord, zCoord); if (distance < 1024) { // 32 block range - S2APacketParticles packet = new S2APacketParticles( - "flame", - (float)(lastVisited.current.xCoord + 0.5), - (float)(lastVisited.current.yCoord + 3.25), - (float)(lastVisited.current.zCoord + 0.5), - 0.0F, - 1F, - 0.0F, - 0.04F, // speed - 400 // count - ); + S2APacketParticles packet = new S2APacketParticles( + "flame", + (float) (lastVisited.current.xCoord + 0.5), + (float) (lastVisited.current.yCoord + 3.25), + (float) (lastVisited.current.zCoord + 0.5), + 0.0F, + 1F, + 0.0F, + 0.04F, // speed + 400 // count + ); playerMP.playerNetServerHandler.sendPacket(packet); } } @@ -209,11 +227,32 @@ private static class StackEntry { } public void checkForAlignedMarkers() { - this.checkForAlignedMarkers(HORIZONTAL_DIRECTIONS, false); + this.checkForAlignedMarkers(HORIZONTAL_DIRECTIONS, false, false); } - public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyValidate) { + /** + * Checks for and establishes connections to aligned markers in the specified directions. + *

+ * This method performs two main operations: + *

+ * Attempts to resolve any null aligned markers by loading their chunks and retrieving + * the actual {@link TileEntityEnderMarker} instances from saved positions. + * + * Scans the dimension registry for new markers that can be connected in the given directions, + * respecting ARBITRARY_LOOP operation mode constraints. + * + * @param dirs The {@link ForgeDirection}s to check for aligned markers + * @param onlyValidate If true, only validates existing connections without establishing new ones + * @param forceMetaDirections If true, only accepts connections where the target marker's metadata + * indicates a connection back to this marker - meant to be used to restore stale connections + * + * @see #setAlignedMarker(ForgeDirection, TileEntityEnderMarker) + * @see #removeAlignedMarker(ForgeDirection) + */ + public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyValidate, boolean forceMetaDirections) { ConcurrentHashMap dimRegistry = getRegistryForDimension(); + + // First try to resolve any null aligned markers from saved positions for (Map.Entry> entry : new ArrayList<>( alignedMarkers.entrySet())) { if (entry.getValue() @@ -235,9 +274,14 @@ public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyV } } + // Now check for any aligned markers in the given directions for (ForgeDirection dir : dirs) { if (!alignedMarkers.containsKey(dir)) { for (Map.Entry entry : dimRegistry.entrySet()) { + if (operationMode == MarkerOperationMode.ARBITRARY_LOOP && alignedMarkers.size() >= 2) { + // In arbitrary loop mode, only allow 2 connections + break; + } if (entry.getValue() != null && entry.getValue() != this && !entry.getValue().alignedMarkers.containsKey(dir.getOpposite()) && entry.getKey().y == this.yCoord @@ -255,15 +299,24 @@ public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyV markerDirection = dx > 0 ? ForgeDirection.EAST : ForgeDirection.WEST; } if (markerDirection == dir) { - if (!onlyValidate) { + if (forceMetaDirections + && (worldObj.getBlockMetadata(entry.getKey().x, entry.getKey().y, entry.getKey().z) + & (1 << (dir.getOpposite().ordinal() - 2))) == 0) { + // The other marker's metadata does not indicate a (stale) connection to us, skip + continue; + } + // If this other marker is in loop mode only link if it has free connections (less than 2) + if (!onlyValidate && (entry.getValue().operationMode != MarkerOperationMode.ARBITRARY_LOOP || entry.getValue().alignedMarkers.size() < 2)) { setAlignedMarker(dir, entry.getValue()); entry.getValue() .setAlignedMarker(dir.getOpposite(), this); + // If we aren't in loop mode and just linked to a marker in loop mode, switch to loop mode (if we have less than 3 connections) + if (entry.getValue().operationMode == MarkerOperationMode.ARBITRARY_LOOP && this.operationMode != MarkerOperationMode.ARBITRARY_LOOP && this.alignedMarkers.size() < 3) { + this.operationMode = MarkerOperationMode.ARBITRARY_LOOP; + } } else if (!entry.getValue().alignedMarkers.containsKey(dir.getOpposite()) && (worldObj.getBlockMetadata(entry.getKey().x, entry.getKey().y, entry.getKey().z) - & (1 << (dir.getOpposite() - .ordinal() - 2))) - != 0) { + & (1 << (dir.getOpposite().ordinal() - 2))) != 0) { // Does the active store for this marker not contain us & but the metadata does? // Suggests we reloaded with previous connections, // and since we would usually link from "this" to "entry" unlink (just from the @@ -278,6 +331,11 @@ public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyV } } } + + // Finally check if the block metadata matches the active directions + if (worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord) != this.activeDirections) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, this.activeDirections, 2); + } } public void setAlignedMarker(ForgeDirection dir, TileEntityEnderMarker marker) { @@ -298,7 +356,13 @@ public void removeAlignedMarker(ForgeDirection dir) { } } - public ForgeDirection[] getActiveDirs() { + public ForgeDirection[] getActiveDirsFromMeta() { + // Make sure the loaded meta matches the blocks meta + if (worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord).equals(ModBlocks.ENDER_MARKER.get()) + && worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord) != this.activeDirections) { + this.activeDirections = worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); + } + List activeDirList = new ArrayList<>(); for (ForgeDirection dir : HORIZONTAL_DIRECTIONS) { // Is the bit for this direction set? @@ -310,7 +374,7 @@ public ForgeDirection[] getActiveDirs() { } public void teardownConnections() { - checkForAlignedMarkers(getActiveDirs(), true); + checkForAlignedMarkers(getActiveDirsFromMeta(), true, false); getRegistryForDimension().remove(new BlockPos(this.xCoord, this.yCoord, this.zCoord)); for (Map.Entry> alignedMarker : alignedMarkers .entrySet()) { @@ -418,30 +482,4 @@ public enum MarkerOperationMode { SINGLE, ARBITRARY_LOOP } - - public static class FacingVector2i extends Vector2i { - - HashSet facings; - - public FacingVector2i(int x, int z, List facings) { - super(x, z); - this.facings = new HashSet<>(); - this.facings.addAll(facings); - } - - public FacingVector2i(int x, int z, ForgeDirection facing) { - super(x, z); - this.facings = new HashSet<>(); - if (facing != ForgeDirection.UNKNOWN) this.facings.add(facing); - } - - boolean hasConnectionTowards(ForgeDirection dir) { - return facings.contains(dir); - } - - @Override - public String toString() { - return String.format("(%d, %d | %s)", x, y, facings.toString()); - } - } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index b715b198..67395edb 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -17,13 +17,11 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.network.play.server.S2APacketParticles; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; import net.minecraft.world.ChunkCoordIntPair; @@ -94,8 +92,12 @@ public void resetState() { public String getState() { return switch (state) { - case RUNNING -> String - .format("Quarry is currently mining at %d %d %d, has already mined %d blocks", dx, dy, dz, brokenBlocksTotal); + case RUNNING -> String.format( + "Quarry is currently mining at %d %d %d, has already mined %d blocks", + dx, + dy, + dz, + brokenBlocksTotal); case STOPPED_WAITING_FOR_FLUID_SPACE -> "Quarry is full on fluids"; case STOPPED_WAITING_FOR_ITEM_SPACE -> "Quarry is full on items"; case STOPPED_WAITING_FOR_ENERGY -> "Quarry is missing energy"; From 5666f8179a0ca5ee3ab8a6b7a400baacab1f0b9f Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Thu, 18 Dec 2025 19:58:35 +0100 Subject: [PATCH 14/28] Fix inverted sub-areas after shrinking, apply spotless --- .../tileentities/TileEntityEnderMarker.java | 44 ++++++++++------- .../tileentities/TileEntityEnderQuarry.java | 48 +++++++++++-------- 2 files changed, 54 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java index 65912e50..4fe92e53 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -12,7 +11,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import com.fouristhenumber.utilitiesinexcess.ModBlocks; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; @@ -25,6 +23,7 @@ import org.jetbrains.annotations.Nullable; import org.joml.Vector2i; +import com.fouristhenumber.utilitiesinexcess.ModBlocks; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.IFacingTE; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; @@ -74,10 +73,8 @@ private ConcurrentHashMap getRegistryForDimensi Tuple secondCorner = alignedMarkers.getOrDefault(dir, null); if (secondCorner != null && secondCorner.getKey() != null) { Tuple thirdCorner = Optional - .ofNullable( - secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnRight90(dir), null)) - .orElse( - secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnLeft90(dir), null)); + .ofNullable(secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnRight90(dir), null)) + .orElse(secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnLeft90(dir), null)); if (thirdCorner != null) { return Stream .of( @@ -236,20 +233,22 @@ public void checkForAlignedMarkers() { * This method performs two main operations: *

* Attempts to resolve any null aligned markers by loading their chunks and retrieving - * the actual {@link TileEntityEnderMarker} instances from saved positions. + * the actual {@link TileEntityEnderMarker} instances from saved positions. * * Scans the dimension registry for new markers that can be connected in the given directions, - * respecting ARBITRARY_LOOP operation mode constraints. + * respecting ARBITRARY_LOOP operation mode constraints. * - * @param dirs The {@link ForgeDirection}s to check for aligned markers - * @param onlyValidate If true, only validates existing connections without establishing new ones + * @param dirs The {@link ForgeDirection}s to check for aligned markers + * @param onlyValidate If true, only validates existing connections without establishing new ones * @param forceMetaDirections If true, only accepts connections where the target marker's metadata - * indicates a connection back to this marker - meant to be used to restore stale connections + * indicates a connection back to this marker - meant to be used to restore stale + * connections * * @see #setAlignedMarker(ForgeDirection, TileEntityEnderMarker) * @see #removeAlignedMarker(ForgeDirection) */ - public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyValidate, boolean forceMetaDirections) { + public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyValidate, + boolean forceMetaDirections) { ConcurrentHashMap dimRegistry = getRegistryForDimension(); // First try to resolve any null aligned markers from saved positions @@ -301,22 +300,30 @@ public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyV if (markerDirection == dir) { if (forceMetaDirections && (worldObj.getBlockMetadata(entry.getKey().x, entry.getKey().y, entry.getKey().z) - & (1 << (dir.getOpposite().ordinal() - 2))) == 0) { + & (1 << (dir.getOpposite() + .ordinal() - 2))) + == 0) { // The other marker's metadata does not indicate a (stale) connection to us, skip continue; } // If this other marker is in loop mode only link if it has free connections (less than 2) - if (!onlyValidate && (entry.getValue().operationMode != MarkerOperationMode.ARBITRARY_LOOP || entry.getValue().alignedMarkers.size() < 2)) { + if (!onlyValidate && (entry.getValue().operationMode != MarkerOperationMode.ARBITRARY_LOOP + || entry.getValue().alignedMarkers.size() < 2)) { setAlignedMarker(dir, entry.getValue()); entry.getValue() .setAlignedMarker(dir.getOpposite(), this); - // If we aren't in loop mode and just linked to a marker in loop mode, switch to loop mode (if we have less than 3 connections) - if (entry.getValue().operationMode == MarkerOperationMode.ARBITRARY_LOOP && this.operationMode != MarkerOperationMode.ARBITRARY_LOOP && this.alignedMarkers.size() < 3) { + // If we aren't in loop mode and just linked to a marker in loop mode, switch to loop + // mode (if we have less than 3 connections) + if (entry.getValue().operationMode == MarkerOperationMode.ARBITRARY_LOOP + && this.operationMode != MarkerOperationMode.ARBITRARY_LOOP + && this.alignedMarkers.size() < 3) { this.operationMode = MarkerOperationMode.ARBITRARY_LOOP; } } else if (!entry.getValue().alignedMarkers.containsKey(dir.getOpposite()) && (worldObj.getBlockMetadata(entry.getKey().x, entry.getKey().y, entry.getKey().z) - & (1 << (dir.getOpposite().ordinal() - 2))) != 0) { + & (1 << (dir.getOpposite() + .ordinal() - 2))) + != 0) { // Does the active store for this marker not contain us & but the metadata does? // Suggests we reloaded with previous connections, // and since we would usually link from "this" to "entry" unlink (just from the @@ -358,7 +365,8 @@ public void removeAlignedMarker(ForgeDirection dir) { public ForgeDirection[] getActiveDirsFromMeta() { // Make sure the loaded meta matches the blocks meta - if (worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord).equals(ModBlocks.ENDER_MARKER.get()) + if (worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord) + .equals(ModBlocks.ENDER_MARKER.get()) && worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord) != this.activeDirections) { this.activeDirections = worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 67395edb..620b1b2a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -157,11 +157,11 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { workArea.high.x, workArea.high.y, estBlocks))); - return; // Or do we have a more complex rectilinear polygon as defined by many points } else { + + // DEBUG: Clear work area of debug blocks /* - * // DEBUG: Clear work area of debug blocks * Vector2i low = new Vector2i(Integer.MAX_VALUE); * Vector2i high = new Vector2i(Integer.MIN_VALUE); * for (Vector2i point : scanReturn) { @@ -188,8 +188,8 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { nextWorkAreas = computeRectanglesFromRectilinearPointPolygon(scanReturn); setWorkArea(nextWorkAreas.remove(nextWorkAreas.size() - 1)); state = QuarryWorkState.RUNNING; - return; } + return; } else { player.addChatComponentMessage( new ChatComponentText( @@ -209,7 +209,7 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { private List computeRectanglesFromRectilinearPointPolygon(List points) { RectilinearEdgePoly poly = new RectilinearEdgePoly(points); List subAreas = new ArrayList<>(); - // int color = 0; + // DEBUG: int color = 0; List activeSpans = new ArrayList<>(); @@ -246,17 +246,16 @@ private List computeRectanglesFromRectilinearPointPolygon(List boolean intersectsWithTopBoundary = poly.intersectsWithHorizontalBoundary(y, lowX, highX) && (active.y != y); - subAreas.add( - new Area2d( - active.x1, - active.y, - active.x2, - y, - new Vector4i( - 1, - intersectsWithBottomBoundary ? 1 : 0, - 1, - intersectsWithTopBoundary ? 1 : 0))); + Area2d subArea = new Area2d( + active.x1, + active.y, + active.x2, + y, + new Vector4i(1, intersectsWithBottomBoundary ? 1 : 0, 1, intersectsWithTopBoundary ? 1 : 0)); + + // The base area should have a width and height greater than zero, but that might change after + // applying shrinkage + if (subArea.height > 0 && subArea.width > 0) subAreas.add(subArea); } } @@ -287,8 +286,8 @@ private List computeRectanglesFromRectilinearPointPolygon(List new Vector4i(1, intersectsWithBottomBoundary ? 1 : 0, 1, 1))); } + // DEBUG: Draw sub areas on floor /* - * // DEBUG: Draw sub areas on floor * for (Area2d subArea : subAreas) { * for (int x = subArea.low.x; x <= subArea.high.x; x++) { * for (int z = subArea.low.y; z <= subArea.high.y; z++) { @@ -864,10 +863,15 @@ public void updateEntity() { while (brokenBlocksTick < (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1)) && stepPos()) { // TODO: Remove after this has been tested by others if (!isInBounds() || this.chunkX > 1000 || this.chunkZ > 1000) { - UtilitiesInExcess.LOG.warn("Tried to quarry outside of work area at {} {} {}", dx, dy, dz); - return; - // throw new RuntimeException( - // String.format("Tried to quarry outside of work area at %d %d %d", dx, dy, dz)); + UtilitiesInExcess.LOG.warn( + "Tried to quarry outside of work area at {} {} {} for work area {}", + dx, + dy, + dz, + this.workArea.toString()); + worldObj.setBlock(dx, dy + 8, dz, Blocks.glass); + throw new RuntimeException( + String.format("Tried to quarry outside of work area at %d %d %d", dx, dy, dz)); } boolean[] harvestResult = tryHarvestCurrentBlock(); @@ -1103,6 +1107,8 @@ public Area2d(Vector2i first, Vector2i second, Vector4i shrinkMatrix) { int lowZ = Math.min(first.y, second.y) + (shrinkMatrix.y); // Side: bottom int highX = Math.max(first.x, second.x) - (shrinkMatrix.z); // Side: right int highZ = Math.max(first.y, second.y) - (shrinkMatrix.w); // Side: top + // We explicitly do not rerun min & max here since the shrink matrix might have inverted the area, + // But rather leave it to the caller to handle a 0 null width / height this.low = new Vector2i(lowX, lowZ); this.high = new Vector2i(highX, highZ); this.width = highX - lowX; @@ -1133,10 +1139,12 @@ public boolean isInBounds(int x, int z) { } public void applyShrinkMatrix(Vector4i shrinkMatrix) { + // Same here, we do not check a null / inverted area, but rather leave it up to the caller this.low.x += shrinkMatrix.x; this.low.y += shrinkMatrix.y; this.high.x -= shrinkMatrix.z; this.high.y -= shrinkMatrix.w; + this.width = this.high.x - this.low.x; this.height = this.high.y - this.low.y; this.chunkOffX = this.high.x - (this.high.x & -16); From 33fcffab6834942e3aa56874a323196683b32487 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Fri, 19 Dec 2025 05:52:51 +0100 Subject: [PATCH 15/28] Implement upgrade system & finish the rest of the upgrade models --- .../utilitiesinexcess/ModBlocks.java | 2 +- .../ender_quarry/BlockEnderQuarryUpgrade.java | 43 +- .../EnderQuarryUpgradeManager.java | 155 ++ .../ender_quarry/IEnderQuarryUpgrade.java | 5 - .../tileentities/TileEntityEnderMarker.java | 2 - .../tileentities/TileEntityEnderQuarry.java | 57 +- .../blockstates/ender_quarry_upgrade.json | 12 +- .../models/blocks/upgrade_fortune_1.json | 1412 +++++++++++ .../models/blocks/upgrade_fortune_2.json | 1802 ++++++++++++++ .../models/blocks/upgrade_fortune_3.json | 2062 +++++++++++++++++ .../models/blocks/upgrade_pump_fluids.json | 992 ++++++++ .../models/blocks/upgrade_silk_touch.json | 1122 +++++++++ .../models/blocks/upgrade_speed_1.json | 6 +- .../models/blocks/upgrade_world_hole.json | 1382 +++++++++++ .../textures/blocks/upgrade_fortune_1.png | Bin 0 -> 1811 bytes .../textures/blocks/upgrade_fortune_2.png | Bin 0 -> 2029 bytes .../textures/blocks/upgrade_fortune_3.png | Bin 0 -> 2244 bytes .../textures/blocks/upgrade_pump_fluids.png | Bin 0 -> 1682 bytes .../textures/blocks/upgrade_silk_touch.png | Bin 0 -> 1790 bytes .../textures/blocks/upgrade_world_hole.png | Bin 0 -> 1877 bytes 20 files changed, 9019 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_1.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_2.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_3.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_pump_fluids.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_silk_touch.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_world_hole.json create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_fortune_1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_fortune_2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_fortune_3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_pump_fluids.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_silk_touch.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_world_hole.png diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 42b98601..1a5e171f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -110,7 +110,7 @@ public enum ModBlocks { END_OF_TIME_PORTAL(BlockConfig.enableEndOfTimePortal && EndOfTimeConfig.enableEndOfTime, new BlockPortalEndOfTime(), BlockPortalEndOfTime.ItemBlockPortalEndOfTime.class, "temporal_gate"), ENDER_QUARRY(EnderQuarryConfig.enableEnderQuarry, new BlockEnderQuarry(), "ender_quarry"), ENDER_MARKER(EnderQuarryConfig.enableEnderQuarry, new BlockEnderMarker(), "ender_marker"), - ENDER_QUARRY_UPGRADE(EnderQuarryConfig.enableEnderQuarry, new BlockEnderQuarryUpgrade(), "ender_quarry_upgrade"), + ENDER_QUARRY_UPGRADE(EnderQuarryConfig.enableEnderQuarry, new BlockEnderQuarryUpgrade(), BlockEnderQuarryUpgrade.ItemEnderQuarryUpgrade.class, "ender_quarry_upgrade"), ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java index 0550fd0b..e964a0c5 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java @@ -2,19 +2,24 @@ import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import net.minecraft.world.World; -public class BlockEnderQuarryUpgrade extends Block implements IEnderQuarryUpgrade { +public class BlockEnderQuarryUpgrade extends Block { + @SideOnly(Side.CLIENT) private IIcon[] icons; public BlockEnderQuarryUpgrade() { super(Material.iron); setHardness(1f); + setBlockName("utilitiesinexcess:ender_quarry_upgrade"); setLightOpacity(0); } @@ -29,16 +34,34 @@ public int getRenderType() { } @Override - public int onBlockPlaced(World worldIn, int x, int y, int z, int side, float subX, float subY, float subZ, - int meta) { - return 0; + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[EnderQuarryUpgradeManager.EnderQuarryUpgrade.VALUES.length]; + for (int i = 0; i < EnderQuarryUpgradeManager.EnderQuarryUpgrade.VALUES.length; i++) { + EnderQuarryUpgradeManager.EnderQuarryUpgrade upgrade = EnderQuarryUpgradeManager.EnderQuarryUpgrade.VALUES[i]; + icons[i] = reg.registerIcon(upgrade.getTextureName()); + } } @Override - public void registerBlockIcons(IIconRegister reg) { - icons = new IIcon[3]; - icons[0] = reg.registerIcon("utilitiesinexcess:upgrade_speed_1"); - icons[1] = reg.registerIcon("utilitiesinexcess:upgrade_speed_2"); - icons[2] = reg.registerIcon("utilitiesinexcess:upgrade_speed_3"); + public int damageDropped(int meta) { + return meta; + } + + public static class ItemEnderQuarryUpgrade extends ItemBlock { + public ItemEnderQuarryUpgrade(Block block) { + super(block); + setMaxDamage(0); + setHasSubtypes(true); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(final ItemStack stack) { + return this.getUnlocalizedName() + "." + stack.getItemDamage(); + } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java new file mode 100644 index 00000000..8187331c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java @@ -0,0 +1,155 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry; + +import java.util.HashMap; + +import org.jetbrains.annotations.Nullable; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; + +public class EnderQuarryUpgradeManager { + + private final HashMap activeUpgrades = new HashMap<>(); + + // Add an upgrade - keeps highest tier + public void addUpgrade(EnderQuarryUpgrade upgrade) { + if (upgrade.isBoolean()) { + activeUpgrades.put(upgrade.name(), upgrade); + } else { + String baseName = upgrade.getTierGroup(); + EnderQuarryUpgrade current = activeUpgrades.get(baseName); + + // Only set if no current upgrade or new one is higher tier + if (current == null || upgrade.getTier() > current.getTier()) { + activeUpgrades.put(baseName, upgrade); + } + } + } + + // Check if a specific upgrade is active + public boolean has(EnderQuarryUpgrade upgrade) { + if (upgrade.isBoolean()) { + return activeUpgrades.containsKey(upgrade.name()); + } else { + EnderQuarryUpgrade current = activeUpgrades.get(upgrade.getTierGroup()); + return current != null && current.getTier() >= upgrade.getTier(); + } + } + + // Get the active upgrade for a tiered upgrade type + public EnderQuarryUpgrade getActive(TieredEnderQuarryUpgrade tieredUpgrade) { + return activeUpgrades.get(tieredUpgrade.getBaseName()); + } + + // Get value for a tiered upgrade type (returns defaultValue if not present) + public double getValue(TieredEnderQuarryUpgrade tieredUpgrade, double defaultValue) { + EnderQuarryUpgrade upgrade = activeUpgrades.get(tieredUpgrade.getBaseName()); + return upgrade != null ? upgrade.getValue() : defaultValue; + } + + // Check if any tier of an upgrade type is active + public boolean hasAny(TieredEnderQuarryUpgrade tieredUpgrade) { + return activeUpgrades.containsKey(tieredUpgrade.getBaseName()); + } + + public void remove(EnderQuarryUpgrade upgrade) { + if (upgrade.isBoolean()) { + activeUpgrades.remove(upgrade.name()); + } else { + activeUpgrades.remove(upgrade.getTierGroup()); + } + } + + public void clear() { + activeUpgrades.clear(); + } + + public enum EnderQuarryUpgrade { + // Boolean upgrades (presence only) + WORLD_HOLE(1.2, "upgrade_world_hole"), + SILK_TOUCH(8, "upgrade_silk_touch"), + PUMP_FLUIDS(3, "upgrade_pump_fluids"), + + // Tiered upgrades with hardcoded values + SPEED_1(TieredEnderQuarryUpgrade.SPEED, 1, 16, 2.0, "upgrade_speed_1"), + SPEED_2(TieredEnderQuarryUpgrade.SPEED, 2, 32, 4.0, "upgrade_speed_2"), + SPEED_3(TieredEnderQuarryUpgrade.SPEED, 3, 80, 7.0, "upgrade_speed_3"), + + FORTUNE_1(TieredEnderQuarryUpgrade.FORTUNE, 1, 12, 1, "upgrade_fortune_1"), + FORTUNE_2(TieredEnderQuarryUpgrade.FORTUNE, 2, 40, 2, "upgrade_fortune_2"), + FORTUNE_3(TieredEnderQuarryUpgrade.FORTUNE, 3, 100, 3, "upgrade_fortune_3"); + + + public static final EnderQuarryUpgrade[] VALUES = values(); + + private final boolean isBoolean; + private final double value; + private final double cost; + private final @Nullable TieredEnderQuarryUpgrade tierGroup; + private final int tier; + private final String textureName; + + // Constructor for boolean upgrades + EnderQuarryUpgrade(double cost, String textureName) { + this.isBoolean = true; + value = 0.0; + this.cost = cost; + tierGroup = null; + tier = 0; + this.textureName = String.format("%s:%s", UtilitiesInExcess.MODID, textureName); + } + + // Constructor for value-based upgrades + EnderQuarryUpgrade(@Nullable TieredEnderQuarryUpgrade tierGroup, int tier, double cost, double value, + String textureName) { + this.isBoolean = false; + this.value = value; + this.cost = cost; + this.tierGroup = tierGroup; + this.tier = tier; + this.textureName = String.format("%s:%s", UtilitiesInExcess.MODID, textureName); + } + + public boolean isBoolean() { + return isBoolean; + } + + public double getValue() { + if (isBoolean) { + throw new IllegalStateException(this + " is a boolean upgrade and has no value"); + } + return value; + } + + public double getCost() { + return cost; + } + + public String getTierGroup() { + if (isBoolean || tierGroup == null) { + throw new IllegalStateException(this + " is a boolean upgrade and has no tier group"); + } + return tierGroup.getBaseName(); + } + + public int getTier() { + if (isBoolean) { + throw new IllegalStateException(this + " is a boolean upgrade and has no tier"); + } + return tier; + } + + public String getTextureName() { + return textureName; + } + } + + public enum TieredEnderQuarryUpgrade { + + SPEED, + FORTUNE; + + public String getBaseName() { + return this.name(); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java deleted file mode 100644 index 6a620737..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/IEnderQuarryUpgrade.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry; - -public interface IEnderQuarryUpgrade { - -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java index 4fe92e53..af46f63a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -96,8 +96,6 @@ private List boundaryForSizedCuboid(ForgeDirection facing) { } public List boundaryForArbitraryLoop(EntityPlayer player) { - // TODO: Has issues with markers that have more than 2 connections (uses not boundary not intended by player) - - // maybe limit to 2 connections if this mode is used and propagate that to other markers in chain? ArrayList stack = new ArrayList<>(); stack.add(new StackEntry(new LinkedHashMap<>(), this)); StackEntry lastVisited; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 620b1b2a..3c0b2c94 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -19,13 +19,16 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.FakePlayerFactory; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; @@ -41,6 +44,8 @@ import org.joml.Vector4i; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderQuarryUpgrade; +import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.EnderQuarryUpgradeManager; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; @@ -70,6 +75,7 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver private int brokenBlocksTotal; private final HashMap sidedItemAcceptors = new HashMap<>(); private final HashMap sidedFluidAcceptors = new HashMap<>(); + private final EnderQuarryUpgradeManager upgradeManager = new EnderQuarryUpgradeManager(); protected final EnergyStorage energyStorage = new EnergyStorage(EnderQuarryConfig.enderQuarryEnergyStorage); protected final List fluidStorage = Stream @@ -555,8 +561,7 @@ private boolean tryConsumeEnergy(float hardness, boolean simulate) { private boolean harvestAndStoreBlock(Block block) { try { - // TODO: Use "shouldPumpFluids" or similar from upgrades - if (true) { + if (upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.PUMP_FLUIDS)) { FluidStack fluid = null; if (block == Blocks.water) { fluid = new FluidStack(FluidRegistry.WATER, 1000); @@ -570,18 +575,39 @@ private boolean harvestAndStoreBlock(Block block) { } } - // TODO: Use fake player? Make sure to use fortune upgrade + EntityPlayer fakePlayer = FakePlayerFactory.getMinecraft((WorldServer) worldObj); + @Nullable List drops = null; + int meta = worldObj.getBlockMetadata(dx, dy, dz); + // Try to silk touch if we have the upgrade + if (upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.SILK_TOUCH)) { + if (block.canSilkHarvest(worldObj, fakePlayer, dx, dy, dz, meta)) { + Item item = Item.getItemFromBlock(block); + if (item != null) { + // Set item damage from meta if the BlockItem has subtypes + drops = Collections.singletonList(new ItemStack(item, 1, item.getHasSubtypes() ? meta : 0)); + } + } + } + // If not silk or we failed to resolve to reasonable drops, get normal drops (with fortune if applicable) + if (drops == null) { + drops = block.getDrops( + worldObj, + dx, + dy, + dz, + meta, + (int) upgradeManager.getValue(EnderQuarryUpgradeManager.TieredEnderQuarryUpgrade.FORTUNE, 0)); + } // We can accept that the maximum stored amount is sometimes overrun by fortune - ArrayList drops = block.getDrops(worldObj, dx, dy, dz, worldObj.getBlockMetadata(dx, dy, dz), 0); if (!drops.isEmpty()) { return tryStoreItems(drops); } - // Block just has no drops + // Block probably just has no drops return true; } catch (Exception ignored) { UtilitiesInExcess.LOG - .error("Failed while trying to harvest block {} at {} {} {}.", block.toString(), dx, dy, dz); + .error("EQ Failed while trying to harvest block {} at {} {} {}.", block.toString(), dx, dy, dz); return false; } } @@ -620,7 +646,7 @@ private boolean tryStoreFluid(FluidStack fluid) { * * @return If we could store all the provided items */ - private boolean tryStoreItems(ArrayList items) { + private boolean tryStoreItems(List items) { int toStore = items.stream() .mapToInt((item) -> item != null ? item.stackSize : 0) .sum(); @@ -766,6 +792,7 @@ private boolean ejectStoredToAdjacent() { public void scanSidesForTEs() { sidedFluidAcceptors.clear(); sidedItemAcceptors.clear(); + upgradeManager.clear(); ArrayList loadedAdjacentChunks = new ArrayList<>(); // Make sure the directly adjacent blocks in different chunks are loaded whilst checking @@ -784,14 +811,22 @@ public void scanSidesForTEs() { direction.offsetX + this.xCoord, direction.offsetY + this.yCoord, direction.offsetZ + this.zCoord); + Block block = this.worldObj.getBlock( + direction.offsetX + this.xCoord, + direction.offsetY + this.yCoord, + direction.offsetZ + this.zCoord); + ChunkCoordIntPair chunk = new ChunkCoordIntPair( (direction.offsetX + this.xCoord) >> 4, (direction.offsetZ + this.zCoord) >> 4); - // TODO: Upgrades people - // if (te instanceof IQuarryUpgrade quarryUpgrade) { - // - // } + if (block instanceof BlockEnderQuarryUpgrade) { + int meta = this.worldObj.getBlockMetadata( + direction.offsetX + this.xCoord, + direction.offsetY + this.yCoord, + direction.offsetZ + this.zCoord); + upgradeManager.addUpgrade(EnderQuarryUpgradeManager.EnderQuarryUpgrade.VALUES[meta]); + } if (te instanceof IFluidHandler fluidHandler) { sidedFluidAcceptors.put(direction, fluidHandler); diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry_upgrade.json b/src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry_upgrade.json index ca5fbcf2..c18c8f19 100644 --- a/src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry_upgrade.json +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry_upgrade.json @@ -1,7 +1,13 @@ { "variants": { - "meta=0": { "model": "utilitiesinexcess:blocks/upgrade_speed_1" }, - "meta=1": { "model": "utilitiesinexcess:blocks/upgrade_speed_2" }, - "meta=2": { "model": "utilitiesinexcess:blocks/upgrade_speed_3" } + "meta=0": { "model": "utilitiesinexcess:blocks/upgrade_world_hole" }, + "meta=1": { "model": "utilitiesinexcess:blocks/upgrade_silk_touch" }, + "meta=2": { "model": "utilitiesinexcess:blocks/upgrade_pump_fluids" }, + "meta=3": { "model": "utilitiesinexcess:blocks/upgrade_speed_1" }, + "meta=4": { "model": "utilitiesinexcess:blocks/upgrade_speed_2" }, + "meta=5": { "model": "utilitiesinexcess:blocks/upgrade_speed_3" }, + "meta=6": { "model": "utilitiesinexcess:blocks/upgrade_fortune_1" }, + "meta=7": { "model": "utilitiesinexcess:blocks/upgrade_fortune_2" }, + "meta=8": { "model": "utilitiesinexcess:blocks/upgrade_fortune_3" } } } diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_1.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_1.json new file mode 100644 index 00000000..b26a146b --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_1.json @@ -0,0 +1,1412 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utilitiesinexcess:upgrade_fortune_1", + "particle": "utilitiesinexcess:upgrade_fortune_1" + }, + "elements": [ + { + "from": [2, 7, 3], + "to": [4, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.5, 4, 8, 4.5], "texture": "#0"}, + "east": {"uv": [11, 0, 11.25, 0.5], "texture": "#0"}, + "south": {"uv": [7.5, 4.5, 8, 5], "texture": "#0"}, + "west": {"uv": [11.25, 0, 11.5, 0.5], "texture": "#0"}, + "up": {"uv": [11.25, 6, 10.75, 5.75], "texture": "#0"}, + "down": {"uv": [11.5, 9, 11, 9.25], "texture": "#0"} + } + }, + { + "from": [3, 7, 2], + "to": [4, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 11.5, 3.25, 12], "texture": "#0"}, + "east": {"uv": [3.25, 11.5, 3.5, 12], "texture": "#0"}, + "south": {"uv": [3.5, 11.5, 3.75, 12], "texture": "#0"}, + "west": {"uv": [3.75, 11.5, 4, 12], "texture": "#0"}, + "up": {"uv": [11.5, 9, 11.25, 8.75], "texture": "#0"}, + "down": {"uv": [11.75, 0.75, 11.5, 1], "texture": "#0"} + } + }, + { + "from": [3, 11, 3], + "to": [4, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 7.25, 11.75, 7.75], "texture": "#0"}, + "east": {"uv": [11.5, 7.75, 11.75, 8.25], "texture": "#0"}, + "south": {"uv": [11.5, 8.25, 11.75, 8.75], "texture": "#0"}, + "west": {"uv": [11.5, 8.75, 11.75, 9.25], "texture": "#0"}, + "up": {"uv": [3.5, 12.75, 3.25, 12.5], "texture": "#0"}, + "down": {"uv": [5.25, 12.5, 5, 12.75], "texture": "#0"} + } + }, + { + "from": [3, 3, 3], + "to": [4, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 10, 11.75, 10.5], "texture": "#0"}, + "east": {"uv": [11.5, 10.5, 11.75, 11], "texture": "#0"}, + "south": {"uv": [11, 11.5, 11.25, 12], "texture": "#0"}, + "west": {"uv": [11.5, 11, 11.75, 11.5], "texture": "#0"}, + "up": {"uv": [5.5, 12.75, 5.25, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 5.25, 12.5, 5.5], "texture": "#0"} + } + }, + { + "from": [3, 7, 12], + "to": [4, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 11.5, 11.5, 12], "texture": "#0"}, + "east": {"uv": [10.25, 4.5, 10.75, 5], "texture": "#0"}, + "south": {"uv": [11.5, 11.5, 11.75, 12], "texture": "#0"}, + "west": {"uv": [10.25, 5, 10.75, 5.5], "texture": "#0"}, + "up": {"uv": [12, 0.5, 11.75, 0], "texture": "#0"}, + "down": {"uv": [12, 0.5, 11.75, 1], "texture": "#0"} + } + }, + { + "from": [2, 7, 12], + "to": [3, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 1, 12, 1.5], "texture": "#0"}, + "east": {"uv": [11.75, 1.5, 12, 2], "texture": "#0"}, + "south": {"uv": [11.75, 2, 12, 2.5], "texture": "#0"}, + "west": {"uv": [11.75, 2.5, 12, 3], "texture": "#0"}, + "up": {"uv": [5.75, 12.75, 5.5, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 5.5, 12.5, 5.75], "texture": "#0"} + } + }, + { + "from": [3, 11, 12], + "to": [4, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 3, 12, 3.5], "texture": "#0"}, + "east": {"uv": [11.75, 3.5, 12, 4], "texture": "#0"}, + "south": {"uv": [11.75, 4.5, 12, 5], "texture": "#0"}, + "west": {"uv": [11.75, 5, 12, 5.5], "texture": "#0"}, + "up": {"uv": [12.75, 6, 12.5, 5.75], "texture": "#0"}, + "down": {"uv": [12.75, 6, 12.5, 6.25], "texture": "#0"} + } + }, + { + "from": [3, 3, 12], + "to": [4, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 5.5, 12, 6], "texture": "#0"}, + "east": {"uv": [6.25, 11.75, 6.5, 12.25], "texture": "#0"}, + "south": {"uv": [6.5, 11.75, 6.75, 12.25], "texture": "#0"}, + "west": {"uv": [6.75, 11.75, 7, 12.25], "texture": "#0"}, + "up": {"uv": [6.5, 12.75, 6.25, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 6.25, 12.5, 6.5], "texture": "#0"} + } + }, + { + "from": [12, 7, 12], + "to": [14, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.25, 5.5, 10.75, 6], "texture": "#0"}, + "east": {"uv": [7, 11.75, 7.25, 12.25], "texture": "#0"}, + "south": {"uv": [6.25, 10.25, 6.75, 10.75], "texture": "#0"}, + "west": {"uv": [11.75, 7.25, 12, 7.75], "texture": "#0"}, + "up": {"uv": [11.75, 3.25, 11.25, 3], "texture": "#0"}, + "down": {"uv": [11.75, 5.75, 11.25, 6], "texture": "#0"} + } + }, + { + "from": [12, 7, 13], + "to": [13, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 7.75, 12, 8.25], "texture": "#0"}, + "east": {"uv": [11.75, 8.25, 12, 8.75], "texture": "#0"}, + "south": {"uv": [8.5, 11.75, 8.75, 12.25], "texture": "#0"}, + "west": {"uv": [8.75, 11.75, 9, 12.25], "texture": "#0"}, + "up": {"uv": [6.75, 12.75, 6.5, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 6.5, 12.5, 6.75], "texture": "#0"} + } + }, + { + "from": [12, 11, 12], + "to": [13, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 8.75, 12, 9.25], "texture": "#0"}, + "east": {"uv": [9, 11.75, 9.25, 12.25], "texture": "#0"}, + "south": {"uv": [9.25, 11.75, 9.5, 12.25], "texture": "#0"}, + "west": {"uv": [9.5, 11.75, 9.75, 12.25], "texture": "#0"}, + "up": {"uv": [7, 12.75, 6.75, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 6.75, 12.5, 7], "texture": "#0"} + } + }, + { + "from": [12, 3, 12], + "to": [13, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9.75, 11.75, 10, 12.25], "texture": "#0"}, + "east": {"uv": [10, 11.75, 10.25, 12.25], "texture": "#0"}, + "south": {"uv": [11.75, 10, 12, 10.5], "texture": "#0"}, + "west": {"uv": [10.25, 11.75, 10.5, 12.25], "texture": "#0"}, + "up": {"uv": [7.25, 12.75, 7, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 7, 12.5, 7.25], "texture": "#0"} + } + }, + { + "from": [12, 7, 2], + "to": [13, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 11.75, 10.75, 12.25], "texture": "#0"}, + "east": {"uv": [6.75, 10.25, 7.25, 10.75], "texture": "#0"}, + "south": {"uv": [11.75, 10.5, 12, 11], "texture": "#0"}, + "west": {"uv": [10.25, 7.25, 10.75, 7.75], "texture": "#0"}, + "up": {"uv": [11, 12.25, 10.75, 11.75], "texture": "#0"}, + "down": {"uv": [12, 11, 11.75, 11.5], "texture": "#0"} + } + }, + { + "from": [13, 7, 3], + "to": [14, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 11.5, 12, 12], "texture": "#0"}, + "east": {"uv": [12, 0, 12.25, 0.5], "texture": "#0"}, + "south": {"uv": [12, 0.5, 12.25, 1], "texture": "#0"}, + "west": {"uv": [12, 1, 12.25, 1.5], "texture": "#0"}, + "up": {"uv": [7.5, 12.75, 7.25, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 7.25, 12.5, 7.5], "texture": "#0"} + } + }, + { + "from": [12, 11, 3], + "to": [13, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 1.5, 12.25, 2], "texture": "#0"}, + "east": {"uv": [2, 12, 2.25, 12.5], "texture": "#0"}, + "south": {"uv": [12, 2, 12.25, 2.5], "texture": "#0"}, + "west": {"uv": [2.25, 12, 2.5, 12.5], "texture": "#0"}, + "up": {"uv": [7.75, 12.75, 7.5, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 7.5, 12.5, 7.75], "texture": "#0"} + } + }, + { + "from": [12, 3, 3], + "to": [13, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.5, 12, 2.75, 12.5], "texture": "#0"}, + "east": {"uv": [12, 2.5, 12.25, 3], "texture": "#0"}, + "south": {"uv": [2.75, 12, 3, 12.5], "texture": "#0"}, + "west": {"uv": [3, 12, 3.25, 12.5], "texture": "#0"}, + "up": {"uv": [8, 12.75, 7.75, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 7.75, 12.5, 8], "texture": "#0"} + } + }, + { + "from": [7, 12, 2], + "to": [9, 14, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.25, 7.75, 10.75, 8.25], "texture": "#0"}, + "east": {"uv": [12, 3, 12.25, 3.5], "texture": "#0"}, + "south": {"uv": [10.25, 8.25, 10.75, 8.75], "texture": "#0"}, + "west": {"uv": [3.25, 12, 3.5, 12.5], "texture": "#0"}, + "up": {"uv": [4, 12.25, 3.5, 12], "texture": "#0"}, + "down": {"uv": [12.5, 3.5, 12, 3.75], "texture": "#0"} + } + }, + { + "from": [7, 13, 3], + "to": [9, 14, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 3.75, 12.5, 4], "texture": "#0"}, + "east": {"uv": [8, 12.5, 8.25, 12.75], "texture": "#0"}, + "south": {"uv": [4, 12, 4.5, 12.25], "texture": "#0"}, + "west": {"uv": [12.5, 8, 12.75, 8.25], "texture": "#0"}, + "up": {"uv": [5, 12.25, 4.5, 12], "texture": "#0"}, + "down": {"uv": [12.5, 4.5, 12, 4.75], "texture": "#0"} + } + }, + { + "from": [13, 12, 7], + "to": [14, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 4.75, 12.25, 5.25], "texture": "#0"}, + "east": {"uv": [8.5, 10.25, 9, 10.75], "texture": "#0"}, + "south": {"uv": [5, 12, 5.25, 12.5], "texture": "#0"}, + "west": {"uv": [10.25, 8.75, 10.75, 9.25], "texture": "#0"}, + "up": {"uv": [12.25, 5.75, 12, 5.25], "texture": "#0"}, + "down": {"uv": [12.25, 5.75, 12, 6.25], "texture": "#0"} + } + }, + { + "from": [12, 13, 7], + "to": [13, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.25, 12.5, 8.5, 12.75], "texture": "#0"}, + "east": {"uv": [12, 6.25, 12.5, 6.5], "texture": "#0"}, + "south": {"uv": [12.5, 8.25, 12.75, 8.5], "texture": "#0"}, + "west": {"uv": [12, 6.5, 12.5, 6.75], "texture": "#0"}, + "up": {"uv": [12.25, 7.25, 12, 6.75], "texture": "#0"}, + "down": {"uv": [7.5, 12, 7.25, 12.5], "texture": "#0"} + } + }, + { + "from": [7, 12, 13], + "to": [9, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 10.25, 9.5, 10.75], "texture": "#0"}, + "east": {"uv": [12, 7.25, 12.25, 7.75], "texture": "#0"}, + "south": {"uv": [9.5, 10.25, 10, 10.75], "texture": "#0"}, + "west": {"uv": [7.5, 12, 7.75, 12.5], "texture": "#0"}, + "up": {"uv": [8.25, 12.25, 7.75, 12], "texture": "#0"}, + "down": {"uv": [12.5, 7.75, 12, 8], "texture": "#0"} + } + }, + { + "from": [7, 13, 12], + "to": [9, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 8, 12.5, 8.25], "texture": "#0"}, + "east": {"uv": [8.5, 12.5, 8.75, 12.75], "texture": "#0"}, + "south": {"uv": [12, 8.25, 12.5, 8.5], "texture": "#0"}, + "west": {"uv": [12.5, 8.5, 12.75, 8.75], "texture": "#0"}, + "up": {"uv": [12.5, 8.75, 12, 8.5], "texture": "#0"}, + "down": {"uv": [12.5, 8.75, 12, 9], "texture": "#0"} + } + }, + { + "from": [2, 12, 7], + "to": [3, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.25, 12, 8.5, 12.5], "texture": "#0"}, + "east": {"uv": [10, 10.25, 10.5, 10.75], "texture": "#0"}, + "south": {"uv": [12, 9, 12.25, 9.5], "texture": "#0"}, + "west": {"uv": [10.5, 0, 11, 0.5], "texture": "#0"}, + "up": {"uv": [12.25, 10, 12, 9.5], "texture": "#0"}, + "down": {"uv": [12.25, 10, 12, 10.5], "texture": "#0"} + } + }, + { + "from": [3, 13, 7], + "to": [4, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.75, 12.5, 9, 12.75], "texture": "#0"}, + "east": {"uv": [12, 10.5, 12.5, 10.75], "texture": "#0"}, + "south": {"uv": [12.5, 8.75, 12.75, 9], "texture": "#0"}, + "west": {"uv": [12, 10.75, 12.5, 11], "texture": "#0"}, + "up": {"uv": [11.25, 12.5, 11, 12], "texture": "#0"}, + "down": {"uv": [12.25, 11, 12, 11.5], "texture": "#0"} + } + }, + { + "from": [3, 2, 6], + "to": [4, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 9, 12.75, 9.25], "texture": "#0"}, + "east": {"uv": [10.5, 0.5, 11.5, 0.75], "texture": "#0"}, + "south": {"uv": [12.5, 9.25, 12.75, 9.5], "texture": "#0"}, + "west": {"uv": [10.5, 0.75, 11.5, 1], "texture": "#0"}, + "up": {"uv": [10.75, 2, 10.5, 1], "texture": "#0"}, + "down": {"uv": [10.75, 2, 10.5, 3], "texture": "#0"} + } + }, + { + "from": [2, 2, 6], + "to": [3, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 12, 11.5, 12.5], "texture": "#0"}, + "east": {"uv": [6.5, 4, 7.5, 4.5], "texture": "#0"}, + "south": {"uv": [11.5, 12, 11.75, 12.5], "texture": "#0"}, + "west": {"uv": [6.5, 4.5, 7.5, 5], "texture": "#0"}, + "up": {"uv": [3.25, 11.5, 3, 10.5], "texture": "#0"}, + "down": {"uv": [10.75, 3, 10.5, 4], "texture": "#0"} + } + }, + { + "from": [6, 2, 12], + "to": [10, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 10, 11.5, 10.25], "texture": "#0"}, + "east": {"uv": [12.5, 9.5, 12.75, 9.75], "texture": "#0"}, + "south": {"uv": [10.5, 10.25, 11.5, 10.5], "texture": "#0"}, + "west": {"uv": [12.5, 9.75, 12.75, 10], "texture": "#0"}, + "up": {"uv": [11.5, 10.75, 10.5, 10.5], "texture": "#0"}, + "down": {"uv": [11.75, 1, 10.75, 1.25], "texture": "#0"} + } + }, + { + "from": [6, 2, 13], + "to": [10, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 9.5, 4, 10], "texture": "#0"}, + "east": {"uv": [12, 11.5, 12.25, 12], "texture": "#0"}, + "south": {"uv": [4, 9.5, 5, 10], "texture": "#0"}, + "west": {"uv": [11.75, 12, 12, 12.5], "texture": "#0"}, + "up": {"uv": [11.75, 1.5, 10.75, 1.25], "texture": "#0"}, + "down": {"uv": [11.75, 1.5, 10.75, 1.75], "texture": "#0"} + } + }, + { + "from": [12, 2, 6], + "to": [13, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 12.5, 10.25, 12.75], "texture": "#0"}, + "east": {"uv": [10.75, 1.75, 11.75, 2], "texture": "#0"}, + "south": {"uv": [10.25, 12.5, 10.5, 12.75], "texture": "#0"}, + "west": {"uv": [10.75, 2, 11.75, 2.25], "texture": "#0"}, + "up": {"uv": [3.5, 11.5, 3.25, 10.5], "texture": "#0"}, + "down": {"uv": [3.75, 10.5, 3.5, 11.5], "texture": "#0"} + } + }, + { + "from": [13, 2, 6], + "to": [14, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 12, 12.25, 12.5], "texture": "#0"}, + "east": {"uv": [5, 9.5, 6, 10], "texture": "#0"}, + "south": {"uv": [0, 12.25, 0.25, 12.75], "texture": "#0"}, + "west": {"uv": [6, 9.5, 7, 10], "texture": "#0"}, + "up": {"uv": [4, 11.5, 3.75, 10.5], "texture": "#0"}, + "down": {"uv": [11, 2.25, 10.75, 3.25], "texture": "#0"} + } + }, + { + "from": [6, 2, 3], + "to": [10, 3, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.75, 3.25, 11.75, 3.5], "texture": "#0"}, + "east": {"uv": [12.5, 10.5, 12.75, 10.75], "texture": "#0"}, + "south": {"uv": [10.75, 3.5, 11.75, 3.75], "texture": "#0"}, + "west": {"uv": [12.5, 10.75, 12.75, 11], "texture": "#0"}, + "up": {"uv": [11.75, 4, 10.75, 3.75], "texture": "#0"}, + "down": {"uv": [11.75, 4.5, 10.75, 4.75], "texture": "#0"} + } + }, + { + "from": [6, 2, 2], + "to": [10, 4, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 9.5, 8, 10], "texture": "#0"}, + "east": {"uv": [12.25, 0, 12.5, 0.5], "texture": "#0"}, + "south": {"uv": [3, 10, 4, 10.5], "texture": "#0"}, + "west": {"uv": [0.25, 12.25, 0.5, 12.75], "texture": "#0"}, + "up": {"uv": [11.75, 5, 10.75, 4.75], "texture": "#0"}, + "down": {"uv": [11.75, 5, 10.75, 5.25], "texture": "#0"} + } + }, + { + "from": [12, 3, 4], + "to": [13, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 9.5, 2.25, 12], "texture": "#0"}, + "east": {"uv": [2.5, 0, 4.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.25, 9.5, 2.5, 12], "texture": "#0"}, + "west": {"uv": [2.5, 2.5, 4.5, 5], "texture": "#0"}, + "up": {"uv": [4.25, 12, 4, 10], "texture": "#0"}, + "down": {"uv": [10.25, 4, 10, 6], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [4, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.5, 9.5, 2.75, 12], "texture": "#0"}, + "east": {"uv": [4.5, 0, 6.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.75, 9.5, 3, 12], "texture": "#0"}, + "west": {"uv": [4.5, 2.5, 6.5, 5], "texture": "#0"}, + "up": {"uv": [4.5, 12, 4.25, 10], "texture": "#0"}, + "down": {"uv": [4.75, 10, 4.5, 12], "texture": "#0"} + } + }, + { + "name": "base", + "from": [4, 3, 3], + "to": [12, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 5, 2, 7.5], "texture": "#0"}, + "east": {"uv": [0, 0, 2.5, 2.5], "texture": "#0"}, + "south": {"uv": [2, 5, 4, 7.5], "texture": "#0"}, + "west": {"uv": [0, 2.5, 2.5, 5], "texture": "#0"}, + "up": {"uv": [6, 7.5, 4, 5], "texture": "#0"}, + "down": {"uv": [8, 5, 6, 7.5], "texture": "#0"} + } + }, + { + "from": [4, 4, 13], + "to": [12, 12, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.5, 0, 8.5, 2], "texture": "#0"}, + "east": {"uv": [4.75, 10, 5, 12], "texture": "#0"}, + "south": {"uv": [6.5, 2, 8.5, 4], "texture": "#0"}, + "west": {"uv": [5, 10, 5.25, 12], "texture": "#0"}, + "up": {"uv": [7.25, 10.25, 5.25, 10], "texture": "#0"}, + "down": {"uv": [12, 6, 10, 6.25], "texture": "#0"} + } + }, + { + "from": [4, 13, 4], + "to": [12, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 6.25, 12, 6.5], "texture": "#0"}, + "east": {"uv": [10, 6.5, 12, 6.75], "texture": "#0"}, + "south": {"uv": [10, 6.75, 12, 7], "texture": "#0"}, + "west": {"uv": [10, 7, 12, 7.25], "texture": "#0"}, + "up": {"uv": [2, 9.5, 0, 7.5], "texture": "#0"}, + "down": {"uv": [4, 7.5, 2, 9.5], "texture": "#0"} + } + }, + { + "from": [13, 4, 4], + "to": [14, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.25, 10, 7.5, 12], "texture": "#0"}, + "east": {"uv": [4, 7.5, 6, 9.5], "texture": "#0"}, + "south": {"uv": [10, 7.25, 10.25, 9.25], "texture": "#0"}, + "west": {"uv": [6, 7.5, 8, 9.5], "texture": "#0"}, + "up": {"uv": [7.75, 12, 7.5, 10], "texture": "#0"}, + "down": {"uv": [8, 10, 7.75, 12], "texture": "#0"} + } + }, + { + "from": [4, 4, 2], + "to": [12, 12, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 4, 10, 6], "texture": "#0"}, + "east": {"uv": [8, 10, 8.25, 12], "texture": "#0"}, + "south": {"uv": [8, 6, 10, 8], "texture": "#0"}, + "west": {"uv": [8.25, 10, 8.5, 12], "texture": "#0"}, + "up": {"uv": [10.5, 10.25, 8.5, 10], "texture": "#0"}, + "down": {"uv": [12, 9.25, 10, 9.5], "texture": "#0"} + } + }, + { + "from": [4, 2, 4], + "to": [12, 3, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.5, 12, 9.75], "texture": "#0"}, + "east": {"uv": [10, 9.75, 12, 10], "texture": "#0"}, + "south": {"uv": [10.25, 4, 12.25, 4.25], "texture": "#0"}, + "west": {"uv": [10.25, 4.25, 12.25, 4.5], "texture": "#0"}, + "up": {"uv": [10, 10, 8, 8], "texture": "#0"}, + "down": {"uv": [10.5, 0, 8.5, 2], "texture": "#0"} + } + }, + { + "from": [2, 4, 4], + "to": [3, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.25, 10.25, 5.5, 12.25], "texture": "#0"}, + "east": {"uv": [8.5, 2, 10.5, 4], "texture": "#0"}, + "south": {"uv": [5.5, 10.25, 5.75, 12.25], "texture": "#0"}, + "west": {"uv": [0, 9.5, 2, 11.5], "texture": "#0"}, + "up": {"uv": [6, 12.25, 5.75, 10.25], "texture": "#0"}, + "down": {"uv": [6.25, 10.25, 6, 12.25], "texture": "#0"} + } + }, + { + "from": [9.4, 9.4, 14], + "to": [9.9, 9.9, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 9.65, 14.25]}, + "faces": { + "north": {"uv": [11, 12.5, 11.25, 12.75], "texture": "#0"}, + "east": {"uv": [11.25, 12.5, 11.5, 12.75], "texture": "#0"}, + "south": {"uv": [12.5, 11.25, 12.75, 11.5], "texture": "#0"}, + "west": {"uv": [11.5, 12.5, 11.75, 12.75], "texture": "#0"}, + "up": {"uv": [12.75, 11.75, 12.5, 11.5], "texture": "#0"}, + "down": {"uv": [12, 12.5, 11.75, 12.75], "texture": "#0"} + } + }, + { + "from": [9.9, 8.4, 14], + "to": [10.4, 10.9, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 9.65, 14.25]}, + "faces": { + "north": {"uv": [11, 8.25, 11.25, 9], "texture": "#0"}, + "east": {"uv": [11, 10.75, 11.25, 11.5], "texture": "#0"}, + "south": {"uv": [11.25, 2.25, 11.5, 3], "texture": "#0"}, + "west": {"uv": [11.25, 7.25, 11.5, 8], "texture": "#0"}, + "up": {"uv": [12.75, 12, 12.5, 11.75], "texture": "#0"}, + "down": {"uv": [12.25, 12.5, 12, 12.75], "texture": "#0"} + } + }, + { + "from": [10.4, 9.4, 14], + "to": [10.9, 9.9, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 9.65, 14.25]}, + "faces": { + "north": {"uv": [12.5, 12, 12.75, 12.25], "texture": "#0"}, + "east": {"uv": [12.25, 12.5, 12.5, 12.75], "texture": "#0"}, + "south": {"uv": [12.5, 12.5, 12.75, 12.75], "texture": "#0"}, + "west": {"uv": [0, 12.75, 0.25, 13], "texture": "#0"}, + "up": {"uv": [0.5, 13, 0.25, 12.75], "texture": "#0"}, + "down": {"uv": [13, 0.25, 12.75, 0.5], "texture": "#0"} + } + }, + { + "from": [5.85, 5.7, 14], + "to": [6.35, 7.2, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.1, 4.95, 14.25]}, + "faces": { + "north": {"uv": [0.5, 12.25, 0.75, 12.75], "texture": "#0"}, + "east": {"uv": [12.25, 0.5, 12.5, 1], "texture": "#0"}, + "south": {"uv": [0.75, 12.25, 1, 12.75], "texture": "#0"}, + "west": {"uv": [1, 12.25, 1.25, 12.75], "texture": "#0"}, + "up": {"uv": [0.75, 13, 0.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 0.5, 12.75, 0.75], "texture": "#0"} + } + }, + { + "from": [7.75, 5.85, 14], + "to": [8.25, 10.35, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 14.25]}, + "faces": { + "north": {"uv": [6.25, 10.75, 6.5, 11.75], "texture": "#0"}, + "east": {"uv": [6.5, 10.75, 6.75, 11.75], "texture": "#0"}, + "south": {"uv": [6.75, 10.75, 7, 11.75], "texture": "#0"}, + "west": {"uv": [7, 10.75, 7.25, 11.75], "texture": "#0"}, + "up": {"uv": [1, 13, 0.75, 12.75], "texture": "#0"}, + "down": {"uv": [1.25, 12.75, 1, 13], "texture": "#0"} + } + }, + { + "from": [7.25, 8.35, 14], + "to": [7.75, 8.85, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 14.25]}, + "faces": { + "north": {"uv": [12.75, 1, 13, 1.25], "texture": "#0"}, + "east": {"uv": [12.75, 1.25, 13, 1.5], "texture": "#0"}, + "south": {"uv": [12.75, 1.5, 13, 1.75], "texture": "#0"}, + "west": {"uv": [1.75, 12.75, 2, 13], "texture": "#0"}, + "up": {"uv": [13, 2, 12.75, 1.75], "texture": "#0"}, + "down": {"uv": [2.25, 12.75, 2, 13], "texture": "#0"} + } + }, + { + "from": [7.25, 7.35, 14], + "to": [7.75, 7.85, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 14.25]}, + "faces": { + "north": {"uv": [12.75, 2, 13, 2.25], "texture": "#0"}, + "east": {"uv": [2.25, 12.75, 2.5, 13], "texture": "#0"}, + "south": {"uv": [12.75, 2.25, 13, 2.5], "texture": "#0"}, + "west": {"uv": [12.75, 2.5, 13, 2.75], "texture": "#0"}, + "up": {"uv": [3, 13, 2.75, 12.75], "texture": "#0"}, + "down": {"uv": [3.25, 12.75, 3, 13], "texture": "#0"} + } + }, + { + "from": [6.25, 7.85, 14], + "to": [7.75, 8.35, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 14.25]}, + "faces": { + "north": {"uv": [12.25, 1, 12.75, 1.25], "texture": "#0"}, + "east": {"uv": [3.25, 12.75, 3.5, 13], "texture": "#0"}, + "south": {"uv": [1.25, 12.25, 1.75, 12.5], "texture": "#0"}, + "west": {"uv": [12.75, 3.25, 13, 3.5], "texture": "#0"}, + "up": {"uv": [12.75, 1.5, 12.25, 1.25], "texture": "#0"}, + "down": {"uv": [12.75, 1.5, 12.25, 1.75], "texture": "#0"} + } + }, + { + "from": [8.25, 7.85, 14], + "to": [9.75, 8.35, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 14.25]}, + "faces": { + "north": {"uv": [12.25, 1.75, 12.75, 2], "texture": "#0"}, + "east": {"uv": [3.5, 12.75, 3.75, 13], "texture": "#0"}, + "south": {"uv": [12.25, 2, 12.75, 2.25], "texture": "#0"}, + "west": {"uv": [3.75, 12.75, 4, 13], "texture": "#0"}, + "up": {"uv": [12.75, 2.5, 12.25, 2.25], "texture": "#0"}, + "down": {"uv": [12.75, 2.5, 12.25, 2.75], "texture": "#0"} + } + }, + { + "from": [8.25, 8.35, 14], + "to": [8.75, 8.85, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 14.25]}, + "faces": { + "north": {"uv": [4, 12.75, 4.25, 13], "texture": "#0"}, + "east": {"uv": [12.75, 4, 13, 4.25], "texture": "#0"}, + "south": {"uv": [4.25, 12.75, 4.5, 13], "texture": "#0"}, + "west": {"uv": [12.75, 4.25, 13, 4.5], "texture": "#0"}, + "up": {"uv": [4.75, 13, 4.5, 12.75], "texture": "#0"}, + "down": {"uv": [5, 12.75, 4.75, 13], "texture": "#0"} + } + }, + { + "from": [8.25, 7.35, 14], + "to": [8.75, 7.85, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 14.25]}, + "faces": { + "north": {"uv": [12.75, 4.75, 13, 5], "texture": "#0"}, + "east": {"uv": [5, 12.75, 5.25, 13], "texture": "#0"}, + "south": {"uv": [12.75, 5, 13, 5.25], "texture": "#0"}, + "west": {"uv": [5.25, 12.75, 5.5, 13], "texture": "#0"}, + "up": {"uv": [13, 5.5, 12.75, 5.25], "texture": "#0"}, + "down": {"uv": [5.75, 12.75, 5.5, 13], "texture": "#0"} + } + }, + { + "from": [9.5, 9.4, 1.5], + "to": [10, 9.9, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [10.25, 9.65, 1.75]}, + "faces": { + "north": {"uv": [12.75, 5.5, 13, 5.75], "texture": "#0"}, + "east": {"uv": [5.75, 12.75, 6, 13], "texture": "#0"}, + "south": {"uv": [12.75, 5.75, 13, 6], "texture": "#0"}, + "west": {"uv": [6, 12.75, 6.25, 13], "texture": "#0"}, + "up": {"uv": [13, 6.25, 12.75, 6], "texture": "#0"}, + "down": {"uv": [6.5, 12.75, 6.25, 13], "texture": "#0"} + } + }, + { + "from": [10, 8.4, 1.5], + "to": [10.5, 10.9, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [10.25, 9.65, 1.75]}, + "faces": { + "north": {"uv": [11.25, 8, 11.5, 8.75], "texture": "#0"}, + "east": {"uv": [11.25, 10.75, 11.5, 11.5], "texture": "#0"}, + "south": {"uv": [0, 11.5, 0.25, 12.25], "texture": "#0"}, + "west": {"uv": [11.5, 0, 11.75, 0.75], "texture": "#0"}, + "up": {"uv": [13, 6.5, 12.75, 6.25], "texture": "#0"}, + "down": {"uv": [6.75, 12.75, 6.5, 13], "texture": "#0"} + } + }, + { + "from": [10.5, 9.4, 1.5], + "to": [11, 9.9, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [10.25, 9.65, 1.75]}, + "faces": { + "north": {"uv": [12.75, 6.5, 13, 6.75], "texture": "#0"}, + "east": {"uv": [6.75, 12.75, 7, 13], "texture": "#0"}, + "south": {"uv": [12.75, 6.75, 13, 7], "texture": "#0"}, + "west": {"uv": [7, 12.75, 7.25, 13], "texture": "#0"}, + "up": {"uv": [13, 7.25, 12.75, 7], "texture": "#0"}, + "down": {"uv": [7.5, 12.75, 7.25, 13], "texture": "#0"} + } + }, + { + "from": [5.85, 5.7, 1.5], + "to": [6.35, 7.2, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.1, 4.95, 1.75]}, + "faces": { + "north": {"uv": [1.75, 12.25, 2, 12.75], "texture": "#0"}, + "east": {"uv": [12.25, 2.75, 12.5, 3.25], "texture": "#0"}, + "south": {"uv": [3.5, 12.25, 3.75, 12.75], "texture": "#0"}, + "west": {"uv": [3.75, 12.25, 4, 12.75], "texture": "#0"}, + "up": {"uv": [13, 7.5, 12.75, 7.25], "texture": "#0"}, + "down": {"uv": [7.75, 12.75, 7.5, 13], "texture": "#0"} + } + }, + { + "from": [7.75, 5.85, 1.5], + "to": [8.25, 10.35, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 1.75]}, + "faces": { + "north": {"uv": [10.75, 7.25, 11, 8.25], "texture": "#0"}, + "east": {"uv": [10.75, 8.25, 11, 9.25], "texture": "#0"}, + "south": {"uv": [8.5, 10.75, 8.75, 11.75], "texture": "#0"}, + "west": {"uv": [8.75, 10.75, 9, 11.75], "texture": "#0"}, + "up": {"uv": [13, 7.75, 12.75, 7.5], "texture": "#0"}, + "down": {"uv": [8, 12.75, 7.75, 13], "texture": "#0"} + } + }, + { + "from": [7.25, 8.35, 1.5], + "to": [7.75, 8.85, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 1.75]}, + "faces": { + "north": {"uv": [12.75, 7.75, 13, 8], "texture": "#0"}, + "east": {"uv": [8, 12.75, 8.25, 13], "texture": "#0"}, + "south": {"uv": [12.75, 8, 13, 8.25], "texture": "#0"}, + "west": {"uv": [8.25, 12.75, 8.5, 13], "texture": "#0"}, + "up": {"uv": [13, 8.5, 12.75, 8.25], "texture": "#0"}, + "down": {"uv": [8.75, 12.75, 8.5, 13], "texture": "#0"} + } + }, + { + "from": [7.25, 7.35, 1.5], + "to": [7.75, 7.85, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 1.75]}, + "faces": { + "north": {"uv": [12.75, 8.5, 13, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 12.75, 9, 13], "texture": "#0"}, + "south": {"uv": [12.75, 8.75, 13, 9], "texture": "#0"}, + "west": {"uv": [9, 12.75, 9.25, 13], "texture": "#0"}, + "up": {"uv": [13, 9.25, 12.75, 9], "texture": "#0"}, + "down": {"uv": [9.5, 12.75, 9.25, 13], "texture": "#0"} + } + }, + { + "from": [6.25, 7.85, 1.5], + "to": [7.75, 8.35, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 1.75]}, + "faces": { + "north": {"uv": [12.25, 3.25, 12.75, 3.5], "texture": "#0"}, + "east": {"uv": [12.75, 9.25, 13, 9.5], "texture": "#0"}, + "south": {"uv": [4, 12.25, 4.5, 12.5], "texture": "#0"}, + "west": {"uv": [9.5, 12.75, 9.75, 13], "texture": "#0"}, + "up": {"uv": [12.75, 4.25, 12.25, 4], "texture": "#0"}, + "down": {"uv": [12.75, 4.25, 12.25, 4.5], "texture": "#0"} + } + }, + { + "from": [8.25, 7.85, 1.5], + "to": [9.75, 8.35, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 1.75]}, + "faces": { + "north": {"uv": [4.5, 12.25, 5, 12.5], "texture": "#0"}, + "east": {"uv": [12.75, 9.5, 13, 9.75], "texture": "#0"}, + "south": {"uv": [12.25, 4.75, 12.75, 5], "texture": "#0"}, + "west": {"uv": [9.75, 12.75, 10, 13], "texture": "#0"}, + "up": {"uv": [12.75, 5.25, 12.25, 5], "texture": "#0"}, + "down": {"uv": [5.75, 12.25, 5.25, 12.5], "texture": "#0"} + } + }, + { + "from": [8.25, 8.35, 1.5], + "to": [8.75, 8.85, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 1.75]}, + "faces": { + "north": {"uv": [12.75, 9.75, 13, 10], "texture": "#0"}, + "east": {"uv": [10, 12.75, 10.25, 13], "texture": "#0"}, + "south": {"uv": [12.75, 10, 13, 10.25], "texture": "#0"}, + "west": {"uv": [10.25, 12.75, 10.5, 13], "texture": "#0"}, + "up": {"uv": [13, 10.5, 12.75, 10.25], "texture": "#0"}, + "down": {"uv": [10.75, 12.75, 10.5, 13], "texture": "#0"} + } + }, + { + "from": [8.25, 7.35, 1.5], + "to": [8.75, 7.85, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.1, 1.75]}, + "faces": { + "north": {"uv": [12.75, 10.5, 13, 10.75], "texture": "#0"}, + "east": {"uv": [10.75, 12.75, 11, 13], "texture": "#0"}, + "south": {"uv": [12.75, 10.75, 13, 11], "texture": "#0"}, + "west": {"uv": [11, 12.75, 11.25, 13], "texture": "#0"}, + "up": {"uv": [13, 11.25, 12.75, 11], "texture": "#0"}, + "down": {"uv": [11.5, 12.75, 11.25, 13], "texture": "#0"} + } + }, + { + "from": [14, 9.4, 6.15], + "to": [14.5, 9.9, 6.65], + "rotation": {"angle": 0, "axis": "y", "origin": [18.35, 9.65, 5.9]}, + "faces": { + "north": {"uv": [12.75, 11.25, 13, 11.5], "texture": "#0"}, + "east": {"uv": [11.5, 12.75, 11.75, 13], "texture": "#0"}, + "south": {"uv": [12.75, 11.5, 13, 11.75], "texture": "#0"}, + "west": {"uv": [11.75, 12.75, 12, 13], "texture": "#0"}, + "up": {"uv": [13, 12, 12.75, 11.75], "texture": "#0"}, + "down": {"uv": [12.25, 12.75, 12, 13], "texture": "#0"} + } + }, + { + "from": [14, 8.4, 5.65], + "to": [14.5, 10.9, 6.15], + "rotation": {"angle": 0, "axis": "y", "origin": [18.35, 9.65, 5.9]}, + "faces": { + "north": {"uv": [0.25, 11.5, 0.5, 12.25], "texture": "#0"}, + "east": {"uv": [0.5, 11.5, 0.75, 12.25], "texture": "#0"}, + "south": {"uv": [0.75, 11.5, 1, 12.25], "texture": "#0"}, + "west": {"uv": [1, 11.5, 1.25, 12.25], "texture": "#0"}, + "up": {"uv": [13, 12.25, 12.75, 12], "texture": "#0"}, + "down": {"uv": [12.5, 12.75, 12.25, 13], "texture": "#0"} + } + }, + { + "from": [14, 9.4, 5.15], + "to": [14.5, 9.9, 5.65], + "rotation": {"angle": 0, "axis": "y", "origin": [18.35, 9.65, 5.9]}, + "faces": { + "north": {"uv": [12.75, 12.25, 13, 12.5], "texture": "#0"}, + "east": {"uv": [12.5, 12.75, 12.75, 13], "texture": "#0"}, + "south": {"uv": [12.75, 12.5, 13, 12.75], "texture": "#0"}, + "west": {"uv": [12.75, 12.75, 13, 13], "texture": "#0"}, + "up": {"uv": [0.25, 13.25, 0, 13], "texture": "#0"}, + "down": {"uv": [13.25, 0, 13, 0.25], "texture": "#0"} + } + }, + { + "from": [14, 5.7, 9.7], + "to": [14.5, 7.2, 10.2], + "rotation": {"angle": 0, "axis": "y", "origin": [14.2, 4.95, 9.95]}, + "faces": { + "north": {"uv": [12.25, 5.25, 12.5, 5.75], "texture": "#0"}, + "east": {"uv": [5.75, 12.25, 6, 12.75], "texture": "#0"}, + "south": {"uv": [12.25, 5.75, 12.5, 6.25], "texture": "#0"}, + "west": {"uv": [6, 12.25, 6.25, 12.75], "texture": "#0"}, + "up": {"uv": [0.5, 13.25, 0.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 0.25, 13, 0.5], "texture": "#0"} + } + }, + { + "from": [14, 5.85, 7.8], + "to": [14.5, 10.35, 8.3], + "rotation": {"angle": 0, "axis": "y", "origin": [16.1, 8.1, 8.05]}, + "faces": { + "north": {"uv": [9, 10.75, 9.25, 11.75], "texture": "#0"}, + "east": {"uv": [9.25, 10.75, 9.5, 11.75], "texture": "#0"}, + "south": {"uv": [9.5, 10.75, 9.75, 11.75], "texture": "#0"}, + "west": {"uv": [9.75, 10.75, 10, 11.75], "texture": "#0"}, + "up": {"uv": [0.75, 13.25, 0.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 0.5, 13, 0.75], "texture": "#0"} + } + }, + { + "from": [14, 8.35, 8.3], + "to": [14.5, 8.85, 8.8], + "rotation": {"angle": 0, "axis": "y", "origin": [16.1, 8.1, 8.05]}, + "faces": { + "north": {"uv": [0.75, 13, 1, 13.25], "texture": "#0"}, + "east": {"uv": [13, 0.75, 13.25, 1], "texture": "#0"}, + "south": {"uv": [1, 13, 1.25, 13.25], "texture": "#0"}, + "west": {"uv": [13, 1, 13.25, 1.25], "texture": "#0"}, + "up": {"uv": [1.5, 13.25, 1.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 1.25, 13, 1.5], "texture": "#0"} + } + }, + { + "from": [14, 7.35, 8.3], + "to": [14.5, 7.85, 8.8], + "rotation": {"angle": 0, "axis": "y", "origin": [16.1, 8.1, 8.05]}, + "faces": { + "north": {"uv": [1.5, 13, 1.75, 13.25], "texture": "#0"}, + "east": {"uv": [13, 1.5, 13.25, 1.75], "texture": "#0"}, + "south": {"uv": [1.75, 13, 2, 13.25], "texture": "#0"}, + "west": {"uv": [13, 1.75, 13.25, 2], "texture": "#0"}, + "up": {"uv": [2.25, 13.25, 2, 13], "texture": "#0"}, + "down": {"uv": [13.25, 2, 13, 2.25], "texture": "#0"} + } + }, + { + "from": [14, 7.85, 8.3], + "to": [14.5, 8.35, 9.8], + "rotation": {"angle": 0, "axis": "y", "origin": [16.1, 8.1, 8.05]}, + "faces": { + "north": {"uv": [2.25, 13, 2.5, 13.25], "texture": "#0"}, + "east": {"uv": [6.25, 12.25, 6.75, 12.5], "texture": "#0"}, + "south": {"uv": [13, 2.25, 13.25, 2.5], "texture": "#0"}, + "west": {"uv": [6.75, 12.25, 7.25, 12.5], "texture": "#0"}, + "up": {"uv": [12.5, 7.25, 12.25, 6.75], "texture": "#0"}, + "down": {"uv": [12.5, 7.25, 12.25, 7.75], "texture": "#0"} + } + }, + { + "from": [14, 7.85, 6.3], + "to": [14.5, 8.35, 7.8], + "rotation": {"angle": 0, "axis": "y", "origin": [16.1, 8.1, 8.05]}, + "faces": { + "north": {"uv": [2.5, 13, 2.75, 13.25], "texture": "#0"}, + "east": {"uv": [7.75, 12.25, 8.25, 12.5], "texture": "#0"}, + "south": {"uv": [13, 2.5, 13.25, 2.75], "texture": "#0"}, + "west": {"uv": [8.5, 12.25, 9, 12.5], "texture": "#0"}, + "up": {"uv": [9.25, 12.75, 9, 12.25], "texture": "#0"}, + "down": {"uv": [12.5, 9, 12.25, 9.5], "texture": "#0"} + } + }, + { + "from": [14, 8.35, 7.3], + "to": [14.5, 8.85, 7.8], + "rotation": {"angle": 0, "axis": "y", "origin": [16.1, 8.1, 8.05]}, + "faces": { + "north": {"uv": [2.75, 13, 3, 13.25], "texture": "#0"}, + "east": {"uv": [13, 2.75, 13.25, 3], "texture": "#0"}, + "south": {"uv": [3, 13, 3.25, 13.25], "texture": "#0"}, + "west": {"uv": [13, 3, 13.25, 3.25], "texture": "#0"}, + "up": {"uv": [3.5, 13.25, 3.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 3.25, 13, 3.5], "texture": "#0"} + } + }, + { + "from": [14, 7.35, 7.3], + "to": [14.5, 7.85, 7.8], + "rotation": {"angle": 0, "axis": "y", "origin": [16.1, 8.1, 8.05]}, + "faces": { + "north": {"uv": [3.5, 13, 3.75, 13.25], "texture": "#0"}, + "east": {"uv": [13, 3.5, 13.25, 3.75], "texture": "#0"}, + "south": {"uv": [3.75, 13, 4, 13.25], "texture": "#0"}, + "west": {"uv": [13, 3.75, 13.25, 4], "texture": "#0"}, + "up": {"uv": [4.25, 13.25, 4, 13], "texture": "#0"}, + "down": {"uv": [13.25, 4, 13, 4.25], "texture": "#0"} + } + }, + { + "from": [1.5, 9.4, 6.15], + "to": [2, 9.9, 6.65], + "rotation": {"angle": 0, "axis": "y", "origin": [5.85, 9.65, 5.9]}, + "faces": { + "north": {"uv": [4.25, 13, 4.5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 4.25, 13.25, 4.5], "texture": "#0"}, + "south": {"uv": [4.5, 13, 4.75, 13.25], "texture": "#0"}, + "west": {"uv": [13, 4.5, 13.25, 4.75], "texture": "#0"}, + "up": {"uv": [5, 13.25, 4.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 4.75, 13, 5], "texture": "#0"} + } + }, + { + "from": [1.5, 8.4, 5.65], + "to": [2, 10.9, 6.15], + "rotation": {"angle": 0, "axis": "y", "origin": [5.85, 9.65, 5.9]}, + "faces": { + "north": {"uv": [1.25, 11.5, 1.5, 12.25], "texture": "#0"}, + "east": {"uv": [1.5, 11.5, 1.75, 12.25], "texture": "#0"}, + "south": {"uv": [1.75, 11.5, 2, 12.25], "texture": "#0"}, + "west": {"uv": [11.5, 2.25, 11.75, 3], "texture": "#0"}, + "up": {"uv": [5.25, 13.25, 5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 5, 13, 5.25], "texture": "#0"} + } + }, + { + "from": [1.5, 9.4, 5.15], + "to": [2, 9.9, 5.65], + "rotation": {"angle": 0, "axis": "y", "origin": [5.85, 9.65, 5.9]}, + "faces": { + "north": {"uv": [5.25, 13, 5.5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 5.25, 13.25, 5.5], "texture": "#0"}, + "south": {"uv": [5.5, 13, 5.75, 13.25], "texture": "#0"}, + "west": {"uv": [13, 5.5, 13.25, 5.75], "texture": "#0"}, + "up": {"uv": [6, 13.25, 5.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 5.75, 13, 6], "texture": "#0"} + } + }, + { + "from": [1.5, 5.7, 9.7], + "to": [2, 7.2, 10.2], + "rotation": {"angle": 0, "axis": "y", "origin": [1.7, 4.95, 9.95]}, + "faces": { + "north": {"uv": [9.25, 12.25, 9.5, 12.75], "texture": "#0"}, + "east": {"uv": [9.5, 12.25, 9.75, 12.75], "texture": "#0"}, + "south": {"uv": [12.25, 9.5, 12.5, 10], "texture": "#0"}, + "west": {"uv": [9.75, 12.25, 10, 12.75], "texture": "#0"}, + "up": {"uv": [6.25, 13.25, 6, 13], "texture": "#0"}, + "down": {"uv": [13.25, 6, 13, 6.25], "texture": "#0"} + } + }, + { + "from": [1.5, 5.85, 7.8], + "to": [2, 10.35, 8.3], + "rotation": {"angle": 0, "axis": "y", "origin": [3.6, 8.1, 8.05]}, + "faces": { + "north": {"uv": [10, 10.75, 10.25, 11.75], "texture": "#0"}, + "east": {"uv": [10.25, 10.75, 10.5, 11.75], "texture": "#0"}, + "south": {"uv": [10.5, 10.75, 10.75, 11.75], "texture": "#0"}, + "west": {"uv": [10.75, 10.75, 11, 11.75], "texture": "#0"}, + "up": {"uv": [6.5, 13.25, 6.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 6.25, 13, 6.5], "texture": "#0"} + } + }, + { + "from": [1.5, 8.35, 8.3], + "to": [2, 8.85, 8.8], + "rotation": {"angle": 0, "axis": "y", "origin": [3.6, 8.1, 8.05]}, + "faces": { + "north": {"uv": [6.5, 13, 6.75, 13.25], "texture": "#0"}, + "east": {"uv": [13, 6.5, 13.25, 6.75], "texture": "#0"}, + "south": {"uv": [6.75, 13, 7, 13.25], "texture": "#0"}, + "west": {"uv": [13, 6.75, 13.25, 7], "texture": "#0"}, + "up": {"uv": [7.25, 13.25, 7, 13], "texture": "#0"}, + "down": {"uv": [13.25, 7, 13, 7.25], "texture": "#0"} + } + }, + { + "from": [1.5, 7.35, 8.3], + "to": [2, 7.85, 8.8], + "rotation": {"angle": 0, "axis": "y", "origin": [3.6, 8.1, 8.05]}, + "faces": { + "north": {"uv": [7.25, 13, 7.5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 7.25, 13.25, 7.5], "texture": "#0"}, + "south": {"uv": [7.5, 13, 7.75, 13.25], "texture": "#0"}, + "west": {"uv": [13, 7.5, 13.25, 7.75], "texture": "#0"}, + "up": {"uv": [8, 13.25, 7.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 7.75, 13, 8], "texture": "#0"} + } + }, + { + "from": [1.5, 7.85, 8.3], + "to": [2, 8.35, 9.8], + "rotation": {"angle": 0, "axis": "y", "origin": [3.6, 8.1, 8.05]}, + "faces": { + "north": {"uv": [8, 13, 8.25, 13.25], "texture": "#0"}, + "east": {"uv": [10, 12.25, 10.5, 12.5], "texture": "#0"}, + "south": {"uv": [13, 8, 13.25, 8.25], "texture": "#0"}, + "west": {"uv": [12.25, 10, 12.75, 10.25], "texture": "#0"}, + "up": {"uv": [10.75, 12.75, 10.5, 12.25], "texture": "#0"}, + "down": {"uv": [11, 12.25, 10.75, 12.75], "texture": "#0"} + } + }, + { + "from": [1.5, 7.85, 6.3], + "to": [2, 8.35, 7.8], + "rotation": {"angle": 0, "axis": "y", "origin": [3.6, 8.1, 8.05]}, + "faces": { + "north": {"uv": [8.25, 13, 8.5, 13.25], "texture": "#0"}, + "east": {"uv": [12.25, 10.25, 12.75, 10.5], "texture": "#0"}, + "south": {"uv": [13, 8.25, 13.25, 8.5], "texture": "#0"}, + "west": {"uv": [12.25, 11, 12.75, 11.25], "texture": "#0"}, + "up": {"uv": [12.5, 11.75, 12.25, 11.25], "texture": "#0"}, + "down": {"uv": [12.5, 11.75, 12.25, 12.25], "texture": "#0"} + } + }, + { + "from": [1.5, 8.35, 7.3], + "to": [2, 8.85, 7.8], + "rotation": {"angle": 0, "axis": "y", "origin": [3.6, 8.1, 8.05]}, + "faces": { + "north": {"uv": [8.5, 13, 8.75, 13.25], "texture": "#0"}, + "east": {"uv": [13, 8.5, 13.25, 8.75], "texture": "#0"}, + "south": {"uv": [8.75, 13, 9, 13.25], "texture": "#0"}, + "west": {"uv": [13, 8.75, 13.25, 9], "texture": "#0"}, + "up": {"uv": [9.25, 13.25, 9, 13], "texture": "#0"}, + "down": {"uv": [13.25, 9, 13, 9.25], "texture": "#0"} + } + }, + { + "from": [1.5, 7.35, 7.3], + "to": [2, 7.85, 7.8], + "rotation": {"angle": 0, "axis": "y", "origin": [3.6, 8.1, 8.05]}, + "faces": { + "north": {"uv": [9.25, 13, 9.5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 9.25, 13.25, 9.5], "texture": "#0"}, + "south": {"uv": [9.5, 13, 9.75, 13.25], "texture": "#0"}, + "west": {"uv": [13, 9.5, 13.25, 9.75], "texture": "#0"}, + "up": {"uv": [10, 13.25, 9.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 9.75, 13, 10], "texture": "#0"} + } + }, + { + "from": [6.125, 14.05, 6.225], + "to": [6.625, 14.55, 6.725], + "rotation": {"angle": 0, "axis": "y", "origin": [7.65, 14.3, 8.075]}, + "faces": { + "north": {"uv": [10, 13, 10.25, 13.25], "texture": "#0"}, + "east": {"uv": [13, 10, 13.25, 10.25], "texture": "#0"}, + "south": {"uv": [10.25, 13, 10.5, 13.25], "texture": "#0"}, + "west": {"uv": [13, 10.25, 13.25, 10.5], "texture": "#0"}, + "up": {"uv": [10.75, 13.25, 10.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 10.5, 13, 10.75], "texture": "#0"} + } + }, + { + "from": [5.625, 14.05, 5.225], + "to": [6.125, 14.55, 7.725], + "rotation": {"angle": 0, "axis": "y", "origin": [7.65, 14.3, 8.075]}, + "faces": { + "north": {"uv": [10.75, 13, 11, 13.25], "texture": "#0"}, + "east": {"uv": [12.25, 12.25, 12.75, 12.5], "texture": "#0"}, + "south": {"uv": [13, 10.75, 13.25, 11], "texture": "#0"}, + "west": {"uv": [12.5, 0, 13, 0.25], "texture": "#0"}, + "up": {"uv": [12.75, 0.75, 12.5, 0.25], "texture": "#0"}, + "down": {"uv": [1.5, 12.5, 1.25, 13], "texture": "#0"} + } + }, + { + "from": [5.125, 14.05, 6.225], + "to": [5.625, 14.55, 6.725], + "rotation": {"angle": 0, "axis": "y", "origin": [7.65, 14.3, 8.075]}, + "faces": { + "north": {"uv": [11, 13, 11.25, 13.25], "texture": "#0"}, + "east": {"uv": [13, 11, 13.25, 11.25], "texture": "#0"}, + "south": {"uv": [11.25, 13, 11.5, 13.25], "texture": "#0"}, + "west": {"uv": [13, 11.25, 13.25, 11.5], "texture": "#0"}, + "up": {"uv": [11.75, 13.25, 11.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 11.5, 13, 11.75], "texture": "#0"} + } + }, + { + "from": [9.675, 14.05, 8.925], + "to": [10.175, 14.55, 10.425], + "rotation": {"angle": 0, "axis": "y", "origin": [7.65, 14.3, 8.075]}, + "faces": { + "north": {"uv": [11.75, 13, 12, 13.25], "texture": "#0"}, + "east": {"uv": [12.5, 0.75, 13, 1], "texture": "#0"}, + "south": {"uv": [13, 11.75, 13.25, 12], "texture": "#0"}, + "west": {"uv": [2, 12.5, 2.5, 12.75], "texture": "#0"}, + "up": {"uv": [1.75, 13, 1.5, 12.5], "texture": "#0"}, + "down": {"uv": [2.75, 12.5, 2.5, 13], "texture": "#0"} + } + }, + { + "from": [7.775, 14.05, 5.775], + "to": [8.275, 14.55, 10.275], + "rotation": {"angle": 0, "axis": "y", "origin": [7.65, 14.3, 8.075]}, + "faces": { + "north": {"uv": [12, 13, 12.25, 13.25], "texture": "#0"}, + "east": {"uv": [10.75, 5.25, 11.75, 5.5], "texture": "#0"}, + "south": {"uv": [13, 12, 13.25, 12.25], "texture": "#0"}, + "west": {"uv": [10.75, 5.5, 11.75, 5.75], "texture": "#0"}, + "up": {"uv": [11.25, 3.25, 11, 2.25], "texture": "#0"}, + "down": {"uv": [11.25, 7.25, 11, 8.25], "texture": "#0"} + } + }, + { + "from": [8.275, 14.05, 7.275], + "to": [8.775, 14.55, 7.775], + "rotation": {"angle": 0, "axis": "y", "origin": [7.65, 14.3, 8.075]}, + "faces": { + "north": {"uv": [12.25, 13, 12.5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 12.25, 13.25, 12.5], "texture": "#0"}, + "south": {"uv": [12.5, 13, 12.75, 13.25], "texture": "#0"}, + "west": {"uv": [13, 12.5, 13.25, 12.75], "texture": "#0"}, + "up": {"uv": [13, 13.25, 12.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 12.75, 13, 13], "texture": "#0"} + } + }, + { + "from": [8.275, 14.05, 8.275], + "to": [8.775, 14.55, 8.775], + "rotation": {"angle": 0, "axis": "y", "origin": [7.65, 14.3, 8.075]}, + "faces": { + "north": {"uv": [13, 13, 13.25, 13.25], "texture": "#0"}, + "east": {"uv": [0, 13.25, 0.25, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 0, 13.5, 0.25], "texture": "#0"}, + "west": {"uv": [0.25, 13.25, 0.5, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 0.5, 13.25, 0.25], "texture": "#0"}, + "down": {"uv": [0.75, 13.25, 0.5, 13.5], "texture": "#0"} + } + }, + { + "from": [8.275, 14.05, 7.775], + "to": [9.775, 14.55, 8.275], + "rotation": {"angle": 0, "axis": "y", "origin": [7.65, 14.3, 8.075]}, + "faces": { + "north": {"uv": [2.75, 12.5, 3.25, 12.75], "texture": "#0"}, + "east": {"uv": [13.25, 0.5, 13.5, 0.75], "texture": "#0"}, + "south": {"uv": [12.5, 2.75, 13, 3], "texture": "#0"}, + "west": {"uv": [0.75, 13.25, 1, 13.5], "texture": "#0"}, + "up": {"uv": [13, 3.25, 12.5, 3], "texture": "#0"}, + "down": {"uv": [13, 3.5, 12.5, 3.75], "texture": "#0"} + } + }, + { + "from": [6.275, 14.05, 7.775], + "to": [7.775, 14.55, 8.275], + "rotation": {"angle": 0, "axis": "y", "origin": [7.65, 14.3, 8.075]}, + "faces": { + "north": {"uv": [12.5, 3.75, 13, 4], "texture": "#0"}, + "east": {"uv": [13.25, 0.75, 13.5, 1], "texture": "#0"}, + "south": {"uv": [4, 12.5, 4.5, 12.75], "texture": "#0"}, + "west": {"uv": [1, 13.25, 1.25, 13.5], "texture": "#0"}, + "up": {"uv": [5, 12.75, 4.5, 12.5], "texture": "#0"}, + "down": {"uv": [13, 4.5, 12.5, 4.75], "texture": "#0"} + } + }, + { + "from": [7.275, 14.05, 7.275], + "to": [7.775, 14.55, 7.775], + "rotation": {"angle": 0, "axis": "y", "origin": [7.65, 14.3, 8.075]}, + "faces": { + "north": {"uv": [13.25, 1, 13.5, 1.25], "texture": "#0"}, + "east": {"uv": [1.25, 13.25, 1.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 1.25, 13.5, 1.5], "texture": "#0"}, + "west": {"uv": [1.5, 13.25, 1.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 1.75, 13.25, 1.5], "texture": "#0"}, + "down": {"uv": [2, 13.25, 1.75, 13.5], "texture": "#0"} + } + }, + { + "from": [7.275, 14.05, 8.275], + "to": [7.775, 14.55, 8.775], + "rotation": {"angle": 0, "axis": "y", "origin": [7.65, 14.3, 8.075]}, + "faces": { + "north": {"uv": [13.25, 1.75, 13.5, 2], "texture": "#0"}, + "east": {"uv": [2, 13.25, 2.25, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 2, 13.5, 2.25], "texture": "#0"}, + "west": {"uv": [2.25, 13.25, 2.5, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 2.5, 13.25, 2.25], "texture": "#0"}, + "down": {"uv": [2.75, 13.25, 2.5, 13.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "ornaments", + "origin": [3, 8, 3], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + }, + { + "name": "center", + "origin": [8, 8, 8], + "color": 0, + "children": [32, 33, 34] + }, + { + "name": "plates", + "origin": [8, 8, 8], + "color": 0, + "children": [35, 36, 37, 38, 39, 40] + }, + { + "name": "symbol", + "origin": [6, 8, 1], + "color": 0, + "children": [ + { + "name": "side1", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [41, 42, 43] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [44] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [45, 46, 47, 48, 49, 50, 51] + } + ] + }, + { + "name": "side2", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [52, 53, 54] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [55] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [56, 57, 58, 59, 60, 61, 62] + } + ] + }, + { + "name": "side3", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [63, 64, 65] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [66] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [67, 68, 69, 70, 71, 72, 73] + } + ] + }, + { + "name": "side4", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [74, 75, 76] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [77] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [78, 79, 80, 81, 82, 83, 84] + } + ] + }, + { + "name": "top", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [85, 86, 87] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [88] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [89, 90, 91, 92, 93, 94, 95] + } + ] + } + ] + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_2.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_2.json new file mode 100644 index 00000000..1b4cc66f --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_2.json @@ -0,0 +1,1802 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utilitiesinexcess:upgrade_fortune_2", + "particle": "utilitiesinexcess:upgrade_fortune_2" + }, + "elements": [ + { + "from": [2, 7, 3], + "to": [4, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 4.5, 11, 5], "texture": "#0"}, + "east": {"uv": [11.75, 4.5, 12, 5], "texture": "#0"}, + "south": {"uv": [10.5, 5, 11, 5.5], "texture": "#0"}, + "west": {"uv": [11.75, 5, 12, 5.5], "texture": "#0"}, + "up": {"uv": [12.25, 7.5, 11.75, 7.25], "texture": "#0"}, + "down": {"uv": [12.25, 7.5, 11.75, 7.75], "texture": "#0"} + } + }, + { + "from": [3, 7, 2], + "to": [4, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 7.75, 12, 8.25], "texture": "#0"}, + "east": {"uv": [11.75, 8.25, 12, 8.75], "texture": "#0"}, + "south": {"uv": [11.75, 8.75, 12, 9.25], "texture": "#0"}, + "west": {"uv": [11.75, 11, 12, 11.5], "texture": "#0"}, + "up": {"uv": [10.75, 4, 10.5, 3.75], "texture": "#0"}, + "down": {"uv": [9.25, 12.75, 9, 13], "texture": "#0"} + } + }, + { + "from": [3, 11, 3], + "to": [4, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 11.75, 11.75, 12.25], "texture": "#0"}, + "east": {"uv": [11.75, 11.5, 12, 12], "texture": "#0"}, + "south": {"uv": [12, 1.75, 12.25, 2.25], "texture": "#0"}, + "west": {"uv": [2, 12, 2.25, 12.5], "texture": "#0"}, + "up": {"uv": [13, 9.25, 12.75, 9], "texture": "#0"}, + "down": {"uv": [9.5, 12.75, 9.25, 13], "texture": "#0"} + } + }, + { + "from": [3, 3, 3], + "to": [4, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.25, 12, 2.5, 12.5], "texture": "#0"}, + "east": {"uv": [12, 2.25, 12.25, 2.75], "texture": "#0"}, + "south": {"uv": [2.5, 12, 2.75, 12.5], "texture": "#0"}, + "west": {"uv": [2.75, 12, 3, 12.5], "texture": "#0"}, + "up": {"uv": [13, 9.5, 12.75, 9.25], "texture": "#0"}, + "down": {"uv": [13, 9.75, 12.75, 10], "texture": "#0"} + } + }, + { + "from": [3, 7, 12], + "to": [4, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 8.75, 11.75, 9.25], "texture": "#0"}, + "east": {"uv": [7.5, 4, 8, 4.5], "texture": "#0"}, + "south": {"uv": [3.25, 11.75, 3.5, 12.25], "texture": "#0"}, + "west": {"uv": [7.5, 4.5, 8, 5], "texture": "#0"}, + "up": {"uv": [12, 3.75, 11.75, 3.25], "texture": "#0"}, + "down": {"uv": [3.75, 11.75, 3.5, 12.25], "texture": "#0"} + } + }, + { + "from": [2, 7, 12], + "to": [3, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 2.75, 12.25, 3.25], "texture": "#0"}, + "east": {"uv": [12, 3.25, 12.25, 3.75], "texture": "#0"}, + "south": {"uv": [4, 12, 4.25, 12.5], "texture": "#0"}, + "west": {"uv": [4.25, 12, 4.5, 12.5], "texture": "#0"}, + "up": {"uv": [10.25, 13, 10, 12.75], "texture": "#0"}, + "down": {"uv": [10.5, 12.75, 10.25, 13], "texture": "#0"} + } + }, + { + "from": [3, 11, 12], + "to": [4, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4.5, 12, 4.75, 12.5], "texture": "#0"}, + "east": {"uv": [12, 4.5, 12.25, 5], "texture": "#0"}, + "south": {"uv": [4.75, 12, 5, 12.5], "texture": "#0"}, + "west": {"uv": [5, 12, 5.25, 12.5], "texture": "#0"}, + "up": {"uv": [10.75, 13, 10.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 10.5, 12.75, 10.75], "texture": "#0"} + } + }, + { + "from": [3, 3, 12], + "to": [4, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 5, 12.25, 5.5], "texture": "#0"}, + "east": {"uv": [12, 6, 12.25, 6.5], "texture": "#0"}, + "south": {"uv": [12, 6.5, 12.25, 7], "texture": "#0"}, + "west": {"uv": [7.25, 12, 7.5, 12.5], "texture": "#0"}, + "up": {"uv": [13, 11, 12.75, 10.75], "texture": "#0"}, + "down": {"uv": [11.25, 12.75, 11, 13], "texture": "#0"} + } + }, + { + "from": [12, 7, 12], + "to": [14, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 7.25, 11, 7.75], "texture": "#0"}, + "east": {"uv": [7.5, 12, 7.75, 12.5], "texture": "#0"}, + "south": {"uv": [10.5, 7.75, 11, 8.25], "texture": "#0"}, + "west": {"uv": [7.75, 12, 8, 12.5], "texture": "#0"}, + "up": {"uv": [12.5, 7.25, 12, 7], "texture": "#0"}, + "down": {"uv": [12.5, 7.75, 12, 8], "texture": "#0"} + } + }, + { + "from": [12, 7, 13], + "to": [13, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 12, 8.25, 12.5], "texture": "#0"}, + "east": {"uv": [12, 8, 12.25, 8.5], "texture": "#0"}, + "south": {"uv": [8.25, 12, 8.5, 12.5], "texture": "#0"}, + "west": {"uv": [12, 8.5, 12.25, 9], "texture": "#0"}, + "up": {"uv": [13, 11.25, 12.75, 11], "texture": "#0"}, + "down": {"uv": [11.5, 12.75, 11.25, 13], "texture": "#0"} + } + }, + { + "from": [12, 11, 12], + "to": [13, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 9, 12.25, 9.5], "texture": "#0"}, + "east": {"uv": [12, 9.5, 12.25, 10], "texture": "#0"}, + "south": {"uv": [12, 11, 12.25, 11.5], "texture": "#0"}, + "west": {"uv": [12, 11.5, 12.25, 12], "texture": "#0"}, + "up": {"uv": [13, 11.5, 12.75, 11.25], "texture": "#0"}, + "down": {"uv": [13, 11.5, 12.75, 11.75], "texture": "#0"} + } + }, + { + "from": [12, 3, 12], + "to": [13, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 12, 12, 12.5], "texture": "#0"}, + "east": {"uv": [12, 12, 12.25, 12.5], "texture": "#0"}, + "south": {"uv": [12.25, 0, 12.5, 0.5], "texture": "#0"}, + "west": {"uv": [12.25, 0.5, 12.5, 1], "texture": "#0"}, + "up": {"uv": [12, 13, 11.75, 12.75], "texture": "#0"}, + "down": {"uv": [13, 11.75, 12.75, 12], "texture": "#0"} + } + }, + { + "from": [12, 7, 2], + "to": [13, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 1, 12.5, 1.5], "texture": "#0"}, + "east": {"uv": [10.5, 10, 11, 10.5], "texture": "#0"}, + "south": {"uv": [12.25, 1.5, 12.5, 2], "texture": "#0"}, + "west": {"uv": [10.5, 10.5, 11, 11], "texture": "#0"}, + "up": {"uv": [12.5, 2.5, 12.25, 2], "texture": "#0"}, + "down": {"uv": [12.5, 2.5, 12.25, 3], "texture": "#0"} + } + }, + { + "from": [13, 7, 3], + "to": [14, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 3, 12.5, 3.5], "texture": "#0"}, + "east": {"uv": [3.25, 12.25, 3.5, 12.75], "texture": "#0"}, + "south": {"uv": [3.5, 12.25, 3.75, 12.75], "texture": "#0"}, + "west": {"uv": [12.25, 3.5, 12.5, 4], "texture": "#0"}, + "up": {"uv": [12.25, 13, 12, 12.75], "texture": "#0"}, + "down": {"uv": [13, 12.25, 12.75, 12.5], "texture": "#0"} + } + }, + { + "from": [12, 11, 3], + "to": [13, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 4, 12.5, 4.5], "texture": "#0"}, + "east": {"uv": [12.25, 4.5, 12.5, 5], "texture": "#0"}, + "south": {"uv": [12.25, 5, 12.5, 5.5], "texture": "#0"}, + "west": {"uv": [5.25, 12.25, 5.5, 12.75], "texture": "#0"}, + "up": {"uv": [12.75, 13, 12.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 12.5, 12.75, 12.75], "texture": "#0"} + } + }, + { + "from": [12, 3, 3], + "to": [13, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.5, 12.25, 5.75, 12.75], "texture": "#0"}, + "east": {"uv": [12.25, 5.5, 12.5, 6], "texture": "#0"}, + "south": {"uv": [5.75, 12.25, 6, 12.75], "texture": "#0"}, + "west": {"uv": [6, 12.25, 6.25, 12.75], "texture": "#0"}, + "up": {"uv": [13, 13, 12.75, 12.75], "texture": "#0"}, + "down": {"uv": [0.25, 13, 0, 13.25], "texture": "#0"} + } + }, + { + "from": [7, 12, 2], + "to": [9, 14, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.75, 0, 11.25, 0.5], "texture": "#0"}, + "east": {"uv": [12.25, 6, 12.5, 6.5], "texture": "#0"}, + "south": {"uv": [10.75, 0.5, 11.25, 1], "texture": "#0"}, + "west": {"uv": [12.25, 6.5, 12.5, 7], "texture": "#0"}, + "up": {"uv": [12.75, 7.5, 12.25, 7.25], "texture": "#0"}, + "down": {"uv": [12.75, 7.5, 12.25, 7.75], "texture": "#0"} + } + }, + { + "from": [7, 13, 3], + "to": [9, 14, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 8, 12.75, 8.25], "texture": "#0"}, + "east": {"uv": [0.25, 13, 0.5, 13.25], "texture": "#0"}, + "south": {"uv": [12.25, 8.25, 12.75, 8.5], "texture": "#0"}, + "west": {"uv": [0.5, 13, 0.75, 13.25], "texture": "#0"}, + "up": {"uv": [9, 12.5, 8.5, 12.25], "texture": "#0"}, + "down": {"uv": [12.75, 8.5, 12.25, 8.75], "texture": "#0"} + } + }, + { + "from": [13, 12, 7], + "to": [14, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 8.75, 12.5, 9.25], "texture": "#0"}, + "east": {"uv": [10.75, 1, 11.25, 1.5], "texture": "#0"}, + "south": {"uv": [9, 12.25, 9.25, 12.75], "texture": "#0"}, + "west": {"uv": [10.75, 1.5, 11.25, 2], "texture": "#0"}, + "up": {"uv": [9.5, 12.75, 9.25, 12.25], "texture": "#0"}, + "down": {"uv": [12.5, 9.25, 12.25, 9.75], "texture": "#0"} + } + }, + { + "from": [12, 13, 7], + "to": [13, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13, 0.5, 13.25, 0.75], "texture": "#0"}, + "east": {"uv": [9.5, 12.25, 10, 12.5], "texture": "#0"}, + "south": {"uv": [0.75, 13, 1, 13.25], "texture": "#0"}, + "west": {"uv": [12.25, 9.75, 12.75, 10], "texture": "#0"}, + "up": {"uv": [10.25, 12.75, 10, 12.25], "texture": "#0"}, + "down": {"uv": [12.5, 10, 12.25, 10.5], "texture": "#0"} + } + }, + { + "from": [7, 12, 13], + "to": [9, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.75, 2, 11.25, 2.5], "texture": "#0"}, + "east": {"uv": [10.25, 12.25, 10.5, 12.75], "texture": "#0"}, + "south": {"uv": [10.75, 2.5, 11.25, 3], "texture": "#0"}, + "west": {"uv": [10.5, 12.25, 10.75, 12.75], "texture": "#0"}, + "up": {"uv": [12.75, 10.75, 12.25, 10.5], "texture": "#0"}, + "down": {"uv": [11.25, 12.25, 10.75, 12.5], "texture": "#0"} + } + }, + { + "from": [7, 13, 12], + "to": [9, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 10.75, 12.75, 11], "texture": "#0"}, + "east": {"uv": [13, 0.75, 13.25, 1], "texture": "#0"}, + "south": {"uv": [12.25, 11, 12.75, 11.25], "texture": "#0"}, + "west": {"uv": [1, 13, 1.25, 13.25], "texture": "#0"}, + "up": {"uv": [11.75, 12.5, 11.25, 12.25], "texture": "#0"}, + "down": {"uv": [12.75, 11.25, 12.25, 11.5], "texture": "#0"} + } + }, + { + "from": [2, 12, 7], + "to": [3, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 11.5, 12.5, 12], "texture": "#0"}, + "east": {"uv": [10.75, 3, 11.25, 3.5], "texture": "#0"}, + "south": {"uv": [12.25, 12, 12.5, 12.5], "texture": "#0"}, + "west": {"uv": [10.75, 3.5, 11.25, 4], "texture": "#0"}, + "up": {"uv": [0.25, 13, 0, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 0, 12.5, 0.5], "texture": "#0"} + } + }, + { + "from": [3, 13, 7], + "to": [4, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13, 1, 13.25, 1.25], "texture": "#0"}, + "east": {"uv": [0.25, 12.5, 0.75, 12.75], "texture": "#0"}, + "south": {"uv": [1.25, 13, 1.5, 13.25], "texture": "#0"}, + "west": {"uv": [12.5, 0.5, 13, 0.75], "texture": "#0"}, + "up": {"uv": [1, 13, 0.75, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 0.75, 12.5, 1.25], "texture": "#0"} + } + }, + { + "from": [3, 2, 6], + "to": [4, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [13, 1.25, 13.25, 1.5], "texture": "#0"}, + "east": {"uv": [10.5, 5.5, 11.5, 5.75], "texture": "#0"}, + "south": {"uv": [1.5, 13, 1.75, 13.25], "texture": "#0"}, + "west": {"uv": [10.5, 8.25, 11.5, 8.5], "texture": "#0"}, + "up": {"uv": [4, 11.5, 3.75, 10.5], "texture": "#0"}, + "down": {"uv": [11.25, 4.5, 11, 5.5], "texture": "#0"} + } + }, + { + "from": [2, 2, 6], + "to": [3, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 12.5, 1.25, 13], "texture": "#0"}, + "east": {"uv": [6.5, 4, 7.5, 4.5], "texture": "#0"}, + "south": {"uv": [1.25, 12.5, 1.5, 13], "texture": "#0"}, + "west": {"uv": [6.5, 4.5, 7.5, 5], "texture": "#0"}, + "up": {"uv": [11.25, 8.25, 11, 7.25], "texture": "#0"}, + "down": {"uv": [11.25, 10, 11, 11], "texture": "#0"} + } + }, + { + "from": [6, 2, 12], + "to": [10, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 11, 11.5, 11.25], "texture": "#0"}, + "east": {"uv": [13, 1.5, 13.25, 1.75], "texture": "#0"}, + "south": {"uv": [11.25, 0, 12.25, 0.25], "texture": "#0"}, + "west": {"uv": [1.75, 13, 2, 13.25], "texture": "#0"}, + "up": {"uv": [12.25, 0.5, 11.25, 0.25], "texture": "#0"}, + "down": {"uv": [12.25, 0.5, 11.25, 0.75], "texture": "#0"} + } + }, + { + "from": [6, 2, 13], + "to": [10, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 9.5, 4, 10], "texture": "#0"}, + "east": {"uv": [12.5, 1.25, 12.75, 1.75], "texture": "#0"}, + "south": {"uv": [4, 9.5, 5, 10], "texture": "#0"}, + "west": {"uv": [1.5, 12.5, 1.75, 13], "texture": "#0"}, + "up": {"uv": [12.25, 1, 11.25, 0.75], "texture": "#0"}, + "down": {"uv": [12.25, 1, 11.25, 1.25], "texture": "#0"} + } + }, + { + "from": [12, 2, 6], + "to": [13, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 13, 2.25, 13.25], "texture": "#0"}, + "east": {"uv": [11.25, 1.25, 12.25, 1.5], "texture": "#0"}, + "south": {"uv": [2.25, 13, 2.5, 13.25], "texture": "#0"}, + "west": {"uv": [11.25, 1.5, 12.25, 1.75], "texture": "#0"}, + "up": {"uv": [11.5, 2.75, 11.25, 1.75], "texture": "#0"}, + "down": {"uv": [11.5, 2.75, 11.25, 3.75], "texture": "#0"} + } + }, + { + "from": [13, 2, 6], + "to": [14, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1.75, 12.5, 2, 13], "texture": "#0"}, + "east": {"uv": [5, 9.5, 6, 10], "texture": "#0"}, + "south": {"uv": [12.5, 1.75, 12.75, 2.25], "texture": "#0"}, + "west": {"uv": [6, 9.5, 7, 10], "texture": "#0"}, + "up": {"uv": [11.5, 5.5, 11.25, 4.5], "texture": "#0"}, + "down": {"uv": [11.5, 7.25, 11.25, 8.25], "texture": "#0"} + } + }, + { + "from": [6, 2, 3], + "to": [10, 3, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 3.75, 12.25, 4], "texture": "#0"}, + "east": {"uv": [13, 2.25, 13.25, 2.5], "texture": "#0"}, + "south": {"uv": [11.25, 10, 12.25, 10.25], "texture": "#0"}, + "west": {"uv": [13, 2.5, 13.25, 2.75], "texture": "#0"}, + "up": {"uv": [12.25, 10.5, 11.25, 10.25], "texture": "#0"}, + "down": {"uv": [11.5, 11.25, 10.5, 11.5], "texture": "#0"} + } + }, + { + "from": [6, 2, 2], + "to": [10, 4, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 9.5, 8, 10], "texture": "#0"}, + "east": {"uv": [2, 12.5, 2.25, 13], "texture": "#0"}, + "south": {"uv": [3, 10, 4, 10.5], "texture": "#0"}, + "west": {"uv": [2.25, 12.5, 2.5, 13], "texture": "#0"}, + "up": {"uv": [12.25, 10.75, 11.25, 10.5], "texture": "#0"}, + "down": {"uv": [12.25, 10.75, 11.25, 11], "texture": "#0"} + } + }, + { + "from": [12, 3, 4], + "to": [13, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 9.5, 2.25, 12], "texture": "#0"}, + "east": {"uv": [2.5, 0, 4.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.25, 9.5, 2.5, 12], "texture": "#0"}, + "west": {"uv": [2.5, 2.5, 4.5, 5], "texture": "#0"}, + "up": {"uv": [4.25, 12, 4, 10], "texture": "#0"}, + "down": {"uv": [10.25, 4, 10, 6], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [4, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.5, 9.5, 2.75, 12], "texture": "#0"}, + "east": {"uv": [4.5, 0, 6.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.75, 9.5, 3, 12], "texture": "#0"}, + "west": {"uv": [4.5, 2.5, 6.5, 5], "texture": "#0"}, + "up": {"uv": [4.5, 12, 4.25, 10], "texture": "#0"}, + "down": {"uv": [4.75, 10, 4.5, 12], "texture": "#0"} + } + }, + { + "name": "base", + "from": [4, 3, 3], + "to": [12, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 5, 2, 7.5], "texture": "#0"}, + "east": {"uv": [0, 0, 2.5, 2.5], "texture": "#0"}, + "south": {"uv": [2, 5, 4, 7.5], "texture": "#0"}, + "west": {"uv": [0, 2.5, 2.5, 5], "texture": "#0"}, + "up": {"uv": [6, 7.5, 4, 5], "texture": "#0"}, + "down": {"uv": [8, 5, 6, 7.5], "texture": "#0"} + } + }, + { + "from": [4, 4, 13], + "to": [12, 12, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.5, 0, 8.5, 2], "texture": "#0"}, + "east": {"uv": [4.75, 10, 5, 12], "texture": "#0"}, + "south": {"uv": [6.5, 2, 8.5, 4], "texture": "#0"}, + "west": {"uv": [5, 10, 5.25, 12], "texture": "#0"}, + "up": {"uv": [7.25, 10.25, 5.25, 10], "texture": "#0"}, + "down": {"uv": [12, 6, 10, 6.25], "texture": "#0"} + } + }, + { + "from": [4, 13, 4], + "to": [12, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 6.25, 12, 6.5], "texture": "#0"}, + "east": {"uv": [10, 6.5, 12, 6.75], "texture": "#0"}, + "south": {"uv": [10, 6.75, 12, 7], "texture": "#0"}, + "west": {"uv": [10, 7, 12, 7.25], "texture": "#0"}, + "up": {"uv": [2, 9.5, 0, 7.5], "texture": "#0"}, + "down": {"uv": [4, 7.5, 2, 9.5], "texture": "#0"} + } + }, + { + "from": [13, 4, 4], + "to": [14, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.25, 10, 7.5, 12], "texture": "#0"}, + "east": {"uv": [4, 7.5, 6, 9.5], "texture": "#0"}, + "south": {"uv": [10, 7.25, 10.25, 9.25], "texture": "#0"}, + "west": {"uv": [6, 7.5, 8, 9.5], "texture": "#0"}, + "up": {"uv": [7.75, 12, 7.5, 10], "texture": "#0"}, + "down": {"uv": [8, 10, 7.75, 12], "texture": "#0"} + } + }, + { + "from": [4, 4, 2], + "to": [12, 12, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 4, 10, 6], "texture": "#0"}, + "east": {"uv": [8, 10, 8.25, 12], "texture": "#0"}, + "south": {"uv": [8, 6, 10, 8], "texture": "#0"}, + "west": {"uv": [8.25, 10, 8.5, 12], "texture": "#0"}, + "up": {"uv": [10.5, 10.25, 8.5, 10], "texture": "#0"}, + "down": {"uv": [12, 9.25, 10, 9.5], "texture": "#0"} + } + }, + { + "from": [4, 2, 4], + "to": [12, 3, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.5, 12, 9.75], "texture": "#0"}, + "east": {"uv": [10, 9.75, 12, 10], "texture": "#0"}, + "south": {"uv": [10.25, 4, 12.25, 4.25], "texture": "#0"}, + "west": {"uv": [10.25, 4.25, 12.25, 4.5], "texture": "#0"}, + "up": {"uv": [10, 10, 8, 8], "texture": "#0"}, + "down": {"uv": [10.5, 0, 8.5, 2], "texture": "#0"} + } + }, + { + "from": [2, 4, 4], + "to": [3, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.25, 10.25, 5.5, 12.25], "texture": "#0"}, + "east": {"uv": [8.5, 2, 10.5, 4], "texture": "#0"}, + "south": {"uv": [5.5, 10.25, 5.75, 12.25], "texture": "#0"}, + "west": {"uv": [0, 9.5, 2, 11.5], "texture": "#0"}, + "up": {"uv": [6, 12.25, 5.75, 10.25], "texture": "#0"}, + "down": {"uv": [6.25, 10.25, 6, 12.25], "texture": "#0"} + } + }, + { + "from": [7.15, 5.75, 14], + "to": [7.65, 6.25, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [13, 2.75, 13.25, 3], "texture": "#0"}, + "east": {"uv": [3, 13, 3.25, 13.25], "texture": "#0"}, + "south": {"uv": [13, 3, 13.25, 3.25], "texture": "#0"}, + "west": {"uv": [3.25, 13, 3.5, 13.25], "texture": "#0"}, + "up": {"uv": [13.25, 3.5, 13, 3.25], "texture": "#0"}, + "down": {"uv": [3.75, 13, 3.5, 13.25], "texture": "#0"} + } + }, + { + "from": [7.65, 4.75, 14], + "to": [8.15, 7.25, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [11.5, 7.25, 11.75, 8], "texture": "#0"}, + "east": {"uv": [11.5, 8, 11.75, 8.75], "texture": "#0"}, + "south": {"uv": [8.5, 11.5, 8.75, 12.25], "texture": "#0"}, + "west": {"uv": [8.75, 11.5, 9, 12.25], "texture": "#0"}, + "up": {"uv": [13.25, 3.75, 13, 3.5], "texture": "#0"}, + "down": {"uv": [4, 13, 3.75, 13.25], "texture": "#0"} + } + }, + { + "from": [8.15, 5.75, 14], + "to": [8.65, 6.25, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [13, 3.75, 13.25, 4], "texture": "#0"}, + "east": {"uv": [4, 13, 4.25, 13.25], "texture": "#0"}, + "south": {"uv": [13, 4, 13.25, 4.25], "texture": "#0"}, + "west": {"uv": [4.25, 13, 4.5, 13.25], "texture": "#0"}, + "up": {"uv": [13.25, 4.5, 13, 4.25], "texture": "#0"}, + "down": {"uv": [4.75, 13, 4.5, 13.25], "texture": "#0"} + } + }, + { + "from": [6.45, 8.95, 14], + "to": [7.95, 9.45, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [13, 4.5, 13.25, 4.75], "texture": "#0"}, + "east": {"uv": [4.75, 13, 5, 13.25], "texture": "#0"}, + "south": {"uv": [13, 4.75, 13.25, 5], "texture": "#0"}, + "west": {"uv": [5, 13, 5.25, 13.25], "texture": "#0"}, + "up": {"uv": [13.25, 5.25, 13, 5], "texture": "#0"}, + "down": {"uv": [5.5, 13, 5.25, 13.25], "texture": "#0"} + } + }, + { + "from": [5.95, 6.95, 14], + "to": [6.45, 11.45, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [0, 11.5, 0.25, 12.5], "texture": "#0"}, + "east": {"uv": [0.25, 11.5, 0.5, 12.5], "texture": "#0"}, + "south": {"uv": [0.5, 11.5, 0.75, 12.5], "texture": "#0"}, + "west": {"uv": [0.75, 11.5, 1, 12.5], "texture": "#0"}, + "up": {"uv": [13.25, 5.5, 13, 5.25], "texture": "#0"}, + "down": {"uv": [5.75, 13, 5.5, 13.25], "texture": "#0"} + } + }, + { + "from": [4.45, 8.95, 14], + "to": [5.95, 9.45, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [12.5, 2.25, 13, 2.5], "texture": "#0"}, + "east": {"uv": [13, 5.5, 13.25, 5.75], "texture": "#0"}, + "south": {"uv": [2.5, 12.5, 3, 12.75], "texture": "#0"}, + "west": {"uv": [5.75, 13, 6, 13.25], "texture": "#0"}, + "up": {"uv": [13, 2.75, 12.5, 2.5], "texture": "#0"}, + "down": {"uv": [13, 2.75, 12.5, 3], "texture": "#0"} + } + }, + { + "from": [5.45, 9.45, 14], + "to": [5.95, 9.95, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [13, 5.75, 13.25, 6], "texture": "#0"}, + "east": {"uv": [6, 13, 6.25, 13.25], "texture": "#0"}, + "south": {"uv": [13, 6, 13.25, 6.25], "texture": "#0"}, + "west": {"uv": [6.25, 13, 6.5, 13.25], "texture": "#0"}, + "up": {"uv": [13.25, 6.5, 13, 6.25], "texture": "#0"}, + "down": {"uv": [6.75, 13, 6.5, 13.25], "texture": "#0"} + } + }, + { + "from": [6.45, 9.45, 14], + "to": [6.95, 9.95, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [13, 6.5, 13.25, 6.75], "texture": "#0"}, + "east": {"uv": [6.75, 13, 7, 13.25], "texture": "#0"}, + "south": {"uv": [13, 6.75, 13.25, 7], "texture": "#0"}, + "west": {"uv": [7, 13, 7.25, 13.25], "texture": "#0"}, + "up": {"uv": [13.25, 7.25, 13, 7], "texture": "#0"}, + "down": {"uv": [7.5, 13, 7.25, 13.25], "texture": "#0"} + } + }, + { + "from": [5.45, 8.45, 14], + "to": [5.95, 8.95, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [7.5, 13, 7.75, 13.25], "texture": "#0"}, + "east": {"uv": [7.75, 13, 8, 13.25], "texture": "#0"}, + "south": {"uv": [13, 7.75, 13.25, 8], "texture": "#0"}, + "west": {"uv": [8, 13, 8.25, 13.25], "texture": "#0"}, + "up": {"uv": [8.5, 13.25, 8.25, 13], "texture": "#0"}, + "down": {"uv": [8.75, 13, 8.5, 13.25], "texture": "#0"} + } + }, + { + "from": [6.45, 8.45, 14], + "to": [6.95, 8.95, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [8.75, 13, 9, 13.25], "texture": "#0"}, + "east": {"uv": [13, 8.75, 13.25, 9], "texture": "#0"}, + "south": {"uv": [9, 13, 9.25, 13.25], "texture": "#0"}, + "west": {"uv": [13, 9, 13.25, 9.25], "texture": "#0"}, + "up": {"uv": [9.5, 13.25, 9.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 9.25, 13, 9.5], "texture": "#0"} + } + }, + { + "from": [9.65, 6.15, 14], + "to": [10.15, 10.65, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [10.25, 4.5, 10.5, 5.75], "texture": "#0"}, + "east": {"uv": [6.25, 10.25, 6.5, 11.5], "texture": "#0"}, + "south": {"uv": [6.5, 10.25, 6.75, 11.5], "texture": "#0"}, + "west": {"uv": [6.75, 10.25, 7, 11.5], "texture": "#0"}, + "up": {"uv": [9.75, 13.25, 9.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 9.5, 13, 9.75], "texture": "#0"} + } + }, + { + "from": [9.15, 8.65, 14], + "to": [9.65, 9.15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [9.75, 13, 10, 13.25], "texture": "#0"}, + "east": {"uv": [13, 9.75, 13.25, 10], "texture": "#0"}, + "south": {"uv": [10, 13, 10.25, 13.25], "texture": "#0"}, + "west": {"uv": [13, 10, 13.25, 10.25], "texture": "#0"}, + "up": {"uv": [10.5, 13.25, 10.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 10.25, 13, 10.5], "texture": "#0"} + } + }, + { + "from": [9.15, 7.65, 14], + "to": [9.65, 8.15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [10.5, 13, 10.75, 13.25], "texture": "#0"}, + "east": {"uv": [13, 10.5, 13.25, 10.75], "texture": "#0"}, + "south": {"uv": [10.75, 13, 11, 13.25], "texture": "#0"}, + "west": {"uv": [13, 10.75, 13.25, 11], "texture": "#0"}, + "up": {"uv": [11.25, 13.25, 11, 13], "texture": "#0"}, + "down": {"uv": [13.25, 11, 13, 11.25], "texture": "#0"} + } + }, + { + "from": [8.15, 8.15, 14], + "to": [9.65, 8.65, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [12.5, 3, 13, 3.25], "texture": "#0"}, + "east": {"uv": [11.25, 13, 11.5, 13.25], "texture": "#0"}, + "south": {"uv": [12.5, 3.25, 13, 3.5], "texture": "#0"}, + "west": {"uv": [13, 11.25, 13.25, 11.5], "texture": "#0"}, + "up": {"uv": [13, 3.75, 12.5, 3.5], "texture": "#0"}, + "down": {"uv": [4.25, 12.5, 3.75, 12.75], "texture": "#0"} + } + }, + { + "from": [10.15, 8.15, 14], + "to": [11.65, 8.65, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [12.5, 3.75, 13, 4], "texture": "#0"}, + "east": {"uv": [11.5, 13, 11.75, 13.25], "texture": "#0"}, + "south": {"uv": [12.5, 4, 13, 4.25], "texture": "#0"}, + "west": {"uv": [13, 11.5, 13.25, 11.75], "texture": "#0"}, + "up": {"uv": [4.75, 12.75, 4.25, 12.5], "texture": "#0"}, + "down": {"uv": [13, 4.25, 12.5, 4.5], "texture": "#0"} + } + }, + { + "from": [10.15, 8.65, 14], + "to": [10.65, 9.15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [11.75, 13, 12, 13.25], "texture": "#0"}, + "east": {"uv": [13, 11.75, 13.25, 12], "texture": "#0"}, + "south": {"uv": [12, 13, 12.25, 13.25], "texture": "#0"}, + "west": {"uv": [13, 12, 13.25, 12.25], "texture": "#0"}, + "up": {"uv": [12.5, 13.25, 12.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 12.25, 13, 12.5], "texture": "#0"} + } + }, + { + "from": [10.15, 7.65, 14], + "to": [10.65, 8.15, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 14.25]}, + "faces": { + "north": {"uv": [12.5, 13, 12.75, 13.25], "texture": "#0"}, + "east": {"uv": [13, 12.5, 13.25, 12.75], "texture": "#0"}, + "south": {"uv": [12.75, 13, 13, 13.25], "texture": "#0"}, + "west": {"uv": [13, 12.75, 13.25, 13], "texture": "#0"}, + "up": {"uv": [13.25, 13.25, 13, 13], "texture": "#0"}, + "down": {"uv": [0.25, 13.25, 0, 13.5], "texture": "#0"} + } + }, + { + "from": [7.15, 5.75, 1.5], + "to": [7.65, 6.25, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [13.25, 0, 13.5, 0.25], "texture": "#0"}, + "east": {"uv": [0.25, 13.25, 0.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 0.25, 13.5, 0.5], "texture": "#0"}, + "west": {"uv": [0.5, 13.25, 0.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 0.75, 13.25, 0.5], "texture": "#0"}, + "down": {"uv": [1, 13.25, 0.75, 13.5], "texture": "#0"} + } + }, + { + "from": [7.65, 4.75, 1.5], + "to": [8.15, 7.25, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [9, 11.5, 9.25, 12.25], "texture": "#0"}, + "east": {"uv": [9.25, 11.5, 9.5, 12.25], "texture": "#0"}, + "south": {"uv": [9.5, 11.5, 9.75, 12.25], "texture": "#0"}, + "west": {"uv": [9.75, 11.5, 10, 12.25], "texture": "#0"}, + "up": {"uv": [13.5, 1, 13.25, 0.75], "texture": "#0"}, + "down": {"uv": [1.25, 13.25, 1, 13.5], "texture": "#0"} + } + }, + { + "from": [8.15, 5.75, 1.5], + "to": [8.65, 6.25, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [13.25, 1, 13.5, 1.25], "texture": "#0"}, + "east": {"uv": [1.25, 13.25, 1.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 1.25, 13.5, 1.5], "texture": "#0"}, + "west": {"uv": [1.5, 13.25, 1.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 1.75, 13.25, 1.5], "texture": "#0"}, + "down": {"uv": [2, 13.25, 1.75, 13.5], "texture": "#0"} + } + }, + { + "from": [6.45, 8.95, 1.5], + "to": [7.95, 9.45, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [13.25, 1.75, 13.5, 2], "texture": "#0"}, + "east": {"uv": [2, 13.25, 2.25, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 2, 13.5, 2.25], "texture": "#0"}, + "west": {"uv": [2.25, 13.25, 2.5, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 2.5, 13.25, 2.25], "texture": "#0"}, + "down": {"uv": [2.75, 13.25, 2.5, 13.5], "texture": "#0"} + } + }, + { + "from": [5.95, 6.95, 1.5], + "to": [6.45, 11.45, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [1, 11.5, 1.25, 12.5], "texture": "#0"}, + "east": {"uv": [1.25, 11.5, 1.5, 12.5], "texture": "#0"}, + "south": {"uv": [1.5, 11.5, 1.75, 12.5], "texture": "#0"}, + "west": {"uv": [1.75, 11.5, 2, 12.5], "texture": "#0"}, + "up": {"uv": [13.5, 2.75, 13.25, 2.5], "texture": "#0"}, + "down": {"uv": [3, 13.25, 2.75, 13.5], "texture": "#0"} + } + }, + { + "from": [4.45, 8.95, 1.5], + "to": [5.95, 9.45, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [12.5, 4.5, 13, 4.75], "texture": "#0"}, + "east": {"uv": [13.25, 2.75, 13.5, 3], "texture": "#0"}, + "south": {"uv": [4.75, 12.5, 5.25, 12.75], "texture": "#0"}, + "west": {"uv": [3, 13.25, 3.25, 13.5], "texture": "#0"}, + "up": {"uv": [13, 5, 12.5, 4.75], "texture": "#0"}, + "down": {"uv": [13, 5, 12.5, 5.25], "texture": "#0"} + } + }, + { + "from": [5.45, 9.45, 1.5], + "to": [5.95, 9.95, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [13.25, 3, 13.5, 3.25], "texture": "#0"}, + "east": {"uv": [3.25, 13.25, 3.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 3.25, 13.5, 3.5], "texture": "#0"}, + "west": {"uv": [3.5, 13.25, 3.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 3.75, 13.25, 3.5], "texture": "#0"}, + "down": {"uv": [4, 13.25, 3.75, 13.5], "texture": "#0"} + } + }, + { + "from": [6.45, 9.45, 1.5], + "to": [6.95, 9.95, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [13.25, 3.75, 13.5, 4], "texture": "#0"}, + "east": {"uv": [4, 13.25, 4.25, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 4, 13.5, 4.25], "texture": "#0"}, + "west": {"uv": [4.25, 13.25, 4.5, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 4.5, 13.25, 4.25], "texture": "#0"}, + "down": {"uv": [4.75, 13.25, 4.5, 13.5], "texture": "#0"} + } + }, + { + "from": [5.45, 8.45, 1.5], + "to": [5.95, 8.95, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [13.25, 4.5, 13.5, 4.75], "texture": "#0"}, + "east": {"uv": [4.75, 13.25, 5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 4.75, 13.5, 5], "texture": "#0"}, + "west": {"uv": [5, 13.25, 5.25, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 5.25, 13.25, 5], "texture": "#0"}, + "down": {"uv": [5.5, 13.25, 5.25, 13.5], "texture": "#0"} + } + }, + { + "from": [6.45, 8.45, 1.5], + "to": [6.95, 8.95, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [13.25, 5.25, 13.5, 5.5], "texture": "#0"}, + "east": {"uv": [5.5, 13.25, 5.75, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 5.5, 13.5, 5.75], "texture": "#0"}, + "west": {"uv": [5.75, 13.25, 6, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 6, 13.25, 5.75], "texture": "#0"}, + "down": {"uv": [6.25, 13.25, 6, 13.5], "texture": "#0"} + } + }, + { + "from": [9.65, 6.15, 1.5], + "to": [10.15, 10.65, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [7, 10.25, 7.25, 11.5], "texture": "#0"}, + "east": {"uv": [10.25, 7.25, 10.5, 8.5], "texture": "#0"}, + "south": {"uv": [8.5, 10.25, 8.75, 11.5], "texture": "#0"}, + "west": {"uv": [8.75, 10.25, 9, 11.5], "texture": "#0"}, + "up": {"uv": [13.5, 6.25, 13.25, 6], "texture": "#0"}, + "down": {"uv": [6.5, 13.25, 6.25, 13.5], "texture": "#0"} + } + }, + { + "from": [9.15, 8.65, 1.5], + "to": [9.65, 9.15, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [13.25, 6.25, 13.5, 6.5], "texture": "#0"}, + "east": {"uv": [6.5, 13.25, 6.75, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 6.5, 13.5, 6.75], "texture": "#0"}, + "west": {"uv": [6.75, 13.25, 7, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 7, 13.25, 6.75], "texture": "#0"}, + "down": {"uv": [7.25, 13.25, 7, 13.5], "texture": "#0"} + } + }, + { + "from": [9.15, 7.65, 1.5], + "to": [9.65, 8.15, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [13.25, 7, 13.5, 7.25], "texture": "#0"}, + "east": {"uv": [7.25, 13.25, 7.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 7.25, 13.5, 7.5], "texture": "#0"}, + "west": {"uv": [7.5, 13.25, 7.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 7.75, 13.25, 7.5], "texture": "#0"}, + "down": {"uv": [8, 13.25, 7.75, 13.5], "texture": "#0"} + } + }, + { + "from": [8.15, 8.15, 1.5], + "to": [9.65, 8.65, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [12.5, 5.25, 13, 5.5], "texture": "#0"}, + "east": {"uv": [13.25, 7.75, 13.5, 8], "texture": "#0"}, + "south": {"uv": [12.5, 5.5, 13, 5.75], "texture": "#0"}, + "west": {"uv": [8, 13.25, 8.25, 13.5], "texture": "#0"}, + "up": {"uv": [13, 6, 12.5, 5.75], "texture": "#0"}, + "down": {"uv": [13, 6, 12.5, 6.25], "texture": "#0"} + } + }, + { + "from": [10.15, 8.15, 1.5], + "to": [11.65, 8.65, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [6.25, 12.5, 6.75, 12.75], "texture": "#0"}, + "east": {"uv": [13.25, 8, 13.5, 8.25], "texture": "#0"}, + "south": {"uv": [12.5, 6.25, 13, 6.5], "texture": "#0"}, + "west": {"uv": [8.25, 13.25, 8.5, 13.5], "texture": "#0"}, + "up": {"uv": [13, 6.75, 12.5, 6.5], "texture": "#0"}, + "down": {"uv": [7.25, 12.5, 6.75, 12.75], "texture": "#0"} + } + }, + { + "from": [10.15, 8.65, 1.5], + "to": [10.65, 9.15, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [13.25, 8.25, 13.5, 8.5], "texture": "#0"}, + "east": {"uv": [8.5, 13.25, 8.75, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 8.5, 13.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 13.25, 9, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 9, 13.25, 8.75], "texture": "#0"}, + "down": {"uv": [9.25, 13.25, 9, 13.5], "texture": "#0"} + } + }, + { + "from": [10.15, 7.65, 1.5], + "to": [10.65, 8.15, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 7.85, 1.75]}, + "faces": { + "north": {"uv": [13.25, 9, 13.5, 9.25], "texture": "#0"}, + "east": {"uv": [9.25, 13.25, 9.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 9.25, 13.5, 9.5], "texture": "#0"}, + "west": {"uv": [9.5, 13.25, 9.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 9.75, 13.25, 9.5], "texture": "#0"}, + "down": {"uv": [10, 13.25, 9.75, 13.5], "texture": "#0"} + } + }, + { + "from": [1.55, 5.75, 8.4], + "to": [2.05, 6.25, 8.9], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [13.25, 9.75, 13.5, 10], "texture": "#0"}, + "east": {"uv": [10, 13.25, 10.25, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 10, 13.5, 10.25], "texture": "#0"}, + "west": {"uv": [10.25, 13.25, 10.5, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 10.5, 13.25, 10.25], "texture": "#0"}, + "down": {"uv": [10.75, 13.25, 10.5, 13.5], "texture": "#0"} + } + }, + { + "from": [1.55, 4.75, 7.9], + "to": [2.05, 7.25, 8.4], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [10, 11.5, 10.25, 12.25], "texture": "#0"}, + "east": {"uv": [10.25, 11.5, 10.5, 12.25], "texture": "#0"}, + "south": {"uv": [10.5, 11.5, 10.75, 12.25], "texture": "#0"}, + "west": {"uv": [10.75, 11.5, 11, 12.25], "texture": "#0"}, + "up": {"uv": [13.5, 10.75, 13.25, 10.5], "texture": "#0"}, + "down": {"uv": [11, 13.25, 10.75, 13.5], "texture": "#0"} + } + }, + { + "from": [1.55, 5.75, 7.4], + "to": [2.05, 6.25, 7.9], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [13.25, 10.75, 13.5, 11], "texture": "#0"}, + "east": {"uv": [11, 13.25, 11.25, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 11, 13.5, 11.25], "texture": "#0"}, + "west": {"uv": [11.25, 13.25, 11.5, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 11.5, 13.25, 11.25], "texture": "#0"}, + "down": {"uv": [11.75, 13.25, 11.5, 13.5], "texture": "#0"} + } + }, + { + "from": [1.55, 8.95, 8.1], + "to": [2.05, 9.45, 9.6], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [13.25, 11.5, 13.5, 11.75], "texture": "#0"}, + "east": {"uv": [12.5, 6.75, 13, 7], "texture": "#0"}, + "south": {"uv": [11.75, 13.25, 12, 13.5], "texture": "#0"}, + "west": {"uv": [12.5, 7, 13, 7.25], "texture": "#0"}, + "up": {"uv": [3.25, 13, 3, 12.5], "texture": "#0"}, + "down": {"uv": [7.5, 12.5, 7.25, 13], "texture": "#0"} + } + }, + { + "from": [1.55, 6.95, 9.6], + "to": [2.05, 11.45, 10.1], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [11.5, 1.75, 11.75, 2.75], "texture": "#0"}, + "east": {"uv": [11.5, 2.75, 11.75, 3.75], "texture": "#0"}, + "south": {"uv": [3.75, 11.5, 4, 12.5], "texture": "#0"}, + "west": {"uv": [11.5, 4.5, 11.75, 5.5], "texture": "#0"}, + "up": {"uv": [13.5, 12, 13.25, 11.75], "texture": "#0"}, + "down": {"uv": [12.25, 13.25, 12, 13.5], "texture": "#0"} + } + }, + { + "from": [1.55, 8.95, 10.1], + "to": [2.05, 9.45, 11.6], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [13.25, 12, 13.5, 12.25], "texture": "#0"}, + "east": {"uv": [7.5, 12.5, 8, 12.75], "texture": "#0"}, + "south": {"uv": [12.25, 13.25, 12.5, 13.5], "texture": "#0"}, + "west": {"uv": [12.5, 7.75, 13, 8], "texture": "#0"}, + "up": {"uv": [8.25, 13, 8, 12.5], "texture": "#0"}, + "down": {"uv": [8.5, 12.5, 8.25, 13], "texture": "#0"} + } + }, + { + "from": [1.55, 9.45, 10.1], + "to": [2.05, 9.95, 10.6], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [13.25, 12.25, 13.5, 12.5], "texture": "#0"}, + "east": {"uv": [12.5, 13.25, 12.75, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 12.5, 13.5, 12.75], "texture": "#0"}, + "west": {"uv": [12.75, 13.25, 13, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 13, 13.25, 12.75], "texture": "#0"}, + "down": {"uv": [13.25, 13.25, 13, 13.5], "texture": "#0"} + } + }, + { + "from": [1.55, 9.45, 9.1], + "to": [2.05, 9.95, 9.6], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [13.25, 13, 13.5, 13.25], "texture": "#0"}, + "east": {"uv": [13.25, 13.25, 13.5, 13.5], "texture": "#0"}, + "south": {"uv": [0, 13.5, 0.25, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 0, 13.75, 0.25], "texture": "#0"}, + "up": {"uv": [0.5, 13.75, 0.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 0.25, 13.5, 0.5], "texture": "#0"} + } + }, + { + "from": [1.55, 8.45, 10.1], + "to": [2.05, 8.95, 10.6], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [0.5, 13.5, 0.75, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 0.5, 13.75, 0.75], "texture": "#0"}, + "south": {"uv": [0.75, 13.5, 1, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 0.75, 13.75, 1], "texture": "#0"}, + "up": {"uv": [1.25, 13.75, 1, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 1, 13.5, 1.25], "texture": "#0"} + } + }, + { + "from": [1.55, 8.45, 9.1], + "to": [2.05, 8.95, 9.6], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [1.25, 13.5, 1.5, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 1.25, 13.75, 1.5], "texture": "#0"}, + "south": {"uv": [1.5, 13.5, 1.75, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 1.5, 13.75, 1.75], "texture": "#0"}, + "up": {"uv": [2, 13.75, 1.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 1.75, 13.5, 2], "texture": "#0"} + } + }, + { + "from": [1.55, 6.15, 5.9], + "to": [2.05, 10.65, 6.4], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [9, 10.25, 9.25, 11.5], "texture": "#0"}, + "east": {"uv": [9.25, 10.25, 9.5, 11.5], "texture": "#0"}, + "south": {"uv": [9.5, 10.25, 9.75, 11.5], "texture": "#0"}, + "west": {"uv": [9.75, 10.25, 10, 11.5], "texture": "#0"}, + "up": {"uv": [2.25, 13.75, 2, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 2, 13.5, 2.25], "texture": "#0"} + } + }, + { + "from": [1.55, 8.65, 6.4], + "to": [2.05, 9.15, 6.9], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [2.25, 13.5, 2.5, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 2.25, 13.75, 2.5], "texture": "#0"}, + "south": {"uv": [2.5, 13.5, 2.75, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 2.5, 13.75, 2.75], "texture": "#0"}, + "up": {"uv": [3, 13.75, 2.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 2.75, 13.5, 3], "texture": "#0"} + } + }, + { + "from": [1.55, 7.65, 6.4], + "to": [2.05, 8.15, 6.9], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [3, 13.5, 3.25, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 3, 13.75, 3.25], "texture": "#0"}, + "south": {"uv": [3.25, 13.5, 3.5, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 3.25, 13.75, 3.5], "texture": "#0"}, + "up": {"uv": [3.75, 13.75, 3.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 3.5, 13.5, 3.75], "texture": "#0"} + } + }, + { + "from": [1.55, 8.15, 6.4], + "to": [2.05, 8.65, 7.9], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [3.75, 13.5, 4, 13.75], "texture": "#0"}, + "east": {"uv": [8.5, 12.5, 9, 12.75], "texture": "#0"}, + "south": {"uv": [13.5, 3.75, 13.75, 4], "texture": "#0"}, + "west": {"uv": [12.5, 8.75, 13, 9], "texture": "#0"}, + "up": {"uv": [12.75, 9.5, 12.5, 9], "texture": "#0"}, + "down": {"uv": [9.75, 12.5, 9.5, 13], "texture": "#0"} + } + }, + { + "from": [1.55, 8.15, 4.4], + "to": [2.05, 8.65, 5.9], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [4, 13.5, 4.25, 13.75], "texture": "#0"}, + "east": {"uv": [12.5, 9.5, 13, 9.75], "texture": "#0"}, + "south": {"uv": [13.5, 4, 13.75, 4.25], "texture": "#0"}, + "west": {"uv": [12.5, 10, 13, 10.25], "texture": "#0"}, + "up": {"uv": [10, 13, 9.75, 12.5], "texture": "#0"}, + "down": {"uv": [11, 12.5, 10.75, 13], "texture": "#0"} + } + }, + { + "from": [1.55, 8.65, 5.4], + "to": [2.05, 9.15, 5.9], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [4.25, 13.5, 4.5, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 4.25, 13.75, 4.5], "texture": "#0"}, + "south": {"uv": [4.5, 13.5, 4.75, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 4.5, 13.75, 4.75], "texture": "#0"}, + "up": {"uv": [5, 13.75, 4.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 4.75, 13.5, 5], "texture": "#0"} + } + }, + { + "from": [1.55, 7.65, 5.4], + "to": [2.05, 8.15, 5.9], + "rotation": {"angle": 0, "axis": "y", "origin": [1.8, 7.85, 8]}, + "faces": { + "north": {"uv": [5, 13.5, 5.25, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 5, 13.75, 5.25], "texture": "#0"}, + "south": {"uv": [5.25, 13.5, 5.5, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 5.25, 13.75, 5.5], "texture": "#0"}, + "up": {"uv": [5.75, 13.75, 5.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 5.5, 13.5, 5.75], "texture": "#0"} + } + }, + { + "from": [14.05, 5.75, 8.4], + "to": [14.55, 6.25, 8.9], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [5.75, 13.5, 6, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 5.75, 13.75, 6], "texture": "#0"}, + "south": {"uv": [6, 13.5, 6.25, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 6, 13.75, 6.25], "texture": "#0"}, + "up": {"uv": [6.5, 13.75, 6.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 6.25, 13.5, 6.5], "texture": "#0"} + } + }, + { + "from": [14.05, 4.75, 7.9], + "to": [14.55, 7.25, 8.4], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [11, 11.5, 11.25, 12.25], "texture": "#0"}, + "east": {"uv": [11.5, 11, 11.75, 11.75], "texture": "#0"}, + "south": {"uv": [11.25, 11.5, 11.5, 12.25], "texture": "#0"}, + "west": {"uv": [11.75, 1.75, 12, 2.5], "texture": "#0"}, + "up": {"uv": [6.75, 13.75, 6.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 6.5, 13.5, 6.75], "texture": "#0"} + } + }, + { + "from": [14.05, 5.75, 7.4], + "to": [14.55, 6.25, 7.9], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [6.75, 13.5, 7, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 6.75, 13.75, 7], "texture": "#0"}, + "south": {"uv": [7, 13.5, 7.25, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 7, 13.75, 7.25], "texture": "#0"}, + "up": {"uv": [7.5, 13.75, 7.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 7.25, 13.5, 7.5], "texture": "#0"} + } + }, + { + "from": [14.05, 8.95, 8.1], + "to": [14.55, 9.45, 9.6], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [7.5, 13.5, 7.75, 13.75], "texture": "#0"}, + "east": {"uv": [12.5, 10.25, 13, 10.5], "texture": "#0"}, + "south": {"uv": [13.5, 7.5, 13.75, 7.75], "texture": "#0"}, + "west": {"uv": [11, 12.5, 11.5, 12.75], "texture": "#0"}, + "up": {"uv": [11.75, 13, 11.5, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 11.5, 12.5, 12], "texture": "#0"} + } + }, + { + "from": [14.05, 6.95, 9.6], + "to": [14.55, 11.45, 10.1], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [6.25, 11.5, 6.5, 12.5], "texture": "#0"}, + "east": {"uv": [6.5, 11.5, 6.75, 12.5], "texture": "#0"}, + "south": {"uv": [6.75, 11.5, 7, 12.5], "texture": "#0"}, + "west": {"uv": [7, 11.5, 7.25, 12.5], "texture": "#0"}, + "up": {"uv": [8, 13.75, 7.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 7.75, 13.5, 8], "texture": "#0"} + } + }, + { + "from": [14.05, 8.95, 10.1], + "to": [14.55, 9.45, 11.6], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [8, 13.5, 8.25, 13.75], "texture": "#0"}, + "east": {"uv": [11.75, 12.5, 12.25, 12.75], "texture": "#0"}, + "south": {"uv": [13.5, 8, 13.75, 8.25], "texture": "#0"}, + "west": {"uv": [12.5, 12, 13, 12.25], "texture": "#0"}, + "up": {"uv": [12.5, 13, 12.25, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 12.25, 12.5, 12.75], "texture": "#0"} + } + }, + { + "from": [14.05, 9.45, 10.1], + "to": [14.55, 9.95, 10.6], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [8.25, 13.5, 8.5, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 8.25, 13.75, 8.5], "texture": "#0"}, + "south": {"uv": [8.5, 13.5, 8.75, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 8.5, 13.75, 8.75], "texture": "#0"}, + "up": {"uv": [9, 13.75, 8.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 8.75, 13.5, 9], "texture": "#0"} + } + }, + { + "from": [14.05, 9.45, 9.1], + "to": [14.55, 9.95, 9.6], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [9, 13.5, 9.25, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 9, 13.75, 9.25], "texture": "#0"}, + "south": {"uv": [9.25, 13.5, 9.5, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 9.25, 13.75, 9.5], "texture": "#0"}, + "up": {"uv": [9.75, 13.75, 9.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 9.5, 13.5, 9.75], "texture": "#0"} + } + }, + { + "from": [14.05, 8.45, 10.1], + "to": [14.55, 8.95, 10.6], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [9.75, 13.5, 10, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 9.75, 13.75, 10], "texture": "#0"}, + "south": {"uv": [10, 13.5, 10.25, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 10, 13.75, 10.25], "texture": "#0"}, + "up": {"uv": [10.5, 13.75, 10.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 10.25, 13.5, 10.5], "texture": "#0"} + } + }, + { + "from": [14.05, 8.45, 9.1], + "to": [14.55, 8.95, 9.6], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [10.5, 13.5, 10.75, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 10.5, 13.75, 10.75], "texture": "#0"}, + "south": {"uv": [10.75, 13.5, 11, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 10.75, 13.75, 11], "texture": "#0"}, + "up": {"uv": [11.25, 13.75, 11, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 11, 13.5, 11.25], "texture": "#0"} + } + }, + { + "from": [14.05, 6.15, 5.9], + "to": [14.55, 10.65, 6.4], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [10, 10.25, 10.25, 11.5], "texture": "#0"}, + "east": {"uv": [10.25, 10.25, 10.5, 11.5], "texture": "#0"}, + "south": {"uv": [10.5, 0, 10.75, 1.25], "texture": "#0"}, + "west": {"uv": [10.5, 1.25, 10.75, 2.5], "texture": "#0"}, + "up": {"uv": [11.5, 13.75, 11.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 11.25, 13.5, 11.5], "texture": "#0"} + } + }, + { + "from": [14.05, 8.65, 6.4], + "to": [14.55, 9.15, 6.9], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [11.5, 13.5, 11.75, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 11.5, 13.75, 11.75], "texture": "#0"}, + "south": {"uv": [11.75, 13.5, 12, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 11.75, 13.75, 12], "texture": "#0"}, + "up": {"uv": [12.25, 13.75, 12, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 12, 13.5, 12.25], "texture": "#0"} + } + }, + { + "from": [14.05, 7.65, 6.4], + "to": [14.55, 8.15, 6.9], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [12.25, 13.5, 12.5, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 12.25, 13.75, 12.5], "texture": "#0"}, + "south": {"uv": [12.5, 13.5, 12.75, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 12.5, 13.75, 12.75], "texture": "#0"}, + "up": {"uv": [13, 13.75, 12.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 12.75, 13.5, 13], "texture": "#0"} + } + }, + { + "from": [14.05, 8.15, 6.4], + "to": [14.55, 8.65, 7.9], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [13, 13.5, 13.25, 13.75], "texture": "#0"}, + "east": {"uv": [12.75, 0, 13.25, 0.25], "texture": "#0"}, + "south": {"uv": [13.5, 13, 13.75, 13.25], "texture": "#0"}, + "west": {"uv": [0.25, 12.75, 0.75, 13], "texture": "#0"}, + "up": {"uv": [13, 1.25, 12.75, 0.75], "texture": "#0"}, + "down": {"uv": [13, 1.25, 12.75, 1.75], "texture": "#0"} + } + }, + { + "from": [14.05, 8.15, 4.4], + "to": [14.55, 8.65, 5.9], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [13.25, 13.5, 13.5, 13.75], "texture": "#0"}, + "east": {"uv": [12.75, 0.25, 13.25, 0.5], "texture": "#0"}, + "south": {"uv": [13.5, 13.25, 13.75, 13.5], "texture": "#0"}, + "west": {"uv": [12.75, 1.75, 13.25, 2], "texture": "#0"}, + "up": {"uv": [2.75, 13.25, 2.5, 12.75], "texture": "#0"}, + "down": {"uv": [3, 12.75, 2.75, 13.25], "texture": "#0"} + } + }, + { + "from": [14.05, 8.65, 5.4], + "to": [14.55, 9.15, 5.9], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [13.5, 13.5, 13.75, 13.75], "texture": "#0"}, + "east": {"uv": [0, 13.75, 0.25, 14], "texture": "#0"}, + "south": {"uv": [13.75, 0, 14, 0.25], "texture": "#0"}, + "west": {"uv": [0.25, 13.75, 0.5, 14], "texture": "#0"}, + "up": {"uv": [14, 0.5, 13.75, 0.25], "texture": "#0"}, + "down": {"uv": [0.75, 13.75, 0.5, 14], "texture": "#0"} + } + }, + { + "from": [14.05, 7.65, 5.4], + "to": [14.55, 8.15, 5.9], + "rotation": {"angle": 0, "axis": "y", "origin": [14.3, 7.85, 8]}, + "faces": { + "north": {"uv": [13.75, 0.5, 14, 0.75], "texture": "#0"}, + "east": {"uv": [0.75, 13.75, 1, 14], "texture": "#0"}, + "south": {"uv": [13.75, 0.75, 14, 1], "texture": "#0"}, + "west": {"uv": [1, 13.75, 1.25, 14], "texture": "#0"}, + "up": {"uv": [14, 1.25, 13.75, 1], "texture": "#0"}, + "down": {"uv": [1.5, 13.75, 1.25, 14], "texture": "#0"} + } + }, + { + "from": [7.15, 14.1, 9.85], + "to": [7.65, 14.6, 10.35], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 1.25, 14, 1.5], "texture": "#0"}, + "east": {"uv": [1.5, 13.75, 1.75, 14], "texture": "#0"}, + "south": {"uv": [13.75, 1.5, 14, 1.75], "texture": "#0"}, + "west": {"uv": [1.75, 13.75, 2, 14], "texture": "#0"}, + "up": {"uv": [14, 2, 13.75, 1.75], "texture": "#0"}, + "down": {"uv": [2.25, 13.75, 2, 14], "texture": "#0"} + } + }, + { + "from": [7.65, 14.1, 8.85], + "to": [8.15, 14.6, 11.35], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 2, 14, 2.25], "texture": "#0"}, + "east": {"uv": [11.5, 5.5, 12.25, 5.75], "texture": "#0"}, + "south": {"uv": [2.25, 13.75, 2.5, 14], "texture": "#0"}, + "west": {"uv": [11.5, 5.75, 12.25, 6], "texture": "#0"}, + "up": {"uv": [12, 3.25, 11.75, 2.5], "texture": "#0"}, + "down": {"uv": [3.25, 11.75, 3, 12.5], "texture": "#0"} + } + }, + { + "from": [8.15, 14.1, 9.85], + "to": [8.65, 14.6, 10.35], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 2.25, 14, 2.5], "texture": "#0"}, + "east": {"uv": [2.5, 13.75, 2.75, 14], "texture": "#0"}, + "south": {"uv": [13.75, 2.5, 14, 2.75], "texture": "#0"}, + "west": {"uv": [2.75, 13.75, 3, 14], "texture": "#0"}, + "up": {"uv": [14, 3, 13.75, 2.75], "texture": "#0"}, + "down": {"uv": [3.25, 13.75, 3, 14], "texture": "#0"} + } + }, + { + "from": [6.45, 14.1, 6.65], + "to": [7.95, 14.6, 7.15], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [12.75, 2, 13.25, 2.25], "texture": "#0"}, + "east": {"uv": [13.75, 3, 14, 3.25], "texture": "#0"}, + "south": {"uv": [3.25, 12.75, 3.75, 13], "texture": "#0"}, + "west": {"uv": [3.25, 13.75, 3.5, 14], "texture": "#0"}, + "up": {"uv": [4.25, 13, 3.75, 12.75], "texture": "#0"}, + "down": {"uv": [4.75, 12.75, 4.25, 13], "texture": "#0"} + } + }, + { + "from": [5.95, 14.1, 4.65], + "to": [6.45, 14.6, 9.15], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 3.25, 14, 3.5], "texture": "#0"}, + "east": {"uv": [10.25, 5.75, 11.5, 6], "texture": "#0"}, + "south": {"uv": [3.5, 13.75, 3.75, 14], "texture": "#0"}, + "west": {"uv": [10.25, 8.5, 11.5, 8.75], "texture": "#0"}, + "up": {"uv": [10.75, 3.75, 10.5, 2.5], "texture": "#0"}, + "down": {"uv": [3.25, 10.5, 3, 11.75], "texture": "#0"} + } + }, + { + "from": [4.45, 14.1, 6.65], + "to": [5.95, 14.6, 7.15], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [4.75, 12.75, 5.25, 13], "texture": "#0"}, + "east": {"uv": [13.75, 3.5, 14, 3.75], "texture": "#0"}, + "south": {"uv": [5.25, 12.75, 5.75, 13], "texture": "#0"}, + "west": {"uv": [3.75, 13.75, 4, 14], "texture": "#0"}, + "up": {"uv": [6.25, 13, 5.75, 12.75], "texture": "#0"}, + "down": {"uv": [6.75, 12.75, 6.25, 13], "texture": "#0"} + } + }, + { + "from": [5.45, 14.1, 6.15], + "to": [5.95, 14.6, 6.65], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 3.75, 14, 4], "texture": "#0"}, + "east": {"uv": [4, 13.75, 4.25, 14], "texture": "#0"}, + "south": {"uv": [13.75, 4, 14, 4.25], "texture": "#0"}, + "west": {"uv": [4.25, 13.75, 4.5, 14], "texture": "#0"}, + "up": {"uv": [14, 4.5, 13.75, 4.25], "texture": "#0"}, + "down": {"uv": [4.75, 13.75, 4.5, 14], "texture": "#0"} + } + }, + { + "from": [6.45, 14.1, 6.15], + "to": [6.95, 14.6, 6.65], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 4.5, 14, 4.75], "texture": "#0"}, + "east": {"uv": [4.75, 13.75, 5, 14], "texture": "#0"}, + "south": {"uv": [13.75, 4.75, 14, 5], "texture": "#0"}, + "west": {"uv": [5, 13.75, 5.25, 14], "texture": "#0"}, + "up": {"uv": [14, 5.25, 13.75, 5], "texture": "#0"}, + "down": {"uv": [5.5, 13.75, 5.25, 14], "texture": "#0"} + } + }, + { + "from": [5.45, 14.1, 7.15], + "to": [5.95, 14.6, 7.65], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 5.25, 14, 5.5], "texture": "#0"}, + "east": {"uv": [5.5, 13.75, 5.75, 14], "texture": "#0"}, + "south": {"uv": [13.75, 5.5, 14, 5.75], "texture": "#0"}, + "west": {"uv": [5.75, 13.75, 6, 14], "texture": "#0"}, + "up": {"uv": [14, 6, 13.75, 5.75], "texture": "#0"}, + "down": {"uv": [6.25, 13.75, 6, 14], "texture": "#0"} + } + }, + { + "from": [6.45, 14.1, 7.15], + "to": [6.95, 14.6, 7.65], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 6, 14, 6.25], "texture": "#0"}, + "east": {"uv": [6.25, 13.75, 6.5, 14], "texture": "#0"}, + "south": {"uv": [13.75, 6.25, 14, 6.5], "texture": "#0"}, + "west": {"uv": [6.5, 13.75, 6.75, 14], "texture": "#0"}, + "up": {"uv": [14, 6.75, 13.75, 6.5], "texture": "#0"}, + "down": {"uv": [7, 13.75, 6.75, 14], "texture": "#0"} + } + }, + { + "from": [9.65, 14.1, 5.45], + "to": [10.15, 14.6, 9.95], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 6.75, 14, 7], "texture": "#0"}, + "east": {"uv": [10.25, 8.75, 11.5, 9], "texture": "#0"}, + "south": {"uv": [7, 13.75, 7.25, 14], "texture": "#0"}, + "west": {"uv": [10.25, 9, 11.5, 9.25], "texture": "#0"}, + "up": {"uv": [3.5, 11.75, 3.25, 10.5], "texture": "#0"}, + "down": {"uv": [3.75, 10.5, 3.5, 11.75], "texture": "#0"} + } + }, + { + "from": [9.15, 14.1, 6.95], + "to": [9.65, 14.6, 7.45], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 7, 14, 7.25], "texture": "#0"}, + "east": {"uv": [7.25, 13.75, 7.5, 14], "texture": "#0"}, + "south": {"uv": [13.75, 7.25, 14, 7.5], "texture": "#0"}, + "west": {"uv": [7.5, 13.75, 7.75, 14], "texture": "#0"}, + "up": {"uv": [14, 7.75, 13.75, 7.5], "texture": "#0"}, + "down": {"uv": [8, 13.75, 7.75, 14], "texture": "#0"} + } + }, + { + "from": [9.15, 14.1, 7.95], + "to": [9.65, 14.6, 8.45], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 7.75, 14, 8], "texture": "#0"}, + "east": {"uv": [8, 13.75, 8.25, 14], "texture": "#0"}, + "south": {"uv": [13.75, 8, 14, 8.25], "texture": "#0"}, + "west": {"uv": [8.25, 13.75, 8.5, 14], "texture": "#0"}, + "up": {"uv": [14, 8.5, 13.75, 8.25], "texture": "#0"}, + "down": {"uv": [8.75, 13.75, 8.5, 14], "texture": "#0"} + } + }, + { + "from": [8.15, 14.1, 7.45], + "to": [9.65, 14.6, 7.95], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [6.75, 12.75, 7.25, 13], "texture": "#0"}, + "east": {"uv": [13.75, 8.5, 14, 8.75], "texture": "#0"}, + "south": {"uv": [12.75, 7.25, 13.25, 7.5], "texture": "#0"}, + "west": {"uv": [8.75, 13.75, 9, 14], "texture": "#0"}, + "up": {"uv": [8, 13, 7.5, 12.75], "texture": "#0"}, + "down": {"uv": [13.25, 7.5, 12.75, 7.75], "texture": "#0"} + } + }, + { + "from": [10.15, 14.1, 7.45], + "to": [11.65, 14.6, 7.95], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [12.75, 8, 13.25, 8.25], "texture": "#0"}, + "east": {"uv": [13.75, 8.75, 14, 9], "texture": "#0"}, + "south": {"uv": [12.75, 8.25, 13.25, 8.5], "texture": "#0"}, + "west": {"uv": [9, 13.75, 9.25, 14], "texture": "#0"}, + "up": {"uv": [9, 13, 8.5, 12.75], "texture": "#0"}, + "down": {"uv": [13.25, 8.5, 12.75, 8.75], "texture": "#0"} + } + }, + { + "from": [10.15, 14.1, 6.95], + "to": [10.65, 14.6, 7.45], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 9, 14, 9.25], "texture": "#0"}, + "east": {"uv": [9.25, 13.75, 9.5, 14], "texture": "#0"}, + "south": {"uv": [13.75, 9.25, 14, 9.5], "texture": "#0"}, + "west": {"uv": [9.5, 13.75, 9.75, 14], "texture": "#0"}, + "up": {"uv": [14, 9.75, 13.75, 9.5], "texture": "#0"}, + "down": {"uv": [10, 13.75, 9.75, 14], "texture": "#0"} + } + }, + { + "from": [10.15, 14.1, 7.95], + "to": [10.65, 14.6, 8.45], + "rotation": {"angle": 0, "axis": "y", "origin": [8.05, 14.35, 8.25]}, + "faces": { + "north": {"uv": [13.75, 9.75, 14, 10], "texture": "#0"}, + "east": {"uv": [10, 13.75, 10.25, 14], "texture": "#0"}, + "south": {"uv": [13.75, 10, 14, 10.25], "texture": "#0"}, + "west": {"uv": [10.25, 13.75, 10.5, 14], "texture": "#0"}, + "up": {"uv": [14, 10.5, 13.75, 10.25], "texture": "#0"}, + "down": {"uv": [10.75, 13.75, 10.5, 14], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "ornaments", + "origin": [3, 8, 3], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + }, + { + "name": "center", + "origin": [8, 8, 8], + "color": 0, + "children": [32, 33, 34] + }, + { + "name": "plates", + "origin": [8, 8, 8], + "color": 0, + "children": [35, 36, 37, 38, 39, 40] + }, + { + "name": "symbol", + "origin": [6, 8, 1], + "color": 0, + "children": [ + { + "name": "side1", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [41, 42, 43] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [44, 45, 46, 47, 48, 49, 50] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [51, 52, 53, 54, 55, 56, 57] + } + ] + }, + { + "name": "side2", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [58, 59, 60] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [61, 62, 63, 64, 65, 66, 67] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [68, 69, 70, 71, 72, 73, 74] + } + ] + }, + { + "name": "side3", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [75, 76, 77] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [78, 79, 80, 81, 82, 83, 84] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [85, 86, 87, 88, 89, 90, 91] + } + ] + }, + { + "name": "side4", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [92, 93, 94] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [95, 96, 97, 98, 99, 100, 101] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [102, 103, 104, 105, 106, 107, 108] + } + ] + }, + { + "name": "top", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [109, 110, 111] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [112, 113, 114, 115, 116, 117, 118] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [119, 120, 121, 122, 123, 124, 125] + } + ] + } + ] + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_3.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_3.json new file mode 100644 index 00000000..3528cc9f --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_fortune_3.json @@ -0,0 +1,2062 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utilitiesinexcess:upgrade_fortune_3", + "particle": "utilitiesinexcess:upgrade_fortune_3" + }, + "elements": [ + { + "from": [2, 7, 3], + "to": [4, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.5, 4, 8, 4.5], "texture": "#0"}, + "east": {"uv": [0.5, 12, 0.75, 12.5], "texture": "#0"}, + "south": {"uv": [7.5, 4.5, 8, 5], "texture": "#0"}, + "west": {"uv": [0.75, 12, 1, 12.5], "texture": "#0"}, + "up": {"uv": [11, 4, 10.5, 3.75], "texture": "#0"}, + "down": {"uv": [12.25, 11.25, 11.75, 11.5], "texture": "#0"} + } + }, + { + "from": [3, 7, 2], + "to": [4, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 12, 1.25, 12.5], "texture": "#0"}, + "east": {"uv": [12, 1, 12.25, 1.5], "texture": "#0"}, + "south": {"uv": [1.25, 12, 1.5, 12.5], "texture": "#0"}, + "west": {"uv": [12, 1.5, 12.25, 2], "texture": "#0"}, + "up": {"uv": [13.25, 2, 13, 1.75], "texture": "#0"}, + "down": {"uv": [2.25, 13, 2, 13.25], "texture": "#0"} + } + }, + { + "from": [3, 11, 3], + "to": [4, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 12, 2.25, 12.5], "texture": "#0"}, + "east": {"uv": [12, 2, 12.25, 2.5], "texture": "#0"}, + "south": {"uv": [2.25, 12, 2.5, 12.5], "texture": "#0"}, + "west": {"uv": [2.5, 12, 2.75, 12.5], "texture": "#0"}, + "up": {"uv": [2.5, 13.25, 2.25, 13], "texture": "#0"}, + "down": {"uv": [2.75, 13, 2.5, 13.25], "texture": "#0"} + } + }, + { + "from": [3, 3, 3], + "to": [4, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 2.5, 12.25, 3], "texture": "#0"}, + "east": {"uv": [2.75, 12, 3, 12.5], "texture": "#0"}, + "south": {"uv": [12, 3, 12.25, 3.5], "texture": "#0"}, + "west": {"uv": [12, 3.5, 12.25, 4], "texture": "#0"}, + "up": {"uv": [13.25, 2.75, 13, 2.5], "texture": "#0"}, + "down": {"uv": [3, 13, 2.75, 13.25], "texture": "#0"} + } + }, + { + "from": [3, 7, 12], + "to": [4, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4, 12, 4.25, 12.5], "texture": "#0"}, + "east": {"uv": [11.25, 0, 11.75, 0.5], "texture": "#0"}, + "south": {"uv": [4.25, 12, 4.5, 12.5], "texture": "#0"}, + "west": {"uv": [11.25, 0.5, 11.75, 1], "texture": "#0"}, + "up": {"uv": [4.75, 12.5, 4.5, 12], "texture": "#0"}, + "down": {"uv": [12.25, 4.5, 12, 5], "texture": "#0"} + } + }, + { + "from": [2, 7, 12], + "to": [3, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4.75, 12, 5, 12.5], "texture": "#0"}, + "east": {"uv": [5, 12, 5.25, 12.5], "texture": "#0"}, + "south": {"uv": [12, 5, 12.25, 5.5], "texture": "#0"}, + "west": {"uv": [12, 6, 12.25, 6.5], "texture": "#0"}, + "up": {"uv": [13.25, 3, 13, 2.75], "texture": "#0"}, + "down": {"uv": [3.25, 13, 3, 13.25], "texture": "#0"} + } + }, + { + "from": [3, 11, 12], + "to": [4, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 6.5, 12.25, 7], "texture": "#0"}, + "east": {"uv": [12, 7, 12.25, 7.5], "texture": "#0"}, + "south": {"uv": [7.25, 12, 7.5, 12.5], "texture": "#0"}, + "west": {"uv": [7.5, 12, 7.75, 12.5], "texture": "#0"}, + "up": {"uv": [3.5, 13.25, 3.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 3.5, 13, 3.75], "texture": "#0"} + } + }, + { + "from": [3, 3, 12], + "to": [4, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 7.5, 12.25, 8], "texture": "#0"}, + "east": {"uv": [7.75, 12, 8, 12.5], "texture": "#0"}, + "south": {"uv": [8, 12, 8.25, 12.5], "texture": "#0"}, + "west": {"uv": [8.25, 12, 8.5, 12.5], "texture": "#0"}, + "up": {"uv": [13.25, 4, 13, 3.75], "texture": "#0"}, + "down": {"uv": [4.25, 13, 4, 13.25], "texture": "#0"} + } + }, + { + "from": [12, 7, 12], + "to": [14, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 1, 11.75, 1.5], "texture": "#0"}, + "east": {"uv": [9.25, 12, 9.5, 12.5], "texture": "#0"}, + "south": {"uv": [11.25, 1.5, 11.75, 2], "texture": "#0"}, + "west": {"uv": [12, 9.25, 12.25, 9.75], "texture": "#0"}, + "up": {"uv": [12.5, 8.25, 12, 8], "texture": "#0"}, + "down": {"uv": [10, 12, 9.5, 12.25], "texture": "#0"} + } + }, + { + "from": [12, 7, 13], + "to": [13, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 12, 10.25, 12.5], "texture": "#0"}, + "east": {"uv": [12, 10.25, 12.25, 10.75], "texture": "#0"}, + "south": {"uv": [12, 10.75, 12.25, 11.25], "texture": "#0"}, + "west": {"uv": [12, 11.75, 12.25, 12.25], "texture": "#0"}, + "up": {"uv": [4.5, 13.25, 4.25, 13], "texture": "#0"}, + "down": {"uv": [4.75, 13, 4.5, 13.25], "texture": "#0"} + } + }, + { + "from": [12, 11, 12], + "to": [13, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 11.75, 10.75, 12.25], "texture": "#0"}, + "east": {"uv": [10.75, 11.75, 11, 12.25], "texture": "#0"}, + "south": {"uv": [11.5, 11.75, 11.75, 12.25], "texture": "#0"}, + "west": {"uv": [11.75, 11.75, 12, 12.25], "texture": "#0"}, + "up": {"uv": [11.25, 4, 11, 3.75], "texture": "#0"}, + "down": {"uv": [11.25, 12.75, 11, 13], "texture": "#0"} + } + }, + { + "from": [12, 3, 12], + "to": [13, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 1, 12.5, 1.5], "texture": "#0"}, + "east": {"uv": [12.25, 1.5, 12.5, 2], "texture": "#0"}, + "south": {"uv": [12.25, 2, 12.5, 2.5], "texture": "#0"}, + "west": {"uv": [12.25, 2.5, 12.5, 3], "texture": "#0"}, + "up": {"uv": [13.25, 4.75, 13, 4.5], "texture": "#0"}, + "down": {"uv": [5, 13, 4.75, 13.25], "texture": "#0"} + } + }, + { + "from": [12, 7, 2], + "to": [13, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 3, 12.5, 3.5], "texture": "#0"}, + "east": {"uv": [11.25, 2, 11.75, 2.5], "texture": "#0"}, + "south": {"uv": [12.25, 3.5, 12.5, 4], "texture": "#0"}, + "west": {"uv": [11.25, 2.5, 11.75, 3], "texture": "#0"}, + "up": {"uv": [12.5, 4.5, 12.25, 4], "texture": "#0"}, + "down": {"uv": [12.5, 4.5, 12.25, 5], "texture": "#0"} + } + }, + { + "from": [13, 7, 3], + "to": [14, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 5, 12.5, 5.5], "texture": "#0"}, + "east": {"uv": [5.25, 12.25, 5.5, 12.75], "texture": "#0"}, + "south": {"uv": [5.5, 12.25, 5.75, 12.75], "texture": "#0"}, + "west": {"uv": [5.75, 12.25, 6, 12.75], "texture": "#0"}, + "up": {"uv": [13.25, 5, 13, 4.75], "texture": "#0"}, + "down": {"uv": [5.25, 13, 5, 13.25], "texture": "#0"} + } + }, + { + "from": [12, 11, 3], + "to": [13, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 12.25, 6.25, 12.75], "texture": "#0"}, + "east": {"uv": [12.25, 6, 12.5, 6.5], "texture": "#0"}, + "south": {"uv": [12.25, 6.5, 12.5, 7], "texture": "#0"}, + "west": {"uv": [12.25, 7, 12.5, 7.5], "texture": "#0"}, + "up": {"uv": [13.25, 5.25, 13, 5], "texture": "#0"}, + "down": {"uv": [5.5, 13, 5.25, 13.25], "texture": "#0"} + } + }, + { + "from": [12, 3, 3], + "to": [13, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 7.5, 12.5, 8], "texture": "#0"}, + "east": {"uv": [12.25, 9.25, 12.5, 9.75], "texture": "#0"}, + "south": {"uv": [9.5, 12.25, 9.75, 12.75], "texture": "#0"}, + "west": {"uv": [9.75, 12.25, 10, 12.75], "texture": "#0"}, + "up": {"uv": [13.25, 5.5, 13, 5.25], "texture": "#0"}, + "down": {"uv": [5.75, 13, 5.5, 13.25], "texture": "#0"} + } + }, + { + "from": [7, 12, 2], + "to": [9, 14, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 3, 11.75, 3.5], "texture": "#0"}, + "east": {"uv": [12.25, 10.25, 12.5, 10.75], "texture": "#0"}, + "south": {"uv": [11.25, 3.5, 11.75, 4], "texture": "#0"}, + "west": {"uv": [10.5, 12.25, 10.75, 12.75], "texture": "#0"}, + "up": {"uv": [12.5, 10, 12, 9.75], "texture": "#0"}, + "down": {"uv": [12.75, 5.5, 12.25, 5.75], "texture": "#0"} + } + }, + { + "from": [7, 13, 3], + "to": [9, 14, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 8.25, 12.75, 8.5], "texture": "#0"}, + "east": {"uv": [13, 5.75, 13.25, 6], "texture": "#0"}, + "south": {"uv": [10.75, 12.25, 11.25, 12.5], "texture": "#0"}, + "west": {"uv": [13, 6, 13.25, 6.25], "texture": "#0"}, + "up": {"uv": [12.75, 11, 12.25, 10.75], "texture": "#0"}, + "down": {"uv": [12.75, 11, 12.25, 11.25], "texture": "#0"} + } + }, + { + "from": [13, 12, 7], + "to": [14, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 12.25, 11.75, 12.75], "texture": "#0"}, + "east": {"uv": [11.25, 4.5, 11.75, 5], "texture": "#0"}, + "south": {"uv": [11.75, 12.25, 12, 12.75], "texture": "#0"}, + "west": {"uv": [11.25, 5, 11.75, 5.5], "texture": "#0"}, + "up": {"uv": [12.5, 12.25, 12.25, 11.75], "texture": "#0"}, + "down": {"uv": [12.25, 12.25, 12, 12.75], "texture": "#0"} + } + }, + { + "from": [12, 13, 7], + "to": [13, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.25, 13, 6.5, 13.25], "texture": "#0"}, + "east": {"uv": [12.25, 11.25, 12.75, 11.5], "texture": "#0"}, + "south": {"uv": [13, 6.25, 13.25, 6.5], "texture": "#0"}, + "west": {"uv": [12.25, 12.25, 12.75, 12.5], "texture": "#0"}, + "up": {"uv": [0.25, 13, 0, 12.5], "texture": "#0"}, + "down": {"uv": [0.5, 12.5, 0.25, 13], "texture": "#0"} + } + }, + { + "from": [7, 12, 13], + "to": [9, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 7.25, 11.75, 7.75], "texture": "#0"}, + "east": {"uv": [0.5, 12.5, 0.75, 13], "texture": "#0"}, + "south": {"uv": [11.25, 7.75, 11.75, 8.25], "texture": "#0"}, + "west": {"uv": [0.75, 12.5, 1, 13], "texture": "#0"}, + "up": {"uv": [1.5, 12.75, 1, 12.5], "texture": "#0"}, + "down": {"uv": [13, 1, 12.5, 1.25], "texture": "#0"} + } + }, + { + "from": [7, 13, 12], + "to": [9, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 1.25, 13, 1.5], "texture": "#0"}, + "east": {"uv": [6.5, 13, 6.75, 13.25], "texture": "#0"}, + "south": {"uv": [1.5, 12.5, 2, 12.75], "texture": "#0"}, + "west": {"uv": [13, 6.5, 13.25, 6.75], "texture": "#0"}, + "up": {"uv": [13, 1.75, 12.5, 1.5], "texture": "#0"}, + "down": {"uv": [13, 1.75, 12.5, 2], "texture": "#0"} + } + }, + { + "from": [2, 12, 7], + "to": [3, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 12.5, 2.25, 13], "texture": "#0"}, + "east": {"uv": [11.25, 10, 11.75, 10.5], "texture": "#0"}, + "south": {"uv": [12.5, 2, 12.75, 2.5], "texture": "#0"}, + "west": {"uv": [10.5, 11.25, 11, 11.75], "texture": "#0"}, + "up": {"uv": [2.5, 13, 2.25, 12.5], "texture": "#0"}, + "down": {"uv": [2.75, 12.5, 2.5, 13], "texture": "#0"} + } + }, + { + "from": [3, 13, 7], + "to": [4, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.75, 13, 7, 13.25], "texture": "#0"}, + "east": {"uv": [12.5, 2.5, 13, 2.75], "texture": "#0"}, + "south": {"uv": [13, 6.75, 13.25, 7], "texture": "#0"}, + "west": {"uv": [12.5, 2.75, 13, 3], "texture": "#0"}, + "up": {"uv": [3, 13, 2.75, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 3, 12.5, 3.5], "texture": "#0"} + } + }, + { + "from": [3, 2, 6], + "to": [4, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 13, 7.25, 13.25], "texture": "#0"}, + "east": {"uv": [11.25, 5.5, 12.25, 5.75], "texture": "#0"}, + "south": {"uv": [13, 7, 13.25, 7.25], "texture": "#0"}, + "west": {"uv": [11.25, 8.25, 12.25, 8.5], "texture": "#0"}, + "up": {"uv": [11.5, 11.5, 11.25, 10.5], "texture": "#0"}, + "down": {"uv": [11.25, 11.25, 11, 12.25], "texture": "#0"} + } + }, + { + "from": [2, 2, 6], + "to": [3, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 3.5, 12.75, 4], "texture": "#0"}, + "east": {"uv": [6.5, 4, 7.5, 4.5], "texture": "#0"}, + "south": {"uv": [4, 12.5, 4.25, 13], "texture": "#0"}, + "west": {"uv": [6.5, 4.5, 7.5, 5], "texture": "#0"}, + "up": {"uv": [0.25, 12.5, 0, 11.5], "texture": "#0"}, + "down": {"uv": [0.5, 11.5, 0.25, 12.5], "texture": "#0"} + } + }, + { + "from": [6, 2, 12], + "to": [10, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0.5, 11.5, 1.5, 11.75], "texture": "#0"}, + "east": {"uv": [13, 7.25, 13.25, 7.5], "texture": "#0"}, + "south": {"uv": [11.5, 5.75, 12.5, 6], "texture": "#0"}, + "west": {"uv": [13, 7.5, 13.25, 7.75], "texture": "#0"}, + "up": {"uv": [7.25, 11.75, 6.25, 11.5], "texture": "#0"}, + "down": {"uv": [9.5, 11.5, 8.5, 11.75], "texture": "#0"} + } + }, + { + "from": [6, 2, 13], + "to": [10, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 9.5, 4, 10], "texture": "#0"}, + "east": {"uv": [12.5, 4, 12.75, 4.5], "texture": "#0"}, + "south": {"uv": [4, 9.5, 5, 10], "texture": "#0"}, + "west": {"uv": [4.25, 12.5, 4.5, 13], "texture": "#0"}, + "up": {"uv": [12.5, 8.75, 11.5, 8.5], "texture": "#0"}, + "down": {"uv": [12.5, 8.75, 11.5, 9], "texture": "#0"} + } + }, + { + "from": [12, 2, 6], + "to": [13, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.75, 13, 8, 13.25], "texture": "#0"}, + "east": {"uv": [11.5, 9, 12.5, 9.25], "texture": "#0"}, + "south": {"uv": [13, 7.75, 13.25, 8], "texture": "#0"}, + "west": {"uv": [9.5, 11.5, 10.5, 11.75], "texture": "#0"}, + "up": {"uv": [1.75, 12.5, 1.5, 11.5], "texture": "#0"}, + "down": {"uv": [2, 11.5, 1.75, 12.5], "texture": "#0"} + } + }, + { + "from": [13, 2, 6], + "to": [14, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4.5, 12.5, 4.75, 13], "texture": "#0"}, + "east": {"uv": [5, 9.5, 6, 10], "texture": "#0"}, + "south": {"uv": [12.5, 4.5, 12.75, 5], "texture": "#0"}, + "west": {"uv": [6, 9.5, 7, 10], "texture": "#0"}, + "up": {"uv": [11.75, 11.5, 11.5, 10.5], "texture": "#0"}, + "down": {"uv": [11.5, 11.5, 11.25, 12.5], "texture": "#0"} + } + }, + { + "from": [6, 2, 3], + "to": [10, 3, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 11.5, 12.5, 11.75], "texture": "#0"}, + "east": {"uv": [8, 13, 8.25, 13.25], "texture": "#0"}, + "south": {"uv": [11.75, 0, 12.75, 0.25], "texture": "#0"}, + "west": {"uv": [13, 8, 13.25, 8.25], "texture": "#0"}, + "up": {"uv": [12.75, 0.5, 11.75, 0.25], "texture": "#0"}, + "down": {"uv": [1.5, 11.75, 0.5, 12], "texture": "#0"} + } + }, + { + "from": [6, 2, 2], + "to": [10, 4, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 9.5, 8, 10], "texture": "#0"}, + "east": {"uv": [4.75, 12.5, 5, 13], "texture": "#0"}, + "south": {"uv": [3, 10, 4, 10.5], "texture": "#0"}, + "west": {"uv": [5, 12.5, 5.25, 13], "texture": "#0"}, + "up": {"uv": [12.75, 0.75, 11.75, 0.5], "texture": "#0"}, + "down": {"uv": [12.75, 0.75, 11.75, 1], "texture": "#0"} + } + }, + { + "from": [12, 3, 4], + "to": [13, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 9.5, 2.25, 12], "texture": "#0"}, + "east": {"uv": [2.5, 0, 4.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.25, 9.5, 2.5, 12], "texture": "#0"}, + "west": {"uv": [2.5, 2.5, 4.5, 5], "texture": "#0"}, + "up": {"uv": [4.25, 12, 4, 10], "texture": "#0"}, + "down": {"uv": [10.25, 4, 10, 6], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [4, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.5, 9.5, 2.75, 12], "texture": "#0"}, + "east": {"uv": [4.5, 0, 6.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.75, 9.5, 3, 12], "texture": "#0"}, + "west": {"uv": [4.5, 2.5, 6.5, 5], "texture": "#0"}, + "up": {"uv": [4.5, 12, 4.25, 10], "texture": "#0"}, + "down": {"uv": [4.75, 10, 4.5, 12], "texture": "#0"} + } + }, + { + "name": "base", + "from": [4, 3, 3], + "to": [12, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 5, 2, 7.5], "texture": "#0"}, + "east": {"uv": [0, 0, 2.5, 2.5], "texture": "#0"}, + "south": {"uv": [2, 5, 4, 7.5], "texture": "#0"}, + "west": {"uv": [0, 2.5, 2.5, 5], "texture": "#0"}, + "up": {"uv": [6, 7.5, 4, 5], "texture": "#0"}, + "down": {"uv": [8, 5, 6, 7.5], "texture": "#0"} + } + }, + { + "from": [4, 4, 13], + "to": [12, 12, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.5, 0, 8.5, 2], "texture": "#0"}, + "east": {"uv": [4.75, 10, 5, 12], "texture": "#0"}, + "south": {"uv": [6.5, 2, 8.5, 4], "texture": "#0"}, + "west": {"uv": [5, 10, 5.25, 12], "texture": "#0"}, + "up": {"uv": [7.25, 10.25, 5.25, 10], "texture": "#0"}, + "down": {"uv": [12, 6, 10, 6.25], "texture": "#0"} + } + }, + { + "from": [4, 13, 4], + "to": [12, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 6.25, 12, 6.5], "texture": "#0"}, + "east": {"uv": [10, 6.5, 12, 6.75], "texture": "#0"}, + "south": {"uv": [10, 6.75, 12, 7], "texture": "#0"}, + "west": {"uv": [10, 7, 12, 7.25], "texture": "#0"}, + "up": {"uv": [2, 9.5, 0, 7.5], "texture": "#0"}, + "down": {"uv": [4, 7.5, 2, 9.5], "texture": "#0"} + } + }, + { + "from": [13, 4, 4], + "to": [14, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.25, 10, 7.5, 12], "texture": "#0"}, + "east": {"uv": [4, 7.5, 6, 9.5], "texture": "#0"}, + "south": {"uv": [10, 7.25, 10.25, 9.25], "texture": "#0"}, + "west": {"uv": [6, 7.5, 8, 9.5], "texture": "#0"}, + "up": {"uv": [7.75, 12, 7.5, 10], "texture": "#0"}, + "down": {"uv": [8, 10, 7.75, 12], "texture": "#0"} + } + }, + { + "from": [4, 4, 2], + "to": [12, 12, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 4, 10, 6], "texture": "#0"}, + "east": {"uv": [8, 10, 8.25, 12], "texture": "#0"}, + "south": {"uv": [8, 6, 10, 8], "texture": "#0"}, + "west": {"uv": [8.25, 10, 8.5, 12], "texture": "#0"}, + "up": {"uv": [10.5, 10.25, 8.5, 10], "texture": "#0"}, + "down": {"uv": [12, 9.25, 10, 9.5], "texture": "#0"} + } + }, + { + "from": [4, 2, 4], + "to": [12, 3, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.5, 12, 9.75], "texture": "#0"}, + "east": {"uv": [10, 9.75, 12, 10], "texture": "#0"}, + "south": {"uv": [10.25, 4, 12.25, 4.25], "texture": "#0"}, + "west": {"uv": [10.25, 4.25, 12.25, 4.5], "texture": "#0"}, + "up": {"uv": [10, 10, 8, 8], "texture": "#0"}, + "down": {"uv": [10.5, 0, 8.5, 2], "texture": "#0"} + } + }, + { + "from": [2, 4, 4], + "to": [3, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.25, 10.25, 5.5, 12.25], "texture": "#0"}, + "east": {"uv": [8.5, 2, 10.5, 4], "texture": "#0"}, + "south": {"uv": [5.5, 10.25, 5.75, 12.25], "texture": "#0"}, + "west": {"uv": [0, 9.5, 2, 11.5], "texture": "#0"}, + "up": {"uv": [6, 12.25, 5.75, 10.25], "texture": "#0"}, + "down": {"uv": [6.25, 10.25, 6, 12.25], "texture": "#0"} + } + }, + { + "from": [6.9, 6, 14], + "to": [7.9, 6.5, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.15, 6.25, 14.25]}, + "faces": { + "north": {"uv": [8.25, 13, 8.5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 8.5, 13.25, 8.75], "texture": "#0"}, + "south": {"uv": [13, 8.75, 13.25, 9], "texture": "#0"}, + "west": {"uv": [13, 9, 13.25, 9.25], "texture": "#0"}, + "up": {"uv": [9.5, 13.25, 9.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 9.25, 13, 9.5], "texture": "#0"} + } + }, + { + "from": [7.9, 4.5, 14], + "to": [8.4, 8, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.15, 6.25, 14.25]}, + "faces": { + "north": {"uv": [11.75, 1, 12, 2], "texture": "#0"}, + "east": {"uv": [11.75, 2, 12, 3], "texture": "#0"}, + "south": {"uv": [3, 11.75, 3.25, 12.75], "texture": "#0"}, + "west": {"uv": [11.75, 3, 12, 4], "texture": "#0"}, + "up": {"uv": [9.75, 13.25, 9.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 9.5, 13, 9.75], "texture": "#0"} + } + }, + { + "from": [8.4, 6, 14], + "to": [9.4, 6.5, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.15, 6.25, 14.25]}, + "faces": { + "north": {"uv": [9.75, 13, 10, 13.25], "texture": "#0"}, + "east": {"uv": [13, 9.75, 13.25, 10], "texture": "#0"}, + "south": {"uv": [10, 13, 10.25, 13.25], "texture": "#0"}, + "west": {"uv": [13, 10.25, 13.25, 10.5], "texture": "#0"}, + "up": {"uv": [10.75, 13.25, 10.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 10.5, 13, 10.75], "texture": "#0"} + } + }, + { + "from": [6.7, 9.2, 14], + "to": [8.7, 9.7, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 14.25]}, + "faces": { + "north": {"uv": [12.5, 5, 13, 5.25], "texture": "#0"}, + "east": {"uv": [10.75, 13, 11, 13.25], "texture": "#0"}, + "south": {"uv": [12.5, 5.25, 13, 5.5], "texture": "#0"}, + "west": {"uv": [11, 13, 11.25, 13.25], "texture": "#0"}, + "up": {"uv": [13, 6, 12.5, 5.75], "texture": "#0"}, + "down": {"uv": [13, 6, 12.5, 6.25], "texture": "#0"} + } + }, + { + "from": [6.2, 6.7, 14], + "to": [6.7, 11.7, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 14.25]}, + "faces": { + "north": {"uv": [10.25, 4.5, 10.5, 5.75], "texture": "#0"}, + "east": {"uv": [6.25, 10.25, 6.5, 11.5], "texture": "#0"}, + "south": {"uv": [6.5, 10.25, 6.75, 11.5], "texture": "#0"}, + "west": {"uv": [6.75, 10.25, 7, 11.5], "texture": "#0"}, + "up": {"uv": [11.5, 13.25, 11.25, 13], "texture": "#0"}, + "down": {"uv": [11.75, 13, 11.5, 13.25], "texture": "#0"} + } + }, + { + "from": [4.2, 9.2, 14], + "to": [6.2, 9.7, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 14.25]}, + "faces": { + "north": {"uv": [12.5, 6.25, 13, 6.5], "texture": "#0"}, + "east": {"uv": [13, 11.5, 13.25, 11.75], "texture": "#0"}, + "south": {"uv": [12.5, 6.5, 13, 6.75], "texture": "#0"}, + "west": {"uv": [11.75, 13, 12, 13.25], "texture": "#0"}, + "up": {"uv": [13, 7, 12.5, 6.75], "texture": "#0"}, + "down": {"uv": [13, 7, 12.5, 7.25], "texture": "#0"} + } + }, + { + "from": [5.7, 9.7, 14], + "to": [6.2, 10.2, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 14.25]}, + "faces": { + "north": {"uv": [13, 11.75, 13.25, 12], "texture": "#0"}, + "east": {"uv": [12, 13, 12.25, 13.25], "texture": "#0"}, + "south": {"uv": [13, 12, 13.25, 12.25], "texture": "#0"}, + "west": {"uv": [12.25, 13, 12.5, 13.25], "texture": "#0"}, + "up": {"uv": [12.75, 13.25, 12.5, 13], "texture": "#0"}, + "down": {"uv": [13, 13, 12.75, 13.25], "texture": "#0"} + } + }, + { + "from": [6.7, 9.7, 14], + "to": [7.2, 10.2, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 14.25]}, + "faces": { + "north": {"uv": [13, 12.75, 13.25, 13], "texture": "#0"}, + "east": {"uv": [13, 13, 13.25, 13.25], "texture": "#0"}, + "south": {"uv": [0, 13.25, 0.25, 13.5], "texture": "#0"}, + "west": {"uv": [13.25, 0, 13.5, 0.25], "texture": "#0"}, + "up": {"uv": [0.5, 13.5, 0.25, 13.25], "texture": "#0"}, + "down": {"uv": [13.5, 0.25, 13.25, 0.5], "texture": "#0"} + } + }, + { + "from": [5.7, 8.7, 14], + "to": [6.2, 9.2, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 14.25]}, + "faces": { + "north": {"uv": [0.5, 13.25, 0.75, 13.5], "texture": "#0"}, + "east": {"uv": [13.25, 0.5, 13.5, 0.75], "texture": "#0"}, + "south": {"uv": [0.75, 13.25, 1, 13.5], "texture": "#0"}, + "west": {"uv": [13.25, 0.75, 13.5, 1], "texture": "#0"}, + "up": {"uv": [1.25, 13.5, 1, 13.25], "texture": "#0"}, + "down": {"uv": [1.5, 13.25, 1.25, 13.5], "texture": "#0"} + } + }, + { + "from": [6.7, 8.7, 14], + "to": [7.2, 9.2, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 14.25]}, + "faces": { + "north": {"uv": [1.5, 13.25, 1.75, 13.5], "texture": "#0"}, + "east": {"uv": [1.75, 13.25, 2, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 1.75, 13.5, 2], "texture": "#0"}, + "west": {"uv": [2, 13.25, 2.25, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 2.25, 13.25, 2], "texture": "#0"}, + "down": {"uv": [2.5, 13.25, 2.25, 13.5], "texture": "#0"} + } + }, + { + "from": [5.2, 10.2, 14], + "to": [5.7, 10.7, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 14.25]}, + "faces": { + "north": {"uv": [13.25, 2.25, 13.5, 2.5], "texture": "#0"}, + "east": {"uv": [2.5, 13.25, 2.75, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 2.5, 13.5, 2.75], "texture": "#0"}, + "west": {"uv": [2.75, 13.25, 3, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 3, 13.25, 2.75], "texture": "#0"}, + "down": {"uv": [3.25, 13.25, 3, 13.5], "texture": "#0"} + } + }, + { + "from": [5.2, 8.2, 14], + "to": [5.7, 8.7, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 14.25]}, + "faces": { + "north": {"uv": [13.25, 3, 13.5, 3.25], "texture": "#0"}, + "east": {"uv": [3.25, 13.25, 3.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 3.25, 13.5, 3.5], "texture": "#0"}, + "west": {"uv": [3.5, 13.25, 3.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 3.75, 13.25, 3.5], "texture": "#0"}, + "down": {"uv": [4, 13.25, 3.75, 13.5], "texture": "#0"} + } + }, + { + "from": [7.2, 8.2, 14], + "to": [7.7, 8.7, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 14.25]}, + "faces": { + "north": {"uv": [13.25, 3.75, 13.5, 4], "texture": "#0"}, + "east": {"uv": [4, 13.25, 4.25, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 4, 13.5, 4.25], "texture": "#0"}, + "west": {"uv": [4.25, 13.25, 4.5, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 4.5, 13.25, 4.25], "texture": "#0"}, + "down": {"uv": [4.75, 13.25, 4.5, 13.5], "texture": "#0"} + } + }, + { + "from": [7.2, 10.2, 14], + "to": [7.7, 10.7, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 14.25]}, + "faces": { + "north": {"uv": [13.25, 4.5, 13.5, 4.75], "texture": "#0"}, + "east": {"uv": [4.75, 13.25, 5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 4.75, 13.5, 5], "texture": "#0"}, + "west": {"uv": [5, 13.25, 5.25, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 5.25, 13.25, 5], "texture": "#0"}, + "down": {"uv": [5.5, 13.25, 5.25, 13.5], "texture": "#0"} + } + }, + { + "from": [9.9, 6.4, 14], + "to": [10.4, 10.9, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 14.25]}, + "faces": { + "north": {"uv": [7, 10.25, 7.25, 11.5], "texture": "#0"}, + "east": {"uv": [10.25, 7.25, 10.5, 8.5], "texture": "#0"}, + "south": {"uv": [8.5, 10.25, 8.75, 11.5], "texture": "#0"}, + "west": {"uv": [8.75, 10.25, 9, 11.5], "texture": "#0"}, + "up": {"uv": [13.5, 5.5, 13.25, 5.25], "texture": "#0"}, + "down": {"uv": [5.75, 13.25, 5.5, 13.5], "texture": "#0"} + } + }, + { + "from": [9.4, 8.9, 14], + "to": [9.9, 9.4, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 14.25]}, + "faces": { + "north": {"uv": [13.25, 5.5, 13.5, 5.75], "texture": "#0"}, + "east": {"uv": [5.75, 13.25, 6, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 5.75, 13.5, 6], "texture": "#0"}, + "west": {"uv": [6, 13.25, 6.25, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 6.25, 13.25, 6], "texture": "#0"}, + "down": {"uv": [6.5, 13.25, 6.25, 13.5], "texture": "#0"} + } + }, + { + "from": [9.4, 7.9, 14], + "to": [9.9, 8.4, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 14.25]}, + "faces": { + "north": {"uv": [13.25, 6.25, 13.5, 6.5], "texture": "#0"}, + "east": {"uv": [6.5, 13.25, 6.75, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 6.5, 13.5, 6.75], "texture": "#0"}, + "west": {"uv": [6.75, 13.25, 7, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 7, 13.25, 6.75], "texture": "#0"}, + "down": {"uv": [7.25, 13.25, 7, 13.5], "texture": "#0"} + } + }, + { + "from": [8.4, 8.4, 14], + "to": [9.9, 8.9, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 14.25]}, + "faces": { + "north": {"uv": [7.25, 12.5, 7.75, 12.75], "texture": "#0"}, + "east": {"uv": [13.25, 7, 13.5, 7.25], "texture": "#0"}, + "south": {"uv": [12.5, 7.25, 13, 7.5], "texture": "#0"}, + "west": {"uv": [7.25, 13.25, 7.5, 13.5], "texture": "#0"}, + "up": {"uv": [13, 7.75, 12.5, 7.5], "texture": "#0"}, + "down": {"uv": [8.25, 12.5, 7.75, 12.75], "texture": "#0"} + } + }, + { + "from": [10.4, 8.4, 14], + "to": [11.9, 8.9, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 14.25]}, + "faces": { + "north": {"uv": [12.5, 7.75, 13, 8], "texture": "#0"}, + "east": {"uv": [13.25, 7.25, 13.5, 7.5], "texture": "#0"}, + "south": {"uv": [12.5, 8, 13, 8.25], "texture": "#0"}, + "west": {"uv": [7.5, 13.25, 7.75, 13.5], "texture": "#0"}, + "up": {"uv": [13, 8.75, 12.5, 8.5], "texture": "#0"}, + "down": {"uv": [13, 8.75, 12.5, 9], "texture": "#0"} + } + }, + { + "from": [10.4, 8.9, 14], + "to": [10.9, 9.4, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 14.25]}, + "faces": { + "north": {"uv": [13.25, 7.5, 13.5, 7.75], "texture": "#0"}, + "east": {"uv": [7.75, 13.25, 8, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 7.75, 13.5, 8], "texture": "#0"}, + "west": {"uv": [8, 13.25, 8.25, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 8.25, 13.25, 8], "texture": "#0"}, + "down": {"uv": [8.5, 13.25, 8.25, 13.5], "texture": "#0"} + } + }, + { + "from": [10.4, 7.9, 14], + "to": [10.9, 8.4, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 14.25]}, + "faces": { + "north": {"uv": [13.25, 8.25, 13.5, 8.5], "texture": "#0"}, + "east": {"uv": [8.5, 13.25, 8.75, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 8.5, 13.5, 8.75], "texture": "#0"}, + "west": {"uv": [8.75, 13.25, 9, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 9, 13.25, 8.75], "texture": "#0"}, + "down": {"uv": [9.25, 13.25, 9, 13.5], "texture": "#0"} + } + }, + { + "from": [6.9, 6, 1.5], + "to": [7.9, 6.5, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.15, 6.25, 1.75]}, + "faces": { + "north": {"uv": [13.25, 9, 13.5, 9.25], "texture": "#0"}, + "east": {"uv": [9.25, 13.25, 9.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 9.25, 13.5, 9.5], "texture": "#0"}, + "west": {"uv": [9.5, 13.25, 9.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 9.75, 13.25, 9.5], "texture": "#0"}, + "down": {"uv": [10, 13.25, 9.75, 13.5], "texture": "#0"} + } + }, + { + "from": [7.9, 4.5, 1.5], + "to": [8.4, 8, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.15, 6.25, 1.75]}, + "faces": { + "north": {"uv": [3.25, 11.75, 3.5, 12.75], "texture": "#0"}, + "east": {"uv": [3.5, 11.75, 3.75, 12.75], "texture": "#0"}, + "south": {"uv": [3.75, 11.75, 4, 12.75], "texture": "#0"}, + "west": {"uv": [11.75, 4.5, 12, 5.5], "texture": "#0"}, + "up": {"uv": [13.5, 10, 13.25, 9.75], "texture": "#0"}, + "down": {"uv": [10.25, 13.25, 10, 13.5], "texture": "#0"} + } + }, + { + "from": [8.4, 6, 1.5], + "to": [9.4, 6.5, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8.15, 6.25, 1.75]}, + "faces": { + "north": {"uv": [13.25, 10, 13.5, 10.25], "texture": "#0"}, + "east": {"uv": [10.25, 13.25, 10.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 10.25, 13.5, 10.5], "texture": "#0"}, + "west": {"uv": [10.5, 13.25, 10.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 10.75, 13.25, 10.5], "texture": "#0"}, + "down": {"uv": [11, 13.25, 10.75, 13.5], "texture": "#0"} + } + }, + { + "from": [6.7, 9.2, 1.5], + "to": [8.7, 9.7, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 1.75]}, + "faces": { + "north": {"uv": [12.5, 9, 13, 9.25], "texture": "#0"}, + "east": {"uv": [13.25, 10.75, 13.5, 11], "texture": "#0"}, + "south": {"uv": [12.5, 9.25, 13, 9.5], "texture": "#0"}, + "west": {"uv": [11, 13.25, 11.25, 13.5], "texture": "#0"}, + "up": {"uv": [13, 9.75, 12.5, 9.5], "texture": "#0"}, + "down": {"uv": [13, 9.75, 12.5, 10], "texture": "#0"} + } + }, + { + "from": [6.2, 6.7, 1.5], + "to": [6.7, 11.7, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 1.75]}, + "faces": { + "north": {"uv": [9, 10.25, 9.25, 11.5], "texture": "#0"}, + "east": {"uv": [9.25, 10.25, 9.5, 11.5], "texture": "#0"}, + "south": {"uv": [9.5, 10.25, 9.75, 11.5], "texture": "#0"}, + "west": {"uv": [9.75, 10.25, 10, 11.5], "texture": "#0"}, + "up": {"uv": [13.5, 11.25, 13.25, 11], "texture": "#0"}, + "down": {"uv": [11.5, 13.25, 11.25, 13.5], "texture": "#0"} + } + }, + { + "from": [4.2, 9.2, 1.5], + "to": [6.2, 9.7, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 1.75]}, + "faces": { + "north": {"uv": [12.5, 10.25, 13, 10.5], "texture": "#0"}, + "east": {"uv": [13.25, 11.25, 13.5, 11.5], "texture": "#0"}, + "south": {"uv": [12.5, 10.5, 13, 10.75], "texture": "#0"}, + "west": {"uv": [11.5, 13.25, 11.75, 13.5], "texture": "#0"}, + "up": {"uv": [11.25, 12.75, 10.75, 12.5], "texture": "#0"}, + "down": {"uv": [13, 11.5, 12.5, 11.75], "texture": "#0"} + } + }, + { + "from": [5.7, 9.7, 1.5], + "to": [6.2, 10.2, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 1.75]}, + "faces": { + "north": {"uv": [13.25, 11.5, 13.5, 11.75], "texture": "#0"}, + "east": {"uv": [11.75, 13.25, 12, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 11.75, 13.5, 12], "texture": "#0"}, + "west": {"uv": [12, 13.25, 12.25, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 12.25, 13.25, 12], "texture": "#0"}, + "down": {"uv": [12.5, 13.25, 12.25, 13.5], "texture": "#0"} + } + }, + { + "from": [6.7, 9.7, 1.5], + "to": [7.2, 10.2, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 1.75]}, + "faces": { + "north": {"uv": [13.25, 12.25, 13.5, 12.5], "texture": "#0"}, + "east": {"uv": [12.5, 13.25, 12.75, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 12.5, 13.5, 12.75], "texture": "#0"}, + "west": {"uv": [12.75, 13.25, 13, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 13, 13.25, 12.75], "texture": "#0"}, + "down": {"uv": [13.25, 13.25, 13, 13.5], "texture": "#0"} + } + }, + { + "from": [5.7, 8.7, 1.5], + "to": [6.2, 9.2, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 1.75]}, + "faces": { + "north": {"uv": [13.25, 13, 13.5, 13.25], "texture": "#0"}, + "east": {"uv": [13.25, 13.25, 13.5, 13.5], "texture": "#0"}, + "south": {"uv": [0, 13.5, 0.25, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 0, 13.75, 0.25], "texture": "#0"}, + "up": {"uv": [0.5, 13.75, 0.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 0.25, 13.5, 0.5], "texture": "#0"} + } + }, + { + "from": [6.7, 8.7, 1.5], + "to": [7.2, 9.2, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 1.75]}, + "faces": { + "north": {"uv": [0.5, 13.5, 0.75, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 0.5, 13.75, 0.75], "texture": "#0"}, + "south": {"uv": [0.75, 13.5, 1, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 0.75, 13.75, 1], "texture": "#0"}, + "up": {"uv": [1.25, 13.75, 1, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 1, 13.5, 1.25], "texture": "#0"} + } + }, + { + "from": [5.2, 10.2, 1.5], + "to": [5.7, 10.7, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 1.75]}, + "faces": { + "north": {"uv": [1.25, 13.5, 1.5, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 1.25, 13.75, 1.5], "texture": "#0"}, + "south": {"uv": [1.5, 13.5, 1.75, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 1.5, 13.75, 1.75], "texture": "#0"}, + "up": {"uv": [2, 13.75, 1.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 1.75, 13.5, 2], "texture": "#0"} + } + }, + { + "from": [5.2, 8.2, 1.5], + "to": [5.7, 8.7, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 1.75]}, + "faces": { + "north": {"uv": [2, 13.5, 2.25, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 2, 13.75, 2.25], "texture": "#0"}, + "south": {"uv": [2.25, 13.5, 2.5, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 2.25, 13.75, 2.5], "texture": "#0"}, + "up": {"uv": [2.75, 13.75, 2.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 2.5, 13.5, 2.75], "texture": "#0"} + } + }, + { + "from": [7.2, 8.2, 1.5], + "to": [7.7, 8.7, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 1.75]}, + "faces": { + "north": {"uv": [2.75, 13.5, 3, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 2.75, 13.75, 3], "texture": "#0"}, + "south": {"uv": [3, 13.5, 3.25, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 3, 13.75, 3.25], "texture": "#0"}, + "up": {"uv": [3.5, 13.75, 3.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 3.25, 13.5, 3.5], "texture": "#0"} + } + }, + { + "from": [7.2, 10.2, 1.5], + "to": [7.7, 10.7, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [6.45, 9.45, 1.75]}, + "faces": { + "north": {"uv": [3.5, 13.5, 3.75, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 3.5, 13.75, 3.75], "texture": "#0"}, + "south": {"uv": [3.75, 13.5, 4, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 3.75, 13.75, 4], "texture": "#0"}, + "up": {"uv": [4.25, 13.75, 4, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 4, 13.5, 4.25], "texture": "#0"} + } + }, + { + "from": [9.9, 6.4, 1.5], + "to": [10.4, 10.9, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 1.75]}, + "faces": { + "north": {"uv": [10, 10.25, 10.25, 11.5], "texture": "#0"}, + "east": {"uv": [10.25, 10.25, 10.5, 11.5], "texture": "#0"}, + "south": {"uv": [10.5, 0, 10.75, 1.25], "texture": "#0"}, + "west": {"uv": [10.5, 1.25, 10.75, 2.5], "texture": "#0"}, + "up": {"uv": [4.5, 13.75, 4.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 4.25, 13.5, 4.5], "texture": "#0"} + } + }, + { + "from": [9.4, 8.9, 1.5], + "to": [9.9, 9.4, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 1.75]}, + "faces": { + "north": {"uv": [4.5, 13.5, 4.75, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 4.5, 13.75, 4.75], "texture": "#0"}, + "south": {"uv": [4.75, 13.5, 5, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 4.75, 13.75, 5], "texture": "#0"}, + "up": {"uv": [5.25, 13.75, 5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 5, 13.5, 5.25], "texture": "#0"} + } + }, + { + "from": [9.4, 7.9, 1.5], + "to": [9.9, 8.4, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 1.75]}, + "faces": { + "north": {"uv": [5.25, 13.5, 5.5, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 5.25, 13.75, 5.5], "texture": "#0"}, + "south": {"uv": [5.5, 13.5, 5.75, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 5.5, 13.75, 5.75], "texture": "#0"}, + "up": {"uv": [6, 13.75, 5.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 5.75, 13.5, 6], "texture": "#0"} + } + }, + { + "from": [8.4, 8.4, 1.5], + "to": [9.9, 8.9, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 1.75]}, + "faces": { + "north": {"uv": [12.5, 11.75, 13, 12], "texture": "#0"}, + "east": {"uv": [6, 13.5, 6.25, 13.75], "texture": "#0"}, + "south": {"uv": [12.5, 12, 13, 12.25], "texture": "#0"}, + "west": {"uv": [13.5, 6, 13.75, 6.25], "texture": "#0"}, + "up": {"uv": [12.75, 12.75, 12.25, 12.5], "texture": "#0"}, + "down": {"uv": [13.25, 0, 12.75, 0.25], "texture": "#0"} + } + }, + { + "from": [10.4, 8.4, 1.5], + "to": [11.9, 8.9, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 1.75]}, + "faces": { + "north": {"uv": [12.75, 0.25, 13.25, 0.5], "texture": "#0"}, + "east": {"uv": [6.25, 13.5, 6.5, 13.75], "texture": "#0"}, + "south": {"uv": [12.75, 0.5, 13.25, 0.75], "texture": "#0"}, + "west": {"uv": [13.5, 6.25, 13.75, 6.5], "texture": "#0"}, + "up": {"uv": [13.25, 1, 12.75, 0.75], "texture": "#0"}, + "down": {"uv": [1.5, 12.75, 1, 13], "texture": "#0"} + } + }, + { + "from": [10.4, 8.9, 1.5], + "to": [10.9, 9.4, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 1.75]}, + "faces": { + "north": {"uv": [6.5, 13.5, 6.75, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 6.5, 13.75, 6.75], "texture": "#0"}, + "south": {"uv": [6.75, 13.5, 7, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 6.75, 13.75, 7], "texture": "#0"}, + "up": {"uv": [7.25, 13.75, 7, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 7, 13.5, 7.25], "texture": "#0"} + } + }, + { + "from": [10.4, 7.9, 1.5], + "to": [10.9, 8.4, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [10.15, 8.65, 1.75]}, + "faces": { + "north": {"uv": [7.25, 13.5, 7.5, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 7.25, 13.75, 7.5], "texture": "#0"}, + "south": {"uv": [7.5, 13.5, 7.75, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 7.5, 13.75, 7.75], "texture": "#0"}, + "up": {"uv": [8, 13.75, 7.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 7.75, 13.5, 8], "texture": "#0"} + } + }, + { + "from": [1.425, 6, 8.125], + "to": [1.925, 6.5, 9.125], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [8, 13.5, 8.25, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 8, 13.75, 8.25], "texture": "#0"}, + "south": {"uv": [8.25, 13.5, 8.5, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 8.25, 13.75, 8.5], "texture": "#0"}, + "up": {"uv": [8.75, 13.75, 8.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 8.5, 13.5, 8.75], "texture": "#0"} + } + }, + { + "from": [1.425, 4.5, 7.625], + "to": [1.925, 8, 8.125], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [6.25, 11.75, 6.5, 12.75], "texture": "#0"}, + "east": {"uv": [6.5, 11.75, 6.75, 12.75], "texture": "#0"}, + "south": {"uv": [6.75, 11.75, 7, 12.75], "texture": "#0"}, + "west": {"uv": [7, 11.75, 7.25, 12.75], "texture": "#0"}, + "up": {"uv": [9, 13.75, 8.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 8.75, 13.5, 9], "texture": "#0"} + } + }, + { + "from": [1.425, 6, 6.625], + "to": [1.925, 6.5, 7.625], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [9, 13.5, 9.25, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 9, 13.75, 9.25], "texture": "#0"}, + "south": {"uv": [9.25, 13.5, 9.5, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 9.25, 13.75, 9.5], "texture": "#0"}, + "up": {"uv": [9.75, 13.75, 9.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 9.5, 13.5, 9.75], "texture": "#0"} + } + }, + { + "from": [1.425, 9.2, 7.325], + "to": [1.925, 9.7, 9.325], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [9.75, 13.5, 10, 13.75], "texture": "#0"}, + "east": {"uv": [1.5, 12.75, 2, 13], "texture": "#0"}, + "south": {"uv": [13.5, 9.75, 13.75, 10], "texture": "#0"}, + "west": {"uv": [12.75, 2, 13.25, 2.25], "texture": "#0"}, + "up": {"uv": [8.5, 13, 8.25, 12.5], "texture": "#0"}, + "down": {"uv": [9.5, 12.5, 9.25, 13], "texture": "#0"} + } + }, + { + "from": [1.425, 6.7, 9.325], + "to": [1.925, 11.7, 9.825], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [10.5, 2.5, 10.75, 3.75], "texture": "#0"}, + "east": {"uv": [3, 10.5, 3.25, 11.75], "texture": "#0"}, + "south": {"uv": [3.25, 10.5, 3.5, 11.75], "texture": "#0"}, + "west": {"uv": [3.5, 10.5, 3.75, 11.75], "texture": "#0"}, + "up": {"uv": [10.25, 13.75, 10, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 10, 13.5, 10.25], "texture": "#0"} + } + }, + { + "from": [1.425, 9.2, 9.825], + "to": [1.925, 9.7, 11.825], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [10.25, 13.5, 10.5, 13.75], "texture": "#0"}, + "east": {"uv": [12.75, 2.25, 13.25, 2.5], "texture": "#0"}, + "south": {"uv": [13.5, 10.25, 13.75, 10.5], "texture": "#0"}, + "west": {"uv": [3, 12.75, 3.5, 13], "texture": "#0"}, + "up": {"uv": [10.25, 13, 10, 12.5], "texture": "#0"}, + "down": {"uv": [11.5, 12.5, 11.25, 13], "texture": "#0"} + } + }, + { + "from": [1.425, 9.7, 9.825], + "to": [1.925, 10.2, 10.325], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [10.5, 13.5, 10.75, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 10.5, 13.75, 10.75], "texture": "#0"}, + "south": {"uv": [10.75, 13.5, 11, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 10.75, 13.75, 11], "texture": "#0"}, + "up": {"uv": [11.25, 13.75, 11, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 11, 13.5, 11.25], "texture": "#0"} + } + }, + { + "from": [1.425, 9.7, 8.825], + "to": [1.925, 10.2, 9.325], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [11.25, 13.5, 11.5, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 11.25, 13.75, 11.5], "texture": "#0"}, + "south": {"uv": [11.5, 13.5, 11.75, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 11.5, 13.75, 11.75], "texture": "#0"}, + "up": {"uv": [12, 13.75, 11.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 11.75, 13.5, 12], "texture": "#0"} + } + }, + { + "from": [1.425, 8.7, 9.825], + "to": [1.925, 9.2, 10.325], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [12, 13.5, 12.25, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 12, 13.75, 12.25], "texture": "#0"}, + "south": {"uv": [12.25, 13.5, 12.5, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 12.25, 13.75, 12.5], "texture": "#0"}, + "up": {"uv": [12.75, 13.75, 12.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 12.5, 13.5, 12.75], "texture": "#0"} + } + }, + { + "from": [1.425, 8.7, 8.825], + "to": [1.925, 9.2, 9.325], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [12.75, 13.5, 13, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 12.75, 13.75, 13], "texture": "#0"}, + "south": {"uv": [13, 13.5, 13.25, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 13, 13.75, 13.25], "texture": "#0"}, + "up": {"uv": [13.5, 13.75, 13.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 13.25, 13.5, 13.5], "texture": "#0"} + } + }, + { + "from": [1.425, 10.2, 10.325], + "to": [1.925, 10.7, 10.825], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.5, 13.5, 13.75, 13.75], "texture": "#0"}, + "east": {"uv": [0, 13.75, 0.25, 14], "texture": "#0"}, + "south": {"uv": [13.75, 0, 14, 0.25], "texture": "#0"}, + "west": {"uv": [0.25, 13.75, 0.5, 14], "texture": "#0"}, + "up": {"uv": [14, 0.5, 13.75, 0.25], "texture": "#0"}, + "down": {"uv": [0.75, 13.75, 0.5, 14], "texture": "#0"} + } + }, + { + "from": [1.425, 8.2, 10.325], + "to": [1.925, 8.7, 10.825], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 0.5, 14, 0.75], "texture": "#0"}, + "east": {"uv": [0.75, 13.75, 1, 14], "texture": "#0"}, + "south": {"uv": [13.75, 0.75, 14, 1], "texture": "#0"}, + "west": {"uv": [1, 13.75, 1.25, 14], "texture": "#0"}, + "up": {"uv": [14, 1.25, 13.75, 1], "texture": "#0"}, + "down": {"uv": [1.5, 13.75, 1.25, 14], "texture": "#0"} + } + }, + { + "from": [1.425, 8.2, 8.325], + "to": [1.925, 8.7, 8.825], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 1.25, 14, 1.5], "texture": "#0"}, + "east": {"uv": [1.5, 13.75, 1.75, 14], "texture": "#0"}, + "south": {"uv": [13.75, 1.5, 14, 1.75], "texture": "#0"}, + "west": {"uv": [1.75, 13.75, 2, 14], "texture": "#0"}, + "up": {"uv": [14, 2, 13.75, 1.75], "texture": "#0"}, + "down": {"uv": [2.25, 13.75, 2, 14], "texture": "#0"} + } + }, + { + "from": [1.425, 10.2, 8.325], + "to": [1.925, 10.7, 8.825], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 2, 14, 2.25], "texture": "#0"}, + "east": {"uv": [2.25, 13.75, 2.5, 14], "texture": "#0"}, + "south": {"uv": [13.75, 2.25, 14, 2.5], "texture": "#0"}, + "west": {"uv": [2.5, 13.75, 2.75, 14], "texture": "#0"}, + "up": {"uv": [14, 2.75, 13.75, 2.5], "texture": "#0"}, + "down": {"uv": [3, 13.75, 2.75, 14], "texture": "#0"} + } + }, + { + "from": [1.425, 6.4, 5.625], + "to": [1.925, 10.9, 6.125], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [3.75, 10.5, 4, 11.75], "texture": "#0"}, + "east": {"uv": [10.5, 4.5, 10.75, 5.75], "texture": "#0"}, + "south": {"uv": [10.5, 7.25, 10.75, 8.5], "texture": "#0"}, + "west": {"uv": [10.5, 10, 10.75, 11.25], "texture": "#0"}, + "up": {"uv": [14, 3, 13.75, 2.75], "texture": "#0"}, + "down": {"uv": [3.25, 13.75, 3, 14], "texture": "#0"} + } + }, + { + "from": [1.425, 8.9, 6.125], + "to": [1.925, 9.4, 6.625], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 3, 14, 3.25], "texture": "#0"}, + "east": {"uv": [3.25, 13.75, 3.5, 14], "texture": "#0"}, + "south": {"uv": [13.75, 3.25, 14, 3.5], "texture": "#0"}, + "west": {"uv": [3.5, 13.75, 3.75, 14], "texture": "#0"}, + "up": {"uv": [14, 3.75, 13.75, 3.5], "texture": "#0"}, + "down": {"uv": [4, 13.75, 3.75, 14], "texture": "#0"} + } + }, + { + "from": [1.425, 7.9, 6.125], + "to": [1.925, 8.4, 6.625], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 3.75, 14, 4], "texture": "#0"}, + "east": {"uv": [4, 13.75, 4.25, 14], "texture": "#0"}, + "south": {"uv": [13.75, 4, 14, 4.25], "texture": "#0"}, + "west": {"uv": [4.25, 13.75, 4.5, 14], "texture": "#0"}, + "up": {"uv": [14, 4.5, 13.75, 4.25], "texture": "#0"}, + "down": {"uv": [4.75, 13.75, 4.5, 14], "texture": "#0"} + } + }, + { + "from": [1.425, 8.4, 6.125], + "to": [1.925, 8.9, 7.625], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 4.5, 14, 4.75], "texture": "#0"}, + "east": {"uv": [12.75, 3, 13.25, 3.25], "texture": "#0"}, + "south": {"uv": [4.75, 13.75, 5, 14], "texture": "#0"}, + "west": {"uv": [12.75, 3.25, 13.25, 3.5], "texture": "#0"}, + "up": {"uv": [3.75, 13.25, 3.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 3.5, 12.75, 4], "texture": "#0"} + } + }, + { + "from": [1.425, 8.4, 4.125], + "to": [1.925, 8.9, 5.625], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 4.75, 14, 5], "texture": "#0"}, + "east": {"uv": [12.75, 4, 13.25, 4.25], "texture": "#0"}, + "south": {"uv": [5, 13.75, 5.25, 14], "texture": "#0"}, + "west": {"uv": [12.75, 4.25, 13.25, 4.5], "texture": "#0"}, + "up": {"uv": [4, 13.25, 3.75, 12.75], "texture": "#0"}, + "down": {"uv": [13, 4.5, 12.75, 5], "texture": "#0"} + } + }, + { + "from": [1.425, 8.9, 5.125], + "to": [1.925, 9.4, 5.625], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 5, 14, 5.25], "texture": "#0"}, + "east": {"uv": [5.25, 13.75, 5.5, 14], "texture": "#0"}, + "south": {"uv": [13.75, 5.25, 14, 5.5], "texture": "#0"}, + "west": {"uv": [5.5, 13.75, 5.75, 14], "texture": "#0"}, + "up": {"uv": [14, 5.75, 13.75, 5.5], "texture": "#0"}, + "down": {"uv": [6, 13.75, 5.75, 14], "texture": "#0"} + } + }, + { + "from": [1.425, 7.9, 5.125], + "to": [1.925, 8.4, 5.625], + "rotation": {"angle": 0, "axis": "y", "origin": [1.675, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 5.75, 14, 6], "texture": "#0"}, + "east": {"uv": [6, 13.75, 6.25, 14], "texture": "#0"}, + "south": {"uv": [13.75, 6, 14, 6.25], "texture": "#0"}, + "west": {"uv": [6.25, 13.75, 6.5, 14], "texture": "#0"}, + "up": {"uv": [14, 6.5, 13.75, 6.25], "texture": "#0"}, + "down": {"uv": [6.75, 13.75, 6.5, 14], "texture": "#0"} + } + }, + { + "from": [13.925, 6, 8.125], + "to": [14.425, 6.5, 9.125], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 6.5, 14, 6.75], "texture": "#0"}, + "east": {"uv": [6.75, 13.75, 7, 14], "texture": "#0"}, + "south": {"uv": [13.75, 6.75, 14, 7], "texture": "#0"}, + "west": {"uv": [7, 13.75, 7.25, 14], "texture": "#0"}, + "up": {"uv": [14, 7.25, 13.75, 7], "texture": "#0"}, + "down": {"uv": [7.5, 13.75, 7.25, 14], "texture": "#0"} + } + }, + { + "from": [13.925, 4.5, 7.625], + "to": [14.425, 8, 8.125], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [11.75, 7.25, 12, 8.25], "texture": "#0"}, + "east": {"uv": [8.5, 11.75, 8.75, 12.75], "texture": "#0"}, + "south": {"uv": [8.75, 11.75, 9, 12.75], "texture": "#0"}, + "west": {"uv": [9, 11.75, 9.25, 12.75], "texture": "#0"}, + "up": {"uv": [14, 7.5, 13.75, 7.25], "texture": "#0"}, + "down": {"uv": [7.75, 13.75, 7.5, 14], "texture": "#0"} + } + }, + { + "from": [13.925, 6, 6.625], + "to": [14.425, 6.5, 7.625], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 7.5, 14, 7.75], "texture": "#0"}, + "east": {"uv": [7.75, 13.75, 8, 14], "texture": "#0"}, + "south": {"uv": [13.75, 7.75, 14, 8], "texture": "#0"}, + "west": {"uv": [8, 13.75, 8.25, 14], "texture": "#0"}, + "up": {"uv": [14, 8.25, 13.75, 8], "texture": "#0"}, + "down": {"uv": [8.5, 13.75, 8.25, 14], "texture": "#0"} + } + }, + { + "from": [13.925, 9.2, 7.325], + "to": [14.425, 9.7, 9.325], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 8.25, 14, 8.5], "texture": "#0"}, + "east": {"uv": [5.25, 12.75, 5.75, 13], "texture": "#0"}, + "south": {"uv": [8.5, 13.75, 8.75, 14], "texture": "#0"}, + "west": {"uv": [12.75, 5.5, 13.25, 5.75], "texture": "#0"}, + "up": {"uv": [6, 13.25, 5.75, 12.75], "texture": "#0"}, + "down": {"uv": [6.25, 12.75, 6, 13.25], "texture": "#0"} + } + }, + { + "from": [13.925, 6.7, 9.325], + "to": [14.425, 11.7, 9.825], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [10.75, 0, 11, 1.25], "texture": "#0"}, + "east": {"uv": [10.75, 1.25, 11, 2.5], "texture": "#0"}, + "south": {"uv": [10.75, 2.5, 11, 3.75], "texture": "#0"}, + "west": {"uv": [10.75, 4.5, 11, 5.75], "texture": "#0"}, + "up": {"uv": [14, 8.75, 13.75, 8.5], "texture": "#0"}, + "down": {"uv": [9, 13.75, 8.75, 14], "texture": "#0"} + } + }, + { + "from": [13.925, 9.2, 9.825], + "to": [14.425, 9.7, 11.825], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 8.75, 14, 9], "texture": "#0"}, + "east": {"uv": [6.25, 12.75, 6.75, 13], "texture": "#0"}, + "south": {"uv": [9, 13.75, 9.25, 14], "texture": "#0"}, + "west": {"uv": [6.75, 12.75, 7.25, 13], "texture": "#0"}, + "up": {"uv": [7.5, 13.25, 7.25, 12.75], "texture": "#0"}, + "down": {"uv": [7.75, 12.75, 7.5, 13.25], "texture": "#0"} + } + }, + { + "from": [13.925, 9.7, 9.825], + "to": [14.425, 10.2, 10.325], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 9, 14, 9.25], "texture": "#0"}, + "east": {"uv": [9.25, 13.75, 9.5, 14], "texture": "#0"}, + "south": {"uv": [13.75, 9.25, 14, 9.5], "texture": "#0"}, + "west": {"uv": [9.5, 13.75, 9.75, 14], "texture": "#0"}, + "up": {"uv": [14, 9.75, 13.75, 9.5], "texture": "#0"}, + "down": {"uv": [10, 13.75, 9.75, 14], "texture": "#0"} + } + }, + { + "from": [13.925, 9.7, 8.825], + "to": [14.425, 10.2, 9.325], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 9.75, 14, 10], "texture": "#0"}, + "east": {"uv": [10, 13.75, 10.25, 14], "texture": "#0"}, + "south": {"uv": [13.75, 10, 14, 10.25], "texture": "#0"}, + "west": {"uv": [10.25, 13.75, 10.5, 14], "texture": "#0"}, + "up": {"uv": [14, 10.5, 13.75, 10.25], "texture": "#0"}, + "down": {"uv": [10.75, 13.75, 10.5, 14], "texture": "#0"} + } + }, + { + "from": [13.925, 8.7, 9.825], + "to": [14.425, 9.2, 10.325], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 10.5, 14, 10.75], "texture": "#0"}, + "east": {"uv": [10.75, 13.75, 11, 14], "texture": "#0"}, + "south": {"uv": [13.75, 10.75, 14, 11], "texture": "#0"}, + "west": {"uv": [11, 13.75, 11.25, 14], "texture": "#0"}, + "up": {"uv": [14, 11.25, 13.75, 11], "texture": "#0"}, + "down": {"uv": [11.5, 13.75, 11.25, 14], "texture": "#0"} + } + }, + { + "from": [13.925, 8.7, 8.825], + "to": [14.425, 9.2, 9.325], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 11.25, 14, 11.5], "texture": "#0"}, + "east": {"uv": [11.5, 13.75, 11.75, 14], "texture": "#0"}, + "south": {"uv": [13.75, 11.5, 14, 11.75], "texture": "#0"}, + "west": {"uv": [11.75, 13.75, 12, 14], "texture": "#0"}, + "up": {"uv": [14, 12, 13.75, 11.75], "texture": "#0"}, + "down": {"uv": [12.25, 13.75, 12, 14], "texture": "#0"} + } + }, + { + "from": [13.925, 10.2, 10.325], + "to": [14.425, 10.7, 10.825], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 12, 14, 12.25], "texture": "#0"}, + "east": {"uv": [12.25, 13.75, 12.5, 14], "texture": "#0"}, + "south": {"uv": [13.75, 12.25, 14, 12.5], "texture": "#0"}, + "west": {"uv": [12.5, 13.75, 12.75, 14], "texture": "#0"}, + "up": {"uv": [14, 12.75, 13.75, 12.5], "texture": "#0"}, + "down": {"uv": [13, 13.75, 12.75, 14], "texture": "#0"} + } + }, + { + "from": [13.925, 8.2, 10.325], + "to": [14.425, 8.7, 10.825], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 12.75, 14, 13], "texture": "#0"}, + "east": {"uv": [13, 13.75, 13.25, 14], "texture": "#0"}, + "south": {"uv": [13.75, 13, 14, 13.25], "texture": "#0"}, + "west": {"uv": [13.25, 13.75, 13.5, 14], "texture": "#0"}, + "up": {"uv": [14, 13.5, 13.75, 13.25], "texture": "#0"}, + "down": {"uv": [13.75, 13.75, 13.5, 14], "texture": "#0"} + } + }, + { + "from": [13.925, 8.2, 8.325], + "to": [14.425, 8.7, 8.825], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [13.75, 13.5, 14, 13.75], "texture": "#0"}, + "east": {"uv": [13.75, 13.75, 14, 14], "texture": "#0"}, + "south": {"uv": [0, 14, 0.25, 14.25], "texture": "#0"}, + "west": {"uv": [14, 0, 14.25, 0.25], "texture": "#0"}, + "up": {"uv": [0.5, 14.25, 0.25, 14], "texture": "#0"}, + "down": {"uv": [14.25, 0.25, 14, 0.5], "texture": "#0"} + } + }, + { + "from": [13.925, 10.2, 8.325], + "to": [14.425, 10.7, 8.825], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [0.5, 14, 0.75, 14.25], "texture": "#0"}, + "east": {"uv": [14, 0.5, 14.25, 0.75], "texture": "#0"}, + "south": {"uv": [0.75, 14, 1, 14.25], "texture": "#0"}, + "west": {"uv": [14, 0.75, 14.25, 1], "texture": "#0"}, + "up": {"uv": [1.25, 14.25, 1, 14], "texture": "#0"}, + "down": {"uv": [14.25, 1, 14, 1.25], "texture": "#0"} + } + }, + { + "from": [13.925, 6.4, 5.625], + "to": [14.425, 10.9, 6.125], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [10.75, 7.25, 11, 8.5], "texture": "#0"}, + "east": {"uv": [10.75, 10, 11, 11.25], "texture": "#0"}, + "south": {"uv": [11, 0, 11.25, 1.25], "texture": "#0"}, + "west": {"uv": [11, 1.25, 11.25, 2.5], "texture": "#0"}, + "up": {"uv": [1.5, 14.25, 1.25, 14], "texture": "#0"}, + "down": {"uv": [14.25, 1.25, 14, 1.5], "texture": "#0"} + } + }, + { + "from": [13.925, 8.9, 6.125], + "to": [14.425, 9.4, 6.625], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [1.5, 14, 1.75, 14.25], "texture": "#0"}, + "east": {"uv": [14, 1.5, 14.25, 1.75], "texture": "#0"}, + "south": {"uv": [1.75, 14, 2, 14.25], "texture": "#0"}, + "west": {"uv": [14, 1.75, 14.25, 2], "texture": "#0"}, + "up": {"uv": [2.25, 14.25, 2, 14], "texture": "#0"}, + "down": {"uv": [14.25, 2, 14, 2.25], "texture": "#0"} + } + }, + { + "from": [13.925, 7.9, 6.125], + "to": [14.425, 8.4, 6.625], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [2.25, 14, 2.5, 14.25], "texture": "#0"}, + "east": {"uv": [14, 2.25, 14.25, 2.5], "texture": "#0"}, + "south": {"uv": [2.5, 14, 2.75, 14.25], "texture": "#0"}, + "west": {"uv": [14, 2.5, 14.25, 2.75], "texture": "#0"}, + "up": {"uv": [3, 14.25, 2.75, 14], "texture": "#0"}, + "down": {"uv": [14.25, 2.75, 14, 3], "texture": "#0"} + } + }, + { + "from": [13.925, 8.4, 6.125], + "to": [14.425, 8.9, 7.625], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [3, 14, 3.25, 14.25], "texture": "#0"}, + "east": {"uv": [7.75, 12.75, 8.25, 13], "texture": "#0"}, + "south": {"uv": [14, 3, 14.25, 3.25], "texture": "#0"}, + "west": {"uv": [12.75, 8.25, 13.25, 8.5], "texture": "#0"}, + "up": {"uv": [8.75, 13.25, 8.5, 12.75], "texture": "#0"}, + "down": {"uv": [9, 12.75, 8.75, 13.25], "texture": "#0"} + } + }, + { + "from": [13.925, 8.4, 4.125], + "to": [14.425, 8.9, 5.625], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [3.25, 14, 3.5, 14.25], "texture": "#0"}, + "east": {"uv": [9.5, 12.75, 10, 13], "texture": "#0"}, + "south": {"uv": [14, 3.25, 14.25, 3.5], "texture": "#0"}, + "west": {"uv": [12.75, 10, 13.25, 10.25], "texture": "#0"}, + "up": {"uv": [9.25, 13.25, 9, 12.75], "texture": "#0"}, + "down": {"uv": [10.5, 12.75, 10.25, 13.25], "texture": "#0"} + } + }, + { + "from": [13.925, 8.9, 5.125], + "to": [14.425, 9.4, 5.625], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [3.5, 14, 3.75, 14.25], "texture": "#0"}, + "east": {"uv": [14, 3.5, 14.25, 3.75], "texture": "#0"}, + "south": {"uv": [3.75, 14, 4, 14.25], "texture": "#0"}, + "west": {"uv": [14, 3.75, 14.25, 4], "texture": "#0"}, + "up": {"uv": [4.25, 14.25, 4, 14], "texture": "#0"}, + "down": {"uv": [14.25, 4, 14, 4.25], "texture": "#0"} + } + }, + { + "from": [13.925, 7.9, 5.125], + "to": [14.425, 8.4, 5.625], + "rotation": {"angle": 0, "axis": "y", "origin": [14.175, 8.35, 7.85]}, + "faces": { + "north": {"uv": [4.25, 14, 4.5, 14.25], "texture": "#0"}, + "east": {"uv": [14, 4.25, 14.25, 4.5], "texture": "#0"}, + "south": {"uv": [4.5, 14, 4.75, 14.25], "texture": "#0"}, + "west": {"uv": [14, 4.5, 14.25, 4.75], "texture": "#0"}, + "up": {"uv": [5, 14.25, 4.75, 14], "texture": "#0"}, + "down": {"uv": [14.25, 4.75, 14, 5], "texture": "#0"} + } + }, + { + "from": [6.9, 14, 9.7], + "to": [7.9, 14.5, 10.2], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [5, 14, 5.25, 14.25], "texture": "#0"}, + "east": {"uv": [14, 5, 14.25, 5.25], "texture": "#0"}, + "south": {"uv": [5.25, 14, 5.5, 14.25], "texture": "#0"}, + "west": {"uv": [14, 5.25, 14.25, 5.5], "texture": "#0"}, + "up": {"uv": [5.75, 14.25, 5.5, 14], "texture": "#0"}, + "down": {"uv": [14.25, 5.5, 14, 5.75], "texture": "#0"} + } + }, + { + "from": [7.9, 14, 8.2], + "to": [8.4, 14.5, 11.7], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [5.75, 14, 6, 14.25], "texture": "#0"}, + "east": {"uv": [9.25, 11.75, 10.25, 12], "texture": "#0"}, + "south": {"uv": [14, 5.75, 14.25, 6], "texture": "#0"}, + "west": {"uv": [11.75, 10, 12.75, 10.25], "texture": "#0"}, + "up": {"uv": [10.5, 12.75, 10.25, 11.75], "texture": "#0"}, + "down": {"uv": [12, 10.25, 11.75, 11.25], "texture": "#0"} + } + }, + { + "from": [8.4, 14, 9.7], + "to": [9.4, 14.5, 10.2], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [6, 14, 6.25, 14.25], "texture": "#0"}, + "east": {"uv": [14, 6, 14.25, 6.25], "texture": "#0"}, + "south": {"uv": [6.25, 14, 6.5, 14.25], "texture": "#0"}, + "west": {"uv": [14, 6.25, 14.25, 6.5], "texture": "#0"}, + "up": {"uv": [6.75, 14.25, 6.5, 14], "texture": "#0"}, + "down": {"uv": [14.25, 6.5, 14, 6.75], "texture": "#0"} + } + }, + { + "from": [6.7, 14, 6.5], + "to": [8.7, 14.5, 7], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [10.5, 12.75, 11, 13], "texture": "#0"}, + "east": {"uv": [6.75, 14, 7, 14.25], "texture": "#0"}, + "south": {"uv": [12.75, 10.75, 13.25, 11], "texture": "#0"}, + "west": {"uv": [14, 6.75, 14.25, 7], "texture": "#0"}, + "up": {"uv": [13.25, 11.25, 12.75, 11], "texture": "#0"}, + "down": {"uv": [13.25, 11.25, 12.75, 11.5], "texture": "#0"} + } + }, + { + "from": [6.2, 14, 4.5], + "to": [6.7, 14.5, 9.5], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [7, 14, 7.25, 14.25], "texture": "#0"}, + "east": {"uv": [10.25, 5.75, 11.5, 6], "texture": "#0"}, + "south": {"uv": [14, 7, 14.25, 7.25], "texture": "#0"}, + "west": {"uv": [10.25, 8.5, 11.5, 8.75], "texture": "#0"}, + "up": {"uv": [11.25, 3.75, 11, 2.5], "texture": "#0"}, + "down": {"uv": [11.25, 4.5, 11, 5.75], "texture": "#0"} + } + }, + { + "from": [4.2, 14, 6.5], + "to": [6.2, 14.5, 7], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [11.5, 12.75, 12, 13], "texture": "#0"}, + "east": {"uv": [7.25, 14, 7.5, 14.25], "texture": "#0"}, + "south": {"uv": [12, 12.75, 12.5, 13], "texture": "#0"}, + "west": {"uv": [14, 7.25, 14.25, 7.5], "texture": "#0"}, + "up": {"uv": [13.25, 12.5, 12.75, 12.25], "texture": "#0"}, + "down": {"uv": [13, 12.75, 12.5, 13], "texture": "#0"} + } + }, + { + "from": [5.7, 14, 6], + "to": [6.2, 14.5, 6.5], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [7.5, 14, 7.75, 14.25], "texture": "#0"}, + "east": {"uv": [14, 7.5, 14.25, 7.75], "texture": "#0"}, + "south": {"uv": [7.75, 14, 8, 14.25], "texture": "#0"}, + "west": {"uv": [14, 7.75, 14.25, 8], "texture": "#0"}, + "up": {"uv": [8.25, 14.25, 8, 14], "texture": "#0"}, + "down": {"uv": [14.25, 8, 14, 8.25], "texture": "#0"} + } + }, + { + "from": [6.7, 14, 6], + "to": [7.2, 14.5, 6.5], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [8.25, 14, 8.5, 14.25], "texture": "#0"}, + "east": {"uv": [14, 8.25, 14.25, 8.5], "texture": "#0"}, + "south": {"uv": [8.5, 14, 8.75, 14.25], "texture": "#0"}, + "west": {"uv": [14, 8.5, 14.25, 8.75], "texture": "#0"}, + "up": {"uv": [9, 14.25, 8.75, 14], "texture": "#0"}, + "down": {"uv": [14.25, 8.75, 14, 9], "texture": "#0"} + } + }, + { + "from": [5.7, 14, 7], + "to": [6.2, 14.5, 7.5], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [9, 14, 9.25, 14.25], "texture": "#0"}, + "east": {"uv": [14, 9, 14.25, 9.25], "texture": "#0"}, + "south": {"uv": [9.25, 14, 9.5, 14.25], "texture": "#0"}, + "west": {"uv": [14, 9.25, 14.25, 9.5], "texture": "#0"}, + "up": {"uv": [9.75, 14.25, 9.5, 14], "texture": "#0"}, + "down": {"uv": [14.25, 9.5, 14, 9.75], "texture": "#0"} + } + }, + { + "from": [6.7, 14, 7], + "to": [7.2, 14.5, 7.5], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [9.75, 14, 10, 14.25], "texture": "#0"}, + "east": {"uv": [14, 9.75, 14.25, 10], "texture": "#0"}, + "south": {"uv": [10, 14, 10.25, 14.25], "texture": "#0"}, + "west": {"uv": [14, 10, 14.25, 10.25], "texture": "#0"}, + "up": {"uv": [10.5, 14.25, 10.25, 14], "texture": "#0"}, + "down": {"uv": [14.25, 10.25, 14, 10.5], "texture": "#0"} + } + }, + { + "from": [5.2, 14, 5.5], + "to": [5.7, 14.5, 6], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [10.5, 14, 10.75, 14.25], "texture": "#0"}, + "east": {"uv": [14, 10.5, 14.25, 10.75], "texture": "#0"}, + "south": {"uv": [10.75, 14, 11, 14.25], "texture": "#0"}, + "west": {"uv": [14, 10.75, 14.25, 11], "texture": "#0"}, + "up": {"uv": [11.25, 14.25, 11, 14], "texture": "#0"}, + "down": {"uv": [14.25, 11, 14, 11.25], "texture": "#0"} + } + }, + { + "from": [5.2, 14, 7.5], + "to": [5.7, 14.5, 8], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [11.25, 14, 11.5, 14.25], "texture": "#0"}, + "east": {"uv": [14, 11.25, 14.25, 11.5], "texture": "#0"}, + "south": {"uv": [11.5, 14, 11.75, 14.25], "texture": "#0"}, + "west": {"uv": [14, 11.5, 14.25, 11.75], "texture": "#0"}, + "up": {"uv": [12, 14.25, 11.75, 14], "texture": "#0"}, + "down": {"uv": [14.25, 11.75, 14, 12], "texture": "#0"} + } + }, + { + "from": [7.2, 14, 7.5], + "to": [7.7, 14.5, 8], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [12, 14, 12.25, 14.25], "texture": "#0"}, + "east": {"uv": [14, 12, 14.25, 12.25], "texture": "#0"}, + "south": {"uv": [12.25, 14, 12.5, 14.25], "texture": "#0"}, + "west": {"uv": [14, 12.25, 14.25, 12.5], "texture": "#0"}, + "up": {"uv": [12.75, 14.25, 12.5, 14], "texture": "#0"}, + "down": {"uv": [14.25, 12.5, 14, 12.75], "texture": "#0"} + } + }, + { + "from": [7.2, 14, 5.5], + "to": [7.7, 14.5, 6], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [12.75, 14, 13, 14.25], "texture": "#0"}, + "east": {"uv": [14, 12.75, 14.25, 13], "texture": "#0"}, + "south": {"uv": [13, 14, 13.25, 14.25], "texture": "#0"}, + "west": {"uv": [14, 13, 14.25, 13.25], "texture": "#0"}, + "up": {"uv": [13.5, 14.25, 13.25, 14], "texture": "#0"}, + "down": {"uv": [14.25, 13.25, 14, 13.5], "texture": "#0"} + } + }, + { + "from": [9.9, 14, 5.3], + "to": [10.4, 14.5, 9.8], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [13.5, 14, 13.75, 14.25], "texture": "#0"}, + "east": {"uv": [10.25, 8.75, 11.5, 9], "texture": "#0"}, + "south": {"uv": [14, 13.5, 14.25, 13.75], "texture": "#0"}, + "west": {"uv": [10.25, 9, 11.5, 9.25], "texture": "#0"}, + "up": {"uv": [11.25, 8.5, 11, 7.25], "texture": "#0"}, + "down": {"uv": [11.25, 10, 11, 11.25], "texture": "#0"} + } + }, + { + "from": [9.4, 14, 6.8], + "to": [9.9, 14.5, 7.3], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [13.75, 14, 14, 14.25], "texture": "#0"}, + "east": {"uv": [14, 13.75, 14.25, 14], "texture": "#0"}, + "south": {"uv": [14, 14, 14.25, 14.25], "texture": "#0"}, + "west": {"uv": [0, 14.25, 0.25, 14.5], "texture": "#0"}, + "up": {"uv": [14.5, 0.25, 14.25, 0], "texture": "#0"}, + "down": {"uv": [0.5, 14.25, 0.25, 14.5], "texture": "#0"} + } + }, + { + "from": [9.4, 14, 7.8], + "to": [9.9, 14.5, 8.3], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [14.25, 0.25, 14.5, 0.5], "texture": "#0"}, + "east": {"uv": [0.5, 14.25, 0.75, 14.5], "texture": "#0"}, + "south": {"uv": [14.25, 0.5, 14.5, 0.75], "texture": "#0"}, + "west": {"uv": [0.75, 14.25, 1, 14.5], "texture": "#0"}, + "up": {"uv": [14.5, 1, 14.25, 0.75], "texture": "#0"}, + "down": {"uv": [1.25, 14.25, 1, 14.5], "texture": "#0"} + } + }, + { + "from": [8.4, 14, 7.3], + "to": [9.9, 14.5, 7.8], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [12.75, 12.5, 13.25, 12.75], "texture": "#0"}, + "east": {"uv": [14.25, 1, 14.5, 1.25], "texture": "#0"}, + "south": {"uv": [0, 13, 0.5, 13.25], "texture": "#0"}, + "west": {"uv": [1.25, 14.25, 1.5, 14.5], "texture": "#0"}, + "up": {"uv": [1, 13.25, 0.5, 13], "texture": "#0"}, + "down": {"uv": [1.5, 13, 1, 13.25], "texture": "#0"} + } + }, + { + "from": [10.4, 14, 7.3], + "to": [11.9, 14.5, 7.8], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [13, 1, 13.5, 1.25], "texture": "#0"}, + "east": {"uv": [14.25, 1.25, 14.5, 1.5], "texture": "#0"}, + "south": {"uv": [13, 1.25, 13.5, 1.5], "texture": "#0"}, + "west": {"uv": [1.5, 14.25, 1.75, 14.5], "texture": "#0"}, + "up": {"uv": [2, 13.25, 1.5, 13], "texture": "#0"}, + "down": {"uv": [13.5, 1.5, 13, 1.75], "texture": "#0"} + } + }, + { + "from": [10.4, 14, 6.8], + "to": [10.9, 14.5, 7.3], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [14.25, 1.5, 14.5, 1.75], "texture": "#0"}, + "east": {"uv": [1.75, 14.25, 2, 14.5], "texture": "#0"}, + "south": {"uv": [14.25, 1.75, 14.5, 2], "texture": "#0"}, + "west": {"uv": [2, 14.25, 2.25, 14.5], "texture": "#0"}, + "up": {"uv": [14.5, 2.25, 14.25, 2], "texture": "#0"}, + "down": {"uv": [2.5, 14.25, 2.25, 14.5], "texture": "#0"} + } + }, + { + "from": [10.4, 14, 7.8], + "to": [10.9, 14.5, 8.3], + "rotation": {"angle": 0, "axis": "x", "origin": [8.175, 14.25, 7.85]}, + "faces": { + "north": {"uv": [14.25, 2.25, 14.5, 2.5], "texture": "#0"}, + "east": {"uv": [2.5, 14.25, 2.75, 14.5], "texture": "#0"}, + "south": {"uv": [14.25, 2.5, 14.5, 2.75], "texture": "#0"}, + "west": {"uv": [2.75, 14.25, 3, 14.5], "texture": "#0"}, + "up": {"uv": [14.5, 3, 14.25, 2.75], "texture": "#0"}, + "down": {"uv": [3.25, 14.25, 3, 14.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "ornaments", + "origin": [3, 8, 3], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + }, + { + "name": "center", + "origin": [8, 8, 8], + "color": 0, + "children": [32, 33, 34] + }, + { + "name": "plates", + "origin": [8, 8, 8], + "color": 0, + "children": [35, 36, 37, 38, 39, 40] + }, + { + "name": "symbol", + "origin": [6, 8, 1], + "color": 0, + "children": [ + { + "name": "side1", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [41, 42, 43] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [55, 56, 57, 58, 59, 60, 61] + } + ] + }, + { + "name": "side2", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [62, 63, 64] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [76, 77, 78, 79, 80, 81, 82] + } + ] + }, + { + "name": "side3", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [83, 84, 85] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [97, 98, 99, 100, 101, 102, 103] + } + ] + }, + { + "name": "side4", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [104, 105, 106] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [118, 119, 120, 121, 122, 123, 124] + } + ] + }, + { + "name": "top", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [ + { + "name": "group", + "origin": [7.5, 8.5, 14], + "color": 0, + "children": [125, 126, 127] + }, + { + "name": "group", + "origin": [6, 8, 1], + "color": 0, + "children": [128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138] + }, + { + "name": "group", + "origin": [6, 3.5, 14], + "color": 0, + "children": [139, 140, 141, 142, 143, 144, 145] + } + ] + } + ] + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_pump_fluids.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_pump_fluids.json new file mode 100644 index 00000000..4940b064 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_pump_fluids.json @@ -0,0 +1,992 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utilitiesinexcess:upgrade_pump_fluids", + "particle": "utilitiesinexcess:upgrade_pump_fluids" + }, + "elements": [ + { + "from": [2, 7, 3], + "to": [4, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.5, 4, 8, 4.5], "texture": "#0"}, + "east": {"uv": [3.5, 12, 3.75, 12.5], "texture": "#0"}, + "south": {"uv": [7.5, 4.5, 8, 5], "texture": "#0"}, + "west": {"uv": [3.75, 12, 4, 12.5], "texture": "#0"}, + "up": {"uv": [12.5, 4, 12, 3.75], "texture": "#0"}, + "down": {"uv": [4.5, 12, 4, 12.25], "texture": "#0"} + } + }, + { + "from": [3, 7, 2], + "to": [4, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4.5, 12, 4.75, 12.5], "texture": "#0"}, + "east": {"uv": [4.75, 12, 5, 12.5], "texture": "#0"}, + "south": {"uv": [12, 6, 12.25, 6.5], "texture": "#0"}, + "west": {"uv": [12, 6.5, 12.25, 7], "texture": "#0"}, + "up": {"uv": [7.5, 13, 7.25, 12.75], "texture": "#0"}, + "down": {"uv": [13, 7.25, 12.75, 7.5], "texture": "#0"} + } + }, + { + "from": [3, 11, 3], + "to": [4, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.75, 12, 8, 12.5], "texture": "#0"}, + "east": {"uv": [8, 12, 8.25, 12.5], "texture": "#0"}, + "south": {"uv": [8.25, 12, 8.5, 12.5], "texture": "#0"}, + "west": {"uv": [8.5, 12, 8.75, 12.5], "texture": "#0"}, + "up": {"uv": [7.75, 13, 7.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 7.5, 12.75, 7.75], "texture": "#0"} + } + }, + { + "from": [3, 3, 3], + "to": [4, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.75, 12, 9, 12.5], "texture": "#0"}, + "east": {"uv": [12, 8.75, 12.25, 9.25], "texture": "#0"}, + "south": {"uv": [9, 12, 9.25, 12.5], "texture": "#0"}, + "west": {"uv": [12, 9.25, 12.25, 9.75], "texture": "#0"}, + "up": {"uv": [13, 8, 12.75, 7.75], "texture": "#0"}, + "down": {"uv": [13, 8, 12.75, 8.25], "texture": "#0"} + } + }, + { + "from": [3, 7, 12], + "to": [4, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 11, 12.25, 11.5], "texture": "#0"}, + "east": {"uv": [10.75, 3.5, 11.25, 4], "texture": "#0"}, + "south": {"uv": [12, 11.5, 12.25, 12], "texture": "#0"}, + "west": {"uv": [5, 10.75, 5.5, 11.25], "texture": "#0"}, + "up": {"uv": [12, 12.5, 11.75, 12], "texture": "#0"}, + "down": {"uv": [12.25, 12, 12, 12.5], "texture": "#0"} + } + }, + { + "from": [2, 7, 12], + "to": [3, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 0, 12.5, 0.5], "texture": "#0"}, + "east": {"uv": [12.25, 0.5, 12.5, 1], "texture": "#0"}, + "south": {"uv": [12.25, 1, 12.5, 1.5], "texture": "#0"}, + "west": {"uv": [1.5, 12.25, 1.75, 12.75], "texture": "#0"}, + "up": {"uv": [13, 8.5, 12.75, 8.25], "texture": "#0"}, + "down": {"uv": [13, 8.5, 12.75, 8.75], "texture": "#0"} + } + }, + { + "from": [3, 11, 12], + "to": [4, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 1.5, 12.5, 2], "texture": "#0"}, + "east": {"uv": [1.75, 12.25, 2, 12.75], "texture": "#0"}, + "south": {"uv": [12.25, 2, 12.5, 2.5], "texture": "#0"}, + "west": {"uv": [12.25, 2.5, 12.5, 3], "texture": "#0"}, + "up": {"uv": [13, 9, 12.75, 8.75], "texture": "#0"}, + "down": {"uv": [13, 9, 12.75, 9.25], "texture": "#0"} + } + }, + { + "from": [3, 3, 12], + "to": [4, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 3, 12.5, 3.5], "texture": "#0"}, + "east": {"uv": [4, 12.25, 4.25, 12.75], "texture": "#0"}, + "south": {"uv": [12.25, 4, 12.5, 4.5], "texture": "#0"}, + "west": {"uv": [4.25, 12.25, 4.5, 12.75], "texture": "#0"}, + "up": {"uv": [9.5, 13, 9.25, 12.75], "texture": "#0"}, + "down": {"uv": [13, 9.25, 12.75, 9.5], "texture": "#0"} + } + }, + { + "from": [12, 7, 12], + "to": [14, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.5, 10.75, 6, 11.25], "texture": "#0"}, + "east": {"uv": [12.25, 4.5, 12.5, 5], "texture": "#0"}, + "south": {"uv": [6, 10.75, 6.5, 11.25], "texture": "#0"}, + "west": {"uv": [5, 12.25, 5.25, 12.75], "texture": "#0"}, + "up": {"uv": [12.5, 10, 12, 9.75], "texture": "#0"}, + "down": {"uv": [12.75, 3.5, 12.25, 3.75], "texture": "#0"} + } + }, + { + "from": [12, 7, 13], + "to": [13, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 5, 12.5, 5.5], "texture": "#0"}, + "east": {"uv": [5.25, 12.25, 5.5, 12.75], "texture": "#0"}, + "south": {"uv": [5.5, 12.25, 5.75, 12.75], "texture": "#0"}, + "west": {"uv": [12.25, 5.5, 12.5, 6], "texture": "#0"}, + "up": {"uv": [9.75, 13, 9.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 9.5, 12.75, 9.75], "texture": "#0"} + } + }, + { + "from": [12, 11, 12], + "to": [13, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.75, 12.25, 6, 12.75], "texture": "#0"}, + "east": {"uv": [6, 12.25, 6.25, 12.75], "texture": "#0"}, + "south": {"uv": [12.25, 6, 12.5, 6.5], "texture": "#0"}, + "west": {"uv": [6.25, 12.25, 6.5, 12.75], "texture": "#0"}, + "up": {"uv": [10, 13, 9.75, 12.75], "texture": "#0"}, + "down": {"uv": [13, 9.75, 12.75, 10], "texture": "#0"} + } + }, + { + "from": [12, 3, 12], + "to": [13, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.5, 12.25, 6.75, 12.75], "texture": "#0"}, + "east": {"uv": [12.25, 6.5, 12.5, 7], "texture": "#0"}, + "south": {"uv": [6.75, 12.25, 7, 12.75], "texture": "#0"}, + "west": {"uv": [7, 12.25, 7.25, 12.75], "texture": "#0"}, + "up": {"uv": [10.25, 13, 10, 12.75], "texture": "#0"}, + "down": {"uv": [13, 10, 12.75, 10.25], "texture": "#0"} + } + }, + { + "from": [12, 7, 2], + "to": [13, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 7, 12.5, 7.5], "texture": "#0"}, + "east": {"uv": [6.5, 10.75, 7, 11.25], "texture": "#0"}, + "south": {"uv": [7.25, 12.25, 7.5, 12.75], "texture": "#0"}, + "west": {"uv": [7, 10.75, 7.5, 11.25], "texture": "#0"}, + "up": {"uv": [7.75, 12.75, 7.5, 12.25], "texture": "#0"}, + "down": {"uv": [12.5, 7.5, 12.25, 8], "texture": "#0"} + } + }, + { + "from": [13, 7, 3], + "to": [14, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 8, 12.5, 8.5], "texture": "#0"}, + "east": {"uv": [12.25, 8.5, 12.5, 9], "texture": "#0"}, + "south": {"uv": [12.25, 9, 12.5, 9.5], "texture": "#0"}, + "west": {"uv": [9.25, 12.25, 9.5, 12.75], "texture": "#0"}, + "up": {"uv": [10.5, 13, 10.25, 12.75], "texture": "#0"}, + "down": {"uv": [13, 10.25, 12.75, 10.5], "texture": "#0"} + } + }, + { + "from": [12, 11, 3], + "to": [13, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9.5, 12.25, 9.75, 12.75], "texture": "#0"}, + "east": {"uv": [9.75, 12.25, 10, 12.75], "texture": "#0"}, + "south": {"uv": [10, 12.25, 10.25, 12.75], "texture": "#0"}, + "west": {"uv": [12.25, 10, 12.5, 10.5], "texture": "#0"}, + "up": {"uv": [10.75, 13, 10.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 10.5, 12.75, 10.75], "texture": "#0"} + } + }, + { + "from": [12, 3, 3], + "to": [13, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.25, 12.25, 10.5, 12.75], "texture": "#0"}, + "east": {"uv": [10.5, 12.25, 10.75, 12.75], "texture": "#0"}, + "south": {"uv": [12.25, 10.5, 12.5, 11], "texture": "#0"}, + "west": {"uv": [10.75, 12.25, 11, 12.75], "texture": "#0"}, + "up": {"uv": [11, 13, 10.75, 12.75], "texture": "#0"}, + "down": {"uv": [13, 10.75, 12.75, 11], "texture": "#0"} + } + }, + { + "from": [7, 12, 2], + "to": [9, 14, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.5, 10.75, 8, 11.25], "texture": "#0"}, + "east": {"uv": [11, 12.25, 11.25, 12.75], "texture": "#0"}, + "south": {"uv": [10.75, 10.25, 11.25, 10.75], "texture": "#0"}, + "west": {"uv": [12.25, 11, 12.5, 11.5], "texture": "#0"}, + "up": {"uv": [12.75, 9.75, 12.25, 9.5], "texture": "#0"}, + "down": {"uv": [11.75, 12.25, 11.25, 12.5], "texture": "#0"} + } + }, + { + "from": [7, 13, 3], + "to": [9, 14, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 11.5, 12.75, 11.75], "texture": "#0"}, + "east": {"uv": [11, 12.75, 11.25, 13], "texture": "#0"}, + "south": {"uv": [12.25, 11.75, 12.75, 12], "texture": "#0"}, + "west": {"uv": [12.75, 11, 13, 11.25], "texture": "#0"}, + "up": {"uv": [12.75, 12.25, 12.25, 12], "texture": "#0"}, + "down": {"uv": [12.75, 12.25, 12.25, 12.5], "texture": "#0"} + } + }, + { + "from": [13, 12, 7], + "to": [14, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 12.5, 0.25, 13], "texture": "#0"}, + "east": {"uv": [10.75, 10.75, 11.25, 11.25], "texture": "#0"}, + "south": {"uv": [12.5, 0, 12.75, 0.5], "texture": "#0"}, + "west": {"uv": [11, 0, 11.5, 0.5], "texture": "#0"}, + "up": {"uv": [0.5, 13, 0.25, 12.5], "texture": "#0"}, + "down": {"uv": [0.75, 12.5, 0.5, 13], "texture": "#0"} + } + }, + { + "from": [12, 13, 7], + "to": [13, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 11.5, 13, 11.75], "texture": "#0"}, + "east": {"uv": [12.5, 0.5, 13, 0.75], "texture": "#0"}, + "south": {"uv": [12.75, 11.75, 13, 12], "texture": "#0"}, + "west": {"uv": [0.75, 12.5, 1.25, 12.75], "texture": "#0"}, + "up": {"uv": [12.75, 1.25, 12.5, 0.75], "texture": "#0"}, + "down": {"uv": [1.5, 12.5, 1.25, 13], "texture": "#0"} + } + }, + { + "from": [7, 12, 13], + "to": [9, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11, 0.5, 11.5, 1], "texture": "#0"}, + "east": {"uv": [12.5, 1.25, 12.75, 1.75], "texture": "#0"}, + "south": {"uv": [11, 1, 11.5, 1.5], "texture": "#0"}, + "west": {"uv": [12.5, 1.75, 12.75, 2.25], "texture": "#0"}, + "up": {"uv": [13, 2.5, 12.5, 2.25], "texture": "#0"}, + "down": {"uv": [13, 2.5, 12.5, 2.75], "texture": "#0"} + } + }, + { + "from": [7, 13, 12], + "to": [9, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.75, 12.5, 3.25, 12.75], "texture": "#0"}, + "east": {"uv": [12.75, 12, 13, 12.25], "texture": "#0"}, + "south": {"uv": [12.5, 2.75, 13, 3], "texture": "#0"}, + "west": {"uv": [12.75, 12.25, 13, 12.5], "texture": "#0"}, + "up": {"uv": [13, 3.25, 12.5, 3], "texture": "#0"}, + "down": {"uv": [3.75, 12.5, 3.25, 12.75], "texture": "#0"} + } + }, + { + "from": [2, 12, 7], + "to": [3, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3.75, 12.5, 4, 13], "texture": "#0"}, + "east": {"uv": [11, 1.5, 11.5, 2], "texture": "#0"}, + "south": {"uv": [12.5, 3.75, 12.75, 4.25], "texture": "#0"}, + "west": {"uv": [11, 2.25, 11.5, 2.75], "texture": "#0"}, + "up": {"uv": [12.75, 4.75, 12.5, 4.25], "texture": "#0"}, + "down": {"uv": [4.75, 12.5, 4.5, 13], "texture": "#0"} + } + }, + { + "from": [3, 13, 7], + "to": [4, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 12.5, 13, 12.75], "texture": "#0"}, + "east": {"uv": [12.5, 3.25, 13, 3.5], "texture": "#0"}, + "south": {"uv": [12.75, 12.75, 13, 13], "texture": "#0"}, + "west": {"uv": [12.5, 4.75, 13, 5], "texture": "#0"}, + "up": {"uv": [5, 13, 4.75, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 5, 12.5, 5.5], "texture": "#0"} + } + }, + { + "from": [3, 2, 6], + "to": [4, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 13, 0.25, 13.25], "texture": "#0"}, + "east": {"uv": [11, 2.75, 12, 3], "texture": "#0"}, + "south": {"uv": [13, 0, 13.25, 0.25], "texture": "#0"}, + "west": {"uv": [11, 3, 12, 3.25], "texture": "#0"}, + "up": {"uv": [11.25, 5, 11, 4], "texture": "#0"}, + "down": {"uv": [11.25, 5, 11, 6], "texture": "#0"} + } + }, + { + "from": [2, 2, 6], + "to": [3, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 5.5, 12.75, 6], "texture": "#0"}, + "east": {"uv": [6.5, 4, 7.5, 4.5], "texture": "#0"}, + "south": {"uv": [12.5, 6, 12.75, 6.5], "texture": "#0"}, + "west": {"uv": [6.5, 4.5, 7.5, 5], "texture": "#0"}, + "up": {"uv": [11.25, 7, 11, 6], "texture": "#0"}, + "down": {"uv": [11.5, 3.25, 11.25, 4.25], "texture": "#0"} + } + }, + { + "from": [6, 2, 12], + "to": [10, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 4.25, 12.25, 4.5], "texture": "#0"}, + "east": {"uv": [0.25, 13, 0.5, 13.25], "texture": "#0"}, + "south": {"uv": [11.25, 4.5, 12.25, 4.75], "texture": "#0"}, + "west": {"uv": [13, 0.25, 13.25, 0.5], "texture": "#0"}, + "up": {"uv": [12.25, 5, 11.25, 4.75], "texture": "#0"}, + "down": {"uv": [6, 11.25, 5, 11.5], "texture": "#0"} + } + }, + { + "from": [6, 2, 13], + "to": [10, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 4, 11, 4.5], "texture": "#0"}, + "east": {"uv": [12.5, 6.5, 12.75, 7], "texture": "#0"}, + "south": {"uv": [10, 4.5, 11, 5], "texture": "#0"}, + "west": {"uv": [12.5, 7, 12.75, 7.5], "texture": "#0"}, + "up": {"uv": [12.25, 5.25, 11.25, 5], "texture": "#0"}, + "down": {"uv": [12.25, 5.25, 11.25, 5.5], "texture": "#0"} + } + }, + { + "from": [12, 2, 6], + "to": [13, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0.5, 13, 0.75, 13.25], "texture": "#0"}, + "east": {"uv": [11.25, 5.5, 12.25, 5.75], "texture": "#0"}, + "south": {"uv": [13, 0.5, 13.25, 0.75], "texture": "#0"}, + "west": {"uv": [11.25, 5.75, 12.25, 6], "texture": "#0"}, + "up": {"uv": [6.25, 12.25, 6, 11.25], "texture": "#0"}, + "down": {"uv": [11.5, 6, 11.25, 7], "texture": "#0"} + } + }, + { + "from": [13, 2, 6], + "to": [14, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 7.5, 12.75, 8], "texture": "#0"}, + "east": {"uv": [10, 5, 11, 5.5], "texture": "#0"}, + "south": {"uv": [7.75, 12.5, 8, 13], "texture": "#0"}, + "west": {"uv": [10, 5.5, 11, 6], "texture": "#0"}, + "up": {"uv": [6.5, 12.25, 6.25, 11.25], "texture": "#0"}, + "down": {"uv": [6.75, 11.25, 6.5, 12.25], "texture": "#0"} + } + }, + { + "from": [6, 2, 3], + "to": [10, 3, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.75, 11.25, 7.75, 11.5], "texture": "#0"}, + "east": {"uv": [13, 0.75, 13.25, 1], "texture": "#0"}, + "south": {"uv": [11.25, 10, 12.25, 10.25], "texture": "#0"}, + "west": {"uv": [13, 1, 13.25, 1.25], "texture": "#0"}, + "up": {"uv": [12.25, 10.5, 11.25, 10.25], "texture": "#0"}, + "down": {"uv": [12.25, 10.5, 11.25, 10.75], "texture": "#0"} + } + }, + { + "from": [6, 2, 2], + "to": [10, 4, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 6, 11, 6.5], "texture": "#0"}, + "east": {"uv": [8, 12.5, 8.25, 13], "texture": "#0"}, + "south": {"uv": [10, 6.5, 11, 7], "texture": "#0"}, + "west": {"uv": [12.5, 8, 12.75, 8.5], "texture": "#0"}, + "up": {"uv": [11.75, 11.5, 10.75, 11.25], "texture": "#0"}, + "down": {"uv": [12.25, 10.75, 11.25, 11], "texture": "#0"} + } + }, + { + "from": [12, 3, 4], + "to": [13, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 9.5, 3.25, 12], "texture": "#0"}, + "east": {"uv": [2.5, 0, 4.5, 2.5], "texture": "#0"}, + "south": {"uv": [3.25, 9.5, 3.5, 12], "texture": "#0"}, + "west": {"uv": [2.5, 2.5, 4.5, 5], "texture": "#0"}, + "up": {"uv": [10.25, 9, 10, 7], "texture": "#0"}, + "down": {"uv": [8.25, 10, 8, 12], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [4, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3.5, 9.5, 3.75, 12], "texture": "#0"}, + "east": {"uv": [4.5, 0, 6.5, 2.5], "texture": "#0"}, + "south": {"uv": [3.75, 9.5, 4, 12], "texture": "#0"}, + "west": {"uv": [4.5, 2.5, 6.5, 5], "texture": "#0"}, + "up": {"uv": [8.5, 12, 8.25, 10], "texture": "#0"}, + "down": {"uv": [8.75, 10, 8.5, 12], "texture": "#0"} + } + }, + { + "name": "base", + "from": [4, 3, 3], + "to": [12, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 5, 2, 7.5], "texture": "#0"}, + "east": {"uv": [0, 0, 2.5, 2.5], "texture": "#0"}, + "south": {"uv": [2, 5, 4, 7.5], "texture": "#0"}, + "west": {"uv": [0, 2.5, 2.5, 5], "texture": "#0"}, + "up": {"uv": [6, 7.5, 4, 5], "texture": "#0"}, + "down": {"uv": [8, 5, 6, 7.5], "texture": "#0"} + } + }, + { + "from": [4, 4, 13], + "to": [12, 12, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.5, 0, 8.5, 2], "texture": "#0"}, + "east": {"uv": [8.75, 10, 9, 12], "texture": "#0"}, + "south": {"uv": [6.5, 2, 8.5, 4], "texture": "#0"}, + "west": {"uv": [9, 10, 9.25, 12], "texture": "#0"}, + "up": {"uv": [12, 9.25, 10, 9], "texture": "#0"}, + "down": {"uv": [11.25, 10, 9.25, 10.25], "texture": "#0"} + } + }, + { + "from": [4, 13, 4], + "to": [12, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.25, 12, 9.5], "texture": "#0"}, + "east": {"uv": [10, 9.5, 12, 9.75], "texture": "#0"}, + "south": {"uv": [10, 9.75, 12, 10], "texture": "#0"}, + "west": {"uv": [10.25, 7, 12.25, 7.25], "texture": "#0"}, + "up": {"uv": [2, 9.5, 0, 7.5], "texture": "#0"}, + "down": {"uv": [4, 7.5, 2, 9.5], "texture": "#0"} + } + }, + { + "from": [13, 4, 4], + "to": [14, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9.25, 10.25, 9.5, 12.25], "texture": "#0"}, + "east": {"uv": [4, 7.5, 6, 9.5], "texture": "#0"}, + "south": {"uv": [9.5, 10.25, 9.75, 12.25], "texture": "#0"}, + "west": {"uv": [6, 7.5, 8, 9.5], "texture": "#0"}, + "up": {"uv": [10, 12.25, 9.75, 10.25], "texture": "#0"}, + "down": {"uv": [10.25, 10.25, 10, 12.25], "texture": "#0"} + } + }, + { + "from": [4, 4, 2], + "to": [12, 12, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 4, 10, 6], "texture": "#0"}, + "east": {"uv": [10.25, 10.25, 10.5, 12.25], "texture": "#0"}, + "south": {"uv": [8, 6, 10, 8], "texture": "#0"}, + "west": {"uv": [10.5, 0, 10.75, 2], "texture": "#0"}, + "up": {"uv": [12.25, 7.5, 10.25, 7.25], "texture": "#0"}, + "down": {"uv": [12.25, 7.5, 10.25, 7.75], "texture": "#0"} + } + }, + { + "from": [4, 2, 4], + "to": [12, 3, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.25, 7.75, 12.25, 8], "texture": "#0"}, + "east": {"uv": [10.25, 8, 12.25, 8.25], "texture": "#0"}, + "south": {"uv": [10.25, 8.25, 12.25, 8.5], "texture": "#0"}, + "west": {"uv": [10.25, 8.5, 12.25, 8.75], "texture": "#0"}, + "up": {"uv": [10, 10, 8, 8], "texture": "#0"}, + "down": {"uv": [10.5, 0, 8.5, 2], "texture": "#0"} + } + }, + { + "from": [2, 4, 4], + "to": [3, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 2, 10.75, 4], "texture": "#0"}, + "east": {"uv": [8.5, 2, 10.5, 4], "texture": "#0"}, + "south": {"uv": [10.5, 10.25, 10.75, 12.25], "texture": "#0"}, + "west": {"uv": [0, 9.5, 2, 11.5], "texture": "#0"}, + "up": {"uv": [11, 2, 10.75, 0], "texture": "#0"}, + "down": {"uv": [2.25, 10.75, 2, 12.75], "texture": "#0"} + } + }, + { + "from": [1.5, 9.75, 7.75], + "to": [2, 10.75, 8.25], + "rotation": {"angle": 0, "axis": "x", "origin": [1.5, 6.5, 8.25]}, + "faces": { + "north": {"uv": [1.25, 13, 1.5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 1.25, 13.25, 1.5], "texture": "#0"}, + "south": {"uv": [1.5, 13, 1.75, 13.25], "texture": "#0"}, + "west": {"uv": [13, 1.5, 13.25, 1.75], "texture": "#0"}, + "up": {"uv": [2, 13.25, 1.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 1.75, 13, 2], "texture": "#0"} + } + }, + { + "from": [1.5, 5.25, 7.25], + "to": [2, 9.75, 8.75], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 6.5, 7.75]}, + "faces": { + "north": {"uv": [2.25, 10.75, 2.5, 12], "texture": "#0"}, + "east": {"uv": [4, 9.5, 4.5, 10.75], "texture": "#0"}, + "south": {"uv": [10.75, 2.25, 11, 3.5], "texture": "#0"}, + "west": {"uv": [4.5, 9.5, 5, 10.75], "texture": "#0"}, + "up": {"uv": [8.5, 13, 8.25, 12.5], "texture": "#0"}, + "down": {"uv": [8.75, 12.5, 8.5, 13], "texture": "#0"} + } + }, + { + "from": [1.5, 5.75, 6.75], + "to": [2, 8.75, 7.25], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 6.5, 6.25]}, + "faces": { + "north": {"uv": [1.75, 11.5, 2, 12.25], "texture": "#0"}, + "east": {"uv": [11.5, 3.25, 11.75, 4], "texture": "#0"}, + "south": {"uv": [5, 11.5, 5.25, 12.25], "texture": "#0"}, + "west": {"uv": [5.25, 11.5, 5.5, 12.25], "texture": "#0"}, + "up": {"uv": [13.25, 2.25, 13, 2], "texture": "#0"}, + "down": {"uv": [13.25, 2.25, 13, 2.5], "texture": "#0"} + } + }, + { + "from": [1.5, 6.25, 6.25], + "to": [2, 7.75, 6.75], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 6.5, 5.75]}, + "faces": { + "north": {"uv": [12.5, 8.5, 12.75, 9], "texture": "#0"}, + "east": {"uv": [8.75, 12.5, 9, 13], "texture": "#0"}, + "south": {"uv": [9, 12.5, 9.25, 13], "texture": "#0"}, + "west": {"uv": [12.5, 9, 12.75, 9.5], "texture": "#0"}, + "up": {"uv": [13.25, 2.75, 13, 2.5], "texture": "#0"}, + "down": {"uv": [13.25, 2.75, 13, 3], "texture": "#0"} + } + }, + { + "from": [1.5, 6.25, 9.25], + "to": [2, 7.75, 9.75], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 6.5, 8.75]}, + "faces": { + "north": {"uv": [12.5, 9.75, 12.75, 10.25], "texture": "#0"}, + "east": {"uv": [12.5, 10.25, 12.75, 10.75], "texture": "#0"}, + "south": {"uv": [12.5, 10.75, 12.75, 11.25], "texture": "#0"}, + "west": {"uv": [11.25, 12.5, 11.5, 13], "texture": "#0"}, + "up": {"uv": [13.25, 3.25, 13, 3], "texture": "#0"}, + "down": {"uv": [13.25, 3.25, 13, 3.5], "texture": "#0"} + } + }, + { + "from": [1.5, 5.75, 8.75], + "to": [2, 8.75, 9.25], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 6.5, 8.25]}, + "faces": { + "north": {"uv": [5.5, 11.5, 5.75, 12.25], "texture": "#0"}, + "east": {"uv": [5.75, 11.5, 6, 12.25], "texture": "#0"}, + "south": {"uv": [11.5, 6, 11.75, 6.75], "texture": "#0"}, + "west": {"uv": [6.75, 11.5, 7, 12.25], "texture": "#0"}, + "up": {"uv": [4, 13.25, 3.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 4, 13, 4.25], "texture": "#0"} + } + }, + { + "from": [14, 9.75, 7.75], + "to": [14.5, 10.75, 8.25], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 6.5, 8.25]}, + "faces": { + "north": {"uv": [13, 4.25, 13.25, 4.5], "texture": "#0"}, + "east": {"uv": [4.5, 13, 4.75, 13.25], "texture": "#0"}, + "south": {"uv": [13, 4.5, 13.25, 4.75], "texture": "#0"}, + "west": {"uv": [4.75, 13, 5, 13.25], "texture": "#0"}, + "up": {"uv": [13.25, 5, 13, 4.75], "texture": "#0"}, + "down": {"uv": [13.25, 5, 13, 5.25], "texture": "#0"} + } + }, + { + "from": [14, 5.25, 7.25], + "to": [14.5, 9.75, 8.75], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 6.5, 7.75]}, + "faces": { + "north": {"uv": [2.5, 10.75, 2.75, 12], "texture": "#0"}, + "east": {"uv": [5, 9.5, 5.5, 10.75], "texture": "#0"}, + "south": {"uv": [2.75, 10.75, 3, 12], "texture": "#0"}, + "west": {"uv": [5.5, 9.5, 6, 10.75], "texture": "#0"}, + "up": {"uv": [11.75, 13, 11.5, 12.5], "texture": "#0"}, + "down": {"uv": [12, 12.5, 11.75, 13], "texture": "#0"} + } + }, + { + "from": [14, 5.75, 6.75], + "to": [14.5, 8.75, 7.25], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 6.5, 6.25]}, + "faces": { + "north": {"uv": [7, 11.5, 7.25, 12.25], "texture": "#0"}, + "east": {"uv": [7.25, 11.5, 7.5, 12.25], "texture": "#0"}, + "south": {"uv": [7.5, 11.5, 7.75, 12.25], "texture": "#0"}, + "west": {"uv": [10.75, 11.5, 11, 12.25], "texture": "#0"}, + "up": {"uv": [13.25, 5.5, 13, 5.25], "texture": "#0"}, + "down": {"uv": [13.25, 5.5, 13, 5.75], "texture": "#0"} + } + }, + { + "from": [14, 6.25, 6.25], + "to": [14.5, 7.75, 6.75], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 6.5, 5.75]}, + "faces": { + "north": {"uv": [12, 12.5, 12.25, 13], "texture": "#0"}, + "east": {"uv": [12.25, 12.5, 12.5, 13], "texture": "#0"}, + "south": {"uv": [12.5, 12.5, 12.75, 13], "texture": "#0"}, + "west": {"uv": [12.75, 0, 13, 0.5], "texture": "#0"}, + "up": {"uv": [6, 13.25, 5.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 5.75, 13, 6], "texture": "#0"} + } + }, + { + "from": [14, 6.25, 9.25], + "to": [14.5, 7.75, 9.75], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 6.5, 8.75]}, + "faces": { + "north": {"uv": [0.75, 12.75, 1, 13.25], "texture": "#0"}, + "east": {"uv": [12.75, 0.75, 13, 1.25], "texture": "#0"}, + "south": {"uv": [1, 12.75, 1.25, 13.25], "texture": "#0"}, + "west": {"uv": [12.75, 1.25, 13, 1.75], "texture": "#0"}, + "up": {"uv": [6.25, 13.25, 6, 13], "texture": "#0"}, + "down": {"uv": [13.25, 6, 13, 6.25], "texture": "#0"} + } + }, + { + "from": [14, 5.75, 8.75], + "to": [14.5, 8.75, 9.25], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 6.5, 8.25]}, + "faces": { + "north": {"uv": [11, 11.5, 11.25, 12.25], "texture": "#0"}, + "east": {"uv": [11.25, 11.5, 11.5, 12.25], "texture": "#0"}, + "south": {"uv": [11.5, 11.5, 11.75, 12.25], "texture": "#0"}, + "west": {"uv": [0, 11.75, 0.25, 12.5], "texture": "#0"}, + "up": {"uv": [6.5, 13.25, 6.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 6.25, 13, 6.5], "texture": "#0"} + } + }, + { + "from": [7.75, 9.75, 14], + "to": [8.25, 10.75, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 14.25]}, + "faces": { + "north": {"uv": [6.5, 13, 6.75, 13.25], "texture": "#0"}, + "east": {"uv": [13, 6.5, 13.25, 6.75], "texture": "#0"}, + "south": {"uv": [6.75, 13, 7, 13.25], "texture": "#0"}, + "west": {"uv": [13, 6.75, 13.25, 7], "texture": "#0"}, + "up": {"uv": [7.25, 13.25, 7, 13], "texture": "#0"}, + "down": {"uv": [13.25, 7, 13, 7.25], "texture": "#0"} + } + }, + { + "from": [7.25, 5.25, 14], + "to": [8.75, 9.75, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 14.25]}, + "faces": { + "north": {"uv": [6, 9.5, 6.5, 10.75], "texture": "#0"}, + "east": {"uv": [4, 10.75, 4.25, 12], "texture": "#0"}, + "south": {"uv": [6.5, 9.5, 7, 10.75], "texture": "#0"}, + "west": {"uv": [4.25, 10.75, 4.5, 12], "texture": "#0"}, + "up": {"uv": [13, 11.5, 12.5, 11.25], "texture": "#0"}, + "down": {"uv": [2, 12.75, 1.5, 13], "texture": "#0"} + } + }, + { + "from": [6.75, 5.75, 14], + "to": [7.25, 8.75, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 14.25]}, + "faces": { + "north": {"uv": [11.75, 0, 12, 0.75], "texture": "#0"}, + "east": {"uv": [0.25, 11.75, 0.5, 12.5], "texture": "#0"}, + "south": {"uv": [0.5, 11.75, 0.75, 12.5], "texture": "#0"}, + "west": {"uv": [0.75, 11.75, 1, 12.5], "texture": "#0"}, + "up": {"uv": [7.5, 13.25, 7.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 7.25, 13, 7.5], "texture": "#0"} + } + }, + { + "from": [6.25, 6.25, 14], + "to": [6.75, 7.75, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 14.25]}, + "faces": { + "north": {"uv": [12.75, 1.75, 13, 2.25], "texture": "#0"}, + "east": {"uv": [2, 12.75, 2.25, 13.25], "texture": "#0"}, + "south": {"uv": [2.25, 12.75, 2.5, 13.25], "texture": "#0"}, + "west": {"uv": [2.5, 12.75, 2.75, 13.25], "texture": "#0"}, + "up": {"uv": [7.75, 13.25, 7.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 7.5, 13, 7.75], "texture": "#0"} + } + }, + { + "from": [9.25, 6.25, 14], + "to": [9.75, 7.75, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 14.25]}, + "faces": { + "north": {"uv": [2.75, 12.75, 3, 13.25], "texture": "#0"}, + "east": {"uv": [3, 12.75, 3.25, 13.25], "texture": "#0"}, + "south": {"uv": [3.25, 12.75, 3.5, 13.25], "texture": "#0"}, + "west": {"uv": [3.5, 12.75, 3.75, 13.25], "texture": "#0"}, + "up": {"uv": [8, 13.25, 7.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 7.75, 13, 8], "texture": "#0"} + } + }, + { + "from": [8.75, 5.75, 14], + "to": [9.25, 8.75, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 14.25]}, + "faces": { + "north": {"uv": [1, 11.75, 1.25, 12.5], "texture": "#0"}, + "east": {"uv": [11.75, 1, 12, 1.75], "texture": "#0"}, + "south": {"uv": [1.25, 11.75, 1.5, 12.5], "texture": "#0"}, + "west": {"uv": [11.75, 3.25, 12, 4], "texture": "#0"}, + "up": {"uv": [8.25, 13.25, 8, 13], "texture": "#0"}, + "down": {"uv": [13.25, 8, 13, 8.25], "texture": "#0"} + } + }, + { + "from": [7.75, 9.75, 1.5], + "to": [8.25, 10.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 1.75]}, + "faces": { + "north": {"uv": [8.25, 13, 8.5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 8.25, 13.25, 8.5], "texture": "#0"}, + "south": {"uv": [8.5, 13, 8.75, 13.25], "texture": "#0"}, + "west": {"uv": [13, 8.5, 13.25, 8.75], "texture": "#0"}, + "up": {"uv": [9, 13.25, 8.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 8.75, 13, 9], "texture": "#0"} + } + }, + { + "from": [7.25, 5.25, 1.5], + "to": [8.75, 9.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 1.75]}, + "faces": { + "north": {"uv": [7, 9.5, 7.5, 10.75], "texture": "#0"}, + "east": {"uv": [4.5, 10.75, 4.75, 12], "texture": "#0"}, + "south": {"uv": [7.5, 9.5, 8, 10.75], "texture": "#0"}, + "west": {"uv": [4.75, 10.75, 5, 12], "texture": "#0"}, + "up": {"uv": [13.25, 3.75, 12.75, 3.5], "texture": "#0"}, + "down": {"uv": [13.25, 3.75, 12.75, 4], "texture": "#0"} + } + }, + { + "from": [8.75, 5.75, 1.5], + "to": [9.25, 8.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 1.75]}, + "faces": { + "north": {"uv": [11.75, 6, 12, 6.75], "texture": "#0"}, + "east": {"uv": [11.75, 11.25, 12, 12], "texture": "#0"}, + "south": {"uv": [12, 0, 12.25, 0.75], "texture": "#0"}, + "west": {"uv": [12, 1, 12.25, 1.75], "texture": "#0"}, + "up": {"uv": [9.25, 13.25, 9, 13], "texture": "#0"}, + "down": {"uv": [13.25, 9, 13, 9.25], "texture": "#0"} + } + }, + { + "from": [9.25, 6.25, 1.5], + "to": [9.75, 7.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 1.75]}, + "faces": { + "north": {"uv": [4, 12.75, 4.25, 13.25], "texture": "#0"}, + "east": {"uv": [12.75, 4, 13, 4.5], "texture": "#0"}, + "south": {"uv": [4.25, 12.75, 4.5, 13.25], "texture": "#0"}, + "west": {"uv": [5, 12.75, 5.25, 13.25], "texture": "#0"}, + "up": {"uv": [9.5, 13.25, 9.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 9.25, 13, 9.5], "texture": "#0"} + } + }, + { + "from": [6.25, 6.25, 1.5], + "to": [6.75, 7.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 1.75]}, + "faces": { + "north": {"uv": [12.75, 5, 13, 5.5], "texture": "#0"}, + "east": {"uv": [5.25, 12.75, 5.5, 13.25], "texture": "#0"}, + "south": {"uv": [5.5, 12.75, 5.75, 13.25], "texture": "#0"}, + "west": {"uv": [12.75, 5.5, 13, 6], "texture": "#0"}, + "up": {"uv": [9.75, 13.25, 9.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 9.5, 13, 9.75], "texture": "#0"} + } + }, + { + "from": [6.75, 5.75, 1.5], + "to": [7.25, 8.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.625, 1.75]}, + "faces": { + "north": {"uv": [12, 1.75, 12.25, 2.5], "texture": "#0"}, + "east": {"uv": [2.25, 12, 2.5, 12.75], "texture": "#0"}, + "south": {"uv": [2.5, 12, 2.75, 12.75], "texture": "#0"}, + "west": {"uv": [12, 2.5, 12.25, 3.25], "texture": "#0"}, + "up": {"uv": [10, 13.25, 9.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 9.75, 13, 10], "texture": "#0"} + } + }, + { + "from": [7.75, 13.975, 5.125], + "to": [8.25, 14.475, 6.125], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.225, 7.25]}, + "faces": { + "north": {"uv": [11, 3.25, 11.25, 3.5], "texture": "#0"}, + "east": {"uv": [12, 4, 12.25, 4.25], "texture": "#0"}, + "south": {"uv": [12.75, 4.5, 13, 4.75], "texture": "#0"}, + "west": {"uv": [5.75, 12.75, 6, 13], "texture": "#0"}, + "up": {"uv": [6.25, 13, 6, 12.75], "texture": "#0"}, + "down": {"uv": [13, 6, 12.75, 6.25], "texture": "#0"} + } + }, + { + "from": [7.25, 13.975, 6.125], + "to": [8.75, 14.475, 10.625], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.225, 7.25]}, + "faces": { + "north": {"uv": [11.5, 1.75, 12, 2], "texture": "#0"}, + "east": {"uv": [10.25, 8.75, 11.5, 9], "texture": "#0"}, + "south": {"uv": [11.5, 2.25, 12, 2.5], "texture": "#0"}, + "west": {"uv": [10.75, 2, 12, 2.25], "texture": "#0"}, + "up": {"uv": [2.5, 10.75, 2, 9.5], "texture": "#0"}, + "down": {"uv": [3, 9.5, 2.5, 10.75], "texture": "#0"} + } + }, + { + "from": [8.75, 13.975, 7.125], + "to": [9.25, 14.475, 10.125], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.225, 7.25]}, + "faces": { + "north": {"uv": [6.25, 12.75, 6.5, 13], "texture": "#0"}, + "east": {"uv": [11.25, 11, 12, 11.25], "texture": "#0"}, + "south": {"uv": [12.75, 6.25, 13, 6.5], "texture": "#0"}, + "west": {"uv": [0, 11.5, 0.75, 11.75], "texture": "#0"}, + "up": {"uv": [8, 12, 7.75, 11.25], "texture": "#0"}, + "down": {"uv": [11.75, 0, 11.5, 0.75], "texture": "#0"} + } + }, + { + "from": [9.25, 13.975, 8.125], + "to": [9.75, 14.475, 9.625], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.225, 7.25]}, + "faces": { + "north": {"uv": [6.5, 12.75, 6.75, 13], "texture": "#0"}, + "east": {"uv": [11.5, 2.5, 12, 2.75], "texture": "#0"}, + "south": {"uv": [12.75, 6.5, 13, 6.75], "texture": "#0"}, + "west": {"uv": [11.5, 4, 12, 4.25], "texture": "#0"}, + "up": {"uv": [3, 12.5, 2.75, 12], "texture": "#0"}, + "down": {"uv": [3.25, 12, 3, 12.5], "texture": "#0"} + } + }, + { + "from": [6.25, 13.975, 8.125], + "to": [6.75, 14.475, 9.625], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.225, 7.25]}, + "faces": { + "north": {"uv": [6.75, 12.75, 7, 13], "texture": "#0"}, + "east": {"uv": [11.5, 6.75, 12, 7], "texture": "#0"}, + "south": {"uv": [12.75, 6.75, 13, 7], "texture": "#0"}, + "west": {"uv": [11.5, 8.75, 12, 9], "texture": "#0"}, + "up": {"uv": [3.5, 12.5, 3.25, 12], "texture": "#0"}, + "down": {"uv": [12.25, 3.25, 12, 3.75], "texture": "#0"} + } + }, + { + "from": [6.75, 13.975, 7.125], + "to": [7.25, 14.475, 10.125], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.225, 7.25]}, + "faces": { + "north": {"uv": [7, 12.75, 7.25, 13], "texture": "#0"}, + "east": {"uv": [0.75, 11.5, 1.5, 11.75], "texture": "#0"}, + "south": {"uv": [12.75, 7, 13, 7.25], "texture": "#0"}, + "west": {"uv": [11.5, 0.75, 12.25, 1], "texture": "#0"}, + "up": {"uv": [11.75, 1.75, 11.5, 1], "texture": "#0"}, + "down": {"uv": [1.75, 11.5, 1.5, 12.25], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "ornaments", + "origin": [3, 8, 3], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + }, + { + "name": "center", + "origin": [8, 8, 8], + "color": 0, + "children": [32, 33, 34] + }, + { + "name": "plates", + "origin": [8, 8, 8], + "color": 0, + "children": [35, 36, 37, 38, 39, 40] + }, + { + "name": "symbol", + "origin": [6, 8, 1], + "color": 0, + "children": [ + { + "name": "side1", + "origin": [1.5, 6.5, 8.25], + "color": 0, + "children": [41, 42, 43, 44, 45, 46] + }, + { + "name": "side2", + "origin": [1.5, 6.5, 8.25], + "color": 0, + "children": [47, 48, 49, 50, 51, 52] + }, + { + "name": "side3", + "origin": [1.5, 6.5, 8.25], + "color": 0, + "children": [53, 54, 55, 56, 57, 58] + }, + { + "name": "side4", + "origin": [1.5, 6.5, 8.25], + "color": 0, + "children": [59, 60, 61, 62, 63, 64] + }, + { + "name": "top", + "origin": [1.5, 6.5, 8.25], + "color": 0, + "children": [65, 66, 67, 68, 69, 70] + } + ] + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_silk_touch.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_silk_touch.json new file mode 100644 index 00000000..25e0f790 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_silk_touch.json @@ -0,0 +1,1122 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utilitiesinexcess:upgrade_silk_touch", + "particle": "utilitiesinexcess:upgrade_silk_touch" + }, + "elements": [ + { + "from": [2, 7, 3], + "to": [4, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.5, 4, 8, 4.5], "texture": "#0"}, + "east": {"uv": [10, 10.75, 10.25, 11.25], "texture": "#0"}, + "south": {"uv": [7.5, 4.5, 8, 5], "texture": "#0"}, + "west": {"uv": [10.25, 10.75, 10.5, 11.25], "texture": "#0"}, + "up": {"uv": [11.25, 6, 10.75, 5.75], "texture": "#0"}, + "down": {"uv": [11, 10.75, 10.5, 11], "texture": "#0"} + } + }, + { + "from": [3, 7, 2], + "to": [4, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11, 0, 11.25, 0.5], "texture": "#0"}, + "east": {"uv": [11, 2.25, 11.25, 2.75], "texture": "#0"}, + "south": {"uv": [11, 2.75, 11.25, 3.25], "texture": "#0"}, + "west": {"uv": [10.5, 11, 10.75, 11.5], "texture": "#0"}, + "up": {"uv": [11.75, 1, 11.5, 0.75], "texture": "#0"}, + "down": {"uv": [1.75, 12.5, 1.5, 12.75], "texture": "#0"} + } + }, + { + "from": [3, 11, 3], + "to": [4, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.75, 11, 11, 11.5], "texture": "#0"}, + "east": {"uv": [11, 10.75, 11.25, 11.25], "texture": "#0"}, + "south": {"uv": [11.25, 0, 11.5, 0.5], "texture": "#0"}, + "west": {"uv": [11.25, 2.25, 11.5, 2.75], "texture": "#0"}, + "up": {"uv": [12.75, 6.75, 12.5, 6.5], "texture": "#0"}, + "down": {"uv": [12.75, 6.75, 12.5, 7], "texture": "#0"} + } + }, + { + "from": [3, 3, 3], + "to": [4, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 2.75, 11.5, 3.25], "texture": "#0"}, + "east": {"uv": [11.25, 5.25, 11.5, 5.75], "texture": "#0"}, + "south": {"uv": [6.25, 11.25, 6.5, 11.75], "texture": "#0"}, + "west": {"uv": [6.5, 11.25, 6.75, 11.75], "texture": "#0"}, + "up": {"uv": [7.25, 12.75, 7, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 7, 12.5, 7.25], "texture": "#0"} + } + }, + { + "from": [3, 7, 12], + "to": [4, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.75, 11.25, 7, 11.75], "texture": "#0"}, + "east": {"uv": [10.25, 4.5, 10.75, 5], "texture": "#0"}, + "south": {"uv": [7, 11.25, 7.25, 11.75], "texture": "#0"}, + "west": {"uv": [10.25, 5, 10.75, 5.5], "texture": "#0"}, + "up": {"uv": [11.5, 7.75, 11.25, 7.25], "texture": "#0"}, + "down": {"uv": [11.5, 7.75, 11.25, 8.25], "texture": "#0"} + } + }, + { + "from": [2, 7, 12], + "to": [3, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 8.25, 11.5, 8.75], "texture": "#0"}, + "east": {"uv": [8.5, 11.25, 8.75, 11.75], "texture": "#0"}, + "south": {"uv": [8.75, 11.25, 9, 11.75], "texture": "#0"}, + "west": {"uv": [11.25, 8.75, 11.5, 9.25], "texture": "#0"}, + "up": {"uv": [7.5, 12.75, 7.25, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 7.25, 12.5, 7.5], "texture": "#0"} + } + }, + { + "from": [3, 11, 12], + "to": [4, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 11.25, 9.25, 11.75], "texture": "#0"}, + "east": {"uv": [9.25, 11.25, 9.5, 11.75], "texture": "#0"}, + "south": {"uv": [9.5, 11.25, 9.75, 11.75], "texture": "#0"}, + "west": {"uv": [9.75, 11.25, 10, 11.75], "texture": "#0"}, + "up": {"uv": [7.75, 12.75, 7.5, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 7.5, 12.5, 7.75], "texture": "#0"} + } + }, + { + "from": [3, 3, 12], + "to": [4, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 11.25, 10.25, 11.75], "texture": "#0"}, + "east": {"uv": [10.25, 11.25, 10.5, 11.75], "texture": "#0"}, + "south": {"uv": [11.25, 10.75, 11.5, 11.25], "texture": "#0"}, + "west": {"uv": [11, 11.25, 11.25, 11.75], "texture": "#0"}, + "up": {"uv": [8, 12.75, 7.75, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 7.75, 12.5, 8], "texture": "#0"} + } + }, + { + "from": [12, 7, 12], + "to": [14, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.25, 5.5, 10.75, 6], "texture": "#0"}, + "east": {"uv": [11.25, 11.25, 11.5, 11.75], "texture": "#0"}, + "south": {"uv": [6.25, 10.25, 6.75, 10.75], "texture": "#0"}, + "west": {"uv": [0, 11.5, 0.25, 12], "texture": "#0"}, + "up": {"uv": [11.75, 6, 11.25, 5.75], "texture": "#0"}, + "down": {"uv": [12, 0, 11.5, 0.25], "texture": "#0"} + } + }, + { + "from": [12, 7, 13], + "to": [13, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0.25, 11.5, 0.5, 12], "texture": "#0"}, + "east": {"uv": [11.5, 0.25, 11.75, 0.75], "texture": "#0"}, + "south": {"uv": [0.5, 11.5, 0.75, 12], "texture": "#0"}, + "west": {"uv": [0.75, 11.5, 1, 12], "texture": "#0"}, + "up": {"uv": [12.75, 8.25, 12.5, 8], "texture": "#0"}, + "down": {"uv": [8.5, 12.5, 8.25, 12.75], "texture": "#0"} + } + }, + { + "from": [12, 11, 12], + "to": [13, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 11.5, 1.25, 12], "texture": "#0"}, + "east": {"uv": [1.25, 11.5, 1.5, 12], "texture": "#0"}, + "south": {"uv": [1.5, 11.5, 1.75, 12], "texture": "#0"}, + "west": {"uv": [1.75, 11.5, 2, 12], "texture": "#0"}, + "up": {"uv": [12.75, 8.5, 12.5, 8.25], "texture": "#0"}, + "down": {"uv": [12.75, 8.5, 12.5, 8.75], "texture": "#0"} + } + }, + { + "from": [12, 3, 12], + "to": [13, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 2.25, 11.75, 2.75], "texture": "#0"}, + "east": {"uv": [11.5, 2.75, 11.75, 3.25], "texture": "#0"}, + "south": {"uv": [3, 11.5, 3.25, 12], "texture": "#0"}, + "west": {"uv": [3.25, 11.5, 3.5, 12], "texture": "#0"}, + "up": {"uv": [9, 12.75, 8.75, 12.5], "texture": "#0"}, + "down": {"uv": [12.75, 8.75, 12.5, 9], "texture": "#0"} + } + }, + { + "from": [12, 7, 2], + "to": [13, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3.5, 11.5, 3.75, 12], "texture": "#0"}, + "east": {"uv": [6.75, 10.25, 7.25, 10.75], "texture": "#0"}, + "south": {"uv": [3.75, 11.5, 4, 12], "texture": "#0"}, + "west": {"uv": [10.25, 7.25, 10.75, 7.75], "texture": "#0"}, + "up": {"uv": [11.75, 5.75, 11.5, 5.25], "texture": "#0"}, + "down": {"uv": [11.75, 7.25, 11.5, 7.75], "texture": "#0"} + } + }, + { + "from": [13, 7, 3], + "to": [14, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 7.75, 11.75, 8.25], "texture": "#0"}, + "east": {"uv": [11.5, 8.25, 11.75, 8.75], "texture": "#0"}, + "south": {"uv": [11.5, 8.75, 11.75, 9.25], "texture": "#0"}, + "west": {"uv": [11.5, 10, 11.75, 10.5], "texture": "#0"}, + "up": {"uv": [12.75, 9.25, 12.5, 9], "texture": "#0"}, + "down": {"uv": [12.75, 9.25, 12.5, 9.5], "texture": "#0"} + } + }, + { + "from": [12, 11, 3], + "to": [13, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 11.5, 10.75, 12], "texture": "#0"}, + "east": {"uv": [11.5, 10.5, 11.75, 11], "texture": "#0"}, + "south": {"uv": [10.75, 11.5, 11, 12], "texture": "#0"}, + "west": {"uv": [11.5, 11, 11.75, 11.5], "texture": "#0"}, + "up": {"uv": [12.75, 9.75, 12.5, 9.5], "texture": "#0"}, + "down": {"uv": [12.75, 9.75, 12.5, 10], "texture": "#0"} + } + }, + { + "from": [12, 3, 3], + "to": [13, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.5, 11.5, 11.75, 12], "texture": "#0"}, + "east": {"uv": [11.75, 0.25, 12, 0.75], "texture": "#0"}, + "south": {"uv": [11.75, 0.75, 12, 1.25], "texture": "#0"}, + "west": {"uv": [11.75, 1.25, 12, 1.75], "texture": "#0"}, + "up": {"uv": [10.25, 12.75, 10, 12.5], "texture": "#0"}, + "down": {"uv": [10.5, 12.5, 10.25, 12.75], "texture": "#0"} + } + }, + { + "from": [7, 12, 2], + "to": [9, 14, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.25, 7.75, 10.75, 8.25], "texture": "#0"}, + "east": {"uv": [11.75, 1.75, 12, 2.25], "texture": "#0"}, + "south": {"uv": [10.25, 8.25, 10.75, 8.75], "texture": "#0"}, + "west": {"uv": [11.75, 2.25, 12, 2.75], "texture": "#0"}, + "up": {"uv": [12.25, 3, 11.75, 2.75], "texture": "#0"}, + "down": {"uv": [12.25, 3, 11.75, 3.25], "texture": "#0"} + } + }, + { + "from": [7, 13, 3], + "to": [9, 14, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 3.25, 12.25, 3.5], "texture": "#0"}, + "east": {"uv": [12.5, 10.25, 12.75, 10.5], "texture": "#0"}, + "south": {"uv": [11.75, 3.5, 12.25, 3.75], "texture": "#0"}, + "west": {"uv": [10.5, 12.5, 10.75, 12.75], "texture": "#0"}, + "up": {"uv": [12.25, 4, 11.75, 3.75], "texture": "#0"}, + "down": {"uv": [12.25, 4.5, 11.75, 4.75], "texture": "#0"} + } + }, + { + "from": [13, 12, 7], + "to": [14, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 4.75, 12, 5.25], "texture": "#0"}, + "east": {"uv": [8.5, 10.25, 9, 10.75], "texture": "#0"}, + "south": {"uv": [11.75, 5.25, 12, 5.75], "texture": "#0"}, + "west": {"uv": [10.25, 8.75, 10.75, 9.25], "texture": "#0"}, + "up": {"uv": [6.5, 12.25, 6.25, 11.75], "texture": "#0"}, + "down": {"uv": [6.75, 11.75, 6.5, 12.25], "texture": "#0"} + } + }, + { + "from": [12, 13, 7], + "to": [13, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 10.5, 12.75, 10.75], "texture": "#0"}, + "east": {"uv": [11.75, 5.75, 12.25, 6], "texture": "#0"}, + "south": {"uv": [12.5, 10.75, 12.75, 11], "texture": "#0"}, + "west": {"uv": [6.75, 11.75, 7.25, 12], "texture": "#0"}, + "up": {"uv": [12, 7.75, 11.75, 7.25], "texture": "#0"}, + "down": {"uv": [12, 7.75, 11.75, 8.25], "texture": "#0"} + } + }, + { + "from": [7, 12, 13], + "to": [9, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 10.25, 9.5, 10.75], "texture": "#0"}, + "east": {"uv": [11.75, 8.25, 12, 8.75], "texture": "#0"}, + "south": {"uv": [9.5, 10.25, 10, 10.75], "texture": "#0"}, + "west": {"uv": [8.5, 11.75, 8.75, 12.25], "texture": "#0"}, + "up": {"uv": [9.25, 12, 8.75, 11.75], "texture": "#0"}, + "down": {"uv": [12.25, 8.75, 11.75, 9], "texture": "#0"} + } + }, + { + "from": [7, 13, 12], + "to": [9, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 9, 12.25, 9.25], "texture": "#0"}, + "east": {"uv": [11, 12.5, 11.25, 12.75], "texture": "#0"}, + "south": {"uv": [9.25, 11.75, 9.75, 12], "texture": "#0"}, + "west": {"uv": [12.5, 11, 12.75, 11.25], "texture": "#0"}, + "up": {"uv": [10.25, 12, 9.75, 11.75], "texture": "#0"}, + "down": {"uv": [12.25, 10, 11.75, 10.25], "texture": "#0"} + } + }, + { + "from": [2, 12, 7], + "to": [3, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.25, 11.75, 10.5, 12.25], "texture": "#0"}, + "east": {"uv": [10, 10.25, 10.5, 10.75], "texture": "#0"}, + "south": {"uv": [11.75, 10.25, 12, 10.75], "texture": "#0"}, + "west": {"uv": [10.5, 0, 11, 0.5], "texture": "#0"}, + "up": {"uv": [12, 11.25, 11.75, 10.75], "texture": "#0"}, + "down": {"uv": [11.25, 11.75, 11, 12.25], "texture": "#0"} + } + }, + { + "from": [3, 13, 7], + "to": [4, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11.25, 12.5, 11.5, 12.75], "texture": "#0"}, + "east": {"uv": [11.75, 11.25, 12.25, 11.5], "texture": "#0"}, + "south": {"uv": [11.5, 12.5, 11.75, 12.75], "texture": "#0"}, + "west": {"uv": [11.75, 11.5, 12.25, 11.75], "texture": "#0"}, + "up": {"uv": [11.5, 12.25, 11.25, 11.75], "texture": "#0"}, + "down": {"uv": [12, 11.75, 11.75, 12.25], "texture": "#0"} + } + }, + { + "from": [3, 2, 6], + "to": [4, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 11.75, 12.75, 12], "texture": "#0"}, + "east": {"uv": [10.5, 0.5, 11.5, 0.75], "texture": "#0"}, + "south": {"uv": [12.5, 12, 12.75, 12.25], "texture": "#0"}, + "west": {"uv": [10.5, 0.75, 11.5, 1], "texture": "#0"}, + "up": {"uv": [10.75, 2, 10.5, 1], "texture": "#0"}, + "down": {"uv": [10.75, 2, 10.5, 3], "texture": "#0"} + } + }, + { + "from": [2, 2, 6], + "to": [3, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 12, 0.25, 12.5], "texture": "#0"}, + "east": {"uv": [6.5, 4, 7.5, 4.5], "texture": "#0"}, + "south": {"uv": [12, 0, 12.25, 0.5], "texture": "#0"}, + "west": {"uv": [6.5, 4.5, 7.5, 5], "texture": "#0"}, + "up": {"uv": [3.25, 11.5, 3, 10.5], "texture": "#0"}, + "down": {"uv": [10.75, 3, 10.5, 4], "texture": "#0"} + } + }, + { + "from": [6, 2, 12], + "to": [10, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 10, 11.5, 10.25], "texture": "#0"}, + "east": {"uv": [12.25, 12.5, 12.5, 12.75], "texture": "#0"}, + "south": {"uv": [10.5, 10.25, 11.5, 10.5], "texture": "#0"}, + "west": {"uv": [12.5, 12.5, 12.75, 12.75], "texture": "#0"}, + "up": {"uv": [11.5, 10.75, 10.5, 10.5], "texture": "#0"}, + "down": {"uv": [11.75, 1, 10.75, 1.25], "texture": "#0"} + } + }, + { + "from": [6, 2, 13], + "to": [10, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 9.5, 4, 10], "texture": "#0"}, + "east": {"uv": [0.25, 12, 0.5, 12.5], "texture": "#0"}, + "south": {"uv": [4, 9.5, 5, 10], "texture": "#0"}, + "west": {"uv": [0.5, 12, 0.75, 12.5], "texture": "#0"}, + "up": {"uv": [11.75, 1.5, 10.75, 1.25], "texture": "#0"}, + "down": {"uv": [11.75, 1.5, 10.75, 1.75], "texture": "#0"} + } + }, + { + "from": [12, 2, 6], + "to": [13, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 0, 13, 0.25], "texture": "#0"}, + "east": {"uv": [10.75, 1.75, 11.75, 2], "texture": "#0"}, + "south": {"uv": [12.75, 0.25, 13, 0.5], "texture": "#0"}, + "west": {"uv": [10.75, 2, 11.75, 2.25], "texture": "#0"}, + "up": {"uv": [3.5, 11.5, 3.25, 10.5], "texture": "#0"}, + "down": {"uv": [3.75, 10.5, 3.5, 11.5], "texture": "#0"} + } + }, + { + "from": [13, 2, 6], + "to": [14, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 0.5, 12.25, 1], "texture": "#0"}, + "east": {"uv": [5, 9.5, 6, 10], "texture": "#0"}, + "south": {"uv": [0.75, 12, 1, 12.5], "texture": "#0"}, + "west": {"uv": [6, 9.5, 7, 10], "texture": "#0"}, + "up": {"uv": [4, 11.5, 3.75, 10.5], "texture": "#0"}, + "down": {"uv": [11, 2.25, 10.75, 3.25], "texture": "#0"} + } + }, + { + "from": [6, 2, 3], + "to": [10, 3, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.75, 3.25, 11.75, 3.5], "texture": "#0"}, + "east": {"uv": [0.5, 12.75, 0.75, 13], "texture": "#0"}, + "south": {"uv": [10.75, 3.5, 11.75, 3.75], "texture": "#0"}, + "west": {"uv": [12.75, 0.5, 13, 0.75], "texture": "#0"}, + "up": {"uv": [11.75, 4, 10.75, 3.75], "texture": "#0"}, + "down": {"uv": [11.75, 4.5, 10.75, 4.75], "texture": "#0"} + } + }, + { + "from": [6, 2, 2], + "to": [10, 4, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 9.5, 8, 10], "texture": "#0"}, + "east": {"uv": [1, 12, 1.25, 12.5], "texture": "#0"}, + "south": {"uv": [3, 10, 4, 10.5], "texture": "#0"}, + "west": {"uv": [12, 1, 12.25, 1.5], "texture": "#0"}, + "up": {"uv": [11.75, 5, 10.75, 4.75], "texture": "#0"}, + "down": {"uv": [11.75, 5, 10.75, 5.25], "texture": "#0"} + } + }, + { + "from": [12, 3, 4], + "to": [13, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 9.5, 2.25, 12], "texture": "#0"}, + "east": {"uv": [2.5, 0, 4.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.25, 9.5, 2.5, 12], "texture": "#0"}, + "west": {"uv": [2.5, 2.5, 4.5, 5], "texture": "#0"}, + "up": {"uv": [4.25, 12, 4, 10], "texture": "#0"}, + "down": {"uv": [10.25, 4, 10, 6], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [4, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.5, 9.5, 2.75, 12], "texture": "#0"}, + "east": {"uv": [4.5, 0, 6.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.75, 9.5, 3, 12], "texture": "#0"}, + "west": {"uv": [4.5, 2.5, 6.5, 5], "texture": "#0"}, + "up": {"uv": [4.5, 12, 4.25, 10], "texture": "#0"}, + "down": {"uv": [4.75, 10, 4.5, 12], "texture": "#0"} + } + }, + { + "name": "base", + "from": [4, 3, 3], + "to": [12, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 5, 2, 7.5], "texture": "#0"}, + "east": {"uv": [0, 0, 2.5, 2.5], "texture": "#0"}, + "south": {"uv": [2, 5, 4, 7.5], "texture": "#0"}, + "west": {"uv": [0, 2.5, 2.5, 5], "texture": "#0"}, + "up": {"uv": [6, 7.5, 4, 5], "texture": "#0"}, + "down": {"uv": [8, 5, 6, 7.5], "texture": "#0"} + } + }, + { + "from": [4, 4, 13], + "to": [12, 12, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.5, 0, 8.5, 2], "texture": "#0"}, + "east": {"uv": [4.75, 10, 5, 12], "texture": "#0"}, + "south": {"uv": [6.5, 2, 8.5, 4], "texture": "#0"}, + "west": {"uv": [5, 10, 5.25, 12], "texture": "#0"}, + "up": {"uv": [7.25, 10.25, 5.25, 10], "texture": "#0"}, + "down": {"uv": [12, 6, 10, 6.25], "texture": "#0"} + } + }, + { + "from": [4, 13, 4], + "to": [12, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 6.25, 12, 6.5], "texture": "#0"}, + "east": {"uv": [10, 6.5, 12, 6.75], "texture": "#0"}, + "south": {"uv": [10, 6.75, 12, 7], "texture": "#0"}, + "west": {"uv": [10, 7, 12, 7.25], "texture": "#0"}, + "up": {"uv": [2, 9.5, 0, 7.5], "texture": "#0"}, + "down": {"uv": [4, 7.5, 2, 9.5], "texture": "#0"} + } + }, + { + "from": [13, 4, 4], + "to": [14, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.25, 10, 7.5, 12], "texture": "#0"}, + "east": {"uv": [4, 7.5, 6, 9.5], "texture": "#0"}, + "south": {"uv": [10, 7.25, 10.25, 9.25], "texture": "#0"}, + "west": {"uv": [6, 7.5, 8, 9.5], "texture": "#0"}, + "up": {"uv": [7.75, 12, 7.5, 10], "texture": "#0"}, + "down": {"uv": [8, 10, 7.75, 12], "texture": "#0"} + } + }, + { + "from": [4, 4, 2], + "to": [12, 12, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 4, 10, 6], "texture": "#0"}, + "east": {"uv": [8, 10, 8.25, 12], "texture": "#0"}, + "south": {"uv": [8, 6, 10, 8], "texture": "#0"}, + "west": {"uv": [8.25, 10, 8.5, 12], "texture": "#0"}, + "up": {"uv": [10.5, 10.25, 8.5, 10], "texture": "#0"}, + "down": {"uv": [12, 9.25, 10, 9.5], "texture": "#0"} + } + }, + { + "from": [4, 2, 4], + "to": [12, 3, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.5, 12, 9.75], "texture": "#0"}, + "east": {"uv": [10, 9.75, 12, 10], "texture": "#0"}, + "south": {"uv": [10.25, 4, 12.25, 4.25], "texture": "#0"}, + "west": {"uv": [10.25, 4.25, 12.25, 4.5], "texture": "#0"}, + "up": {"uv": [10, 10, 8, 8], "texture": "#0"}, + "down": {"uv": [10.5, 0, 8.5, 2], "texture": "#0"} + } + }, + { + "from": [2, 4, 4], + "to": [3, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.25, 10.25, 5.5, 12.25], "texture": "#0"}, + "east": {"uv": [8.5, 2, 10.5, 4], "texture": "#0"}, + "south": {"uv": [5.5, 10.25, 5.75, 12.25], "texture": "#0"}, + "west": {"uv": [0, 9.5, 2, 11.5], "texture": "#0"}, + "up": {"uv": [6, 12.25, 5.75, 10.25], "texture": "#0"}, + "down": {"uv": [6.25, 10.25, 6, 12.25], "texture": "#0"} + } + }, + { + "from": [5.25, 9.75, 1], + "to": [7.25, 10.75, 2], + "rotation": {"angle": 0, "axis": "z", "origin": [7.87374, 8.14142, 1.5]}, + "faces": { + "north": {"uv": [1.25, 12, 1.75, 12.25], "texture": "#0"}, + "east": {"uv": [0.75, 12.75, 1, 13], "texture": "#0"}, + "south": {"uv": [12, 1.5, 12.5, 1.75], "texture": "#0"}, + "west": {"uv": [12.75, 0.75, 13, 1], "texture": "#0"}, + "up": {"uv": [2.25, 12.25, 1.75, 12], "texture": "#0"}, + "down": {"uv": [12.5, 1.75, 12, 2], "texture": "#0"} + } + }, + { + "from": [5.25, 8.75, 1], + "to": [6.25, 9.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [7.87374, 8.14142, 1.5]}, + "faces": { + "north": {"uv": [1, 12.75, 1.25, 13], "texture": "#0"}, + "east": {"uv": [12.75, 1, 13, 1.25], "texture": "#0"}, + "south": {"uv": [1.25, 12.75, 1.5, 13], "texture": "#0"}, + "west": {"uv": [12.75, 1.25, 13, 1.5], "texture": "#0"}, + "up": {"uv": [1.75, 13, 1.5, 12.75], "texture": "#0"}, + "down": {"uv": [2, 12.75, 1.75, 13], "texture": "#0"} + } + }, + { + "from": [6.25, 7.75, 1], + "to": [7.25, 8.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [7.87374, 8.14142, 1.5]}, + "faces": { + "north": {"uv": [2, 12.75, 2.25, 13], "texture": "#0"}, + "east": {"uv": [2.25, 12.75, 2.5, 13], "texture": "#0"}, + "south": {"uv": [2.5, 12.75, 2.75, 13], "texture": "#0"}, + "west": {"uv": [2.75, 12.75, 3, 13], "texture": "#0"}, + "up": {"uv": [3.25, 13, 3, 12.75], "texture": "#0"}, + "down": {"uv": [3.5, 12.75, 3.25, 13], "texture": "#0"} + } + }, + { + "from": [6.25, 8.75, 1], + "to": [8.25, 9.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [7.87374, 8.14142, 1.5]}, + "faces": { + "north": {"uv": [12, 2, 12.5, 2.25], "texture": "#0"}, + "east": {"uv": [12.75, 3.25, 13, 3.5], "texture": "#0"}, + "south": {"uv": [2.25, 12, 2.75, 12.25], "texture": "#0"}, + "west": {"uv": [3.5, 12.75, 3.75, 13], "texture": "#0"}, + "up": {"uv": [12.5, 2.5, 12, 2.25], "texture": "#0"}, + "down": {"uv": [12.5, 2.5, 12, 2.75], "texture": "#0"} + } + }, + { + "from": [7.25, 6.75, 1], + "to": [9.25, 8.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [7.87374, 8.14142, 1.5]}, + "faces": { + "north": {"uv": [10.75, 5.25, 11.25, 5.75], "texture": "#0"}, + "east": {"uv": [2.75, 12, 3, 12.5], "texture": "#0"}, + "south": {"uv": [6.25, 10.75, 6.75, 11.25], "texture": "#0"}, + "west": {"uv": [3, 12, 3.25, 12.5], "texture": "#0"}, + "up": {"uv": [3.75, 12.25, 3.25, 12], "texture": "#0"}, + "down": {"uv": [4.25, 12, 3.75, 12.25], "texture": "#0"} + } + }, + { + "from": [9.53789, 8.3307, 1], + "to": [11.53789, 8.6307, 2], + "rotation": {"angle": -45, "axis": "z", "origin": [7.87374, 8.14142, 1.5]}, + "faces": { + "north": {"uv": [4.25, 12, 4.75, 12.25], "texture": "#0"}, + "east": {"uv": [3.75, 12.75, 4, 13], "texture": "#0"}, + "south": {"uv": [4.75, 12, 5.25, 12.25], "texture": "#0"}, + "west": {"uv": [4, 12.75, 4.25, 13], "texture": "#0"}, + "up": {"uv": [12.5, 5, 12, 4.75], "texture": "#0"}, + "down": {"uv": [12.5, 5, 12, 5.25], "texture": "#0"} + } + }, + { + "from": [9.67932, 7.96764, 1], + "to": [11.53732, 8.33264, 2], + "rotation": {"angle": -45, "axis": "z", "origin": [7.87374, 8.14142, 1.5]}, + "faces": { + "north": {"uv": [12, 5.25, 12.5, 5.5], "texture": "#0"}, + "east": {"uv": [12.75, 4, 13, 4.25], "texture": "#0"}, + "south": {"uv": [12, 5.5, 12.5, 5.75], "texture": "#0"}, + "west": {"uv": [4.25, 12.75, 4.5, 13], "texture": "#0"}, + "up": {"uv": [12.5, 6.25, 12, 6], "texture": "#0"}, + "down": {"uv": [12.5, 6.25, 12, 6.5], "texture": "#0"} + } + }, + { + "from": [9.53789, 7.67359, 1], + "to": [11.53789, 7.97359, 2], + "rotation": {"angle": -45, "axis": "z", "origin": [7.87374, 8.14142, 1.5]}, + "faces": { + "north": {"uv": [12, 6.5, 12.5, 6.75], "texture": "#0"}, + "east": {"uv": [4.5, 12.75, 4.75, 13], "texture": "#0"}, + "south": {"uv": [6.75, 12, 7.25, 12.25], "texture": "#0"}, + "west": {"uv": [4.75, 12.75, 5, 13], "texture": "#0"}, + "up": {"uv": [12.5, 7, 12, 6.75], "texture": "#0"}, + "down": {"uv": [12.5, 7, 12, 7.25], "texture": "#0"} + } + }, + { + "from": [5.25, 9.75, 14], + "to": [7.25, 10.75, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7.87374, 8.14142, 14.5]}, + "faces": { + "north": {"uv": [7.25, 12, 7.75, 12.25], "texture": "#0"}, + "east": {"uv": [5, 12.75, 5.25, 13], "texture": "#0"}, + "south": {"uv": [12, 7.25, 12.5, 7.5], "texture": "#0"}, + "west": {"uv": [5.25, 12.75, 5.5, 13], "texture": "#0"}, + "up": {"uv": [12.5, 7.75, 12, 7.5], "texture": "#0"}, + "down": {"uv": [8.25, 12, 7.75, 12.25], "texture": "#0"} + } + }, + { + "from": [5.25, 8.75, 14], + "to": [6.25, 9.75, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7.87374, 8.14142, 14.5]}, + "faces": { + "north": {"uv": [5.5, 12.75, 5.75, 13], "texture": "#0"}, + "east": {"uv": [5.75, 12.75, 6, 13], "texture": "#0"}, + "south": {"uv": [12.75, 5.75, 13, 6], "texture": "#0"}, + "west": {"uv": [6, 12.75, 6.25, 13], "texture": "#0"}, + "up": {"uv": [6.5, 13, 6.25, 12.75], "texture": "#0"}, + "down": {"uv": [6.75, 12.75, 6.5, 13], "texture": "#0"} + } + }, + { + "from": [6.25, 7.75, 14], + "to": [7.25, 8.75, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7.87374, 8.14142, 14.5]}, + "faces": { + "north": {"uv": [12.75, 6.5, 13, 6.75], "texture": "#0"}, + "east": {"uv": [6.75, 12.75, 7, 13], "texture": "#0"}, + "south": {"uv": [12.75, 6.75, 13, 7], "texture": "#0"}, + "west": {"uv": [7, 12.75, 7.25, 13], "texture": "#0"}, + "up": {"uv": [13, 7.25, 12.75, 7], "texture": "#0"}, + "down": {"uv": [7.5, 12.75, 7.25, 13], "texture": "#0"} + } + }, + { + "from": [6.25, 8.75, 14], + "to": [8.25, 9.75, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7.87374, 8.14142, 14.5]}, + "faces": { + "north": {"uv": [12, 7.75, 12.5, 8], "texture": "#0"}, + "east": {"uv": [12.75, 7.25, 13, 7.5], "texture": "#0"}, + "south": {"uv": [12, 8, 12.5, 8.25], "texture": "#0"}, + "west": {"uv": [7.5, 12.75, 7.75, 13], "texture": "#0"}, + "up": {"uv": [12.5, 8.5, 12, 8.25], "texture": "#0"}, + "down": {"uv": [12.5, 8.5, 12, 8.75], "texture": "#0"} + } + }, + { + "from": [7.25, 6.75, 14], + "to": [9.25, 8.75, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7.87374, 8.14142, 14.5]}, + "faces": { + "north": {"uv": [6.75, 10.75, 7.25, 11.25], "texture": "#0"}, + "east": {"uv": [8.25, 12, 8.5, 12.5], "texture": "#0"}, + "south": {"uv": [10.75, 7.25, 11.25, 7.75], "texture": "#0"}, + "west": {"uv": [8.75, 12, 9, 12.5], "texture": "#0"}, + "up": {"uv": [9.5, 12.25, 9, 12], "texture": "#0"}, + "down": {"uv": [12.5, 9.25, 12, 9.5], "texture": "#0"} + } + }, + { + "from": [9.53789, 8.3307, 14], + "to": [11.53789, 8.6307, 15], + "rotation": {"angle": -45, "axis": "z", "origin": [7.87374, 8.14142, 14.5]}, + "faces": { + "north": {"uv": [9.5, 12, 10, 12.25], "texture": "#0"}, + "east": {"uv": [12.75, 7.5, 13, 7.75], "texture": "#0"}, + "south": {"uv": [12, 9.5, 12.5, 9.75], "texture": "#0"}, + "west": {"uv": [7.75, 12.75, 8, 13], "texture": "#0"}, + "up": {"uv": [12.5, 10, 12, 9.75], "texture": "#0"}, + "down": {"uv": [12.5, 10.25, 12, 10.5], "texture": "#0"} + } + }, + { + "from": [9.67932, 7.96764, 14], + "to": [11.53732, 8.33264, 15], + "rotation": {"angle": -45, "axis": "z", "origin": [7.87374, 8.14142, 14.5]}, + "faces": { + "north": {"uv": [10.5, 12, 11, 12.25], "texture": "#0"}, + "east": {"uv": [12.75, 7.75, 13, 8], "texture": "#0"}, + "south": {"uv": [12, 10.5, 12.5, 10.75], "texture": "#0"}, + "west": {"uv": [8, 12.75, 8.25, 13], "texture": "#0"}, + "up": {"uv": [12.5, 11, 12, 10.75], "texture": "#0"}, + "down": {"uv": [12.5, 11, 12, 11.25], "texture": "#0"} + } + }, + { + "from": [9.53789, 7.67359, 14], + "to": [11.53789, 7.97359, 15], + "rotation": {"angle": -45, "axis": "z", "origin": [7.87374, 8.14142, 14.5]}, + "faces": { + "north": {"uv": [12, 11.75, 12.5, 12], "texture": "#0"}, + "east": {"uv": [12.75, 8, 13, 8.25], "texture": "#0"}, + "south": {"uv": [12, 12, 12.5, 12.25], "texture": "#0"}, + "west": {"uv": [8.25, 12.75, 8.5, 13], "texture": "#0"}, + "up": {"uv": [12.75, 0.25, 12.25, 0], "texture": "#0"}, + "down": {"uv": [12.75, 0.25, 12.25, 0.5], "texture": "#0"} + } + }, + { + "from": [13.97374, 9.75, 8.62374], + "to": [14.97374, 10.75, 10.62374], + "rotation": {"angle": 0, "axis": "y", "origin": [14.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [12.75, 8.25, 13, 8.5], "texture": "#0"}, + "east": {"uv": [12.25, 0.5, 12.75, 0.75], "texture": "#0"}, + "south": {"uv": [8.5, 12.75, 8.75, 13], "texture": "#0"}, + "west": {"uv": [12.25, 0.75, 12.75, 1], "texture": "#0"}, + "up": {"uv": [10.25, 12.5, 10, 12], "texture": "#0"}, + "down": {"uv": [11.75, 12, 11.5, 12.5], "texture": "#0"} + } + }, + { + "from": [13.97374, 8.75, 9.62374], + "to": [14.97374, 9.75, 10.62374], + "rotation": {"angle": 0, "axis": "y", "origin": [14.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [12.75, 8.5, 13, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 12.75, 9, 13], "texture": "#0"}, + "south": {"uv": [12.75, 8.75, 13, 9], "texture": "#0"}, + "west": {"uv": [9, 12.75, 9.25, 13], "texture": "#0"}, + "up": {"uv": [13, 9.25, 12.75, 9], "texture": "#0"}, + "down": {"uv": [9.5, 12.75, 9.25, 13], "texture": "#0"} + } + }, + { + "from": [13.97374, 7.75, 8.62374], + "to": [14.97374, 8.75, 9.62374], + "rotation": {"angle": 0, "axis": "y", "origin": [14.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [12.75, 9.25, 13, 9.5], "texture": "#0"}, + "east": {"uv": [9.5, 12.75, 9.75, 13], "texture": "#0"}, + "south": {"uv": [12.75, 9.5, 13, 9.75], "texture": "#0"}, + "west": {"uv": [9.75, 12.75, 10, 13], "texture": "#0"}, + "up": {"uv": [13, 10, 12.75, 9.75], "texture": "#0"}, + "down": {"uv": [10.25, 12.75, 10, 13], "texture": "#0"} + } + }, + { + "from": [13.97374, 8.75, 7.62374], + "to": [14.97374, 9.75, 9.62374], + "rotation": {"angle": 0, "axis": "y", "origin": [14.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [12.75, 10, 13, 10.25], "texture": "#0"}, + "east": {"uv": [12.25, 1, 12.75, 1.25], "texture": "#0"}, + "south": {"uv": [10.25, 12.75, 10.5, 13], "texture": "#0"}, + "west": {"uv": [1.25, 12.25, 1.75, 12.5], "texture": "#0"}, + "up": {"uv": [2, 12.75, 1.75, 12.25], "texture": "#0"}, + "down": {"uv": [2.25, 12.25, 2, 12.75], "texture": "#0"} + } + }, + { + "from": [13.97374, 6.75, 6.62374], + "to": [14.97374, 8.75, 8.62374], + "rotation": {"angle": 0, "axis": "y", "origin": [14.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [2.25, 12.25, 2.5, 12.75], "texture": "#0"}, + "east": {"uv": [10.75, 7.75, 11.25, 8.25], "texture": "#0"}, + "south": {"uv": [2.5, 12.25, 2.75, 12.75], "texture": "#0"}, + "west": {"uv": [10.75, 8.25, 11.25, 8.75], "texture": "#0"}, + "up": {"uv": [12.5, 3.25, 12.25, 2.75], "texture": "#0"}, + "down": {"uv": [3.5, 12.25, 3.25, 12.75], "texture": "#0"} + } + }, + { + "from": [13.97374, 8.3307, 4.33585], + "to": [14.97374, 8.6307, 6.33585], + "rotation": {"angle": -45, "axis": "x", "origin": [14.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [12.75, 10.25, 13, 10.5], "texture": "#0"}, + "east": {"uv": [12.25, 1.25, 12.75, 1.5], "texture": "#0"}, + "south": {"uv": [10.5, 12.75, 10.75, 13], "texture": "#0"}, + "west": {"uv": [12.25, 3.25, 12.75, 3.5], "texture": "#0"}, + "up": {"uv": [3.75, 12.75, 3.5, 12.25], "texture": "#0"}, + "down": {"uv": [12.5, 3.5, 12.25, 4], "texture": "#0"} + } + }, + { + "from": [13.97374, 7.96764, 4.33643], + "to": [14.97374, 8.33264, 6.19443], + "rotation": {"angle": -45, "axis": "x", "origin": [14.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [12.75, 10.5, 13, 10.75], "texture": "#0"}, + "east": {"uv": [3.75, 12.25, 4.25, 12.5], "texture": "#0"}, + "south": {"uv": [10.75, 12.75, 11, 13], "texture": "#0"}, + "west": {"uv": [12.25, 4, 12.75, 4.25], "texture": "#0"}, + "up": {"uv": [4.5, 12.75, 4.25, 12.25], "texture": "#0"}, + "down": {"uv": [12.5, 4.25, 12.25, 4.75], "texture": "#0"} + } + }, + { + "from": [13.97374, 7.67359, 4.33585], + "to": [14.97374, 7.97359, 6.33585], + "rotation": {"angle": -45, "axis": "x", "origin": [14.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [12.75, 10.75, 13, 11], "texture": "#0"}, + "east": {"uv": [4.5, 12.25, 5, 12.5], "texture": "#0"}, + "south": {"uv": [11, 12.75, 11.25, 13], "texture": "#0"}, + "west": {"uv": [5, 12.25, 5.5, 12.5], "texture": "#0"}, + "up": {"uv": [5.75, 12.75, 5.5, 12.25], "texture": "#0"}, + "down": {"uv": [6, 12.25, 5.75, 12.75], "texture": "#0"} + } + }, + { + "from": [0.97374, 9.75, 8.62374], + "to": [1.97374, 10.75, 10.62374], + "rotation": {"angle": 0, "axis": "y", "origin": [1.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [12.75, 11, 13, 11.25], "texture": "#0"}, + "east": {"uv": [12.25, 5.75, 12.75, 6], "texture": "#0"}, + "south": {"uv": [11.25, 12.75, 11.5, 13], "texture": "#0"}, + "west": {"uv": [6, 12.25, 6.5, 12.5], "texture": "#0"}, + "up": {"uv": [6.75, 12.75, 6.5, 12.25], "texture": "#0"}, + "down": {"uv": [7, 12.25, 6.75, 12.75], "texture": "#0"} + } + }, + { + "from": [0.97374, 8.75, 9.62374], + "to": [1.97374, 9.75, 10.62374], + "rotation": {"angle": 0, "axis": "y", "origin": [1.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [12.75, 11.25, 13, 11.5], "texture": "#0"}, + "east": {"uv": [11.5, 12.75, 11.75, 13], "texture": "#0"}, + "south": {"uv": [12.75, 11.5, 13, 11.75], "texture": "#0"}, + "west": {"uv": [11.75, 12.75, 12, 13], "texture": "#0"}, + "up": {"uv": [13, 12, 12.75, 11.75], "texture": "#0"}, + "down": {"uv": [12.25, 12.75, 12, 13], "texture": "#0"} + } + }, + { + "from": [0.97374, 7.75, 8.62374], + "to": [1.97374, 8.75, 9.62374], + "rotation": {"angle": 0, "axis": "y", "origin": [1.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [12.75, 12, 13, 12.25], "texture": "#0"}, + "east": {"uv": [12.25, 12.75, 12.5, 13], "texture": "#0"}, + "south": {"uv": [12.75, 12.25, 13, 12.5], "texture": "#0"}, + "west": {"uv": [12.5, 12.75, 12.75, 13], "texture": "#0"}, + "up": {"uv": [13, 12.75, 12.75, 12.5], "texture": "#0"}, + "down": {"uv": [13, 12.75, 12.75, 13], "texture": "#0"} + } + }, + { + "from": [0.97374, 8.75, 7.62374], + "to": [1.97374, 9.75, 9.62374], + "rotation": {"angle": 0, "axis": "y", "origin": [1.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [0, 13, 0.25, 13.25], "texture": "#0"}, + "east": {"uv": [7, 12.25, 7.5, 12.5], "texture": "#0"}, + "south": {"uv": [13, 0, 13.25, 0.25], "texture": "#0"}, + "west": {"uv": [7.5, 12.25, 8, 12.5], "texture": "#0"}, + "up": {"uv": [8.25, 12.75, 8, 12.25], "texture": "#0"}, + "down": {"uv": [8.75, 12.25, 8.5, 12.75], "texture": "#0"} + } + }, + { + "from": [0.97374, 6.75, 6.62374], + "to": [1.97374, 8.75, 8.62374], + "rotation": {"angle": 0, "axis": "y", "origin": [1.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [12.25, 8.75, 12.5, 9.25], "texture": "#0"}, + "east": {"uv": [8.5, 10.75, 9, 11.25], "texture": "#0"}, + "south": {"uv": [9, 12.25, 9.25, 12.75], "texture": "#0"}, + "west": {"uv": [10.75, 8.75, 11.25, 9.25], "texture": "#0"}, + "up": {"uv": [9.5, 12.75, 9.25, 12.25], "texture": "#0"}, + "down": {"uv": [9.75, 12.25, 9.5, 12.75], "texture": "#0"} + } + }, + { + "from": [0.97374, 8.3307, 4.33585], + "to": [1.97374, 8.6307, 6.33585], + "rotation": {"angle": -45, "axis": "x", "origin": [1.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [0.25, 13, 0.5, 13.25], "texture": "#0"}, + "east": {"uv": [12.25, 10, 12.75, 10.25], "texture": "#0"}, + "south": {"uv": [13, 0.25, 13.25, 0.5], "texture": "#0"}, + "west": {"uv": [10.25, 12.25, 10.75, 12.5], "texture": "#0"}, + "up": {"uv": [10, 12.75, 9.75, 12.25], "texture": "#0"}, + "down": {"uv": [11, 12.25, 10.75, 12.75], "texture": "#0"} + } + }, + { + "from": [0.97374, 7.96764, 4.33643], + "to": [1.97374, 8.33264, 6.19443], + "rotation": {"angle": -45, "axis": "x", "origin": [1.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [0.5, 13, 0.75, 13.25], "texture": "#0"}, + "east": {"uv": [11, 12.25, 11.5, 12.5], "texture": "#0"}, + "south": {"uv": [13, 0.5, 13.25, 0.75], "texture": "#0"}, + "west": {"uv": [12.25, 11.25, 12.75, 11.5], "texture": "#0"}, + "up": {"uv": [12, 12.75, 11.75, 12.25], "texture": "#0"}, + "down": {"uv": [12.25, 12.25, 12, 12.75], "texture": "#0"} + } + }, + { + "from": [0.97374, 7.67359, 4.33585], + "to": [1.97374, 7.97359, 6.33585], + "rotation": {"angle": -45, "axis": "x", "origin": [1.47374, 8.14142, 8]}, + "faces": { + "north": {"uv": [0.75, 13, 1, 13.25], "texture": "#0"}, + "east": {"uv": [12.25, 11.5, 12.75, 11.75], "texture": "#0"}, + "south": {"uv": [13, 0.75, 13.25, 1], "texture": "#0"}, + "west": {"uv": [12.25, 12.25, 12.75, 12.5], "texture": "#0"}, + "up": {"uv": [0.25, 13, 0, 12.5], "texture": "#0"}, + "down": {"uv": [0.5, 12.5, 0.25, 13], "texture": "#0"} + } + }, + { + "from": [5.25, 13.89142, 5.39142], + "to": [7.25, 14.89142, 6.39142], + "rotation": {"angle": 0, "axis": "x", "origin": [7.87374, 14.39142, 8]}, + "faces": { + "north": {"uv": [0.5, 12.5, 1, 12.75], "texture": "#0"}, + "east": {"uv": [1, 13, 1.25, 13.25], "texture": "#0"}, + "south": {"uv": [1, 12.5, 1.5, 12.75], "texture": "#0"}, + "west": {"uv": [13, 1, 13.25, 1.25], "texture": "#0"}, + "up": {"uv": [13, 1.75, 12.5, 1.5], "texture": "#0"}, + "down": {"uv": [13, 1.75, 12.5, 2], "texture": "#0"} + } + }, + { + "from": [5.25, 13.89142, 6.39142], + "to": [6.25, 14.89142, 7.39142], + "rotation": {"angle": 0, "axis": "x", "origin": [7.87374, 14.39142, 8]}, + "faces": { + "north": {"uv": [1.25, 13, 1.5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 1.25, 13.25, 1.5], "texture": "#0"}, + "south": {"uv": [1.5, 13, 1.75, 13.25], "texture": "#0"}, + "west": {"uv": [13, 1.5, 13.25, 1.75], "texture": "#0"}, + "up": {"uv": [2, 13.25, 1.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 1.75, 13, 2], "texture": "#0"} + } + }, + { + "from": [6.25, 13.89142, 7.39142], + "to": [7.25, 14.89142, 8.39142], + "rotation": {"angle": 0, "axis": "x", "origin": [7.87374, 14.39142, 8]}, + "faces": { + "north": {"uv": [2, 13, 2.25, 13.25], "texture": "#0"}, + "east": {"uv": [13, 2, 13.25, 2.25], "texture": "#0"}, + "south": {"uv": [2.25, 13, 2.5, 13.25], "texture": "#0"}, + "west": {"uv": [13, 2.25, 13.25, 2.5], "texture": "#0"}, + "up": {"uv": [2.75, 13.25, 2.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 2.5, 13, 2.75], "texture": "#0"} + } + }, + { + "from": [6.25, 13.89142, 6.39142], + "to": [8.25, 14.89142, 7.39142], + "rotation": {"angle": 0, "axis": "x", "origin": [7.87374, 14.39142, 8]}, + "faces": { + "north": {"uv": [12.5, 2, 13, 2.25], "texture": "#0"}, + "east": {"uv": [2.75, 13, 3, 13.25], "texture": "#0"}, + "south": {"uv": [12.5, 2.25, 13, 2.5], "texture": "#0"}, + "west": {"uv": [13, 2.75, 13.25, 3], "texture": "#0"}, + "up": {"uv": [13, 2.75, 12.5, 2.5], "texture": "#0"}, + "down": {"uv": [3.25, 12.5, 2.75, 12.75], "texture": "#0"} + } + }, + { + "from": [7.25, 13.89142, 7.39142], + "to": [9.25, 14.89142, 9.39142], + "rotation": {"angle": 0, "axis": "x", "origin": [7.87374, 14.39142, 8]}, + "faces": { + "north": {"uv": [12.5, 2.75, 13, 3], "texture": "#0"}, + "east": {"uv": [12.5, 3, 13, 3.25], "texture": "#0"}, + "south": {"uv": [12.5, 3.5, 13, 3.75], "texture": "#0"}, + "west": {"uv": [3.75, 12.5, 4.25, 12.75], "texture": "#0"}, + "up": {"uv": [9.5, 11.25, 9, 10.75], "texture": "#0"}, + "down": {"uv": [10, 10.75, 9.5, 11.25], "texture": "#0"} + } + }, + { + "from": [9.53789, 13.89142, 7.51072], + "to": [11.53789, 14.89142, 7.81072], + "rotation": {"angle": -45, "axis": "y", "origin": [7.87374, 14.39142, 8]}, + "faces": { + "north": {"uv": [12.5, 3.75, 13, 4], "texture": "#0"}, + "east": {"uv": [3, 13, 3.25, 13.25], "texture": "#0"}, + "south": {"uv": [12.5, 4.25, 13, 4.5], "texture": "#0"}, + "west": {"uv": [13, 3, 13.25, 3.25], "texture": "#0"}, + "up": {"uv": [5, 12.75, 4.5, 12.5], "texture": "#0"}, + "down": {"uv": [13, 4.5, 12.5, 4.75], "texture": "#0"} + } + }, + { + "from": [9.67932, 13.89142, 7.80878], + "to": [11.53732, 14.89142, 8.17378], + "rotation": {"angle": -45, "axis": "y", "origin": [7.87374, 14.39142, 8]}, + "faces": { + "north": {"uv": [12.5, 4.75, 13, 5], "texture": "#0"}, + "east": {"uv": [3.25, 13, 3.5, 13.25], "texture": "#0"}, + "south": {"uv": [5, 12.5, 5.5, 12.75], "texture": "#0"}, + "west": {"uv": [13, 3.25, 13.25, 3.5], "texture": "#0"}, + "up": {"uv": [13, 5.25, 12.5, 5], "texture": "#0"}, + "down": {"uv": [13, 5.25, 12.5, 5.5], "texture": "#0"} + } + }, + { + "from": [9.53789, 13.89142, 8.16783], + "to": [11.53789, 14.89142, 8.46783], + "rotation": {"angle": -45, "axis": "y", "origin": [7.87374, 14.39142, 8]}, + "faces": { + "north": {"uv": [12.5, 5.5, 13, 5.75], "texture": "#0"}, + "east": {"uv": [3.5, 13, 3.75, 13.25], "texture": "#0"}, + "south": {"uv": [6, 12.5, 6.5, 12.75], "texture": "#0"}, + "west": {"uv": [13, 3.5, 13.25, 3.75], "texture": "#0"}, + "up": {"uv": [13, 6.25, 12.5, 6], "texture": "#0"}, + "down": {"uv": [13, 6.25, 12.5, 6.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "ornaments", + "origin": [3, 8, 3], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + }, + { + "name": "center", + "origin": [8, 8, 8], + "color": 0, + "children": [32, 33, 34] + }, + { + "name": "plates", + "origin": [8, 8, 8], + "color": 0, + "children": [35, 36, 37, 38, 39, 40] + }, + { + "name": "symbol", + "origin": [6, 8, 1], + "color": 0, + "children": [ + { + "name": "side1", + "origin": [11.5, 12.1, 1.5], + "color": 0, + "children": [41, 42, 43, 44, 45, 46, 47, 48] + }, + { + "name": "side2", + "origin": [11.5, 12.1, 1.5], + "color": 0, + "children": [49, 50, 51, 52, 53, 54, 55, 56] + }, + { + "name": "side3", + "origin": [11.5, 12.1, 1.5], + "color": 0, + "children": [57, 58, 59, 60, 61, 62, 63, 64] + }, + { + "name": "side4", + "origin": [11.5, 12.1, 1.5], + "color": 0, + "children": [65, 66, 67, 68, 69, 70, 71, 72] + }, + { + "name": "top", + "origin": [11.5, 12.1, 1.5], + "color": 0, + "children": [73, 74, 75, 76, 77, 78, 79, 80] + } + ] + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_1.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_1.json index 4b111cb3..ccba740c 100644 --- a/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_1.json +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_speed_1.json @@ -3,8 +3,8 @@ "credit": "Made with Blockbench", "texture_size": [64, 64], "textures": { - "0": "utilitiesinexcess:blocks/upgrade_speed_1", - "particle": "utilitiesinexcess:blocks/upgrade_speed_1" + "0": "utilitiesinexcess:upgrade_speed_1", + "particle": "utilitiesinexcess:upgrade_speed_1" }, "elements": [ { @@ -698,4 +698,4 @@ "children": [41, 42, 43, 44, 45, 46, 47, 48, 49, 50] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_world_hole.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_world_hole.json new file mode 100644 index 00000000..14c5b236 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/upgrade_world_hole.json @@ -0,0 +1,1382 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utilitiesinexcess:upgrade_world_hole", + "particle": "utilitiesinexcess:upgrade_world_hole" + }, + "elements": [ + { + "from": [2, 7, 3], + "to": [4, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.5, 4, 8, 4.5], "texture": "#0"}, + "east": {"uv": [12, 7.5, 12.25, 8], "texture": "#0"}, + "south": {"uv": [7.5, 4.5, 8, 5], "texture": "#0"}, + "west": {"uv": [8, 12, 8.25, 12.5], "texture": "#0"}, + "up": {"uv": [12.5, 8.25, 12, 8], "texture": "#0"}, + "down": {"uv": [12.5, 9.25, 12, 9.5], "texture": "#0"} + } + }, + { + "from": [3, 7, 2], + "to": [4, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8.25, 12, 8.5, 12.5], "texture": "#0"}, + "east": {"uv": [12, 9.5, 12.25, 10], "texture": "#0"}, + "south": {"uv": [10.25, 12, 10.5, 12.5], "texture": "#0"}, + "west": {"uv": [10.5, 12, 10.75, 12.5], "texture": "#0"}, + "up": {"uv": [12.5, 9.25, 12.25, 9], "texture": "#0"}, + "down": {"uv": [6.75, 12.75, 6.5, 13], "texture": "#0"} + } + }, + { + "from": [3, 11, 3], + "to": [4, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.75, 12, 11, 12.5], "texture": "#0"}, + "east": {"uv": [11, 12, 11.25, 12.5], "texture": "#0"}, + "south": {"uv": [11.75, 12, 12, 12.5], "texture": "#0"}, + "west": {"uv": [12, 12, 12.25, 12.5], "texture": "#0"}, + "up": {"uv": [7, 13, 6.75, 12.75], "texture": "#0"}, + "down": {"uv": [13, 6.75, 12.75, 7], "texture": "#0"} + } + }, + { + "from": [3, 3, 3], + "to": [4, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 1, 12.5, 1.5], "texture": "#0"}, + "east": {"uv": [12.25, 1.5, 12.5, 2], "texture": "#0"}, + "south": {"uv": [2, 12.25, 2.25, 12.75], "texture": "#0"}, + "west": {"uv": [2.25, 12.25, 2.5, 12.75], "texture": "#0"}, + "up": {"uv": [7.25, 13, 7, 12.75], "texture": "#0"}, + "down": {"uv": [13, 7, 12.75, 7.25], "texture": "#0"} + } + }, + { + "from": [3, 7, 12], + "to": [4, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.5, 12.25, 2.75, 12.75], "texture": "#0"}, + "east": {"uv": [10.25, 4.5, 10.75, 5], "texture": "#0"}, + "south": {"uv": [4, 12.25, 4.25, 12.75], "texture": "#0"}, + "west": {"uv": [10.25, 5, 10.75, 5.5], "texture": "#0"}, + "up": {"uv": [12.5, 4.5, 12.25, 4], "texture": "#0"}, + "down": {"uv": [4.5, 12.25, 4.25, 12.75], "texture": "#0"} + } + }, + { + "from": [2, 7, 12], + "to": [3, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [4.5, 12.25, 4.75, 12.75], "texture": "#0"}, + "east": {"uv": [5.25, 12.25, 5.5, 12.75], "texture": "#0"}, + "south": {"uv": [5.5, 12.25, 5.75, 12.75], "texture": "#0"}, + "west": {"uv": [5.75, 12.25, 6, 12.75], "texture": "#0"}, + "up": {"uv": [7.5, 13, 7.25, 12.75], "texture": "#0"}, + "down": {"uv": [13, 7.25, 12.75, 7.5], "texture": "#0"} + } + }, + { + "from": [3, 11, 12], + "to": [4, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6, 12.25, 6.25, 12.75], "texture": "#0"}, + "east": {"uv": [12.25, 6, 12.5, 6.5], "texture": "#0"}, + "south": {"uv": [6.25, 12.25, 6.5, 12.75], "texture": "#0"}, + "west": {"uv": [6.5, 12.25, 6.75, 12.75], "texture": "#0"}, + "up": {"uv": [7.75, 13, 7.5, 12.75], "texture": "#0"}, + "down": {"uv": [13, 7.5, 12.75, 7.75], "texture": "#0"} + } + }, + { + "from": [3, 3, 12], + "to": [4, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.75, 12.25, 7, 12.75], "texture": "#0"}, + "east": {"uv": [7, 12.25, 7.25, 12.75], "texture": "#0"}, + "south": {"uv": [7.25, 12.25, 7.5, 12.75], "texture": "#0"}, + "west": {"uv": [7.5, 12.25, 7.75, 12.75], "texture": "#0"}, + "up": {"uv": [8, 13, 7.75, 12.75], "texture": "#0"}, + "down": {"uv": [13, 7.75, 12.75, 8], "texture": "#0"} + } + }, + { + "from": [12, 7, 12], + "to": [14, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.25, 5.5, 10.75, 6], "texture": "#0"}, + "east": {"uv": [12.25, 7.5, 12.5, 8], "texture": "#0"}, + "south": {"uv": [6.25, 10.25, 6.75, 10.75], "texture": "#0"}, + "west": {"uv": [7.75, 12.25, 8, 12.75], "texture": "#0"}, + "up": {"uv": [12.75, 6.75, 12.25, 6.5], "texture": "#0"}, + "down": {"uv": [12.75, 8.25, 12.25, 8.5], "texture": "#0"} + } + }, + { + "from": [12, 7, 13], + "to": [13, 9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.25, 8.5, 12.5, 9], "texture": "#0"}, + "east": {"uv": [12.25, 9.5, 12.5, 10], "texture": "#0"}, + "south": {"uv": [12.25, 12, 12.5, 12.5], "texture": "#0"}, + "west": {"uv": [0, 12.5, 0.25, 13], "texture": "#0"}, + "up": {"uv": [13, 8.5, 12.75, 8.25], "texture": "#0"}, + "down": {"uv": [8.75, 12.75, 8.5, 13], "texture": "#0"} + } + }, + { + "from": [12, 11, 12], + "to": [13, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0.25, 12.5, 0.5, 13], "texture": "#0"}, + "east": {"uv": [0.5, 12.5, 0.75, 13], "texture": "#0"}, + "south": {"uv": [12.5, 0.5, 12.75, 1], "texture": "#0"}, + "west": {"uv": [0.75, 12.5, 1, 13], "texture": "#0"}, + "up": {"uv": [13, 8.75, 12.75, 8.5], "texture": "#0"}, + "down": {"uv": [9, 12.75, 8.75, 13], "texture": "#0"} + } + }, + { + "from": [12, 3, 12], + "to": [13, 5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [1, 12.5, 1.25, 13], "texture": "#0"}, + "east": {"uv": [12.5, 1, 12.75, 1.5], "texture": "#0"}, + "south": {"uv": [1.25, 12.5, 1.5, 13], "texture": "#0"}, + "west": {"uv": [1.5, 12.5, 1.75, 13], "texture": "#0"}, + "up": {"uv": [13, 9, 12.75, 8.75], "texture": "#0"}, + "down": {"uv": [9.25, 12.75, 9, 13], "texture": "#0"} + } + }, + { + "from": [12, 7, 2], + "to": [13, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 1.5, 12.75, 2], "texture": "#0"}, + "east": {"uv": [6.75, 10.25, 7.25, 10.75], "texture": "#0"}, + "south": {"uv": [1.75, 12.5, 2, 13], "texture": "#0"}, + "west": {"uv": [10.25, 7.25, 10.75, 7.75], "texture": "#0"}, + "up": {"uv": [3.25, 13, 3, 12.5], "texture": "#0"}, + "down": {"uv": [3.5, 12.5, 3.25, 13], "texture": "#0"} + } + }, + { + "from": [13, 7, 3], + "to": [14, 9, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3.5, 12.5, 3.75, 13], "texture": "#0"}, + "east": {"uv": [3.75, 12.5, 4, 13], "texture": "#0"}, + "south": {"uv": [12.5, 4, 12.75, 4.5], "texture": "#0"}, + "west": {"uv": [12.5, 6, 12.75, 6.5], "texture": "#0"}, + "up": {"uv": [13, 9.25, 12.75, 9], "texture": "#0"}, + "down": {"uv": [9.5, 12.75, 9.25, 13], "texture": "#0"} + } + }, + { + "from": [12, 11, 3], + "to": [13, 13, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 7.5, 12.75, 8], "texture": "#0"}, + "east": {"uv": [8, 12.5, 8.25, 13], "texture": "#0"}, + "south": {"uv": [8.25, 12.5, 8.5, 13], "texture": "#0"}, + "west": {"uv": [12.5, 8.5, 12.75, 9], "texture": "#0"}, + "up": {"uv": [13, 9.5, 12.75, 9.25], "texture": "#0"}, + "down": {"uv": [9.75, 12.75, 9.5, 13], "texture": "#0"} + } + }, + { + "from": [12, 3, 3], + "to": [13, 5, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.5, 9, 12.75, 9.5], "texture": "#0"}, + "east": {"uv": [12.5, 9.5, 12.75, 10], "texture": "#0"}, + "south": {"uv": [12.5, 10, 12.75, 10.5], "texture": "#0"}, + "west": {"uv": [10.25, 12.5, 10.5, 13], "texture": "#0"}, + "up": {"uv": [13, 9.75, 12.75, 9.5], "texture": "#0"}, + "down": {"uv": [10, 12.75, 9.75, 13], "texture": "#0"} + } + }, + { + "from": [7, 12, 2], + "to": [9, 14, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.25, 7.75, 10.75, 8.25], "texture": "#0"}, + "east": {"uv": [10.5, 12.5, 10.75, 13], "texture": "#0"}, + "south": {"uv": [10.25, 8.25, 10.75, 8.75], "texture": "#0"}, + "west": {"uv": [10.75, 12.5, 11, 13], "texture": "#0"}, + "up": {"uv": [13, 8.25, 12.5, 8], "texture": "#0"}, + "down": {"uv": [12, 12.5, 11.5, 12.75], "texture": "#0"} + } + }, + { + "from": [7, 13, 3], + "to": [9, 14, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12, 12.5, 12.5, 12.75], "texture": "#0"}, + "east": {"uv": [12.75, 9.75, 13, 10], "texture": "#0"}, + "south": {"uv": [12.5, 12, 13, 12.25], "texture": "#0"}, + "west": {"uv": [10, 12.75, 10.25, 13], "texture": "#0"}, + "up": {"uv": [13, 12.5, 12.5, 12.25], "texture": "#0"}, + "down": {"uv": [13, 12.5, 12.5, 12.75], "texture": "#0"} + } + }, + { + "from": [13, 12, 7], + "to": [14, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [11, 12.5, 11.25, 13], "texture": "#0"}, + "east": {"uv": [8.5, 10.25, 9, 10.75], "texture": "#0"}, + "south": {"uv": [12.75, 0, 13, 0.5], "texture": "#0"}, + "west": {"uv": [10.25, 8.75, 10.75, 9.25], "texture": "#0"}, + "up": {"uv": [13, 1, 12.75, 0.5], "texture": "#0"}, + "down": {"uv": [13, 1, 12.75, 1.5], "texture": "#0"} + } + }, + { + "from": [12, 13, 7], + "to": [13, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 10, 13, 10.25], "texture": "#0"}, + "east": {"uv": [12.75, 1.5, 13.25, 1.75], "texture": "#0"}, + "south": {"uv": [12.75, 10.25, 13, 10.5], "texture": "#0"}, + "west": {"uv": [12.75, 1.75, 13.25, 2], "texture": "#0"}, + "up": {"uv": [2.25, 13.25, 2, 12.75], "texture": "#0"}, + "down": {"uv": [13, 2, 12.75, 2.5], "texture": "#0"} + } + }, + { + "from": [7, 12, 13], + "to": [9, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [9, 10.25, 9.5, 10.75], "texture": "#0"}, + "east": {"uv": [2.25, 12.75, 2.5, 13.25], "texture": "#0"}, + "south": {"uv": [9.5, 10.25, 10, 10.75], "texture": "#0"}, + "west": {"uv": [2.5, 12.75, 2.75, 13.25], "texture": "#0"}, + "up": {"uv": [13.25, 2.75, 12.75, 2.5], "texture": "#0"}, + "down": {"uv": [13.25, 2.75, 12.75, 3], "texture": "#0"} + } + }, + { + "from": [7, 13, 12], + "to": [9, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 3, 13.25, 3.25], "texture": "#0"}, + "east": {"uv": [12.75, 10.5, 13, 10.75], "texture": "#0"}, + "south": {"uv": [12.75, 3.25, 13.25, 3.5], "texture": "#0"}, + "west": {"uv": [12.75, 10.75, 13, 11], "texture": "#0"}, + "up": {"uv": [13.25, 3.75, 12.75, 3.5], "texture": "#0"}, + "down": {"uv": [13.25, 3.75, 12.75, 4], "texture": "#0"} + } + }, + { + "from": [2, 12, 7], + "to": [3, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.75, 12.75, 3, 13.25], "texture": "#0"}, + "east": {"uv": [10, 10.25, 10.5, 10.75], "texture": "#0"}, + "south": {"uv": [4, 12.75, 4.25, 13.25], "texture": "#0"}, + "west": {"uv": [10.5, 0, 11, 0.5], "texture": "#0"}, + "up": {"uv": [13, 4.5, 12.75, 4], "texture": "#0"}, + "down": {"uv": [4.5, 12.75, 4.25, 13.25], "texture": "#0"} + } + }, + { + "from": [3, 13, 7], + "to": [4, 14, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 11, 13, 11.25], "texture": "#0"}, + "east": {"uv": [4.5, 12.75, 5, 13], "texture": "#0"}, + "south": {"uv": [11.25, 12.75, 11.5, 13], "texture": "#0"}, + "west": {"uv": [12.75, 4.5, 13.25, 4.75], "texture": "#0"}, + "up": {"uv": [13, 5.25, 12.75, 4.75], "texture": "#0"}, + "down": {"uv": [5.25, 12.75, 5, 13.25], "texture": "#0"} + } + }, + { + "from": [3, 2, 6], + "to": [4, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 11.25, 13, 11.5], "texture": "#0"}, + "east": {"uv": [10.5, 0.5, 11.5, 0.75], "texture": "#0"}, + "south": {"uv": [11.5, 12.75, 11.75, 13], "texture": "#0"}, + "west": {"uv": [10.5, 0.75, 11.5, 1], "texture": "#0"}, + "up": {"uv": [10.75, 2, 10.5, 1], "texture": "#0"}, + "down": {"uv": [10.75, 2, 10.5, 3], "texture": "#0"} + } + }, + { + "from": [2, 2, 6], + "to": [3, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.25, 12.75, 5.5, 13.25], "texture": "#0"}, + "east": {"uv": [6.5, 4, 7.5, 4.5], "texture": "#0"}, + "south": {"uv": [12.75, 5.25, 13, 5.75], "texture": "#0"}, + "west": {"uv": [6.5, 4.5, 7.5, 5], "texture": "#0"}, + "up": {"uv": [3.25, 11.5, 3, 10.5], "texture": "#0"}, + "down": {"uv": [10.75, 3, 10.5, 4], "texture": "#0"} + } + }, + { + "from": [6, 2, 12], + "to": [10, 3, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.5, 10, 11.5, 10.25], "texture": "#0"}, + "east": {"uv": [12.75, 11.5, 13, 11.75], "texture": "#0"}, + "south": {"uv": [10.5, 10.25, 11.5, 10.5], "texture": "#0"}, + "west": {"uv": [11.75, 12.75, 12, 13], "texture": "#0"}, + "up": {"uv": [11.5, 10.75, 10.5, 10.5], "texture": "#0"}, + "down": {"uv": [11.75, 1, 10.75, 1.25], "texture": "#0"} + } + }, + { + "from": [6, 2, 13], + "to": [10, 4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 9.5, 4, 10], "texture": "#0"}, + "east": {"uv": [5.5, 12.75, 5.75, 13.25], "texture": "#0"}, + "south": {"uv": [4, 9.5, 5, 10], "texture": "#0"}, + "west": {"uv": [5.75, 12.75, 6, 13.25], "texture": "#0"}, + "up": {"uv": [11.75, 1.5, 10.75, 1.25], "texture": "#0"}, + "down": {"uv": [11.75, 1.5, 10.75, 1.75], "texture": "#0"} + } + }, + { + "from": [12, 2, 6], + "to": [13, 3, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 11.75, 13, 12], "texture": "#0"}, + "east": {"uv": [10.75, 1.75, 11.75, 2], "texture": "#0"}, + "south": {"uv": [12, 12.75, 12.25, 13], "texture": "#0"}, + "west": {"uv": [10.75, 2, 11.75, 2.25], "texture": "#0"}, + "up": {"uv": [3.5, 11.5, 3.25, 10.5], "texture": "#0"}, + "down": {"uv": [3.75, 10.5, 3.5, 11.5], "texture": "#0"} + } + }, + { + "from": [13, 2, 6], + "to": [14, 4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [12.75, 5.75, 13, 6.25], "texture": "#0"}, + "east": {"uv": [5, 9.5, 6, 10], "texture": "#0"}, + "south": {"uv": [6, 12.75, 6.25, 13.25], "texture": "#0"}, + "west": {"uv": [6, 9.5, 7, 10], "texture": "#0"}, + "up": {"uv": [4, 11.5, 3.75, 10.5], "texture": "#0"}, + "down": {"uv": [11, 2.25, 10.75, 3.25], "texture": "#0"} + } + }, + { + "from": [6, 2, 3], + "to": [10, 3, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10.75, 3.25, 11.75, 3.5], "texture": "#0"}, + "east": {"uv": [12.25, 12.75, 12.5, 13], "texture": "#0"}, + "south": {"uv": [10.75, 3.5, 11.75, 3.75], "texture": "#0"}, + "west": {"uv": [12.5, 12.75, 12.75, 13], "texture": "#0"}, + "up": {"uv": [11.75, 4, 10.75, 3.75], "texture": "#0"}, + "down": {"uv": [11.75, 4.5, 10.75, 4.75], "texture": "#0"} + } + }, + { + "from": [6, 2, 2], + "to": [10, 4, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7, 9.5, 8, 10], "texture": "#0"}, + "east": {"uv": [6.25, 12.75, 6.5, 13.25], "texture": "#0"}, + "south": {"uv": [3, 10, 4, 10.5], "texture": "#0"}, + "west": {"uv": [12.75, 6.25, 13, 6.75], "texture": "#0"}, + "up": {"uv": [11.75, 5, 10.75, 4.75], "texture": "#0"}, + "down": {"uv": [11.75, 5, 10.75, 5.25], "texture": "#0"} + } + }, + { + "from": [12, 3, 4], + "to": [13, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2, 9.5, 2.25, 12], "texture": "#0"}, + "east": {"uv": [2.5, 0, 4.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.25, 9.5, 2.5, 12], "texture": "#0"}, + "west": {"uv": [2.5, 2.5, 4.5, 5], "texture": "#0"}, + "up": {"uv": [4.25, 12, 4, 10], "texture": "#0"}, + "down": {"uv": [10.25, 4, 10, 6], "texture": "#0"} + } + }, + { + "from": [3, 3, 4], + "to": [4, 13, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [2.5, 9.5, 2.75, 12], "texture": "#0"}, + "east": {"uv": [4.5, 0, 6.5, 2.5], "texture": "#0"}, + "south": {"uv": [2.75, 9.5, 3, 12], "texture": "#0"}, + "west": {"uv": [4.5, 2.5, 6.5, 5], "texture": "#0"}, + "up": {"uv": [4.5, 12, 4.25, 10], "texture": "#0"}, + "down": {"uv": [4.75, 10, 4.5, 12], "texture": "#0"} + } + }, + { + "name": "base", + "from": [4, 3, 3], + "to": [12, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 5, 2, 7.5], "texture": "#0"}, + "east": {"uv": [0, 0, 2.5, 2.5], "texture": "#0"}, + "south": {"uv": [2, 5, 4, 7.5], "texture": "#0"}, + "west": {"uv": [0, 2.5, 2.5, 5], "texture": "#0"}, + "up": {"uv": [6, 7.5, 4, 5], "texture": "#0"}, + "down": {"uv": [8, 5, 6, 7.5], "texture": "#0"} + } + }, + { + "from": [4, 4, 13], + "to": [12, 12, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [6.5, 0, 8.5, 2], "texture": "#0"}, + "east": {"uv": [4.75, 10, 5, 12], "texture": "#0"}, + "south": {"uv": [6.5, 2, 8.5, 4], "texture": "#0"}, + "west": {"uv": [5, 10, 5.25, 12], "texture": "#0"}, + "up": {"uv": [7.25, 10.25, 5.25, 10], "texture": "#0"}, + "down": {"uv": [12, 6, 10, 6.25], "texture": "#0"} + } + }, + { + "from": [4, 13, 4], + "to": [12, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 6.25, 12, 6.5], "texture": "#0"}, + "east": {"uv": [10, 6.5, 12, 6.75], "texture": "#0"}, + "south": {"uv": [10, 6.75, 12, 7], "texture": "#0"}, + "west": {"uv": [10, 7, 12, 7.25], "texture": "#0"}, + "up": {"uv": [2, 9.5, 0, 7.5], "texture": "#0"}, + "down": {"uv": [4, 7.5, 2, 9.5], "texture": "#0"} + } + }, + { + "from": [13, 4, 4], + "to": [14, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [7.25, 10, 7.5, 12], "texture": "#0"}, + "east": {"uv": [4, 7.5, 6, 9.5], "texture": "#0"}, + "south": {"uv": [10, 7.25, 10.25, 9.25], "texture": "#0"}, + "west": {"uv": [6, 7.5, 8, 9.5], "texture": "#0"}, + "up": {"uv": [7.75, 12, 7.5, 10], "texture": "#0"}, + "down": {"uv": [8, 10, 7.75, 12], "texture": "#0"} + } + }, + { + "from": [4, 4, 2], + "to": [12, 12, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [8, 4, 10, 6], "texture": "#0"}, + "east": {"uv": [8, 10, 8.25, 12], "texture": "#0"}, + "south": {"uv": [8, 6, 10, 8], "texture": "#0"}, + "west": {"uv": [8.25, 10, 8.5, 12], "texture": "#0"}, + "up": {"uv": [10.5, 10.25, 8.5, 10], "texture": "#0"}, + "down": {"uv": [12, 9.25, 10, 9.5], "texture": "#0"} + } + }, + { + "from": [4, 2, 4], + "to": [12, 3, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [10, 9.5, 12, 9.75], "texture": "#0"}, + "east": {"uv": [10, 9.75, 12, 10], "texture": "#0"}, + "south": {"uv": [10.25, 4, 12.25, 4.25], "texture": "#0"}, + "west": {"uv": [10.25, 4.25, 12.25, 4.5], "texture": "#0"}, + "up": {"uv": [10, 10, 8, 8], "texture": "#0"}, + "down": {"uv": [10.5, 0, 8.5, 2], "texture": "#0"} + } + }, + { + "from": [2, 4, 4], + "to": [3, 12, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.25, 10.25, 5.5, 12.25], "texture": "#0"}, + "east": {"uv": [8.5, 2, 10.5, 4], "texture": "#0"}, + "south": {"uv": [5.5, 10.25, 5.75, 12.25], "texture": "#0"}, + "west": {"uv": [0, 9.5, 2, 11.5], "texture": "#0"}, + "up": {"uv": [6, 12.25, 5.75, 10.25], "texture": "#0"}, + "down": {"uv": [6.25, 10.25, 6, 12.25], "texture": "#0"} + } + }, + { + "from": [6, 10.5, 1], + "to": [10, 11.5, 2], + "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [10.75, 5.25, 11.75, 5.5], "texture": "#0"}, + "east": {"uv": [12.75, 12.75, 13, 13], "texture": "#0"}, + "south": {"uv": [10.75, 5.5, 11.75, 5.75], "texture": "#0"}, + "west": {"uv": [0, 13, 0.25, 13.25], "texture": "#0"}, + "up": {"uv": [11.75, 6, 10.75, 5.75], "texture": "#0"}, + "down": {"uv": [7.25, 10.75, 6.25, 11], "texture": "#0"} + } + }, + { + "from": [6, 4.5, 1], + "to": [10, 5.5, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [10.75, 7.25, 11.75, 7.5], "texture": "#0"}, + "east": {"uv": [13, 0, 13.25, 0.25], "texture": "#0"}, + "south": {"uv": [10.75, 7.5, 11.75, 7.75], "texture": "#0"}, + "west": {"uv": [0.25, 13, 0.5, 13.25], "texture": "#0"}, + "up": {"uv": [11.75, 8, 10.75, 7.75], "texture": "#0"}, + "down": {"uv": [11.75, 8, 10.75, 8.25], "texture": "#0"} + } + }, + { + "from": [10.5, 6, 1], + "to": [11.5, 10, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [10.75, 8.25, 11, 9.25], "texture": "#0"}, + "east": {"uv": [8.5, 10.75, 8.75, 11.75], "texture": "#0"}, + "south": {"uv": [8.75, 10.75, 9, 11.75], "texture": "#0"}, + "west": {"uv": [9, 10.75, 9.25, 11.75], "texture": "#0"}, + "up": {"uv": [13.25, 0.5, 13, 0.25], "texture": "#0"}, + "down": {"uv": [0.75, 13, 0.5, 13.25], "texture": "#0"} + } + }, + { + "from": [10, 5, 1], + "to": [11, 6, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [13, 0.5, 13.25, 0.75], "texture": "#0"}, + "east": {"uv": [0.75, 13, 1, 13.25], "texture": "#0"}, + "south": {"uv": [13, 0.75, 13.25, 1], "texture": "#0"}, + "west": {"uv": [1, 13, 1.25, 13.25], "texture": "#0"}, + "up": {"uv": [13.25, 1.25, 13, 1], "texture": "#0"}, + "down": {"uv": [1.5, 13, 1.25, 13.25], "texture": "#0"} + } + }, + { + "from": [5, 5, 1], + "to": [6, 6, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [13, 1.25, 13.25, 1.5], "texture": "#0"}, + "east": {"uv": [1.5, 13, 1.75, 13.25], "texture": "#0"}, + "south": {"uv": [1.75, 13, 2, 13.25], "texture": "#0"}, + "west": {"uv": [13, 2, 13.25, 2.25], "texture": "#0"}, + "up": {"uv": [13.25, 2.5, 13, 2.25], "texture": "#0"}, + "down": {"uv": [3.25, 13, 3, 13.25], "texture": "#0"} + } + }, + { + "from": [5, 10, 1], + "to": [6, 11, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [3.25, 13, 3.5, 13.25], "texture": "#0"}, + "east": {"uv": [3.5, 13, 3.75, 13.25], "texture": "#0"}, + "south": {"uv": [3.75, 13, 4, 13.25], "texture": "#0"}, + "west": {"uv": [13, 4, 13.25, 4.25], "texture": "#0"}, + "up": {"uv": [13.25, 4.5, 13, 4.25], "texture": "#0"}, + "down": {"uv": [4.75, 13, 4.5, 13.25], "texture": "#0"} + } + }, + { + "from": [10, 10, 1], + "to": [11, 11, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [4.75, 13, 5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 4.75, 13.25, 5], "texture": "#0"}, + "south": {"uv": [13, 5, 13.25, 5.25], "texture": "#0"}, + "west": {"uv": [13, 5.25, 13.25, 5.5], "texture": "#0"}, + "up": {"uv": [13.25, 5.75, 13, 5.5], "texture": "#0"}, + "down": {"uv": [13.25, 5.75, 13, 6], "texture": "#0"} + } + }, + { + "from": [10, 5, 1], + "to": [11, 6, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [13, 6, 13.25, 6.25], "texture": "#0"}, + "east": {"uv": [13, 6.25, 13.25, 6.5], "texture": "#0"}, + "south": {"uv": [6.5, 13, 6.75, 13.25], "texture": "#0"}, + "west": {"uv": [13, 6.5, 13.25, 6.75], "texture": "#0"}, + "up": {"uv": [7, 13.25, 6.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 6.75, 13, 7], "texture": "#0"} + } + }, + { + "from": [4.5, 6, 1], + "to": [5.5, 10, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [9.25, 10.75, 9.5, 11.75], "texture": "#0"}, + "east": {"uv": [9.5, 10.75, 9.75, 11.75], "texture": "#0"}, + "south": {"uv": [9.75, 10.75, 10, 11.75], "texture": "#0"}, + "west": {"uv": [10, 10.75, 10.25, 11.75], "texture": "#0"}, + "up": {"uv": [7.25, 13.25, 7, 13], "texture": "#0"}, + "down": {"uv": [13.25, 7, 13, 7.25], "texture": "#0"} + } + }, + { + "from": [5.5, 8, 1], + "to": [6.5, 8.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [7.25, 13, 7.5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 7.25, 13.25, 7.5], "texture": "#0"}, + "south": {"uv": [7.5, 13, 7.75, 13.25], "texture": "#0"}, + "west": {"uv": [13, 7.5, 13.25, 7.75], "texture": "#0"}, + "up": {"uv": [8, 13.25, 7.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 7.75, 13, 8], "texture": "#0"} + } + }, + { + "from": [9.5, 8, 1], + "to": [10.5, 8.75, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [8, 13, 8.25, 13.25], "texture": "#0"}, + "east": {"uv": [13, 8, 13.25, 8.25], "texture": "#0"}, + "south": {"uv": [8.25, 13, 8.5, 13.25], "texture": "#0"}, + "west": {"uv": [13, 8.25, 13.25, 8.5], "texture": "#0"}, + "up": {"uv": [8.75, 13.25, 8.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 8.5, 13, 8.75], "texture": "#0"} + } + }, + { + "from": [6.5, 7.25, 1], + "to": [9.5, 8, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.5]}, + "faces": { + "north": {"uv": [12, 0, 12.75, 0.25], "texture": "#0"}, + "east": {"uv": [8.75, 13, 9, 13.25], "texture": "#0"}, + "south": {"uv": [12, 0.25, 12.75, 0.5], "texture": "#0"}, + "west": {"uv": [13, 8.75, 13.25, 9], "texture": "#0"}, + "up": {"uv": [2.75, 12.25, 2, 12], "texture": "#0"}, + "down": {"uv": [12.75, 2.25, 12, 2.5], "texture": "#0"} + } + }, + { + "from": [6, 10.5, 14], + "to": [10, 11.5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [10.25, 10.75, 11.25, 11], "texture": "#0"}, + "east": {"uv": [9, 13, 9.25, 13.25], "texture": "#0"}, + "south": {"uv": [11, 0, 12, 0.25], "texture": "#0"}, + "west": {"uv": [13, 9, 13.25, 9.25], "texture": "#0"}, + "up": {"uv": [12, 0.5, 11, 0.25], "texture": "#0"}, + "down": {"uv": [12, 2.25, 11, 2.5], "texture": "#0"} + } + }, + { + "from": [6, 4.5, 14], + "to": [10, 5.5, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [11, 2.5, 12, 2.75], "texture": "#0"}, + "east": {"uv": [9.25, 13, 9.5, 13.25], "texture": "#0"}, + "south": {"uv": [11, 2.75, 12, 3], "texture": "#0"}, + "west": {"uv": [13, 9.25, 13.25, 9.5], "texture": "#0"}, + "up": {"uv": [12, 3.25, 11, 3], "texture": "#0"}, + "down": {"uv": [7.25, 11, 6.25, 11.25], "texture": "#0"} + } + }, + { + "from": [10.5, 6, 14], + "to": [11.5, 10, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [11, 8.25, 11.25, 9.25], "texture": "#0"}, + "east": {"uv": [10.25, 11, 10.5, 12], "texture": "#0"}, + "south": {"uv": [10.5, 11, 10.75, 12], "texture": "#0"}, + "west": {"uv": [10.75, 11, 11, 12], "texture": "#0"}, + "up": {"uv": [9.75, 13.25, 9.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 9.5, 13, 9.75], "texture": "#0"} + } + }, + { + "from": [10, 5, 14], + "to": [11, 6, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [9.75, 13, 10, 13.25], "texture": "#0"}, + "east": {"uv": [13, 9.75, 13.25, 10], "texture": "#0"}, + "south": {"uv": [10, 13, 10.25, 13.25], "texture": "#0"}, + "west": {"uv": [13, 10, 13.25, 10.25], "texture": "#0"}, + "up": {"uv": [10.5, 13.25, 10.25, 13], "texture": "#0"}, + "down": {"uv": [13.25, 10.25, 13, 10.5], "texture": "#0"} + } + }, + { + "from": [5, 5, 14], + "to": [6, 6, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [10.5, 13, 10.75, 13.25], "texture": "#0"}, + "east": {"uv": [13, 10.5, 13.25, 10.75], "texture": "#0"}, + "south": {"uv": [10.75, 13, 11, 13.25], "texture": "#0"}, + "west": {"uv": [13, 10.75, 13.25, 11], "texture": "#0"}, + "up": {"uv": [11.25, 13.25, 11, 13], "texture": "#0"}, + "down": {"uv": [13.25, 11, 13, 11.25], "texture": "#0"} + } + }, + { + "from": [5, 10, 14], + "to": [6, 11, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [11.25, 13, 11.5, 13.25], "texture": "#0"}, + "east": {"uv": [13, 11.25, 13.25, 11.5], "texture": "#0"}, + "south": {"uv": [11.5, 13, 11.75, 13.25], "texture": "#0"}, + "west": {"uv": [13, 11.5, 13.25, 11.75], "texture": "#0"}, + "up": {"uv": [12, 13.25, 11.75, 13], "texture": "#0"}, + "down": {"uv": [13.25, 11.75, 13, 12], "texture": "#0"} + } + }, + { + "from": [10, 10, 14], + "to": [11, 11, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [12, 13, 12.25, 13.25], "texture": "#0"}, + "east": {"uv": [13, 12, 13.25, 12.25], "texture": "#0"}, + "south": {"uv": [12.25, 13, 12.5, 13.25], "texture": "#0"}, + "west": {"uv": [13, 12.25, 13.25, 12.5], "texture": "#0"}, + "up": {"uv": [12.75, 13.25, 12.5, 13], "texture": "#0"}, + "down": {"uv": [13.25, 12.5, 13, 12.75], "texture": "#0"} + } + }, + { + "from": [10, 5, 14], + "to": [11, 6, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [12.75, 13, 13, 13.25], "texture": "#0"}, + "east": {"uv": [13, 12.75, 13.25, 13], "texture": "#0"}, + "south": {"uv": [13, 13, 13.25, 13.25], "texture": "#0"}, + "west": {"uv": [0, 13.25, 0.25, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 0.25, 13.25, 0], "texture": "#0"}, + "down": {"uv": [0.5, 13.25, 0.25, 13.5], "texture": "#0"} + } + }, + { + "from": [4.5, 6, 14], + "to": [5.5, 10, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [11, 11, 11.25, 12], "texture": "#0"}, + "east": {"uv": [6.25, 11.25, 6.5, 12.25], "texture": "#0"}, + "south": {"uv": [6.5, 11.25, 6.75, 12.25], "texture": "#0"}, + "west": {"uv": [6.75, 11.25, 7, 12.25], "texture": "#0"}, + "up": {"uv": [13.5, 0.5, 13.25, 0.25], "texture": "#0"}, + "down": {"uv": [0.75, 13.25, 0.5, 13.5], "texture": "#0"} + } + }, + { + "from": [5.5, 8, 14], + "to": [6.5, 8.75, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [13.25, 0.5, 13.5, 0.75], "texture": "#0"}, + "east": {"uv": [0.75, 13.25, 1, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 0.75, 13.5, 1], "texture": "#0"}, + "west": {"uv": [1, 13.25, 1.25, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 1.25, 13.25, 1], "texture": "#0"}, + "down": {"uv": [1.5, 13.25, 1.25, 13.5], "texture": "#0"} + } + }, + { + "from": [9.5, 8, 14], + "to": [10.5, 8.75, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [13.25, 1.25, 13.5, 1.5], "texture": "#0"}, + "east": {"uv": [1.5, 13.25, 1.75, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 1.5, 13.5, 1.75], "texture": "#0"}, + "west": {"uv": [1.75, 13.25, 2, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 2, 13.25, 1.75], "texture": "#0"}, + "down": {"uv": [2.25, 13.25, 2, 13.5], "texture": "#0"} + } + }, + { + "from": [6.5, 7.25, 14], + "to": [9.5, 8, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 14.5]}, + "faces": { + "north": {"uv": [12, 2.5, 12.75, 2.75], "texture": "#0"}, + "east": {"uv": [13.25, 2, 13.5, 2.25], "texture": "#0"}, + "south": {"uv": [12, 2.75, 12.75, 3], "texture": "#0"}, + "west": {"uv": [2.25, 13.25, 2.5, 13.5], "texture": "#0"}, + "up": {"uv": [12.75, 3.25, 12, 3], "texture": "#0"}, + "down": {"uv": [4.75, 12, 4, 12.25], "texture": "#0"} + } + }, + { + "from": [14, 10.5, 6], + "to": [15, 11.5, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 2.25, 13.5, 2.5], "texture": "#0"}, + "east": {"uv": [11.25, 8.25, 12.25, 8.5], "texture": "#0"}, + "south": {"uv": [2.5, 13.25, 2.75, 13.5], "texture": "#0"}, + "west": {"uv": [11.25, 8.5, 12.25, 8.75], "texture": "#0"}, + "up": {"uv": [7.25, 12.25, 7, 11.25], "texture": "#0"}, + "down": {"uv": [11.5, 10.75, 11.25, 11.75], "texture": "#0"} + } + }, + { + "from": [14, 4.5, 6], + "to": [15, 5.5, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 2.5, 13.5, 2.75], "texture": "#0"}, + "east": {"uv": [11.25, 8.75, 12.25, 9], "texture": "#0"}, + "south": {"uv": [2.75, 13.25, 3, 13.5], "texture": "#0"}, + "west": {"uv": [11.25, 9, 12.25, 9.25], "texture": "#0"}, + "up": {"uv": [0.25, 12.5, 0, 11.5], "texture": "#0"}, + "down": {"uv": [0.5, 11.5, 0.25, 12.5], "texture": "#0"} + } + }, + { + "from": [14, 6, 4.5], + "to": [15, 10, 5.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [0.5, 11.5, 0.75, 12.5], "texture": "#0"}, + "east": {"uv": [0.75, 11.5, 1, 12.5], "texture": "#0"}, + "south": {"uv": [1, 11.5, 1.25, 12.5], "texture": "#0"}, + "west": {"uv": [1.25, 11.5, 1.5, 12.5], "texture": "#0"}, + "up": {"uv": [13.5, 3, 13.25, 2.75], "texture": "#0"}, + "down": {"uv": [3.25, 13.25, 3, 13.5], "texture": "#0"} + } + }, + { + "from": [14, 5, 5], + "to": [15, 6, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 3, 13.5, 3.25], "texture": "#0"}, + "east": {"uv": [3.25, 13.25, 3.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 3.25, 13.5, 3.5], "texture": "#0"}, + "west": {"uv": [3.5, 13.25, 3.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 3.75, 13.25, 3.5], "texture": "#0"}, + "down": {"uv": [4, 13.25, 3.75, 13.5], "texture": "#0"} + } + }, + { + "from": [14, 5, 10], + "to": [15, 6, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 3.75, 13.5, 4], "texture": "#0"}, + "east": {"uv": [4, 13.25, 4.25, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 4, 13.5, 4.25], "texture": "#0"}, + "west": {"uv": [4.25, 13.25, 4.5, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 4.5, 13.25, 4.25], "texture": "#0"}, + "down": {"uv": [4.75, 13.25, 4.5, 13.5], "texture": "#0"} + } + }, + { + "from": [14, 10, 10], + "to": [15, 11, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 4.5, 13.5, 4.75], "texture": "#0"}, + "east": {"uv": [4.75, 13.25, 5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 4.75, 13.5, 5], "texture": "#0"}, + "west": {"uv": [5, 13.25, 5.25, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 5.25, 13.25, 5], "texture": "#0"}, + "down": {"uv": [5.5, 13.25, 5.25, 13.5], "texture": "#0"} + } + }, + { + "from": [14, 10, 5], + "to": [15, 11, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 5.25, 13.5, 5.5], "texture": "#0"}, + "east": {"uv": [5.5, 13.25, 5.75, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 5.5, 13.5, 5.75], "texture": "#0"}, + "west": {"uv": [5.75, 13.25, 6, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 6, 13.25, 5.75], "texture": "#0"}, + "down": {"uv": [6.25, 13.25, 6, 13.5], "texture": "#0"} + } + }, + { + "from": [14, 5, 5], + "to": [15, 6, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 6, 13.5, 6.25], "texture": "#0"}, + "east": {"uv": [6.25, 13.25, 6.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 6.25, 13.5, 6.5], "texture": "#0"}, + "west": {"uv": [6.5, 13.25, 6.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 6.75, 13.25, 6.5], "texture": "#0"}, + "down": {"uv": [7, 13.25, 6.75, 13.5], "texture": "#0"} + } + }, + { + "from": [14, 6, 10.5], + "to": [15, 10, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [1.5, 11.5, 1.75, 12.5], "texture": "#0"}, + "east": {"uv": [1.75, 11.5, 2, 12.5], "texture": "#0"}, + "south": {"uv": [3, 11.5, 3.25, 12.5], "texture": "#0"}, + "west": {"uv": [3.25, 11.5, 3.5, 12.5], "texture": "#0"}, + "up": {"uv": [13.5, 7, 13.25, 6.75], "texture": "#0"}, + "down": {"uv": [7.25, 13.25, 7, 13.5], "texture": "#0"} + } + }, + { + "from": [14, 8, 9.5], + "to": [15, 8.75, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 7, 13.5, 7.25], "texture": "#0"}, + "east": {"uv": [7.25, 13.25, 7.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 7.25, 13.5, 7.5], "texture": "#0"}, + "west": {"uv": [7.5, 13.25, 7.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 7.75, 13.25, 7.5], "texture": "#0"}, + "down": {"uv": [8, 13.25, 7.75, 13.5], "texture": "#0"} + } + }, + { + "from": [14, 8, 5.5], + "to": [15, 8.75, 6.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 7.75, 13.5, 8], "texture": "#0"}, + "east": {"uv": [8, 13.25, 8.25, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 8, 13.5, 8.25], "texture": "#0"}, + "west": {"uv": [8.25, 13.25, 8.5, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 8.5, 13.25, 8.25], "texture": "#0"}, + "down": {"uv": [8.75, 13.25, 8.5, 13.5], "texture": "#0"} + } + }, + { + "from": [14, 7.25, 6.5], + "to": [15, 8, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 8.5, 13.5, 8.75], "texture": "#0"}, + "east": {"uv": [12, 4.5, 12.75, 4.75], "texture": "#0"}, + "south": {"uv": [8.75, 13.25, 9, 13.5], "texture": "#0"}, + "west": {"uv": [12, 4.75, 12.75, 5], "texture": "#0"}, + "up": {"uv": [3, 12.75, 2.75, 12], "texture": "#0"}, + "down": {"uv": [5, 12, 4.75, 12.75], "texture": "#0"} + } + }, + { + "from": [1, 10.5, 6], + "to": [2, 11.5, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 8.75, 13.5, 9], "texture": "#0"}, + "east": {"uv": [11.5, 0.5, 12.5, 0.75], "texture": "#0"}, + "south": {"uv": [9, 13.25, 9.25, 13.5], "texture": "#0"}, + "west": {"uv": [11.5, 0.75, 12.5, 1], "texture": "#0"}, + "up": {"uv": [3.75, 12.5, 3.5, 11.5], "texture": "#0"}, + "down": {"uv": [4, 11.5, 3.75, 12.5], "texture": "#0"} + } + }, + { + "from": [1, 4.5, 6], + "to": [2, 5.5, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 9, 13.5, 9.25], "texture": "#0"}, + "east": {"uv": [11.5, 10, 12.5, 10.25], "texture": "#0"}, + "south": {"uv": [9.25, 13.25, 9.5, 13.5], "texture": "#0"}, + "west": {"uv": [11.5, 10.25, 12.5, 10.5], "texture": "#0"}, + "up": {"uv": [11.75, 11.5, 11.5, 10.5], "texture": "#0"}, + "down": {"uv": [11.75, 11.5, 11.5, 12.5], "texture": "#0"} + } + }, + { + "from": [1, 6, 4.5], + "to": [2, 10, 5.5], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [11.75, 1, 12, 2], "texture": "#0"}, + "east": {"uv": [11.75, 4.5, 12, 5.5], "texture": "#0"}, + "south": {"uv": [11.75, 7.25, 12, 8.25], "texture": "#0"}, + "west": {"uv": [8.5, 11.75, 8.75, 12.75], "texture": "#0"}, + "up": {"uv": [13.5, 9.5, 13.25, 9.25], "texture": "#0"}, + "down": {"uv": [9.75, 13.25, 9.5, 13.5], "texture": "#0"} + } + }, + { + "from": [1, 5, 5], + "to": [2, 6, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 9.5, 13.5, 9.75], "texture": "#0"}, + "east": {"uv": [9.75, 13.25, 10, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 9.75, 13.5, 10], "texture": "#0"}, + "west": {"uv": [10, 13.25, 10.25, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 10.25, 13.25, 10], "texture": "#0"}, + "down": {"uv": [10.5, 13.25, 10.25, 13.5], "texture": "#0"} + } + }, + { + "from": [1, 5, 10], + "to": [2, 6, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 10.25, 13.5, 10.5], "texture": "#0"}, + "east": {"uv": [10.5, 13.25, 10.75, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 10.5, 13.5, 10.75], "texture": "#0"}, + "west": {"uv": [10.75, 13.25, 11, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 11, 13.25, 10.75], "texture": "#0"}, + "down": {"uv": [11.25, 13.25, 11, 13.5], "texture": "#0"} + } + }, + { + "from": [1, 10, 10], + "to": [2, 11, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 11, 13.5, 11.25], "texture": "#0"}, + "east": {"uv": [11.25, 13.25, 11.5, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 11.25, 13.5, 11.5], "texture": "#0"}, + "west": {"uv": [11.5, 13.25, 11.75, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 11.75, 13.25, 11.5], "texture": "#0"}, + "down": {"uv": [12, 13.25, 11.75, 13.5], "texture": "#0"} + } + }, + { + "from": [1, 10, 5], + "to": [2, 11, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 11.75, 13.5, 12], "texture": "#0"}, + "east": {"uv": [12, 13.25, 12.25, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 12, 13.5, 12.25], "texture": "#0"}, + "west": {"uv": [12.25, 13.25, 12.5, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 12.5, 13.25, 12.25], "texture": "#0"}, + "down": {"uv": [12.75, 13.25, 12.5, 13.5], "texture": "#0"} + } + }, + { + "from": [1, 5, 5], + "to": [2, 6, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [13.25, 12.5, 13.5, 12.75], "texture": "#0"}, + "east": {"uv": [12.75, 13.25, 13, 13.5], "texture": "#0"}, + "south": {"uv": [13.25, 12.75, 13.5, 13], "texture": "#0"}, + "west": {"uv": [13, 13.25, 13.25, 13.5], "texture": "#0"}, + "up": {"uv": [13.5, 13.25, 13.25, 13], "texture": "#0"}, + "down": {"uv": [13.5, 13.25, 13.25, 13.5], "texture": "#0"} + } + }, + { + "from": [1, 6, 10.5], + "to": [2, 10, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [8.75, 11.75, 9, 12.75], "texture": "#0"}, + "east": {"uv": [9, 11.75, 9.25, 12.75], "texture": "#0"}, + "south": {"uv": [9.25, 11.75, 9.5, 12.75], "texture": "#0"}, + "west": {"uv": [9.5, 11.75, 9.75, 12.75], "texture": "#0"}, + "up": {"uv": [0.25, 13.75, 0, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 0, 13.5, 0.25], "texture": "#0"} + } + }, + { + "from": [1, 8, 9.5], + "to": [2, 8.75, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [0.25, 13.5, 0.5, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 0.25, 13.75, 0.5], "texture": "#0"}, + "south": {"uv": [0.5, 13.5, 0.75, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 0.5, 13.75, 0.75], "texture": "#0"}, + "up": {"uv": [1, 13.75, 0.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 0.75, 13.5, 1], "texture": "#0"} + } + }, + { + "from": [1, 8, 5.5], + "to": [2, 8.75, 6.5], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [1, 13.5, 1.25, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 1, 13.75, 1.25], "texture": "#0"}, + "south": {"uv": [1.25, 13.5, 1.5, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 1.25, 13.75, 1.5], "texture": "#0"}, + "up": {"uv": [1.75, 13.75, 1.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 1.5, 13.5, 1.75], "texture": "#0"} + } + }, + { + "from": [1, 7.25, 6.5], + "to": [2, 8, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 8, 8]}, + "faces": { + "north": {"uv": [1.75, 13.5, 2, 13.75], "texture": "#0"}, + "east": {"uv": [12, 5, 12.75, 5.25], "texture": "#0"}, + "south": {"uv": [13.5, 1.75, 13.75, 2], "texture": "#0"}, + "west": {"uv": [12, 5.25, 12.75, 5.5], "texture": "#0"}, + "up": {"uv": [5.25, 12.75, 5, 12], "texture": "#0"}, + "down": {"uv": [12.25, 6, 12, 6.75], "texture": "#0"} + } + }, + { + "from": [6, 14, 4.5], + "to": [10, 15, 5.5], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [11.75, 2, 12.75, 2.25], "texture": "#0"}, + "east": {"uv": [2, 13.5, 2.25, 13.75], "texture": "#0"}, + "south": {"uv": [11.75, 3.25, 12.75, 3.5], "texture": "#0"}, + "west": {"uv": [13.5, 2, 13.75, 2.25], "texture": "#0"}, + "up": {"uv": [12.75, 3.75, 11.75, 3.5], "texture": "#0"}, + "down": {"uv": [12.75, 3.75, 11.75, 4], "texture": "#0"} + } + }, + { + "from": [6, 14, 10.5], + "to": [10, 15, 11.5], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [11.75, 5.5, 12.75, 5.75], "texture": "#0"}, + "east": {"uv": [2.25, 13.5, 2.5, 13.75], "texture": "#0"}, + "south": {"uv": [11.75, 5.75, 12.75, 6], "texture": "#0"}, + "west": {"uv": [13.5, 2.25, 13.75, 2.5], "texture": "#0"}, + "up": {"uv": [12.75, 10.75, 11.75, 10.5], "texture": "#0"}, + "down": {"uv": [12.75, 10.75, 11.75, 11], "texture": "#0"} + } + }, + { + "from": [4.5, 14, 6], + "to": [5.5, 15, 10], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [2.5, 13.5, 2.75, 13.75], "texture": "#0"}, + "east": {"uv": [11.75, 11, 12.75, 11.25], "texture": "#0"}, + "south": {"uv": [13.5, 2.5, 13.75, 2.75], "texture": "#0"}, + "west": {"uv": [11.75, 11.25, 12.75, 11.5], "texture": "#0"}, + "up": {"uv": [10, 12.75, 9.75, 11.75], "texture": "#0"}, + "down": {"uv": [10.25, 11.75, 10, 12.75], "texture": "#0"} + } + }, + { + "from": [5, 14, 10], + "to": [6, 15, 11], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [2.75, 13.5, 3, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 2.75, 13.75, 3], "texture": "#0"}, + "south": {"uv": [3, 13.5, 3.25, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 3, 13.75, 3.25], "texture": "#0"}, + "up": {"uv": [3.5, 13.75, 3.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 3.25, 13.5, 3.5], "texture": "#0"} + } + }, + { + "from": [10, 14, 10], + "to": [11, 15, 11], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [3.5, 13.5, 3.75, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 3.5, 13.75, 3.75], "texture": "#0"}, + "south": {"uv": [3.75, 13.5, 4, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 3.75, 13.75, 4], "texture": "#0"}, + "up": {"uv": [4.25, 13.75, 4, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 4, 13.5, 4.25], "texture": "#0"} + } + }, + { + "from": [10, 14, 5], + "to": [11, 15, 6], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [4.25, 13.5, 4.5, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 4.25, 13.75, 4.5], "texture": "#0"}, + "south": {"uv": [4.5, 13.5, 4.75, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 4.5, 13.75, 4.75], "texture": "#0"}, + "up": {"uv": [5, 13.75, 4.75, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 4.75, 13.5, 5], "texture": "#0"} + } + }, + { + "from": [5, 14, 5], + "to": [6, 15, 6], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [5, 13.5, 5.25, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 5, 13.75, 5.25], "texture": "#0"}, + "south": {"uv": [5.25, 13.5, 5.5, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 5.25, 13.75, 5.5], "texture": "#0"}, + "up": {"uv": [5.75, 13.75, 5.5, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 5.5, 13.5, 5.75], "texture": "#0"} + } + }, + { + "from": [5, 14, 10], + "to": [6, 15, 11], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [5.75, 13.5, 6, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 5.75, 13.75, 6], "texture": "#0"}, + "south": {"uv": [6, 13.5, 6.25, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 6, 13.75, 6.25], "texture": "#0"}, + "up": {"uv": [6.5, 13.75, 6.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 6.25, 13.5, 6.5], "texture": "#0"} + } + }, + { + "from": [10.5, 14, 6], + "to": [11.5, 15, 10], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [6.5, 13.5, 6.75, 13.75], "texture": "#0"}, + "east": {"uv": [11.75, 11.5, 12.75, 11.75], "texture": "#0"}, + "south": {"uv": [13.5, 6.5, 13.75, 6.75], "texture": "#0"}, + "west": {"uv": [11.75, 11.75, 12.75, 12], "texture": "#0"}, + "up": {"uv": [11.5, 12.75, 11.25, 11.75], "texture": "#0"}, + "down": {"uv": [12.25, 1, 12, 2], "texture": "#0"} + } + }, + { + "from": [9.5, 14, 7.25], + "to": [10.5, 15, 8], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [6.75, 13.5, 7, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 6.75, 13.75, 7], "texture": "#0"}, + "south": {"uv": [7, 13.5, 7.25, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 7, 13.75, 7.25], "texture": "#0"}, + "up": {"uv": [7.5, 13.75, 7.25, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 7.25, 13.5, 7.5], "texture": "#0"} + } + }, + { + "from": [5.5, 14, 7.25], + "to": [6.5, 15, 8], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [7.5, 13.5, 7.75, 13.75], "texture": "#0"}, + "east": {"uv": [13.5, 7.5, 13.75, 7.75], "texture": "#0"}, + "south": {"uv": [7.75, 13.5, 8, 13.75], "texture": "#0"}, + "west": {"uv": [13.5, 7.75, 13.75, 8], "texture": "#0"}, + "up": {"uv": [8.25, 13.75, 8, 13.5], "texture": "#0"}, + "down": {"uv": [13.75, 8, 13.5, 8.25], "texture": "#0"} + } + }, + { + "from": [6.5, 14, 8], + "to": [9.5, 15, 8.75], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 14.5, 8]}, + "faces": { + "north": {"uv": [12, 6.75, 12.75, 7], "texture": "#0"}, + "east": {"uv": [8.25, 13.5, 8.5, 13.75], "texture": "#0"}, + "south": {"uv": [12, 7, 12.75, 7.25], "texture": "#0"}, + "west": {"uv": [13.5, 8.25, 13.75, 8.5], "texture": "#0"}, + "up": {"uv": [8, 12.25, 7.25, 12], "texture": "#0"}, + "down": {"uv": [12.75, 7.25, 12, 7.5], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "ornaments", + "origin": [3, 8, 3], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + }, + { + "name": "center", + "origin": [8, 8, 8], + "color": 0, + "children": [32, 33, 34] + }, + { + "name": "plates", + "origin": [8, 8, 8], + "color": 0, + "children": [35, 36, 37, 38, 39, 40] + }, + { + "name": "symbol", + "origin": [6, 8, 1], + "color": 0, + "children": [ + { + "name": "side1", + "origin": [8, 8, 1.5], + "color": 0, + "children": [41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52] + }, + { + "name": "side2", + "origin": [8, 8, 1.5], + "color": 0, + "children": [53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64] + }, + { + "name": "side3", + "origin": [8, 8, 1.5], + "color": 0, + "children": [65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76] + }, + { + "name": "side4", + "origin": [8, 8, 1.5], + "color": 0, + "children": [77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88] + }, + { + "name": "top", + "origin": [8, 8, 1.5], + "color": 0, + "children": [89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100] + } + ] + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_fortune_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_fortune_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4ddac83c0740e206e018fcb33fe1fe8306ad55b9 GIT binary patch literal 1811 zcmV+u2kiKXP)*fc-}XOh4Y{4Uk@Rgpep@3OAdJH1uH3JDSP|b(C=5m^ zCcwz!!}|a_eAqblT+3P!1__D@Sj8Dobse(P8=p~B#6|$RiZjMCIr{i?hmvzG|FZXL zhnDB=i@nuQ&y9@$fIF){wH=on*Kj*|BDc_jY*9GDrH53caEO%vObvK1RDPN6)9GeT z9v=$tzpybwmHLkq)(H+&0PO8M!RGDXcd&7o0#NyILglALVFI5}SPV=6`?C)N+c9!M zD6H*L+2I0=#8RC|d+xoXM^vbGVFDbdZLnQuYri)0t?&8f@o#c#;}P)u@B^vwZQ=Z; z-F6lC9U-qr;{gdXyz~uA)N?=x-~^M8m2a58IW4u~hg)BUVu66vfQi{J0xxPD{Y637 zg>CN_;2RVns?);6Or(2b6$Kbl#nT9baCUpGa{_RJ*TX+5UIKu(FZl!tBw8g>B*6>Qs7lWD_Ag0g`;37Ou$wr&||(I3RM*bL6jDU)dWnwkyujp4EAON z=l`&G9ng%-<5o!n4zQe`if#g7_37|rgF-N< z1%MFAqU!33xaMGZ!(g{yEk%ek&)=pK_ZWgGKX1m53EJue43xzHHmk8YwGU@l5u=|P z7bZ~b!UWC}HXj3<<~ajXv-P>*V^oF{@(E9*% zFbHmhAmsywIv3~$eiI)$DrqMS3lo4jeauf^taR8$gHab?fDaU^UHAZ-7q(_`PQ34g zsPSG0N?a@iggrPuOq60D`9BgMogzmz0iIOo1f6U9K@yJun3Y^F>eNfXCqy=Zvobkb zHP==vv}u?hU59hTq{!r2&OHYwScqFi$d*f>1a3kJL`4SI}Jb>)N2f~UP!7K0!`?uEPmEFZmZ^=rBbBAuCH>K~N{ z%s&sFM=d!eCrFsLIu0A&T73}Akf!JJey}A&m=Z6pZ@a(S6%RPCIXy;@2HKJ#l8Yf! z$06J-v?2l`J3%vl=Qs|#1P#TDaNz=Yk#4^qBMxs3M}~X0eD2Zl!0Dix2lT#6Mm$5- z2AyNM&fvUx0A6Lczg zQ}+)hW0a=RXfKowEfvOS)g0D__`N*my+&{2&T*{AF|P{Y(ProqE^@LZA{CA;6GX=m zBK5crE$NC04$9m23vi&&kkV1~viK+p4hSDmExGE7$aAa%b_Rz9$7bUY{Qyh_juP(% zj=(+uqYuX!l?e{S1a$j1Z8+#!3LZ!Y+oFh(HSe+nV00{;;jthA=y>g0? zX)RwzO}-9CB#w`Qp9wxck4h1uNS)-uMkF#}php9_E*L9CDd%#Fs2Jr3=?fO1N*INp zscUpxHvzl=lNEFj4hp8ie{|5PDg*5t|2g9W@xkvxQ>3s-#d#)9et;QZpn8@L_cD*9Cg5dK#%c|gzJBi(9k`tWm=)f^zC7O|K)BVqoPGQY`MyK|DZLN-Z z+^c8vwYGbUsq3LvijLqZ4Vwp&t8fxmQu;4Xy`>WAhq+GdB5Fxv+uo`b&d6@KUm+}H*e>?`R4oc`@R_q zU)87f_tq!$`RvuPmiE${a(rB>Wh+OQ;xtG(Vnb0q*`_~Cc)3ok2j zckQjdUhgZ5Yx-pvk+pGs4*OqJ$9V|kB$>e8 zi$0MNb53VR6j#l)`A0L-ql5ud8Jg@rc_sk0P6AYYNQ`#Wua%{?d0(n8D#y(?0m_^R=Jr|041FyNzG<(Z?f_0LS=XM;auFCV(&q-{3eodLlNZH%xkqUs`J`JJK2r3T`56WAtW0s${ggl)-YYljq+1HT?fcEQx zYFbSB9qI%aj3DKWBFU`8ImJDhNaPu~mWyP_S0~VUKo+hyQ)Gt2>Aod-prXXFi2`YS zWAwUsL52rFBQVH8l>*-yITu|mOEHQBixHcyzBH8B2Q7fmIPJUdu;YC@xKlLrnAIUv zgeoCK$d+yrd>q~_Pq`pLNkdP72H5XWvLbgi$`3U6=W`yK_W>2Ig_?lR2E82q^N$kS zU;Xx%K8Du%Izf{RZRv>6mI>qmjVLlHn&C}b_K#Y?a-<=+Z~6R2xCzKHfUizKwr9h3 zs&Ixh#o~HzqbOQCPEjBYJ|6>{zx3#J%XP9rmdEI8z!@Nn>RgUYAj`+tiB2+%c4)FB z#wo)GAREk$31lHj{cY${m?BEGo5ln%cvggJCm|ii07C%gr|(w|5CcCk3nM-ntgAx0 z0%VjOn$Qe`;)ND~&kK9AxG3JIp_6!zsxLwtlO`}eI6U|UvOfTV01Lb!>T|UXCTMq( z1a}?I1yn5y)qxKr8=G=axGZyCnh8v3js6>A5B2*G4p%Ur+onmqr4Y6 z0E(g_SG;}aRs$I0Sh@PAWwv48Lt{SR2=Lx2F_su!?Gd zccUBtCJ?kVhT2*d7NZRZSbXHs#`1RD0i{)c3AX~}uJpR_B|~t8m!wIBan5yt;H9yn zTGLBImInHgAwY8gWhR(?s6KK49(`!r2e=`Jahwa5RlPb}YP4ge*2bNvWJO9lo$wnQ zCX`t-tZD;HeF;PX2!Vnqv||GD9>A1Tt70S=rmbm3SP&kzW7h5aT`g!OPcw~30RauS zVFGP0j>0M71$aCvKugm20JuLi1%qdW2*dq*D_k^RQ2{g9J)O%YtQ>NiSJ48YU{yvem`vXEj zhz;HR<@EuWF|NOxlr&CD8NR?6!3vR_g!G9QMYU*D4FvJ}Ab=2Vjg-xE2cqX%8zn<< zAPs;zyJWVSB4OoDV+u9s5c19hfcLYriB1i0fc_WP1Q&I$59%2$cB?36jl6FmP^? z3V}8O-t5v=8)S9xw5-)r7|lI;(Z94PmBuy}{bH)m-KlYXoz4og=njtG%`$h~gF_fA zc$R9T@P@75*zW=!fYP|B2l&zT&G3)=KBuOzDB`yB-1q-NK+FeFMPUxKIlLs!Im>uq49aKQv_Z_CJ9wPK zthne2mF6{?1Fk_+@Gd-O8~VX-^%9u6247>pXGjJ~bnX8B!+x3seKTQiP0N~zw0>a! z?8Eo_gS=Da#zn6Nbm8CTl2p__hsVcE@H=Lo=8~r3p?%qH)T*>Tf1dxzJD_%P=pE(_ zxy%L+6K4XDQ;stM$SKE}0OXY8KL7v#|Nm|JCYb;L00v1!K~w_(@E+&E+u&rr00000 LNkvXXu0mjfswc&_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_fortune_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_fortune_3.png new file mode 100644 index 0000000000000000000000000000000000000000..344570d68aa297f81c022720b8ab106e311c87b1 GIT binary patch literal 2244 zcmV;#2s`(QP)|DkvzOu)mr_%uI3+`a6EIER?|b)?o=$i7PEo8#PJSTY-TQaklQXM*1srUPOL94{U`IgSLDu_WjQxArezPG?=`h4TpiTw-SH3gn#u3W;k{AW znkmTF6Q2%5jhn%rFHe1x^lo|d87kmxDWibJs10RJKRt+4a+gQ04E8n0DUlP2y z5da~q1zLz4tE&W{wvR)cwoe1SoC&s>rEPuK8i(Y+xgb%Y9 zPUtmfCSHBe5P>9Jkf}P9JyPVQBS7=Ro?~^Z>z1K0VaWI452(~e>LP&a2MO)FMu6~2g!2Qrn0}CL$gvpbCJe;;00@JaK+LMI z7#;BNTnEe8Zpj0a_m`j4>eN zR@+PcS&SR}&~Qm%XRs~;Xj9ovDFSKjw69$^?0p(QDI#htPFg=82^redq`{KlQ%o&M z3nGZxvIS`yE;lh(IKRuWtg_Tpm?402i%$f6GU)Z;KmRzg{?V_0>b2cm-|K)2#RXw1 z44lvtR^Uy7e!s<-3>!;PFfI+U!BfWT2UkP(p$x$ZN$3dz`0@m5;)D~o3a}|9zGPQ^ z%iOM*^cPkh<`3Cmh{*k3umW-L=@_i+@Zw*QJBh>Srpf8q~ zj>rSJAP2J@&jWxnH%*4PFFZjX2ZlkpUK8sBfaNPDF}fD`1a3wsRWQ`+K=gMgqxA^` zSY_h8Jgt|xuJGKL+`5Xxi}uQ3h?c?C{+TpZVCq3xl29>01_tK|t#A%c z{cs1q=qsFoqWs1oZ7|fZCad*~5Ko9CA#rc8TRFZY4)g^>Te*VS5N)L1=mFYP*%4TQ zaQsfn;{)(A$g8WN!za10;!sYo-{`Xv(Z>Z(et=Uo?l-vsH!Cc`zV8%0&UI`4N)Uym zx8w+6f*_Q#Vn7)9^041=Nmw{CtjDUm?eRPn(Z@}ZQwhQs&_xQeL_QH{dvB03j*m-| z(?1G;E65oH_Y1iFlI*49F{36q}f|0unJ1b$E6z z%dojaDhtp6=W%meelNcn9v@GeTMw|P{n`?NmgDMXlQ9a+%pet|hn7<8*<-@4X0Jq8 z0@qT&+|4?5ARxz}2dMjhK~#uEtT@ED;~bJoZ3XZFa4SJork7lRqETKRJ`BnSyRx8s zRNxW@J`i@Dla2!HJ$}CbGjPY`k0(UZSb-xsB17*Dlk~c>F~B0+b<$~A01%6d11?0q z5M~eW0XL{MFh9))7<~a^_>KX#5P(NfXi@+?<3(ZH3y>AbqG`?@;^X1qV1*(3VK30# z3379moM0H}uVP@nfle6x0pIp`3jv^D@B_O?u{7P1_o@hVSlv2xM@Wo(i6-E zIe^Xmi}ti-epxfDarcP$uoca-yjccArf&8E_6@9UhFykfDhBnJLgPn`qZ=W{p+W9n z+Z`0NJQLC1y{{CY55&7YK7fCla}OW+?zz%Yb?)v=yW^lQR@?gW{{Ct2fuC~=u}5VG zUi|jMD~bSZC`EwJ;d>&kKHQeiU{i1c|Ia5)|4#1t?(Er{@dWty+O=0<%2AG88FTCJ zmwpcuxR%$MK#3@{Z$w00030|Gy4sL;wH)21!IgR09C(&E|;3 SEcZMB00006Rg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_pump_fluids.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_pump_fluids.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6aaaa96b8d6bf261fef646ff4e4218a58b5bd6 GIT binary patch literal 1682 zcmV;D25tF?P)Y1UK6AAkNX?Mzpwyxo+4SNHy=Vx>-xZZ6Tn{*Ur__H>*IGlx|C z^ub%?NCCgTyzzeOMK50cMQPW$j(-x2#g6~hIhMzX8$s;&!K)6r0wMTNpqx>gyrVws z)uVHrTkAAM6GZbw&yNp??vpduD5tyFZTR1ftm;hk6X-uu8JFl9^Bi6SYRF2Lx)Oj&!nFH)9XE?X`9X;FpiCmEa;5co= zcAahf`otHp=T8rQkw;q|fh32$K0ZtK)d5a%mX2t1^&$CC@U@xD%urupKhQ!b6mNfX zPfa|N28`YODD|S_{og6=I@j@jkmTi?Kl~$)m1R#2pqvq>vG4=4Cr9%0+#>mFK%QVv z|9a&EDGa$NnpAlJDBb(h=XUwZ17P>a`%NGaOdRPje1H!F)d2SPNw`KM9iH&*w}1Aw ze=slsnAw|I9|*_}{%1B2p^hF#z5uGvYXO*ruL%r=53tnE&EY@$Fn0XKuYbs6KWcqCrckBbhh$2HhZ)m%R7rXJi`O)$CWL?z84@EOhC%?g zI)O<)7jTy@0Gp3lpo>vrZu*F-!UVAR;eLR;4=qup>7UpRg$CGsj4KdIW!X;%L+=CP z@&FwaNc8Hk^beclOm3^fNeiQ)E{bLWZ=Cyqpe*vdvS^BsHc{jOhybWMWr_keFKk`K zh4DU#tnr>v*5{RnB|x0B(+M(WfnX?{piKky=4TuW;Sm}jYl9wPFc(Ep z+op%k{JJQR+>t9m_?&mhom>bYt{1@ZULS)7RP*KoT;RA40N<@hJ*UvG;5v>Qee zXvAv9viKl+dTFF-pe+Klr&SoWX-X28?gOA%oWSVqu4p`Fy~d4DfQAU7#FJ3dL^;fP zk02OIC&*?7)n>uynqVeRSRlbvO5{)Onxnu>cW+CL@Y^28SOtJD!y7qwe%;sb?kpUW zoS(j-0i2h*>f{RFqeR{9FK9@Ga#|AeMXw5@7I5~oA-Bw6^W-z~!>cpoLgc{0rD=On z*((|vvZptBeywVBx??6pyeB|@4~N409{Xg;&;UKHM3=RgVT}zB4X+FnkTG0a?qkKq z=b^GLD?uIPEc*Yi3A>kO33JL=bCCkT#Bsyc#(1>ttdgU0pi2JHMT`q*gJ$Or761?k^gh1P*q6I#yC2(>P_L1l2 zh)4iXwLmL8>Z#~j$`|6nco70Yl{cDQ6Vb2ZdouWpogEm%8*GOY*7^F@$6dL-toU%a z3tQnu%7)j%;r~c3Gr@jxB>)<6t^`0M&XoXY#JLgxjW{DOfd2ph0RR8lX12Zn000I_ cL_t&o0JO6fP4}OA5C8xG07*qoM6N<$f=k#YTL1t6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_silk_touch.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_silk_touch.png new file mode 100644 index 0000000000000000000000000000000000000000..945e42232359aa8c695207f1df8d9a00549c9a4a GIT binary patch literal 1790 zcmVI6~~5aJ4BU!lq|LY0g#hcT$JEG$(j;zPwD z40a(Cbr(=+RI3RNToNL34w7*Z;Rue{`_0Z<&(7`6?ChP+x12s$-R#cn&%Aj*-@F+W zzHh9)qb|TZm^aq{S1lXsx2}C6e&@%3q@S+drQ-cTab8{ipK5P!i}H5kvZx#S>fr#T zL;-)kyYi{A(Ti9Akf~kT`Y*lV*!tfaC*pVPiWggd_^Q!z?aj((LE+?(Dyti!2w}LQ zKsmw8%?q-$NmDcyUN6<}`NG%~<>up4D$E{{3vwfX9lvub_NI$8dGQgIV(MIw8v&rh ztm*=Od2-p;hy8U$J0OfvazSnc0Nhx-6*+G{sYcGB2|^fmC^d2=fQSb8nD8S5Y<}1G zp@;-~(-1U`PRRHYmlMv_aRfL{jV#Ys4mImcnAe;)hp=$y_d^TZfWz1M#S=yi- z$psit_n~4ra;@?0rjrze060$DU~6ZqzcBVq?Df;bU&XJDM_hmTT4(`m9fWA-@w%_} z$D$4q0ciS8(8&ba2_a6Hr87b37Zw9HSb4eObidGm;j3R58=chuBvZSz^_{@3&-_Z` z_k^nNc}2P*uY(2ypv=!4o|mgApo2#r;ZfK=uuo3Nl>p%IO7);DCRfFvJn?*;CWs=0 zC@pd&fTT!LtPYBa5coiodYB2aw@-pCitx0z6&qqw1XS-_N<9?@x+Z|B;b@%K^8;SO zeaI7tY3?%49>unqxaN<#HYZ4no-hGho}l@}tk&QMYyv~%hOP-f=NpCDz@AxkP2iCo zS^7J%4QGg4Aq0>%PTSgbGTz5QpA91R&w0mTS)lTOTu=a|G{MHV_QB!dsId131;PR9ErxW;=GNPDvoc-adb#fZZJR%I>_RCsOlDY>E$hL!}_ zIQE+r^Go$iZY$i@@^pM)qHeiBMzA{ECX=&eb8Wdon}#tFY77SsapeAnq`_rtl(6BW z`vBWqg45keU>;HPv%+hX!33xWVADYEWK%AD&ikV-!lS=NP?M|>2$C#|?N_ z#PxD`iiuJd6DUkPHr@y8{Ahv%NhT`X zjWsy<{lLbGR%cZ zPYF0eq{Ax|ycZ#H``|LU;!K<%Z&+l`&inV+JiJEhrb*`UykNqD=6iN8MrVc1{Za8; z_y|M;efLOOI14}>aXn3ame3jF+Rdk8A%ulnvg|}nLRZ6}m*OLNau!a)R)VxRr^GSR z-~ekh77Ye_jw(n_;1H}3yTR%SFJrB$e~9Y{VKb5oK(p{{ z2#o91j8)*|%A(9`1?s4G%n5>I-~ixY^at}46!wP$9|<8sK(KY(%NzjqiH;#;LSSfv zwrGPo4y71PfXxaW666rc&{C>#++ia$sN+Nsys1_3ZO z9Jp8YANo1B!$>px<7sUY8`QrA8mj(t1UpGvb}0@6KOg+@j%h4ETxD@XGW!C-K+3#r z9ixXAvjDivzie7;GAdO@hjh;kA+d?6J3@K)hmNGS&ngd`_6Q9WYyU?6X9ypy3PGi{ zdfNFHZ_(*xy@=d*pk3rXC)h5|1weg{a{*AF<6HpL=QtMt^*Q=p0Pg_+0RR7e2%k&< g000I_L_t&o0KxinWWh`gxBvhE07*qoM6N<$g2g;a-T(jq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_world_hole.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/upgrade_world_hole.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee6d4de0f6ccdb87f789032e5df44cd4f1f8056 GIT binary patch literal 1877 zcmV-b2demqP)tRk=37%F&L>9cnhvgk{PP{Mz`>ty z9(-c#^y1ZjWa^i+{fk_0Wcy$B6S?hwkc(_Td{uAk@0?DC+AwGp7(DQ1;ZveAS>aGd z@cpB^{$4F~eu?_!cKhT|3a47XCy%$DpV3ETM`i@DwSH#qQ1CXa5pJc6k{~kz*d1}D zU90GJ=cMnzw%%K!zNeyn$}^ES3$@NN0bqRU$Ix-L-rT2SO#q0}0HFSLNk*CaLP;Ez zq(5j&6JT#22i4n0L3(xtxxH{Z`-z>ANvg~&i!ex5T$=#&aHV5-q2JhEezHniJ{MpV z^PU#4AjbAzOTMslzeW$&?^6;;0dSnQ!Pd{#ez*Ut$n$51f5@$kM__;~ zVn9>c&IEL)q}K;>G1r0XS7zQ4&ERM`)HXEZZ6TPUo@Kdx_`E`n(3DJ>fUQn&zG)#f zBf&0s0G+m>3Fv&oDR}m*R&?UPwSc}SFGJ@8YFv|bfvwGoJSyfNr!#@1aoX0emGM3b zdN#Nu2CfPgvkw})eUiciAT1MY9Ny%KfjCD+K56N8$qF9i*uHizp#edq2<5P#GL*^$ zY&K}+@Lzrw+5Y0sf8{nwtuG0hX>ci|0Zw6A`ipA*US|;@)>2&?C-&xLM#xyBS!o7q zJsFDvwmJdBRuP6nmF4xR$?TNGY(B=NuEv^yKAtjpvy5mUO(7r9cqRy!Y*l6%t zA@Cut?-NiOPvrw_Uf7z&`SCsuY2&>Ll(tw1I%$Igx^fh8qL) zN^UcbC@G>M2Im9FF5wW_2c!yvmt}IcYObwTXwxvB`O(wxWFZCCfy!}rJwr^;mP@FE z)bk3|19&-{pvfXxN}UW*8^ET4torcy0Efn5{OPSV(qv?dYyumD6?#T?WUeX<=(UBS zAWI-YyA+tfchl3>uS0-L2%r%P{lrI2fdO@m5KCj`k8#522o2aBIhKxcl#VGaytTng z#&KIU_cE0tFAV!@g8o|InBGY^M>S_aXs=K*IN;AFRK<_4WN{WTb)6S=Db{%rhV*=gs;bp zgR4VLam`Z1H7YpHSG8Hy1%sps+KFg@Fi7+ZCBcssy^}; zHeyQQP~&rnA!xc z+S_|Mx;FqgyXwWu10gg~;(SmKNNNIIcp=12NEQ^6zsBZc9mvkW9imk5I)P{7{nQ^c zMJ7X*3{yq2obeif7e^SwK;X@JAWdI}QLsjcKI#t<1pTWiOu#At#B00=Z*^cMSQC(z z#>I2}o;(nCawe$uuf~7YR&4Qu;9vr_wFVVd0kF!)NtI)~N?G|OaUIU913;+ad)jDt z8enqpOKSo$7XaU9` zU)%uukZe>00Lp&q$+4M%>rMX`#HIqkoVeD<*T5e@qxgqoJO{Szeg0aM`ZWBVo9Pl`Lg?*08vOH13%4&p6 P00000NkvXXu0mjf0z!y6 literal 0 HcmV?d00001 From 06e181d4b361a1ab5477e717531d1a3287d68345 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Fri, 19 Dec 2025 10:34:20 +0100 Subject: [PATCH 16/28] Block replace logic --- .../EnderQuarryUpgradeManager.java | 4 ++++ .../tileentities/TileEntityEnderQuarry.java | 6 +++--- .../config/blocks/EnderQuarryConfig.java | 21 +++++++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java index 8187331c..d5531800 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java @@ -63,6 +63,10 @@ public void clear() { activeUpgrades.clear(); } + public double getTotalCostMultiplier() { + return activeUpgrades.values().stream().mapToDouble(EnderQuarryUpgrade::getCost).sum(); + } + public enum EnderQuarryUpgrade { // Boolean upgrades (presence only) WORLD_HOLE(1.2, "upgrade_world_hole"), diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 3c0b2c94..b04b5029 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -60,7 +60,7 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver public static final int BASE_STEPS_PER_TICK = 400; public static final int ITEM_BUFFER_CAPACITY = 256; - public static final Block REPLACE_BLOCK = Blocks.dirt; + public static final Block REPLACE_BLOCK = EnderQuarryConfig.enderQuarryReplaceBlock.block; public boolean isCreativeBoosted = false; private int storedItems; public ForgeDirection facing; @@ -547,7 +547,7 @@ private boolean[] tryHarvestCurrentBlock() { } private boolean tryConsumeEnergy(float hardness, boolean simulate) { - float costMultiplier = 1.0f; + double costMultiplier = upgradeManager.getTotalCostMultiplier(); int cost = (int) ((hardness == 0 ? 100 : EnderQuarryConfig.enderQuarryBaseRFCost) * costMultiplier); if (energyStorage.extractEnergy(cost, true) >= cost) { if (!simulate) { @@ -852,7 +852,7 @@ public void scanSidesForTEs() { * Does not check for anything, should be called after tryHarvestCurrentBlock() returns true. */ private void removeCurrentBlock() { - worldObj.setBlock(dx, dy, dz, Blocks.air); + worldObj.setBlock(dx, dy, dz, upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.WORLD_HOLE) ? Blocks.air : REPLACE_BLOCK); } // TileEntity & LoadableTE diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java index 3d865068..50c25167 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java @@ -2,6 +2,8 @@ import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.gtnewhorizon.gtnhlib.config.Config; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; @Config(modid = UtilitiesInExcess.MODID, category = "blocks.ender_quarry") @Config.Comment("Ender Quarry Configuration") @@ -28,4 +30,23 @@ public class EnderQuarryConfig { @Config.DefaultInt(1_000) @Config.RangeInt(min = 100, max = 1_024_000) public static int enderQuarryBaseRFCost; + + @Config.DefaultEnum("COBBLE") + @Config.Comment("Block type to replace mined blocks with if the world hole upgrade isn't present.") + public static EnderQuarryReplaceBlock enderQuarryReplaceBlock; + + + public enum EnderQuarryReplaceBlock { + COBBLE(Blocks.cobblestone), + DIRT(Blocks.dirt), + GLASS(Blocks.glass), + SNOW(Blocks.snow), + STONE(Blocks.stone); + + public final Block block; + + EnderQuarryReplaceBlock(Block block) { + this.block = block; + } + } } From 85dff1411ec092b7cb170b4c97ddc0852e7d7f98 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Sun, 21 Dec 2025 01:08:20 +0100 Subject: [PATCH 17/28] Move stack hash Strategy to utils, commit early to debug Entity mixin failing --- .../tileentities/TileEntityEnderQuarry.java | 24 ++----------------- .../utilitiesinexcess/utils/UIEUtils.java | 23 ++++++++++++++++++ 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index b04b5029..caa72be4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -8,12 +8,12 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; import java.util.stream.Stream; +import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -52,7 +52,6 @@ import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; -import it.unimi.dsi.fastutil.Hash; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; @@ -84,7 +83,7 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver .collect(Collectors.toList()); protected final Object2IntMap<@NotNull ItemStack> itemStorage = new Object2IntOpenCustomHashMap<>( ITEM_BUFFER_CAPACITY, - ItemStackHashStrategy.instance); + UIEUtils.ItemStackHashStrategy.instance); public TileEntityEnderQuarry() { resetState(); @@ -1216,23 +1215,4 @@ public String toString() { return String.format("[(%d, %d), (%d, %d)]", this.low.x, this.low.y, this.high.x, this.high.y); } } - - protected static class ItemStackHashStrategy implements Hash.Strategy { - - public static final ItemStackHashStrategy instance = new ItemStackHashStrategy(); - - @Override - public int hashCode(ItemStack itemStack) { - if (itemStack == null || itemStack.getItem() == null) return 0; - return Objects.hash(itemStack.getItem(), itemStack.getItemDamage(), itemStack.getTagCompound()); - } - - @Override - public boolean equals(ItemStack a, ItemStack b) { - if (a == null && b == null) return true; - if (a == null || b == null) return false; - return a.getItem() == b.getItem() && a.getItemDamage() == b.getItemDamage() - && Objects.equals(a.getTagCompound(), b.getTagCompound()); - } - } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java index aeea2464..b397c6f4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java @@ -1,6 +1,10 @@ package com.fouristhenumber.utilitiesinexcess.utils; +import it.unimi.dsi.fastutil.Hash; +import net.minecraft.item.ItemStack; + import java.text.DecimalFormat; +import java.util.Objects; import java.util.Random; public class UIEUtils { @@ -24,4 +28,23 @@ public static String formatNumber(double number) { public static String formatNumber(float number) { return COMMA_FORMAT.format(number); } + + public static class ItemStackHashStrategy implements Hash.Strategy { + + public static final ItemStackHashStrategy instance = new ItemStackHashStrategy(); + + @Override + public int hashCode(ItemStack itemStack) { + if (itemStack == null || itemStack.getItem() == null) return 0; + return Objects.hash(itemStack.getItem(), itemStack.getItemDamage(), itemStack.getTagCompound()); + } + + @Override + public boolean equals(ItemStack a, ItemStack b) { + if (a == null && b == null) return true; + if (a == null || b == null) return false; + return a.getItem() == b.getItem() && a.getItemDamage() == b.getItemDamage() + && Objects.equals(a.getTagCompound(), b.getTagCompound()); + } + } } From 1b0e5c590b5c834a8fe86fc0e8e5119eec477b90 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Mon, 22 Dec 2025 04:10:12 +0100 Subject: [PATCH 18/28] Drop items on quarry break, set upgrade collision boxes, register upgrade sub-blocks, make upgrades & more configurable, fix vanilla fluid harvests & initial side validation --- .../blocks/ender_quarry/BlockEnderQuarry.java | 44 +++++++++++ .../ender_quarry/BlockEnderQuarryUpgrade.java | 28 ++++++- .../EnderQuarryUpgradeManager.java | 26 ++++--- .../tileentities/TileEntityEnderMarker.java | 2 + .../tileentities/TileEntityEnderQuarry.java | 75 +++++++++++++++---- .../config/blocks/EnderQuarryConfig.java | 72 ++++++++++++++---- .../utilitiesinexcess/utils/UIEUtils.java | 7 +- 7 files changed, 209 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java index 5b6da2d3..1eb94d90 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java @@ -6,8 +6,10 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; @@ -71,6 +73,48 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer return true; } + @Override + public void breakBlock(World worldIn, int x, int y, int z, Block blockBroken, int meta) { + TileEntity te = worldIn.getTileEntity(x, y, z); + if (te instanceof TileEntityEnderQuarry quarry) { + dropContent(quarry, worldIn); + } + super.breakBlock(worldIn, x, y, z, blockBroken, meta); + } + + public void dropContent(TileEntityEnderQuarry quarry, World world) { + for (ItemStack item : quarry.retrieveAllItems()) { + float dx = world.rand.nextFloat() * 0.8F + 0.1F; + float dy = world.rand.nextFloat() * 0.8F + 0.1F; + float dz = world.rand.nextFloat() * 0.8F + 0.1F; + float f3 = 0.05F; + + while (item.stackSize > 0) { + int stackSize = Math.min(item.stackSize, 64); + item.stackSize -= stackSize; + + EntityItem entityitem = new EntityItem( + world, + (float) quarry.xCoord + dx, + (float) quarry.yCoord + dy, + (float) quarry.zCoord + dz, + new ItemStack(item.getItem(), stackSize, item.getItemDamage())); + + entityitem.motionX = (float) world.rand.nextGaussian() * f3; + entityitem.motionY = (float) world.rand.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) world.rand.nextGaussian() * f3; + + if (item.hasTagCompound()) { + entityitem.getEntityItem() + .setTagCompound( + (NBTTagCompound) item.getTagCompound() + .copy()); + } + world.spawnEntityInWorld(entityitem); + } + } + } + @Override public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { super.onNeighborBlockChange(worldIn, x, y, z, neighbor); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java index e964a0c5..accc208e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java @@ -2,15 +2,23 @@ import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.world.World; + +import java.util.List; + public class BlockEnderQuarryUpgrade extends Block { @SideOnly(Side.CLIENT) @@ -20,9 +28,24 @@ public BlockEnderQuarryUpgrade() { super(Material.iron); setHardness(1f); setBlockName("utilitiesinexcess:ender_quarry_upgrade"); + setBlockBounds(0.5F / 16F, 1.5F / 16F, 0.5F / 16F, 15.5F / 16F, 15F / 16F, 15.5F / 16F); setLightOpacity(0); } + @Override + public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, + List list, Entity collider) { + this.setBlockBounds(0.5F / 16F, 1.5F / 16F, 0.5F / 16F, 15.5F / 16F, 15F / 16F, 15.5F / 16F); + super.addCollisionBoxesToList(worldIn, x, y, z, mask, list, collider); + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { + for (int i = 0; i < EnderQuarryUpgradeManager.EnderQuarryUpgrade.VALUES.length; ++i) { + list.add(new ItemStack(itemIn, 1, i)); + } + } + @Override public boolean isOpaqueCube() { return false; @@ -48,6 +71,7 @@ public int damageDropped(int meta) { } public static class ItemEnderQuarryUpgrade extends ItemBlock { + public ItemEnderQuarryUpgrade(Block block) { super(block); setMaxDamage(0); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java index d5531800..d0f5dfdf 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java @@ -2,6 +2,7 @@ import java.util.HashMap; +import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; import org.jetbrains.annotations.Nullable; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; @@ -64,24 +65,27 @@ public void clear() { } public double getTotalCostMultiplier() { - return activeUpgrades.values().stream().mapToDouble(EnderQuarryUpgrade::getCost).sum(); + return activeUpgrades.values() + .stream() + .mapToDouble(EnderQuarryUpgrade::getCost) + .sum(); } public enum EnderQuarryUpgrade { + // Boolean upgrades (presence only) - WORLD_HOLE(1.2, "upgrade_world_hole"), - SILK_TOUCH(8, "upgrade_silk_touch"), - PUMP_FLUIDS(3, "upgrade_pump_fluids"), + WORLD_HOLE(EnderQuarryConfig.enderQuarryWorldHoleEnergyMultiplier, "upgrade_world_hole"), + SILK_TOUCH(EnderQuarryConfig.enderQuarrySilkTouchEnergyMultiplier, "upgrade_silk_touch"), + PUMP_FLUIDS(EnderQuarryConfig.enderQuarryFluidPumpEnergyMultiplier, "upgrade_pump_fluids"), // Tiered upgrades with hardcoded values - SPEED_1(TieredEnderQuarryUpgrade.SPEED, 1, 16, 2.0, "upgrade_speed_1"), - SPEED_2(TieredEnderQuarryUpgrade.SPEED, 2, 32, 4.0, "upgrade_speed_2"), - SPEED_3(TieredEnderQuarryUpgrade.SPEED, 3, 80, 7.0, "upgrade_speed_3"), - - FORTUNE_1(TieredEnderQuarryUpgrade.FORTUNE, 1, 12, 1, "upgrade_fortune_1"), - FORTUNE_2(TieredEnderQuarryUpgrade.FORTUNE, 2, 40, 2, "upgrade_fortune_2"), - FORTUNE_3(TieredEnderQuarryUpgrade.FORTUNE, 3, 100, 3, "upgrade_fortune_3"); + SPEED_1(TieredEnderQuarryUpgrade.SPEED, 1, EnderQuarryConfig.enderQuarrySpeed1EnergyMultiplier, EnderQuarryConfig.enderQuarrySpeed1Multiplier, "upgrade_speed_1"), + SPEED_2(TieredEnderQuarryUpgrade.SPEED, 2, EnderQuarryConfig.enderQuarrySpeed2EnergyMultiplier, EnderQuarryConfig.enderQuarrySpeed2Multiplier, "upgrade_speed_2"), + SPEED_3(TieredEnderQuarryUpgrade.SPEED, 3, EnderQuarryConfig.enderQuarrySpeed3EnergyMultiplier, EnderQuarryConfig.enderQuarrySpeed3Multiplier, "upgrade_speed_3"), + FORTUNE_1(TieredEnderQuarryUpgrade.FORTUNE, 1, EnderQuarryConfig.enderQuarryFortune1EnergyMultiplier, 1, "upgrade_fortune_1"), + FORTUNE_2(TieredEnderQuarryUpgrade.FORTUNE, 2, EnderQuarryConfig.enderQuarryFortune2EnergyMultiplier, 2, "upgrade_fortune_2"), + FORTUNE_3(TieredEnderQuarryUpgrade.FORTUNE, 3, EnderQuarryConfig.enderQuarryFortune3EnergyMultiplier, 3, "upgrade_fortune_3"); public static final EnderQuarryUpgrade[] VALUES = values(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java index af46f63a..51c6a493 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -472,6 +472,7 @@ public void readFromNBT(NBTTagCompound compound) { registeredMarkers.computeIfAbsent(dim, k -> new ConcurrentHashMap<>()) .put(new BlockPos(xCoord, yCoord, zCoord), this); this.operationMode = MarkerOperationMode.values()[compound.getInteger("mode")]; + this.cuboidSize = compound.getInteger("cuboidSize"); } @Override @@ -481,6 +482,7 @@ public void writeToNBT(NBTTagCompound compound) { compound.setInteger("meta", this.activeDirections); compound.setInteger("dim", this.worldObj.provider.dimensionId); compound.setInteger("mode", this.operationMode.ordinal()); + compound.setInteger("cuboidSize", this.cuboidSize); } public enum MarkerOperationMode { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index caa72be4..6d8f1de8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -13,7 +13,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; @@ -49,6 +48,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; +import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; @@ -57,9 +57,9 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver, IFluidHandler { - public static final int BASE_STEPS_PER_TICK = 400; - public static final int ITEM_BUFFER_CAPACITY = 256; - public static final Block REPLACE_BLOCK = EnderQuarryConfig.enderQuarryReplaceBlock.block; + public static final int BASE_STEPS_PER_TICK = EnderQuarryConfig.enderQuarryBaseSpeed; + public static final int ITEM_BUFFER_CAPACITY = 1024; + public static Block REPLACE_BLOCK = Blocks.dirt; public boolean isCreativeBoosted = false; private int storedItems; public ForgeDirection facing; @@ -72,6 +72,7 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver private int chunkX; private int chunkZ; private int brokenBlocksTotal; + private boolean sidesValidated = false; private final HashMap sidedItemAcceptors = new HashMap<>(); private final HashMap sidedFluidAcceptors = new HashMap<>(); private final EnderQuarryUpgradeManager upgradeManager = new EnderQuarryUpgradeManager(); @@ -86,6 +87,7 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver UIEUtils.ItemStackHashStrategy.instance); public TileEntityEnderQuarry() { + REPLACE_BLOCK = EnderQuarryReplaceBlock.valueOf(EnderQuarryConfig.enderQuarryReplaceBlock).block; resetState(); storedItems = 0; } @@ -558,13 +560,18 @@ private boolean tryConsumeEnergy(float hardness, boolean simulate) { return false; } + /** + * Harvests the block at the current position, and tries to store the resulting items / fluids to internal storage + * @return If we could store all resulting items / fluids + */ private boolean harvestAndStoreBlock(Block block) { try { + int meta = worldObj.getBlockMetadata(dx, dy, dz); if (upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.PUMP_FLUIDS)) { FluidStack fluid = null; - if (block == Blocks.water) { + if ((block == Blocks.water || block == Blocks.flowing_water) && meta == 0) { fluid = new FluidStack(FluidRegistry.WATER, 1000); - } else if (block == Blocks.lava) { + } else if ((block == Blocks.lava || block == Blocks.flowing_water) && meta == 0) { fluid = new FluidStack(FluidRegistry.LAVA, 1000); } else if (block instanceof IFluidBlock fluidBlock) { fluid = fluidBlock.drain(worldObj, dx, dy, dz, false); @@ -575,8 +582,8 @@ private boolean harvestAndStoreBlock(Block block) { } EntityPlayer fakePlayer = FakePlayerFactory.getMinecraft((WorldServer) worldObj); - @Nullable List drops = null; - int meta = worldObj.getBlockMetadata(dx, dy, dz); + @Nullable + List drops = null; // Try to silk touch if we have the upgrade if (upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.SILK_TOUCH)) { if (block.canSilkHarvest(worldObj, fakePlayer, dx, dy, dz, meta)) { @@ -788,6 +795,24 @@ private boolean ejectStoredToAdjacent() { return null; } + /** + * Retrieve all stored items, i.e. for the quarry is broke, and we need to drop its contents + * @return A list of all stored items as ItemStacks with correct stack sizes + */ + public List retrieveAllItems() { + List items = new ArrayList<>(); + for (Object2IntMap.Entry entry : itemStorage.object2IntEntrySet()) { + if (entry.getIntValue() > 0) { + ItemStack item = entry.getKey().copy(); + item.stackSize = entry.getIntValue(); + items.add(item); + } + } + itemStorage.clear(); + storedItems = 0; + return items; + } + public void scanSidesForTEs() { sidedFluidAcceptors.clear(); sidedItemAcceptors.clear(); @@ -851,7 +876,11 @@ public void scanSidesForTEs() { * Does not check for anything, should be called after tryHarvestCurrentBlock() returns true. */ private void removeCurrentBlock() { - worldObj.setBlock(dx, dy, dz, upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.WORLD_HOLE) ? Blocks.air : REPLACE_BLOCK); + worldObj.setBlock( + dx, + dy, + dz, + upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.WORLD_HOLE) ? Blocks.air : REPLACE_BLOCK); } // TileEntity & LoadableTE @@ -866,9 +895,9 @@ public void validate() { * preferably we would call scanSidesForTEs() here, however * the contained getTileEntity() seems to always re-load the chunk at this stage * which then re-validates back to this function, eventually leading to a stackoverflow - * Instead we add a null inventory, so that it gets rechecked later - **/ - sidedItemAcceptors.put(ForgeDirection.UP, null); + * Instead we set the side check state to false, so that the next updateEntity() call does the scan + */ + sidesValidated = false; } } @@ -878,6 +907,10 @@ public void updateEntity() { if (worldObj.isRemote) return; if (facing == ForgeDirection.UNKNOWN) return; if (state == QuarryWorkState.FINISHED && storedItems == 0 && fluidStorageIsEmpty()) return; + if (!sidesValidated) { + scanSidesForTEs(); + sidesValidated = true; + } int brokenBlocksTick = 0; if (state != QuarryWorkState.RUNNING && state != QuarryWorkState.FINISHED && state != QuarryWorkState.STOPPED) { @@ -893,8 +926,9 @@ public void updateEntity() { } } + int stepsPerTick = (int) (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1) * upgradeManager.getValue(EnderQuarryUpgradeManager.TieredEnderQuarryUpgrade.SPEED, 1.0)); if (state == QuarryWorkState.RUNNING) { - while (brokenBlocksTick < (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1)) && stepPos()) { + while (brokenBlocksTick < (stepsPerTick) && stepPos()) { // TODO: Remove after this has been tested by others if (!isInBounds() || this.chunkX > 1000 || this.chunkZ > 1000) { UtilitiesInExcess.LOG.warn( @@ -1215,4 +1249,19 @@ public String toString() { return String.format("[(%d, %d), (%d, %d)]", this.low.x, this.low.y, this.high.x, this.high.y); } } + + private enum EnderQuarryReplaceBlock { + + COBBLE(Blocks.cobblestone), + DIRT(Blocks.dirt), + GLASS(Blocks.glass), + SNOW(Blocks.snow), + STONE(Blocks.stone); + + public final Block block; + + EnderQuarryReplaceBlock(Block block) { + this.block = block; + } + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java index 50c25167..f2f135b2 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java @@ -2,13 +2,12 @@ import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.gtnewhorizon.gtnhlib.config.Config; -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; @Config(modid = UtilitiesInExcess.MODID, category = "blocks.ender_quarry") @Config.Comment("Ender Quarry Configuration") @Config.LangKey("utilitiesinexcess.config.block.ender_quarry") public class EnderQuarryConfig { + // TODO: Balance everything in here @Config.DefaultBoolean(true) public static boolean enableEnderQuarry; @@ -31,22 +30,63 @@ public class EnderQuarryConfig { @Config.RangeInt(min = 100, max = 1_024_000) public static int enderQuarryBaseRFCost; - @Config.DefaultEnum("COBBLE") - @Config.Comment("Block type to replace mined blocks with if the world hole upgrade isn't present.") - public static EnderQuarryReplaceBlock enderQuarryReplaceBlock; + @Config.DefaultStringList({"COBBLE", "DIRT", "GLASS", "SNOW", "STONE"}) + @Config.DefaultString("COBBLE") + @Config.Comment("Block type to replace mined blocks with if the world hole upgrade isn't present.") + public static String enderQuarryReplaceBlock; + @Config.DefaultInt(400) + @Config.Comment("The amount of blocks the quarry tries to mine per tick, without speed upgrades.") + public static int enderQuarryBaseSpeed; - public enum EnderQuarryReplaceBlock { - COBBLE(Blocks.cobblestone), - DIRT(Blocks.dirt), - GLASS(Blocks.glass), - SNOW(Blocks.snow), - STONE(Blocks.stone); - public final Block block; + @Config.DefaultDouble(2D) + @Config.Comment("The multiplier applied to the base speed mine speed.") + public static double enderQuarrySpeed1Multiplier; - EnderQuarryReplaceBlock(Block block) { - this.block = block; - } - } + @Config.DefaultDouble(8D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarrySpeed1EnergyMultiplier; + + @Config.DefaultDouble(4D) + @Config.Comment("The multiplier applied to the base speed mine speed.") + public static double enderQuarrySpeed2Multiplier; + + @Config.DefaultDouble(16D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarrySpeed2EnergyMultiplier; + + @Config.DefaultDouble(7D) + @Config.Comment("The multiplier applied to the base speed mine speed.") + public static double enderQuarrySpeed3Multiplier; + + @Config.DefaultDouble(32D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarrySpeed3EnergyMultiplier; + + + @Config.DefaultDouble(12D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarryFortune1EnergyMultiplier; + + @Config.DefaultDouble(40D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarryFortune2EnergyMultiplier; + + @Config.DefaultDouble(100D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarryFortune3EnergyMultiplier; + + + @Config.DefaultDouble(1.2D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarryWorldHoleEnergyMultiplier; + + @Config.DefaultDouble(8D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarrySilkTouchEnergyMultiplier; + + @Config.DefaultDouble(3D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarryFluidPumpEnergyMultiplier; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java index b397c6f4..5e65117a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java @@ -1,12 +1,13 @@ package com.fouristhenumber.utilitiesinexcess.utils; -import it.unimi.dsi.fastutil.Hash; -import net.minecraft.item.ItemStack; - import java.text.DecimalFormat; import java.util.Objects; import java.util.Random; +import net.minecraft.item.ItemStack; + +import it.unimi.dsi.fastutil.Hash; + public class UIEUtils { public static final Random uieRandom = new Random(); From 7a9c490dc331fd4c0da303a4f8195ee352fafa1f Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Mon, 22 Dec 2025 22:40:20 +0100 Subject: [PATCH 19/28] Send message to owner when done --- .../blocks/ender_quarry/BlockEnderQuarry.java | 2 +- .../tileentities/TileEntityEnderQuarry.java | 41 ++++++++++++++----- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java index 1eb94d90..7661e6d7 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java @@ -46,7 +46,7 @@ public void onBlockPlacedBy(World worldIn, int x, int y, int z, EntityLivingBase TileEntity te = worldIn.getTileEntity(x, y, z); if (te instanceof TileEntityEnderQuarry quarry) { quarry.facing = getFacing(direction); - quarry.resetState(); + quarry.ownerUUID = placer.getUniqueID(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 6d8f1de8..3cdf694e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -10,18 +10,21 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; +import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; import net.minecraft.world.ChunkCoordIntPair; @@ -73,6 +76,7 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver private int chunkZ; private int brokenBlocksTotal; private boolean sidesValidated = false; + public @Nullable UUID ownerUUID = null; private final HashMap sidedItemAcceptors = new HashMap<>(); private final HashMap sidedFluidAcceptors = new HashMap<>(); private final EnderQuarryUpgradeManager upgradeManager = new EnderQuarryUpgradeManager(); @@ -92,7 +96,7 @@ public TileEntityEnderQuarry() { storedItems = 0; } - public void resetState() { + private void resetState() { state = QuarryWorkState.STOPPED; brokenBlocksTotal = 0; } @@ -100,18 +104,18 @@ public void resetState() { public String getState() { return switch (state) { case RUNNING -> String.format( - "Quarry is currently mining at %d %d %d, has already mined %d blocks", + "Quarry is currently mining at %d %d %d, has already mined %d blocks.", dx, dy, dz, brokenBlocksTotal); - case STOPPED_WAITING_FOR_FLUID_SPACE -> "Quarry is full on fluids"; - case STOPPED_WAITING_FOR_ITEM_SPACE -> "Quarry is full on items"; - case STOPPED_WAITING_FOR_ENERGY -> "Quarry is missing energy"; - case THROTTLED_BY_ENERGY -> "Quarry is running, but not at full speed because of missing energy"; + case STOPPED_WAITING_FOR_FLUID_SPACE -> "Quarry is full on fluids."; + case STOPPED_WAITING_FOR_ITEM_SPACE -> "Quarry is full on items."; + case STOPPED_WAITING_FOR_ENERGY -> "Quarry is missing energy."; + case THROTTLED_BY_ENERGY -> "Quarry is running, but not at full speed because of missing energy."; case STOPPED -> "Quarry is stopped."; case FINISHED -> String.format( - "Quarry has finished after mining %d blocks%s", + "Quarry has finished after mining %d blocks%s.", brokenBlocksTotal, String.format(storedItems > 0 ? ", still holding %d items" : "", storedItems)); }; @@ -906,7 +910,21 @@ public void validate() { public void updateEntity() { if (worldObj.isRemote) return; if (facing == ForgeDirection.UNKNOWN) return; - if (state == QuarryWorkState.FINISHED && storedItems == 0 && fluidStorageIsEmpty()) return; + if (state == QuarryWorkState.FINISHED && storedItems == 0 && fluidStorageIsEmpty() && ownerUUID == null) { + if (selfIsLoaded) unloadSelf(); + return; + }; + if (state == QuarryWorkState.FINISHED && ownerUUID != null && worldObj.getTotalWorldTime() % 100 == 0) { + // Check if owner is online + MinecraftServer server = MinecraftServer.getServer(); + if (server != null) { + EntityPlayerMP owner = server.getConfigurationManager().playerEntityList.stream().filter((EntityPlayerMP player) -> player.getUniqueID().equals(ownerUUID)).findFirst().orElse(null); + if (owner != null) { + owner.addChatMessage(new ChatComponentText(String.format("Your Ender Quarry at (%d %d %d) in DIM %d has finished.", xCoord, yCoord, zCoord, worldObj.provider.dimensionId))); + ownerUUID = null; + } + } + } if (!sidesValidated) { scanSidesForTEs(); sidesValidated = true; @@ -959,7 +977,6 @@ public void updateEntity() { && state == QuarryWorkState.RUNNING) { if (nextWorkAreas.isEmpty()) { state = QuarryWorkState.FINISHED; - unloadSelf(); } else { setWorkArea(nextWorkAreas.remove(nextWorkAreas.size() - 1)); } @@ -977,7 +994,7 @@ public void updateEntity() { this.brokenBlocksTotal += brokenBlocksTick; } - if (worldObj.getTotalWorldTime() % 4 == 0) { + if (worldObj.getTotalWorldTime() % 4 == 0 && (storedItems > 0 || !fluidStorageIsEmpty())) { // Move internally stored stuff to adjacent blocks if (!ejectStoredToAdjacent()) scanSidesForTEs(); } @@ -1008,6 +1025,8 @@ public void readFromNBT(NBTTagCompound nbt) { } } brokenBlocksTotal = nbt.getInteger("blocks"); + ownerUUID = nbt.getString("owner").isEmpty() ? null : UUID.fromString(nbt.getString("owner")); + energyStorage.readFromNBT(nbt); NBTTagList tanksNBT = nbt.getTagList("tanks", Constants.NBT.TAG_COMPOUND); @@ -1051,6 +1070,8 @@ public void writeToNBT(NBTTagCompound nbt) { nbt.setTag("nextAreas", areasNBT); } nbt.setInteger("blocks", brokenBlocksTotal); + nbt.setString("owner", ownerUUID != null ? ownerUUID.toString() : ""); + energyStorage.writeToNBT(nbt); NBTTagList tanksNBT = new NBTTagList(); From ca477dd36ed3e0a4f7e93d98e71060d42a2f15ca Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Fri, 9 Jan 2026 03:43:25 +0100 Subject: [PATCH 20/28] Add waila support, fix some more bugs with arbitrary areas, start on providing messages via localization --- dependencies.gradle | 2 +- .../utilitiesinexcess/CommonProxy.java | 4 + .../utilitiesinexcess/UtilitiesInExcess.java | 2 +- .../tileentities/TileEntityEnderQuarry.java | 180 ++++++++++++------ .../utilitiesinexcess/compat/Mods.java | 1 + .../compat/waila/WailaHandler.java | 62 ++++++ .../assets/utilitiesinexcess/lang/en_US.lang | 10 + .../models/blocks/ender_quarry.json | 82 +------- 8 files changed, 204 insertions(+), 139 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java diff --git a/dependencies.gradle b/dependencies.gradle index 71cad413..cc1becba 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -58,6 +58,6 @@ dependencies { runtimeOnlyNonPublishable('curse.maven:chicken-chunks-229316:2233250') runtimeOnlyNonPublishable("com.github.GTNewHorizons:WAILAPlugins:0.7.2:dev") { transitive = false } - runtimeOnlyNonPublishable("com.github.GTNewHorizons:waila:1.9.15:dev") { transitive = false } + api("com.github.GTNewHorizons:waila:1.9.15:dev") { transitive = false } runtimeOnlyNonPublishable("com.github.GTNewHorizons:ServerUtilities:2.2.5:dev") { transitive = false } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java index 2d8fcedf..9d971ffb 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -8,6 +8,7 @@ import com.fouristhenumber.utilitiesinexcess.utils.SoundVolumeChecks; import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; @@ -35,6 +36,9 @@ public void preInit(FMLPreInitializationEvent event) { public void init(FMLInitializationEvent event) { soundVolumeChecks = new SoundVolumeChecks(); ModTileEntities.init(); + if (Mods.Waila.isLoaded()) { + FMLInterModComms.sendMessage("Waila", "register", "com.fouristhenumber.utilitiesinexcess.compat.waila.WailaHandler.callbackRegister"); + } } public void postInit(FMLPostInitializationEvent event) {} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index 11d6b47f..ba864f27 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -38,7 +38,7 @@ version = Tags.VERSION, name = "UtilitiesInExcess", acceptedMinecraftVersions = "[1.7.10]", - dependencies = "required-after:gtnhlib@[0.6.31,)") + dependencies = "required-after:gtnhlib@[0.6.31,);after:Waila;") public class UtilitiesInExcess { public static final String MODID = "utilitiesinexcess"; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 3cdf694e..afc6acf3 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -75,6 +75,8 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver private int chunkX; private int chunkZ; private int brokenBlocksTotal; + private int estimatedTotalBlocks; + private int startedAt; private boolean sidesValidated = false; public @Nullable UUID ownerUUID = null; private final HashMap sidedItemAcceptors = new HashMap<>(); @@ -172,29 +174,27 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { } else { // DEBUG: Clear work area of debug blocks - /* - * Vector2i low = new Vector2i(Integer.MAX_VALUE); - * Vector2i high = new Vector2i(Integer.MIN_VALUE); - * for (Vector2i point : scanReturn) { - * if (point.x < low.x) { - * low.x = point.x; - * } - * if (point.y < low.y) { - * low.y = point.y; - * } - * if (point.x > high.x) { - * high.x = point.x; - * } - * if (point.y > high.y) { - * high.y = point.y; - * } - * } - * for (int x = low.x; x <= high.x; x++) { - * for (int z = low.y; z <= high.y; z++) { - * worldObj.setBlock(x, this.yCoord - 1, z, Blocks.grass); - * } - * } - */ +// Vector2i low = new Vector2i(Integer.MAX_VALUE); +// Vector2i high = new Vector2i(Integer.MIN_VALUE); +// for (Vector2i point : scanReturn) { +// if (point.x < low.x) { +// low.x = point.x; +// } +// if (point.y < low.y) { +// low.y = point.y; +// } +// if (point.x > high.x) { +// high.x = point.x; +// } +// if (point.y > high.y) { +// high.y = point.y; +// } +// } +// for (int x = low.x; x <= high.x; x++) { +// for (int z = low.y; z <= high.y; z++) { +// worldObj.setBlock(x, this.yCoord - 1, z, Blocks.grass); +// } +// } nextWorkAreas = computeRectanglesFromRectilinearPointPolygon(scanReturn); setWorkArea(nextWorkAreas.remove(nextWorkAreas.size() - 1)); @@ -220,9 +220,9 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { private List computeRectanglesFromRectilinearPointPolygon(List points) { RectilinearEdgePoly poly = new RectilinearEdgePoly(points); List subAreas = new ArrayList<>(); - // DEBUG: int color = 0; List activeSpans = new ArrayList<>(); + HashMap> shrunkSpansByY = new HashMap<>(); // Sweep through y coordinates from bottom to top, skip last since we handle active spans after the loop for (int i = 0; i < poly.yCoords.size() - 1; i++) { @@ -257,6 +257,34 @@ private List computeRectanglesFromRectilinearPointPolygon(List boolean intersectsWithTopBoundary = poly.intersectsWithHorizontalBoundary(y, lowX, highX) && (active.y != y); + // Check for overlaps with previously shrunk spans which would be excluded, + // And create smaller single-line areas for them + // Store bottom and top spans that were shrunk inwards due to boundary intersections + if (intersectsWithBottomBoundary) { + for (RectilinearEdgePoly.Span span : shrunkSpansByY.getOrDefault(active.y, Collections.emptyList())) { + // Check if the two intersect horizontally + if (span.pointIsInSpan(lowX)) { + subAreas.add(new Area2d(lowX, active.y, span.getMaxX(), active.y)); + } else if (span.pointIsInSpan(highX)) { + subAreas.add(new Area2d(span.getMinX(), active.y, highX, active.y)); + } + } + shrunkSpansByY.computeIfAbsent(active.y, k -> new ArrayList<>()) + .add(new RectilinearEdgePoly.Span(lowX, highX, active.y)); + } + if (intersectsWithTopBoundary) { + for (RectilinearEdgePoly.Span span : shrunkSpansByY.getOrDefault(y, Collections.emptyList())) { + // Check if the two intersect horizontally + if (span.pointIsInSpan(lowX)) { + subAreas.add(new Area2d(lowX, y, span.getMaxX(), y)); + } else if (span.pointIsInSpan(highX)) { + subAreas.add(new Area2d(span.getMinX(), y, highX, y)); + } + } + shrunkSpansByY.computeIfAbsent(y, k -> new ArrayList<>()) + .add(new RectilinearEdgePoly.Span(lowX, highX, y)); + } + Area2d subArea = new Area2d( active.x1, active.y, @@ -264,9 +292,11 @@ private List computeRectanglesFromRectilinearPointPolygon(List y, new Vector4i(1, intersectsWithBottomBoundary ? 1 : 0, 1, intersectsWithTopBoundary ? 1 : 0)); - // The base area should have a width and height greater than zero, but that might change after - // applying shrinkage - if (subArea.height > 0 && subArea.width > 0) subAreas.add(subArea); + // The base area should have a width and height on init greater than zero, but that might change after + // applying shrinkage. + // We keep any area with width >= 0 and height >= 0 to allow for weird cases with single line areas. + if (subArea.height >= 0 && subArea.width >= 0) + subAreas.add(subArea); } } @@ -283,10 +313,22 @@ private List computeRectanglesFromRectilinearPointPolygon(List // Output remaining active spans that can't be extended anymore int lastY = poly.yCoords.get(poly.yCoords.size() - 1); for (RectilinearEdgePoly.Span span : activeSpans) { - boolean intersectsWithBottomBoundary = poly.intersectsWithHorizontalBoundary( - span.y, - Math.min(span.x1, span.x2) + 1, - Math.max(span.x1, span.x2) - 1) && (span.y != lastY); + int lowX = Math.min(span.x1, span.x2) + 1; + int highX = Math.max(span.x1, span.x2) - 1; + boolean intersectsWithBottomBoundary = poly.intersectsWithHorizontalBoundary(span.y, lowX, highX) && (span.y != lastY); + + // Same overlap check as before, just for bottom side now + if (intersectsWithBottomBoundary) { + for (RectilinearEdgePoly.Span shrunkSpan : shrunkSpansByY.getOrDefault(span.y, Collections.emptyList())) { + // Check if the two intersect horizontally + if (shrunkSpan.pointIsInSpan(lowX)) { + subAreas.add(new Area2d(lowX, span.y, shrunkSpan.getMaxX(), span.y)); + } else if (shrunkSpan.pointIsInSpan(highX)) { + subAreas.add(new Area2d(shrunkSpan.getMinX(), span.y, highX, span.y)); + } + } + } + // Always shrink top side on last rectangle subAreas.add( new Area2d( @@ -298,25 +340,26 @@ private List computeRectanglesFromRectilinearPointPolygon(List } // DEBUG: Draw sub areas on floor - /* - * for (Area2d subArea : subAreas) { - * for (int x = subArea.low.x; x <= subArea.high.x; x++) { - * for (int z = subArea.low.y; z <= subArea.high.y; z++) { - * if (worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.wool || worldObj.getBlock(x, this.yCoord - 1, z) == - * Blocks.gold_block) { - * worldObj.setBlock(x, this.yCoord - 1, z, Blocks.gold_block); - * //throw new RuntimeException("Overlapping sub-areas detected at " + x + ", " + z); - * } else { - * worldObj.setBlock(x, this.yCoord - 1, z, Blocks.wool, color, 2); - * } - * } - * } - * color++; - * if (color == 16) { - * color = 0; - * } - * } - */ +// int color = 0; +// for (Area2d subArea : subAreas) { +// for (int x = subArea.low.x; x <= subArea.high.x; x++) { +// for (int z = subArea.low.y; z <= subArea.high.y; z++) { +// if (worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.wool || worldObj.getBlock(x, this.yCoord - 1, z) == +// Blocks.gold_block) { +// worldObj.setBlock(x, this.yCoord - 1, z, Blocks.gold_block); +// //worldObj.setBlock(x, this.yCoord + 3 + color, z, Blocks.stained_glass, color, 2); +// +// //throw new RuntimeException("Overlapping sub-areas detected at " + x + ", " + z); +// } else { +// worldObj.setBlock(x, this.yCoord - 1, z, Blocks.wool, color, 2); +// } +// } +// } +// color++; +// if (color == 16) { +// color = 0; +// } +// } return subAreas; } @@ -462,6 +505,21 @@ static class Span { boolean matches(Span other) { return this.x1 == other.x1 && this.x2 == other.x2; } + + int getMinX() { + return Math.min(x1, x2); + } + + int getMaxX() { + return Math.max(x1, x2); + } + + /** + * Check if an x value is within the span, assuming y is the same + */ + boolean pointIsInSpan(int x) { + return x >= getMinX() && x <= getMaxX(); + } } } @@ -1169,13 +1227,21 @@ public FluidTankInfo[] getTankInfo(ForgeDirection from) { } public enum QuarryWorkState { - STOPPED, - STOPPED_WAITING_FOR_FLUID_SPACE, - STOPPED_WAITING_FOR_ITEM_SPACE, - STOPPED_WAITING_FOR_ENERGY, - THROTTLED_BY_ENERGY, - FINISHED, - RUNNING + STOPPED("uie.quarry.state.1"), + STOPPED_WAITING_FOR_FLUID_SPACE("uie.quarry.state.2"), + STOPPED_WAITING_FOR_ITEM_SPACE("uie.quarry.state.3"), + STOPPED_WAITING_FOR_ENERGY("uie.quarry.state.4"), + THROTTLED_BY_ENERGY("uie.quarry.state.5"), + FINISHED("uie.quarry.state.6"), + RUNNING("uie.quarry.state.7"); + + public static final QuarryWorkState[] VALUES = values(); + + public final String localKey; + + QuarryWorkState(String localKey) { + this.localKey = localKey; + } } public static class Area2d { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java index d5d73f19..5ed769c6 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java @@ -12,6 +12,7 @@ public enum Mods { Thaumcraft("Thaumcraft"), NEI("NotEnoughItems"), CraftTweaker("MineTweaker3"), + Waila("Waila"), ; // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java new file mode 100644 index 00000000..75e0075f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java @@ -0,0 +1,62 @@ +package com.fouristhenumber.utilitiesinexcess.compat.waila; + + +import com.fouristhenumber.utilitiesinexcess.CommonProxy; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import mcp.mobius.waila.api.IWailaDataProvider; +import mcp.mobius.waila.api.IWailaRegistrar; +import mcp.mobius.waila.cbcore.LangUtil; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import java.util.List; + + +/** + Registered in {@link CommonProxy} via IMC. + */ +public class WailaHandler implements IWailaDataProvider { + + public static void callbackRegister(IWailaRegistrar registrar) { + WailaHandler instance = new WailaHandler(); + registrar.registerBodyProvider(instance, TileEntityEnderQuarry.class); + registrar.registerNBTProvider(instance, TileEntityEnderQuarry.class); + } + + @Override + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { + return null; + } + + @Override + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + return currenttip; + } + + @Override + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + if (accessor.getTileEntity() instanceof TileEntityEnderQuarry) { + TileEntityEnderQuarry.QuarryWorkState state = TileEntityEnderQuarry.QuarryWorkState.VALUES[accessor.getNBTData().getInteger("state")]; + currenttip.add(String.format(LangUtil.instance.translate("uie.quarry.waila.state"), LangUtil.instance.translate(state.localKey))); + } + return currenttip; + } + + @Override + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + return currenttip; + } + + @Override + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, int x, int y, int z) { + if (te != null) { + te.writeToNBT(tag); + } + return tag; + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index b8a22740..8a591550 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -281,3 +281,13 @@ nei.infopage.uie.temporal_gate.2=No monsters will spawn to harass you, and there nei.infopage.uie.temporal_gate.3=Right-click the portal in any other dimension to enter. Right-click the portal in the End of Time to return to where you came from, or shift-right-click it to return to the Overworld's spawn point. nei.infopage.uie.temporal_gate.4=You will appear at the most recent portal placed in the End of Time. If it no longer exists, you will appear at the bedrock below where you originally entered. If even that is gone, the platform will reappear, replacing anything in its way. nei.infopage.uie.temporal_gate.5=§4§oWas that red star in the sky always there? + +uie.quarry.state.1=Stopped +uie.quarry.state.2=Waiting for Fluid Space +uie.quarry.state.3=Waiting for Item Space +uie.quarry.state.4=Waiting for Energy +uie.quarry.state.5=Throttled by Energy +uie.quarry.state.6=Finished +uie.quarry.state.7=Running + +uie.quarry.waila.state=Status: %s diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/ender_quarry.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/ender_quarry.json index 3ea408cb..3dd99364 100644 --- a/src/main/resources/assets/utilitiesinexcess/models/blocks/ender_quarry.json +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/ender_quarry.json @@ -722,84 +722,6 @@ "down": {"uv": [3.75, 12.5, 3.5, 13], "texture": "#0"} } }, - { - "from": [12, 5, 1], - "to": [13, 11, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 1]}, - "faces": { - "north": {"uv": [10.5, 2, 10.75, 3.5], "texture": "#0"}, - "east": {"uv": [5.5, 10.5, 5.75, 12], "texture": "#0"}, - "south": {"uv": [5.75, 10.5, 6, 12], "texture": "#0"}, - "west": {"uv": [10.5, 9.5, 10.75, 11], "texture": "#0"}, - "up": {"uv": [5, 13.25, 4.75, 13], "texture": "#0"}, - "down": {"uv": [13.25, 4.75, 13, 5], "texture": "#0"} - } - }, - { - "from": [10, 6, 1], - "to": [11, 10, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 1]}, - "faces": { - "north": {"uv": [10.5, 11, 10.75, 12], "texture": "#0"}, - "east": {"uv": [11.5, 8, 11.75, 9], "texture": "#0"}, - "south": {"uv": [8.5, 11.5, 8.75, 12.5], "texture": "#0"}, - "west": {"uv": [8.75, 11.5, 9, 12.5], "texture": "#0"}, - "up": {"uv": [5.25, 13.25, 5, 13], "texture": "#0"}, - "down": {"uv": [13.25, 5, 13, 5.25], "texture": "#0"} - } - }, - { - "from": [5, 12, 1], - "to": [11, 13, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 1]}, - "faces": { - "north": {"uv": [9.5, 8.5, 11, 8.75], "texture": "#0"}, - "east": {"uv": [5.25, 13, 5.5, 13.25], "texture": "#0"}, - "south": {"uv": [9.5, 8.75, 11, 9], "texture": "#0"}, - "west": {"uv": [13, 5.25, 13.25, 5.5], "texture": "#0"}, - "up": {"uv": [11.5, 6.75, 10, 6.5], "texture": "#0"}, - "down": {"uv": [11.5, 6.75, 10, 7], "texture": "#0"} - } - }, - { - "from": [6, 10, 1], - "to": [10, 11, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 1]}, - "faces": { - "north": {"uv": [9, 11.5, 10, 11.75], "texture": "#0"}, - "east": {"uv": [5.5, 13, 5.75, 13.25], "texture": "#0"}, - "south": {"uv": [11.5, 9, 12.5, 9.25], "texture": "#0"}, - "west": {"uv": [13, 5.5, 13.25, 5.75], "texture": "#0"}, - "up": {"uv": [12.5, 9.5, 11.5, 9.25], "texture": "#0"}, - "down": {"uv": [12.5, 9.5, 11.5, 9.75], "texture": "#0"} - } - }, - { - "from": [3, 5, 1], - "to": [4, 11, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 1]}, - "faces": { - "north": {"uv": [1.5, 10.75, 1.75, 12.25], "texture": "#0"}, - "east": {"uv": [1.75, 10.75, 2, 12.25], "texture": "#0"}, - "south": {"uv": [10.75, 2, 11, 3.5], "texture": "#0"}, - "west": {"uv": [3, 10.75, 3.25, 12.25], "texture": "#0"}, - "up": {"uv": [6, 13.25, 5.75, 13], "texture": "#0"}, - "down": {"uv": [13.25, 5.75, 13, 6], "texture": "#0"} - } - }, - { - "from": [5, 6, 1], - "to": [6, 10, 2], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.25, 1]}, - "faces": { - "north": {"uv": [11.5, 9.75, 11.75, 10.75], "texture": "#0"}, - "east": {"uv": [11.5, 10.75, 11.75, 11.75], "texture": "#0"}, - "south": {"uv": [11, 11.5, 11.25, 12.5], "texture": "#0"}, - "west": {"uv": [11.25, 11.5, 11.5, 12.5], "texture": "#0"}, - "up": {"uv": [6.25, 13.25, 6, 13], "texture": "#0"}, - "down": {"uv": [13.25, 6, 13, 6.25], "texture": "#0"} - } - }, { "from": [7, 6, 1], "to": [9, 9, 2], @@ -980,7 +902,7 @@ "name": "group", "origin": [8, 8, 8], "color": 0, - "children": [47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72] + "children": [47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66] } ] -} +} \ No newline at end of file From 96f88bd9c5655855b51ac26ed9b5309c920b1b57 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Sun, 18 Jan 2026 02:48:42 +0100 Subject: [PATCH 21/28] Use GTNHLib ItemSink for storing items, improve performance in some hot-paths, fix overflowing item size in nbt, apply spotless --- dependencies.gradle | 5 + .../utilitiesinexcess/CommonProxy.java | 5 +- .../ender_quarry/BlockEnderQuarryUpgrade.java | 8 +- .../EnderQuarryUpgradeManager.java | 54 +++- .../tileentities/TileEntityEnderQuarry.java | 241 ++++++++++-------- .../compat/waila/WailaHandler.java | 41 +-- .../config/blocks/EnderQuarryConfig.java | 55 ++-- 7 files changed, 243 insertions(+), 166 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index cc1becba..dc8f482c 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -56,6 +56,11 @@ dependencies { // For debugging chunkloading runtimeOnlyNonPublishable('curse.maven:chicken-chunks-229316:2233250') + // Testing performance with ender quarry inserts + runtimeOnlyNonPublishable('com.github.GTNewHorizons:Avaritiaddons:1.9.3-GTNH:dev') { transitive = true } + runtimeOnlyNonPublishable('com.github.GTNewHorizons:Avaritia:1.81-pre:dev') { transitive = false } + runtimeOnlyNonPublishable('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-789-GTNH:dev') { transitive = true } + runtimeOnlyNonPublishable rfg.deobf(files("libs/spark-1.10.pre-forge-1.7.10.jar")) runtimeOnlyNonPublishable("com.github.GTNewHorizons:WAILAPlugins:0.7.2:dev") { transitive = false } api("com.github.GTNewHorizons:waila:1.9.15:dev") { transitive = false } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java index 9d971ffb..5c25e69c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -37,7 +37,10 @@ public void init(FMLInitializationEvent event) { soundVolumeChecks = new SoundVolumeChecks(); ModTileEntities.init(); if (Mods.Waila.isLoaded()) { - FMLInterModComms.sendMessage("Waila", "register", "com.fouristhenumber.utilitiesinexcess.compat.waila.WailaHandler.callbackRegister"); + FMLInterModComms.sendMessage( + "Waila", + "register", + "com.fouristhenumber.utilitiesinexcess.compat.waila.WailaHandler.callbackRegister"); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java index accc208e..ec0cb259 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java @@ -2,6 +2,8 @@ import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; +import java.util.List; + import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -12,12 +14,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; +import net.minecraft.world.World; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.world.World; - -import java.util.List; public class BlockEnderQuarryUpgrade extends Block { @@ -34,7 +34,7 @@ public BlockEnderQuarryUpgrade() { @Override public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, - List list, Entity collider) { + List list, Entity collider) { this.setBlockBounds(0.5F / 16F, 1.5F / 16F, 0.5F / 16F, 15.5F / 16F, 15F / 16F, 15.5F / 16F); super.addCollisionBoxesToList(worldIn, x, y, z, mask, list, collider); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java index d0f5dfdf..c0fdff61 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java @@ -1,15 +1,17 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry; import java.util.HashMap; +import java.util.HashSet; -import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; import org.jetbrains.annotations.Nullable; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; public class EnderQuarryUpgradeManager { private final HashMap activeUpgrades = new HashMap<>(); + public double totalCostMultiplier = 1.0; // Add an upgrade - keeps highest tier public void addUpgrade(EnderQuarryUpgrade upgrade) { @@ -24,6 +26,7 @@ public void addUpgrade(EnderQuarryUpgrade upgrade) { activeUpgrades.put(baseName, upgrade); } } + totalCostMultiplier = getTotalCostMultiplier(); } // Check if a specific upgrade is active @@ -58,17 +61,38 @@ public void remove(EnderQuarryUpgrade upgrade) { } else { activeUpgrades.remove(upgrade.getTierGroup()); } + totalCostMultiplier = getTotalCostMultiplier(); } public void clear() { activeUpgrades.clear(); + totalCostMultiplier = 1.0; } + /** + * Calculate the total cost multiplier from all active upgrades, mainly used internally. + * Use totalCostMultiplier field for fewer recalculations instead. + */ public double getTotalCostMultiplier() { - return activeUpgrades.values() - .stream() - .mapToDouble(EnderQuarryUpgrade::getCost) - .sum(); + double total = 1.0; + HashSet countedTieredUpgrades = new HashSet<>(); + for (EnderQuarryUpgrade upgrade : EnderQuarryUpgrade.VALUES) { + if (this.has(upgrade)) { + if (upgrade.isBoolean()) { + total += upgrade.cost; + } else { + // Tiered upgrade - only count the highest tier once + TieredEnderQuarryUpgrade tierGroup = upgrade.tierGroup; + if (tierGroup == null || countedTieredUpgrades.contains(tierGroup)) { + continue; + } + countedTieredUpgrades.add(tierGroup); + + total += this.getActive(tierGroup).cost; + } + } + } + return total; } public enum EnderQuarryUpgrade { @@ -79,13 +103,19 @@ public enum EnderQuarryUpgrade { PUMP_FLUIDS(EnderQuarryConfig.enderQuarryFluidPumpEnergyMultiplier, "upgrade_pump_fluids"), // Tiered upgrades with hardcoded values - SPEED_1(TieredEnderQuarryUpgrade.SPEED, 1, EnderQuarryConfig.enderQuarrySpeed1EnergyMultiplier, EnderQuarryConfig.enderQuarrySpeed1Multiplier, "upgrade_speed_1"), - SPEED_2(TieredEnderQuarryUpgrade.SPEED, 2, EnderQuarryConfig.enderQuarrySpeed2EnergyMultiplier, EnderQuarryConfig.enderQuarrySpeed2Multiplier, "upgrade_speed_2"), - SPEED_3(TieredEnderQuarryUpgrade.SPEED, 3, EnderQuarryConfig.enderQuarrySpeed3EnergyMultiplier, EnderQuarryConfig.enderQuarrySpeed3Multiplier, "upgrade_speed_3"), - - FORTUNE_1(TieredEnderQuarryUpgrade.FORTUNE, 1, EnderQuarryConfig.enderQuarryFortune1EnergyMultiplier, 1, "upgrade_fortune_1"), - FORTUNE_2(TieredEnderQuarryUpgrade.FORTUNE, 2, EnderQuarryConfig.enderQuarryFortune2EnergyMultiplier, 2, "upgrade_fortune_2"), - FORTUNE_3(TieredEnderQuarryUpgrade.FORTUNE, 3, EnderQuarryConfig.enderQuarryFortune3EnergyMultiplier, 3, "upgrade_fortune_3"); + SPEED_1(TieredEnderQuarryUpgrade.SPEED, 1, EnderQuarryConfig.enderQuarrySpeed1EnergyMultiplier, + EnderQuarryConfig.enderQuarrySpeed1Multiplier, "upgrade_speed_1"), + SPEED_2(TieredEnderQuarryUpgrade.SPEED, 2, EnderQuarryConfig.enderQuarrySpeed2EnergyMultiplier, + EnderQuarryConfig.enderQuarrySpeed2Multiplier, "upgrade_speed_2"), + SPEED_3(TieredEnderQuarryUpgrade.SPEED, 3, EnderQuarryConfig.enderQuarrySpeed3EnergyMultiplier, + EnderQuarryConfig.enderQuarrySpeed3Multiplier, "upgrade_speed_3"), + + FORTUNE_1(TieredEnderQuarryUpgrade.FORTUNE, 1, EnderQuarryConfig.enderQuarryFortune1EnergyMultiplier, 1, + "upgrade_fortune_1"), + FORTUNE_2(TieredEnderQuarryUpgrade.FORTUNE, 2, EnderQuarryConfig.enderQuarryFortune2EnergyMultiplier, 2, + "upgrade_fortune_2"), + FORTUNE_3(TieredEnderQuarryUpgrade.FORTUNE, 3, EnderQuarryConfig.enderQuarryFortune3EnergyMultiplier, 3, + "upgrade_fortune_3"); public static final EnderQuarryUpgrade[] VALUES = values(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index afc6acf3..31a3ff26 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -52,6 +53,11 @@ import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; +import com.gtnewhorizon.gtnhlib.capability.item.ItemSink; +import com.gtnewhorizon.gtnhlib.item.ImmutableItemStack; +import com.gtnewhorizon.gtnhlib.item.InsertionItemStack; +import com.gtnewhorizon.gtnhlib.item.InventoryIterator; +import com.gtnewhorizon.gtnhlib.util.ItemUtil; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; @@ -79,7 +85,7 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver private int startedAt; private boolean sidesValidated = false; public @Nullable UUID ownerUUID = null; - private final HashMap sidedItemAcceptors = new HashMap<>(); + private final HashMap sidedItemAcceptors = new LinkedHashMap<>(); private final HashMap sidedFluidAcceptors = new HashMap<>(); private final EnderQuarryUpgradeManager upgradeManager = new EnderQuarryUpgradeManager(); @@ -174,27 +180,27 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { } else { // DEBUG: Clear work area of debug blocks -// Vector2i low = new Vector2i(Integer.MAX_VALUE); -// Vector2i high = new Vector2i(Integer.MIN_VALUE); -// for (Vector2i point : scanReturn) { -// if (point.x < low.x) { -// low.x = point.x; -// } -// if (point.y < low.y) { -// low.y = point.y; -// } -// if (point.x > high.x) { -// high.x = point.x; -// } -// if (point.y > high.y) { -// high.y = point.y; -// } -// } -// for (int x = low.x; x <= high.x; x++) { -// for (int z = low.y; z <= high.y; z++) { -// worldObj.setBlock(x, this.yCoord - 1, z, Blocks.grass); -// } -// } + // Vector2i low = new Vector2i(Integer.MAX_VALUE); + // Vector2i high = new Vector2i(Integer.MIN_VALUE); + // for (Vector2i point : scanReturn) { + // if (point.x < low.x) { + // low.x = point.x; + // } + // if (point.y < low.y) { + // low.y = point.y; + // } + // if (point.x > high.x) { + // high.x = point.x; + // } + // if (point.y > high.y) { + // high.y = point.y; + // } + // } + // for (int x = low.x; x <= high.x; x++) { + // for (int z = low.y; z <= high.y; z++) { + // worldObj.setBlock(x, this.yCoord - 1, z, Blocks.grass); + // } + // } nextWorkAreas = computeRectanglesFromRectilinearPointPolygon(scanReturn); setWorkArea(nextWorkAreas.remove(nextWorkAreas.size() - 1)); @@ -261,7 +267,8 @@ private List computeRectanglesFromRectilinearPointPolygon(List // And create smaller single-line areas for them // Store bottom and top spans that were shrunk inwards due to boundary intersections if (intersectsWithBottomBoundary) { - for (RectilinearEdgePoly.Span span : shrunkSpansByY.getOrDefault(active.y, Collections.emptyList())) { + for (RectilinearEdgePoly.Span span : shrunkSpansByY + .getOrDefault(active.y, Collections.emptyList())) { // Check if the two intersect horizontally if (span.pointIsInSpan(lowX)) { subAreas.add(new Area2d(lowX, active.y, span.getMaxX(), active.y)); @@ -292,11 +299,11 @@ private List computeRectanglesFromRectilinearPointPolygon(List y, new Vector4i(1, intersectsWithBottomBoundary ? 1 : 0, 1, intersectsWithTopBoundary ? 1 : 0)); - // The base area should have a width and height on init greater than zero, but that might change after + // The base area should have a width and height on init greater than zero, but that might change + // after // applying shrinkage. // We keep any area with width >= 0 and height >= 0 to allow for weird cases with single line areas. - if (subArea.height >= 0 && subArea.width >= 0) - subAreas.add(subArea); + if (subArea.height >= 0 && subArea.width >= 0) subAreas.add(subArea); } } @@ -315,11 +322,13 @@ private List computeRectanglesFromRectilinearPointPolygon(List for (RectilinearEdgePoly.Span span : activeSpans) { int lowX = Math.min(span.x1, span.x2) + 1; int highX = Math.max(span.x1, span.x2) - 1; - boolean intersectsWithBottomBoundary = poly.intersectsWithHorizontalBoundary(span.y, lowX, highX) && (span.y != lastY); + boolean intersectsWithBottomBoundary = poly.intersectsWithHorizontalBoundary(span.y, lowX, highX) + && (span.y != lastY); // Same overlap check as before, just for bottom side now if (intersectsWithBottomBoundary) { - for (RectilinearEdgePoly.Span shrunkSpan : shrunkSpansByY.getOrDefault(span.y, Collections.emptyList())) { + for (RectilinearEdgePoly.Span shrunkSpan : shrunkSpansByY + .getOrDefault(span.y, Collections.emptyList())) { // Check if the two intersect horizontally if (shrunkSpan.pointIsInSpan(lowX)) { subAreas.add(new Area2d(lowX, span.y, shrunkSpan.getMaxX(), span.y)); @@ -340,26 +349,26 @@ private List computeRectanglesFromRectilinearPointPolygon(List } // DEBUG: Draw sub areas on floor -// int color = 0; -// for (Area2d subArea : subAreas) { -// for (int x = subArea.low.x; x <= subArea.high.x; x++) { -// for (int z = subArea.low.y; z <= subArea.high.y; z++) { -// if (worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.wool || worldObj.getBlock(x, this.yCoord - 1, z) == -// Blocks.gold_block) { -// worldObj.setBlock(x, this.yCoord - 1, z, Blocks.gold_block); -// //worldObj.setBlock(x, this.yCoord + 3 + color, z, Blocks.stained_glass, color, 2); -// -// //throw new RuntimeException("Overlapping sub-areas detected at " + x + ", " + z); -// } else { -// worldObj.setBlock(x, this.yCoord - 1, z, Blocks.wool, color, 2); -// } -// } -// } -// color++; -// if (color == 16) { -// color = 0; -// } -// } + // int color = 0; + // for (Area2d subArea : subAreas) { + // for (int x = subArea.low.x; x <= subArea.high.x; x++) { + // for (int z = subArea.low.y; z <= subArea.high.y; z++) { + // if (worldObj.getBlock(x, this.yCoord - 1, z) == Blocks.wool || worldObj.getBlock(x, this.yCoord - 1, z) == + // Blocks.gold_block) { + // worldObj.setBlock(x, this.yCoord - 1, z, Blocks.gold_block); + // //worldObj.setBlock(x, this.yCoord + 3 + color, z, Blocks.stained_glass, color, 2); + // + // //throw new RuntimeException("Overlapping sub-areas detected at " + x + ", " + z); + // } else { + // worldObj.setBlock(x, this.yCoord - 1, z, Blocks.wool, color, 2); + // } + // } + // } + // color++; + // if (color == 16) { + // color = 0; + // } + // } return subAreas; } @@ -597,9 +606,10 @@ private boolean stepPos() { private boolean[] tryHarvestCurrentBlock() { Block block = worldObj.getBlock(dx, dy, dz); if (block.getMaterial() == Material.air || worldObj.isAirBlock(dx, dy, dz) + || block == REPLACE_BLOCK || block.getBlockHardness(worldObj, dx, dy, dz) < 0 || block.getBlockHardness(worldObj, dx, dy, dz) > 100) { - return new boolean[] { tryConsumeEnergy(0.0f, false), true }; + return new boolean[] { tryConsumeEnergy(0f, false), true }; } ; float hardness = block.getBlockHardness(worldObj, dx, dy, dz); @@ -610,8 +620,10 @@ private boolean[] tryHarvestCurrentBlock() { } private boolean tryConsumeEnergy(float hardness, boolean simulate) { - double costMultiplier = upgradeManager.getTotalCostMultiplier(); - int cost = (int) ((hardness == 0 ? 100 : EnderQuarryConfig.enderQuarryBaseRFCost) * costMultiplier); + // Get base cost multiplier from upgrades, add a multiplier based on hardness (that roughly scales 0 - 10 to 1.0 + // - 1.66) + double costMultiplier = upgradeManager.totalCostMultiplier + (1.0 + 0.8 * (hardness / (hardness + 2))); + int cost = (int) (EnderQuarryConfig.enderQuarryBaseRFCost * costMultiplier); if (energyStorage.extractEnergy(cost, true) >= cost) { if (!simulate) { energyStorage.extractEnergy(cost, false); @@ -624,6 +636,7 @@ private boolean tryConsumeEnergy(float hardness, boolean simulate) { /** * Harvests the block at the current position, and tries to store the resulting items / fluids to internal storage + * * @return If we could store all resulting items / fluids */ private boolean harvestAndStoreBlock(Block block) { @@ -715,9 +728,10 @@ private boolean tryStoreFluid(FluidStack fluid) { * @return If we could store all the provided items */ private boolean tryStoreItems(List items) { - int toStore = items.stream() - .mapToInt((item) -> item != null ? item.stackSize : 0) - .sum(); + int toStore = 0; + for (ItemStack item : items) { + toStore += item != null ? item.stackSize : 0; + } if (storedItems + toStore <= ITEM_BUFFER_CAPACITY) { for (ItemStack item : items) { storeItemToStorage(item); @@ -738,9 +752,12 @@ private void storeItemToStorage(ItemStack item) { } private boolean fluidStorageIsEmpty() { - return fluidStorage.stream() - .mapToInt(FluidTank::getFluidAmount) - .sum() == 0; + for (FluidTank tank : fluidStorage) { + if (tank.getFluidAmount() > 0) { + return false; + } + } + return true; } /** @@ -750,54 +767,50 @@ private boolean fluidStorageIsEmpty() { */ private boolean ejectStoredToAdjacent() { if (storedItems > 0) { - for (IInventory inventory : sidedItemAcceptors.values()) { - if (inventory != null) { - for (int i = 0; i < inventory.getSizeInventory(); i++) { - ItemStack slotItem = inventory.getStackInSlot(i); - if (slotItem != null) { - // There is already an item in this slot, see if we can merge with it - int canBeAddedToStack = Math - .min(slotItem.getMaxStackSize(), inventory.getInventoryStackLimit()) - - slotItem.stackSize; - if (canBeAddedToStack > 0) { - ItemStack key = slotItem.copy(); - key.stackSize = 0; - - // Do we also have this item type in our storage? - int storedAmount = itemStorage.getOrDefault(key, -1); - if (storedAmount > 0) { - int toBeAdded = Math.min(storedAmount, canBeAddedToStack); - - ItemStack modifiedStack = key.copy(); - modifiedStack.stackSize = slotItem.stackSize + toBeAdded; - if (inventory.isItemValidForSlot(i, modifiedStack)) { - inventory.setInventorySlotContents(i, modifiedStack); - - itemStorage.put(key, storedAmount - toBeAdded); - storedItems -= toBeAdded; - } + for (Map.Entry inventory : sidedItemAcceptors.entrySet()) { + if (inventory.getValue() != null) { + ItemSink sink = ItemUtil.getItemSink(inventory.getValue(), inventory.getKey()); + InventoryIterator iter = sink.sinkIterator(); + if (iter == null) { + continue; + } + + while (iter.hasNext() && storedItems > 0) { + ImmutableItemStack slotContent = iter.next(); + if (slotContent != null) { + // There is already an item in this slot, see if we have more of the same type to add + ItemStack slotItem = slotContent.toStack(); + ItemStack key = slotItem.copy(); + key.stackSize = 0; + + int storedAmount = itemStorage.getOrDefault(key, -1); + if (storedAmount > 0) { + // modifiedStack.stackSize = slotItem.stackSize + toBeAdded; Stack size is handled by + // InsertionItemStack + int addedAmount = storedAmount + - iter.insert(new InsertionItemStack(key.copy(), storedAmount), false); + if (addedAmount > 0) { + itemStorage.put(key, storedAmount - addedAmount); + storedItems -= addedAmount; } } } else { // Empty slot, don't mind us Object2IntMap.Entry entry = peekItem(); if (entry != null) { - int canBeAddedToSlot = Math - .min(entry.getIntValue(), inventory.getInventoryStackLimit()); - if (canBeAddedToSlot > 0) { - ItemStack item = entry.getKey() - .copy(); - item.stackSize = canBeAddedToSlot; - if (inventory.isItemValidForSlot(i, item)) { - inventory.setInventorySlotContents(i, item); - - itemStorage.put(entry.getKey(), entry.getIntValue() - canBeAddedToSlot); - storedItems -= canBeAddedToSlot; - } + ItemStack item = entry.getKey() + .copy(); + int storedAmount = entry.getIntValue(); + // item.stackSize = canBeAddedToSlot; Stack size is handled by InsertionItemStack + int addedAmount = storedAmount + - iter.insert(new InsertionItemStack(item, storedAmount), false); + if (addedAmount > 0) { + itemStorage.put(entry.getKey(), storedAmount - addedAmount); + storedItems -= addedAmount; } } else { // Not sure why, but it seems our inventory is empty even though we thought it wasn't - // Lets re-count + // Lets re-count instead of breaking things storedItems = itemStorage.values() .intStream() .sum(); @@ -858,14 +871,16 @@ private boolean ejectStoredToAdjacent() { } /** - * Retrieve all stored items, i.e. for the quarry is broke, and we need to drop its contents + * Retrieve all stored items, i.e. for the quarry is broken, and we need to drop its contents + * * @return A list of all stored items as ItemStacks with correct stack sizes */ public List retrieveAllItems() { List items = new ArrayList<>(); for (Object2IntMap.Entry entry : itemStorage.object2IntEntrySet()) { if (entry.getIntValue() > 0) { - ItemStack item = entry.getKey().copy(); + ItemStack item = entry.getKey() + .copy(); item.stackSize = entry.getIntValue(); items.add(item); } @@ -971,14 +986,26 @@ public void updateEntity() { if (state == QuarryWorkState.FINISHED && storedItems == 0 && fluidStorageIsEmpty() && ownerUUID == null) { if (selfIsLoaded) unloadSelf(); return; - }; + } ; if (state == QuarryWorkState.FINISHED && ownerUUID != null && worldObj.getTotalWorldTime() % 100 == 0) { // Check if owner is online MinecraftServer server = MinecraftServer.getServer(); if (server != null) { - EntityPlayerMP owner = server.getConfigurationManager().playerEntityList.stream().filter((EntityPlayerMP player) -> player.getUniqueID().equals(ownerUUID)).findFirst().orElse(null); + EntityPlayerMP owner = server.getConfigurationManager().playerEntityList.stream() + .filter( + (EntityPlayerMP player) -> player.getUniqueID() + .equals(ownerUUID)) + .findFirst() + .orElse(null); if (owner != null) { - owner.addChatMessage(new ChatComponentText(String.format("Your Ender Quarry at (%d %d %d) in DIM %d has finished.", xCoord, yCoord, zCoord, worldObj.provider.dimensionId))); + owner.addChatMessage( + new ChatComponentText( + String.format( + "Your Ender Quarry at (%d %d %d) in DIM %d has finished.", + xCoord, + yCoord, + zCoord, + worldObj.provider.dimensionId))); ownerUUID = null; } } @@ -1002,7 +1029,8 @@ public void updateEntity() { } } - int stepsPerTick = (int) (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1) * upgradeManager.getValue(EnderQuarryUpgradeManager.TieredEnderQuarryUpgrade.SPEED, 1.0)); + int stepsPerTick = (int) (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1) + * upgradeManager.getValue(EnderQuarryUpgradeManager.TieredEnderQuarryUpgrade.SPEED, 1.0)); if (state == QuarryWorkState.RUNNING) { while (brokenBlocksTick < (stepsPerTick) && stepPos()) { // TODO: Remove after this has been tested by others @@ -1083,7 +1111,8 @@ public void readFromNBT(NBTTagCompound nbt) { } } brokenBlocksTotal = nbt.getInteger("blocks"); - ownerUUID = nbt.getString("owner").isEmpty() ? null : UUID.fromString(nbt.getString("owner")); + ownerUUID = nbt.getString("owner") + .isEmpty() ? null : UUID.fromString(nbt.getString("owner")); energyStorage.readFromNBT(nbt); @@ -1103,6 +1132,7 @@ public void readFromNBT(NBTTagCompound nbt) { NBTTagCompound tag = itemsNBT.getCompoundTagAt(i); ItemStack item = ItemStack.loadItemStackFromNBT(tag); if (item != null) { + item.stackSize = tag.getShort("Count"); storeItemToStorage(item); } } @@ -1148,8 +1178,10 @@ public void writeToNBT(NBTTagCompound nbt) { NBTTagCompound tag = new NBTTagCompound(); ItemStack item = entry.getKey() .copy(); - item.stackSize = entry.getIntValue(); item.writeToNBT(tag); + // Default itemstack uses byte for count, but we can have more than 255 of an item + tag.setShort("Count", (short) entry.getIntValue()); + itemsNBT.appendTag(tag); } } @@ -1227,6 +1259,7 @@ public FluidTankInfo[] getTankInfo(ForgeDirection from) { } public enum QuarryWorkState { + STOPPED("uie.quarry.state.1"), STOPPED_WAITING_FOR_FLUID_SPACE("uie.quarry.state.2"), STOPPED_WAITING_FOR_ITEM_SPACE("uie.quarry.state.3"), diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java index 75e0075f..ac31887d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java @@ -1,25 +1,25 @@ package com.fouristhenumber.utilitiesinexcess.compat.waila; +import java.util.List; -import com.fouristhenumber.utilitiesinexcess.CommonProxy; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; -import mcp.mobius.waila.api.IWailaDataProvider; -import mcp.mobius.waila.api.IWailaRegistrar; -import mcp.mobius.waila.cbcore.LangUtil; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import java.util.List; +import com.fouristhenumber.utilitiesinexcess.CommonProxy; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import mcp.mobius.waila.api.IWailaDataProvider; +import mcp.mobius.waila.api.IWailaRegistrar; +import mcp.mobius.waila.cbcore.LangUtil; /** - Registered in {@link CommonProxy} via IMC. - */ + * Registered in {@link CommonProxy} via IMC. + */ public class WailaHandler implements IWailaDataProvider { public static void callbackRegister(IWailaRegistrar registrar) { @@ -34,26 +34,35 @@ public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler } @Override - public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { return currenttip; } @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { if (accessor.getTileEntity() instanceof TileEntityEnderQuarry) { - TileEntityEnderQuarry.QuarryWorkState state = TileEntityEnderQuarry.QuarryWorkState.VALUES[accessor.getNBTData().getInteger("state")]; - currenttip.add(String.format(LangUtil.instance.translate("uie.quarry.waila.state"), LangUtil.instance.translate(state.localKey))); + TileEntityEnderQuarry.QuarryWorkState state = TileEntityEnderQuarry.QuarryWorkState.VALUES[accessor + .getNBTData() + .getInteger("state")]; + currenttip.add( + String.format( + LangUtil.instance.translate("uie.quarry.waila.state"), + LangUtil.instance.translate(state.localKey))); } return currenttip; } @Override - public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { return currenttip; } @Override - public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, int x, int y, int z) { + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, int x, + int y, int z) { if (te != null) { te.writeToNBT(tag); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java index f2f135b2..ae77c24e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java @@ -26,44 +26,42 @@ public class EnderQuarryConfig { public static int enderQuarryFluidTankStorage; @Config.Comment("Base factor of RF that is used per operation. Is influenced by upgrades & block hardness.") - @Config.DefaultInt(1_000) + @Config.DefaultInt(100) @Config.RangeInt(min = 100, max = 1_024_000) public static int enderQuarryBaseRFCost; - @Config.DefaultStringList({"COBBLE", "DIRT", "GLASS", "SNOW", "STONE"}) - @Config.DefaultString("COBBLE") - @Config.Comment("Block type to replace mined blocks with if the world hole upgrade isn't present.") - public static String enderQuarryReplaceBlock; + @Config.DefaultStringList({ "COBBLE", "DIRT", "GLASS", "SNOW", "STONE" }) + @Config.DefaultString("COBBLE") + @Config.Comment("Block type to replace mined blocks with if the world hole upgrade isn't present.") + public static String enderQuarryReplaceBlock; - @Config.DefaultInt(400) - @Config.Comment("The amount of blocks the quarry tries to mine per tick, without speed upgrades.") - public static int enderQuarryBaseSpeed; + @Config.DefaultInt(400) + @Config.Comment("The amount of blocks the quarry tries to mine per tick, without speed upgrades.") + public static int enderQuarryBaseSpeed; + @Config.DefaultDouble(2D) + @Config.Comment("The multiplier applied to the base speed mine speed.") + public static double enderQuarrySpeed1Multiplier; - @Config.DefaultDouble(2D) - @Config.Comment("The multiplier applied to the base speed mine speed.") - public static double enderQuarrySpeed1Multiplier; - - @Config.DefaultDouble(8D) - @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarrySpeed1EnergyMultiplier; - - @Config.DefaultDouble(4D) - @Config.Comment("The multiplier applied to the base speed mine speed.") - public static double enderQuarrySpeed2Multiplier; + @Config.DefaultDouble(8D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarrySpeed1EnergyMultiplier; - @Config.DefaultDouble(16D) - @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarrySpeed2EnergyMultiplier; + @Config.DefaultDouble(4D) + @Config.Comment("The multiplier applied to the base speed mine speed.") + public static double enderQuarrySpeed2Multiplier; - @Config.DefaultDouble(7D) - @Config.Comment("The multiplier applied to the base speed mine speed.") - public static double enderQuarrySpeed3Multiplier; + @Config.DefaultDouble(16D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarrySpeed2EnergyMultiplier; - @Config.DefaultDouble(32D) - @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarrySpeed3EnergyMultiplier; + @Config.DefaultDouble(7D) + @Config.Comment("The multiplier applied to the base speed mine speed.") + public static double enderQuarrySpeed3Multiplier; + @Config.DefaultDouble(32D) + @Config.Comment("The energy multiplier applied when the upgrade is active.") + public static double enderQuarrySpeed3EnergyMultiplier; @Config.DefaultDouble(12D) @Config.Comment("The energy multiplier applied when the upgrade is active.") @@ -77,7 +75,6 @@ public class EnderQuarryConfig { @Config.Comment("The energy multiplier applied when the upgrade is active.") public static double enderQuarryFortune3EnergyMultiplier; - @Config.DefaultDouble(1.2D) @Config.Comment("The energy multiplier applied when the upgrade is active.") public static double enderQuarryWorldHoleEnergyMultiplier; From 5026580ce2965244eae05f5f0ab7a1c5f80fb49f Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Sun, 18 Jan 2026 11:53:30 +0100 Subject: [PATCH 22/28] Add configurable bottom and top bounds by markers, more localizations, add etl in chat and waila with progress bars, fix skipping first block --- .../utilitiesinexcess/ClientProxy.java | 11 + .../EnderQuarryUpgradeManager.java | 6 +- .../tileentities/TileEntityEnderMarker.java | 6 +- .../tileentities/TileEntityEnderQuarry.java | 249 +++++++++++++----- .../compat/waila/TTRenderUIETimeLeftBar.java | 68 +++++ .../compat/waila/WailaHandler.java | 25 +- .../config/blocks/EnderQuarryConfig.java | 4 + .../assets/utilitiesinexcess/lang/en_US.lang | 8 +- 8 files changed, 300 insertions(+), 77 deletions(-) create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/TTRenderUIETimeLeftBar.java diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java index 0f1aedb7..e90357ba 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java @@ -4,12 +4,15 @@ import com.fouristhenumber.utilitiesinexcess.common.renderers.InvertedIngotRenderer; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.compat.waila.TTRenderUIETimeLeftBar; import com.fouristhenumber.utilitiesinexcess.render.ISBRHUnderworldPortal; import com.fouristhenumber.utilitiesinexcess.render.TESRUnderworldPortal; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; public class ClientProxy extends CommonProxy { @@ -24,4 +27,12 @@ public void init(FMLInitializationEvent event) { RenderingRegistry.registerBlockHandler(ISBRHUnderworldPortal.INSTANCE); } } + + @Override + public void postInit(FMLPostInitializationEvent event) { + super.postInit(event); + if (Mods.Waila.isLoaded()) { + TTRenderUIETimeLeftBar.register(); + } + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java index c0fdff61..bfd42a01 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java @@ -11,7 +11,7 @@ public class EnderQuarryUpgradeManager { private final HashMap activeUpgrades = new HashMap<>(); - public double totalCostMultiplier = 1.0; + public double totalCostMultiplier = 0.0; // Add an upgrade - keeps highest tier public void addUpgrade(EnderQuarryUpgrade upgrade) { @@ -66,7 +66,7 @@ public void remove(EnderQuarryUpgrade upgrade) { public void clear() { activeUpgrades.clear(); - totalCostMultiplier = 1.0; + totalCostMultiplier = 0.0; } /** @@ -74,7 +74,7 @@ public void clear() { * Use totalCostMultiplier field for fewer recalculations instead. */ public double getTotalCostMultiplier() { - double total = 1.0; + double total = 0.0; HashSet countedTieredUpgrades = new HashSet<>(); for (EnderQuarryUpgrade upgrade : EnderQuarryUpgrade.VALUES) { if (this.has(upgrade)) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java index 51c6a493..c126c352 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -17,6 +17,7 @@ import net.minecraft.network.play.server.S2APacketParticles; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; +import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; import org.jetbrains.annotations.NotNull; @@ -24,7 +25,6 @@ import org.joml.Vector2i; import com.fouristhenumber.utilitiesinexcess.ModBlocks; -import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.IFacingTE; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; import com.fouristhenumber.utilitiesinexcess.utils.Tuple; @@ -164,7 +164,6 @@ public List boundaryForArbitraryLoop(EntityPlayer player) { } while (!stack.isEmpty()); if (markerChain != null) { - UtilitiesInExcess.chat("Completed marker chain with " + markerChain.size() + " entries."); ArrayList pointChain = new ArrayList<>(markerChain.size()); markerChain.forEach((e) -> pointChain.add(new Vector2i(e.xCoord, e.zCoord))); return pointChain; @@ -173,10 +172,11 @@ public List boundaryForArbitraryLoop(EntityPlayer player) { player.addChatComponentMessage( new ChatComponentText( String.format( - "Failed to complete marker chain, with last marker at (%d %d %d).", + StatCollector.translateToLocal("uie.quarry.scanmessage.5"), lastVisited.current.xCoord, lastVisited.current.yCoord, lastVisited.current.zCoord))); + // Spawn particles to show where the chain broke for (Object obj : worldObj.playerEntities) { EntityPlayerMP playerMP = (EntityPlayerMP) obj; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index 31a3ff26..c48ea2da 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -1,5 +1,6 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -28,6 +29,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; +import net.minecraft.util.StatCollector; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.Constants; @@ -52,6 +54,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; +import com.fouristhenumber.utilitiesinexcess.utils.Tuple; import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; import com.gtnewhorizon.gtnhlib.capability.item.ItemSink; import com.gtnewhorizon.gtnhlib.item.ImmutableItemStack; @@ -67,7 +70,8 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver, IFluidHandler { public static final int BASE_STEPS_PER_TICK = EnderQuarryConfig.enderQuarryBaseSpeed; - public static final int ITEM_BUFFER_CAPACITY = 1024; + public static final int ITEM_BUFFER_CAPACITY = BASE_STEPS_PER_TICK * 5; // Emptied every 4 ticks + some margin for + // more than one item per block public static Block REPLACE_BLOCK = Blocks.dirt; public boolean isCreativeBoosted = false; private int storedItems; @@ -78,13 +82,16 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver private int dx; private int dy; private int dz; + private int lowerYBound; + private int upperYBound; private int chunkX; private int chunkZ; - private int brokenBlocksTotal; - private int estimatedTotalBlocks; - private int startedAt; + private long brokenBlocksTotal; + private long estimatedTotalBlocks; + private int estimatedSecondsLeft = -1; private boolean sidesValidated = false; public @Nullable UUID ownerUUID = null; + private final ArrayDeque brokenBlocksSlidingWindow = new ArrayDeque<>(); private final HashMap sidedItemAcceptors = new LinkedHashMap<>(); private final HashMap sidedFluidAcceptors = new HashMap<>(); private final EnderQuarryUpgradeManager upgradeManager = new EnderQuarryUpgradeManager(); @@ -100,23 +107,23 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver public TileEntityEnderQuarry() { REPLACE_BLOCK = EnderQuarryReplaceBlock.valueOf(EnderQuarryConfig.enderQuarryReplaceBlock).block; - resetState(); + resetQuarry(); storedItems = 0; } - private void resetState() { - state = QuarryWorkState.STOPPED; - brokenBlocksTotal = 0; - } - public String getState() { return switch (state) { case RUNNING -> String.format( - "Quarry is currently mining at %d %d %d, has already mined %d blocks.", + "Quarry is currently mining at %d %d %d, has already mined/scanned %d blocks.%s", dx, dy, dz, - brokenBlocksTotal); + brokenBlocksTotal, + estimatedSecondsLeft > 0 ? String.format( + " Estimated time remaining: %02d:%02d:%02d.", + estimatedSecondsLeft / 3600, + (estimatedSecondsLeft % 3600) / 60, + (estimatedSecondsLeft % 60)) : ""); case STOPPED_WAITING_FOR_FLUID_SPACE -> "Quarry is full on fluids."; case STOPPED_WAITING_FOR_ITEM_SPACE -> "Quarry is full on items."; case STOPPED_WAITING_FOR_ENERGY -> "Quarry is missing energy."; @@ -129,19 +136,68 @@ public String getState() { }; } - public Area2d getWorkArea() { - return this.workArea; + private void resetQuarry() { + state = QuarryWorkState.STOPPED; + brokenBlocksTotal = 0; + workArea = null; + nextWorkAreas.clear(); } public void setWorkArea(Area2d area) { workArea = area; dx = area.low.x; - dy = yCoord + 5; + dy = upperYBound; dz = area.low.y; chunkX = dx >> 4; chunkZ = dz >> 4; } + /** + * Starts the quarry if it is currently stopped and has a valid work area. + * Attempts to harvest the first block, because updateEntity steps before harvesting. + */ + public void startQuarry() { + if (state == QuarryWorkState.STOPPED && workArea != null) { + state = QuarryWorkState.RUNNING; + Tuple harvestResult = tryHarvestCurrentBlock(); + boolean wasAbleToHarvest = harvestResult.first; + boolean blockWasSkipped = harvestResult.second; + if (wasAbleToHarvest) { + if (!blockWasSkipped) { + removeCurrentBlock(); + } + brokenBlocksTotal++; + } + } + } + + /** + * Tries to find a lower Y bound than the default of bedrock level (1), by scanning downwards from the quarry, + * looking for the first marker. (Returns block above the marker, since we don't want to mine the marker itself.) + */ + public int findLowerYBound() { + for (int i = this.yCoord - 2; i > 1; i--) { + if (worldObj.getTileEntity(xCoord, i, zCoord) instanceof TileEntityEnderMarker) { + return i + 1; + } + } + return 1; + } + + /** + * Tries to find a higher Y bound than the default of 5 blocks above the quarry (also configurable), by scanning + * upwards from the quarry, + * looking for the first marker. (Returns block below the marker, since we don't want to mine the marker itself.) + */ + public int findUpperYBound() { + for (int i = this.yCoord + 2; i < 255; i++) { + if (worldObj.getTileEntity(xCoord, i, zCoord) instanceof TileEntityEnderMarker) { + return i - 1; + } + } + return Math.min(this.yCoord + EnderQuarryConfig.enderQuarryDefaultTopPadding, 255); + } + public void scanForWorkAreaFromMarkers(EntityPlayer player) { boolean foundMarkers = false; for (ForgeDirection dir : DirectionUtil.HORIZONTAL_DIRECTIONS) { @@ -150,35 +206,31 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { @Nullable List scanReturn = marker.checkForBoundary(dir, player); if (scanReturn != null) { + lowerYBound = findLowerYBound(); + upperYBound = findUpperYBound(); + long estBlocks = 0; nextWorkAreas.clear(); + // Do we have a simple rectangle as defined by two points if (scanReturn.size() == 2) { - Vector2i firstCorner = scanReturn.get(0); - Vector2i secondCorner = scanReturn.get(1); - - // Pad work area by one (inwards), so that we don't mine the markers - Vector2i low = new Vector2i( - Math.min(firstCorner.x, secondCorner.x) + 1, - Math.min(firstCorner.y, secondCorner.y) + 1); - Vector2i high = new Vector2i( - Math.max(firstCorner.x, secondCorner.x) - 1, - Math.max(firstCorner.y, secondCorner.y) - 1); - setWorkArea(new Area2d(low, high)); - state = QuarryWorkState.RUNNING; - - int estBlocks = (worldObj.getHeightValue(dx, dy) + 5) * workArea.height * workArea.width; + setWorkArea(new Area2d(scanReturn.get(0), scanReturn.get(1), true)); + startQuarry(); + // Estimate total blocks to be scanned, based upon work area size and vertical bounds. (Add one + // to each dimension to make it inclusive) + estBlocks = (long) (upperYBound - lowerYBound + 1) * (workArea.height + 1) + * (workArea.width + 1); player.addChatComponentMessage( new ChatComponentText( String.format( - "Found ender marker fence boundary, setting up work area from (%d %d) to (%d %d). Should roughly contain %d blocks.", + StatCollector.translateToLocal("uie.quarry.scanmessage.1"), workArea.low.x, workArea.low.y, workArea.high.x, workArea.high.y, estBlocks))); + // Or do we have a more complex rectilinear polygon as defined by many points } else { - // DEBUG: Clear work area of debug blocks // Vector2i low = new Vector2i(Integer.MAX_VALUE); // Vector2i high = new Vector2i(Integer.MIN_VALUE); @@ -203,15 +255,31 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { // } nextWorkAreas = computeRectanglesFromRectilinearPointPolygon(scanReturn); + for (Area2d nextWorkArea : nextWorkAreas) { + // Estimate blocks in this area to be scanned, based upon work area size and vertical + // bounds. (Add one to each dimension to make it inclusive) + estBlocks += (long) (upperYBound - lowerYBound + 1) * (nextWorkArea.height + 1) + * (nextWorkArea.width + 1); + } + + player.addChatComponentMessage( + new ChatComponentText( + String.format( + StatCollector.translateToLocal("uie.quarry.scanmessage.2"), + scanReturn.size(), + estBlocks))); + setWorkArea(nextWorkAreas.remove(nextWorkAreas.size() - 1)); - state = QuarryWorkState.RUNNING; + startQuarry(); } + + estimatedTotalBlocks = estBlocks; return; } else { player.addChatComponentMessage( new ChatComponentText( String.format( - "Ender marker at (%d %d %d) failed to set up a fence boundary.", + StatCollector.translateToLocal("uie.quarry.scanmessage.3"), marker.xCoord, marker.yCoord, marker.zCoord))); @@ -219,8 +287,8 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { } } } - if (!foundMarkers) - player.addChatComponentMessage(new ChatComponentText("Found no ender markers around quarry.")); + if (!foundMarkers) player + .addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("uie.quarry.scanmessage.4"))); } private List computeRectanglesFromRectilinearPointPolygon(List points) { @@ -536,7 +604,7 @@ boolean pointIsInSpan(int x) { * Are the current dx & dy & dz in work area bounds */ private boolean isInBounds() { - return dy > 0 && this.workArea.isInBounds(dx, dz); + return dy >= lowerYBound && dy <= upperYBound && this.workArea.isInBounds(dx, dz); } /** @@ -546,9 +614,9 @@ private boolean isInBounds() { */ private boolean stepPos() { dy--; - if (dy <= 0) { + if (dy < lowerYBound) { // stack is done, move back up - dy = this.yCoord + 5; + dy = upperYBound; boolean resetX = false; if (dx + 1 >> 4 == chunkX && dx + 1 <= workArea.high.x) { @@ -603,20 +671,21 @@ private boolean stepPos() { * * @return A boolean tuple of: <Could we work & harvest the block, Did we skip this block> */ - private boolean[] tryHarvestCurrentBlock() { + private Tuple tryHarvestCurrentBlock() { Block block = worldObj.getBlock(dx, dy, dz); if (block.getMaterial() == Material.air || worldObj.isAirBlock(dx, dy, dz) - || block == REPLACE_BLOCK + || block == (upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.WORLD_HOLE) ? Blocks.air + : REPLACE_BLOCK) || block.getBlockHardness(worldObj, dx, dy, dz) < 0 || block.getBlockHardness(worldObj, dx, dy, dz) > 100) { - return new boolean[] { tryConsumeEnergy(0f, false), true }; + return new Tuple<>(tryConsumeEnergy(0f, false), true); } ; float hardness = block.getBlockHardness(worldObj, dx, dy, dz); if (tryConsumeEnergy(hardness, true)) { - return new boolean[] { (harvestAndStoreBlock(block) && tryConsumeEnergy(hardness, false)), false }; + return new Tuple<>((harvestAndStoreBlock(block) && tryConsumeEnergy(hardness, false)), false); } - return new boolean[] { false, false }; + return new Tuple<>(false, false); } private boolean tryConsumeEnergy(float hardness, boolean simulate) { @@ -978,6 +1047,40 @@ public void validate() { } } + /** + * Update the time left data with a new data point of blocks broken this tick & recalculate the estimate every + * second + */ + private void updateTimeLeftEstimate(int newDataPoint) { + brokenBlocksSlidingWindow.add(newDataPoint); + if (brokenBlocksSlidingWindow.size() > 300) brokenBlocksSlidingWindow.removeFirst(); + + if (worldObj.getTotalWorldTime() % 20 == 0 && estimatedTotalBlocks > brokenBlocksTotal) { + double averageBlocksPerTick = getAverageBlocksPerTick(); + if (averageBlocksPerTick > 0) { + long blocksLeft = estimatedTotalBlocks - brokenBlocksTotal; + estimatedSecondsLeft = (int) (blocksLeft / averageBlocksPerTick / 20); + } else { + estimatedSecondsLeft = -1; + } + } + } + + private double getAverageBlocksPerTick() { + int queuePos = 1; + int currentWeight = 1; + int weightedSum = 0; + int weightTotal = 0; + for (int blocksBrokenInTick : brokenBlocksSlidingWindow) { + weightedSum += blocksBrokenInTick * currentWeight; + weightTotal += currentWeight; + // Increase weight every 20 ticks, to reduce the impact of short-lived spikes that only happened once + if (queuePos % 20 == 0) currentWeight++; + queuePos++; + } + return (double) weightedSum / weightTotal; + } + // TileEntity @Override public void updateEntity() { @@ -986,7 +1089,8 @@ public void updateEntity() { if (state == QuarryWorkState.FINISHED && storedItems == 0 && fluidStorageIsEmpty() && ownerUUID == null) { if (selfIsLoaded) unloadSelf(); return; - } ; + } + // Try to notify owner if the quarry has finished if (state == QuarryWorkState.FINISHED && ownerUUID != null && worldObj.getTotalWorldTime() % 100 == 0) { // Check if owner is online MinecraftServer server = MinecraftServer.getServer(); @@ -1015,24 +1119,26 @@ public void updateEntity() { sidesValidated = true; } - int brokenBlocksTick = 0; + // This may mean any mix of: Blocks broken & Blocks skipped + int blocksVisitedThisTick = 0; + // Check if we can harvest the current block if we are stopped by something, but have already started working if (state != QuarryWorkState.RUNNING && state != QuarryWorkState.FINISHED && state != QuarryWorkState.STOPPED) { - boolean[] harvestResult = tryHarvestCurrentBlock(); - boolean wasAbleToHarvest = harvestResult[0]; - boolean blockWasSkipped = harvestResult[1]; + Tuple harvestResult = tryHarvestCurrentBlock(); + boolean wasAbleToHarvest = harvestResult.first; + boolean blockWasSkipped = harvestResult.second; if (wasAbleToHarvest) { state = QuarryWorkState.RUNNING; if (!blockWasSkipped) { removeCurrentBlock(); - brokenBlocksTick++; } + blocksVisitedThisTick++; } } - int stepsPerTick = (int) (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1) - * upgradeManager.getValue(EnderQuarryUpgradeManager.TieredEnderQuarryUpgrade.SPEED, 1.0)); if (state == QuarryWorkState.RUNNING) { - while (brokenBlocksTick < (stepsPerTick) && stepPos()) { + int stepsPerTick = (int) (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1) + * upgradeManager.getValue(EnderQuarryUpgradeManager.TieredEnderQuarryUpgrade.SPEED, 1.0)); + while (blocksVisitedThisTick < stepsPerTick && stepPos()) { // TODO: Remove after this has been tested by others if (!isInBounds() || this.chunkX > 1000 || this.chunkZ > 1000) { UtilitiesInExcess.LOG.warn( @@ -1046,28 +1152,27 @@ public void updateEntity() { String.format("Tried to quarry outside of work area at %d %d %d", dx, dy, dz)); } - boolean[] harvestResult = tryHarvestCurrentBlock(); - boolean wasAbleToHarvest = harvestResult[0]; - boolean blockWasSkipped = harvestResult[1]; + Tuple harvestResult = tryHarvestCurrentBlock(); + boolean wasAbleToHarvest = harvestResult.first; + boolean blockWasSkipped = harvestResult.second; if (wasAbleToHarvest) { if (!blockWasSkipped) { removeCurrentBlock(); - brokenBlocksTick++; } + blocksVisitedThisTick++; } else { // Check if something has stopped us (out of space / energy) if (state != QuarryWorkState.RUNNING) break; } } - if (brokenBlocksTick < (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1)) - && state == QuarryWorkState.RUNNING) { + if (blocksVisitedThisTick < stepsPerTick && state == QuarryWorkState.RUNNING) { if (nextWorkAreas.isEmpty()) { state = QuarryWorkState.FINISHED; } else { setWorkArea(nextWorkAreas.remove(nextWorkAreas.size() - 1)); } } - if (brokenBlocksTick > 0) { + if (blocksVisitedThisTick > 0) { markDirty(); if (state == QuarryWorkState.STOPPED_WAITING_FOR_ENERGY) { // We were still able to mine some blocks this tick, so we don't consider this fully stopped @@ -1077,11 +1182,12 @@ public void updateEntity() { } } - this.brokenBlocksTotal += brokenBlocksTick; + updateTimeLeftEstimate(blocksVisitedThisTick); + this.brokenBlocksTotal += blocksVisitedThisTick; } + // Move internally stored stuff to adjacent blocks if (worldObj.getTotalWorldTime() % 4 == 0 && (storedItems > 0 || !fluidStorageIsEmpty())) { - // Move internally stored stuff to adjacent blocks if (!ejectStoredToAdjacent()) scanSidesForTEs(); } } @@ -1099,8 +1205,13 @@ public void readFromNBT(NBTTagCompound nbt) { dz = nbt.getInteger("dz"); chunkX = dx >> 4; chunkZ = dz >> 4; + // Y bounds + lowerYBound = nbt.getInteger("lowerYBound"); + upperYBound = nbt.getInteger("upperYBound"); + // Fix for cases where upperYBound was not present yet + if (lowerYBound == upperYBound) upperYBound = findUpperYBound(); - // Possible next work areas + // Possible next work areas for complex markers NBTTagList possibleNextAreas = nbt.getTagList("nextAreas", Constants.NBT.TAG_COMPOUND); if (possibleNextAreas.tagCount() > 0) { nextWorkAreas.clear(); @@ -1110,7 +1221,9 @@ public void readFromNBT(NBTTagCompound nbt) { } } } - brokenBlocksTotal = nbt.getInteger("blocks"); + brokenBlocksTotal = nbt.getLong("brokenBlocks"); + estimatedTotalBlocks = nbt.getLong("estBlocks"); + estimatedSecondsLeft = nbt.getInteger("estSecondsLeft"); ownerUUID = nbt.getString("owner") .isEmpty() ? null : UUID.fromString(nbt.getString("owner")); @@ -1144,11 +1257,15 @@ public void writeToNBT(NBTTagCompound nbt) { nbt.setInteger("facing", facing.ordinal()); nbt.setInteger("state", state.ordinal()); if (state != QuarryWorkState.FINISHED && workArea != null) { + // Work area workArea.writeNBTTag(nbt); nbt.setInteger("dx", dx); nbt.setInteger("dy", dy); nbt.setInteger("dz", dz); - + // Y bounds + nbt.setInteger("lowerYBound", lowerYBound); + nbt.setInteger("upperYBound", upperYBound); + // Possible next work areas for complex markers NBTTagList areasNBT = new NBTTagList(); for (Area2d nextArea : nextWorkAreas) { NBTTagCompound tag = new NBTTagCompound(); @@ -1157,7 +1274,9 @@ public void writeToNBT(NBTTagCompound nbt) { } nbt.setTag("nextAreas", areasNBT); } - nbt.setInteger("blocks", brokenBlocksTotal); + nbt.setLong("brokenBlocks", brokenBlocksTotal); + nbt.setLong("estBlocks", estimatedTotalBlocks); + nbt.setInteger("estSecondsLeft", estimatedSecondsLeft); nbt.setString("owner", ownerUUID != null ? ownerUUID.toString() : ""); energyStorage.writeToNBT(nbt); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/TTRenderUIETimeLeftBar.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/TTRenderUIETimeLeftBar.java new file mode 100644 index 00000000..54a57d37 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/TTRenderUIETimeLeftBar.java @@ -0,0 +1,68 @@ +package com.fouristhenumber.utilitiesinexcess.compat.waila; + +import java.awt.Dimension; + +import net.minecraft.client.gui.Gui; + +import mcp.mobius.waila.api.IWailaCommonAccessor; +import mcp.mobius.waila.api.IWailaVariableWidthTooltipRenderer; +import mcp.mobius.waila.api.impl.ModuleRegistrar; +import mcp.mobius.waila.overlay.DisplayUtil; +import mcp.mobius.waila.overlay.OverlayConfig; + +// Based on Waila's new progress bar renderer by super +public class TTRenderUIETimeLeftBar implements IWailaVariableWidthTooltipRenderer { + + int maxStringW; + + public static void register() { + ModuleRegistrar.instance() + .registerTooltipRenderer("waila.uie.progress", new TTRenderUIETimeLeftBar()); // Registration code would go + // here if needed + } + + @Override + public Dimension getSize(String[] params, IWailaCommonAccessor accessor) { + return new Dimension(DisplayUtil.getDisplayWidth(params[2]), 12); + } + + @Override + public void draw(String[] params, IWailaCommonAccessor accessor) { + drawThickBeveledBox(0, 0, maxStringW, 12, 1, 0xFF505050, 0xFF505050, -1); + long progresstime = Long.parseLong(params[0]); + long maxProgresstime = Long.parseLong(params[1]); + String text = params[2]; + if (progresstime > maxProgresstime) maxProgresstime = progresstime; + int progress = (int) ((maxStringW - 1) * ((double) progresstime / maxProgresstime)); + for (int xx = 1; xx < progress; xx++) { + int color = (xx & 1) == 0 ? 0xFF176087 : 0xFF1D84B5; + drawVerticalLine(xx, 1, 12 - 1, color); + } + DisplayUtil.drawString(text, 2, 2, OverlayConfig.fontcolor, true); + } + + public static void drawThickBeveledBox(int x1, int y1, int x2, int y2, int thickness, int topleftcolor, + int botrightcolor, int fillcolor) { + if (fillcolor != -1) { + Gui.drawRect(x1 + 1, y1 + 1, x2 - 1, y2 - 1, fillcolor); + } + Gui.drawRect(x1, y1, x2 - 1, y1 + thickness, topleftcolor); + Gui.drawRect(x1, y1, x1 + thickness, y2 - 1, topleftcolor); + Gui.drawRect(x2 - thickness, y1, x2, y2 - 1, botrightcolor); + Gui.drawRect(x1, y2 - thickness, x2, y2, botrightcolor); + } + + public static void drawVerticalLine(int x1, int y1, int y2, int color) { + Gui.drawRect(x1, y1, x1 + 1, y2, color); + } + + @Override + public void setMaxLineWidth(int width) { + maxStringW = width + 2; + } + + @Override + public int getMaxLineWidth() { + return maxStringW; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java index ac31887d..ae10ef42 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java @@ -15,6 +15,7 @@ import mcp.mobius.waila.api.IWailaDataAccessor; import mcp.mobius.waila.api.IWailaDataProvider; import mcp.mobius.waila.api.IWailaRegistrar; +import mcp.mobius.waila.api.SpecialChars; import mcp.mobius.waila.cbcore.LangUtil; /** @@ -43,13 +44,27 @@ public List getWailaHead(ItemStack itemStack, List currenttip, I public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { if (accessor.getTileEntity() instanceof TileEntityEnderQuarry) { - TileEntityEnderQuarry.QuarryWorkState state = TileEntityEnderQuarry.QuarryWorkState.VALUES[accessor - .getNBTData() + NBTTagCompound nbt = accessor.getNBTData(); + int estimatedSecondsLeft = nbt.getInteger("estSecondsLeft"); + if (estimatedSecondsLeft > 0) currenttip.add( + SpecialChars.getRenderString( + "waila.uie.progress", + String.valueOf(nbt.getLong("brokenBlocks")), + String.valueOf(nbt.getLong("estBlocks")), + // Can't pass the time format string via the localization system since it seems to remove the + // leading zero formatting + LangUtil.instance.translate( + "uie.quarry.waila.timeleft", + String.format( + "%02d:%02d:%02d", + estimatedSecondsLeft / 3600, + (estimatedSecondsLeft % 3600) / 60, + (estimatedSecondsLeft % 60))))); + + TileEntityEnderQuarry.QuarryWorkState state = TileEntityEnderQuarry.QuarryWorkState.VALUES[nbt .getInteger("state")]; currenttip.add( - String.format( - LangUtil.instance.translate("uie.quarry.waila.state"), - LangUtil.instance.translate(state.localKey))); + LangUtil.instance.translate("uie.quarry.waila.state", LangUtil.instance.translate(state.localKey))); } return currenttip; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java index ae77c24e..bf847b47 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java @@ -12,6 +12,10 @@ public class EnderQuarryConfig { @Config.DefaultBoolean(true) public static boolean enableEnderQuarry; + @Config.Comment("Default amount of blocks the quarry will mine upwards, added to its own y position.") + @Config.DefaultInt(5) + public static int enderQuarryDefaultTopPadding; + @Config.Comment("Energy (RF) capacity of the machine.") @Config.DefaultInt(10_000_000) public static int enderQuarryEnergyStorage; diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index 8a591550..f3338622 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -289,5 +289,11 @@ uie.quarry.state.4=Waiting for Energy uie.quarry.state.5=Throttled by Energy uie.quarry.state.6=Finished uie.quarry.state.7=Running - uie.quarry.waila.state=Status: %s +uie.quarry.waila.timeleft=Est. Time Left: %s +uie.quarry.scanmessage.1=Found ender marker fence boundary, setting up work area from (%d %d) to (%d %d). Should require %d steps. +uie.quarry.scanmessage.2=Found ender marker fence boundary from %d markers, setting up complex work area. Should require %d steps. +uie.quarry.scanmessage.3=Ender marker at (%d %d %d) failed to set up a fence boundary. +uie.quarry.scanmessage.4=Found no ender markers around quarry. +uie.quarry.scanmessage.5=Failed to complete marker chain, with last marker at (%d %d %d). + From 48558c1107e07f652509ef3f18c6f87c0b626ac4 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Mon, 19 Jan 2026 04:35:50 +0100 Subject: [PATCH 23/28] Add redstone functionality, remove unused facing prop, fix nbt loading issues --- .../blocks/ender_quarry/BlockEnderQuarry.java | 32 ++-- .../tileentities/TileEntityEnderQuarry.java | 143 ++++++++++++------ 2 files changed, 110 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java index 7661e6d7..eda876c9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java @@ -39,14 +39,9 @@ public int getRenderType() { public void onBlockPlacedBy(World worldIn, int x, int y, int z, EntityLivingBase placer, ItemStack itemIn) { super.onBlockPlacedBy(worldIn, x, y, z, placer, itemIn); - int direction = (int) (((placer.rotationYaw + 45f) / 90f + 4f) % 4f); - - worldIn.setBlockMetadataWithNotify(x, y, z, direction, 2); - - TileEntity te = worldIn.getTileEntity(x, y, z); - if (te instanceof TileEntityEnderQuarry quarry) { - quarry.facing = getFacing(direction); + if (worldIn.getTileEntity(x, y, z) instanceof TileEntityEnderQuarry quarry) { quarry.ownerUUID = placer.getUniqueID(); + quarry.updateRedstoneState(); } } @@ -82,7 +77,7 @@ public void breakBlock(World worldIn, int x, int y, int z, Block blockBroken, in super.breakBlock(worldIn, x, y, z, blockBroken, meta); } - public void dropContent(TileEntityEnderQuarry quarry, World world) { + private void dropContent(TileEntityEnderQuarry quarry, World world) { for (ItemStack item : quarry.retrieveAllItems()) { float dx = world.rand.nextFloat() * 0.8F + 0.1F; float dy = world.rand.nextFloat() * 0.8F + 0.1F; @@ -121,17 +116,22 @@ public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neig TileEntity te = worldIn.getTileEntity(x, y, z); if (!worldIn.isRemote && te instanceof TileEntityEnderQuarry quarry) { quarry.scanSidesForTEs(); + quarry.updateRedstoneState(); } } - public static ForgeDirection getFacing(int meta) { - return switch (meta) { - case 0 -> ForgeDirection.SOUTH; - case 1 -> ForgeDirection.WEST; - case 2 -> ForgeDirection.NORTH; - case 3 -> ForgeDirection.EAST; - default -> ForgeDirection.UNKNOWN; - }; + @Override + public boolean hasComparatorInputOverride() { + return true; + } + + @Override + public int getComparatorInputOverride(World worldIn, int x, int y, int z, int side) { + if (worldIn.isRemote) return 0; + if (worldIn.getTileEntity(x, y, z) instanceof TileEntityEnderQuarry quarry) { + return quarry.getComparatorOutput(); + } + return 0; } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index c48ea2da..a7d949f4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -75,7 +75,6 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver public static Block REPLACE_BLOCK = Blocks.dirt; public boolean isCreativeBoosted = false; private int storedItems; - public ForgeDirection facing; private Area2d workArea; private List nextWorkAreas = new LinkedList<>(); public QuarryWorkState state; @@ -90,6 +89,7 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver private long estimatedTotalBlocks; private int estimatedSecondsLeft = -1; private boolean sidesValidated = false; + private boolean redstonePowered = false; public @Nullable UUID ownerUUID = null; private final ArrayDeque brokenBlocksSlidingWindow = new ArrayDeque<>(); private final HashMap sidedItemAcceptors = new LinkedHashMap<>(); @@ -136,9 +136,16 @@ public String getState() { }; } + /** + * Resets the quarry to a state that we can start from if provided with a work area. + * Does not clear stored items, fluids, or energy. + */ private void resetQuarry() { state = QuarryWorkState.STOPPED; brokenBlocksTotal = 0; + estimatedTotalBlocks = 0; + estimatedSecondsLeft = -1; + if (areWeLoadingThisChunk(chunkX, chunkZ)) unloadChunkShifted(chunkX, chunkZ); workArea = null; nextWorkAreas.clear(); } @@ -171,11 +178,23 @@ public void startQuarry() { } } + /** + * Calculates the comparator output signal strength based on quarry progress. + * Will be 0 when stopped or no work done, 1-14 for progress, and 15 when finished. + */ + public int getComparatorOutput() { + if (state == QuarryWorkState.STOPPED || estimatedTotalBlocks == 0 || brokenBlocksTotal == 0) { + return 0; + } + double progress = (double) brokenBlocksTotal / (double) Math.max(estimatedTotalBlocks, brokenBlocksTotal); + return (int) Math.floor(progress * 14.0 - 0.05) + (state == QuarryWorkState.FINISHED ? 1 : 0); + } + /** * Tries to find a lower Y bound than the default of bedrock level (1), by scanning downwards from the quarry, * looking for the first marker. (Returns block above the marker, since we don't want to mine the marker itself.) */ - public int findLowerYBound() { + private int findLowerYBound() { for (int i = this.yCoord - 2; i > 1; i--) { if (worldObj.getTileEntity(xCoord, i, zCoord) instanceof TileEntityEnderMarker) { return i + 1; @@ -189,7 +208,7 @@ public int findLowerYBound() { * upwards from the quarry, * looking for the first marker. (Returns block below the marker, since we don't want to mine the marker itself.) */ - public int findUpperYBound() { + private int findUpperYBound() { for (int i = this.yCoord + 2; i < 255; i++) { if (worldObj.getTileEntity(xCoord, i, zCoord) instanceof TileEntityEnderMarker) { return i - 1; @@ -198,7 +217,7 @@ public int findUpperYBound() { return Math.min(this.yCoord + EnderQuarryConfig.enderQuarryDefaultTopPadding, 255); } - public void scanForWorkAreaFromMarkers(EntityPlayer player) { + public void scanForWorkAreaFromMarkers(@Nullable EntityPlayer player) { boolean foundMarkers = false; for (ForgeDirection dir : DirectionUtil.HORIZONTAL_DIRECTIONS) { TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); @@ -219,15 +238,16 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { // to each dimension to make it inclusive) estBlocks = (long) (upperYBound - lowerYBound + 1) * (workArea.height + 1) * (workArea.width + 1); - player.addChatComponentMessage( - new ChatComponentText( - String.format( - StatCollector.translateToLocal("uie.quarry.scanmessage.1"), - workArea.low.x, - workArea.low.y, - workArea.high.x, - workArea.high.y, - estBlocks))); + if (player != null) + player.addChatComponentMessage( + new ChatComponentText( + String.format( + StatCollector.translateToLocal("uie.quarry.scanmessage.1"), + workArea.low.x, + workArea.low.y, + workArea.high.x, + workArea.high.y, + estBlocks))); // Or do we have a more complex rectilinear polygon as defined by many points } else { @@ -262,12 +282,13 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { * (nextWorkArea.width + 1); } - player.addChatComponentMessage( - new ChatComponentText( - String.format( - StatCollector.translateToLocal("uie.quarry.scanmessage.2"), - scanReturn.size(), - estBlocks))); + if (player != null) + player.addChatComponentMessage( + new ChatComponentText( + String.format( + StatCollector.translateToLocal("uie.quarry.scanmessage.2"), + scanReturn.size(), + estBlocks))); setWorkArea(nextWorkAreas.remove(nextWorkAreas.size() - 1)); startQuarry(); @@ -276,18 +297,19 @@ public void scanForWorkAreaFromMarkers(EntityPlayer player) { estimatedTotalBlocks = estBlocks; return; } else { - player.addChatComponentMessage( - new ChatComponentText( - String.format( - StatCollector.translateToLocal("uie.quarry.scanmessage.3"), - marker.xCoord, - marker.yCoord, - marker.zCoord))); + if (player != null) + player.addChatComponentMessage( + new ChatComponentText( + String.format( + StatCollector.translateToLocal("uie.quarry.scanmessage.3"), + marker.xCoord, + marker.yCoord, + marker.zCoord))); foundMarkers = true; } } } - if (!foundMarkers) player + if (!foundMarkers && player != null) player .addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("uie.quarry.scanmessage.4"))); } @@ -959,6 +981,27 @@ public List retrieveAllItems() { return items; } + /** + * Checks if the redstone powered state has changed and acts accordingly. + * For a rising edge that means restarting the quarry. + * Should be called when the redstone state might have changed, so on neighbor block change. + */ + public void updateRedstoneState() { + boolean powered = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); + if (powered != redstonePowered) { + redstonePowered = powered; + // Was not powered before, is powered now + if (redstonePowered) { + resetQuarry(); + scanForWorkAreaFromMarkers(null); + startQuarry(); + } + } + } + + /** + * Scans all 6 sides for TileEntities that for containers that can accept items or fluids and ender quarry upgrades. + */ public void scanSidesForTEs() { sidedFluidAcceptors.clear(); sidedItemAcceptors.clear(); @@ -1029,30 +1072,13 @@ private void removeCurrentBlock() { upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.WORLD_HOLE) ? Blocks.air : REPLACE_BLOCK); } - // TileEntity & LoadableTE - @Override - public void validate() { - super.validate(); - if (state != QuarryWorkState.FINISHED) { - if (workArea != null) { - loadChunkShifted(chunkX, chunkZ); - } - /* - * preferably we would call scanSidesForTEs() here, however - * the contained getTileEntity() seems to always re-load the chunk at this stage - * which then re-validates back to this function, eventually leading to a stackoverflow - * Instead we set the side check state to false, so that the next updateEntity() call does the scan - */ - sidesValidated = false; - } - } - /** * Update the time left data with a new data point of blocks broken this tick & recalculate the estimate every * second */ private void updateTimeLeftEstimate(int newDataPoint) { brokenBlocksSlidingWindow.add(newDataPoint); + // 15-second sliding window if (brokenBlocksSlidingWindow.size() > 300) brokenBlocksSlidingWindow.removeFirst(); if (worldObj.getTotalWorldTime() % 20 == 0 && estimatedTotalBlocks > brokenBlocksTotal) { @@ -1081,11 +1107,28 @@ private double getAverageBlocksPerTick() { return (double) weightedSum / weightTotal; } + // TileEntity & LoadableTE + @Override + public void validate() { + super.validate(); + if (state != QuarryWorkState.FINISHED) { + if (workArea != null) { + loadChunkShifted(chunkX, chunkZ); + } + /* + * preferably we would call scanSidesForTEs() here, however + * the contained getTileEntity() seems to always re-load the chunk at this stage + * which then re-validates back to this function, eventually leading to a stackoverflow + * Instead we set the side check state to false, so that the next updateEntity() call does the scan + */ + sidesValidated = false; + } + } + // TileEntity @Override public void updateEntity() { if (worldObj.isRemote) return; - if (facing == ForgeDirection.UNKNOWN) return; if (state == QuarryWorkState.FINISHED && storedItems == 0 && fluidStorageIsEmpty() && ownerUUID == null) { if (selfIsLoaded) unloadSelf(); return; @@ -1195,7 +1238,6 @@ public void updateEntity() { @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - facing = ForgeDirection.getOrientation(nbt.getInteger("facing")); state = QuarryWorkState.values()[nbt.getInteger("state")]; if (state != QuarryWorkState.FINISHED) { // Current work area @@ -1209,7 +1251,7 @@ public void readFromNBT(NBTTagCompound nbt) { lowerYBound = nbt.getInteger("lowerYBound"); upperYBound = nbt.getInteger("upperYBound"); // Fix for cases where upperYBound was not present yet - if (lowerYBound == upperYBound) upperYBound = findUpperYBound(); + if (lowerYBound == upperYBound) upperYBound = this.yCoord + EnderQuarryConfig.enderQuarryDefaultTopPadding; // Possible next work areas for complex markers NBTTagList possibleNextAreas = nbt.getTagList("nextAreas", Constants.NBT.TAG_COMPOUND); @@ -1221,8 +1263,10 @@ public void readFromNBT(NBTTagCompound nbt) { } } } + redstonePowered = nbt.getBoolean("redstonePowered"); brokenBlocksTotal = nbt.getLong("brokenBlocks"); estimatedTotalBlocks = nbt.getLong("estBlocks"); + // Not strictly necessary, but required for waila tooltip estimatedSecondsLeft = nbt.getInteger("estSecondsLeft"); ownerUUID = nbt.getString("owner") .isEmpty() ? null : UUID.fromString(nbt.getString("owner")); @@ -1254,7 +1298,6 @@ public void readFromNBT(NBTTagCompound nbt) { @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setInteger("facing", facing.ordinal()); nbt.setInteger("state", state.ordinal()); if (state != QuarryWorkState.FINISHED && workArea != null) { // Work area @@ -1274,8 +1317,10 @@ public void writeToNBT(NBTTagCompound nbt) { } nbt.setTag("nextAreas", areasNBT); } + nbt.setBoolean("redstonePowered", redstonePowered); nbt.setLong("brokenBlocks", brokenBlocksTotal); nbt.setLong("estBlocks", estimatedTotalBlocks); + // Not strictly necessary, but required for waila tooltip nbt.setInteger("estSecondsLeft", estimatedSecondsLeft); nbt.setString("owner", ownerUUID != null ? ownerUUID.toString() : ""); From edc7ca2447df495f5cba7c1ee8c581aab3214ea7 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Sat, 6 Jun 2026 18:32:21 +0200 Subject: [PATCH 24/28] Add leftover localization progress --- .../blocks/ender_quarry/BlockEnderMarker.java | 8 +- .../blocks/ender_quarry/BlockEnderQuarry.java | 1 - .../tileentities/TileEntityEnderMarker.java | 10 ++- .../tileentities/TileEntityEnderQuarry.java | 82 ++++++++++--------- .../assets/utilitiesinexcess/lang/en_US.lang | 14 ++++ 5 files changed, 69 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java index 5635e648..bbf67adf 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java @@ -15,6 +15,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatComponentText; +import net.minecraft.util.StatCollector; import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -80,7 +81,12 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer if (player.isSneaking()) { int newCuboidSize = marker.increaseCuboidSize(); player - .addChatComponentMessage(new ChatComponentText("Increased cuboid size to " + newCuboidSize + ".")); + .addChatComponentMessage(new ChatComponentText( + String.format( + StatCollector.translateToLocal("uie.quarry.marker.mode.2.2"), + newCuboidSize + ) + )); } else { marker.rotateMode(); player.addChatComponentMessage(new ChatComponentText(marker.getMode())); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java index eda876c9..be54c1ce 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java @@ -13,7 +13,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java index c126c352..8d534c90 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java @@ -408,10 +408,12 @@ public void teardownConnections() { public String getMode() { return switch (operationMode) { - case DEFAULT -> "Marker is set to establish a rectangular fence from the first 3 in chain."; - case SINGLE -> "Marker is set to establish a cuboid of length " + this.cuboidSize - + ". Sneak + R-Click to adjust size."; - case ARBITRARY_LOOP -> "Marker is set to establish a full loop of markers that make up a rectilinear polygon back this marker of arbitrary size and shape."; + case DEFAULT -> StatCollector.translateToLocal("uie.quarry.marker.mode.1"); + case SINGLE -> String.format( + StatCollector.translateToLocal("uie.quarry.marker.mode.2.1"), + this.cuboidSize + ); + case ARBITRARY_LOOP -> StatCollector.translateToLocal("uie.quarry.marker.mode.3"); }; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java index a7d949f4..2369b09c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java @@ -113,26 +113,31 @@ public TileEntityEnderQuarry() { public String getState() { return switch (state) { + case STOPPED -> "uie.quarry.state.detail.1"; + case STOPPED_WAITING_FOR_FLUID_SPACE -> StatCollector.translateToLocal("uie.quarry.state.detail.2"); + case STOPPED_WAITING_FOR_ITEM_SPACE -> StatCollector.translateToLocal("uie.quarry.state.detail.3"); + case STOPPED_WAITING_FOR_ENERGY -> StatCollector.translateToLocal("uie.quarry.state.detail.4"); + case THROTTLED_BY_ENERGY -> StatCollector.translateToLocal("uie.quarry.state.detail.5"); + case FINISHED -> String.format( + StatCollector.translateToLocal("uie.quarry.state.detail.6.1"), + brokenBlocksTotal, + String.format( + storedItems > 0 ? StatCollector.translateToLocal("uie.quarry.state.detail.6.2") : ".", + storedItems)); case RUNNING -> String.format( - "Quarry is currently mining at %d %d %d, has already mined/scanned %d blocks.%s", + StatCollector.translateToLocal("uie.quarry.state.detail.7.1"), dx, dy, dz, brokenBlocksTotal, estimatedSecondsLeft > 0 ? String.format( - " Estimated time remaining: %02d:%02d:%02d.", - estimatedSecondsLeft / 3600, - (estimatedSecondsLeft % 3600) / 60, - (estimatedSecondsLeft % 60)) : ""); - case STOPPED_WAITING_FOR_FLUID_SPACE -> "Quarry is full on fluids."; - case STOPPED_WAITING_FOR_ITEM_SPACE -> "Quarry is full on items."; - case STOPPED_WAITING_FOR_ENERGY -> "Quarry is missing energy."; - case THROTTLED_BY_ENERGY -> "Quarry is running, but not at full speed because of missing energy."; - case STOPPED -> "Quarry is stopped."; - case FINISHED -> String.format( - "Quarry has finished after mining %d blocks%s.", - brokenBlocksTotal, - String.format(storedItems > 0 ? ", still holding %d items" : "", storedItems)); + StatCollector.translateToLocal("uie.quarry.state.detail.7.2"), + String.format( + "%02d:%02d:%02d", + estimatedSecondsLeft / 3600, + (estimatedSecondsLeft % 3600) / 60, + (estimatedSecondsLeft % 60))) + : ""); }; } @@ -238,16 +243,15 @@ public void scanForWorkAreaFromMarkers(@Nullable EntityPlayer player) { // to each dimension to make it inclusive) estBlocks = (long) (upperYBound - lowerYBound + 1) * (workArea.height + 1) * (workArea.width + 1); - if (player != null) - player.addChatComponentMessage( - new ChatComponentText( - String.format( - StatCollector.translateToLocal("uie.quarry.scanmessage.1"), - workArea.low.x, - workArea.low.y, - workArea.high.x, - workArea.high.y, - estBlocks))); + if (player != null) player.addChatComponentMessage( + new ChatComponentText( + String.format( + StatCollector.translateToLocal("uie.quarry.scanmessage.1"), + workArea.low.x, + workArea.low.y, + workArea.high.x, + workArea.high.y, + estBlocks))); // Or do we have a more complex rectilinear polygon as defined by many points } else { @@ -282,13 +286,12 @@ public void scanForWorkAreaFromMarkers(@Nullable EntityPlayer player) { * (nextWorkArea.width + 1); } - if (player != null) - player.addChatComponentMessage( - new ChatComponentText( - String.format( - StatCollector.translateToLocal("uie.quarry.scanmessage.2"), - scanReturn.size(), - estBlocks))); + if (player != null) player.addChatComponentMessage( + new ChatComponentText( + String.format( + StatCollector.translateToLocal("uie.quarry.scanmessage.2"), + scanReturn.size(), + estBlocks))); setWorkArea(nextWorkAreas.remove(nextWorkAreas.size() - 1)); startQuarry(); @@ -297,14 +300,13 @@ public void scanForWorkAreaFromMarkers(@Nullable EntityPlayer player) { estimatedTotalBlocks = estBlocks; return; } else { - if (player != null) - player.addChatComponentMessage( - new ChatComponentText( - String.format( - StatCollector.translateToLocal("uie.quarry.scanmessage.3"), - marker.xCoord, - marker.yCoord, - marker.zCoord))); + if (player != null) player.addChatComponentMessage( + new ChatComponentText( + String.format( + StatCollector.translateToLocal("uie.quarry.scanmessage.3"), + marker.xCoord, + marker.yCoord, + marker.zCoord))); foundMarkers = true; } } @@ -1148,7 +1150,7 @@ public void updateEntity() { owner.addChatMessage( new ChatComponentText( String.format( - "Your Ender Quarry at (%d %d %d) in DIM %d has finished.", + StatCollector.translateToLocal("uie.quarry.finished"), xCoord, yCoord, zCoord, diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index f3338622..2a416f24 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -289,6 +289,15 @@ uie.quarry.state.4=Waiting for Energy uie.quarry.state.5=Throttled by Energy uie.quarry.state.6=Finished uie.quarry.state.7=Running +uie.quarry.state.detail.1=Quarry is stopped. +uie.quarry.state.detail.2=Quarry is full on fluids. +uie.quarry.state.detail.3=Quarry is full on items. +uie.quarry.state.detail.4=Quarry is missing energy. +uie.quarry.state.detail.5=Quarry is running, but not at full speed because of missing energy. +uie.quarry.state.detail.6.1=Quarry has finished after mining %d blocks%s +uie.quarry.state.detail.6.2=, still holding %d items. +uie.quarry.state.detail.7.1=Quarry is currently operating at (%d %d %d), has already mined/scanned %d blocks.%s +uie.quarry.state.detail.7.2= Estimated time remaining: %s. uie.quarry.waila.state=Status: %s uie.quarry.waila.timeleft=Est. Time Left: %s uie.quarry.scanmessage.1=Found ender marker fence boundary, setting up work area from (%d %d) to (%d %d). Should require %d steps. @@ -296,4 +305,9 @@ uie.quarry.scanmessage.2=Found ender marker fence boundary from %d markers, sett uie.quarry.scanmessage.3=Ender marker at (%d %d %d) failed to set up a fence boundary. uie.quarry.scanmessage.4=Found no ender markers around quarry. uie.quarry.scanmessage.5=Failed to complete marker chain, with last marker at (%d %d %d). +uie.quarry.finished=Your Ender Quarry at (%d %d %d) in DIM %d has finished. +uie.quarry.marker.mode.1=Marker is set to establish a rectangular fence from the first 3 in chain. +uie.quarry.marker.mode.2.1=Marker is set to establish a cuboid of length %d. Sneak + R-Click to adjust size. +uie.quarry.marker.mode.2.2=Increased cuboid size to %d. +uie.quarry.marker.mode.3=Marker is set to establish a full loop of markers that make up a rectilinear polygon back this marker of arbitrary size and shape. From 69ee0bb1997deb1da8ee91eb44741935d9e8f225 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Sat, 6 Jun 2026 20:44:44 +0200 Subject: [PATCH 25/28] Refactor to Void name, fix missing localization on status message --- dependencies.gradle | 2 +- .../utilitiesinexcess/ModBlocks.java | 14 ++-- .../utilitiesinexcess/ModTileEntities.java | 8 +- .../BlockVoidMarker.java} | 32 ++++---- .../BlockVoidQuarry.java} | 30 ++++---- .../BlockVoidQuarryUpgrade.java} | 20 ++--- .../VoidQuarryUpgradeManager.java} | 70 +++++++++--------- ...rMarker.java => TileEntityVoidMarker.java} | 57 +++++++------- ...rQuarry.java => TileEntityVoidQuarry.java} | 58 +++++++-------- .../compat/waila/WailaHandler.java | 10 +-- .../config/blocks/BlockConfig.java | 2 +- ...uarryConfig.java => VoidQuarryConfig.java} | 48 ++++++------ .../utils/ForgeEventHandler.java | 6 +- .../blockstates/ender_marker.json | 5 -- .../blockstates/ender_quarry.json | 5 -- .../blockstates/void_marker.json | 5 ++ .../blockstates/void_quarry.json | 5 ++ ..._upgrade.json => void_quarry_upgrade.json} | 0 .../assets/utilitiesinexcess/lang/en_US.lang | 17 ++++- .../{ender_marker.json => void_marker.json} | 4 +- .../{ender_quarry.json => void_quarry.json} | 6 +- .../{ender_marker.png => void_marker.png} | Bin .../{ender_quarry.png => void_quarry.png} | Bin 23 files changed, 204 insertions(+), 200 deletions(-) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/{ender_quarry/BlockEnderMarker.java => void_quarry/BlockVoidMarker.java} (82%) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/{ender_quarry/BlockEnderQuarry.java => void_quarry/BlockVoidQuarry.java} (84%) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/{ender_quarry/BlockEnderQuarryUpgrade.java => void_quarry/BlockVoidQuarryUpgrade.java} (74%) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/{ender_quarry/EnderQuarryUpgradeManager.java => void_quarry/VoidQuarryUpgradeManager.java} (62%) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/{TileEntityEnderMarker.java => TileEntityVoidMarker.java} (90%) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/{TileEntityEnderQuarry.java => TileEntityVoidQuarry.java} (96%) rename src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/{EnderQuarryConfig.java => VoidQuarryConfig.java} (66%) delete mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/ender_marker.json delete mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/void_marker.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/void_quarry.json rename src/main/resources/assets/utilitiesinexcess/blockstates/{ender_quarry_upgrade.json => void_quarry_upgrade.json} (100%) rename src/main/resources/assets/utilitiesinexcess/models/blocks/{ender_marker.json => void_marker.json} (98%) rename src/main/resources/assets/utilitiesinexcess/models/blocks/{ender_quarry.json => void_quarry.json} (99%) rename src/main/resources/assets/utilitiesinexcess/textures/blocks/{ender_marker.png => void_marker.png} (100%) rename src/main/resources/assets/utilitiesinexcess/textures/blocks/{ender_quarry.png => void_quarry.png} (100%) diff --git a/dependencies.gradle b/dependencies.gradle index dc8f482c..00baf830 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -56,7 +56,7 @@ dependencies { // For debugging chunkloading runtimeOnlyNonPublishable('curse.maven:chicken-chunks-229316:2233250') - // Testing performance with ender quarry inserts + // Testing performance with void quarry inserts runtimeOnlyNonPublishable('com.github.GTNewHorizons:Avaritiaddons:1.9.3-GTNH:dev') { transitive = true } runtimeOnlyNonPublishable('com.github.GTNewHorizons:Avaritia:1.81-pre:dev') { transitive = false } runtimeOnlyNonPublishable('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-789-GTNH:dev') { transitive = true } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 1a5e171f..4e868a20 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -32,9 +32,6 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockTrashCanFluid; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockTrashCanItem; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockUpdateDetector; -import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderMarker; -import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderQuarry; -import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderQuarryUpgrade; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockEnderGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockFoodGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockFurnaceGenerator; @@ -47,11 +44,14 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockRedstoneGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockSolarGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockTNTGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry.BlockVoidMarker; +import com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry.BlockVoidQuarry; +import com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry.BlockVoidQuarryUpgrade; import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderLotusConfig; -import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.GeneratorConfig; +import com.fouristhenumber.utilitiesinexcess.config.blocks.VoidQuarryConfig; import com.fouristhenumber.utilitiesinexcess.config.dimensions.EndOfTimeConfig; import com.fouristhenumber.utilitiesinexcess.config.dimensions.UnderWorldConfig; import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; @@ -108,9 +108,9 @@ public enum ModBlocks { SPIKE_DIAMOND(BlockConfig.spikes.enableDiamondSpike, new BlockSpike(BlockSpike.SpikeType.DIAMOND, "diamondSpike"), BlockSpike.ItemSpike.class, "diamondSpike"), UNDERWORLD_PORTAL(BlockConfig.enableUnderWorldPortal && UnderWorldConfig.enableUnderWorld, new BlockPortalUnderWorld(), "underworld_portal"), END_OF_TIME_PORTAL(BlockConfig.enableEndOfTimePortal && EndOfTimeConfig.enableEndOfTime, new BlockPortalEndOfTime(), BlockPortalEndOfTime.ItemBlockPortalEndOfTime.class, "temporal_gate"), - ENDER_QUARRY(EnderQuarryConfig.enableEnderQuarry, new BlockEnderQuarry(), "ender_quarry"), - ENDER_MARKER(EnderQuarryConfig.enableEnderQuarry, new BlockEnderMarker(), "ender_marker"), - ENDER_QUARRY_UPGRADE(EnderQuarryConfig.enableEnderQuarry, new BlockEnderQuarryUpgrade(), BlockEnderQuarryUpgrade.ItemEnderQuarryUpgrade.class, "ender_quarry_upgrade"), + VOID_QUARRY(VoidQuarryConfig.enableVoidQuarry, new BlockVoidQuarry(), "void_quarry"), + VOID_MARKER(VoidQuarryConfig.enableVoidQuarry, new BlockVoidMarker(), "void_marker"), + VOID_QUARRY_UPGRADE(VoidQuarryConfig.enableVoidQuarry, new BlockVoidQuarryUpgrade(), BlockVoidQuarryUpgrade.ItemVoidQuarryUpgrade.class, "void_quarry_upgrade"), ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java index 5bfc28b1..274ff287 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java @@ -5,8 +5,6 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPureLove; @@ -18,6 +16,8 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanEnergy; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanFluid; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanItem; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityVoidMarker; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityVoidQuarry; import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityEnderGenerator; import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityFoodGenerator; import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityFurnaceGenerator; @@ -63,8 +63,8 @@ public enum ModTileEntities { GENERATOR_TNT(TileEntityTNTGenerator.class , "TNTGenerator"), GENERATOR_PINK(TileEntityPinkGenerator.class , "PinkGenerator"), GENERATOR_NETHER_STAR(TileEntityNetherStarGenerator.class , "NetherStarGenerator"), - ENDER_QUARRY(TileEntityEnderQuarry.class , "EnderQuarry"), - ENDER_MARKER(TileEntityEnderMarker.class , "EnderMarker"), + VOID_QUARRY(TileEntityVoidQuarry.class , "VoidQuarry"), + VOID_MARKER(TileEntityVoidMarker.class , "VoidMarker"), ; // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidMarker.java similarity index 82% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidMarker.java index bbf67adf..bbcbe397 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidMarker.java @@ -1,4 +1,4 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry; +package com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry; import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; @@ -20,15 +20,15 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityVoidMarker; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; -public class BlockEnderMarker extends BlockContainer { +public class BlockVoidMarker extends BlockContainer { - public BlockEnderMarker() { + public BlockVoidMarker() { super(Material.iron); - setBlockName("ender_marker"); - setBlockTextureName("utilitiesinexcess:ender_marker"); + setBlockName("void_marker"); + setBlockTextureName("utilitiesinexcess:void_marker"); setBlockBounds(7F / 16F, 0F / 16F, 7F / 16F, 9F / 16F, 13.5F / 16F, 9F / 16F); setLightOpacity(0); } @@ -37,7 +37,7 @@ public BlockEnderMarker() { public void onBlockPlacedBy(World worldIn, int x, int y, int z, EntityLivingBase placer, ItemStack itemIn) { if (worldIn.isRemote) return; TileEntity te = worldIn.getTileEntity(x, y, z); - if (te instanceof TileEntityEnderMarker marker) { + if (te instanceof TileEntityVoidMarker marker) { marker.checkForAlignedMarkers(); } } @@ -53,7 +53,7 @@ public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlig public void onBlockDestroyedByPlayer(World worldIn, int x, int y, int z, int meta) { if (worldIn.isRemote) return; TileEntity te = worldIn.getTileEntity(x, y, z); - if (te instanceof TileEntityEnderMarker marker) { + if (te instanceof TileEntityVoidMarker marker) { marker.teardownConnections(); } } @@ -67,7 +67,7 @@ public void onBlockDestroyedByExplosion(World worldIn, int x, int y, int z, Expl public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { super.onNeighborBlockChange(worldIn, x, y, z, neighbor); TileEntity te = worldIn.getTileEntity(x, y, z); - if (!worldIn.isRemote && te instanceof TileEntityEnderMarker marker) { + if (!worldIn.isRemote && te instanceof TileEntityVoidMarker marker) { marker.checkForAlignedMarkers(); } } @@ -77,16 +77,12 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer float subY, float subZ) { if (worldIn.isRemote) return true; TileEntity te = worldIn.getTileEntity(x, y, z); - if (te instanceof TileEntityEnderMarker marker) { + if (te instanceof TileEntityVoidMarker marker) { if (player.isSneaking()) { int newCuboidSize = marker.increaseCuboidSize(); - player - .addChatComponentMessage(new ChatComponentText( - String.format( - StatCollector.translateToLocal("uie.quarry.marker.mode.2.2"), - newCuboidSize - ) - )); + player.addChatComponentMessage( + new ChatComponentText( + String.format(StatCollector.translateToLocal("uie.quarry.marker.mode.2.2"), newCuboidSize))); } else { marker.rotateMode(); player.addChatComponentMessage(new ChatComponentText(marker.getMode())); @@ -117,7 +113,7 @@ public void randomDisplayTick(World worldIn, int x, int y, int z, Random random) @Override public TileEntity createNewTileEntity(World worldIn, int meta) { - return new TileEntityEnderMarker(); + return new TileEntityVoidMarker(); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarry.java similarity index 84% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarry.java index be54c1ce..d440479a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarry.java @@ -1,4 +1,4 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry; +package com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry; import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; @@ -14,14 +14,14 @@ import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityVoidQuarry; -public class BlockEnderQuarry extends BlockContainer { +public class BlockVoidQuarry extends BlockContainer { - public BlockEnderQuarry() { + public BlockVoidQuarry() { super(Material.iron); - setBlockName("ender_quarry"); - setBlockTextureName("utilitiesinexcess:ender_quarry"); + setBlockName("void_quarry"); + setBlockTextureName("utilitiesinexcess:void_quarry"); } @Override @@ -38,7 +38,7 @@ public int getRenderType() { public void onBlockPlacedBy(World worldIn, int x, int y, int z, EntityLivingBase placer, ItemStack itemIn) { super.onBlockPlacedBy(worldIn, x, y, z, placer, itemIn); - if (worldIn.getTileEntity(x, y, z) instanceof TileEntityEnderQuarry quarry) { + if (worldIn.getTileEntity(x, y, z) instanceof TileEntityVoidQuarry quarry) { quarry.ownerUUID = placer.getUniqueID(); quarry.updateRedstoneState(); } @@ -49,16 +49,16 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer float subY, float subZ) { if (worldIn.isRemote) return true; TileEntity te = worldIn.getTileEntity(x, y, z); - if (te instanceof TileEntityEnderQuarry quarry) { + if (te instanceof TileEntityVoidQuarry quarry) { if (player.isSneaking() && player.capabilities.isCreativeMode) { quarry.isCreativeBoosted = !quarry.isCreativeBoosted; player.addChatComponentMessage( new ChatComponentText((quarry.isCreativeBoosted ? "" : "Un-") + "Creative-Boosted Quarry.")); return true; } - if (quarry.state == TileEntityEnderQuarry.QuarryWorkState.STOPPED) { + if (quarry.state == TileEntityVoidQuarry.QuarryWorkState.STOPPED) { quarry.scanForWorkAreaFromMarkers(player); - if (quarry.state == TileEntityEnderQuarry.QuarryWorkState.RUNNING) { + if (quarry.state == TileEntityVoidQuarry.QuarryWorkState.RUNNING) { return true; } } @@ -70,13 +70,13 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer @Override public void breakBlock(World worldIn, int x, int y, int z, Block blockBroken, int meta) { TileEntity te = worldIn.getTileEntity(x, y, z); - if (te instanceof TileEntityEnderQuarry quarry) { + if (te instanceof TileEntityVoidQuarry quarry) { dropContent(quarry, worldIn); } super.breakBlock(worldIn, x, y, z, blockBroken, meta); } - private void dropContent(TileEntityEnderQuarry quarry, World world) { + private void dropContent(TileEntityVoidQuarry quarry, World world) { for (ItemStack item : quarry.retrieveAllItems()) { float dx = world.rand.nextFloat() * 0.8F + 0.1F; float dy = world.rand.nextFloat() * 0.8F + 0.1F; @@ -113,7 +113,7 @@ private void dropContent(TileEntityEnderQuarry quarry, World world) { public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { super.onNeighborBlockChange(worldIn, x, y, z, neighbor); TileEntity te = worldIn.getTileEntity(x, y, z); - if (!worldIn.isRemote && te instanceof TileEntityEnderQuarry quarry) { + if (!worldIn.isRemote && te instanceof TileEntityVoidQuarry quarry) { quarry.scanSidesForTEs(); quarry.updateRedstoneState(); } @@ -127,7 +127,7 @@ public boolean hasComparatorInputOverride() { @Override public int getComparatorInputOverride(World worldIn, int x, int y, int z, int side) { if (worldIn.isRemote) return 0; - if (worldIn.getTileEntity(x, y, z) instanceof TileEntityEnderQuarry quarry) { + if (worldIn.getTileEntity(x, y, z) instanceof TileEntityVoidQuarry quarry) { return quarry.getComparatorOutput(); } return 0; @@ -135,6 +135,6 @@ public int getComparatorInputOverride(World worldIn, int x, int y, int z, int si @Override public TileEntity createNewTileEntity(World worldIn, int meta) { - return new TileEntityEnderQuarry(); + return new TileEntityVoidQuarry(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarryUpgrade.java similarity index 74% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarryUpgrade.java index ec0cb259..0b514060 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/BlockEnderQuarryUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarryUpgrade.java @@ -1,4 +1,4 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry; +package com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry; import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; @@ -19,15 +19,15 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class BlockEnderQuarryUpgrade extends Block { +public class BlockVoidQuarryUpgrade extends Block { @SideOnly(Side.CLIENT) private IIcon[] icons; - public BlockEnderQuarryUpgrade() { + public BlockVoidQuarryUpgrade() { super(Material.iron); setHardness(1f); - setBlockName("utilitiesinexcess:ender_quarry_upgrade"); + setBlockName("utilitiesinexcess:void_quarry_upgrade"); setBlockBounds(0.5F / 16F, 1.5F / 16F, 0.5F / 16F, 15.5F / 16F, 15F / 16F, 15.5F / 16F); setLightOpacity(0); } @@ -41,7 +41,7 @@ public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlig @SideOnly(Side.CLIENT) public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { - for (int i = 0; i < EnderQuarryUpgradeManager.EnderQuarryUpgrade.VALUES.length; ++i) { + for (int i = 0; i < VoidQuarryUpgradeManager.VoidQuarryUpgrade.VALUES.length; ++i) { list.add(new ItemStack(itemIn, 1, i)); } } @@ -58,9 +58,9 @@ public int getRenderType() { @Override public void registerBlockIcons(IIconRegister reg) { - icons = new IIcon[EnderQuarryUpgradeManager.EnderQuarryUpgrade.VALUES.length]; - for (int i = 0; i < EnderQuarryUpgradeManager.EnderQuarryUpgrade.VALUES.length; i++) { - EnderQuarryUpgradeManager.EnderQuarryUpgrade upgrade = EnderQuarryUpgradeManager.EnderQuarryUpgrade.VALUES[i]; + icons = new IIcon[VoidQuarryUpgradeManager.VoidQuarryUpgrade.VALUES.length]; + for (int i = 0; i < VoidQuarryUpgradeManager.VoidQuarryUpgrade.VALUES.length; i++) { + VoidQuarryUpgradeManager.VoidQuarryUpgrade upgrade = VoidQuarryUpgradeManager.VoidQuarryUpgrade.VALUES[i]; icons[i] = reg.registerIcon(upgrade.getTextureName()); } } @@ -70,9 +70,9 @@ public int damageDropped(int meta) { return meta; } - public static class ItemEnderQuarryUpgrade extends ItemBlock { + public static class ItemVoidQuarryUpgrade extends ItemBlock { - public ItemEnderQuarryUpgrade(Block block) { + public ItemVoidQuarryUpgrade(Block block) { super(block); setMaxDamage(0); setHasSubtypes(true); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/VoidQuarryUpgradeManager.java similarity index 62% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/VoidQuarryUpgradeManager.java index bfd42a01..f2e37503 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/ender_quarry/EnderQuarryUpgradeManager.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/VoidQuarryUpgradeManager.java @@ -1,4 +1,4 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry; +package com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry; import java.util.HashMap; import java.util.HashSet; @@ -6,20 +6,20 @@ import org.jetbrains.annotations.Nullable; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; -import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; +import com.fouristhenumber.utilitiesinexcess.config.blocks.VoidQuarryConfig; -public class EnderQuarryUpgradeManager { +public class VoidQuarryUpgradeManager { - private final HashMap activeUpgrades = new HashMap<>(); + private final HashMap activeUpgrades = new HashMap<>(); public double totalCostMultiplier = 0.0; // Add an upgrade - keeps highest tier - public void addUpgrade(EnderQuarryUpgrade upgrade) { + public void addUpgrade(VoidQuarryUpgrade upgrade) { if (upgrade.isBoolean()) { activeUpgrades.put(upgrade.name(), upgrade); } else { String baseName = upgrade.getTierGroup(); - EnderQuarryUpgrade current = activeUpgrades.get(baseName); + VoidQuarryUpgrade current = activeUpgrades.get(baseName); // Only set if no current upgrade or new one is higher tier if (current == null || upgrade.getTier() > current.getTier()) { @@ -30,32 +30,32 @@ public void addUpgrade(EnderQuarryUpgrade upgrade) { } // Check if a specific upgrade is active - public boolean has(EnderQuarryUpgrade upgrade) { + public boolean has(VoidQuarryUpgrade upgrade) { if (upgrade.isBoolean()) { return activeUpgrades.containsKey(upgrade.name()); } else { - EnderQuarryUpgrade current = activeUpgrades.get(upgrade.getTierGroup()); + VoidQuarryUpgrade current = activeUpgrades.get(upgrade.getTierGroup()); return current != null && current.getTier() >= upgrade.getTier(); } } // Get the active upgrade for a tiered upgrade type - public EnderQuarryUpgrade getActive(TieredEnderQuarryUpgrade tieredUpgrade) { + public VoidQuarryUpgrade getActive(TieredVoidQuarryUpgrade tieredUpgrade) { return activeUpgrades.get(tieredUpgrade.getBaseName()); } // Get value for a tiered upgrade type (returns defaultValue if not present) - public double getValue(TieredEnderQuarryUpgrade tieredUpgrade, double defaultValue) { - EnderQuarryUpgrade upgrade = activeUpgrades.get(tieredUpgrade.getBaseName()); + public double getValue(TieredVoidQuarryUpgrade tieredUpgrade, double defaultValue) { + VoidQuarryUpgrade upgrade = activeUpgrades.get(tieredUpgrade.getBaseName()); return upgrade != null ? upgrade.getValue() : defaultValue; } // Check if any tier of an upgrade type is active - public boolean hasAny(TieredEnderQuarryUpgrade tieredUpgrade) { + public boolean hasAny(TieredVoidQuarryUpgrade tieredUpgrade) { return activeUpgrades.containsKey(tieredUpgrade.getBaseName()); } - public void remove(EnderQuarryUpgrade upgrade) { + public void remove(VoidQuarryUpgrade upgrade) { if (upgrade.isBoolean()) { activeUpgrades.remove(upgrade.name()); } else { @@ -75,14 +75,14 @@ public void clear() { */ public double getTotalCostMultiplier() { double total = 0.0; - HashSet countedTieredUpgrades = new HashSet<>(); - for (EnderQuarryUpgrade upgrade : EnderQuarryUpgrade.VALUES) { + HashSet countedTieredUpgrades = new HashSet<>(); + for (VoidQuarryUpgrade upgrade : VoidQuarryUpgrade.VALUES) { if (this.has(upgrade)) { if (upgrade.isBoolean()) { total += upgrade.cost; } else { // Tiered upgrade - only count the highest tier once - TieredEnderQuarryUpgrade tierGroup = upgrade.tierGroup; + TieredVoidQuarryUpgrade tierGroup = upgrade.tierGroup; if (tierGroup == null || countedTieredUpgrades.contains(tierGroup)) { continue; } @@ -95,39 +95,39 @@ public double getTotalCostMultiplier() { return total; } - public enum EnderQuarryUpgrade { + public enum VoidQuarryUpgrade { // Boolean upgrades (presence only) - WORLD_HOLE(EnderQuarryConfig.enderQuarryWorldHoleEnergyMultiplier, "upgrade_world_hole"), - SILK_TOUCH(EnderQuarryConfig.enderQuarrySilkTouchEnergyMultiplier, "upgrade_silk_touch"), - PUMP_FLUIDS(EnderQuarryConfig.enderQuarryFluidPumpEnergyMultiplier, "upgrade_pump_fluids"), + WORLD_HOLE(VoidQuarryConfig.voidQuarryWorldHoleEnergyMultiplier, "upgrade_world_hole"), + SILK_TOUCH(VoidQuarryConfig.voidQuarrySilkTouchEnergyMultiplier, "upgrade_silk_touch"), + PUMP_FLUIDS(VoidQuarryConfig.voidQuarryFluidPumpEnergyMultiplier, "upgrade_pump_fluids"), // Tiered upgrades with hardcoded values - SPEED_1(TieredEnderQuarryUpgrade.SPEED, 1, EnderQuarryConfig.enderQuarrySpeed1EnergyMultiplier, - EnderQuarryConfig.enderQuarrySpeed1Multiplier, "upgrade_speed_1"), - SPEED_2(TieredEnderQuarryUpgrade.SPEED, 2, EnderQuarryConfig.enderQuarrySpeed2EnergyMultiplier, - EnderQuarryConfig.enderQuarrySpeed2Multiplier, "upgrade_speed_2"), - SPEED_3(TieredEnderQuarryUpgrade.SPEED, 3, EnderQuarryConfig.enderQuarrySpeed3EnergyMultiplier, - EnderQuarryConfig.enderQuarrySpeed3Multiplier, "upgrade_speed_3"), - - FORTUNE_1(TieredEnderQuarryUpgrade.FORTUNE, 1, EnderQuarryConfig.enderQuarryFortune1EnergyMultiplier, 1, + SPEED_1(TieredVoidQuarryUpgrade.SPEED, 1, VoidQuarryConfig.voidQuarrySpeed1EnergyMultiplier, + VoidQuarryConfig.voidQuarrySpeed1Multiplier, "upgrade_speed_1"), + SPEED_2(TieredVoidQuarryUpgrade.SPEED, 2, VoidQuarryConfig.voidQuarrySpeed2EnergyMultiplier, + VoidQuarryConfig.voidQuarrySpeed2Multiplier, "upgrade_speed_2"), + SPEED_3(TieredVoidQuarryUpgrade.SPEED, 3, VoidQuarryConfig.voidQuarrySpeed3EnergyMultiplier, + VoidQuarryConfig.voidQuarrySpeed3Multiplier, "upgrade_speed_3"), + + FORTUNE_1(TieredVoidQuarryUpgrade.FORTUNE, 1, VoidQuarryConfig.voidQuarryFortune1EnergyMultiplier, 1, "upgrade_fortune_1"), - FORTUNE_2(TieredEnderQuarryUpgrade.FORTUNE, 2, EnderQuarryConfig.enderQuarryFortune2EnergyMultiplier, 2, + FORTUNE_2(TieredVoidQuarryUpgrade.FORTUNE, 2, VoidQuarryConfig.voidQuarryFortune2EnergyMultiplier, 2, "upgrade_fortune_2"), - FORTUNE_3(TieredEnderQuarryUpgrade.FORTUNE, 3, EnderQuarryConfig.enderQuarryFortune3EnergyMultiplier, 3, + FORTUNE_3(TieredVoidQuarryUpgrade.FORTUNE, 3, VoidQuarryConfig.voidQuarryFortune3EnergyMultiplier, 3, "upgrade_fortune_3"); - public static final EnderQuarryUpgrade[] VALUES = values(); + public static final VoidQuarryUpgrade[] VALUES = values(); private final boolean isBoolean; private final double value; private final double cost; - private final @Nullable TieredEnderQuarryUpgrade tierGroup; + private final @Nullable TieredVoidQuarryUpgrade tierGroup; private final int tier; private final String textureName; // Constructor for boolean upgrades - EnderQuarryUpgrade(double cost, String textureName) { + VoidQuarryUpgrade(double cost, String textureName) { this.isBoolean = true; value = 0.0; this.cost = cost; @@ -137,7 +137,7 @@ public enum EnderQuarryUpgrade { } // Constructor for value-based upgrades - EnderQuarryUpgrade(@Nullable TieredEnderQuarryUpgrade tierGroup, int tier, double cost, double value, + VoidQuarryUpgrade(@Nullable TieredVoidQuarryUpgrade tierGroup, int tier, double cost, double value, String textureName) { this.isBoolean = false; this.value = value; @@ -181,7 +181,7 @@ public String getTextureName() { } } - public enum TieredEnderQuarryUpgrade { + public enum TieredVoidQuarryUpgrade { SPEED, FORTUNE; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityVoidMarker.java similarity index 90% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityVoidMarker.java index 8d534c90..b7a698f0 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityVoidMarker.java @@ -30,13 +30,13 @@ import com.fouristhenumber.utilitiesinexcess.utils.Tuple; import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; -public class TileEntityEnderMarker extends TileEntity implements IFacingTE { +public class TileEntityVoidMarker extends TileEntity implements IFacingTE { public static final ForgeDirection[] HORIZONTAL_DIRECTIONS = new ForgeDirection[] { ForgeDirection.NORTH, ForgeDirection.SOUTH, ForgeDirection.WEST, ForgeDirection.EAST }; - public static final ConcurrentHashMap> registeredMarkers = new ConcurrentHashMap<>(); + public static final ConcurrentHashMap> registeredMarkers = new ConcurrentHashMap<>(); - public final HashMap> alignedMarkers = new HashMap<>(); + public final HashMap> alignedMarkers = new HashMap<>(); private ForgeDirection facing = ForgeDirection.UNKNOWN; private int activeDirections = 0; public MarkerOperationMode operationMode = MarkerOperationMode.DEFAULT; @@ -52,7 +52,7 @@ public void validate() { } // Helper to get the marker register for the current dimension - private ConcurrentHashMap getRegistryForDimension() { + private ConcurrentHashMap getRegistryForDimension() { int dim = worldObj.provider.dimensionId; return registeredMarkers.computeIfAbsent(dim, k -> new ConcurrentHashMap<>()); } @@ -70,9 +70,9 @@ private ConcurrentHashMap getRegistryForDimensi // Don't check the direction back towards the quarry if (dir == starterFacing.getOpposite()) continue; - Tuple secondCorner = alignedMarkers.getOrDefault(dir, null); + Tuple secondCorner = alignedMarkers.getOrDefault(dir, null); if (secondCorner != null && secondCorner.getKey() != null) { - Tuple thirdCorner = Optional + Tuple thirdCorner = Optional .ofNullable(secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnRight90(dir), null)) .orElse(secondCorner.getKey().alignedMarkers.getOrDefault(DirectionUtil.turnLeft90(dir), null)); if (thirdCorner != null) { @@ -99,7 +99,7 @@ public List boundaryForArbitraryLoop(EntityPlayer player) { ArrayList stack = new ArrayList<>(); stack.add(new StackEntry(new LinkedHashMap<>(), this)); StackEntry lastVisited; - Set markerChain = null; + Set markerChain = null; searchStack: do { StackEntry entry = stack.remove(stack.size() - 1); @@ -121,7 +121,7 @@ public List boundaryForArbitraryLoop(EntityPlayer player) { } int realizedDirections = 0; - for (Map.Entry> otherMarker : entry.current.alignedMarkers + for (Map.Entry> otherMarker : entry.current.alignedMarkers .entrySet()) { if (otherMarker.getValue() .getKey() != null) { @@ -132,7 +132,7 @@ public List boundaryForArbitraryLoop(EntityPlayer player) { .getKey()) && realizedDirections < 2) { @SuppressWarnings("unchecked") // Same type - LinkedHashMap visitedMarkers = (LinkedHashMap) entry.visitedMarkers + LinkedHashMap visitedMarkers = (LinkedHashMap) entry.visitedMarkers .clone(); StackEntry stackEntry = new StackEntry( visitedMarkers, @@ -203,18 +203,18 @@ public List boundaryForArbitraryLoop(EntityPlayer player) { private static class StackEntry { // A map of previously visited markers further down the stack & the direction they were visited from - LinkedHashMap visitedMarkers; - TileEntityEnderMarker current; - Tuple lastVisited; + LinkedHashMap visitedMarkers; + TileEntityVoidMarker current; + Tuple lastVisited; - StackEntry(LinkedHashMap visitedMarkers, TileEntityEnderMarker current) { + StackEntry(LinkedHashMap visitedMarkers, TileEntityVoidMarker current) { this.visitedMarkers = visitedMarkers; this.current = current; this.lastVisited = null; } - StackEntry(LinkedHashMap visitedMarkers, TileEntityEnderMarker current, - TileEntityEnderMarker previous, ForgeDirection previousDir) { + StackEntry(LinkedHashMap visitedMarkers, TileEntityVoidMarker current, + TileEntityVoidMarker previous, ForgeDirection previousDir) { this(visitedMarkers, current); this.visitedMarkers.put(previous, previousDir); lastVisited = new Tuple<>(previous, previousDir); @@ -231,7 +231,7 @@ public void checkForAlignedMarkers() { * This method performs two main operations: *

* Attempts to resolve any null aligned markers by loading their chunks and retrieving - * the actual {@link TileEntityEnderMarker} instances from saved positions. + * the actual {@link TileEntityVoidMarker} instances from saved positions. * * Scans the dimension registry for new markers that can be connected in the given directions, * respecting ARBITRARY_LOOP operation mode constraints. @@ -242,15 +242,15 @@ public void checkForAlignedMarkers() { * indicates a connection back to this marker - meant to be used to restore stale * connections * - * @see #setAlignedMarker(ForgeDirection, TileEntityEnderMarker) + * @see #setAlignedMarker(ForgeDirection, TileEntityVoidMarker) * @see #removeAlignedMarker(ForgeDirection) */ public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyValidate, boolean forceMetaDirections) { - ConcurrentHashMap dimRegistry = getRegistryForDimension(); + ConcurrentHashMap dimRegistry = getRegistryForDimension(); // First try to resolve any null aligned markers from saved positions - for (Map.Entry> entry : new ArrayList<>( + for (Map.Entry> entry : new ArrayList<>( alignedMarkers.entrySet())) { if (entry.getValue() .getKey() == null) { @@ -259,7 +259,7 @@ public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyV worldObj.getChunkProvider() .loadChunk(alignedMarkerPos.x >> 4, alignedMarkerPos.z >> 4); TileEntity te = worldObj.getTileEntity(alignedMarkerPos.x, alignedMarkerPos.y, alignedMarkerPos.z); - if (te instanceof TileEntityEnderMarker marker) { + if (te instanceof TileEntityVoidMarker marker) { setAlignedMarker(entry.getKey(), marker); marker.setAlignedMarker( entry.getKey() @@ -274,7 +274,7 @@ public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyV // Now check for any aligned markers in the given directions for (ForgeDirection dir : dirs) { if (!alignedMarkers.containsKey(dir)) { - for (Map.Entry entry : dimRegistry.entrySet()) { + for (Map.Entry entry : dimRegistry.entrySet()) { if (operationMode == MarkerOperationMode.ARBITRARY_LOOP && alignedMarkers.size() >= 2) { // In arbitrary loop mode, only allow 2 connections break; @@ -343,7 +343,7 @@ public void checkForAlignedMarkers(@NotNull ForgeDirection[] dirs, boolean onlyV } } - public void setAlignedMarker(ForgeDirection dir, TileEntityEnderMarker marker) { + public void setAlignedMarker(ForgeDirection dir, TileEntityVoidMarker marker) { alignedMarkers.put(dir, new Tuple<>(marker, new BlockPos(marker.xCoord, marker.yCoord, marker.zCoord))); int prevActiveDirs = this.activeDirections; this.activeDirections |= 1 << (dir.ordinal() - 2); @@ -364,7 +364,7 @@ public void removeAlignedMarker(ForgeDirection dir) { public ForgeDirection[] getActiveDirsFromMeta() { // Make sure the loaded meta matches the blocks meta if (worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord) - .equals(ModBlocks.ENDER_MARKER.get()) + .equals(ModBlocks.VOID_MARKER.get()) && worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord) != this.activeDirections) { this.activeDirections = worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord); } @@ -382,9 +382,9 @@ public ForgeDirection[] getActiveDirsFromMeta() { public void teardownConnections() { checkForAlignedMarkers(getActiveDirsFromMeta(), true, false); getRegistryForDimension().remove(new BlockPos(this.xCoord, this.yCoord, this.zCoord)); - for (Map.Entry> alignedMarker : alignedMarkers + for (Map.Entry> alignedMarker : alignedMarkers .entrySet()) { - TileEntityEnderMarker markerTE = alignedMarker.getValue() + TileEntityVoidMarker markerTE = alignedMarker.getValue() .getKey(); if (markerTE != null) { markerTE.removeAlignedMarker( @@ -395,7 +395,7 @@ public void teardownConnections() { BlockPos alignedMarkerPos = alignedMarker.getValue() .getValue(); TileEntity te = worldObj.getTileEntity(alignedMarkerPos.x, alignedMarkerPos.y, alignedMarkerPos.z); - if (te instanceof TileEntityEnderMarker marker) { + if (te instanceof TileEntityVoidMarker marker) { marker.removeAlignedMarker( alignedMarker.getKey() .getOpposite()); @@ -409,10 +409,7 @@ public void teardownConnections() { public String getMode() { return switch (operationMode) { case DEFAULT -> StatCollector.translateToLocal("uie.quarry.marker.mode.1"); - case SINGLE -> String.format( - StatCollector.translateToLocal("uie.quarry.marker.mode.2.1"), - this.cuboidSize - ); + case SINGLE -> String.format(StatCollector.translateToLocal("uie.quarry.marker.mode.2.1"), this.cuboidSize); case ARBITRARY_LOOP -> StatCollector.translateToLocal("uie.quarry.marker.mode.3"); }; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityVoidQuarry.java similarity index 96% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityVoidQuarry.java index 2369b09c..ac170cf8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityEnderQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityVoidQuarry.java @@ -49,10 +49,10 @@ import org.joml.Vector4i; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; -import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.BlockEnderQuarryUpgrade; -import com.fouristhenumber.utilitiesinexcess.common.blocks.ender_quarry.EnderQuarryUpgradeManager; +import com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry.BlockVoidQuarryUpgrade; +import com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry.VoidQuarryUpgradeManager; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; -import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderQuarryConfig; +import com.fouristhenumber.utilitiesinexcess.config.blocks.VoidQuarryConfig; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; import com.fouristhenumber.utilitiesinexcess.utils.Tuple; import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; @@ -67,9 +67,9 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; -public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver, IFluidHandler { +public class TileEntityVoidQuarry extends LoadableTE implements IEnergyReceiver, IFluidHandler { - public static final int BASE_STEPS_PER_TICK = EnderQuarryConfig.enderQuarryBaseSpeed; + public static final int BASE_STEPS_PER_TICK = VoidQuarryConfig.voidQuarryBaseSpeed; public static final int ITEM_BUFFER_CAPACITY = BASE_STEPS_PER_TICK * 5; // Emptied every 4 ticks + some margin for // more than one item per block public static Block REPLACE_BLOCK = Blocks.dirt; @@ -94,26 +94,26 @@ public class TileEntityEnderQuarry extends LoadableTE implements IEnergyReceiver private final ArrayDeque brokenBlocksSlidingWindow = new ArrayDeque<>(); private final HashMap sidedItemAcceptors = new LinkedHashMap<>(); private final HashMap sidedFluidAcceptors = new HashMap<>(); - private final EnderQuarryUpgradeManager upgradeManager = new EnderQuarryUpgradeManager(); + private final VoidQuarryUpgradeManager upgradeManager = new VoidQuarryUpgradeManager(); - protected final EnergyStorage energyStorage = new EnergyStorage(EnderQuarryConfig.enderQuarryEnergyStorage); + protected final EnergyStorage energyStorage = new EnergyStorage(VoidQuarryConfig.voidQuarryEnergyStorage); protected final List fluidStorage = Stream - .generate(() -> new FluidTank(EnderQuarryConfig.enderQuarryFluidTankStorage)) - .limit(EnderQuarryConfig.enderQuarryFluidTankAmount) + .generate(() -> new FluidTank(VoidQuarryConfig.voidQuarryFluidTankStorage)) + .limit(VoidQuarryConfig.voidQuarryFluidTankAmount) .collect(Collectors.toList()); protected final Object2IntMap<@NotNull ItemStack> itemStorage = new Object2IntOpenCustomHashMap<>( ITEM_BUFFER_CAPACITY, UIEUtils.ItemStackHashStrategy.instance); - public TileEntityEnderQuarry() { - REPLACE_BLOCK = EnderQuarryReplaceBlock.valueOf(EnderQuarryConfig.enderQuarryReplaceBlock).block; + public TileEntityVoidQuarry() { + REPLACE_BLOCK = VoidQuarryReplaceBlock.valueOf(VoidQuarryConfig.voidQuarryReplaceBlock).block; resetQuarry(); storedItems = 0; } public String getState() { return switch (state) { - case STOPPED -> "uie.quarry.state.detail.1"; + case STOPPED -> StatCollector.translateToLocal("uie.quarry.state.detail.1"); case STOPPED_WAITING_FOR_FLUID_SPACE -> StatCollector.translateToLocal("uie.quarry.state.detail.2"); case STOPPED_WAITING_FOR_ITEM_SPACE -> StatCollector.translateToLocal("uie.quarry.state.detail.3"); case STOPPED_WAITING_FOR_ENERGY -> StatCollector.translateToLocal("uie.quarry.state.detail.4"); @@ -201,7 +201,7 @@ public int getComparatorOutput() { */ private int findLowerYBound() { for (int i = this.yCoord - 2; i > 1; i--) { - if (worldObj.getTileEntity(xCoord, i, zCoord) instanceof TileEntityEnderMarker) { + if (worldObj.getTileEntity(xCoord, i, zCoord) instanceof TileEntityVoidMarker) { return i + 1; } } @@ -215,18 +215,18 @@ private int findLowerYBound() { */ private int findUpperYBound() { for (int i = this.yCoord + 2; i < 255; i++) { - if (worldObj.getTileEntity(xCoord, i, zCoord) instanceof TileEntityEnderMarker) { + if (worldObj.getTileEntity(xCoord, i, zCoord) instanceof TileEntityVoidMarker) { return i - 1; } } - return Math.min(this.yCoord + EnderQuarryConfig.enderQuarryDefaultTopPadding, 255); + return Math.min(this.yCoord + VoidQuarryConfig.voidQuarryDefaultTopPadding, 255); } public void scanForWorkAreaFromMarkers(@Nullable EntityPlayer player) { boolean foundMarkers = false; for (ForgeDirection dir : DirectionUtil.HORIZONTAL_DIRECTIONS) { TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); - if (te instanceof TileEntityEnderMarker marker) { + if (te instanceof TileEntityVoidMarker marker) { @Nullable List scanReturn = marker.checkForBoundary(dir, player); if (scanReturn != null) { @@ -698,7 +698,7 @@ private boolean stepPos() { private Tuple tryHarvestCurrentBlock() { Block block = worldObj.getBlock(dx, dy, dz); if (block.getMaterial() == Material.air || worldObj.isAirBlock(dx, dy, dz) - || block == (upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.WORLD_HOLE) ? Blocks.air + || block == (upgradeManager.has(VoidQuarryUpgradeManager.VoidQuarryUpgrade.WORLD_HOLE) ? Blocks.air : REPLACE_BLOCK) || block.getBlockHardness(worldObj, dx, dy, dz) < 0 || block.getBlockHardness(worldObj, dx, dy, dz) > 100) { @@ -716,7 +716,7 @@ private boolean tryConsumeEnergy(float hardness, boolean simulate) { // Get base cost multiplier from upgrades, add a multiplier based on hardness (that roughly scales 0 - 10 to 1.0 // - 1.66) double costMultiplier = upgradeManager.totalCostMultiplier + (1.0 + 0.8 * (hardness / (hardness + 2))); - int cost = (int) (EnderQuarryConfig.enderQuarryBaseRFCost * costMultiplier); + int cost = (int) (VoidQuarryConfig.voidQuarryBaseRFCost * costMultiplier); if (energyStorage.extractEnergy(cost, true) >= cost) { if (!simulate) { energyStorage.extractEnergy(cost, false); @@ -735,7 +735,7 @@ private boolean tryConsumeEnergy(float hardness, boolean simulate) { private boolean harvestAndStoreBlock(Block block) { try { int meta = worldObj.getBlockMetadata(dx, dy, dz); - if (upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.PUMP_FLUIDS)) { + if (upgradeManager.has(VoidQuarryUpgradeManager.VoidQuarryUpgrade.PUMP_FLUIDS)) { FluidStack fluid = null; if ((block == Blocks.water || block == Blocks.flowing_water) && meta == 0) { fluid = new FluidStack(FluidRegistry.WATER, 1000); @@ -753,7 +753,7 @@ private boolean harvestAndStoreBlock(Block block) { @Nullable List drops = null; // Try to silk touch if we have the upgrade - if (upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.SILK_TOUCH)) { + if (upgradeManager.has(VoidQuarryUpgradeManager.VoidQuarryUpgrade.SILK_TOUCH)) { if (block.canSilkHarvest(worldObj, fakePlayer, dx, dy, dz, meta)) { Item item = Item.getItemFromBlock(block); if (item != null) { @@ -770,7 +770,7 @@ private boolean harvestAndStoreBlock(Block block) { dy, dz, meta, - (int) upgradeManager.getValue(EnderQuarryUpgradeManager.TieredEnderQuarryUpgrade.FORTUNE, 0)); + (int) upgradeManager.getValue(VoidQuarryUpgradeManager.TieredVoidQuarryUpgrade.FORTUNE, 0)); } // We can accept that the maximum stored amount is sometimes overrun by fortune if (!drops.isEmpty()) { @@ -1002,7 +1002,7 @@ public void updateRedstoneState() { } /** - * Scans all 6 sides for TileEntities that for containers that can accept items or fluids and ender quarry upgrades. + * Scans all 6 sides for TileEntities that for containers that can accept items or fluids and void quarry upgrades. */ public void scanSidesForTEs() { sidedFluidAcceptors.clear(); @@ -1035,12 +1035,12 @@ public void scanSidesForTEs() { (direction.offsetX + this.xCoord) >> 4, (direction.offsetZ + this.zCoord) >> 4); - if (block instanceof BlockEnderQuarryUpgrade) { + if (block instanceof BlockVoidQuarryUpgrade) { int meta = this.worldObj.getBlockMetadata( direction.offsetX + this.xCoord, direction.offsetY + this.yCoord, direction.offsetZ + this.zCoord); - upgradeManager.addUpgrade(EnderQuarryUpgradeManager.EnderQuarryUpgrade.VALUES[meta]); + upgradeManager.addUpgrade(VoidQuarryUpgradeManager.VoidQuarryUpgrade.VALUES[meta]); } if (te instanceof IFluidHandler fluidHandler) { @@ -1071,7 +1071,7 @@ private void removeCurrentBlock() { dx, dy, dz, - upgradeManager.has(EnderQuarryUpgradeManager.EnderQuarryUpgrade.WORLD_HOLE) ? Blocks.air : REPLACE_BLOCK); + upgradeManager.has(VoidQuarryUpgradeManager.VoidQuarryUpgrade.WORLD_HOLE) ? Blocks.air : REPLACE_BLOCK); } /** @@ -1182,7 +1182,7 @@ public void updateEntity() { if (state == QuarryWorkState.RUNNING) { int stepsPerTick = (int) (BASE_STEPS_PER_TICK * (isCreativeBoosted ? 8 : 1) - * upgradeManager.getValue(EnderQuarryUpgradeManager.TieredEnderQuarryUpgrade.SPEED, 1.0)); + * upgradeManager.getValue(VoidQuarryUpgradeManager.TieredVoidQuarryUpgrade.SPEED, 1.0)); while (blocksVisitedThisTick < stepsPerTick && stepPos()) { // TODO: Remove after this has been tested by others if (!isInBounds() || this.chunkX > 1000 || this.chunkZ > 1000) { @@ -1253,7 +1253,7 @@ public void readFromNBT(NBTTagCompound nbt) { lowerYBound = nbt.getInteger("lowerYBound"); upperYBound = nbt.getInteger("upperYBound"); // Fix for cases where upperYBound was not present yet - if (lowerYBound == upperYBound) upperYBound = this.yCoord + EnderQuarryConfig.enderQuarryDefaultTopPadding; + if (lowerYBound == upperYBound) upperYBound = this.yCoord + VoidQuarryConfig.voidQuarryDefaultTopPadding; // Possible next work areas for complex markers NBTTagList possibleNextAreas = nbt.getTagList("nextAreas", Constants.NBT.TAG_COMPOUND); @@ -1536,7 +1536,7 @@ public String toString() { } } - private enum EnderQuarryReplaceBlock { + private enum VoidQuarryReplaceBlock { COBBLE(Blocks.cobblestone), DIRT(Blocks.dirt), @@ -1546,7 +1546,7 @@ private enum EnderQuarryReplaceBlock { public final Block block; - EnderQuarryReplaceBlock(Block block) { + VoidQuarryReplaceBlock(Block block) { this.block = block; } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java index ae10ef42..4402881f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/waila/WailaHandler.java @@ -9,7 +9,7 @@ import net.minecraft.world.World; import com.fouristhenumber.utilitiesinexcess.CommonProxy; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderQuarry; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityVoidQuarry; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; @@ -25,8 +25,8 @@ public class WailaHandler implements IWailaDataProvider { public static void callbackRegister(IWailaRegistrar registrar) { WailaHandler instance = new WailaHandler(); - registrar.registerBodyProvider(instance, TileEntityEnderQuarry.class); - registrar.registerNBTProvider(instance, TileEntityEnderQuarry.class); + registrar.registerBodyProvider(instance, TileEntityVoidQuarry.class); + registrar.registerNBTProvider(instance, TileEntityVoidQuarry.class); } @Override @@ -43,7 +43,7 @@ public List getWailaHead(ItemStack itemStack, List currenttip, I @Override public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (accessor.getTileEntity() instanceof TileEntityEnderQuarry) { + if (accessor.getTileEntity() instanceof TileEntityVoidQuarry) { NBTTagCompound nbt = accessor.getNBTData(); int estimatedSecondsLeft = nbt.getInteger("estSecondsLeft"); if (estimatedSecondsLeft > 0) currenttip.add( @@ -61,7 +61,7 @@ public List getWailaBody(ItemStack itemStack, List currenttip, I (estimatedSecondsLeft % 3600) / 60, (estimatedSecondsLeft % 60))))); - TileEntityEnderQuarry.QuarryWorkState state = TileEntityEnderQuarry.QuarryWorkState.VALUES[nbt + TileEntityVoidQuarry.QuarryWorkState state = TileEntityVoidQuarry.QuarryWorkState.VALUES[nbt .getInteger("state")]; currenttip.add( LangUtil.instance.translate("uie.quarry.waila.state", LangUtil.instance.translate(state.localKey))); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java index 665358e4..b8df1d1f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java @@ -13,7 +13,7 @@ public static void registerConfig() throws ConfigException { ConfigurationManager.registerConfig(CursedEarthConfig.class); ConfigurationManager.registerConfig(EnderLotusConfig.class); ConfigurationManager.registerConfig(GeneratorConfig.class); - ConfigurationManager.registerConfig(EnderQuarryConfig.class); + ConfigurationManager.registerConfig(VoidQuarryConfig.class); } @Config.DefaultBoolean(true) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/VoidQuarryConfig.java similarity index 66% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/VoidQuarryConfig.java index bf847b47..5ea8e4e0 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/EnderQuarryConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/VoidQuarryConfig.java @@ -3,91 +3,91 @@ import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.gtnewhorizon.gtnhlib.config.Config; -@Config(modid = UtilitiesInExcess.MODID, category = "blocks.ender_quarry") -@Config.Comment("Ender Quarry Configuration") -@Config.LangKey("utilitiesinexcess.config.block.ender_quarry") -public class EnderQuarryConfig { +@Config(modid = UtilitiesInExcess.MODID, category = "blocks.void_quarry") +@Config.Comment("Void Quarry Configuration") +@Config.LangKey("utilitiesinexcess.config.block.void_quarry") +public class VoidQuarryConfig { // TODO: Balance everything in here @Config.DefaultBoolean(true) - public static boolean enableEnderQuarry; + public static boolean enableVoidQuarry; @Config.Comment("Default amount of blocks the quarry will mine upwards, added to its own y position.") @Config.DefaultInt(5) - public static int enderQuarryDefaultTopPadding; + public static int voidQuarryDefaultTopPadding; @Config.Comment("Energy (RF) capacity of the machine.") @Config.DefaultInt(10_000_000) - public static int enderQuarryEnergyStorage; + public static int voidQuarryEnergyStorage; @Config.Comment("Amount of fluid tanks, with one for each fluid type.") @Config.DefaultInt(2) - public static int enderQuarryFluidTankAmount; + public static int voidQuarryFluidTankAmount; @Config.Comment("Amount of fluid (in mB) that can be stored per tank.") @Config.DefaultInt(128_000) @Config.RangeInt(min = 16_000, max = 1_024_000) - public static int enderQuarryFluidTankStorage; + public static int voidQuarryFluidTankStorage; @Config.Comment("Base factor of RF that is used per operation. Is influenced by upgrades & block hardness.") @Config.DefaultInt(100) @Config.RangeInt(min = 100, max = 1_024_000) - public static int enderQuarryBaseRFCost; + public static int voidQuarryBaseRFCost; @Config.DefaultStringList({ "COBBLE", "DIRT", "GLASS", "SNOW", "STONE" }) @Config.DefaultString("COBBLE") @Config.Comment("Block type to replace mined blocks with if the world hole upgrade isn't present.") - public static String enderQuarryReplaceBlock; + public static String voidQuarryReplaceBlock; @Config.DefaultInt(400) @Config.Comment("The amount of blocks the quarry tries to mine per tick, without speed upgrades.") - public static int enderQuarryBaseSpeed; + public static int voidQuarryBaseSpeed; @Config.DefaultDouble(2D) @Config.Comment("The multiplier applied to the base speed mine speed.") - public static double enderQuarrySpeed1Multiplier; + public static double voidQuarrySpeed1Multiplier; @Config.DefaultDouble(8D) @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarrySpeed1EnergyMultiplier; + public static double voidQuarrySpeed1EnergyMultiplier; @Config.DefaultDouble(4D) @Config.Comment("The multiplier applied to the base speed mine speed.") - public static double enderQuarrySpeed2Multiplier; + public static double voidQuarrySpeed2Multiplier; @Config.DefaultDouble(16D) @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarrySpeed2EnergyMultiplier; + public static double voidQuarrySpeed2EnergyMultiplier; @Config.DefaultDouble(7D) @Config.Comment("The multiplier applied to the base speed mine speed.") - public static double enderQuarrySpeed3Multiplier; + public static double voidQuarrySpeed3Multiplier; @Config.DefaultDouble(32D) @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarrySpeed3EnergyMultiplier; + public static double voidQuarrySpeed3EnergyMultiplier; @Config.DefaultDouble(12D) @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarryFortune1EnergyMultiplier; + public static double voidQuarryFortune1EnergyMultiplier; @Config.DefaultDouble(40D) @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarryFortune2EnergyMultiplier; + public static double voidQuarryFortune2EnergyMultiplier; @Config.DefaultDouble(100D) @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarryFortune3EnergyMultiplier; + public static double voidQuarryFortune3EnergyMultiplier; @Config.DefaultDouble(1.2D) @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarryWorldHoleEnergyMultiplier; + public static double voidQuarryWorldHoleEnergyMultiplier; @Config.DefaultDouble(8D) @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarrySilkTouchEnergyMultiplier; + public static double voidQuarrySilkTouchEnergyMultiplier; @Config.DefaultDouble(3D) @Config.Comment("The energy multiplier applied when the upgrade is active.") - public static double enderQuarryFluidPumpEnergyMultiplier; + public static double voidQuarryFluidPumpEnergyMultiplier; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java index e82b2ba5..acfeec5c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java @@ -33,7 +33,7 @@ import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGluttonsAxe; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemPrecisionShears; import com.fouristhenumber.utilitiesinexcess.common.renderers.XRayRenderer; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityEnderMarker; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityVoidMarker; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.AntiParticulateShovelConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GluttonsAxeConfig; @@ -160,12 +160,12 @@ public void onWorldUnload(WorldEvent.Unload event) { if (event.world.isRemote) return; // Clear the entire dimension registry - ConcurrentHashMap dimRegistry = TileEntityEnderMarker.registeredMarkers + ConcurrentHashMap dimRegistry = TileEntityVoidMarker.registeredMarkers .get(event.world.provider.dimensionId); if (dimRegistry != null) { dimRegistry.clear(); - TileEntityEnderMarker.registeredMarkers.remove(event.world.provider.dimensionId); + TileEntityVoidMarker.registeredMarkers.remove(event.world.provider.dimensionId); } } } diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/ender_marker.json b/src/main/resources/assets/utilitiesinexcess/blockstates/ender_marker.json deleted file mode 100644 index 9c32b905..00000000 --- a/src/main/resources/assets/utilitiesinexcess/blockstates/ender_marker.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "utilitiesinexcess:blocks/ender_marker" } - } -} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry.json b/src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry.json deleted file mode 100644 index c3920a40..00000000 --- a/src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "utilitiesinexcess:blocks/ender_quarry"} - } -} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/void_marker.json b/src/main/resources/assets/utilitiesinexcess/blockstates/void_marker.json new file mode 100644 index 00000000..eda7a102 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/void_marker.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "utilitiesinexcess:blocks/void_marker" } + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/void_quarry.json b/src/main/resources/assets/utilitiesinexcess/blockstates/void_quarry.json new file mode 100644 index 00000000..d12f551d --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/void_quarry.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "utilitiesinexcess:blocks/void_quarry"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry_upgrade.json b/src/main/resources/assets/utilitiesinexcess/blockstates/void_quarry_upgrade.json similarity index 100% rename from src/main/resources/assets/utilitiesinexcess/blockstates/ender_quarry_upgrade.json rename to src/main/resources/assets/utilitiesinexcess/blockstates/void_quarry_upgrade.json diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index 2a416f24..46250624 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -282,6 +282,18 @@ nei.infopage.uie.temporal_gate.3=Right-click the portal in any other dimension t nei.infopage.uie.temporal_gate.4=You will appear at the most recent portal placed in the End of Time. If it no longer exists, you will appear at the bedrock below where you originally entered. If even that is gone, the platform will reappear, replacing anything in its way. nei.infopage.uie.temporal_gate.5=§4§oWas that red star in the sky always there? +tile.void_quarry.name=Void Quarry +tile.void_marker.name=Void Marker +tile.utilitiesinexcess:void_quarry_upgrade.0.name=Void Quarry World Hole Upgrade +tile.utilitiesinexcess:void_quarry_upgrade.1.name=Void Quarry Silk Touch Upgrade +tile.utilitiesinexcess:void_quarry_upgrade.2.name=Void Quarry Fluid Pump Upgrade +tile.utilitiesinexcess:void_quarry_upgrade.3.name=Void Quarry Speed I Upgrade +tile.utilitiesinexcess:void_quarry_upgrade.4.name=Void Quarry Speed II Upgrade +tile.utilitiesinexcess:void_quarry_upgrade.5.name=Void Quarry Speed III Upgrade +tile.utilitiesinexcess:void_quarry_upgrade.6.name=Void Quarry Fortune I Upgrade +tile.utilitiesinexcess:void_quarry_upgrade.7.name=Void Quarry Fortune II Upgrade +tile.utilitiesinexcess:void_quarry_upgrade.8.name=Void Quarry Fortune III Upgrade + uie.quarry.state.1=Stopped uie.quarry.state.2=Waiting for Fluid Space uie.quarry.state.3=Waiting for Item Space @@ -303,11 +315,10 @@ uie.quarry.waila.timeleft=Est. Time Left: %s uie.quarry.scanmessage.1=Found ender marker fence boundary, setting up work area from (%d %d) to (%d %d). Should require %d steps. uie.quarry.scanmessage.2=Found ender marker fence boundary from %d markers, setting up complex work area. Should require %d steps. uie.quarry.scanmessage.3=Ender marker at (%d %d %d) failed to set up a fence boundary. -uie.quarry.scanmessage.4=Found no ender markers around quarry. +uie.quarry.scanmessage.4=Found no void markers around quarry. uie.quarry.scanmessage.5=Failed to complete marker chain, with last marker at (%d %d %d). -uie.quarry.finished=Your Ender Quarry at (%d %d %d) in DIM %d has finished. +uie.quarry.finished=Your Void Quarry at (%d %d %d) in DIM %d has finished. uie.quarry.marker.mode.1=Marker is set to establish a rectangular fence from the first 3 in chain. uie.quarry.marker.mode.2.1=Marker is set to establish a cuboid of length %d. Sneak + R-Click to adjust size. uie.quarry.marker.mode.2.2=Increased cuboid size to %d. uie.quarry.marker.mode.3=Marker is set to establish a full loop of markers that make up a rectilinear polygon back this marker of arbitrary size and shape. - diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/ender_marker.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/void_marker.json similarity index 98% rename from src/main/resources/assets/utilitiesinexcess/models/blocks/ender_marker.json rename to src/main/resources/assets/utilitiesinexcess/models/blocks/void_marker.json index bb56cc3b..42c2b6fd 100644 --- a/src/main/resources/assets/utilitiesinexcess/models/blocks/ender_marker.json +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/void_marker.json @@ -3,8 +3,8 @@ "credit": "Made with Blockbench", "texture_size": [32, 32], "textures": { - "0": "utilitiesinexcess:ender_marker", - "particle": "utilitiesinexcess:ender_marker" + "0": "utilitiesinexcess:void_marker", + "particle": "utilitiesinexcess:void_marker" }, "elements": [ { diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/ender_quarry.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/void_quarry.json similarity index 99% rename from src/main/resources/assets/utilitiesinexcess/models/blocks/ender_quarry.json rename to src/main/resources/assets/utilitiesinexcess/models/blocks/void_quarry.json index 3dd99364..8e8a8d3c 100644 --- a/src/main/resources/assets/utilitiesinexcess/models/blocks/ender_quarry.json +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/void_quarry.json @@ -3,8 +3,8 @@ "credit": "Made with Blockbench", "texture_size": [64, 64], "textures": { - "0": "utilitiesinexcess:ender_quarry", - "particle": "utilitiesinexcess:ender_quarry" + "0": "utilitiesinexcess:void_quarry", + "particle": "utilitiesinexcess:void_quarry" }, "elements": [ { @@ -905,4 +905,4 @@ "children": [47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ender_marker.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/void_marker.png similarity index 100% rename from src/main/resources/assets/utilitiesinexcess/textures/blocks/ender_marker.png rename to src/main/resources/assets/utilitiesinexcess/textures/blocks/void_marker.png diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ender_quarry.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/void_quarry.png similarity index 100% rename from src/main/resources/assets/utilitiesinexcess/textures/blocks/ender_quarry.png rename to src/main/resources/assets/utilitiesinexcess/textures/blocks/void_quarry.png From 644aa7b4ef560c59eb7db353916806a80efd9919 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Sun, 7 Jun 2026 01:24:41 +0200 Subject: [PATCH 26/28] Post merge adjustments --- dependencies.gradle | 1 + repositories.gradle | 14 +++++++++++++- .../utilitiesinexcess/ClientProxy.java | 4 ++-- .../utilitiesinexcess/CommonProxy.java | 8 +++++++- .../utilitiesinexcess/ModTileEntities.java | 10 ++++++++-- .../utilitiesinexcess/UtilitiesInExcess.java | 11 +++++------ .../utilitiesinexcess/utils/UIEUtils.java | 1 - 7 files changed, 36 insertions(+), 13 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index c68fb29b..b6556ace 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -63,6 +63,7 @@ dependencies { // For debugging chunkloading (/chunkloaders) runtimeOnlyNonPublishable('curse.maven:chicken-chunks-229316:2233250') // Testing performance with void quarry inserts + runtimeOnlyNonPublishable("com.github.GTNewHorizons:EnderCore:0.5.0:dev") { transitive = false } runtimeOnlyNonPublishable('com.github.GTNewHorizons:Avaritiaddons:1.9.3-GTNH:dev') { transitive = true } runtimeOnlyNonPublishable('com.github.GTNewHorizons:Avaritia:1.81-pre:dev') { transitive = false } runtimeOnlyNonPublishable('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-789-GTNH:dev') { transitive = true } diff --git a/repositories.gradle b/repositories.gradle index 7e002f2b..8d75edad 100644 --- a/repositories.gradle +++ b/repositories.gradle @@ -1,5 +1,17 @@ // Add any additional repositories for your dependencies here. repositories { - + ivy { + name = 'spark-github' + url = 'https://github.com/GTNewHorizons/spark/releases/download/' + patternLayout { + artifact '[revision]/spark-forge1710-1.10-SNAPSHOT(-[classifier]).[ext]' + } + content { + includeModule 'com.github.GTNewHorizons', 'spark' + } + metadataSources { + artifact() + } + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java index 34e42ca7..01c096bf 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java @@ -14,8 +14,8 @@ import com.fouristhenumber.utilitiesinexcess.common.renderers.GloveRenderer; import com.fouristhenumber.utilitiesinexcess.common.renderers.InvertedIngotRenderer; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; -import com.fouristhenumber.utilitiesinexcess.compat.findit.FindItHelper; import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.compat.findit.FindItHelper; import com.fouristhenumber.utilitiesinexcess.compat.waila.TTRenderUIETimeLeftBar; import com.fouristhenumber.utilitiesinexcess.render.ISBRHUnderworldPortal; import com.fouristhenumber.utilitiesinexcess.render.TESRUnderworldPortal; @@ -25,10 +25,10 @@ import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; -import cpw.mods.fml.common.event.FMLPostInitializationEvent; @SuppressWarnings("unused") public class ClientProxy extends CommonProxy { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java index 8bd64df7..c1ce9633 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -6,6 +6,8 @@ import com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime.EndOfTimeEvents; import com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld.UnderWorldEvents; import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.compat.tinkers.TinkersCompat; +import com.fouristhenumber.utilitiesinexcess.config.OtherConfig; import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; import com.fouristhenumber.utilitiesinexcess.utils.SoundVolumeChecks; import com.gtnewhorizon.gtnhlib.keybind.SyncedKeybind; @@ -50,7 +52,11 @@ public void init(FMLInitializationEvent event) { } } - public void postInit(FMLPostInitializationEvent event) {} + public void postInit(FMLPostInitializationEvent event) { + if (Mods.Tinkers.isLoaded() && OtherConfig.enableTinkersIntegration) { + TinkersCompat.init(); + } + } public void serverStarting(FMLServerStartingEvent event) {} } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java index 274ff287..e9f2b9b9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java @@ -6,6 +6,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPacifistsBench; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPureLove; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRadicallyReducedChest; @@ -13,6 +14,8 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityRedstoneClock; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySignificantlyShrunkChest; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySoundMuffler; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySpike; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTradingPost; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanEnergy; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanFluid; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTrashCanItem; @@ -37,6 +40,7 @@ public enum ModTileEntities { // spotless:off // make sure to leave a trailing comma + SPIKE(TileEntitySpike.class , "Spike"), REDSTONE_CLOCK(TileEntityRedstoneClock .class , "RedstoneClock"), TRASH_CAN_ITEM(TileEntityTrashCanItem.class , "TrashCanItem"), TRASH_CAN_FLUID(TileEntityTrashCanFluid.class , "TrashCanFluid"), @@ -63,8 +67,10 @@ public enum ModTileEntities { GENERATOR_TNT(TileEntityTNTGenerator.class , "TNTGenerator"), GENERATOR_PINK(TileEntityPinkGenerator.class , "PinkGenerator"), GENERATOR_NETHER_STAR(TileEntityNetherStarGenerator.class , "NetherStarGenerator"), - VOID_QUARRY(TileEntityVoidQuarry.class , "VoidQuarry"), - VOID_MARKER(TileEntityVoidMarker.class , "VoidMarker"), + PACIFISTS_BENCH(TileEntityPacifistsBench.class , "PacifistsBench"), + TRADING_POST(TileEntityTradingPost.class , "TradingPost"), + VOID_QUARRY(TileEntityVoidQuarry.class , "VoidQuarry"), + VOID_MARKER(TileEntityVoidMarker.class , "VoidMarker"), ; // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index 9f51c18b..c4a4a62a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -1,8 +1,9 @@ package com.fouristhenumber.utilitiesinexcess; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPacifistsBench; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityTradingPost; import net.minecraft.client.Minecraft; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.util.WeightedRandomChestContent; import net.minecraftforge.common.ChestGenHooks; import net.minecraftforge.common.ForgeChunkManager; @@ -21,6 +22,7 @@ import com.fouristhenumber.utilitiesinexcess.utils.FMLEventHandler; import com.fouristhenumber.utilitiesinexcess.utils.ForgeEventHandler; import com.fouristhenumber.utilitiesinexcess.utils.PinkFuelHelper; +import com.fouristhenumber.utilitiesinexcess.utils.PumpChunkLoadingCallback; import com.fouristhenumber.utilitiesinexcess.utils.TEChunkLoadingCallback; import cpw.mods.fml.client.registry.RenderingRegistry; @@ -63,7 +65,7 @@ public static void chat(String text) { @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { - GameRegistry.registerTileEntity(TileEntitySpike.class, "utilitiesinexcess:TileEntitySpike"); + proxy.preInit(event); } @@ -78,9 +80,6 @@ public void init(FMLInitializationEvent event) { .bus() .register(new FMLEventHandler()); - GameRegistry.registerTileEntity(TileEntityPacifistsBench.class, "TileEntityPacifistsBenchUIE"); - GameRegistry.registerTileEntity(TileEntityTradingPost.class, "TileEntityTradingPostUIE"); - lapisAetheriusRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new LapisAetheriusRenderer()); blackoutCurtainsRenderID = RenderingRegistry.getNextAvailableRenderId(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java index 8943f78e..f45038be 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java @@ -12,7 +12,6 @@ import baubles.common.container.InventoryBaubles; import baubles.common.lib.PlayerHandler; - import it.unimi.dsi.fastutil.Hash; public class UIEUtils { From 330bbffea149305a7330b556baee1143f5ec7653 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Sun, 7 Jun 2026 01:37:41 +0200 Subject: [PATCH 27/28] Merge branch 'master' into ender-quarry --- .github/workflows/optimize-images.yml | 17 + dependencies.gradle | 21 +- gradle.properties | 2 +- .../utilitiesinexcess/ClientProxy.java | 5 + .../utilitiesinexcess/CommonProxy.java | 18 + .../utilitiesinexcess/ModBlocks.java | 6 + .../utilitiesinexcess/ModItems.java | 13 +- .../utilitiesinexcess/ModTileEntities.java | 6 + .../utilitiesinexcess/UtilitiesInExcess.java | 22 +- .../utilitiesinexcess/client/IMCForNEI.java | 32 +- .../blocks/BlockAdvancedUpdateDetector.java | 83 +++ .../common/blocks/BlockChandelier.java | 118 ++++ .../common/blocks/BlockConveyor.java | 19 +- .../common/blocks/BlockDecorativeGlass.java | 2 +- .../common/blocks/BlockDrum.java | 16 + .../common/blocks/BlockEtherealGlass.java | 27 +- .../common/blocks/BlockGigaTorch.java | 87 +++ .../common/blocks/BlockInverted.java | 15 + .../common/blocks/BlockPortalEndOfTime.java | 30 + .../common/blocks/BlockRedstoneClock.java | 16 + .../common/blocks/BlockSmartPump.java | 26 + .../common/blocks/BlockSpike.java | 13 +- .../common/blocks/BlockUpdateDetector.java | 20 +- .../common/events/MobDenySpawnEvents.java | 51 ++ .../common/events/WateringCanEvent.java | 33 ++ .../common/items/ItemArchitectsWand.java | 139 +++-- .../common/items/ItemGoldenBag.java | 11 - .../common/items/ItemHeavenlyRing.java | 49 +- .../items/ItemInversionSigilActive.java | 165 ++++-- .../common/items/ItemWateringCan.java | 7 + .../tools/ItemAntiParticulateShovel.java | 3 +- .../items/tools/ItemDestructionPickaxe.java | 3 +- .../common/items/tools/ItemEthericSword.java | 3 +- ...GluttonsAxe.java => ItemGourmandsAxe.java} | 33 +- .../items/tools/ItemPrecisionShears.java | 3 +- .../common/items/tools/ItemReversingHoe.java | 3 +- .../common/recipe/RecipeLoader.java | 129 ++++- .../renderers/HeavenlyRingRenderer.java | 32 +- .../common/renderers/SpikeRenderer.java | 111 ---- .../common/renderers/WireframeRenderer.java | 2 +- ...TileEntityAdvancedBlockUpdateDetector.java | 145 +++++ .../TileEntityBlockUpdateDetector.java | 12 + .../tileentities/TileEntityChandelier.java | 29 + .../tileentities/TileEntityGigaTorch.java | 29 + .../tileentities/TileEntityRedstoneClock.java | 53 +- .../tileentities/TileEntityTrashCanFluid.java | 12 +- .../tileentities/TileEntityTrashCanItem.java | 56 +- .../generators/TileEntityBaseGenerator.java | 6 +- .../compat/ForgeMultipart/FMPItems.java | 60 ++ .../ForgeMultipart/FMPRecipeLoader.java | 72 +++ .../multipart/ConnectablePart.java | 242 ++++++++ .../ForgeMultipart/multipart/Content.java | 65 +++ .../ForgeMultipart/multipart/FencePart.java | 107 ++++ .../multipart/MaterialBasedPart.java | 64 +++ .../multipart/PipeCoverPart.java | 27 + .../ForgeMultipart/multipart/SpherePart.java | 50 ++ .../ForgeMultipart/multipart/UEMultipart.java | 39 ++ .../multipart/UEMultipartItem.java | 135 +++++ .../ForgeMultipart/multipart/WallPart.java | 127 +++++ .../block/MultipartFenceRenderingHelper.java | 153 +++++ .../block/MultipartWallRenderingHelper.java | 159 ++++++ .../render/block/SphereRenderingHelper.java | 525 ++++++++++++++++++ .../render/item/ItemUEMultiPartRenderer.java | 61 ++ .../ForgeMultipart/util/CuboidUtils.java | 205 +++++++ .../utilitiesinexcess/compat/Mods.java | 7 +- .../compat/exu/ExuCompat.java | 33 ++ .../compat/exu/Remappings.java | 183 ++++++ .../compat/exu/postea/DummyBlock.java | 11 + .../exu/postea/IPosteaTransformation.java | 57 ++ .../blocks/AbstractBlockTransformation.java | 84 +++ .../CompressedBlocksTransformation.java | 56 ++ .../postea/blocks/ConveyorTransformation.java | 34 ++ .../blocks/DarkPortalTransformation.java | 43 ++ .../blocks/DecoBlock1Transformation.java | 49 ++ .../blocks/EnderLilyTransformation.java | 38 ++ .../blocks/SoundMufflerTransformation.java | 46 ++ .../postea/blocks/TrashCanTransformation.java | 55 ++ .../items/AbstractItemTransformation.java | 68 +++ .../items/DivisionSigilTransformation.java | 37 ++ .../postea/items/GoldenBagTransformation.java | 46 ++ .../items/GoldenLassoTransformation.java | 30 + .../items/UnstableIngotTransformation.java | 29 + .../items/WateringCanTransformation.java | 32 ++ .../AbstractTileEntityTransformation.java | 82 +++ .../tileentities/FullChestTransformation.java | 37 ++ .../tileentities/GeneratorTransformation.java | 278 ++++++++++ .../tileentities/MiniChestTransformation.java | 37 ++ .../tileentities/SpikeTransformation.java | 51 ++ .../compat/nei/NEIConfig.java | 4 +- .../compat/nei/QEDRecipeHandler.java | 3 +- .../utilitiesinexcess/config/OtherConfig.java | 5 + .../config/blocks/BlockConfig.java | 34 ++ .../config/items/InversionConfig.java | 46 +- .../config/items/ItemConfig.java | 4 + ...AxeConfig.java => GourmandsAxeConfig.java} | 4 +- .../items/unstabletools/UnstableTools.java | 2 +- .../utilitiesinexcess/mixins/Mixins.java | 12 +- .../MixinBlockEnchantmentTable_MagicWood.java | 27 - .../minecraft/MixinModelBiped_Baubles.java | 14 +- .../render/TESRUnderworldPortal.java | 13 +- .../utils/ArchitectsSelection.java | 136 +++++ .../utils/ArchitectsWandUtils.java | 141 +++-- .../utils/ForgeEventHandler.java | 6 +- .../utils/ItemStackBaseCompare.java | 36 ++ .../utils/MovingObjectPositionUtil.java | 23 + .../utilitiesinexcess/utils/UIEUtils.java | 13 + .../utils/VoidingInventory.java | 75 --- .../mcpatcher/ctm/decorative_1/0.png | Bin 0 -> 388 bytes .../mcpatcher/ctm/decorative_1/1.png | Bin 0 -> 318 bytes .../mcpatcher/ctm/decorative_1/2.png | Bin 0 -> 443 bytes .../mcpatcher/ctm/decorative_1/3.png | Bin 0 -> 404 bytes .../mcpatcher/ctm/decorative_1/4.png | Bin 0 -> 389 bytes .../ctm/decorative_1/decorative_1.properties | 6 + .../mcpatcher/ctm/decorative_10/0.png | Bin 0 -> 526 bytes .../mcpatcher/ctm/decorative_10/1.png | Bin 0 -> 403 bytes .../mcpatcher/ctm/decorative_10/2.png | Bin 0 -> 486 bytes .../mcpatcher/ctm/decorative_10/3.png | Bin 0 -> 458 bytes .../mcpatcher/ctm/decorative_10/4.png | Bin 0 -> 512 bytes .../decorative_10/decorative_10.properties | 6 + .../mcpatcher/ctm/decorative_11/0.png | Bin 0 -> 571 bytes .../mcpatcher/ctm/decorative_11/1.png | Bin 0 -> 489 bytes .../mcpatcher/ctm/decorative_11/2.png | Bin 0 -> 593 bytes .../mcpatcher/ctm/decorative_11/3.png | Bin 0 -> 568 bytes .../mcpatcher/ctm/decorative_11/4.png | Bin 0 -> 645 bytes .../decorative_11/decorative_11.properties | 6 + .../mcpatcher/ctm/decorative_2/0.png | Bin 0 -> 328 bytes .../mcpatcher/ctm/decorative_2/1.png | Bin 0 -> 229 bytes .../mcpatcher/ctm/decorative_2/2.png | Bin 0 -> 285 bytes .../mcpatcher/ctm/decorative_2/3.png | Bin 0 -> 275 bytes .../mcpatcher/ctm/decorative_2/4.png | Bin 0 -> 254 bytes .../ctm/decorative_2/decorative_2.properties | 6 + .../mcpatcher/ctm/decorative_4/0.png | Bin 0 -> 795 bytes .../mcpatcher/ctm/decorative_4/1.png | Bin 0 -> 752 bytes .../mcpatcher/ctm/decorative_4/2.png | Bin 0 -> 809 bytes .../mcpatcher/ctm/decorative_4/3.png | Bin 0 -> 793 bytes .../mcpatcher/ctm/decorative_4/4.png | Bin 0 -> 809 bytes .../ctm/decorative_4/decorative_4.properties | 6 + .../mcpatcher/ctm/decorative_5/0.png | Bin 0 -> 314 bytes .../mcpatcher/ctm/decorative_5/1.png | Bin 0 -> 224 bytes .../mcpatcher/ctm/decorative_5/2.png | Bin 0 -> 293 bytes .../mcpatcher/ctm/decorative_5/3.png | Bin 0 -> 256 bytes .../mcpatcher/ctm/decorative_5/4.png | Bin 0 -> 279 bytes .../ctm/decorative_5/decorative_5.properties | 6 + .../mcpatcher/ctm/decorative_6/0.png | Bin 0 -> 509 bytes .../mcpatcher/ctm/decorative_6/1.png | Bin 0 -> 486 bytes .../mcpatcher/ctm/decorative_6/2.png | Bin 0 -> 507 bytes .../mcpatcher/ctm/decorative_6/3.png | Bin 0 -> 508 bytes .../mcpatcher/ctm/decorative_6/4.png | Bin 0 -> 514 bytes .../ctm/decorative_6/decorative_6.properties | 6 + .../mcpatcher/ctm/decorative_7/0.png | Bin 0 -> 489 bytes .../mcpatcher/ctm/decorative_7/1.png | Bin 0 -> 490 bytes .../mcpatcher/ctm/decorative_7/2.png | Bin 0 -> 488 bytes .../mcpatcher/ctm/decorative_7/3.png | Bin 0 -> 487 bytes .../mcpatcher/ctm/decorative_7/4.png | Bin 0 -> 498 bytes .../ctm/decorative_7/decorative_7.properties | 6 + .../mcpatcher/ctm/decorative_8/0.png | Bin 0 -> 440 bytes .../mcpatcher/ctm/decorative_8/1.png | Bin 0 -> 460 bytes .../mcpatcher/ctm/decorative_8/2.png | Bin 0 -> 464 bytes .../mcpatcher/ctm/decorative_8/3.png | Bin 0 -> 441 bytes .../mcpatcher/ctm/decorative_8/4.png | Bin 0 -> 466 bytes .../ctm/decorative_8/decorative_8.properties | 6 + .../mcpatcher/ctm/decorative_9/0.png | Bin 0 -> 522 bytes .../mcpatcher/ctm/decorative_9/1.png | Bin 0 -> 438 bytes .../mcpatcher/ctm/decorative_9/2.png | Bin 0 -> 480 bytes .../mcpatcher/ctm/decorative_9/3.png | Bin 0 -> 480 bytes .../mcpatcher/ctm/decorative_9/4.png | Bin 0 -> 496 bytes .../ctm/decorative_9/decorative_9.properties | 6 + .../mcpatcher/ctm/ethereal_glass_dark/0.png | Bin 0 -> 241 bytes .../mcpatcher/ctm/ethereal_glass_dark/1.png | Bin 0 -> 211 bytes .../mcpatcher/ctm/ethereal_glass_dark/10.png | Bin 0 -> 160 bytes .../mcpatcher/ctm/ethereal_glass_dark/11.png | Bin 0 -> 163 bytes .../mcpatcher/ctm/ethereal_glass_dark/12.png | Bin 0 -> 242 bytes .../mcpatcher/ctm/ethereal_glass_dark/13.png | Bin 0 -> 220 bytes .../mcpatcher/ctm/ethereal_glass_dark/14.png | Bin 0 -> 167 bytes .../mcpatcher/ctm/ethereal_glass_dark/15.png | Bin 0 -> 215 bytes .../mcpatcher/ctm/ethereal_glass_dark/16.png | Bin 0 -> 244 bytes .../mcpatcher/ctm/ethereal_glass_dark/17.png | Bin 0 -> 238 bytes .../mcpatcher/ctm/ethereal_glass_dark/18.png | Bin 0 -> 225 bytes .../mcpatcher/ctm/ethereal_glass_dark/19.png | Bin 0 -> 203 bytes .../mcpatcher/ctm/ethereal_glass_dark/2.png | Bin 0 -> 177 bytes .../mcpatcher/ctm/ethereal_glass_dark/20.png | Bin 0 -> 185 bytes .../mcpatcher/ctm/ethereal_glass_dark/21.png | Bin 0 -> 188 bytes .../mcpatcher/ctm/ethereal_glass_dark/22.png | Bin 0 -> 167 bytes .../mcpatcher/ctm/ethereal_glass_dark/23.png | Bin 0 -> 155 bytes .../mcpatcher/ctm/ethereal_glass_dark/24.png | Bin 0 -> 190 bytes .../mcpatcher/ctm/ethereal_glass_dark/25.png | Bin 0 -> 160 bytes .../mcpatcher/ctm/ethereal_glass_dark/26.png | Bin 0 -> 100 bytes .../mcpatcher/ctm/ethereal_glass_dark/27.png | Bin 0 -> 164 bytes .../mcpatcher/ctm/ethereal_glass_dark/28.png | Bin 0 -> 204 bytes .../mcpatcher/ctm/ethereal_glass_dark/29.png | Bin 0 -> 198 bytes .../mcpatcher/ctm/ethereal_glass_dark/3.png | Bin 0 -> 214 bytes .../mcpatcher/ctm/ethereal_glass_dark/30.png | Bin 0 -> 193 bytes .../mcpatcher/ctm/ethereal_glass_dark/31.png | Bin 0 -> 201 bytes .../mcpatcher/ctm/ethereal_glass_dark/32.png | Bin 0 -> 138 bytes .../mcpatcher/ctm/ethereal_glass_dark/33.png | Bin 0 -> 141 bytes .../mcpatcher/ctm/ethereal_glass_dark/34.png | Bin 0 -> 171 bytes .../mcpatcher/ctm/ethereal_glass_dark/35.png | Bin 0 -> 174 bytes .../mcpatcher/ctm/ethereal_glass_dark/36.png | Bin 0 -> 227 bytes .../mcpatcher/ctm/ethereal_glass_dark/37.png | Bin 0 -> 204 bytes .../mcpatcher/ctm/ethereal_glass_dark/38.png | Bin 0 -> 165 bytes .../mcpatcher/ctm/ethereal_glass_dark/39.png | Bin 0 -> 211 bytes .../mcpatcher/ctm/ethereal_glass_dark/4.png | Bin 0 -> 240 bytes .../mcpatcher/ctm/ethereal_glass_dark/40.png | Bin 0 -> 200 bytes .../mcpatcher/ctm/ethereal_glass_dark/41.png | Bin 0 -> 196 bytes .../mcpatcher/ctm/ethereal_glass_dark/42.png | Bin 0 -> 205 bytes .../mcpatcher/ctm/ethereal_glass_dark/43.png | Bin 0 -> 202 bytes .../mcpatcher/ctm/ethereal_glass_dark/44.png | Bin 0 -> 143 bytes .../mcpatcher/ctm/ethereal_glass_dark/45.png | Bin 0 -> 140 bytes .../mcpatcher/ctm/ethereal_glass_dark/46.png | Bin 0 -> 188 bytes .../mcpatcher/ctm/ethereal_glass_dark/5.png | Bin 0 -> 242 bytes .../mcpatcher/ctm/ethereal_glass_dark/6.png | Bin 0 -> 207 bytes .../mcpatcher/ctm/ethereal_glass_dark/7.png | Bin 0 -> 220 bytes .../mcpatcher/ctm/ethereal_glass_dark/8.png | Bin 0 -> 179 bytes .../mcpatcher/ctm/ethereal_glass_dark/9.png | Bin 0 -> 190 bytes .../ethereal_glass_dark.properties | 6 + .../minecraft/mcpatcher/ctm/glass_0/0.png | Bin 110 -> 154 bytes .../minecraft/mcpatcher/ctm/glass_0/1.png | Bin 108 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_0/10.png | Bin 87 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_0/11.png | Bin 85 -> 109 bytes .../minecraft/mcpatcher/ctm/glass_0/12.png | Bin 104 -> 156 bytes .../minecraft/mcpatcher/ctm/glass_0/13.png | Bin 102 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_0/14.png | Bin 85 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_0/15.png | Bin 98 -> 143 bytes .../minecraft/mcpatcher/ctm/glass_0/16.png | Bin 108 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_0/17.png | Bin 114 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_0/18.png | Bin 96 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_0/19.png | Bin 112 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_0/2.png | Bin 96 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_0/20.png | Bin 90 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_0/21.png | Bin 89 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_0/22.png | Bin 85 -> 111 bytes .../minecraft/mcpatcher/ctm/glass_0/23.png | Bin 83 -> 109 bytes .../minecraft/mcpatcher/ctm/glass_0/24.png | Bin 108 -> 153 bytes .../minecraft/mcpatcher/ctm/glass_0/25.png | Bin 91 -> 128 bytes .../minecraft/mcpatcher/ctm/glass_0/26.png | Bin 75 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_0/27.png | Bin 96 -> 128 bytes .../minecraft/mcpatcher/ctm/glass_0/28.png | Bin 102 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_0/29.png | Bin 89 -> 118 bytes .../minecraft/mcpatcher/ctm/glass_0/3.png | Bin 108 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_0/30.png | Bin 95 -> 130 bytes .../minecraft/mcpatcher/ctm/glass_0/31.png | Bin 94 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_0/32.png | Bin 80 -> 106 bytes .../minecraft/mcpatcher/ctm/glass_0/33.png | Bin 81 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_0/34.png | Bin 83 -> 109 bytes .../minecraft/mcpatcher/ctm/glass_0/35.png | Bin 85 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_0/36.png | Bin 112 -> 166 bytes .../minecraft/mcpatcher/ctm/glass_0/37.png | Bin 97 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_0/38.png | Bin 85 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_0/39.png | Bin 106 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_0/4.png | Bin 106 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_0/40.png | Bin 90 -> 125 bytes .../minecraft/mcpatcher/ctm/glass_0/41.png | Bin 102 -> 133 bytes .../minecraft/mcpatcher/ctm/glass_0/42.png | Bin 94 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_0/43.png | Bin 104 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_0/44.png | Bin 83 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_0/45.png | Bin 80 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_0/46.png | Bin 92 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_0/5.png | Bin 106 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_0/6.png | Bin 107 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_0/7.png | Bin 94 -> 121 bytes .../minecraft/mcpatcher/ctm/glass_0/8.png | Bin 88 -> 111 bytes .../minecraft/mcpatcher/ctm/glass_0/9.png | Bin 87 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_1/0.png | Bin 162 -> 222 bytes .../minecraft/mcpatcher/ctm/glass_1/1.png | Bin 155 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_1/10.png | Bin 137 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_1/11.png | Bin 132 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_1/12.png | Bin 157 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_1/13.png | Bin 148 -> 125 bytes .../minecraft/mcpatcher/ctm/glass_1/14.png | Bin 117 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_1/15.png | Bin 142 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_1/16.png | Bin 155 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_1/17.png | Bin 169 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_1/18.png | Bin 146 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_1/19.png | Bin 170 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_1/2.png | Bin 144 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_1/20.png | Bin 157 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_1/21.png | Bin 142 -> 165 bytes .../minecraft/mcpatcher/ctm/glass_1/22.png | Bin 120 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_1/23.png | Bin 127 -> 146 bytes .../minecraft/mcpatcher/ctm/glass_1/24.png | Bin 161 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_1/25.png | Bin 129 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_1/26.png | Bin 75 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_1/27.png | Bin 145 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_1/28.png | Bin 152 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_1/29.png | Bin 137 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_1/3.png | Bin 152 -> 190 bytes .../minecraft/mcpatcher/ctm/glass_1/30.png | Bin 143 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_1/31.png | Bin 144 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_1/32.png | Bin 95 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_1/33.png | Bin 120 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_1/34.png | Bin 113 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_1/35.png | Bin 143 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_1/36.png | Bin 164 -> 174 bytes .../minecraft/mcpatcher/ctm/glass_1/37.png | Bin 139 -> 153 bytes .../minecraft/mcpatcher/ctm/glass_1/38.png | Bin 118 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_1/39.png | Bin 157 -> 142 bytes .../minecraft/mcpatcher/ctm/glass_1/4.png | Bin 159 -> 154 bytes .../minecraft/mcpatcher/ctm/glass_1/40.png | Bin 131 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_1/41.png | Bin 161 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_1/42.png | Bin 142 -> 153 bytes .../minecraft/mcpatcher/ctm/glass_1/43.png | Bin 152 -> 130 bytes .../minecraft/mcpatcher/ctm/glass_1/44.png | Bin 115 -> 135 bytes .../minecraft/mcpatcher/ctm/glass_1/45.png | Bin 95 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_1/46.png | Bin 157 -> 175 bytes .../minecraft/mcpatcher/ctm/glass_1/5.png | Bin 162 -> 186 bytes .../minecraft/mcpatcher/ctm/glass_1/6.png | Bin 163 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_1/7.png | Bin 153 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_1/8.png | Bin 139 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_1/9.png | Bin 148 -> 160 bytes .../minecraft/mcpatcher/ctm/glass_10/0.png | Bin 155 -> 202 bytes .../minecraft/mcpatcher/ctm/glass_10/1.png | Bin 151 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_10/10.png | Bin 130 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_10/11.png | Bin 122 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_10/12.png | Bin 146 -> 206 bytes .../minecraft/mcpatcher/ctm/glass_10/13.png | Bin 140 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_10/14.png | Bin 123 -> 126 bytes .../minecraft/mcpatcher/ctm/glass_10/15.png | Bin 134 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_10/16.png | Bin 149 -> 195 bytes .../minecraft/mcpatcher/ctm/glass_10/17.png | Bin 158 -> 195 bytes .../minecraft/mcpatcher/ctm/glass_10/18.png | Bin 142 -> 169 bytes .../minecraft/mcpatcher/ctm/glass_10/19.png | Bin 150 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_10/2.png | Bin 141 -> 133 bytes .../minecraft/mcpatcher/ctm/glass_10/20.png | Bin 136 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_10/21.png | Bin 129 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_10/22.png | Bin 124 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_10/23.png | Bin 129 -> 147 bytes .../minecraft/mcpatcher/ctm/glass_10/24.png | Bin 146 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_10/25.png | Bin 129 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_10/26.png | Bin 111 -> 110 bytes .../minecraft/mcpatcher/ctm/glass_10/27.png | Bin 136 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_10/28.png | Bin 138 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_10/29.png | Bin 127 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_10/3.png | Bin 150 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_10/30.png | Bin 131 -> 163 bytes .../minecraft/mcpatcher/ctm/glass_10/31.png | Bin 129 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_10/32.png | Bin 116 -> 135 bytes .../minecraft/mcpatcher/ctm/glass_10/33.png | Bin 118 -> 135 bytes .../minecraft/mcpatcher/ctm/glass_10/34.png | Bin 127 -> 158 bytes .../minecraft/mcpatcher/ctm/glass_10/35.png | Bin 132 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_10/36.png | Bin 155 -> 205 bytes .../minecraft/mcpatcher/ctm/glass_10/37.png | Bin 140 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_10/38.png | Bin 129 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_10/39.png | Bin 152 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_10/4.png | Bin 142 -> 189 bytes .../minecraft/mcpatcher/ctm/glass_10/40.png | Bin 141 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_10/41.png | Bin 144 -> 161 bytes .../minecraft/mcpatcher/ctm/glass_10/42.png | Bin 144 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_10/43.png | Bin 141 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_10/44.png | Bin 125 -> 137 bytes .../minecraft/mcpatcher/ctm/glass_10/45.png | Bin 123 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_10/46.png | Bin 135 -> 161 bytes .../minecraft/mcpatcher/ctm/glass_10/5.png | Bin 142 -> 193 bytes .../minecraft/mcpatcher/ctm/glass_10/6.png | Bin 140 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_10/7.png | Bin 134 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_10/8.png | Bin 134 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_10/9.png | Bin 131 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_11/0.png | Bin 119 -> 220 bytes .../minecraft/mcpatcher/ctm/glass_11/1.png | Bin 117 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_11/10.png | Bin 114 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_11/11.png | Bin 107 -> 152 bytes .../minecraft/mcpatcher/ctm/glass_11/12.png | Bin 117 -> 256 bytes .../minecraft/mcpatcher/ctm/glass_11/13.png | Bin 112 -> 217 bytes .../minecraft/mcpatcher/ctm/glass_11/14.png | Bin 105 -> 142 bytes .../minecraft/mcpatcher/ctm/glass_11/15.png | Bin 109 -> 202 bytes .../minecraft/mcpatcher/ctm/glass_11/16.png | Bin 129 -> 223 bytes .../minecraft/mcpatcher/ctm/glass_11/17.png | Bin 123 -> 230 bytes .../minecraft/mcpatcher/ctm/glass_11/18.png | Bin 123 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_11/19.png | Bin 123 -> 227 bytes .../minecraft/mcpatcher/ctm/glass_11/2.png | Bin 120 -> 163 bytes .../minecraft/mcpatcher/ctm/glass_11/20.png | Bin 119 -> 166 bytes .../minecraft/mcpatcher/ctm/glass_11/21.png | Bin 122 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_11/22.png | Bin 113 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_11/23.png | Bin 111 -> 154 bytes .../minecraft/mcpatcher/ctm/glass_11/24.png | Bin 119 -> 234 bytes .../minecraft/mcpatcher/ctm/glass_11/25.png | Bin 100 -> 187 bytes .../minecraft/mcpatcher/ctm/glass_11/26.png | Bin 86 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_11/27.png | Bin 104 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_11/28.png | Bin 120 -> 215 bytes .../minecraft/mcpatcher/ctm/glass_11/29.png | Bin 115 -> 166 bytes .../minecraft/mcpatcher/ctm/glass_11/3.png | Bin 125 -> 204 bytes .../minecraft/mcpatcher/ctm/glass_11/30.png | Bin 107 -> 215 bytes .../minecraft/mcpatcher/ctm/glass_11/31.png | Bin 115 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_11/32.png | Bin 95 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_11/33.png | Bin 96 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_11/34.png | Bin 110 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_11/35.png | Bin 113 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_11/36.png | Bin 129 -> 244 bytes .../minecraft/mcpatcher/ctm/glass_11/37.png | Bin 110 -> 203 bytes .../minecraft/mcpatcher/ctm/glass_11/38.png | Bin 101 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_11/39.png | Bin 112 -> 200 bytes .../minecraft/mcpatcher/ctm/glass_11/4.png | Bin 118 -> 241 bytes .../minecraft/mcpatcher/ctm/glass_11/40.png | Bin 116 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_11/41.png | Bin 113 -> 198 bytes .../minecraft/mcpatcher/ctm/glass_11/42.png | Bin 114 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_11/43.png | Bin 115 -> 208 bytes .../minecraft/mcpatcher/ctm/glass_11/44.png | Bin 105 -> 137 bytes .../minecraft/mcpatcher/ctm/glass_11/45.png | Bin 101 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_11/46.png | Bin 129 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_11/5.png | Bin 119 -> 222 bytes .../minecraft/mcpatcher/ctm/glass_11/6.png | Bin 126 -> 236 bytes .../minecraft/mcpatcher/ctm/glass_11/7.png | Bin 126 -> 185 bytes .../minecraft/mcpatcher/ctm/glass_11/8.png | Bin 122 -> 166 bytes .../minecraft/mcpatcher/ctm/glass_11/9.png | Bin 121 -> 168 bytes .../minecraft/mcpatcher/ctm/glass_3/0.png | Bin 220 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_3/1.png | Bin 202 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_3/10.png | Bin 188 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_3/11.png | Bin 188 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_3/12.png | Bin 216 -> 225 bytes .../minecraft/mcpatcher/ctm/glass_3/13.png | Bin 198 -> 214 bytes .../minecraft/mcpatcher/ctm/glass_3/14.png | Bin 186 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_3/15.png | Bin 214 -> 203 bytes .../minecraft/mcpatcher/ctm/glass_3/16.png | Bin 202 -> 209 bytes .../minecraft/mcpatcher/ctm/glass_3/17.png | Bin 225 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_3/18.png | Bin 194 -> 192 bytes .../minecraft/mcpatcher/ctm/glass_3/19.png | Bin 223 -> 208 bytes .../minecraft/mcpatcher/ctm/glass_3/2.png | Bin 196 -> 194 bytes .../minecraft/mcpatcher/ctm/glass_3/20.png | Bin 191 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_3/21.png | Bin 188 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_3/22.png | Bin 184 -> 177 bytes .../minecraft/mcpatcher/ctm/glass_3/23.png | Bin 184 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_3/24.png | Bin 226 -> 223 bytes .../minecraft/mcpatcher/ctm/glass_3/25.png | Bin 188 -> 197 bytes .../minecraft/mcpatcher/ctm/glass_3/26.png | Bin 179 -> 171 bytes .../minecraft/mcpatcher/ctm/glass_3/27.png | Bin 223 -> 204 bytes .../minecraft/mcpatcher/ctm/glass_3/28.png | Bin 198 -> 205 bytes .../minecraft/mcpatcher/ctm/glass_3/29.png | Bin 190 -> 182 bytes .../minecraft/mcpatcher/ctm/glass_3/3.png | Bin 219 -> 209 bytes .../minecraft/mcpatcher/ctm/glass_3/30.png | Bin 193 -> 199 bytes .../minecraft/mcpatcher/ctm/glass_3/31.png | Bin 190 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_3/32.png | Bin 184 -> 173 bytes .../minecraft/mcpatcher/ctm/glass_3/33.png | Bin 183 -> 175 bytes .../minecraft/mcpatcher/ctm/glass_3/34.png | Bin 184 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_3/35.png | Bin 186 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_3/36.png | Bin 229 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_3/37.png | Bin 194 -> 203 bytes .../minecraft/mcpatcher/ctm/glass_3/38.png | Bin 189 -> 185 bytes .../minecraft/mcpatcher/ctm/glass_3/39.png | Bin 228 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_3/4.png | Bin 201 -> 215 bytes .../minecraft/mcpatcher/ctm/glass_3/40.png | Bin 190 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_3/41.png | Bin 225 -> 207 bytes .../minecraft/mcpatcher/ctm/glass_3/42.png | Bin 194 -> 191 bytes .../minecraft/mcpatcher/ctm/glass_3/43.png | Bin 221 -> 206 bytes .../minecraft/mcpatcher/ctm/glass_3/44.png | Bin 184 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_3/45.png | Bin 180 -> 173 bytes .../minecraft/mcpatcher/ctm/glass_3/46.png | Bin 191 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_3/5.png | Bin 216 -> 206 bytes .../minecraft/mcpatcher/ctm/glass_3/6.png | Bin 201 -> 203 bytes .../minecraft/mcpatcher/ctm/glass_3/7.png | Bin 195 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_3/8.png | Bin 189 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_3/9.png | Bin 186 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_4/0.png | Bin 109 -> 210 bytes .../minecraft/mcpatcher/ctm/glass_4/1.png | Bin 106 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_4/10.png | Bin 87 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_4/11.png | Bin 85 -> 130 bytes .../minecraft/mcpatcher/ctm/glass_4/12.png | Bin 103 -> 206 bytes .../minecraft/mcpatcher/ctm/glass_4/13.png | Bin 101 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_4/14.png | Bin 85 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_4/15.png | Bin 102 -> 174 bytes .../minecraft/mcpatcher/ctm/glass_4/16.png | Bin 115 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_4/17.png | Bin 114 -> 195 bytes .../minecraft/mcpatcher/ctm/glass_4/18.png | Bin 97 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_4/19.png | Bin 106 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_4/2.png | Bin 96 -> 170 bytes .../minecraft/mcpatcher/ctm/glass_4/20.png | Bin 89 -> 143 bytes .../minecraft/mcpatcher/ctm/glass_4/21.png | Bin 90 -> 137 bytes .../minecraft/mcpatcher/ctm/glass_4/22.png | Bin 86 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_4/23.png | Bin 84 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_4/24.png | Bin 108 -> 188 bytes .../minecraft/mcpatcher/ctm/glass_4/25.png | Bin 93 -> 147 bytes .../minecraft/mcpatcher/ctm/glass_4/26.png | Bin 75 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_4/27.png | Bin 97 -> 149 bytes .../minecraft/mcpatcher/ctm/glass_4/28.png | Bin 113 -> 162 bytes .../minecraft/mcpatcher/ctm/glass_4/29.png | Bin 89 -> 158 bytes .../minecraft/mcpatcher/ctm/glass_4/3.png | Bin 112 -> 201 bytes .../minecraft/mcpatcher/ctm/glass_4/30.png | Bin 97 -> 156 bytes .../minecraft/mcpatcher/ctm/glass_4/31.png | Bin 94 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_4/32.png | Bin 80 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_4/33.png | Bin 81 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_4/34.png | Bin 83 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_4/35.png | Bin 85 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_4/36.png | Bin 114 -> 202 bytes .../minecraft/mcpatcher/ctm/glass_4/37.png | Bin 97 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_4/38.png | Bin 85 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_4/39.png | Bin 107 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_4/4.png | Bin 105 -> 186 bytes .../minecraft/mcpatcher/ctm/glass_4/40.png | Bin 89 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_4/41.png | Bin 99 -> 157 bytes .../minecraft/mcpatcher/ctm/glass_4/42.png | Bin 93 -> 163 bytes .../minecraft/mcpatcher/ctm/glass_4/43.png | Bin 104 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_4/44.png | Bin 82 -> 122 bytes .../minecraft/mcpatcher/ctm/glass_4/45.png | Bin 80 -> 117 bytes .../minecraft/mcpatcher/ctm/glass_4/46.png | Bin 93 -> 146 bytes .../minecraft/mcpatcher/ctm/glass_4/5.png | Bin 110 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_4/6.png | Bin 114 -> 169 bytes .../minecraft/mcpatcher/ctm/glass_4/7.png | Bin 95 -> 167 bytes .../minecraft/mcpatcher/ctm/glass_4/8.png | Bin 89 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_4/9.png | Bin 88 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_5/0.png | Bin 218 -> 233 bytes .../minecraft/mcpatcher/ctm/glass_5/1.png | Bin 216 -> 197 bytes .../minecraft/mcpatcher/ctm/glass_5/10.png | Bin 155 -> 128 bytes .../minecraft/mcpatcher/ctm/glass_5/11.png | Bin 152 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_5/12.png | Bin 221 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_5/13.png | Bin 188 -> 177 bytes .../minecraft/mcpatcher/ctm/glass_5/14.png | Bin 129 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_5/15.png | Bin 178 -> 171 bytes .../minecraft/mcpatcher/ctm/glass_5/16.png | Bin 226 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_5/17.png | Bin 211 -> 183 bytes .../minecraft/mcpatcher/ctm/glass_5/18.png | Bin 199 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_5/19.png | Bin 202 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_5/2.png | Bin 197 -> 140 bytes .../minecraft/mcpatcher/ctm/glass_5/20.png | Bin 178 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_5/21.png | Bin 181 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_5/22.png | Bin 141 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_5/23.png | Bin 158 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_5/24.png | Bin 220 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_5/25.png | Bin 164 -> 128 bytes .../minecraft/mcpatcher/ctm/glass_5/26.png | Bin 75 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_5/27.png | Bin 167 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_5/28.png | Bin 186 -> 148 bytes .../minecraft/mcpatcher/ctm/glass_5/29.png | Bin 168 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_5/3.png | Bin 210 -> 195 bytes .../minecraft/mcpatcher/ctm/glass_5/30.png | Bin 199 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_5/31.png | Bin 168 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_5/32.png | Bin 113 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_5/33.png | Bin 124 -> 121 bytes .../minecraft/mcpatcher/ctm/glass_5/34.png | Bin 154 -> 127 bytes .../minecraft/mcpatcher/ctm/glass_5/35.png | Bin 148 -> 133 bytes .../minecraft/mcpatcher/ctm/glass_5/36.png | Bin 226 -> 206 bytes .../minecraft/mcpatcher/ctm/glass_5/37.png | Bin 205 -> 164 bytes .../minecraft/mcpatcher/ctm/glass_5/38.png | Bin 154 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_5/39.png | Bin 188 -> 172 bytes .../minecraft/mcpatcher/ctm/glass_5/4.png | Bin 216 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_5/40.png | Bin 190 -> 136 bytes .../minecraft/mcpatcher/ctm/glass_5/41.png | Bin 186 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_5/42.png | Bin 173 -> 139 bytes .../minecraft/mcpatcher/ctm/glass_5/43.png | Bin 189 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_5/44.png | Bin 117 -> 123 bytes .../minecraft/mcpatcher/ctm/glass_5/45.png | Bin 115 -> 119 bytes .../minecraft/mcpatcher/ctm/glass_5/46.png | Bin 190 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_5/5.png | Bin 210 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_5/6.png | Bin 217 -> 150 bytes .../minecraft/mcpatcher/ctm/glass_5/7.png | Bin 199 -> 141 bytes .../minecraft/mcpatcher/ctm/glass_5/8.png | Bin 185 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_5/9.png | Bin 161 -> 135 bytes .../minecraft/mcpatcher/ctm/glass_6/0.png | Bin 0 -> 243 bytes .../minecraft/mcpatcher/ctm/glass_6/1.png | Bin 0 -> 238 bytes .../minecraft/mcpatcher/ctm/glass_6/10.png | Bin 0 -> 214 bytes .../minecraft/mcpatcher/ctm/glass_6/11.png | Bin 0 -> 214 bytes .../minecraft/mcpatcher/ctm/glass_6/12.png | Bin 0 -> 236 bytes .../minecraft/mcpatcher/ctm/glass_6/13.png | Bin 0 -> 228 bytes .../minecraft/mcpatcher/ctm/glass_6/14.png | Bin 0 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_6/15.png | Bin 0 -> 232 bytes .../minecraft/mcpatcher/ctm/glass_6/16.png | Bin 0 -> 240 bytes .../minecraft/mcpatcher/ctm/glass_6/17.png | Bin 0 -> 236 bytes .../minecraft/mcpatcher/ctm/glass_6/18.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/19.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/2.png | Bin 0 -> 217 bytes .../minecraft/mcpatcher/ctm/glass_6/20.png | Bin 0 -> 214 bytes .../minecraft/mcpatcher/ctm/glass_6/21.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/22.png | Bin 0 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_6/23.png | Bin 0 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_6/24.png | Bin 0 -> 223 bytes .../minecraft/mcpatcher/ctm/glass_6/25.png | Bin 0 -> 222 bytes .../minecraft/mcpatcher/ctm/glass_6/26.png | Bin 0 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_6/27.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/28.png | Bin 0 -> 222 bytes .../minecraft/mcpatcher/ctm/glass_6/29.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/3.png | Bin 0 -> 239 bytes .../minecraft/mcpatcher/ctm/glass_6/30.png | Bin 0 -> 224 bytes .../minecraft/mcpatcher/ctm/glass_6/31.png | Bin 0 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_6/32.png | Bin 0 -> 214 bytes .../minecraft/mcpatcher/ctm/glass_6/33.png | Bin 0 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_6/34.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/35.png | Bin 0 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_6/36.png | Bin 0 -> 244 bytes .../minecraft/mcpatcher/ctm/glass_6/37.png | Bin 0 -> 240 bytes .../minecraft/mcpatcher/ctm/glass_6/38.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/39.png | Bin 0 -> 235 bytes .../minecraft/mcpatcher/ctm/glass_6/4.png | Bin 0 -> 230 bytes .../minecraft/mcpatcher/ctm/glass_6/40.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/41.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/42.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/43.png | Bin 0 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_6/44.png | Bin 0 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_6/45.png | Bin 0 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_6/46.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/5.png | Bin 0 -> 232 bytes .../minecraft/mcpatcher/ctm/glass_6/6.png | Bin 0 -> 224 bytes .../minecraft/mcpatcher/ctm/glass_6/7.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/8.png | Bin 0 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_6/9.png | Bin 0 -> 211 bytes .../mcpatcher/ctm/glass_6/glass_5.properties | 6 + .../minecraft/mcpatcher/ctm/glass_7/0.png | Bin 218 -> 208 bytes .../minecraft/mcpatcher/ctm/glass_7/1.png | Bin 212 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_7/10.png | Bin 158 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_7/11.png | Bin 151 -> 109 bytes .../minecraft/mcpatcher/ctm/glass_7/12.png | Bin 221 -> 184 bytes .../minecraft/mcpatcher/ctm/glass_7/13.png | Bin 191 -> 159 bytes .../minecraft/mcpatcher/ctm/glass_7/14.png | Bin 146 -> 126 bytes .../minecraft/mcpatcher/ctm/glass_7/15.png | Bin 185 -> 161 bytes .../minecraft/mcpatcher/ctm/glass_7/16.png | Bin 218 -> 166 bytes .../minecraft/mcpatcher/ctm/glass_7/17.png | Bin 225 -> 156 bytes .../minecraft/mcpatcher/ctm/glass_7/18.png | Bin 215 -> 129 bytes .../minecraft/mcpatcher/ctm/glass_7/19.png | Bin 228 -> 138 bytes .../minecraft/mcpatcher/ctm/glass_7/2.png | Bin 207 -> 144 bytes .../minecraft/mcpatcher/ctm/glass_7/20.png | Bin 188 -> 114 bytes .../minecraft/mcpatcher/ctm/glass_7/21.png | Bin 192 -> 116 bytes .../minecraft/mcpatcher/ctm/glass_7/22.png | Bin 156 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_7/23.png | Bin 161 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_7/24.png | Bin 224 -> 151 bytes .../minecraft/mcpatcher/ctm/glass_7/25.png | Bin 168 -> 133 bytes .../minecraft/mcpatcher/ctm/glass_7/26.png | Bin 75 -> 102 bytes .../minecraft/mcpatcher/ctm/glass_7/27.png | Bin 160 -> 131 bytes .../minecraft/mcpatcher/ctm/glass_7/28.png | Bin 192 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_7/29.png | Bin 181 -> 130 bytes .../minecraft/mcpatcher/ctm/glass_7/3.png | Bin 217 -> 183 bytes .../minecraft/mcpatcher/ctm/glass_7/30.png | Bin 193 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_7/31.png | Bin 184 -> 132 bytes .../minecraft/mcpatcher/ctm/glass_7/32.png | Bin 118 -> 106 bytes .../minecraft/mcpatcher/ctm/glass_7/33.png | Bin 124 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_7/34.png | Bin 161 -> 111 bytes .../minecraft/mcpatcher/ctm/glass_7/35.png | Bin 156 -> 112 bytes .../minecraft/mcpatcher/ctm/glass_7/36.png | Bin 221 -> 173 bytes .../minecraft/mcpatcher/ctm/glass_7/37.png | Bin 197 -> 155 bytes .../minecraft/mcpatcher/ctm/glass_7/38.png | Bin 155 -> 120 bytes .../minecraft/mcpatcher/ctm/glass_7/39.png | Bin 189 -> 153 bytes .../minecraft/mcpatcher/ctm/glass_7/4.png | Bin 216 -> 160 bytes .../minecraft/mcpatcher/ctm/glass_7/40.png | Bin 187 -> 124 bytes .../minecraft/mcpatcher/ctm/glass_7/41.png | Bin 193 -> 135 bytes .../minecraft/mcpatcher/ctm/glass_7/42.png | Bin 184 -> 125 bytes .../minecraft/mcpatcher/ctm/glass_7/43.png | Bin 196 -> 134 bytes .../minecraft/mcpatcher/ctm/glass_7/44.png | Bin 121 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_7/45.png | Bin 122 -> 108 bytes .../minecraft/mcpatcher/ctm/glass_7/46.png | Bin 218 -> 118 bytes .../minecraft/mcpatcher/ctm/glass_7/5.png | Bin 221 -> 165 bytes .../minecraft/mcpatcher/ctm/glass_7/6.png | Bin 222 -> 145 bytes .../minecraft/mcpatcher/ctm/glass_7/7.png | Bin 210 -> 133 bytes .../minecraft/mcpatcher/ctm/glass_7/8.png | Bin 183 -> 113 bytes .../minecraft/mcpatcher/ctm/glass_7/9.png | Bin 186 -> 116 bytes .../minecraft/mcpatcher/ctm/glass_8/0.png | Bin 197 -> 244 bytes .../minecraft/mcpatcher/ctm/glass_8/1.png | Bin 176 -> 232 bytes .../minecraft/mcpatcher/ctm/glass_8/10.png | Bin 159 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_8/11.png | Bin 150 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_8/12.png | Bin 194 -> 237 bytes .../minecraft/mcpatcher/ctm/glass_8/13.png | Bin 172 -> 222 bytes .../minecraft/mcpatcher/ctm/glass_8/14.png | Bin 150 -> 195 bytes .../minecraft/mcpatcher/ctm/glass_8/15.png | Bin 167 -> 227 bytes .../minecraft/mcpatcher/ctm/glass_8/16.png | Bin 175 -> 221 bytes .../minecraft/mcpatcher/ctm/glass_8/17.png | Bin 181 -> 235 bytes .../minecraft/mcpatcher/ctm/glass_8/18.png | Bin 162 -> 196 bytes .../minecraft/mcpatcher/ctm/glass_8/19.png | Bin 179 -> 219 bytes .../minecraft/mcpatcher/ctm/glass_8/2.png | Bin 161 -> 212 bytes .../minecraft/mcpatcher/ctm/glass_8/20.png | Bin 163 -> 178 bytes .../minecraft/mcpatcher/ctm/glass_8/21.png | Bin 155 -> 182 bytes .../minecraft/mcpatcher/ctm/glass_8/22.png | Bin 151 -> 180 bytes .../minecraft/mcpatcher/ctm/glass_8/23.png | Bin 150 -> 185 bytes .../minecraft/mcpatcher/ctm/glass_8/24.png | Bin 198 -> 230 bytes .../minecraft/mcpatcher/ctm/glass_8/25.png | Bin 169 -> 210 bytes .../minecraft/mcpatcher/ctm/glass_8/26.png | Bin 141 -> 175 bytes .../minecraft/mcpatcher/ctm/glass_8/27.png | Bin 170 -> 213 bytes .../minecraft/mcpatcher/ctm/glass_8/28.png | Bin 173 -> 210 bytes .../minecraft/mcpatcher/ctm/glass_8/29.png | Bin 154 -> 197 bytes .../minecraft/mcpatcher/ctm/glass_8/3.png | Bin 179 -> 246 bytes .../minecraft/mcpatcher/ctm/glass_8/30.png | Bin 171 -> 210 bytes .../minecraft/mcpatcher/ctm/glass_8/31.png | Bin 155 -> 199 bytes .../minecraft/mcpatcher/ctm/glass_8/32.png | Bin 145 -> 177 bytes .../minecraft/mcpatcher/ctm/glass_8/33.png | Bin 146 -> 179 bytes .../minecraft/mcpatcher/ctm/glass_8/34.png | Bin 149 -> 183 bytes .../minecraft/mcpatcher/ctm/glass_8/35.png | Bin 158 -> 176 bytes .../minecraft/mcpatcher/ctm/glass_8/36.png | Bin 198 -> 241 bytes .../minecraft/mcpatcher/ctm/glass_8/37.png | Bin 172 -> 220 bytes .../minecraft/mcpatcher/ctm/glass_8/38.png | Bin 152 -> 192 bytes .../minecraft/mcpatcher/ctm/glass_8/39.png | Bin 178 -> 231 bytes .../minecraft/mcpatcher/ctm/glass_8/4.png | Bin 174 -> 223 bytes .../minecraft/mcpatcher/ctm/glass_8/40.png | Bin 156 -> 198 bytes .../minecraft/mcpatcher/ctm/glass_8/41.png | Bin 176 -> 215 bytes .../minecraft/mcpatcher/ctm/glass_8/42.png | Bin 166 -> 191 bytes .../minecraft/mcpatcher/ctm/glass_8/43.png | Bin 177 -> 217 bytes .../minecraft/mcpatcher/ctm/glass_8/44.png | Bin 155 -> 175 bytes .../minecraft/mcpatcher/ctm/glass_8/45.png | Bin 145 -> 181 bytes .../minecraft/mcpatcher/ctm/glass_8/46.png | Bin 158 -> 183 bytes .../minecraft/mcpatcher/ctm/glass_8/5.png | Bin 174 -> 229 bytes .../minecraft/mcpatcher/ctm/glass_8/6.png | Bin 174 -> 211 bytes .../minecraft/mcpatcher/ctm/glass_8/7.png | Bin 158 -> 199 bytes .../minecraft/mcpatcher/ctm/glass_8/8.png | Bin 154 -> 185 bytes .../minecraft/mcpatcher/ctm/glass_8/9.png | Bin 154 -> 181 bytes .../mcpatcher/ctm/ineffable_glass/0.png | Bin 0 -> 214 bytes .../mcpatcher/ctm/ineffable_glass/1.png | Bin 0 -> 194 bytes .../mcpatcher/ctm/ineffable_glass/10.png | Bin 0 -> 147 bytes .../mcpatcher/ctm/ineffable_glass/11.png | Bin 0 -> 145 bytes .../mcpatcher/ctm/ineffable_glass/12.png | Bin 0 -> 195 bytes .../mcpatcher/ctm/ineffable_glass/13.png | Bin 0 -> 168 bytes .../mcpatcher/ctm/ineffable_glass/14.png | Bin 0 -> 132 bytes .../mcpatcher/ctm/ineffable_glass/15.png | Bin 0 -> 172 bytes .../mcpatcher/ctm/ineffable_glass/16.png | Bin 0 -> 197 bytes .../mcpatcher/ctm/ineffable_glass/17.png | Bin 0 -> 196 bytes .../mcpatcher/ctm/ineffable_glass/18.png | Bin 0 -> 169 bytes .../mcpatcher/ctm/ineffable_glass/19.png | Bin 0 -> 191 bytes .../mcpatcher/ctm/ineffable_glass/2.png | Bin 0 -> 153 bytes .../mcpatcher/ctm/ineffable_glass/20.png | Bin 0 -> 160 bytes .../mcpatcher/ctm/ineffable_glass/21.png | Bin 0 -> 167 bytes .../mcpatcher/ctm/ineffable_glass/22.png | Bin 0 -> 146 bytes .../mcpatcher/ctm/ineffable_glass/23.png | Bin 0 -> 150 bytes .../mcpatcher/ctm/ineffable_glass/24.png | Bin 0 -> 172 bytes .../mcpatcher/ctm/ineffable_glass/25.png | Bin 0 -> 144 bytes .../mcpatcher/ctm/ineffable_glass/26.png | Bin 0 -> 102 bytes .../mcpatcher/ctm/ineffable_glass/27.png | Bin 0 -> 140 bytes .../mcpatcher/ctm/ineffable_glass/28.png | Bin 0 -> 166 bytes .../mcpatcher/ctm/ineffable_glass/29.png | Bin 0 -> 152 bytes .../mcpatcher/ctm/ineffable_glass/3.png | Bin 0 -> 198 bytes .../mcpatcher/ctm/ineffable_glass/30.png | Bin 0 -> 168 bytes .../mcpatcher/ctm/ineffable_glass/31.png | Bin 0 -> 152 bytes .../mcpatcher/ctm/ineffable_glass/32.png | Bin 0 -> 129 bytes .../mcpatcher/ctm/ineffable_glass/33.png | Bin 0 -> 129 bytes .../mcpatcher/ctm/ineffable_glass/34.png | Bin 0 -> 146 bytes .../mcpatcher/ctm/ineffable_glass/35.png | Bin 0 -> 146 bytes .../mcpatcher/ctm/ineffable_glass/36.png | Bin 0 -> 194 bytes .../mcpatcher/ctm/ineffable_glass/37.png | Bin 0 -> 175 bytes .../mcpatcher/ctm/ineffable_glass/38.png | Bin 0 -> 130 bytes .../mcpatcher/ctm/ineffable_glass/39.png | Bin 0 -> 169 bytes .../mcpatcher/ctm/ineffable_glass/4.png | Bin 0 -> 188 bytes .../mcpatcher/ctm/ineffable_glass/40.png | Bin 0 -> 152 bytes .../mcpatcher/ctm/ineffable_glass/41.png | Bin 0 -> 169 bytes .../mcpatcher/ctm/ineffable_glass/42.png | Bin 0 -> 150 bytes .../mcpatcher/ctm/ineffable_glass/43.png | Bin 0 -> 162 bytes .../mcpatcher/ctm/ineffable_glass/44.png | Bin 0 -> 126 bytes .../mcpatcher/ctm/ineffable_glass/45.png | Bin 0 -> 127 bytes .../mcpatcher/ctm/ineffable_glass/46.png | Bin 0 -> 178 bytes .../mcpatcher/ctm/ineffable_glass/5.png | Bin 0 -> 194 bytes .../mcpatcher/ctm/ineffable_glass/6.png | Bin 0 -> 187 bytes .../mcpatcher/ctm/ineffable_glass/7.png | Bin 0 -> 167 bytes .../mcpatcher/ctm/ineffable_glass/8.png | Bin 0 -> 162 bytes .../mcpatcher/ctm/ineffable_glass/9.png | Bin 0 -> 167 bytes .../ineffable_glass.properties | 6 + .../textures/blocks/liquid_bedrockium.png | Bin 9137 -> 5754 bytes .../blocks/liquid_bedrockium_flow.png | Bin 13201 -> 7812 bytes .../textures/blocks/liquid_inverted.png | Bin 6915 -> 4490 bytes .../textures/blocks/liquid_inverted_flow.png | Bin 7156 -> 4890 bytes .../arrow/bedrockium_uie_arrow_fletching.png | Bin 185 -> 152 bytes .../items/arrow/bedrockium_uie_arrow_head.png | Bin 168 -> 140 bytes .../arrow/bedrockium_uie_arrow_shaft.png | Bin 257 -> 156 bytes .../items/arrow/inverted_arrow_fletching.png | Bin 321 -> 276 bytes .../items/arrow/inverted_arrow_head.png | Bin 284 -> 256 bytes .../items/arrow/inverted_arrow_shaft.png | Bin 374 -> 322 bytes .../items/arrow/magical_wood_arrow_head.png | Bin 166 -> 138 bytes .../items/arrow/magical_wood_arrow_shaft.png | Bin 187 -> 174 bytes .../items/axe/bedrockium_uie_axe_handle.png | Bin 180 -> 146 bytes .../items/axe/bedrockium_uie_axe_head.png | Bin 233 -> 162 bytes .../axe/bedrockium_uie_axe_head_broken.png | Bin 212 -> 152 bytes .../items/axe/inverted_axe_handle.png | Bin 353 -> 305 bytes .../textures/items/axe/inverted_axe_head.png | Bin 252 -> 216 bytes .../items/axe/inverted_axe_head_broken.png | Bin 224 -> 191 bytes .../items/axe/magical_wood_axe_handle.png | Bin 537 -> 506 bytes .../items/axe/magical_wood_axe_head.png | Bin 189 -> 142 bytes .../axe/magical_wood_axe_head_broken.png | Bin 188 -> 136 bytes .../bedrockium_uie_battleaxe_back.png | Bin 146 -> 117 bytes .../bedrockium_uie_battleaxe_backhead.png | Bin 215 -> 156 bytes .../bedrockium_uie_battleaxe_binding.png | Bin 146 -> 117 bytes .../bedrockium_uie_battleaxe_front.png | Bin 207 -> 156 bytes .../bedrockium_uie_battleaxe_fronthead.png | Bin 207 -> 156 bytes ...rockium_uie_battleaxe_fronthead_broken.png | Bin 219 -> 154 bytes .../bedrockium_uie_battleaxe_handle.png | Bin 232 -> 145 bytes .../bedrockium_uie_battleaxe_head.png | Bin 215 -> 156 bytes .../bedrockium_uie_battleaxe_head_broken.png | Bin 219 -> 154 bytes .../battleaxe/inverted_battleaxe_back.png | Bin 252 -> 224 bytes .../battleaxe/inverted_battleaxe_backhead.png | Bin 326 -> 279 bytes .../battleaxe/inverted_battleaxe_binding.png | Bin 250 -> 222 bytes .../battleaxe/inverted_battleaxe_front.png | Bin 315 -> 280 bytes .../inverted_battleaxe_fronthead.png | Bin 306 -> 277 bytes .../inverted_battleaxe_fronthead_broken.png | Bin 332 -> 293 bytes .../battleaxe/inverted_battleaxe_handle.png | Bin 346 -> 304 bytes .../battleaxe/inverted_battleaxe_head.png | Bin 332 -> 295 bytes .../inverted_battleaxe_head_broken.png | Bin 325 -> 295 bytes .../battleaxe/magical_wood_battleaxe_back.png | Bin 512 -> 495 bytes .../magical_wood_battleaxe_backhead.png | Bin 580 -> 534 bytes .../magical_wood_battleaxe_binding.png | Bin 512 -> 495 bytes .../magical_wood_battleaxe_front.png | Bin 585 -> 532 bytes .../magical_wood_battleaxe_fronthead.png | Bin 585 -> 532 bytes ...agical_wood_battleaxe_fronthead_broken.png | Bin 571 -> 529 bytes .../magical_wood_battleaxe_handle.png | Bin 563 -> 504 bytes .../battleaxe/magical_wood_battleaxe_head.png | Bin 580 -> 534 bytes .../magical_wood_battleaxe_head_broken.png | Bin 571 -> 529 bytes .../bedrockium_uie_battlesign_handle.png | Bin 161 -> 128 bytes .../bedrockium_uie_battlesign_head.png | Bin 417 -> 237 bytes .../bedrockium_uie_battlesign_head_broken.png | Bin 399 -> 239 bytes .../battlesign/inverted_battlesign_handle.png | Bin 261 -> 241 bytes .../battlesign/inverted_battlesign_head.png | Bin 449 -> 434 bytes .../inverted_battlesign_head_broken.png | Bin 444 -> 412 bytes .../magical_wood_battlesign_handle.png | Bin 136 -> 119 bytes .../magical_wood_battlesign_head.png | Bin 278 -> 170 bytes .../magical_wood_battlesign_head_broken.png | Bin 281 -> 176 bytes .../bolt/bedrockium_uie_bolt_fletching.png | Bin 166 -> 129 bytes .../items/bolt/bedrockium_uie_bolt_head.png | Bin 142 -> 114 bytes .../items/bolt/bedrockium_uie_bolt_shaft.png | Bin 206 -> 140 bytes .../items/bolt/inverted_bolt_fletching.png | Bin 298 -> 258 bytes .../items/bolt/inverted_bolt_head.png | Bin 246 -> 214 bytes .../items/bolt/inverted_bolt_shaft.png | Bin 317 -> 261 bytes .../items/bolt/magical_wood_bolt_head.png | Bin 510 -> 494 bytes .../items/bolt/magical_wood_bolt_shaft.png | Bin 554 -> 505 bytes .../bedrockium_uie_sword_accessory.png | Bin 234 -> 155 bytes .../broadsword/bedrockium_uie_sword_blade.png | Bin 263 -> 173 bytes .../bedrockium_uie_sword_blade_broken.png | Bin 264 -> 162 bytes .../bedrockium_uie_sword_handle.png | Bin 193 -> 134 bytes .../broadsword/inverted_sword_accessory.png | Bin 391 -> 318 bytes .../items/broadsword/inverted_sword_blade.png | Bin 416 -> 375 bytes .../inverted_sword_blade_broken.png | Bin 396 -> 343 bytes .../broadsword/inverted_sword_handle.png | Bin 295 -> 270 bytes .../magical_wood_sword_accessory.png | Bin 584 -> 517 bytes .../broadsword/magical_wood_sword_blade.png | Bin 560 -> 507 bytes .../magical_wood_sword_blade_broken.png | Bin 592 -> 518 bytes .../broadsword/magical_wood_sword_handle.png | Bin 549 -> 508 bytes .../chisel/bedrockium_uie_chisel_handle.png | Bin 158 -> 122 bytes .../chisel/bedrockium_uie_chisel_head.png | Bin 222 -> 151 bytes .../bedrockium_uie_chisel_head_broken.png | Bin 172 -> 122 bytes .../items/chisel/inverted_chisel_handle.png | Bin 264 -> 227 bytes .../items/chisel/inverted_chisel_head.png | Bin 369 -> 296 bytes .../chisel/inverted_chisel_head_broken.png | Bin 295 -> 242 bytes .../chisel/magical_wood_chisel_handle.png | Bin 513 -> 502 bytes .../items/chisel/magical_wood_chisel_head.png | Bin 567 -> 506 bytes .../magical_wood_chisel_head_broken.png | Bin 513 -> 486 bytes .../cleaver/bedrockium_uie_cleaver_guard.png | Bin 139 -> 119 bytes .../cleaver/bedrockium_uie_cleaver_handle.png | Bin 180 -> 130 bytes .../cleaver/bedrockium_uie_cleaver_head.png | Bin 318 -> 206 bytes .../bedrockium_uie_cleaver_head_broken.png | Bin 290 -> 197 bytes .../cleaver/bedrockium_uie_cleaver_shield.png | Bin 261 -> 158 bytes .../items/cleaver/inverted_cleaver_guard.png | Bin 266 -> 224 bytes .../items/cleaver/inverted_cleaver_handle.png | Bin 269 -> 237 bytes .../items/cleaver/inverted_cleaver_head.png | Bin 464 -> 382 bytes .../cleaver/inverted_cleaver_head_broken.png | Bin 503 -> 411 bytes .../items/cleaver/inverted_cleaver_shield.png | Bin 357 -> 294 bytes .../cleaver/magical_wood_cleaver_guard.png | Bin 515 -> 495 bytes .../cleaver/magical_wood_cleaver_handle.png | Bin 540 -> 505 bytes .../cleaver/magical_wood_cleaver_head.png | Bin 571 -> 513 bytes .../magical_wood_cleaver_head_broken.png | Bin 598 -> 522 bytes .../cleaver/magical_wood_cleaver_shield.png | Bin 562 -> 504 bytes .../bedrockium_uie_crossbow_binding.png | Bin 148 -> 131 bytes .../crossbow/bedrockium_uie_crossbow_body.png | Bin 271 -> 172 bytes .../crossbow/bedrockium_uie_crossbow_bow.png | Bin 304 -> 202 bytes .../bedrockium_uie_crossbow_bow_1.png | Bin 304 -> 189 bytes .../bedrockium_uie_crossbow_bow_2.png | Bin 313 -> 190 bytes .../bedrockium_uie_crossbow_bow_3.png | Bin 305 -> 193 bytes .../crossbow/inverted_crossbow_binding.png | Bin 327 -> 250 bytes .../items/crossbow/inverted_crossbow_body.png | Bin 407 -> 318 bytes .../items/crossbow/inverted_crossbow_bow.png | Bin 462 -> 369 bytes .../crossbow/inverted_crossbow_bow_1.png | Bin 448 -> 371 bytes .../crossbow/inverted_crossbow_bow_2.png | Bin 461 -> 373 bytes .../crossbow/inverted_crossbow_bow_3.png | Bin 516 -> 433 bytes .../magical_wood_crossbow_binding.png | Bin 509 -> 505 bytes .../crossbow/magical_wood_crossbow_body.png | Bin 622 -> 523 bytes .../crossbow/magical_wood_crossbow_bow.png | Bin 599 -> 547 bytes .../crossbow/magical_wood_crossbow_bow_1.png | Bin 599 -> 547 bytes .../crossbow/magical_wood_crossbow_bow_2.png | Bin 605 -> 542 bytes .../crossbow/magical_wood_crossbow_bow_3.png | Bin 613 -> 546 bytes .../cutlass/bedrockium_uie_cutlass_blade.png | Bin 326 -> 196 bytes .../bedrockium_uie_cutlass_blade_broken.png | Bin 303 -> 190 bytes .../cutlass/bedrockium_uie_cutlass_guard.png | Bin 118 -> 96 bytes .../cutlass/bedrockium_uie_cutlass_handle.png | Bin 146 -> 113 bytes .../items/cutlass/inverted_cutlass_blade.png | Bin 463 -> 383 bytes .../cutlass/inverted_cutlass_blade_broken.png | Bin 470 -> 387 bytes .../items/cutlass/inverted_cutlass_guard.png | Bin 233 -> 216 bytes .../items/cutlass/inverted_cutlass_handle.png | Bin 255 -> 235 bytes .../cutlass/magical_wood_cutlass_blade.png | Bin 599 -> 531 bytes .../magical_wood_cutlass_blade_broken.png | Bin 591 -> 531 bytes .../cutlass/magical_wood_cutlass_guard.png | Bin 499 -> 483 bytes .../cutlass/magical_wood_cutlass_handle.png | Bin 515 -> 489 bytes .../bedrockium_uie_dagger_accessory.png | Bin 174 -> 123 bytes .../dagger/bedrockium_uie_dagger_blade.png | Bin 245 -> 157 bytes .../bedrockium_uie_dagger_blade_broken.png | Bin 214 -> 148 bytes .../dagger/bedrockium_uie_dagger_handle.png | Bin 169 -> 128 bytes .../dagger/inverted_dagger_accessory.png | Bin 302 -> 236 bytes .../items/dagger/inverted_dagger_blade.png | Bin 370 -> 308 bytes .../dagger/inverted_dagger_blade_broken.png | Bin 364 -> 303 bytes .../items/dagger/inverted_dagger_handle.png | Bin 259 -> 225 bytes .../dagger/magical_wood_dagger_accessory.png | Bin 527 -> 491 bytes .../dagger/magical_wood_dagger_blade.png | Bin 554 -> 507 bytes .../magical_wood_dagger_blade_broken.png | Bin 556 -> 511 bytes .../dagger/magical_wood_dagger_handle.png | Bin 529 -> 501 bytes .../bedrockium_uie_excavator_binding.png | Bin 168 -> 131 bytes .../bedrockium_uie_excavator_grip.png | Bin 148 -> 118 bytes .../bedrockium_uie_excavator_handle.png | Bin 222 -> 147 bytes .../bedrockium_uie_excavator_head.png | Bin 267 -> 185 bytes .../bedrockium_uie_excavator_head_broken.png | Bin 256 -> 178 bytes .../excavator/inverted_excavator_binding.png | Bin 285 -> 241 bytes .../excavator/inverted_excavator_grip.png | Bin 243 -> 221 bytes .../excavator/inverted_excavator_handle.png | Bin 351 -> 295 bytes .../excavator/inverted_excavator_head.png | Bin 415 -> 334 bytes .../inverted_excavator_head_broken.png | Bin 397 -> 320 bytes .../magical_wood_excavator_binding.png | Bin 548 -> 504 bytes .../excavator/magical_wood_excavator_grip.png | Bin 529 -> 493 bytes .../magical_wood_excavator_handle.png | Bin 576 -> 511 bytes .../excavator/magical_wood_excavator_head.png | Bin 599 -> 536 bytes .../magical_wood_excavator_head_broken.png | Bin 603 -> 531 bytes .../frypan/bedrockium_uie_frypan_handle.png | Bin 279 -> 161 bytes .../frypan/bedrockium_uie_frypan_head.png | Bin 454 -> 267 bytes .../bedrockium_uie_frypan_head_broken.png | Bin 462 -> 273 bytes .../items/frypan/inverted_frypan_handle.png | Bin 200 -> 182 bytes .../items/frypan/inverted_frypan_head.png | Bin 519 -> 427 bytes .../frypan/inverted_frypan_head_broken.png | Bin 561 -> 472 bytes .../frypan/magical_wood_frypan_handle.png | Bin 571 -> 507 bytes .../items/frypan/magical_wood_frypan_head.png | Bin 659 -> 564 bytes .../magical_wood_frypan_head_broken.png | Bin 710 -> 590 bytes .../hammer/bedrockium_uie_hammer_back.png | Bin 180 -> 144 bytes .../hammer/bedrockium_uie_hammer_front.png | Bin 177 -> 140 bytes .../hammer/bedrockium_uie_hammer_handle.png | Bin 256 -> 160 bytes .../bedrockium_uie_hammer_handle_broken.png | Bin 220 -> 154 bytes .../hammer/bedrockium_uie_hammer_head.png | Bin 329 -> 221 bytes .../items/hammer/inverted_hammer_back.png | Bin 196 -> 168 bytes .../items/hammer/inverted_hammer_front.png | Bin 209 -> 172 bytes .../items/hammer/inverted_hammer_handle.png | Bin 363 -> 330 bytes .../hammer/inverted_hammer_handle_broken.png | Bin 364 -> 311 bytes .../items/hammer/inverted_hammer_head.png | Bin 367 -> 312 bytes .../items/hammer/magical_wood_hammer_back.png | Bin 547 -> 519 bytes .../hammer/magical_wood_hammer_front.png | Bin 555 -> 517 bytes .../hammer/magical_wood_hammer_handle.png | Bin 554 -> 501 bytes .../magical_wood_hammer_handle_broken.png | Bin 568 -> 518 bytes .../items/hammer/magical_wood_hammer_head.png | Bin 626 -> 548 bytes .../bedrockium_uie_javelin_accessory.png | Bin 174 -> 122 bytes .../javelin/bedrockium_uie_javelin_handle.png | Bin 179 -> 127 bytes .../javelin/bedrockium_uie_javelin_head.png | Bin 189 -> 145 bytes .../bedrockium_uie_javelin_head_broken.png | Bin 136 -> 107 bytes .../javelin/inverted_javelin_accessory.png | Bin 293 -> 252 bytes .../items/javelin/inverted_javelin_handle.png | Bin 318 -> 248 bytes .../items/javelin/inverted_javelin_head.png | Bin 323 -> 290 bytes .../javelin/inverted_javelin_head_broken.png | Bin 243 -> 209 bytes .../magical_wood_javelin_accessory.png | Bin 542 -> 499 bytes .../javelin/magical_wood_javelin_handle.png | Bin 544 -> 493 bytes .../javelin/magical_wood_javelin_head.png | Bin 563 -> 514 bytes .../magical_wood_javelin_head_broken.png | Bin 524 -> 493 bytes .../longbow/bedrockium_uie_bow_bottom.png | Bin 184 -> 139 bytes .../longbow/bedrockium_uie_bow_bottom_1.png | Bin 230 -> 151 bytes .../longbow/bedrockium_uie_bow_bottom_2.png | Bin 216 -> 148 bytes .../longbow/bedrockium_uie_bow_bottom_3.png | Bin 224 -> 156 bytes .../items/longbow/bedrockium_uie_bow_grip.png | Bin 158 -> 114 bytes .../items/longbow/bedrockium_uie_bow_top.png | Bin 187 -> 145 bytes .../longbow/bedrockium_uie_bow_top_1.png | Bin 197 -> 149 bytes .../longbow/bedrockium_uie_bow_top_2.png | Bin 209 -> 152 bytes .../longbow/bedrockium_uie_bow_top_3.png | Bin 185 -> 138 bytes .../items/longbow/inverted_bow_bottom.png | Bin 308 -> 270 bytes .../items/longbow/inverted_bow_bottom_1.png | Bin 354 -> 315 bytes .../items/longbow/inverted_bow_bottom_2.png | Bin 343 -> 308 bytes .../items/longbow/inverted_bow_bottom_3.png | Bin 334 -> 301 bytes .../items/longbow/inverted_bow_grip.png | Bin 277 -> 233 bytes .../items/longbow/inverted_bow_top.png | Bin 307 -> 269 bytes .../items/longbow/inverted_bow_top_1.png | Bin 327 -> 297 bytes .../items/longbow/inverted_bow_top_2.png | Bin 325 -> 291 bytes .../items/longbow/inverted_bow_top_3.png | Bin 321 -> 289 bytes .../items/longbow/magical_wood_bow_bottom.png | Bin 557 -> 512 bytes .../longbow/magical_wood_bow_bottom_1.png | Bin 557 -> 512 bytes .../longbow/magical_wood_bow_bottom_2.png | Bin 534 -> 505 bytes .../longbow/magical_wood_bow_bottom_3.png | Bin 515 -> 501 bytes .../items/longbow/magical_wood_bow_grip.png | Bin 521 -> 494 bytes .../items/longbow/magical_wood_bow_top.png | Bin 541 -> 508 bytes .../items/longbow/magical_wood_bow_top_1.png | Bin 541 -> 508 bytes .../items/longbow/magical_wood_bow_top_2.png | Bin 532 -> 507 bytes .../items/longbow/magical_wood_bow_top_3.png | Bin 517 -> 502 bytes .../bedrockium_uie_longsword_accessory.png | Bin 186 -> 134 bytes .../bedrockium_uie_longsword_blade.png | Bin 256 -> 163 bytes .../bedrockium_uie_longsword_blade_broken.png | Bin 259 -> 165 bytes .../bedrockium_uie_longsword_handle.png | Bin 193 -> 134 bytes .../inverted_longsword_accessory.png | Bin 312 -> 273 bytes .../longsword/inverted_longsword_blade.png | Bin 398 -> 341 bytes .../inverted_longsword_blade_broken.png | Bin 415 -> 349 bytes .../longsword/inverted_longsword_handle.png | Bin 301 -> 273 bytes .../magical_wood_longsword_accessory.png | Bin 543 -> 508 bytes .../magical_wood_longsword_blade.png | Bin 553 -> 507 bytes .../magical_wood_longsword_blade_broken.png | Bin 581 -> 518 bytes .../magical_wood_longsword_handle.png | Bin 545 -> 505 bytes .../bedrockium_uie_lumberaxe_binding.png | Bin 152 -> 116 bytes .../bedrockium_uie_lumberaxe_handle.png | Bin 251 -> 163 bytes .../bedrockium_uie_lumberaxe_head.png | Bin 246 -> 190 bytes .../bedrockium_uie_lumberaxe_head_broken.png | Bin 247 -> 183 bytes .../bedrockium_uie_lumberaxe_shield.png | Bin 160 -> 126 bytes .../lumberaxe/inverted_lumberaxe_binding.png | Bin 245 -> 217 bytes .../lumberaxe/inverted_lumberaxe_handle.png | Bin 382 -> 330 bytes .../lumberaxe/inverted_lumberaxe_head.png | Bin 305 -> 277 bytes .../inverted_lumberaxe_head_broken.png | Bin 299 -> 266 bytes .../lumberaxe/inverted_lumberaxe_shield.png | Bin 269 -> 242 bytes .../magical_wood_lumberaxe_binding.png | Bin 513 -> 500 bytes .../magical_wood_lumberaxe_handle.png | Bin 573 -> 505 bytes .../lumberaxe/magical_wood_lumberaxe_head.png | Bin 598 -> 531 bytes .../magical_wood_lumberaxe_head_broken.png | Bin 574 -> 536 bytes .../magical_wood_lumberaxe_shield.png | Bin 521 -> 499 bytes .../items/materials/bucket_fiery_metal.png | Bin 4522 -> 4371 bytes .../items/materials/bucket_knightmetal.png | Bin 4512 -> 4369 bytes .../mattock/bedrockium_uie_mattock_back.png | Bin 178 -> 124 bytes .../mattock/bedrockium_uie_mattock_handle.png | Bin 272 -> 163 bytes .../mattock/bedrockium_uie_mattock_head.png | Bin 234 -> 167 bytes .../bedrockium_uie_mattock_head_broken.png | Bin 217 -> 156 bytes .../items/mattock/inverted_mattock_back.png | Bin 291 -> 256 bytes .../items/mattock/inverted_mattock_handle.png | Bin 387 -> 330 bytes .../items/mattock/inverted_mattock_head.png | Bin 372 -> 313 bytes .../mattock/inverted_mattock_head_broken.png | Bin 361 -> 309 bytes .../mattock/magical_wood_mattock_back.png | Bin 540 -> 506 bytes .../mattock/magical_wood_mattock_handle.png | Bin 571 -> 506 bytes .../mattock/magical_wood_mattock_head.png | Bin 574 -> 523 bytes .../magical_wood_mattock_head_broken.png | Bin 561 -> 514 bytes .../parts/bedrockium_uie_arrow_shaft.png | Bin 252 -> 143 bytes .../items/parts/bedrockium_uie_arrowhead.png | Bin 251 -> 164 bytes .../items/parts/bedrockium_uie_axe_head.png | Bin 232 -> 162 bytes .../parts/bedrockium_uie_battlesign_head.png | Bin 377 -> 238 bytes .../items/parts/bedrockium_uie_binding.png | Bin 252 -> 170 bytes .../items/parts/bedrockium_uie_bolt.png | Bin 206 -> 140 bytes .../items/parts/bedrockium_uie_bolt_2.png | Bin 142 -> 114 bytes .../items/parts/bedrockium_uie_bow_limb.png | Bin 219 -> 154 bytes .../parts/bedrockium_uie_chisel_head.png | Bin 225 -> 143 bytes .../items/parts/bedrockium_uie_chunk.png | Bin 415 -> 248 bytes .../items/parts/bedrockium_uie_crossbar.png | Bin 176 -> 138 bytes .../parts/bedrockium_uie_crossbow_body.png | Bin 267 -> 164 bytes .../parts/bedrockium_uie_crossbow_limb.png | Bin 297 -> 190 bytes .../parts/bedrockium_uie_excavator_head.png | Bin 262 -> 179 bytes .../parts/bedrockium_uie_frypan_head.png | Bin 482 -> 267 bytes .../items/parts/bedrockium_uie_full_guard.png | Bin 301 -> 185 bytes .../parts/bedrockium_uie_hammer_head.png | Bin 341 -> 223 bytes .../parts/bedrockium_uie_knife_blade.png | Bin 225 -> 139 bytes .../parts/bedrockium_uie_large_guard.png | Bin 221 -> 146 bytes .../bedrockium_uie_large_sword_blade.png | Bin 327 -> 204 bytes .../items/parts/bedrockium_uie_largeplate.png | Bin 544 -> 323 bytes .../parts/bedrockium_uie_lumberaxe_head.png | Bin 268 -> 183 bytes .../parts/bedrockium_uie_medium_guard.png | Bin 185 -> 136 bytes .../parts/bedrockium_uie_pickaxe_head.png | Bin 258 -> 170 bytes .../items/parts/bedrockium_uie_rod.png | Bin 270 -> 151 bytes .../parts/bedrockium_uie_scythe_head.png | Bin 240 -> 174 bytes .../parts/bedrockium_uie_shovel_head.png | Bin 219 -> 161 bytes .../items/parts/bedrockium_uie_shuriken.png | Bin 202 -> 157 bytes .../parts/bedrockium_uie_sword_blade.png | Bin 274 -> 169 bytes .../items/parts/bedrockium_uie_toughbind.png | Bin 382 -> 233 bytes .../items/parts/bedrockium_uie_toughrod.png | Bin 308 -> 178 bytes .../items/parts/inverted_arrow_shaft.png | Bin 412 -> 299 bytes .../items/parts/inverted_arrowhead.png | Bin 397 -> 330 bytes .../items/parts/inverted_axe_head.png | Bin 361 -> 297 bytes .../items/parts/inverted_battlesign_head.png | Bin 546 -> 513 bytes .../textures/items/parts/inverted_binding.png | Bin 402 -> 329 bytes .../textures/items/parts/inverted_bolt.png | Bin 327 -> 269 bytes .../textures/items/parts/inverted_bolt_2.png | Bin 246 -> 213 bytes .../items/parts/inverted_bow_limb.png | Bin 340 -> 292 bytes .../items/parts/inverted_chisel_head.png | Bin 345 -> 266 bytes .../textures/items/parts/inverted_chunk.png | Bin 454 -> 388 bytes .../items/parts/inverted_crossbar.png | Bin 296 -> 248 bytes .../items/parts/inverted_crossbow_body.png | Bin 417 -> 315 bytes .../items/parts/inverted_crossbow_limb.png | Bin 434 -> 383 bytes .../items/parts/inverted_excavator_head.png | Bin 413 -> 346 bytes .../items/parts/inverted_frypan_head.png | Bin 623 -> 507 bytes .../items/parts/inverted_full_guard.png | Bin 430 -> 362 bytes .../items/parts/inverted_hammer_head.png | Bin 475 -> 391 bytes .../items/parts/inverted_knife_blade.png | Bin 341 -> 285 bytes .../items/parts/inverted_large_guard.png | Bin 334 -> 265 bytes .../parts/inverted_large_sword_blade.png | Bin 478 -> 412 bytes .../items/parts/inverted_largeplate.png | Bin 624 -> 588 bytes .../items/parts/inverted_lumberaxe_head.png | Bin 402 -> 357 bytes .../items/parts/inverted_medium_guard.png | Bin 297 -> 245 bytes .../items/parts/inverted_pickaxe_head.png | Bin 393 -> 326 bytes .../textures/items/parts/inverted_rod.png | Bin 402 -> 309 bytes .../items/parts/inverted_scythe_head.png | Bin 375 -> 314 bytes .../items/parts/inverted_shovel_head.png | Bin 349 -> 283 bytes .../items/parts/inverted_shuriken.png | Bin 345 -> 288 bytes .../items/parts/inverted_sword_blade.png | Bin 403 -> 334 bytes .../items/parts/inverted_toughbind.png | Bin 583 -> 459 bytes .../items/parts/inverted_toughrod.png | Bin 449 -> 361 bytes .../items/parts/magical_wood_arrow_shaft.png | Bin 579 -> 505 bytes .../items/parts/magical_wood_arrowhead.png | Bin 604 -> 533 bytes .../items/parts/magical_wood_axe_head.png | Bin 570 -> 524 bytes .../parts/magical_wood_battlesign_head.png | Bin 658 -> 552 bytes .../items/parts/magical_wood_binding.png | Bin 585 -> 529 bytes .../items/parts/magical_wood_bolt.png | Bin 554 -> 505 bytes .../items/parts/magical_wood_bolt_2.png | Bin 510 -> 494 bytes .../items/parts/magical_wood_bow_limb.png | Bin 548 -> 513 bytes .../items/parts/magical_wood_chisel_head.png | Bin 557 -> 505 bytes .../items/parts/magical_wood_chunk.png | Bin 619 -> 542 bytes .../items/parts/magical_wood_crossbar.png | Bin 556 -> 511 bytes .../parts/magical_wood_crossbow_body.png | Bin 619 -> 524 bytes .../parts/magical_wood_crossbow_limb.png | Bin 590 -> 527 bytes .../parts/magical_wood_excavator_head.png | Bin 583 -> 532 bytes .../items/parts/magical_wood_frypan_head.png | Bin 661 -> 562 bytes .../items/parts/magical_wood_full_guard.png | Bin 561 -> 512 bytes .../items/parts/magical_wood_hammer_head.png | Bin 633 -> 545 bytes .../items/parts/magical_wood_knife_blade.png | Bin 543 -> 503 bytes .../items/parts/magical_wood_large_guard.png | Bin 566 -> 508 bytes .../parts/magical_wood_large_sword_blade.png | Bin 578 -> 513 bytes .../items/parts/magical_wood_largeplate.png | Bin 699 -> 564 bytes .../parts/magical_wood_lumberaxe_head.png | Bin 596 -> 529 bytes .../items/parts/magical_wood_medium_guard.png | Bin 544 -> 508 bytes .../items/parts/magical_wood_pickaxe_head.png | Bin 586 -> 529 bytes .../textures/items/parts/magical_wood_rod.png | Bin 571 -> 510 bytes .../items/parts/magical_wood_scythe_head.png | Bin 576 -> 520 bytes .../items/parts/magical_wood_shovel_head.png | Bin 582 -> 522 bytes .../items/parts/magical_wood_shuriken.png | Bin 558 -> 511 bytes .../items/parts/magical_wood_sword_blade.png | Bin 564 -> 510 bytes .../items/parts/magical_wood_toughbind.png | Bin 632 -> 539 bytes .../items/parts/magical_wood_toughrod.png | Bin 586 -> 506 bytes .../bedrockium_uie_pickaxe_accessory.png | Bin 130 -> 106 bytes .../pickaxe/bedrockium_uie_pickaxe_handle.png | Bin 235 -> 149 bytes .../pickaxe/bedrockium_uie_pickaxe_head.png | Bin 270 -> 171 bytes .../bedrockium_uie_pickaxe_head_broken.png | Bin 232 -> 157 bytes .../pickaxe/inverted_pickaxe_accessory.png | Bin 233 -> 214 bytes .../items/pickaxe/inverted_pickaxe_handle.png | Bin 355 -> 277 bytes .../items/pickaxe/inverted_pickaxe_head.png | Bin 303 -> 245 bytes .../pickaxe/inverted_pickaxe_head_broken.png | Bin 275 -> 213 bytes .../magical_wood_pickaxe_accessory.png | Bin 516 -> 496 bytes .../pickaxe/magical_wood_pickaxe_handle.png | Bin 554 -> 504 bytes .../pickaxe/magical_wood_pickaxe_head.png | Bin 585 -> 525 bytes .../magical_wood_pickaxe_head_broken.png | Bin 564 -> 510 bytes .../bedrockium_uie_rapier_accessory.png | Bin 191 -> 134 bytes .../rapier/bedrockium_uie_rapier_blade.png | Bin 222 -> 145 bytes .../bedrockium_uie_rapier_blade_broken.png | Bin 170 -> 123 bytes .../rapier/bedrockium_uie_rapier_handle.png | Bin 200 -> 127 bytes .../rapier/inverted_rapier_accessory.png | Bin 291 -> 256 bytes .../items/rapier/inverted_rapier_blade.png | Bin 397 -> 317 bytes .../rapier/inverted_rapier_blade_broken.png | Bin 305 -> 255 bytes .../items/rapier/inverted_rapier_handle.png | Bin 314 -> 271 bytes .../rapier/magical_wood_rapier_accessory.png | Bin 550 -> 508 bytes .../rapier/magical_wood_rapier_blade.png | Bin 572 -> 500 bytes .../magical_wood_rapier_blade_broken.png | Bin 549 -> 490 bytes .../rapier/magical_wood_rapier_handle.png | Bin 569 -> 501 bytes .../bedrockium_uie_scythe_accessory.png | Bin 207 -> 143 bytes .../scythe/bedrockium_uie_scythe_binding.png | Bin 121 -> 114 bytes .../scythe/bedrockium_uie_scythe_handle.png | Bin 330 -> 210 bytes .../scythe/bedrockium_uie_scythe_head.png | Bin 228 -> 172 bytes .../bedrockium_uie_scythe_head_broken.png | Bin 189 -> 144 bytes .../scythe/inverted_scythe_accessory.png | Bin 357 -> 288 bytes .../items/scythe/inverted_scythe_binding.png | Bin 233 -> 213 bytes .../items/scythe/inverted_scythe_handle.png | Bin 496 -> 406 bytes .../items/scythe/inverted_scythe_head.png | Bin 269 -> 233 bytes .../scythe/inverted_scythe_head_broken.png | Bin 310 -> 261 bytes .../items/scythe/invertedscythe_accessory.png | Bin 6027 -> 6014 bytes .../scythe/magical_wood_scythe_accessory.png | Bin 540 -> 509 bytes .../scythe/magical_wood_scythe_binding.png | Bin 524 -> 497 bytes .../scythe/magical_wood_scythe_handle.png | Bin 628 -> 550 bytes .../items/scythe/magical_wood_scythe_head.png | Bin 581 -> 522 bytes .../magical_wood_scythe_head_broken.png | Bin 558 -> 508 bytes .../shortbow/bedrockium_uie_bow_bottom.png | Bin 230 -> 151 bytes .../shortbow/bedrockium_uie_bow_bottom_1.png | Bin 230 -> 151 bytes .../shortbow/bedrockium_uie_bow_bottom_2.png | Bin 216 -> 148 bytes .../shortbow/bedrockium_uie_bow_bottom_3.png | Bin 224 -> 156 bytes .../items/shortbow/bedrockium_uie_bow_top.png | Bin 197 -> 149 bytes .../shortbow/bedrockium_uie_bow_top_1.png | Bin 197 -> 149 bytes .../shortbow/bedrockium_uie_bow_top_2.png | Bin 209 -> 152 bytes .../shortbow/bedrockium_uie_bow_top_3.png | Bin 185 -> 138 bytes .../items/shortbow/inverted_bow_bottom.png | Bin 344 -> 311 bytes .../items/shortbow/inverted_bow_bottom_1.png | Bin 344 -> 308 bytes .../items/shortbow/inverted_bow_bottom_2.png | Bin 323 -> 288 bytes .../items/shortbow/inverted_bow_bottom_3.png | Bin 321 -> 284 bytes .../items/shortbow/inverted_bow_top.png | Bin 337 -> 302 bytes .../items/shortbow/inverted_bow_top_1.png | Bin 325 -> 284 bytes .../items/shortbow/inverted_bow_top_2.png | Bin 327 -> 295 bytes .../items/shortbow/inverted_bow_top_3.png | Bin 313 -> 282 bytes .../shortbow/magical_wood_bow_bottom.png | Bin 552 -> 516 bytes .../shortbow/magical_wood_bow_bottom_1.png | Bin 552 -> 516 bytes .../shortbow/magical_wood_bow_bottom_2.png | Bin 555 -> 516 bytes .../shortbow/magical_wood_bow_bottom_3.png | Bin 539 -> 514 bytes .../items/shortbow/magical_wood_bow_top.png | Bin 557 -> 514 bytes .../items/shortbow/magical_wood_bow_top_1.png | Bin 556 -> 513 bytes .../items/shortbow/magical_wood_bow_top_2.png | Bin 557 -> 517 bytes .../items/shortbow/magical_wood_bow_top_3.png | Bin 545 -> 508 bytes .../shovel/bedrockium_uie_shovel_handle.png | Bin 201 -> 146 bytes .../shovel/bedrockium_uie_shovel_head.png | Bin 235 -> 158 bytes .../bedrockium_uie_shovel_head_broken.png | Bin 220 -> 160 bytes .../items/shovel/inverted_shovel_handle.png | Bin 324 -> 287 bytes .../items/shovel/inverted_shovel_head.png | Bin 249 -> 203 bytes .../shovel/inverted_shovel_head_broken.png | Bin 254 -> 212 bytes .../shovel/magical_wood_shovel_handle.png | Bin 555 -> 508 bytes .../items/shovel/magical_wood_shovel_head.png | Bin 585 -> 521 bytes .../magical_wood_shovel_head_broken.png | Bin 555 -> 513 bytes .../shuriken/bedrockium_uie_shuriken.png | Bin 219 -> 159 bytes .../items/shuriken/inverted_shuriken.png | Bin 364 -> 290 bytes .../items/shuriken/magical_wood_shuriken.png | Bin 550 -> 509 bytes .../bedrockium_uie_knife_blade.png | Bin 259 -> 175 bytes .../bedrockium_uie_knife_handle.png | Bin 173 -> 122 bytes .../throwingknife/inverted_knife_blade.png | Bin 400 -> 339 bytes .../throwingknife/inverted_knife_handle.png | Bin 281 -> 243 bytes .../magical_wood_knife_blade.png | Bin 596 -> 522 bytes .../magical_wood_knife_handle.png | Bin 534 -> 500 bytes .../blockstates/chandelier.json | 8 + .../blockstates/diamond_spike.json | 5 + .../utilitiesinexcess/blockstates/drum.json | 5 + .../blockstates/giga_torch.json | 5 + .../blockstates/gold_spike.json | 5 + .../blockstates/iron_spike.json | 5 + .../blockstates/wood_spike.json | 5 + .../assets/utilitiesinexcess/lang/en_US.lang | 106 +++- .../models/blocks/chandelier.json | 30 + .../models/blocks/chandelier_copper.json | 7 + .../models/blocks/chandelier_redstone.json | 7 + .../models/blocks/chandelier_soul.json | 7 + .../models/blocks/diamond_spike.json | 6 + .../utilitiesinexcess/models/blocks/drum.json | 186 +++++++ .../models/blocks/giga_torch.json | 86 +++ .../models/blocks/gold_spike.json | 6 + .../models/blocks/iron_spike.json | 6 + .../models/blocks/wood_spike.json | 166 ++++++ .../advanced_block_update_detector_active.png | Bin 0 -> 358 bytes ...dvanced_block_update_detector_inactive.png | Bin 0 -> 370 bytes .../textures/blocks/bedrockium_block.png | Bin 429 -> 269 bytes .../textures/blocks/blackout_curtains.png | Bin 377 -> 359 bytes .../textures/blocks/blessed_earth_side.png | Bin 676 -> 440 bytes .../textures/blocks/blessed_earth_top.png | Bin 793 -> 546 bytes .../textures/blocks/block_update_detector.png | Bin 417 -> 0 bytes .../blocks/block_update_detector_active.png | Bin 0 -> 358 bytes .../blocks/block_update_detector_inactive.png | Bin 0 -> 366 bytes .../blocks/compressed_cobblestone_0.png | Bin 846 -> 608 bytes .../blocks/compressed_cobblestone_1.png | Bin 831 -> 584 bytes .../blocks/compressed_cobblestone_2.png | Bin 785 -> 584 bytes .../blocks/compressed_cobblestone_3.png | Bin 755 -> 553 bytes .../blocks/compressed_cobblestone_4.png | Bin 705 -> 533 bytes .../blocks/compressed_cobblestone_5.png | Bin 674 -> 506 bytes .../blocks/compressed_cobblestone_6.png | Bin 542 -> 456 bytes .../blocks/compressed_cobblestone_7.png | Bin 406 -> 358 bytes .../textures/blocks/compressed_dirt_0.png | Bin 621 -> 323 bytes .../textures/blocks/compressed_dirt_1.png | Bin 613 -> 322 bytes .../textures/blocks/compressed_dirt_2.png | Bin 605 -> 349 bytes .../textures/blocks/compressed_dirt_3.png | Bin 569 -> 345 bytes .../textures/blocks/compressed_dirt_4.png | Bin 601 -> 366 bytes .../textures/blocks/compressed_dirt_5.png | Bin 580 -> 364 bytes .../textures/blocks/compressed_dirt_6.png | Bin 574 -> 378 bytes .../textures/blocks/compressed_dirt_7.png | Bin 538 -> 369 bytes .../textures/blocks/compressed_gravel_0.png | Bin 741 -> 526 bytes .../textures/blocks/compressed_gravel_1.png | Bin 724 -> 518 bytes .../textures/blocks/compressed_gravel_2.png | Bin 703 -> 546 bytes .../textures/blocks/compressed_gravel_3.png | Bin 662 -> 527 bytes .../textures/blocks/compressed_gravel_4.png | Bin 641 -> 525 bytes .../textures/blocks/compressed_gravel_5.png | Bin 627 -> 513 bytes .../textures/blocks/compressed_gravel_6.png | Bin 593 -> 496 bytes .../textures/blocks/compressed_gravel_7.png | Bin 562 -> 483 bytes .../textures/blocks/compressed_sand_0.png | Bin 834 -> 779 bytes .../textures/blocks/compressed_sand_1.png | Bin 821 -> 764 bytes .../textures/blocks/compressed_sand_2.png | Bin 769 -> 759 bytes .../textures/blocks/compressed_sand_3.png | Bin 731 -> 721 bytes .../textures/blocks/compressed_sand_4.png | Bin 693 -> 687 bytes .../textures/blocks/compressed_sand_5.png | Bin 665 -> 658 bytes .../textures/blocks/compressed_sand_6.png | Bin 614 -> 609 bytes .../textures/blocks/compressed_sand_7.png | Bin 553 -> 548 bytes .../textures/blocks/conveyor_belt_blank.png | Bin 237 -> 0 bytes .../blocks/conveyor_belt_blank_left.png | Bin 0 -> 174 bytes .../blocks/conveyor_belt_blank_right.png | Bin 0 -> 178 bytes .../textures/blocks/conveyor_belt_down.png | Bin 265 -> 162 bytes .../textures/blocks/conveyor_belt_left.png | Bin 279 -> 174 bytes .../textures/blocks/conveyor_belt_right.png | Bin 278 -> 176 bytes .../textures/blocks/conveyor_belt_up.png | Bin 266 -> 165 bytes .../blocks/crops/ender_lotus_stage_0.png | Bin 205 -> 154 bytes .../blocks/crops/ender_lotus_stage_1.png | Bin 218 -> 165 bytes .../blocks/crops/ender_lotus_stage_2.png | Bin 257 -> 176 bytes .../blocks/crops/ender_lotus_stage_3.png | Bin 292 -> 201 bytes .../blocks/crops/ender_lotus_stage_4.png | Bin 340 -> 224 bytes .../blocks/crops/ender_lotus_stage_5.png | Bin 364 -> 237 bytes .../blocks/crops/ender_lotus_stage_6.png | Bin 385 -> 253 bytes .../blocks/crops/ender_lotus_stage_7.png | Bin 399 -> 266 bytes .../textures/blocks/cursed_earth_side.png | Bin 679 -> 481 bytes .../textures/blocks/cursed_earth_top.png | Bin 1068 -> 1000 bytes .../textures/blocks/decorative_block_0.png | Bin 489 -> 329 bytes .../textures/blocks/decorative_block_1.png | Bin 761 -> 388 bytes .../textures/blocks/decorative_block_10.png | Bin 593 -> 526 bytes .../textures/blocks/decorative_block_11.png | Bin 498 -> 571 bytes .../textures/blocks/decorative_block_2.png | Bin 445 -> 328 bytes .../textures/blocks/decorative_block_3.png | Bin 973 -> 521 bytes .../textures/blocks/decorative_block_4.png | Bin 823 -> 795 bytes .../textures/blocks/decorative_block_5.png | Bin 782 -> 314 bytes .../textures/blocks/decorative_block_6.png | Bin 765 -> 509 bytes .../textures/blocks/decorative_block_7.png | Bin 829 -> 489 bytes .../textures/blocks/decorative_block_8.png | Bin 818 -> 440 bytes .../textures/blocks/decorative_block_9.png | Bin 855 -> 522 bytes .../textures/blocks/drum.png | Bin 375 -> 373 bytes .../textures/blocks/ethereal_glass.png | Bin 118 -> 224 bytes .../textures/blocks/ethereal_glass_dark.png | Bin 202 -> 241 bytes .../blocks/ethereal_glass_dark_inverted.png | Bin 180 -> 134 bytes .../blocks/ethereal_glass_inverted.png | Bin 142 -> 118 bytes .../textures/blocks/floating_block.png | Bin 257 -> 736 bytes .../blocks/generators/ender_generator.png | Bin 179 -> 128 bytes .../generators/ender_generator_plus.png | Bin 245 -> 128 bytes .../generators/ender_generator_plusplus.png | Bin 242 -> 127 bytes .../blocks/generators/food_generator.png | Bin 218 -> 165 bytes .../blocks/generators/food_generator_plus.png | Bin 283 -> 168 bytes .../generators/food_generator_plusplus.png | Bin 281 -> 167 bytes .../blocks/generators/furnace_generator.png | Bin 348 -> 249 bytes .../generators/furnace_generator_plus.png | Bin 264 -> 154 bytes .../generators/furnace_generator_plusplus.png | Bin 264 -> 153 bytes .../high_temperature_furnace_generator.png | Bin 208 -> 157 bytes ...igh_temperature_furnace_generator_plus.png | Bin 264 -> 154 bytes ...temperature_furnace_generator_plusplus.png | Bin 261 -> 153 bytes .../blocks/generators/lava_generator.png | Bin 155 -> 125 bytes .../blocks/generators/lava_generator_plus.png | Bin 269 -> 126 bytes .../generators/lava_generator_plusplus.png | Bin 269 -> 125 bytes .../low_temperature_furnace_generator.png | Bin 193 -> 141 bytes ...low_temperature_furnace_generator_plus.png | Bin 249 -> 139 bytes ...temperature_furnace_generator_plusplus.png | Bin 249 -> 138 bytes .../generators/nether_star_generator.png | Bin 242 -> 173 bytes .../generators/nether_star_generator_plus.png | Bin 307 -> 171 bytes .../nether_star_generator_plusplus.png | Bin 309 -> 170 bytes .../blocks/generators/pink_generator.png | Bin 209 -> 161 bytes .../blocks/generators/pink_generator_plus.png | Bin 288 -> 165 bytes .../generators/pink_generator_plusplus.png | Bin 287 -> 164 bytes .../blocks/generators/potion_generator.png | Bin 346 -> 253 bytes .../generators/potion_generator_plus.png | Bin 275 -> 147 bytes .../generators/potion_generator_plusplus.png | Bin 275 -> 146 bytes .../blocks/generators/redstone_generator.png | Bin 197 -> 161 bytes .../generators/redstone_generator_plus.png | Bin 273 -> 163 bytes .../redstone_generator_plusplus.png | Bin 268 -> 162 bytes .../blocks/generators/solar_generator.png | Bin 352 -> 254 bytes .../generators/solar_generator_plus.png | Bin 254 -> 142 bytes .../generators/solar_generator_plusplus.png | Bin 254 -> 141 bytes .../blocks/generators/tnt_generator.png | Bin 154 -> 124 bytes .../blocks/generators/tnt_generator_plus.png | Bin 239 -> 113 bytes .../generators/tnt_generator_plusplus.png | Bin 239 -> 112 bytes .../textures/blocks/glass_0.png | Bin 123 -> 153 bytes .../textures/blocks/glass_1.png | Bin 175 -> 215 bytes .../textures/blocks/glass_10.png | Bin 162 -> 191 bytes .../textures/blocks/glass_11.png | Bin 132 -> 213 bytes .../textures/blocks/glass_12.png | Bin 0 -> 203 bytes .../textures/blocks/glass_2.png | Bin 148 -> 179 bytes .../textures/blocks/glass_3.png | Bin 230 -> 212 bytes .../textures/blocks/glass_4.png | Bin 122 -> 203 bytes .../textures/blocks/glass_5.png | Bin 231 -> 226 bytes .../textures/blocks/glass_6.png | Bin 137 -> 263 bytes .../textures/blocks/glass_7.png | Bin 231 -> 214 bytes .../textures/blocks/glass_8.png | Bin 209 -> 274 bytes .../textures/blocks/glass_9.png | Bin 148 -> 158 bytes .../textures/blocks/ineffable_glass.png | Bin 0 -> 214 bytes .../blocks/ineffable_glass_inverted.png | Bin 0 -> 224 bytes .../textures/blocks/inverted_block.png | Bin 436 -> 674 bytes .../textures/blocks/inverted_block.png.mcmeta | 11 + .../textures/blocks/lapis_aetherius_0.png | Bin 99 -> 92 bytes .../textures/blocks/lapis_aetherius_1.png | Bin 99 -> 95 bytes .../textures/blocks/lapis_aetherius_10.png | Bin 99 -> 96 bytes .../textures/blocks/lapis_aetherius_11.png | Bin 99 -> 94 bytes .../textures/blocks/lapis_aetherius_12.png | Bin 99 -> 95 bytes .../textures/blocks/lapis_aetherius_13.png | Bin 99 -> 94 bytes .../textures/blocks/lapis_aetherius_14.png | Bin 99 -> 95 bytes .../textures/blocks/lapis_aetherius_15.png | Bin 99 -> 94 bytes .../textures/blocks/lapis_aetherius_2.png | Bin 99 -> 96 bytes .../textures/blocks/lapis_aetherius_3.png | Bin 99 -> 94 bytes .../textures/blocks/lapis_aetherius_4.png | Bin 99 -> 96 bytes .../textures/blocks/lapis_aetherius_5.png | Bin 99 -> 92 bytes .../textures/blocks/lapis_aetherius_6.png | Bin 99 -> 96 bytes .../textures/blocks/lapis_aetherius_7.png | Bin 99 -> 95 bytes .../textures/blocks/lapis_aetherius_8.png | Bin 99 -> 96 bytes .../textures/blocks/lapis_aetherius_9.png | Bin 99 -> 95 bytes .../textures/blocks/magic_wood.png | Bin 617 -> 453 bytes .../blocks/models/bedrockium_drum.png | Bin 0 -> 810 bytes .../textures/blocks/models/chandelier.png | Bin 0 -> 2086 bytes .../blocks/models/chandelier_copper.png | Bin 0 -> 2084 bytes .../blocks/models/chandelier_redstone.png | Bin 0 -> 2079 bytes .../blocks/models/chandelier_soul.png | Bin 0 -> 2079 bytes .../textures/blocks/models/diamond_spike.png | Bin 243 -> 3523 bytes .../textures/blocks/models/drum.png | Bin 0 -> 672 bytes .../textures/blocks/models/giga_torch.png | Bin 0 -> 193 bytes .../textures/blocks/models/gold_spike.png | Bin 242 -> 3447 bytes .../textures/blocks/models/iron_spike.png | Bin 243 -> 2753 bytes .../blocks/models/trash_can_energy.png | Bin 1331 -> 797 bytes .../blocks/models/trash_can_fluid.png | Bin 1286 -> 796 bytes .../textures/blocks/models/trash_can_item.png | Bin 1228 -> 794 bytes .../textures/blocks/models/wood_spike.png | Bin 759 -> 3355 bytes .../textures/blocks/pacifists_bench.png | Bin 211 -> 172 bytes .../textures/blocks/pure_love.png | Bin 4889 -> 4882 bytes .../textures/blocks/rain_muffler.png | Bin 4947 -> 4769 bytes .../textures/blocks/redstone_clock.png | Bin 525 -> 0 bytes .../textures/blocks/redstone_clock_active.png | Bin 0 -> 410 bytes .../blocks/redstone_clock_inactive.png | Bin 0 -> 419 bytes .../textures/blocks/scaled_chest_side.png | Bin 924 -> 920 bytes .../textures/blocks/scaled_chest_top.png | Bin 975 -> 955 bytes .../textures/blocks/smart_pump.png | Bin 214 -> 504 bytes .../textures/blocks/smart_pump_top.png | Bin 0 -> 427 bytes .../textures/blocks/sound_muffler.png | Bin 4774 -> 4664 bytes .../textures/blocks/temporal_gate.png | Bin 238 -> 0 bytes .../textures/blocks/temporal_gate_bottom.png | Bin 0 -> 335 bytes .../textures/blocks/temporal_gate_east.png | Bin 0 -> 337 bytes .../textures/blocks/temporal_gate_north.png | Bin 0 -> 335 bytes .../textures/blocks/temporal_gate_south.png | Bin 0 -> 338 bytes .../textures/blocks/temporal_gate_top.png | Bin 0 -> 335 bytes .../textures/blocks/temporal_gate_west.png | Bin 0 -> 338 bytes .../textures/blocks/trading_post_bottom.png | Bin 627 -> 393 bytes .../textures/blocks/trading_post_side.png | Bin 724 -> 474 bytes .../textures/blocks/trading_post_top.png | Bin 702 -> 609 bytes .../textures/blocks/trash_can_energy.png | Bin 330 -> 195 bytes .../textures/blocks/trash_can_fluid.png | Bin 398 -> 388 bytes .../textures/blocks/trash_can_item.png | Bin 398 -> 388 bytes .../textures/gui/progress_energy.png | Bin 187 -> 166 bytes .../textures/gui/trade_highlight.png | Bin 120 -> 106 bytes .../textures/gui/vanilla_search.png | Bin 139 -> 118 bytes .../items/anti_particulate_shovel.png | Bin 159 -> 332 bytes .../textures/items/architects_wand.png | Bin 272 -> 378 bytes .../textures/items/bedrockium_ingot.png | Bin 370 -> 239 bytes .../textures/items/block_analyzer.png | Bin 163 -> 161 bytes .../textures/items/destruction_pickaxe.png | Bin 196 -> 370 bytes .../textures/items/ender_lotus_seed.png | Bin 241 -> 169 bytes .../textures/items/etheric_sword.png | Bin 201 -> 394 bytes .../textures/items/fire_battery.png | Bin 326 -> 238 bytes .../textures/items/fire_battery_bg.png | Bin 163 -> 131 bytes .../textures/items/fire_battery_overlay_0.png | Bin 226 -> 173 bytes .../textures/items/fire_battery_overlay_1.png | Bin 241 -> 187 bytes .../textures/items/fire_battery_overlay_2.png | Bin 251 -> 197 bytes .../textures/items/fire_battery_overlay_3.png | Bin 265 -> 201 bytes .../textures/items/fire_battery_overlay_4.png | Bin 256 -> 208 bytes .../textures/items/fire_battery_overlay_5.png | Bin 268 -> 219 bytes .../textures/items/glove.png | Bin 222 -> 210 bytes .../textures/items/glove_bottom.png | Bin 120 -> 128 bytes .../textures/items/glove_model.png | Bin 257 -> 201 bytes .../textures/items/glove_top.png | Bin 198 -> 190 bytes .../textures/items/gluttons_axe.png | Bin 281 -> 0 bytes .../textures/items/golden_bag.png | Bin 454 -> 182 bytes .../textures/items/gourmands_axe.png | Bin 0 -> 353 bytes .../textures/items/heavenly_ring.0.png | Bin 229 -> 0 bytes .../textures/items/heavenly_ring.wing.1.png | Bin 295 -> 0 bytes .../textures/items/heavenly_ring_dragon.png | Bin 0 -> 404 bytes .../items/heavenly_ring_dragon.wing.0.png | Bin 0 -> 591 bytes .../items/heavenly_ring_dragon.wing.1.png | Bin 0 -> 752 bytes .../items/heavenly_ring_dragon.wing.2.png | Bin 0 -> 1027 bytes .../items/heavenly_ring_dragon.wing.3.png | Bin 0 -> 842 bytes .../items/heavenly_ring_dragon.wing.4.png | Bin 0 -> 873 bytes .../items/heavenly_ring_dragon.wing.5.png | Bin 0 -> 980 bytes .../items/heavenly_ring_dragon.wing.6.png | Bin 0 -> 843 bytes .../items/heavenly_ring_dragon.wing.7.png | Bin 0 -> 876 bytes .../textures/items/heavenly_ring_fairy.png | Bin 0 -> 473 bytes .../items/heavenly_ring_fairy.wing.0.png | Bin 0 -> 867 bytes .../items/heavenly_ring_fairy.wing.1.png | Bin 0 -> 853 bytes .../items/heavenly_ring_fairy.wing.2.png | Bin 0 -> 873 bytes .../items/heavenly_ring_fairy.wing.3.png | Bin 0 -> 896 bytes .../items/heavenly_ring_fairy.wing.4.png | Bin 0 -> 702 bytes .../items/heavenly_ring_fairy.wing.5.png | Bin 0 -> 1096 bytes .../items/heavenly_ring_fairy.wing.6.png | Bin 0 -> 826 bytes .../items/heavenly_ring_fairy.wing.7.png | Bin 0 -> 897 bytes .../textures/items/heavenly_ring_feather.png | Bin 0 -> 277 bytes .../items/heavenly_ring_feather.wing.0.png | Bin 0 -> 485 bytes .../items/heavenly_ring_feather.wing.1.png | Bin 0 -> 716 bytes .../items/heavenly_ring_feather.wing.2.png | Bin 0 -> 807 bytes .../items/heavenly_ring_feather.wing.3.png | Bin 0 -> 701 bytes .../items/heavenly_ring_feather.wing.4.png | Bin 0 -> 871 bytes .../items/heavenly_ring_feather.wing.5.png | Bin 0 -> 609 bytes .../items/heavenly_ring_feather.wing.6.png | Bin 0 -> 820 bytes .../items/heavenly_ring_feather.wing.7.png | Bin 0 -> 885 bytes .../textures/items/heavenly_ring_magic.png | Bin 0 -> 201 bytes .../items/heavenly_ring_magic.wing.0.png | Bin 0 -> 104 bytes .../items/heavenly_ring_magic.wing.1.png | Bin 0 -> 346 bytes .../items/heavenly_ring_magic.wing.2.png | Bin 0 -> 822 bytes .../items/heavenly_ring_magic.wing.3.png | Bin 0 -> 852 bytes .../items/heavenly_ring_magic.wing.4.png | Bin 0 -> 408 bytes .../items/heavenly_ring_magic.wing.5.png | Bin 0 -> 1028 bytes .../items/heavenly_ring_magic.wing.6.png | Bin 0 -> 791 bytes .../items/heavenly_ring_magic.wing.7.png | Bin 0 -> 686 bytes .../textures/items/heavenly_ring_metal.png | Bin 0 -> 430 bytes .../items/heavenly_ring_metal.wing.0.png | Bin 0 -> 477 bytes .../items/heavenly_ring_metal.wing.1.png | Bin 0 -> 843 bytes .../items/heavenly_ring_metal.wing.2.png | Bin 0 -> 523 bytes .../items/heavenly_ring_metal.wing.3.png | Bin 0 -> 691 bytes .../items/heavenly_ring_metal.wing.4.png | Bin 0 -> 690 bytes .../items/heavenly_ring_metal.wing.5.png | Bin 0 -> 497 bytes .../items/heavenly_ring_metal.wing.6.png | Bin 0 -> 670 bytes .../items/heavenly_ring_metal.wing.7.png | Bin 0 -> 1139 bytes .../textures/items/inversion_sigil_active.png | Bin 810 -> 484 bytes .../items/inversion_sigil_inactive.png | Bin 350 -> 236 bytes .../textures/items/inverted_ingot.png | Bin 364 -> 442 bytes .../textures/items/inverted_ingot_stable.png | Bin 395 -> 566 bytes .../textures/items/inverted_nugget.png | Bin 197 -> 182 bytes .../textures/items/mob_jar.png | Bin 156 -> 137 bytes .../textures/items/mob_jar_full.png | Bin 349 -> 233 bytes .../textures/items/precision_shears.png | Bin 200 -> 379 bytes .../items/precision_shears_cooldown.png | Bin 176 -> 414 bytes .../textures/items/pseudo_inversion_sigil.png | Bin 1024 -> 1019 bytes .../textures/items/reversing_hoe.png | Bin 157 -> 358 bytes .../textures/items/super_architects_wand.png | Bin 266 -> 377 bytes .../textures/items/watering_can_advanced.png | Bin 346 -> 255 bytes .../textures/items/watering_can_basic.png | Bin 1832 -> 1716 bytes .../textures/items/watering_can_elite.png | Bin 351 -> 254 bytes .../textures/items/xray_glasses.png | Bin 201 -> 188 bytes .../textures/items/xray_glasses_model.png | Bin 322 -> 225 bytes 1462 files changed, 5974 insertions(+), 611 deletions(-) create mode 100644 .github/workflows/optimize-images.yml create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockAdvancedUpdateDetector.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockChandelier.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockGigaTorch.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/MobDenySpawnEvents.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/{ItemGluttonsAxe.java => ItemGourmandsAxe.java} (77%) delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/SpikeRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityAdvancedBlockUpdateDetector.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityChandelier.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityGigaTorch.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPItems.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPRecipeLoader.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/ConnectablePart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/Content.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/FencePart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/MaterialBasedPart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/PipeCoverPart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/SpherePart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipartItem.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/WallPart.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartFenceRenderingHelper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartWallRenderingHelper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/SphereRenderingHelper.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/item/ItemUEMultiPartRenderer.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/util/CuboidUtils.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/ExuCompat.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/Remappings.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/DummyBlock.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/IPosteaTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/AbstractBlockTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/CompressedBlocksTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/ConveyorTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/DarkPortalTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/DecoBlock1Transformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/EnderLilyTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/SoundMufflerTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/TrashCanTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/AbstractItemTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/DivisionSigilTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/GoldenBagTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/GoldenLassoTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/UnstableIngotTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/WateringCanTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/AbstractTileEntityTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/FullChestTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/GeneratorTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/MiniChestTransformation.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/SpikeTransformation.java rename src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/{GluttonsAxeConfig.java => GourmandsAxeConfig.java} (95%) delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsSelection.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java create mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MovingObjectPositionUtil.java delete mode 100644 src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/decorative_1.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/decorative_10.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/decorative_11.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/decorative_2.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/decorative_4.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/decorative_5.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/decorative_6.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/decorative_7.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/decorative_8.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/decorative_9.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/ethereal_glass_dark.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/glass_5.properties create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/0.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/1.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/10.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/11.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/12.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/13.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/14.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/15.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/16.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/17.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/18.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/19.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/2.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/20.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/21.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/22.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/23.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/24.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/25.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/26.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/27.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/28.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/29.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/3.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/30.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/31.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/32.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/33.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/34.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/35.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/36.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/37.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/38.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/39.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/4.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/40.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/41.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/42.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/43.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/44.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/45.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/46.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/5.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/6.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/7.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/8.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/9.png create mode 100644 src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/ineffable_glass.properties create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/chandelier.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/diamond_spike.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/drum.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/giga_torch.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/gold_spike.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/iron_spike.json create mode 100644 src/main/resources/assets/utilitiesinexcess/blockstates/wood_spike.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_copper.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_redstone.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_soul.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/diamond_spike.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/drum.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/giga_torch.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/gold_spike.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/iron_spike.json create mode 100644 src/main/resources/assets/utilitiesinexcess/models/blocks/wood_spike.json create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_active.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_inactive.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector_active.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector_inactive.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_left.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_right.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_12.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass_inverted.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png.mcmeta create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/bedrockium_drum.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_copper.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_redstone.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_soul.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/drum.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/models/giga_torch.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock_active.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock_inactive.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/smart_pump_top.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_bottom.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_east.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_north.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_south.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_top.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_west.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/gluttons_axe.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/gourmands_axe.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.0.png delete mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.7.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.0.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.1.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.2.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.3.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.4.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.5.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.6.png create mode 100644 src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.7.png diff --git a/.github/workflows/optimize-images.yml b/.github/workflows/optimize-images.yml new file mode 100644 index 00000000..0ebed016 --- /dev/null +++ b/.github/workflows/optimize-images.yml @@ -0,0 +1,17 @@ +name: Optimize images + +on: + pull_request: + branches: [ master, main, release/** ] + paths: + - "**/*.png" + + push: + branches: [ master, main, release/** ] + paths: + - "**/*.png" + +jobs: + optimize-images: + uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/optimize-images.yml@master + secrets: inherit \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index b6556ace..2dc154d3 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -34,9 +34,9 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { - implementation("com.github.GTNewHorizons:GTNHLib:0.8.32:dev") compileOnly('org.jetbrains:annotations:26.0.1') + implementation("com.github.GTNewHorizons:GTNHLib:0.9.40:dev") // TODO: remove MUI1 dep when the implicit dependency // TODO: in IItemHandlerModifiable is removed api("com.github.GTNewHorizons:ModularUI:1.3.1:dev") @@ -44,22 +44,21 @@ dependencies { api("com.github.GTNewHorizons:CraftTweaker:3.4.2:dev") api('curse.maven:cofh-lib-220333:2388748') compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev') - compileOnly('com.github.GTNewHorizons:Angelica:1.0.0-beta68a:dev') + compileOnly('com.github.GTNewHorizons:Angelica:2.1.16:dev') compileOnly("com.github.GTNewHorizons:FindIt:1.4.0:dev") compileOnly('com.github.GTNewHorizons:TinkersConstruct:1.14.14-GTNH:dev') + compileOnly('com.github.GTNewHorizons:ForgeMultipart:1.7.2:dev') {transitive = false} + compileOnly("com.github.GTNewHorizons:Backhand:1.8.2:dev") + compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.52.296:dev') + api("com.github.GTNewHorizons:Postea:1.1.5:dev") devOnlyNonPublishable("com.github.GTNewHorizons:Baubles-Expanded:2.2.4-GTNH:dev") devOnlyNonPublishable("io.github.legacymoddingmc:unimixins:0.1.23:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.40-GTNH:dev") - runtimeOnlyNonPublishable("com.github.GTNewHorizons:WAILAPlugins:0.7.2:dev") { transitive = false } api("com.github.GTNewHorizons:waila:1.9.15:dev") { transitive = false } - // For testing NBT data (/nbtedit) - runtimeOnlyNonPublishable("com.github.GTNewHorizons:ServerUtilities:2.2.6:dev") - // For debugging chunkloading (/chunkloaders) runtimeOnlyNonPublishable('curse.maven:chicken-chunks-229316:2233250') // Testing performance with void quarry inserts @@ -69,7 +68,15 @@ dependencies { runtimeOnlyNonPublishable('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-789-GTNH:dev') { transitive = true } runtimeOnlyNonPublishable("com.github.GTNewHorizons:spark:v0.0.16-pre:fat-dev") + // Misc testing utilities + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:ServerUtilities:2.2.6:dev") // (/nbtedit) + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:worldedit-gtnh:v0.0.8:dev") + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:waila:1.9.15:dev") // For testing glove // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Translocators:1.4.0:dev") // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Backhand:1.8.2:dev") + + // For testing trowel + wand + // runtimeOnlyNonPublishable("com.github.GTNewHorizons:Backhand:1.8.2:dev") + // runtimeOnlyNonPublishable('com.github.GTNewHorizons:GT5-Unofficial:5.09.52.296:dev') } diff --git a/gradle.properties b/gradle.properties index cf8e9f11..825b7047 100644 --- a/gradle.properties +++ b/gradle.properties @@ -82,7 +82,7 @@ usesMixins = true separateMixinSourceSet = # Adds some debug arguments like verbose output and class export. -usesMixinDebug = false +usesMixinDebug = true # Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise. mixinPlugin = diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java index 01c096bf..4d7db4e4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ClientProxy.java @@ -14,6 +14,8 @@ import com.fouristhenumber.utilitiesinexcess.common.renderers.GloveRenderer; import com.fouristhenumber.utilitiesinexcess.common.renderers.InvertedIngotRenderer; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPItems; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.item.ItemUEMultiPartRenderer; import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.compat.findit.FindItHelper; import com.fouristhenumber.utilitiesinexcess.compat.waila.TTRenderUIETimeLeftBar; @@ -48,6 +50,9 @@ public void init(FMLInitializationEvent event) { if (ModItems.INVERTED_NUGGET.isEnabled()) { MinecraftForgeClient.registerItemRenderer(ModItems.INVERTED_INGOT.get(), new InvertedIngotRenderer()); } + if (Mods.ForgeMicroBlock.isLoaded()) { + MinecraftForgeClient.registerItemRenderer(FMPItems.UE_MULTI_PART.get(), new ItemUEMultiPartRenderer()); + } if (ModBlocks.UNDERWORLD_PORTAL.isEnabled()) { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPortalUnderWorld.class, new TESRUnderworldPortal()); RenderingRegistry.registerBlockHandler(ISBRHUnderworldPortal.INSTANCE); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java index c1ce9633..88a681c0 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/CommonProxy.java @@ -5,11 +5,16 @@ import com.fouristhenumber.utilitiesinexcess.client.IMCForNEI; import com.fouristhenumber.utilitiesinexcess.common.dimensions.endoftime.EndOfTimeEvents; import com.fouristhenumber.utilitiesinexcess.common.dimensions.underworld.UnderWorldEvents; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPItems; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content; import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.fouristhenumber.utilitiesinexcess.compat.exu.Remappings; import com.fouristhenumber.utilitiesinexcess.compat.tinkers.TinkersCompat; import com.fouristhenumber.utilitiesinexcess.config.OtherConfig; import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; import com.fouristhenumber.utilitiesinexcess.utils.SoundVolumeChecks; +import com.gtnewhorizon.gtnhlib.datastructs.space.ArrayProximityCheck4D; +import com.gtnewhorizon.gtnhlib.datastructs.space.VolumeShape; import com.gtnewhorizon.gtnhlib.keybind.SyncedKeybind; import cpw.mods.fml.common.event.FMLInitializationEvent; @@ -21,6 +26,7 @@ public class CommonProxy { public SoundVolumeChecks soundVolumeChecks; + public ArrayProximityCheck4D mobSpawnBlockChecks = new ArrayProximityCheck4D(VolumeShape.CUBE); public SyncedKeybind GLOVE_KEYBIND; @@ -38,6 +44,12 @@ public void preInit(FMLPreInitializationEvent event) { if (Mods.NEI.isLoaded()) { IMCForNEI.IMCSender(); } + if (OtherConfig.enableWorldConversion && !Mods.ExtraUtilities.isLoaded() && Mods.Postea.isLoaded()) { + Remappings.preInit(); + } + if (Mods.ForgeMicroBlock.isLoaded()) { + FMPItems.init(); + } } public void init(FMLInitializationEvent event) { @@ -53,9 +65,15 @@ public void init(FMLInitializationEvent event) { } public void postInit(FMLPostInitializationEvent event) { + if (OtherConfig.enableWorldConversion && !Mods.ExtraUtilities.isLoaded() && Mods.Postea.isLoaded()) { + Remappings.postInit(); + } if (Mods.Tinkers.isLoaded() && OtherConfig.enableTinkersIntegration) { TinkersCompat.init(); } + if (Mods.ForgeMicroBlock.isLoaded()) { + new Content().init(); + } } public void serverStarting(FMLServerStartingEvent event) {} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 7aeda606..bf32aedd 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -6,8 +6,10 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockAdvancedUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBedrockium; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockBlackoutCurtains; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockChandelier; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockColored; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockCompressed; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockConveyor; @@ -18,6 +20,7 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEnderLotus; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockEtherealGlass; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockFloating; +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockGigaTorch; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockInverted; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockLapisAetherius; import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockMagicWood; @@ -143,6 +146,7 @@ public enum ModBlocks { NETHER_STAR_GENERATOR_PLUS(GeneratorConfig.enableNetherStarGenerator, new BlockNetherStarGenerator("nether_star_generator_plus", 8), "nether_star_generator_plus"), NETHER_STAR_GENERATOR_PLUSPLUS(GeneratorConfig.enableNetherStarGenerator, new BlockNetherStarGenerator("nether_star_generator_plusplus", 64), "nether_star_generator_plusplus"), BLOCK_UPDATE_DETECTOR(BlockConfig.enableBlockUpdateDetector, new BlockUpdateDetector(), "block_update_detector"), + ADVANCED_BLOCK_UPDATE_DETECTOR(BlockConfig.enableBlockUpdateDetector, new BlockAdvancedUpdateDetector(), "advanced_block_update_detector"), ENDER_LOTUS(EnderLotusConfig.enableEnderLotus, new BlockEnderLotus(), null, "ender_lotus"), BLACKOUT_CURTAINS(BlockConfig.enableBlackoutCurtains, new BlockBlackoutCurtains(), "blackout_curtains"), CONVEYOR(BlockConfig.enableConveyor, new BlockConveyor(), BlockConveyor.ItemBlockConveyor.class, "conveyor"), @@ -157,6 +161,8 @@ public enum ModBlocks { SMART_PUMP(BlockConfig.enableSmartPump, new BlockSmartPump(), "smart_pump"), TRADING_POST(BlockConfig.enableTradingPost, new BlockTradingPost(), "trading_post"), DECORATIVE_BLOCKS(BlockConfig.enableDecorativeBlocks, new BlockDecorative(), BlockDecorative.ItemBlockDecorative.class, "decorative_block"), + CHANDELIER(BlockConfig.chandelier.enableChandelier, new BlockChandelier(), BlockChandelier.ItemBlockChandelier.class, "chandelier"), + GIGA_TORCH(BlockConfig.gigaTorch.enableGigaTorch, new BlockGigaTorch(), BlockGigaTorch.ItemBlockGigaTorch.class, "giga_torch"), VOID_QUARRY(VoidQuarryConfig.enableVoidQuarry, new BlockVoidQuarry(), "void_quarry"), VOID_MARKER(VoidQuarryConfig.enableVoidQuarry, new BlockVoidMarker(), "void_marker"), VOID_QUARRY_UPGRADE(VoidQuarryConfig.enableVoidQuarry, new BlockVoidQuarryUpgrade(), BlockVoidQuarryUpgrade.ItemVoidQuarryUpgrade.class, "void_quarry_upgrade"), diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java index 0c115772..3ea2a521 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java @@ -23,7 +23,7 @@ import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemAntiParticulateShovel; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemDestructionPickaxe; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemEthericSword; -import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGluttonsAxe; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGourmandsAxe; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemPrecisionShears; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemReversingHoe; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderLotusConfig; @@ -34,7 +34,7 @@ import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.AntiParticulateShovelConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.EthericSwordConfig; -import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GluttonsAxeConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GourmandsAxeConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.PrecisionShearsConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig; @@ -45,13 +45,17 @@ public enum ModItems { // spotless:off // make sure to leave a trailing comma - GLUTTONS_AXE(GluttonsAxeConfig.enable, new ItemGluttonsAxe(), "gluttons_axe"), + GOURMANDS_AXE(GourmandsAxeConfig.enable, new ItemGourmandsAxe(), "gourmands_axe"), DESTRUCTION_PICKAXE(DestructionPickaxeConfig.enable, new ItemDestructionPickaxe(), "destruction_pickaxe"), ANTI_PARTICULATE_SHOVEL(AntiParticulateShovelConfig.enable, new ItemAntiParticulateShovel(), "anti_particulate_shovel"), PRECISION_SHEARS(PrecisionShearsConfig.enable, new ItemPrecisionShears(), "precision_shears"), ETHERIC_SWORD(EthericSwordConfig.enable, new ItemEthericSword(), "etheric_sword"), REVERSING_HOE(ReversingHoeConfig.enable, new ItemReversingHoe(), "reversing_hoe"), - HEAVENLY_RING(ItemConfig.enableHeavenlyRing, new ItemHeavenlyRing(), "heavenly_ring"), + HEAVENLY_RING_FEATHER(ItemConfig.enableHeavenlyRing, new ItemHeavenlyRing("feather", 8), "heavenly_ring_feather"), + HEAVENLY_RING_DRAGON(ItemConfig.enableHeavenlyRing, new ItemHeavenlyRing("dragon", 8), "heavenly_ring_dragon"), + HEAVENLY_RING_FAIRY(ItemConfig.enableHeavenlyRing, new ItemHeavenlyRing("fairy", 8), "heavenly_ring_fairy"), + HEAVENLY_RING_METAL(ItemConfig.enableHeavenlyRing, new ItemHeavenlyRing("metal", 8), "heavenly_ring_metal"), + HEAVENLY_RING_MAGIC(ItemConfig.enableHeavenlyRing, new ItemHeavenlyRing("magic", 8), "heavenly_ring_magic"), MOB_JAR(ItemConfig.enableMobJar, new ItemMobJar(), "mob_jar"), WATERING_CAN_BASIC(WateringCanConfig.wateringCan.Tier.enableWateringCanBasic, new ItemWateringCan(1,3), "watering_can_basic"), WATERING_CAN_ADVANCED(WateringCanConfig.wateringCan.Tier.enableWateringCanAdvanced, new ItemWateringCan(2,5), "watering_can_advanced"), @@ -70,7 +74,6 @@ public enum ModItems { XRAY_GLASSES(ItemConfig.enableXRayGlasses, new ItemXRayGlasses(ItemArmor.ArmorMaterial.IRON, 0, 0), "xray_glasses"), BLOCK_ANALYZER(ItemConfig.enableBlockAnalyzer, new ItemAnalyzer(), "block_analyzer"), GLOVE(ItemConfig.enableGlove, new ItemGlove(), "glove"), - ; // leave trailing semicolon // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java index e9f2b9b9..0804368d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModTileEntities.java @@ -2,9 +2,12 @@ import net.minecraft.tileentity.TileEntity; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityAdvancedBlockUpdateDetector; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityBlockUpdateDetector; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityChandelier; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityConveyor; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityGigaTorch; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityMarginallyMaximisedChest; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPacifistsBench; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPortalUnderWorld; @@ -69,6 +72,9 @@ public enum ModTileEntities { GENERATOR_NETHER_STAR(TileEntityNetherStarGenerator.class , "NetherStarGenerator"), PACIFISTS_BENCH(TileEntityPacifistsBench.class , "PacifistsBench"), TRADING_POST(TileEntityTradingPost.class , "TradingPost"), + ADVANCED_BLOCK_UPDATE_DETECTOR(TileEntityAdvancedBlockUpdateDetector.class , "AdvancedBlockUpdateDetector"), + PENDANT_LIGHT(TileEntityChandelier.class , "PendantLight"), + GIGA_TORCH(TileEntityGigaTorch.class , "GigaTorch"), VOID_QUARRY(TileEntityVoidQuarry.class , "VoidQuarry"), VOID_MARKER(TileEntityVoidMarker.class , "VoidMarker"), ; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index c4a4a62a..f39ee7b7 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -15,10 +15,12 @@ import com.fouristhenumber.utilitiesinexcess.common.recipe.RecipeLoader; import com.fouristhenumber.utilitiesinexcess.common.renderers.BlackoutCurtainsRenderer; import com.fouristhenumber.utilitiesinexcess.common.renderers.LapisAetheriusRenderer; -import com.fouristhenumber.utilitiesinexcess.common.renderers.SpikeRenderer; import com.fouristhenumber.utilitiesinexcess.common.worldgen.WorldGenEnderLotus; import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.compat.crafttweaker.QEDCraftTweakerSupport; +import com.fouristhenumber.utilitiesinexcess.compat.exu.ExuCompat; +import com.fouristhenumber.utilitiesinexcess.compat.exu.Remappings; +import com.fouristhenumber.utilitiesinexcess.config.OtherConfig; import com.fouristhenumber.utilitiesinexcess.utils.FMLEventHandler; import com.fouristhenumber.utilitiesinexcess.utils.ForgeEventHandler; import com.fouristhenumber.utilitiesinexcess.utils.PinkFuelHelper; @@ -30,6 +32,7 @@ import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLMissingMappingsEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; @@ -41,7 +44,7 @@ version = Tags.VERSION, name = "UtilitiesInExcess", acceptedMinecraftVersions = "[1.7.10]", - dependencies = "required-after:gtnhlib@[0.6.31,);after:Waila;") + dependencies = "required-after:gtnhlib@[0.9.9,);after:ForgeMicroblock;after:Waila;") public class UtilitiesInExcess { public static final String MODID = "utilitiesinexcess"; @@ -52,7 +55,6 @@ public class UtilitiesInExcess { public static int lapisAetheriusRenderID; public static int blackoutCurtainsRenderID; - public static int spikeRenderID; @SidedProxy( clientSide = "com.fouristhenumber.utilitiesinexcess.ClientProxy", @@ -65,7 +67,6 @@ public static void chat(String text) { @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { - proxy.preInit(event); } @@ -80,12 +81,14 @@ public void init(FMLInitializationEvent event) { .bus() .register(new FMLEventHandler()); + if (OtherConfig.enableWorldConversion && !Mods.ExtraUtilities.isLoaded() && Mods.Postea.isLoaded()) { + Remappings.init(); + } + lapisAetheriusRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new LapisAetheriusRenderer()); blackoutCurtainsRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new BlackoutCurtainsRenderer()); - spikeRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new SpikeRenderer()); GameRegistry.registerWorldGenerator(new WorldGenEnderLotus(), 10); @@ -145,11 +148,16 @@ public Item getTabIconItem() { .getItem(); } - public static final ItemStack ICON_ITEM = new ItemStack(ModItems.GLUTTONS_AXE.get()); + public static final ItemStack ICON_ITEM = new ItemStack(ModItems.GOURMANDS_AXE.get()); @Override public ItemStack getIconItemStack() { return ICON_ITEM; } }; + + @Mod.EventHandler + public void onMissingMappings(FMLMissingMappingsEvent event) { + ExuCompat.onMissingMappings(event); + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java index 40d8437a..e92777c3 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/client/IMCForNEI.java @@ -31,16 +31,25 @@ public static void IMCSender() { sendInfoPage("utilitiesinexcess:inverted_ingot", "nei.infopage.uie.ticon_inverted"); } - sendInfoPage("", "nei.infopage.uie.gluttons_axe.1"); + sendInfoPage("", "nei.infopage.uie.gourmands_axe.1"); sendInfoPage("", "nei.infopage.uie.destruction_pickaxe.1"); sendInfoPage("", "nei.infopage.uie.anti_particulate_shovel.1"); sendInfoPage("", "nei.infopage.uie.precision_shears.1"); sendInfoPage("", "nei.infopage.uie.etheric_sword.1"); sendInfoPage("", "nei.infopage.uie.reversing_hoe.1"); + sendInfoPage( ",", "nei.infopage.uie.architects_wand.1"); + if (Mods.Backhand.isLoaded()) { + sendInfoPage( + ",", + "nei.infopage.uie.architects_wand.2"); + if (Mods.GT.isLoaded()) sendInfoPage( + ",", + "nei.infopage.uie.architects_wand.3"); + } sendInfoPage("", "nei.infopage.uie.mob_jar.1"); sendInfoPage("utilitiesinexcess:glove", "nei.infopage.uie.glove.1"); @@ -70,6 +79,9 @@ public static void IMCSender() { sendInfoPage("", "nei.infopage.uie.drum.1"); sendInfoPage("", "nei.infopage.uie.block_update_detector.1"); + sendInfoPage( + "", + "nei.infopage.uie.advanced.block_update_detector.1"); sendInfoPage("", "nei.infopage.uie.rain_muffler.1"); sendInfoPage("", "nei.infopage.uie.sound_muffler.1"); @@ -86,9 +98,13 @@ public static void IMCSender() { "nei.infopage.uie.watering_can.1"); if (Mods.Baubles.isLoaded()) { - sendInfoPage("", "nei.infopage.uie.heavenly_ring.2"); + sendInfoPage( + ",,,,", + "nei.infopage.uie.heavenly_ring.2"); } else { - sendInfoPage("", "nei.infopage.uie.heavenly_ring.1"); + sendInfoPage( + ",,,,", + "nei.infopage.uie.heavenly_ring.1"); } sendInfoPage("", "nei.infopage.uie.trash_can_item.1"); @@ -155,9 +171,13 @@ public static void IMCSender() { sendInfoPage("", "nei.infopage.uie.temporal_gate.4"); sendInfoPage("", "nei.infopage.uie.temporal_gate.5"); - sendInfoPage("", "nei.infopage.uie.ethereal_glass.0"); + sendInfoPage( + ",", + "nei.infopage.uie.ethereal_glass.0"); sendInfoPage("", "nei.infopage.uie.ethereal_glass.2"); - sendInfoPage("", "nei.infopage.uie.ethereal_glass.3"); + sendInfoPage( + ",", + "nei.infopage.uie.ethereal_glass.3"); sendInfoPage("", "nei.infopage.uie.ethereal_glass.5"); sendInfoPage( @@ -183,6 +203,8 @@ public static void IMCSender() { sendInfoPage("", "nei.infopage.uie.underworld_portal.2"); sendInfoPage("", "nei.infopage.uie.underworld_portal.3"); + sendInfoPage("", "nei.infopage.uie.chandelier.1"); + sendInfoPage("", "nei.infopage.uie.giga_torch.1"); sendInfoPage("", "nei.infopage.uie.trading_post.1"); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockAdvancedUpdateDetector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockAdvancedUpdateDetector.java new file mode 100644 index 00000000..89bbe5d5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockAdvancedUpdateDetector.java @@ -0,0 +1,83 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static net.minecraft.util.Facing.facings; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityAdvancedBlockUpdateDetector; + +public class BlockAdvancedUpdateDetector extends BlockContainer { + + private IIcon iconInactive; + private IIcon iconActive; + + public BlockAdvancedUpdateDetector() { + super(Material.rock); + setBlockName("advanced_block_update_detector"); + setHardness(1.0F); + setHarvestLevel("pickaxe", 0); + } + + @Override + public void registerBlockIcons(IIconRegister reg) { + iconInactive = reg.registerIcon("utilitiesinexcess:advanced_block_update_detector_inactive"); + iconActive = reg.registerIcon("utilitiesinexcess:advanced_block_update_detector_active"); + } + + @Override + public IIcon getIcon(int side, int meta) { + boolean active = (meta) == 1; + return active ? iconActive : iconInactive; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityAdvancedBlockUpdateDetector(); + } + + @Override + public boolean canProvidePower() { + return true; + } + + @Override + public int isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int side) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof TileEntityAdvancedBlockUpdateDetector tileABUD) { + return tileABUD.getOutputPower(); + } + return 0; + } + + @Override + public boolean isNormalCube(IBlockAccess world, int x, int y, int z) { + return true; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (!player.isSneaking()) { + return false; + } + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof TileEntityAdvancedBlockUpdateDetector tileABUD) { + tileABUD.toggleFace(side); + player.addChatMessage( + new ChatComponentTranslation( + "chat.tile.advanced_block_update_detector.toggle", + facings[side], + tileABUD.getScanning(side))); + return true; + } + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockChandelier.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockChandelier.java new file mode 100644 index 00000000..9ee215a4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockChandelier.java @@ -0,0 +1,118 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static net.minecraftforge.common.util.ForgeDirection.*; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityChandelier; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockChandelier extends BlockContainer { + + public BlockChandelier() { + super(Material.circuits); + setBlockName("chandelier"); + setHardness(0.0F); + setLightLevel(0.9375F); // 15 light level + setStepSound(soundTypeWood); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityChandelier(); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World worldIn, int x, int y, int z) { + return null; + } + + @Override + public boolean canPlaceBlockAt(World worldIn, int x, int y, int z) { + return worldIn.isSideSolid(x, y + 1, z, DOWN); + } + + @Override + public boolean canPlaceBlockOnSide(World worldIn, int x, int y, int z, int side) { + return canPlaceBlockAt(worldIn, x, y, z); + } + + @Override + public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { + if (!this.canPlaceBlockAt(worldIn, x, y, z) && worldIn.getBlock(x, y, z) == this) { + this.dropBlockAsItem(worldIn, x, y, z, worldIn.getBlockMetadata(x, y, z), 0); + worldIn.setBlockToAir(x, y, z); + } + } + + @Override + public int damageDropped(int meta) { + return meta; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { + for (int i = 0; i < 4; i++) { + list.add(new ItemStack(itemIn, 1, i)); + } + } + + public static class ItemBlockChandelier extends ItemBlock { + + public ItemBlockChandelier(Block block) { + super(block); + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + public int getMetadata(int damage) { + return damage; + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return this.getUnlocalizedName() + "." + stack.getItemDamage(); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean bool) { + tooltip.add( + StatCollector + .translateToLocalFormatted("tile.chandelier.desc", BlockConfig.chandelier.chandelierLightRange)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java index 90c0a4ce..c24043b4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockConveyor.java @@ -20,7 +20,7 @@ public class BlockConveyor extends BlockContainer { @SideOnly(Side.CLIENT) - private IIcon belt_up, belt_down, belt_left, belt_right, blank; + private IIcon belt_up, belt_down, belt_left, belt_right, blank_right, blank_left; public BlockConveyor() { super(Material.piston); @@ -45,17 +45,26 @@ public void registerBlockIcons(IIconRegister reg) { belt_down = reg.registerIcon("utilitiesinexcess:conveyor_belt_down"); belt_left = reg.registerIcon("utilitiesinexcess:conveyor_belt_left"); belt_right = reg.registerIcon("utilitiesinexcess:conveyor_belt_right"); - blank = reg.registerIcon("utilitiesinexcess:conveyor_belt_blank"); + blank_right = reg.registerIcon("utilitiesinexcess:conveyor_belt_blank_right"); + blank_left = reg.registerIcon("utilitiesinexcess:conveyor_belt_blank_left"); } @SideOnly(Side.CLIENT) @Override public IIcon getIcon(int s, int meta) { - if (s == getFacing(meta).getOpposite() + ForgeDirection facing = getFacing(meta); + if (s == facing.ordinal()) return belt_down; + if (s == facing.getOpposite() .ordinal()) return belt_up; - if (s != ForgeDirection.UP.ordinal()) return blank; - return switch (getFacing(meta)) { + if (s != ForgeDirection.UP.ordinal() && s != ForgeDirection.DOWN.ordinal()) { + if (s == facing.getRotation(ForgeDirection.DOWN) + .ordinal()) return blank_left; + else return blank_right; + } + + if (s == ForgeDirection.DOWN.ordinal()) facing = facing.getOpposite(); + return switch (facing) { case NORTH -> belt_up; case SOUTH -> belt_down; case WEST -> belt_left; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java index 35fec990..82157605 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDecorativeGlass.java @@ -18,7 +18,7 @@ public class BlockDecorativeGlass extends BlockGlass { - private static final int META_VALUES = 12; + private static final int META_VALUES = 13; public BlockDecorativeGlass() { super(Material.glass, false); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java index 96946737..24a00574 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockDrum.java @@ -23,6 +23,7 @@ import com.cleanroommc.modularui.utils.NumberFormat; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityDrum; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; public class BlockDrum extends BlockContainer { @@ -139,6 +140,21 @@ public void breakBlock(World world, int x, int y, int z, Block block, int meta) super.breakBlock(world, x, y, z, block, meta); } + @Override + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + public static class ItemBlockDrum extends ItemBlock implements IFluidContainerItem { public final int capacity; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java index 04dc5e0d..e92a76d1 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockEtherealGlass.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks; import java.util.List; +import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockGlass; @@ -20,13 +21,16 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +// Extending glass makes the rendering work properly public class BlockEtherealGlass extends BlockGlass { public enum EtherealGlassType { NORMAL(0, "ethereal_glass"), + INEFFABLE(1, "ineffable_glass"), DARK(2, "ethereal_glass_dark"), INVERTED(3, "ethereal_glass_inverted"), + INEFFABLE_INVERTED(4, "ineffable_glass_inverted"), DARK_INVERTED(5, "ethereal_glass_dark_inverted"); public final int meta; @@ -48,6 +52,17 @@ public BlockEtherealGlass() { @SideOnly(Side.CLIENT) private IIcon[] icons; + @Override + public int getRenderBlockPass() { + return 1; + } + + // Have to override glass method back to the default + @Override + public int quantityDropped(Random random) { + return 1; + } + @Override public int damageDropped(int meta) { return meta; @@ -58,13 +73,15 @@ public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlig List list, Entity collider) { int meta = worldIn.getBlockMetadata(x, y, z); - if ((meta == EtherealGlassType.NORMAL.meta || meta == EtherealGlassType.DARK.meta) - && collider instanceof EntityPlayer) { + if ((meta == EtherealGlassType.NORMAL.meta || meta == EtherealGlassType.DARK.meta + || meta == EtherealGlassType.INEFFABLE.meta) && collider instanceof EntityPlayer player + && !player.isSneaking()) { return; } - if ((meta == EtherealGlassType.INVERTED.meta || meta == EtherealGlassType.DARK_INVERTED.meta) - && !(collider instanceof EntityPlayer)) { + if ((meta == EtherealGlassType.INVERTED.meta || meta == EtherealGlassType.DARK_INVERTED.meta + || meta == EtherealGlassType.INEFFABLE_INVERTED.meta) + && !(collider instanceof EntityPlayer player && !player.isSneaking())) { return; } @@ -74,7 +91,7 @@ public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlig @Override public int getLightOpacity(IBlockAccess world, int x, int y, int z) { int meta = world.getBlockMetadata(x, y, z); - return (meta == EtherealGlassType.NORMAL.meta || meta == EtherealGlassType.INVERTED.meta) ? 0 : 255; + return (meta == EtherealGlassType.DARK.meta || meta == EtherealGlassType.DARK_INVERTED.meta) ? 255 : 0; } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockGigaTorch.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockGigaTorch.java new file mode 100644 index 00000000..1740ac5f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockGigaTorch.java @@ -0,0 +1,87 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks; + +import static net.minecraftforge.common.util.ForgeDirection.*; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityGigaTorch; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; + +public class BlockGigaTorch extends BlockContainer { + + public BlockGigaTorch() { + super(Material.circuits); + setBlockName("giga_torch"); + setHardness(0.0F); + setLightLevel(0.9375F); // 15 light level + setStepSound(soundTypeWood); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityGigaTorch(); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World worldIn, int x, int y, int z) { + return null; + } + + @Override + public boolean canPlaceBlockAt(World worldIn, int x, int y, int z) { + if (World.doesBlockHaveSolidTopSurface(worldIn, x, y - 1, z)) { + return true; + } else { + Block block = worldIn.getBlock(x, y - 1, z); + return block.canPlaceTorchOnTop(worldIn, x, y - 1, z); + } + } + + @Override + public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) { + if (!this.canPlaceBlockAt(worldIn, x, y, z) && worldIn.getBlock(x, y, z) == this) { + this.dropBlockAsItem(worldIn, x, y, z, 0, 0); + worldIn.setBlockToAir(x, y, z); + } + } + + public static class ItemBlockGigaTorch extends ItemBlock { + + public ItemBlockGigaTorch(Block block) { + super(block); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean bool) { + tooltip.add( + StatCollector.translateToLocalFormatted("tile.giga_torch.desc", BlockConfig.gigaTorch.gigaTorchRange)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java index f360908c..dcf7f78a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockInverted.java @@ -3,6 +3,11 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + public class BlockInverted extends Block { public BlockInverted() { @@ -12,4 +17,14 @@ public BlockInverted() { setHardness(0.5F); setResistance(150F); } + + @Override + public boolean isOpaqueCube() { + return BlockConfig.invertedBlockDoesXRay; + } + + @SideOnly(Side.CLIENT) + public int getRenderBlockPass() { + return 1; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java index a0ae655e..9b83e44b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockPortalEndOfTime.java @@ -4,6 +4,7 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; @@ -16,7 +17,9 @@ import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.ForgeDirection; @@ -30,6 +33,8 @@ import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class BlockPortalEndOfTime extends Block { @@ -41,6 +46,31 @@ public BlockPortalEndOfTime() { setResistance(5); } + IIcon[] icons; + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + icons = new IIcon[6]; + icons[0] = reg.registerIcon(this.getTextureName() + "_bottom"); + icons[1] = reg.registerIcon(this.getTextureName() + "_top"); + icons[2] = reg.registerIcon(this.getTextureName() + "_north"); + icons[3] = reg.registerIcon(this.getTextureName() + "_south"); + icons[4] = reg.registerIcon(this.getTextureName() + "_west"); + icons[5] = reg.registerIcon(this.getTextureName() + "_east"); + } + + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return icons[side]; + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(IBlockAccess worldIn, int x, int y, int z, int side) { + return icons[side]; + } + @Override public int onBlockPlaced(World world, int x, int y, int z, int side, float subX, float subY, float subZ, int meta) { if (!world.isRemote && world.provider instanceof WorldProviderEndOfTime) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java index f04b8a77..08f1e62a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockRedstoneClock.java @@ -3,7 +3,9 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -11,12 +13,26 @@ public class BlockRedstoneClock extends BlockContainer { + private IIcon iconInactive; + private IIcon iconActive; + public BlockRedstoneClock() { super(Material.rock); setBlockName("redstone_clock"); setBlockTextureName("utilitiesinexcess:redstone_clock"); } + @Override + public void registerBlockIcons(IIconRegister reg) { + iconInactive = reg.registerIcon("utilitiesinexcess:redstone_clock_inactive"); + iconActive = reg.registerIcon("utilitiesinexcess:redstone_clock_active"); + } + + @Override + public IIcon getIcon(int side, int meta) { + return meta == 1 ? iconActive : iconInactive; + } + @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityRedstoneClock(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java index 263a0528..6a82656c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSmartPump.java @@ -2,11 +2,17 @@ import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySmartPump; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + public class BlockSmartPump extends BlockContainer { public BlockSmartPump() { @@ -15,6 +21,26 @@ public BlockSmartPump() { setBlockTextureName("utilitiesinexcess:smart_pump"); } + IIcon sides; + IIcon top; + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister reg) { + sides = reg.registerIcon("utilitiesinexcess:smart_pump"); + top = reg.registerIcon("utilitiesinexcess:smart_pump_top"); + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIcon(int s, int meta) { + if (s == ForgeDirection.UP.ordinal() || s == ForgeDirection.DOWN.ordinal()) { + return top; + } else { + return sides; + } + } + @Override public TileEntity createNewTileEntity(World worldIn, int meta) { return new TileEntitySmartPump(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSpike.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSpike.java index 822d4fa1..923d29bf 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSpike.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockSpike.java @@ -1,7 +1,5 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks; -import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.spikeRenderID; - import java.util.ArrayList; import java.util.List; @@ -21,6 +19,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntitySpike; import com.google.common.collect.Multimap; +import com.gtnewhorizon.gtnhlib.client.model.ModelISBRH; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -126,18 +125,18 @@ public boolean hasTileEntity(int meta) { } @Override - public boolean renderAsNormalBlock() { - return false; + public int getRenderType() { + return ModelISBRH.JSON_ISBRH_ID; } @Override - public boolean isOpaqueCube() { + public boolean renderAsNormalBlock() { return false; } @Override - public int getRenderType() { - return spikeRenderID; + public boolean isOpaqueCube() { + return false; } private final static IIcon[] icons = new IIcon[4]; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java index 91eb9bfa..c75ded46 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/BlockUpdateDetector.java @@ -3,8 +3,10 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.init.Blocks; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -12,10 +14,26 @@ public class BlockUpdateDetector extends BlockContainer { + private IIcon iconInactive; + private IIcon iconActive; + public BlockUpdateDetector() { super(Material.rock); setBlockName("block_update_detector"); - setBlockTextureName("utilitiesinexcess:block_update_detector"); + setBlockTextureName("utilitiesinexcess:block_update_detector_inactive"); + setHardness(1.0F); + setHarvestLevel("pickaxe", 0); + } + + @Override + public void registerBlockIcons(IIconRegister reg) { + iconInactive = reg.registerIcon("utilitiesinexcess:block_update_detector_inactive"); + iconActive = reg.registerIcon("utilitiesinexcess:block_update_detector_active"); + } + + @Override + public IIcon getIcon(int side, int meta) { + return (meta) == 1 ? iconActive : iconInactive; } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/MobDenySpawnEvents.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/MobDenySpawnEvents.java new file mode 100644 index 00000000..eea55867 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/MobDenySpawnEvents.java @@ -0,0 +1,51 @@ +package com.fouristhenumber.utilitiesinexcess.common.events; + +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.monster.EntitySlime; +import net.minecraftforge.event.entity.living.LivingSpawnEvent; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.eventbus.EventBusSubscriber; + +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +@SuppressWarnings("unused") +@EventBusSubscriber() +public class MobDenySpawnEvents { + + @EventBusSubscriber.Condition + public static boolean shouldSubscribe() { + return ModBlocks.GIGA_TORCH.isEnabled(); + } + + // context https://github.com/GTNewHorizons/GT5-Unofficial/pull/905 + @SubscribeEvent + public static void denySpawn(LivingSpawnEvent.CheckSpawn event) { + if (event.getResult() == Event.Result.DENY) return; + + if (event.entityLiving instanceof EntitySlime slime && !slime.hasCustomNameTag() + && event.getResult() == Event.Result.ALLOW) { + event.setResult(Event.Result.DEFAULT); + } + + if (event.getResult() == Event.Result.ALLOW) { + return; + } + + if (event.entityLiving.isCreatureType(EnumCreatureType.monster, false)) { + if (UtilitiesInExcess.proxy.mobSpawnBlockChecks.isInRange( + event.entity.worldObj.provider.dimensionId, + event.entity.posX, + event.entity.posY, + event.entity.posZ)) { + if (event.entityLiving instanceof EntitySlime slime) { + slime.setCustomNameTag("DoNotSpawnSlimes"); + } + event.setResult(Event.Result.DENY); + } + } + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java new file mode 100644 index 00000000..7e3d98df --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/events/WateringCanEvent.java @@ -0,0 +1,33 @@ +package com.fouristhenumber.utilitiesinexcess.common.events; + +import net.minecraft.world.World; +import net.minecraftforge.event.world.WorldEvent; + +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +public class WateringCanEvent extends WorldEvent { + + public final BlockPos wateredBlock; + public final BlockPos originBlock; + public final int wateringCanTier; + + /** + * {@link WateringCanEvent} is fired when a block is fertilized using a watering can. + *
+ * {@link #wateredBlock} contains the {@link BlockPos} of the block being fertilized.
+ * {@link #originBlock} contains the {@link BlockPos} of the block which was clicked.
+ * {@link #wateringCanTier} contains the tier of the watering can.
+ *
+ * This event is not {@link cpw.mods.fml.common.eventhandler.Cancelable}.
+ *
+ * This event does not have a result. {@link HasResult}
+ *
+ * This event is fired on the {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS}. + **/ + public WateringCanEvent(World world, BlockPos wateredBlock, BlockPos originBlock, int wateringCanTier) { + super(world); + this.wateredBlock = wateredBlock; + this.originBlock = originBlock; + this.wateringCanTier = wateringCanTier; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java index 69c14c23..54c06cb6 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemArchitectsWand.java @@ -1,7 +1,11 @@ package com.fouristhenumber.utilitiesinexcess.common.items; +import static com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig.damageTrowelWithArchitectsWand; +import static com.fouristhenumber.utilitiesinexcess.utils.ArchitectsWandUtils.damageBackhand; + import java.util.List; import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; @@ -12,18 +16,23 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import org.jetbrains.annotations.NotNull; + import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.common.renderers.WireframeRenderer; +import com.fouristhenumber.utilitiesinexcess.utils.ArchitectsSelection; import com.fouristhenumber.utilitiesinexcess.utils.ArchitectsWandUtils; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class ItemArchitectsWand extends Item { +public class ItemArchitectsWand extends Item implements ITranslucentItem { public int buildLimit; @@ -50,20 +59,28 @@ public void onUpdate(ItemStack stack, World world, Entity entity, int slot, bool return; } - if (!isSelected) return; + if (!isSelected) { + return; + } - MovingObjectPosition mop = Minecraft.getMinecraft().objectMouseOver; + // I'm pretty sure this will never determine whether we render or not but I'm not certain + MovingObjectPosition movingObjectPosition = Minecraft.getMinecraft().objectMouseOver; // Check if player is looking at a block. - if (mop == null || mop.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) { + if (movingObjectPosition == null + || movingObjectPosition.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) { WireframeRenderer.clearCandidatePositions(); return; } - int x = mop.blockX; - int y = mop.blockY; - int z = mop.blockZ; - int side = mop.sideHit; + // 1. Target block location + BlockPos target = new BlockPos( + movingObjectPosition.blockX, + movingObjectPosition.blockY, + movingObjectPosition.blockZ); + + // 2. Side + int side = movingObjectPosition.sideHit; ForgeDirection forgeSide = ForgeDirection.getOrientation(side); if (forgeSide == ForgeDirection.UNKNOWN) { UtilitiesInExcess.LOG @@ -71,31 +88,67 @@ public void onUpdate(ItemStack stack, World world, Entity entity, int slot, bool return; } - Block blockToPlace = world.getBlock(x, y, z); - if (blockToPlace == null) return; - int metaToPlace = world.getBlockMetadata(x, y, z); - ItemStack itemStack = new ItemStack(Item.getItemFromBlock(blockToPlace), 1, metaToPlace); - - int inventoryBlockCount = ArchitectsWandUtils.countItemInInventory(player, itemStack); - if (!player.capabilities.isCreativeMode && inventoryBlockCount == 0) { - WireframeRenderer.clearCandidatePositions(); - return; - } - int placeCount = player.capabilities.isCreativeMode ? this.buildLimit - : Math.min(inventoryBlockCount, this.buildLimit); - - Set blocksToPlace = ArchitectsWandUtils - .findAdjacentBlocks(world, blockToPlace, metaToPlace, placeCount, forgeSide, new BlockPos(x, y, z)); + // 4. Target block to place + ArchitectsSelection selection = new ArchitectsSelection(player, world, movingObjectPosition); + List itemStackToPlace = selection.blockToPlace(player); + + // 3. Total amount to place + int placeCount = selection.maxPlaceCount(player, buildLimit); + + Set blocksToPlace = ArchitectsWandUtils.findAdjacentBlocks( + world, + itemStackToPlace, + placeCount, + forgeSide, + target, + movingObjectPosition, + player, + selection); WireframeRenderer.clearCandidatePositions(); for (BlockPos pos : blocksToPlace) { WireframeRenderer.addCandidatePosition(pos.offset(forgeSide.offsetX, forgeSide.offsetY, forgeSide.offsetZ)); } + } + private void placeBlock(World world, EntityPlayer player, @NotNull ItemStack itemStack, BlockPos pos, int side, + float hitX, float hitY, float hitZ, ForgeDirection forgeSide) { + + // This block is here because some mods want to use TEs to + ItemStack itemCopy = itemStack.copy(); + itemCopy.stackSize = 1; + Block comparisonBlock = world.getBlock(pos.x, pos.y, pos.z); + int comparisonMeta = world.getBlockMetadata(pos.x, pos.y, pos.z); + ItemStack comparisonItemStack = new ItemStack(comparisonBlock, 1, comparisonMeta); + + boolean useCompatPlacement = !ItemStack.areItemStacksEqual(itemCopy, comparisonItemStack); + if (useCompatPlacement) { + itemStack.getItem() + .onItemUse(itemCopy, player, world, pos.x, pos.y, pos.z, side, hitX, hitY, hitZ); + } else { + Block block = Block.getBlockFromItem(itemCopy.getItem()); + world.setBlock( + pos.x + forgeSide.offsetX, + pos.y + forgeSide.offsetY, + pos.z + forgeSide.offsetZ, + block, + comparisonMeta, + 3); + + world.playSoundEffect( + pos.x + forgeSide.offsetX, + pos.y + forgeSide.offsetY, + pos.z + forgeSide.offsetZ, + block.stepSound.func_150496_b(), + (block.stepSound.getVolume() + 1.0F) / 2.0F, + block.stepSound.getPitch() * 0.8F); + } } @Override public boolean onItemUse(ItemStack itemstack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { + if (world.isRemote) return true; + // TODO: Prevent player from placing blocks into themself / other entities? ForgeDirection forgeSide = ForgeDirection.getOrientation(side); if (forgeSide == ForgeDirection.UNKNOWN) { @@ -104,30 +157,34 @@ public boolean onItemUse(ItemStack itemstack, EntityPlayer player, World world, return false; } - Block blockToPlace = world.getBlock(x, y, z); - if (blockToPlace == null) return false; - int metaToPlace = world.getBlockMetadata(x, y, z); - ItemStack itemStack = new ItemStack(Item.getItemFromBlock(blockToPlace), 1, metaToPlace); + BlockPos target = new BlockPos(x, y, z); + MovingObjectPosition mop = new MovingObjectPosition(x, y, z, side, Vec3.createVectorHelper(hitX, hitY, hitZ)); + ArchitectsSelection selection = new ArchitectsSelection(player, world, mop); - int inventoryBlockCount = ArchitectsWandUtils.countItemInInventory(player, itemStack); - if (!player.capabilities.isCreativeMode && inventoryBlockCount == 0) return false; - int placeCount = player.capabilities.isCreativeMode ? this.buildLimit - : Math.min(inventoryBlockCount, this.buildLimit); + List itemStackToPlace = selection.blockToPlace(player); + + int placeCount = selection.maxPlaceCount(player, buildLimit); Set blocksToPlace = ArchitectsWandUtils - .findAdjacentBlocks(world, blockToPlace, metaToPlace, placeCount, forgeSide, new BlockPos(x, y, z)); + .findAdjacentBlocks(world, itemStackToPlace, placeCount, forgeSide, target, mop, player, selection); + + ItemStack nowPlacing; for (BlockPos pos : blocksToPlace) { - // TODO: Group these by a bigger number instead of decreasing by 1 every time. - if (player.capabilities.isCreativeMode || ArchitectsWandUtils.decreaseFromInventory(player, itemStack)) { - world.setBlock( - pos.x + forgeSide.offsetX, - pos.y + forgeSide.offsetY, - pos.z + forgeSide.offsetZ, - blockToPlace, - metaToPlace, - 3); + List candidates = selection.blockToPlace(player); + if (candidates.size() == 1) { + nowPlacing = candidates.get(0); + } else { + nowPlacing = candidates.get( + ThreadLocalRandom.current() + .nextInt(candidates.size())); + } + + if (player.capabilities.isCreativeMode || (ArchitectsWandUtils.decreaseFromInventory(player, nowPlacing) + && damageBackhand(damageTrowelWithArchitectsWand, player))) { + placeBlock(world, player, nowPlacing, pos, side, hitX, hitY, hitZ, forgeSide); } } + player.inventoryContainer.detectAndSendChanges(); return true; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java index 8642c60e..9b456ec8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemGoldenBag.java @@ -1,7 +1,5 @@ package com.fouristhenumber.utilitiesinexcess.common.items; -import java.util.List; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -24,9 +22,6 @@ import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class ItemGoldenBag extends Item implements IGuiHolder { private final int inventorySize = 54; @@ -49,12 +44,6 @@ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer pla return super.onItemRightClick(stack, world, player); } - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { - tooltip.add(StatCollector.translateToLocal("item.golden_bag.desc")); - } - @Override public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { final int panelHeight = 220; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemHeavenlyRing.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemHeavenlyRing.java index 95e731ac..a5305c72 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemHeavenlyRing.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemHeavenlyRing.java @@ -5,14 +5,15 @@ import java.util.Map; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; +import net.minecraft.world.World; import net.minecraftforge.client.event.RenderPlayerEvent; import net.minecraftforge.common.util.FakePlayer; @@ -33,48 +34,56 @@ @Optional.Interface(iface = "baubles.api.IBauble", modid = "Baubles") public class ItemHeavenlyRing extends Item implements IBauble { - private static final int RING_COUNT = 5; + private final int RING_COUNT; + private final String SUFFIX; - private static IIcon[] itemIcons = new IIcon[RING_COUNT]; - public static IIcon[] wingIcons = new IIcon[RING_COUNT]; + public final IIcon[] wingIcons; - public ItemHeavenlyRing() { - setTextureName("utilitiesinexcess:heavenly_ring"); - setUnlocalizedName("heavenly_ring"); + public ItemHeavenlyRing(String suffix, int variants) { + RING_COUNT = variants; + SUFFIX = suffix; + + wingIcons = new IIcon[RING_COUNT]; + + setTextureName("utilitiesinexcess:heavenly_ring_" + suffix); + setUnlocalizedName("heavenly_ring_" + suffix); setMaxDamage(0); setHasSubtypes(true); setMaxStackSize(1); } @Override - @SideOnly(Side.CLIENT) - public void getSubItems(Item item, CreativeTabs tab, List itemList) { - for (int i = 0; i < RING_COUNT; ++i) { - itemList.add(new ItemStack(item, 1, i)); + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + int meta = stack.getItemDamage(); + if (meta == RING_COUNT - 1) { + stack.setItemDamage(0); + } else { + stack.setItemDamage(meta + 1); } + if (world.isRemote) { + player.addChatMessage( + new ChatComponentTranslation( + "chat.heavenly_ring_modify", + StatCollector.translateToLocal("item.heavenly_ring_" + SUFFIX + ".type." + stack.getItemDamage()))); + } + return super.onItemRightClick(stack, world, player); } @Override @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister register) { for (int i = 0; i < RING_COUNT; ++i) { - itemIcons[i] = register.registerIcon(this.getIconString() + "." + i); wingIcons[i] = register.registerIcon(this.getIconString() + ".wing." + i); } - this.itemIcon = itemIcons[0]; - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int meta) { - return itemIcons[meta]; + super.registerIcons(register); } @Override public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { tooltip.add( EnumChatFormatting.GRAY - + StatCollector.translateToLocal("item.heavenly_ring.type." + stack.getItemDamage())); + + StatCollector.translateToLocal("item.heavenly_ring_" + SUFFIX + ".type." + stack.getItemDamage())); + tooltip.add(StatCollector.translateToLocal("item.heavenly_ring.desc")); super.addInformation(stack, player, tooltip, p_77624_4_); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java index cb0beb02..bcb11416 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemInversionSigilActive.java @@ -1,8 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.common.items; -import static com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig.awakenedInversionDurability; - import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import net.minecraft.block.Block; @@ -35,47 +34,36 @@ import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingSpawnEvent; +import org.apache.logging.log4j.Level; import org.jetbrains.annotations.NotNull; import com.fouristhenumber.utilitiesinexcess.ModItems; import com.fouristhenumber.utilitiesinexcess.common.entities.EntitySiegeProperty; import com.fouristhenumber.utilitiesinexcess.config.items.InversionConfig; +import com.fouristhenumber.utilitiesinexcess.utils.ItemStackBaseCompare; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.eventhandler.Event; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.registry.GameRegistry; public class ItemInversionSigilActive extends Item { - private static final String DURABILITY_NBT_KEY = "RemainingUses"; + public static final String DURABILITY_NBT_KEY = "RemainingUses"; private static final int BEACON_SEARCH_RADIUS = 6; private final int[][] LIGHTNING_POSITIONS = { { 0, 0 }, { -5, 0 }, { 5, 0 }, { 0, -5 }, { 0, 5 } }; - private final ItemStack[] CHEST_NORTH_CONTENTS = { new ItemStack(Blocks.stone), new ItemStack(Items.brick), - new ItemStack(Blocks.glass), new ItemStack(Items.cooked_fished), new ItemStack(Blocks.hardened_clay), - new ItemStack(Items.dye, 1, 2), new ItemStack(Items.coal, 1, 1), new ItemStack(Items.cooked_beef), - new ItemStack(Items.iron_ingot), new ItemStack(Items.cooked_chicken), new ItemStack(Items.gold_ingot), - new ItemStack(Items.baked_potato), new ItemStack(Items.cooked_porkchop), new ItemStack(Items.netherbrick) }; - - private final int[] POTION_IDS = { 8193, 8194, 8195, 8196, 8197, 8198, 8200, 8201, 8202, 8204, 8205, 8206, 8225, - 8226, 8228, 8229, 8232, 8233, 8234, 8236, 8257, 8258, 8259, 8260, 8262, 8264, 8265, 8267, 8268, 8269, 8270 }; + private HashSet CHEST_NORTH_CONTENTS = new HashSet<>(); - private final ItemStack[] CHEST_EAST_CONTENTS = new ItemStack[62]; + private HashSet CHEST_EAST_CONTENTS = new HashSet<>(); - private final ItemStack[] CHEST_SOUTH_CONTENTS = { new ItemStack(Blocks.grass), new ItemStack(Blocks.lapis_ore), - new ItemStack(Blocks.dirt), new ItemStack(Blocks.obsidian), new ItemStack(Blocks.sand), - new ItemStack(Blocks.diamond_ore), new ItemStack(Blocks.gravel), new ItemStack(Blocks.redstone_ore), - new ItemStack(Blocks.gold_ore), new ItemStack(Blocks.clay), new ItemStack(Blocks.iron_ore), - new ItemStack(Blocks.emerald_ore), new ItemStack(Blocks.coal_ore) }; + private HashSet CHEST_SOUTH_CONTENTS = new HashSet<>(); - private final ItemStack[] CHEST_WEST_CONTENTS = { new ItemStack(Items.record_13), - new ItemStack(Items.record_mellohi), new ItemStack(Items.record_cat), new ItemStack(Items.record_stal), - new ItemStack(Items.record_blocks), new ItemStack(Items.record_strad), new ItemStack(Items.record_chirp), - new ItemStack(Items.record_ward), new ItemStack(Items.record_far), new ItemStack(Items.record_11), - new ItemStack(Items.record_mall), new ItemStack(Items.record_wait) }; + private HashSet CHEST_WEST_CONTENTS = new HashSet<>(); public ItemInversionSigilActive() { super(); @@ -84,10 +72,25 @@ public ItemInversionSigilActive() { setMaxStackSize(1); setContainerItem(this); - for (int i = 0; i < 31; i++) { - CHEST_EAST_CONTENTS[2 * i] = new ItemStack(Items.potionitem, 1, POTION_IDS[i]); - CHEST_EAST_CONTENTS[2 * i + 1] = new ItemStack(Items.potionitem, 1, POTION_IDS[i] + 8192); - } + CHEST_NORTH_CONTENTS = getValidChestContents( + ForgeDirection.NORTH, + InversionConfig.northChestValidItems, + InversionConfig.northChestRequiredItems); + + CHEST_EAST_CONTENTS = getValidChestContents( + ForgeDirection.EAST, + InversionConfig.eastChestValidItems, + InversionConfig.eastChestRequiredItems); + + CHEST_SOUTH_CONTENTS = getValidChestContents( + ForgeDirection.SOUTH, + InversionConfig.southChestValidItems, + InversionConfig.southChestRequiredItems); + + CHEST_WEST_CONTENTS = getValidChestContents( + ForgeDirection.WEST, + InversionConfig.westChestValidItems, + InversionConfig.westChestRequiredItems); ItemInversionSigilActiveEvents eventHandler = new ItemInversionSigilActiveEvents(); MinecraftForge.EVENT_BUS.register(eventHandler); @@ -96,6 +99,73 @@ public ItemInversionSigilActive() { .register(eventHandler); } + private int parseItemMetaFromString(String string) { + try { + return Integer.parseInt(string); + } catch (NumberFormatException ignored) { + return -1; + } + } + + private HashSet getValidChestContents(ForgeDirection direction, String[] itemIds, + int itemReq) { + HashSet validChestContents = new HashSet<>(); + for (String itemId : itemIds) { + String[] itemIdSplit = itemId.split(":"); + ItemStack validChestItemStack; + if (itemIdSplit.length == 2) { + validChestItemStack = new ItemStack(GameRegistry.findItem(itemIdSplit[0], itemIdSplit[1])); + } else if (itemIdSplit.length == 3) { + Item validChestItem = GameRegistry.findItem(itemIdSplit[0], itemIdSplit[1]); + int validChestItemMeta = parseItemMetaFromString(itemIdSplit[2]); + validChestItemStack = new ItemStack(validChestItem, 1, validChestItemMeta); + if (validChestItem == Items.potionitem && InversionConfig.chestSplashPotionsValid) { + ItemStack splashPotion = new ItemStack(validChestItem, 1, validChestItemMeta + 8192); + boolean successfulAdd = validChestContents.add(new ItemStackBaseCompare(splashPotion)); + if (successfulAdd) { + FMLLog.log( + Level.DEBUG, + "Used splash potion %s as siege requirement from item id %s.", + splashPotion.getDisplayName(), + itemId); + } else { + FMLLog.log( + Level.DEBUG, + "Could not add splash potion %s as siege requirement from item id %s since it was a duplicate!", + splashPotion.getDisplayName(), + itemId); + } + } + } else { + FMLLog.log(Level.WARN, "Could not parse item id %s for the %s chest!", itemId, direction.toString()); + continue; + } + boolean successfulAdd = validChestContents.add(new ItemStackBaseCompare(validChestItemStack)); + if (successfulAdd) { + FMLLog.log( + Level.DEBUG, + "Used item %s as siege requirement from item id %s.", + validChestItemStack.getDisplayName(), + itemId); + } else { + FMLLog.log( + Level.DEBUG, + "Could not add item %s as siege requirement from item id %s since it was a duplicate!", + validChestItemStack.getDisplayName(), + itemId); + } + } + if (itemReq > validChestContents.size()) { + FMLLog.log( + Level.WARN, + "There are only %s valid items for the %s chest, but there are %s required items! The ritual will be impossible!", + validChestContents.size(), + direction.toString(), + itemReq); + } + return validChestContents; + } + private EntitySiegeProperty getProperties(EntityPlayer player) { return (EntitySiegeProperty) player.getExtendedProperties(EntitySiegeProperty.PROP_KEY); } @@ -209,18 +279,14 @@ private void startSiege(World world, int beaconX, int beaconY, int beaconZ, Enti curentity.setDead(); } } - for (int i = 0; i < LIGHTNING_POSITIONS.length; i++) { + for (int[] lightningPosition : LIGHTNING_POSITIONS) { EntityLightningBolt lightningBolt = new EntityLightningBolt( world, - beaconX + LIGHTNING_POSITIONS[i][0] + 0.5, + beaconX + lightningPosition[0] + 0.5, beaconY + 0.5, - beaconZ + LIGHTNING_POSITIONS[i][1] + 0.5); + beaconZ + lightningPosition[1] + 0.5); world.addWeatherEffect(lightningBolt); - world.setBlock( - beaconX + LIGHTNING_POSITIONS[i][0], - beaconY, - beaconZ + LIGHTNING_POSITIONS[i][1], - Blocks.air); + world.setBlock(beaconX + lightningPosition[0], beaconY, beaconZ + lightningPosition[1], Blocks.air); } } @@ -245,29 +311,22 @@ private void endSiege(boolean won, EntityPlayer player) { } } - private boolean checkChest(TileEntityChest chest, ItemStack[] itemsToCheck, int requiredAmount) { - int foundItemsAmount = 0; - boolean[] hasItem = new boolean[itemsToCheck.length]; + private boolean checkChest(TileEntityChest chest, HashSet itemsToCheck, int requiredAmount) { + HashSet confirmedItems = new HashSet<>(); for (int i = 0; i < chest.getSizeInventory(); i++) { ItemStack stack = chest.getStackInSlot(i); - for (int j = 0; j < itemsToCheck.length; j++) { - if (stack != null && ItemStack.areItemStacksEqual(stack, itemsToCheck[j])) { - hasItem[j] = true; - break; - } - } - } - for (int i = 0; i < itemsToCheck.length; i++) { - if (hasItem[i]) { - foundItemsAmount++; + if (stack == null) continue; + ItemStackBaseCompare stackCustomCompare = new ItemStackBaseCompare(stack); + if (itemsToCheck.contains(stackCustomCompare)) { + confirmedItems.add(stackCustomCompare); } } - return foundItemsAmount >= requiredAmount; + return confirmedItems.size() >= requiredAmount; } private boolean checkChestInDirection(ForgeDirection direction, int beaconX, int beaconY, int beaconZ, World world) { - ItemStack[] contents; + HashSet contents; int requiredAmount; if (direction == ForgeDirection.NORTH) { @@ -452,7 +511,7 @@ public void whenPlayerLeavesEnd(PlayerEvent.PlayerChangedDimensionEvent event) { } @SubscribeEvent(priority = EventPriority.NORMAL) - public void whenPlayerLeavesEnd2(PlayerEvent.PlayerRespawnEvent event) { + public void whenPlayerLeavesEndAlternate(PlayerEvent.PlayerRespawnEvent event) { if (getProperties(event.player).siege) { event.player.addChatMessage(new ChatComponentTranslation("chat.pseudo_inversion_ritual.leftEnd")); endSiege(false, event.player); @@ -550,7 +609,7 @@ public void getSubItems(Item p_150895_1_, CreativeTabs p_150895_2_, List tt, boolean p_77624_4_) { NBTTagCompound tag = stack.getTagCompound(); - if (tag != null && awakenedInversionDurability != 0) { + if (tag != null && InversionConfig.awakenedInversionDurability != 0) { tt.add( StatCollector .translateToLocalFormatted("item.inversion_sigil_active.desc", tag.getInteger(DURABILITY_NBT_KEY))); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java index 5f9edc22..445bfec6 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemWateringCan.java @@ -26,12 +26,15 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.ForgeDirection; +import com.fouristhenumber.utilitiesinexcess.common.events.WateringCanEvent; import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; import com.fouristhenumber.utilitiesinexcess.network.client.ParticlePacket; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; @@ -46,10 +49,12 @@ public class ItemWateringCan extends Item { // A map to track the last time each player used the watering can public static final Map lastWaterTick = new WeakHashMap<>(); private final int cooldownTicks = 4; // Watering delay + private final int tier; public ItemWateringCan(int tier, int effectArea) { // Ensure effectArea is odd, since it should be centered (3, 5, 7, etc.) this.range = (effectArea - 1) / 2;; + this.tier = tier; setTextureName("utilitiesinexcess:" + getNameFromTier(tier)); setUnlocalizedName(getNameFromTier(tier)); setMaxStackSize(1); @@ -182,6 +187,8 @@ public void accelerateGrowth(World world, int x, int y, int z) { int by = y + dy; int bz = z + dz; Block plant = world.getBlock(bx, by, bz); + MinecraftForge.EVENT_BUS + .post(new WateringCanEvent(world, new BlockPos(bx, by, bz), new BlockPos(x, y, z), tier)); if (plant instanceof IGrowable || plant instanceof IPlantable || plant == mycelium) { world.scheduleBlockUpdateWithPriority(bx, by, bz, plant, 0, 1000); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java index 1a0db32d..daebb88e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemAntiParticulateShovel.java @@ -13,8 +13,9 @@ import net.minecraft.world.World; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.AntiParticulateShovelConfig; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; -public class ItemAntiParticulateShovel extends ItemSpade { +public class ItemAntiParticulateShovel extends ItemSpade implements ITranslucentItem { public ItemAntiParticulateShovel() { super(ToolMaterial.EMERALD); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java index 53c56d61..2724b069 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemDestructionPickaxe.java @@ -12,10 +12,11 @@ import net.minecraft.util.StatCollector; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; import akka.japi.Pair; -public class ItemDestructionPickaxe extends ItemPickaxe { +public class ItemDestructionPickaxe extends ItemPickaxe implements ITranslucentItem { public ItemDestructionPickaxe() { super(ToolMaterial.EMERALD); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java index b19c833c..ecd6409d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemEthericSword.java @@ -14,8 +14,9 @@ import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.EthericSwordConfig; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorEntityLivingBase; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorItemSword; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; -public class ItemEthericSword extends ItemSword { +public class ItemEthericSword extends ItemSword implements ITranslucentItem { public ItemEthericSword() { super(ToolMaterial.EMERALD); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGluttonsAxe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGourmandsAxe.java similarity index 77% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGluttonsAxe.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGourmandsAxe.java index 4398aba9..958dfbb6 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGluttonsAxe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemGourmandsAxe.java @@ -16,24 +16,25 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GluttonsAxeConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GourmandsAxeConfig; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorEntityZombie; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorItemTool; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; -public class ItemGluttonsAxe extends ItemAxe { +public class ItemGourmandsAxe extends ItemAxe implements ITranslucentItem { - public ItemGluttonsAxe() { + public ItemGourmandsAxe() { super(ToolMaterial.EMERALD); - setTextureName("utilitiesinexcess:gluttons_axe"); - setUnlocalizedName("gluttons_axe"); - if (GluttonsAxeConfig.unbreakable) setMaxDamage(0); - ((AccessorItemTool) this).setDamageVsEntity(GluttonsAxeConfig.damageAgainstUndead); + setTextureName("utilitiesinexcess:gourmands_axe"); + setUnlocalizedName("gourmands_axe"); + if (GourmandsAxeConfig.unbreakable) setMaxDamage(0); + ((AccessorItemTool) this).setDamageVsEntity(GourmandsAxeConfig.damageAgainstUndead); } private static final Random particleRandom = new Random();; public static void spawnParticles(Entity e) { - if (!GluttonsAxeConfig.spawnParticles) return; + if (!GourmandsAxeConfig.spawnParticles) return; int ci = Potion.potionTypes[Potion.heal.getId()].getLiquidColor(); double d0 = (double) (ci >> 16 & 255) / 255.0D; double d1 = (double) (ci >> 8 & 255) / 255.0D; @@ -58,7 +59,7 @@ public void onUpdate(ItemStack s, World w, Entity e, int slot, boolean selected) if (e instanceof EntityPlayer p && selected) { if (w.getTotalWorldTime() % (2 * 20) == 0) { FoodStats fs = p.getFoodStats(); - fs.addStats(GluttonsAxeConfig.foodGain, GluttonsAxeConfig.saturationGain); + fs.addStats(GourmandsAxeConfig.foodGain, GourmandsAxeConfig.saturationGain); } } } @@ -80,10 +81,10 @@ public boolean onLeftClickEntity(ItemStack stack, EntityPlayer attacker, Entity } if (!target.isEntityUndead()) { - float amountToHeal = Math.min(GluttonsAxeConfig.maxHeal, target.getMaxHealth() - target.getHealth()); - if (amountToHeal == 0) if (GluttonsAxeConfig.useHungerAlways) attacker.addExhaustion(3 * 4); + float amountToHeal = Math.min(GourmandsAxeConfig.maxHeal, target.getMaxHealth() - target.getHealth()); + if (amountToHeal == 0) if (GourmandsAxeConfig.useHungerAlways) attacker.addExhaustion(3 * 4); else { - if (GluttonsAxeConfig.drainHp) if (attacker.getHealth() >= amountToHeal + 1) + if (GourmandsAxeConfig.drainHp) if (attacker.getHealth() >= amountToHeal + 1) attacker.setHealth(attacker.getHealth() - amountToHeal); else return true; target.setHealth(target.getHealth() + (amountToHeal + 1)); @@ -99,26 +100,26 @@ public boolean onLeftClickEntity(ItemStack stack, EntityPlayer attacker, Entity @Override public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean p_77624_4_) { - if (GluttonsAxeConfig.unbreakable) + if (GourmandsAxeConfig.unbreakable) tooltip.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted("item.unbreakable.desc")); } // Unbreakable @Override public boolean isDamageable() { - if (GluttonsAxeConfig.unbreakable) return false; + if (GourmandsAxeConfig.unbreakable) return false; return super.isDamageable(); } @Override public boolean getIsRepairable(ItemStack stack, ItemStack repairMaterial) { - if (GluttonsAxeConfig.unbreakable) return false; + if (GourmandsAxeConfig.unbreakable) return false; return super.getIsRepairable(stack, repairMaterial); } @Override public boolean showDurabilityBar(ItemStack stack) { - if (GluttonsAxeConfig.unbreakable) return false; + if (GourmandsAxeConfig.unbreakable) return false; return super.showDurabilityBar(stack); } // diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java index 80013203..3c3bc255 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemPrecisionShears.java @@ -16,8 +16,9 @@ import net.minecraftforge.common.ForgeHooks; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.PrecisionShearsConfig; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; -public class ItemPrecisionShears extends ItemShears { +public class ItemPrecisionShears extends ItemShears implements ITranslucentItem { public static final String COOLDOWN_NBT_TAG = "uie:cooldown"; private IIcon cooldownIcon; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java index 0756783b..9cdf4164 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/tools/ItemReversingHoe.java @@ -14,9 +14,10 @@ import com.fouristhenumber.utilitiesinexcess.ModBlocks; import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig; +import com.gtnewhorizon.gtnhlib.api.ITranslucentItem; // TODO: Add new features to the reversing hoe -public class ItemReversingHoe extends ItemHoe { +public class ItemReversingHoe extends ItemHoe implements ITranslucentItem { public ItemReversingHoe() { super(ToolMaterial.EMERALD); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java index b6d6c2ba..d3da592f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java @@ -4,6 +4,7 @@ import net.minecraft.init.Blocks; import net.minecraft.init.Items; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; @@ -120,16 +121,74 @@ public static void run() { 'o', Blocks.obsidian); - // Heavenly Ring + // Heavenly Rings addShapedRecipe( - ModItems.HEAVENLY_RING, + ModItems.HEAVENLY_RING_FEATHER, + "#f#", + "f*f", + "ifi", + '#', + Blocks.glass, + 'f', + Items.feather, + '*', + Items.nether_star, + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + addShapedRecipe( + ModItems.HEAVENLY_RING_DRAGON, + "#b#", + "b*b", + "ibi", + '#', + Blocks.glass, + 'b', + Items.blaze_powder, + '*', + Items.nether_star, + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + addShapedRecipe( + ModItems.HEAVENLY_RING_FAIRY, + "#d#", + "p*p", + "idi", + '#', + Blocks.glass, + 'd', + Blocks.yellow_flower, + 'p', + new ItemStack(ItemBlock.getItemFromBlock(Blocks.red_flower), 1, 0), + '*', + Items.nether_star, + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + addShapedRecipe( + ModItems.HEAVENLY_RING_METAL, "#g#", - "g*g", + "t*t", "igi", '#', Blocks.glass, 'g', Items.gold_ingot, + 't', + Items.iron_ingot, + '*', + Items.nether_star, + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + addShapedRecipe( + ModItems.HEAVENLY_RING_MAGIC, + "#g#", + "r*r", + "igi", + '#', + Blocks.glass, + 'g', + Items.glowstone_dust, + 'r', + Items.redstone, '*', Items.nether_star, 'i', @@ -163,6 +222,19 @@ public static void run() { 'p', Blocks.sticky_piston); + // Advanced Block Update Detector + addShapedRecipe( + ModBlocks.ADVANCED_BLOCK_UPDATE_DETECTOR, + "srs", + "rbr", + "srs", + 's', + Blocks.stone, + 'r', + Blocks.redstone_block, + 'b', + ModBlocks.BLOCK_UPDATE_DETECTOR); + // Trash Can (Items) addShapedRecipe( ModBlocks.TRASH_CAN_ITEM, @@ -346,17 +418,15 @@ public static void run() { // Temporal Gate addShapedRecipe( ModBlocks.END_OF_TIME_PORTAL, - "qgq", - "geg", - "qcq", + "qeq", + "ece", + "qeq", 'q', - Blocks.quartz_block, // TODO use burnt quartz replacement instead? + ModBlocks.DECORATIVE_BLOCKS.newItemStack(1, 2), 'e', - Items.ender_pearl, + ModBlocks.DECORATIVE_BLOCKS.newItemStack(1, 11), 'c', - Items.clock, - 'g', - Blocks.glass_pane); + Items.clock); // Trading Post addShapedRecipe( @@ -786,6 +856,17 @@ private static void loadEtherealGlassRecipes() { 'i', ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + // Ineffable Glass + addShapedRecipe( + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 0), + "ggg", + "gig", + "ggg", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0), + 'i', + ModItems.INVERTED_INGOT.newItemStack(1, OreDictionary.WILDCARD_VALUE)); + // Dark Ethereal Glass addShapedRecipe( new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 2), @@ -803,6 +884,12 @@ private static void loadEtherealGlassRecipes() { new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 0), Blocks.redstone_torch); + // Ineffable Glass (Inverted) + addShapelessRecipe( + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 4), + new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 1), + Blocks.redstone_torch); + // Dark Ethereal Glass (Inverted) addShapelessRecipe( new DisableableItemStack(ModBlocks.ETHEREAL_GLASS, 1, 5), @@ -835,7 +922,11 @@ private static void loadBedrockiumRecipes() { } private static void loadGlassRecipes() { - // TODO: Smooth Glass reliant on "sandy glass" + // Smooth Glass + addFurnaceRecipe( + ModBlocks.DECORATIVE_BLOCKS.newItemStack(8, 3), + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 0), + 0.5F); // Rimmed Glass addShapedRecipe( @@ -882,7 +973,7 @@ private static void loadGlassRecipes() { 'o', Blocks.obsidian); - // Latticed Glass + // Vortex Glass addShapedRecipe( ModBlocks.DECORATIVE_GLASS.newItemStack(5, 6), " g ", @@ -939,6 +1030,14 @@ private static void loadGlassRecipes() { ModBlocks.DECORATIVE_GLASS.newItemStack(1, 10), 'o', Blocks.obsidian); + + // Latticed Glass + addShapedRecipe( + ModBlocks.DECORATIVE_GLASS.newItemStack(4, 12), + "gg", + "gg", + 'g', + ModBlocks.DECORATIVE_GLASS.newItemStack(1, 2)); } private static void loadColoredBlockRecipes() { @@ -1029,9 +1128,9 @@ private static void loadInversionRecipes() { // Inverted Ingot (stable) addShapedRecipe(ModItems.INVERTED_INGOT.newItemStack(1, 1), "nnn", "nnn", "nnn", 'n', ModItems.INVERTED_NUGGET); - // Glutton's Axe + // Gourmand's Axe addShapedRecipe( - ModItems.GLUTTONS_AXE, + ModItems.GOURMANDS_AXE, "ii", "is", " s", diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java index 6808739a..59c6d4d8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/HeavenlyRingRenderer.java @@ -34,21 +34,32 @@ public static float getNextAngle(float curAngle, boolean isFlying) { return UIEUtils.lerp(curAngle, (float) ((Math.sin(time * 0.001 * speed) + 1) * max), 0.1F); } - public static void render(int meta, float angle) { + public static void render(ItemHeavenlyRing ring, int meta, float angle) { Tessellator t = Tessellator.instance; + int boundTexIndex = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + boolean blendWasEnabled = GL11.glIsEnabled(GL11.GL_BLEND); + Minecraft.getMinecraft() .getTextureManager() .bindTexture(TextureMap.locationItemsTexture); + GL11.glEnable(GL11.GL_BLEND); - IIcon icon = ItemHeavenlyRing.wingIcons[meta]; + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + IIcon icon = ring.wingIcons[meta]; + + // Derive scale + float scaleX = icon.getIconWidth() / 16.0F; + float scaleY = icon.getIconHeight() / 16.0F; - // 1.5 3 0.1 20 25 0.001 // Left wing GL11.glPushMatrix(); GL11.glTranslatef(0.0625F, -0.3125F, 0.125F); GL11.glRotatef(-(WING_MIN + angle), 0, 1, 0); if (Minecraft.getMinecraft().gameSettings.fancyGraphics) { + GL11.glScalef(scaleX, scaleY, 1.0F); GL11.glTranslatef(0, 1, 0); GL11.glRotatef(180, 1, 0, 0); ItemRenderer.renderItemIn2D( @@ -62,9 +73,9 @@ public static void render(int meta, float angle) { -0.03125F); } else { t.startDrawingQuads(); - t.addVertexWithUV(0, 1, 0, icon.getMinU(), icon.getMaxV()); - t.addVertexWithUV(1, 1, 0, icon.getMaxU(), icon.getMaxV()); - t.addVertexWithUV(1, 0, 0, icon.getMaxU(), icon.getMinV()); + t.addVertexWithUV(0, scaleY, 0, icon.getMinU(), icon.getMaxV()); + t.addVertexWithUV(scaleX, scaleY, 0, icon.getMaxU(), icon.getMaxV()); + t.addVertexWithUV(scaleX, 0, 0, icon.getMaxU(), icon.getMinV()); t.addVertexWithUV(0, 0, 0, icon.getMinU(), icon.getMinV()); t.draw(); } @@ -75,6 +86,7 @@ public static void render(int meta, float angle) { GL11.glTranslatef(-0.0625F, -0.3125F, 0.125F); GL11.glRotatef((-180 + WING_MIN) + angle, 0, 1, 0); if (Minecraft.getMinecraft().gameSettings.fancyGraphics) { + GL11.glScalef(scaleX, scaleY, 1.0F); GL11.glTranslatef(0, 1, 0); GL11.glRotatef(180, 1, 0, 0); ItemRenderer.renderItemIn2D( @@ -88,15 +100,15 @@ public static void render(int meta, float angle) { 0.03125F); } else { t.startDrawingQuads(); - t.addVertexWithUV(0, 1, 0, icon.getMinU(), icon.getMaxV()); - t.addVertexWithUV(1, 1, 0, icon.getMaxU(), icon.getMaxV()); - t.addVertexWithUV(1, 0, 0, icon.getMaxU(), icon.getMinV()); + t.addVertexWithUV(0, scaleY, 0, icon.getMinU(), icon.getMaxV()); + t.addVertexWithUV(scaleX, scaleY, 0, icon.getMaxU(), icon.getMaxV()); + t.addVertexWithUV(scaleX, 0, 0, icon.getMaxU(), icon.getMinV()); t.addVertexWithUV(0, 0, 0, icon.getMinU(), icon.getMinV()); t.draw(); } GL11.glPopMatrix(); - GL11.glDisable(GL11.GL_BLEND); + if (!blendWasEnabled) GL11.glDisable(GL11.GL_BLEND); GL11.glBindTexture(GL11.GL_TEXTURE_2D, boundTexIndex); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/SpikeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/SpikeRenderer.java deleted file mode 100644 index c40de898..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/SpikeRenderer.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.common.renderers; - -import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.spikeRenderID; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; - -import com.fouristhenumber.utilitiesinexcess.utils.RenderableCube; -import com.gtnewhorizons.angelica.api.ThreadSafeISBRH; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -@ThreadSafeISBRH(perThread = false) -public class SpikeRenderer implements ISimpleBlockRenderingHandler { - - final static List cubes = new ArrayList(); - - static final int TEXTURE_SIZE = 64; - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, - RenderBlocks renderer) { - Tessellator t = Tessellator.instance; - IIcon icon = renderer.getBlockIcon(block); - for (RenderableCube c : cubes) { - c.draw(t, x, y, z, icon, TEXTURE_SIZE, true); - } - return true; - } - - @Override - public void renderInventoryBlock(Block block, int meta, int modelId, RenderBlocks renderer) { - Tessellator t = Tessellator.instance; - IIcon icon = renderer.getBlockIcon(block); - t.startDrawingQuads(); - for (RenderableCube c : cubes) { - c.draw(t, 0, 0, 0, icon, TEXTURE_SIZE, true); - } - t.draw(); - } - - static { - // base - cubes.add( - new RenderableCube( - 0, - 0, - 0, - 1F, - 0.0625F, - 1F, - new float[][] { { 16, 0, 31, 15 }, { 32, 0, 47, 15 }, { 0, 16, 15, 16 }, { 0, 16, 15, 16 }, - { 0, 16, 15, 16 }, { 0, 16, 15, 16 } })); - - // layer 2 plates - - float[][] layer2uv = new float[][] { { 6, 17, 11, 22 }, { 12, 17, 17, 22 }, { 0, 23, 5, 23 }, { 6, 23, 11, 23 }, - { 12, 23, 17, 23 }, { 18, 23, 23, 23 } }; - - cubes.add(new RenderableCube(0.0625F, 0.0625F, 0.0625F, 0.4375F, 0.125F, 0.4375F, layer2uv)); - - cubes.add(new RenderableCube(0.5625F, 0.0625F, 0.0625F, 0.9375F, 0.125F, 0.4375F, layer2uv)); - - cubes.add(new RenderableCube(0.0625F, 0.0625F, 0.5625F, 0.4375F, 0.125F, 0.9375F, layer2uv)); - - cubes.add(new RenderableCube(0.5625F, 0.0625F, 0.5625F, 0.9375F, 0.125F, 0.9375F, layer2uv)); - - // layer 3 plates - - float[][] layer3uv = new float[][] { { 28, 18, 31, 21 }, { 32, 18, 35, 21 }, { 24, 22, 27, 23 }, - { 28, 22, 31, 23 }, { 32, 22, 35, 23 }, { 36, 22, 39, 23 } }; - - cubes.add(new RenderableCube(0.125F, 0.125F, 0.125F, 0.375F, 0.25F, 0.375F, layer3uv)); - - cubes.add(new RenderableCube(0.625F, 0.125F, 0.125F, 0.875F, 0.25F, 0.375F, layer3uv)); - - cubes.add(new RenderableCube(0.125F, 0.125F, 0.625F, 0.375F, 0.25F, 0.875F, layer3uv)); - - cubes.add(new RenderableCube(0.625F, 0.125F, 0.625F, 0.875F, 0.25F, 0.875F, layer3uv)); - - // layer 4 plates - - float[][] layer4uv = new float[][] { { 2, 0, 3, 1 }, { 4, 0, 5, 1 }, { 0, 2, 1, 4 }, { 2, 2, 3, 4 }, - { 4, 2, 5, 4 }, { 6, 2, 7, 4 } }; - - cubes.add(new RenderableCube(0.1875F, 0.25F, 0.1875F, 0.3125F, 0.4375F, 0.3125F, layer4uv)); - - cubes.add(new RenderableCube(0.6875F, 0.25F, 0.1875F, 0.8125F, 0.4375F, 0.3125F, layer4uv)); - - cubes.add(new RenderableCube(0.1875F, 0.25F, 0.6875F, 0.3125F, 0.4375F, 0.8125F, layer4uv)); - - cubes.add(new RenderableCube(0.6875F, 0.25F, 0.6875F, 0.8125F, 0.4375F, 0.8125F, layer4uv)); - - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } - - @Override - public int getRenderId() { - return spikeRenderID; - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java index 74ab244d..d270d623 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/WireframeRenderer.java @@ -34,7 +34,7 @@ public static void addCandidatePosition(BlockPos pos) { } public static void clearCandidatePositions() { - if (!candidatePositions.isEmpty()) candidatePositions.clear(); + candidatePositions.clear(); } @EventBusSubscriber.Condition diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityAdvancedBlockUpdateDetector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityAdvancedBlockUpdateDetector.java new file mode 100644 index 00000000..46d8c272 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityAdvancedBlockUpdateDetector.java @@ -0,0 +1,145 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import java.util.Objects; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityAdvancedBlockUpdateDetector extends TileEntity { + + private boolean isProvidingPower = false; + private int pulseTimer = 0; + private final boolean[] scanningOnFace = { true, true, true, true, true, true }; + private final Block[] blockOnPreviousTick = new Block[ForgeDirection.VALID_DIRECTIONS.length]; + private final int[] blockMetadataOnPreviousTick = new int[ForgeDirection.VALID_DIRECTIONS.length]; + private final NBTTagCompound[] tileEntityNBTCompoundOnPreviousTick = new NBTTagCompound[ForgeDirection.VALID_DIRECTIONS.length]; + + public void toggleFace(int face) { + scanningOnFace[face] = !scanningOnFace[face]; + } + + public boolean getScanning(int face) { + return scanningOnFace[face]; + } + + @Override + public void updateEntity() { + if (worldObj.isRemote) { + return; + } + + if (isProvidingPower && pulseTimer > 0) { + pulseTimer--; + isProvidingPower = false; + updateBlockState(); + worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); + } + + for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + if (!scanningOnFace[i]) { + continue; + } + ForgeDirection neighborDirection = ForgeDirection.getOrientation(i); + Block blockOnCurrentTick = worldObj.getBlock( + xCoord + neighborDirection.offsetX, + yCoord + neighborDirection.offsetY, + zCoord + neighborDirection.offsetZ); + int blockMetadataOnCurrentTick = worldObj.getBlockMetadata( + xCoord + neighborDirection.offsetX, + yCoord + neighborDirection.offsetY, + zCoord + neighborDirection.offsetZ); + if (blockOnPreviousTick[i] == null) { + blockOnPreviousTick[i] = blockOnCurrentTick; + } else if (blockOnCurrentTick != blockOnPreviousTick[i] && !(blockOnCurrentTick == Blocks.redstone_wire)) { + sendRedstonePulse(); + blockOnPreviousTick[i] = blockOnCurrentTick; + blockMetadataOnPreviousTick[i] = blockMetadataOnCurrentTick; + break; + } else { + if (blockMetadataOnCurrentTick != blockMetadataOnPreviousTick[i]) { + sendRedstonePulse(); + blockOnPreviousTick[i] = blockOnCurrentTick; + blockMetadataOnPreviousTick[i] = blockMetadataOnCurrentTick; + break; + } + blockMetadataOnPreviousTick[i] = blockMetadataOnCurrentTick; + } + if (blockOnCurrentTick.hasTileEntity(blockMetadataOnPreviousTick[i])) { + if (!blockOnPreviousTick[i].hasTileEntity(blockMetadataOnPreviousTick[i])) { + sendRedstonePulse(); + blockOnPreviousTick[i] = blockOnCurrentTick; + break; + } + NBTTagCompound tileEntityNBTCompoundOnCurrentTick = new NBTTagCompound(); + worldObj + .getTileEntity( + xCoord + neighborDirection.offsetX, + yCoord + neighborDirection.offsetY, + zCoord + neighborDirection.offsetZ) + .writeToNBT(tileEntityNBTCompoundOnCurrentTick); + if (tileEntityNBTCompoundOnPreviousTick[i] == null) { + blockOnPreviousTick[i] = blockOnCurrentTick; + tileEntityNBTCompoundOnPreviousTick[i] = tileEntityNBTCompoundOnCurrentTick; + } else + if (!Objects.equals(tileEntityNBTCompoundOnCurrentTick, tileEntityNBTCompoundOnPreviousTick[i])) { + sendRedstonePulse(); + blockOnPreviousTick[i] = blockOnCurrentTick; + tileEntityNBTCompoundOnPreviousTick[i] = tileEntityNBTCompoundOnCurrentTick; + break; + } + tileEntityNBTCompoundOnPreviousTick[i] = tileEntityNBTCompoundOnCurrentTick; + } + blockOnPreviousTick[i] = blockOnCurrentTick; + } + } + + private void updateBlockState() { + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + int newMeta = isProvidingPower ? 1 : 0; + + if (meta != newMeta) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, newMeta, 3); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + byte scannedFaces = compound.getByte("faces"); + for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + scanningOnFace[i] = (scannedFaces >> i) > 0; + } + isProvidingPower = compound.getBoolean("powered"); + pulseTimer = compound.getInteger("pulse"); + } + + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + byte scannedFaces = 0; + for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) { + scannedFaces += (byte) ((scanningOnFace[i] ? 1 : 0) << i); + } + compound.setByte("faces", scannedFaces); + compound.setBoolean("powered", isProvidingPower); + compound.setInteger("pulse", pulseTimer); + } + + private void sendRedstonePulse() { + if (!isProvidingPower) { + isProvidingPower = true; + pulseTimer++; + updateBlockState(); + worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); + worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, getBlockType(), 1); + } + } + + public int getOutputPower() { + return isProvidingPower ? 15 : 0; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java index 03ecb843..29ac554f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityBlockUpdateDetector.java @@ -17,6 +17,7 @@ public void updateEntity() { pulseTimer--; if (pulseTimer <= 0) { isProvidingPower = false; + updateBlockState(); worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); } } @@ -26,11 +27,22 @@ public void onNeighborUpdate() { if (!isProvidingPower) { isProvidingPower = true; pulseTimer++; + updateBlockState(); worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, getBlockType(), 1); } } + private void updateBlockState() { + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + int newMeta = isProvidingPower ? 1 : 0; + + if (meta != newMeta) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, newMeta, 3); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + public int getOutputPower() { return isProvidingPower ? 15 : 0; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityChandelier.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityChandelier.java new file mode 100644 index 00000000..5f43bfc9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityChandelier.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.tileentity.TileEntity; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +public class TileEntityChandelier extends TileEntity { + + @Override + public boolean canUpdate() { + return false; + } + + // placed or loaded from chunk + @Override + public void validate() { + super.validate(); + UtilitiesInExcess.proxy.mobSpawnBlockChecks + .put(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, BlockConfig.chandelier.chandelierLightRange); + } + + // removed or unloaded + @Override + public void invalidate() { + UtilitiesInExcess.proxy.mobSpawnBlockChecks.remove(worldObj.provider.dimensionId, xCoord, yCoord, zCoord); + super.invalidate(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityGigaTorch.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityGigaTorch.java new file mode 100644 index 00000000..4ee8ab1e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityGigaTorch.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities; + +import net.minecraft.tileentity.TileEntity; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; + +public class TileEntityGigaTorch extends TileEntity { + + @Override + public boolean canUpdate() { + return false; + } + + // placed or loaded from chunk + @Override + public void validate() { + super.validate(); + UtilitiesInExcess.proxy.mobSpawnBlockChecks + .put(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, BlockConfig.gigaTorch.gigaTorchRange); + } + + // removed or unloaded + @Override + public void invalidate() { + UtilitiesInExcess.proxy.mobSpawnBlockChecks.remove(worldObj.provider.dimensionId, xCoord, yCoord, zCoord); + super.invalidate(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java index 301216d6..d8273603 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityRedstoneClock.java @@ -7,51 +7,46 @@ public class TileEntityRedstoneClock extends TileEntity { private boolean powered = false; private boolean outputOn = false; - private int timer = 0; - private final int TIMER_FREQUENCY_IN_TICKS = 20; + private int timer = 20; @Override public void updateEntity() { if (worldObj.isRemote) return; - if (!powered) { - timer = (timer + 1) % TIMER_FREQUENCY_IN_TICKS; - boolean newState = (timer < 2); - if (newState != outputOn) { - outputOn = newState; - notifyNeighbors(); - } - } else { - if (outputOn) { - outputOn = false; - notifyNeighbors(); - } - timer = 0; + boolean prevOutput = outputOn; + + outputOn = false; + // Clock does not deactivate during the period where it emits redstone, in order to prevent the clock + // from disabling itself. + timer--; + if (timer <= 1) { + outputOn = true; + if (timer <= 0) timer = 20; + } else if (powered) { + timer = 20; } + + if (prevOutput != outputOn) updateBlockState(); + } public void onInputChanged() { - boolean nowPowered = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); - if (nowPowered != powered) { - powered = nowPowered; - if (powered) { - outputOn = false; - notifyNeighbors(); - } - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord), 1); + powered = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); + } + + private void updateBlockState() { + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + int newMeta = outputOn ? 1 : 0; + + if (meta != newMeta) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, newMeta, 3); } } - // Return 0 or 15 for our block’s power output public int getOutputPower() { return outputOn ? 15 : 0; } - private void notifyNeighbors() { - worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord)); - } - @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java index e712ef73..016f9f21 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanFluid.java @@ -26,7 +26,6 @@ import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; public class TileEntityTrashCanFluid extends TileEntity implements IGuiHolder, ISidedInventory, IFluidHandler { @@ -87,7 +86,7 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet new ParentWidget<>().coverChildren() .topRelAnchor(0, 1) .child( - IKey.str(StatCollector.translateToLocal("tile.trash_can_fluid.name")) + IKey.str(StatCollector.translateToLocal("gui.title.trash_can_fluid.name")) .asWidget() .marginLeft(5) .marginRight(5) @@ -130,7 +129,6 @@ public void writeToNBT(NBTTagCompound compound) { @Override public void readFromNBT(NBTTagCompound compound) { - UtilitiesInExcess.LOG.info(compound); super.readFromNBT(compound); if (compound.hasKey("slotIn")) { ItemStack slotIn = new ItemStack(Items.feather, 1); @@ -191,14 +189,10 @@ public boolean isUseableByPlayer(EntityPlayer player) { } @Override - public void openInventory() { - - } + public void openInventory() {} @Override - public void closeInventory() { - - } + public void closeInventory() {} @Override public boolean isItemValidForSlot(int index, ItemStack stack) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java index 0c8bd21e..48e636f0 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityTrashCanItem.java @@ -2,9 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.StatCollector; @@ -17,13 +15,11 @@ import com.cleanroommc.modularui.utils.item.InvWrapper; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.ParentWidget; -import com.cleanroommc.modularui.widgets.layout.Grid; import com.cleanroommc.modularui.widgets.slot.ItemSlot; import com.cleanroommc.modularui.widgets.slot.ModularSlot; import com.cleanroommc.modularui.widgets.slot.SlotGroup; -import com.fouristhenumber.utilitiesinexcess.utils.VoidingInventory; -public class TileEntityTrashCanItem extends TileEntity implements IGuiHolder, ISidedInventory { +public class TileEntityTrashCanItem extends TileEntity implements IGuiHolder, IInventory { @Override public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { @@ -33,42 +29,27 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet ModularPanel panel = new ModularPanel("panel"); panel.bindPlayerInventory(); - // Add title panel.child( new ParentWidget<>().coverChildren() .topRelAnchor(0, 1) .child( - IKey.str(StatCollector.translateToLocal("tile.trash_can_item.name")) + IKey.str(StatCollector.translateToLocal("gui.title.trash_can.name")) .asWidget() .marginLeft(5) .marginRight(5) .marginTop(5) .marginBottom(-15))); - // Create voiding inventory - IInventory inv = new VoidingInventory(1, "Trash Can"); - IItemHandler itemHandler = new InvWrapper(inv); + IItemHandler itemHandler = new InvWrapper(this); ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); - // Add item slot panel.child( - new Grid().coverChildren() - .pos(79, 34) - .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + new ItemSlot().slot(slot) + .pos(79, 34)); return panel; } - @Override - public void writeToNBT(NBTTagCompound compound) { - super.writeToNBT(compound); - } - - @Override - public void readFromNBT(NBTTagCompound compound) { - super.readFromNBT(compound); - } - @Override public int getSizeInventory() { return 999; @@ -94,7 +75,7 @@ public void setInventorySlotContents(int index, ItemStack stack) {} @Override public String getInventoryName() { - return StatCollector.translateToLocal("tile.trash_can_item.name"); + return StatCollector.translateToLocal("gui.title.trash_can.name"); } @Override @@ -104,7 +85,7 @@ public boolean hasCustomInventoryName() { @Override public int getInventoryStackLimit() { - return 999; + return Integer.MAX_VALUE; } @Override @@ -113,32 +94,13 @@ public boolean isUseableByPlayer(EntityPlayer player) { } @Override - public void openInventory() { - - } + public void openInventory() {} @Override - public void closeInventory() { - - } + public void closeInventory() {} @Override public boolean isItemValidForSlot(int index, ItemStack stack) { return true; } - - @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) { - return new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - } - - @Override - public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { - return true; - } - - @Override - public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { - return false; - } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java index 63398a9c..00a2e531 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/generators/TileEntityBaseGenerator.java @@ -230,7 +230,7 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .tooltipDynamic( tt -> tt.add( StatCollector.translateToLocalFormatted( - "gui.energy.tooltip", + "gui.tooltip.energy-max", formatNumber(energySyncer.getIntValue()), formatNumber(maxEnergySyncer.getIntValue()))))); @@ -246,7 +246,9 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet panel.childIf( showGenerationRate(), - IKey.dynamic(() -> (multSyncer.getIntValue() * rftSyncer.getIntValue() + " RF/t")) + IKey.dynamic( + () -> (multSyncer.getIntValue() * rftSyncer.getIntValue() + + StatCollector.translateToLocal("gui.tooltip.energy-tick"))) .asWidget() .pos(10, 62)); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPItems.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPItems.java new file mode 100644 index 00000000..969c8774 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPItems.java @@ -0,0 +1,60 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemDisabled; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.UEMultipartItem; +import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; + +import cpw.mods.fml.common.registry.GameRegistry; + +public enum FMPItems { + + UE_MULTI_PART(true, new UEMultipartItem(), "multi_part_item"); + + public static final FMPItems[] VALUES = values(); + + public static void init() { + for (FMPItems item : VALUES) { + if (item.isEnabled()) { + item.theItem.setCreativeTab(UtilitiesInExcess.uieTab); + GameRegistry.registerItem(item.get(), item.name); + } else if (ItemConfig.registerDisabledItems) GameRegistry.registerItem(item.disabledVersion, item.name); + } + } + + private final boolean isEnabled; + private final Item theItem; + private final String name; + private final ItemDisabled disabledVersion; + + FMPItems(boolean enabled, Item item, String name) { + this.isEnabled = enabled; + theItem = item; + this.name = name; + if (ItemConfig.registerDisabledItems) disabledVersion = new ItemDisabled(theItem); + else disabledVersion = null; + } + + public boolean isEnabled() { + return isEnabled; + } + + public Item get() { + return theItem; + } + + public ItemStack newItemStack() { + return newItemStack(1); + } + + public ItemStack newItemStack(int count) { + return newItemStack(count, 0); + } + + public ItemStack newItemStack(int count, int meta) { + return new ItemStack(this.get(), count, meta); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPRecipeLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPRecipeLoader.java new file mode 100644 index 00000000..0c73e062 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/FMPRecipeLoader.java @@ -0,0 +1,72 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.common.recipe.DisableableItemStack; + +import codechicken.microblock.EdgeMicroClass; +import codechicken.microblock.FaceMicroClass; +import codechicken.microblock.ItemMicroPart; +import codechicken.microblock.MicroMaterialRegistry; +import scala.Tuple2; + +public class FMPRecipeLoader { + + public static void run() { + + for (Tuple2 material : MicroMaterialRegistry.getIdMap()) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("mat", material._1()); + + // Fence + addShapedRecipe( + withTag(FMPItems.UE_MULTI_PART.newItemStack(2, 0), tag), + "pPp", + "pPp", + " P ", + 'p', + ItemMicroPart.create((EdgeMicroClass.getClassId() << 8) | 2, material._1()), // Post + 'P', + ItemMicroPart.create((EdgeMicroClass.getClassId() << 8) | 4, material._1()) // Pillar + ); + + // Wall + addShapedRecipe( + withTag(FMPItems.UE_MULTI_PART.newItemStack(5, 1), tag), + " B ", + "SBS", + "SBS", + 'B', + MicroMaterialRegistry.getMaterial(material._1()) + .getItem(), // Block the material is derived from + 'S', + ItemMicroPart.create((FaceMicroClass.getClassId() << 8) | 4, material._1()) // Slab + ); + + // Sphere + addShapedRecipe( + withTag(FMPItems.UE_MULTI_PART.newItemStack(1, 2), tag), + "CSC", + "SUS", + "CSC", + 'S', + ItemMicroPart.create((FaceMicroClass.getClassId() << 8) | 4, material._1()), // Slab + 'B', + ModBlocks.INVERTED_BLOCK.newItemStack(), + 'C', + ItemMicroPart.create((FaceMicroClass.getClassId() << 8) | 1, material._1()) // Cover + ); + } + } + + public static ItemStack withTag(ItemStack stack, NBTTagCompound tag) { + stack.setTagCompound(tag); + return stack; + } + + private static boolean addShapedRecipe(Object outputObject, Object... params) { + return DisableableItemStack.addShapedRecipe(outputObject, params); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/ConnectablePart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/ConnectablePart.java new file mode 100644 index 00000000..9adc4ab9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/ConnectablePart.java @@ -0,0 +1,242 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import static net.minecraft.client.renderer.RenderGlobal.drawOutlinedBoundingBox; + +import java.util.EnumMap; +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.data.MCDataOutput; +import codechicken.lib.vec.Cuboid6; +import codechicken.multipart.BlockMultipart; +import codechicken.multipart.TMultiPart; +import codechicken.multipart.TileMultipart; +import it.unimi.dsi.fastutil.Pair; + +public abstract class ConnectablePart extends MaterialBasedPart { + + public static final Map iteratorKey; + static { + Map map = new EnumMap<>(ForgeDirection.class); + + map.put( + ForgeDirection.DOWN, + new ForgeDirection[] { ForgeDirection.NORTH, ForgeDirection.WEST, ForgeDirection.SOUTH, + ForgeDirection.EAST }); + map.put( + ForgeDirection.UP, + new ForgeDirection[] { ForgeDirection.SOUTH, ForgeDirection.WEST, ForgeDirection.NORTH, + ForgeDirection.EAST }); + map.put( + ForgeDirection.EAST, + new ForgeDirection[] { ForgeDirection.NORTH, ForgeDirection.DOWN, ForgeDirection.SOUTH, + ForgeDirection.UP }); + map.put( + ForgeDirection.WEST, + new ForgeDirection[] { ForgeDirection.NORTH, ForgeDirection.UP, ForgeDirection.SOUTH, + ForgeDirection.DOWN }); + map.put( + ForgeDirection.NORTH, + new ForgeDirection[] { ForgeDirection.UP, ForgeDirection.WEST, ForgeDirection.DOWN, ForgeDirection.EAST }); + map.put( + ForgeDirection.SOUTH, + new ForgeDirection[] { ForgeDirection.DOWN, ForgeDirection.WEST, ForgeDirection.UP, ForgeDirection.EAST }); + + iteratorKey = map; + } + + // What direction is "down" for the connectable part + public ForgeDirection downDirection; + + ConnectablePart(int side) { + this.downDirection = ForgeDirection.getOrientation(side); + } + + // Is there a better way to implement this? + protected boolean doPartsOccludeDirection(ForgeDirection side) { + for (TMultiPart part : tile().jPartList()) { + if (part != this) { + for (Cuboid6 cube : part.getSubParts()) { + if (cube.intersects(getConnectionInDirection(side))) { + return true; + } + } + } + } + return false; + } + + public abstract Cuboid6 getConnectionInDirection(ForgeDirection side); + + // TODO CACHE THESE RESULTS + public boolean canConnectOnSide(ForgeDirection side) { + if (tile() == null) { + return false; + } + if (doPartsOccludeDirection(side)) { + return false; + } + int offsetX = x() + side.offsetX; + int offsetY = y() + side.offsetY; + int offsetZ = z() + side.offsetZ; + Block block = world().getBlock(offsetX, offsetY, offsetZ); + if (block.isSideSolid(world(), offsetX, offsetY, offsetZ, side.getOpposite()) && block.renderAsNormalBlock() + && block.getMaterial() + .isOpaque()) { + return true; + } else if (block instanceof BlockMultipart) { + if (world().getTileEntity(offsetX, offsetY, offsetZ) instanceof TileMultipart mpTile) { + for (TMultiPart part : mpTile.jPartList()) { + if (part instanceof ConnectablePart cPart && part.getClass() == this.getClass() + && cPart.downDirection == this.downDirection + && !cPart.doPartsOccludeDirection(side.getOpposite())) { + return true; + } + } + return false; + } + } + return false; + } + + public int getConnectionMask() { + int mask = 0b0000; + ForgeDirection[] iteratorList = iteratorKey.get(downDirection); + for (int i = 0; i < iteratorList.length; i++) { + if (canConnectOnSide(iteratorList[i])) { + mask = mask | 1 << i; + } + } + return mask; + } + + public int getCullMask(int relativeDirection) { + return switch (relativeDirection) { + case (1), (3) -> transformCullMask(0b110000); + case (0), (2) -> transformCullMask(0b001100); + default -> 0; + }; + } + + private int transformCullMask(int mask) { + switch (downDirection) { + case DOWN, UP -> { + return mask; + } + case NORTH, SOUTH -> { + if (mask == 0b001100) { + return mask >> 2; + } + return mask; + } + case WEST, EAST -> { + if (mask == 0b110000) { + return mask >> 4; + } + return mask; + } + case UNKNOWN -> { + throw new IllegalArgumentException( + "Switch falloff in transforming the cullmask in a connectable part."); + } + } + return mask; + } + + @Override + public void save(NBTTagCompound tag) { + super.save(tag); + tag.setInteger("side", this.downDirection.ordinal()); + } + + @Override + public void load(NBTTagCompound tag) { + super.load(tag); + downDirection = ForgeDirection.getOrientation(tag.getInteger("side")); + } + + @Override + public void writeDesc(MCDataOutput packet) { + super.writeDesc(packet); + packet.writeInt(this.downDirection.ordinal()); + } + + protected int indexInFrame(ForgeDirection side) { + ForgeDirection[] frame = iteratorKey.get(downDirection); + for (int i = 0; i < frame.length; i++) { + if (frame[i] == side) { + return i; + } + } + throw new IllegalArgumentException( + "Somehow multipart connectable is trying to access a direction outside of it's frame!"); + } + + public boolean drawConnecableHighLight(MovingObjectPosition hit, EntityPlayer player, float frame, + Iterable> highlightCuboidList) { + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.4F); + GL11.glLineWidth(2.0F); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDepthMask(false); + double dx = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) frame; + double dy = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) frame; + double dz = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double) frame; + + ForgeDirection[] iteratorList = iteratorKey.get(downDirection); + + for (Pair cubeWithDirInfo : highlightCuboidList) { + AxisAlignedBB bb = cubeWithDirInfo.second() + .toAABB() + .offset(x(), y(), z()); + if (cubeWithDirInfo.first() != -1) { + switch (iteratorList[cubeWithDirInfo.first()]) { + case UP: { + bb.minY += 0.004F; + break; + } + case DOWN: { + bb.maxY -= 0.004F; + break; + } + case NORTH: { + bb.maxZ -= 0.004F; + break; + } + case SOUTH: { + bb.minZ += 0.004F; + break; + } + case EAST: { + bb.minX += 0.004F; + break; + } + case WEST: { + bb.maxX -= 0.004F; + break; + } + } + } + drawOutlinedBoundingBox( + bb.expand(0.002F, 0.002F, 0.002F) + .getOffsetBoundingBox(-dx, -dy, -dz), + -1); + } + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + + return true; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/Content.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/Content.java new file mode 100644 index 00000000..689571a8 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/Content.java @@ -0,0 +1,65 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import net.minecraft.nbt.NBTTagCompound; + +import codechicken.lib.data.MCDataInput; +import codechicken.microblock.MicroMaterialRegistry; +import codechicken.multipart.MultiPartRegistry; +import codechicken.multipart.TMultiPart; + +// This is basically the part factory. +public class Content implements MultiPartRegistry.IPartFactory2 { + + public static final String[] partNames = new String[] { FencePart.name, WallPart.name, SpherePart.name }; + public static final Map partMap = new HashMap<>(); + + public static final Set sidedParts = new HashSet<>(); + + public void init() { + for (int i = 0; i < partNames.length; i++) { + partMap.put(partNames[i], i); + } + sidedParts.add(WallPart.name); + sidedParts.add(FencePart.name); + MultiPartRegistry.registerParts(this, partNames); + } + + public UEMultipart createUEMultiPart(boolean isClient, int material, int side, String name) { + switch (name) { + case ("ue_fence"): { + return new FencePart(material, side); + } + case ("ue_wall"): { + return new WallPart(material, side); + } + case ("ue_sphere"): { + return new SpherePart(material); + } + } + return null; + } + + // Called on the server + @Override + public TMultiPart createPart(String name, NBTTagCompound nbt) { + return createUEMultiPart( + false, + MicroMaterialRegistry.materialID(nbt.getString("material")), + nbt.getInteger("side"), + name); + } + + // Called on the client + @Override + public TMultiPart createPart(String name, MCDataInput packet) { + if (sidedParts.contains(name)) { + return createUEMultiPart(true, MicroMaterialRegistry.readMaterialID(packet), packet.readInt(), name); + } + return createUEMultiPart(true, MicroMaterialRegistry.readMaterialID(packet), 0, name); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/FencePart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/FencePart.java new file mode 100644 index 00000000..faf6e12f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/FencePart.java @@ -0,0 +1,107 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.PRECOMPUTED_BOUNDS; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.PRECOMPUTED_COLLISION; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.PRECOMPUTED_MODEL; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.itemConnectorMiddle; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.itemConnectorNotch; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartFenceRenderingHelper.postBounds; + +import java.util.Arrays; +import java.util.Collections; +import java.util.stream.Collectors; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.MovingObjectPosition; +import net.minecraftforge.common.util.ForgeDirection; + +import codechicken.lib.raytracer.IndexedCuboid6; +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Vector3; +import codechicken.microblock.MicroblockRender; +import it.unimi.dsi.fastutil.Pair; + +public class FencePart extends ConnectablePart { + + public static final String name = "ue_fence"; + + public FencePart(int material, int side) { + super(side); + this.material = material; + } + + @Override + public Cuboid6 getConnectionInDirection(ForgeDirection side) { + return PRECOMPUTED_BOUNDS.get(downDirection)[15][indexInFrame(side) + 1].second(); + } + + @Override + public String getType() { + return name; + } + + @Override + public void render(Vector3 position, int pass) { + // Render post + if (pass == -1) { + // Posts + MicroblockRender.renderCuboid(position.add(0, 0, -.375), getIMaterial(), pass, postBounds, 0); + MicroblockRender.renderCuboid(position.add(0, 0, .750), getIMaterial(), pass, postBounds, 0); + + // Connectors & Notches TODO notches would be nice to remove if I could figure out how to wrap the texture + // with MicroblockRender + // Bottom Connector + MicroblockRender.renderCuboid(position.add(0, .3125, -.375), getIMaterial(), pass, itemConnectorMiddle, 0); + MicroblockRender.renderCuboid(position.add(0, 0, -.125), getIMaterial(), pass, itemConnectorNotch, 0); + MicroblockRender.renderCuboid(position.add(0, 0, 1.125), getIMaterial(), pass, itemConnectorNotch, 0); + + // Top Connector + MicroblockRender.renderCuboid(position.add(0, .5, -1), getIMaterial(), pass, itemConnectorMiddle, 0); + MicroblockRender.renderCuboid(position.add(0, 0, -.125), getIMaterial(), pass, itemConnectorNotch, 0); + MicroblockRender.renderCuboid(position.add(0, 0, 1.125), getIMaterial(), pass, itemConnectorNotch, 0); + } else { + Pair[] models = PRECOMPUTED_MODEL.get(this.downDirection)[getConnectionMask()]; + for (int i = 0; i < models.length; i++) { + if (i == 0) { + MicroblockRender.renderCuboid(position, getIMaterial(), pass, models[i].second(), 0); + } + MicroblockRender + .renderCuboid(position, getIMaterial(), pass, models[i].second(), getCullMask(models[i].first())); + } + } + } + + @Override + public Iterable getSubParts() { + return Arrays.stream(PRECOMPUTED_BOUNDS.get(downDirection)[getConnectionMask()]) + .map(t -> new IndexedCuboid6(0, t.second())) + .collect(Collectors.toList()); + } + + @Override + public Iterable getCollisionBoxes() { + return Arrays.asList(PRECOMPUTED_COLLISION.get(downDirection)[getConnectionMask()]); + } + + @Nonnull + @Override + public Cuboid6 getBounds() { + return postBounds; + } + + @Override + public Iterable getOcclusionBoxes() { + return Collections.singleton(PRECOMPUTED_BOUNDS.get(downDirection)[0][0].second()); + } + + @Override + public boolean drawHighlight(MovingObjectPosition hit, EntityPlayer player, float frame) { + return drawConnecableHighLight( + hit, + player, + frame, + Arrays.asList(PRECOMPUTED_BOUNDS.get(downDirection)[getConnectionMask()])); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/MaterialBasedPart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/MaterialBasedPart.java new file mode 100644 index 00000000..4c42ea2d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/MaterialBasedPart.java @@ -0,0 +1,64 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; + +import codechicken.lib.data.MCDataOutput; +import codechicken.lib.vec.Vector3; +import codechicken.microblock.MicroMaterialRegistry; + +public abstract class MaterialBasedPart extends UEMultipart { + + protected int material; + + @Override + public void save(NBTTagCompound tag) { + tag.setString("mat", MicroMaterialRegistry.materialName(material)); + } + + @Override + public void load(NBTTagCompound tag) { + material = MicroMaterialRegistry.materialID(tag.getString("mat")); + } + + @Override + public void writeDesc(MCDataOutput packet) { + MicroMaterialRegistry.writeMaterialID(packet, material); + } + + MicroMaterialRegistry.IMicroMaterial getIMaterial() { + return MicroMaterialRegistry.getMaterial(material); + } + + @Override + public IIcon getBreakingIcon(Object subPart, int side) { + return MicroMaterialRegistry.getMaterial(material) + .getBreakingIcon(side); + } + + @Override + public IIcon getBrokenIcon(int side) { + MicroMaterialRegistry.IMicroMaterial material = getIMaterial(); + if (material == null) { + return Blocks.stone.getIcon(0, 0); + } + return material.getBreakingIcon(side); + } + + @Override + public boolean renderStatic(Vector3 position, int pass) { + if (getIMaterial().canRenderInPass(pass)) { + render(position, pass); + return true; + } + return false; + } + + @Override + public ItemStack pickItem(MovingObjectPosition hit) { + return UEMultipartItem.createStack(material, Content.partMap.get(this.getType())); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/PipeCoverPart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/PipeCoverPart.java new file mode 100644 index 00000000..2d912cfd --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/PipeCoverPart.java @@ -0,0 +1,27 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Vector3; + +public class PipeCoverPart extends MaterialBasedPart { + + @Override + public String getType() { + return "ue_pipecover"; + } + + @Override + public void render(Vector3 position, int pass) { + + } + + @Override + public Cuboid6 getBounds() { + return null; + } + + @Override + public Iterable getOcclusionBoxes() { + return null; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/SpherePart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/SpherePart.java new file mode 100644 index 00000000..375b678f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/SpherePart.java @@ -0,0 +1,50 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.SphereRenderingHelper.RenderMicroMaterialSphere; + +import java.util.Collections; + +import codechicken.lib.raytracer.IndexedCuboid6; +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Vector3; + +public class SpherePart extends MaterialBasedPart { + + public static final Cuboid6 Bounds = new Cuboid6(0.125, 0.125, 0.125, 0.875, 0.875, 0.875); + + public final static String name = "ue_sphere"; + + public SpherePart(int material) { + this.material = material; + } + + @Override + public String getType() { + return name; + } + + @Override + public void render(Vector3 position, int pass) { + RenderMicroMaterialSphere(position, pass, getIMaterial(), world()); + } + + @Override + public Cuboid6 getBounds() { + return Bounds; + } + + @Override + public Iterable getOcclusionBoxes() { + return Collections.singleton(Bounds); + } + + @Override + public Iterable getCollisionBoxes() { + return Collections.singleton(Bounds); + } + + @Override + public Iterable getSubParts() { + return Collections.singleton(new IndexedCuboid6(0, Bounds)); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipart.java new file mode 100644 index 00000000..29ba1173 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipart.java @@ -0,0 +1,39 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import java.util.Collections; + +import net.minecraft.client.particle.EffectRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; + +import codechicken.lib.vec.Vector3; +import codechicken.multipart.IconHitEffects; +import codechicken.multipart.JIconHitEffects; +import codechicken.multipart.JNormalOcclusion; +import codechicken.multipart.NormalOcclusionTest; +import codechicken.multipart.TMultiPart; + +public abstract class UEMultipart extends TMultiPart implements JIconHitEffects, JNormalOcclusion { + + public abstract void render(Vector3 position, int pass); + + @Override + public Iterable getDrops() { + return Collections.singletonList(UEMultipartItem.createStack(this)); + } + + @Override + public void addDestroyEffects(EffectRenderer renderer) { + IconHitEffects.addDestroyEffects(this, renderer); + } + + @Override + public void addHitEffects(MovingObjectPosition movingObjectPosition, EffectRenderer renderer) { + IconHitEffects.addHitEffects(this, movingObjectPosition, renderer); + } + + @Override + public boolean occlusionTest(TMultiPart part) { + return NormalOcclusionTest.apply(this, part) && super.occlusionTest(part); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipartItem.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipartItem.java new file mode 100644 index 00000000..748b9707 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/UEMultipartItem.java @@ -0,0 +1,135 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content.partNames; + +import java.util.Arrays; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPItems; + +import codechicken.lib.raytracer.RayTracer; +import codechicken.lib.vec.BlockCoord; +import codechicken.microblock.MicroMaterialRegistry; +import codechicken.multipart.TMultiPart; +import codechicken.multipart.TileMultipart; + +// Most of this is just ripped from FMP ngl +public class UEMultipartItem extends Item { + + public UEMultipartItem() { + setUnlocalizedName("ue_microPartItem"); + setHasSubtypes(true); + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + MicroMaterialRegistry.IMicroMaterial material = getMaterial(stack); + int damage = getDamage(stack); + if (material == null || damage > partNames.length) { + return "Unnamed"; + } + return StatCollector.translateToLocalFormatted(partNames[damage] + ".name", material.getLocalizedName()); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List listOfStacks) { + Arrays.stream(MicroMaterialRegistry.getIdMap()) + .forEach(t -> { + for (int i = 0; i < partNames.length; i++) { + listOfStacks.add(createStack(t._1, i)); + } + }); + } + + @Override + public boolean onItemUse(ItemStack item, EntityPlayer player, World world, int x, int y, int z, int side, + float hitX, float hitY, float hitZ) { + int materialID = getMaterialID(item); + int damage = item.getItemDamage(); + if (materialID < 0 || damage > partNames.length) { + return false; + } + + MovingObjectPosition hit = RayTracer.retraceBlock(world, player, x, y, z); + BlockCoord position = new BlockCoord(x, y, z).offset(side); + TMultiPart potentialPart = new Content() + .createUEMultiPart(false, materialID, ForgeDirection.OPPOSITES[side], partNames[damage]); + if (hit != null && hit.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK + && TileMultipart.canPlacePart(world, position, potentialPart)) { + if (!world.isRemote) { + TileMultipart.addPart(world, position, potentialPart); + if (!player.capabilities.isCreativeMode) item.stackSize--; + + Block.SoundType sound = MicroMaterialRegistry.getMaterial(materialID) + .getSound(); + if (sound != null) world.playSoundEffect( + x + 0.5d, + y + 0.5d, + z + 0.5d, + sound.func_150496_b(), + (sound.getVolume() + 1.0f) / 2.0f, + sound.getPitch() * 0.8f); + } + + return true; + } + + return false; + } + + public static ItemStack createStack(String material, int damage) { + ItemStack stack = new ItemStack(FMPItems.UE_MULTI_PART.get(), 1, damage); + stack.stackTagCompound = new NBTTagCompound(); + stack.getTagCompound() + .setString("mat", material); + return stack; + } + + public static ItemStack createStack(UEMultipart part) { + if (part instanceof MaterialBasedPart matPart) { + return createStack(matPart.material, Content.partMap.get(part.getType())); + } + return null; + } + + public static ItemStack createStack(int materialID, int damage) { + return createStack(MicroMaterialRegistry.materialName(materialID), damage); + } + + public static MicroMaterialRegistry.IMicroMaterial getMaterial(ItemStack stack) { + if (stack.hasTagCompound()) { + if (!stack.getTagCompound() + .hasKey("mat")) { + return null; + } + return MicroMaterialRegistry.getMaterial( + stack.getTagCompound() + .getString("mat")); + } + return null; + } + + public static int getMaterialID(ItemStack stack) { + if (stack.hasTagCompound()) { + if (!stack.getTagCompound() + .hasKey("mat")) { + return 0; + } + return MicroMaterialRegistry.materialID( + stack.getTagCompound() + .getString("mat")); + } + return 0; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/WallPart.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/WallPart.java new file mode 100644 index 00000000..b4d74eba --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/multipart/WallPart.java @@ -0,0 +1,127 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.PRECOMPUTED_BOUNDS; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.PRECOMPUTED_COLLISION; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.PRECOMPUTED_MODEL; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.PRECOMPUTED_SIMPLE_MODEL; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.connectorNS; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper.postBounds; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.Rotate90AboutYBlockCenterPos; + +import java.util.Arrays; +import java.util.Collections; +import java.util.stream.Collectors; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.MovingObjectPosition; +import net.minecraftforge.common.util.ForgeDirection; + +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block.MultipartWallRenderingHelper; + +import codechicken.lib.raytracer.IndexedCuboid6; +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Vector3; +import codechicken.microblock.MicroblockRender; +import it.unimi.dsi.fastutil.Pair; + +public class WallPart extends ConnectablePart { + + public static final String name = "ue_wall"; + + public WallPart(int material, int side) { + super(side); + this.material = material; + } + + @Override + public String getType() { + return name; + } + + @Override + public void render(Vector3 position, int pass) { + // Render post + if (pass == -1) { + // Post + MicroblockRender.renderCuboid(position, getIMaterial(), pass, postBounds, 0); + // Connector + MicroblockRender + .renderCuboid(position, getIMaterial(), pass, Rotate90AboutYBlockCenterPos(connectorNS, 1), 0); + } else { + int mask = getConnectionMask(); + if (mask == 0b1010) { + Cuboid6 model = PRECOMPUTED_SIMPLE_MODEL.get(this.downDirection)[1]; + MicroblockRender.renderCuboid(position, getIMaterial(), pass, model, getCullMask(1)); + } else if (mask == 0b0101) { + Cuboid6 model = PRECOMPUTED_SIMPLE_MODEL.get(this.downDirection)[0]; + MicroblockRender.renderCuboid(position, getIMaterial(), pass, model, getCullMask(0)); + } else { + Pair[] models = PRECOMPUTED_MODEL.get(this.downDirection)[mask]; + for (int i = 0; i < models.length; i++) { + if (i == 0) { + MicroblockRender.renderCuboid(position, getIMaterial(), pass, models[i].second(), 0); + } else { + MicroblockRender.renderCuboid( + position, + getIMaterial(), + pass, + models[i].second(), + getCullMask(models[i].first())); + } + } + } + } + } + + @Override + public Cuboid6 getConnectionInDirection(ForgeDirection side) { + return PRECOMPUTED_BOUNDS.get(downDirection)[15][indexInFrame(side) + 1].second(); + } + + @Override + public Iterable getSubParts() { + int mask = getConnectionMask(); + if (mask == 0b1010) { + return Collections.singleton(new IndexedCuboid6(0, PRECOMPUTED_SIMPLE_MODEL.get(this.downDirection)[1])); + + } else if (mask == 0b0101) { + return Collections.singleton(new IndexedCuboid6(0, PRECOMPUTED_SIMPLE_MODEL.get(this.downDirection)[0])); + } + return Arrays.stream(PRECOMPUTED_BOUNDS.get(downDirection)[mask]) + .map(t -> new IndexedCuboid6(0, t.second())) + .collect(Collectors.toList()); + } + + @Override + public Iterable getCollisionBoxes() { + return Arrays.asList(PRECOMPUTED_COLLISION.get(downDirection)[getConnectionMask()]); + } + + @Nonnull + @Override + public Cuboid6 getBounds() { + return MultipartWallRenderingHelper.postBounds; + } + + @Override + public Iterable getOcclusionBoxes() { + return Collections.singleton(MultipartWallRenderingHelper.PRECOMPUTED_BOUNDS.get(downDirection)[0][0].second()); + } + + @Override + public boolean drawHighlight(MovingObjectPosition hit, EntityPlayer player, float frame) { + int mask = getConnectionMask(); + Iterable> highlightCuboidList; + if (mask == 0b1010) { + highlightCuboidList = Collections.singleton(Pair.of(-1, PRECOMPUTED_SIMPLE_MODEL.get(downDirection)[1])); + } else if (mask == 0b0101) { + highlightCuboidList = Collections.singleton(Pair.of(-1, PRECOMPUTED_SIMPLE_MODEL.get(downDirection)[0])); + } else { + highlightCuboidList = Arrays.asList(PRECOMPUTED_BOUNDS.get(downDirection)[mask]); + } + return drawConnecableHighLight(hit, player, frame, highlightCuboidList); + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartFenceRenderingHelper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartFenceRenderingHelper.java new file mode 100644 index 00000000..422f173b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartFenceRenderingHelper.java @@ -0,0 +1,153 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.Rotate90AboutYBlockCenterPos; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.RotateModel; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraftforge.common.util.ForgeDirection; + +import codechicken.lib.vec.Cuboid6; +import it.unimi.dsi.fastutil.Pair; + +public class MultipartFenceRenderingHelper { + + // Selection bounds defaulted to North side (-Z) + public static final Cuboid6 postBounds = new Cuboid6(.375, 0, .375, .625, 1, .625); + public static final Cuboid6 connectorBounds = new Cuboid6(0.4375, .375, 0, 0.5625, 0.9375, .375); + + // Defaulted on the North side (-Z) These are for rendering + public static final Cuboid6 connector = new Cuboid6(0.4375, 0.75, 0, 0.5625, 0.9375, 0.375); + public static final Cuboid6 connectorNS = new Cuboid6(0.4375, 0.75, 0, 0.5625, 0.9375, 1); + + // Collision bounds + public static final Cuboid6 postCollisionBounds = new Cuboid6(.375, 0, .375, .625, 1.5, .625); + public static final Cuboid6 connectorCollisionBounds = new Cuboid6(.375, 0, 0, .625, 1.5, .375); + + // Because of some vanilla weirdness we need to make two copies one for bounds that are vertical (as seen above). + // and one for bounds that are non-vertical. Rubberbanding happens if you don't do this. + public static final Cuboid6 getPostCollisionBoundsHorizontal = new Cuboid6(.375, 0, .375, .625, 1.0, .625); + public static final Cuboid6 connectorCollisionBoundsHorizontal = new Cuboid6(.375, 0, 0, .625, 1.0, .375); + + // Item rendering helpers + public static final Cuboid6 itemConnectorMiddle = new Cuboid6(.4375, 0, .25, .5625, .125, .75); + public static final Cuboid6 itemConnectorNotch = new Cuboid6(.4375, 0, 0, .5625, .125, .125); + + // Compute model/bounds/collision all at class initialization + public static final Map[][]> PRECOMPUTED_MODEL; + public static final Map[][]> PRECOMPUTED_BOUNDS; + public static final Map PRECOMPUTED_COLLISION; + + static { + PRECOMPUTED_MODEL = new HashMap<>(); + + // Make our base model in the down direction + Pair[][] baseModels = new Pair[16][]; + for (int i = 0; i < 16; i++) { + Pair[] values = new Pair[1 + 2 * Integer.bitCount(i)]; + values[0] = Pair.of(-1, postBounds); + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + 2 * count] = Pair.of(j, Rotate90AboutYBlockCenterPos(connector, j)); + values[2 + 2 * count] = Pair.of( + j, + Rotate90AboutYBlockCenterPos( + connector.copy() + .offset(new Cuboid6(0, -.375, 0, 0, -.375, 0)), + j)); + count++; + } + + } + } + baseModels[i] = values; + } + + PRECOMPUTED_MODEL.put(ForgeDirection.DOWN, baseModels); + + PRECOMPUTED_BOUNDS = new HashMap<>(); + + // Make our base bounds in the down direction + Pair[][] baseBounds = new Pair[16][]; + for (int i = 0; i < 16; i++) { + Pair[] values = new Pair[1 + Integer.bitCount(i)]; + values[0] = Pair.of(-1, postBounds); + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Pair.of(j, Rotate90AboutYBlockCenterPos(connectorBounds, j)); + count++; + } + + } + } + baseBounds[i] = values; + } + + PRECOMPUTED_BOUNDS.put(ForgeDirection.DOWN, baseBounds); + + PRECOMPUTED_COLLISION = new HashMap<>(); + + // Make our base bounds in the down direction + Cuboid6[][] baseCollision = new Cuboid6[16][]; + for (int i = 0; i < 16; i++) { + Cuboid6[] values = new Cuboid6[1 + Integer.bitCount(i)]; + values[0] = postCollisionBounds; + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Rotate90AboutYBlockCenterPos(connectorCollisionBounds, j); + count++; + } + + } + } + baseCollision[i] = values; + } + + // See comment about why we are doing this twice. + Cuboid6[][] baseCollisionNonVert = new Cuboid6[16][]; + for (int i = 0; i < 16; i++) { + Cuboid6[] values = new Cuboid6[1 + Integer.bitCount(i)]; + values[0] = getPostCollisionBoundsHorizontal; + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Rotate90AboutYBlockCenterPos(connectorCollisionBoundsHorizontal, j); + count++; + } + + } + } + baseCollisionNonVert[i] = values; + } + + PRECOMPUTED_COLLISION.put(ForgeDirection.DOWN, baseCollision); + + // The direction maps to the direction that it's place into. So if the post is hooked into the + // ground the forge direction is actually down. + for (int i = 0; i < ForgeDirection.values().length - 1; i++) { + Pair[][] modelList = new Pair[16][]; + Pair[][] boundsList = new Pair[16][]; + Cuboid6[][] collisionList = new Cuboid6[16][]; + ForgeDirection direction = ForgeDirection.getOrientation(i); + if (direction == ForgeDirection.DOWN) { + continue; + } + for (int j = 0; j < baseModels.length; j++) { + modelList[j] = RotateModel(baseModels[j], direction); + boundsList[j] = RotateModel(baseBounds[j], direction); + collisionList[j] = RotateModel(baseCollisionNonVert[j], direction); + } + PRECOMPUTED_MODEL.put(direction, modelList); + PRECOMPUTED_BOUNDS.put(direction, boundsList); + PRECOMPUTED_COLLISION.put(direction, collisionList); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartWallRenderingHelper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartWallRenderingHelper.java new file mode 100644 index 00000000..f2602c38 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/MultipartWallRenderingHelper.java @@ -0,0 +1,159 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.Rotate90AboutYBlockCenterPos; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.RotateCube; +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util.CuboidUtils.RotateModel; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraftforge.common.util.ForgeDirection; + +import codechicken.lib.vec.Cuboid6; +import it.unimi.dsi.fastutil.Pair; + +public class MultipartWallRenderingHelper { + + // Selection bounds defaulted to North side (-Z) + public static final Cuboid6 postBounds = new Cuboid6(.25, 0, .25, .75, 1, .75); + public static final Cuboid6 connectorBounds = new Cuboid6(0.3125, 0, 0, 0.6875, 0.8125, .25); + public static final Cuboid6 connectorNS = new Cuboid6(0.3125, 0, 0, 0.6875, 0.8125, 1.0); + + // Collision bounds + public static final Cuboid6 postCollisionBounds = new Cuboid6(.25, 0, .25, .75, 1.5, .75); + public static final Cuboid6 connectorCollisionBounds = new Cuboid6(0.3125, 0, 0, 0.6875, 1.5, .25); + + // Because of some vanilla weirdness we need to make two copies one for bounds that are vertical (as seen above). + // and one for bounds that are non-vertical. Rubberbanding happens if you don't do this. + public static final Cuboid6 getPostCollisionBoundsHorizontal = new Cuboid6(.25, 0, .25, .75, 1.0, .75); + public static final Cuboid6 connectorCollisionBoundsHorizontal = new Cuboid6(0.3125, 0, 0, 0.6875, 1.0, .25); + + // Compute model/bounds/collision all at class initialization + public static final Map[][]> PRECOMPUTED_MODEL; + public static final Map[][]> PRECOMPUTED_BOUNDS; + public static final Map PRECOMPUTED_COLLISION; + public static final Map PRECOMPUTED_SIMPLE_MODEL; + + static { + // BASIC MODEL + PRECOMPUTED_MODEL = new HashMap<>(); + + // Make our base model in the down direction + Pair[][] baseModels = new Pair[16][]; + for (int i = 0; i < 16; i++) { + Pair[] values = new Pair[1 + Integer.bitCount(i)]; + values[0] = Pair.of(-1, postBounds); + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Pair.of(j, Rotate90AboutYBlockCenterPos(connectorBounds, j)); + count++; + } + } + } + baseModels[i] = values; + } + + PRECOMPUTED_MODEL.put(ForgeDirection.DOWN, baseModels); + + // SIMPLE MODEL + PRECOMPUTED_SIMPLE_MODEL = new HashMap<>(); + + Cuboid6[] baseSimpleModel = new Cuboid6[2]; + baseSimpleModel[0] = connectorNS; + baseSimpleModel[1] = Rotate90AboutYBlockCenterPos(connectorNS, 1); + + PRECOMPUTED_SIMPLE_MODEL.put(ForgeDirection.DOWN, baseSimpleModel); + + // BOUNDS + PRECOMPUTED_BOUNDS = new HashMap<>(); + + // Make our base bounds in the down direction + Pair[][] baseBounds = new Pair[16][]; + for (int i = 0; i < 16; i++) { + Pair[] values = new Pair[1 + Integer.bitCount(i)]; + values[0] = Pair.of(-1, postBounds); + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Pair.of(j, Rotate90AboutYBlockCenterPos(connectorBounds, j)); + count++; + } + + } + } + baseBounds[i] = values; + } + + PRECOMPUTED_BOUNDS.put(ForgeDirection.DOWN, baseBounds); + + // COLLISION + PRECOMPUTED_COLLISION = new HashMap<>(); + + // Make our base bounds in the down direction + Cuboid6[][] baseCollision = new Cuboid6[16][]; + for (int i = 0; i < 16; i++) { + Cuboid6[] values = new Cuboid6[1 + Integer.bitCount(i)]; + values[0] = postCollisionBounds; + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Rotate90AboutYBlockCenterPos(connectorCollisionBounds, j); + count++; + } + + } + } + baseCollision[i] = values; + } + + // See comment about why we are doing this twice. + Cuboid6[][] baseCollisionNonVert = new Cuboid6[16][]; + for (int i = 0; i < 16; i++) { + Cuboid6[] values = new Cuboid6[1 + Integer.bitCount(i)]; + values[0] = getPostCollisionBoundsHorizontal; + if (i > 0) { + int count = 0; + for (int j = 0; j < 4; j++) { + if ((i & (1 << j)) != 0) { + values[1 + count] = Rotate90AboutYBlockCenterPos(connectorCollisionBoundsHorizontal, j); + count++; + } + + } + } + baseCollisionNonVert[i] = values; + } + + PRECOMPUTED_COLLISION.put(ForgeDirection.DOWN, baseCollision); + + // The direction maps to the direction that it's place into. So if the post is hooked into the + // ground the forge direction is actually down. + for (int i = 0; i < ForgeDirection.values().length - 1; i++) { + Pair[][] modelList = new Pair[16][]; + Pair[][] boundsList = new Pair[16][]; + Cuboid6[][] collisionList = new Cuboid6[16][]; + Cuboid6[] simpleModelList = new Cuboid6[2]; + ForgeDirection direction = ForgeDirection.getOrientation(i); + if (direction == ForgeDirection.DOWN) { + continue; + } + for (int j = 0; j < baseModels.length; j++) { + modelList[j] = RotateModel(baseModels[j], direction); + boundsList[j] = RotateModel(baseBounds[j], direction); + collisionList[j] = RotateModel(baseCollisionNonVert[j], direction); + } + simpleModelList[0] = RotateCube(baseSimpleModel[0], direction); + simpleModelList[1] = RotateCube(baseSimpleModel[1], direction); + + PRECOMPUTED_MODEL.put(direction, modelList); + PRECOMPUTED_BOUNDS.put(direction, boundsList); + PRECOMPUTED_COLLISION.put(direction, collisionList); + PRECOMPUTED_SIMPLE_MODEL.put(direction, simpleModelList); + } + + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/SphereRenderingHelper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/SphereRenderingHelper.java new file mode 100644 index 00000000..27648f38 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/block/SphereRenderingHelper.java @@ -0,0 +1,525 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.block; + +import java.util.Arrays; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.vec.Vector3; +import codechicken.microblock.BlockMicroMaterial; +import codechicken.microblock.GrassMicroMaterial; +import codechicken.microblock.MicroMaterialRegistry; +import it.unimi.dsi.fastutil.Pair; + +public class SphereRenderingHelper { + + // Verts are ordered as follows for easy UV mapping [latitude][longitude] + static Vector3[][] verts; + static Pair[] UVs = new Pair[34]; + // Wil do a 2 part slerp. First part to generate the equitorial verts, then the second + // part will generate the longitudinal verts. Have to do this because antipodal points break slerp. + static { + Vector3[] baseEquitorialVert = new Vector3[] { new Vector3(0, 0, 1), new Vector3(1, 0, 0), + new Vector3(0, 0, -1), new Vector3(-1, 0, 0), }; + + // Slerp along equitorial latitudes + Vector3[] equitorialVerts = new Vector3[16]; + for (int j = 0; j < 4; j++) { + Vector3 p0 = baseEquitorialVert[j]; + Vector3 p1; + if (j != 3) { + p1 = baseEquitorialVert[j + 1]; + } else { + p1 = baseEquitorialVert[0]; + } + + int offsetIndex = j * 4; + equitorialVerts[offsetIndex] = p0.copy(); + for (int i = 1; i < 4; i++) { + double t = (double) i / 4; + equitorialVerts[offsetIndex + i] = slerp(p0.copy(), p1.copy(), t); + } + } + + Vector3[] polarVerts = new Vector3[] { new Vector3(0, -1, 0), new Vector3(0, 1, 0) }; + + // Slerp along longitude and assemble verts + int latBands = 9; // 2 pole verts + 7 band verts + int longBands = 16; + + // Note that we use longBAnds for latitude positions in parts of this algorithm and vice versa. + // This is because longitudinal bands are located on specific latitudes. + + verts = new Vector3[latBands][longBands]; + for (int latPos = 0; latPos < longBands; latPos++) { + verts[0][latPos] = polarVerts[0].copy() + .multiply(.375); + verts[latBands - 1][latPos] = polarVerts[1].copy() + .multiply(.375); + } + + // Bottom + for (int latitude = 0; latitude < longBands; latitude++) { + for (int longitude = 1; longitude < 4; longitude++) { + double t = (double) longitude / 4; + verts[longitude][latitude] = slerp(polarVerts[0].copy(), equitorialVerts[latitude].copy(), t) + .multiply(.375); + } + } + + // Equator + for (int i = 0; i < equitorialVerts.length; i++) { + verts[4][i] = equitorialVerts[i].copy() + .multiply(.375); + } + + // Top + for (int latitude = 0; latitude < longBands; latitude++) { + for (int longitude = 1; longitude < 4; longitude++) { + double t = (double) longitude / 4; + verts[longitude + 4][latitude] = slerp(equitorialVerts[latitude].copy(), polarVerts[1].copy(), t) + .multiply(.375); + } + } + + // Calculate UV points for the polar aligned faces + // Calculations are between 0-1 for UVs + // Assume center lies at U, V = 0.5, 0.5 and it's not included. + + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 2; j++) { + int side = i / 4; + int subSideOrdinal = i % 4; + double U; + double V; + switch (side) { + case (0): { + if (j == 0) { + U = 0.0; + V = (double) subSideOrdinal / 4; + } else { + U = 0.25; + V = 0.25 + (double) subSideOrdinal / 8; + } + break; + } + case (1): { + if (j == 0) { + U = (double) subSideOrdinal / 4; + V = 1.0; + } else { + U = 0.25 + (double) subSideOrdinal / 8; + V = 0.75; + } + break; + } + case (2): { + if (j == 0) { + U = 1.0; + V = 1.0 - ((double) subSideOrdinal / 4); + } else { + U = 0.75; + V = 0.75 - ((double) subSideOrdinal / 8); + } + break; + } + case (3): { + if (j == 0) { + U = 1.0 - ((double) subSideOrdinal / 4); + V = 0.0; + } else { + U = 0.75 - ((double) subSideOrdinal / 8); + V = 0.25; + } + break; + } + default: { + U = 0.0; + V = 0.0; + } + } + UVs[(i * 2) + j] = Pair.of(U, V); + } + + // For ease of iteration we make a copy of 0 and 1 at 32 and 33 for coordinate wrapping. + UVs[32] = UVs[0]; + UVs[33] = UVs[1]; + } + } + + public static Vector3 slerp(Vector3 p0, Vector3 p1, double t) { + double omega = Math.acos(p0.dotProduct(p1)); + return p0.multiply((Math.sin((1 - t) * omega)) / (Math.sin(omega))) + .add(p1.multiply((Math.sin(omega * t) / (Math.sin(omega))))); + } + + public static void RenderMicroMaterialSphere(Vector3 position, int pass, MicroMaterialRegistry.IMicroMaterial mat, + World world) { + double ox = position.x + 0.5; + double oy = position.y + 0.5; + double oz = position.z + 0.5; + Tessellator tess = Tessellator.instance; + if (mat instanceof GrassMicroMaterial gMat) { + IIcon[] icons = gMat.icont().icons; + int color = getBlockColor(gMat.block(), world, (int) position.x, (int) position.y, (int) position.z, pass); + int brightness; + if (pass != -1) { + brightness = gMat.block() + .getMixedBrightnessForBlock(world, (int) position.x, (int) position.y, (int) position.z); + } else { + brightness = 0xF000F0; + } + // Base + RenderSphereBottom(tess, icons[0], ox, oy, oz, brightness, 0xFFFFFFFF); + RenderSphereSides(tess, Arrays.copyOfRange(icons, 2, icons.length), ox, oy, oz, brightness, 0xFFFFFFFF); + + // Do biome overlays + IIcon[] overlayArr = new IIcon[4]; + Arrays.fill(overlayArr, gMat.sideIconT().icon); + RenderSphereSides(tess, overlayArr, ox, oy, oz, brightness, color); + RenderSphereTop(tess, icons[1], ox, oy, oz, brightness, color); + } else if (mat instanceof BlockMicroMaterial bMat) { + IIcon[] icons = bMat.icont().icons; + int color = getBlockColor(bMat.block(), world, (int) position.x, (int) position.y, (int) position.z, pass); + int brightness; + if (pass != -1) { + brightness = bMat.block() + .getMixedBrightnessForBlock(world, (int) position.x, (int) position.y, (int) position.z); + } else { + brightness = 0xF000F0; + } + RenderSphere(tess, icons, ox, oy, oz, brightness, color); + } + } + + public static void RenderSphereTop(Tessellator tess, IIcon topIcon, double x, double y, double z, int brightness, + int color) { + double uWindow = topIcon.getMaxU() - topIcon.getMinU(); + double vWindow = topIcon.getMaxV() - topIcon.getMinV(); + double minU = topIcon.getMinU(); + double minV = topIcon.getMinV(); + + int UVCounter = 0; + int UVCounterMiddle = 1; + for (int longitude = 6; longitude < 8; longitude++) { + if (longitude == 7) { + tess.draw(); // Empty tess buffer + tess.startDrawing(GL11.GL_TRIANGLES); // STart with triangles. + } + for (int latitude = 0; latitude < 16; latitude++) { + // using non axis aligned faces so we need special uv for each vertex. + double u1, u2, u3, u4, v1, v2, v3, v4; + + // I know these look funny how they're assigned, but because of how + // the UVs are ordered when they are generated. It works. + if (longitude == 6) { + u1 = minU + UVs[UVCounter].first() * uWindow; + v1 = minV + UVs[UVCounter++].second() * vWindow; + u4 = minU + UVs[UVCounter].first() * uWindow; + v4 = minV + UVs[UVCounter++].second() * vWindow; + u2 = minU + UVs[UVCounter].first() * uWindow; + v2 = minV + UVs[UVCounter++].second() * vWindow; + u3 = minU + UVs[UVCounter].first() * uWindow; + v3 = minV + UVs[UVCounter++].second() * vWindow; + UVCounter -= 2; + + int lon0 = longitude; + int lon1 = longitude + 1; + int lat0 = WrapNumber(0, 15, latitude + 2); + int lat1 = WrapNumber(0, 15, latitude + 3); + + Vector3 vert0 = SphereRenderingHelper.verts[lon0][lat0].copy() + .add(x, y, z); + Vector3 vert1 = SphereRenderingHelper.verts[lon0][lat1].copy() + .add(x, y, z); + Vector3 vert2 = SphereRenderingHelper.verts[lon1][lat1].copy() + .add(x, y, z); + Vector3 vert3 = SphereRenderingHelper.verts[lon1][lat0].copy() + .add(x, y, z); + + renderSphericFaceVanilla( + tess, + vert0, + vert1, + vert2, + vert3, + u1, + v1, + u2, + v2, + u3, + v3, + u4, + v4, + brightness, + color); + } else { + + u1 = minU + UVs[UVCounterMiddle].first() * uWindow; + v1 = minV + UVs[UVCounterMiddle].second() * vWindow; + UVCounterMiddle += 2; + u2 = minU + UVs[UVCounterMiddle].first() * uWindow; + v2 = minV + UVs[UVCounterMiddle].second() * vWindow; + + u3 = minU + (0.5 * uWindow); + v3 = minV + (0.5 * vWindow); + + int lon0 = longitude; + int lon1 = longitude + 1; + int lat0 = WrapNumber(0, 15, latitude + 2); + int lat1 = WrapNumber(0, 15, latitude + 3); + + Vector3 vert0 = SphereRenderingHelper.verts[lon0][lat0].copy() + .add(x, y, z); + Vector3 vert1 = SphereRenderingHelper.verts[lon0][lat1].copy() + .add(x, y, z); + Vector3 vert2 = SphereRenderingHelper.verts[lon1][lat0].copy() + .add(x, y, z); + + renderSphericFaceVanilla(tess, vert0, vert1, vert2, u1, v1, u2, v2, u3, v3, brightness, color); + } + } + } + tess.draw(); // Draw our triangles + tess.startDrawingQuads(); // go back to drawing quads once done. + } + + public static void RenderSphereBottom(Tessellator tess, IIcon bottomIcon, double x, double y, double z, + int brightness, int color) { + double uWindow = bottomIcon.getMaxU() - bottomIcon.getMinU(); + double vWindow = bottomIcon.getMaxV() - bottomIcon.getMinV(); + double minU = bottomIcon.getMinU(); + double minV = bottomIcon.getMinV(); + + int UVCounter = 0; + int UVCounterMiddle = 1; + for (int longitude = 1; longitude > -1; longitude--) { + if (longitude == 0) { + tess.draw(); // Empty tess buffer + tess.startDrawing(GL11.GL_TRIANGLES); // STart with triangles. + } + for (int latitude = 0; latitude < 16; latitude++) { + // using non axis aligned faces so we need special uv for each vertex. + double u1, u2, u3, u4, v1, v2, v3, v4; + + // I know these look funny how they're assigned, but because of how + // the UVs are ordered when they are generated. It works. + if (longitude == 1) { + u1 = minU + UVs[UVCounter].first() * uWindow; + v1 = minV + UVs[UVCounter++].second() * vWindow; + u4 = minU + UVs[UVCounter].first() * uWindow; + v4 = minV + UVs[UVCounter++].second() * vWindow; + u2 = minU + UVs[UVCounter].first() * uWindow; + v2 = minV + UVs[UVCounter++].second() * vWindow; + u3 = minU + UVs[UVCounter].first() * uWindow; + v3 = minV + UVs[UVCounter++].second() * vWindow; + UVCounter -= 2; + + int lon0 = longitude + 1; + int lon1 = longitude; + int lat0 = WrapNumber(0, 15, latitude + 2); + int lat1 = WrapNumber(0, 15, latitude + 3); + + Vector3 vert0 = SphereRenderingHelper.verts[lon0][lat0].copy() + .add(x, y, z); + Vector3 vert1 = SphereRenderingHelper.verts[lon0][lat1].copy() + .add(x, y, z); + Vector3 vert2 = SphereRenderingHelper.verts[lon1][lat1].copy() + .add(x, y, z); + Vector3 vert3 = SphereRenderingHelper.verts[lon1][lat0].copy() + .add(x, y, z); + + renderSphericFaceVanilla( + tess, + vert0, + vert3, + vert2, + vert1, + u1, + v1, + u4, + v4, + u3, + v3, + u2, + v2, + brightness, + color); + } else { + u1 = minU + UVs[UVCounterMiddle].first() * uWindow; + v1 = minV + UVs[UVCounterMiddle].second() * vWindow; + UVCounterMiddle += 2; + u2 = minU + UVs[UVCounterMiddle].first() * uWindow; + v2 = minV + UVs[UVCounterMiddle].second() * vWindow; + + u3 = minU + (0.5 * uWindow); + v3 = minV + (0.5 * vWindow); + + int lon0 = longitude + 1; + int lon1 = longitude; + int lat0 = WrapNumber(0, 15, latitude + 2); + int lat1 = WrapNumber(0, 15, latitude + 3); + + Vector3 vert0 = SphereRenderingHelper.verts[lon0][lat0].copy() + .add(x, y, z); + Vector3 vert1 = SphereRenderingHelper.verts[lon0][lat1].copy() + .add(x, y, z); + Vector3 vert2 = SphereRenderingHelper.verts[lon1][lat0].copy() + .add(x, y, z); + + renderSphericFaceVanilla(tess, vert0, vert2, vert1, u1, v1, u3, v3, u2, v2, brightness, color); + } + } + } + tess.draw(); // Draw our triangles + tess.startDrawingQuads(); // go back to drawing quads once done. + } + + public static void RenderSphereSides(Tessellator tess, IIcon[] sideIcons, double x, double y, double z, + int brightness, int color) { + for (int latitude = 0; latitude < 16; latitude++) { + for (int longitude = 2; longitude < 6; longitude++) { + int side = latitude / 4; + switch (side) { + case (0): { + side = ForgeDirection.SOUTH.ordinal() - 2; + break; + } + case (1): { + side = ForgeDirection.EAST.ordinal() - 2; + break; + } + case (2): { + side -= 2; + break; // Side is already at north ordinal + } + case (3): { + side = ForgeDirection.WEST.ordinal() - 2; + break; + } + } + + double uWindow = sideIcons[side].getMaxU() - sideIcons[side].getMinU(); + double vWindow = sideIcons[side].getMaxV() - sideIcons[side].getMinV(); + + int k = latitude & 3; + int min = (k + 2) & 3; + int max = min + 1; + + double u1 = sideIcons[side].getMinU() + (uWindow * ((double) min / 4)); + double u2 = sideIcons[side].getMinU() + (uWindow * ((double) max / 4)); + double v1 = sideIcons[side].getMaxV() - (vWindow * ((double) (longitude - 1) / 4)); + double v2 = sideIcons[side].getMaxV() - (vWindow * ((double) (longitude - 2) / 4)); + + int lon0 = longitude; + int lon1 = longitude + 1; + int lat0 = latitude; + int lat1 = WrapNumber(0, 15, latitude + 1); + + Vector3 vert0 = SphereRenderingHelper.verts[lon0][lat0].copy() + .add(x, y, z); + Vector3 vert1 = SphereRenderingHelper.verts[lon0][lat1].copy() + .add(x, y, z); + Vector3 vert2 = SphereRenderingHelper.verts[lon1][lat1].copy() + .add(x, y, z); + Vector3 vert3 = SphereRenderingHelper.verts[lon1][lat0].copy() + .add(x, y, z); + + renderSphericFaceVanilla(tess, vert0, vert1, vert2, vert3, u1, v1, u2, v2, brightness, color); + } + } + } + + // Most blocks can just use this + public static void RenderSphere(Tessellator tess, IIcon[] icons, double x, double y, double z, int brightness, + int color) { + RenderSphereTop(tess, icons[1], x, y, z, brightness, color); + RenderSphereSides(tess, Arrays.copyOfRange(icons, 2, icons.length), x, y, z, brightness, color); + RenderSphereBottom(tess, icons[0], x, y, z, brightness, color); + } + + public static int getBlockColor(Block block, World world, int x, int y, int z, int pass) { + if (pass == -1) { + return block.getBlockColor(); + } else { + return block.colorMultiplier(world, x, y, z); + } + } + + public static void renderSphericFaceVanilla(Tessellator tess, Vector3 vert0, Vector3 vert1, Vector3 vert2, + Vector3 vert3, double u1, double v1, double u2, double v2, int brightness, int color) { + tess.setBrightness(brightness); + + Vector3 n = vert0.copy() + .normalize(); + float shade = (float) (0.6 + 0.4 * Math.max(0, n.y)); + + float cr = ((color >> 16) & 0xFF) / 255f; + float cg = ((color >> 8) & 0xFF) / 255f; + float cb = (color & 0xFF) / 255f; + + tess.setColorOpaque_F(cr * shade, cg * shade, cb * shade); + tess.setNormal((float) n.x, (float) n.y, (float) n.z); + + tess.addVertexWithUV(vert0.x, vert0.y, vert0.z, u1, v2); + tess.addVertexWithUV(vert1.x, vert1.y, vert1.z, u2, v2); + tess.addVertexWithUV(vert2.x, vert2.y, vert2.z, u2, v1); + tess.addVertexWithUV(vert3.x, vert3.y, vert3.z, u1, v1); + } + + public static void renderSphericFaceVanilla(Tessellator tess, Vector3 vert0, Vector3 vert1, Vector3 vert2, + Vector3 vert3, double u1, double v1, double u2, double v2, double u3, double v3, double u4, double v4, + int brightness, int color) { + tess.setBrightness(brightness); + + Vector3 n = vert0.copy() + .normalize(); + float shade = (float) (0.6 + 0.4 * Math.max(0, n.y)); + + float cr = ((color >> 16) & 0xFF) / 255f; + float cg = ((color >> 8) & 0xFF) / 255f; + float cb = (color & 0xFF) / 255f; + + tess.setColorOpaque_F(cr * shade, cg * shade, cb * shade); + tess.setNormal((float) n.x, (float) n.y, (float) n.z); + + tess.addVertexWithUV(vert0.x, vert0.y, vert0.z, u1, v1); + tess.addVertexWithUV(vert1.x, vert1.y, vert1.z, u2, v2); + tess.addVertexWithUV(vert2.x, vert2.y, vert2.z, u3, v3); + tess.addVertexWithUV(vert3.x, vert3.y, vert3.z, u4, v4); + } + + public static void renderSphericFaceVanilla(Tessellator tess, Vector3 vert0, Vector3 vert1, Vector3 vert2, + double u1, double v1, double u2, double v2, double u3, double v3, int brightness, int color) { + tess.setBrightness(brightness); + + Vector3 n = vert0.copy() + .normalize(); + float shade = (float) (0.6 + 0.4 * Math.max(0, n.y)); + + float cr = ((color >> 16) & 0xFF) / 255f; + float cg = ((color >> 8) & 0xFF) / 255f; + float cb = (color & 0xFF) / 255f; + + tess.setColorOpaque_F(cr * shade, cg * shade, cb * shade); + tess.setNormal((float) n.x, (float) n.y, (float) n.z); + + tess.addVertexWithUV(vert0.x, vert0.y, vert0.z, u1, v1); + tess.addVertexWithUV(vert1.x, vert1.y, vert1.z, u2, v2); + tess.addVertexWithUV(vert2.x, vert2.y, vert2.z, u3, v3); + } + + public static int WrapNumber(int min, int max, int in) { + if (in > max) { + return in - max + min - 1; + } else if (in < min) { + return in - min + max + 1; + } + return in; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/item/ItemUEMultiPartRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/item/ItemUEMultiPartRenderer.java new file mode 100644 index 00000000..73322494 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/render/item/ItemUEMultiPartRenderer.java @@ -0,0 +1,61 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.render.item; + +import static com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content.partNames; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; + +import org.lwjgl.opengl.GL11; + +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content; +import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.UEMultipart; + +import codechicken.lib.render.CCRenderState; +import codechicken.lib.render.TextureUtils; +import codechicken.lib.vec.Vector3; +import codechicken.microblock.MicroMaterialRegistry; + +public class ItemUEMultiPartRenderer implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return true; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + if (!item.hasTagCompound()) { + return; + } + + GL11.glPushMatrix(); + if (type == ItemRenderType.ENTITY) { + GL11.glScaled(0.5, 0.5, 0.5); + } + + if (type == ItemRenderType.INVENTORY || type == ItemRenderType.ENTITY) { + GL11.glTranslatef(-0.5f, -0.5f, -0.5f); + } + + TextureUtils.bindAtlas(0); + CCRenderState state = CCRenderState.instance(); + state.resetInstance(); + state.useNormals = true; + state.pullLightmapInstance(); + state.startDrawingInstance(); + + int materialId = MicroMaterialRegistry.materialID( + item.getTagCompound() + .getString("mat")); + UEMultipart part = new Content().createUEMultiPart(true, materialId, 0, partNames[item.getItemDamage()]); + part.render(new Vector3(0, 0, 0), -1); + + state.drawInstance(); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/util/CuboidUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/util/CuboidUtils.java new file mode 100644 index 00000000..ccf99dad --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/ForgeMultipart/util/CuboidUtils.java @@ -0,0 +1,205 @@ +package com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.util; + +import net.minecraftforge.common.util.ForgeDirection; + +import codechicken.lib.vec.Cuboid6; +import codechicken.lib.vec.Vector3; +import it.unimi.dsi.fastutil.Pair; + +public class CuboidUtils { + + public final Vector3 posX = new Vector3(1, 0, 0); + public final Vector3 posY = new Vector3(0, 1, 0); + public final Vector3 posZ = new Vector3(0, 0, 1); + public final Vector3 negX = new Vector3(-1, 0, 0); + public final Vector3 negY = new Vector3(0, -1, 0); + public final Vector3 negZ = new Vector3(0, 0, -1); + + // ROTATION ASSUMES MIN VECTOR IS ZEROED. + public Cuboid6 rotateXPos(Cuboid6 target) { + double newX = target.max.x; + double newY = -target.max.z; + double newZ = target.max.y; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public Cuboid6 rotateXNeg(Cuboid6 target) { + double newX = target.max.x; + double newY = target.max.z; + double newZ = -target.max.y; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public Cuboid6 rotateYPos(Cuboid6 target) { + double newX = target.max.z; + double newY = target.max.y; + double newZ = -target.max.x; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public Cuboid6 rotateYNeg(Cuboid6 target) { + double newX = -target.max.z; + double newY = target.max.y; + double newZ = target.max.x; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public Cuboid6 rotateZPos(Cuboid6 target) { + double newX = -target.max.y; + double newY = target.max.x; + double newZ = target.max.z; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public Cuboid6 rotateZNeg(Cuboid6 target) { + double newX = target.max.y; + double newY = -target.max.x; + double newZ = target.max.z; + target.max.x = newX; + target.max.y = newY; + target.max.z = newZ; + return target; + } + + public static Cuboid6 Translate(Cuboid6 input, Vector3 direction) { + input.max.add(direction); + input.min.add(direction); + return input; + } + + public static Cuboid6 Rotate90AboutXBlockCenterPos(Cuboid6 input, int times) { + Cuboid6 output = input.copy(); + Translate(output, new Vector3(0, -0.5, -0.5)); + Vector3 rotVector = new Vector3(1, 0, 0); + for (int i = 0; i < times; i++) { + output.max.rotate(Math.toRadians(90), rotVector); + output.min.rotate(Math.toRadians(90), rotVector); + } + Translate(output, new Vector3(0, 0.5, 0.5)); + + // Cuboids can become inside out after this. Gotta fix that + Vector3 newMin = new Vector3( + Math.min(output.min.x, output.max.x), + Math.min(output.min.y, output.max.y), + Math.min(output.min.z, output.max.z)); + + Vector3 newMax = new Vector3( + Math.max(output.min.x, output.max.x), + Math.max(output.min.y, output.max.y), + Math.max(output.min.z, output.max.z)); + + output.min = newMin; + output.max = newMax; + + return output; + } + + public static Cuboid6 Rotate90AboutYBlockCenterPos(Cuboid6 input, int times) { + Cuboid6 output = input.copy(); + Translate(output, new Vector3(-0.5, 0, -0.5)); + Vector3 rotVector = new Vector3(0, 1, 0); + for (int i = 0; i < times; i++) { + output.max.rotate(Math.toRadians(90), rotVector); + output.min.rotate(Math.toRadians(90), rotVector); + } + Translate(output, new Vector3(0.5, 0, 0.5)); + + // Cuboids can become inside out after this. Gotta fix that + Vector3 newMin = new Vector3( + Math.min(output.min.x, output.max.x), + Math.min(output.min.y, output.max.y), + Math.min(output.min.z, output.max.z)); + + Vector3 newMax = new Vector3( + Math.max(output.min.x, output.max.x), + Math.max(output.min.y, output.max.y), + Math.max(output.min.z, output.max.z)); + + output.min = newMin; + output.max = newMax; + + return output; + } + + public static Cuboid6 Rotate90AboutZBlockCenterPos(Cuboid6 input, int times) { + Cuboid6 output = input.copy(); + Translate(output, new Vector3(-0.5, -0.5, 0)); + Vector3 rotVector = new Vector3(0, 0, 1); + for (int i = 0; i < times; i++) { + output.max.rotate(Math.toRadians(90), rotVector); + output.min.rotate(Math.toRadians(90), rotVector); + } + Translate(output, new Vector3(0.5, 0.5, 0)); + + // Cuboids can become inside out after this. Gotta fix that + Vector3 newMin = new Vector3( + Math.min(output.min.x, output.max.x), + Math.min(output.min.y, output.max.y), + Math.min(output.min.z, output.max.z)); + + Vector3 newMax = new Vector3( + Math.max(output.min.x, output.max.x), + Math.max(output.min.y, output.max.y), + Math.max(output.min.z, output.max.z)); + + output.min = newMin; + output.max = newMax; + + return output; + } + + // Takes a model that is assumed to be defaulted to the ForgeDirection Down and rotates it so the + // specified direction is considered "down" for that model + public static Cuboid6[] RotateModel(Cuboid6[] model, ForgeDirection direction) { + if (direction == ForgeDirection.DOWN) { + return model; + } + + Cuboid6[] rotatedModel = new Cuboid6[model.length]; + for (int i = 0; i < model.length; i++) { + rotatedModel[i] = RotateCube(model[i], direction); + } + return rotatedModel; + } + + // Same function as above, but is used for cuboids that have some directional information attached to them. + @SuppressWarnings("unchecked") + public static Pair[] RotateModel(Pair[] model, ForgeDirection direction) { + if (direction == ForgeDirection.DOWN) { + return model; + } + + Pair[] rotatedModel = new Pair[model.length]; + for (int i = 0; i < model.length; i++) { + rotatedModel[i] = Pair.of(model[i].first(), RotateCube(model[i].second(), direction)); + } + return rotatedModel; + } + + public static Cuboid6 RotateCube(Cuboid6 cube, ForgeDirection direction) { + return switch (direction) { + case NORTH -> Rotate90AboutXBlockCenterPos(cube, 1); + case SOUTH -> Rotate90AboutXBlockCenterPos(cube, 3); + case EAST -> Rotate90AboutZBlockCenterPos(cube, 1); + case WEST -> Rotate90AboutZBlockCenterPos(cube, 3); + case DOWN -> cube; + case UP -> Rotate90AboutXBlockCenterPos(cube, 2); + case UNKNOWN -> throw new IllegalArgumentException("Switch fall off"); + }; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java index 00ad713c..b3925eba 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/Mods.java @@ -13,8 +13,13 @@ public enum Mods { NEI("NotEnoughItems"), CraftTweaker("MineTweaker3"), FindIt("findit"), + Waila("Waila"), Tinkers("TConstruct"), - Waila("Waila") + ExtraUtilities("ExtraUtilities"), + Postea("postea"), + ForgeMicroBlock("ForgeMicroblock"), + Backhand("backhand"), + GT("gregtech_nh"), ; // spotless:on diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/ExuCompat.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/ExuCompat.java new file mode 100644 index 00000000..7c35f868 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/ExuCompat.java @@ -0,0 +1,33 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; + +import cpw.mods.fml.common.event.FMLMissingMappingsEvent; +import cpw.mods.fml.common.registry.GameRegistry; + +public class ExuCompat { + + public static void onMissingMappings(FMLMissingMappingsEvent event) { + for (FMLMissingMappingsEvent.MissingMapping mapping : event.getAll()) { + if (mapping == null) continue; + + if (Remappings.SKIPPED_MAPPINGS.contains(mapping.name)) { + mapping.ignore(); + continue; + } + + if (mapping.type == GameRegistry.Type.ITEM) { + Item newItem = Remappings.ITEM_MAPPINGS.get(mapping.name); + if (newItem != null) { + mapping.remap(newItem); + } + } else { // BLOCK + Block newBlock = Remappings.BLOCK_MAPPINGS.get(mapping.name); + if (newBlock != null) { + mapping.remap(newBlock); + } + } + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/Remappings.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/Remappings.java new file mode 100644 index 00000000..f5b7e5ba --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/Remappings.java @@ -0,0 +1,183 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.IPosteaTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks.CompressedBlocksTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks.ConveyorTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks.DarkPortalTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks.DecoBlock1Transformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks.EnderLilyTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks.SoundMufflerTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks.TrashCanTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.items.DivisionSigilTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.items.GoldenBagTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.items.GoldenLassoTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.items.UnstableIngotTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.items.WateringCanTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.tileentities.FullChestTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.tileentities.GeneratorTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.tileentities.MiniChestTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.tileentities.SpikeTransformation; + +public enum Remappings { + // spotless:off + + // make sure to leave a trailing comma + // Direct block remappings + ANGEL_BLOCK("ExtraUtilities:angelBlock", ModBlocks.FLOATING_BLOCK), + BUD("ExtraUtilities:budoff", ModBlocks.BLOCK_UPDATE_DETECTOR), + DECO_BLOCK_2("ExtraUtilities:decorativeBlock2", ModBlocks.DECORATIVE_GLASS), + CURTAINS("ExtraUtilities:curtains", ModBlocks.BLACKOUT_CURTAINS), + PURE_LOVE("ExtraUtilities:pureLove", ModBlocks.PURE_LOVE), + BEDROCKUIM_BLOCK("ExtraUtilities:block_bedrockium", ModBlocks.BEDROCKIUM_BLOCK), + GREENSCREEN("ExtraUtilities:greenscreen", ModBlocks.LAPIS_AETHERIUS), + PEACEFUL_TABLE("ExtraUtilities:peaceful_table_top", ModBlocks.PACIFISTS_BENCH), + CURSED_EARTH("ExtraUtilities:cursedearthside", ModBlocks.CURSED_EARTH), + SPIKE_WOOD("ExtraUtilities:spike_base_wood", ModBlocks.SPIKE_WOOD), + SPIKE_IRON("ExtraUtilities:spike_base", ModBlocks.SPIKE_IRON), + SPIKE_GOLD("ExtraUtilities:spike_base_gold", ModBlocks.SPIKE_GOLD), + SPIKE_DIAMOND("ExtraUtilities:spike_base_diamond", ModBlocks.SPIKE_DIAMOND), + TIMER("ExtraUtilities:timer", ModBlocks.REDSTONE_CLOCK), + ETHEREAL_GLASS("ExtraUtilities:etherealglass", ModBlocks.ETHEREAL_GLASS), + ENDER_PUMP("ExtraUtilities:enderThermicPump", ModBlocks.SMART_PUMP), + COLORED_STONE_BRICK("ExtraUtilities:colorStoneBrick", ModBlocks.COLORED_STONE_BRICKS), + COLORED_PLANKS("ExtraUtilities:colorWoodPlanks", ModBlocks.COLORED_WOOD_PLANKS), + COLORED_GLOWSTONE("ExtraUtilities:color_lightgem", ModBlocks.COLORED_GLOWSTONE), + COLORED_STONE("ExtraUtilities:color_stone", ModBlocks.COLORED_STONE), + COLORED_QUARTZ_BLOCK("ExtraUtilities:color_quartzBlock", ModBlocks.COLORED_QUARTZ_BLOCK), + COLORED_SOUL_SAND("ExtraUtilities:color_hellsand", ModBlocks.COLORED_SOUL_SAND), + COLORED_REDSTONE_LAMP("ExtraUtilities:color_redstoneLight", ModBlocks.COLORED_REDSTONE_LAMP), + COLORED_BRICKS("ExtraUtilities:color_brick", ModBlocks.COLORED_BRICKS), + COLORED_COBBLESTONE("ExtraUtilities:color_stonebrick", ModBlocks.COLORED_COBBLESTONE), + COLORED_LAPIS_BLOCK("ExtraUtilities:color_blockLapis", ModBlocks.COLORED_LAPIS_BLOCK), + COLORED_OBSIDIAN("ExtraUtilities:color_obsidian", ModBlocks.COLORED_OBSIDIAN), + COLORED_REDSTONE_BLOCK("ExtraUtilities:color_blockRedstone", ModBlocks.COLORED_REDSTONE_BLOCK), + COLORED_COAL_BLOCK("ExtraUtilities:color_blockCoal", ModBlocks.COLORED_COAL_BLOCK), + + // Direct item remappings + GLOVE("ExtraUtilities:glove", ModItems.GLOVE), + HEAVENLY_RING("ExtraUtilities:angelRing", ModItems.HEAVENLY_RING_FEATHER), + FIRE_BATTERY("ExtraUtilities:heatingElement", ModItems.FIRE_BATTERY), + ARCHITECTS_WAND("ExtraUtilities:buildersWand", ModItems.ARCHITECTS_WAND), + SUPER_ARCHITECTS_WAND("ExtraUtilities:creativeBuildersWand", ModItems.ARCHITECTS_WAND), + INVERTED_SWORD("ExtraUtilities:ethericSword", ModItems.ETHERIC_SWORD), + INVERTED_PICKAXE("ExtraUtilities:destructionpickaxe", ModItems.DESTRUCTION_PICKAXE), + INVERTED_AXE("ExtraUtilities:defoliageAxe", ModItems.GOURMANDS_AXE), + INVERTED_SHOVEL("ExtraUtilities:erosionShovel", ModItems.ANTI_PARTICULATE_SHOVEL), + INVERTED_HOE("ExtraUtilities:temporalHoe", ModItems.REVERSING_HOE), + INVERTED_SHEARS("ExtraUtilities:shears", ModItems.PRECISION_SHEARS), + XRAY_GLASSES("ExtraUtilities:sonar_goggles", ModItems.XRAY_GLASSES), + BEDROCKUIM_INGOT("ExtraUtilities:bedrockiumIngot", ModItems.BEDROCKIUM_INGOT), + SCANNER("ExtraUtilities:scanner", ModItems.BLOCK_ANALYZER), + + // Item Transformations + GOLDEN_BAG(new GoldenBagTransformation()), + WATERING_CAN(new WateringCanTransformation()), + INVERSION_SIGIL(new DivisionSigilTransformation()), + MOB_JAR(new GoldenLassoTransformation()), + INVERTED_INGOT(new UnstableIngotTransformation()), + + // Block Transformations + SOUND_MUFFLER(new SoundMufflerTransformation()), + DECO_BLOCK_1(new DecoBlock1Transformation()), + COMPRESSED_BLOCKS(new CompressedBlocksTransformation()), + DARK_PORTAL(new DarkPortalTransformation()), + TRASH_CANS(new TrashCanTransformation()), + ENDER_LOTUS(new EnderLilyTransformation()), + CONVEYOR(new ConveyorTransformation()), + + // Tile Entity Transformation + GENERATORS(new GeneratorTransformation()), + FULL_CHEST(new FullChestTransformation()), + MINI_CHEST(new MiniChestTransformation()), + SPIKES(new SpikeTransformation()), + + // Skipped mappings + PAINT_BRUSH("ExtraUtilities:paintbrush"), + DATABLOCK("ExtraUtilities:datablock"), + + ; // leave trailing semicolon + // spotless:on + + public static final Remappings[] VALUES = values(); + + public static final HashMap ITEM_MAPPINGS = new HashMap<>(); + public static final HashMap BLOCK_MAPPINGS = new HashMap<>(); + public static final List TRANSFORMATIONS = new ArrayList<>(); + public static final Set SKIPPED_MAPPINGS = new HashSet<>(); + + public static void preInit() { + for (Remappings remapping : VALUES) { + if (remapping.replacementItem != null) { + ITEM_MAPPINGS.put(remapping.getName(), remapping.replacementItem); + } + if (remapping.replacementBlock != null) { + BLOCK_MAPPINGS.put(remapping.getName(), remapping.replacementBlock); + } + if (remapping.transformation != null) { + TRANSFORMATIONS.add(remapping.transformation); + } + if (remapping.isSkipped) { + SKIPPED_MAPPINGS.add(remapping.getName()); + } + if (remapping.transformation != null) { + remapping.transformation.registerDummies(); + remapping.transformation.addItemRemappings(ITEM_MAPPINGS); + remapping.transformation.addBlockRemappings(BLOCK_MAPPINGS); + } + } + } + + public static void init() { + for (IPosteaTransformation transformation : TRANSFORMATIONS) { + transformation.registerTEDummies(); + } + } + + public static void postInit() { + for (IPosteaTransformation transformation : TRANSFORMATIONS) { + transformation.registerTransformations(); + } + } + + private String oldName; + private Block replacementBlock = null; + private Item replacementItem = null; + private IPosteaTransformation transformation = null; + + private boolean isSkipped = false; + + Remappings(String oldName, ModBlocks modBlock) { + this.oldName = oldName; + this.replacementBlock = modBlock.get(); + this.replacementItem = modBlock.getItem(); + } + + Remappings(String oldName, ModItems modItem) { + this.oldName = oldName; + this.replacementItem = modItem.get(); + } + + Remappings(String oldName) { + this.oldName = oldName; + isSkipped = true; + } + + Remappings(IPosteaTransformation posteaTransformation) { + this.transformation = posteaTransformation; + } + + public String getName() { + return oldName; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/DummyBlock.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/DummyBlock.java new file mode 100644 index 00000000..f00e8b69 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/DummyBlock.java @@ -0,0 +1,11 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; + +public class DummyBlock extends Block { + + public DummyBlock(Material materialIn) { + super(materialIn); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/IPosteaTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/IPosteaTransformation.java new file mode 100644 index 00000000..367f5b3d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/IPosteaTransformation.java @@ -0,0 +1,57 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea; + +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; + +/** + * Represents a Postea transformation which handles the process of migrating a now-removed items and blocks + * in already existing saves. + * The process goes: + * "modid:removed" -> FMLMissingMappingsEvent -> "ourmodid:dummyitem" -> Postea -> "ourmodid:corrected_item" + */ +public interface IPosteaTransformation { + + /** + * This method is called during a common FMLPreInitializationEvent, + * do all your GameRegistry.registerItem and GameRegistry.registerBlock calls here. + */ + default void registerDummies() {} + + /** + * This method is called during a common FMLInitializationEvent, + * do all your GameRegistry.registerTileEntity calls here. + */ + default void registerTEDummies() {} + + /** + * Called to add your dummy items to be mapped during the FMLMissingMappingsEvent event, + * add your items with the old item's "modid:itemname" registry name as the key + * and your dummy {@link Item} instance as the value. + *

+ * See {@link cpw.mods.fml.common.event.FMLMissingMappingsEvent} for more. + * + * @param remappings Current running list of remappings, add yours to this. + */ + default void addItemRemappings(Map remappings) {} + + /** + * Called to add your dummy blocks to be mapped during the FMLMissingMappingsEvent event, + * add your blocks with the old block's "modid:itemname" registry name as the key + * and your dummy {@link Block} instance as the value. + * Remember to also add it's ItemBlock instance to addItemRemappings. + *

+ * See {@link cpw.mods.fml.common.event.FMLMissingMappingsEvent} for more. + * + * @param remappings Current running list of remappings, add yours to this. + */ + default void addBlockRemappings(Map remappings) {} + + /** + * This method is called during a common FMLPostInitializationEvent, + * do all your BlockReplacementManager.addBlockReplacement and + * ItemStackReplacementManager.addItemReplacement calls here. + */ + default void registerTransformations() {} +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/AbstractBlockTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/AbstractBlockTransformation.java new file mode 100644 index 00000000..df7c0325 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/AbstractBlockTransformation.java @@ -0,0 +1,84 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks; + +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.DummyBlock; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.IPosteaTransformation; +import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; +import com.gtnewhorizons.postea.api.BlockReplacementManager; +import com.gtnewhorizons.postea.api.ItemStackReplacementManager; +import com.gtnewhorizons.postea.utility.BlockConversionInfo; + +import cpw.mods.fml.common.registry.GameRegistry; + +/** + * A simple {@link IPosteaTransformation} that transforms a single block. + * Extend and use setDummyName and setOldName + * then do your transformations in doItemTransformation and doBlockTransformation + *

+ * See {@link SoundMufflerTransformation} for an example. + */ +public abstract class AbstractBlockTransformation implements IPosteaTransformation { + + private final Block dummyBlock; + + private String dummyName; + private String oldName; + + /** + * Set the name for this transformation's dummy block *without* the modid, e.g. "dummy_golden_bag". + * + * @param dummyName The registry name for this transformation's dummy block + */ + public void setDummyName(String dummyName) { + this.dummyName = dummyName; + } + + /** + * Set the *full registry name* (e.g. "modid:item") of the old block this transformation is replacing + * + * @param oldName The registry name for the block this transformation is replacing + */ + public void setOldName(String oldName) { + this.oldName = oldName; + } + + public AbstractBlockTransformation() { + dummyBlock = new DummyBlock(Material.ground); + } + + @Override + public void registerDummies() { + GameRegistry.registerBlock(dummyBlock, dummyName); + UIEUtils.hideInNei(dummyBlock); + } + + @Override + public void addItemRemappings(Map remappings) { + remappings.put(oldName, Item.getItemFromBlock(dummyBlock)); + } + + @Override + public void addBlockRemappings(Map remappings) { + remappings.put(oldName, dummyBlock); + } + + @Override + public void registerTransformations() { + BlockReplacementManager + .addBlockReplacement(UtilitiesInExcess.MODID + ":" + dummyName, this::doBlockTransformation); + ItemStackReplacementManager + .addItemReplacement(UtilitiesInExcess.MODID + ":" + dummyName, this::doItemTransformation); + } + + public abstract NBTTagCompound doItemTransformation(NBTTagCompound tag); + + public abstract BlockConversionInfo doBlockTransformation(BlockConversionInfo blockConversionInfo, World world); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/CompressedBlocksTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/CompressedBlocksTransformation.java new file mode 100644 index 00000000..8fa31099 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/CompressedBlocksTransformation.java @@ -0,0 +1,56 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.gtnewhorizons.postea.api.IDExtenderCompat; +import com.gtnewhorizons.postea.utility.BlockConversionInfo; + +public class CompressedBlocksTransformation extends AbstractBlockTransformation { + + public CompressedBlocksTransformation() { + super(); + setDummyName("dummy_compressed_blocks"); + setOldName("ExtraUtilities:cobblestone_compressed"); + } + + public NBTTagCompound doItemTransformation(NBTTagCompound tag) { + int dmg = tag.getInteger("Damage"); + if (dmg < 8) { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.COMPRESSED_COBBLESTONE.getItem())); + } else if (dmg < 12) { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.COMPRESSED_DIRT.getItem())); + tag.setInteger("Damage", dmg - 8); + } else if (dmg < 14) { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.COMPRESSED_GRAVEL.getItem())); + tag.setInteger("Damage", dmg - 12); + } else { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.COMPRESSED_SAND.getItem())); + tag.setInteger("Damage", dmg - 14); + } + return tag; + } + + public BlockConversionInfo doBlockTransformation(BlockConversionInfo blockConversionInfo, World world) { + BlockConversionInfo blockConversionInfoNew = new BlockConversionInfo(); + int dmg = blockConversionInfo.metadata; + if (dmg < 8) { + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.COMPRESSED_COBBLESTONE.get()); + blockConversionInfoNew.metadata = blockConversionInfo.metadata; + } else if (dmg < 12) { + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.COMPRESSED_DIRT.get()); + blockConversionInfoNew.metadata = blockConversionInfo.metadata - 8; + } else if (dmg < 14) { + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.COMPRESSED_GRAVEL.get()); + blockConversionInfoNew.metadata = blockConversionInfo.metadata - 12; + } else { + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.COMPRESSED_SAND.get()); + blockConversionInfoNew.metadata = blockConversionInfo.metadata - 14; + } + + return blockConversionInfoNew; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/ConveyorTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/ConveyorTransformation.java new file mode 100644 index 00000000..7dfd9df8 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/ConveyorTransformation.java @@ -0,0 +1,34 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.gtnewhorizons.postea.api.IDExtenderCompat; +import com.gtnewhorizons.postea.utility.BlockConversionInfo; + +public class ConveyorTransformation extends AbstractBlockTransformation { + + public ConveyorTransformation() { + super(); + setDummyName("dummy_conveyor"); + setOldName("ExtraUtilities:conveyor"); + } + + public NBTTagCompound doItemTransformation(NBTTagCompound tag) { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.CONVEYOR.getItem())); + tag.setInteger("Damage", 0); + return tag; + } + + public BlockConversionInfo doBlockTransformation(BlockConversionInfo blockConversionInfo, World world) { + BlockConversionInfo blockConversionInfoNew = new BlockConversionInfo(); + int meta = blockConversionInfo.metadata; + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.CONVEYOR.get()); + blockConversionInfoNew.metadata = meta - 2 >= 0 ? meta - 2 : meta + 2; + + return blockConversionInfoNew; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/DarkPortalTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/DarkPortalTransformation.java new file mode 100644 index 00000000..7528cc6c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/DarkPortalTransformation.java @@ -0,0 +1,43 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.gtnewhorizons.postea.api.IDExtenderCompat; +import com.gtnewhorizons.postea.utility.BlockConversionInfo; + +public class DarkPortalTransformation extends AbstractBlockTransformation { + + public DarkPortalTransformation() { + super(); + setDummyName("dummy_dark_portal"); + setOldName("ExtraUtilities:dark_portal"); + } + + public NBTTagCompound doItemTransformation(NBTTagCompound tag) { + int dmg = tag.getInteger("Damage"); + if (dmg == 2) { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.END_OF_TIME_PORTAL.getItem())); + } else { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.UNDERWORLD_PORTAL.getItem())); + } + tag.setInteger("Damage", 0); + return tag; + } + + public BlockConversionInfo doBlockTransformation(BlockConversionInfo blockConversionInfo, World world) { + BlockConversionInfo blockConversionInfoNew = new BlockConversionInfo(); + int dmg = blockConversionInfo.metadata; + if (dmg == 2) { + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.END_OF_TIME_PORTAL.get()); + } else { + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.UNDERWORLD_PORTAL.get()); + } + blockConversionInfoNew.metadata = 0; + + return blockConversionInfoNew; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/DecoBlock1Transformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/DecoBlock1Transformation.java new file mode 100644 index 00000000..b37bd7ad --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/DecoBlock1Transformation.java @@ -0,0 +1,49 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.gtnewhorizons.postea.api.IDExtenderCompat; +import com.gtnewhorizons.postea.utility.BlockConversionInfo; + +public class DecoBlock1Transformation extends AbstractBlockTransformation { + + public DecoBlock1Transformation() { + super(); + setDummyName("dummy_decorativeBlock1"); + setOldName("ExtraUtilities:decorativeBlock1"); + } + + // TODO Add the remaining decorative block metas once they get implemented + public NBTTagCompound doItemTransformation(NBTTagCompound tag) { + int dmg = tag.getInteger("Damage"); + switch (dmg) { + case 5: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.INVERTED_BLOCK.getItem())); + break; + case 8: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.MAGIC_WOOD.getItem())); + break; + } + tag.setInteger("Damage", 0); + return tag; + } + + public BlockConversionInfo doBlockTransformation(BlockConversionInfo blockConversionInfo, World world) { + BlockConversionInfo blockConversionInfoNew = new BlockConversionInfo(); + int meta = blockConversionInfo.metadata; + if (meta == 5) { + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.INVERTED_BLOCK.get()); + } else if (meta == 8) { + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.MAGIC_WOOD.get()); + } else { + return blockConversionInfo; + } + blockConversionInfoNew.metadata = 0; + + return blockConversionInfoNew; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/EnderLilyTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/EnderLilyTransformation.java new file mode 100644 index 00000000..c67ea6a6 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/EnderLilyTransformation.java @@ -0,0 +1,38 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.gtnewhorizons.postea.api.IDExtenderCompat; +import com.gtnewhorizons.postea.utility.BlockConversionInfo; + +public class EnderLilyTransformation extends AbstractBlockTransformation { + + public EnderLilyTransformation() { + super(); + setDummyName("dummy_ender_lotus"); + setOldName("ExtraUtilities:plant/ender_lilly"); + } + + // This is NOT a direct mapping!! + // EXU's ender lily item is the block's ItemBlock, which is incompatible with our version which is a seed + // that plants the block, + public NBTTagCompound doItemTransformation(NBTTagCompound tag) { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModItems.ENDER_LOTUS_SEED.get())); + tag.setInteger("Damage", 0); + return tag; + } + + public BlockConversionInfo doBlockTransformation(BlockConversionInfo blockConversionInfo, World world) { + BlockConversionInfo blockConversionInfoNew = new BlockConversionInfo(); + + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.ENDER_LOTUS.get()); + blockConversionInfoNew.metadata = 0; + + return blockConversionInfoNew; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/SoundMufflerTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/SoundMufflerTransformation.java new file mode 100644 index 00000000..15bd9e89 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/SoundMufflerTransformation.java @@ -0,0 +1,46 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.gtnewhorizons.postea.api.IDExtenderCompat; +import com.gtnewhorizons.postea.utility.BlockConversionInfo; + +public class SoundMufflerTransformation extends AbstractBlockTransformation { + + public SoundMufflerTransformation() { + super(); + setDummyName("dummy_sound_muffler"); + setOldName("ExtraUtilities:sound_muffler"); + } + + public NBTTagCompound doItemTransformation(NBTTagCompound tag) { + int dmg = tag.getInteger("Damage"); + switch (dmg) { + case 0: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.SOUND_MUFFLER.getItem())); + break; + case 1: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.RAIN_MUFFLER.getItem())); + break; + } + tag.setInteger("Damage", 0); + return tag; + } + + public BlockConversionInfo doBlockTransformation(BlockConversionInfo blockConversionInfo, World world) { + BlockConversionInfo blockConversionInfoNew = new BlockConversionInfo(); + int meta = blockConversionInfo.metadata; + if (meta == 1) { + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.RAIN_MUFFLER.get()); + } else { + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.SOUND_MUFFLER.get()); + } + blockConversionInfoNew.metadata = 0; + + return blockConversionInfoNew; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/TrashCanTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/TrashCanTransformation.java new file mode 100644 index 00000000..07691068 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/blocks/TrashCanTransformation.java @@ -0,0 +1,55 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.gtnewhorizons.postea.api.IDExtenderCompat; +import com.gtnewhorizons.postea.utility.BlockConversionInfo; + +public class TrashCanTransformation extends AbstractBlockTransformation { + + public TrashCanTransformation() { + super(); + setDummyName("dummy_trash_cans"); + setOldName("ExtraUtilities:trashcan"); + } + + public NBTTagCompound doItemTransformation(NBTTagCompound tag) { + int dmg = tag.getInteger("Damage"); + switch (dmg) { + case 1: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.TRASH_CAN_FLUID.getItem())); + break; + case 2: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.TRASH_CAN_ENERGY.getItem())); + break; + default: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModBlocks.TRASH_CAN_ITEM.getItem())); + break; + } + tag.setInteger("Damage", 0); + return tag; + } + + public BlockConversionInfo doBlockTransformation(BlockConversionInfo blockConversionInfo, World world) { + BlockConversionInfo blockConversionInfoNew = new BlockConversionInfo(); + int dmg = blockConversionInfo.metadata; + switch (dmg) { + case 1: + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.TRASH_CAN_FLUID.get()); + break; + case 2: + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.TRASH_CAN_ENERGY.get()); + break; + default: + blockConversionInfoNew.blockID = Block.getIdFromBlock(ModBlocks.TRASH_CAN_ITEM.get()); + break; + } + blockConversionInfoNew.metadata = 0; + + return blockConversionInfoNew; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/AbstractItemTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/AbstractItemTransformation.java new file mode 100644 index 00000000..e73f7b16 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/AbstractItemTransformation.java @@ -0,0 +1,68 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.items; + +import java.util.Map; + +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.IPosteaTransformation; +import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; +import com.gtnewhorizons.postea.api.ItemStackReplacementManager; + +import cpw.mods.fml.common.registry.GameRegistry; + +/** + * A simple {@link IPosteaTransformation} that transforms a single item. + * Extend and use setDummyName and setOldName then do your transformations in doTransformation + *

+ * See {@link WateringCanTransformation} for an example. + */ +public abstract class AbstractItemTransformation implements IPosteaTransformation { + + private final Item dummyItem; + + private String dummyName; + private String oldName; + + /** + * Set the name for this transformation's dummy item *without* the modid, e.g. "dummy_golden_bag". + * + * @param dummyName The registry name for this transformation's dummy item + */ + public void setDummyName(String dummyName) { + this.dummyName = dummyName; + } + + /** + * Set the *full registry name* (e.g. "modid:item") of the old item this transformation is replacing + * + * @param oldName The registry name for the item this transformation is replacing + */ + public void setOldName(String oldName) { + this.oldName = oldName; + } + + public AbstractItemTransformation() { + dummyItem = new Item(); + UIEUtils.hideInNei(dummyItem); + } + + @Override + public void registerDummies() { + GameRegistry.registerItem(dummyItem, dummyName); + } + + @Override + public void addItemRemappings(Map remappings) { + remappings.put(oldName, dummyItem); + } + + @Override + public void registerTransformations() { + ItemStackReplacementManager + .addItemReplacement(UtilitiesInExcess.MODID + ":" + dummyName, this::doTransformation); + } + + public abstract NBTTagCompound doTransformation(NBTTagCompound tag); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/DivisionSigilTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/DivisionSigilTransformation.java new file mode 100644 index 00000000..e7827dee --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/DivisionSigilTransformation.java @@ -0,0 +1,37 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.items; + +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; + +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemInversionSigilActive; +import com.gtnewhorizons.postea.api.IDExtenderCompat; + +public class DivisionSigilTransformation extends AbstractItemTransformation { + + public DivisionSigilTransformation() { + super(); + setDummyName("dummy_inversion_sigil"); + setOldName("ExtraUtilities:divisionSigil"); + } + + public NBTTagCompound doTransformation(NBTTagCompound tag) { + NBTTagCompound tagtag = tag.getCompoundTag("tag"); + int stable = tagtag.getByte("stable"); + if (stable == 1) { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModItems.PSEUDO_INVERSION_SIGIL.get())); + tag.removeTag("tag"); + } else { + int dmg = tagtag.getInteger("damage"); + tagtag.removeTag("damage"); + if (dmg > 1) { + tagtag.setInteger(ItemInversionSigilActive.DURABILITY_NBT_KEY, dmg); + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModItems.INVERSION_SIGIL_ACTIVE.get())); + } else { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModItems.INVERSION_SIGIL_INACTIVE.get())); + } + } + + return tag; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/GoldenBagTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/GoldenBagTransformation.java new file mode 100644 index 00000000..2ea8e473 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/GoldenBagTransformation.java @@ -0,0 +1,46 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.items; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.gtnewhorizons.postea.api.IDExtenderCompat; + +public class GoldenBagTransformation extends AbstractItemTransformation { + + public GoldenBagTransformation() { + super(); + setDummyName("dummy_golden_bag"); + setOldName("ExtraUtilities:golden_bag"); + } + + public NBTTagCompound doTransformation(NBTTagCompound tag) { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModItems.GOLDEN_BAG.get())); + + NBTTagCompound tagtag = tag.getCompoundTag("tag"); + NBTTagList tagList = new NBTTagList(); + + List toBeRemoved = new ArrayList<>(); + for (String name : tagtag.func_150296_c()) { + if (!name.startsWith("items_")) continue; + + NBTTagCompound item = tagtag.getCompoundTag(name); + item.setByte("Slot", Byte.parseByte(name.split("_")[1])); + tagList.appendTag(item); + + toBeRemoved.add(name); + } + + for (String name : toBeRemoved) { + tagtag.removeTag(name); + } + + tagtag.setTag("Items", tagList); + tag.setTag("tag", tagtag); + return tag; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/GoldenLassoTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/GoldenLassoTransformation.java new file mode 100644 index 00000000..500a1d5a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/GoldenLassoTransformation.java @@ -0,0 +1,30 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.items; + +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; + +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.gtnewhorizons.postea.api.IDExtenderCompat; + +public class GoldenLassoTransformation extends AbstractItemTransformation { + + public GoldenLassoTransformation() { + super(); + setDummyName("dummy_mob_jar"); + setOldName("ExtraUtilities:golden_lasso"); + } + + public NBTTagCompound doTransformation(NBTTagCompound tag) { + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModItems.MOB_JAR.get())); + + if (tag.hasKey("tag")) { + NBTTagCompound tagtag = tag.getCompoundTag("tag"); + NBTTagCompound newTagtag = new NBTTagCompound(); + newTagtag.setTag("MobData", tagtag); + + tag.setTag("tag", newTagtag); + } + + return tag; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/UnstableIngotTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/UnstableIngotTransformation.java new file mode 100644 index 00000000..c740febd --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/UnstableIngotTransformation.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.items; + +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; + +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.gtnewhorizons.postea.api.IDExtenderCompat; + +public class UnstableIngotTransformation extends AbstractItemTransformation { + + public UnstableIngotTransformation() { + super(); + setDummyName("dummy_inverted_ingot"); + setOldName("ExtraUtilities:unstableIngot"); + } + + public NBTTagCompound doTransformation(NBTTagCompound tag) { + int dmg = tag.getInteger("Damage"); + switch (dmg) { + case 0, 2: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModItems.INVERTED_INGOT.get())); + break; + case 1: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModItems.INVERTED_NUGGET.get())); + break; + } + return tag; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/WateringCanTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/WateringCanTransformation.java new file mode 100644 index 00000000..814d2003 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/items/WateringCanTransformation.java @@ -0,0 +1,32 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.items; + +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; + +import com.fouristhenumber.utilitiesinexcess.ModItems; +import com.gtnewhorizons.postea.api.IDExtenderCompat; + +public class WateringCanTransformation extends AbstractItemTransformation { + + public WateringCanTransformation() { + super(); + setDummyName("dummy_watering_can"); + setOldName("ExtraUtilities:watering_can"); + } + + public NBTTagCompound doTransformation(NBTTagCompound tag) { + int dmg = tag.getInteger("Damage"); + switch (dmg) { + case 0, 1: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModItems.WATERING_CAN_BASIC.get())); + break; + case 2: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModItems.WATERING_CAN_ADVANCED.get())); + break; + case 3: + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(ModItems.WATERING_CAN_ELITE.get())); + break; + } + return tag; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/AbstractTileEntityTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/AbstractTileEntityTransformation.java new file mode 100644 index 00000000..e7e3ad2b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/AbstractTileEntityTransformation.java @@ -0,0 +1,82 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.tileentities; + +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.DummyBlock; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.IPosteaTransformation; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.blocks.SoundMufflerTransformation; +import com.gtnewhorizons.postea.api.TileEntityReplacementManager; +import com.gtnewhorizons.postea.utility.BlockInfo; + +/** + * A simple {@link IPosteaTransformation} that transforms a single tile entity. + * Extend and use setOldBlockName and setNewBlock + * then do your transformation in doTileEntityTransformation + *

+ * See {@link SoundMufflerTransformation} for an example. + */ +public abstract class AbstractTileEntityTransformation implements IPosteaTransformation { + + private final Block dummyBlock; + + private String oldBlockName; + private String oldTEID; + + private ModBlocks block; + + /** + * Set the *full registry name* (e.g. "modid:item") of the old block this transformation is replacing + * + * @param oldName The registry name for the block this transformation is replacing + */ + public void setOldBlockName(String oldName) { + this.oldBlockName = oldName; + } + + /** + * Set the Modblock instance of the block that this TE will be re-mapped to. + * + * @param block The new block to be mapped to + */ + public void setNewBlock(ModBlocks block) { + this.block = block; + } + + /** + * Set the tile entity ID of the tile entity this transformation is replacing + * + * @param oldId The tile entity ID for the tile entity this transformation is replacing + */ + public void setOldTileEntityId(String oldId) { + this.oldTEID = oldId; + } + + public AbstractTileEntityTransformation() { + dummyBlock = new DummyBlock(Material.ground); + } + + @Override + public void addItemRemappings(Map remappings) { + remappings.put(oldBlockName, block.getItem()); + } + + @Override + public void addBlockRemappings(Map remappings) { + remappings.put(oldBlockName, block.get()); + } + + @Override + public void registerTransformations() { + TileEntityReplacementManager.tileEntityTransformer(oldTEID, this::doTileEntityTransformation); + } + + public abstract BlockInfo doTileEntityTransformation(NBTTagCompound oldTag, World world, Chunk chunk); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/FullChestTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/FullChestTransformation.java new file mode 100644 index 00000000..dd2c8414 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/FullChestTransformation.java @@ -0,0 +1,37 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.tileentities; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.gtnewhorizons.postea.utility.BlockInfo; +import com.gtnewhorizons.postea.utility.PosteaUtilities; + +public class FullChestTransformation extends AbstractTileEntityTransformation { + + public FullChestTransformation() { + super(); + setOldBlockName("ExtraUtilities:chestFull"); + setOldTileEntityId("TileFullChest"); + setNewBlock(ModBlocks.MARGINALLY_MAXIMISED_CHEST); + } + + @Override + public BlockInfo doTileEntityTransformation(NBTTagCompound _oldTag, World world, Chunk chunk) { + int meta = chunk + .getBlockMetadata(_oldTag.getInteger("x") & 15, _oldTag.getInteger("y"), _oldTag.getInteger("z") & 15); + // Don't ask me why our direction metas are so incomprehensible. + meta = switch (meta) { + case 1 -> 4; + case 0 -> 3; + case 3 -> 5; + default -> 2; + }; + return new BlockInfo(ModBlocks.MARGINALLY_MAXIMISED_CHEST.get(), meta, (oldTag) -> { + NBTTagCompound tag = PosteaUtilities.cleanseNBT("TileEntityMarginallyMaximisedChestUIE", oldTag); + tag.setTag("Items", oldTag.getTag("Items")); + return tag; + }); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/GeneratorTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/GeneratorTransformation.java new file mode 100644 index 00000000..6c964070 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/GeneratorTransformation.java @@ -0,0 +1,278 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.tileentities; + +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockEnderGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockFoodGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockHighTemperatureFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockLavaGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockLowTemperatureFurnaceGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockNetherStarGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockPinkGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockPotionGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockRedstoneGenerator; +import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockSolarGenerator; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.DummyBlock; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.IPosteaTransformation; +import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; +import com.gtnewhorizons.postea.api.IDExtenderCompat; +import com.gtnewhorizons.postea.api.ItemStackReplacementManager; +import com.gtnewhorizons.postea.api.TileEntityReplacementManager; +import com.gtnewhorizons.postea.utility.BlockInfo; +import com.gtnewhorizons.postea.utility.PosteaUtilities; + +import cpw.mods.fml.common.registry.GameRegistry; + +public class GeneratorTransformation implements IPosteaTransformation { + + private final Block dummyBlock1; + private final Block dummyBlock8; + private final Block dummyBlock64; + + private static final String dummyName1 = "dummy_generator1x"; + private static final String dummyName8 = "dummy_generator8x"; + private static final String dummyName64 = "dummy_generator64x"; + + public GeneratorTransformation() { + dummyBlock1 = new DummyBlock(Material.ground); + dummyBlock8 = new DummyBlock(Material.ground); + dummyBlock64 = new DummyBlock(Material.ground); + } + + @Override + public void registerDummies() { + GameRegistry.registerBlock(dummyBlock1, dummyName1); + GameRegistry.registerBlock(dummyBlock8, dummyName8); + GameRegistry.registerBlock(dummyBlock64, dummyName64); + UIEUtils.hideInNei(dummyBlock1); + UIEUtils.hideInNei(dummyBlock8); + UIEUtils.hideInNei(dummyBlock64); + } + + @Override + public void addItemRemappings(Map remappings) { + remappings.put("ExtraUtilities:generator", Item.getItemFromBlock(dummyBlock1)); + remappings.put("ExtraUtilities:generator.8", Item.getItemFromBlock(dummyBlock8)); + remappings.put("ExtraUtilities:generator.64", Item.getItemFromBlock(dummyBlock64)); + } + + @Override + public void addBlockRemappings(Map remappings) { + remappings.put("ExtraUtilities:generator", dummyBlock1); + remappings.put("ExtraUtilities:generator.8", dummyBlock8); + remappings.put("ExtraUtilities:generator.64", dummyBlock64); + } + + @Override + public void registerTransformations() { + ItemStackReplacementManager + .addItemReplacement(UtilitiesInExcess.MODID + ":" + dummyName1, (tag) -> this.doItemTransformation(tag, 1)); + ItemStackReplacementManager + .addItemReplacement(UtilitiesInExcess.MODID + ":" + dummyName8, (tag) -> this.doItemTransformation(tag, 8)); + ItemStackReplacementManager.addItemReplacement( + UtilitiesInExcess.MODID + ":" + dummyName64, + (tag) -> this.doItemTransformation(tag, 64)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatorstone", + (tag, world, chunk) -> this.doGeneratorTransformation(0, tag, world, chunk)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatorbase", + (tag, world, chunk) -> this.doGeneratorTransformation(1, tag, world, chunk)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatorlava", + (tag, world, chunk) -> this.doGeneratorTransformation(2, tag, world, chunk)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatorender", + (tag, world, chunk) -> this.doGeneratorTransformation(3, tag, world, chunk)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatorredflux", + (tag, world, chunk) -> this.doGeneratorTransformation(4, tag, world, chunk)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatorfood", + (tag, world, chunk) -> this.doGeneratorTransformation(5, tag, world, chunk)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatorpotion", + (tag, world, chunk) -> this.doGeneratorTransformation(6, tag, world, chunk)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatorsolar", + (tag, world, chunk) -> this.doGeneratorTransformation(7, tag, world, chunk)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatortnt", + (tag, world, chunk) -> this.doGeneratorTransformation(8, tag, world, chunk)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatorpink", + (tag, world, chunk) -> this.doGeneratorTransformation(9, tag, world, chunk)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatoroverclocked", + (tag, world, chunk) -> this.doGeneratorTransformation(10, tag, world, chunk)); + TileEntityReplacementManager.tileEntityTransformer( + "extrautils:generatornether", + (tag, world, chunk) -> this.doGeneratorTransformation(11, tag, world, chunk)); + } + + public NBTTagCompound doItemTransformation(NBTTagCompound tag, int mult) { + int dmg = tag.getInteger("Damage"); + ModBlocks block = getGeneratorFromMetaAndMult(dmg, mult); + IDExtenderCompat.setItemStackID(tag, Item.getIdFromItem(block.getItem())); + tag.setInteger("Damage", 0); + return tag; + } + + public BlockInfo doGeneratorTransformation(int meta, NBTTagCompound originalTag, World world, Chunk chunk) { + Block block = chunk + .getBlock(originalTag.getInteger("x") & 15, originalTag.getInteger("y"), originalTag.getInteger("z") & 15); + + int mult = 1; + if (block == dummyBlock8) { + mult = 8; + } else if (block == dummyBlock64) { + mult = 64; + } + + Block newBlock = getGeneratorFromMetaAndMult(meta, mult).get(); + + return new BlockInfo(newBlock, 0, (oldTag) -> { + NBTTagCompound tag = PosteaUtilities.cleanseNBT(getGeneratorTEID(newBlock), oldTag); + tag.setInteger("Energy", oldTag.getInteger("Energy")); + int burnTime = (int) oldTag.getDouble("coolDown"); + int rfPerTick = oldTag.getInteger("curLevel"); + + tag.setInteger("BurnTime", rfPerTick == 0 ? 0 : burnTime); + tag.setInteger("CurrentRFPerTick", rfPerTick); + + if (oldTag.hasKey("items")) { + NBTTagCompound items = oldTag.getCompoundTag("items"); + if (items.hasKey("item_0")) { + String stackName = newBlock instanceof BlockRedstoneGenerator ? "RedstoneStack" : "FuelStack"; + NBTTagCompound item = items.getCompoundTag("item_0"); + + if (rfPerTick == 0 && burnTime != 0) { + // If we know that the generator is running, but we don't know at what rf/t + // Add an extra item to the input stack + item.setInteger("Count", item.getInteger("Count") + 1); + } + + tag.setTag(stackName, item); + } + } + + if (oldTag.hasKey("Tank_0")) { + NBTTagCompound tank = oldTag.getCompoundTag("Tank_0"); + int amount = tank.getInteger("Amount"); + if (amount > 0 && rfPerTick == 0 && burnTime != 0) { + // If we know that the generator is running, but we don't know at what rf/t + // Add an extra bucket to the input fluid + tank.setInteger("Amount", Math.min(amount + 1000, 4000)); + } + tag.setTag("Fluid", tank); + } + return tag; + }); + } + + public static ModBlocks getGeneratorFromMetaAndMult(int meta, int mult) { + return switch (meta) { + case 0 -> switch (mult) { + case 64 -> ModBlocks.LOW_TEMPERATURE_FURNACE_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.LOW_TEMPERATURE_FURNACE_GENERATOR_PLUS; + default -> ModBlocks.LOW_TEMPERATURE_FURNACE_GENERATOR; + }; + case 1 -> switch (mult) { + case 64 -> ModBlocks.FURNACE_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.FURNACE_GENERATOR_PLUS; + default -> ModBlocks.FURNACE_GENERATOR; + }; + case 2 -> switch (mult) { + case 64 -> ModBlocks.LAVA_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.LAVA_GENERATOR_PLUS; + default -> ModBlocks.LAVA_GENERATOR; + }; + case 3 -> switch (mult) { + case 64 -> ModBlocks.ENDER_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.ENDER_GENERATOR_PLUS; + default -> ModBlocks.ENDER_GENERATOR; + }; + case 4 -> switch (mult) { + case 64 -> ModBlocks.REDSTONE_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.REDSTONE_GENERATOR_PLUS; + default -> ModBlocks.REDSTONE_GENERATOR; + }; + case 5 -> switch (mult) { + case 64 -> ModBlocks.FOOD_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.FOOD_GENERATOR_PLUS; + default -> ModBlocks.FOOD_GENERATOR; + }; + case 6 -> switch (mult) { + case 64 -> ModBlocks.POTION_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.POTION_GENERATOR_PLUS; + default -> ModBlocks.POTION_GENERATOR; + }; + case 7 -> switch (mult) { + case 64 -> ModBlocks.SOLAR_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.SOLAR_GENERATOR_PLUS; + default -> ModBlocks.SOLAR_GENERATOR; + }; + case 8 -> switch (mult) { + case 64 -> ModBlocks.TNT_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.TNT_GENERATOR_PLUS; + default -> ModBlocks.TNT_GENERATOR; + }; + case 9 -> switch (mult) { + case 64 -> ModBlocks.PINK_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.PINK_GENERATOR_PLUS; + default -> ModBlocks.PINK_GENERATOR; + }; + case 10 -> switch (mult) { + case 64 -> ModBlocks.HIGH_TEMPERATURE_FURNACE_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.HIGH_TEMPERATURE_FURNACE_GENERATOR_PLUS; + default -> ModBlocks.HIGH_TEMPERATURE_FURNACE_GENERATOR; + }; + case 11 -> switch (mult) { + case 64 -> ModBlocks.NETHER_STAR_GENERATOR_PLUSPLUS; + case 8 -> ModBlocks.NETHER_STAR_GENERATOR_PLUS; + default -> ModBlocks.NETHER_STAR_GENERATOR; + }; + + default -> throw new IllegalStateException("No defined generator with EXU meta: " + meta); + }; + } + + // TODO replace this once malteez's quarry PR gets merged with the TEID enum + private static String getGeneratorTEID(Block block) { + if (block instanceof BlockEnderGenerator) { + return "TileEntityEnderGeneratorUIE"; + } else if (block instanceof BlockFoodGenerator) { + return "TileEntityFoodGeneratorUIE"; + } else if (block instanceof BlockFurnaceGenerator) { + return "TileEntityFurnaceGeneratorUIE"; + } else if (block instanceof BlockHighTemperatureFurnaceGenerator) { + return "TileEntityHighTemperatureFurnaceGenerator"; + } else if (block instanceof BlockLavaGenerator) { + return "TileEntityLowTemperatureFurnaceGeneratorUIE"; + } else if (block instanceof BlockLowTemperatureFurnaceGenerator) { + return "TileEntityNetherStarGeneratorUIE"; + } else if (block instanceof BlockNetherStarGenerator) { + return "TileEntityPinkGeneratorUIE"; + } else if (block instanceof BlockPinkGenerator) { + return "TileEntityPotionGeneratorUIE"; + } else if (block instanceof BlockPotionGenerator) { + return "TileEntityRedstoneGeneratorUIE"; + } else if (block instanceof BlockRedstoneGenerator) { + return "TileEntitySolarGeneratorUIE"; + } else if (block instanceof BlockSolarGenerator) { + return "TileEntityTNTGeneratorUIE"; + } + + return ""; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/MiniChestTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/MiniChestTransformation.java new file mode 100644 index 00000000..0a81041f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/MiniChestTransformation.java @@ -0,0 +1,37 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.tileentities; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; + +import com.fouristhenumber.utilitiesinexcess.ModBlocks; +import com.gtnewhorizons.postea.utility.BlockInfo; +import com.gtnewhorizons.postea.utility.PosteaUtilities; + +public class MiniChestTransformation extends AbstractTileEntityTransformation { + + public MiniChestTransformation() { + super(); + setOldBlockName("ExtraUtilities:chestMini"); + setOldTileEntityId("TileMiniChest"); + setNewBlock(ModBlocks.SIGNIFICANTLY_SHRUNK_CHEST); + } + + @Override + public BlockInfo doTileEntityTransformation(NBTTagCompound _oldTag, World world, Chunk chunk) { + int meta = chunk + .getBlockMetadata(_oldTag.getInteger("x") & 15, _oldTag.getInteger("y"), _oldTag.getInteger("z") & 15); + // Don't ask me why our direction metas are so incomprehensible. + meta = switch (meta) { + case 3 -> 4; + case 2 -> 3; + case 1 -> 5; + default -> 2; + }; + return new BlockInfo(ModBlocks.SIGNIFICANTLY_SHRUNK_CHEST.get(), meta, (oldTag) -> { + NBTTagCompound tag = PosteaUtilities.cleanseNBT("TileEntitySignificantlyShrunkChestUIE", oldTag); + tag.setTag("Items", oldTag.getTag("Items")); + return tag; + }); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/SpikeTransformation.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/SpikeTransformation.java new file mode 100644 index 00000000..e17ec183 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/exu/postea/tileentities/SpikeTransformation.java @@ -0,0 +1,51 @@ +package com.fouristhenumber.utilitiesinexcess.compat.exu.postea.tileentities; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.BlockSpike; +import com.fouristhenumber.utilitiesinexcess.compat.exu.postea.IPosteaTransformation; +import com.gtnewhorizons.postea.api.TileEntityReplacementManager; +import com.gtnewhorizons.postea.utility.BlockInfo; +import com.gtnewhorizons.postea.utility.PosteaUtilities; + +public class SpikeTransformation implements IPosteaTransformation { + + @Override + public void registerTransformations() { + TileEntityReplacementManager + .tileEntityTransformer("TileEntityEnchantedSpike", this::doTileEntityTransformation); + } + + public BlockInfo doTileEntityTransformation(NBTTagCompound _oldTag, World world, Chunk chunk) { + Block block = chunk + .getBlock(_oldTag.getInteger("x") & 15, _oldTag.getInteger("y"), _oldTag.getInteger("z") & 15); + + return new BlockInfo(block, 0, (oldTag) -> { + NBTTagCompound tag = PosteaUtilities.cleanseNBT("utilitiesinexcess:TileEntitySpike", oldTag); + + NBTTagCompound fakeWeapon = new NBTTagCompound(); + + ItemStack fakeWeaponStack = new ItemStack(Item.getItemFromBlock(block)); + NBTTagCompound tagtag = (NBTTagCompound) oldTag.copy(); + tagtag.removeTag("x"); + tagtag.removeTag("y"); + tagtag.removeTag("z"); + tagtag.removeTag("id"); + fakeWeaponStack.setTagCompound(tagtag); + fakeWeaponStack.writeToNBT(fakeWeapon); + + tag.setTag("FakeWeapon", fakeWeapon); + + String spikeType = ((BlockSpike) block).getSpikeType() + .name(); + tag.setString("SpikeType", spikeType); + + return tag; + }); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java index 2cf8bb95..ffeb0dbf 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/NEIConfig.java @@ -1,5 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.compat.nei; +import net.minecraft.util.StatCollector; + import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import codechicken.nei.api.IConfigureNEI; @@ -13,7 +15,7 @@ public class NEIConfig implements IConfigureNEI { @Override public String getName() { - return "UtilitiesInExcess NEI Plugin"; + return StatCollector.translateToLocal("nei.title.uie.plugin"); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java index 179b5138..48fc3140 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/nei/QEDRecipeHandler.java @@ -1,6 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.compat.nei; import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; import com.fouristhenumber.utilitiesinexcess.api.QEDRecipe; import com.fouristhenumber.utilitiesinexcess.api.QEDRegistry; @@ -18,7 +19,7 @@ public String getOverlayIdentifier() { @Override public String getRecipeName() { - return "QED Recipes"; + return StatCollector.translateToLocal("nei.title.uie.qed"); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/OtherConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/OtherConfig.java index 6878f6c1..336431e1 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/OtherConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/OtherConfig.java @@ -12,6 +12,11 @@ public static void registerConfig() throws ConfigException { ConfigurationManager.registerConfig(OtherConfig.class); } + @Config.DefaultBoolean(true) // TODO Set default to false before release + @Config.RequiresMcRestart + @Config.Comment("Enable the Extra Utilities to Utilities In Excess world conversion system") + public static boolean enableWorldConversion; + @Config.DefaultBoolean(true) @Config.RequiresMcRestart @Config.Comment("Enable rendering some UIE baubles on players who have them equipped") diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java index b739d4b6..8eb45a65 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/BlockConfig.java @@ -19,6 +19,10 @@ public static void registerConfig() throws ConfigException { @Config.DefaultBoolean(true) public static boolean enableFloatingBlock; + @Config.DefaultBoolean(false) + @Config.Comment("If enabled, inverted block will have a similar X-Ray effect to Extra Utilities' Unstable Block.") + public static boolean invertedBlockDoesXRay; + @Config.DefaultBoolean(true) public static boolean enableColoredBlocks; @@ -166,6 +170,36 @@ public static class RainMuffler { public int rainMufflerRange; } + @Config.Comment("Chandelier Configuration") + public static final Chandelier chandelier = new Chandelier(); + + @Config.LangKey("utilitiesinexcess.config.block.chandelier") + public static class Chandelier { + + @Config.DefaultBoolean(true) + public boolean enableChandelier; + + @Config.Comment("The radius a chandelier blocks mob spawns (as a square box)") + @Config.DefaultInt(16) + @Config.RangeInt(min = 1, max = 256) + public int chandelierLightRange; + } + + @Config.Comment("Giga Torch Configuration") + public static final GigaTorch gigaTorch = new GigaTorch(); + + @Config.LangKey("utilitiesinexcess.config.block.giga_torch") + public static class GigaTorch { + + @Config.DefaultBoolean(true) + public boolean enableGigaTorch; + + @Config.Comment("The radius a giga torch blocks mob spawns (as a square box)") + @Config.DefaultInt(64) + @Config.RangeInt(min = 1, max = 256) + public int gigaTorchRange; + } + @Config.Comment("Cursed Earth Configuration") public static final Spikes spikes = new Spikes(); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java index 8ce594cf..fb1b7171 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/InversionConfig.java @@ -20,24 +20,62 @@ public class InversionConfig { @Config.Comment("Amount of unique items in the list the north chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 14) + @Config.RangeInt(min = 1, max = 10000) public static int northChestRequiredItems; + @Config.Comment("List of valid items the north chest can contain. Must be item ids in the form 'modid:itemname:meta'") + @Config.DefaultStringList( + value = { "minecraft:stone", "minecraft:brick", "minecraft:glass", "minecraft:cooked_fished", + "minecraft:hardened_clay", "minecraft:dye:2", "minecraft:coal:1", "minecraft:cooked_beef", + "minecraft:iron_ingot", "minecraft:cooked_chicken", "minecraft:gold_ingot", "minecraft:baked_potato", + "minecraft:cooked_porkchop", "minecraft:netherbrick" }) + public static String[] northChestValidItems; + @Config.Comment("Amount of unique items in the list the east chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 27) + @Config.RangeInt(min = 1, max = 10000) public static int eastChestRequiredItems; + @Config.Comment("List of valid items the east chest can contain. Must be item ids in the form 'modid:itemname:meta'. Enable splash potions with chestSplashPotionsValid (applies for other chests too).") + @Config.DefaultStringList( + value = { "minecraft:potion:8193", "minecraft:potion:8194", "minecraft:potion:8195", "minecraft:potion:8196", + "minecraft:potion:8197", "minecraft:potion:8198", "minecraft:potion:8200", "minecraft:potion:8201", + "minecraft:potion:8202", "minecraft:potion:8204", "minecraft:potion:8205", "minecraft:potion:8206", + "minecraft:potion:8225", "minecraft:potion:8226", "minecraft:potion:8228", "minecraft:potion:8229", + "minecraft:potion:8232", "minecraft:potion:8233", "minecraft:potion:8234", "minecraft:potion:8236", + "minecraft:potion:8257", "minecraft:potion:8258", "minecraft:potion:8259", "minecraft:potion:8260", + "minecraft:potion:8262", "minecraft:potion:8264", "minecraft:potion:8265", "minecraft:potion:8267", + "minecraft:potion:8268", "minecraft:potion:8269", "minecraft:potion:8270" }) + public static String[] eastChestValidItems; + @Config.Comment("Amount of unique items in the list the south chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 13) + @Config.RangeInt(min = 1, max = 10000) public static int southChestRequiredItems; + @Config.Comment("List of valid items the south chest can contain. Must be item ids in the form 'modid:itemname:meta'") + @Config.DefaultStringList( + value = { "minecraft:grass", "minecraft:lapis_ore", "minecraft:dirt", "minecraft:obsidian", "minecraft:sand", + "minecraft:diamond_ore", "minecraft:gravel", "minecraft:redstone_ore", "minecraft:gold_ore", + "minecraft:clay", "minecraft:iron_ore", "minecraft:emerald_ore", "minecraft:coal_ore" }) + public static String[] southChestValidItems; + @Config.Comment("Amount of unique items in the list the west chest has to contain for the pseudo-inversion ritual") @Config.DefaultInt(12) - @Config.RangeInt(min = 1, max = 12) + @Config.RangeInt(min = 1, max = 10000) public static int westChestRequiredItems; + @Config.Comment("List of valid items the west chest can contain. Must be item ids in the form 'modid:itemname:meta'") + @Config.DefaultStringList( + value = { "minecraft:record_13", "minecraft:record_mellohi", "minecraft:record_cat", "minecraft:record_stal", + "minecraft:record_blocks", "minecraft:record_strad", "minecraft:record_chirp", "minecraft:record_ward", + "minecraft:record_far", "minecraft:record_11", "minecraft:record_mall", "minecraft:record_wait" }) + public static String[] westChestValidItems; + + @Config.Comment("Whether or not vanilla splash potions should also be valid if a regular potion of the same type is found.") + @Config.DefaultBoolean(true) + public static boolean chestSplashPotionsValid; + @Config.Comment("Amount of mobs needed to kill to pass the siege of the ritual") @Config.DefaultInt(100) @Config.RangeInt(min = 4) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java index b2f50e45..25379e21 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java @@ -38,6 +38,10 @@ public static void registerConfig() throws ConfigException { @Config.DefaultInt(49) public static int superArchitectsWandBuildLimit; + @Config.DefaultInt(100) + @Config.Comment("[GT5U] Durability damage dealt to Trowels per block placed by the Architect's Wand. (Set to 0 to disable)") + public static int damageTrowelWithArchitectsWand; + @Config.DefaultBoolean(true) public static boolean enableBedrockium; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GluttonsAxeConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GourmandsAxeConfig.java similarity index 95% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GluttonsAxeConfig.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GourmandsAxeConfig.java index e46b15a0..adca422a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GluttonsAxeConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/GourmandsAxeConfig.java @@ -3,8 +3,8 @@ import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.gtnewhorizon.gtnhlib.config.Config; -@Config(modid = UtilitiesInExcess.MODID, category = "items.unstable_tools.gluttons_axe") -public class GluttonsAxeConfig { +@Config(modid = UtilitiesInExcess.MODID, category = "items.unstable_tools.gourmands_axe") +public class GourmandsAxeConfig { @Config.DefaultBoolean(true) @Config.RequiresMcRestart diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java index cf046428..1c28da6e 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/unstabletools/UnstableTools.java @@ -13,7 +13,7 @@ public class UnstableTools { // Not sure abt nested categories, lets disccuss that later public static void registerConfig() throws ConfigException { ConfigurationManager.registerConfig(UnstableTools.class); - ConfigurationManager.registerConfig(GluttonsAxeConfig.class); + ConfigurationManager.registerConfig(GourmandsAxeConfig.class); ConfigurationManager.registerConfig(EthericSwordConfig.class); ConfigurationManager.registerConfig(AntiParticulateShovelConfig.class); ConfigurationManager.registerConfig(DestructionPickaxeConfig.class); diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java index c31ff8af..cb580177 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/Mixins.java @@ -1,11 +1,8 @@ package com.fouristhenumber.utilitiesinexcess.mixins; -import static com.fouristhenumber.utilitiesinexcess.mixins.TargetedMod.ANGELICA; - import javax.annotation.Nonnull; import com.fouristhenumber.utilitiesinexcess.config.OtherConfig; -import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.items.ItemConfig; import com.gtnewhorizon.gtnhmixins.builders.IMixins; @@ -20,19 +17,12 @@ public enum Mixins implements IMixins { .setPhase(Phase.EARLY) .setApplyIf(() -> CursedEarthConfig.enableCursedEarth || CursedEarthConfig.enableBlessedEarth) /*.addRequiredMod(TargetedMod.VANILLA)*/), - MAGIC_WOOD_PARTICLES(new MixinBuilder("Adds particles for Magic Wood when connected to an Enchantment Table") - .addClientMixins("minecraft.MixinBlockEnchantmentTable_MagicWood") - .setPhase(Phase.EARLY) - .setApplyIf(() -> BlockConfig.enableMagicWood) - .addExcludedMod(ANGELICA) - /*.addRequiredMod(TargetedMod.VANILLA)*/ - ), GLOVE(new MixinBuilder("Implements the Glove's special right click") .addCommonMixins("minecraft.MixinNetHandlerPlayServer_Glove", "minecraft.MixinItemRenderer_Glove", "minecraft.MixinPlayerControllerMP_Glove") .setPhase(Phase.EARLY) .setApplyIf(() -> ItemConfig.enableGlove) /*.addRequiredMod(TargetedMod.VANILLA)*/), - BUABLE_RENDERS(new MixinBuilder("Renders equipped baubles on the player") + BAUBLE_RENDERS(new MixinBuilder("Renders equipped baubles on the player") .addCommonMixins("minecraft.MixinModelBiped_Baubles", "minecraft.MixinModelRenderer_Baubles") .setPhase(Phase.EARLY) .setApplyIf(() -> OtherConfig.enableBaubleRenders) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java deleted file mode 100644 index 3cf5b1e8..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinBlockEnchantmentTable_MagicWood.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockEnchantmentTable; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import com.fouristhenumber.utilitiesinexcess.ModBlocks; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; - -@Mixin(BlockEnchantmentTable.class) -public class MixinBlockEnchantmentTable_MagicWood { - - // Wraps World.getBlock() to avoid a mixin into an if-statement - @WrapOperation( - method = "Lnet/minecraft/block/BlockEnchantmentTable;randomDisplayTick(Lnet/minecraft/world/World;IIILjava/util/Random;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getBlock(III)Lnet/minecraft/block/Block;")) - private Block uie$addMagicWoodParticles(World world, int x, int y, int z, Operation original) { - Block block = original.call(world, x, y, z); - if (block == ModBlocks.MAGIC_WOOD.get()) return Blocks.bookshelf; - return block; - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java index b0e252bc..9d278bf8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/mixins/early/minecraft/MixinModelBiped_Baubles.java @@ -1,5 +1,7 @@ package com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft; +import java.util.Objects; + import net.minecraft.client.model.ModelBiped; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -74,14 +76,16 @@ public class MixinModelBiped_Baubles { if (ring == null) { ring = UIEUtils.getBauble(player, ItemHeavenlyRing.class); } - if (ring != null && ring.getItemDamage() != 0) { + if (ring != null) { final ItemStack finalRing = ring; uie$heavenlyRingWing = HeavenlyRingRenderer .getNextAngle(uie$heavenlyRingWing, player.capabilities.isFlying); - ModelPartRenderHelper.renderBipedPart( - p_78088_7_, - thisObject.bipedBody, - () -> { HeavenlyRingRenderer.render(finalRing.getItemDamage(), uie$heavenlyRingWing); }); + ModelPartRenderHelper.renderBipedPart(p_78088_7_, thisObject.bipedBody, () -> { + HeavenlyRingRenderer.render( + (ItemHeavenlyRing) Objects.requireNonNull(finalRing.getItem()), + finalRing.getItemDamage(), + uie$heavenlyRingWing); + }); } } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java index 5cbadc7a..40f0413d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/render/TESRUnderworldPortal.java @@ -1,6 +1,5 @@ package com.fouristhenumber.utilitiesinexcess.render; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; @@ -10,21 +9,21 @@ import org.lwjgl.opengl.GL11; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; -import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; +import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator; import com.gtnewhorizon.gtnhlib.client.renderer.postprocessing.shaders.UniversiumShader; import com.gtnewhorizon.gtnhlib.client.renderer.shader.ShaderProgram; -import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer; -import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; +import com.gtnewhorizon.gtnhlib.client.renderer.vao.IVertexArrayObject; +import com.gtnewhorizon.gtnhlib.client.renderer.vao.VertexBufferType; public class TESRUnderworldPortal extends TileEntitySpecialRenderer { public static final IModelCustom FRAME = AdvancedModelLoader .loadModel(new ResourceLocation(UtilitiesInExcess.MODID, "models/underworld_portal/frame.obj")); - private VertexBuffer core; + private IVertexArrayObject core; private void initCoreVBO() { - Tessellator tessellator = TessellatorManager.startCapturingAndGet(); + final DirectTessellator tessellator = DirectTessellator.startCapturing(); tessellator.startDrawingQuads(); @@ -60,7 +59,7 @@ private void initCoreVBO() { tessellator.draw(); - core = TessellatorManager.stopCapturingToVBO(DefaultVertexFormat.POSITION); + core = DirectTessellator.stopCapturingToVBO(VertexBufferType.IMMUTABLE); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsSelection.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsSelection.java new file mode 100644 index 00000000..dffb4d84 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsSelection.java @@ -0,0 +1,136 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +import org.jetbrains.annotations.Nullable; + +import com.fouristhenumber.utilitiesinexcess.compat.Mods; +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +import gregtech.api.items.MetaGeneratedTool; +import gregtech.common.tools.ToolTrowel; +import xonin.backhand.api.core.BackhandUtils; + +public class ArchitectsSelection { + + private final Set validBlocks; + private final ItemStack backhand; + private final ItemStack lookAtBlock; + + public ArchitectsSelection(EntityPlayer player, World world, MovingObjectPosition movingObjectPosition) { + this.validBlocks = new HashSet<>(); + backhand = Mods.Backhand.isLoaded() ? BackhandUtils.getOffhandItem(player) : null; + lookAtBlock = getBlockByLocation(world, movingObjectPosition, player); + + // No logic is executed if we don't look at any block, no need to bother checking other cases + if (lookAtBlock == null) { + return; + } + + this.validBlocks.add(lookAtBlock); // Clicked block is always valid + + if (backhand == null) { + return; + } + if (isValidBlock(backhand)) { + this.validBlocks.add(backhand.copy()); + return; + } + if (isTrowel(backhand)) { + this.validBlocks.addAll(hotbarBlocks(player)); + } + } + + /** + * + * @param player + * @return Always a valid block list or null + */ + public List blockToPlace(EntityPlayer player) { + + if (backhand == null) { + return Collections.singletonList((lookAtBlock)); + } + if (isValidBlock(backhand)) { + return Collections.singletonList(backhand); + } else if (isTrowel(backhand)) { + return hotbarBlocks(player); + } else { + return Collections.singletonList(lookAtBlock); + } + } + + public int maxPlaceCount(EntityPlayer player, int wandLimit) { + if (player.capabilities.isCreativeMode) return wandLimit; + int count = 0; + for (ItemStack block : blockToPlace(player)) { + count += ArchitectsWandUtils.countItemInInventory(player, block); + } + return Math.min(count, wandLimit); + } + + public boolean matches(ItemStack other) { + if (other == null) return false; + return this.validBlocks.stream() + .anyMatch( + validBlock -> validBlock.getItem() == other.getItem() + && ItemStack.areItemStackTagsEqual(validBlock, other) + && validBlock.getItemDamage() == other.getItemDamage()); + } + + public static boolean isTrowel(@Nullable ItemStack stack) { + if (stack == null) { + return false; + } + if (Mods.GT.isLoaded() && stack.getItem() instanceof MetaGeneratedTool metaGeneratedTool) { + return metaGeneratedTool.getToolStats(stack) instanceof ToolTrowel; + } + return false; + } + + private static boolean isValidBlock(@Nullable ItemStack stack) { + return (stack != null && stack.getItem() instanceof ItemBlock); + } + + private static List hotbarBlocks(EntityPlayer player) { + List candidates = new ArrayList<>(); + + for (int i = 0; i < 9; i++) { + if (i == player.inventory.currentItem) { + continue; + } + ItemStack item = player.inventory.mainInventory[i]; + if (!isValidBlock(item)) { + continue; + } + candidates.add(item); + } + return candidates; + } + + public static ItemStack getBlockByLocation(World world, MovingObjectPosition movingObjectPosition, + EntityPlayer player) { + + BlockPos blockPos = new BlockPos( + movingObjectPosition.blockX, + movingObjectPosition.blockY, + movingObjectPosition.blockZ); + + Block block = world.getBlock(blockPos.x, blockPos.y, blockPos.z); + if (block == null) { + return null; + } + return block.getPickBlock(movingObjectPosition, world, blockPos.x, blockPos.y, blockPos.z, player); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java index 6c7306f2..c35d74ca 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ArchitectsWandUtils.java @@ -1,21 +1,34 @@ package com.fouristhenumber.utilitiesinexcess.utils; +import static com.fouristhenumber.utilitiesinexcess.utils.ArchitectsSelection.getBlockByLocation; +import static com.fouristhenumber.utilitiesinexcess.utils.ArchitectsSelection.isTrowel; +import static com.fouristhenumber.utilitiesinexcess.utils.MovingObjectPositionUtil.TranslateMovingObjectPoistionToLocation; + import java.util.HashSet; import java.util.LinkedList; +import java.util.List; +import java.util.Objects; import java.util.Queue; import java.util.Set; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import com.fouristhenumber.utilitiesinexcess.compat.Mods; import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; +import gregtech.api.items.MetaGeneratedTool; +import xonin.backhand.api.core.BackhandUtils; + public class ArchitectsWandUtils { - public ArchitectsWandUtils() {}; + public ArchitectsWandUtils() {} + + ; /** * Counts the items of a certain type in a player's inventory @@ -45,7 +58,7 @@ public static int countItemInInventory(EntityPlayer player, ItemStack itemStack) * @return True if the ItemStack has been decremented, otherwise false */ public static boolean decreaseFromInventory(EntityPlayer player, ItemStack itemStack) { - for (int slotIndex = 0; slotIndex < player.inventory.mainInventory.length; slotIndex++) { + for (int slotIndex = player.inventory.mainInventory.length - 1; slotIndex >= 0; slotIndex--) { ItemStack stack = player.inventory.mainInventory[slotIndex]; if (stack != null && stack.getItem() == itemStack.getItem() && stack.getItemDamage() == itemStack.getItemDamage()) { @@ -60,19 +73,19 @@ public static boolean decreaseFromInventory(EntityPlayer player, ItemStack itemS } /** - * Finds the blocks adjacent to the start position that are connected cardinally - * and have air infront of them relative to the side clicked on. + * Finds the blocks adjacent to the start position that are connected cardinally, or diagonally + * and have air in front of them relative to the side clicked on. * - * @param world The world in which to place - * @param blockToFind The block that is being found - * @param metaToFind The metadata of the block that is being found - * @param findCount The maximum amount of blocks it should search - * @param clickedSide The side of the block that was clicked - * @param startPos The position to start + * @param world The world in which to place + * @param findCount The maximum amount of blocks it should search + * @param clickedSide The side of the block that was clicked + * @param startPos The position to start + * @param architectsSelection The pattern used to search adjacent blocks * @return The set of 1<=x<=findCount adjacent blocks with air on their face */ - public static Set findAdjacentBlocks(World world, Block blockToFind, int metaToFind, int findCount, - ForgeDirection clickedSide, BlockPos startPos) { + public static Set findAdjacentBlocks(World world, List possiblePlacements, int findCount, + ForgeDirection clickedSide, BlockPos startPos, MovingObjectPosition mop, EntityPlayer player, + ArchitectsSelection architectsSelection) { Set region = new HashSet<>(); if (findCount <= 0) { return region; @@ -84,27 +97,26 @@ public static Set findAdjacentBlocks(World world, Block blockToFind, i int[][] allowedOffsets = switch (clickedSide) { case UP, DOWN -> // Plane: x/z plane (y remains constant) - new int[][] { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 0, 1 }, { 0, 0, -1 } }; + new int[][] { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 0, 1 }, { 0, 0, -1 }, // Cardinal + { 1, 0, 1 }, { 1, 0, -1 }, { -1, 0, 1 }, { -1, 0, -1 } }; // Diagonal case NORTH, SOUTH -> // Plane: x/y plane (z remains constant) - new int[][] { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1, 0 }, { 0, -1, 0 } }; + new int[][] { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1, 0 }, { 0, -1, 0 }, // Cardinal + { 1, 1, 0 }, { 1, -1, 0 }, { -1, 1, 0 }, { -1, -1, 0 } }; // Diagonal case EAST, WEST -> // Plane: y/z plane (x remains constant) - new int[][] { { 0, 1, 0 }, { 0, -1, 0 }, { 0, 0, 1 }, { 0, 0, -1 } }; + new int[][] { { 0, 1, 0 }, { 0, -1, 0 }, { 0, 0, 1 }, { 0, 0, -1 }, // Cardinal + { 0, 1, 1 }, { 0, 1, -1 }, { 0, -1, 1 }, { 0, -1, -1 } }; // Diagonal default -> throw new RuntimeException("UE's BuilderWand's findAdjacentBlocks called with invalid side"); }; - int sx = startPos.x; - int sy = startPos.y; - int sz = startPos.z; + // translate the mop + TranslateMovingObjectPoistionToLocation(mop, startPos); // Base case - if (world.getBlock(sx, sy, sz) == blockToFind && world.getBlockMetadata(sx, sy, sz) == metaToFind - && world.isAirBlock(sx + clickedSide.offsetX, sy + clickedSide.offsetY, sz + clickedSide.offsetZ)) { - - BlockPos neighbor = new BlockPos(sx, sy, sz); - region.add(neighbor); - queue.add(neighbor); + if (IsValidForWireFrame(world, possiblePlacements, startPos, mop, player, clickedSide, architectsSelection)) { + region.add(startPos); + queue.add(startPos); visited.add(startPos); } else { return region; @@ -113,33 +125,30 @@ public static Set findAdjacentBlocks(World world, Block blockToFind, i // Flood-fill the contiguous region in the allowed plane. while (!queue.isEmpty() && region.size() < findCount) { BlockPos current = queue.poll(); - int cx = current.x; - int cy = current.y; - int cz = current.z; for (int[] off : allowedOffsets) { - // Check if already visited - int nx = cx + off[0]; - int ny = cy + off[1]; - int nz = cz + off[2]; + if (region.size() >= findCount) { + break; + } - BlockPos key = new BlockPos(nx, ny, nz); + BlockPos key = current.offset(off[0], off[1], off[2]); if (visited.contains(key)) { continue; } visited.add(key); - // Check and add to region+queue - int airx = nx + clickedSide.offsetX; - int airy = ny + clickedSide.offsetY; - int airz = nz + clickedSide.offsetZ; - - if (world.getBlock(nx, ny, nz) == blockToFind && world.getBlockMetadata(nx, ny, nz) == metaToFind - && world.isAirBlock(airx, airy, airz)) { - - BlockPos neighbor = new BlockPos(nx, ny, nz); - region.add(neighbor); - queue.add(neighbor); + // translate the mop + TranslateMovingObjectPoistionToLocation(mop, key); + if (IsValidForWireFrame( + world, + possiblePlacements, + key, + mop, + player, + clickedSide, + architectsSelection)) { + region.add(key); + queue.add(key); } } } @@ -147,4 +156,50 @@ public static Set findAdjacentBlocks(World world, Block blockToFind, i return region; } + private static boolean IsValidForWireFrame(World world, List possibleBlocks, BlockPos targetLocation, + MovingObjectPosition mop, EntityPlayer player, ForgeDirection clickedSide, ArchitectsSelection selection) { + ItemStack currentBlock = getBlockByLocation(world, mop, player); + + if (currentBlock == null) return false; + + return possibleBlocks.stream() + .allMatch(itemStackToPlace -> { + if (itemStackToPlace == null) return false; + + Block block = Block.getBlockFromItem(itemStackToPlace.getItem()); + return selection.matches(currentBlock) + && world.isAirBlock( + targetLocation.x + clickedSide.offsetX, + targetLocation.y + clickedSide.offsetY, + targetLocation.z + clickedSide.offsetZ) + && block.canPlaceBlockOnSide( + world, + targetLocation.x + clickedSide.offsetX, + targetLocation.y + clickedSide.offsetY, + targetLocation.z + clickedSide.offsetZ, + clickedSide.ordinal()) + && world.canPlaceEntityOnSide( + block, + targetLocation.x + clickedSide.offsetX, + targetLocation.y + clickedSide.offsetY, + targetLocation.z + clickedSide.offsetZ, + false, + clickedSide.ordinal(), + null, + itemStackToPlace); + }); + } + + public static boolean damageBackhand(int damage, EntityPlayer player) { + if (!player.capabilities.isCreativeMode && Mods.Backhand.isLoaded() + && isTrowel(BackhandUtils.getOffhandItem(player))) { + MetaGeneratedTool trowel = (MetaGeneratedTool) Objects.requireNonNull(BackhandUtils.getOffhandItem(player)) + .getItem(); + if (trowel == null) { + return true; + } + return trowel.doDamage(BackhandUtils.getOffhandItem(player), damage); + } + return true; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java index 827c1469..52810f17 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ForgeEventHandler.java @@ -33,14 +33,14 @@ import com.fouristhenumber.utilitiesinexcess.common.items.ItemXRayGlasses; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemAntiParticulateShovel; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemDestructionPickaxe; -import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGluttonsAxe; +import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemGourmandsAxe; import com.fouristhenumber.utilitiesinexcess.common.items.tools.ItemPrecisionShears; import com.fouristhenumber.utilitiesinexcess.common.renderers.XRayRenderer; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityPacifistsBench; import com.fouristhenumber.utilitiesinexcess.common.tileentities.TileEntityVoidMarker; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.AntiParticulateShovelConfig; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.DestructionPickaxeConfig; -import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GluttonsAxeConfig; +import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.GourmandsAxeConfig; import com.fouristhenumber.utilitiesinexcess.mixins.early.minecraft.accessors.AccessorEntityLivingBase; import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; import com.gtnewhorizon.gtnhlib.client.event.LivingEquipmentChangeEvent; @@ -143,7 +143,7 @@ public void onBlockBroken(BlockEvent.HarvestDropsEvent event) { Item heldItemType = heldItem.getItem(); if ((heldItemType instanceof ItemDestructionPickaxe && DestructionPickaxeConfig.voidMinedBlock) || (heldItemType instanceof ItemAntiParticulateShovel && AntiParticulateShovelConfig.voidMinedBlocks) - || (heldItemType instanceof ItemGluttonsAxe && GluttonsAxeConfig.voidMinedBlock)) { + || (heldItemType instanceof ItemGourmandsAxe && GourmandsAxeConfig.voidMinedBlock)) { event.drops.clear(); } if (heldItemType instanceof ItemPrecisionShears) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java new file mode 100644 index 00000000..ff965cac --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackBaseCompare.java @@ -0,0 +1,36 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +/** + * Wrapper class of ItemStack that compares with itemStack Item, Count and Damage. + */ + +public class ItemStackBaseCompare { + + public ItemStackBaseCompare(ItemStack itemStack) { + item = itemStack.getItem(); + count = itemStack.stackSize; + damage = itemStack.getItemDamage(); + } + + Item item; + int count; + int damage; + + @Override + public boolean equals(Object o) { + if (!(o instanceof ItemStackBaseCompare that)) return false; + return count == that.count && damage == that.damage && item == that.item; + } + + @Override + public int hashCode() { + int result = 1; + result = 31 * result + (item != null ? item.hashCode() : 0); + result = 31 * result + count; + result = 31 * result + damage; + return result; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MovingObjectPositionUtil.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MovingObjectPositionUtil.java new file mode 100644 index 00000000..2ab8a5fa --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MovingObjectPositionUtil.java @@ -0,0 +1,23 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; + +import com.gtnewhorizon.gtnhlib.blockpos.BlockPos; + +public class MovingObjectPositionUtil { + + public static void TranslateMovingObjectPoistionToLocation(MovingObjectPosition movingObjectPosition, + BlockPos location) { + double offsetXn = movingObjectPosition.hitVec.xCoord - movingObjectPosition.blockX; + double offsetYn = movingObjectPosition.hitVec.yCoord - movingObjectPosition.blockY; + double offsetZn = movingObjectPosition.hitVec.zCoord - movingObjectPosition.blockZ; + + movingObjectPosition.blockX = location.x; + movingObjectPosition.blockY = location.y; + movingObjectPosition.blockZ = location.z; + + movingObjectPosition.hitVec = Vec3 + .createVectorHelper(location.x + offsetXn, location.y + offsetYn, location.z + offsetZn); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java index f45038be..4238093b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/UIEUtils.java @@ -4,7 +4,9 @@ import java.util.Objects; import java.util.Random; +import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -12,6 +14,7 @@ import baubles.common.container.InventoryBaubles; import baubles.common.lib.PlayerHandler; +import codechicken.nei.api.API; import it.unimi.dsi.fastutil.Hash; public class UIEUtils { @@ -101,4 +104,14 @@ public boolean equals(ItemStack a, ItemStack b) { && Objects.equals(a.getTagCompound(), b.getTagCompound()); } } + + public static void hideInNei(Block block) { + hideInNei(Item.getItemFromBlock(block)); + } + + public static void hideInNei(Item item) { + if (!Mods.NEI.isLoaded()) return; + + API.hideItem(new ItemStack(item)); + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java deleted file mode 100644 index 7012ac44..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/VoidingInventory.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.utils; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; - -public class VoidingInventory implements IInventory { - - private int size; - private String name; - - public VoidingInventory(int size, String name) { - this.size = size; - this.name = name; - } - - @Override - public int getSizeInventory() { - return size; - } - - @Override - public ItemStack getStackInSlot(int slotIn) { - return null; - } - - @Override - public ItemStack decrStackSize(int index, int count) { - return null; - } - - @Override - public ItemStack getStackInSlotOnClosing(int index) { - return null; - } - - @Override - public void setInventorySlotContents(int index, ItemStack stack) { - if (stack != null) stack.stackSize = 0; - } - - @Override - public String getInventoryName() { - return name; - } - - @Override - public boolean hasCustomInventoryName() { - return true; - } - - @Override - public int getInventoryStackLimit() { - return Integer.MAX_VALUE; - } - - @Override - public void markDirty() {} - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - return true; - } - - @Override - public void openInventory() {} - - @Override - public void closeInventory() {} - - @Override - public boolean isItemValidForSlot(int index, ItemStack stack) { - return true; - } -} diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/0.png new file mode 100644 index 0000000000000000000000000000000000000000..740558bf5735f596c6d88306bfb82a8aa1ae4256 GIT binary patch literal 388 zcmV-~0ek+5P)Bw5Vll~Y;H|saSfzM(H+wU0-n_YM)OFXkL4!+wuxrIl)6pw-9EyjdR*1QehX+>N zH601TWO8Va4{gWnrDM;tQ!A@uf7bc*>BwVpAq)g`;qd+A!sfr%_V#-2`1W(!)Mx|< zX!_^DVBZNy5J6lZ5|r^i^8mK0It%hui~^Y_BLUmlNDzA<_Z3qpWvK1<_EHZZAW^f2 zjjX^3QUWp$SR-@A>sxm}-U=g7ldW-6vF4XLP?jetfkx0LO9vGF7iS*uRiT1)0@(Ef i5%a7Z{bb1&w!spW|BWcQ!r{IE00002BR0px_5j z7sn6_|Juohd`y8HE<67(-C~%P^w6{H=OMaa-_$KWXxaxLoeXS4B O?+l)FmPZ-%i(p{O3o@M&r!i z)OLHDMsHG8Ek8Uy?0GQ-gqmkxm*LDCu)&~d?VE;;M@>t306;Rnk;Z9t?%&F<0sOFb z1_1Q$wmk_&8si2)2>vPe{Iu@?uusbJ%S--avrXYa2agxJ-c@O|VD~jVl zU(GO(c`}m7i-TVir;{`Q#2(0fowY=O!M5AkT6zEqXaG ltyr_b@I|I72LQ5R@C_4ml?8FGE;#@I002ovPDHLkV1k%l!2bXM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/3.png new file mode 100644 index 0000000000000000000000000000000000000000..5bab3e8f801699904b3969ce6da2ce41e6781f0a GIT binary patch literal 404 zcmV;F0c-w=P)CRK_p zOGrnEN{y2G5!99hN>B#qIOTpmg3cC`>0*^w96Kjam6%<2x`yr?o*=T~J(pPG|Kw#siDxZtr$xcjxwEu^5!$Nv}LU^vh~>US{*7^8B>_$8`Swc2Hhk2e~Tt z@@l*x4Sc7I0s=6WMP)BSk6>Oci(E<0YXzE(K;U00000NkvXXu0mjf7v`$4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/decorative_1.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/decorative_1.properties new file mode 100644 index 00000000..220cb7e4 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_1/decorative_1.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=1 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/0.png new file mode 100644 index 0000000000000000000000000000000000000000..63be3703d1ac68f1eb07a6bf3ec5e2453a0f0fbe GIT binary patch literal 526 zcmV+p0`dKcP)($=xx6a4o5u9$f+fDKB_p8(W)oRs3IMV5~9NX>I z=JUDDX0w0ZImhF%?e}}j<#LutBrHTX91h|MUI4)1a0o!o=d+4ywVK6ZF$*1!M+F@< z8jb$f3Wb7lMx&7c#Ncwds4M6s<@0$fm&;Zx7A+EqSiN4iQmJIUUQhAY>!sXa1O&nX z0}@)TmT1$3jucKNlc2%%3?w2y5eLN}yFn9!A$#Y(SS)l8 zhrxmHJeTO&;?_y6ha>miO83Q3J;%`w;OMd{p|P)00JI(f#Ze-#ZJQ@B7kkEnph)T+Kz^b!)u_sz1B|2y5IKl|i6pEnOP`Aw z;RFtdM?M%y;DF$#*dhVCz@!e{X(Y)QRY_52Dv^kB3B56aNoK6;I``9ECaU90YjvY{ zqTDZl7*$KJ*ULGO=CVA`e{rFG()_W-IAeUe`UmjB>Hv3{B1r%uFFw2w6ED~w4kVKR x@%7oFGOX~!7)e@dy}vyD72XLs`Um)&{{T|)U1fOEmp%Xh002ovPDHLkV1oZSuC4$8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c39d2253f65ea43bdcb763f8a5ff78ba28884fe5 GIT binary patch literal 486 zcmV@P)8mD1u(R30^#T@JSzAP4Xubyx(t0(^T&FyOhgi>G%7x-|yvkJj!4&kjLX8*Xvcz=d+YbCHZ_l zx*w0n(r7d!z<@JGA3)H2KG!b`8|TmG(*Y`#iUb(Q00<7tU?p_BU0JPGayT5c90S-n7g`1iFauN^rqihg zTrL-xOeVSqVgSnk4O|8s`XX+(TMhI9rh#SbG_WpM8^bVE2pRxD2lnVf8|^}u0VVid zfV^I><#xNN4K3L3cDtMg0Qe8S-*2u9qtQs63Bt}|PislpE(B1o*Z&##Dw6@uS(d3I zUjUoUMgca7P6KKJU?o(mRn>s{hr^*;&1O?;wi0^1o-QY%KZ!QV_7*6EOyW4sO=4~i ztPB1qlf~(DQaHLqQ6y-_KY(_-{ReQ1Y2X7W1v>$Brq~62jl~S?H3GF6n9XL=>2%y6 c8GxDj0Wkqj%03a#7ytkO07*qoM6N<$f)>ThZvX%Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/3.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f6f15865218bfe3a926f8c7b3e9692e5702311 GIT binary patch literal 458 zcmV;*0X6=KP)R5(wilgX+=K@3Fmfue{aD9*EjI8UGmx)C>m8&`tjhvsnt zby0Bl7DZLkNp5b^ZTI`#uh*+T9*1_Txt!-BZlbq4FL=$+t)?bkc_T&3n9TSJsK z2?BKIKNEfx)k7lA3Wb7~N~KsKTDE|#vroV92jrtxlNiwfYXATM07*qoM6N<$g8J&z AWdHyG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_10/4.png new file mode 100644 index 0000000000000000000000000000000000000000..abd806633f169a8aef59dbef2c1470295d61c076 GIT binary patch literal 512 zcmV+b0{{JqP)J<-#Y8 ze1QYry9oJ{Nls46gm$}a_xs&$x0}UrY^_$y*6X$Hc022II+muXozG`G9*>sIX6^lc z`#VVzTdh_WNCf0^x%>ejX*?dgM)2|d@pyQ$Ktruob0nOFLcw~yo=qkb4}bw0HUdy( zd`Q5F>x*eEgyez->RDPb-(p zmdRv%m^x+kOdBxa*Z_XLUY>*YA%ac-08rE^6U=&vSuU4e@$>n3yapMRj3EX9&_Au{ zCYTKjsEm()2xfjrI55P37PKZd!(EUNMUm4cULapc4M@3j9R$|^0000u4^P)UKq&^W=TZu7<%AmSb`I=Su76`&z2L)nc@% zX1wM9SSxvL|90h#8E3g;0DK6r*uy6qQBS}Mr zXEhB^R5Uy}llrp?;<^FAj%T1Z?bnmV*Lv7^3Oif= zsK*O0b#LarifxRZ*4^p5dNltWxc1Up#QEic!&)2w*M?8(!Q5lrpM9v!{)4c~weKKZ z89a(OBE-((NQ)!{so=EvUN2U^B1uKII&|DosQ?8Cs4ZBsGD*OI?s$pUt>1{RkF>+w zDFRcrCvPH%Xt8%MxS za?T`!BRh+zN(rN+0PalP#Nwv9qX>MmCTqOoAM=cB#yE z%q#YQ3T;Rf$YCMT5}^MG#B)z#4-7&=%Fn^MBbh4T+`j)qj%V}(B-z>uAoZUYN182( zQ(`83xmy3}EK(AvAc@y=o;@99*-8+Ycb3#QN??<_dX7>>Qq0000GWMx7}MMgF- fIYdS|F)%emLN-M(O*e>@00000NkvXXu0mjf@nhK% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/2.png new file mode 100644 index 0000000000000000000000000000000000000000..d50a20c4ff0f898587f0772ac53d97ee3c714a02 GIT binary patch literal 593 zcmV-X0@Oy`Dw~HT7 zKjDorP#eWVT>CD5pB}K?ZZQ}Pz<8RbFwWwxdy7`9g)~bA&zRSZK9|b{z7?U-Xh?Nh zyWK7c3_=J(V68<_6cQ5!4A8+O{?9K#WE04QD2iaGrP2VL&u76C#~iDPT*Xl)SzD>0 zf-K8~;B{Qv7OcvqkzHla=W|KubUK(!CZJ-is;Z?0zUXw$$s@tMK(pBt5EV#b=?f+Z zMoGAOl}7Nx<}a4J1#Gh+y{}d)slwAJCOIbO6i>@%;AMc)hV~+>DHT{(?o6$Kb~>HP zidFB<`g#U6fhu?xzr}6m1FUygEEeeZ`xuQz*zfl!kmF&$d-nV^Y!8fvUalImn~ znG1{Q9T6qkiz*QXA;)Ys6CW?pdcEdcg^Wr?dbtXTN_kCW3RmBI0y&4`5^C8rUcUNc zQcJgwc+6%n4TB^}Fr7{XG#n0rX~3`S50a47cozH*hN>!Y@q6kA0000GWMx7}HbX>1 fGB7bQHbp{0IWjaiDu9E?00000NkvXXu0mjf`soIM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/3.png new file mode 100644 index 0000000000000000000000000000000000000000..683b530f2872c9162d6de836aa7616caa0a33480 GIT binary patch literal 568 zcmV-80>}M{P)x-Ef%CdYH^y}|$Vm_3e&7>-9NJ24y?q8qC z<}W!V)bHNq8Q}cH0ZM5anX`@olKnFuU)Y~seRN7I(vfLF8V3sGY6nEt6)Elon_7EQ zk~R@F75h2Xe!l-ihr>Zo(=?UlpfAw4qX&7OOY^cUqd1Ofzu(JqSF06SBoBu}2?Whv zuScWNNT?zaw)uQ61pos3VzH3(cDp4TPQZ@`U>G6nz9*1=zwH%bilPv0m&>If0RWUC zpa>@_gYs^-6VUN^EDRA3nNFvq<~MiFNdX>@X-B0EclyM$$1ZTMq`}H{Ok{J*iksMw zt=Ujw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/4.png new file mode 100644 index 0000000000000000000000000000000000000000..9b800f3502f380dbb47822260e1ff116e946223b GIT binary patch literal 645 zcmV;00($+4P)x3z#lZ|}WrujQ7-wi;PVSzHnYitG^lX4t8q#u&wYjlah~H=bvj zL-fOB&NB0!ciuB&F877f+-*yktxFV+Nl(5c>48|zHonXHzAoK*RvJ z70yaFOk|^ZBu7s^%HF~|*=n80)$)*nk0*~6z~!01uggSrUXz={i!vI_NG7Pr@$x6> ztbS2{(0(tT1qGZ~;*^Ok$6Uz;dQmUlliTG7Y6O!EgVXhI>N#ta?kkI7zoieQdP`!` z17%zDP4R+3rOxZnMZDKLzg2^ku|3H~iR6k^>#^=SbuAKevhrEBr#o8b^R=(??9m%l zpFPRkqX&D~xIG3-L$FiZCE&S4eeQSX->MeeasFcShn5A)3xHSKzx2WdV+3F?w|?p# zc21Z5#d8JM5?E|b9V-yuM$K-Iv3@#trVYg-u4L9GeccLJNK{0W#t;cmUI73WT>-ly ztGB`Nm*$tCUn7w3RGJZvcbF+YGUXW;c zyiV-JFu8G#at)=F?u!LsNp|B*37(zCbbqWd|BmxtG9TOp70000GWMx7}I50vm fF)=qYH!w3WML|M0NQzEB00000NkvXXu0mjf_ZBD2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/decorative_11.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/decorative_11.properties new file mode 100644 index 00000000..a94ab822 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_11/decorative_11.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=11 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/0.png new file mode 100644 index 0000000000000000000000000000000000000000..5794430f647c6732601fd9f3d06d37b31a80ed87 GIT binary patch literal 328 zcmV-O0k{5%P)l~AM-g&9+rZ@^iWNy6R`Fqt5-hNq-|RhW{XLx as*)e9giDNK$Tt=M00002BR0px|^* z7sn8b)4h{Cxfm3ASUz)@+f;n`Uw`I;kzU6}TNcNlRI#I$%R2;`mQ68vzGmqZv8~qx z|MFQH9y?a?K9s?zll5^9liJ3FCtN}^k2JL>OjlUxZPl||mQB6l;3S2-4*~|Atj&{4 zPfY_#9++exF~^|d?wO5DY?mcBY}$A%+WOO_;^}9~{`_IrXSVkKH~)vx+u1I0VWpF6 Yj%T=U%v`|`1#}{Vr>mdKI;Vst07Cm#5&!@I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/2.png new file mode 100644 index 0000000000000000000000000000000000000000..b44f314841bc48728f35807bec018ec76cbe236f GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px}8= z7sn8b-qy*Cd`AQXTxWLd{_^j5R?LEhW&5AKo^jMGWkuzE^DFYl1MhBMI%Q7B7CEN_ z%jGT>ozsoG{xoatJDc-n;%axl-?g5cs}ke&^3bC4Tb&sJO>G@Y;H5|5nBhEu;z2}H8j z@>Fm2{UhHKdtoid_2yEC8QTOom6P_BBqYw6`k%e~TgP6$YTmRBqLuO4va$}P;csVh h%>Hol-GjL&*ge+pf02BR0px{wY z7sn8b)4h|txmpc)T%GN$H)!$6SZFWekhLuOzq;$rCn@=)-sWzpqCVf~E<>YDI^6lU zk7=sj`)>Q(g3oj1!t~hdXU=>+!xAw0N`lSG+-SF1%T6AwzW?2Zhq?c;hU41TyY2`( zO^9<^thVx?(hlznAu6nHZ~2;)|14BP{nnL9n!6&@<(-`~P V4So|(L;*d-;OXk;vd$@?2>|IAYoP!D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/4.png new file mode 100644 index 0000000000000000000000000000000000000000..333d4a67291532fa1fd8adc8e7ef4fb2de01985a GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px_2i z7sn8b)4h|e`B)V>TsyNrh;wsWbAR7&6Thy~Kv>y`wY9BSB;eIvf0v%ZXLHguQ?EsZ zZ@H#Y!EdR#^yQrBY^h|O#_w@c-xw5aWOHv2xN$|rTE=NYjMF03iwS~ngj6=RB))lT zU~!0Z7E58XYl5dqh3~_=slJO2DqTteRU-dlHBwx1I!?$+d-ZG%u89ZJ6T-G@yGywoq8(g*k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/decorative_2.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/decorative_2.properties new file mode 100644 index 00000000..1e329869 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_2/decorative_2.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=2 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/0.png new file mode 100644 index 0000000000000000000000000000000000000000..936e150dfe455c996f797a5956f2cceec5198350 GIT binary patch literal 795 zcmV+$1LXXPP)9j zhz$~t!TazA@B$#QY^5#`5>yo;RB9Xlq;l<;xOVIr&&-`Wmqj84IIHhSXLUa8zcSRN z9p>eK`u};5m-cad%Z|0ye*4{&dK6)boOQRK}Dek}TadG7kMFG++*=tl7UTAh(3Z*=vP%vMWOr}@tH!T2Ss4YpnWG{+2 z9W6=H1z&w)ky2xDX*VnQp5f%6V0yX0n4Ax~g3DNPTmgAUIdpb>VqN9EUBMR*N`8Kx zVr)sArP#9M(w6Bw!*${FkKySn!OnJ-gLWOT>^D6| z^O8d6JnR(w^!tXwXqt_PGY#@w!`4>B;daiCzZn{lN0NfC41u!DW5aemq+Nqw2L{hq z)I!N}ozYVjM7IKaP0RVrvQ-Pvg`v}yIHH2F3at&1pVPlc*=$nsG$%JXTz`l>k`A+_ zLwnoD_Z+${muIh+gnosJlAIj)%oB*J4!H-N3S7k*{R_po;98@DV0O8n+YI@0Xz-*Y z%L_g_RQxqgafQGU4z0kFWbkTSkmV%@GC%;Vl9+p)ke3rf5crgi<-t+F=~xr`9#Pff zZp&r-&N5lJxUOWgNf>Alqr%eLYx3f};N3Fe!(D@~B$JiIbp%;nuv68XzRB6-hR=?n zRV}D_lDq2WgY(Ob&=2_f(<;B5fw6+OvlYG)>^Bvoxgzisk9s99-W04iF1QYT4RWY0 z*(Ro@1m8b#2|UR^ji*-)2(bpF4CjabVE7llR%wL%jJ0E!8!V}yKYK_~LSFZAOq?c0l*b;51Z@&j(8W9-J3SLyTrt_TnM#OLvI{|OxK2onj9o3E z)#pBS36o6|0}gU1CqQ8wKoZIiO*&3S$`OB(Ok#&yXS(#HWkSpFOK#*s(zuwfGcV~Y z1**?I<#e9%N)t+AU+(@!$WZ&yB*dP?C@Yo7Rvw#(QDdA2N-EU{1LBW7av*!_(0N(MJv9dvp zahC5xXkx}0ffA!^p)S$Yf({$p#ATc=E6n21m*U8vqyU3IzS>gyqNSO)7%7K0c~IP! z8=2*AV(7(_%ex?Tw^4htX}E)rjaTJQiuXZza7YPaiac_)WwIDoc?j6jCElIC(p;Ma iOJXb(B~qS~%l8ji>tlGB0e~C;0000m}Z5PlFbB8E*vkfZ~6MGP2{Balx2w&g00+fF}2jDVH88v zN~YzKX}MrgReboG<@wo?#j+xdG?zWdJ4%pcIlCK*rq>kNfY0uwEIL6FYm!(qh$Fsu zKjY`~kTgwLIY-y^9B9@AJENA9Ny(qHIUgN59{tkNbv=V9AkvEc0vl2~)JJK~=@AdVAiv*4olgp=OW zH7!aEIlgQerJB(&KuSRo_e`dqC{h&3iWgS~Yb9;lkq>ju|96mQBmSPvsTVbUx1wq+ zp=da{GI%`qj}odrB25M;9kMZwF-?mABtU0-lv0dGIpd*2DT(Pdc{(5zjwh#va$d8n zY7VzN<$N99SN};=VMvyzym=5{iJ6v5-rjb20I5imh>bkqox2$?=MkZlWciRgN)TT5 z5Cj1`nc?{<=t%PEyD5*4Ya*=xkbz`0kQ`4MRt}O#aI1f|DiBEFnB6WB2+n7o@i6ASJ^10p3gdc;Vt{oXVC|r; zYeFdq15K<0Hd0FKD)5}2L#WE4_Lq!cKv zC`^G53B9vrsVjj}nrEM~9G$~>oOpgG(+-B&`M`T`j`;40q|}0#q3c@i-j+N*R>+t< zl8%S>GW(}Bb-Uostw`$wLMh(8=lJ38f$i}?H`Lf7@c#XZ<0}cGLwxjQogcnh^6g&& zDI_}+&t(%hKKE3vAjQOV6E2#9!YbZ)4!(NiS@oW>(1^W9tNeJ@v#~K^I>}tNk`M(5 zSS(wnTLp*bJ(EiD+OFa2KLQ~JDp%r4h4}cJE^7rFRpx9NP`V&z7`$g>6GJK(xq`~V zypF`25kRRU^XrH-MzC4IdrfSfI#OM zxojoYTC@T?b~xSf+hM{OgL9UV6NDs53ARVD|6fPtO1jRY5eg|K7xMB`1HpiUn~V#2($qKynb8o`A-cQD2!q3t;lfyw$h`rp$fg>|Gja5-P%T!~f|?+Z@r z7NrEXtT4v#`+kqqiKf1$bS3k}1>&C}<(UV7XAB4c;3&YJ20l=H*)Q-U9VDSTP&I6caEb0E2TwpeROlZg2kE|(q7dOVQEl67ub z?;OqwZ0}Kfhz(WK+A+m7YNkVcX?)Jzh%cx=db1s=`4xi`F=k9hw{ zz`C%MRZDAn{1y&pg1>JXX4#NX3r^;qhpl71t9Y?LKwYdXc#D#r+uX6K1bbNuKq5Qt zHUUwnDC(A=_B1lW6Txai|GI!1Jcyvlp5_FCAJd z+ScGb>_>uS4nhQUre~2!{(JC9m03Oieg1@-Z}sCuQhd7GaUzf^M1l=7vKe$&N3Tze7tVZ nI$~FJm|jAV;JoD9?*je@fQo(*qP!i=00000NkvXXu0mjfX{>bx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/decorative_4.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/decorative_4.properties new file mode 100644 index 00000000..0a0a01d1 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_4/decorative_4.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=4 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/0.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ddaab3a6b7e0ec5a4aab8b051060b1496c999e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px_%% z7sn8b-nqfnTuzQWH8&z|cD1%HSh{v@1zUf@%8muC=^Hj)Iu#~h(|Nt?+@Y2|hTKUT z@299w_T2XJi@TV6zR}hZr8qj=X~nXx$_=2i{{HTw7o0% zb6J7o8*4+qvg;f6&8}Xv70xkyDOg#_>>w|k@Yi!S!vR5dql6>WHNtC$Y* z#b+=?H*<3>>RZJqIf?PjO16#fCJG*ml1f;_wslUn)D#gQ-50EO2BR0px`7= z7sn8b-l@Tcd<_abId@`v7dJ0nz54%uQMSpGKJS=jV8XaArayaQsx{ZKsyNrVl?G`$ zZoXfxx-vzyZTdup>t4P`r5h)`@a$qauREzNROyfMgH@O13Y5ane&~u+ne3a|+UL!G zA!OZ*a|eBPSY;}O2g$yi_rUYizc)I$ztaD0e0sv$qSLgr$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/2.png new file mode 100644 index 0000000000000000000000000000000000000000..f069495d8c3f205baeb51064ef3c530acbe8e4c8 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px|{+ z7sn8b-rh-uTuzQWF5=SK(Hl1iY}v9^_tFpVS#$a6E}`>gx4&I?Ju7Cp_xbasM_c(hj~;z@VYZS&^p~Pcb^|u91sl_y z-+wLr&oCk23iA<3k5dQkvpA?NtaeyjxxlUWTZ3EbgZ!@!Z!TNg_WbXsjO}~aC-z({ p7C7tlh3mvShKn+PJ~>M6Vf3rd;GA7H)f?zV22WQ%mvv4FO#p<9c@Y2r literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/3.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9f7b9e36eaf09c6947005c8556d1d53dd82f25 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px`D? z7sn6_|KtRr;2-@xm7yj7l7*WSXGrYsF`ALK;iTV>_#H`)>ILTR-ooIMuJcN9*7=4U zB}0j4LY%?Y9oz+$g3CB&PoHp9@`CC`-UI6VW(;@3B;;qGy5jL>s^Tt zA{3_7Of=k-n82JM*>Z>HXoK#qf=b3`Q7MHCr=DiCOcpeI26R1xr>mdKI;Vst0MN2r A8UO$Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/4.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1ae6c310b321c934900ef88f008ef71b38637c GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px{YQ z7sn6_|K4CjE+$7F9<#7*Nr{RXnc3?54ywoKH}&R!U<|W6u>Qx|shm$biZ{O&Ys}eX zJX7UJ-}HrZh!Tc?!MO=sGKgh^CdHrs@(v&eK5{1UNZ zvhx$KEak~!k0#IZ%wB4*`{m8tlTXA#q`S^=76=sj{GY-iP|m=^cd=lSLgvZvON?ya ZxbwTCmdl@BeGlj<22WQ%mvv4FO#s8hYfS(E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/decorative_5.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/decorative_5.properties new file mode 100644 index 00000000..d929973a --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_5/decorative_5.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=5 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/0.png new file mode 100644 index 0000000000000000000000000000000000000000..7881604a9501c1182d6d30b028c9f65f8bd5da0d GIT binary patch literal 509 zcmV|9LKoYt(F`TyW_I@#y*vD@t?eZ5{K_>srsA^m>8ZM9n2@p!b$+xr1<>;jNIsueAe+sa$0)$>Kn{Yf5ik~ug&Y(#n@s^U8VzZrTrNvjtJS2L02l#) z$z&o&6h%rRdB5K)5ztnvr95Ijjz(~RN~L0(%|=Be(Y;oyS+Q7@uGi~|1L%7z6be58 zr{nX|eYe}G0AUx502tuDn}h*pBnW+9AOOBxG`@d8POKf=@At&uwiG}adMq=S%O%TW zJiwmMr*x@QvVd3B>2xH%L;yG&-FR_mc0kN`1^_w1`Fu`h_dD}s=?qmLfu+L07YJL8 zKnDyz4b-7a(*G5pO|g&J@ArQIbaMv&%CJfHB4>ikW;1DkGy)9#!{7v&BrZeZd_K3) zXrvD|9*-s7NC3EJS-CYZ}_J|yAS;Zu~uRmjVM7t00000NkvXXu0mjf@NnW) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/1.png new file mode 100644 index 0000000000000000000000000000000000000000..065ebc26a2a3e898cbbe7bfa6369ff38c49c0225 GIT binary patch literal 486 zcmV@P)Q2OMy~2@xl*ii*0>jpFzA;}leQ zE}BkysOst@^?JSNbUIP3R^_|huB_Q?#_@QJ!{HFi?|_Vj;iZ?;}knlW4cw z@%?_|e!s`#@rd1SCxF>(_5(N^4rP@}MP%i2ITB42oX_XDTrNT$kH>28otoF{B`cLm z^2D*kSRiuoh{z(wRNL(~7jv%H>$#3eQ=`#P5Ur!pC>sDC7egkVTBc(X?vg-oFc?S* zXY`R|RM=ql;w;575^OYii6j7k-OI!G`+emNh_SciB9hh%`}6r!3VBRtSwOUO@ z@Aq4t9guSkF)gvxYUPbPc)ec5jCM<4sjh*5SHY*EDDrqTZ#J8lPNzR#*w4$?rjZyV z+JQC0@PCQK%t#Ht6N1y}q#CA^g!z1)H%t&@rt-6Sk$~fUra1$!aV{{KjZt|@%*BvU c4*(wf107XRha4u1J^%m!07*qoM6N<$f@WIVzW@LL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/2.png new file mode 100644 index 0000000000000000000000000000000000000000..3d440e8827bb50139c3b1de4c2cdbde579244e13 GIT binary patch literal 507 zcmVA zBi}D6dI)J|GGCH^ra_V<7RRxbN+p|2Cf4b6Wc7O8w%e_3HXEBxr*=A>>$VI^Z$j>-8$j z<#P6XKGhB10V4n)@D{t>t`&<#^F7uuzN^)$)`<&+!gmCMTCHYb7-j~5cJWxV*_3wx z#ROmk0OfL7vy#wmx0OuGBvKiH$zzQX_|^yxa1luWKy?=n-|O|X572d^YXQ6+pO@;F z%S8t;T4n@bz<+fUfNNxv_E~fQNj?H=zd+uFG}LJ#rjCPLQT)7LbSr$Kz3z{kqskR5~EXU!q2UMgV}r z%jMFB!{Of(_Uq+obDe+}i^UhnW4(MQ zDYu=``y0ZuRWhn$;aa%U?~0f$wtetC7FxG;xCSFL#b4fk+wUX&JPr5x7(7STCGYFOQ*1-hvV@mW2@D& zMx&u~yf&*zm4GuQK% zAeny>CX_w3i~10m$$Gukg3w5>|B9dXZa8S0000#`_{Y_r+edc8I<$Kz3+*!%sKUn~|D_WQj} zCKIbxt9Ck_L^hw#MbPi}{|MXdwhEumr*Nau$U-KQF>E{@8)N{w-L4A!4Dt1Pm7!uf zom#C{vs5Z&fxv7wQ^F-S8V$>4v-WsAlp}`ux8qP6N~Mw&i$%@a>2$sZ0g~}prBaax zi#ob<4#*?eYPB>g-^e5BlIhHX>FT3koCDn`LaxsW0o{Fh_-3=Iyc1%(-Ohr8NcxO) zzg#YgVURNdIA0zZEfE08IF6;nlMwiF@x+`EqWk@>??55<4T!s?097oP@$&h+is{UF z;AliKk1KGe<#O55>GXHY5EKdpfo`{(JUbxg7-Cu?#T3Bq!NcL8&dly3uvEu@_h%mn za`0t$51#Au=&(1o|nD8EbmRfP&(Ck?jSt(5UYy1Kp6yRbpT;SMy8o0gvlh8{CJ91ONa407*qoM6N<$ Ef&-82KL7v# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/decorative_6.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/decorative_6.properties new file mode 100644 index 00000000..9f500d16 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_6/decorative_6.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=6 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/0.png new file mode 100644 index 0000000000000000000000000000000000000000..67f7e3e06f51a4e818538a0e01a891bd895a4269 GIT binary patch literal 489 zcmVO)cuW&c@@hB}rmg zmbo7ehZe_ih*8LQzu)&5-)-Ce0f0tux7%4&Rqio>m&>K+X0w@pU$0lYTrRfX?|ni5 zqv!MKNHme4=yW>SLmgl+0(BXJI zdNbc#4D|@{;Cwh7LV;+A0zh0qBbQK%m`(vPIFx1SMiULw>C_vb$C;dB)C3BMGa8L- zFc^41o~dZ&ESpRw*6a0rBVh{?k$rzYA0JJ-CPtn!9zzQ}0Ib+W1VG&24qvU6jYtPz;6dKUASgwYm~qh=LP}pokOJ2~h-H_+KMm z-Dlc&wUt$*whAf zlqRs-@)*kHHY`38KC$73&G^+u!NKJEmxxR`AM9SML* z34$RAG~!?sGDP?t0&8|U9h=Q&E)-FKkA!NqTEyie2ODUiUawo0Wmc=ze3~?Vim@fF zR?BIvR4SfF+-YRJzRc0UBn8!(s6*)Jz+a({8ta5Lg9FS}}es_~Pe_ z4W#vY?MxLAnDYOHF-1)TEB;rw9n1vyrHD;vCLsaA5AV|Wq#XiX;8vVBn@xWM@Qh&d gKOp2#gyw+A7dTg7BmO5_5dZ)H07*qoM6N<$f@!nc^#A|> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/2.png new file mode 100644 index 0000000000000000000000000000000000000000..2dde937e1b00bb074b8c52d81be37551793568ae GIT binary patch literal 488 zcmVP)U}Q4odCKSUv)w=P8aiWDiF5R#AL!han->uv3q zi)r?my=To@Gjp=*^%}KWEl#IXaDKnv$#%P46bc1-?vBUfkFQiJkv*T!Xti1~pU-2p zTFI~1YbABNU4i#{Jr$TtCc0lN7IDAd{{TQMm&-o@*zIWxN2vB%>fX(aPa zVWekhtJmwXTrSfC%diB1C_o}bcuNx{fo5=+&1N!^Na%DrNFPzSoyC zl3{w6Zp4juB_>_Qbpgk^lo{>zT8j>;U_Kai&KY eZ%D#Z80H_j+F?wx?kBzg0000cce5?c);=uSo5fnj3R2&$D5ncFS zbNM2tjCT>zo+fE>P8%MNhgDT&MNt^*&*u{j{C2y!=j?vJ|9C7UNn*p{(Aw>`^?E(` zV69dwVx3OM_swS0G4|bV*L_&6R<_-4-42ICTtA;r%d*T9rqijtUN5^|uXaA4ZMWO` zn%qDzfIJ7M)5(3BrhY30*mJ&Kuifk7*g>A>-U0jNa_I@P+06R=zGLukJRX0N=_XK- zgZ+LV12l$4pwQ)V@kA~mR)qp>P9_uEY&LErkpM;jMCn`@F{~NQRTvBg&MLRbgOki! zHX4nr(P+3LQ3cvYPxOAj-%($*1}n?b*LVyr@NkC2fmTS+Y$8;$qDWmOFbXdgi*E2LSdFx_Y%wym%FArAtfhuS#&H0(U0d&S#^B*u` d^gAIC`vVbVVLHV@V;leg002ovPDHLkV1f&B)Ykw2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/4.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef3eb5202d7f81576f8f33f067f967e06b32ab7 GIT binary patch literal 498 zcmVn$4zNuUC6K9`^ly3p<@oR;g6nbC&0M;pw9$v|26ySglsJ z-EQ6Q_j|isE;bkp96U)9zhE|-`T2Ui_MUpZZb8X10QP)7Z9E=ZtyXiO_xo+<^VyEa zqXQ7r8-ys&!QpVQ+wEq<;n1qpssoVU?RGYw&%I6;7Ywp2a|V1*r&Di$dK|}|d%a#h zTDciE0YnZqn@v%mF*E`|ERRMmp;kZvn*Dy?7K?=&O*D|BfJNzCIckU*%~fc(+tz3_ z{5E;=G!x6Z-LA_TMUmIJ3ebigvVA@ukEJ!a`~B`Q9%C1Hc80_ODl}*|EmX3iNLeLv z08b{99|Pv#kdc4$fLVFIXrzR5|9LKrFo~* o@i&0Z7%~3?Mh$c0`ITAXA85Z`<+ZeiQUCw|07*qoM6N<$f)lFQ5&!@I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/decorative_7.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/decorative_7.properties new file mode 100644 index 00000000..80da1a4b --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_7/decorative_7.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_block +metadata=7 +method=compact +faces=all +tiles=0-4 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_8/0.png new file mode 100644 index 0000000000000000000000000000000000000000..3135557310c1a66cfc416dc629841f9df8405b10 GIT binary patch literal 440 zcmV;p0Z0CcP)kV7*vbpF~7k_Ew zNjd$Zd_&0l=5mspBzZoc_IkZs^nSnJ{*FHRqwR9JSi)nw-CEnWF1+Kvu4}8R$~K#g z-EKGA@Ard$u~=Agzu&Da%de!<=`;Z0+wFFCI2^2L8W;T7=kvKGv_ujH0UVFVK?|7b z0;MZ-Q4~D@feMa+5ri=iY-qaj5q>#{TnG%U4&ed;WEg=e=kwV`bFWq_uYjfqZ4(C= zd;sv(!S#CewWvDI(P(7j@z}bqbMi=v<2eV9$HNV@MFkPGUaxI3nYhp;%xgStEz7cg zjhZ#iuVbM)0OA0jNYC^9|3mr>q^nqjZm>_M)4w~2$!e1%*2V1nAury^Y&Pow;_h{} z+P5xI94HQP0C6CvW+e$b)u^n4if5muY0m)_buj9N>iVl?1U}G!I*AzAIah^VE|)I+ i*)y6yKE;uUu*MJTGjq@sc#azY0000^nA;^K17Jj1^V&@g-pkJZ!aEIVj@X?RI}H{GWjU!EiWq1)t9+Dr6P_5^sUT z*=%M-Q8A_%N{eC}A9w0x z@T*w9Kw_uUaVHXECiz5`59#g!>tRhKFf=)luclU4U63X9sC{D;6wt!+`HYfN+j9>x zhZv;>CE5Z5Q)}3mQ|$yXii8J1jC|IMg7kkNGIG8>E>-3HESZb|00000WbcEP)pHDZBNAW1fA$bRvC>( zBgaqE)He|V%+sE5hAG5Lf>HPZUc226npCo2y!KGK2mGil z6b&QN6q=?9tuZA|+Hn&h&=@%hpvh$7_?=G2352Zzh@3B^Fl4gFMK?b~|4a!Fs*+zQf^Qo6W{n ztCjO1&vP3L1~!>YY&;&DaxfeYZ8RE1^!xqD(bwzsEM!^c1tJ4#m`ZSXX=D_M=xV$NQP&BW21CqdGn>!nwpc9O jC>RHhNDfCId1|gdGWTQ$`TKLUrA$D4*oM7WG zjXZgoWqGj}cGo0xlVl8=&BjirlSB8*GFNWlH zyV+{Ba^l@?7xOv8VzDrgl9Xi`71U}qdp@7G-|y{sJUWO|17T1hKZxLPIJkmVtK}rL zK(f@W*X#H}C!hduS0V~%0g}h#Vaw&xK@sP6yZvk7{|p2OdcB@2_ zr&F8FW)9x{e&1Wr7S89h4TnR|o6qMqnM`aj7NpigP)`A{%IeE)~!jY$HMc87q~FGTh*f62>`VJ>L+*yCK*=h!E(9OgIq4Blt9I8q%fvZDeZYClaWTF zp?<{UaXnLj_xr7X;q`hcGK_*jMP4g&s?tXCX+JG@e5T;r-fp+5*Cg=r7)gdDpY7kj zfQcm7+s9bUqDufEmCBZnsg475av4N6f8T#B7E^D+;jq-}^{;>P2iucnX#-|z7ytkO M07*qoM6N<$f-%MC!TbHCqdyWLV* zmeZPL8AsDJ(;oNs`~7r(wOWz!e!uxpiZy`Fe|?MNcvPU7C6I$j*tLqw^iGm;? z1AS_S!{NZi!Y1nGDgdxpEXcrsG&_0*%kg-mG)*T~}wSfSmRwKap#?OeK2}zP9 z3?ThV5rDDocDpY_S(Y^_5X1bEk2Aay0OsCc1)I%=*6TIf5{QoD@bj3a$*XPKeCBx` gg<&||TP~Lze{v6TY@*kelmGw#07*qoM6N<$g2;HwlmGw# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/decorative_9/2.png new file mode 100644 index 0000000000000000000000000000000000000000..79fc1a1d2e4a6d3493c8e04c714ab622d4053111 GIT binary patch literal 480 zcmV<60U!Q}P) zICnZT%p%+-H}~Y^B#qKEwfTH*+wIo6-L74)S9?4jmgl*j_xs(R&!^pPH(RY%?vpzn zkF8#>Tl9Lp?0i0ZkU*!?@ozw})9Dnxr_-qyARmBIsbtan{SFKW6ah%W@UecsZ@dIqAPxZeQI=(aCJf>@ z_R7oU(t8F#J^(N#f3w+qGY~}ppeg^q761Uy0T_|!LWv}ar#N(v$D<3Zf(Yp%5@1x& zZMWM&#A0Pc(-{Bk0RXBf1`>`wvHgB;>-E|OgMkAGjDisXk`{}F_XGgF|L$Lp)H1AG z0|0oeDFC3ciK?cA2COvxY&QG3iHE}>Fep}qo!D@v#Uthb{7g8L$;1Pr(a8JNBY-*C z5AA_O4h*y~h^Q%uK6gwB02qid)@(Mvrl2Yy)@n6tG#YM|O2yA=wQ8+a%Qey_O0y3X We`&e3(h`RN0000)Nt%@jS1o1O#I5kxB zdcxvT;oYv>?tDJWe!rL9ZYQVHNsh;(>W{}mCHCv}lH2X3IzTtL>2xZa%|=?SmY|#L z_xp0MI-M4Gzu%QK7z~0SWcsUrd~mI*TrMZ>a5(5{DwT?^ zi9Mr(d_J!$1H2&%g@X28tyc9O-2463`+h#3!R`CFUaw*t|3AP7-?0u#>vTHWg7s@H zESF1_?RGmDunif${tI?6Har6a-q;cWY!1dHnd6@6i91Klgs5Ihr>bU^SR=l&!@hP$76A9 zn$4#4`+Z5L(^4*%6*wFY)wbKM-wy@@xn8dxAB)Ar!Nvgq7a>8n+g0O?)$4UtVt4|& zPN$o9~IFghQ%|-@N5PFgsD_2Dq<)%ES~LY?`E_4xnC}qQYw`q z1;|D&5lv2BR0px|Op z7sn8b(@TSIb2b?8oSFaQzUqjjFeALRMn7yHMfAZNs}T|h3WqW59*lXjD$ mDXUF4OqSc}bM<~Jhu-o4zuF+%W^JHz89ZJ6T-G@yGywpAeOq1t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/1.png new file mode 100644 index 0000000000000000000000000000000000000000..356de83cf8f14fe1bb9fdd25a8e2a14547d623bc GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkS+~ zi(`nz>0|*x!Jqz|X$*qhTTK67-(399JUQVu@GD8+7mr6&DmVe0I#* z+$fR5;A6b&rGl@)VS^mDRpzad4QnJ<929TaDDkYjPcnf`!E$oS0fu5NSGEO~Q%jg9 zIM*fcEV#if!mf1mqDP?<)6&eYNk$s_2Y3{2BR0pkR=v zi(`mIZ}JC4!H$lOKi?CQe(m>&{%qfI)}fDa84u6@&5b+e&7EAr+;BiVjpKxBiX?+^ zi;n(+=0Ik*HH;$aDyJqH`50@MPntS2;ilvg$s=qGFJBpdQFLb00GiI=>FVdQ&MBb@ E02(kdrvLx| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/11.png new file mode 100644 index 0000000000000000000000000000000000000000..ee804b0fee7e65a1e4798c75e429e53f4cb0d638 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSz{ zi(`mIZ}NwQ0tP)&23ZFT3>{otp4f9R-`p4A!_jc{;1|OR1H-@OsR<5dEejYGwkp^v z?B(g+V*3C3=3*u3Ch-F%hrcxLWk_o9QNG47A!>r0fHcFe8zvIcLYtg`7BG0a`njxg HN@xNA0?IOe literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/12.png new file mode 100644 index 0000000000000000000000000000000000000000..f1cdf6a1d09ad5df081847d42d8657f3dc4a9737 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px_cu z7sn8b(`zRk2BR0pkSY; zi(`nz>0|*x!Jqz|X$*qhTTK67-(399JUQVu@GD8+7mr6&DmVe0I#* z+$fR5;A6b&rGl@)VS^mDRpzad4QnJ<929TaDDkYjPcnf`!BSYoQ7ECoa;g&Zg*jfk z7*8nL8?XhuVeMiToN`FRsNqpb!?ar-<_vR|HO|Ok-jpcGoW$YDz|fd&r@BqA=_=4= N44$rjF6*2UngFIcNMry2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/14.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8c5372b58854209a451b2355e989706b96c34d GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSn@ zi(`m||J$C8yax<8Sn4^<96ir6q)d7fKY32d@&%>hk}q}kf82X!P1pt9t3RCzzISz; zI-}2Ae(%QFp61of$s#2a(jwW@cRad$^`+B&=5V>HmdKI;Vst0F=@^*Z=?k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/15.png new file mode 100644 index 0000000000000000000000000000000000000000..17727f6093e0763e4478cd001fcbf804ce45d59e GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSw` zi(`mIZ?b@(;7@2BR0px`o3 z7sn8b-nEkr`5F{>T&2YxpHuBozBu!uqyHntJ>BB2c2Pkk0SDCXH!S4m+P`FLnf65K zJtwm3IM>XdQdE84vWIj2`jb2ds&aOjzU54)W&9B#(KMN*!BCC+z=VjVt!C^KSYkU% z8=9&;7DgV)}Q0=k&N)78&qol`;+06wx>lK=n! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/17.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe8cd81c08e09d6582489d3d639a34ca89569a4 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px^>e z7sn8b(`$nr`5F{>vUfQ)|1#z9n^sZ^=TPt$XGlJ+;N~)5F%1sjCcMCnhOm>2&i63!M*I jRT6hX=FoASEsq!y&F$VVOxP6$bSs0WtDnm{r-UW|h=5+I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/18.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b8e97239e442a80de80a7b8eefd352d97d1092 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px|Ur z7sn8b({Cp`ay2LjxZ39}+B>~t+NA91x?fae7ws;&cv4?V$jNng#)Ia=XX+LHG+v9k zwr+Z)=EK|ZBIP@F_d4HVKg+EUd?l8l{N+ONC85tAtk)Ld*qabMGoO)5rS{>|~Q>g#| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/19.png new file mode 100644 index 0000000000000000000000000000000000000000..0b5194df5426a06fff9d25b2620840e3c7bbdf96 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkS@1 zi(`mIZ?b@(;LrH;=YHOA?tE$A@z$Baz`)>-IqRbw1-6yx44LQJxP+1!HYp}BJD4eF zep5ZhFd<4Jt-)}?tWL87H*QEIF&Ij1kbLmqfx}Ejhb|lD34i^!F)G|X$;Z4(!eOHL xgjmP98A~h_1LsT;&&+NrR=zp2^U@n0hTHa5zNg!h#efcB@O1TaS?83{1OWQBL_Poj literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/2.png new file mode 100644 index 0000000000000000000000000000000000000000..033e293088adcd262e6f9803de60d07e4de5cdb6 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkT76 zi(`m||J%tMc^eFPSn4_Qg&f~9o>6%dFYV{0aYwPd!$bUN;X7^jv}v*>UOVpx^cY^c zYpgU+%A(jk|Ek4~TQ|}iSTkEg3zlii$xhX}V)sC6)@%MBZVuHGZY{p^&&TwquK3Od W+ZFGap6&)($KdJe=d#Wzp$PzaraayN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/20.png new file mode 100644 index 0000000000000000000000000000000000000000..b69c3759511eaea40c7def9829d0b5600002c76d GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkTJA zi(`nz>EsWJf*l)FLx#56#8pjFM6iEi- z79ITs&4J8q?Ti~(7`+u#)KvnCSX8}LoISixEr?+~CF0R0Fm-0auLE%mh7QXFvl%>e dJ@`9#8BThb{`kFZ-x{E`44$rjF6*2UngDH}J7NF; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/21.png new file mode 100644 index 0000000000000000000000000000000000000000..7db5038273719fb2f59f2b32fcdbe3a140f88b85 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSV- zi(`nz>0|*x!JqNx&;7jL-1*YJk%fra8iwbY=}!zRr|$`-~G glNnB=O-K`vW~fdw&9#}E4ss5Ir>mdKI;Vst001>UWdHyG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/22.png new file mode 100644 index 0000000000000000000000000000000000000000..2421176403d868621dd2f831e52124aa111d6489 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSn@ zi(`nz>0|*x!JqNx&;7jL-1*YJ2BR0prEg( zi(`mIZ?b@(;LrH;=YHOA?tE$A@zz->fg$r;TEdTft|KXu44Wi9H|w8dYcNsDRJ+R% yWZENTV8gq>LNRd86!FaLrefurGdnN6;bD;EHSV1*{p=;sU2BR0pkRTg zi(`nz>7|o5@*Ys&Vae~f&$2YVA!pLx*Z$3c3pyuGd{M)0V>anegTBFo-|2=~@*7l? zHF@7p((ITkS|h2lb8DFn2b<@+z4F{mi4Dh_5~lGOP1;+RHes*poP8+)VpHY^@NN9l k`_xTqdr{>Kt;c_uI&Robko#0^1GJmL)78&qol`;+0LLOk1ONa4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/25.png new file mode 100644 index 0000000000000000000000000000000000000000..21ae011383728810995dd47679f8fd9fc4f62665 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkR=v zi(`nz>0|*x!JqTb9{6xyq(iddM!U-a2BU_UvjxlvGjf=FdV4jE4;(z$XvExLlFAk! z#P`8K;kxJ*!-gdN0GSREcjcp;osX9I6s9dwv1VpCHr?z(vnzWo&~ye*S3j3^P62BR0prDwi ti(`mIZ}NwQ0tP)&23ZGIFdjb2z_7yHK;XJjzXDJNgQu&X%Q~loCIAe`7@7b8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/27.png new file mode 100644 index 0000000000000000000000000000000000000000..b9315aab04b361a45fb7c25d05f32476ca2e905e GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSD% zi(`nz>EsWJf(8Z#f6Q4QNOh$(; z8|Ddr{ed#KPx3LZl5m)sp<*qtQmj`*U8U<#!=f`S^X4*URhV7SpY`o3&;|xiS3j3^ HP62BR0pkSS+ zi(`nz>0|*x!JqTb9{6xyq(iddMmqz;%I^tDzxI1Xf41*9%b?V8mB*N2iCjvit+o0Q z28nNqd_NBHFz#f@Y1p{Y(39-|Ph<7Lg9jT$m;)G?LzGk5CJ6GaU~4$k5ECA7oS|#4 yL!m;DOs|TX%AG`qZH!A&)Yh;~m^AkyBg0g7iw(19>fZ*sgu&C*&t;ucLK6UAxI<0= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/29.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2eb220c0df6a9ecf62bc72fa66db2921785154 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkRfk zi(`m||JzB1d<_abuF_(U&#Cq(Uz~Z7(f^U+o^J8A`&fM5sP%Y#^5EWcKIr4UZ0=2+ zFKQfxoi0c$UN+^O+zQLb>%Lg*FxvQ(fjfwE^MjP|iY-xV65cb02R;79Y$yFeV#_K9 tmtz%$?`j<;_7`5*`}#H056PLoSoXJDJouuyTOH^I22WQ%mvv4FO#puxOBetE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/3.png new file mode 100644 index 0000000000000000000000000000000000000000..2342d36ed7262d471ca6cc20bce17520b6a3856f GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkRlm zi(`mIZ?b@(;7@2BR0pkT45 zi(`nz>0|*x!JqTb9{6xyq(iddM!U-a1|tT~&H9mS2MlhqNk~fvr!_P;GpDjKWS-)2 z;Aa1Hh~cCta{|NBxCIshntg6U!a^Rs`e#l*QAv%D`1dg(>6d>|TGPt-C2N1~pEp-H mi9z$G2BR0pkTG9 zi(`nz>0|*x!Jqz|X(!SWe&n+qQRv&a@nbzZd;5PoJG%lqj^-N*h7)9Z_%AVEI-S6! zw190v@&vURi4tbaUmd<0HHiFNl&sU1xPtLz>W75_JyHfXJO?HPco-jO?&O@KGLc8| vY=i5qS^r<(w4BJRc$Zs&*+Eb7I0J+BB8vwJ*|yh!&S3C#^>bP0l+XkKY3V~Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/32.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2ee6952c0681d4f0feb87d6900a14eb07a0222 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0prDPX zi(`mIZ}NwQ0tP)&23ZGAm>v*sadmO|*K82U)?hNr$l%ZSge0ZA3^Sg&-kSCQ^-ar@ h#tbRO9>yKK4APxOB8oZ}jDhAbc)I$ztaD0e0sxmWDPaHr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/33.png new file mode 100644 index 0000000000000000000000000000000000000000..32dd1a5a668057cacc741bd46d7afa675a47158e GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0prE~{ zi(`nz>EsU!1q^zm46+Uw7&^GPJhA6szPT^JXBMNJkI#Q!Nr?%(if0>KZ_WDu`ljVX kUd6lI3d|0AipLok+NTFVdQ&MBb@0Gv`N00000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/34.png new file mode 100644 index 0000000000000000000000000000000000000000..a07e85e3d91770f724d27a4fef8b1d7de8b2d7ff GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkS=0 zi(`nz>0|*x!JqNx&;7jL-1*YJAxw1gk|Tt`wQ88%6JZq`4^)?lKPsdkq^ zp6lQWM&)Y^1x?MW4x4xwGFepX1I!d|GR%19dTZ8$7@uj33bP$&Ip#2|`DEN1+JApF P&>{v;S3j3^P62BR0pkRWh zi(`nz>EsWJf*l)FLx#56#8pjFM6iEi- z79ITs&4J8q?Ti~(7`+u#q#3;W7Nm5haAdMI6p3mCD@Z!+5_e#0h;iy;WC&w5{_;*R R{5H@o22WQ%mvv4FO#s52BR0px{(b z7sn8b(@Q4@ay2OMw0#%bTP=Jtoj*YRrGV_+SvkpF7mhXAtNht_C&WW@tMmfd_y?zd zer7o9$`*NGy68Mrr3VqLvtBmM*&KbqNBm0EU8b}KhwTkB7qW|;w27}uh-Lj>`@%6o zKu__`kq?#{B|4r(iDFB6?|0jssxaK*;5H XaV|`%r*3=$I*`HB)z4*}Q$iB}UTsw& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/37.png new file mode 100644 index 0000000000000000000000000000000000000000..d26ad9bd298b432ec159cba22fd108471eecc58c GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSS+ zi(`nz>9vzL@*XwdaETXRnl3!$3QvRjNdd{ZA#NJK&YEv5Y2}``gIQqW4h23Ag+J%p zJ9Na=6S5>1tg>yG`IX__J?4_46FgzNf3RKHc7bo>UUu~m?!$MF^JhQSRhV%+L~*Ic z+r39^90WV7Zwm*hFIsgqZbsxk|Bh@Xt11Q&M%#P_8U9&7moRv``njxgN@xNA!fQph literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/38.png new file mode 100644 index 0000000000000000000000000000000000000000..1fef63e2ea5181a7c4e8c7fbbd31959bad527706 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkTPC zi(`mIZ}NwQ0tP)&23ZFT3>i57F=xh?=qM?Dl9x;lX1;VfflH}DB9=KsSR#2c^Gn9p zXW4|(0+@Sxd;eQoSR62I{Gq^O%%j5oxcN)N7o!B@xgtCaqD^LZ)UUEU16sl0>FVdQ I&MBb@0Bt-l3jhEB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/39.png new file mode 100644 index 0000000000000000000000000000000000000000..ab6da3f14d59aa743885acf3c9c829242cc5a1f3 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkS+~ zi(`nz>EsWJf(8Z#f6Q4QNOh$(; z8|Ddr{ed#KPx3LZl5m)sp<*pyc!^OXlIdv8MZ;ae7muDz@RXdgOmcyY&a4N1uE)|& z%;Y@MFq5rFOr!OnN#hTL<%gW)mhGH3S2&5mY_{h?hQ0S~^F6BMSb+{=@O1TaS?83{ F1OPf|NGSjS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/4.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea23d61e2f6e2ba455c0124216fdd6418c8d9db GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px`1; z7sn8b-lLNZ`5F{>T&2YxpHuBozBuzDqyHntJ>BAK|ICtdVV~$YIe*oc{bE5UqE4GC z?b){P@z%^rm89n~?E)!+hAk5R_k4eDUNl{UafRjb!%H?qKb>K(p2BR0pkS4! zi(`mI@7u|STnz?1uJ*A-&8Pgp8@)uX)&-}3M9 v$QFJwXX}(Cf%iVsKd!xhazbl*{}Z-luPs8GKOEZ&bOnQ_tDnm{r-UW|^}9@( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/41.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/41.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fb7eeab05c40691a020f0c466346f21d6cf0eb GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSG& zi(`nz>EsWJf(8Z#f6Q4QNOh$(; z8|Ddr{ed#KPx3LZl5m)sp<*pyxJdAs$budEB9o_0u$eLA!OK}9%nuSbctn4$x3yN^ pq_`wiO@Pse;fYWZkHh(M44&64t{jurvIn|=!PC{xWt~$(69CvxKw2BR0pkTeH zi(`nz>EsWJf*l)FLx#56#8pjFM6iEi- z79ITs&4J8q?Tii|bP0l+XkKS;9sD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/43.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd6365736a1469eb10eb1cd0b6a1bdfac998a5b GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkR%s zi(`nz>0|*x!JqNx&;7jL-1*YJdWo0P=43 zEV(&dg4rP}aR%eDhAg#P49UsK9gKEMm^U!;@$pTOWLR?2nBnIC6lsP{bKe*&=wcM9 vY<%RfB+4Xc&IAoE<|$`fR^@$p!^6N|YZ1IM?dl?+I~Y7&{an^LB{Ts5o6kcq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/44.png new file mode 100644 index 0000000000000000000000000000000000000000..941240a48f62c2ba76ccaffef2a611c83c2a3345 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0prE6t zi(`mIZ}JC4!H$lOKi?CQe(m>&{%qfI)}fDa84u6@&5b+e&7EAr+;BiVjpKxBiX?+^ li;n(+=0IjQUI{gz@ny>mKRo7r+YdC1!PC{xWt~$(69B^4EA#*W literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/45.png new file mode 100644 index 0000000000000000000000000000000000000000..8002d52775543b8130c9cd757a9bc37be0ecfdd3 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0prDfg$r;TEdTft|KXu44Wi9H|w8dYcNsDRJ+R% iWZENTkafVol!3u=y2BR0pkSV- zi(`nz>0|*x!JqNx&;7jL-1*YJ2BR0px_cu z7sn8b(`zRi@--;%xJrvZKBwBFd~xPQM*l~Od%DHf)+}-9>|~nshh^3`$A`{dn(GAD zy4YAIF5H@y%oCmcSn80B;hBlMx5~bEu4i%+U%=qes?->(D!}is(K{;0_CQ{trRmKk z#kZl1OH8#i_w99h`R=IhAEp&q3x5f*G90gR$eNNPf5!K4azQAc!aYVi)|%SJJ$yIf mKh<(GJWz>e2-?GTfbs4D2c=^y|EhrQW$<+Mb6Mw<&;$T|Csn%u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/6.png new file mode 100644 index 0000000000000000000000000000000000000000..faf939461298604434f7c3e8b7771f3217ac4064 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSk? zi(`nz>0|*x!JqTb9{6xyq(iddMmqz;%I^tDzxI1Xf41*9%b?V8mB*N2iCjvit+o0Q z28nNqd_NBHFz#f@Y1p{Y(39-|Ph<7Lg9jT$m;)G?LzGk5CJ6GaU~4$k5ECA7oS|#4 zL!m;DOs|N#O4no~%bA>0q#w@gob!g~5>FB{14pFQ7Nb2rpMj2H@O1TaS?83{1OO%3 BL<#@^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/7.png new file mode 100644 index 0000000000000000000000000000000000000000..ec9855ce3f885619f5f5e060d859ee748e1a14bc GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkSY; zi(`m||JzB1T!#$=Sj0^a?zKw{;#wXy)2Xsk{^9;7i>LQ&XsT_ocyO*F@#x%=%?cJr zC35>sy~?U*t1V5jOxIpoQ{{73Hh*n<=n#g4f1Eq6m{m$=l@a8vwBl-`T;|x zeLAP6g>^5h<|tJaSBzd|z_VuF^?S>_xAXj5$!5N;uCZxLJ@bs#g>{Vco?1Pb`I!GA P&}9ssu6{1-oD!M2BR0pkS(} zi(`mIZ?b@(;LrH;=YHOA?tE$A@zz->fg$r;TEdTft|KXu44Wi9H|w8dYcNsDRJ+R% zWZENTV8g4Rtk`(<;FpP$ryQK+SmjV9DVCYtRII#lCg(EAW&Mp;-tYu52XS9wPGV;0 X2{4`b>D<0jpoI*cu6{1-oD!M<9uhkM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ethereal_glass_dark/9.png new file mode 100644 index 0000000000000000000000000000000000000000..6b46613fafd065a5a75a0efdf4c709f213214229 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkRTg zi(`nz>0|*x!JqNx&;7jL-1*YJMT)ebY8 jZk%bk%Dp5dy@Y|`d7f!*d}??<&~64#S3j3^P6 m00I~feEs+T^TWGj8vp>F8554Rpdvp20000R4vMmIP)L_;+~H%37?HrkNB QTmS$707*qoM6N<$f_rT&ZvX%Q delta 78 zcmeBS%$cC#VeIMR7*a7O`Oo+F_v_h=4laDp!^1O0;s6M^bUq7YcH@;WWnh%xulf7^ f|L4QIQ=}Ofx+?^<54RgKGXR07tDnm{r-UW|AblS9 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/10.png index b5c619dded11a3a43f7117c1326b45d1f1d26c1a..feeac18348e26c40ccac21ae20a9484e5da3ab9b 100644 GIT binary patch delta 81 zcmWG9n4sb#?djqeVsSb-VF828k6-WY4{J!UE>5su2q;PHmw|ynASKnw k-Q2*!z|hdm)ZEF$%*oZ&t-o!`Q=lA!r>mdKI;Vst07#e_asU7T delta 56 zcmXR2pP*ta=jq}YQZXkvVF828k6-WYRe!l3)R16pX3N=E_S>F8V=cQFql4Nn1|aZs L^>bP0l+XkKQ+N}$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/11.png index fb46a162943d5dad8e5f73e09da6bbe7a190a936..ae05d858da9fbc534bc093b9565a32a8ad8fe195 100644 GIT binary patch delta 78 zcmWH|ouJ|=;pyTSV$qwNAi=sgL4-%V;KA$t|EIiQW%yjfo~r*&-IRfWK_Dg7$=%Gt h$k@Qp(#gWW&B@Z(*tunHvNlkT!PC{xWt~$(69D^t7%Kn( delta 54 zcmc}|ouFbUR!3 gIW#p!HbF!%G%`0dGFl$?Z~y=R07*qoM6N<$g3ypLaR2}S delta 74 zcmbQkm@z@cMc>oKF{ENn@}KYT@7J>#9bEXHhlgj1#D<@@-v0M_lGWB2$n3@|Vakwo eVBz~Ik_-%OihNH^Ele31fWXt$&t;ucLK6V4WE}Yb diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/13.png index 1a7f8d0b05ac0d6f10fe3b72bd3eb9abe30a3d9d..5bbd97cb44573b5ef2f18d2110addecd7fcbc9c4 100644 GIT binary patch delta 108 zcmV-y0F(b_iUE)$W;IDfK~y-6WBB*)-+z4g{xAG;3?K#rC1BKm!C=6FuM`@v>)D$D zHemC$+XHOCz=r{)(Fg#%Om}e2Xj2vd000nVWkN?rGe$*3Mlm!(Ha0>xLqtVnw+>$b O0000*?YcV&R|s2n-YKX1V0c2Gk?kAYzUtG&i&5y5W^3=9G( msZQ?ZmWHM#7A9^kE*1uEt|q3@X0E(IIR;NxKbLh*2~7as9U2q> delta 54 zcmXR4ouFbU)DJBE`0ywl??0R1Q8x528JDdtXtIQ3b!%s~j-+u-&0a)*@XK%@A!PO6K@5NDTn*0CY5m?Bx>x000nVWkN?oMKUopH#SB? aGc_?YIWj_+eX&yj0000#9c*0x|DSO{5(6_32&>L==an!`xWd4aVDsVY g{r~6r-%rYAVBk{`QfA~_$jSf&p00i_>zopr0KSA9{r~^~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/17.png index f64f63dfd3bb307ac51e3add053a0704672ecfc5..f1c3c193a7c43aceb9aa0de9e3201285c2925e6c 100644 GIT binary patch delta 115 zcmV-(0F3`~kpYk-Z9GXtK~y-6V>s~j-+u-&0VR5=W5BLwZwA)G2;FHpq`AOeO#2?K=j@sZVoFaT}xZ!fVj8ruK>01#wlLPs$*Fg7zrG(<8%K}0w* VMn;W}k9Pn7002ovPDHLkV1k!ED*XTe delta 84 zcmbQpSTsS!&(hPyF{ENn@{jND@7J>#9c*0x|DUlT5KPKG@VvcTa>j|PJj{#PdZY}p m7+4JCe*Aj>A1Hj%jDca}M}a3tFZn{2Gu zPBJra#n_oH>YDqCfq_9FCDqB@)X~)3z{$kez}V8#(cHy3C{O4KP>#XV)z4*}Q$iB} D$SfdP delta 66 zcmZo-U4ae_#Iw1M1@U+@1vZ!bS-#=vmk WFP}if|BE#YK;Y@>=d#Wzp$P!xksR&- diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/19.png index 9692a89db72332befc24aec0a0c9121e3d24023b..d72e9e966f0722791e5f9e64e2e15e3c4a18179f 100644 GIT binary patch delta 104 zcmXSDW1OIpWa#PQ7-G?zZ1Lgi{dzVdM%Aj7$p_Y@=d;~tID0*h|Es}*8{EwK2Qnla zco(RcHZln^SaaEXmFF(WXJB9uNJ({aH#ae|G%+`Kb#yXxGck5{Sz}eY4JgOp>FVdQ I&MBb@0L{1}t^fc4 delta 82 zcmZo;ESR9;WA5qV7*a7O`N#M7_v_h=4mPg;|IgSE2qtA8c-~$vIpf4t9_GbtJyHf) j3|AVM<4>MH#{&cm!hw7y{yDF_7=Xaj)z4*}Q$iB}vR)tD diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/2.png index 6988f5ad8f8d7543a72e62a8e19ccc0c0d006af4..92ff119531fd61124ee289be89ef304e979904fd 100644 GIT binary patch delta 102 zcmV-s0Ga<_gaMEwU@u8TK~y+TWBB*)-+x^A{x1l|C(kenM!_f;EMW7s+y7yB*RwZZ zjLb)tN5>#}0FPF6_^;j0asU7T5M*USM?^R=ML9AvMMg6=K}0k(MKh~mTL1t607*qo IM6N<$g5gFd-2eap delta 66 zcmZo+OqifzqweYA7*a7O`Oo+F_v_h=4laEE}p0zuy0U-d=vvjDf)} Wfk&c5i}@P^5O})!xvX*?YcVsSb-VF828k6-WY4{J!UE>76M;I&D`L!UuFm0Ns{slYD=1_ptY mR3~>wGgD(Tb8{zW7jsJkXCq62b++eq1LeyDj diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/21.png index 26fa3f3c093556f55ab3bc974dd6fb7623f4c330..85cca61931fcd6bab0475fa26b73824bd22e2815 100644 GIT binary patch delta 82 zcmaznoS@<>)DJBHm-m2T9$Qjf(Vb+hM%|I{%3Hu<>r5J|64i( O5O})!xvX}%WV&R``@!{+JdNw0Q)hhRc8WOC{d<+cI-0Z3GUta%aU|#XV)z4*}Q$iB}_#zmG delta 54 zcmc}~ouFbU)DJBHm-m2T9$Qjf(VZl1B0~{`;OXk;vd$@?2>>1084>^h delta 52 zcmc}|o}i*H<>}%WQZXm_$M^U5>)QeixZDmFFtG0nnl_h_)scP8^B=Rt8Gyjk)z4*} HQ$iB}D`OMl diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/24.png index ce05da71ee789752dd4aad10a35f0332f364e773..25a0e1e090a3d06a11b858636ab1dae508d96bb8 100644 GIT binary patch delta 123 zcmV->0EGW+nE{X_bwo)-K~y-6V>s~j-+u-&0a)*@XKx110I*()4cL6`HrWP%^->%L zl*9tqa!L#Udx2sDCzJL002ovPDHLkV1oInDM$bS delta 78 zcmV-U0I~m>0c?;YNHa-9K~#90WBB*)-+u-&!GW*;{xgxQnSp_U;q$}03=|o_z`!tS kz^DPE2EYtB^qn#T0DoW%H2tk3xBvhE07*qoM6N<$g1_z}lK=n! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/25.png index d7d2c612e48a3d42c0281ef4c38f38a807bc1c41..09cd1fb8eadd4ac42af9a24c6449ee396c2edd48 100644 GIT binary patch delta 98 zcma!UV4R>5qwVS97-G?zZ1Lgi{dzX91MAZB+jcR|UVm3EK|DZ)n>qi0LC3L1e|F}1 z6ByQ{S^Vj#pPRzKz#x#4>f~FVdQ&MBb@0H4hi(f|Me diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/26.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/26.png index 55b8c22f96342710343c2b20d87e4ada218240c6..93141a8a28f1a4341d2fe4cc8077184d33c177be 100644 GIT binary patch delta 71 zcmeZHo1o$(=;`7ZA|aV9!MZp>q=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oAT5q|&x delta 44 ycmYfEo}i*G5qwVS97-G?zoU(vH=Etx1_KzE+HoU$$o6#)c^VZwWwmcf&4jqs-kYWqr za$%^MVE)bDHS!Px1A{SDg`2CnfrXKitBIk*u4)&c9D}E;pUXO@geCw- C@FD>K delta 66 zcmZo*OqifzqweYA7*a7OIbi{V%#UC1?S)m@YU(PcH!3kpNJzNxN|+{GVaSqXVEA6a V)}$99yPN?CJYD@<);T3K0RYxN6pa7? diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/28.png index e1358bae5c0a8319c476fd561db50cef4badce8d..b576e26b8df8e4e3a6ccdf114a21a63022479a03 100644 GIT binary patch delta 104 zcmYdmW1OIpWa#PQ7-G?zZ1Lgi{dzVd#)$Xp((_N4G4Qb6YdCv7kADNVMrW&I(gA~x zV~zgo%=0ENoMfmdK II;Vst0Q_+y2n-YKX1V0c2Glt@4)DJBE`0ywl??0R1Q8yi4L@(a{m*bV$&L*KYr3qRqi0LC3L1e|F|s z6CA1-w>sFYTiIvm#K6EHkdo@;Zffaf=w@PI>0;_=?B?oXJmIFW7Eq4C)78&qol`;+ E07pn6m;e9( delta 65 zcmZo-jGv%lt>)?C7*a7O`N#M7_v_iX7=%@4x${bxCR}02k}7y%{d1Oi{O-T<3>WTj Un(Q*J3Sa;NPgg&ebxsLQ05FLdEdT%j diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/31.png index e0e267a31f3d55932ce25b24ef1c8f7de5857a77..3d7ee2dd2f9692f4e0a8bb298490e07ed3bfc819 100644 GIT binary patch delta 88 zcmazmpP&+~2n-YKX1V0c2Gk?=fQ#SQ=3#6+Lk%pVn}FP s!N9;Ekdo@;Zf0TNXlU-_gnPbQZXm_&-eHD>)DJBE`0ywl??0R1d$62GC#cP%F+@N5*Qff>vN{f S-DGCN00f?{elF{r5}E*Oml){) diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/32.png index bbb135790848379bf46580250739f1a307a556c0..c23f9774ce7b9f3755116939e975201b964d0ffb 100644 GIT binary patch delta 75 zcmWH@nxNt)>gnPbA|aV9!MZp>q=!kt;=|Yb^$a|(m^UlGE8NJyz#x#4>f~- eY+z{NWbSO{Y~ft@JW38I$KdJe=d#Wzp$PzRw-$>4 delta 49 zcmc}_n4qE~?&;zfQZXkvL4tL0f=CY&Tie;|dH>lNc!Zf#gfC1tWdH(CS3j3^P6gh#sI!R!71c|;f(UM*tYy!g(}2nGfQfs|AycV}ly gV@oGvQwu{23nM2>v&|;Fl0Z2IPgg&ebxsLQ0IPl$zW@LL delta 50 zcmc}^oS>pB;pyTSQZXkvL4tL0f(Vaz!GqWP|4(_r&hTmx^X7WRMK>9Mz|+;wWt~$( F69CwK64C$w diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/34.png index 8dfa45d0c343f47f18615583fb33f8b4b1c8988f..0692abe6a32909fb1c2da4ea1aff2141e7861992 100644 GIT binary patch delta 78 zcmWH}ouJ|=;pyTSV&R``@!{+J`nEs=F1Ldo>}%WQZXm_$M^U5>)QeixZDnUu+Lt9_a8rl+G6%tLs{F!3_#%N>gTe~ HDWM4fEyfdj diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/35.png index 8204a4542ecf470442e08a1fe99db4205786569d..77e6eb65cf887cef3f91eb89b10fb0f20f33fa9c 100644 GIT binary patch delta 81 zcmWG7n4sb#?djqeVsSb-VF828k6-WY4{J!UE>76M;I&zWf!&)u^~$!0E(Qh$fs|Ay kcUKc5XD1gILql^T7gJ+5<6iyRzopr00)N=X#fBK diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/36.png index 1e8f54d0080d529d4b152af6845dd5304eee9fc9..649da33d198839a1cd2123005bf719300f34b29d 100644 GIT binary patch delta 137 zcmV;40CxXyrU8&7e^E(9K~y-6V>s~j-+u-&0a)*@XKx110I*()4cL6`HrWP%^->%L zl*9tqa!L#Ud*R=|0W@IOv$q56g5lx?P&$BNP{IH?3&sX1fYIn|7zO}RrKK*{^620I r000nVWkN?VL_{(s~j-+u;5z^-R+hPnZpuiYMC7f>7v6dUmG->3n@ zzyMG>fMHOo-1Y1&oDE9m_%KKf0Mce~f@Qp<4FCWD5M*USM=(Q0H9RZ9F{ENn@{jND@7J?&F$k;9a_5yWO}N6KC3T?U!R!71=gZ$yz0JVz X;38L*r^=fh3_#%N>gTe~DWM4fiLn}S diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/38.png index 5ee8e7803d703c2889070e8a6fc35748980f6944..40f77edf51cc985c311119d9c3fdfec280098c43 100644 GIT binary patch delta 89 zcmWHon4l7(?CIhdV&R{hAi=sgL4-$q!_Ql9{~PRieN)=N?V0lF#mN(F7(NG?UDP+Y tz{J47Adr&kgwj`WU9`^;|i2x@O1TaS?83{1OT_j9X(^b07*qoM6N<$f}p=C-v9sr delta 76 zcmbQhm^DGg&Ct`uF{ENna>4=znIFI2+Y76*)zno?Z&YHIkdScWl`u`X!l030^Wp3L g|L6JNPs(Lrs5!y&MAfJF9Rm<}y85}Sb4q9e06V=LY5)KL diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/4.png index 4a55725bd94ba13fe34a9d827c08eaf786a6ada9..3eb2676289337870d3578b8750769815d3bd74fa 100644 GIT binary patch delta 110 zcmV-!0FnP{i~*1&Xg5hjK~y-6WBB*)-+z4g{xAG;3?K#rC1BKm!C=6FuM`@v>)D$D zHemC$+XHOCz=r`P(FoED0L3PIA}LqWEC2ui5M*USM>9A?I5#*(G($l$Hbp`)I3{tz Q*#H0l07*qoM6N<$f+c4u-~a#s delta 76 zcmeBS%$lI$X6WhS7*a7O`Oo+F_v_h=4laDp!^1O0;s6M^bUq7YcH@;WWjNX3eE;P2 eJwI=~{m)R{%=h%b1G#7hAnN$GBdp0 yY}G6k^ns6ofk7Z8)ydt-%*ffz#nQ~g)WFr)z{t2>b6E^fj=|H_&t;ucLK6V8pdfkx delta 59 zcmb=8nxJB)=;`7ZQZXm_$M^U5>)QeixZDmJF!ZqR`}h0*&xf&_co`U$By+{JiymlZ O00K`}KbLh*2~7YD@ECsp diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/41.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/41.png index 5c8db16441ddd270f3c33db5893a5c28bf0be881..a042ac6b452215cdce2bd3c67e675a9b2fd6259a 100644 GIT binary patch delta 103 zcmV-t0GR(~g#nNxVK7NVK~y-)V_={F9QgY0Kf{0;u}%WVsSb-VF828k6-WY4{J!UE>76caQ1rM|MrKm=kGNb8p%h>$u>V> z(6rG>MznW>|hp^1U1%Ra?r-9R}8Pgg&ebxsLQ08I=c Axc~qF delta 63 zcmb=Ao1kK)>gnPbQZXkvVF828k6-WYRe!l3)R17k!qUUO@89qLKOe?!;$>i1mdhm` T9LBMP0SG)@{an^LB{Ts5MOhfc diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/43.png index 79d6b3c9382c9b30c37c8b147c90f25b2daeef3f..9b102f75ba64a33ac72fb12ccf957dca30e54e0c 100644 GIT binary patch delta 99 zcmd03WSpQ9tK;e77-G?zZ1Lgi{dzVdM%Aj7$p_Y@=d;~tID0*h|Es}*8{EwK2QnlA zGzAz#GOcGsi7#2pz`!7olIrAcY+>eVVQgq-#XV)z4*}Q$iB} DF}ESr delta 74 zcmZo<%$T6!qVMVA7*a7O`N#M7_v_h=4mPg;|IgSE2qtA8c-~$vIpf4t9_GbtJyHf) c3{!a+7<4vpHF3MetzrNIPgg&ebxsLQ0F!(iKmY&$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/44.png index 2a057f32b992aac5c56db94d414640dcec85f755..0dc2b1e58ee9a7863ea5eca9c757dff86e07c378 100644 GIT binary patch delta 77 zcmWH}nV{k!?&;zfA|aW)fJNrVulM$cH6&OUC+uKgP*}yh`D)&R$qWn(0x79Z?v^Gl h<|f9@=4O^g#?F>51~0FFH3iBsc)I$ztaD0e0s!eW80`Q6 delta 52 zcmc}^o}i*H<>}%WQZXkvVF828k6-WYRe!l3)R16p=3-z_SjD{gS5M;s1|aZs^>bP0 Hl+XkK{Tvd+ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/45.png index 62bbeff4751cf45a2a99e5036155cf61ef2bf57a..191eb6125dad7844980c808c82da305c755f32fd 100644 GIT binary patch delta 72 zcmWH@nV{(`A(?FP;p_eSwm<_ew}To92@DMXl9)I1U$}jofq_9FCDqB@%+$@z+|bq0 b%-PA+%*oWrA$Fo5P>#XV)z4*}Q$iB}k>(c0 delta 44 zcmc}^n4qa%F(>)Q_xJbf+X4-^+zx6aBrq_@EnxnYf3IK(0}yz+`njxgN@xNAtBMg` diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/46.png index cf3711ca801ad4b5a8d24891750a26bf399b836f..79a79be1f712b617d0ff7e28785302b6df08b1c5 100644 GIT binary patch delta 82 zcmazkoS@<>{HUx8MxZ`PRbmvzs)DJBHm-m2T9$Qjf=GaDz$8`k_}zcy88q+l9TbuE Qj$!};Pgg&ebxsLQ02ve)VgLXD diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/5.png index 0e359ce63c07e1999a5d6447be431033f779ee1b..d68787a271b73b9fe6372ab33af617e6bddaa4c0 100644 GIT binary patch delta 118 zcmV-+0Ez!j=AMK(h+LNPKp YIWsjfGo3OU{r~^~07*qoM6N<$f}p`KU;qFB delta 76 zcmbQjm^DGg&Ct`uF{ENn@}KYT@7J>#9bEYS$*Y#8v)A+fr!Ts|(-z3=#w%gUkaeJO f{gd=`HXvYluEg`yM%kp00SG)@{an^LB{Ts5F!~<&bcCrd~P&1A{2n-YKX1V0c2Gk?=fQ#SPn%Ud^cnga+hCi!FbJfiI=Q>LS(sRwTR1ryx|upU8n^{4J^vgi$KdJe=d#Wzp$PzPKOqVL delta 63 zcmb=7o1kK)>gnPbQZXm_&-eHD>)DJBE`0ywl??0R1d$62GC#cP%I?*?{Z`Mg+=%Do TJFl)g3_#%N>gTe~DWM4fv+o>l diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/8.png index 417aceaf8be6d1b2bfd633611da376ec6989da84..938bc56f0d908434892495df66f7a2835046d26b 100644 GIT binary patch delta 80 zcma#ZpP=F`<>}%WV&R``@!{+J`nEs=F1LdP3{z6lC&V$ly~{1mC?#Ocz`!7olIrB{ jW@zZ>Y;0m?;$q_HY+~u!a_Wm0P>#XV)z4*}Q$iB}IH?&L delta 57 zcmd0gn4n@J@9E+gQZXm_$M^U5>)QeixZDmFFtG2NG=Hvn{O-T<47@Jf{6cr-+Zcer M)78&qol`;+0Gf^!9RL6T diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_0/9.png index fccbb2c9c6593a0d941ecf53e57cd4691900a2c2..c771b1fd6b52b80091d1cfaf96f7162d60f5fff0 100644 GIT binary patch delta 82 zcmWG9oS@<>{HS_85q}ai`(hXJix%fAdr&k lgZ}_Y-DWc=s54~N_C(dgQu&X%Q~loCIAuq7$E=v delta 56 zcmXR6pP*ta=jq}YQZXm_$M^U5>)DJBHm-m2T9$Qjf=GaDz${fp#oOF*FP7WwWdH(C LS3j3^P6zlCS)T>6O0C700b+W w_7lzONB{r;5M*USM>jS%F*rgrMny(6Gd4s-Hksb3y#N3J07*qoM6N<$f@ft&ng9R* delta 133 zcmV;00DAx40ipqrBz|d0L_t(|ob8jb4Zt7_1kc_jO?Jt&ED$jS4WeKM6wyJNkfbD} z-@!AN-32=*$fJxs?v7PG;fLl8A)I>q!@s~1Stl#b&(tJM-wmsz*FUSJwK@d njPu<;(Y(g_D*I9D(B(@f)BG{GU9+{r00000NkvXXu0mjf4@Eli diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/1.png index d499e46842e458e1aef49a71dd47517e011a02dc..ba97fea2863f02477194f99ae2da736456f4cd87 100644 GIT binary patch delta 130 zcmV-|0Db?P0iOYoBzsCpL_t(Ijbr%t@85q)FawwX0vJs)7#uDbH2|XV{x32OfN30f z7YwWcAa5M_`tSeFr*AOu=4-d{Vz|v<4mkkbW|+zNY)6&@0LvLnT`#>O`~Uy|5M*US kM@BX?Lqaz(LP0Y&LoqQpHWPl-#{d8T07*qoM6N<$f*T?*mH+?% delta 126 zcmV-^0D=FX0h*0AsmdX~NY|KS@c>1y%1p>AC~4Lg|_#FfOXdXp3Q7=Xaj L)z4*}Q$iB}+Qu*J diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/11.png index 7830d4f26673f1154700aad8abdd02cb9ddf3e29..b3f3942a5453cc2f8a8987491babb6875a6eaa49 100644 GIT binary patch delta 119 zcmV--0EqvD0h9rdByc}TL_t(IjbmUK1*2dTPzP+jcKbgF?|k~^Ke2iaeEkPj57GxV z047MR0WizJdO;kJ=KDX1Hvs19mFKVg2LND4I1rI(y(a(w01#wlLPs_>H8nRlML{q) ZLpMS(G&5J=KTH4s002ovPDHLkV1jXMDbWA` delta 103 zcmbQj*upqLCBfU%#WAE}PI7_->*55F09J#4zrVk?XJ%$Tyzo5_58oZ1o+BBzYTkaU zmzdqz2n3y-ogY6R-mP-;&FZD6P8-B!3BTNLh0L01FZT01FZU(%pXi0001HNklL_t(|ob8ga4Ztu61Rr)ulU*`xHeiS}5d|~2pu?$5+L*L{ z3DLmmil>O^C`KG$0AOYs`^${mW(ukphy%?OK+&L?;@CGzz@IF@0wf?Jy7=7VdEGq$ iqn(cIL~)XmUze(0;;Ksg3aS3j3^P6bP0l+XkKnZO#I delta 86 zcmXRYouCqE)DJBE_~0!zopr0OM868~so`=VW2MBz8e0mIKN$>>!{`oML&8;Y= z;Dt5w;pgq;Crd4u4?oM^{{L`>+Na*ehCpUF-UTNZBC=F&GsNqLx~rxZpJ0@0 RIhO$lJYD@<);T3K0RV_4EfD|! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/16.png index 3e221bd38b398fa963c2eab9cd00d4e1d70cf718..bb29b275659cec89526d8a0c1b2d1c3c7d98b5b1 100644 GIT binary patch delta 153 zcmV;K0A~N20kr{;B!6H@L_t(Ijbpg~>)(F{Ab`=tfSpg@{6FyZ-~anRfqKX>0Hhg2 z|NBR#0U(<}n#nc*)wEFqAW=aL7r+b}I2R180U&RH(l;oRpySQgZsWypo537%0J_aE zlkwS(EC&GZY58PRf5Dgl000nVWkN?YH!wvrF-AE?F*QR)FcLX8a!P5U00000NkvXX Hu0mjf#Kgq- z`Qcp#Msi$m;OoEtpC8^ubq=yYB)NnfO``^k8h{QMkuwH7d6EKP25i1|o9LtrQ@i=v g?f;A@8G{S}0KgYJ$GxFg)&Kwi07*qoM6N<$g2s0^vj6}9 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/17.png index fd9dd614d7c9f7c79fbdf9b454aacc119529a064..ad9f198c90f80008a45651b03401248bba62a22f 100644 GIT binary patch delta 130 zcmV-|0Db?d0iOYoBzsCpL_t(Ijbpg~^WT3MW*`!5zIOXRoc{L@qLCs4K$vU;$N{4U zj2Zv}JDR7yLqRe@L_|3-GDb2%M(9kAs{jB107*qoM6N<$faM!L_tMGH$y=*H#IgwHu_qDUjP6A07*qoM6N<$f`N4}pa1{> delta 117 zcmV-*0E+*g0g?fbByL$rL_t(|oMZg=@85q0C}3h@Vq_o!!1NsY&cMJ#ibiC>#Kgq- z`Qcp#Msi$m;OoEtpC8^O)y`2c3TOxzkuwHa$rEP4=4-eA6H*HUFtwYn-Tu!=X~qBm XlixGL{9$Rq00000NkvXXu0mjf0(Lg% diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/19.png index e23297d829398af79b7811d9eddeb3f2d4e2f2da..2bff478902693ea82bd573f8a4b3a70dc7c3d3ef 100644 GIT binary patch delta 123 zcmV->0EGXl0hj@hBy>YbL_t(Ijbpg~^WT3MW*`!5zIOXRoc{L@qLCs4K$vU;$N{4U zj2b|F13&}_?|k}(yrc}{9QaCRUI5t)(oAk<0st;=r|CK=0hRy&01#wlLPs-0F+)W) dMK(l2GB7YgGc!hHZ0!I5002ovPDHLkV1mnzEI|MO delta 142 zcmV;90CE4A0jdFzB!6*9L_t(|ob8jb4S+BZ1O48GhFzGJ1rS5fpcI)QLh1Z8git2X za?+Rf`z60ga$Jx!G*C2a2G}EfLef$Uur~>oL!M$N8d{mw?I{LK<6yvb!WVvn-v9t8 w$tC%6)JnH7Z@b?K%476!S9#6V?M;FcJ6AO^Xfo{u00000Ne4wvM6N<$fvt;WPZQ66yM6Kw z;uDxA#BwuSEEL(RugsLlz`!7olIrAcVQggT11kXY3OE>HFsJxP>#XV)z4*} HQ$iB}oj@W3 delta 115 zcmV-(0F3{H0gwTZBy3knL_t(|oMZg=@85q0GQpwm3=B*R3=9lROiYY0nivdI`}yHr z21asRaOgV&!{>*0$#wWB7zH!{@T5$3@`M?%`Pyxw^8`%o=4-eAGamT*?>{9O0|0+I VE(yHXsg(c#002ovPDHLkV1hYnF@XR8 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/20.png index 6907a4adb9ed7cdefed34008f2ffe4a309e4c94d..54159023062de9855c8a4a256d1f767dcc75d604 100644 GIT binary patch delta 140 zcmV;70CWGH0jL3xB!5#$L_t(I%VS_51MGbI=Kq1O|Nh_q`R_kD`WZl)LG-_WWEudn z8KjwP14h9ppg!1q?e>2V24xUZ@&ZUbNFUe$|Jr9r16Nv*LaOB95A3q<)vbhzR z$p85D{{Qp#@{?PuMS7T|7~G!pJUnpLCFIh*nz!HTC1!UvGEOw~VB8nAs)q*%eA@Rd fp5>v_@RE^%rCxbP0l+XkKdX+iB diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/21.png index f82281f751d8958af70af8aa44505c3e14f6605d..fe0f1a35c1055ecfcb014e5fe71f660bbceb2443 100644 GIT binary patch delta 137 zcmV;40CxY50i^+uB!5szL_t(I%VW6z^WT3MW*`#meER19fv-?K|NcQVl41ZzGl&N3 z1rZ=jiUAK{+@%FgG~NgO�#Kgq- z`Qcp#Msi$m;OoEtpC8^O)y`2c3TOyO&I1e#3=EsE-9{vTa&7k2Qe~vb0GKNPmbo55 Tu(AjY00000NkvXXu0mjf-10H_ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/22.png index d644831ce29f69178df030bb05775109e4fd9750..463c27141350be523a45ab4959264a9b19c22c03 100644 GIT binary patch delta 111 zcmV-#0FeK9jRBA(X*fwlK~y-)W4QnG-+vfpAQJ3+`sV+EuTVYz{y{X7VgN`phz9Eg z5g<&80U)(7eGH>u6pRAu005WCJ(rZR{2~AV01#wlLPsz;H8L_WL@+fuMK&=*FhwvW R3v2)Y002ovPDHLkV1n1nCsY6c delta 90 zcmV-g0Hyzp0eFxkR6j{XK~#90WBm8;-+u-uU}9ooWFP{-^c?!mz`#U`Mr6Rm#Kidd w;avtsa$IoW>%ae>AKoR^&QUN5Mgcwm0CyA?*@1C+cmMzZ07*qoM6N<$f|AK70ssI2 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/23.png index 77620a8678a76344e3c332d2135040e868ca12b3..da2df131a1b0855d706463591235e17a5074fa75 100644 GIT binary patch delta 116 zcmV-)0E_>Bk^zt;ZaqmvK~y-)W4QnG-+vfpAP4;W2hm880U%7a0i$3P3=XjQ+U@@! zyz}Xs|705gq7Qr}GcSN_25BZYGXVe(fIEr!jub`!000nVWkN?eIYu=^H8nIrGc+_g WHZ(Uv*JmgI0000AI;!M}h1 z{{Q>;@Be|XI`o}^Ve_@yWM?J-e3l!6Wzdsj00000NkvXXu0mjf D)om?% diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/24.png index 8008b2aa044b409a0b97ce53fe362557356cc20b..70ecd4a480f0f2cc6eed489033afebc206b21159 100644 GIT binary patch delta 90 zcmZ3;STR8*MA_5DF~q_@dB^|P_v_gd8ZI7bID0+sfBWUdY&}v2SqBOX85n+cJy(2k uTq1{ofk7Z8)ydt$!pYpk)!fy@$jQyf(%C}wumuxPj=|H_&t;ucLK6UyoFJqC delta 131 zcmV-}0DS*=p#hL2eP~HUK~#90?US($fG`XM?carlU6_^yP==sEDKbNZ(!D7lhLVJq z>+kf1tt3q@0I0m6I-!W5MSKE4bBdxp3znUhQ#_rX1vy2T#z8&sg+K5IJV4SyX%pvl lGY{0qXu(f8l)Kim-~gt8FEPs2iqHT6002ovPDHLkV1ny=Ie-8F diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/25.png index d9ef72b5df7235ce52d189c6e80975f910a14e20..53e332ba7e1c283be6aa62f57ad20dedbc1897cb 100644 GIT binary patch delta 84 zcmZoq=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oAT5q|&x delta 44 ycmYfEo}i*G|Hql>ATnT4g3lYx_=shLw&Py|qp!PC{xWt~$(697LH7@q(D delta 115 zcmXSz$T&eIH^S4!F{ENna*6`;pWol#+cPsWA71#LhsWoM!~qaEa^%R5pATc%+=@)( zfBbs?|9N}4BHP5|13+4`W^0J#Nizn?9w~z?23NM6ePzGxUD*QWOi9#ZV90zdIX63Y R(kuob@O1TaS?83{1ON_KF}nZ& diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/28.png index 0ad81997fe804f789d2a75c90b91423d6971f827..4d7795d8a0c8b03c1567d6c6c51629c0416da96d 100644 GIT binary patch delta 116 zcmV-)0E_>a0g(ZaByBuNL_t(Ijbpg~>)(F{Ab`=tfSpg@{6FyZ-~anRfqKX>0Hhg2 z|NBR#0U(<}n#nc*)wEFqMhzG>00aQ$c$q`71NTAz000nVWkN?aH8@2%IYu)>IYLH8 WFhw&=M1x!a00000EGXM0hj@hBy?X%L_t(|ob8jb4Zt7}1O48An=BA9M4E_#8Bj!LXo5tf6yeiy zy-(NJBvssyG<=|MLIF5493g2rMVO~xzf^OI&zw;-RpJ>f!4kX*B-K!U2>LNxf>40% dI9)#gfCfx&ENS-;NMQf~002ovPDHLkV1hQ5FiQXc diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/29.png index af7baaab9727eadad0032973407f9d1d960621d7..ac7e69d0be1d4aca4258bf088214040e83ed0878 100644 GIT binary patch delta 112 zcmV-$0FVEP0gVBWBxyKFL_t(Ijbr%t@85q)FayP4;9W2ZM!|rA17H9B-}&^-|IOEK zlb4i1nn5(#27okz@XGU7{sRF2KbpKJQNqXo000nVWkN?XLpV4&Gc`3bGeSWzI5jdd SVdS*{0000|~svk{aOY;uumfC;89!_xJ1Bj1De*&%@)x0|Y)kK0OArBzS^<|9lwB=2jF_ z@WPt;@bmWalchg2Bv?%tdY)w5s(EW>^V4`@_U84|w3J=h4#Y4rG>J&Gmw$h}jsXZf MUHx3vIVCg!0EE#i>Hq)$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/3.png index 2f1eacbbdff980006771a55fbe7f95089e7dc4d1..4cff131dd427b6b0a6d0b259c63ad5d32685d206 100644 GIT binary patch delta 162 zcmV;T0A2r>0loo{B!6j1L_t(Ijbr%t@85r7@cmzy`~zSA{bwKtfHZ^XoloEVXCTF9 z5F2Lm=4-eA?|SxzJQsj%Mxx0!0OX2+F#x8KVgtwy1FE@T;0&NzEX+S~?mw6V!XQ&& zY-|{pJoQ{aECy+U(I5-}w+K6Rb}|6`0000GWMx7}GBQCnFdIWeMMOj~H9|8nGaVYb Qh5!Hn07*qoM6N<$g1%-!ApigX delta 123 zcmV->0EGX(0hj@hBy?X%L_t(|ob8jb3BWK61W($3n=BAKM4I5jGnn8`N)bd-8m0Av zP$P~nPGV+GGG%}QsH()CnYit(BAEtdKyNi$9Jb^1*qX;YS%3uqUX{~&1|amD$ya6B dFY`Z-aRYN}G~q9evcmuX002ovPDHLkV1k{;G$#N6 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/30.png index ab428f20b705ee031de29d9c81823d5702474c34..e3c06df5444e75e6e270386787be50f344a34843 100644 GIT binary patch delta 115 zcmV-(0F3{S0gwTZBy2lLL_t(Ijbpg~>)(F{Ab`;%gHZ!U4Hz|md;<=A{r7+8(>MP& zU%UOEECWEAK{VM0fHZ>e%JWzL0|2v4mRu101#wlLPtb7GBqMX(S{iC8a0`8cbX*c$6U}oTrCdgK;rikJJGW zICOx)^Hlpj;q{rHx8CmHIRWC%m%pcaGA&*=)Qt@YmO0-K^i{bk%21&zE9CWI)kFp$ N@O1TaS?83{1OSsbEhYc} diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/31.png index 97efe86b6920690662d7bffd3ee66a841eb80caa..683ee277143cc2e6cd538013d9a1c1dd335cb34d 100644 GIT binary patch delta 111 zcmV-#0FeKX0gM5VBxpBDL_t(I%VYTW@85q)FayP4;9W2ZMgdj8=4-eAgYeF$Z~l{Q z0Ej;DmCSSvvKgfL{!j7@0062Xo0UEwtCau%01#wlLPteLF*ZauIWaXhMnOa~H$%M1 RSa$#b002ovPDHLkV1lRYEKL9a delta 115 zcmV-(0F3{P0gwTZBy3knL_t(|ob8h_3cxT717-jJH~m2IBf69fc|$1Pn9?8;7`>^*H=92oStRRxG^t*h)NOkta9p>n^aODB VB%7S2_*4J@002ovPDHLkV1m0eGok)?C7*a7OIYEMTae_zytHGqjnV+}b{-2nmR+RhgYEbHu6AUx78I-rO UXO>-2dcgn$p00i_>zopr05Rkk-2eap diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/33.png index 7346038fdaf743d0ed0eff259aa6b4f820503112..85493863b496a493992002232673d7f1f9c9fdb8 100644 GIT binary patch delta 101 zcmbteBt@V(;nV7*a7OIYEMTae_zy`=8(6-~ZoV|No!-k6-WYEq~3F0D>7aW=PoE t@A00-JcF+`J>f>pTeHY*#s&rk3=Bfkg=_D;jorln1fH&bF6*2Ung9r!C58Y1 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/34.png index 0789b989b8f442c1172d01bee44a21326d809634..32900803430e5bbf5f589789b0a2ce6dc51e3ee6 100644 GIT binary patch delta 118 zcmV-+0Ez!`lmU<=a6d^zK~y+TW4QnG-+vfpAP4;W2hm880U%7a0i$3P3|(;G>%ady zpT7CO`Pyyrl0Qf@h$hp*Ok6E^lp!U&rzz0DgfX%*;q%tp n9XuZE&hCp^)gvOwP|V8EyM;ebCbo4y0}yz+`njxgN@xNAav&d% diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/35.png index 23e0bbb80c8d0592f3de1e51dc1558108d5f92df..79769875b191188768ee447fab4220aec7f8d25c 100644 GIT binary patch delta 121 zcmV-<0EYjM0hR%fByvGXL_t(I%VS_51MGbI=Kq1O|Nh_q`R_kD`WZl)LG-_WWEudn z8KjwP14h9ppg!1q?e>2V24xVk4M5HybkCXqlX5!ubfh(20000GWMx7}I5j~=L`63< bMl?h)K`=!)Xi_(!00000NkvXXu0mjf^Gq;9 delta 114 zcmV-&0FD2a0gnNYBx_blL_t(|obA)04ZtuEL(zY?|2AD9$`B=0KxT-dFkeAIaZf7C z1hGoKKDn@VF?QQ#mq>vP4J_q^A;XOvGpe{JhE42=A0|o>l UPJw(PUH||907*qoM6N<$g3wGZG5`Po diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/36.png index 17b5569b021a22af25221c1d21d820f36d1d49ad..7149d2402b8f7a1da0aaded94b7da8bf6ee811c7 100644 GIT binary patch delta 146 zcmV;D0B!%I0j>d%B!5{+L_t(Ijbpg~>)(F{Ab`=tfX&x#|A*6~1`G=W{{5qp3t$Ef zoC`=XVCT~})Ct7-C(c0(0D0rU*MI*(CZl7JVh~1VBV)MDFjGl(0lLkEYy@e7(I5-} zLpeDB;BbSG0000GWMx7}G&MCgFf>I(HZ?OrG&x2$$jKw)01E&B07*qoM6N<$f*&+E Av$&fl)dI zTeiO2xgsGEDY#%}!UwctGr&E?7G|at188Kyen?3%)XvC)6a%((pUW;Rv; diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/37.png index d19437832f91881525406d165128832af402c756..f4711990198e999f20f2f3c1786adfb2f69ab958 100644 GIT binary patch delta 124 zcmV-?0E7RF0hs}iBy~hdL_t(Ijbpg~>)(F{Ab`;%gHZ#9g#rKmQON}`g9gq818V@t z8wbAr`@i$)8w|Yp+HJfTZZnue4nVgVW->n8k>vp6jN0N$=PdRB000nVWkN?aLNG=! eHbyc-HZ(OtH8?O?(D{)70000MX(S{iC8a0`8cbX*c$6U}oTrCdgK;rikJJGW z;P5`yzR%d8rmkXoiEsj2&c3qQFa9tD@BVq~?f)M3egA&@PdgjHz;NcXDtG#=Th|$Y Nz|+;wWt~$(696csFi-#h diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/38.png index 5560ab9b729212d1b2a2440ae946ee9aa85986a2..9d2df1a315cedf52d3dd45d34dac7581da3874ad 100644 GIT binary patch delta 92 zcmXS`o}d!0=IP=XV$qwNAi=sgK_r0HAa7sUZ~Kme$MjEpc>VY{V+o@s!_BP>Go5)( wzWsOl1_J|wKuW5UyQ{OSnW=%Pv!kh-tD&)_;XZBm1fU#)r>mdKI;Vst0DHJ0AOHXW delta 87 zcmV-d0I2_ac90}eJxN4CRCt_YU>F6XU=&aVF#h}Z?>_?r1H+;33=E$i-X+}xm;sxw t-TqIk9+=wA*KYr3Jn;43f3j?b0stV}9P9XV^TPlD002ovPDHLkV1k5JCl&wz diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/39.png index 3a87d3a6dc3dc06856f6f92a19c4c85d8482191f..0678cf22be7594eee688244f3b0c86620d3ef843 100644 GIT binary patch delta 113 zcmV-%0FM8i0geHXBx*THL_t(IjbmUS18lx_`#&;0YQU%gL)3tsPv20-1@ljw`w!-T zFvwIG8ym(YPdyh9i$R)TGzbF#yBEs5&FZ;e0000GWMx7}MMN<L_t(|obA)G4S+BVMA2{WLc=ah%L0fY(nKjTLxkvT3KS_N zxX#tSSNViM%*+AK8#Dp{sH(JDkVyHs%v&ul6aiW-Z0jOnV9W$203hQq`g{IL2lkZx iYp37tDZ7lrh~xot(k~v*ukt$p0000*0Asm)DzpFq delta 102 zcmV-s0Ga=c0fPaMBwtENL_t(|oMZg=@85q0C}3h@Vq_o@Fp;Yf#Qmh#1B(CvW|nHnq{#8K$!p066ai|<41Jfvz%xJa0{|w;CHb@+19_Wq mS^a8o4&zI%SDxFgMH=jO2V24xT!n-okv7m$LHT?+tbR*Nr*i-ITs000nVWkN?WK{-S? eK{7ZwMl?7xLp3%ZRhl;d0000+Sy|uNqh0t$F*c-p$LHjX}gidrzzU R#AF5_@O1TaS?83{1OP?IHO~M5 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/43.png index 081677c8aee82f47c8a3bcc68993eb1a75c9d7c6..1ea134737df4c694c0436fb57371430fdc4253f7 100644 GIT binary patch delta 101 zcmbQi*u*$NB~I7V#WBR9H+jeZ&-d#k(iDVp_Lcp%pY!iK|DuUX%nmbhm`^Y+X6unM z$YNN=$gt{mcjDK`cN27#1RCwC)bBSTXQHx~nEb3<24OUwLOYYl;N44$rjF6*2U FngE#lBAoyL delta 123 zcmV->0EGX70hj@hBy?X%L_t(|oMZg=@85q0C}3h@Vq_o!!1NsY&cMJ#ibiC>#Kgq- z`Qcp#Msi$m;OoEtpC8_Z>0x4oVPb9n{O~S=ua+t!0|V3xlz>qKMh&3IfX&x#|EI_R dijy+T1pqEqA-S?C=jH$a002ovPDHLkV1l$II%EI< diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/44.png index 36d3d41ffd869649a55176bf722cc209c135af5e..7fd3e339bf101e87f004df4717f0e8bccdc08e58 100644 GIT binary patch delta 105 zcmV-v0G9uAhXIfzV=_rZK~y+TV_+Zy?0ov>|ADXn{@?%k??1X6Q2?YFMF0CorU4+E zL7K@nU=)mkQGf{m5A7a`;c9%%po delta 64 zcmb=3pP*u`=IP=XQZXm_&-eHD>)A9Cl9G~A6a)<>t`bP0l+XkK1D6$~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/46.png index a6194eff9400ac9afbf75769056aa5e2c4522eb5..c8210098a9746a6f5b9ce11985129c06f15135b2 100644 GIT binary patch delta 147 zcmV;E0BrxA0j~j&B!5~-L_t(I%VW6z^WT3MW*`#meER19fv-?K|NcQVl41ZzGl&N3 z1rZ=jiUA#P#I6^W(H#bB$GC@N_HoFx%Rtx|D002ovPDHLkV1j3g BIjR5v delta 128 zcmV-`0Du3l0i6MmBza^>L_t(|oMZg=@85q0C}3h@Vq_o!!1NsY&cMJ#ibiC>#Kgq- z`Qcp#Msi$m;OoEtpC8^O)y`2c3TOxzku!z^H*raM^R?TE$QYymUoBNe1_lNO irbFLRO(Yh;^Z)>a7AzIXZJ(F`00003{r~^~ delta 133 zcmV;00DAwr0ipqrBz|d0L_t(|ob8jb4S+BZ124Y|4ZAQc3!n@^gHmLM2&Ho)(F{Ab`=tfSpg@{6FyZ-~anRfqKX>0Hhg2 z|NBR#0U(<}n#nc*)wEFqMhzG!13-BJl%Y0XyG>qF25AP-WE%j|2*NARU-=IJzbdre w=^N`H0000GWMx7}H$gElG($x(Lqah@HbXKn9IRf800000Ne4wvM6N<$f>aeY@c;k- delta 134 zcmV;10D1qa0iywsB!6m2L_t(|ob8h_4uBvK1ot+6#m2w*T0dZTgpHx#4aCqL7HR-1 zpl15nOmQcw8u3C>P{HSz0I)^OAt~NjNKe6jY4pyPIr&giNslxJ#=xHmc&^ZddTBe( obpAkkj26~q7670LHq)$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/7.png index 9389a374a849c1b4949ba0432c900bcf21bbc92b..1852675845a79bf2c04102fd0345083b2d9b01c9 100644 GIT binary patch delta 128 zcmV-`0Du3P0i6MmBzZ_lL_t(Ijbr%t@85q)FayP4;9W2ZMgdj8=4-eAgYeF$Z-`Eo z2fqFTs|V==8vqj|)&Q7gV7(v?Nb~)l#2Wx}^~&>C{sRDl)3-3PJ>8-J000nVWkN?X iIYu`^L`5|-G(s{kMK?i-?(Kj80000-`}riGdj5NJr9o$4-okH`1BaelHdvc{qtcgn_E## z!3%5V!_V8xPnQ1BkYF`o_^_k~DALSqt}<7cY4-ZNZR+(EX-cNKzq3|48C_lYeubJ4 bcS03IexX|Qn+>dG3_#%N>gTe~DWM4fdE_y6 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_1/8.png index f44a165981f45d5207ded1c33ffe7ba7b6104b74..be506103d9e5808846f566c57bad2f3f93ac5f34 100644 GIT binary patch delta 133 zcmV;00DAw60ipqrBz{dvL_t(Ijbpg~^WT3MW*`Ur`v=iTkpUn~wgIDH6bufq`P%LO zAiVSG8={l)fv^9->OuOz2EYV~H2`KASTBeJ(o9Nbg1LI-`78ec=p$Do%MX(S{iC8a0`8cbX*c$6U}yr(J9z=Tm*M^gUR zxdRUl_{Pk;QS;VJiP^}&!RYey_HxfnH^aTBPHY5%mlw)IggaRcY#FKrWt~KvH9s%_ Nfv2mV%Q~loCIG)bWoIywiC|Q#X000|ZS_|Mkty=&901#wl lLPs++GetB;F+w>)Mny9+GDi87I~)K2002ovPDHLkV1kVMF4O=3 delta 119 zcmV--0Eqvf0h9rdByd|vL_t(|obA)Q4Zt7}15ls$-zEznhDZ}pFatt#KAQZ>fRv8c zTfV|)k{l`aRC&p1v~yYhB*`UtsL!NF+|M+-ZN>&{`!UrH Z03C&!Dplz4sT%+Q002ovPDHLkV1nQFGP(c& diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/0.png index 21072b647eb323bac690cda2471f88c58a7aae9a..89b2c45ce65f47d6876ca5b4ce29868312754a46 100644 GIT binary patch delta 174 zcmV;f08#&&0m=c8B!6{DL_t(Ijonj03cw%?%Qt+75AXx^AwH&W?#Q5H4(5>Db_kT3 zrlwW^2oVS~i!nxI+**rT>jdU_Mh>|dBNOg^CQ2zwkV9@Z#PdqMcU$4r0@c5Y?;?{0 z`r8#?%_YDg?Fz8wPXh7~07*qoM6N<$g1reuWdHyG delta 126 zcmX@bIGb^TN_mo}i(^Q|oMaO-vwcS$)G9td<7MV%W@bLTIsJUq3Bw1^&(E**$zXcx zlGU<0*-0!VJ$=23oAD;A9gIgZjxBm8FYGtfr74h^t&!2k*C84zQsT$c=P5B0}BHK1H-dt&w9u;gbA7R^XJcYVl*ME zV?q{WXJ@Y@Ml-THxBC*P!|?Ox&psUL|Do~G!;A?4 Xfg3K^lL$|w00000NkvXXu0mjf^wBh3 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/10.png index 5c7e86d52dfcd748a468820767e3393334886fbf..03c3dd8199cb16e4b856affd5a9997dac002244e 100644 GIT binary patch delta 116 zcmV-)0E_>E0g(ZaByBuNL_t(Ijbrfj_4OeIGcYjxN5SM6keQkJ-^a&?d;@xWd%=c~ zZ2(1Hz%X#sfDvf`Rq_JGNtxozgp2`ZXEu@?lnPk@000nVWkN?qMnN$_H$*`(LNPQk WHZe6$3?4}U0000&s4n2-h8+1V?J(TuE)k&-Y#alxno!^VISm=b^f{5b&tC7ma9ii2l800000NkvXX Hu0mjfW8y7{ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/11.png index f5d442720a61c4d5b3c2a724e7db75ddf2549d72..ff1e5c82df823e2f8542e3fb175c9dbe5042f3ad 100644 GIT binary patch delta 121 zcmV-<0EYj1mjRF@b3#c(K~y-6WAOF$^`Qhaj2bX%z%VfY2>v5uA~gI*!wmm3Gc*79 z_VyBO07xxJ58MDBA0M~?F$RFtg7m-*pu`IRkheCHM6-r-IDiYpK^(@JQ(hsZ3blk5`qPht z5HC+7Cn91GC8ny@S~IUpDVB2{M2|B(c)b>H^xpSIN@*!Pc>O||pHyqrl`dC+em8uE z3@fl-6u`^@;FF>NX1)X9{Q++SqCvtt1SuM2ydLEZO(a18AuAZn*Z=?k5M*USM>j-4 gLNGEiGB`9tG(<5pMdxzUTmS$707*qoM6N<$g0t~LSpWb4 delta 117 zcmV-*0E++40g?fbByL$rL_t(|oMSXLHonC`CV2Da4Fd}U0|UdeXU}@bG2rLVpM6Yd z0_{X00000NkvXXu0mjf)i^DT diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/13.png index 7208cf13d163861384da1b450213439ca38408a4..2a985677a2dd86bf2f7b5f2bad987aac242c01d1 100644 GIT binary patch delta 142 zcmV;90CE3}0jdFzB!5*&L_t(IjbmV7VE9iVX87;p)BV7M1Rrje={ZUD&76d3>tj8Owd4WKw7QIeDadz3uh wsg5!10000GWMx7}FgHdqH$gT-H8n9dHbOEt?7Cy100000Ne4wvM6N<$f*MXYfB*mh delta 111 zcmV-#0FeKx0gM5VBxqAfL_t(|oMSXLHonC`CV2Da4Fd}U0|UdeXU}@bHG~P7^YiD= zc49Okt7AeIWM^luBt|o`I=BJEXvU_F370}*!KeX)&VV7B65qUeLySJ0005KWDqDAc R@ZA6a002ovPDHLkV1o1GEw%sv diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/14.png index 24e7749d34507b3a5206e3aeb53bd5ac2fdef8cc..1220334534d535df5ec55ce7b56810fb2e73da5f 100644 GIT binary patch delta 95 zcmb=fo1hY<>FMGaV$qwNl92G@yaQu`iJ955GYp=do~L*|eEs@W(lp^pLm;z;IRit? zM&V8-+wB1i3=9G(sZQ=DCKi^Cu9l9*&L&RI=H^ZtZa!HAlwbP0l+XkKaN;0X delta 92 zcmb=co}d!$;C<@>DQx{QtES} u>CKxrQ;%f0g}KM-_edG&@JKAw6lD1JSw+9L@y~GvAn4H1+oOf(-#1;Opz_Lkh<50;vYT41s%rTmwL1LXiQWfE_pkK(R4uz+fZ~y=R5M*USM<6#jG($r*MMgP8H8nFh VIX3O8;n)BG002ovPDHLkV1n^ELlOW0 delta 120 zcmV-;0Ehp>0hIxeByn6xL_t(|oMSXLHoo=j*|Q!7G5{MJTL}|68e!nquU|bV2K@Z_ zvz-`?$m*Do1=-ozD~ZvJtPXAfF`BWdqbLkU4H%RL49%3t^5)GOhMzxw_Tfr= aW=sGd#4r+3Ibn$+?n!b9u6fDZ_&NV|fn@=ka_ zL~;cH84{0D3t+b1`;st^fc45M*USM<7KsGBPnWHa0RcI7Bu> VF-7v2$yopZ002ovPDHLkV1l|4JRbl6 delta 129 zcmV-{0Dk|&0iFSnBzk2@L_t(|oMSXLHoo=j*|Q!7G5{MJTL}}nni&`v7(RdgEX9N@ z@bl--c49Olt7AeIWM^luBt|o`I=BJEXvU)M9}`ZMM1oNR27v)gLq8=lFv`oz-}?Od jvlI^X|Iqm8Va5ai*TFHfh(g9>00000NkvXXu0mjfWtcXA diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/18.png index 15ab6d09fbc7cfead98efb0c22f6f873cd193379..2b771bdfb739314bf282f971cb53f202739c3b19 100644 GIT binary patch delta 141 zcmeBUT*){=r9Q;d#WBRfKRF>G;YWW@Ef9Q2Ecwc#aOn8)=k;l6Y8TlWt~7l)z{|k- z<=Z!*Tm}!_Gfr$>dmTKO6>YK(tYA!FR#8>`AKWC_)7uNA3_mfglwfF;u@+kWN^&~` r1A{Q=6MZ3IR;NxHb0kjP6X-TFhEdiWj&1_ptY nR3~>Q6H8}j3u8l969Y4614qNU$-OE-IR;NxKbLh*35-numBlW- delta 121 zcmV-<0EYjh0hR%fBywFzL_t(|oMSXLHoo=j*|Q!7G5{MJTL}}nni&`v7(RdgEX9N@ z@bl--c49Olt7AeIWM^luBt|o`I=BJEXvU)M9}`ZMM1oNR27v)gLq8=lFtM?*l@Oy5 b2VepK-h(X=(J*Tq00000NkvXXu0mjf0JdjDdkcASKnw-PORv$i=|b#nRZw$k^P_Px# delta 112 zcmZo=>}8ywk{ROZ;uumfC)vczY~N7_wTjQrc$pV3S&|~Plg$7G6pQQr{kiGaqn1+Y zbE4_Zn>SOBWVnU7$LjY;8R+mx%+j0~7#H{N+Vk`CmlmA(@BDaiyQDCKK!|2kg7wFj P3_#%N>gTe~DWM4fN_;NA diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/20.png index 939c96b3141238783204af7ddae097975d6a1b6d..117d0fbb5da9449d0adc9097577a284a7a124703 100644 GIT binary patch delta 133 zcmV;00DAw30ipqrBz{dvL_t(I%VY5M_4OeIGcYjxN5SM6keQkJ-^a&?d;@xWd%=c~ zZ2(1Hz%X#sfMH<(dcq(%A;Ho%D0vcV07_B@5ul6#6CgP=QR)Q%c1$=^oTDG(0000G nWMx7}Fh(~wIWk5=HaIpjHA6u{@s~cz00000NkvXXu0mjfSVJ){ delta 107 zcmV-x0F?it0f+&RBxFxXL_t(|oMV)fluTnF6R@$dl`xU3nSp_U;n%NUJtzkJ{Q0w; z7>&s4n2-h8+1V?J(TuE)k&-Y#alxno!^VIiniARA*h?Z}C;DQ_14aM< N002ovPDHLkV1o88Go%0j diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/21.png index 7813b18f05c8198caaadd9a32d54c09f95f23559..c038ed22dec26627fc7b12eb9a72576afec658b3 100644 GIT binary patch delta 136 zcmZodmTKO9hu#EB_^^3%$Z;?$;gszL5iB!UIvD_3Kqd!R&%E_Ffa(D oq&m498X8zwSQwj`o4A-bnz|U7UP`?RlwbP0l)%^o09x@c$p8QV delta 100 zcmV-q0Gt1$0f7OKBwa{JL_t(|oMSXLHoo=j*|Q!7G5{MJTM472q+}X7nqhzmne+4K z&vs%oA**9T7G!5Uv?+fMH?42u+Cqe9k2=*S8Kh00000NkvXXu0mjfgJ~m) diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/23.png index 3a99bb43ee6b8dcd7f4363d9fa9541521767bdcd..0eb4b32513d2876c72bb11a7dc6ecbaad1cb235e 100644 GIT binary patch delta 118 zcmZo08PKvh3r&J@jaK2s_f894TtP3k|A_LYHwK_Dg7$=$@j+0oI=#N5)@+{DDf V!ssOHt`MLcgQu&X%Q~loCIIn3C*uGB delta 100 zcmV-q0Gt1l0f7OKBwa{JL_t(|oMSXLHoo=j*|Q!7G6AEcq+}Yoni&`v7?_YbKY#vg zCq@&pIwoX6c6RnkVl*SGqplZ54Hy;%4AGRx#>Q4ci2(qez9ldHqIuc?0000s_@LNGQp cHbz82K|we}Lrl><6#xJL07*qoM6N<$f-@E_761SM delta 117 zcmV-*0E+*Y0g?fbByL$rL_t(|oMSXLHoo=j*|Q!7G5{MJTL}|68e!n`=g(3o2K@Z_ zvz-`?$m*Do1=-ozD~ZvJtPXAfF`BWc`$th2ptxYvfPpiBY3Qd!2BtS}-Vmb?7hnPa X8hR`c+;2fH00000NkvXXu0mjfueC6S diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/25.png index c8d7b7ead91d5c096556eba0ed86664bf0fe8631..8f1f7a61505f08ff368efb3a6e18ba14d22ab04e 100644 GIT binary patch delta 107 zcmV-x0F?iM0f+&RBxEy5L_t(IPh((UVEFIjIBs#!C-49O01#wlLPs$;LN_!qHa9^*Fg8RqIYU)f+gtzu N002ovPDHLkV1gLECnNv> delta 100 zcmV-q0Gt1a0f7OKBwa{JL_t(|oMSXLHoo=j*|Q!7G65608nGJi^XJcYVl*MEV?q{W zXJ@Y@Ml-THxBFMGaV$qxY;p^A03t5bNqztkStYAERl!4)pps_&F#r+Ey7#IXnQk~q* j9bGIf44h32%njTuos6AMfBE4BlwbP0l+XkKsAn6+ delta 80 zcmd1HpP=Gx=IP=XQZXla%9JTS$qN_^0vAahZkTUhzfE{CXQZs~CIxHjYE{Eo6R#Tb ktuv4?O)!u!a0*sp*q$o?Q&`xghXDvYUHx3vIVCg!0E*=rzW@LL diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/27.png index b45688e3749c4ce78cfee2abb5b293eef871a806..7229c32f495ee062c3d83467f2979cadb67b62b4 100644 GIT binary patch delta 107 zcmV-x0F?iT0f+&RBxEy5L_t(Ijbrfj_4OeYOG--q_wn)h&%nU&pMhKh?CtF-Gr-u` zc+`MV14a#?MrML#X8`b8IBpIfj2Zv{01#wlLPs_+L^nY&s4n2-h8+1V?J(TuDPZU8Zwv8ek;Q5c}OVAOztGk|I6r$oxb002TaB}}YtgI)jt N002ovPDHLkV1ma%F(Lo} diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/28.png index 065eee8d3d21dce78fdc44ecf9ed83c95dfc2f11..08e6e340f7493f68de1c92611b17a5046a176a41 100644 GIT binary patch delta 140 zcmV;70CWF}0jL3xB!5#$L_t(IPh((UVEFIjONW(A(P!HiT>gFuXvD0qA(tfKdaeX8+p delta 109 zcmV-z0FwWx0g3^TBxX@bL_t(|oMSXLHoo=j*|Q!7G5{MJTL}|68e!nquU|bV2K@Z_ zvz-`?$m*Do1=-ozD~ZvJtPXAfF`BWdqbLkU4H%RL4AGSM=FJ;o^x*^mGKwpe)6caV P00000NkvXXu0mjf)(S1h diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/29.png index 9ae683b2faf87ef33b3ef7dbb80cc7972e28c4e5..ab4b6324e9f0b6c012d29b394c5bfe738ba49624 100644 GIT binary patch delta 120 zcmV-;0Ehp7mI06?azRN%K~y-6?b9I<05A+g(b%Yt+DL^&Of_e8cVjIb`1G+40A7`u z-h_zoCR7zSec%Hl;CW#JbhjnV0ZAq~2ks7`V>wajKb1cK000nVWkN?qL^d!(G&MIx aMnN+|LNh|>C*bq|0000c`n*j(Y7T5jzbJMR!Ev3}w zMAMr$Z>Ao}a0_#f)$frq(BYA2)cpAT{Cr^shG6wotna3HF#v(5tDnm{r-UW|k-#Qj diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/3.png index ff0a70775d7244d3202ea8b71931acc886e16f9a..46094883e7d391e1a12c542ade81de35846f94c7 100644 GIT binary patch delta 152 zcmV;J0B8S}0ki>-B!6E?L_t(IjbmV7VE9iFHa0f?PYkxVxBu_s;{(=|nVAV^Ge}BG z{wD>4H1+oOf(-#1;Opz_Lkh<50;vYT41s%rTmwL1LXiQWfF0=uP#lP4M)wV*Ko0000#`CFeqf0n|b{vR42 bJOd@QXjs4{ko8)U&jW#mL3U a%+kcn!qR2yy#Q^X9D}E;pUXO@geCy-2`)bX delta 100 zcmbQv*vL3RCDy~!#WAE}PO^!a*}kI=Y89WK@iH%7vLr=nCz}BXC>GcK`*YK;M=hn) z=S0(+H*cmM$#4sEkJayyGSK0XSfn|zw|8xe5Ho|gh|1QGMX{0$K;Y@>=d#Wzp$P!S CX(gKg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/32.png index 388572ddfff211368784d48c5e16ee5acc4c6c41..1683651f925860bbf1406bff64a0eb5c35a163e8 100644 GIT binary patch delta 105 zcmV-v0G9uBhXIfzV=_rZK~y-6WAOF$^`Qhaj2bX%zz8*ffq~&a3MR*Z-rnB-nVFg7 z8vxSmuOcQSre}s q@~tzFFikL!FklLPbbh|QIs?OjZOSEXcZ4MwfWXt$&t;ucLK6T#s2yzp diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/33.png index 2fb077dec9e23fabc02171819a5351d088ab0c6a..58194e0f4088f8a9365eda4a1338bd4890434d37 100644 GIT binary patch delta 105 zcmV-v0G9uDhXIfzV=_rZK~y-6WAOF$^`Qhaj2bX%z%VfY2>v5uvJA+~%>3Wm+e^Ly zK0ZERL&!FO5-$J%(e^aa=(^#%0000GWMx7}GdMFeLN-A)GD0~rGdDv;$=5F700000 LNkvXXu0mjf3$!Si delta 88 zcmZo?ESsPbWb5hT7*a7OdCHV2KFJFh3<4KP9&VU#U%yRwF=wQ#@FoRo>uOcQSre}s s@~tzFFikL!FmMT0l9rCJxO}tYK7B*2RuL$|A$urNxt8y0NX>d2lf`Xi#C!+<7zAb000nVWkN?n iHaIsoMmR+{LNhcqF*7q4$j&eT0000C84zV+&s4n2-h8+1V?J(TuE)k&-Y#alxno!^VIiniARA*h(ld002B*B!9LZcaH!7002ov JPDHLkV1mZkE-U~5 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/36.png index 81796a4c9b653ecffa2b02217bd644a0684401c3..f7e6973e3f9dbaa9189e111e1f79770dd0ff5331 100644 GIT binary patch delta 177 zcmV;i08am#0nGuBB!75GL_t(IPwkS?3BVu>1+#{8IDiYpK^(@JQ?3xvLW_YyfBNx6 zLheXJ5fM{WODS2cRd+%!46JaJQo;h5A;>w01u(zhOMx@*38Ej#nIVXNWoL$9&JKKu zSZmFC?`MHYoL0000GWMx7}Gc!0s fGeS8tG(|-;G&ng#;jWR|00000NkvXXu0mjf{TxJm delta 126 zcmV-^0D=F_0haU7O#lD@07*qoM6N<$f;|>FHvj+t diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/37.png index 87b19417dc0533bd4392216f933db7cdc893f9ec..ba0935e6235ff35726e84876f583c4f39ba1409b 100644 GIT binary patch delta 134 zcmV;10D1q60jL3xDStSPV_;xl`0wN6^IuX@^1rXIuMer10c3!^y**_H7#kap8Zc@A zPNoG9WWE^M7w|FW3N(OGv?RFMtezu|Z)13Rq$=h8IZ10NNBh-pkF>vH$=8 o5M*USM>aJ=L^3fjF-9>rH#RdvLlwrtmH+?%07*qoM6N<$f)s``qyPW_ delta 106 zcmV-w0G0o!0gM5VDPwq?V>C84zV+C~t>x+B7-G?z{N?M{uZas74Em%DvJR|Z6kt|SRsA2F(y(!(VJaJgp(`5$ z!&Cv`PD$pQ9SjT%0x79Z?uI5t=9bRpW(JPNCZ-lnu8~~#Ie~Hvp00i_>zopr06>); AMF0Q* delta 99 zcmV-p0G$7SfdP;tT}VkpK~#90W0aJXOk;0>TCA%QfKos_|vkTEDkNx>jZy}iBvGcz+G27m&C7!2|=%-JB#a4%pu zi9`$lLx4N7<|H6g0000GWMx7}GDI>(FgY+aH$pHuK|?Y%a1W_+=>Px#07*qoM6N<$ Ef_q*)0ssI2 delta 123 zcmV->0EGXt0hj@hBy?X%L_t(|oMV)fluTnF6R@$dl`xU3nSp_U;q&LuQYZ%e{Q0w; z7>&s4n2-h8+1V?J(TuDPZU8Zwv8ek;Q5c}OVAOztGk|I6r$h!ud3pI;pFe+=!lC{j d8XrB(m;hUcDs{#d`I7(u002ovPDHLkV1kNZInn?C diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/4.png index 37d231375dc6e828a2f4cc9bde551dc8b6b453d1..cca39f87c9ef5ef9544cdf7543e40dea733249bd 100644 GIT binary patch delta 161 zcmV;S0ABx&0lfi`B!6g0L_t(IjqQ`M4ZuJM1HA@wFaQhq2VodycB+3VQHqeSBBiiI z!wE|q0BAE1NoA(y91(K&M*#q3rm9K+WM-}4deRt!ovaFG)?QwKh}Z+T`w#dO;MRpM zpsJQT?MIsKkUZP?w!#5ARX(4g#>52x000nVWkN?rL@+@$IT|uGF+ny$H8(Ow7YcHD P00000NkvXXu0mjfGb}wo delta 113 zcmV-%0FM8?0geHXBx+SjL_t(|oMSXLHonC`CV2Da4Fd}U0|UdeXU}@bHG~P7^YiD= zc49Okt7AeIWM^luBt|o`I=BJEXvU_F370}*!KeX)&VV7B65qUeLySILu9*M;oiZ)f Tv)#zn00000NkvXXu0mjfWw0+B diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/40.png index 6117cd76d0f8f1cbd7f12a8fbed9ebc78a3295f3..f9222f730a8816d177b13539acde24b6d273e1c0 100644 GIT binary patch delta 126 zcmeBWoXt2vrQFTa#WBR9H#s38;YWW@Ef9DdSr8)78&qol`;+0M&jhRR910 delta 112 zcmV-$0FVEh0gVBWBxzJhL_t(|oMSXLHoo=j*|Q!7G6AEcq+}Yoni&`v7?_YbKY#vg zCq@&pIwoX6c6RnkVl*SGqplZ54Hy;%49%3tC@(L6>+|Q&QaI%Qq4Ckfj0pgi{wdV< S9Zd-U0000Klz?Nh49LvP{NLN#OTGc1oCPw36a(OyiCizhvNHexPC74Y85=YJ000nV mWkN?aLo_u-Mlv)wI7TouG(&s4n2-h8+1V?J(TuDPZU8Zwv8ek;Q5c}OVAOztGk|I6r$h!OHa4~rVl?6aOaNj@ VCDK(krIP>v002ovPDHLkV1i*#Gim?; diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/42.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/42.png index 363c0212d912ca7628597664d1a9298cd1f3b779..3c832d3e6dac4675b7e6d3a9988e0b617609ed6d 100644 GIT binary patch delta 126 zcmbQhIGb^TO1Yb-i(`mIZ}Nw)U%x7{8XFk=aXo~AEdz^tW}jzZU=T=2b#gawHgPpD dHE}UFGcy7jYV>K|Og5k#gQu&X%Q~loCIHuDE@c1! delta 115 zcmV-(0F3{e0gwTZBy3knL_t(|oMV)fluTnF6R@$dl`xU3nSp_U;n%NUJtzkJ{Q0w; z7>&s4n2-h8+1V?J(TuE)k&-Y#alxno!^VK2nGzZ0<>haE{`^@Ahx|V@K6;oj0RT0g VDI}r3^y>fs002ovPDHLkV1k@{Hgf;~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/43.png index 835bee1fb80ff51cb59a7df1b47c9d1a6b4f4b56..da5cfb8f8152158aa279e75bed08c6956557f27c 100644 GIT binary patch delta 133 zcmeBWT*Np*rOwyW#WBR9H#s38;YWW@Ef8=ddU~GxZ)ay`V9S%>mzJjH$#&!RZDk&Y z%y)0!s-9#>PEKxNd{V)f$6zSs#w%f(@Ii{Wnf?sNJ({a kH*+&JH!yW^b#ZnvFmy6-TyVlP7bwTz>FVdQ&MBb@0Lx!3fdBvi delta 112 zcmV-$0FVEo0gVBWBxzJhL_t(|oMSXLHoo=j*|Q!7G5{MJTL}}nni&`v7(RdgEX9N@ z@bl--c49Olt7AeIWM^luBt|o`I=BJEXvU)M9}`ZMM1oNR27v)gLq8=_9tHruaV(0u S-&o-Q0000c_nVI?D$H#|!1A2RV!G@4+ z07YKFFmTj>Q3HmD0RX3_G|^=A8yWxr01#wlLPtY4K{YiqF-As2L^n4#H8=LwEU^Fp N002ovPDHLkV1k^MDNFzW delta 95 zcmV-l0HFVg0ez4pSwu-hK~#90W0aJXOk*Guu(7d~Fp;a7fq{YH*RNkaCKVw|9oX6otU7-G?zoRE<4qrayX2s{q*DEQjh+5I;*Ha=<2uw>`C84zV+G;YWW@Ef9Q2Ecwc#aOn8)=k;l6Y8TlWt~7l)z{|k- z<=Z!*Tm}!_Gfr$>dmTKO6>YK(d@yKu)Z#LAiBDnLq9fc4Ygw&Cs{U+z%)r1Pkdo@; kZeeO+;^yMwYGCYQWZ>p#{`_cXJ5Y|n)78&qol`;+0Euoi1poj5 delta 106 zcmV-w0G0ot0fzyQBx6oVL_t(|oMSXLHoo=j*|Q!7G5{MJTM472q+}X7nqhzmne+4K z&vs%oA**9T7G!5RY63H8At>sEy6IOwaj0w9yM4SQc{vlvyzXG1e z*aAqZs`i1*9N(S=#*ua>^ebP)7d>;|K+?hh000nVWkN?cMIJIVK}9(*IXOWxLoq`+ TrONW(A(P!HiT>gFuXvD0ay$iHDCl9KygCCnv^NdOq6720ESmP@Mr5r t8UO$Q5M*USM>jGxGD9*kIW>t%1b+?Za19;AVVwDcDJ)V6wkfWW{{uk* zfGbp$8z3Uw0C%?yU+@K2@ZR>I@csiB5zNf7pt99zftmGSBB*S2TCiE+0I^6r60he) tpa1{>5M*USM>Ik?MMXA6H#RvqLpe1vGc_Gof&c&j07*qoLGcK`*YK;M=hn) z=S0(+H*cmM$#4sEkJayyGSK0XSfn|zw|8wz%vt;Te{&cZ6jC(|WXkWeG5~?6tDnm{ Hr-UW|$VDj% diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_10/8.png index 8bcf7ceffa56c7d62196a491bab20a475ed26d7d..a8df5c674aba381a45bbc67df5a24e6decaf3951 100644 GIT binary patch delta 128 zcmZo;T*Np*v(lnBIUyn8M}JQ(5O^HqQSi01v-@vsY<$w3Vad+z+o#tsYkXo_Ddom1 zF^_G+tO*ycPM$NxG0PzFVdQ&MBb@0Dy8WsQ>@~ delta 100 zcmV-q0Gt1!0fqsPDP4G+V>C84zV+##TbE=AS=*P5=O>4=AdM68_i#0000T+TQ_r9Q~h#WBR9H#s38;YWW@Ef9Q2Ecwc#aOn8)=k;l6Y8TlWt~7l)z{|k- z<=Z!*Tm}!_Gfr$>dmTKO9hu#ECB)b!%$l%4%E2q>SQdlk%+6PF3=HpFEP{iNERadI@YG&kYu{~Q98WAJqKb75KMl+XkKOQ140 delta 102 zcmV-s0Ga=%0fPaMBwtENL_t(|oMSXLHoo=j*|Q!7G5{MJTM472q+}X7nqhzmne+4K z&vs%oA**9T7G!5n+a07*qo IM6N<$f+$ialK=n! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/0.png index d637114e9e1f9eb2186b0704d012f88562f288e3..b585f9175864fb93267792e824acfb63bc9d5db8 100644 GIT binary patch delta 191 zcmV;w06_nD+yRgze}_p#K~y-)W8mQ6{Z9#IfH73?pj*@j+@) z41g&zQ1K#YBTNlU58MEBoA6;|^$b}3g#+LX1GtF<08A|?oUpop7z1DdjS+~X7=RIo zq#A$`1{51WY9Qit0a?+Ao;(R*K!2p`(ZMh+3_#%N>gTe~DWM4f880G{ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/1.png index ad20bb5b4a44f122d57cf25cd2398298cbb06689..1692d7c59062c10d66ce86887314d69bc050b4a8 100644 GIT binary patch delta 182 zcmV;n07?IK(*ckqe|||sK~y-)W8mQ6{Z9#IfH72=j0W{TJYo z_%9`*0p^3)Ff7O?1u+1o(LlwEJQu)hqsR*=f}{YLCYTEtNCgzx4l@AR{{v$H#a^Il zAd(f0AlpGnne2oFOTsX3Ak(n)58`9X6DVOoPI6|TG&=(TFlXty^z%Vex&QzG5M*US kM=>xrH%2u%I50#+GDI^%G8=!A>Hq)$07*qoM6N<$f}T-FL;wH) delta 87 zcmcc2SUN!^(8klnF{ENnvWbaF%}EEgitq1anL$9=d#Wzp$Pyo1|Bm2 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/11.png index 32683a36ee8499ae90dba07179c912a6be79f534..350d73fbed5e02434505114ca3c5631fa4a77b5a 100644 GIT binary patch delta 122 zcmV-=0EPc+m;sO^bVEr*K~y+TV_+BsqhNRd4i4V`=$It6AVOSF<-d(V7|{lR)PnTD z4N#Y}`VTXRkO43?Fgt<85M*USM>#k*IW$2z cIWaUtMnW<$Ia3w3-T(jq07*qoM6N<$g3J0T*Z=?k delta 77 zcmbQim_0$o-N@6$F{ENn@{}o4V$L`)CM3?pj*@j+@) z41g&zQ1K#YBTNlU58MEBoA6;|^$b}3g#+LX1GtF<08A|?oUpop7z1DdjS+~X7=RK6 zB7AcH1$ZQgHUOj+t{!Fp50?=62Jmr delta 87 zcmZo*DxIJbXyfVP7*a7O*~G-8=A;8##rJoz%pf3aIcp*#chAR1N4sN}Wc>O4Jzpd= o#vtp!3dZKc3}O-MqzuFv82aY&em}9Xp8*6sUHx3vIVCg!0FiVcE&u=k diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/13.png index 6a9006544fb6885337b7c7075f2d5679bac20958..a05b4f40acd27a8f4ef0d68cfa5ace69df7218f4 100644 GIT binary patch delta 188 zcmV;t07L(9*#VFwe}qXyK~y-)W8mQ6{Z9#IfH72=j0W{TJYo z_%9`*0p^3)Ff7O?1u+1o(LlwEJQu)hqsR*=f}{YLCYTEtNCgzx4l@AR|6~~;!Y2og z7K#i2#W&do@NtWQG1&&dQX2@9Yyd1t!jdUj2EZ`IULe~5Hjrj=Qz8Hv@PhKzCuAA` q000nVWkN?VH!?IeGBiOjML0r6I5S2dJ4!+T0000gTe~DWM4fom(4P diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/14.png index 88aa3cfff9d5325271690d01de9bc5abfa355579..d096df52684a4602ea55be891434bd3673b96e25 100644 GIT binary patch delta 112 zcmd1oW1OIpW$EeS7-G?z{NTZZzy6$Q6ND}@7_(HUJdjXfJEUO7KV2ZkCnkW^b*{qv zEA?z$u?`y<7bl4HFc~l~I34r&oM0C+pMilvASKnw-PFb0$<5r{#MIQt+0oR+a_z}0 Qtw1>jPgg&ebxsLQ0F{p<&j0`b delta 75 zcmeBU%$%U&YT)VO7*a7O*~G-8=A;8##rJoz%pf3aIcp;0>27iTvcM#Uqk0mi30E2d bnH3lqtfsQx(o+7L&j19Tu6{1-oD!M#0#*P0MP&|M1rCRj|+kTCjbBtWMx7}HbF2pGcrL$ bH$^l!HA68maOlmy00000NkvXXu0mjfsE$7m delta 79 zcmX@bm^(qm)5O!oF{ENnvWbaF%}EEgitq1anL$9Fe1Cs`U`XM? g6^x77dZZW_8C;~ewcoh2xiJ8Nr>mdKI;Vst0Ar9E!~g&Q diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/16.png index 5c506f6e404a2f677ee81e936397a7fcc76ea698..aa298c7db18270e38a302f6bf23699e47fb11462 100644 GIT binary patch delta 195 zcmV;!06hPJ0p9_TB!7xYL_t(Ijbq^8;Qi0XE%qNogD?Xg08@jE!GeN(QbZddE~xU~ z#vlyU00ABeq76`&v-%G+2yOrmm(YI^J~^Vj0Md+MfRu;^Wnlm}kyHQ+1BwlR1teJp zz-%Ym0F*!>*8qybfFf65OP-`)umJ`tUMSu`ra>4MLm(QI;5=YrAdEG6lI#LXFaXA% xpW_qzBFO*%01#wlLPt0>LqRk_H$g!`ML|VELOEPmR_*`*002ovPDHLkV1m0(MnnJr delta 100 zcmcc5*vL3RCDy~!#WAE}PO^!KNzKUv2M&CAbhJB`M}@)6%*>n(2-Jd15}9?LWc~U2 z`nuk#9SK(&0-4#`8Fk*@+nbyK1V4U%&%e^JgMndI9>4Cv!pW=*K;Y@>=d#Wzp$Py6 C5GZ#5 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/17.png index 86db2d5c1db73f57e8f55baf36179eea12fd221f..d8b7235fb83f7f6820a71fbf03eb1424323ce119 100644 GIT binary patch delta 201 zcmV;)05<=7<^hl-f00QT9_sqgRuYNf+|EC zz{f3yFaV}eUCxRq14Q`b{tNO+p&9@)gct)rYEcXzH4IP;AQiw2fQJD&27tl<9t-3c zfD(=57(i@z(ar#3qnx1aIMV?kjFRj@AqwJvXcz`bNQr2GLou>*k)3a#;zgbdFp@nv zUO>hGvZtTQ?*=_e0000GWMx7}FhoT|MnXhIGeJTyIWRCZf^Jas00000NkvXXu0mjf DW2{V{ delta 93 zcmaFHSUo`{+{x3$F{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnRS-j;$gnO wzg~P{7q=U)glR&7!~v$$p&PdNmWwkmXjSs7E&4sNn*j(sUHx3vIVCg!06wE2X#fBK diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/18.png index a99df87ff1170031e5c11daebe623398d93eb842..d55fdb5cd91649f7fbf473fbb7628ce3b240ac34 100644 GIT binary patch delta 155 zcmV;M0A&ArxB-wPe`85RK~y-)W8mQ6{f~|rZ~&}oVGJ9Cu>azMDg+GxsR5})F#x7f zUCxT20WdXi%U~Rs05M)bR?k3j7>t5p0kFj_DVRZkM*^IxKr{@4B&0+%z!)Y65(Cl5 zVjxVp3n(=J04FAc@1bxYeE9r4LNGQlG%z(n6)-h6F*KE^S{ncW002ov JPDHLkV1nL?G>iZM delta 93 zcmdnNSUo`{+{x3$F{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnR_Npn$)dn v*pMXNBV~|v;DJE{>$KJT>i_E*Dd;gU_^EI%T9_sqgRuYNf+|EC zz{f3yFaV}eUCxRq14Q`b{tNO+p&9@)gct)rYEcXzH4IP;AQiw2fQJF802T)DSRfT( zL?fvHW&j8eoB>iI8mI}0qG*H(fRZvP2B72xSP~{SFQ7ytK+IO; z0J#!{JFVdQ&MBb@0Bj;5{{R30 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/2.png index 0dcadb8d0a3dec3994ab62595db436f682f2d7c4..d9aaa2f3ed4f2b7e9475335a4abd8a20b12f65c6 100644 GIT binary patch delta 133 zcmV;00DAv;qXCd4e@;n6K~y-6W8mQ6{Z9#IkP^`VGX!`f;20zZ!XP#emk?Y`Tu=o? zogkmoe+G(OK(PU%U=)A=#R&>fA( diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/20.png index 5a1218563b7030e0b7e9d6db9b4b97f202410308..fc2bf2c9efc9d8c30587ef1f66948994edbb6df7 100644 GIT binary patch delta 137 zcmV;40CxX(rU8&7e^E(9K~y-)V_+ZwaB%ScN5>4L8XzvH^54cFjC=#s<*fe03?j<_ zm}ZI$AUh030j&TjQG-=2DajKi4^j(HNTeiBWHm57BqdLDbtndq8wLRXUs!%paqp%8 r000nVWkN?rGchzXLpC`zG($5oK{hh?1dY}J0000azMDg+GxsR5})F#x7f zUCxT20WdXi%U~Rs05M)bR?k3j7>t6U1}Kh3Qj$GR1Bgxbcnu&X*%KWG0AyKMettQ` tqW}N^5M*USM=&-tGe$)+LP0n*FflSQG{X3};s5{u07*qo1w^hwV1kVQF#-Sp delta 92 zcmZ3%ST#W<%+b@uF{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnR_Npn$)dn u*pMXNBV~|v;DJFyYfNwb|9`!Uy0{tEsB$j*5MnIL00f?{elF{r5}E*5kRm+* diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/22.png index bf1c0203252ca63fa0d8e556570088d752c66731..5b76e3cd1ca7a564589a0749d159410ba78c0bf7 100644 GIT binary patch delta 121 zcmV-<0EYi@mjRF@b3#c(K~y-)W8mQ6{f~|rZ~&}oVGJ9Cu>azMDg+GxsR5})F#x7f zUCxT20WdXi%U~Rs05M)bR?k3j7>t5ZFgySNIodk^SIdQ|0000GWMx7}Lqa()Ml(1= bIYUJ>GDSr=0YX>X00000NkvXXu0mjf6a^|T delta 83 zcmbQvSU5q&*TU1qF{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnR_Npn$)dn l*pMXNBV~|vUXFC6X=jYG>000nVWkN?oGB!py eL^(7xH#RsnGB_}+3t#L20000D(}W2U j2aX+kb_|Hk67(1tb}ZvG(y|oLU;qM7S3j3^P6H&}>f0ao@K~y-)os&TefFKNoJxZBmNJWQE9s2)&(0Ij$vO{h{Mq_^4 z-b?5GRN}Z6yz#i7g`7F;B@D}#k1fSR4WObN&;W8gx#$}}I|%jywsc9rk#9Qy9|&py zLIVu|<2Eh;Kth^q1W^m%e9@8x06|!k4gef$L_~F>s%^v}N3u}^;E}1aMnqvFjnE6I zFQDm1sxROJxu}$&Dtk^00000GWMx7}MKLx*G%z+fG)6)+Hbpr@A&4mx00000NkvXX Hu0mjf!hcSU delta 89 zcmaFGSUy1|*v`|%F{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnRT9I{rUHI sH%DlULDqp4jLnA`rj@_H$Ge7`;rKaj-GGz3;u(Oz)78&qol`;+06hUB&j0`b diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/25.png index 6a779e5a64af05489081e52467fdf58729c70922..d5cd1ba43fdcf4c66e66fd7a17742068ab91c096 100644 GIT binary patch delta 158 zcmV;P0Ac@Ry8)0Se`ZNUK~y-)W8mQ6{m;iO_8&xpFaxOoq)CuZiZTNPcqAw@fQL)y zzX+ckWd=xzXiydg;({uag#pC|zygvi13&>tu>qifB-;Q`N`$3GvZE0e4kQ}@(gce} zvJId(7GPc&kc0#P<^4)x@W%^N0000GWMx7}MKd%sH$_1;7)C=hMnOYDF~=;|!~g&Q M07*qoM6N<$f}9UGc>n+a delta 70 zcmdnZm@+}dLEF>CF{ENnvWbaF&B+4?4t#iYv^$n3g+Z;zq*uxy>%a=e84XYG?k;D3 a&BV}E%YJLiN*fmjAnq=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oJj5sCl+ delta 55 zcmYcbo1kJO>*?YcQZXla%9JTFXB-$47P)+0!MK>MN6KIZ4+8@y7bD-Rlz>|dK;Y@> K=d#Wzp$PyPbP^8$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/27.png index 446f3934e323c1956f81cca664a131a59b4922f7..df5c0dddeafb17e243cd1b4796b5c415592a451a 100644 GIT binary patch delta 141 zcmV;80CN9mssWHBe^p6DK~y-)V_+Z=aB%Sc7vPcj&%-73AH-%L*8o0lG4c%%;gkC> z$R|a<0pfxxgTMfa!+_#gpx6Kq9ykM}L^LQ1M5;t1MS)0hG=eZiUVy~}hz0=HtV%yw v6Xml2000nVWkN?qF*QX(Mlv@=K}9h_LpDVpR`!wr0000<2SrXqu0mjf^&2zn delta 74 zcmZ3*m@z@cMc>oKF{ENn@{}o4V$L|QB_t;oCno@blDn}{f@1jN@9*!su6WcG$n3@| cVamY7;1nM3sPf;& zAPm(20UimW4N#Y}`VTV*ZU7IL(0>s=IikG)(u`q%l!yjpVE{LgQ~(PDiVc7TBv}T4 z0+3<@Kmkd%0icu!OO0e10J0qx4kQ}@(gce}vJId(7GPc&G?0V@0C=Wn;mM=xY5)KL o5M*USM@BeALNqrqK`=!_Ha9mzHLrL83GD;*)uz`!fbedmMQR#yff@O1TaS?83{1OP?cA;tgz diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/29.png index 2d1d4bd169effd4eee529076321e7afff5a281a7..80d268c0ecdc176f7f737b108ffb1d0f0c9d30eb 100644 GIT binary patch delta 137 zcmV;40CxX#rU8&7e^E(9K~y-6W8mQ6{Z9#IkP^`VGX!`f;20zZ!XP#emk?Y`Tu=o? zogkmoe+G(OK(PU%V8j86(*aDAjX@YVS(9Y|OryG-75N6h3?bVK$QS@^MP_noWTeFa r000nVWkN?nH#kNyK{!D{G(kp2F+)W}H-q#50000J>0t6e!1;s00K`}KbLh*2~7av<{cUU diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/3.png index cd9d806be3eb4c57148ede6b207f3d5813f44e2a..265a5e4ce8ea15a4a2615d58852089f54f982103 100644 GIT binary patch delta 175 zcmV;g08syZ%mI)je|JelK~y-)W8mQ6{Z9#IkP^`VGX!`f;20zZ!XUP|pbClx5Z}fi z3}FDNHX5jS!3`qI0GMXD0i*z|VL&Q?xj;}*hI|7+m|_FS3IlB6FfaxnCoamPk(`7C zO3Ls+gr#@nya1Ab7xDZ2mw01#wlLPt46H%2is dL^eh=F*Y?YLo+>6y2=0m002ovPDHLkV1j5aKk@(o delta 95 zcmX@ZSUW)_(#6xoF{ENnvWbaF%}EEgitq1anL$9Fe1Cs`U`XM? w6^x77c=(tjZrr$WM*;};)&JKsQqW^yxN68(XZS}rfB^_RUHx3vIVCg!0Ip{ufdBvi diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/30.png index 0a1c5f3b071a0944aa976ec676fa0fe1613e51e5..d466db6d5b502d3fb2e21e24ed96c1f864809541 100644 GIT binary patch delta 186 zcmV;r07d_6*8z|ue}YLwK~y-)W8mQ6{m;iO_8&xpFaxOoq)CuZiZTNPcqAw@fQL)y zzX+ckWd=xzXiydg;({uag#pC|zygvi13&>tu>qifB-;Q`N`$3GvZE0e4usUAV+N2W zSTquAfQ>;IBGzCw6BCFad6-6ZIV*^IWG@hF0L&1$0mLRGG;Co201%63;VI7M1ONa4 o5M*USM=(P}MK&=+Gej^rI5|c}HK`^Tr~m)}07*qoM6N<$f}VOm^Z)<= delta 77 zcmcc4m_0$o-N@6$F{ENnvWbaF&B+4?4t#iYv^$n3g+Z;zq*uxy>%a=e84XYG?k-Qs h{PX*JzDQ^c14G3EZf&miL-!egz|+;wWt~$(695h9AN>FT diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/31.png index 916c1875aafb642ba67678f615a7d0ca7bf19dee..6a1356bce2191ac87ff51e904c4a83d3b8cbcc1a 100644 GIT binary patch delta 139 zcmV;60CfLzr~!~9e^W_BK~y-6W8mQ6{Z9#IkP^`VGX!`f;20zZ!XP#emk?Y`Tu=o? zogkmoe+G(OK(PU%U|0Z(;})a=ltgU|!pJv3UC!!1%pkH1fN7@40CK|s0D$~va_war tp8x;=5M*USM?^F?LPIw~IYmY`Mlv-xK_zIU`~Uy|07*qo1w^hwV1i;&F}nZ& delta 85 zcmZ3%SUf?+-^$a)F{ENnvWbaF%}EEgitq1anL$9)?C7*a7OdCHV2F=reY6BfCAUctDStw*YXLFY-0%+<`v*sAc3DNv5V)78&q Iol`;+0J%dV#Q*>R delta 66 zcmZo;OqifzqweYA7*a7OdCHV2F=reY6BfCAUctDStw*XMg+W?+wlommZrI7d5I2c& U-v(PX4F(|aboFyt=akR{02kL5e*gdg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/34.png index 7ae2161691c4b0bd1ffb000c0e0fa5b31af158f9..b45725e397b0aba23d4d1838191d51ec1653e7e6 100644 GIT binary patch delta 103 zcmV-t0GR)7iUE)*VK|Lr;Nal>kB%8g0WeKA24Vlj1y#s10H#r0&Wd~kV1|(G1+v3n z6bv;mn(VQM0RYjkI{y!nJu(0Q01#wlLPt16G&4pxG(8?S_ELV?5qr*+5n f*Z+45Jj%)tgTe~DWM4ff7l%C diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/35.png index f2cc0827a73378f05b90814595938e2c746ddbf7..bc21c6f7abe0a7dcff354d348ebe977740a788fb 100644 GIT binary patch delta 110 zcmV-!0FnQ3i~*1&Xg5hjK~y-)V_+ZwaB%ScN5>4L8XzvH^54cFjC=#s<*fe03?j<_ zm}ZI$AUh030jEM#POsK|QY_y1dh3_#%N>gTe~DWM4fA0i&_ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/36.png index 13d0f72c47e9ff893c54a4f7fe8a82af3da876a8..eb7ea6b06ed82617a0f662d4862cc3e2245aa6db 100644 GIT binary patch delta 216 zcmV;}04M)}0rUZoB!8btL_t(Ijbq^8;Qi0XE%qNogD?XD08%5sBk`YyO9-MKLdjv z7LddkfDw%_+le&*8Dk2NYXGT%h|>l548f`vW}=Nj7=|P+3{g@GcQJ@CQ1L?X1~QH8 zTx2n(2-Jd15}9?LWc~T~ zcQ;39j6v3c6^zY?8K#xLzh`Iw1b_biHqUa1VPFU~;H!)H6FZjy2s~Z=T-G@yGywq2 C%_g=0 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/37.png index 39fe0e6005b0f3d01062702d6a78abae6b4f271f..a87052bdf67af4fadfee067c9eebd9e5ff569ee2 100644 GIT binary patch delta 174 zcmV;f08#&L%K?xie|AYkK~y-6W8mQ6{m;iO_8&xpFaxOoq)CuZiZTNPcqAw@fQL)y zzX+ckWd=xzXiydg;({uag#pC|zygvi17Nn3Z2&SR+W?BffFf7GY_~B8!!U>#3^u?( z#S6t7$TSGUVhBWo5*$nngi*o(IW|ag0VNm!GzEfW>;VuEC;$Ke5M*USM>sezHa0Xi cGB89qGc`j&HA9Rc5&!@I07*qoM6N<$f-}!KSO5S3 delta 80 zcmX@jm^VSi%hc1wF{ENnvWbaF&B+4?4t#iYv^$n3g+Z;zq*uxy>%a=e84XYG?k?v6 if%^addZh%!85qRxb8B1dczBQj2s~Z=T-G@yGywo6x*pE} diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/38.png index 444c65485d0397b2207ba9f04d6ef4d265abfaba..ef539854ee3a81a51fd94815551c035fda81e780 100644 GIT binary patch delta 110 zcmYf8VVt0nVeaYT7-G?zoFKuvI6sPVN?NPUgnWCQb(CCQi;qMuwXW_Du)M OF?hQAxvX z$R|a<0pfxxgTMfa!+_#gpvVAZJTL};0+B2O&}|1BfK8APwlN5UyMh4}q96{4hGCF| zl!yixBRdz_`35Rp2=j0W{TJYo z_%9`*0p^3)Ff7O?1u+1o(LlwEJQu)hqsR*=f}{YLCYTEtNCgzx4l@AR|6~~;!Y2og z7K#i2#W&do@NtWQG1&&dQX2@965wD9VM!8}Oo=f7IoUHHPN!``UOsHbXE*I5tK$G&nS;)Slb` O00008e^NLPIbyHAFW!BN>tp00000NkvXX1g=70f*RW{r2qf` delta 86 zcmZ3^STaE+z}nNrF{ENnvWbaF&B+4?4t#iYv^$n3g+Z;zM3GsnD0kT`ZZ}>D(}V(v p1BZ?sdv*+@ z$R|a<0pfxxgTMfa!+_#gpx6Kq9ykM}L^KeA2qMriNzn)surUZD$pCmDf(UgvtN$@{7U|^X2m{pMV+^cj3An4L8XzvH^54cFjC=#s<*fe03?j<_ zm}ZI$AUh03!Jq}$;+7Q5AiyI5PE{ZphCvciA{t-}lLLu?Xk;-ErrZUT8UO%;_GWNo vxIORy000nVWkN?qL^v=;GB`m-MnO3?LpC(PTw6K-0000<2SrXqu0mjfOdc`_ delta 84 zcmZ3*STsS!&(hPyF{ENn@{}o4V$L|QB_t;oCno@blDn}{f@1jN_3``50*|sTX6unM mu;58(e7frW{r%lM9o!5u`#F*YWaqLo0D-5gpUXO@geCw?{T^}v diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/43.png index b876f986ef2ca395edc33a15064048534de28996..1c48ba9d4f4e902aadd102c9a43f1f41c852379c 100644 GIT binary patch delta 179 zcmV;k08IaL&;gJne|t$pK~y-6W8mQ6{f~|r@Bom!0FT6f9xfq>T9_sqgRuYNf+|EC zz{f3yFaV}eUCxRq14Q`b{tNO+p&9@)gct)rYEcXzH4IP;AQiw2fQJD&27tl<9t-3c zfD(=58UVrrXMmK524#Urm1v|W5GjsE5T?iru$TbR0D9bKExu9&9XtR401#wlLPt0< hI5$N^LNh}~I5RjzIY#5`F`EDY002ovPDHLkV1n0SUf?+-^$a)F{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnRS-j;$gnO nzg~P{7q=U)glWPR1`Y;>nZewbr6eCHF#v(5tDnm{r-UW|61yAR diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/44.png index 36ab101d0b0df8e47db47541ad9781e1378d0fbc..a993c76b8017ed3e55777d88a643cf36d9bfc25f 100644 GIT binary patch delta 107 zcmV-x0F?h}i2;x#Wi&}dK~y-)V_+ZwaB%ScN5>4L8XzvH^54cFjC=#s<*fe03?j<_ zm}ZI$AUh03!6+EK005S%9e_(l)G#ew;Qj7X~Go- a4hDu~IgTc;cuqD3Ann(2-Jd15}A7@O`6oL zY1oh?-Xmp@b>M+P1M9Tab$@@k2Ic+v{XJhKG=_npmzj6j(py{hF#v(5tDnm{r-UW| DiVh~R diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/5.png index 4e541b128262250c14c2b7faf633ee63c0c87026..fe014b9370e321ad2d5c7fb391c1b9fbef8aa5ae 100644 GIT binary patch delta 193 zcmV;y06zbB-T{y#e~C#%K~y-)W8mQ6{Z9#IkP^`VGX!`f;20zZ!XUP|pbClx5Z}fi z3}FDNHX5jS!3`qI0GMXD0i*z|VL&Q?xj;}*hI|7+m|_FS3Imt{u;?B*13-z4k6R3P zIv^?*_@od9U?fi>4B+7sLKvVfXGL_#g5*W`IYmY?^Ta-y00000NkvXXu0mjfu5m<` delta 89 zcmcb|SUy1|*v`|%F{ENnvWbaF%}EEgitq1anL$9Fe1Cs`U`XM? p6^x77c!Zd5+_-TEgxSupGR$1WefwX+RBr|#@O1TaS?83{1OPWzBwGLg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/6.png index 877b1fefc2bc890ef8e8ddec7822daed6e12df6a..c50fe5e99436cf8a3c0b303091909e93ceeb33f6 100644 GIT binary patch delta 207 zcmV;=05Jc4>;aG@f0s!_K~y-)rISkvfG`Y1U5cM#MO0k45_IWWJcswcNo0g67DZwk z2!+zTkjXSj(^5>{3QlD55qxvc>(ZJ*4e0D7`+E3*s_4~#dEA5`2Pm>y8Z)X#K=A`G zG)tTYj`%mIK{S9u1_2;oGyp;d1K>ouF$jR})ZzCUQN%TBNdd63+ZsD-M7&#=mi9)_ z0toRwlg3DI8l0mgg+GDJo*F+q+8z^ecN002ov JPDHLkV1fnJQyKsO delta 96 zcmaFEST{i>%GJ}wF{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnRT9I{rUR( zy56cC30E2dnc3PIb>83GtL**w{{H&KD;_a1{MP5!)zQ5+p8*IwUHx3vIVCg!0DnU! A^#A|> diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/7.png index 9f28555b4a960f34bf396f4ef09e0c5bdddfc9ea..1468ad5d4e0afd4b3be9d3d3d40a55de7e35a3e2 100644 GIT binary patch delta 156 zcmV;N0Av4txdD(Qe`HBSK~y-6W8mQ6{Z9#IkP^`VGX!`f;20zZ!XP#emk?Y`Tu=o? zogkmoe+G(OK(PU%U|0ZB;udE@0wqx!gD|2E0I3D(fg7MMXZ0Uu5FrC#YG8Wcrh+7h zH2|g#XI>yB3;?TpgYo!woTmT)01#wlLPt3?L^MH0G(j*%7B)dRLP9iw%r0L50000< KMNUMnLSTY1hcwgx delta 96 zcmdnVST{i>%GJ}wF{ENnvWbaF%}EEgitq1anL$9#Ze!s^l;rjpodKYzZGjPq~*Ojl0+|B?5p00i_>zopr064xNn*aa+ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_11/8.png index 56987a30bb46842d9d03d870838a9b2f6bef5c66..be80d2ebcb3ab29a7fc0a9a28c7637eb32b5e0eb 100644 GIT binary patch delta 137 zcmV;40CxX+rU8&7e^E(9K~y-)W8mQ6{f~|rNC7ZSHU?q;#RXN!GXSPhUCxSp17L=b z?FF*KU=$1nKuR=XRSQcD(}V(v v1BZ?sdv*+@azMDg+GxsR5})F#x7f zUCxT20WdXi%U~Rs05M)bR?k3j7>t6!04R&IbJ|Xp7aa@0C*5sehpI3 ti~s-t5M*USM>Rx5L^(G?HZd?nI5I>7*&6#xJL07*qo1w^hwV1k*4Fj)Wq delta 91 zcmZ3%SUEu@)WOrmF{ENnvWbaF&B+4?4t#iYv^$nZg~80s%$yAf)PhVBnR_Npn$)dn t*pMXNBV~|vK*6w~xA!dXw9RZsSQ&(-vNNl7o|R$%0#8>zmvv4FO#tjd9}EBh diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/0.png index 60bf98cb778921b10b9128b25c40c8d835322b2e..09f2bcaad8c7d03c4156fbb6969d1a30b9b22c72 100644 GIT binary patch delta 185 zcmV;q07n1Z0o4JJB!7TOL_t(Ijir#$4S*mFMA?5G7jO!HoWox$4s4`hS_Yjkz*OdQd0000G nWMx7}G&MpoI5a{yGC4CdLohQiJ+cks00000NkvXXu0mjf0KQ5J delta 192 zcmV;x06+iL0o(zQB!8nxL_t(|oW)Zy3V<*SY=WEb=+amCfxcGU#Yc!x9DIX_TjC%Q zwM`Kn3=~Q)z2vSb5D}Y~(XGaqF9dZT7~fu&I0%S{WwlG(m4;tBKtw=9n5QvaErEZQ zP{^iRcT==P4L=B~65$M-U#A(y2$#r85Y4%q;(nmbg|zRTy*Us@1X4M5DdmAGq3#2F uXTduQIddZd&25$B_rCz`LadGMlh^>a|8UPSynkK*0000g diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/1.png index b58dd056d39d5916aa2dcbc545553f312801e994..32bd32efc9261ceeb4a11254feca92f031a1a73f 100644 GIT binary patch delta 184 zcmV;p07w7I0n`DIB!7QNL_t(I%VYTW@85qIKJXR6hT;3aFvXDN7(fgLN&wXiK=%qZ zby($L9AuYlzIOXRK9{1%BfEei13)eTNx(3=0XXGx1tOs^A<6)JUczYrvdzc_fG}2< zU^4*S-*{bu%K&T|i825=w9&mllmYb53&{Md#u4ixl12F((Ib;E~i`%*Y000nV mWkN?oHZevpGcYwZK{-S@Mlm^4A{Xlb0000 z3^pMtw7vEYFw7kB(R=_f0ssIsQk(%WbCl)oaw;vJO+ZA3h|F~!^=_5;Fa;})55T(Z zs-S9IyM>f<3%E%^IJa`_`#_sWrdZ}F11tcfbFHXL1KFp^;wRSt3Jo;1RUv=>3&!0X cwWr%-57IS&X5D$+>Hq)$07*qoM6N<$g6kwog8%>k diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/10.png index 1599e3396647788e3531771ef755e75e54d1fa3b..e27f889521b9d077add8f307bc3553539cb0468a 100644 GIT binary patch delta 150 zcmV;H0BQfc0kQ#*B!68=L_t(I%VS`m037)G??1!f0ssE}`wzp|oJL3{B_sSN)8`}ZG)u{jNwJQK1aCMG6E zCMG7v&kyfnwFH|y6IPWZ02UbI(02xg&DU<@3{^t%7y#MN_%!160?g0&)Ucon{QHMJ zall;RtEGz9KokQuU%QRse4@etW&k#g*bKl316-j^QVa|ouo?N#YRB@ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/11.png index a17ae21cd57103620fc424b5805cd32981e82153..21271ee0ef9d2f601ab695a4f2863d01dd1a542d 100644 GIT binary patch delta 148 zcmV;F0Bire0k8p(B!62;L_t(I%VS^|KH%TKfB#|lz}J8ONtFjHfU!4UyZxV3dCCm{ zISV8K!=%cS9415=fY-^y*oZ`_#K^?N#Q6E) zU96U1lV`%Jk_5m4V;uUj86>7Gm@&Y>fN;LA zmMUHYQ4H98?KX<@i3$Ul0oXKRGXNtDaD_HWF+g8{E!`6fHW^>L{T~44MshB3Z_Gyk O00004Fg`fw znHeMOpvN*5nD--)zOyeBV6#*J=gyqyTf8&@_7H0|$4kF$96o^x;0Pn}k3jZ~Jt56+ zKyP6UsgA2Z0000GWMx7}H$pT)L@-4&H#0;tMmae)0a`fH00000NkvXXu0mjf$-+(P delta 188 zcmV;t07L)b0oVbMB!8btL_t(|oW)Zy4uBvGq>Y>JVBr;hfY%y#!y}9daqtbsuoVYW zqe2;Eun7s_+H3CsAfl)~h6_rm8iIcE5x*95Tm(cEd5wEIm4rVgKtw=9*w!WAErVA} zXn5noX^NC6;TJ*IBHV%d?F{ph;2cE>thtoaybq*z!Q)$_A2oyt0e8+7uM{oe32W%#8Lz;I000002QE0ESvE;iMskjsO4v o5M*USM>aS!Lo+Z&MMXwNLq#(+F*;zNX8-^I07*qoM6N<$g2Vks8vp(i8cw*)Uih`_vV zrlDrudWBqb3%DskG`DK}^TJ{zET(ZN04o5QtTnyzK+buw#3LF&<$>k4Y2^QZA;dm_ Y8@fGvy|UmOj{pDw07*qoM6N<$g8SG@?EnA( diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/14.png index ad9fe16edfaa2a1ed55e019a084721f3e4e89a5c..1a2d8c2ff868e404a42140bd96aad5521dc8d245 100644 GIT binary patch delta 151 zcmV;I0BHZZ0kZ*+B!6B>L_t(I%VYTW@85r1`2H^l#wX7(cmT4~4t&LQ8XRMwMKm=#M*002ovPDHLk FV1fivI6nXY delta 158 zcmdnYxQlUuN`0fJi(^Q|oa8^>-`}riGdj5N{gYQqIDde65_TU%FGufqGIN5cArKe= zaa~=7_-fS~PiAgdrNX%3fJFN~V}qQ1Wzy+A0+Wt2oTxjtTyVX30+4EBjb#Ww)U@+Z zxVPx~Mh!NQqN6`uS{ctUzmvv4F FO#mBWM2Y|a diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/15.png index 21fa2cb5b56915cb19969cdf8e1be6dcdd9e4d3c..e81dba6b8650e2cd62edb99656298978fb23c0e0 100644 GIT binary patch delta 175 zcmV;g08szd0m}i9B!6~EL_t(I%VYTW@85r1`2H_c{(-NkY!GIk1W;_i=4-bR2B13? zT`@L!38Lum>54lyo=p7Ebq6SgqG=`)4R*KYs!)ly~j)ly}| o7q}P(;0kSghL8=Yn-|Ch03D8Ed%fQ(i2wiq07*qoM6N<$f^IcdApigX diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/16.png index 8ece7aaf86016e8cef2bd89c6266f29161e9ecf9..12188106ce3c7a3e427710c8dca009076f16c5e6 100644 GIT binary patch delta 181 zcmV;m080PL0nq`FB!7HKL_t(I%VRk3_1}L6G67icu4iw^HUJE$X28FH|Ng@;HgDmS z-+b*h+yHbjbOW%;BfEes17OYp(I5#J#unmO<#9zLp)kSfG@_hL$N*%UkqrQ0tS-T3 z0J^{Nx&)U2*fbJl0CH%fdx0neNCp%efE>ceP9+9|QZWE!+b${1)^z8G0000GWMx7} jL^(JzH$pH*Ff}kWIW{vfcQn5C00000NkvXXu0mjf(#S_r delta 174 zcmV;f08#(Z0m=c8B!7`fL_t(|oW)Zy4uBvGJQ}{@;$M8NA0R%$#W?r|L)==YCLoj; z8EisQXnXA)0A?0^v=CX)0{{TjQ=9=Xv*-%3oXU!46A+OjB6l8py;~*TO~I?PT)@0; zrl4lrx`mW;3%E%^Ik$5B^T3)&rb25D+FP5m*6x2 z-QT!0;57i7MxqQr4sCQV5M=-SK+kn4p zVUx@AZA?g6oruPt0{2@xjqmY3UZvv&Qw!pG_GkNj&=yO|_dd=xf}Mb59tDkhpjrqi zvv(G}voLFJC!lqECbEo>GGAUKh?Q7d-GA@_&hKh0y(>>#00000NkvXXu0mjfcBE9j diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/18.png index 65e251c96d90f6cd7a0a74d0325521e2b1dcc7af..b4a629b65117f26e4c52f654806473b90b82f3de 100644 GIT binary patch delta 164 zcmV;V09*gU0l)!}B!6p3L_t(I%VRk3_1}L6G65xeX#oEH`}ZG)u{n*9JXisYz4_Yh z|D?)OZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF z{Q$D_c0GFo#>jkRd2|et2LQ=Q^(9_{&u0Jt01#wlLPs%1G95NDF)=koK|(SxFg8Mt SeNyBA0000kg5j9{L`v1cYRpL|Yq&6qJmVkQvV z+wbYVDwOldCn9tbLqtN4^LdQ`LM5JMV+S?>*=102jT3w?ulE{Gb)%l-KE-hSN@ZypAQE%PchG@93b PU;qM7S3j3^P6b25D+FP5m*6x2 z-QT!0U=0J90oXL68-UdX$f1qy1)>Zf1yIKTN^%q^5CQr3_ANSdu6sEE000nVWkN?b iIW<8zGBiOnMma%4H9|u5aSgWs00002{r-}x%a471Jy!I xnS*yWcxOk&Z3MJxk3^;sQ|9Y`p*Q#c-~%vEXMDj4=M(?{002ovPDHLkV1jNSQX&8V diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/2.png index 6e5de6d32bd66c0323e1672aec66472682828fc9..3e7a919442f01bdfa79b39d85edf75894f063739 100644 GIT binary patch delta 166 zcmV;X09pUU0m1>0B!6v5L_t(I%VYTW@85r1`2H^l#wX7(cmT4~4t&LQ8XPEsuQea$Kc0000GWMx7}L?1InFf~L%K}9)2H83zT ULUYNYumAu607*qoM6N<$f~ylj^Z)<= delta 168 zcmX@ac!Y6+N`1Gdi(^Q|oa8^>-`}riGdj5N{gYQqIDde65_TU%FGufqGIN5cArKe= zaa~=7_-fS~PiAgdrNX%3fJFN~V}qQ1Wzy+A0+Wt2oTxjtTyVX30+4EBjb#Ww)U@+Z zxVPx~Mh!NQqN6`uS{ctUNZ?bo PWB>wBS3j3^P6{B_sSN)8`}ZG)u{jNwJQK1aCMG6E zCMG7v&kyfnwFH|y6IPWZ02UbI(02xg&DU<@3{^t%7y#MN_%!160?g0&)Ucon{QHMJ zall;RtEGz9KokQuU%QRse4@etW&k#g*bKl316-j^QVh@+P#lsaH($H`9{>XHb>On@ R4AB4p002ovPDHLkV1l<0NL~N{ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/21.png index aeb098658c415f22c8699aafa3d437ae0e8e6e45..edc3464a849b014ad4fdd5b8bdbdabdb4b0efab3 100644 GIT binary patch delta 152 zcmV;J0B8Ta0ki>-B!6E?L_t(I%VRk3_1}L6G65xeX#oEH`}ZG)u{n*9JXisYz4_Yh z|D?)OZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYcb z&;TIs0s!LD!Ux!>&fx$601#wlLPte0Gej^#Hbgl>H!?*sI1x2ZPkg5j9{L`v1cYRpL|Yq&6qJmVkQvV z+wbYVDwOldCn9tbLqtN4^LdQ`LM5JMV+S?>*=102jT3w?ulcw{$7{=D_}KZDu5GIcw(_XP|<;OXk; Jvd$@?2>@SyNM!&3 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/22.png index 741970de7bd6605145c5b31bc28e65575872cc41..1219ead3a4e9bd855c7b1547a82a3fe5e3d43f1f 100644 GIT binary patch delta 149 zcmV;G0BZlZ0kHv)B!65IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYcb z&;bD1_`X$7$Q~>J000nVWkN?bLP0@7K}1A1Ha0dxH8DBR{|*aC00000NkvXXu0mjf D$Zkg5j9{L`v1cYRpL|Yq&6qJmVkQvV z+wbYVDwOldCn9tbLqtN4^LdQ`LM5JMV+S?>*=102jT3w?ulcyt*=8T4)!9Z9|}+s6O|p00i_>zopr E00l-wrvLx| diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/23.png index af8aa76551fe829619617be46659e7e6c0edbb78..ec91a57eef779d8a1f74b2fbf4c74987930af0d7 100644 GIT binary patch delta 148 zcmV;F0Bira0k8p(B!62;L_t(I%VRk3_1}Mn;Q{{r`}ZG)v3ZM-JXisYz4_Yh|D?)O zZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF{Q#xe z833dIzEyB_VN3u301#wlLPs$%F*rCeIXE;qG)6{7K}L#ah7I5V0000B!7QNL_t(|oMZU+@85rh;Q{{r`}ZG)4}8V+7A|=vWJOF&OpHuS zOpKo&-obVmW{illmf>{slZAWX{6*d0+2b=`y+&#B=Y=^uM8fEI&!#J9`0E0EyhX)T)7M zA;eU?v&K7Xdc~~(TD4WkNHc|)#+nHLXgS6JADKpJb<7&AxBvhE07*qoM6N<$f^f7} AivR!s diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/25.png index a851e7f88f9350c91915670d4a7d0360977c938f..8c1268ab4c0b0617151adf91110fa0d4a02ac2b5 100644 GIT binary patch delta 169 zcmV;a09OCJ0mT83B!6&8L_t(I%VRk3_1}L6O2DpXZw840|Ni~^55w5Jg;Rd>wcBt5 z(8bUVz$%aI0`W79-b7{K_*ieYSQ24I8%uF%FAkOQBY4jFx?%m4rnrFINEooQMC O0000;M1&00>D%PDHLkV1i(>IXM6T delta 151 zcmV;I0BHZK0kZ*+B!7BIL_t(|oMT`ZKH%TKfB#|lz}J8OiIrzUR>Z`_#K^?N#Q6E) zU96U1lV`%Jk_5m4V;uUj86>7Gm@&Y>fN;LA zmMUHYQ4H98?KX<@i3$Ul0oXKRGXNtDaD_HWF)*|M0QaJ684#VdB>w;a002ovPDHLk FV1oVjM#2C9 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/27.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/27.png index 527506fb9cf514b9da484526a51b4aa3c1394f4d..5bd9f544d2430bb552c0a6f82049640db979e4a3 100644 GIT binary patch delta 176 zcmV;h08jtl0n7oAB!72FL_t(I%VS`m037)G??1zU8nElx8-xM>{{8z8!`Mv5CXZnN zjJ^5VZL9{M%cH0x#{d+Uf;b=v7{(T0=<+CDAjZ$=0GmZbdkLpFvdzc}K^Wa7I1NDe zH!clW!vJOgHjU^8V08gsR_0aK90j0`u*5^psZYmv^?*uIRGnwRBl~r&7f<+ xhnSr;=&Zrfa4SG>+9Sx%;X~AYCV)S@#19mOU&@ehkX8Ty002ovPDHLkV1jAzR)+up diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/28.png index b8b30a050e4f8abce0feb0398a965308f362c92c..32e5795ac9951e6ca121f24c5d0b4c7f01726e82 100644 GIT binary patch delta 177 zcmV;i08anL0nGuBB!75GL_t(I%VRk3_1}L6G67icu4iw^HUJE$X28FH|Ng@;HgDmS z-+b*h+yHbjbOW%;BfEes17OYp(I5#J#unmO<#9zLp)euJ0DNA;2m@?3BO3t1SS`b5 z0J^{Nx&&PiW&k#gL>Yh_+UQ=uYQVtf1xm6r2mkQF(5Cb`_52xd&z`nUic6YF1jlU_eBMh|F~!?P-ntummfCkHEU^ zs-bFLdxczc54bBqH1}%k^Fm`JES7mH04o5Q+-iE|ft>SVi6dJ8l?R&Js*(Ty1s}%% YZanFIwd@^`J^%m!07*qoM6N<$f?g6$NB{r; diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/29.png index 1c50fe0919e55f80060ad5c97388d8557f6ddeb8..1aa93f78791f4fdffdf00cad702d3e14c825eb41 100644 GIT binary patch delta 154 zcmV;L0A>Ha0k#2-`}riGdj5N{gYQqIDde65_TU%FGufqGIN5cArKe= zaa~=7_-fS~PiAgdrNX%3fJFN~V}qQ1Wzy+A0+Wt2oTxjtTyVX30+4EBjb#Ww)U@+Z zxVPx~Mh!NQqN6`uS{ctU`;{600000GWMx7} jMl?h)L_;_=F*QUoG&VLk{0B<^00000NkvXXu0mjf$+$=d delta 191 zcmV;w06_oI0owtPB!8kwL_t(|oUKza3V<*SG{Mbxbm=SnKwm5F;v+;52j3v#mN;lc zZBwLrP$<3hl1oz{BF+-guBkTIU z)2@3{v_OqN1RL}qb diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/30.png index 62d3096bdb1bbf8633711f837fc4f404d8e1571a..5d91aa39ae970ceb40829a9233c34b5df27dd06c 100644 GIT binary patch delta 171 zcmV;c0960M0mlK5B!6;AL_t(I%VRk3_1}L6O2DpXZw840|Ni~^55w5Jg;Rd>wcBt5 z(8bUVz$%aI0I& ZLp3x;L_{OS_PhW9002ovPDHLkV1hc7L>mAA delta 165 zcmV;W09yaY0l@)~B!7rWL_t(|oMZU+@85q03IG!&nyG8RzkmP!!|;KxnBKxAkKzI* zCMHHECML$u5AR~P4U0U*USNSS4t-}}*nI6a&KSWdk1HCH{fy6Gyk3C$8J`*!bOBs0 zg1N$1OBKaH3`W79-b7{K_*ieYSQ24I8%uF%FAkOQBY4jz3cU-RZ`xBmkG7pQq} TK)iED00000NkvXXu0mjfj1))X diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/31.png index 9ec6888bdc92f84d875924a200ede900420054e0..9c18d059486765895ae142fc39a93f9c49b2f3c9 100644 GIT binary patch delta 156 zcmV;N0Av5Y0k{E>B!6Q`L_t(I%VYTW@85r1`2H^l#wX7(cmT4~4t&LQ8XyC002dz`O1Of&ustz01#wlLPsz;L_{}1L^3fmG!;WQH8(>~1AmqP0000< KMNUMnLSTZB4Lhj- delta 162 zcmdnNxQ}syN`0%Ri(^Q|oa8^>-`}riGdj5N{gYQqIDde65_TU%FGufqGIN5cArKe= zaa~=7_-fS~PiAgdrNX%3fJFN~V}qQ1Wzy+A0+Wt2oTxjtTyVX30+4EBjb#Ww)U@+Z zxVPx~Mh!NQqN6`uS{ctUCkTmAnB!7QNL_t(|oMT`ZKH%TKfB#|lz}J8OiIrzUR>Z`_#K^?N#Q6E) zU96U1lV`%Jk_5m4V;uUj86>7Gm@&Y>fN;LA zmMUHYQ4H98?KX<@i3$Ul0oXKRGXNtDaD_HWF)(z%=4-eA0~G-OrEYxf)>iQV0000< KMNUMnLSTZcK}%x* diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/33.png index 988c2f51ca2451c38578adf9c7d005a62b953ef4..153750adf9da1bdf42ea319b7c497f7ad4958ac9 100644 GIT binary patch delta 147 zcmV;E0Brxa0j~j&B!5~-L_t(I%VS^|KH%TKfB#|lz}J8ONtFjHfU!4UyZxV3dCCm{ zISV8K!=%cS9415=fY-^y*o z0I8n3qdAIxjsO4v5M*USM=&u&I5$BZ`_#K^?N#Q6E) zU96U1lV`%Jk_5m4V;uUj86>7Gm@&Y>fN;LA zmMUHYQ4H98?KX<@i3$Ul0oXKRGXNtDaD_HWF+g8{E!~p>02JOsZp#JQkPH9-002ov JPDHLkV1gsZNACat diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/34.png index 0be42a44943208816b46a9131f76cd20c6fe5438..4d1933278200bcdc54e13ab9af4754f9c2e9330d 100644 GIT binary patch delta 148 zcmV;F0Bira0k8p(B!62;L_t(I%VRk3_1}Mn;Q{{r`}ZG)v3ZM-JXisYz4_Yh|D?)O zZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYcb&;TIs z0szK1zEw&dt0n*d01#wlLPs}4ML{z;LOD1xH#jjuMK?@bI1P>f0000GzTb>v)Y?}Wu^T=z~8S_7`Omq}KFm*%1x(`=_ zj%F)#F#;9271{+RG8i+=cFSQ)XklD;K~0mbjqgUy+i&%v3{oydrGhrC(-?rj)78&q Iol`;+07I`s=l}o! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/35.png index bb9ce40e15c011e54857d2641c7cc212e92ffbda..6ff555b7a8fb7f75a7c20dcb9cc1af4e56f32a03 100644 GIT binary patch delta 151 zcmV;I0BHZZ0kZ*+B!6B>L_t(I%VS`m037)G??1!f0ssE}`wzp|oJL3{B_sSN)8`}ZG)u{jNwJQK1aCMG6E zCMG7v&kyfnwFH|y6IPWZ02UbI(02xg&DU<@3{^t%7y#MN_%!160?g0&)Ucon{QHMJ zall;RtEGz9KokQuU%QRse4@etW&k#g*bKl316-j^QVh@+P#2md0s7r?eHH;3mH+?% M07*qoM6N<$f-rhSvH$=8 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/36.png index bd0f23691de5151d63e6b6b865300bad9abc2739..39065196744f0f1dd6ec17cb7d23b7725daf7b66 100644 GIT binary patch delta 191 zcmV;w06_oc0owtPB!7lUL_t(Ijm42M4uBvGMY;cV+?+gxi@Ou6Ycc$!^v9rM}04Aza_nOeK056Zn zd*3*kNi$)!k#Y#YFZ0D3)}#xtefLZr0bXGUz|*!Zga9+^GdKW4I0p$UZB!8?)L_t(|oTXDs3IibweTLcf9Bw>CFW_mVd+8yhATH(%gLD_W zvYn|$hA|+B&%EU217wcBt5 z(8bUVz$%aI00B!7uXL_t(|oMZU+@85q03IG!&nyG8RzkmP!!|;KxnBKxAkKzI* zCMHHECML$u5AR~P4U0U*USNSS4t-}}*nI6a&KSWdk1HCH{fy6Gyk3C$8J`*!bOBs0 zg1N$1OBKaH3`W79-b7{K_*ieYSQ24I8%uF%FAkOQ8X7#|OO{r4YN(j^7}04JS# UwZKM`o&W#<07*qoM6N<$g2kUlvH$=8 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/38.png index a88cc5b4c3d3425a66fb221dff58489341182c5e..e1f47b6269b41823da4b112cc7a45989fb528775 100644 GIT binary patch delta 157 zcmV;O0Al~W0l5K?B!6T{L_t(I%VS^|KH%TKfB#|lz}J8ONtFjHfU!4UyZxV3dCCm{ zISV8K!=%cS9415=fY-^y*o3XIB000nVWkN?XL^d`yF*PtlI2JHCLPJD2-*^*>00000 LNkvXXu0mjfM8iK| delta 161 zcmV;S0AByO0lfi`B!7fSL_t(|oMT`ZKH%TKfB#|lz}J8OiIrzUR>Z`_#K^?N#Q6E) zU96U1lV`%Jk_5m4V;uUj86>7Gm@&Y>fN;LA zmMUHYQ4H98?KX<@i3$Ul0oXKRGXNtDaD_HWF+f+qc;M^5{~EZGE-?TAeROes#oiTZ P00000NkvXXu0mjfFq}+z diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/39.png index 145564073a8f5a536f81db0fa04a9a5785dc80e6..820938dfffcfc4cbb0ce933ab20fb917cb3a5584 100644 GIT binary patch delta 184 zcmV;p07w7i0n`DIB!7QNL_t(I%VS`m037)G??1zU8nElx8-xM>{{8z8!`Mv5CXZnN zjJ^5VZL9{M%cH0x#{d+Uf;b=v7{(T0=<+CDAjZ$=0GmZbdkLpFvdzc}K^Wa7I1NDe zH!cl$4Zx<6C;89)l4*Z^>#B0CS1FhCfYk1UT312F*M7a}R2w@%{#000nV mWkN?mK{horH#9jiF*!6rLoqPTS7d1b0000ZdhzN-Yw>7q_HT>xa zi!7dR0P925`j!6$+;4=X!Mx{uykg~xh7lz5XwP!~QC2P`?Lix@4!{Z^m0O2eGw4RJ zK4ha68m(|N+zQZ}_6YK~tPgXK2><|H;@rEszvu&*#%3%_Kl8Kz0000BZ40sxORF_Y1{OlklC p01#wlLPs(|Loh=(GC46dFh)i-GB{Vx$~OQ2002ovPDHLkV1hM&NM!&3 delta 173 zcmV;e08;nG}mf|_l3nsSj^Ly0Tuu_ft;Vk5+-W^g$I_~rjh^ug%I1D b{ko+a!a#o@(y4x<00000NkvXXu0mjf6j4kT diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/40.png index d9cab30da910ad36d599fa4ef652186ab89c8103..2257c3877c1cad5b88be30a1c552854384863a09 100644 GIT binary patch delta 160 zcmV;R0AK&U0lWc_B!6c~L_t(I%VRk3_1}Mn;Q{{r`}ZG)v3ZM-JXisYz4_Yh|D?)O zZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF{Q$D_ zc0GFo#>jkRd2|et2LPGzTb>v)Y?}Wu^T=z~8S_7`Omq}KFm*%1x(`=_ zj%F)#F#;9271{+RG8i+=cFSQ)XklD;K~0nG1(yVW&EN0R^5K_M*%%mRu#}ehh_6s# O00K`}KbLh*2~7ak@{{8z8!`Mv5CXZnN zjJ^5VZL9{M%cH0x#{d+Uf;b=v7{(T0=<+CDAjZ$=0GmZbdkLpFvdzc}K^Wa7I1NDe zH!clW!vJOgHjU^8V08ggP90dwQ0RNWqh%8-rGo%0j01#wlLPs+} hGBY#S?IUGeqFgQj;F*ZdpK{8BW R5Pkpv002ovPDHLkV1f={K@|W1 delta 166 zcmV;X09pUP0m1>0B!7uXL_t(|oMT|1037)G?>{B_sSN)8`}ZG)u{jNwJQK1aCMG6E zCMG7v&kyfnwFH|y6IPWZ02UbI(02xg&DU<@3{^t%7y#MN_%!160?g0&)Ucon{QHMJ zall;RtEGz9KokQuU%QRse4@etW&k#g*bKl316-j^QVh@)FdrWH`tLukq)Q9{0GbYU UFB#$h$p8QV07*qoM6N<$f|K`1UjP6A diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/43.png index 499f82a890fda4488f48c649f18aa7bc04fa1d48..ff3bd35ff1ba0d37fb6b2ccf18b857488afaa661 100644 GIT binary patch delta 178 zcmV;j08Rhh0nP!CB!78HL_t(I%VRk3_1}L6G65xesbj#dXKxS&{QLLsKMZ3t8Jj$Y z0WkLFYqzl)fG&@sjvNC}TngfVBw!d@fT7Eyc!3x{qXTRf5$z?M;>b25D+FP5m*6x2 z-QT!0U=0J90oXL68-UdX$f1qy1)>Zf1q{3apg;rw6J_#<#Vh9RXaE2J5M*USM=?1z gIW#sxL^v}cw-L~~JrbElOqu`p7iRGRNv>nc=#}Rn00000NkvXXu0mjfjC@(B diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/44.png index 799aa7bdf57f92cbd6f9b19f33fdf2ebfb9491c7..9b2102f78b7ddf3cbf8341670d5731426cb098bc 100644 GIT binary patch delta 148 zcmV;F0Bira0k8p(B!62;L_t(I%VS`m037)G??1!f0ssE}`wzp|oJL3 z007^Yx}!B!7QNL_t(|oMT|1037)G?>{B_sSN)8`}ZG)u{jNwJQK1aCMG6E zCMG7v&kyfnwFH|y6IPWZ02UbI(02xg&DU<@3{^t%7y#MN_%!160?g0&)Ucon{QHMJ zall;RtEGz9KokQuU%QRse4@etW&k#g*bKl316-j^QVa|&02KffOK!_>F6f*90000< KMNUMnLSTY}!$TPW diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/45.png index ad9c4132dae448913159d3da9ceb7714a36f2808..71d03b1fcaa8ba75761d0651a09cd59994da6433 100644 GIT binary patch delta 145 zcmV;C0B--Z0j&X$B!5^*L_t(I%VRk3_1}Mn;Q{{r`}ZG)v3ZM-JXisYz4_Yh|D?)O zZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYcb&;bCw zUb>^Z@rNk@000nVWkN?pHAX@+I6*@;I7351MmRXjEjw2L015yANkvXXu0mjf*_}Gd delta 152 zcmZ3>xP@_oN`1Abi(^Q|oa7(h-`}rqd&v0j@9*#OZTvMyzliBos-?L4`1tgI@O=4u zN3%H1D%I9#c{1o299#IFhiCTsyT>GzTb>v)Y?}Wu^T=z~8S_7`Omq}KFm*%1x(`=_ zj%F)#F#;9271{+RG8i+=cFSQ)XklD;K~0mbO^ks-$T43~sEKc)90L$|y85}Sb4q9e E0Pbl&kpKVy diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/46.png index 6f10fe926322b3de3580e0f7f2de600ca1f264c7..3ee382cc1743e9b2ea4d2dcbfd7b254a0c25afa6 100644 GIT binary patch delta 152 zcmV;J0B8Td0ki>-B!6E?L_t(I%VRk3_1}L6G65xeX#oEH`}ZG)u{n*9JXisYz4_Yh z|D?)OZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF z{Q#xe834(1#ksc1lv@A*01#wlLPtYHG&MmqIX5ygHbO-;I1w||NX7*K0000kg5j9{L`v1cYRpL|Yq&6qJmVkQvV z+wbYVDwOldCn9tbLqtN4^LdQ`LM5JMV+S?>*=102jT3w?ulE{F%nOj0$E-~CsfLAJi~<~-@cE(}26 M>FVdQ&MBb@03=dKYXATM diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/5.png index ccfcc82f6edbb85d9eecf58eb85746333842e5a7..2093b4610f292bcf750b4bf057173968288482c2 100644 GIT binary patch delta 178 zcmV;j08Rhc0nP!CB!78HL_t(I%VYTW@85r1`2H_c{(-NkY!GIk1W;_i=4-bR2B13? zT`@L!3(GHUIzs5M*USM>jA= gI59*+MKD7{LNrD(M%)O~T>t<807*qoM6N<$f?n=KSO5S3 delta 188 zcmV;t07L)I0oVbMB!8btL_t(|oUKza3V<*SG{Mbxbm=SnKwm5F;v+;52j3v#mO5xe zZBnp$P$<3hl1oz{BA+FqT~lu!sJg-9M~&(?!%|290000Yh_+UQ=uYQVtf1xm9s0Fc)AP`M;10w@3g01#wlLPs$|F+njo dF*!y-Ge$u;FgcnquG#IG3J)~5RU`lZ3;ynJ bw%Z;bMC^eW;w;_U00000NkvXXu0mjfx#>-O diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_3/7.png index 379b2aae8b6185b86157d944dc41b5c64e102087..d76dc0d5b157b140154d30b52f3836e5b338ec73 100644 GIT binary patch delta 156 zcmV;N0Av5d0k{E>B!6Q`L_t(I%VYTW@85r1`2H^l#wX7(cmT4~4t&LQ8Xy?F91$_{d^^BL2&>801#wlLPsz-GDSu~Ff=tpL=`zOLqkO-`}riGdj5N{gYQqIDde65_TU%FGufqGIN5cArKe= zaa~=7_-fS~PiAgdrNX%3fJFN~V}qQ1Wzy+A0+Wt2oTxjtTyVX30+4EBjb#Ww)U@+Z zxVPx~Mh!NQqN6`uS{ctUIRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF{QxD| z8Kf5gtl7c`Oz8$e0000GWMx7}H%2u^L@_x+Mm0l4HbFx{;}591s{jB107*qoM6N<$ Eg6Fh6h5!Hn delta 161 zcmV;S0AByH0lfi`B!7fSL_t(|oMZU+@85rh;Q{{r`}ZG)4}8V+7A|=vWJOF&OpHuS zOpKo&-o-B!6E?L_t(I%VRk3_1}L6G65xeX#oEH`}ZG)u{n*9JXisYz4_Yh z|D?)OZUD$xAPE>IRi5N9A<6)}PA0}?WCK8$D3>5>g!!8!m%t3brjaNEkV6~Y3nYaF z{Q#v|5&*!N!UyjDoZ0{Y01#wlLPt3=H8eCfG%+$TH#9~?LlH)Ja&b`r0000F! delta 158 zcmdnOxQlUuN`0fJi(^Q|oa7(h-`}riGdkF~{>kg5j9{L`v1cYRpL|Yq&6qJmVkQvV z+wbYVDwOldCn9tbLqtN4^LdQ`LM5JMV+S?>*=102jT3w?ulE{F$+&r)R+ttl%@_FEOr00f?{elF{r G5}E*?Vnuxb diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/0.png index 0c1ae62e95223129e9c921ac493b0ba49713429d..ac1331691072fe539a57777be7188d8a95928e42 100644 GIT binary patch delta 181 zcmV;m080OD(gBbpe|CqN3Fn)1V z3XI=gkiozp#mE@L00t5P^$Y;{6Xa}i3;=nJYy&|0;0AyhL)QR!U{GQJI66oKpy;RA z0C4OLr~%*i_@%5M*USM?peDI50st88tIRGD1N{K|z(B>*D|b N002ovPDHLkV1k#rJkkIF delta 76 zcmdnPm^DGg&Ct`uF{ENn@}K|Pf7&zed~m;njjf9(0SFekd|tu0n5{>ufuZMrz4u@H e(yx*?*%%nOj`6uMq}RS-00K`}KbLh*2~7amARZ9_ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/10.png index c196168ab8627ce367881c42efb7577feca85289..f83fe7b12d2a60c987179a99638870f9028ed3c8 100644 GIT binary patch delta 104 zcmWG>|6h*%`TxnQbcW2j!jP^SX19YH6099}I1Z&q ze|X=oWnsv;Y7A delta 57 zcmZo;44FVdQ&MBb@0DOWJ+W-In diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/11.png index 33424530f8cf29841cb4583a27083d386361cbe3..302541918a0f161cba96d70c6d66ca1ac8497258 100644 GIT binary patch delta 100 zcmWG-Vw|87r|aqB7-G?zoFKuvI6;I*=)?c|@Bi!TL;g=*%-%V zu)btwSaD6V^j8wY9|i^nfs|AycQY4bBO?<>H#bvbM*}BQgGa@D=|DLKPgg&ebxsLQ E0I($_1^@s6 delta 55 zcmZo-44t52DC6nk7*a7OIYEMTae@es_=o@7uhbWPoww(}2YH6m=B#U^w$H!800f?{ KelF{r5}E)}g%zLx diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/12.png index 795fbecd3dd19fd51b7b654a23b42993820d8535..2df71661eaa7736000aafc71692355bc9dc23f8f 100644 GIT binary patch delta 177 zcmV;i08amB&H<1le|bqnK~y-6WBC8S`#&=N_eT{4|NNkg6MwoZ|DOS*>CqN3Fn)1V z3XI=gkiozp#mE@L00t5P^$Y;{6Xa}i3;=nJYy&|0;0Ayh18M*`Fvv9k9-1TqQ0#%j zj$8w%;sUq<y85}Sb4q9e0DT)BssI20 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/13.png index c622978e5acb53df3dccc18a366755c0932b81e5..314a6093629c8a216fb3eb653125ee7498ad57c4 100644 GIT binary patch delta 151 zcmV;I0BHYZv;mMLe_u&NK~y-6WBC8S`#&=N_eT{4qsyW589Q}vFgZCyHa0LZML0u45kx+`PU8Ro002ovPDHLk FV1mrNH5vc_ delta 71 zcmdnOm^wklQODE8F{ENn@}K|Pf7&zed~m;njjf9(0SFekd|tu0n5{>uf#u)-X^S+> ZnHWl6b00|Z*$~PA1fH&bF6*2UngBm-9E$(| diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/14.png index 058872c9ec759db0a7ee76ccd1365c1d0e810d44..2d3ee08974c41f4995874386bd47d8344904ae28 100644 GIT binary patch delta 118 zcmV-+0Ez!qlmU<=a6d^zK~y+TWBC8S`#%W(`=biSKR+mgF^CP5hp9p5GrYYZ^B;y^ z9F+oN5c|_zc{oOvhsnYC45MHajDkS|0D_ugmyEf94*&oF5M*USM=&xqG&M# K=d#Wzp$PzDe-qCD diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/15.png index 552b195c96b479c4bfd0a62ee7368b70d927c989..72ead9f0f1e41f436c92c3814a6e3ba417bc9833 100644 GIT binary patch delta 145 zcmV;C0B-+gt^trFe_2UHK~y-6WBC8S`#%W(`=biSKR+mgF)|w){&ZLVKf~J#GXG)t z#Zf6R2C+esAPkd(@nINl0J&gr7y$Ab*#>|Dc%&NuN_?O+Gq5fgcrQ?70L3nV82|vO zN3|G@5l40a000nVWkN?bH!(FtMMN|?H$yT+FhVg_2Bhu)3jhEBNkvXXu0mjfg%&eZ delta 72 zcmZ3-m^MMhN!QcGF{ENn@}K|Pf7&zed~m;H(^ew`Aegh~z=!#rM#>TrZoCqv30D}j aBpDbs@UoxGl@AYR00K`}KbLh*2~7Y#4H}66 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/16.png index c21dc7aa5e96e98da6c41a17f7d14d5cda6b5194..94a95d4a3fa691d67378b2c6d26597dcab2ab416 100644 GIT binary patch delta 152 zcmV;J0B8SmwE>VMe_%;OK~y-6WBB(+_5X{bQvVr91pohc|NnGX{y&&OjsYOeV148o zfZ~+57i7pc02BtpzyNS`444akeo&^|0E)aYOboz=L9v63K}jBj(fQz91;e1&K*z}9 z=;}b35CH3r!Lf28&V2v?01#wlLPtYIH$pZrGDAf&GcY(Z5;ijxBFW+a0000RN{7>pV~p#lH@cT;WvIVqUB20Yp#_8-gu1qd<*r7{pk76Yk6$6y0s zxe*i~APi%J(m4pj#9$bt2^j+bsl&ivcgNzj0000GWMx7}AVe`iG&40dGeb5tLo+fo UMhKtcssI2007*qoM6N<$f|3O~W&i*H delta 84 zcmX@iSTsS!&(hPyF{ENn@{j-9f7&z8eDFVCbJJHN10a~Q=fH>gol3$I5)y8_5~c}P o7&sFC{EvS1f92})C(IZaw#f0_-G6(^AqF7uboFyt=akR{073pFg#Z8m diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/18.png index 7be1ecbe5910162874e5bcdd6008cbb616f9420f..1e20316b8f2fb19519bc651c6520607c134fbe04 100644 GIT binary patch delta 135 zcmV;20C@jlqydm5e@{t7K~y+TWB7De{{M@kQvVr91pohc{|D)10BI)20CFuJ1*2ft z0#L5{_eT{4|NNi~#>iqIb;xRAe0XkrdqD<_VQf%tgJGB)Iv=DK0H?fo)sH$$(EtDd p5M*USM>j?^H#0CqLPRq%G%zzaF~?s_KL7v#07*qoM6N<$0fIowGkgF5 delta 67 zcmZ3&m^eYjR>RZ9F{ENn@{j-9f7&z8eDFVCbJN$pra%L(6}%Gv|4;i>|LT?TCSC>x X`zJiwT?fCfVgLe9S3j3^P68e^NRN{7>slS{{QbLEB#Q{1q1H|umK>GKpe7N03ygq(=Y=7ntph>cOnEJ s0000GWMx7}H8MmtL^&`wHbg-*K`=Nl{&^b<00000NkvXX1g=70f`;fY2LJ#7 delta 76 zcmZ3^m^DGg&Ct`uF{ENn@{j-9f7&z8eDFVCbJJHN10a~Q=fH>gol3$I5)y8_5~c}P f7*;S&N%LfozrqvwY5B%o3_#%N>gTe~DWM4f*2W$r diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/2.png index 72a38b1c0ba13eb4f5e007c505c73923ba60e39f..fe45940303a24fb7f316680545958cf3b9b8f09e 100644 GIT binary patch delta 141 zcmV;80CN9essWHBe^p6DK~y+TWBC8S`#%W(`=biSKR+mgF^CP5hp9p5GrYYZ^B;y^ z9F+oN5c|_zc{oOvhsnYC45MHai~>Xq>(UIvB< W2e{Uy%bnQD00f?{elF{r5}E)6?;SG$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/20.png index e85c2cf482a0b6a9ee416e21f3f53b2f0c3bf86e..ccd0f225b6a0b64ae94b36c26a4b8eaebe983471 100644 GIT binary patch delta 113 zcmV-%0FM7zj{%S*YdT3pK~y-)V_+Z?{Quwm|I=Oh|K#dt0BL@4REm59M!_f;ZUB_4 z{{2z?PmVqiW&q_VaY?J00000NkvXXu0mjf>Ax!2 delta 59 zcmeBYjGUlis^ID37*a7OIbi|ApZ~gF=L`K^oFLM}w2H}V)030jJpUOxGdT8lF{Ey1 O00K`}KbLh*2~7aOn-;hL diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/21.png index 7e80b63bb8c2d8dc30f070852b278dc3dfc6aaa2..6fb168e310b0ad8b309fe92b6b55cc65d87d777e 100644 GIT binary patch delta 107 zcmV-x0F?h)i2;x#Wi&}dK~y-)WB7De{{M@kQvVr91pohc{|D)10BI)20CFuJ1*2dT zV9AXjOtu04{-}bpGXOdkB!k#%o=^Y)01#wlLPt3^GdVLeLPj!0Gd4jmI6>w4Xp#T` N002ovPDHLkV1ht!C?fy> delta 60 zcmeBVjGCZgrs(P77*a7O`N#k5Kkb=kKKP%nx#??PQ=kDCo2W%)<3oFf4?j7zcDJ2z PV*mnAS3j3^P6}%WV&R|sqa^&_|L(;>|0O+G{{Juk&;Bx%Aye%*Ly@i=>*55F3tS8g zM#*?YcQZXm_$N%j=?U`pj_@A%2>1$t8paB<~ECa)#pDwifWXt$ K&t;ucLK6UoITaBA diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/23.png index 288ade27c0370ca14a962e4f5b85de4e6a23be69..32cc0b52414266232db59432600ec4ef30a04b66 100644 GIT binary patch delta 102 zcmV-s0Ga<(gaMEwU@u8TK~y-6WB7De{{M@kQvVsq1t857888Y)!6<-$|Np!H|NEm# zS#AVnX>#=g0J*XknXAYJJpcdz5M*USM@2+1F-ABuGczi_@%07*qo IM6N<$f{5iNzW@LL delta 54 zcmZo+44I%}Anobm7*a7O`N#k5KkW}|NU$zWuxR+df2qc)a|~~8uuXa}|9&3>5O})! KxvX_JR!g27sJGt^r_uCWei<+W;Gsz(fJZ;M22jNXa0AGR1r#rk8;xKC zK+dPg1t0^+$xJW<0N8@(IYBTp88k3NF*GnSL^Py?T#o<% N002ovPDHLkV1gb@JOuy% delta 78 zcmdnPm@`4e!`RcsF{ENn@{j-9f7&z8eDFVi<$s?iS!oFg2^OVaC7E5>3=9lq=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oAT5q|&x delta 44 ycmYfEo}i*Gs15-mYV<%&CO9Kl> X7Z=x^R~eoHRZ9F{ENna>4?JKmT>V&KLU2qpol8Cw WzpN)dCOBSV00K`}KbLh*2~7Y+>=%Rp diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/28.png index 7b93930abbb738b4bd23cd7925664127589fc17e..a6ea0f0769eed4e674df9750b66fdadb761bf677 100644 GIT binary patch delta 132 zcmV-~0DJ#&q5+U3eoaY4K~y-6WBB(+_5X{bQvVr91pohc|NnGX{y&&OjsYOeV148o zfZ~+57i7pc02BtpzyNS`4445wKPV3e11O3GiVXlcpJD?j$xHwgp=>914?mv(000nV mWkN?nGet5oLNzotK}JPIMmaMj_%mYw0000 nJnPeESkTBORk8BYKH~$dCY)UB7^)je8Gyjk)z4*}Q$iB}C*~fM diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/29.png index c4a3b1ae74f4a38084002c2b828c7156e40d41c7..9abf1ab9f6185b7320d4e235ab3fabc05add2a3b 100644 GIT binary patch delta 128 zcmV-`0Du2ko&k^~dPzw{K~y-6WBC8S`#%W(`=biSKR+mgF^CP5hp9p5GrYYZ^B;y^ z9F+oN5c|_zc{oOvhsnYC45MHai~`C4EJu=U04OViawPzYO>eTxp?4+#000nVWkN?V iG%z?sLNzlrLozf*H8?^lu))3n00009XM diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/3.png index 449fa9aa0cf136870a4f318149348add94c30bcf..e191f24a843f5cb3ae8c31d1dd073d5fd428a5ed 100644 GIT binary patch delta 172 zcmV;d08{^P$pMfge{@MiK~y-6WBC8S`#%W(`=biSKR+mgF)|w){&ZLVKf~J#GXG)t z#Zf6R2C+esAPkd(@nINl0J&gr7y$Ab*#>|Dc+>z24FIKHiVXmz+JQCT(H61)4Cpx# zJvYKIEY~7qumQ+95SAm+b0bU*2!k{sV*pjI2`41gQ2zh`CIAp*WkN?pHZn0cI5{>n aI6*NvLqs^ofy3qi0000TrZoCqv30D|6 m68`*;e)WIl>hmYe7#LVNc@rl7UHpLo2s~Z=T-G@yGywqm3?m!> diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/30.png index 8084ded71f23652ca2bcbf96aa08e6364a6aac95..bbd30d9a8d3ec3e511e21a982480a066e48ccf5e 100644 GIT binary patch delta 126 zcmV-^0D=EuoB@y|ct=S@K~y+TWBB(+_5X{bQvVsq1^@qd4*~<;UXUT*08khV0|P$Y zl^;L@etu9M4hB#Z3ltjway~f*fU*DxgAE`jGr^)C00xk48bV($tpET35M*USM@2$G gHAOWuI7BcrIYc)%GN?35od5s;07*qoM6N<$g5onL7XSbN delta 67 zcmbQkm^eYjR>RZ9F{ENn@{j-9f7&y%HgpP|UCh=aWst=n%A4@xe{|QIH#MJ_4%aj2 XzuF9!~gp4^#W?Q8|v#r{@3r){x8qKeVA8<*VQwN rfq_9FCDqB@$<^81!qmyp$lS%m&BD={uXm<2P>#XV)z4*}Q$iB}R7e~L delta 49 zcmXR9n4qE~?&;zfQZXkvL4tL0f=CY&TiaxDiGR!tT#K1zCK|q#X8;0ES3j3^P6!~gp4|Lf~R{!h+5(7ib5zx~~*>bDsf7Ao^Z wN&nh(n1O*oASKnw-NMD(#Kg?S)!EF<*u~k@P@73Y6)4Bx>FVdQ&MBb@0DD9qyZ`_I delta 50 zcmb;poS>pB;pyTSQZXkvL4tL0f(VcJhyUBJ)O&qlW;n8hS!Bm-b~y$h@O1TaS?83{ F1OURF5jg+= diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/34.png index e33a6cd05b15bb07ea94bc5b01ac9a5752c76fea..9f698a757f0ada66e8d8ab61120b1dd1430fa417 100644 GIT binary patch delta 102 zcmV-s0Ga<&gaMEwU@u8TK~y-6WB7De{{M@kQvVsq1t857888Y)!6={%{QuwmAB4#^ z;NKtB|Dd7(03=cvTgSzBsQ>@~5M*USM>0l1Mngk6F)=wbH8({>L*ekTR{#J207*qo IM6N<$f|q|Mt^fc4 delta 53 zcmZo+44$B(FXidt7*a7O`N#k5KkW}|NU$zWSkgRMT;d-ygVA+1@xwnS-)8^faw#@-qb}M^Tb30k-EDf-}R#e*gdg5M*USM>a4tMnX0)GdDy;MKv-;L|0vlDF6Tf M07*qoM6N<$f`!Q_b^rhX delta 55 zcmeBR44t52DC6nk7*a7OIbi|ApZ~gF=L`K^oFLM}w2H}VvkF7gRW^0AtQET%fWXt$ K&t;ucLK6T_JR!g27sJGt^r_uCWei<+qzypI41IY0LJo+gy0Gt2^)PP4@#2^M> z!=OMy#vl#o7;FH@b{GZ)3N{RKDhz`(A!7jTl?h9juWC*JCjbBtWMx7}HAON+IYU81 bFhe#)LNz%yjMg*l00000NkvXXu0mjfgr-13 delta 84 zcmX@bSTsS!&(hPyF{ENn@{j-9f7&z8eDFVi<$s?iS!oFg2^OVaC7E5>3=9l8e^NRZ9F{ENn@{j-9f7&y%HgpP|UCh=aWst=n%A4@#fAp*WD_5UCVaC9) XPm$B4`Hx;I0}yz+`njxgN@xNArsNuZ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/38.png index b220dcccb1ae11b340f577cb8eb13fca130c52af..7560231c91ada7c0178e21284455fd1688119661 100644 GIT binary patch delta 118 zcmV-+0Ez!qlmU<=a6d^zK~y+TV_+BsqhJ&a67c_j_y2!?R8jEH56WPSECy1CtQN*+ zcyUzfKM23QAOprQ_NTk@a14_}=Y!M&0C{O)Zk(aYI{*Lx5M*USM>9n;GdV^$I5|N< YH#s;qG)$+{LI3~&07*qoM6N<$f(QjHSpWb4 delta 55 zcmbQj7&<}4P{z~6F{ENna)Jcw;sg;M;R8SZZ@= K=d#Wzp$Pyf4ii5B diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/39.png index 28378c94cbfd96ff82fb60133d887fb956df5460..3cc37112bc599dbfd6638f79b269d46163fff0aa 100644 GIT binary patch delta 155 zcmV;M0A&AbxB-wPe`85RK~y-6V_+Z?{QRK&|I=Oh|K#dt`1ePZG6N`f0aXlmdqIY> zFc>v}LIeK)@21><7e}QA*nme{#QuXBpa4O}pi~CJ$YLOM=ooAO$Qd9E3J?&6u|eq^ zgkfSZ4AO**0g*JdA<+@wg#Z8m5M*USM>s`6HZwFgGdDp+6*oaSGeX)nXe$5!002ov JPDHLkV1n8eJi`D0 delta 77 zcmdnNm_0$o-N@6$F{ENna>4?JKmT>V&KLU2qpol8CwJ000000 LNkvXXu0mjfYAZLv delta 75 zcmdnRm^nek)xgumF{ENn@}K|Pf7&zed~m;njjf9(0SFekd|tu0n5{>uf#u)-X-d}S e^Y$G0AkR=!#~0zgtFxH_2s~Z=T-G@yGywq8CLZPh diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/40.png index 07edfcbb579d78e7fae34618b6ad0dfb7fe2d380..5a28d1feab90a3aa7aa629b6819a9a8300436bd9 100644 GIT binary patch delta 127 zcmV-_0D%8lodJ*}c}Ph_K~y+TWB7De{{M@kQvVsq1t857888Y)!6<-$|Np!H|NEng zf`5Kc24iF~kUC_wFg`ptzP%s=#xOQ0o5L_n4xJBD3jmS$Y^|*3@?!u101#wlLPt3< hH$*~3K|)0^IW#plLqTh3-8}#R002ovPDHLkV1jSaF#iAm delta 59 zcmbQs7&$@3RKe55F{ENn@{j-9f7&0`kYHV$Ai;3#|Nf=_=I{E|lf%r=xS3Pp&PJ}+ P3_#%N>gTe~DWM4f0@xVg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/41.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/41.png index 60106021433de355b6f6390be0b110f77d704ed7..1971c3500af8d3aedbf425ee9ff57be07bdfd137 100644 GIT binary patch delta 127 zcmV-_0D%8vodJ*}c}Ph_K~y-6V_+Z?{QRK&|I=Oh|K#dt`1ePZG6N`f0aXlmdqIY> zFc|3u{Quwm|HVvo-(#01#wlLPtR} hGD0^)GdD6uGDSo)I722L^uhoD002ovPDHLkV1inYGa&!~ delta 69 zcmbQsm^?wnUdz+PF{ENna>4?JKmT>V&KLU2qpol8Cw4?JKmT>V&KLT-I6gTe~DWM4fU9B18 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/43.png index 122fed8242af464157aed7bb7df91d3283f11a23..a1f470a8d0556322cb8b1b6aa9aac1778bed6cb9 100644 GIT binary patch delta 129 zcmV-{0Dk{yp8=30drC<}K~y-6WB7De{{M@kQvVr91V2A0{|D)10BI)2fPa5fAqJ2O z;4TRN{7>slS{{QbLEB#Q{1q1H|iVUFG1uz2u{akEdInDrZ0000GWMx7} jHAOf=I5;>oHAXZ!H8DXmD`OS200000NkvXXu0mjf$e=BM delta 74 zcmbQwm@z@cMc>oKF{ENn@{j-9f7&z8eDFVCbJJHN10a~Q=fH>gol3$I5)y8_5~c}P c7_=lA7~%~%-CiDzopr0C2?{V*mgE diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/44.png index edd53e5e79f64f6bc6d0a632bebfda997a8e685d..2adc3e238a1ca1994dd4c8f96fa866e7b7e3ff79 100644 GIT binary patch delta 91 zcmV-h0Hps?dXOYmB}qgs(){hkZ-!AY3P!FMGaQZXkvVFAOR|GHo23;kW3Akx$1$jWfYh*_lap6y8nAn|0PebDx4LOG~jYOs3D=kz#uc9+d(Ms_g@AE q27#1RCwFHHM@u&o7gGxhBSRNgLz9kgOWp(J7(8A5T-G@yGywn=@*GM4 delta 49 zcmXR7n4qE~?&;zfQZXm_$N%j=?GI~6ur5vzF)(0Y&~ag|UmTFd%m4(Qu6{1-oD!M< Dwm}d7 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/46.png index 65e2cb1f4dc32febe54847549cb2d9f901340a78..12fa173961ddf12348ec1f01c426227640e5b9cb 100644 GIT binary patch delta 116 zcmV-)0E_=!k^zt;ZaqmvK~y-6WB7De{{M@kQvVr91pohc{|D)10BI)20CFuJ1*2ft z0#L5{_eYhi+z7(p+z8H=Bm$77AbkMWDKOkzjt)Zr000nVWkN?oLPJC_IXE{mI5Idf WHa0hRy};rC0000bP0l+XkKRxlW+ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/5.png index 935cf0bc9b93052458e88cd89db64faac720412f..af7cb7618e5cf5b5f5f39c9854e85397ee224463 100644 GIT binary patch delta 151 zcmV;I0BHYiv;mMLe_u&NK~y-6WBC8S`#%W(`=biSKR+mgF)|w){&ZLVKf~J#GXG)t z#Zf6R2C+esAPkd(@nINl0J&gr7y$Ab*#>|Dc%&NuN_?O+Gq5fgcrSnrfaOH8T>v7; zNz*U`07hxSajS44%m4rY5M*USM@B+HGBHLoH#9LhIWa*r5k|P)qjvxR002ovPDHLk FV1imnI6eRX delta 80 zcmdnOm^VSi%hc1wF{ENn@}K|Pf7&zed~m;H(^ew`Aegh~z=!#rM#>TrZoCqv30D|a jF#fOio;ZK5q=W=R!3M57O9Q%2F#v(5tDnm{r-UW|d(9wp diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/6.png index 624608a6e4075a4784c9cd89e2fb15fa56ad67d4..cabed49d3db7a01f07b9a91c8faaec542ed2a6c6 100644 GIT binary patch delta 140 zcmV;70CWFxsR58Ae^g0CK~y-)WBB(+_5X{bQvVr91pohc|NnGX{y&&OjsYOeV148o zfZ~+57i7pc02BtpzyNS`4445wKPV3e11O3GiVXlcpBw`~Spb9)xr)r_2LK#Yc|r~M uFV6q~01#wlLPt46FgQd+G%-OpLoqf+LNm1P4=4Zt002ov22Mn-LSTaT@G@`! delta 84 zcmZ3|?1AeR6D diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/7.png index 405a4872cece2c61afb37ab2db122b03e6429a10..198c029cb9e4b514bf504a3fbb16d81446d230c2 100644 GIT binary patch delta 138 zcmV;50CoRgrvZ>8e^N71?d9-CvSWU#&R4t s0000GWMx7}GdMRyIX5sdF*iXuMK&@tL~ue@00000NkvXX1g=70f?b+1Z~y=R delta 65 zcmZ3^7(YS9TFukNF{ENn@}K|Pf7&zed~m;H)7HMGKm)E7eEv_YIbjsO4v5M*USM=>)qI6^rvGcrRmMKCosLa7ha QRR91007*qoM6N<$f;Md`G5`Po delta 59 zcmeBSjGUlis^ID37*a7O`N#k5KkW}|NU$zWuxR+df9Z*H=hXEL{;)HA&gRsbA=k5w P0SG)@{an^LB{Ts5@zodo diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_4/9.png index abc40e192eacfa322b6b8256d907a53b3377558c..b8bc13da2b3a7cf0708aeb35aac7b5c4e222a920 100644 GIT binary patch delta 111 zcmV-#0FeJ!jRBA(X*fwlK~y+TWB7De{{M@kQvVr91pohc{|D)10BI)20CFuJ1*2ft z0#L5{_eYidOaaPK;A}}I007T+Bf;iG1quKF01#wlLPs$+GD0vmHAXl@Mlv}tG&uIV R7WM!D002ovPDHLkV1o1IDU1LB delta 58 zcmeBWjF_NeBJb(q7*a7O`N#k5Kkb=kKKP%nx#??PQ=kFY3OHhCFdH8LsR5}4vB7#l1W3TmDuJM87yzjS>46(SjLq0w0yltxOrRufOql`TKva{p zBHI8^EHS9am{Dc`*cp^~fs!x)yI?>KfO~=BghX*tCO0!liAJjaXHbwZ`VV3tV~`lK zI5ssP3sZby_F8yj02w|V(C!@9qJ8S}IhXWzVODQQFVdQ&MBb@0K{oczW@LL diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/1.png index 4fe01907cb5d2227b65e9f9819f67962dad4afd5..36ddc5cb98954d8c43a812300b7aa63586808ab3 100644 GIT binary patch delta 169 zcmV;a09OCl0mT83B!6&8L_t(I%VSWJvHmY7p^bt;V$z}-U<_hoQv*}S0Aerzfw8*p ze>HhCFqI!^{?zKmTvuT&xsR@bH}3vGx1y4NN&WJOoNQ8yb$(mzDXo@yo{< m7#RS8QaVr2!SnO)OEP41n*ZC9{m6j<2s~Z=T-G@yGywoWaY_gP diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/10.png index 15dfdde5af34b3de258046a8bb6e297192f3e3df..8f16c2e093a2f947d5ffdb945335f7a1e001a85a 100644 GIT binary patch delta 99 zcmbQu*uXeJB}UuR#WBR>;mj78s*PcilaJe1SSP+!f zl$y@)pok|wG?n!O0|SFVN~)8)vzdjHtEIV-qmhAug{iZ1g|gNepd5pztDnm{r-UW| Dbn_yc delta 126 zcmV-^0D=F20h%c07lO7e-y7DXN-9k!RO z3{Lz!`Dv9|uNW8@1X5C++)XWHhCFdH8LsR5}4vB7#l1W3TmDuJM87yzjS>46(SjLq0w0yltxOrRufOql`TKva{p zBHI8^EHS9am{Dc`*cp^~fs!x)yI?>Kpx6r(CnV|^Kxs4r05E~eP`!v>$=Uz_01#wl lLPs${MngnKMnXeHI5#*!HbsNS&c*-$002ovPDHLkV1l`iL>>SD delta 193 zcmcc2c$aa4O8pW~7srr_ImufLIe!0tdRm;V=)mj#?-CL`A$$HA8#rW0NXt8fsVgXa zoG*Cn;lqcC7Db7o%7$j%-C2MB|N6}g2EslQBF^#vfq(pchZU;FZtiGkXgE@@cIecH z=0Ik)UdAU&SQ!~R|7++?5WA{yOTf>sZby_F8yj02w^jKz!$X(M3>)Uoo&4}{yLb=C q7@zg__nNKSMHGP6{(pY{JrBdZBr}~=e5K|LK;Y@>=d#Wzp$PzZf=#Ia diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/13.png index b3a29669e0d0087f44366e358597b80caaaefa91..b1cd52ce125448092119bb9b41a94b0d9a3c7e25 100644 GIT binary patch delta 149 zcmV;G0BZld0kHv)B!65HhCFqkg-9m xdI96M;|vT80x79Z?#51*&ZZVlmIiKSmS!d{F8vF$o&n_;JYD@<);T3K0RXu69iIRI delta 99 zcmV-p0G$7OfdP;tT}VkpK~#90W3({{`~T(37Y1^`>yP&s7z|Xr{xdK@Xc!wGKvpLp zAn~6O#^K@NVK{PO6(cb=ON(m!|N8p_S*{)hqhJ)^003^T7};CxJCy(c002ovPDHLk FV1ghyC~E)! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/15.png index 500208c6f80dbf1ecc1a2cdf6d858821950602f8..590ecaa679b3d9ed5c8bcc0612503fdd41e16547 100644 GIT binary patch delta 143 zcmV;A0C4}Z0jmL!B!5;(L_t(I%VSWJvHmY7p^bt;V$z}-U<_hoQv*}SKq^p^H~Vj_ z?hDokGK7H~;AWKoHiT>gU@oD^01!};Hm1w~vH}qqfMRK24H)$T1xb1E7yt?b05%RY xl^eiaumAu65M*USM>aD!H#9>+LpC%D%PDHLkV1n4+FlGP% delta 150 zcmZ3@xQTIsN`0lLi(^Q|oa8Nr9KZiRJuS{wbl`RWcL@oekUjs54IDBgq~#sL)D;vy z&KErP@ZrNmi=sqPWkWOX?yNumfBj|#gFvYbjEsz&P3u%o38;DTN}48kNHchQq(~k( zd6M716-b{uck;u-!`yD0coPyDDjq&R|DK0I>5Ix%CH@O_ml%M+)78&qol`;+0Ni0a A;s5{u diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/16.png index 55d71201cf52b6cdbd7b88297c2da9f6a190c519..550e1dded69859f0a875a9ed611fb78443444d52 100644 GIT binary patch delta 153 zcmV;K0A~N<0kr{;B!6H@L_t(I%VSWJvHs6M1_0@klhFRp04B%)ZdM8Z!IqP202~Yh z1Jq=#C^JAs#*9K2keLpKQ!IcCP?M)1AVCHgtNZ>3rEQA505XIumncXW{g)C|MZq93 zWN~b2VB!D;RXG0cm=16N000nVWkN?VGciLkMK>}yMK(h+I1)KBdh&5A00000NkvXX Hu0mjfHmf&m delta 198 zcmdnW_=s_WO8rVt7srr_ImufLIe!0tdRm+f2->*Iw;37VII6gxrCXC;!i%J6G8LAydS$hNby64j>b(tfB!bhTsQvn=jU8Th94nT+mh?l%^85e)78&qol`;+0Jh~*)Bpeg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/17.png index d367925522f7c574066986af56d7d6a821166d27..f4e05d54757b625b89c7b0c5b15d5e18606260ae 100644 GIT binary patch delta 155 zcmV;M0A&Bu0k;8=B!6N_L_t(Ijbo6L(EhI`WBs3j3;@;#BHXMJ$T9$AIXU_UkpW85 z#*`UAZs5a#w5Y}a8!*znpeAqjpX`JL$~(sDzT_DIvKgcq#Fi3O{m-BvVe}uwK*k_3 zWN~b2Ko}GT0Nuto_Rlci4FCWD5M*USM>jJ!H!(CfH8(ghITSQSL^Q4eS-=1Q002ov JPDHLkV1ks`J){5t delta 183 zcmV;o07(D00n-7HB!8MoL_t(|ob8jb3c@fHMNfiI0s*rK0apjdet=)#2l%P|j*bqc zn;>LK;T0(z;uP%|?Id{idmaz&Rj2xrL^LJ&cliI_FbW8DhLE l0JYy8(>TX3o`7k3@B}1>IUgKCP#ORL002ovPDHLkV1f?2Pp<#~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/18.png index 54608ca23498fa95a7b8883941465cb8e4c31734..31ae7a59f7684316c01ca28217d638c87547d126 100644 GIT binary patch delta 115 zcmV-(0F3{~0gwTZBy2lLL_t(IPh*gi(EhI`WBs3jL;%tQ(hFv|StXEc07wrx7LS5a zFbZ%11qq}7QlhFT7$k-)j!g|r901(TA`RWZm)-yX01#wlLPsz`FhoK&K}0e+F*GzW VLPX0(Z`l9<002ovPDHLkV1j;SCoup3 delta 171 zcmV;c095~w0mlK5B!7-cL_t(|ob8h_3WGopMc>#g3qrOD2x(KK^Z+@52gp%9hh++} z3k0@VVI+vfqzHoLCXmk8|36dwC)fIBstQ2Yw?YQ>xiNq^4iu`I9o*9OtxQXzSR2c- z%nrwKAcV@kJ-V~=KV&P$Bi^%|@cv-Vd4P`#s~9=^4xuvVJR~VS1wc;6i%m=V>HT?r Z@do&mHGMvT!2n_k92FL&&AQNPOjOsaDrZDaT z0W~uG5KIcWQle7ERUogwcg>wSch{t<01RVqsGvJt5h@)%nX c@o8CJtTvlBqb$TCj{pDw07*qoM6N<$g426URR910 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/2.png index 0eec0d5a2e0afebed1d010665bd1108c7b41f5c5..32950e92af13dd865486b371119469a2d7a22687 100644 GIT binary patch delta 111 zcmX@g*uywMCBxj)#WBRfKRICX#((g4WZXy|6?WbS5aX=LGO?CARD@%_U< OIR;NxKbLh*2~7ZY?Eo)%{-I`F#xyMzQ!$ew@31`Zh#(((>r>Iw=U z=L;Tt`0!z(MNy)tvZ0xGch;Z(zkV}Eu9IV3++fBqZ%Taqp5q_BeC1s<$w*!Oe|=e* z9~%g$0dX65`8LD4zkeGY9UPhx(u4#i{5XH^+{q6Q4|6NI0p;1;yo`>WpMPJHA>*Xc UQLBW|84N(+>FVdQ&MBb@02FRUDgXcg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/20.png index 379a83775df827639f8477d7fadc5c9b581dec11..1d814cd8b77d192433c89174bd050cd5e164c9cb 100644 GIT binary patch delta 107 zcmV-x0F?i-0f+&RBxEy5L_t(I%VS_56R62p|Cf`{{!gxc1~;pO{~$vcM!_f;1&CY) z${1v4CQz0nCs)C;GXN}(5~lrUBKiOT01#wlLPs$(H#s#oMm0h+HA6Q=H#A)Od*J{8 N002ovPDHLkV1jtBC4m3{ delta 150 zcmV;H0BQe-0kQ#*B!78HL_t(|oMU7l0~n}y{byicV0iuU9s?6O1~4!%FkHB^jq&U6 z4-AatXqFb$`2Y3y2XgHm1*3olfDt)kJbitGsHDxw$^W07os)rqfdP`4U>Sp0z|PLe z@ZrM?Mg|532By~^?=c7nNc<690ex{LTOXnUf|)`wvp$EdT%j07*qoM6N<$ Eg0Rp*@c;k- diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/21.png index 95698994e881f1777da37eec9733cdd5d34a8fc7..f0f0a83f9d03a748c8099315a0a25508302ff0e5 100644 GIT binary patch delta 102 zcmV-s0Ga=_0fPaMBwsE`L_t(I%VUs}(EhI`WBs3jL;%tQ(hFv|StXEc07wrx7LS5a zFbb%hnPAx&03{m|ra+S9{{R305M*USM=(S~Ge$%+G%_4>508fwsGOFkB0LHaJ zjRY?Qsx#y8R1pDSUM53C~t>x+B7-Hd{JYn*Mf9utf|ITl8VYtM6i92mar0Rqm1`mEqvHqq&1Fj5K z24hX0e6bfl%^4UN1X5C++zm`zU5(9++>FdzoDEHk&Eg$5>I3B%JYD@<);T3K0RU)F B9y|a5 delta 111 zcmb>LWt^ar8RF^U7*a7Od5a;(@BdFvi?abi8+Z9OLn8r3o{&BNj13G7_WY~pZ+v-r zy1q-c3!C`6oa8^hels%*pK+0slUroEA1LeS;PA+P<+Q%0Km)E13=ID&r6(%XuUW?c N1fH&bF6*2UngGSWEI$AM diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/23.png index 8877cb7ddff9fb4369e33548415efa5254dfbe8a..c7704d6494233ba7471ed5205d5da2f3191b7ca3 100644 GIT binary patch delta 93 zcmbQoSUo`{T+P$PF~s6@@`TA3{;gL_{yV=hhT+niw5bmJ7#Amq^e}0qs(EcTW|*>_ xCttnJT91K&K_Dg7$=$`-(%8}1)!fzG#oXM|&3HCTye3eN!PC{xWt~$(698-s9?Ad! delta 128 zcmV-`0Du2`o&k^~dSyvOK~#90?USJmfG`vVuhkWm4A22O026coMr95pg4CgEX!22r zB1rK43c>k%dFIR*rzRo*EZc18#EOVYd^3?8 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/24.png index 4b73d1579b38f6dd866949a1ea6989f8f35c1174..97719348f5ee47e7822310c09bafe271719e6bf2 100644 GIT binary patch delta 122 zcmV-=0EPeD0ha-gBy&PZL_t(Ijbl)gvHs6MCIIV|lh7vH0I=SnZGe)rF=YmT15r)Z zifjXI7uMnN<; cH8D9sLP10}Fu=!1fB*mh07*qoM6N<$f?Q%RS^xk5 delta 192 zcmV;x06+hi0o(zQB!8nxL_t(|ob8h_3c@fHhQDMffq+?rfUARJ58w$rfQR$|J%I_ls@0PccRSTwMt=DA&6L;M)cnW6U0$;_6CV zZvi>%MlMC62;m|CEo)%{Vf;R5*ZH7h@IA-jt`RO#xZ3iO{5U^>* z{jaR3IAPw<*x2~+L~H1iorfHbzP68)x)^Jabzp*d!=xK1|aZs^>bP0l)%^o05jq^TmS$7 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/26.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/26.png index 55b8c22f96342710343c2b20d87e4ada218240c6..93141a8a28f1a4341d2fe4cc8077184d33c177be 100644 GIT binary patch delta 71 zcmeZHo1o$(=;`7ZA|aV9!MZp>q=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oAT5q|&x delta 44 ycmYfEo}i*G5rRWH_I`5=7-0|SFVN~)8)p{bFHo12NVv5~ojiIbV-)u(-?Ksg3aS3j3^ HP6pegFUf07*qoLIt2g# diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/28.png index eb280c73e0ef331aa11e89f3d97a081a26d75e2c..54d3d594418a4a4fb2bfef1d2ea89472a339a378 100644 GIT binary patch delta 119 zcmV--0Eqv(0h9rdByc}TL_t(Ijbl)gvHs6M1_0@klhFRp04B%)ZdM8Z!IqP202~Yh z1Jq=#C^JAs#*9K2keLqPVBiCB)Bwt(5dcS09KFsP7l{A>01#wlLPtVIF+(soMKCc& ZFhw#oG(;8{gVF#1002ovPDHLkV1mKqDUkpG delta 158 zcmbQjxQlUuN`0fJi(^Q|oa8Nr9KZiRJuS`#1Z~{q+YF5a7FN3|*)DA2?{bp={QAwzEPTdAPEKx->3*QBql3dEduAZu_W5w4HPmJIqnEFxIkp=7 zpTIpsT){X&r9R)&#WAE}PVyE*j^F>Eo)%{-I`F#xyMzQ!$ew@31`Zh#(((>r>Iw=U z=L;Tt`0!z(MNy)tvZ0xGch;Z(zkV}Eu9IV3++fzQVo5ijh2_uxn>QC58GyjVWCm+% s^~3G_`VuG28X6fV3D^JobB=-GN4uivmYqv$7=Xaj)sNL>ol`;+08gU@oD^01!};Hm1w~vH}qqfMRK24H)TOpeP|xl$4P(la#3H ze+C5!qyHcVG6snui(^v*!k{n!0M|oL+%7o_%K!iX5M*USM<6gmLq#@5HAOQO8rbv7srr_ImufLIe!0tdRm;V=)mj#?-CL`A$$HA8#rW0NXt8fsVgXa zoG*Cn;lqcC7Db7o%7$j%-C2MB|N6}g27yu=7#SHko7SnG5>WHvl{8K8kY@1q(Alu$ z&#%X}ZOhl^3rsb#wEX#S<%G`0#>R(-=H~Xq*Vij(RdVTbc>GCEf1dK=!$VeOkYUP2 h#}q{W{P{VTkzvYOv-Ed*Ee{!hz|+;wWt~$(69C+`N^<}J diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/30.png index 0941d68901f481665263cc555e40f6da5bd3d5e6..8583910d2758e6a37f802a45707df2dd78f77dcc 100644 GIT binary patch delta 109 zcmV-z0FwX50g3^TBxW^9L_t(IPh(J%vHs6M36PV}9yNec1Jq=#C^JAs#*8upM$^Gi zHo(m);XgPA$&E&kK9J=APQ@I(z=)`|0000GWMx7}I6*^3G%zqjK{7H%K{G`&>oiMi P00000NkvXXu0mjf86qcs delta 171 zcmV;c095~q0mlK5B!7-cL_t(|oMW^x2>bu#%NGU)1_p);ceXJykO-K*eEC9_Mz{eC z3=9kgDqjD2czDP+fPsO5;mCzmbu#%NGW6!0V6q7#Ivxy#6yVKxh~nA3#Gj8Z3<3fY1al!S008qoDH1Xh_J05X002ovP6b4+LSTZ8PdL;7 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/32.png index 7d3e9221fa2c039932412317edd737f22538f420..1daa027044551603890fe64748f371f2dd0b488e 100644 GIT binary patch delta 88 zcmXRcpP&+~F9LE6+0@xI4?+23SqFgfj+@t>XH>t{BL%IxmF s3=9kcDXC8GCI+s?#;%6OuC8XzPOi?*pWGhJ0m?CWy85}Sb4q9e0I*^o8~^|S delta 82 zcmXRfoS@=s;pyTSQZeW48ATxm1rCOThYw9K`St(0WF{Zy{{s>?>)6+B)n6hs^K6JI mgInr?tR3>2{0!G_NfuW2zT~hie${Eq00f?{elF{r5}E*ammrY< diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/33.png index c1d213c656be8e7d3af834ddbce6906d366d6eae..d239de4247279dee01b652de8039e94c3e70bcb7 100644 GIT binary patch delta 90 zcmb=aoS+h_;_2cTV$qwNAi=sgL4-$Wfm-t4`)9Qt+TUb5;hFKDUD9b?9YcUDn}yY} upRXAh7z9#Mo!pI#O-)QpjEvnJ&5Vtmj0|+0KVAgNF?hQAxvX@_4Nv;S$)>q-%Az{nDE1YS{@r48$-te0jm#@^*2`Ew zWU!jUlmEl{hz|n;gFs5Ele>wNv8%I_qoJvznVF-di3w*DixyCh!PC{xWt~$(69C^j BAEp2R delta 124 zcmb=Q#W+EwEYZ`&F{ENn@)kpm-~XSU7H0#3HtzCmhDH-OX6&o^=`_u42O|#r6=F^+GY-@+0D-5gpUXO@geCx=6*Q^< diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/35.png index 37e1a97056d3c1d6dfb4b41029b1e046eff7807b..5ba48646e1c17bf57a4e4415ff77d065a9861e12 100644 GIT binary patch delta 104 zcmV-u0GI!i0fhmOBw;W~L_t(I%VS_56R62p|Cf`{{!gxc1~;pO{~$vcM!_f;1&CY) z${1uD0Lqe-bP0l+XkKi}NmO diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/36.png index b7d15f78966b4799e3452c9b3a78a905702fbaa2..05afcde61ba5fb8bd4e6c647fa3d10d788a0b1e9 100644 GIT binary patch delta 178 zcmV;j08Rhm0nP!CB!78HL_t(IPh(J%vHs6MCIIV|lh7vH0I=SnZGe)rF=YmT15r)Z zifjX8=& gGch+oH8w;zMlm%wG&xJ^%m! delta 198 zcmX@d_=s_WO8rVt7srr_ImufLIe!0tdRm+f2->*Iw;37v?$0f7lW&bvfN)){0SSYX&NXG_CGp{1^-9cC?)C)>-fo7UOLIMFa+nb4-0bLUQe yc(`4>hX)9HE-jM!zyIGqho;AZ51yZY&%+R-VU@5!%5gpe5O})!xvX(8l41sw8WC&Rbu#%NGU)1_p);ceXJykO-K*eEC9_Mz{eC z3=9kgDqjD2czDP+fPsO5;mCzm$h6z&AG00000NkvXXu0mjfAc;*R diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/38.png index b531b2f598c3703abae4e24a5663371558a4afd1..305b817f077e3c557eb4626b5393d5f798eb4a75 100644 GIT binary patch delta 89 zcmbQmSUy1|Sjp4HF~q_@IYEMTae@es_yUE*FY#U>qO8qFCLG)L_t(IjbmV-0I11W|EEMhgPer+P&YtH+L$r}C=NtvQH=pM zV5ECNP2TK3*$K(bD&fDex-WSKfNTb72C=0?RsS<6NErPGF_1Ax3|SnT8W0AB0RWjS yGQV(d^<)4501#wlLPs?;Ml&%uLqjq$H8wIdH8w6=wyOXD00{s|MNUMnLSTZ?X)>w+ delta 160 zcmV;R0AK&C0lWc_B!7cRL_t(|ob8jL3d1lIMb9gR61A8?V0NOi-?0zgcT7%Vv8~}6x0Bc>=cE2F% z4NCrip9U0>+U+qWf3Gsrn8Rve1D|8m=xMFXU1td4DFCuP#u?tE^kxCGV=H7sF;GbW O0000B!6Q`L_t(I%VSWJvHmY7p^bt;V$z}-U<_hoQv*}S0Aerzfw8*p ze>HhCFqI!^{?zKmTvuT&xsR@bH|OTf{9jHq#B8i;Zf2d}x~32m~*`9rBe7Kz^hfK)dYLMYwX*!Tk^)r|oR z&l~sQx~d89_vV}jJ}q>8E90Drv9cvO#>$-YEwh33@c7X{9o>3-#n+~TY$NP=dBq=%o=AuO%Srg zK|~zVDQY))Tfw{EGhEJ92+~w-0ti!&mH+@=pH9tNL`lleN1f&^0>}UW&iN$m{y@YV z*v&XWCEd)^#WBR>;mj4RQ5^e`IBv?b3xP;vP zFLenGH1Obwl$k9x!-8RkiS)JYDY`Zc3=9G(sZQ=Dh9>65MnQR|K;l0k z%>n`v|Jm6&89sb?!N|bCz`#gJ#`yX3I|BfRe<#Al;6~5@015yANkvXXu0mjfXVyVz diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/43.png index c26fd7b55a3da93ecab7a39fc272629b4f73c880..2fbc09e13a9b6c0a9a2e6f6ffd5e25ef6d37e61c 100644 GIT binary patch delta 116 zcmV-)0E_><0g(ZaByBuNL_t(I%VUs}(EhI`WBs3j3;@;#BHXMJ$T9$AIRhnN;0;ic zHm1w~aswX@q(wCb*nm+l42z@;3IhNFN3|*)DA2?{bp={QAwzEPTdAPEKx->3*QBql3dEduAXwX?B?53`18#L&K4JH7{OC z(*zG`25*lP$pa@(^82>}>2v2!et3A8+ieqXLPA4@)WhfJ-}5kR+OM9wLC>X_0SG)@ L{an^LB{Ts5e?36p diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/44.png index 5960b796a4ebf98eb5d91b6191a3e0077a0efdfc..fe79ca008e7b1bec69f453d12d6f96a5761f157f 100644 GIT binary patch delta 92 zcmXS|o}d!0=IP=XA|aWqAim;c#Q*7&FZ?_2pjWWj>&JSv(!F~&Touixb!A%s>43U#R(!kO^!?q9;?_a`u9E6 sV_;wqNJ({aw=lPKwKR0LbaQsIG&FK`>OR&n6)4Bx>FVdQ&MBb@0OHmj`2YX_ delta 84 zcmXRfo}l7y<>}%WQZXlaiy_DF|4&bgvjIUHclkC$qX`@{_SO7!n&!5Hkp~FawBr6( lR#coYO%~~C3UuIQU`RjD$F|Cr&5{8KJYD@<);T3K0RST{9Etz{ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/46.png index 3a1129de301e1767bfbbaee1a8fb6b68724c8d1d..37dc736a8b365d399031461a026db829f372dcee 100644 GIT binary patch delta 103 zcmdnT*upqLB|+cQ#WBRfKY7CB3;))uCI6k@=)!P``4V^9j!4xBISd~BmSX))fd)B@ zM`w0kdc(s|s3CE;{$s2!0|SFVN~)8)k)^q@i=~;ftD&Qtg|VC2Qu7}NfpQFp# delta 162 zcmV;T0A2rt0loo{B!7iTL_t(|obA)G3BxcDM&TzlLLi7r50C*oKqkll8P#*ROkvy^ z0%~Nq5KM|o5ezOb0eAlT|E_xO(%w`=0O*I#VbGqh3Q*<|FCymQRzGy^`L6i&VoJ$8 zF7rsvjsE)daM+LAhB1}9sfid*8bSp4wy=g_6+)!ehXe5ch8vM{qs#K*0}8h^0Uhi% Qga7~l07*qoM6N<$f(rvm5&!@I diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/5.png index 13733e04cf7bfebb05c200b6e623f0534ac1a599..4960302f5efb63148f256cc3bca24a5f71b2c20f 100644 GIT binary patch delta 153 zcmV;K0A~Nv0kr{;B!6H@L_t(I%VSWJvHmY7p^bt;V$z}-U<_hoQv*}SKq^p^H~Vj_ z?hDokGK7H~;AWKoHiT>gU@oD^01!};Hm1w~vH}qqfMRK24H)$T1xXpj0FX04X`5^V z$j+9~FaQ988#&B4q2mSs000nVWkN?oLpC!xGDJi$GDSHvHxe{7F*rt300000NkvXX Hu0mjfVka~^ delta 182 zcmdnWc!_a>O8rbv7srr_ImufLIe!0tdRm;V=)mj#?-CL`A$$HA8#rW0NXt8fsVgXa zoG*Cn;lqcC7Db7o%7$j%-C2MB|N6}g27yu=7#SHko7SnG5>WHvl{8K8kY@1q(Alu$ z&#%X}ZOhl^3rsb#wEX#S<%G`0#>R(-=H~Wn*y78Rkp5gh<;RDItjZu`E(7g7;dPyf hN$7w5zdz>~7?vG0c^$MUCYJ#SJYD@<);T3K0RTKwO!EK$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/6.png index ad2c8a0ba6d3a4e39f6241ab4587109b26914ae2..2d52ef1c5eba68747bf549774dec95e03c252139 100644 GIT binary patch delta 121 zcmV-<0EYkB0hR%fByvGXL_t(I%VSWJvHs6M1_0@klhFRp04B%)ZdM8Z!IqP202~Yh z1Jq=#C^JAs#*9K2keLpKQ!ET!1K^p7((DWXIYc7#ckuJj0000GWMx7}MmRV_G&3_q bG%ztlGeJZ}b9dGl00000NkvXXu0mjfe*G+K delta 189 zcmbQnc$0C0O8o*)7srr_ImufLIe!0tdRm+f2->*Iw;37VII6gxrCXC;!i%J6G83AydRL1+fjAi;Zf2d}x~3 p2n3v#$rG4ZSXBP~|MPP$BLi2trIloMh&clgc)I$ztaD0e0sz6*Pg?*0 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/7.png index ab6211e3f99207abe8880c84d2fe68f4c70ec3e5..f2f52250590fdb90ea3cfb3fa75c0a1e6b71b42e 100644 GIT binary patch delta 112 zcmX@k*vmLUCDX#w#WBRfKRICX#((geQU(SFfs|AycVlxSO9Mx9V{<2SLt_gQgLQEY QjzBpEPgg&ebxsLQ0Dm$gu>b%7 delta 171 zcmeBWJkB^lrM}P8#WAE}PVyE*j^F>Eo)%{-I`F#xyMzQ!$ew@31`Zh#(((>r>Iw=U z=L;Tt`0!z(MNy)tvZ0xGch;Z(zkV}Eu9IV3++fBqZ%Taqp5q_BeC1s<$w*!Oe|=e* z9~%g$0dX65`8LBzleXQwX(?$}Q*rRb0U-GD>#;2xqY5Ku(@p_d4i1k$|9^hAW@f0m WYv?Jyb*eZ65O})!xvXf$rm6t+LnrK{Qq@Dje*r*hS_>f@?YOu&0g{^50P;LC z<>w|RyuX=q9#~!Ihfdz#vU$}xPbn_}sPa4#V{JR16Ju@5@)qF-bN(iFYOu&300000 LNkvXXu0mjfyd*`r diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_5/9.png index b0ae72f06452bdb26ccbeca105643ad82f17881c..025147bc6e064693204fcb89515967f828e0b888 100644 GIT binary patch delta 106 zcmV-w0G0ot0fzyQBx5p3L_t(IPh*gi(EhI`WBs3jL;%tQ(hFv|StXEc07wrx7LS5a zFl+(2nF$Wa&CW0Y0Dm?Trnp4wN&o-=5M*USM?^(MH8VvxFhMg$FfcEo)%{Vf;R5*ZH7hyj65NG{uvt>80`61(ck#; z^mKifY!^21cR9&_e*I=<7Cz%5CnvYabU#qm(ZS)7{mN;5O@R*92Rh~$&fB-ov1ndG jQi4MYPZ5LgQb}fpW(n<6$9W6#7=Xaj)z4*}Q$iB}(b_YU diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/0.png new file mode 100644 index 0000000000000000000000000000000000000000..cd173832002283b56ce24918ebba891df8ef54e5 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^E_P~Lo9md2JIGXFyKi2UmA1Z z8f%VDj&4q_&Z6%{O&$taJCr$Di$3Ef8k>GhyB@CaW7D pXQ!k(xjQ>rx|o?exmXyOIXf8}7@Q8BX$h2L@O1TaS?83{1ONq!T(1BC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/1.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a85d4f5a8370ee16abb52a8d155ef24d99cd71 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gd*1#Lo80u4K@^NP~ds||Nckj zb#(`h9=v++>QTnM1zk&*G<;dt&YPRTyzAqK>EGwS-qFHb{A0#8+a|vmJonFKY6|Wk7pJ5; lxtp6>8aWwS8XB6pnz|afy4}6LR}(15;OXk;vd$@?2>^A3Uw{Ar literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/10.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6459130e8363af9fec3067cfd38b0705881a57 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`0C2A>u^pumy*zcl86 z<{pdo>leJA1};pnpEJST>4dYA(kf=3^cON8UM~xaN@rNZD0%Q!wvy8BV3)wd%1xK7 z(z}+d=R5I_!6L~o^?i%vq+OB%oZrkd^RMPeFFiZ0QSLyn(7K;LUl}>PI?Huo`iqIN zJm1fiHHB@cJ1<|uz_s8-A?s8FRglY4Qk~q*jSWnVT})jpO$;2JoE;6%ZsCgr$}xDl L`njxgN@xNA>SRwL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/11.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6459130e8363af9fec3067cfd38b0705881a57 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`0C2A>u^pumy*zcl86 z<{pdo>leJA1};pnpEJST>4dYA(kf=3^cON8UM~xaN@rNZD0%Q!wvy8BV3)wd%1xK7 z(z}+d=R5I_!6L~o^?i%vq+OB%oZrkd^RMPeFFiZ0QSLyn(7K;LUl}>PI?Huo`iqIN zJm1fiHHB@cJ1<|uz_s8-A?s8FRglY4Qk~q*jSWnVT})jpO$;2JoE;6%ZsCgr$}xDl L`njxgN@xNA>SRwL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/12.png new file mode 100644 index 0000000000000000000000000000000000000000..cfea3803538ba0f4c8bc236826ddee8fd6ee8cb7 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>+}rLo9md25sbRFyJ};|NRFB zZT<}g8;mw=G7w2|@t$S1)@zB^jw9=YBabP^DApW*bjv>B;PEYQUj~I_{xMk{b$it$*>1x-7?MK9ZmKq~YlTZ-ub4 zyx!`n2I_h7+J{WT*Ewjnwl=7~P%+w=!>+S!V#-OWX7)zum&w_S{#||h9pv7WR3~>s iM^k5GLq`Kk10xG#Crgv+SXFhP9D}E;pUXO@geCxX>|3Y+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/13.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5ae14b4989b37886d33dd266c92cdf80db07ff GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar`&K79YOe|6l)KKw@sc zzl_Q;hNL+)AKCOyG_XwgnQ-*RlMAMamwS5o%>|}2TI8x6YdCv7FS+AkNV|;1_j*TW zHueKr?WehSFxY%KY03~OAEDpY`D8{*lG0AL0}OW86TBBjm?ji+`ZaT^COWM;w&rmBld!lBB9mCyz8)o;{3%fw>Oi6WecQ$r5cQZ0FH??qc YGBtIyNLkok4U}W>boFyt=akR{0OLSW#Q*>R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/14.png new file mode 100644 index 0000000000000000000000000000000000000000..09b53c4d9ec003a6fa121dbfabf36c68918d1351 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr`%BgB>s3HG22WQ% Jmvv4FO#plKRZRc@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/15.png new file mode 100644 index 0000000000000000000000000000000000000000..2990627939e9e1e19385de510064e2edcff0142b GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Lo9lee|&#`|37p5|G(@P zU*weZ=&?UCZaDBPd;7yC9uJ0@{NX&T-|G`sxikLYX_oA`&QK!lX~ghE)k%-3akBos zKj{Y~4N`V=X*A?;-eB0|)0o9}lqGEW#3T-`_K@odq5bDgZv?4_@!s$`wz_XdNc(l} z7Lx~D(mO16u|1j6an@jp!GUQxiL)-4Dt}J2lwjcOx4*eNLr@*$)|6BycSkdGb5l1% dQx``wLvtrLlUEzd}Q2E4R5D>Q1%hTdKlxOR+`avSdnyZ~fz*r`t7Y|ruX6<-rcN!g(M?4eyFr((b~eiWbxU<7g;{C)$-e!^47#;f!v&u m>g4X~Vq#|D=;~}}VrXn&Xyo)S=ye59j=|H_&t;ucLK6UrYF@km literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/17.png new file mode 100644 index 0000000000000000000000000000000000000000..2106989a1bb8751fd06b65fa090a5051b7ac7791 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>+}rLo80uoovY0pupq0^MC1{ zhSlN)g$1PrrG*)1)f1%tTyUGjru(=5l9Q0&T>Xn7ZGVqReXg&$yi2ob?E&TuKduOG zu4iax*p@8Opj;`rw{U7muc-E{(2N_tMi0c7zCEOo%P;gkd%@K_vu!ti$7UU5={fU= zf%E>Zhk`ba>&^1n)*iTbf~-> iZ0c%Z=44@M;p}4RYUCn#R(%doj=|H_&t;ucLK6VGBV3&T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/18.png new file mode 100644 index 0000000000000000000000000000000000000000..ee97c8d20310636ff201824085973e243b83b3ee GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr`%BgBDxm zN>QdYQ#2ph8T9^LyKv^JARp%-b7rMu|J2s5a&ukcHtQ_2ZNqYvn9rZrpJrHTE~Zew z$bA`)`{%-mUJXw&U!Q2)&6q1Hv?)%{XfDWkDXC8GhK^2#E~X|HW`-tiu4V?tH<-5H Q1;M1& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/19.png new file mode 100644 index 0000000000000000000000000000000000000000..9dbaceef5db476cba45ecd780355997359e01e5e GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr`0S2H)moP~<57Um9~j z^G_jP{pr6lZ52-^8XF2aaR+5Eq~v&1_t!Gt`Tz0jPL_rU2e$){X0xY#yTQqLIzsJ5 zv1i!D&S15@Ya*|%@;a`@sPI1`Pjt~H<4L>Lv97$Fm9yF3i7nwwVod6*L;5KU>&@43 zl?m-twX#h}UcEp%C-?3Hc5gEYoj>#6ft{F=>f~gH%^V&r0G;AClF{GPpad!CGud5)82qowEmpOvq)oNmtc*f9CT zk(k4QH6?|NlVX$Q3P0=l_gdwcFX?#*a$HKPle@Wrv$>m_rG=TJtBbj*lZ&C~mPVi) NgQu&X%Q~loCIE^mQPltd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/20.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6459130e8363af9fec3067cfd38b0705881a57 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`0C2A>u^pumy*zcl86 z<{pdo>leJA1};pnpEJST>4dYA(kf=3^cON8UM~xaN@rNZD0%Q!wvy8BV3)wd%1xK7 z(z}+d=R5I_!6L~o^?i%vq+OB%oZrkd^RMPeFFiZ0QSLyn(7K;LUl}>PI?Huo`iqIN zJm1fiHHB@cJ1<|uz_s8-A?s8FRglY4Qk~q*jSWnVT})jpO$;2JoE;6%ZsCgr$}xDl L`njxgN@xNA>SRwL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/21.png new file mode 100644 index 0000000000000000000000000000000000000000..0beeeedd163c0cc8e7e8c56e123aab5d0e0cbe59 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar`0C1|JkWpukc5zcl86 z<{yjp`xpG5Y6N8DRw}wXok(PK$Za|$X~h0#*UGDQ91NZgZVRe?T~f-sysmucTJX(r zrqa7?;XV7!OoF$Hrg^+db2xJ2{*t$=Ds!fo%x14*@b}#D?D^``3@gp06!b4D@0NHs z_bpTAhMM*AH4Lf-Z?XbsB*cQ;m6Gb@?qqIh>FDHS?rQ2{Z0KlebXIZ`$juC%u6{1- HoD!M<2+vJ4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/22.png new file mode 100644 index 0000000000000000000000000000000000000000..52444ce67d51aaa962304b04b5bae9ad31216933 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr`%BgKqOSIB@L#d%cix z`G@0{e^{NB#Q7$uW$b_F=$$Fya^$zGjogjRe^TE+%(eELmgMcgw9jmTP<8Q?+pjrJ zc$~PnMp$+3efF-Htpc+Sm~byV`S)zp^|MWnO&T!0}Ty*AqbUTNEwEu?LGdgt} z)3aBr_-`wJdRN-{Md7Kh=M+HBN=bEcH*zyKbTKe?aFVdQ I&MBb@0G>!tF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/23.png new file mode 100644 index 0000000000000000000000000000000000000000..52444ce67d51aaa962304b04b5bae9ad31216933 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr`%BgKqOSIB@L#d%cix z`G@0{e^{NB#Q7$uW$b_F=$$Fya^$zGjogjRe^TE+%(eELmgMcgw9jmTP<8Q?+pjrJ zc$~PnMp$+3efF-Htpc+Sm~byV`S)zp^|MWnO&T!0}Ty*AqbUTNEwEu?LGdgt} z)3aBr_-`wJdRN-{Md7Kh=M+HBN=bEcH*zyKbTKe?aFVdQ I&MBb@0G>!tF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/24.png new file mode 100644 index 0000000000000000000000000000000000000000..7ac77cb9d060d4a5855b420c63ffdd90a313d9d2 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr`0S20QW{P~iCd|Nckj zeTTZ=e~2oRY|CuSRZ;WGSQ)|1kSQGWZbNm$b9qaKpx*)vNsN*QSKW8yIdd*ojb+W_ z?511CCluoMra!U0? zOohN3hSx6dh1VWCvyJQ4!EbBqe=uzcbH1N;{_qNr6H`*1+zl*DoeYgl&5T@3oSlu$ VUDp2luLP81@O1TaS?83{1OTYkR`CD; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/25.png new file mode 100644 index 0000000000000000000000000000000000000000..bcd407525ae4215c838def5afa640f6fcf0ea8fd GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar`0SPP)t6pup2|vtCxb zfGd8^;p<6REnA+RTBy=;|94fZnBdCas$2J*J@=L8?QYw>TV&I(UgVNkFyB>BXmKff zT7$_WE{EWxzF)SgTmL+6HVVHivdN6)C)b8u?x%C~C(3-(PxuvZaNFB}hB-?T!VaAg zW!a!L=YRGJ7nWkjz?)`)BDYH~-)%`2G1gGj{swYkN~)8)iHobFg`uUfk-4Fvk)@>> TN8Y+OKsg3aS3j3^P69`n|xmFy3Do*iiPSvf4-LLFzYPW3*RqC z^ct(Ptrv=3`+icEVe^xUjQ{gbfgF~S>f~TV&I(UgVNkFyB>BXmKff zT7$_WE{EWxzF)SgTmL+6HVVHivdN6)C)b8u?x%C~C(3-(PxuvZaNFB}hB-?T!VaAg zW!a!L=YRGJ7nWkjz?)`)BDYH~-)%`2G1gGj{swYkN~)8)iHobFg`uUfk-4Fvk)@>> TN8Y+OKsg3aS3j3^P64bnb3i?$xs;0V|vp87(!}|J?mrqA_hU=SJa)H`EKR zY@0jfWZ}K|58Ui4M2uaz_i2LMm6Gb@ZfWXfXl`ljVrXJ!ZsB5N7|>p=29#s)boFyt I=akR{0FS9lOaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/3.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d3df914faa878772afabebd463963cd2ec6048 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vpiiKLo9md2JPl+P~ds;zy7#< z!B_SenHbraSeY(MrX^Q`yS@DCF`pf;nCw+Jd{!Pw+S8Ji>$1ed?e2=2)4cg+Z`jv` zEzr!~bEkRUO5^nxv{rmw_KT}V$aJGfqL5>o5WmRB(09un-m+KQr?Q^XxgZI0a!RU` kyQ`VGp{uiznUkxNrG=}hu}}4MFQ6QQr>mdKI;Vst0O=!EW&i*H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/30.png new file mode 100644 index 0000000000000000000000000000000000000000..258f4cf4463ecc207475e61e942ddecf664be459 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr`%JCm$4L5ae_saR!3BEd`&Y3vf2r@J_0_VR+zkFki!yAl8NmN0tj)LysKES?9q2AZ!og zlc4Q$cE8WO@Oizs)J`k8gWYRSgg0De{443dZM}!^NBx8&Cwuqi=$>FX)5+ZzWl`kH z7$~0C5Sm~;@!+yWYjWE&L~sB6aZtZ6Ktg9D=a1bWH>RXIxjS39xS6?_I=UJgm>L^ehQ-S~h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/31.png new file mode 100644 index 0000000000000000000000000000000000000000..09b53c4d9ec003a6fa121dbfabf36c68918d1351 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr`%BgB>s3HG22WQ% Jmvv4FO#plKRZRc@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/32.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6459130e8363af9fec3067cfd38b0705881a57 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`0C2A>u^pumy*zcl86 z<{pdo>leJA1};pnpEJST>4dYA(kf=3^cON8UM~xaN@rNZD0%Q!wvy8BV3)wd%1xK7 z(z}+d=R5I_!6L~o^?i%vq+OB%oZrkd^RMPeFFiZ0QSLyn(7K;LUl}>PI?Huo`iqIN zJm1fiHHB@cJ1<|uz_s8-A?s8FRglY4Qk~q*jSWnVT})jpO$;2JoE;6%ZsCgr$}xDl L`njxgN@xNA>SRwL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/33.png new file mode 100644 index 0000000000000000000000000000000000000000..c2437866f1b291e8076b2374ffb767776a7ad28e GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr`0CPC6}kK!L;M<$hV| z4P5%y9+sX|HFDvY!LMFgae5cCpx{-;Wt+c9ez<=&I&&`L1~#L{t=B_T%AR*DYIA2= zT6#{#GhTMWf93}smRt7*r+LguQ&4%6f9>9`n|xmFy3Do*iiPSvf4-LLFzYPW3*RqC z^ct(Ptrv=3`+icEVe^xUjQ{gbfgF~S>f~FDHS?rQ2{Z0KlebXIZ`$juC%u6{1- HoD!M<2+vJ4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/35.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/35.png new file mode 100644 index 0000000000000000000000000000000000000000..c2437866f1b291e8076b2374ffb767776a7ad28e GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr`0CPC6}kK!L;M<$hV| z4P5%y9+sX|HFDvY!LMFgae5cCpx{-;Wt+c9ez<=&I&&`L1~#L{t=B_T%AR*DYIA2= zT6#{#GhTMWf93}smRt7*r+LguQ&4%6f9>9`n|xmFy3Do*iiPSvf4-LLFzYPW3*RqC z^ct(Ptrv=3`+icEVe^xUjQ{gbfgF~S>f~QTls%0b$dOIap0P5JiqYjTI-vY%a=d%Wu(_r9#RlJI>!tssk?-{DQR z`m;0d7;>04blhd|IGLc$F{TkzEVaFaGLOI9<4`f!8DI!IJY)@hpvUXC7qS{=qcC r2juRQR3~>c3s*yP6LTjQV>dH1M<=5d0>>8vd}Q2E4R5D>Q1%hTdKlxOR+`avSdnyZ~fz*r`t7Y|ruX6<-rcN!g(M?4eyFr((b~eiWbxU<7g;{C)$-e!^47#;f!v&u m>g4X~Vq#|D=;~}}VrXn&Xyo)S=ye59j=|H_&t;ucLK6UrYF@km literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/38.png new file mode 100644 index 0000000000000000000000000000000000000000..a4efca97dd1eb94540a9e4150138150f47a4c3d8 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr`%BgB-uuz@qLo80uoovY0pupo={r`0Z zW4Qi_=-)~$gz#g5pAA761ct7P+c>+emR5;LDN zKB_A{tR2x5m!HMD)?xpVd;To(ea6dDCTwwDa@{OW<`(;+Fw6K-MfYZqb5l~C+)XUZ hon0+V%uUS=%`D7Z-P~6DZ34 ze;Jiy3`uipKC+GCwMQ6Fij}t^lRo+O>|m!D2riX zNJk>WF19CAI?fu1cyCmVo}pH9_C(DDy9tU6&ui@er0tgs0J$_J)ydu1$<4&s(cIYF a$;I5&*vQqZCRh?E$KdJe=d#Wzp$PzuNm14S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/40.png new file mode 100644 index 0000000000000000000000000000000000000000..ee97c8d20310636ff201824085973e243b83b3ee GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr`%BgBDxm zN>QdYQ#2ph8T9^LyKv^JARp%-b7rMu|J2s5a&ukcHtQ_2ZNqYvn9rZrpJrHTE~Zew z$bA`)`{%-mUJXw&U!Q2)&6q1Hv?)%{XfDWkDXC8GhK^2#E~X|HW`-tiu4V?tH<-5H Q1;M1& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/41.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/41.png new file mode 100644 index 0000000000000000000000000000000000000000..88e5ee98ce970614558c61c074125d21984ef2a3 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr`0S1|Q^QP~=GdUm9~j z^N&UQ{i6AY1=e#|3JWW4QD7Ame95i#{$qZ_Z~J{_%a{WAPjE!+aY;z~K2=~tPim9d zvNX}R7Rj4V&k9|;s-#AU;aC6DkcVMqZb8?#DwIa`=6~}$!O-(lDtzXy*WyMFS7ryW z+IL-uuLv97$Fm9yF3i7nwwVod6*L;5KU>&@43 zl?m-twX#h}UcEp%C-?3Hc5gEYoj>#6ft{F=>f~gH%^V&r0G;AClF9`n|xmFy3Do*iiPSvf4-LLFzYPW3*RqC z^ct(Ptrv=3`+icEVe^xUjQ{gbfgF~S>f~nO&T!0}Ty*AqbUTNEwEu?LGdgt} z)3aBr_-`wJdRN-{Md7Kh=M+HBN=bEcH*zyKbTKe?aFVdQ I&MBb@0G>!tF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/46.png new file mode 100644 index 0000000000000000000000000000000000000000..0beeeedd163c0cc8e7e8c56e123aab5d0e0cbe59 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar`0C1|JkWpukc5zcl86 z<{yjp`xpG5Y6N8DRw}wXok(PK$Za|$X~h0#*UGDQ91NZgZVRe?T~f-sysmucTJX(r zrqa7?;XV7!OoF$Hrg^+db2xJ2{*t$=Ds!fo%x14*@b}#D?D^``3@gp06!b4D@0NHs z_bpTAhMM*AH4Lf-Z?XbsB*cQ;m6Gb@?qqIh>FDHS?rQ2{Z0KlebXIZ`$juC%u6{1- HoD!M<2+vJ4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/5.png new file mode 100644 index 0000000000000000000000000000000000000000..2990627939e9e1e19385de510064e2edcff0142b GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Lo9lee|&#`|37p5|G(@P zU*weZ=&?UCZaDBPd;7yC9uJ0@{NX&T-|G`sxikLYX_oA`&QK!lX~ghE)k%-3akBos zKj{Y~4N`V=X*A?;-eB0|)0o9}lqGEW#3T-`_K@odq5bDgZv?4_@!s$`wz_XdNc(l} z7Lx~D(mO16u|1j6an@jp!GUQxiL)-4Dt}J2lwjcOx4*eNLr@*$)|6BycSkdGb5l1% dQx``wLvtrLlUEz_saR!3BEd`&Y3vf2r@J_0_VR+zkFki!yAl8NmN0tj)LysKES?9q2AZ!og zlc4Q$cE8WO@Oizs)J`k8gWYRSgg0De{443dZM}!^NBx8&Cwuqi=$>FX)5+ZzWl`kH z7$~0C5Sm~;@!+yWYjWE&L~sB6aZtZ6Ktg9D=a1bWH>RXIxjS39xS6?_I=UJgm>L^ehQ-S~h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/7.png new file mode 100644 index 0000000000000000000000000000000000000000..df53195b257c9a618d43c0f139b0f3b2c95538ec GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar`0C20QXKDDd3=zyC3N zO{@6*hov)QBc5f1HJKQmSg_Q@Ib`eHelzLM^?w5HW+hpyyWK4$@O+=-8pn_%j{*kk zjUpSg4c+(Yw+Cwm-!_)uTbL>4bnb3i?$xs;0V|vp87(!}|J?mrqA_hU=SJa)H`EKR zY@0jfWZ}K|58Ui4M2uaz_i2LMm6Gb@ZfWXfXl`ljVrXJ!ZsB5N7|>p=29#s)boFyt I=akR{0FS9lOaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/8.png new file mode 100644 index 0000000000000000000000000000000000000000..0beeeedd163c0cc8e7e8c56e123aab5d0e0cbe59 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar`0C1|JkWpukc5zcl86 z<{yjp`xpG5Y6N8DRw}wXok(PK$Za|$X~h0#*UGDQ91NZgZVRe?T~f-sysmucTJX(r zrqa7?;XV7!OoF$Hrg^+db2xJ2{*t$=Ds!fo%x14*@b}#D?D^``3@gp06!b4D@0NHs z_bpTAhMM*AH4Lf-Z?XbsB*cQ;m6Gb@?qqIh>FDHS?rQ2{Z0KlebXIZ`$juC%u6{1- HoD!M<2+vJ4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/9.png new file mode 100644 index 0000000000000000000000000000000000000000..52444ce67d51aaa962304b04b5bae9ad31216933 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr`%BgKqOSIB@L#d%cix z`G@0{e^{NB#Q7$uW$b_F=$$Fya^$zGjogjRe^TE+%(eELmgMcgw9jmTP<8Q?+pjrJ zc$~PnMp$+3efF-Htpc+Sm~byV`S)zp^|MWnO&T!0}Ty*AqbUTNEwEu?LGdgt} z)3aBr_-`wJdRN-{Md7Kh=M+HBN=bEcH*zyKbTKe?aFVdQ I&MBb@0G>!tF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/glass_5.properties b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/glass_5.properties new file mode 100644 index 00000000..d266ee79 --- /dev/null +++ b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_6/glass_5.properties @@ -0,0 +1,6 @@ +matchBlocks=utilitiesinexcess:decorative_glass +metadata=6 +method=ctm +faces=all +tiles=0-46 +connect=block diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/0.png index 001f6c9036d0dc4374525467cc12d1d644111622..110acbd5ad432881d09e95194f705c72a0784c06 100644 GIT binary patch delta 180 zcmV;l089Vc0nh=EB!7EJL_t(IjbnIuF6{s3hk0Q9 z00BrdNRWX5fEfZ}!wn!-GrA#QJ)~;Ja0xk@kqv=|0XYCA5XpAIzUyZ|C#f-qBIG&&m_9{_`x^({s~lSxtl000nVWkN?Y iH#bH^G%z?YMn*w0IW|EQrMuVw0000c#Cm@O8r7l7srr_Imv(i13`TFbE65&H{xWH5`I*so~vhL+eqhgCpW2|5eN^5xRB}@}8 zNI3XKSzLJkP5vnB|L;cxb3698GQ{W#GXsJ7Za=Qa2T$uiSSGY-r@@_`g9{79l|d59 iMaL9GzpS@8%D}*L#?v5);bSTT5O})!xvXL_t(I%VT(XF6{s3hk0Q9sbp!U$YvOzNHfd}18cy*dx2sX47>rbbWM>9C^7`5k!(Zm?{fYR!XV8c3}YjU z!`Rs50Np^ZBfIrpHvj+t5M*USM@B|4I7CA^GdVFaML9JwMi5w{?=}Dc002ovPDHLk FV1kWTIxYYJ delta 184 zcmdnYc!hC-O8sn47srr_Imv(i13`TFbE65&H{xWH5`I*so~vhL+eqhgCpW9&0Hv?WawK1eh8 zcfPUGbWvAfWAiX_D?Iq$w$Mdgqn?{_N0i!(x9s|c`x|C^op^Srz?iN5P;3tm5cHgo gY!11w|C0zaLvf9}v0IzhX$BzhboFyt=akR{0Jb7bPyhe` diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/10.png index 45db0daefe9d45f80dc370148861ce18b5e3f58f..36962f39d3eb255e3ba1d4c3bf5c48d3890e2bab 100644 GIT binary patch delta 82 zcmbQoSTI4wN7~cHF+@T#c>&9v`%nMOPZa5C3N(;8@Hh6{f5y*}tlKN2bmuWJFbJfi mI=Qo3;8k;N0ZCb_O8uboFyt=akR{06x+;)&Kwi diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/11.png index 2377a5d04a373f36ac3b51915c23ff5e88fb6a29..538dc7bede0ac01f153c84069b749d19a8d1ed6a 100644 GIT binary patch delta 79 zcmbQvm^(qmQ^M25F~p)bIYEMTae@esctQR2&-Gqkm>BjRV%?tZG|8WVfk7Z8)ydt_ i!pYg((Zt-+!p+&z(b;U}%d$s6IR;NxKbLh*2~7a_?-?Zk delta 121 zcmd0u&NxA(IL_0>F{ENna)Jcw;sg-`5cs#p=(#;J5bXBjQr48>|FZjUdIAtMasIh4 z{C$4J*?(e81zUX#Zu7_0F`7@EaJKbf8V_IVZV5>V35gju;$)P(l+Budh0jZ3V2HjU VcWPSj_6-a`;OXk;vd$@?2>`foEjs`J diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/12.png index 565d812d7378d37958caa62ca033b1eeb14d2684..d9cf6ee26d6cb5ee1e55ab136e7dbcaa12f669b4 100644 GIT binary patch delta 156 zcmV;N0Av5%0k{E>B!6Q`L_t(IjbnIuF6{s3hk0Q9 z00BrdNRWX5fEfZ}!wn!-GrA#QJ)~;Ja0xk@kqv=|0XYCA5XpAIz+eqhgCpW2|5eN^5xRB}@}8 zNI3XKSzLJkP5vnB|L;cxb3698GQ{W#GXsIuZa=Qa2T$uiSSGY-r@@_`g9{79l|d51 lx4WHPGLNJM{67`U!*Ft!S7|1jel-ISc)I$ztaD0e0s!PTQ?>vA diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/13.png index 2aae726cc5192f8994789a8b097ca999b7b3e263..3c4d1b3b7379c57d1587839f9e4cd9eb637605c6 100644 GIT binary patch delta 130 zcmV-|0Db?z0iOYoBzsCpL_t(I%VT(XF6{s3hk0Q9sbp!U$YvOzNHfd}18cy*dx2sX47>ruAPnyBa;C@t02*9#f+VTPuK)l55M*US kM@Bd`HAOiyGeSm1I7TozMa@f8bN~PV07*qoM6N<$f>_%x?f?J) delta 163 zcmbQwxSw%?N`0HBi(^Q|oa8_MfgnEoxzPmX8*ws82|p@R&(*WBaquQTWY0r|a4}WTN!Re)G4>f8+LERT9TENC=@aPfv2mV J%Q~loCII6ZL}vg1 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/14.png index f108cabe1522376289b03b7295b4c57d95a10ed9..26fab3a2de03913e6f49e83d0e913afbdd178018 100644 GIT binary patch delta 96 zcmbQlST{i>O4HNDF~q_@`NtoF_y129C;oT*($8;vz+{sI&*3KtCO-2LMS7Y74PqD= zVxO4ktoEI+%fP@Okdo@;?quxhYGUea>gH%+;bLNJ7?^rc5Gcps>FVdQ&MBb@03Mei AP5=M^ delta 116 zcmb=M#5h4EFVfS+F{ENn@}K`e5Fh^BXae(%IGLn`AC;-+>e<*hc#|J9pLoUhW%u9o zmckobCQC|4N=kNa{P}<0j{ofX`xC&RiBo9x%tj!%m@0TN%l)8+geC(+vaXtCNoLPJ P1|aZs^>bP0l+XkKX8tlD diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/15.png index fcecd41f985cdfeb9c680e482c5465642077bfa7..011bea62afa7dfd198125b8e110413c8b992c537 100644 GIT binary patch delta 132 zcmdnVxR7yzO0AEli(`mIZ}N{n2Jio$E>8UK_@$rU_<+eK2_tzmw&eTwpZ=NO7{Xx8 zazyPkLyEJ5NhI5X-7QMa8b%Fo3>M7dX1mADEYEiM0BeXL1H;7yd7CmaUr%LVU=T=2 kb#ga%Gjnt`b96Rwbps+tlPLR->OeULPgg&ebxsLQ0PfTY0r|a4}WzV%End=D&IWXL4vC=6Ba(7d}WsyBg40N%h*NFcz!Sdfv2mV%Q~lo FCIISFM->17 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/16.png index ceae2f494912ba755dd35a8531f68365cb8caac0..a35ce85f50e1def06d6372c817dd8532521beca3 100644 GIT binary patch delta 138 zcmV;50CoS`0j2?vB!5v!L_t(IjbnIuF6=)8nc)5|=l=|!ALfy502okgz>g0zC^LYP zFaU#r4}*dC0>v&EcmqITK#?IJ%@i2|(@3@`*PF00000NkvXXt^-0~f?TpO761SM delta 190 zcmZ3+c#Cm@O8r7l7srr_Imv(i13`TFbE5+cyZyM7ndLrwJ~ijRf!XbDXC9yZ>&~gJ z;FM0d?wM#)@spKV`HYL%+Y~l8H@8JRzxJ!Y`+xAXz61!&NN75em6iYmC6O%w-EY*3 z7=#m57qjuyF+b3pc;!jWg8OgnySV?o?^L#O{29%0!2GJw!5n*_nRh~*%*5Mf8(N6G mOG*J5;Bro4Nz=cn%Ox1pJ#9B~pUZS%00K`}KbLh*2~7YSuTk^> diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/17.png index a3c8912817fb5f048156f466a50198998be5eb82..d672a98db7cf93e4932f44611afc29710cb32db2 100644 GIT binary patch delta 127 zcmV-_0D%AD0h|GlBzQ+jL_t(IjbnIuF6=)8nc)5|XR`HD#{f!P4+ftf<_)k520jc1 z-U|aC1{Apfq?v3Nz%-NP0%V)P27m~dAk0)4jn2l#2LPGXY`p%sD0Kh;01#wlLPs}6 hMnO13FgZgtHa9UgFhggeO8p8?7srr_Imv(i13`TFbE5+cyZyM7ndLrwJ~ijRf!XbDXC9yZ>&~gJ z;FM0d?wM#)@spKV`HYL%+Y~l8H@8JRzxJ!Y`+xAXz61!&NN75em6iYmC6O+hx;Hj4 z|IPb9lSBJ3zZqWYYH^rTEXWKDb(V4Q>rB~C#6tA zdbSLMWsAwatB#ii85kG@Qc|7VolFcIO)V|WT%1ka%nhB*cTYa@9Vo}(>FVdQ&MBb@ E02QSo761SM delta 187 zcmZoyb>~!9 za7rg!_e`{@_{qwwe8$D>Z3>&4o7*CuU;EYH{XckGUjhVXBs3k#N=pEOl1P_L-R=iJ zuzi@~kyT`O;r+Myjf|SA|LzNam)~9#@*rQ4A^bGUW|O}Uo{AR)bKZ=R$UF8RU`O}F lMj#NhOrF5?D|}uO1H;CnR@T-U40Q}Z;OXk;vd$@?2>`{yQoH~F diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/19.png index 32fe8c6f25b4433becc1f3ba0e738fbb647f0275..4abdac87756155c4925ccffbbe6acb482fb0f5ba 100644 GIT binary patch delta 109 zcmaFD*u^+OCC${+#WBR9H@Tux?~Oh4%m@GU(l>n#I?mt~!_PKf{u%EEZZuqH5T7_u%AXHau6RoU?@K97NcK_Dg7$=$-)z{t|v%+lQ0$=Srf#3yb>~!9 za7rg!_e`{@_{qwwe8$D>Z3>&4o7*CuU;EYH{XckGUjhVXBs3k#N=pEOl1P_L-5Z;j z|K|Ol$)SCi-;Gy7gze8Bqv!TTztqHJUX=gtf7JB9+VN3`*^&EB4C|(KHZo2$Ojstg xX{W)Ro`VYu#Fd$WKp1GhOXiWZfd8k0c^D?%bNHNSkl@V#1fH&bF6*2UngHVYSC#+( diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/2.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/2.png index f2da235e8ded21b6b1d11694dc64154bc90aede3..3ea846635cae2882ffebe0c1c516aa75101795c6 100644 GIT binary patch delta 115 zcmV-(0F3|70gwTZBy2lLL_t(IPh+eqhgCFVdQ&MBb@02TdFNB{r; diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/20.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/20.png index 9a081b58c42f6efccb2a32f76f77e5e30c2f5cae..e060d2f5f5451287ae1393a99487bc4d54fa2cd2 100644 GIT binary patch delta 84 zcmdnPSTsS!PuA1LF~s6@a>4?JJNKXdnV%@q(-deB!Jrx`v_za?>1vKisz*OYGB7X* oq@+5zI~ki9n>bk-J6jsK7`hr6g&p~H1SrSg>FVdQ&MBb@01vMmg#Z8m delta 159 zcmV;Q0AT-eyaA9Te}hRxK~#90V`Lx^{Jb*fKa9=x;t&H9sRqCRyG{z@!OJfg7|GH6 ze^1>1gO^`0FfcHX=K@BTMPyk#3WhIWgr#kEofMK1$ANyg{|pRBDe?cFxc|77qXK^m z0k~QwnC%BIzkr)c$mYUuGX{skU5pG23=B+cFAfo<5t~8%87ogQ004BnEqFui!^Qvr N002ovPDHLkV1n7gLWuwX diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/21.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/21.png index 3d322cd8841c371eee8dfb54b6a275ce4c2f0090..f64e6a79ebc4fbc9ea47973fd6ac02a47b67fc7c 100644 GIT binary patch delta 86 zcmX@WSTaE+K;F~EF~q_@xuR049o4JLNsguyEt%*Q622WQ%mvv4FO#lIt8$AF3 delta 163 zcmXRpz&JsrzTMNsF{ENn@}K`e5Fh^B=m5iRKQ3ivxeuRD&G~O&cDvh|$7lb#bE+#i zr4z1uCfZc|WMx)9<6`zUh0V>)Z4u9}{p#=jA3Uuu0Rl4;nvP_pB>+K5q|2sm_k$nU zQq((`|K|Odl$a2tq-w7*7#IXn nQk~qL4V^3uot=%%P0cLKOifIG?4P<5D97OG>gTe~DWM4f`3)TL delta 126 zcmXS%!#F{uBH7c$F{ENn@}K`e5Fh^B=m5iRKQ3ivxeuRD&G~O&cDvh|$7lb#bE+#i zr4z1uCfZc|WMx)9<6`zUh0V>)Z4u9}{p#=jA3Uuu0Rl4;nvP_pB>+K5q|2sm_k$V| b?-&@we#vYxKxfwZ|8CV*b8yOnAIvWREII|rn$KdJe=d#Wzp$P!i=Nygz delta 131 zcmXR|$T&fzHpA1!F{ENn@}K`e5Fh^B=m5iRKQ3iv&W4xQukKXIc4F(XUw`K3`2#?( zZ0?x@Cr)^5a`Y*feBy!)mm8zZpFKv;?R88iF+b4!_iNkrz!}aVE_V8S3j3^P6jAyK{+uw cFhN8`MMX43G`lJ;nE(I)07*qoM6N<$fpF delta 196 zcmbQv_<(VOO8s(A7srr_Imv(i13`TFbE5+cyZyM7ndLrwJ~ijRf!XbDXC9yZ>&~gJ z;FM0d?wM#)@spKV`HYL%+Y~l8H@8JRzxJ!Y`+xAXz61!&NN75em6iYmC6O%w-EY)` z4mQ?p|L@Z>^&$IWHXbSF6Q11czwZ89yyLVwaR_b{40INmNfMbd!hP{M<~4jZ}I?lmL| zuzfGL3{GKSC|hXc`28ir69xtbfs|AycSB=S3ujX^BNGcpOJie4lb*$zopr0OErq^Z)<= delta 140 zcmZo=T){X&r9R)&#WAE}PV%4sKoB4P+~@$qZa*$%X3mC}*RSqW$#!Dvv0s1Y=lKIb zux##`11C;+Y;yD|n0(^G8ITY|G2_mL&JB|SncF%Trz~OJ!Ts-jr}Ak5H8wU6KAVc4 qtcM%x%qQ_CCRG=9==2&eFdVB;{Q2-q=!j^fq_MUfswoELN5aYgFs5Ele@XOtEHo>n~|%T ZiIcI3p@H8ev0p$r22WQ%mvv4FO#oAT5q|&x delta 44 ycmYfEo}i*GoH=svp*x9AkI@G!Lvu4&5oz7 zk$XiF1A~pLzVF8O&$SpB7z9#Mo!pJgOr6|J4NV+foD571UCk|C)cyp@F?hQAxvX0f delta 131 zcmV-}0DS+00iXepBz$K{L_t(|oMU7l5&XO|=Rb_i_Tmr&6R8Hk0J}~K7#PXX z{C`i}|AUubFfcGMkmmwMmqlb*i~$bxyZt9S3}9f?fFW(bfqu9DWEBbChVw&n1)yP$6u=6=4p{*j zQyC}_pHLz3swld9iY13cMCP%A5=1%SglQ;6&&GA&d8{r=M+8w$ZSO#8G+_oJx+M~u zO4~aC0PE%5G5}CqZ`u7!KJazq7kotUW*62Mh)umD3~V2xDIJo>5;m^$Dk=-fhA^SK SH@a#70000LpD|U~oV~U!nT>&gK_Dg7$=%G+$;jNu)Y-_;*wDbx+3iBhj^{u*22WQ%mvv4F FO#l_oB^Uqz delta 153 zcmZo-+{!pXrM||~#WAE}PV%4sKoB4P+-L&xjX0U4gddfu=jz$mICzsEGoN_H_ht9r z^p?UKTP90NNJ>g}Zv6Rw-j4t5`uh{Wpovpx^~^>fxR@$dnaVJi`VbqLk1x5boFyt=akR{0Mj@| AJ^%m! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/3.png index aa3f6daa6cb90d58efc6706e781e1f20eb60784a..ffd81246d07af14954cc7e2b7718749fd2079b57 100644 GIT binary patch delta 155 zcmV;M0A&B!0k;8=B!6N_L_t(Ijbr%yFz^4%b7B8M^p6iSz%;TLG9M-eW8dH9{GWkT z05b%{Cd&Y1LqIfH2B5oyB10%Lfb1}!nhOTr3j-ep6uAJTnQRxpG?V25WShYTfC!i% z%v2bS&c?PaGc*;MJ~{vZ002ov JPDHLkV1kOwItl;) delta 189 zcmdnac$0C0O8o*)7srr_Imv(i13`TFbE65&H{xWH5`I*so~vhL+eqhgCb+^D*3)0 PU;qM7S3j3^P6@oIKsg3aS3j3^ HP6g}Zv6Rw-j4t5`uh{Wpovpx^~^>fxR@$gnPbA|aV9!MZp>q=!ji$Ntkl?HRc3neM0>7IHE$FbJfiI=LG-8d*?YcQZXkvL4tL0f`|bKOj`ZXVgK!VHXu+dGWi|N@kjl7QXBK%y#I;Y ngh#rde){KnHZBH+ZIhYqXD_EqB}vRK>vH>FVdQ&MBb@05D7xX#fBK delta 93 zcmd0)nV=Hk?CIhdQZXkvL4tL0f`|bK{Mlpl{Qr6F;(wD@&*wb$W50Tzj`Iu&Ah=N) uB*7n7cd%f={oWMk88_l&l)ROB7#P-63*Y|Fz;uWK2s~Z=T-G@yGywqLLL=n> diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/34.png index 599730e3c8f69c09653117cdbeb923c6fda6d77c..c8c0882712611725a739c13c8736af23153cb47d 100644 GIT binary patch delta 81 zcmZ3;m_I?qTgubLF+@T#xuR00OAAADR|8Ws0|RpxH`Z{*DL^>}Pgg&ebxsLQ04g09)Bpeg delta 131 zcmc~_$T&fzHpA1!F{ENn@}K`e5Fh^B=m5iRKQ3iv&W4xQukKXIc4F(XUw`K3`2#?( zZ0?x@Cr)^5a`Y*feBy!)mm4F`gt--bUv~dZPjK++T*6S#-T41W)R}?>_utx|`NsS= j@BhgnMxWyUr-FGH{MX7&uxwY;VgLe9S3j3^P64?JJNKXdnV%@q(-deB!LT$^h+$q0>-M*0n#&j%7z9#M lo!l**-5ed=T#ZaE4K19E4GgM+6U>2f44$rjF6*2UngGm68pQwr delta 126 zcmV-^0D=E-oB@y|cw1gO^`0FfcHX=K@BTMPyk#3WhQGd1cOjV1r5RhiL3rIBtrWqv+h&2RmGt3Jh0wxGE6-J}8vGDc$aa4O8pW~7srr_Imv(i13`TFbE5+cyZyM7ndLrwJ~ijRf!XbDXC9yZ>&~gJ z;FM0d?wM#)@spKV`HYL%+Y~l8H@8JRzxJ!Y`+xAXz61!&NN75em6iYmC6O%w-EY)` z4mQ?p|L@Z>^&$IWHXbSF6Q11czwZ89yyL zVAFVdQ&MBb@0C=-d8~^|S diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/38.png index 98fd7b610bbc1cf738a6a59f2bb84055d09eb8bb..fe1aa45cf8f679b33088d01329d66d59afef3b67 100644 GIT binary patch delta 90 zcmbQuSTR8*MA_5DF~q_@IYEMTae@esctQR2&-DUzm3llqi8(2S64J9}7{1TeyPo5u td7goRK_Dg7$=%$@(aq7s&DFrj$kNcn)baC$jITgB22WQ%mvv4FO#mP69Gw6F delta 125 zcmb=J%{W1&Jjv6=F{ENna)Jcw;sg-`5cs#p=(#;J5bXBjQr48>|FZjUdIAtMasIh4 z{C$4J*?(e81zUX#Zu7_0F`7@EaJKbf8V_IVZV5>VAo%~j^LPD+PuxK<{Oo_V{S6ry Y=G~TUU6~=XlK}`kUHx3vIVCg!0J1wT#{d8T diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/39.png index 77fb6c976d4a550cf21c71de160f9f2397a6e77d..5cf919af4ab9cdae4f5b57f16752af3619602f33 100644 GIT binary patch delta 124 zcmV-?0E7R%0hs}iBy~hdL_t(I%VS`m0Nmf@{GVY!4S0Djj4}g0Kg=6o7YuwD47?Wx zJ`5;w0Z231E`Vt!%LT|bgAD)?FhQ89FdChWjSm1n000nVWkN?pMKnP{ eH8DmqG&DCeMKeMl|4-Kd0000$d;b(EG7p zy)VQ0k1orDteFxL0+P&WT8gu|51*Bg;VL&Y0vV)~&J!f%`2SQe55uk7hRb*^E!xTe N1fH&bF6*2UngAPXLLmSE diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/4.png index e013452ac9f8543cda0368fe2410001c65c2e0f7..839ccd367518179bc2516206050f931b3579a4dc 100644 GIT binary patch delta 131 zcmV-}0DS-00iXepBz#LrL_t(I%VT(XF6{s3hk0Q9sbp!U$YvOzNHfd}18cy*dx2sX47>ruAPnyBa{f<=UH~DBc3nd0jm-c601#wl lLPs|^H#s#nMmIDtK{zr)IYMtYDmefE002ovPDHLkV1ll3FdYB@ delta 188 zcmZ3$c!P0*O8tCK7srr_Imv(i13`TFbE65&H{xWH5`I*so~vhL+eqhgCpW9&0Hv?WawK1eh8 zcfPUGbWvAfWAiX_D?Iq$w$Mdgqn?{_N0i!(x9s|+`x|C^op^Srz?iN5P;3tm5cuTi k^9e2$obC8m+ux9Z!JyKk;^m9gw;6!I)78&qol`;+0KZ{PBLDyZ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/40.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/40.png index 982c5fd1f34449bccc26412b6b7be1883fdab432..3ff9cb38165bfc7edb7be3ab76d30e1e454d78f1 100644 GIT binary patch delta 94 zcmdnZSTjK-LfzBFF~q_@xuR0eG;p(Yb26D`vuPqwj=|H_&t;ucLK6UWPav@X delta 158 zcmb=~%{W1&zRAdXCE3W+#WBR7#PXX z{C`i}|AUubFfcGMkmmwMmqlb*i~$bxyZt9S3}9f?fI(rv&nt8OBd2d-!GV6a|0pi_ zzbB4pL;NiS;A)u|7!Vl)W-1|@3&YJA913?aGB7YOFtNQjL>`nzYzFnOJjDP2m)J7v T@?~p#00000NkvXXu0mjfMXE%u diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/42.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/42.png index aa5d4fecd85a604f676026228fb4c6974b8baf4c..c33678cac1b5203d39b3f997362b17a3f747023d 100644 GIT binary patch delta 95 zcmdnNSUW)_Qp3~5F~s6@a>4?JJNKXdnV%@q(-deB!Jy&Y^x<@IVggUHa`)jIH=Z!u zZ!z3dGF>{Jfq_9FCDqB@)Xl}*(8SWrz|_sa(b&Z)1gO^`0FfcHX=K@BTMPyk#3WhIWgr#kEofMK1$ANyg{|pRBDe?cFxc|77qXK^m z0k~QwnC%BIzkr)c$mYUuGX{skU5pG23=E9O8G}^Nzw#6V6#%!tEHhI&tKt9v002ov JPDHLkV1fd5LWKYT diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/43.png index 877637bf7170a0dd349e12ad4192e3c779e0bb55..e2a8c98301ac255bd85a7ed1dcb48e949a5e7d26 100644 GIT binary patch delta 105 zcmX@Y*v2?PCCSj!#WBR9H@Tux?~Oh4%m@GU(l>n#I?mt~!_PKf{u%EEZZu!a~iFchyd@|>f+dnp40gFs5Ele@X0lbNfbk)f-Fle2}9i#gZfhi*VQ22WQ% Jmvv4FO#o~|Aw2*9 delta 168 zcmZo;Ji<6ZrM}zK#WAE}PV%4sKoB4P+~@$qZa*$%X1NcaPtEynV0OFPna5}Ux^t>4 zIHeP=dnVdc{A6WTKI3BcHiga2&216Sul?%p{vSN8F98BG5}J-=r6mACNuFD2f Si(xv=00f?{elF{r5}E)l0!Zut diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/44.png index ae33a33c58af606d2566f1cd73a2940c4b9283cb..5a5c87ecff321248fe2f71ac9a8cee00afe73442 100644 GIT binary patch delta 77 zcmb=-nV{k!?&;zfA|aW)faT8pr+?-riu5!E8pJR#yne-WXAh@C1p@zopr04R|ervLx| delta 90 zcmd0)oS+iw;OXKRQZXkvMM3b-9;4^>J!ii?5?~fy$##HYw;$KzgQxW+Bu-xZQ}2K0 tfAjQs10b02oXKsvYf7XIm)pStHU^n5eCyxYhR$aI0#8>zmvv4FO#suiB!vI~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/45.png index d879350b4edabcb11497de8c16e71ed311b4e103..4ec14a32aadb72bd3d49cca8d6686c12c614bcf5 100644 GIT binary patch delta 77 zcmb=*nV{k!?&;zfA|aVvQK|RF{;-Aw>*53v0|N$zI7VjPxcXg53=9kcDXC8Gu9mJ& gZZ56{ZWg9a7Usq-#TEPi0Oc4wUHx3vIVCg!08Azox&QzG delta 91 zcmd0)nxGQq=;`7ZQZXm_&wn6@4}WfSfMK^EmohVF!^`VecdBGNvGv%mKlAha0U%g5 t_soG4Cpq)alwYm?VyGO1B37zK7K7H-!29q@O1TaS?83{1ONeiD9!)? diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/46.png index 0f2ed6c80658c77a832bd508fe0ac090de0a7d77..aab9a5ab7fe526dddfb9876ae1bf7a5225c54c23 100644 GIT binary patch delta 88 zcmcb`ST;c=NYT^9F~q_@xuR0~^;^kI(*f=Tuj4 zN+(?ROth)^$;zyJ#>MPy3Y(jo+ajJ{`_lJScArCq!$2$GI5P78C+}t r000nVWkN?rG&n*rLN_x(MKeV*LNYiOQLr)q0000+eqhgCGImpO?hIa8J;y^eg|-#|%K=>FVdQ&MBb@0NUD9KmY&$ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/6.png index 2a27e7fa1ceb4203d3a7b97df0f47a915c533cdd..2b3b3936cf922970083e77b6f36c284c22ef94c0 100644 GIT binary patch delta 116 zcmcb|IFWIJO0JEki(`mIZ*oPY-Wz-7nGgQyJ^#-$U;f#|Tn34NoCE#*#u~;AlMEP| z8~K|XzcU@xlc->BbChVzopr0Q6@k#Q*>R delta 194 zcmbQpc#m;{O8rt#7srr_Imv(i13`TFbE5+cyZyM7ndLrwJ~ijRf!XbDXC9yZ>&~gJ z;FM0d?wM#)@spKV`HYL%+Y~l8H@8JRzxJ!Y`+xAXz61!&NN75em6iYmC6O%w-EY*3 z7=#m57qjuyF+b3pc;!jWg8OgnySV?o?^L#O{29%0!1}7u!5n*_nRh~*%*5Mf8(N6G qOG*J5kW^jRq0xJT=T&@V7bC+HbGvW3$2Tls00K`}KbLh*2~7Zcm{jxt diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_7/7.png index 7b87bc911d72e60d839d95b38cb48f5adbafc955..5209c412e9edca3ecbf288c96c653967fd270906 100644 GIT binary patch delta 104 zcmV-u0GI#L0fhmOBw;W~L_t(I%VYTbFz^4%b7B8M^p6iSz%;TL48!DLG)$gh6pVsV zFj&C-UC#e0(F*_&`rGBQTi(^Q|oa8_MfgnEoxzPmX8*ws82|p@R&(*WBaquQTWY0r|a4}WzVwU^C6AT}woLD#6Dd>^K zh4T(H&U0+?9Tu!fC&Hx0Su6{1-oD!MOCZ-1Fj)oR)F3y&YPELj*mlqoY9~>b&U)R o3<4>sPVUC0macAYmd<8QhGxbzopr07u*%A^-pY delta 157 zcmV;O0Al}ix&e?Re}PFvK~#90?US()KtK>h|6Xv4p$wx83H@k*L>&UOfF7;|k}p~W z1}8LLw6in+%?5vkB$ugz5=6P+f_W^dvvobpGF7*sGlD3WZg3Da+AxENJQA@<*$oZ= zV08I33;+_>-WUIToOvvH?6)sl6WOG%BnH?Yqb(9|iLtJK7Zp@izhy9ys6P#_00000 LNkvXXu0mjf#!5cg diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/0.png index 7e1688e16d68f6dec6f71274823ce7af61e56258..507e4f62fb0445565b0036d1ec588cf6260fcdc7 100644 GIT binary patch delta 216 zcmV;}04M*&0rUZoB!8btL_t(Ijbr$K?&E)4_{+hkDEPyMXDIm1f@l93ew}#ppMgw( z)qq!RkN?9kOzeHni~lf;*8pTq$cABP!e#)vLV`|5Hvrvv#25h90}5TL7=Y|ILI4zn zR51V?ZZHn9h9IlQFaTWvKFv4{z-0)`t3(-qZU`t}U{mv|AgaFt8 zP{^ZWUGX000nVWkN?aL@+i)ML{(&L^U!(H$p~) SBVca;00000mT83B!7%aL_t(|oZXT;3V<*WM0Z6HJdQ{4K32I;j*`yaQwS+!tX2}^ z`0bn~VVHSrmMB7mywxNkUjT43>cUKb+BM2NQwBhYNCQ^PJRhNb0fqT;-@% X#rbj}??l*!00000NkvXXu0mjf|ENs! diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/1.png index 4b18372624b4c8f1b323f0fe1dd05aac6dfe2d8e..c652578ee9f85fdf90155dd54b17852cec725187 100644 GIT binary patch delta 204 zcmV;-05kuv0q6mcB!81hL_t(I%VYR|?&E)4_{+hk|37Sa2FBRfAe!OVi8uclC;{jO zylQ*=ABJIK?|WYShhe-1AZtQ43|Z{Wf@lA+8i1}4A3!k#W&l>_5n}*2B&lHlhTrf2 zP!v+n0Avm^hM;K1CV-)UkQ_EaY+^945@#x!I4EB*kmM{RTSf6|CS(B7i2@xXXC4p+ zC39pxvN`~k7Yd2(kKM2U000nVWkN?eFfc(lFf>6pL^nk+MMg1RhwC^10000V>TOfxx|jny)@k zg_<*Yu=T1IRAEaX0TcEF1$5yjK~E8f#MrN4K?ZM+ZECnj!3_!k0000^}q5!K=2%|6v#=_P*!Ee;6jH8Jl55 zIU8Le$$ls3JenIoN|b!qKnnwiH3X+-ViXY6j8Ea0gHK6Iw#bJ3KlhQmG!L?sY|V55 zpjZO{+BR-+#M1x30000GWMx7}L^nk+MMgG5I7T!!Mm9Gw9S_SDJOBUy07*qoM6N<$ Ef)1KHDF6Tf delta 130 zcmdnQIG=HXN_Cp2i(^Q|oaBTB41eOkf3{csB`E;{hCa6K22(F~%oUt2QKmlEx%ATi zV*CHe9S@7lb~)8NsQ+xfBT6mF^dZyX0}LV#J`PIk3T3PnLE?^Qe~1XJm7L8s$y7O8 hCE7Ul!2f6Y{~4!$^{8NU4e?_D0#8>zmvv4FO#q1NGe!Ua diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/11.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/11.png index 11cdc8b0b35b01245e80d39e83ea5b2dc1a77c82..79d6d467dc365f27d87db1b3a25a77122dc1661f 100644 GIT binary patch delta 152 zcmV;J0B8S}0ki>-B!6E?L_t(I%VS^|bl_FnNS0000i)n6hKTsA_pLL1-PP#7|r+;60I4V29h-+Yb0AU@wVUzG=h4Y bzx@XQkaI|Q$Z8Xz00000NkvXXu0mjfn$j;n diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/12.png index ee7bc32c6ccfb761f1274f330c2b3b697da8149a..50f222c2feaea3f352e0eed7adad945b6da96149 100644 GIT binary patch delta 209 zcmV;?051Q+0qp^hB!8GmL_t(Ijbr$K?&E)4_{+hkDEPyMXDIm1f@l93ew}#ppMgw( z)qq!RkN?9kOzeHni~lf;*8pTq$cABP!e#)vLV`|5Hvrvv#25h90}5TL7=Y|ILI4zn zR51V?ZZHn9h9Ij48vt_wHU;=J!!1NN0GA=y)M0f2HbX%90!o`2j4;4vD=y7o14go-zt9yrK-10000GWMx7}GB`#zG(|%GNm00000 LNkvXXu0mjfXrxmA delta 166 zcmV;X09pU-0m1>0B!7uXL_t(|oZXVa4S*mFMO$KG;y8}tKAhagQJjG(NH~2@HAO6- z-uxHH&;Ku_fw3phTLmKe0>BzE6s7|5JhJ79G641j9gt$?Z3(<6h=iUz1#5(yuD4|A z2Y_sOJ&TkDp7(1Bn+?%r6L1%-de+#*s79vv$|Cj?OOgG=Rv*p;w2C4}p%tm?0Ixr7 Ui}e-4tpET307*qoM6N<$f^aWNX#fBK diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/13.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/13.png index e13ddfe6ad8c02b1208ccbd2fd91b77261adc45c..a24cd378c28c1ab94ecd499d4b2c3e5d92d3c489 100644 GIT binary patch delta 194 zcmV;z06qV#0p0_5n}*2B&lHlhTrf2 zP!v+n0Avm^hM;Ihb^%TWgyhf-z@-qII=m9dhJf+~14+(8GCLfvWBL_t(|oZXSZ4Zt7_107U}eY#@z=_t&=6iB?%7ZnOgO3SZ) zT0WBy;#3)5l>saj0NA9_7t$Wd@>D=h!>RJ%onqn^c(V#0<<5p#$kGoA+$*U0?gLe5 yIFkokuWCURwhAO*!d^iGUHGYBMge&R2QFCEXw(fo_L%?x00{s|MNUMnLSTZkMm!V% diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/14.png index 75dc1e091490ce3d37ceb3fe0802f8f5f2d3417f..173979b451892edddef9524eef9f06fa646283b4 100644 GIT binary patch delta 167 zcmV;Y09gN)0mA{1B!6y6L_t(I%VYR|?&JS22cQ1`u;Ce)2JvASCJvKBXM<=4s)JW; zkN?9kOzeHni~lf8P%}2ekj36Cc=n$t&G-OTLkK#L<_6&O8x{bHLh2hptRXlx6Qh8j zW_$`sPPWK~fbs=NnvrcKTQl7N0Id0;HydB!g#Z8m5M*USM<7N)K{+-yMl?k^GC49q VG)Bf+Ka2nX002ovPDHLkV1lG+L+1bh delta 121 zcmX@iIE`_FN>Qw*i(^Q|oa8_C@1EDQ6&+;WRI0?Fyo+H|w?yv^$->S=)))7Fg5-EM zmRjub@rwA9|Bo&Fw96W`m;?!l2Br>9k0%UA)-i;e2ribK@3hD?`Le^Nw3ObI>}Apn Y3?4jgOeWu_JYWC#_1>qpgWHk15or(Yyc@y0*XSa z7=RIO#25n8j5FYo6%dlcX(2X4KuH-}q9e+wpnQQ%4Z*Yn%RpSXVB9kALNSt+9qZX4OA<@9p!Rhg2f_o?Hjt5qE+7@IV$YRjrOgh?8 puBFJF!1X~>DT6`LVd@kPh843@%~Ga`STX>Cr>ma}%Q~loCIBvpJM91f diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/16.png index d8bfa9295a568a3abff080353ed449278bc7a2af..974667ce77124c1781ab715e11a8e512b93257e9 100644 GIT binary patch delta 193 zcmV;y06zb(0o?(RB!7rWL_t(I%VYSk;n{x%GQpb#K)t_Cydm2FFhF;~tG37gVHhU% zzURe%7{=}lB+b|i!=)a@1?UP1`W@W>tj;6GfG-E1QpW%czY!bo6dQodA;u7lgoiGG zFJ)qt!zPGL4CYnhOhps_f9~Ud29lhGWGi0HgbW}$QJ`bw%sK3t?E7VD(g>o`y--^kOw}4!l`~+i_>7UdXB+2;3{E`Qigr zs5z4dTd!(C6}AL5V8WgtgD(6e=&8Uc#C{G7F8;T0E;rE{unYhI002ovPDHLkV1nMU BKWYE~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/17.png index ded5c59b700d928f775231a0e30bc1d37118a4e9..668775009d7e11fe4cb2469f65d9a3fbcd1941e2 100644 GIT binary patch delta 207 zcmV;=05Jcx0qX&fB!8AkL_t(Ijbr$*;n{x%GQpb#J2&bcX0o{4T7=WUO90O2XO-hu&q8`Okaty!-H)0GyPIy=Y9$(5t zm%|xz*bMn{@F|8E-l#`5?-?$l3TvC^LAVI39h&I}fJ&N0 zmYc7B;W2p*X$OXY*@f2AS6u;e;48EQtOOTfzybkmJ4 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/18.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/18.png index 0cf51e6396dae8acea7523bb45472642e30b3179..0e5927a4f9f8b445c785fe134dd348e7f3736800 100644 GIT binary patch delta 168 zcmV;Z09XH_0mK22B!6#7L_t(I%VYSk;n{x%GQpb#$rjm=|K~oEm*zpX zlC7DfED6G(goMn7{}^JpoJ~qt{BQmSSIb1KCR|_`7=QwZ2}tAs#I68O>LREapF*NFW79ygW@L?I nYbF*j{$Ka=Kf~3(WE%hgC7(_{8i~=N00000NkvXXu0mjfyXrg> diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/19.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/19.png index a7f55c9d2c3a567ccad48d6f330891f570de5d1a..e90edc2fb278d4e510f0c6d514faf1895f724336 100644 GIT binary patch delta 191 zcmV;w06_n<0owtPB!7lUL_t(Ijbr$*;n{x%GQpb#J2&bcX0o{4T7=WUO90O2XO-hu&q8`Okaty!-H)0GyPIy=Y9$(5t zm&0ixHbcG~e2O84H|miM`G4*sR)qx94#-wqn!yH?Jfti$fjC`2NtOf|000}Iq%Eyo tL-7Cr01#wlLPs_H{%002ovPDHLk FV1l!wJ(BS=)))7Fg5-EM zmRjub@rwA9|Bo&Fw96W`m;?!l2Br>9k0%UA)-i;e2ribK@3hD?`Le^Nw3ObIY&9{1 kfAQZx+aJEVKSi2>VOoZFmAIDnLk1x5boFyt=akR{019^}q5!K=2%|6v#=_P*!Ee;6jH8Jl55 zIU8Le$$ls3JenIoN|b!qKnnwiH3X+-ViXY6j8Ea0gHK6Iw#bJ3KlhQmG!L?sY|V7Z zk|4bRu^e&Yg2S1O0000GWMx7}IYBlH10k#2$rjm=|K~oEm*zpX zlC7C802FHg9%*s*b3AdQ0000GWMx7}HaJ5uHbpoxMldxoK@&DbMW0^(CIA2c07*qo IM6N<$f|4dcoB#j- delta 126 zcmV-^0D=Fu0h{}^JpoJ~qt{BQmSSIb1KCR|_`7=QwZ2}tAs#I68O>LREapF*NFW79ygW@L?I gYo-hM-~8=A0N-B!6E?L_t(I%VYSk;n{x%GQpb#$rjm=|K~oEm*zpX zlC7C;000&aZiN#G%fSEu01#wlLPs$+G(kBrI6*{3LqRY&FcCAQEPk8-0000{}^JpoJ~qt{BQmSSIb1KCR|_`7=QwZ2}tAs#I68O>LREapF*NFW79ygW@L?I cYo;3j0M|4~#_ZUTfB*mh07*qoM6N<$f(#xvV*mgE diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/23.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/23.png index 762b28722991d2679bc438fc23827377acf68b40..9fa8ac3dda05b8c2c13e64bc29ca0f616c95b443 100644 GIT binary patch delta 157 zcmV;O0Al}^0l5K?B!6T{L_t(Ijbr$*;n{zNK?Pp5J^l~FFtPVNFaEPBrm^! zY$aPW(SVfb!v+AzXl{j6KIxYL000nVWkN?WL_s)4IXEyyG!`&6F)%kan(JDZ00000 LNkvXXu0mjfj5I*b delta 121 zcmV-<0EYj$0hR%fBywFzL_t(|oMZTZ?&p7ofdq``0?006G-7AOC59ECd*}bTpZ_t$ z*5U9nDPi%y`5Rm<6S10bfni_(3LqvRkpmFB0$kBVjAncaiPnrw1Ie0^HIl8Fcw6uU b8ZiI>&$39yT$OSz00000NkvXXu0mjfAJQ|r diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/24.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/24.png index a7409e3b7d0bd48e0ec714e4f5845aa9003c4f61..e9615fd4577cf7f4a1313582c5d15ee511642830 100644 GIT binary patch delta 202 zcmV;*05$){0pHp`;8DlaWy3d zpadeZh9Ij)@d7pl_%y>UL^lAJA=uPmbpbX*{-67ZRSiZMU_-MNmu9d5B@gi%KnP&u z1#%1k046up|J3Y|umAu65M*USM>#`7Gc!0bK{ho;Ff~I)IlC$LcK`qY07*qoM6N<$ Ef;IMoVgLXD diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/25.png index faa3731355047b4e1cf5323cb786155e0960d9f1..8102da8fa2f479a0b41b67a0d83004bcc78d23df 100644 GIT binary patch delta 182 zcmV;n07?I;0n!1GB!7KLL_t(I%VYSk;n{x%O2DrZZzwYW-371O9{-17nArQC7yn@x z!+KK6GH(~>xVgryl#2A8+@L(>$ zseq6ix&gQpVpE4#0@;xN=RW>tAjw%shU3*t$N#PvMl?o3Ge$EsK{Q1;F_0lc-V6W$002ovPDHLkV1k$D BH*^31 delta 112 zcmV-$0FVE#0gVBWBxzJhL_t(|oMT`ZXuyar@c-P;|8Pkoc1B!cSOKy^7#~Ay9V#EE zW_;j(^EbF!CSo<=0>i)n6hKTsA_pLL1-PP#7|r+;60I4V29h-+Yb0AU-2ecjQ9)cw SvbQY&0000^~*?u^aHJ?eTvYhKarJdGQ~H(bZyT z#%35UTT$dNOe4bSC|*E!9x(=>=pn}d6jzfHB_B3maRE67V1yenhQKsqH2_@!Avv5D zVl(8+!KWBvc%vTKkpJgCVpT{m?SO2>r5S8M$wSIA6Dg?|r!oNm0GFLNE|_E?0000G nWMx7}MKd-*LN+%bal)VQfYtc1B!c z*qwx=5XQ$4TZiEPZ~pclMKQ51hiUxZ{EfmeU|?Vv1_q!2VgeF5tj;6GfG-E1QpW%czY!bo6dQodA;u7lga>m0 zP6dSI&<(()5Su!@63B-9KlkxJ14+(8G90gFLI#kYD98W+_b+>+$Rugl8~^|S5M*US kM>aG;I7T@_L^3fpGB`6cL|->4@&Et;07*qoM6N<$g8qR?kN^Mx delta 145 zcmV;C0B--%0j&X$B!6^CL_t(|oZXSj4S*mJL#X<>nqY z^B%h_m<#c-mpN6?m^inr*4ZK-}`*~;MC}hS=)))7Fg5-EM zmRjub@rwA9|Bo&Fw96W`m;?!l2Br>9k0%UA)-i;e2ribK@3hD?`Le^Nw3ObI>}A|P d?*Dmf&k#`KS*f=(D24$DJYD@<);T3K0RV*EH1_}i diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/3.png index 4518ddd80cc565d0965fcff2f05cf34d0b8d2620..cd69bed22e38399d231a356ed1916fbb8f869614 100644 GIT binary patch delta 218 zcmV<0044vk0rmlqB!8hvL_t(I%VYR|?&JS22cQ1`u;Ce)2JvAS#7D*;HOTnQf@l93 zC;?avc-8j!KMcdf-uJxt55ss3K-Pq87%ojH2B0e>#_1>qpgWHk15or(Yyc@y0*XSa z7=RIO#25n8j5FYo6%dlc8FSbS0VQQ@iH<0zg7O76HLpq@;#2oBEOX(KCujg605$*= z@*oU~Q)D(QA0V^A7^n%3lOOyC01`?Ch>6(o8vp8=pG(|;3L_$GDI72}~ UFqzy(%>V!Z07*qoM6N<$g41DDwEzGB delta 151 zcmeyyxS4T+N_~~5i(^Q|oa8_C@1EDQ6&+;WRO)o#|Fiu6kp?UiV~%7TIoILMv%53n z-cOJMo{gm(|3I>VB9kALNSt+9qZX4OA<@9p!Rhg2f_o?Hjt5qE+7@IV$YRjrOgh?8 zuBFJF!1X~>DT6`r!~UPQ>yQ0^UH312$FJ!*&J5p5v(^Zl{48^Z0SG)@{an^LB{Ts5 DAY4d5 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/30.png index d38c626011275b66ae58ccf0c634b0b60c15ea7a..739a8544927755bfcee91e12ee2949bd6b7f9926 100644 GIT binary patch delta 182 zcmV;n07?I=0n!1GB!7KLL_t(I%VYSk;n{x%O2DrZZzwYW-371O9{-17nArQC7yn@x z!+KK6GH(~>xVgryl#2A8+@L(>$ zseq6ix&gQpVpE4#0@;xN=RW>tAjw%shU3*t$Nz8$fA^CY5)KL5M*US kM@2C?L`FtMHbgWqLPa=6Gc1tgZvX%Q07*qoM6N<$f(-ykq5uE@ delta 143 zcmV;A0C4}(0jmL!B!6;AL_t(|oMZTZ?&p673IG!&ni&`v7+BB+kX^)R#LkFI466oo z@BBaa^FM~zIy5iC6p#`Y|C_(T)lwV=!@vN%v4B-QQUGGrgb_{nG~==rn?kIbaT$QF x0jFks2Ea7p)lA3$VgM7v1M)ThZ~pcl0J=P9r-V!NH~;_u00>D%PDHLkV1jeVJuv_P diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/31.png index af130126402082c9479429d357794bd8de54b3e4..a707f66cb1b56c21664344bdf0ea9ef138f2804f 100644 GIT binary patch delta 171 zcmV;c095~*0mlK5B!6;AL_t(I%VYR|?&JS22cQ1`u;Ce)2JvASCJvKBXM<=4s)JW; zkN?9kOzeHni~lf8P%}2ekj36Cc=n$t&G-OTLkK#L<_6&O8x{bHLh2hptRXlx6Qh8j zW_$`sPPWK~fbs=NnvrcKTQkvsl<30-0E6G8s6s$#B>(^b5F}(}LPtVFH#b5xFgP(Z ZMnXk2MMT=~mp%Xh002ovPDHLkV1fgDM#%sG delta 126 zcmX@kIGb^TN_mo}i(^Q|oa8_C@1EDQ6&+;WRI0?Fyo+H|w?yv^$->S=)))7Fg5-EM zmRjub@rwA9|Bo&Fw96W`m;?!l2Br>9k0%UA)-i;e2ribK@3hD?`Le^Nw3ObIY_)r0 eHjQpP3=G=)JeNm5c|VB(2s~Z=T-G@yGywpM&ok=) diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/32.png index a7be25c5f81aeef62e693f1b0cc53e629c88ccb0..16024ba5b39db2b9aa1311c398b9a9b97f8bc4e8 100644 GIT binary patch delta 149 zcmV;G0BZk{0kHv)B!65z0g(ZaByCtpL_t(|oMT`ZXuyar@c-P;|8Pkoc1B!cSOKy^7#~Ay9V#EE zW_;j(^EbF!CSo<=0>i)n6hKTsA_pLL1-PP#7|r+;60I4V29h-+Yb0AUUBLh5Z~p%oSrT{v0000L_t(I%VS^|bl_Fni)n6hKTsA_pLL1-PP#7|r+;60I4V29h-+Yb0AU@wVUzG-3b% Xhyz6d?>%xs00000NkvXXu0mjfrA#Y9 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/34.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/34.png index 792b5b8df02c4800478069bece0375990434e42e..9e4e7f8f6164cc663f8e8c243a3232142f579e96 100644 GIT binary patch delta 155 zcmV;M0A&A_0k;8=B!6N_L_t(Ijbr$*;n{zNK?Pp5J^l~FFtPVNFaEPBrm^! zY$aPWT>vQ70Quc+h1X1tumAu65M*USM?yq5L^4D%K}10~G!!#6MM2C`;zs}g002ov JPDHLkV1nX6KbHUi delta 120 zcmV-;0Ehp#0hIxeByn6xL_t(|oMZTZ?&p7ofdq``0?006G-7AOC59ECd*}bTpZ_t$ z*5U9nDPi%y`5Rm<6S10bfni_(3LqvRkpmFB0$kBVjAncaiPnrw1Ie0^HIl8FF5rLj axBme2a7dUTHNk5D0000^}q5!K=2%|6v#=_P*!Ee;6jH8Jl55 zIU8Le$$ls3JenIoN|b!qKnnwiH3X+-ViXY6j8Ea0gHK6Iw#bJ3KlhQmG!L?sY|V7b zk^rc|ZgKrf`)mLJ01#wlLPs$*Lo`D(H8w*qGcY$ZL_`FziVYC}0000!?-i(^Q|oaBTB41eOkf3{csB`E;{hCa6K22(F~%oUt2QKmlEx%ATi zV*CHe9S@7lb~)8NsQ+xfBT6mF^dZyX0}LV#J`PIk3T3PnLE?^Qe~1XJm7L8s$y7O8 gCEEDowtyL`jK$_2%PfD~ZejoePgg&ebxsLQ06y9>cK`qY diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/36.png index 99b2ba70f731ba32f63bb3b2b59e4a614447bfa8..a7758f3aca3664ea372b8455f47d78ab8901a504 100644 GIT binary patch delta 213 zcmV;`04o2+0r3HlB!8SqL_t(Ijbr$*;n{x%GQpb#K)t_CyrIkhbQip8d;A}UVPfxl zUi^n)bhQvukOi<9hG8qRdYB8)6%uqhx);!$M~nerJzow!CEEb7t6>Hp`;8DlaWy3d zpadeZh9IlQFaTWvKFv4{z-0)`t3(-qZpi<0AF--=Rq_zG0ZuSmacL&X073w404U_q zF>>YsVdM-3(gerJ5B>uHps565EaB|K0000GWMx7}H8?~#Loz}_Gc++ZI5#;k=42pRT-5kK)d&2wBLuinP}F z-8q|<@MZ`@z)^{pVpLXd%>aODL0zOK8%fuQH#21c9F-|x#%vaq(kCGXJ?VnOOnbj| z0N@7!S$TJgv;w#P-o)sKq-HnZ2t1v6YZt3JOmWI439Xn>LL)04=LTFEH-=G(X}RKD Ytu0({ec4I99smFU07*qoM6N<$g8$`6Q~&?~ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/37.png index f2ad6c6509c1a2033a4e6e11411dd268cd687fb0..cd30bb16504aa0ddc60500e0ec0acec0c5d54053 100644 GIT binary patch delta 192 zcmV;x06+h%0o(zQB!7oVL_t(I%VYSk;n{x%O2DrZZzwYW-371O9{-17nArQC7yn@x z!+KK6GH(~>xVgryl#2A8+@X!VD zrA(}H*aWeO!MsYGsc7Q=&wc#QK$5eNY{jdYkO4#|3UrK|c{xBBl+2O&$m#%^;?pCs u_P1F8000nVWkN?YI7CH8H$gBmLqs-2Gd3{Jg}4U*0000BL_t(|oMZTZ?&p673IG!&ni&`v7+BB+kX^)R#LkFI466oo z@BBaa^FM~zIy5iC6p#`Y|C_(T)lwV=!@vN%v4B-QQUGGrgb_{nG~==rn?kIbaT$QF y0jFks2Ea7p)lA3$VgTd+bwB?zT>VS70RYH`XvTu*?2Z5c00{s|MNUMnLSTa52|qyq diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/38.png index 76b9957e7006748d8d3ef99a538f0c8099d35b98..140bca83306a8e6a6cc8fa1594ce0b7956356afd 100644 GIT binary patch delta 164 zcmV;V09*f<0l)!}B!6p3L_t(I%VS^|bl_Fn)FcH$p}*HaSExGD9~6 ShCU+z00000EGX*0hj@hBy?X%L_t(|oMT`ZXuyar@c-P;|8Pkoc1B!cSOKy^7#~Ay9V#EE zW_;j(^EbF!CSo<=0>i)n6hKTsA_pLL1-PP#7|r+;60I4V29h-+Yb0AUv4HXax}X0U duKp$4008o>M%0D|3_bt=002ovPDHLkV1h7RF;@Tp diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/39.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/39.png index e3e3f7475cb5230b6909e16facc0199d5bbb8be8..34ca6ae927569eabcd1ba527ea3ad679e9117db5 100644 GIT binary patch delta 203 zcmV;+05t!y0p|gbB!7}gL_t(IjbmV-0K8f7>^~*?u^aHJ?eTvYhKarJdGQ~H(bZyT z#%35UTT$dNOe4bSC|*E!9x(=>=pn}d6jzfHB_B3maRE67V1yenhQKsqH2_@!Avv5e zhs}^L2cKey;f;D^L;j!ph*jaMl85-c46+rMW}*xr1i%J>LPQ>fL2-)AhUEifHW&jn z!Ey3~{{WTR&j_>U&Y}PS01#wlLPs}7GeR~vGDJi%GB!9tLqW@|C_VrH002ovPDHLk FV1nwqQU?G4 delta 150 zcmV;H0BQf{0kQ#*B!78HL_t(|oZXQ@4uBvG1Q%oCfBYi<=~KM%6%r0)J)s~Vjoj>s zF5Ahb1ty9TxXb|HBG!s}1g5vyH`CMFkuqcID^2d6*0V5clczyiKe+<{KL8Y^S!BNX z;tH22eaLg53Fv)jHGR|(AQ|3FL%^tLJq;xgE`ElbXvAm;8xMwGR{#J207*qoM6N<$ Eg0WXWi~s-t diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/4.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/4.png index 4b59f18cf3ef1d0f0be893fdc7a5f060f71b2af8..9d817ad9312106b6a0a52aa4f449fefe778e305c 100644 GIT binary patch delta 195 zcmV;!06hP$0p9_TB!7xYL_t(I%VYR|?&E)4_{+hk|37Sa2FBRfAe!OVi8uclC;{jO zylQ*=ABJIK?|WYShhe-1AZtQ43|Z{Wf@lA+8i1}4A3!k#W&l>_5n}*2B&lHlhTrf2 zP!v+n0Avm^hM;Ihb^%TWgyhf-z@-qII=m9dhJf+~@qR)x96YaPLIw~8NQpjddI8ps x+aGGXd&d9(01#wlLPte5H#RjiHAX`+MKeZ1GB`BI$9(_*002ovPDHLkV1i!TPMrV% delta 146 zcmV;D0B!%@0j>d%B!6{DL_t(|oZXSZ4Zt7_107VU`*cP2=_t&=6iB?%7ZnOgO6jkD zT0WBy;#3){$^bqU0NA9_7t*nl<*9(2hEwIiJH^B;@MaZ`<<5p#$kGoA+$*U0?gLe5 zIFkokuWCURwhAO*!d^iGUHGYBMge&p=2-XwVMT09MkPBrm^! zY$aPW(Et?kAPh=K$ZS|XfU%J?6tX%1)Hk7Cpt@&O0000GWFuulM>j?{Ml&@yGC@N{ YG(|N=K|Mb(#Q*>R07*qoM6N<$g6G*o=Kufz delta 127 zcmV-_0D%9-0h|GlBzR*^~*?u^aHJ?eTvYhKarJdGQ~H(bZyT z#%35UTT$dNOe4bSC|*E!9x(=>=pn}d6jzfHB_B3maRE67V1yenhQKsqH2_@!Avv5D zVl(8+!KWBvc%vTKkpJgCVpT{m?SO2>r5S8M$wSIA6W9fmWHd>T0RY!-pr~`IHYxxB p01#wlLPtS0HZe6dF-1i)H#jy%H#0Y(|F-}D002ovPDHLkV1gJxNf`hD delta 148 zcmV;F0Bir(0k8p(B!72FL_t(|oMT|10Q_I~^FI?M1~6Rx%fNzR>bal)VQfYtc1B!c z*qwx=5XQ$4TZiEPZ~pclMKQ51hiUxZ{EfmeU|?Vv1_q!2VgeF5^}q5!K=2%|6v#=_P*!Ee;6jH8Jl55 zIU8Le$$ls3JenIoN|b!qKnnwiH3X+-ViXY6j8Ea0gHK6Iw#bJ3KlhQmG!L?sY|SKP zNe~7lBxE)$AHdki846h)0JM;yN){2~+yDRo5M*USM?x|+GaN!OIYu`)I5R;rI63-n RHJbnc002ovPDHLkV1fg1K9c|d delta 138 zcmdnbxQuavN`0=Ui(^Q|oaBTB41eOkf3{csB`E;{hCa6K22(F~%oUt2QKmlEx%ATi zV*CHe9S@7lb~)8NsQ+xfBT6mF^dZyX0}LV#J`PIk3T3PnLE?^Qe~1XJm7L8s$y7O8 qCE9pn!^i)-=Kq&m_fPdU1H;{iUX>@JL?Re~z|+;wWgW9qLK6UeA2<*I diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/43.png index b72c0b1849a0c03764f6057f45eadd04581c31d5..cee41bc487817ebbd3429718095a02a4eafc205d 100644 GIT binary patch delta 189 zcmV;u07Cz<0oehNB!7fSL_t(Ijbr$*;n{x%GQpb#J2&bcX0o{4T7=WUO90O2XO-hu&q8`Okaty!-H)0GyPIy=Y9$(5t zm&0ixHbcG~e2O84H|miM`G4*sR)qx94#-wqn!yH?Jfti$kv5WgaT)*sM7yB8(d~+x r0000GWMx7}H8C+nML{q|HbgTvLqjt}7xcg!00000NkvXXu0mjfZ-q?} delta 149 zcmV;G0BZl)0kHv)B!75GL_t(|oMZTZ?&p67GQt0KKmRi^8nH8yYXHO5zYHuGrXslr zW;ix6>`p@S&i`{i|6_=)L-7AMfBTQ3m{^y?H2!b?_MeGZO}M}?FaQM*6OhOuj}i-T z!F9L|LDzuQ09+EpiV^QrLI%JT;8R4<078H&DG>ld-)53ZWDfY600000NkvXXu0mjf DJlsJK diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/44.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/44.png index 417f1c3919b54820bf3c7b5fad37349492ee92b1..2d8bdda490e3cdcf914a7625ede7004bfef396de 100644 GIT binary patch delta 147 zcmV;E0Brx80j~j&B!5~-L_t(I%VS`m0K8f7>^}q5!K=2%|6v#=_P*!Ee;6jH8Jl55 zIU8Le$$ls3JenIoN|b!qKnnwiH3X+-ViXY6j8Ea0gHK6Iw#bJ3KlhQmG!L?sY|V57 z0MXlP07j^uEdT%j5M*USM?*wIGBYwnHbq1;Ha0^xHlaLzE(`zw002ovPDHLkV1gP0 BIPm}g delta 126 zcmZ3_IGb^TN_mo}i(^Q|oaBTB41eOkf3{csB`E;{hCa6K22(F~%oUt2QKmlEx%ATi zV*CHe9S@7lb~)8NsQ+xfBT6mF^dZyX0}LV#J`PIk3T3PnLE?^Qe~1XJm7L8s$y7O8 dCEEBd14DnSE8`b;fhP<=;OXk;vd$@?2>^*cFZcie diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/45.png index e827137950640fce434e0ca965388979bf851580..26bd2ee13cf87ffea9e5f4bb5b48cc536d2b8e10 100644 GIT binary patch delta 153 zcmV;K0A~M@0kr{;B!6H@L_t(Ijbr$*;n{zNK?Pp5J^l~FFtPVNFaEPBrm^! zY$aPW-2edbf@>5x`yzM%000nVWkN?YH$*o!K{Q4&MK~}sHxe>N)3tP^00000NkvXX Hu0mjfCT2a( delta 116 zcmV-)0E_>%0g(ZaByCtpL_t(|oMZTZ?&p7ofdq``0?006G-7AOC59ECd*}bTpZ_t$ z*5U9nDPi%y`5Rm<6S10bfni_(3LqvRkpmFB0$kBVjAncaiPnrw1Ie0^HIl8FZU6x6 W07W6&3sC$30000$rjm=|K~oEm*zpX zlC7C8SrVid0QEq1XKx|JZU6uP5M*USM=>!rH#tT(LohHmF%&aJFgJT_eFFdh002ov JPDHLkV1nc0KzslI delta 129 zcmV-{0Dk|s0iFSnBzk2@L_t(|oMZTZ?&p67GQt0K{}^JpoJ~qt{BQmSSIb1KCR|_`7=QwZ2}tAs#I68O>LREapF*NFW79ygW@L?I jYbM?n3bN$?=5PN2!&Xn?;hgzF00000NkvXXu0mjf>1;gQ diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/5.png index a84f20ab0a8c98c0e3f7d7a103fef8ea3d339889..7a5e0375308ef6291b439a24173ee7808cc97cf2 100644 GIT binary patch delta 201 zcmV;)05<=w0p$UZB!7@eL_t(I%VYR|?&JS22cQ1`u;Ce)2JvAS#7D*;HOTnQf@l93 zC;?avc-8j!KMcdf-uJxt55ss3K-Pq87%ojH2B0e>#_1>qpgWHk15or(Yyc@y0*XSa z7=RIO#25n8j5FYo6%dlcX(2X4KuH-}q9e+wpnQQ%4Z*Yn%R*eZVB9kALNSt+9qZX4OA<@9p!Rhg2f_o?Hjt5qE+7@IV$YRjrOgh?8 yuBFJF!1X~>DT6`r!~UPQ>(y!+-FO%ndVDi(m${~^GjKC7FnGH9xvXtj;6GfG-E1QpW%czY!bo6dQodA;u7lga>m0 zP6dSI&<(()5Su!@63B-9KlkxJ14+(8G90gFLI#kYD9F$Y05Jd7r#Wy|(PjVu01#wl lLPtYGHZ?&wGBY(qMleJ$F*S>-+!_D?002ovPDHLkV1j=_OF#es delta 146 zcmV;D0B!%%0j>d%B!6{DL_t(|oZXSZ4S*mFML)#EeO!@!7=;;}f`rregdxyY#G5@f z|20AL%ejnEyt(|RJ%Ps3C=^kO%04ZK-}A>Ua)3u*NOfq4Zn-+Z75 z4QH}o?Nuo#!kVB5RM-+!(1f1^Gv#rv!wi`h@NI7ova2qA01E&B07*qoM6N<$g4P#2 AU;qFB diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/7.png index 281317d200e53876f6af1ab2f0065569d57265c9..442a8b89cc4d33a6d4db6a73e62cacded8ee1269 100644 GIT binary patch delta 171 zcmV;c095~;0mlK5B!6;AL_t(I%VYR|?&JS22cQ1`u;Ce)2JvASCJvKBXM<=4s)JW; zkN?9kOzeHni~lf8P%}2ekj36Cc=n$t&G-OTLkK#L<_6&O8x{bHLh2hptRXlx6Qh8j zW_$`sPPWK~fbs=d$r_fq7-$Mei9T$40gO7R8LI5-#Q*>R5F}(}LPteGH#0**F+wpl ZH$yZsGdWUh3H$&6002ovPDHLkV1nXiMY;e0 delta 129 zcmX@kIFE6HN>!?-i(^Q|oa8_C@1EDQ6&+;WRI0?Fyo+H|w?yv^$->S=)))7Fg5-EM zmRjub@rwA9|Bo&Fw96W`m;?!l2Br>9k0%UA)-i;e2ribK@3hD?`Le^Nw3ObIY_)r0 hHjQop`JcD{XE4$8mD_4CaW4Z9c)I$ztaD0e0su*lHMal& diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/8.png index 057408225fac40ff38fbf72295e313a48b92a415..d3063fd2e5c7cdffc601971df0a7e58dd309b9f5 100644 GIT binary patch delta 157 zcmV;O0Al}|0l5K?B!6T{L_t(I%VYSk;n{zNK?Pp5J^l~FFtPVNFaEPBrm^! zY$aPW14W5~1ib*z!*TX+Mr^GB000nVWkN?oHAX`*GBZXsLl!|pIW$2+)w3^A00000 LNkvXXu0mjfdSyTQ delta 125 zcmV-@0D}Ly0h$4jBz9p*L_t(|oMZTZ?&p7ofdq``0?006G-7AOC59ECd*}bTpZ_t$ z*5U9nDPi%y`5Rm<6S10bfni_(3LqvRkpmFB0$kBVjAncaiPnrw1Ie0^HIl8Fcw6uU f8bQ6y-~Iyt*dk0lw8H4v00000NkvXXu0mjfF>p88 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/glass_8/9.png index b5609ddc1ecb6a2718fc5393af921db24daab6c3..937bcecb244c9b480269971aad7db8d8448939ca 100644 GIT binary patch delta 153 zcmV;K0A~N10kr{;B!6H@L_t(I%VYSk;n{x%GQpb#$rjm=|K~oEm*zpX zlC7C;SrP#3<#G0$nRoO6000nVWkN?rH#s&%H!wCqGDa~oH4-#NmW$!`00000NkvXX Hu0mjf*3v__ delta 125 zcmV-@0D}Lu0h$4jBz9p*L_t(|oMZTZ?&p67GQt0K{}^JpoJ~qt{BQmSSIb1KCR|_`7=QwZ2}tAs#I68O>LREapF*NFW79ygW@L?I fYbM?n3bP~ty5>x4Ue>q400000NkvXXu0mjfy^uJ) diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/0.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/0.png new file mode 100644 index 0000000000000000000000000000000000000000..f17ac4cf7e9a3f6f7bcf8dcad27e0eccadbf45c7 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`%BgKl#kFyJ`z?{!I| z-^KaoF2+auSp+0|UF7QIe^jY1sZ^AnzW>vWXCIu`FUr)PFyn^AJmKWtjm!)FC)Mnh zeXeuRsMGi6?aqVJlQoVrhWMy%DGy-$;oJ1vW2&kZrf~-_;bP=!X6a;N;^ty(U})A`cIOmOj=|H_ K&t;ucLK6V-WlgjI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/1.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/1.png new file mode 100644 index 0000000000000000000000000000000000000000..b3cab73f17777462546a812f6f1619d954ee0cb0 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr_~Te|&#`zdq;3f$$Ks zo_@V^3~CyT3X>g7&ZJ04tFb3P7HQ6Gx~RfjqOY*KMMZzYTcJ&J`%bemr!(ASu&i4t z)FI-od^2&w&s(`YDcx_Ray;dHf@L}sW;?bWh+#NnVAkPw>_w7-9m7&9h1rre>%gu^ oNp*5JH#agfHMVp#bG5KAH8eI~yX*QUpraT(UHx3vIVCg!0Ddt*1ONa4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/10.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/10.png new file mode 100644 index 0000000000000000000000000000000000000000..5a511be28d13e8857ef34f4746ad641c9f0daa87 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`cAhSdAr`&K2?~sVet&;&Z)bOt zZQ>fq7XF&02g){?E@oaOX~M-OG(og?!xWE+YZaKy;&=P*Q%uQryUy{5nW4Jc`Gnu( sV=q9)rldN#ySbP1LgZZ&L)!Q2ckza0Oi#{{~8 p3{6ROayNChG=^9EpPw; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/12.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/12.png new file mode 100644 index 0000000000000000000000000000000000000000..569ac06543359387aa0fbce77a80896aca7cd40d GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`d7dtgAr_~Te|&#`zdq;3f$%pu zDRv!c48kc)8{#H-8t@rOyByAO5pUiY$kTA~2*Zq9XRqfaS25mHeKBjp%A*C0cGDMB zvma$BVz|LA($2VRvj(5bq`eI?`$Z}n-%Ro7<4&jw*ke%8=;3L_5Xr}&ZLVk;AzAkx pg7&ZJ04tFb3P7HQ6Gx~RfjqOY*KMMZzYTcJ&J`%bfp9Aye+nwZ0^ z@$JxooeZ`sFWC!d`m!_lC?7ewTH&o1$gY%BCwF6KCpR-Qb7uo1b4OD%3(Ja+JN5wO O7(8A5T-G@yGywqKel_3# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/14.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/14.png new file mode 100644 index 0000000000000000000000000000000000000000..7d5d2e7157effcfa5ca22385664b1496b298d76e GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``kpS1Ar}70Kfb@e|DQSj|6lft zCvr**V;=E{Fi-F_kV;cBGfc58*%)ZR<;Ez=z#v+Y{QY0n%Jm>~Qc|7V9UTpg+$@bv coJ|Z(9gPePUn-p20hD9#boFyt=akR{0BaB?rvLx| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/15.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/15.png new file mode 100644 index 0000000000000000000000000000000000000000..4f91c8673c78eb642cbc04e27f963fc5268b8050 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`;hrvzAr_~Te|&#`|37p5|G(@P zPvqnz-MC^9z;uAE!H21Eg0G8M^Tvr!6LL1iG8mV9-g^7L=cSfB<&%02-}#OAAm)Zjn-`0Lv3$iaI)ydt`z|h&r#mv&#(#gfr+1YK6 S>l+!M9D}E;pUXO@geCyXlss4f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/16.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/16.png new file mode 100644 index 0000000000000000000000000000000000000000..541ea7e045d109b1c6dae6554251e2c4d957ff71 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr`&KKfb@eU(cq{aPbGj zE-8cm2f`0YeUx(P;!b$wAdzR-C%*RW4<`J;wwVTL?IsHS;v?WN1mu5$Nr?c+{bWL2~1xxAW7Y rBtZ^INp*5JGIKL@b#ZkwHZyZ{v~+WecV3YWlwbP0l+XkK7c)Rx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/17.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/17.png new file mode 100644 index 0000000000000000000000000000000000000000..de1385ee92f8035347da8ab383abda0d2ec371c9 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar_~Te|&#`zn)E{;oNaH zzM9q*jTc?AkE9CBU^Hroa87t-7Qg$i{81ATb-_gA8w^RN55F?4WLPc!;uX^rg9S$z zybkr-=pSI}*U@hwYxrV&au~`Pd74=YHWnr_q@TOBsNi(_ rS&%zYQk~pgj1A2#oh{7`jm?~#&0NePD%aZrPy3=zXqu?&Z2ufKaNp*ch1*fDm7 yGxCRRdDa{@0U4f>>f~-=X5nID;OJstV(Mb-W zqU#r>giDjzBpE MPgg&ebxsLQ0J6q3c>n+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/22.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/22.png new file mode 100644 index 0000000000000000000000000000000000000000..54a67374cb51dbeed7a8d7239c4e83b73eb144ba GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr`&KKfb@eU(cq}aPGKz z`=R5@1?M~ZC_Fk4-oaqlcHqi^F9#Ss7@PXu#YTx{VESX3_3)8xp;aGJ+~;`R3~>w6B8pRCnsl9OBZKjGXrOzb-ynFQL!Xu$om5fIjHZf0p zl%aB*Rin|v&udAZLeL~3$7#$A0R@Mi-M_ps8Dw8ds*}5+tA&YyshNSJg`=stlZAOo S)87Q39D}E;pUXO@geCyGP&v~8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/25.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/25.png new file mode 100644 index 0000000000000000000000000000000000000000..c29bf647488d424edf41f5222a589a858ecd9f1d GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)}AhoAr`&KKfb@eU(cq{a8ae1 zIsW7o4(5ip#0RkkQXK;885k#mv;w!r92wvLk%&E}$HPr>mdKI;Vst0MC;uP5=M^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/28.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/28.png new file mode 100644 index 0000000000000000000000000000000000000000..2949abffce4ab96995b2611d678e84fc63fd269d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`fu1goAr_~Te|&#`zn)E@;o=X5 zT~Y@B4}>3*`Y7en#hviVK_btv$8n8!fXU<}V>1S`ju8C>^Hw2;job-RC(AgG#x+Pf zY!qiZ$GT+Mk%QCu7!Gu|YdN0CGXdF@lIrAc=wj?_Z0KTW#XV L)z4*}Q$iB}lBzVb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/29.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/29.png new file mode 100644 index 0000000000000000000000000000000000000000..665cafef6d017be01ce808320f800672827d8a36 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr`&KKfb@e|DQSj|6lft zCvr**V;=E{Fi-F_kV;cBGfc58*%)ZRrNNYU8tjzIQ-522WQ%mvv4FO#rtuF_HiP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/3.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/3.png new file mode 100644 index 0000000000000000000000000000000000000000..d1673da77bc05b51f0cecb4882d1329088a55661 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr`&KKfb@e|DQSj|6lft zCvtL9o;KNin!PiBsdE>;V2|1f$8H`IlZ@qm)y5a13mE8g4WbSADFZeV8WXk_RUsWBTU$KdJe=d#Wzp$PyAB1QB7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/30.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/30.png new file mode 100644 index 0000000000000000000000000000000000000000..b16d818f5f8276cd38c90773dbddb8892d2732ae GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`!JaOTAr_~Te|&#`zn)E@;i5`2 zbNtCG9Lyobj5qZZZ>O!QPJ9rcq zZ~s48wxi(el4Z;yy#aO%xkp=j5!b#gZ}H* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/31.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/31.png new file mode 100644 index 0000000000000000000000000000000000000000..888260c1f8e8daf55810e40bb6fab6842ecbf753 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr`&KKfb@e|DQSj|6lft zCvr**V;=E{Fi-F_kV;cBGfc58*%)ZR^`Ns&i)~`AgidANzOvah*C(u%j8$IA#>jAl wqg9gk-0}k;vr|%?+$~%UjV;ZL-7HPa3>{6}Oa=9ujDd0tp00i_>zopr0C$fr2mk;8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/32.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/32.png new file mode 100644 index 0000000000000000000000000000000000000000..e20e80bf8d186cda0985448f88194e4f82031daa GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`I-V|$Ar`&K2@a9BUY+MJwFt%UGHYG9)F{$=%r8(7?#j(a6Za Z(Am($!tLOJu%AFV22WQ%mvv4FO#rpjDZ~H( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/33.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/33.png new file mode 100644 index 0000000000000000000000000000000000000000..adad6bc580cde503f6dc89db774bc1e24614a06d GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`I-V|$Ar`&K2@+h=F7uaOFIGg1oRkoo142i<(*;%*~sAO>gTe~DWM4fDt0V9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/36.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/36.png new file mode 100644 index 0000000000000000000000000000000000000000..e67378b6ce14b4ad37a089e878c06e2e00186c57 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr_~Te|&#`zn)E@;o^}7 z=6J=dgC;%BdQL!dyNLK9?DpM|QBN zwVO*hPP)Ov*x77)K}Wz*=1WLtj<%nn7n5L)KnH^)Q!(Qiwh}3EHina?62~;fR9=8w ok&^1K2VOq)78&qol`;+00}2NF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/37.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/37.png new file mode 100644 index 0000000000000000000000000000000000000000..f93976ea75ebd6ec81d248d605dfbbbd54cc1d86 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`QJyZ2Ar`&KKfb@eU(cq{a8ae1 zIsW7o4(5P5C8xG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/38.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/38.png new file mode 100644 index 0000000000000000000000000000000000000000..53568b8154b13110e0b79c00dc242417381f6e14 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`x}GkMAr`&K2@xG0hZPuOa$+PH{Ij7Fi*Ar_~Te|&#`zdq;3f$$Ks zo_@V^3~CyT3X>g7&ZJ04tFb3P7HQ6Gx~RfjqOY*KMMZzYTcJ&J`%bfp9Aye+nwZ0^ z@r~)`w8^iSBJ2))VA`0-=$$cp{oQ~5WeSH(C(q&wFmd|Ha4+xal3!=~zkuvdNp*5J ibapZ{F)=r=Ffwp8Ff?*2Wzzd$(#Pgg&ebxsLQ0PHg@IsgCw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/41.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/41.png new file mode 100644 index 0000000000000000000000000000000000000000..c9603894ee0119764f96d8a54156b2c399df48a4 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr_~T6BL+be*AiGZ{%yH zaJ!-Yzk-x`{O-T=m1dtbOL(x?VI#K&AM>ipMk~FBLJdBb364jk+5|fkdKDa#{fq7XF&02g){?E@oaOX~NZJ*PzNK!0Y|kU{-|TsaS@?v)A7}me8CbaqJj7!~E+_ v#^(g=g+V5#q&m49IvbiAn7f%6yBeBXxS2VwxfZnoD97OG>gTe~DWM4f#)~d& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/43.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/43.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ce827550a34ff9c270638e065fa2c66f65775f GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`zMd|QAr_~Te|&#`zn)E{;oNaH zzM9q*jTc?AkE9CBU^Hroa87t-7Qg$i{81ATb-_gA8w^RN55F?4WLPc!;uX^r1Bn2A zo;}=d%z}?Z875{m`UwXHtq0kXlIrAcZfb4<#0HiIE{Ar`&K2?~sVet&;&Z)X?D zW;k*6&jaCHIqK2IRtsi1E=~~Pv0-3X@j&j|ob|W3K_;Z6I=Nd|I=fgJJ6Tv5TN*h! W85+82<{Ja$7(8A5T-G@yGywo4O(O3A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/45.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/45.png new file mode 100644 index 0000000000000000000000000000000000000000..4efb848802937b53ab1fe73ee3f21155d37e1ebb GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`TAnVBAr_~Te|&#`zn)E{;hehE zgtdY!d^LZ+%cn3LZEG-yl#+Bis3F11AXB2W?4sS-{~#k$Qk~qLTn!9d%#9o!UCdoA XoDCh%?T&r`lwbP0l+XkKk4hz3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/46.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/46.png new file mode 100644 index 0000000000000000000000000000000000000000..50e21944df2afddec64658cd031d25982a5effec GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr_~Te|&#`zn)E{;oNcc z_Cv>)Pn_V$!@lp|Z+;<_V*)d*CdlzP8?Y2gG%V_q@ZG_nTIJ3d%BZO+kZ&?+me9s! z>&{-!`>%d1Y(f>!)*~6mR*A(b+cj@k$;#kV*WUk5f?*rT)|6BycMBsY7iSj}Q%56b Yb4zn)({`_utATP1p00i_>zopr0Njx~F#rGn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/5.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/5.png new file mode 100644 index 0000000000000000000000000000000000000000..1db02d4386b7e6af98ac0af1ed4cac43c729fcd0 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr_~Te|&#`|37p5|G(@P zPvqnz-MC^9z;uAE!H21Eg0G8M^Tvr!6LL1iG8mV9-g^6pbi>*6D!Uo(T8pqNdB!cU z;8~HyP`a1l@dW08Bu2}tf~y7Ju|_BSpnnDbVWgb=u7O5Qp pxgsUi$=$%k#MRZ%&Ct})z|q9g!0=?_B@3V&gQu&X%Q~loCIBsnLWckV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/6.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/6.png new file mode 100644 index 0000000000000000000000000000000000000000..673cefa7eb2ac3f5fcf24f47f81a8adb95a8b62b GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`X`U{QAr_~Te|&#`zn)E@;o=X5 zT~Y@B4}>3*`Y7en#hviVK_btv$8n8!fXU<}V>1S`ju8C>^Hw2;mE1EDdYtcTa&mAn z2p`?(SZH!+k3*K1inT!EE3^3Bf9Jn(XvtPHm0gh0@`*9Danh-mJ8V5b)~BR8xf{B< hx|ledx*0i|IXSu-860~pa}g-V;OXk;vd$@?2>|LDKFt6C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/7.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/7.png new file mode 100644 index 0000000000000000000000000000000000000000..5435a5f29bf8c903f7a0f218fa9c50c997d51bad GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`L7py-Ar`&KKfb@e|DQSj|6lft zCvr**V;=E{Fi-F_kV;cBGfc58*%)ZR^`Ns&reV^AgqO1=xDBryob>!z_I6GwhSNS0 zS)CVqLUnh!)vzT7b2Ee`E&by9;cyYis+3eGcXM+SV+&JrGjnrGCnHA}3#UUy+(0=7 MPgg&ebxsLQ0C_$(+yDRo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/8.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/8.png new file mode 100644 index 0000000000000000000000000000000000000000..058a2103edb58d8d8ea40f25b0de80cbca85eae0 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`zMd|QAr_~Te|&#`zn)E{;hehE zgtdY!d^LZ+%cn3LZEG-yl#+Bi7{ES7MQ)0ULyp&xReUN8M!BE2-u~a|`%NON^I}h^ z?k=|)w!~m=hS<22#p`BB)`M(GNp*5}bT)T!bG2|bG&eM|bTn{%Ft;NeD97OG>gTe~ HDWM4foR%}& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/9.png b/src/main/resources/assets/minecraft/mcpatcher/ctm/ineffable_glass/9.png new file mode 100644 index 0000000000000000000000000000000000000000..c033d99f3bedca2c906e31f7c7d8493205fdbbe6 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`L7py-Ar`&KKfb@eU(cq}aPGKz z`=R5@Cr)tWVc+-fH@}d|F@YIY6XbZD4Oj{#8W#0Q`0ij(t#W4!Wz^K1u)r}zn$0_Q z_WHYO_f1o>-L8AAa%9+`lD1`c?VlYWt5Q;(+@0Nwjol1Q%*}fA78b zPTzd<&FRm7{`2Y1JMTQb@x~jcr=EIh-S@{o{&C&c>sxQVb=rUW^Wuvyu0mbkefQnz z!w)}P0{Sk&Uw{4e>4zVFIQ``>e>vTE-+iaI-+ue_*T4RCmD{SNo03=!zx&94AqXbm=`RAWsh2DSv{dHfj z|NQ4amj;hN{`hI@%L;U38g!*ig==G<*Y0=Td1uv1i#}UMOyaxmzPoOI<&{@XFTM2A zdi~{>Urt|s`Q=i-&uV5`ramJlWJ}fOo_lUxG)Z#m_T7I&4?VODo1kiE3z{w)WYuc8 z`|i8Md7SjOuA3Rf@<`hVFV z0bT$8_rI4)ec4Ub^84TaetBYQSKEL8``>k+?oP;7`)YS;ck#+@s^)}sV+HhzCRBDA zF%PWf3iN+vs`XhlS2%$ctZ9AL)&I+tKl*`prFo%u=^^%GiGZ=Zhp z>8Yz)vwFtMkZS7Y3RNJV$zBBZ|5pE}UazU2>S@v#sj#a-)P409-|2O$R_Z0W8d+xbswg2_kUq9nP@3$mpECi}xuhsI!7hf#(895MJTt@;iR5|{?r$^ctDi1Df1bsZ1#h5n~m--F9m zO*usa1Gf628&kI~?X{Z!^Pm5me*XFAeL$tzmg5)?xX{gdBVopcZf(r;d1aRo8_Ial zSV+~>%zz22??HF+ARpR7bVjVrmw3?U{cnH5p?-p!U=~nv*^HUQ3^sY7y9~DOOX$vn z`ro`zPgK*92PV~QWV-A98jTqyXhkReP1igvA3spP^E*g8g5! zdS8KWzx{USLF1wxNc}WfGgGx!LmC`;kPwjzdo&WOXnA5^)MoPn9;9ZUbLS~EKj?od zN?A>)ElFdGt_1X5ZLN?o(0z^6h?Kyc2WZ3tX;eE+x*2%#U^!9})4;Um_3wZG`{|QU zKG}JY(Gr46IpE^KBoSjakZNP!O&)NvxUlme=~*>RCJ*YeBM-6zHe$nOO3TAcYcPN0 zL0ToO?<>59vq_?HZqR^5>f=E*78`%m16+I=v6&{no=iw!pP7ZLjWPRNXjs|h2dS7^ z87HZ!+WVT5#dE0qL6C(9s|nqZuctm9q|K2B2}=O=Yf{Zw0%AgHr%hD4i3iyyjT6?W zU7m;u37~d29(hnRaIyC*#K|!Hp9`CC<3YYr&6rq|7<=)6&*K3OB)|a6MqPguXk6qo zsh>ux7mU6m4{EC}G|ktX=EW*nOiX}rpC;L3t{09xfc~`D1=J;z2gmh7g+%IjkQR0G z&I7#fHH4)yt!kETX6(Fh^@7m_?R}Uh&h>)nE{*V@Yw@7|oIJR0y&woP1)lMsnkEk} ztry~f?!|@017Xb!bFYgJy0?Gkr9lFg4U(LNvn(F;KIsX=gEZ@&AAkIDckv}4L)7zyJRGcX04bJg6B}!e(bYFmVbr@E|wNkk)@pb)jHvX#ft! z|M69PkexDG&SpYR`&|R!egVWWKG5e3n6Y7R38*%sFG1piZtQzJ$f&|QS}Xyz^%x(_ z^@7lL@?f8xFY(~GUZ~wd0P|+XT~S*7FHa(LOT}u*11s4)%lK0FWx?mXxw*R6N}ce;0ZVt=Y_^1wPdL6Zl6``h1E zz{ww$5%FO9JBxQUfh4Q~GCkR+sbFhC#3wlcx;7jeSQgW8I)cu=<*P)8nwcT`S`jZ+A^Gnj-E9$pLEhRtx>hXJWX+J_7_ax$+I5Ks zD_YMb>#l6jYh81R2Wfib!S~;P|EmTDk3jOsgPLZb&Dno^jRhG?s^ftapi3|=Rlf5e z!{7loojgcja{(TRqjI#J2dOxDAoynej2Jg355$$b1}4)Z4>IhL2Xno>kj9nuf6l{j zlLvB&m4Ut`K%^$0q;>|A?Y4f72UWTjo_H`bxb+N5%V>yFCl6}=Ci1A@40mnT=rXQt zH-tgYc#wbbD$opUYR7|I*Y*$|^!;YmNn$sqQJU0ElLu*8yK`RyZ1Dg*Eqkpo-cO7}q zcWdDp6lzbkrJfy~1nQMbJjkfU&?`ntlI8E@L9c&8`^f{NcMWF|Sr!(73Oy)?Zs@YiwDx*70xErob&WQXR}0Jn{_m>0IkN!1O6byslvG| z+^4o`mj0?1E?#Yu2MK1cB_PT0#g%m*gH)CS*$W^cAh+-qW6;rW~Ir4rGdy} zx@v#JHi(LkEDLLHmdB9AgGnMYQT?l(crd3uxu?YgX{{v6A)9#_5D(I*$i+^&hcL8@ENW3*Ts_D1zAU9u33@YUm@t}W#+}0M7{pmTIuc-}%^=}#&k>Ub8uzEA( zv(xIvYQzI>EFw+ydStGn>Pm^2&8UjJCK!q5)(H8Cjcv|ms#}|Nrmu{cN|OhT2?<+) zmjLT*Y7@40rJh=BjU0K95WC^~+?a|&-EN$V?KHCgE~=G#JL3VLmoqe&(un)w0WE)b z9%v^=ksI^H8}`jWk^%d! z;{)Cssr?`FmJRx2A#LWVrs9RPzym#y^$A}BB;b9(27)PDLNk`K{8^r8H{bj}=Y~{n zOVDa&@<7&mgQ`@F2m1WTgMv!_(ItQ6+4QYNhnbq&+6v(AbM!7A2=n7XY6XK~3<5ys=ba?`={_2j>H8G+J;@71d(IH6DLv>|jZ} zMx)eUAI3ln4yzc0hych>n=>AC6V;_bZCZ6>uV(Qx9#l~L(~Wr>Ivsfs`Wsx04d>Q2 z$!PhJybK#B53tip#t7Y{Jeqy*Kur>|dVzzT@gR#&XtIGtc^jFjd*p$%(MktS9?aRf z&)V%to8zf~-mjhSW+G!C&Sif{y)t=Fo)HiF&W`zJ^QArJ$pf>s;Vc}UZoOh8H#Tr; ze^xg`n}z4OwV4TD3CSZ57&QS!E|=B|{qGdrrq3OZ;4}&N{PWLO%{I2J7xdVQ(t1-Z z)(aWyxL#0+F<~xU!?`ayM<9rnKXCFz-%lRY|H8nr1e9~|*k37bhWWME zrfqgStJN;Xl+s&ho@= zqOvVPJm|AnAbK%Mb@P8(FGx)1B&jZgiwA^j3Qa{RyA3jmV zkq1H@-8Q{YaCIXODm0s<#_SXivq5g(XFCrjg=nPx1ew7u@}LhaIQkzCvh>{b)wO#Q zioz!kYTw)nOOVyckp~Yv@W8LjfBmhC_(Gq{nTV4o57zzy9yGOOq`9Mm2i>eEreSv; zNRMZrNu9}qYBPVtX|wadz?nR7xHqAb2jYVpd0>EbW#oqST#U{gv5P!NgRIQ@36K)K z$b)LJtUdCe*l7lyy77z$4tUzp`%OG>cxUoJ5Ae+1PaZ(r+Fy`Ao9=l#JlOXaoYTL= zgN)~dI6D{*S9l4{DlSt|Jdjdz-V#mw3?s7X`#}~5Ht=9( zb-?CE9wekTg2*KvV4|l8F7m*PBW^zOU_LaoZ_-@ifqZ*f&GQGECeL(*2NF_}54HyE zJ=E28>zsc>cOImwywMy?6+ZHyxs)brdtjbBNziZNft{}3!hP&gYNeP z&P5({Q(9$2n-oVL>__j9Jg_F3BQGO6^m#lnaa%kPl{A3td|c$g%qQ|TvCxe?sO$7X z!fJaXFhQ*&=Tl|X+Wn3rZ{2X@!94s8Vc?1fmc@TtYv7xBP+_YXV?{SF8{mNlKaM;g zoQs=3uEYm2o0oVndqUdKqiK6Saq=LIBp)Y0-G|uM@?buml%eoIu2~b8fJ;2E>^<_J zR}??vfxfPNM;;_-j*}}qFue;f?Cu#jbH<)$l6E8FLHxTF52{&?eLpQcyTmr=kq0w& z#DjnReB$JR6dxYg-C_C3gSvX1PrSr~`B;jxDR>}qy_N?aKb$-;E7@k3<=%N9hbW&o zqtPP|XnV#3nO$HpgnOUkoip>!137c!UAHo3HK(p| zGSBT)(SF3z0u&DnGCgwS!TwN~VVRK0gBgFhPafDN(v=r^kXw7s^T>n#zbzg(i&`%@ zLWT*Jg-e6U1Iu8`Ua3HE@i^WU9*70yjr4%RbE%65DqcKryw+r4wR#;7jL0({)C$G*~hqGmrStIKZUfpwzpzQO}pJqKHJqJ-2=#|+ha#)J8M1|Cdk@W>+% z61Jc^Px~Et;B=J33P&EC9l5qacZmmfdT!)_=ajDF!AzA2{jcSLuDZm7d8lVSO*DDH z79J4711F&bU-R($MIL06U@Fw3k;i}aukfI*v%8?EUUFY z-{_|a+`tbm@gS{g;!1%`9^|IC%Y(ddEj;ZVUgAMntY#l`!Q{c7!8r0@;@#=5a%TKR zS6|_Q6OT!kgm9BsKrH2i#EE~*I z;&!mC)aUrp>#Q_x_C^dW&54!vo#LfffFyYHd z2g{+kzk&xV)Sb!3nJ01Hpst%C&)iDd{Xj~ z>>Ue5=(RH&bv`NUSF7X5OTgUSa~98P-a^Dy+2p}~=zE^_)9;f9+I@dCq-US@iA6$T z=1?#3K;&k#dxJ5*%rd=j;@eIT9t!!lc`DR-r0aOl_nhiR9>`+hfz!cG5S}IDxaj18 zSild4Xm7ahROvi9vvC$Z&`{=yy%#@T%L6}KF*oUN#RJXVf04x|?d|e_jnWqUctD74&Uhg9@i15{?1lu_&T7gYoUO|bGF{<;#GH7bra4M;*@tATALi`^}A_~nu&+%UIov1;J2`{J|0MeTT5Nb18zy`{~HhHuP_{W z;0(e#A!)rZJ#aeJkq1WWjXdavH0xNMA5OT$gSB;j6AvorXYu9%*c*9J4L9+?Xtd|D z>Cd^>$m;W1&N+4oU*UnndY)hN)EHw`^S}P}uce7Zm9whbJOOEvoxg`NPt49OlPf%! z2fAj|UOU<4$b)4>JaF?R9`wrH4Sn(R&I7-=a)}2XRdb%#56~Hq)$07*qoM6N<$f-0e@t^fc4 literal 9137 zcmW++2{e@b8y#5&(b$sE7?FIwi6Nh*CdL}Fhmd^>5y>{PO!mmqC_=K8HDt|FgoIQ` zl4K{#RF)ye`hWb-nRC)H=Ka0TbD#U%d*8WhsDF{2m7f)XK(K3TsT;$;90&v*ftd+@ zs%70d3I7RoQ&Th4R#U@x`*^vyc{n2w;`c-DpVy*S;nC>5!4{`^GDG#PL%i#=ggA2@ zo(MaPC?{8~w=zw|pS_7iE;YQ&Zn99?-QKaREUFB{97=e8<~fh2x|tY@Xza>=x9X{X z9LG*1|I0Y)`@NvGM#mp3XiP3X^=y|h-KKH*bN-^fG*|YezAB}qXxU)g>R5ZPcE}3eQ=+VMJmC=0m&e7TUA=6JGi>?%)zfE{%ra*V-`N=U8;{8eK{mg%-k@~( zwIsDt8Pd$!Tg>hhqn177YbJy@~CCvGp zdAW7r^hWYGQq=Wt%A`r`<`v6dqy3LZS}v^bgd&tb`;e8e|0*F67=*UEib>$(gvVD> zetaFQJto6{qEFEvk*t+w?O*I`-z~ql;h6H9_7Q}f{uV*?+L({5cU z)^WHy`leN}*W&hXKg; zOaTNzDI1CSF*+*DrY5Q#-rlaJkQkvW7NMC>H{`dnz0{)iq<4-v96<|4r|U8yFwBQU zwN(W>5s02Dj%Z;9l{bTfM{js}*<0}X2LuQQoI9az6xrcG*N)@plvX!-yRh(&OZD+j zy}kV&a=GHHWKos;eu8A0np|dwRLjmGqD=a-)W^A7GgRVyV`6;#VTDBc&YQS&-4~W+ zP`o_xa8d0pCmHdFI?1M{9bdol!iR0`D)A>UnUx-8jXH$yoxaV4ut>cx%F>3Lk-G0^ z-C1am4Tp^DIQeI3NjUB#ybq4yt)R{q4TXJX%%V-UljYAH_GqKNT9bCEwg{$vl!xDh zW1tW1vU=FGOK`X28~yIJ%cB9~lk@Y;aNh$9JlbS}0v@kxS;ottGI81v%iF)SF}bZ& zGAIE>@I9v?mNLmAs?8-SB_;fF#M3-AN+D5Ln@i^z7rr-QjtHL_jv);Bxn@Muf)jCU zMEtp|BQus|(Gd~!uY%TD&!0aZxc&Fc;`%u!3r)UgKoN%qrwR~>PlMo;f@bNUP78r7 z`mHV@=yl?PZ=986%&^D1Br~#TY+kH?6T1orGy@7#UQxlR!8y~^be=iTvO+8V4BQ{V>gD=En{E1hhQK|%i>eRL5|>v5Ik2SCQ<;a8y+;&I_R&kl9ow960! z>`XRF!k>Qp$S&Ba!og7A($Z;%(-JDAG~TP~%~q!7A0kb9$BM@RtWX|eDJrjRVx|@T zL3xb4^N>@MOmjr58!;I13=~T+n`3#42Hj()10#@EuU=iyWoze1bzU(!s=;~j;>8!( z!^e&tbCt_9G(C#w^N_RWW0FZ{3*BA6(lxN~Kb?&NS>!k)JbPao?A}dTJq)~#M_GpeMKwum0 z0C?5Ik(5RbMio0WfIx+#&s7#`$tUq-F1O!xVr`8FiA2J5r*y;dRTR#h)0yYGi!5+k zl}hVzhUP*$U>e2aa@_cxEcA(e?zPYudC37PzP>zOJdO`tQliuw;a(f}`t^m!Sy}ei zug4Q}#98yi+je&^IO=gQ{5+VrrcwRuwsWYe;a^NBCkrOTuRnhd0U+Pl;ohW4*(Qr> zzo*wGBM<-&wsv-O-`kVuuBs2*H!95uCZ-REXg&>2V!W)3U)=xusUp}3HB5B|Y>R4> zR}l!9!uPW>K!W9zSM>chhNXjs6+;$6CK5-*VPQhkD|~TzfOEDOwHnJaa5-HuZXhL_icZ_0fB@w8 zIm%^DZf)_GnH`SH!=V5WKpC0xUYMQT zr7#26pmT}z?YO`?;*%I!@TZr2ozmeLlBjl{?3pZA_3RFZJJr=^Wi$1joBccEqZnyl z-%4-nRZdxbN@j0AsP2<_`XN7I<~AnOltMIy8Akit_wPFCDm+SxiuP#u!_?bvBVh0b z1}^_vT2eDLUEAI@3Cw!@SoA4fEK7kKF#Sp9Lr@Rk?9djJ^$<)r98pxe?SSg!GxdJb zwZ6S6_^s|^nlAQn?_6x2cvf50y|S`1u|Rj@AsZ)nG+O`skqml`#`ii}1l+n60lW`` zk09Ce;n?WQ%>EtxfUp~p16CDFVPR{3<4_sc76EudkmiVdM`AD*nDMbO)l_FKGJ`f5 zi01Fc2287#8W)NzY9Ep;%HlB+{ixdsINQ#G7pe--U%FHC$Q2DG`Bn$ygo$$~;dc9S z7a5oL0!?;4-e7g4z^zRdPQI`RV0YX@s5j+9qi|g$+?o$uq~wpuSRob~&Sk{r&wp80abz zW_{8Z>8Ah*ZY$IqcqT0azr%#`@l1k>`)woaWTku`} zGkU%&zn|HNM;Zn2=FuP;OC>Xlpo>Z}7GX|aR9DlF)X4`f`@M!u!`4m`k7I66_A*Kp zWq}R5Uu%Ow_t`$yFN8J+nUui2c6N5YdU`(V2<(oOPAVSQR`A3L`)k*bRoH2`t%vl5 zg@r7|Cf`N$1|pp;;HH3DwaF8Ed+5e;5$14T<>c9mXv5b~Xx)KG&k@iC*np!Nbf)!2 zJgrsOuByj232qs1H3!82fB$Ho1~yYu=#Ns^9-9h>x%u&EIs{Pfynj>jw8A?WW#=c| zPEYz=vyi2Otoi-1orFK@K^zQsuI0`V6_k{s=ZKGV#d3OGWmWm2`~0#3aGf`e(Sc85 zIviR{JuA&|D9}6^AH~8HN0skrh$ZD%mdS*Cz3Gx62Bli1?Qo;-bxvR0M<8J01Mxpc zghLL>=_GSpA+h}-nt`QOI{z$$2a7OF!P78u(w@haasBxc;GW(CjdeWPNj4|b;yi6oZ;+CBa7x5 ziZA~XOwjy5Z)$oOrXUWqhpG>bk6>!rTn0Uo_ZkCP0XpMBk2Aa??PERUGWDN=v;k#m zk!taNj!N`xI#3~?O1AR>VETmsVz+(`Jc#D{=4MU7PHbK0wDfJAEPdon!FC)Q=v-I= z&3GnSTevEEkwlB5`FcTRBX#)-ozj+{$~g zF%dKpN=WG`KBqsx`dDLmzM(iK?j#_1)`w-JE*&XbMq_1EK@{^Ci`03Fr1gMGoNxRT znrF`k^8D2;MwR5$5Ownb*@koZue}unS3_Z#usv-Kl>}(7v&Dj=EL+4nUD=zmva*C0 zKxAc0OOk#ey%A5t8n?cI0k=HQ%;=~!?`N1;99wz5 zhSAJ|E;%d9euE^Qqmy@&1@h&4C;mnVD!yYoI;PE*>LvfxQ%DIXUAi#N88ULm^gGjdEO{49G zhD9Jjni>QWBrghfx-DG#k1Kr%NUmsz^2?F~rFBVPjC->=drLb|eB*37+xgmI4_KIJ;%-#D6b%OGk41kloFTdG}ym4i~YV}n)R$nSzJlH3RI zII($Mmo{f+B3}j%`Kjc+GA<@?FhH+vtdhRd*Vr4**1dks-c#j$>sGrmK`*1H=Tg`0 z+qYpA;-ijg*x$Qs`%zZ!h6yLi#8i*MsKQaNeYx0VdBm%wQfV2Fs<3TgLI>$l@Su8u zcZ;R<#CAXi%4J4T8u8wdOMd7NE@$N=W@y1jM(T1)Bw*y+Yp2ixE2Nq#N+aCaHSqZV z9Q5U6Je$SmB+#YV92fRI*|xD}a|!cJHZ%F@>DputR}QQd1D zP`Tqvw;mR_@$2jBd;9w{!7kWV0s)j3RZ>!5U=J$m$=piK>xKrEGBdUO{t3x%LC3Yw zDWcj7NBhp5M)O6tUTs*~{;`m!soymE4m3E0v6t!{67uosL+A7hPFqW0KL*`_=5YK8 zI6gLD4x=(N;mf;cvwPD4x|0(Vh{WlMpFgALlxZG;xK$}IM8W&J8&*=_?eqqcduCyy zgMgYNzVH+PiY+x;1f%$1HOIIZrW82hojftdG(IEGXC-@B-=o>C+LH>S4z)xT`QVq2TS`FWF3|Kw_#?nnz-oe|+I+rv1!(E33D6 zls6f5wsQ1Fd!471tu3_?g9d@GGB!RwCnh^g>Y3$I;UH~Q))@53o<@6kc@^Fkp$QMV zAKl;EXaQ~=KD+t*|Nw*8x$y)GeRZVuvEe2g5Y+N0g%tH2YFk| z&(djcVwizn6B82yefr-dYKp-6Q+Y*8k?}JUvk&|Zw=(16M;Vhd&HL1!A{VzV=Wvz z99HflwaGY`01e5s>F$|rrJjA&+&6w5Oek;za6%`U11+bS&nc_txb2mN9CUv;)Zrwf z-9q{<0$IYw#)g2NHosQT^9RvjdfEWJLizT53JMB#7EQIaQOdgu23AvCDEC@^qz%Le zm(i~RS5D^2BrV#PAd61bTb6l;hJModDyzpAeTPD!)EtN|hxFb#E9HPD>nF$FMhv<$ z>J5CZlRo;;iDhqme^={DA=@zL5a7Cvg7^-H@6W5T@#nL8SHKa2&G2fbF##*# z(d~7=FNPc>5RH;-?GqO!=I3JtXkT9OCuqL#%p81P;I@FFG=hnTgy);L^;~Np{@u!o z^py>;bmrJ9hljGg@hLZGn6Hn(R<9x6b<6m7MXV z!YvS4Gkc^0WfQ?lcSe?%mwN{V#kJbKsXcW3>=(HTv(g>M{C@FSI=4H)N~p!i zf%hV41Q`dG`(>R~F0^+sExc-(>yF9RJ6C9EGSslGD{jfo10D=?RBR6JV! z{Zd!WxDhp|!K#X;g~yyrSyxfyX~!9d5W4FX67PR>8RnHp>w#VLZDeFRyk{e%4jF;@ z_WYP@j@CoN@jFk?3?5z!yi#h~$PZaY)i9PqUv*Ji2=qs)z_F(&h>047!+^wCj<3~R z8XX%uh~6NBlgnJmo^HLK=a*CB9>i$Rr#c|}m%IDgiKNchJl6=2_tjy`kblVb`QEzFg<$832nsQ=y2=$36Z0H3f4O2vnE4QxLg0C_=;XVod&s7% zWKpoAYuh2IzGTr#BP3!sH2Yt3nRSgtyUSmh5ET0FLfzL(hbTYRe=MWA(oZhJP5Q5n z{FY1YIi(b`RnrP7V9H;CAqr#0yZDaq>*}A84-71aI7dcCl0jR{m9En8q5Hc5Xp>&* z@>1BoKw!}^m=?Di87`JrK7WTKN~ z1hfa|DyKT@>H8Ahvpyb&jgGA?FDJ*dt&SBlk516h=4y_>MS6Z17c;cu4(7ePm>tc5 zExw?uSCXGE^6K_RVrIZIW49Ef^3JlFaj}WQI-!)>vO@Bgv>qDx*L;I}hzRL}V&)}0 z?8yX8dMa(Fvc+!XZ#CY02x&`wQ}w*Y#(a)0VKwLzxUD@4^cTu{XVBzzbaJ7(t(FO_D-~z8 zWqFpXCBzrKQiSR{bQ*2g6(eW5SX*|b{sV+Ya)AVlFdD)h83Owoq?I`UAtDoy=4bDG*{_F*y`|@&j z=tj9T80Rky5h3KUw=m0K%6lQ7zQXWr9Rb;1P+J5T?!U)?w3Tfe4W{Ux6%7#y`tP_Q z`Fhjx>JvSJ&6?kptbS9lP?{^F5h5>uFC@|eTO?y#V|fJc6HwQhDWWV8Lu_l>Qs^aA z-6}+H_&1GSRPM*I{ndrcqraci=2c+p7H9>CPCiLrBCkCF%Rs#gk+VYfz>Sxj46WP; zPJI>X7?Ul33LT4dB50Ax{rXg^hg<}u5vx#tx%m@)$+4mn#uY>0wZJXqlq?1XMzvP8 zMy!8jMlUk@R1_8Zfd2-xj&BGhxaow%<;6l>rHxCzv;@=IY%QVa;yel*;+MArE(CmD zf&lS=%d$97T}M9qUGT%rXYOA?KPq4u-&on(z0Dj(>#-#(B<8yD-@Yqr^p*JH&wrOC zpAEWuu9BRNlx+h~QYhCG2cA<29FcQG!u!a3+Eef-B3R>r!FD$BMN?A`r^)+Ot}VI1 z zzj*O5(816{_ybvQ@Y)+$JqY&x3N(#M%0Ih%zzNFj&LeVZN&@Q;804rKMXAy)jlCY3 zpj#L49C6tvZAqu={xlMLRB$)6Wj_+RR)6HkkkMFNYhsK4$oE`EFS_JC}qol~Bn8|=*!Usb=o z@yGhRTmkj4FCx~myJqX%^h&f6CZ-zFgwT^Kq~Obz8^9S5BVb&h#;MMav$K_ZBm5kV zjd*|>*`HtjFmHi|fZbym!=?s9w)!1Yn28lhx4N!PhKfrI9%<0f9j*qptM_dht!dS( zdicF#s-5;pRQq$uuhz$&wU$YDF6Q3-}0>Axf5U{z^?`GY~J4>fhJE9Qa-88_1vtK9Z;11 zN4JI*#K9k-=Ty?xC8uM3_wQXJ9z4^4c)d>ZE0JKUMV+!ZFe88D4GJ&&*A^8L&i=id zt!1ma&%Htty9&=}Dq8m5XSCM+et`7FC+%eg5+r_uvcF`_bz)|VRe5jIu?juI8jgUh zY|woj*kvDw`s#VpJ-tsWWxW0qJy#yc&tUwxD<6~Yz>Ges_;1B7ebC#)>8Hr)uS87w zi6GZnOL*14diA!^`MZ0q`Onv3`+Gz*M;&`R;sk&GyAx>spx`G9!0D;W5S4A97o=AE zYXP$LRiEhH$GB0;h7CrE)g!;BAWaHk1+#A@Ni7NkCjieGfIeMJ8^Ow*E3XW_cLf5P znO8C^IVKV-fd{Jk6m*rR!^CNKZNPvf%B<3#kSw}1Hiq7?{i7-=b>1F+Mf3-)-fJm^uV3A6*I;J7|mDsnmLBlb4cC{HO?>>MW zVsv+NGI-+_J_jX?$^2N5bl(^QV)<9PvGiX-l(;G|!}b?t2vBfr5eZTIQOI&i!QA(v zOoNpwKXlEAXYkhAU9}1d9-f-HiSJ!U_ucAL8`M0q-}ow@m%@ZnH=4O(vKDkdKr}2=cESxdKMdjr`Ft92! z3s!K+f&dtk-CMXvcjBTH4{LC!eHLiAs{N9*`Z_p)0Nc z1LpI!>Nz{wa3)THkmu{=B{hiT>B^DU?Q2}}Z>n!-7@kn69(E#D=c1bbY8Pdm>RFv` zBhD+6-*9NGNGGXp*<~TW^o@bM{Fv(g{84!CO~L9wn>o5?Z9}wWENb2dQt|BH`QB|E z9gI90cS=eiYt^h6nw~#py3^L$N|){RbSlqK{7n@WqB_X7f|ZiMsX30;b2A99b1wvo zd|ixMr}n~wg-IO0R^zN$=|gnC$IB59#*|sTp86rm)Rm^ zVE(*g&zF3w;fJPBu9c*tOgat)Yn(@8c!G|&T;NuK&$;w8#bI9=4MxPhHlsOY!Yge1 zDl`Ek-o?|Px~ZhGt`}psPu^NwUiMBwQl2=J4z|Hm-?(uDGCmY;Qr9UT_@5T?OXsL{`33ytv zco_{?(G`0sJNpQ}l`(bjT>x%KrXN3k46g51isgW;*kF)@xHh>Eyvi-5>~;w2dz|I| zZTZM*i$+I@-TpW3TQk54G(5#}ZB&rxJ4IGE8i# zqyiZ#X^}Al(soD&e9xVL9ag23b2TSG*r|GWEqFR?n(l&JoLN7Y*d5To@C5^Np}xaB z;QMHw-7s$N-mj?DJP3q{Ao-(<;+u;xGvYM_>WoDQ;d_!Xd2VjbiUiwnS?m(>Vv6XU z7cDK>$(aU6|7Em@z)WBU=6bVfa+j!ZKtqBH ziG&BlLEX$*lR2^%R!Bu}@f;dA^W!T&Ma)bx($7p84PD{s_@a#2NYsA-5{nC-r}U&r k?R04c_fc*X)$N3Zp*%wv-j~V4S8)*98v5$xs&?W31K}t@2><{9 diff --git a/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium_flow.png b/src/main/resources/assets/tinker/textures/blocks/liquid_bedrockium_flow.png index 56df662cb39e4937b359acc8f1ab00dea6fcfc7f..7be9680dac11bfedf25ec45e48967714497e7480 100644 GIT binary patch delta 7449 zcmXAuc{Ei2|Hny8h>6IOOiE!y)~qvROWF4&TgbkzBbPy>kS%MLvF~fy#=ea`Q}RjH zVK6A$5Jt#ve1G@9d+xdCo^zk?*X!|mK3_?Wk+8aIN+eg$QTRFd8ecpc?hY%DK z6XOo~^XHA^!#Kj|kSfZKKz6508G=c6A2r zbR5kb3?c6(r0f#AslaaB!JGA8*sOv2{*m}+@)59$DMf|09?I`^|Ec~R33cYS@t~k}X+e=@aIAs-F9qFmGP8Bfki$%hw z-~v}(;2*=2yh^?s=)nFnr)-J=hXIcT5s4qg12kEMJJ;mQN2Je>*HBp+>B5ZyYOW>t zjSY8_F{O(p&ySBYdKx9%QL;?{mIdGD*>%=*-YqO|8Oq$rKxwzPoS@JIYAM^;={jGa z>)0sCGM^H2ICZZq=c0aqF+dwrB3T%bULS6ynS}E)8#(L!r!&*Nmq`iT2hL(WAFU;_jd^<#f9)W3J2_e3F#Cx z_48-N*;CM}LNo7#RTa+?1-I#z!fQMKR{Uo! zn_A9>Vos*(BvNvJDq*=@=xwzxWm)y;!`ToBN*Vyw&HK?O$M`{~S;jlQ<=(y9yzt8P zq%#KW+K1Q`K}}|y_~k1RFrR^Fy~kJ+V!o=KJQu_qvpU(jgnV=JZ(x9+UG3xYMdjr@ zSSk7Q+yg1b-U%Lkk+!CjE)BNOT%MUXVE-nz#=d8I&&~PzUXJ8rzIqwb45t&ddwkvd zqCG{|ebydIs_3Z?@|!;Y*9TT;_|Z;2s2wMQq`WsS!mY8F5Q#F?vPP-01bHls~f4So4Cw;i>IjxEr<-z_*Yn ze7tqx-JhqpAzrV(8nw)B-XFl$6dua58+KI8K;c!i`^ieW{4+jb@>RUP5Scv525oB_ zYKZLhRNIm_BayN7m>AKtI4P96MVzUx4`N1Ac@_j^cQ zR^T_K%kT)za*2XY?vp^u5_;B}&6_oNIf$a9kKVo;x=ixNgOh*V(zw7Sj^7`4uUhA+ zTw@;~Ogo~s4lUZ;n;n9Mha(LQiI3UzG>Y_F-Gnxj7@h^de=&iAnHLTsEJN z1A1V--a^<~un_0|Y`GCeO38MMD;U|4seVZAC)4Ge`)S6a9Yrq;h;c`cfc3Vi3d)qv zPfH(Ml}l(4-}X6y!YvRJ4&w0B_quu_mQT{liHUygb6*8h#tr3Rbqu&SiYL`xd1zf> zKaT3hwnlfX-a`Q#pu~8K7h4jh9fF>UFELvzbt8Ee{h+^mcRcVS9{%Jfw_Vr6?z$ z+bAA=I7b~@4CHC`6%wc#@_IoZg{0l#ipArs5NTTE91yl$v-d6)tny!OEsz(3!hpVd zl#YY0U87Ts+Iz?R?Q9%b+yzk-RvfOuXWg;oq7~_D96@kiS6`AZn^^RmEHxNPGu*Ad zbmgtSCR+hNKp`+5?^wd5zXdiSE?G!2s@wIa^E1NBVaub4J!Ol5C?n$g#IKf<&y?{q zjLXoloekSYuK9OqmH4dmxb1MXh){}g>j$OmS=l1LJ~WLk287fQ3bS;w%|_g=G{J?% zWgC>;W;FtaR@a3$QVdj^UfaA3W;_e4>1Kswn*bEo!sxOqOtu1DUCuee8X>wkj47!C`HqJzQ_BsW(w^q~;eb==* zznBQLV~WH%(ve&FbDixKh>{^jO3nUCiBjLWWq_W`mTc#;QliD7Wz0^>n50$fxUl`L zu$sc#F2dNgC&yVg*b87FY=Q&1gyRb(?Ke-0L>^Mi__7J6FP6uV@&tLAEKCKh3)wZo z)T=nhgM_zoV~?1T1fVq1AS@^|L`pXGmYmBd;7=7h?(o_uZ4u1}Cq-{7iItbf+be`5Zi}6cI2T=S zjqr?7-+%hpw5&?kElM_L&8yyQh^3vz^=7B%k+NRPCEIYbS&jnbQN;MqBq;n-4HoIk zN*fRxf5`QaFV|y$WtI^)+8Rm=_i1@AxA@1;&gq(%%ji)Juq$Py-MneI8*cM8>IyA* z$ZB47LpGr`YwgJnf*K-b2$>kp*bq;4ZArVKm28G-KDxBQvYE#DOW$Zvu6VCgIc?)@ zUM2n}Pko7+B0)f9Yd?NuGdb|R6C;wW9pvw6s%`i7M~71i8(p{X2ehwy6A}=)sMiVY za@s!%BJy34e>X}Wy=+*cDVc7C!i#>Of3xu3T>#pWTwG69sqmi`wJ?G3#Y+-D;yjd; z7<2=25|k_=RC65Qbu2iJq*2c+%wSRzJ%vv=%`(UW(BCp9y01!j_7&ZvMRxd0-Ai@> z5TTAkJC|5biMy1c>o$N5>Oz#h{qPDHnT6<8Dzj=76e5z)4Tmqj`71!WkPDvn)7M(0 znHY`+@G}G|LXO#S_c4KL`imOnm>I>o$3CrIaG^byWA3eaKZD)r_fsrM!hxUfUrEsw ziMrb64Spxbw?2S`!sl3>cbUGAXlc-twEVR1ze=qiRzspA3uagK=Uf@;ma5Xb{heXQ z0u>W@`UI$@7*WDm;$9iVgr}tAYU6?zFSiJ zwyTe z2=9K)3a_KLCQ!9)24#Ysa?;5ClRWdZkAa$y)4oE}dV7?uEn^_UPjXv*TXCVhASrA+ zwfqpc845vBU`28s!t?rq-obFus9ru}_%)e!wg28d#hle(6IIf$FmT2@ZYY`Ctf)}q z_OE|}M3zVXRq@g^zN8NNY*!WWZOnLA=*{Ip@57X7BRXU4>F(m|Bb#!pK#PD72$_=! zqsADe4s!1Qiwl<;tHe~$4s!%FaFdY*#W zTZ3`f;E|HWlVfVX91W34!yd|h)xdAh#41}4o*rSw;&b1WIkL_a!>-3-N=2L)Cxx>rSFeqFTi(CzT?5bX==@wOY zWoWi}Ya%ZFYlKw&4>+)5Vav&6Ebimunv)Uae{~}rY`7~3A-7Lf;P#0(V=stsLBaJk zwg-)CMyE^16qW`{RI|Hp+{Or0C!6RK4T;)WQnw*Ii6{t>z5*E{?e~EEhVA*jJMV@I zkVGc&E<{SsK;#|B(D6M6Ox}Q>faM_j$HlM2QNV`L3jXsr%*+^OfKRs$ojxTGU0dgK z%S-3~PHJzx30Ha%r*)P$=-aQXSb~2}-7=gZ6UEDH_M*jTun-alslY2Q=dVoo#}zu~ zj6Kah>sU_KqQ)84TWLRiJu_PWC0BbOeOon_Xu%4RL3Z=kdYBrRr|vV{)%5H*Fh<$V z?q()tM}o1pe7+4+gXY}yg^p50)9N_(zuZ|e0vs_V=ZF2bbmkvtSft#s`BwKpXT2QX zr!HMWV~IHrV(;r+?UB~x887PDasB7~UXvO*-QzO(!vtzAW*VvcVZ)8U(f#XyX{YzU zr=+H724vLjsFG`)MFE8C6K_R2YhJY|Vx*0Uuv@x}`o>Rnm0QQlWCl4^@!`%!K+7ND za4!MvLZ18~XH?6&EnO|X@3PvQim3&qw-gs|O2k-I@$mqDgQ<4$B-cQz@<}%b3=_j& z6A)w-dNTl16p_Gn;KVG*U1U^4JMqN@X5=2vgPe~_zq#Fql7X-jO`^bKJ+*+%Dpm9v zRf#XU1-K1qhfn1OkLyM0Q~`_9WR0zss5p?F$K5Q!R;$;mL4LYUwZ|{M%S{wJU^&jZ zngBK{_hvBedt^a=%eAX8F4vH}rb~;dy(zi}Zb;*p(ySDS35G*ft}=&)aR;AJ~-&Py)O)%#3SvN9@>&kF2@agO*yrUE|gSR=i(&*QGQ#_X6$?`?Es z>Ut^cl=y^Dh{$%v>}Wia!PQxeCyvQanK6tCa^JO55@UsIv;KME{8^AYsOvT^*z1{9 zWW~jA(IFHQ)LKOo&J-jE&JG8W5TsvM*KcZ#U5~rl5AU0cfrlk8Uw>5SUg|Yqk(_zN zB#epHaG$)9cU)8^s<^?@c=(?0yC{*SavT#qyZx!TZ-4AFR^i;#s(=ZrE8NpuHD4G% zjw;z2{udgWQm;xTUH;`lc|@%^jYRZn<`d0e?W1oP%~EKmRv*BB*n&rf-(F1>TMM!h zCHtS@FC5?JvPaAg*_r5uHz-3Yhm*TlaB+I~S$wyGQgyN+@Ws&~JtF0rKXq3+c*QiL z80a=RTVA4)tjXD#ez zy-2mp%>-MBBoJ>S_4Ep1xaL87#?ENJ3fXxRCuVW#;cHh*QXOZ0vErfvcZT7Bfr^tz zCCj*9xPd@T-+X!vO9&!7ph&Et&6)C?`P3Y&(tgMXHlA0HgBJck+t5 zvY0<+-9fdiJMUQ~$;&$L*~{nZj@o{h&wkzuQXh%4O0q{w&#B9plHYM2T;;rLEy=&l zff?4U^i?CoNd^CYD-|7u*uOEzPIOUwX{|XXg~6DE70a9FpZ6RkYMb*U6_r%|rYNA` z!U*2U&9Fi%GgQVH6!AdoVN!X$zFZmBSJ?5uL z?XHg?O%@o>RjMl^nR}E-F9FC9V*hG3Cq#NU7e$AJEaubqff^`HcEgJgfmJH9JqVcI zPXbG)865X(!*v_irtU+&+6t{w`R+OnfUa$)g30gZ$q53tmmiKkNjW=XQM^N?y`J(}+Ug(ai95DUt#WWukX!_S_X0JUf4UmO};^KUeq|p z@Op)Yf$Hq-L~)jfgLJ>BYVgXf_EWog(~S)g_dCV7Q-ZnkIxg=_KUoa^;j#8-{YZS& zrD^|)k#>wx&r!Ca=|lEs<0e(&dKE%F_OFmZRV3kdVaRYrN=Sb*o$g&M&m-%^!NHHD zm|oJt>recez4e!Op6Z6gJ{fO)|HUD&Y9pIpb4|=sF1`{ZV6wXh z?2hFdQHK;~Lrk>8_fvebers$5MIpM${r9BS^PcF3oD|otE>j9gi_c~wHCGKV(W8|} zC~Ik~U~ZXly5oFC0rX(A!W~gM_tr!*7W`pG)Ee#lYX_(zHC4^B*xo;+BS%{{`jwW4 zbD~xwAhlESv^m+(3o6+qTRbxLw6Vp2P5+bsa;@6{n+g~z0yoIVhy~5z>-Q+P(7m7b z!pjd&NymzCnttQ;ohQi~`pOIRlt${FI{&Q^4Gl%(I(-*|t1z8a8 z$~#70;Y--7JxUedyyUMAWsAvj%qtuBNcoOsJiRuS+ZzIgi6SF86D}QhJ*$e?8GI{Z zU5?(Lnp0Bi=Qos(7K(OQN+c68R(0yDs>d+?{Fg_o3~KV-iXFltux1h2H=o?FvQdii zXtduRG0%XGnS8jnVf7uSz_!DL3F%P$0M$4!NQe5$?Q|PXBf&zjOB))2u8E(laVG`;$dzrOZaai$*GHFjOukk($pU}36z@cKq zneI|7|FY6ihO*}M-;~ZWDBV!DD*VZ-a8bMEdKlAJ{cHB4C%Z3V0@+Xp zN29Oy!$*wAfWFS_ZhfP#bb85<8(M={^nlWS?kDM31OvDE#*my_Xy%T+aPeiTl91ZH z@Hp#!&>zYi0m#pn7dedPaTuQ*8GVMNu#4g}I(36D5+W~Tj?UGx>nf88+q5$Ij=rz> zmXTV}i33XpX!H|hPTSRK<}riF=u7+NisMpa3AvG20j1`pn>^og_v<>5cbEB7y5yf=2M>mBpSQ$SK=-A<5c0D%I>md?3{e=&M%w_jGF&Be8sv z%{W8!+p(d>DWl_v5-*aP=Da_%?p?~=NB;RCg9r*I1>`X|insYN>Xuwv4%^o#f9&#? zr4;YmP(l)6eNdVGYE+Nc4$gB#*V<+HQXeA)zwM4UKz4BoKm0=CG8j6wGdg`KaL1S6 zkFARy>|3$~FYYxsq~oC^o61}ueun5$oarADy+IunaBIla=klkR9Wh1qCePMwWK4r@ z`WlI6`3>tQD7;}g0IdHzt7b+6Rrfo5yCL9SRYb!73;{WEiR}YvdR+vhsEjdCoRIYh zC}6431xvz}o>CLiP@EXB7W&z-~)4~0Disn(%et|13Sx~t=C~1gEc>Lv5D7y|i zmqW^1gcGLhT8ihGaVLdVn82CMM_-Qd3+b=6-pIotpbHyFS$v=U)Z`UpSJ9nPgya`` zidM;5gdy<-7d!R(j&j{t9ke5PFozqU(Ly^c|X++>zw3lMOa+D&HA5%{0-Wl|8R_r808^MOZY_cjqK@bX&-9Cwdo9EUWsC)eRKK zbh!XF|MPnzd<8BSRfQmR3t!BSWS$`dmaviFj2j-SRG>AoeQ+EB8Tt%G9`cdx;Rs(m z3T!WL+5Q$h*0@%R0nJQo^&C_5+BT^K4rGdA;y4I5$Aj)`y)nZ?mwv)atQ1tP%hFO? z7Q-C#DItkVa>s^KOtr7^yg){knv|@8awXxoxDdt{6y?zZg&StcOz}4&C8UST(l=wi z&#cNz$V_c;0ermN)OWJH$A2B{r5H!WdPuH5p@vMqbYP>khkj$m?Ys+Jj*g@E@h^%1 zzt+<7P^F|`z2j_bbyw}(%G+soM3gCTDBuXNpKQE93-@@-Sh5?i#^22s_Tn1tKKkXmA+4SzZ*gj|z zs@lZ3*x0u405?-F^=vslODK<`^&6mcyvbv5>4dR6gpJo;nrvuK7z%sXrfpg#mI6B6 z!^@2TCus@(2Ym#7vw_K+&&gN9`~=Af=8g=%MD_Bag^7H~F;c>yP3Su-intdgKpHAV zP}+<`C1~!onM`Kb2Ept;>JZH%6uK^OMt0??U<)p|;tp2|IYF>Cf_G;t7{P5S=eA+# zV7KM#|1*dGTU(eMtB?h|k$bEdr6U0zM$o)Jp(eWcB$SnTw|=W;(ZxicbW2}8m?+k8 zM~04obkqIV=ATfmdk_5dC_QM~l~#3@?N{y0D#Qy>ES>6WJ?Um+7Lo0LdYIMwj^YynwXd*Nw%gj zNsJ|A`_8=I|GHe)%Zo9;=Q-y-_i{?GFw;N8EWnIFAPyNC=vu*lg%OAY2qp&jY|hYk z0fC^2@Y2z-Fx1fz_7C*)@bYm-ASBZ6q^TItYH{n~eOVJPh~#MZUP|&P$4s>+GVEvjJK;>bv3qHm?=W@x%6}H8@je)2Sx8u&fR>q`p512 zu?MH=CxgD0bu}6VO9@(~SDY-}rO!scULGm_Wp;+M!1!am`qG2mP!&m!ra#*auag^# zV@nW(uwj|#MrM2DR;LJ1+Xn8(&TeD5Q+W!d(0*hW{dE&C`oP9NV?oY|=?^lJ65qu)){8?~)UXMAw>2u20_hkI>OlN2c3 z{7+4M`qvvuc$d&m?l3PtQ{_G_{dTIDPSAivdyS2Wpv-C>fGnS#h<@DxG59Dp%_Gx%IkMNqEXw*UCYOZ zLhCk+>$W(?i5jxg(NHjgd1j0V_SAvnOb3wa;rFa6=nT^>YR8V_>d&FM^@5a-J;b@s zzfS4t(TPxOayTS(XN@Cbdt&N}EdSG~r4yV9out)53kl6k_a_5MMVOeeTgP74L?&hN z^71O6oL<9=xinAA1SzMPmCtN!!w2Q}_}R5EwNDGT*0%4kGSDJ4%L&mEi4Q~%&MhZj znDdG7^76W9$^B~5H+*$a@tL(Ge5cH-Tb5Nm*EFcr>BEN)opTgn!NYT(t1o}Nbqs}W zi^7v)dCN2BlW;&WV9X7#SJgdNjCE6mky@d#+t>GtnrKVBU$)`1|+o z(@M#!_7^&)^wkUEy>j50;^X7tXFcTwUWISTCH9G+`!>Sbxx$t6_IOduF$hzF|JI5- zBFdHD?(*dx^T>Y}F{;S7_4k8Y4;A3!J>}o;@2-zI(<0D)x7)wp+?v|o+dyqyZuZTt ztc0u7wB&AdkcKnAt9|^Hqm1J#f11849L^D2Cxe_A5u4%ay>kJop(}JyE4G-euT9s# zjE_f4;o#jMqO2m)pQ zv?iishlt`h98VLap^SJ-4D@etwBV*kOmA$b8I?Z35nZrZ-80K&MG^*L8DAzQbjk@@ z9aE&EINxR+b~?w7h-1O6#}5TiM?8S|J7TKVA|bjZ0Z&Aqx|A}*mRI;b0y=@+|*;FQdVR+ z%>G^PaEuog#| zhejuvVxnAR@9pm1+1!obkL$8D*k`s?@QExdt?g!)%km1>W>Uu{3p6`)KzqB|@1>;^*(O&aB9Pf8ahJ3l zwl7!nGQ`qY+hA?bw%qh^+|WJna8JoT$Dz${-YpZ*$Ux;^;1yD6?`}`^-Ww0YE2a>;X|jZMfcQ+t@O%FJHfEOY!Qo zPR8+|pA;16%VqacC}(PkF~TkZ0UTK}PFIfUk3nzxC>-VGs-M;++w?miIlk5EuQi*+DbZs{EaofXUFI7_8oYm@bRoN(N2m1`pLT~5f02mjMl~m z!1-l!GXTsPnJFKI01W1B;Emh2x80T0m6Tkx;5p$ep->3qA0aCR`&$KV`2?hFwn@>r zPd77a^39#wXStaRN4<}y8B9-4BPuJ4CKihbH^NtvJ z*$0Cjb+2AAr4G<)u|pMTko5KS+djfGp=;xz(N4F``zu*gjao?Y1_TAsnG&ESVL(7j zLff;mGKA(XQZN|(-y7SmkFri0Di<<}C6mh6qlB3<$k7oUey8#~2((LUof78uX+q^l zB~*TD72^25?hsry?FRUNv zd15BP-Tn8kf_5Q$ZCGqqCnxG#`|Yt09t}@4D@VPTF{&>n77Y{PK0wzk52YjHeW=0&|MSypJD z_#PUkF;{GsyZr@GPA&Mmic{gS9t{Ug32;W}@1^O~R?-xX@@>Xl(HfxhG{EGWUk_7C;?tuvg-h|qw$;~n z(_ncIYq85}Xt3F5T1s%UAC3>5bar&?U0IQPPn6puMeZ>!wQqdS-ud?Jn_b&-L&5F` zQMEC0kP_u;!#K6uBp*SyZ53bSrZ1Avwy}}v3*~W!ky~LsM097)MLc+S)t@|a@~Yes z&zv|5iMs#*TU((3HB2#x*2$p?RfGg@QZ146^XCweI9#j%PYF~3UblA4e%J*g=F%|! zaWQzdr%HMCN>ON<_TJMzuoeNN=q@)xjk$6v61a3h|RaLimI7-wI1_u*X z8=m*e)RcZZnne1_j3TXuI<^GTr;Bzi1{Xu=Pb_xJn<@z&))nCZ6y;{7{~Q9?8qpz? zDx}fxBFmqI;!V1?(%s)5S0TY%d!@3nn;g{b+gxm0b)1{IYhitMyy2RsLatQ1uI1f9 zk62g!$C=F&i|nyo!fj|2Ae*0@LEYEIU?4m2@F`be62Zsm)2ClW>?%KB9;V4 z;KigfV2Tw&Ef;od?vlJzu z7Rq`3@82^co?2B1XS{nlw$LTZDl<`hs|{TXZ13`HUqlC+jZJ8hX=;iTj(Q9e6R}fE zBvU56Cfh2kQR#syU@1Q*Mrk+xOrEXoU7eeAvm55>&Ql5b;3?0{iaRToKmwSUS~9O@ zj1zy3>ZlSbK?3S!u4&2(?EYCt=(R5;BQeMJFRXP|VT{9`T1dc&*^O{zt|1;_cD8=e zz}<#MLkHG4wf=?XyGG$6(-X=lCt*(U zCf#6&)%w;Jn!&~u*J>+~7y|^Rc8sN*@NR1T+c!brwJ;KboZ@-V3{ln9(g6A}qhZq3 zY+LOIdZJRni+`SRyZ=T2v{7& zE#CELyhI`ph8Nw&XV0F^^=&?yl#~QjHErE0kqG@VAEZ1V+-m3Gpe@T!7dLt_v1od@ zSpNxIerDFGL67E%x|c8GVq~s+viKJ-FsMWp_ z`ULSusxl}x2HK&GjqN*9Qc^A%)EXX1%OD3x-;K^Qo|@eR`N z0(1fW_z`#>@SGsek<`b|j1`9Y^YW$ARPDm+ljuMt!CYi&JP*!Ac3LGjST(0CfSp5+ zM9yh6`&CTOOM)`*v!xTM8S8kxRPK* z=v5t+;zy5oKn#d-9+Z-nt}DB)kSl2N%*4;bBhK%Q;U>CvAY7O|YI%!P&>&Urqu3W@ z$-UKiu&4TRh4t*pq@7e;SbK_L=<6eHbzgAR*)7WoGrh8Vy`IqaFkhE^EqFSvgx(`)0Ne%Zs$+wyYfkxH)qQ#ngRp zFL@z4TzwzL#Umqn-{$Q_G8FdS&o#uU387}>WBL4o&$Jo85)^9~%~oM7v0Y|^n*j1_ z9M+wVWTHF3wGd4Rn~g7LG#j{y3yT`sCo^NU9c}ayM1P$q>Z3m{o%gX85?2$l zP6d}+ojROr{eCg9MHnadcVnZlQu5cja$t)f47q_-hibSM^>e759*vz?vcD2wIQ)QI zHY@NTU_c-QVg6HxfkQO|L4Ia+OX-LD?Z2!*@?v=YYlRO0QZTFGbvzoj>e(zZL)l;? zK;yu>q|=(tIAh5j+LQ||*m?t6u&D_PMN~rYdRF=Vdbqp*vGk#>rX=I{sj22(mdK5e z$ZJ-`a<`0!<&;6`LC>w^OnEoGk_-f18RrU|$AvRr{m3jatbJ%O(fWa`q9UW7<;R8f zX?VCq5rA_LW#xaWMkPUMdwrK5Ou)F_xG`9A(VSJ~hs3Txg6@mP#=F4R;FVznx?tpD z3ZDtGGQ8-<&G9!Yd-uPM-UV&FC zk^l(>(h8&tU>l6EIy+Vs6%`PSFUEa3WyfXtSwT}(p!j=s9g2rLo34*x7Rz?O&kdxe zy}P;@{@`kedO>q9XyO=rIBQST#A5#?=R4RS?mdIPaySOp*X6^R^)F6EYQg5G>rTB>9ajh>r_!&Hd516WN@mpyT9bo zI+?P#cmuFuFU2dsTOk)F?&F8$Ntp3D3aAY;(Rl6SzPj}ji*0QOI$=N{)xvsN5`>vv zyvG5)gE7Ia2Th_1wuo-u#K;I|zG~9v*;q9epg#zLRpdoJgqzc&8GCee-g{k#(DOg!WV!Eju@P4IC178a?Bi5eZX`Tgh5$_!_m&4V8& zbj~=j(<$Ydfi^d8lQQIlwvBde_|?@#GqnzL5Bw2Oukay=S3|PZICl&kGA$1^GE41q ze&z2SVeD@Cj(biHV7wn?FwLM)o$g1(8QeO@Bo^)e-x5*xkPW&mWl@ z$Cj8N8IUTdA6ss$I=?*B^gBh##a)kGafjlKEh;@}-YWr=d0cV;u;#N$V3 zYYANBAOUjFztk{c&IB+8&3W)RqTJBjz%bX+T9g4pHb1YBo(Kn2vG1sgl2Rx13b)=& zpKiM7AHKTxN$H|sD!>>3gUIns_z`H$)t$=9`Uh}8-$q6kgPnPW?S5eK8vEZ&$_Y>K z#WG)gn_28L!O!vc_eaF{bny&>?*l_LrwoK>7c*)*TpeD^OcKa#xO%FcRDb)GPi)$u z==V>D4|!lov@Bp-Y3$6fiC50fkKD>z6as|+0ufaIa_-a)0|1;Y=9ECPuT{11J26wj zmyZb!>M6APe9gY}|Y0D{l-j;~ouK1bI*-VCn$(2d3wL_VlFEn%%ql50^2C z`^9a-Ok9-ic%cYSt9O&&3gxTcd4GeyapJgJ5UX+EZiEJB0v%E#;y&ob(`_btgE7L( zEzZpo?yIP*>idhAklAR@ zoWDkBU^uxY4ql2kNkhkK?u#!yg&D407!}ch&nF~bh*f)=u(YwwMR7DYF!q;xM0I~u zk=GikCYt@`y0I)Eq`zI%o@%z)%R_GNkwFT#?5$SMM;p#{oYCd|c3 zjY6tmys$;J2SQ!l+Yt|RlNXTFzq!no1F->H@9Bu1UIwmty?_TuU}XFU1D3+MGTzDFjsfI zo<((=X8V$Wcmi}i!SEBWUAu-S7N~{>#_)X}8yf^fqS3YFh8q_=cB~L6R}9c}HnTz* z=0K;$ZkB>Of3pqUgt+yzWchoCh7RK&gFax7KOrR1r(Km@=0$bzFf)7|n^?nYdvZ|D zb=_yz%`CZrO{b7@%8mnzn_8L+>DWF7oC_=kN0~7(9)1v|5{ca*jiQGB%6Ura>T&W{ zd@2@{siU!ZV$j{bSXIq(Zh7S2zkfe>c2t26R8~4J2Ce=yh2Ju+_R4`Kcon)T#%4A? zG12q&tHAT+?#b2=)5_K2+{BTp;<9JMo)3#>L5QKGMn2Aad#gV(x?$xH?p`-kJMh1v zVF|FpfcpL6I8i{fR7yY_TiXzyjV`RSCtoP^`g-u%XD~|qmF|0m zc1-Q-s|dgLjIaR;rYisZ6gM;6sUY61jvugfd17iWvz1&Il2uUG2gwlA2CkAaaRb$vL+Ve2;|m! z1(vIL<&82THaYnafwW4oD6y8r=H(s3w4?Js8IvzbY8EE_cntI(*Rf+vSPXWP<@Zl{ z1#^7dCveD_TThfTfh$HkT~swjbm-)VF`1%}9R> zj@^1#-t`_B2epiiF)zP|g>i3jJ02U;9*5CPHQeV((i= zq|o8`*r^%$w#rJ>24{t}_st;Xvo>8;w||0nN6R`P-3+rJZvBC0+b`5?wv}>?WILNfC(J`gLg9=}HCoWcMdFr9non_AH8!wlfpMLY8z`7qza!IXWkE}=xZ2Tm;v`wI6pteFtpC0TI7*Ymv8f2 z?cT3iuw%g{1~CItkIG`f=uaW7S@zEb0K2v$V)5$RAASe7I-ZT1>F)xf9}$s%aZ$A8 zdXoS!Vc=!ZvtV5Sio8=veA5HgG;mA6cdmxXNv8s%`*eaFMfAjs8 z9nn2;rqMAy9-_f6P(;HZ3{g_t%rlg^0Y^SvE=T+v!1am)TER3!h{N0GAXfX^2{}c@ zjryO)?5~{tZ`?QpYJ2rg?JS8za(>6Mu&^Mu9{X`6+pHXB>?WUXv8CC-tyU*sJ1+Cj zujGh<#wMWXf5rl=wKPD;aSiic1vF`bL&*IVixbe)jrx zmV)q=gU^@Kam25`gOr~*lz%ORzc!j4G^=%99VROacyMkH{hA!OC~}Aoczh3(3b>kf zX!He0WX2ZUuM6dbm^37T@*N?|14DuWFkdz{HU9~Uz zzCH&hB7p033&kpc>q!2`?z4wbR@+3NrY@}4KEjj(2NqjZ3`T)S8WZ3y<|=D4N4f2H zuh5y1Qe!cDg)mhl)yr56?pavZ7Wj9MrW2BFdq<0t-#&llT?#8B5>H>M@yCe~x88kA zO!+=PHGgb4#S=!aLhc|Z$|(IVwB+9hMMv+&d;p^mT(9%LfT#3cIRoTn8e*RpAE;6$ z!)LO>G^@=3I$`4|Rn*K;s9}hs%*~j}|1y(n4fed8Ki)LHeA!=F2H$b0UKueGIwdV; z8=6LU@|1wpb9r8u$VefG)335=Cz4>e1A;55+_h~(AUL|Iy8ub3M@DX|a&an01@;w^ zk^Dr%W2PmHo?6*r`C#N3|EJzB6k9&T5u3{y!`iXjP4B zMhPmXCy^6wt|La-+RmxDoXZE`N1UuF8>P)yzV<5`JPX4TkOKDM#lzF$GeDJ$N>@&d z(8dVcjnEdi8N@vbvUC-Qqc=1!P*-z}F}&2|Kz#Xvpn9(Heoq1a3GJ+&nd#UvNU%)_ z>`8r3C73}rcD5kuZv*{+TK1^3yF0c(7G!24X5}r!jFkvbs~}2+num=H1sZQ)vr5gkdC=&t)#;?7P$KRzRlMY_#*aJ3v!E(W$a9{F1g5Q z6t4H3}yt#QRMR06N>Hui`w1Y&5C^x&)jS$wL}X2y_6!dXCs-I?f_^x4%yyH@O_y8G zm67MyIU@+kjbW1IYeWvs-AzqN5oRL^Z0|-uWh!VM$)av~e1K!yJ6^wABG3=H=lfI;A#ZP{o{0v8@9vPh! z%`nXWM21kZdz5MlU?cyPN6MWV(~qsI&`IHCcbJrX^d85$v3$(p#Dr+L1oy0LdsEYT z;PE1{rvEZRaAL;aih?)uO3rq?&Ex{adG_S0b1V^{G&|cYez9{A=EGeiT2|YGN z4jTHQ=gw@a|DYSXoYc>Ot$svwT5xK>O`H4 zvtNgyBs&4z$8JG@4%-RN`~Sv(A%j;6XEN!_2hoCl%*Xc^Zp~TG8+efL`D$}_S6w_~ z)K8_((7bGX_3G7mMa6iCKvUKKF~JhT6;u68JPgD>y2TWoLUxeSQ&%%qL?^Hv``aCg zz+M34!SptFEfOke%?^vN@MAyW!ElWdp1^qb?#1Z6p=F?VHati)WNJ);W5{ zd#cu2^4f~11$v-C18glUj(9~!#i|)_{<+6|rM2YmGq;c^!;x&&-QnJXkF=mhE!Cb% zyic`Y1ISbOpnME}YNee(>u19D@nurxq}O_^o`&im?5HT8EtGhnCM=-diD08Sg6vC*q=wB#^JErFqD``FMxlu z#8r%q4R95Zmq)gFjC(@m!Izu$7tj&q?AqPlC}fS7IGq@yDco84PL|bf2GYb-AbSAg zDc+5VCo>GKC3#?^!aA0jvWMJ}!_BrBr?Gtr15v~7@86MQ;a2C7?p9P2G_VCgbo}!i z^(w~mZaAPpH=S=5eh`m$11T<&Pj`sYtpP2WlWoEPy7h+R zsa(?tLUBZ25R;Z(N|D4B$2Y^C{#?=&D^bpIR#3hHa}2p(#WD=xKw+rC8Mr7tN*dY$ zY7Hrh&}cFaF5+&_3|HHaAZ10eZ<&^%e4a749z(VQGO{VrNDsGpYiYt>9&qU38d%wZxdYLrLjTRyNmy*_CzP98LeBmI+%w8doDJH+ z(eYc5k{|@&K4UugMqwt9%8vS)m*u}Qe)PVUplF(rJ7ze6l9JLqGW5K3$f5pL(G8wE zy`NUpq)}EGXV(q5D!>! z67T;^``_BfZErPyq@N)hOzKYy>mgy&cmuX4Jb3Y8+Tv99ZmIey!V@Wte}7fZ@wCDzR5+NsVomNAr;)d`omztr zZ7fZZ{=6Obm1NB@`E>rQG(OINe@MK{jj#T8|BEwc(hU3$)H_rcje5`I`n{o29wpWB zh$laZ9t{a*;O>>!4P`H&3D5PW{l~Y{-SzE;BfpL z@y}zqS#W}>Ga^irxd4I&Fu9u?lCQ_v*bw(-yf6-Yy2|8|RY7I{GQGKtj(xSeh0O@* zQjn^YHXY;2}#kPyoi z0mTlCu;iXu4-5Te28Fq|rylufEoS!P2zKQTP~p(fP@uxkYia^ROkmS7Le|I@I0^EF z{Moa#hUpNWKlKtAn(cFq+*-icbL&xooF!div5b{u106mMl5J-PASrygi*a)WhdRFl zOoi&juWg0@KAqyaC-cY%0?R{eNY&{Nyr;zAC6_jw&E}2_y#hP&o3p|}d`z#rDR}>% zeHzgj1tt)nY;nO#5||0_+R#m~8`0(BpTW!i?+b)XUl$cV6c(I2*A>=|hRpd>{Mn=v zX-q19COF)ugZkg=_?1gPE`I_B5Ip?!%1OzY?a|r@Y-wrf*{!Q`2Q9g?`RHa$(22St zxj!n60&~h5f3AiCj=o%f+7WU4cJ8PpL_+rA%@fCxvMSK99y+tPyG`BZgnguPCl>61 z%*;%e6uXE}RV1&-+Tnp2@{Z?2zBik*EUVMgQ5`yl>C^s7uvBJmC7xjj6&V+dZK<_1;x!QRXXXb2mu~^0F?$|3M*a!O(2?!BywT3VF3+m zB(-C(gX&5YNfZ&fU@=qQGt&ubl+6a>=R7lUzCugE@{)QfocI-0uh;O@GA5;0%Dh6e zjb2n-ehq}3BM=@4t{m2OnjEl@PswHfSZOy9jbUU%+RcW3kWeE9CG`At%(+!vDY-oi z^CNQ{EQP7_6zh4p!>BRub2WF%>1V+~`+eT@b_>KMpt^ZWuJSoUD(llJ-!>0(mWfVN z=K*=V?DZ7HrGKSF`DENYdCYd>f`U{IMb=QcbU`^||0sk#odv1Lr{ctFG7Uj~stpP4 zJ5`N*iZM%;%=i`EK&9mW?@q+FeyI)pBqCM3U`#Z^Bkwy%fZblo-zB z3v~?*u`sAy9;1sxCVUj4T`Lar$Rzg=%1ztkH8eWTL)s3$zMHEnjam7s`_C(1@(bC@ zI~8(Gk;jba4_dPY^P*TM)SL(Y^L&pcGi<~S7irrBfIPr}OiD-?1VNZ!>~gA1^MtNkBZ=7 z@Yz6*s^0#4f56xr#{wJdY3KP_&BAqqihytO3T(L#%irfa;o?RbiyOQ= z2a)HLjz?C&E}9~k&s9RE1(ZEkKhwY{jT zb4@R>mdSEELx%Oo<_XH^CFkS(tgxhpT3iHbSy+>YOav^FcJ$KaDeTfyiDv-yE&g5pUK-w+E{Rt6>@qhbFFmdqRt{jmT20|I(2OlX|qC;A}a zb~r#1zJNOLA$fye1yqIg?-s|DB>w7U*!~Qd148{2lEoSS`?ZWEg-xrM3A8d<3lJg& zkfT>O>(&vsY)oNSbT0B$Sk&xRV_4K$?yw0Kxky`aFsyp6h88ue{q{d*;HGxB3K XOU4(%+BE!A8-$^rnQo1?OU(ZP>h;hU diff --git a/src/main/resources/assets/tinker/textures/blocks/liquid_inverted.png b/src/main/resources/assets/tinker/textures/blocks/liquid_inverted.png index 8d5c090d0017718b9cf138f4000cb4e4b1776bb3..5a04a85d853888684771c9eb8555be236dfb1953 100644 GIT binary patch delta 4100 zcmV+f5c}_gHi{##tpR@z$4Nv%RCwB*oGrF2#S(>c77T$QFa!pGL?94IBm#jzFaQLC z0U!_vBm#jzB9I6Kl0lrecE0uH`f7Jn_kBzE`M2Io~WhtIAB7 zAP?mOf$)j@E3<#+2Fqp1xtTq}oBW?`2 zPe1*1&zkMP2teKeW;m1N`nIXI|^So3D zWwLxngj*BCh&-I{EI$LV4OS5%*;2-ZKUqyyytiOOLJLDV1R=uG!GmaM#%?J94oD#v zxrzN_@*#hinb~fx?JWQz7*yjyCdoKk>ih4%zwKi&V+OMoxSR*A&M-6F&nG-P=A5Om zSJX5N%>-=Ec)+$6Kw$zQnujw0Mau(Wp79{Rk0!#%e1}1q1w6<#kQxHHx5Wqn_Mat3 zJF~|;07LVT)tk@e0jTW#BN>z_AH-4Mb3$JOBWj4+oVIC5Vh2U^HkVc#!)Wl`|N5qmdIHAVO9K_-sJQ2VTHD z_RmA!B3ikfYZ#H`;el~w?Axv#E6g{_x6FC8FtZRhgg}V#!Q`WfTa4@*RnCJ15iHwy z5Tbux?ZWr-VB-O1jn6<+Km72+EwN3&+&7nV-FN`ea3A~}-8*WUWoNHAU=sk04<2BR zFf$KZWFQy!(VN8pW&!*2`SHge4<3Nj5MbM@p)5QB@A3e9XI6Z~#TK#`^B})bDB}S} z$CmSZqq5^6Zh{TQgRCm%%){H9LEqf4Rw92+qfu-ovPZ=?6GJI`VtMF0YHSe_jACSa z3oyq~C;kFI?j0UjV%sxiRxkl&K|31{ zvJKqb!2|mPRG2NHFl-AvKu@+Uur!zn4%po@n29n5LtDhX7z=1@5!$RnAP*9pEpC4j z(nG+}itzyGKN$-T*%mrqK-r83S;gLhnaC2e$F>iA=Pe$<5f{rCc+pPiCgbX4Wr9Mi2isc zqVo>AkqC^%3bUmX;&`wVZfEl_(&0Y1@qh;%FBm|~*pvDKn8XOcw&MfL-SP*F7lvU} zc6`8t79W>qdKK@%Q0 zjyj1ah(l<1hX=MoGf9DHq4MH1{oUvP3rhI`)meJ|>1#W+^N0{ai5Ak_h zmnaQ?$MUfeR%1&=#aGvfi2r~#;N4lRk$U4n#Km`~JM0$=G#;E<8Zp8h9ssfsbBXj~ z3&2~a!M0d1E>0Wbaf8c>;i6pQL5PsKUP>TN`3;&jV^%@bemUW=m{4Ujkl5Hs zr{R4&R|gX=`63a5%Ep7-+u=SlIIU}`_@K&6-Nr-_8YnjbSMq;+jB?4DxJky+d7<;E zP7ybOhAC^CLBt?KxVN|9lPv2y!3Jt={@D1IBXgXK%i-2KBQi`qu8pL_2GkWD2;0#v zas}dLL@aj?ghGAD>0W1B4LkTVrdi8mh5*+TSfowwV+ z#RC+{+_oF{fi?;Sp-jH)vhV?IJRD-s<8rlVeIk%X24Wkpa*=xO;-Itz!BJl2iZwlK}$G?;C;t>z^jI6E~%39v~zE@Jc%Soi0dI7R9QJb-@y z6%0qG6QhqJb=lL0a;R+dW5R==*rHJnchz5xNSv7v=1zFv zlE6igtaTF}^n(sGPQuZ6fG&Ush>p}JOr`cR;sLslf#Ea+x`2Jr12-vnTOn|V2N(C= z{Ra~sOa^u74xB2w6CM~Nm#wVVnF&2#mtYwEU#3m$lI9){3_2gDGIo0BLxKIzuN2RtAbn()9J zAMt?y5P99i-K5+-5i80XSfQ^}#iOd+@*+xuwC;fP0i$$u4oC>qdXwlY3{{ z%WYFm_iZ$H0ryKhm^x+&x<@?d>fJLuIQ<9HzT5>c6{JmMO+abBn2CKR{myt`2#f8Q z=q(=jSjcMZa_J%9tj!0u5JCfetjGkbXJR$X0)%xr==38w)#>vVB;hx$d@uYsctD^r z<&TqsJ>UV+_p_kV4PQqO%w2z%!8%VcDqAl`JTMkGE(kxuv&*ruW1%)>cY}1X{(=X{ z+Qql-$(@p}Q_ZtKuo^eaxAQ&6h0pNd?tlV5EQ@5~!!ta1nYDHC#bXflhzH$f`_6da z*(XN&EE4B(#Mr$^-CEeEffqbzx9%v!8fYUzp&pLP2rf|~9FCofjp~1)?Yu=9Vl21$ zv=a{YJ5?$A0Pof>kc}A+S^{37SAD?)_w9F268m=W{S*(}m&E^DIv3A0`9%*Vf9N>s zq6a>N=)Q}0!UNX{8&vNs^5J!)DR-KRbr{-m0m?_CcX;4rj4ZeSCYGCQUn>IEdr>?GIbJ9)Bh@Ciwe2NDlfX2Cw(0FjV!n(vY zL3=-J16=Mwzr%yh6-GQ@nRj^L6-K;>bGaAmUGO0Mv0kjHN@f4wFO+xB#)t2h-bhT~nNrbGCTFgFXd+h6jHXXV>KWA(+?^82_K} zfI%GUhe-430S~6KsPjnUforV~c+mM_=g;mSJOoTVjP#KJakOjB?n`=5WnP?RsW!A` z@`)4M+NQT{Cpc5!nR~{8tuU;Q1#aL zJcyfaTlk;wz{`ABJaCuwG7@*o^(#Esfbt9vc(;6I!h?u;SF$ENfRTPd<}Q9(cgfWq z9z0ZWCOkmX+Q8g$f58KIK>N8Hd-yYV*$NB}A|w9gef!TB7@Zpr9va^p4=j6op~i#r zN2cy%{R|II+SkW|ukauY_8S$qc+f{D_C{eK#Qy`wHE!8X8^t z%F&n(21jN!HeF-~M)7!CZ7ld084t`EE6G5c%*3wYF=~lmv&O%^z$$|jw zpM!e{e8ff*EU9l71=TRfD;H(g2uBeN*r{BJy@4&!12~3&96ZK+vd0?P4n8}WYLBuX zobU$Z*xmWijzb{Q9~v1`K~{~7qkg}BgG1Pua#*$ozqxj0w};c}8vf3SEwSE)C<7iM zNe!GY@w4DmbXdXfvT}3rP^<&39m5cTV1T{pO4MYg z6pke~#dg%Yr8&GQ5cW7eKRKu9Ul^3 z?bIROvb`U41h3R~{##<9NqirbF7Z3%^`)`#c(to32Y98NmHq=>Q|z0zQ3)*m=B>B1 zynQUdw5yEVPxppr-~q&~>jbaAXTbmC?wR4Y^D7_mP*5jgg^(K;KGzb2+1Pl=s~B{+ zx!#3=9{*iq`vrbh@;JBi02QF{%r7u77Rs+UKbR>ir>GdcBnMs^({|h=QLXp*u}yr3 zV_iqH-;PIcaQv2U+|rUA%&vCUy(8~z0mHw0@h>PVJG;Zjf;X5n{tP(ES?RzbIw<7F zdwQtMC*R50Al+nm{BtnEvDV*lkupUq0jo!6F$GtQjRkaAX^+615bJrgLgio#)ffME zfG*GwAKyYx9OtTUv;XN|k$n_qqiM>$;rMv(1{in9yw&9?=f&R=rG@3?Wisd$Snv<2 zcS{Tr5OfDb!vM$=rgN3a#5ivro$ZELStkTph^K?eOkC>cY_1mTAK&r~D5BmH(qU!S zAhTnjMw21%oxzIW5ill9*kpK^yIc&^6at1#Wq+1UZ8m8E6D+)g18*aE8$66Rnked;mY?B-+|-DO$h zXKZ}+;vo03-IF&fD=TkuW8v>#b|)vNTDRxB^L}k-e4WT{Lg?XLNIU4;Gw)++dFrLv zqYxFiJP+eTl!pZ;4RCojx5Gt*fVeR*zG~SLNJXrta&;qWrV4@(nstBnv$?AU^zR|? zXw=9$=U7?WNzpncGc%LNyV=6r+#HOG?k%Nj&|no7=>&m`D`Yzz`++s zTvXoJS<{?UF%Na+)kG#uOw{A9wY-#-sJ$xAX}_M!Zm@i zYgsQ**6n-hx>yI3nn{qNa#nPl54s>AI`rA2f*Z?4BW+?r+pKD?U5TLP@Gv$HWTvb| zRHRsg;XVo9Xxa_oH^mN&xS+uLSR6VJ3S1Xo7^^OORy*ywyww6&LaR3xx3`%n`DY4* zW94P*S^PekfE?I?9&|+G5G)!7OH#gKcNqzBOE8y=P8_1!6Jgbvcehu{y4sMP>f>nH ze1|nsxn?pbl4d#8CF8ru?|{TEP6S&#zsd`W#CyfmO~ zmRmaHeV*Nh2PjNFMv~^K@lAm^zJC?vbO!7;a=bDZs6;y$ITfP}cY<|%3jeZvsA>5bxo~U32GuWS{Bg83V=wj|~40pw(4vWVk=G2FtHDAPK~F z`@y%Fm>R3LR-tT=HB7|QQ)!Mla7Il#ufMVWP<3PYO#bm zm`*&u9jn?ejgB&vdt|sAAWr?!VjrcID(EA1=NHj5gQVIvr&Tlgb`&Hh19sZDyMT9U zfpGU?lO>p2RX@JI6b8Ne>tzXATHi)V5leFK^-8o;DXTYZ?|is&l>=oxsQl!e;F}`P zRAj=Cu3ti6_^Br^v+{QQK7;2rpY9|4Z`PfMkQ_rg{la~`6g5RYBbq}AL8^UbWgrK|Zl zE3{dAQ+0@n`zcyF4>x#~n=&1^PXC2cK%Z7zWx7vjKHXhF^N!Rx5q8f{yyOzmVC@H= zAG2T`7S49s{_kp9+pPO1v#NDF``c+BMZ_f}cyvA{(0KAb6#eYR;|NG`)7q!}^2n7} zJih+p+qEmqlqzoO7q#MzYlwQcIDrpP5H-hIn2xuCv=HqOU_3fm5R=?2J*(Fkyuruh_sI#PCqF7RI&KnjnfSJuIHZ zKE9O}7Z*o^%3In!22ur6!fe^~N(_r!W|*DgC0BQ={vLs)k7O`lkD4c=O+PfN9zs@s zIGfy%UXFE(c+|b}TPSh@HM`gsipcX-2IC3Rt#Rdg0 z6sGgf5$b=t^3~|j9-(2-KHL(WP6Fapx-ie1K_b`3{zwlh@zg9#G5RA_i=}~WyJSqrT!VuhUuVu-=4j}8e4iHK zs&alaD@9y^GP{O$s(K@0br(FcTBT3ZwE|3VZGKZYp9}jR+e1Rj}fv zxCIDaW&in$;(y}=w6PARD^yJ){EOs_0}?iAKfFez+@4t6dMg|oX_+_PHpU%d2ryRa-BPAr2KBW;%V1_{c8|Nr5}JT zlyiK?$OsE$eyK01lWX7?BMWAQ*c(z>UMx(f)BTy)F?Vs;5Y$V4-vA?hFV%5xbd4QU z8LJwXlggb+cIrPyV*1CPyArF#CZ}D&(v-|4IGpI_IG8?=uK3Ef;oQZ}5uLyJj<}$+ z*@d>OdDcfxf!5NND)^gktSD@u1DunUTMmm-rE4#|k$KIlwVNj#+oX~|?F6!Y)zj-y zcfwbfI}PjHntzd-8KtXG8k;09zHPY@jVyn!Z9?tk&~(j4n^=F_dpONOgxNPBfVR(5 z{cvQWPn@55z43P0uP@ksvsBHooPf~K#Lza0UJj9X|Mw22H})qszR0m&W&ty{ynU;+ zXtjmn*#%^;_SKS(w3d5?g_UzVaZ{>X_DGoZoZ5}d4(n^yWnxc+8OBmF96ngvGE@3g zxT4@U675!{9y={`4JR%&hI7))g`RD-Oi-7Wt-vV|jV1e3*m8WAqs?Nu&r{@DMI>(6(7E z*ME16c?# zpA$80rQu2Z(~xqpF)k(y_}d?>B~Cv$D*rS(4RWHdmGZfu;Bkt*7pX&0=JHXn=+_49 z(s1XG?-v(;c66iw$ zKurKzur3jT^Yc?QkNLcQ9RbSh2fWFr3W;d`(Bu4GG%4^l^GE(id)~QG1SYyi=^OWtxtx7IC_)OF?jW-8?m7OA^oi!8Ue`1Hn!H-qi=K7qaQYkx6O=#F2+sb6# zXa8eX_Cx&9#L)OEhNNnWl^z_8Wi&z;JgTP^Ww-Vukj1f{Hc@#AN3~9;h}w z6Yy`t%8HMlf9dp;drIXiHFk8=5EXQ&Tc5u-e|!wfwyY5{H3@~q<_GQlE|S&q&wQp-Z_z}7ov#bd0*8;bJ(cS>qml570>wZk9fK2J7BDZN{yBBR6V zZ30|6&#Dt6>Nq0h5@t41my&Lv9 z9Uot?DjCUz9jTY4Tzpik31P4b|@OW#af0|HF%9QtwA<5@&)j^P5#52c7%hVsp z&*WK5*QpC?K44(e{@e95;Ov9$EhrFGvc2m3I{#TdUrg^3_HdCb<-JgMah;oL>D$f9 zT;FGpwQ|1jd=dP86w-DPIP5OK?7w6x#mdTWk6#jQBWNZc~b;(ei zSK)b=x0}c4_p@!DY@kOGHH`1AwzMAm=+eXw^=8ql6+ky2=ndEf9*y>$hs}Mf@s0k@ z$jQn12$d(_qrBj`SLK>izXwTEC!G*qh+DLoDn-HlZ)(p3QOkN`Cp24{o7v*ioL&3w zr<7RC+Q~8_98@z?)E3AXiNAp8p?8jRtY2^Q`RJR*`V`tb31ddK^6EFtn#F{TNJSeD zx8CRDH-9G5Px=(Un`lQLUff$#CdD$Z1Xvb63X_5F4(d;}r@WDY>$4&e0WPyLaAvt- zIs~yEY{W1BKMOWAG!#JBFuZ0JoQ$Ypt?{Q-QX^yc&|hSp2S4i&Y@QiNEg6D!P&W$< zi9mY)%X_R2)P~a(XQ;hc3V&MrcL1D`;# zA5-k4DE-7@sj`RxVlrn){0l1iw<2_EKO>l<^Lc+KEs`0d{yCR5f)-XD&=!@8er4A5 z_`OBe^wq)CXCv#?b@(cKpMc4b*nUcYV6<35XN%`fcbtq2j(KNSLKt`a?`;qZZebJmzm@%%>%H+f2ojYV19tM%B98>r;=A3?Jin&S0y zRnJ@8Uka5fn}2nq>qEmVrVR6>1FbX%S8V+-dtUzSPs+k+W=3n@UiQ<@_$$*W_@5na z-9H?Q-}(~?7FE>A9h$9`zh}dnKwAKI^YyR-%Gxy9xUwM_J1XOl^?tuPYNo zxEO78Z@CURU-W-9+GNg3bkfGT2(Q1%*k2bBZpj{WG$bk?jeEx#9p(NN8F|Lr7tl`e zOJ*G2XE^NNULl9l>!7%Ov^G;469299NNG>`K;WVQ_!BeCKouMH!Xlx{?zTE3HANYp z8!=QkptOS3^KT1Bux4a^h+vu}fTEoYL8J#obGRG79Z^^In+BJvm zwMw>>5#i>OZi{4nMUCW^YD*-Ze|`*Pv`+t!2kHiq!m&kTlP)=)d%%LqNYhb8!q4#a z5@(b!FlO|=I6C;VK)%8BQ?|T{ak@kI+IKC~7fM1UJy0n)ve*lvXgG=ekUt>wK`23a zwE8NzPGslorkK#$5+WSTq+D?-LIytX21?CT8lF)>XH#xYh^FEsz#5_4j0JM zs%^{QY2E=-(_-UQDTjA62P0>ai)43|IiHUM?sWP}%ep~(VIDo?Y6P=9jaNR-an+Rp z;n6t$E^q$EIMzu+|IQ zWKPr<=b)E#P89?@B}maMp$t7GMffhvx&;q~G<^6~Y=QI8wwj2n??(NWlf(5UNxqL3 zRrQ8uUwOn9*L+IfcuZ&qWmW5Y|M_#9hj6g|)RahL692M_YrWNqneugI^y#P8g8$am zd~f9pI)=TlmQHi4%6@HMkU-N5i`N7Sdzm*o{N_UZYN{TH)LMKA=79cxOB}?#uNBY^ z&+5lj4$-6J-J~vd6?G5hd0<5P+J3^sjPO)1~+lGGNABhMN>D1Do6mL# zKU~?Nj!8(3WU&4~Lsp1{0jEc>=?&ZTio}wGy5^3T7Rs4$)8qNKko`jc-Ltt%IJjZ^ zL-Ls)$lj5GYYQ3P{E1}X85gU-5*EqmK^eM=ky*e})$rQMO6_`}fHyfA??&>>&X5b_pbx9t*43pjYz$y#^{^ zpK@Z`uWQ#&V{MMhcrz4;Um)pj>0ie2JBto4yfXWaV*tAiI2R8cd-*FX+)F$_*8CS) zaCdlXtLk&|jKBWo$16vRWM-7XpG>42B@y`4bKv+2RH}Bn3tiu=)Jfr(TOj?kn8z0! z5B9>GDh_grLpM4}Bx!KxTJfxA*{}bTxjTgJw%%8^X0n~owmFdB8mV|D-B8z@Rc~^A zrZX7O?M8>3N`_KGyJG^MTwHdbnJydbO%`#Qy+v0Ib3x>t)|xss&)dJVWh?$qCi7$9 zK4a-&(T?@GR2mi7Z)PzWGi&P${XM|`Zs3DC>dx-=3RMBv+gX_Fh=XOe?){*z^=t3j zw*vcnyK{Zns+p!hJ__B)oT4?Y(#Kwoy{&oN!~_qp_Gww$-+8c?|8~6@m&}q-!2aA? zp4+AZt*qT`YNx(q3sya(KlxtCq`!dZj<|x4=^Zi0U>W;f*nIK;MnE)}{K}hJ*@j&Z z-O*Z~Ke*=m3kxmbLBdM#B7UQhzVA;Dt4Q!&)=7-$7#DvWjcm6l*h*<=(BgdClLY% zDRBZxa$-B`D@m6;9mswRB`k*7wi+?b-T{e)9TF8pg}XGe6`eq?^asB>B=e#^O8e=} zkoN;l{g$~k3zNo1-hXDOU<3dO$zECBq91^ynj_v6<}D?OWYYOvOf95pTqitYN19)W zSnCdvA(6DamP@Db)?uYlu>N#wh0(jQbsyJR<`oVQ(GBT1De@uM!{Zqqc6oxMTZp|P z&R$puZfYQ&n{zCHaYgr!6mgCxJXehZ>fGTh9^FW@;D$Mqqj(&QFqN31iE9lw07QnH z1^chVX7?Za9ZiMq-FUdhGmi+()GE$w^8BWm3CA)Yb947K%#^+Djdj%)LA=g}q6Q4- z``Xi~#eMHd)k%f7HF^D4A>xMhixBQwp@*?Ca*ooHB<57Ii?X`pY265yP}JZzMA-ia zNf9e%mMmP(4@kzsMhe(kLm#csqVkFcFt3&eS1AT+>yHiuteQ7J4Is{*R%j0axtyo> zsG}O^$j8^~=HRyel&Z9}&DC{|smEn5%L*Rf@N5eMT5n)9m{G9Vn4PtZDRU>En3DiL!qsHJc0pKv-sMkC~Var6OBO|p%0xS@7_jc*pN)A%~7@xzVc+Scw z*fziS`M`^M>MnwU4(iFl#-KJ#H|okQ!t!}%Q3sk!BAO7bV3}vE>mAA)-VD5Eo972) zSEl0rp^f6dd6We8k*Q$6FNII`mgB>a_Zbp>* zHophQUZWy-^l#ODJ)_r>_378$H&U*is+qQ*wy076Ym(x)96sh-KecvKp|%&^?hFz* z?u2|m)@7N}a~5=DmnhNB55zTVphH;V%fyknBtb7A|Hb#IsAiFEXj&F^9lM|<`ayo7 z7AK1OKXCk#Rs6`1?Olx@_Q~{nC2*EXw{%=b&mCU-^62(KJ~S57&rM#_oFINjZd3&_ z6xw%h*j8g&*h>ZU{`|Z+Wf~pL^Hf!c<{hdIcN{0j%|ysIm!|yXyimxO3P4d!_nmUr zkg>z7@@dR*&AHg8h(3+FNO zb4N|DL6HOGIN0+al9HwXsUEYDMN*srtxxrMHRewB)m)bFS0|!ON#N@LI?BJWkU7&< z5FXk$9pZ27*zgS$Na*d>Jku*9b0a0UK<1}RYA~)Fmkn#+Q4bq?G+5ezpkAW#`u%R1{KQ`zGE;&s z{ls4nK1JVYgYJn*el1QzkF-g?blV$*qJ*War8026yO`!#VLB~pnw+?EO`fAL5APDM zR1L>gB-uTekgZdkFgj&chX^w?z!xq#d3B`@ybF1doT3>8WA_|3t{(q9r3CbfFc7HK z_1eE{Ui@q-Ep)Y+zG|Ss9OhcxNbQJC&gZb+f%9kY5KdM_{mzNS)+==Va*?GF>Bine zJV7Kby6w(>9wpAQ&S$HWJIT<`S=U_a85}#sxTO66QG_Tvc$SLBRt=l?6?0bn2rjTY z{Hy;NW%E=Wd z>cCGIex8`x3ZMHKlSP|#IG94Nybx;V;5fqx)iOqbtWQtdA4v=e$q-$lbtEJ$&&}r+ z5M}fE7Oo;m%$ctEHf5O#+arlt-migQj#mH0!oAN$YXy3LY0B|1p8{ewrDxk6<33c2 z#(r?wI;}hH+576ocLXYDG2hRmV(z+ZSX-PG{0`|q=p;*Lq-ZA z@xFL6TQq*Y70q%=d_e2dudz>%>T}nSu$~VT5S8Ydh_Cf@B4c&yGtw4mFR_^P;9&hz zfL!x!9?&}ZM#j~yAzOxA<-zky^%kYlCmc@lOX}2UEdLVP?Gd9gl{Dhx+PbPyD9ES7 zhs#&zeiA#%K!EI>j-Pr--4vg_URmwR_)Rkk8W@45&vyvDas*xOep<4N+PLp=!7DZJ z!P7892(W*%^9?1*UPQtw_EyFR7y+K<$|$io%OO)dpjPnMImSz>0hH!UjQh8*c1RKB zC1wqpCChV}cgDH1P-Jjc6T?fLB*)SF$Hx}ll{L=j7?~YSMYHsf(xs!{le)Bi{T;GS z79VTrscQ z8ks)D^Y4?o5PRcFhB{7}^g%d`FpSvyo@8jWOoYSER{Apnxw)JAkRnho;8BWZm*5kD99cOE$LPS!Q-V%Noy7#VouDLl>sqo34^@zaL9=xU8yw41!%y)eFN^%u|D3fWBa+7@&sOogH$OW000O99DOqTc z)(MfkvT%|qV56}dGJP(a*CcXw1`vX?^lUWHbtiViq^~S!VS^_85|2v?1!j4icv<83 zoz}5#uy=!th^{VBx_OM@}Wg1okQ$Z^9^Z9*@ zM&{}~oBgBmt19%Z^5`G|pw#J)!w<(&ZHYAjE41VR?>4K*2~J|@8^IjJ-bDk9>UND6 zNsMpjg$DEA(er;$usm@jc75=yn3@cd8P^?OvG|0R_sj4(W}K|x&( zrq^R1u{T?;Zzg>1Qto17#q(`6OUFPM*=Tv)Q$Tb>DE9$TUJ&Z83hH9##3%RBG27!0 zA8~PA5&&&N`bec+Ui(G%9rWkYk7NZpkmq|j-E1{y+xGLi>nb^o$12EuaOrY)qW@~= z{Usjnku#1lKHy02PSmn^HOZMy`n}rHG7VwTNdB=lP60E}Zmm@BQt%yi>2|{BM#=eH z37^YyxbK~@BxISs@n4nEZ9mL*Gf!AAmTYq*6^%YnOXU%i0~LfyqkB&GV<{gm-b~E_ z3|6s8YSl)k#y^*Sy5I5%in@VXuM)3r&+tTMG<1Y$zKnupMqGZt`rvHT=U;kw1&;mT z8wPwYRy`qpobX2@9K^7R9+UePZp!|(Q603wsuL2oP8VR_Exw4FfgqU}_^XR!Rm)Z( zs@Y@E-{Z7mevzl&89s;{QOHN=85*mWR?Zz`s`=FH@Voe@%d`%CUk@m^aI!SNRSAiC zBbQO?s++Q93-tJ@wD$kvMtb|8!N~x{FDE7Yr(n9Yy6p5Gj-x#khw#moC|J!4n#Fd5 zsjKZxw+S9a@o!U6zL@d*iBh4RJPAbcY?J6F9BlhT*Q0TUM8{dklc0uy0ElSSG0|p~ z5!wa!&CMExaSG&bxiQ~37si@+o!m7%6^de>bdCbl=_I3_>tp_(z;V^okDJ&qiR(|2 zm`*zL4`Ic!Q&J%L4|^NtCP4V?6!IbSvat`eLmZaF1VocKw-_EbPP-no*6F*g_aB%c zrp_y?;iIV5V0`ykB^Z?-b5XjC>DbXk-hkl%h7+VV`75CAdR2;FO$u$`Dj=$&M#)$_ zUf^?P7=dyha;7V}U-!j*cn}E=Qf@&}lg%!{1$>#;D=6wZ8=K2dj0}*>QZk`()F?sGzDh;Ax^MyXikg8< zLumz|`_}n0IkmpoW_}Eac!7|emF!B=bzgVg8XU~kx@7WGqFE4bv_A&TI>Pj<*KUyw{w$EP2A^fo8I1*d(4@8^$o-FMOXE{nm8-yd63AJ~$n#|ht_mu+Dy zHL9Xui~XtQnX~#A0bL(S!tJq&O^-lE=Lx>;4HaE7Lo**NA^&Xkg;Oam5MoeW53)|L z9AxhwYwbFPb=!)$LRY{@d&R(~d2~^}&f)H_`R`!6OqJUAG~OL1cgkT#xF5P}(Urv< z+(}Fih}tLpm+I{E1!oJ1(M3_(TnRXu8P^#7b<8^@;4K(H;WY|9)Qm_cMJ}+fhQe0>jLZ<_aL6hdIh>vBPn^(MWuy{9j_fTuuUYGPJl=Se( zc^8-nwJ}HcGV3twaXEDCS(ap_TmJU&Ej9bJ$B(W0yrasq`fe9P^qT=5ZJ!(;-kRNY zh}X2kQ&7wTyHFVWT4R@6Z5w#^SLt+;i;$(^ZjaTHwn=sgyDuy3h zTt0kxW$yCENU7e6aSsX#W84?cF!G3H;W|$T#o)F%GZLSy$k>qm}P&S83t1movacmA;*7Ir|Z941~pFk43Zyw zo__dwny|UaY>ay^PCqp>LpV7R0IS)>^%Ecx9Y0SC_sSg|kp>Hk=oR;xq?`8$QzX@+ zlS87Cib^tXhfn-QK-`Giv%|xX(4Fx|GF`1CRf^V=6ZI;o_UUPUkIiV3ua8eeW0`FB zptC1VKCCKUX)5>{VspkrQ5(u8-dp9URA@v{(&Ov4D#!Cvx05~MAQUe|>E5DQ0Fhkk zk|Iee&8JF0;u$}`Z)8YXOP16V6hw}HMO(`pstfwP1;u2`Ch<>H@(jxbH>lB z+twd{RlbxY7VFh$CG}075p3vuU8jbSC`E_wmUd|MMcNn6+^F1}c6j~d1v;UiYcpq_ zc0P>A$lx`HUDAHN+<;+^i8BwDd*i<}N#k|kk0RAsmo7*IaXW4vkkS>|Y>U>4VIiU#C4C_qOT=FEealcbBusY5Jtd(S%IY3{kUXZ;zNZaGL zna3oku6ix~HVAZz)^&V2I7(}cujX@i2&!(KT1(g2G=g`3O^Ynkd<6<(QfOjGh0|N| z^4eR`p7M>u@;UD-xE5K8i|8Q`NEJqWUVBR*23$J<(J}FQ88!oxJv|0uY>r6CkF8JI zQiW1`HGG8d*l0jwoi$~dpw{maPp=4Vvn)=VN}X@W6<_E_Y|*%}VtHk9bvv~puxO=1!Mt@F}=Cjd2g;-aKfsZ|6cP zCCX;>t4NM=XdEnSobDGkO})E*P2`vVojZ3_P)^mr_=Dg?~;FKIktTiEQHhsE`apvDJ%qJKaq~0n-7diLbhF$Wc90mt)lZPMxMGbVk zU%OD|8`ioZCi=M6j#vHZZ7?yTnd)zhL~9>5*^3O4#O~VQYxU*vHCMyMgmOgP-_N4q zzTt7X%#)r-NX@h;Ta8;#mSgq!166@1ODPudkvjY`Y#Ilf^X($XVb1qZ+R$=%<2_?( zBqS(H1SR}k61bi$_@Ru*%g_HVSAZJ@naI8?l6$EE&a)M6R+Zknm;&KOar%{1 zXTIkf2os1=)Q$6c6bE^0JyhKf9n#aOws~tcP|R*0BBKCjXlM4}i;LU}yFaSfVs&oB z$ggMbhaU z)q>RxF5=|b-Mecs_T?U$$8y6GlmJbGzdGV`1F%@L>Gf{cXy7^M_H9o$x*sZ<~TTIH<<)5JU z%#oYl7c=^4QhFBXa&F#DlhcmA(#qkLEc%i`zZ6e?L8hZ_iI3`_A#Q0m6XRqmpF+zW zYd%7@DTfy(2#n93dBTc@^cJIhWJ_g(+$jjkL=5tN>>hsNgk+s}!)Tg2HG z-~;kaY2)6udATc0%nMD{2y55=n?2-uQtuk54KyI-KEE?N&Q}aMnrEA+rmwosgYpo3&^U&}YXo=sdr(=yDOF8+Ix-&x^Y%mT>Hzt~RfRD;{ zT+y+)`r%#Q5ffp+70kbNKuLX*5ZWqUe*=#WD9~2UJZQ|kJxG7QxVc?QKd1fWoi3$B z7TuSDof1O_anXdoAegrk;C%0LkWlEb9&C8CboC(!yb5f{_wi6r8%A#h#-qvmibd9m zrsZ~}b%E`K52}NmT3ZCU;od8~azLf8yo_QX(^rq-lsC@Ypfq9N-cZFJUrc43;bLE& zKl`!CNZRt}&W=Uy!-Ia0O#zKoG(OeEO~zQ|A0s~LeO(};Rektw=Q$P`^CVVDf!ei$ zh_7E)+#9N&4L?-M=yy`zk5JF~*4`s+UuyA3;RPmLwU(F7S&~B}%ESO1sA#+U_u~fY zu_560y3l~Z=s?-p++Ouw+6y_p%wX;<27-Kh@~}Cny83$1Z*)RrDc;>^q70*VNlFnx za<@5R)zXrI@Jwy33>cd5ha3?=Cxg!lI7&-xZO`>Py_g7lMaC11}h`PiUV*slP5fo(h2aeCu*gc!b=QkL`-$|3prn&-ng0 zq4VL;YK_ygnEwPyTj*Sm3xGed2e{Q9Ozb~E64{i#BUpwvHV|Ue+GmE=NT4KbXkgER zfSkxct zN{o%ky1RCov)7c8lH!-u7wql*R2=pG6aauz+1Ua$Hp28;zI$ zfnAH_QaLSkLL#HR@Z|)0d8d0jqL-?nEJ;@6%(~9gyDTa15pG)WQNw&V>#Jx2aDye~ zW^MRVMOBVmFiXz@Mm?}OGjQba)y zg`1jL;lV_|cy`6rlW~R16Rd>Y-;vRC`CUvPLORD%*rjU^toK$e{#&JkXLK?kPjtz{6p|G@cYMr)KR;r-11=j zdTj?|3?TtM7;4@0*t#5lm$tJ=jRSQ{dwlM+YRR872Xx27@LrCV>Ls?)E&`pc&!jQq z*AJrzX%(BJJ6dh^w3Eo>q0!j2oD=i@Rlx7Rirq`1Ja)p=9Q=GTw8B(>wHcS6a=Ij= z2i^YgoEn?zW`og`CSb47{-bZ%uR*9BHaQo4Po{29%uZ$e(Qh+5MTvg%`q97>Vb4PY z7$WW!Nd74)tR?vMJFMqidddCkCKx_QpO~}oh0i6vo~wWhVnV*D5#hGDJAqZ@^s+jm z^U>M#0v+`giP}@kE8K-;lG>ZexAhXpAIm0#uU&!l=~42b($Q8w8%wWWl5h&sf|45p zCg<|MJ?FO^iVJkLfwEC6W+c3JDD{peB)|{plDZv*ULLh8FJZRExSHw67{>5NW+k5x zo|rh3jv`<^VDmZJY7m>G9=f+#NT>4_EwfR1^T5@0puRkLq{e|8m0mVo61CVk;#U-5 zU8^W5qsAs3rQ`Rc^z--{zR={Hjhbvej)u4@bnjYvl^%SMJmk%HhlZcKumXEdNHc?6 zxEwGdz=$9GpvOz+=vnw5jsO5Hfsgt{MrQGw6S*6WJZWd%YiMu@5|x(CrA6pXKK*!S z3ZgH3SyuRfisk}J)F5j9TLsmcXm-xtBYqLB&x08x(0OD*3;agcxR?)sL$5*w?id{X zY~c#%hFJ2e#ywu3KdLHxE(PswkfWZiQ8eL3cWkQjbE#exQcobzs#6=gR3WD@2rduC z7jXWhcY-e3WTy6c-8Kg#r$rwxyhVCE;YG|$gF?jGZB;g}Vfi#=5{$f9Kudjn1&#Yy z!GA?{f)&>Bcp~d-C%Gu?R(^2eA>xO7*4hoW7Lrw^E&uCceC4%ukGFb_rJzAQxg~gR zRE!M+<%;G?>ISObahi~AVHUjE9L(KDx zbbjE>3U<|ITyeGNHGfNh7c&&4B`sD1Wi(XK$cxEbpP?a=>7KjDLD>wnOu=A4ii6KXSZLZ96u`^*8-wd*!ywBw@FC ze<{OnkmUVWbWq_rD1N+AKU*>FIUghdiU2|2C?YQp5WxhK4gL4ASW4AFBxCsY^pjb& zH8%;36W|j5*{6(_FYcOl@0uCpGn5p(w3$mRO zcXoHF{r&x;e*AFccB2Rk41BsA1U@o9lw~7UdRa}Qo!u0yi;I*`-ifjzO1^LqbJQ+) zP5@bLeT!`ws}98@K3FHMI?x;BB)a?@EPT(lF9=u^o$*I(Mz=hey4f9Rb^U8^;fpKm zNmpmSsme_RfdY28Pe>HI64IXVm6s0%kXmUc0n(?tEuPmDDr+ zm9KEM0u}k*`K1YnWU(*pKW#Da{~^~O5U2|ez*^X4fb(!rJLf71`Et! z>}BQUf25rn$jy7AwptjT#}{3)P2Oc?1)RrKVtEhtl{6Ame&u*FnRx~`UEX`8;tF0i zT;|lJi?x*3tHw&|gST_KHzPK#+M0=fIoS~XE6u&CIkp{eMMAo`KAtXAtd&E|BszI<` zk=UZjjIQ`fVm;_<#P@_UnTExa#JrdbuiZdf+WhtioqeolDQN>d{w~Rz>;f@An=?jW z%(uGFCQNUbcNEsUXlgFKPLJ3Wpa9cmW%_vSLNi5WTXXrMG$xNNJ=Syf*3V_sk|4py z2alIYb$dgT^z?A(3Zn?d|Dv#%5<@mV^G}zsB8IYy`#rZhQNg zHkl}}S2*(z$>H{fS8I7g`d*rtwA{VSI!3q=6}3=RuK%s;=-XvcGt_uQ4~=wGM`2m; z0ppjgA4;!oE{u$@7uES%WShxTfx#_kStuQGqvt?~sU+XuUQEA_imvVqG0tFm`&SIB za;w8&D(X2e3>*QU@9w!*%1jwxda@FG{X78d#GxF8= z^cGn_yZc!FnT|%LCqAc?pZaOr|T{SwdN6)^6fxtJ?G^VBUZ(iu5xpkF1W{T3ZNY4%3x?+E``@uK$DUE1dYinuE# zs9gQvgzt#SboIaESWx(eo*wUJ%J)n4F3c|MnLRF%N_D8j#xehvYuc8Y@R?co`O|2s z(i)(RA?z-Z_V<^wfkaUQa648`doG%k6i<(j!<_C#fBt*}M5oO@Xbs+%xhr#U zt;ry+KH&RhLe8khhE$LLl%~@SnNn24(MPY3b9j9ledex}Lmi)S*8;kB&;kArl08_u z$*-lQ-Ii%Iz4X+#KzpvUllp6wPO>PNeBAB(=?A`=JNQ8abeCVH57vsy11=;B{f}0) ao>H!!F`cM>oEAg@-VAi_=#*(ai2Of0%YI(~ diff --git a/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_fletching.png b/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_fletching.png index e5a51edfd4314b64ec7e280491e36ee0411fd8a7..afe72ee7c6ec27bbd04b84300a11c78752b87795 100644 GIT binary patch delta 123 zcmV->0EGX!0hj@hBy?X%L_t(IjqQ%15x_7E0|k89!YDkzrkTOiD`caLtI}Li%?k2d zuLmxdUy+$qRjMjWLlL2wF(R0m1OPMpE}3(3j6ruN0JwX-Vy#60*n6|J#!|t%r2Kx; dd#8w$1P?JRBRfvEj{*Py002ovPDHLkV1l`#GfV&g delta 157 zcmV;O0Al}`0l5K?B!7TOL_t(|0qsz`2>>Asjfc2}l^bXy;vTNxMo#4vVq+uNSmubw z_1ax=fshaHg_j3^{0@A}fe->pDOa8-yEx~lwZ=IoIOm|0!f4(-!mYJ1#(-KYp{0A3fMCwvXD1=ywXx>Tog1q-gN_y|>jdy=kl~PEaoEDI7SW+-4vCg@h00000 LNkvXXu0mjf(ji9t diff --git a/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_head.png b/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_head.png index 4e821238bbfccf1927c5ebf65a795bd592cba170..add9ad6945e14d85756c193e0c88c4d1cf4c1946 100644 GIT binary patch delta 111 zcmV-#0FeKv0gM5VBxqAfL_t&-8STNL5x^i2MZq&P@eKulK%JxjW-u7)q4Gxy2{94u z+Nl^Lb58875CXMUT5Cwco^p5GoiPS$EppD-iIfth6eMA%dhgg5lCbOgl?`A28XZcw R%LxDg002ovPDHLkV1k?YEb9OO delta 140 zcmV;70CWG00jL3xB!6#7L_t(|0qu~n3BVu_MZXX`ClJ8_EbK&wa8j3X3JaIGM8Q6n zSbA_=bN})90w2d(OEE^U0a8jzDM2ZPS}U%%0wDw%zs4AN?@>xYYfZ2XoOAS8p!Yrj u1Ipf<^R!_HS3qn153oSzo(8rxa08Gz7s3{s?a002ovP6b4+LSTX-d^aip diff --git a/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/arrow/bedrockium_uie_arrow_shaft.png index abfa704fa23a2291e5a6b267b83f9de3d9feebe1..f502eae640fd92936ed636ec3fb8eae3497bec25 100644 GIT binary patch delta 127 zcmV-_0D%920-OPmBzR*0fboni(Z{t;KT=#~Akor4-INS!=zABSMGWovk(IoHcXrT{i>J;k~!^?TC11 h2A~fGfOhuhc>rSTGWe@zLGb_p002ovPDHLkV1mGjIB);} delta 229 zcmVHKqk_r9~~&qki-oTe$8&wiQ*-@fmA9>G_{cZjQ{eV6B_)W=C00000NkvXXu0mjf$xUd< diff --git a/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_fletching.png b/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_fletching.png index 854c0c0c5c89949507899e605e398b16874528b5..495b580d87f45963ab979176a28fe150dfb62d98 100644 GIT binary patch delta 154 zcmV;L0A>Hd0+a%ff`5HUL_t(I%VYTe|33pIm|@g_Q3I%IKz4c6|Ln@@|Je=A|4A|+ zyRPwnc3s1N>yWTo^MD|*=Iq86q77k)EvfkL7!^}%?CTHKWEK?mA7m&=UWhC%1#2+z z5Bl#A6JJZR0U#V!Q1st6Ji0c!w&6e7vEY}H{Xe_Bnj`}N3lkFQO!Cw`Pyhe`07*qo IM6N<$fJ{1f`6(>L_t(|oMZg||33pIfQ2I6qXvu`fNnreMfHCMCPoGZb`FLq z^)-w{8<11q1We2S87|ztQ}^f3pQaP**D~fbwf>({S51^5ET6u8XL$1LN!^d1Kby{M z+Q4WY9RA-_N1J#rEb4A&j4CPnzi;VcM$>@c|2(|BbwKeZqCgD*5zBhI7{d#T|8sJ1 z)@ds$Hce@)BR&jZjFtVpjQ*K9{~3P$CffNR005G-J4T2M{!IV?002ovPDHLkV1l56 BT#Enz diff --git a/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_head.png b/src/main/resources/assets/tinker/textures/items/arrow/inverted_arrow_head.png index ee70896e04d21210e89299db717a46ea5e0ea2f8..4ea64ab8385c793efe583a35e796b2ac37c14def 100644 GIT binary patch delta 133 zcmV;00DAwN0)PULf_`a9L_t(Ijbr%#|33pcIIXJwKaZFs=^FiF6aV`}#sAkfx2o+} zu#5y7E9(BIRn-0$RZyT22f`6+?L_t(I%hi+33W87&g?*wRe1WLMC%BLgV47}%RuN-KVSyC5 zkbZ97KOgk84uZP2axu&E4Rg*J2Y~a>IQ;@FFBR6;2RZ>(RgJ-DOq+XS56HNL>-m&R z1?v+sE-;*URO%Mi9_$(gck0vr!{)Dm{3*faF`blwbqa;nU_oI-XVbzu#w{0MVML`i zu{Qd!`pw$LU8WH8~Cd0000xsf`8vhL_t(|oMZg||33pIfQ2I6bT^=|f6{+WPELllj8sOF4Jes3 z?f;6ylGWbuD#_k-q{|g&}|AT0d zAtW0B(*QC6!e%7Z@r+mD!?h=)r60000-v8IXzy9a{#puWR13=)k=GZ%#?f;XM_VB2m zuT3*ZuQ&n}^_g|nKzeuaodw&BjSN6QF#EutTyaTBNeKzNx}S`qKmBKMUx+p0a$^i- ZWO(#cT4=Mg;${XQ@O1TaS?83{1ORy!HEaL? diff --git a/src/main/resources/assets/tinker/textures/items/arrow/magical_wood_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/arrow/magical_wood_arrow_shaft.png index e2a1eed01451d20fa656c3e82e1a05c4e78615e1..e17fa6bdfd88fd376a81dfb3d5a038695ad672f8 100644 GIT binary patch delta 132 zcmV-~0DJ$t0j>d%F@0!BL_t(I%VS^|1-JntgkWSu@Vj%|{u8MgrjZe14v<{f5d1&U z%iuq;`cYg`lVC@@W`y%01|6EG0oBZikRZwcAilm|7owRFo6`vB2L%|y*^CS%0Tj)Q mIKl=Wzz8r#M6`|qOaK5|6&<1P+W83p0000cEpf8sg5wqF1JbswF&&xG?baPRYN9DIX XYaSz3wjZM-00000NkvXXu0mjfC>St) delta 152 zcmV;J0B8S_0ki>-B!7EJL_t(|0qv173cw%?MGbXuaq$A##1lAsB#-Xonl?j0hzbpK zC{z%{IM$udS{9-@w3tG($id zK$^Y0yucV_2*^N^Y&SA80^1DI+}POozoevuH1B{60U5x?#`fRI$qDQdb#-;pTmthB n2!jj(xrCxXCE4~-Fd_f|YyUWOT-Hh900000NkvXXu0mjfkBvOn delta 205 zcmV;;05bog0qFsdB!93;L_t(|0qsyh3d0}}oZfN{A*cKxmpmYlPlUW6Ps%fL_9KEf zLBS7*coMX1NClxSq0mz+tgh_L?Cj#}r|Y^j&vW{y5s|lTOMTy`VHlo@++HaYVO>`+ z#tw+q8rE7EV+v03IgsZ?-P^WBj1eIOEXxAt9F$Vn_dWA+az^rsheVpDfe-@YIHIa5 zNGajH&raS7Jk)3$%ImtuG)>@~7cQuFDaaAUCGa2gQyaJgLE}Ca$jte^00000NkvXX Hu0mjf^BZ1i diff --git a/src/main/resources/assets/tinker/textures/items/axe/bedrockium_uie_axe_head_broken.png b/src/main/resources/assets/tinker/textures/items/axe/bedrockium_uie_axe_head_broken.png index 0130f6f2bd73bd4787f72f485be351b54969a208..a06afd38a1f6e29d7d8ea08e971198590efe8c2e 100644 GIT binary patch delta 123 zcmV->0EGY40hj@hBy?X%L_t(I%k7Y>5ydbJ1cO|K_yLovK~UJGxB*qZslmz2BQMME zdtJX^t;H*`By96YTvcQyb50`S%p@YPjU>98y*I~mY%|6nGpQ;hoj0+KZ8DSY=JBZ! dai0G17u-$sFQ*BL0x|#q002ovPDHLkV1k^GHxd8< delta 184 zcmV;p07w6r0n`DIB!8PpL_t(|0qu~n3d0}}hW~cT9J0mT)dvuK2`8V?w-MX~2j4){ z!6D@W4U{$^bm-CuCx_nmc^-bUwARbl4-w2cUxW}JCHEsU!L?S*^Nij*7-Mge+mV2P zX`0YlgE0mi>rL?l^wlN1k&q+f0IF3+C!8!NR m1>Kzr`Vz&d;;ZPdCh!15KQtFOlTvX20000TJR2O_*Bu3F4;4#Ug{0OA*kKcFXom*vpR9c0~r4LGO_^P@|ud4iq5jwQy%iqgk> z^GAS_NKCdCMO6)U2X>NTv@j?vE3ix4Tw>^!L+7Fddxho6$1sp)6x{A$&$tdF474eE l*8*StV6SrcEn|23#1|*F^x7X_oznmS002ovPDHLkV1ktCRLB4T delta 231 zcmVEr=BqD9b hFd#ELlq8KX003*qMcUS*zv2J@002ovPDHLkV1hdzbpHSV diff --git a/src/main/resources/assets/tinker/textures/items/axe/inverted_axe_head.png b/src/main/resources/assets/tinker/textures/items/axe/inverted_axe_head.png index cd9dd3a80f21afe319a10b1fd5d063913d80fdbc..46149fccd329eb8eba599e572b9da05964e91489 100644 GIT binary patch delta 175 zcmV;g08sz@0oVbMF@KUtL_t(I%VS`mHJHAA*Z*liOqS+3yY~K9x3RCa@(-+?zI``o zhRol0;J=Q8Q>}%sf33BD5ZI9U`wkLs$cp19|LZ%u)*86F*IEZa4DgIisGYTAFY$(e zYy@HJfZ$s9n7CToz>r#x*m$5JBzkA=-UI*V?B4g^D=wkd1}JFQd?25!KwSWI%_365 dVHAuQ008w)NKd*WF{=Oo002ovPDHLkV1ioASaJXW delta 211 zcmV;^04)F50sH}wF@Ls6L_t(IjbmV-HJHAA*Z*nTcl{?z^PF9K|Et^B*IM}p)=uBP z8>=BqxHQk-ci{how$?g9K>-Fv21bU(Gp5ze-**th5S#{Za&j^-Gcz;%`0;~*fe|9M zYX1DXSv&Tk7{Z9p3osk!Oqx{3!^6$+?dvxNZXRxipy-&UG)xayMg|531{QnXxLVu5kXnz}c%UI9dS~w5 z1OMmj-uK@tE}_;2XxMxppR52~0CdeFQo~^sj0gY#pZ7s`a1ZU}D*ylh07*qoM6N<$ Ef-Yc4C;$Ke delta 183 zcmV;o07(D80pJ0UF@Ks#L_t(IjbmV-2bi{f*MEvMTlojpPT#&8t07E;G%uPqwT_X2 zkzw(SX?64W9mFsMuK^4U3=BVh{9s^Ugs@l5pI>o68Cs{8cmGXpCtDI-EF!cXa>&002ovPDHLkV1m=2Q!fAj diff --git a/src/main/resources/assets/tinker/textures/items/axe/magical_wood_axe_handle.png b/src/main/resources/assets/tinker/textures/items/axe/magical_wood_axe_handle.png index 30d912c228f15f590bcc8a8ab1cf69865765fc7e..8071a2993607e706addc2f1a51de061b50aeca69 100644 GIT binary patch delta 84 zcmbQq@{4)HIz}IJPZ!4!i{9h}307wol`6?U_9p(1?K_t3fA&ts{FAAE4u_n=SrNmdKI;Vst04{viI%qeO~X|B>S>WA^Y9ALgl*x6COE# zHaQ@X!f>;#!N5bAr#Z%TT6sbo)6R}X4yw_gH6*SvFkDD+O^hmtlwbe?Pgg&ebxsLQ E092SK#{d8T delta 148 zcmV;F0Biq_0lfi`F@JYSL_t(IjbmV-HAwU__@C%y@E?~v6Cuq7Ie!?W#rPO-8G_RQ znC8{1gc$gFIB*(**99M6{9$mjd&R)Oz<|>b7F?R=Z@a+AzyMJ!E%pO0UXb&Lfq}u` zKSUmn0SH4F;Iyj#*WuW7Di5Sg^AwO^$LeKyP1_p+c=j0fq z#rUuqg4Y0;?F1k^zt;Zdpl0K~#7F?NG4|z%U4-O0S5RxPY&?iG%on50H3+Zc)0l&D<~< z$+m36&yI)+5o@k}&d(DTk?OreW`e2?>L-KNT15o7JDAxq)GL6QZ_!t@o4XfyUEl(C WSrg3smi+1f0000(9^@;0?jCD(-D!E? zz(P_?HXp`X!rdv-B!+Fbi0~ce&zn&OzYb%pTWhd~T5CAxz&QuyNA__vD5q~5V<3cp_a3!YJT&nqg9gy+>$;+~hEfWa pWf?XTdnp=1x&-dRy@9{lzz4U`FD+8W(Qp6&002ovPDHLkV1jlm8 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_binding.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_binding.png index c4466571e12ab2f4652aa0d24dc05fa40cd2cbac..f1f86254e631c7417ec7db875678bef243564434 100644 GIT binary patch delta 87 zcmV-d0I2_x0d1k^zt;Zdpl0K~#7F?NG4|z%U4-O0S5RxPY&?iG%on50H3+Zc)0l&D<~< z$+m36&yI)+5o@k}&d(DTk?OreW`e2?>L-KNT15o7JDAxq)GL6QZ_!t@o4XfyUEl(C WSrg3smi+1f0000BdOZ2Uic`t<+I%*>=2AR{C5Ut3!njKjmjNpk_n&mfy&wv!wNAlpFL*x2|# h$R+d-{ZW7$006HsF|Mq02yOrX002ovPDHLkV1ivRJ3RmZ delta 179 zcmV;k08Ia!0nY)DB!8AkL_t(|0qu}I3dA4~gi{_dL>N{At1)M44BdOZ2Uic`t<+I%*>=2AR{C5Ut3!njKjmjNpk_n&mfy&wv!wNAlpFL*x2|# h$R+d-{ZW7$006HsF|Mq02yOrX002ovPDHLkV1ivRJ3RmZ delta 179 zcmV;k08Ia!0nY)DB!8AkL_t(|0qu}I3dA4~gi{_dL>N{At1)M44>6T5Q{foHM-l2j<>`>Dx*vaL(bJ!?G+0AvhqVbbyKdGRUOq^E{*0 tic$)uY3jn1JrzAdIt^TnYXg6^ffw!REF2cpP+R~2002ovPDHLkV1gkeTbcj> diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_handle.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_handle.png index 572202286687d709613a1a01f5ed45e54cd140fc..ae70310768df4629f59f2d929eb50adcfcf7a471 100644 GIT binary patch delta 116 zcmV-)0E_?V0g(ZaByCtpL_t(I%k7S#4ZtuA1TA?DgK(2a86q$W_AZ|MOS(Y6s8Wxg z?#zBZz?_q7ElTnjg8=C6l*<4pmu0!TdCt+cUzIbH5%FBEDgw~A_uksJnOQ_=+cy_I Wm@PWLU7?o%0000YjFkzty(|la5I&k2NrUbCUeSi&jn50yO*JCT&#(pn0000(9^@;0?jCD(-D!E? zz(P_?HXp`X!rdv-B!+Fbi0~ce&zn&OzYb%pTWhd~T5CAxz&QuyNA__vD5q~5V<3cp_a3!YJT&nqg9gy+>$;+~hEfWa pWf?XTdnp=1x&-dRy@9{lzz4U`FD+8W(Qp6&002ovPDHLkV1jlm8 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/battleaxe/bedrockium_uie_battleaxe_head_broken.png index 3e3f72621521b74d9d7d125faf821e36bfd4335b..e496ccb9e932a24bd45e56105128a1f0afd01745 100644 GIT binary patch delta 125 zcmV-@0D}M90h$4jBz9p*L_t(I%VS_50GOGX|A&Nx{5LQ#_|HHp0BJNbGWtJ#`gAY` z@rl+fBO~)4gc}>6T5Q{foHM-l2j<>`>Dx*vaL(bJ!?G+0AvhqVbbyKdGRUOq^E{*0 tic$)uY3jn1JrzAdIt^TnYXg6^ffw!REF2cpP+R~2002ovPDHLkV1gkeTbcj> diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_back.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_back.png index cea1c937fd083f80119b3dcfdfac49d171c7e6eb..2db0e2db61775be63eba4b1f120aa56968130420 100644 GIT binary patch delta 101 zcmV-r0Gj{&0pJ0Uf?i2UL_t(I%VYTe|33pIm|Tde8AtGd?00000NkvXX Hu0mjfs*Exs delta 129 zcmV-{0Dk}A0sH}wf_i01L_t(|oMZg||33pIfQ2I6bT^=5<(mI8e0&Tso^FgJ8_>6A z{r?N+FV+3g)oCKx1*`V#|9|P)%{ntvqo$(Z07hgvq6`Rgab#p-V)`HAWY35$N3<8P jX(q`4Twv6IVPOCOJ(C*FIG7eM00000NkvXXu0mjfE3!J_ diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_backhead.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_backhead.png index 9d21b13349397ff4d54ef3fca0374555c0530332..0c94d5f111b053450253d184e7e644579739e6bb 100644 GIT binary patch delta 157 zcmV;O0Al~f0+#}if`5QXL_t(Ijbr%#|33ph+%ad)|E3wU!5Eu7Ud`=5&AQI6wOaO0 zwQ5$jwN2AzVHko_bIUAbTsv`Ndssn#(%w$>pswl*Lq zAB2hb0?4UGKpX8NqH95Z$EBH|7n-JH4>+O&kr+H`z^DOKF%|#-WQO95yfLZP00000 LNkvXXu0mjfz#m8j delta 204 zcmV;-05kuW0>%Q6f`6|`L_t(|oMZg||33ph&^dSR|6hL~YHHI{7}4cf@M-PLDe;NM#{>{Mf@BjbW%v2OZa2n7$d+z_0D_7PDi;6QaGBGlIdjF1rnT-iU9aaOH zrqBMra@C4DacOCW|Nj^m_=SW(xTz{RnK&=}GW`4dk43@R!J+Bgl`9PECr`l8 zjMD&+KbcsV{{Q>?A8Wu7GynvuQ!$-Ok^#hmQ3FN|0096!t~?E zucec813DKh`R|>WT3guO{hw?vbj)A;e;CBVr~!l3004X7_o-FXRcr1OSUY1Ci3UtqwCulId`hinVp^@Cr(f;dHET%I?3 M07*qoM6N<$f(WxmqW}N^ delta 193 zcmV;y06zbi0=oi`f`6n*L_t(|oMZg||33pIfQ2I6L)U;=tJi`9E-f^ekz@l>Ya0LG zyL-3p=Z_x@|Nb-lC&_^L;!2Rsb=*9>3}3%|VPIq=(F;ZfdJNn4?qgtPVq*C9_b&r0 z6A1=PT)h1M-or=hKi`aZ!xuVnZ|~Qq=$ep?Nsz`duF^00000NkvXXu0mjfjN(-0 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_fronthead.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_fronthead.png index cfa203be2f47ea6767f0234d65439432feb13f27..f58ffb7cb9b80b824690a3c15587ed9180f20aa0 100644 GIT binary patch delta 155 zcmV;M0A&BN0+j-gf`5KVL_t(I%VYTe|33pIm|=t(Fmd7H|C1Ii{!f+xNwp3C9iroE z&4WT~L57g5IkC2(HmtCu)-EcxcE(~74VVhl5K&TI3&M`E3AHm9FCkv@B%tP?yu#Y3 zvdUWL_@vrdi-f`6MyL_t(|oMZg||33pIfQ2I6L)U;wi*?{D_ z#{c*3-K+cl{X2;JpCki7nt^dvCnhGw@Z#l51~x_#yKR^8GX zj5FH1F$}?}IkCR!e`ZH_tyN%1t#wdHt-h0MZDK<+aR#I`H2v4HbEvfgYRvBJsdbM} zs`W`pC*BKbjV=F;UEOQ#L&Iv*TRQ%GC#7Q5jMobpO|AbkTO`_XY9uNUiNT`=j2b`{ Z0{}jy-vw(Jdn*6{002ovPDHLkV1ienPVWE! delta 210 zcmV;@04@Ke0?Y!Cf`7G1L_t(|oMZg||33ph5L;UL{~r^Cy|lBP5nY}IpXP+RrvImp z9j#;d{}0U1?CAMFy`lug5S#`iH8lU{;^wLo78hq=1Zw&6;UmM(pFc3vVKpGNvHAb$ z{rl>KL_`=2Ei4%BT)V~~C?wo8ufB#jFEBAOF|f0=_uE zaT+kQu9`8kx$QqA6BEO<>T;|a@frXE(`&2nY9wd?v0&7IQ3F5#03bgz_(5q0LjV8( M07*qoM6N<$f;M1& diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_handle.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_handle.png index 57b359206c5fe4398fdabf1d2e801e4f539e5a1a..feafc4ce1978e430ccc92d42751e019208ef92b0 100644 GIT binary patch delta 182 zcmV;n07?Ja0Sfe{}!8I*$OqCX!uHGIi$v8<#KDc?bG6H6DcRkP>)KeBIMotw8iUd>ny z0BOE*{z9EQP;(;z%@_vc_DlfUytghWIH0MP2+b%4WOw)fzgd0lYMq;pZ&Ph@GEti0 z2ITfk{D1twfjVa|ucpqdG@>U+iMJVU06)ur27f>ArWz8Q ajSK+oJWa67Xe^BY0000^e|cL)uy4M@+a4b0B3 zO>AnbjcaHj-V3#}=KOaIi>UQYNv{PN7T?s0RWn{M)X$##za|D~5TQWED@hCk diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/battleaxe/inverted_battleaxe_head_broken.png index ac073c4b939868fedde1182bca852f6a9a6c2c39..0ef4fdde6d5da3f9ec4e12954d7f79c0c3b28bf3 100644 GIT binary patch delta 173 zcmV;e08;eMi??V^@z_RSWCdC}ItWEwB17Z)93);^tKwQ&w5) z92QyY92!Bq7gDP0{%hMh)S7$x)FxHc{&$Ov!KxXr7t(9$|0bsaF`+=lD@hCuK5f`6__L_t(|oMZg||33ph;Gb9gpOuA)frW{gVMR{|Bf2~bA|C}OLo-eT zX16plX4E!-gLh_g16GZA4FG`|1T+#ffLJhUz^DNr004wTE5gCLVNL)5002ovPDHLk FV1i{+QC$E4 diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_back.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_back.png index 0d51742f9f5598c065dcd22d5f93724ed1934fad..7321bae866a46dde907aff2570dba2519c89cc7f 100644 GIT binary patch delta 74 zcmV-Q0JZ;s1n&c|tpP$UNklX@-Cl zADXA}|N4GiuptW@f{8Z(q!6S5WHZPRknJEgNw$MD!E6Pw$?`v00XGUp!GHh&O1jGcetpR_6NklX z7>Z#84M_Ad_@5Z^gMp2cks&nf9fOz%FIIKTxHLPMDKnhD$jBhc|C!;?AsL2euRbwM zT78muFT8s5nL$-SlwtlF4h9AW28NaehcGnb1&Lk;|FQXb6pR>x!3h8d10_V%FcPQ$ O0000~yK~(B*Cg1HZU{{C z#cewOL2Qx@0BJZhPvigf{kmX7NHPGV802h_3qXdDWjn~(WI3HGp+5?60{{i?I+8Zv RA-Mnm002ovPDHLkV1l}+F5LhC delta 165 zcmbQja*}1kTE_ZzPZ!4!i{9h}3D%TG7yah{opEgcB_)8s^Xi@ria-9ZHlHtPSNHSa zhc8#v+0=?mc30Xa2ZRcwCL|;%oNZuU{?2HIv~5zta;=gU&JvvKvFg$znGuuMqS^jQ^BH14cTmES*P-0*>aY<|8w8Ea9 P3_#%N>gTe~DWM4fj{ix? diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_fronthead.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_fronthead.png index 9b7452e3891953a2bbc40265140781d74297a78b..a347b21055a82a7aecc71694cc5e1aaf087386b7 100644 GIT binary patch delta 111 zcmV-#0FeL51e64@tpR6JNkl~yK~(B*Cg1HZU{{C z#cewOL2Qx@0BJZhPvigf{kmX7NHPGV802h_3qXdDWjn~(WI3HGp+5?60{{i?I+8Zv RA-Mnm002ovPDHLkV1l}+F5LhC delta 165 zcmbQja*}1kTE_ZzPZ!4!i{9h}3D%TG7yah{opEgcB_)8s^Xi@ria-9ZHlHtPSNHSa zhc8#v+0=?mc30Xa2ZRcwCL|;%oNZuU{?2HIv~5zta;=gU&JvvKvFg$znGuuMqS^jQ^BH14cTmES*P-0*>aY<|8w8Ea9 P3_#%N>gTe~DWM4fj{ix? diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_fronthead_broken.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_fronthead_broken.png index 6a38d37ee0bb04e48897b28eaba59ab5294619e5..f36980ab1a4c5caf23848d40d139fddee47deaa4 100644 GIT binary patch delta 108 zcmV-y0F(c_1d#-=tpQ|DNklX@jJc94@{wu0DX`Jb$S8wI0aKmY(|B{+m-rx}s} O0000HxPscD?oipb$qBP$&rFfbv#&V&;mcKZwoF4iHXvx5#@gQT{m^Rj z`H~@`E|L;J@T1aVL)I~FkOj$~KWj*^HVZQ_Jl9jWsLB7=?l=Pwc)I$ztaD0e0s#Fl BI!gcm diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_handle.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_handle.png index b47f63c76bf97a7f0312bc04060a9823af8493df..7b7be9c4c961f7917f4cea5af317efdf8c6dc4a0 100644 GIT binary patch delta 83 zcmdnY@`HK9T1Ia(PZ!4!i{9h}307wYl`6?U_9p(1?OkU%n*24@&*4yuFD~!9&2ZDE n;GCNE7RLv_>S8~cGBYw*wOX+xE&F+l0SG)@{an^LB{Ts5`THJo delta 143 zcmeytyqRUgTE_Z9PZ!4!i{9h}307wYl`6?U_9p(1?e!|voMs6-*BP9NKkT^gY-b#s zMQ(Zm5FA;0^PtbnhX+>f=J~um_P{E(<%~ed|68XVkyv-P+BLwKxk}^D vSsUXLD`{2%>01^Dzy96zBs(o3fq~(?r){t74kmL3An;^&^>bP0l+XkKev3Hz diff --git a/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_head.png b/src/main/resources/assets/tinker/textures/items/battleaxe/magical_wood_battleaxe_head.png index e8eb69fdb4e5bd1088094ea2d1f7765207cd71cc..b9142d1c7f4ad538b9bcb13a1b94de34bd3c2e29 100644 GIT binary patch delta 113 zcmV-%0FM8}1eOG_tpRCNNklX@-Cl zADXA}|N4GiuptW@f{8Z(q!6S5WHZPRknJEgNw$MD!E6Pw$?`v00XGUp!GHh&O1jGcetpR_6NklX z7>Z#84M_Ad_@5Z^gMp2cks&nf9fOz%FIIKTxHLPMDKnhD$jBhc|C!;?AsL2euRbwM zT78muFT8s5nL$-SlwtlF4h9AW28NaehcGnb1&Lk;|FQXb6pR>x!3h8d10_V%FcPQ$ O0000X@jJc94@{wu0DX`Jb$S8wI0aKmY(|B{+m-rx}s} O0000HxPscD?oipb$qBP$&rFfbv#&V&;mcKZwoF4iHXvx5#@gQT{m^Rj z`H~@`E|L;J@T1aVL)I~FkOj$~KWj*^HVZQ_Jl9jWsLB7=?l=Pwc)I$ztaD0e0s#Fl BI!gcm diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_handle.png b/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_handle.png index 65533928673a4599d0fd8d89f407fc87178c2187..6723b29bf87716a23396b40c99a9ecaf96d14423 100644 GIT binary patch delta 99 zcmV-p0G$7!0e}IJBwR;HL_t(IjqS`a4FEw11i(wMu|4eu31|R8DBrX2q59%Rz?}0u zzcw=>DKpb5$V_#&s%jUwyCPyAWTr?8z%BqF03x{yzPj2?7`XNS-&g3e9TiTM zA_cB|lKkfr&YTAR-9RaYDJ44R`1a{#nK@^A??Do^Rx@{7fH^0|7?!* zQkK<_j}Gt)L^xr7*jEQo1`!z~yfy)~8Jhzro`8w?5t=^t*gt+KK9!!+fiuK&;Q#;t M07*qoM6N<$g0qmehFxrhE}VEN~Iz$g(JuneBWm>(FgT?v99aF zFbtf}XL8>pS5By^DyGvZdc7XT<1wP) my4`MKC}9V5p6Z`B@ChdRk`{iiPmBNn002ovPDHLkU;%>d0=8NJ diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_head_broken.png b/src/main/resources/assets/tinker/textures/items/battlesign/bedrockium_uie_battlesign_head_broken.png index 806cee72cade4a3e9fa4ea983d7e9216be55749f..abd569990af0547e67d4e9c35752cebc8f0c4421 100644 GIT binary patch delta 212 zcmV;_04x8G1MdNlBYyz4NklLHSzVDS>YrUDp7-gC!-EM6ovLTrmUsByafiTd8!VOWHbCHkME=ONjiLL`56ufH`M!aN$$-lM O0000-4@$yVD7#1I5THX@Y}EPQ-kaETC4c| ze#h~6R4&fvGe)BkG))t%94b4T&1%Ciq=2!aC@`5!pzAuu<9{)dBtf&;M7!O_!@q9iB5tA-_k@oF&1E&%Yh9P>r z9#dk6!$IyW%VdCJAPq=;I2;PaPNyT&Se@s&G~x91dM$b1_mQS4JkJxXtU!?*#{mHf z$ldq*Jzd$K`EEFlvD@viSS%#YL%MMPD2l*>SL*bGAovotEX!{U-q~fjT!IZQmkTzV zjfgazPMJc#-^YADm%Yh~LH?Cb4fsTZ=U_0XdA}M(WU&I0jjB-^DF6TdO9egv#y6vJ TlHD%G00000NkvXXu0mjftsb=U diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/inverted_battlesign_handle.png b/src/main/resources/assets/tinker/textures/items/battlesign/inverted_battlesign_handle.png index 9e3a6e00368832d15b2635a8c256944feef86fda..7ad1082442dbdc72ec11b758d2f38eb8c211c41d 100644 GIT binary patch delta 118 zcmV-+0Ez#F0`UQmf^S+$L_t(I%VYTe|33pIm|@g_Q3GgdfVHpxe_aQs|7n%g|H(4I zEi&f6nuS$uT16F^21LdFSGTgMO(oX_&f!u2wd@>gQ!B_cAg!wIe_~1b|KzfY|1^yS Y0PhLyWs}v>Y5)KL07*qoM6N<$f{xcYhyVZp delta 139 zcmV;60CfNH0fhpPf`4vFL_t(|oMZg||33pIfQ2I6qXvu`K*#_azkvUrK7VGgw6tWH z+1A2HvH{#YybP~jzpi8W|G$YW7cej~GB7eRG5lx5X*qra{{H>Tz|6wRz(63c;WR*5 tS%pDPR<`NizrW-eFtfE0zuTbz0FLt;1q8kCk^lez07*qoLXr<7_%ZxKRWjf;>%LdE5E-fnx zEV@1TUwW#Spr@ipkRoaR$ZnrWf}Gc&mo_Z+x$&K~&Y7C}jmmWoX#Mbr%wCW5c8An* zg(Bvc#8@`BNZu^dTD?gsuRU89{Q#ufT`KMFV-0#EKuEMLRC^TA- zQW?BV0#XdP(kzrR#HVK;g!MVL>fzgjb@7Oz3l}r&#v{qLgLlU- zbh@N%n1~fiQ1V4cd?;X~vCLZ14J;;f1oad`JP-3PyiNkF4~s-DvGK%uVBL-^x_KMX p^j`tmp_+NiqpZ7EOzx&!fTL1t607*qoL_OH@%5$A9O(I}Rh`rWpweXVUk=QLt?h?!=&$ zeTi0WT1N}<`v{6cR3Z$xZrdFLoljtDI?lW2o)&Kkt!0}Q{WfQD4*&DxaNsWyfL9xv zR?9N{l;_*|1(z3>q*M(!2bvO?F+JVj`fAMEH?LXgbOgWyXn#!9lf4^+FN{VbVi|vJ zc)q?y_YqWaj@~T?*I%a?zVaM_L zK~$yF?ckiF@qed*@nZEU3WN|?n!85{hzPy;E)F;v40tr(rT_U9{XJl+ma*4AB&y;> z*xo;&EK8hogb=`t%sI9`exluKS7tW@M1(u77M2pKiY6t-hyi8^ONMt25h1GHG7x~_ z$+#AQ($P(G7%CCc-q&fUzHt>-J@2J%b9} z!hli-up3PT84!)5*y=z{3KYndQ7pst12XNNw%1iM$?-#OB`VkhM$?;Q%=q%r;Wk8=&pDQv5kauV!)(J zlQRB+G=iNb;7>^7&j>^m#3Tp@)~WXlIj>47k>Gi|^G%BL!YOuXEb=xpyu-Xa3Xo}Ljek~zV+S_NRkBT*JO4U2XH4%QwlR`^%|;5 z`8I)>^Wxc441dV7jD_hbazI3A%+yifwAEs1rcU$QId(f>q!e+`JfSc{Mfmjfm^{x> zRkADtcOq3je*VHlb)ru;93Ub*s8;b1Ff%L|MN!~@d%%Met0E#4W;X}~pmWx71g?Nf zz<^%{Zbq-yqf#jo0i)MP8wKXC|KPvwgZ=>P42ifvI}Sfu00000NkvXXu0mjfg&n?l diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_handle.png b/src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_handle.png index a069820edeeff435edb146c398fcb268d5f12f10..836426d2cf8b51e85c7a6fa87a69a81883bda525 100644 GIT binary patch delta 76 zcmeBRET3TLX6WhS7-DfcIYEMTaY8_|i+=NeZt14~%^90`Uz{ske5S$qvx$cBgI{&A fr+69?XR($^ZnOu6{1-oD!MS3*fdK~y-6V_+BsqhK%qMqCn!UIzai%#;}poVv>}f7=C|>X`7E z{_4$Vf-b;ofVt5l$_x-yWTni2u5M<622czD!fOn1r2XW$00000NkvXXu0mjf{8A?4 diff --git a/src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_head.png b/src/main/resources/assets/tinker/textures/items/battlesign/magical_wood_battlesign_head.png index 67ea01929a2745a7920546755cfa16e7e1a7dc95..12eca2520f99609e1216a09bd039cc8ce38d32eb 100644 GIT binary patch delta 128 zcmV-`0Du3M0;&O!F?nQ3L_t(I%VS`m2B?m*{Z9%`^fLI5VZinMy8jQ&)A-+;>wy!4 zcYv6*G*2K?DF~)Ci^XI6GVb0000Qm1Y^hw#-68<8i3tt^tU{ z6whzdao5CQO0{mVoV5zj0^o5d|NGBVJx8?GFe?K2K0b{`!7h z>;}LzFKh_LiD8CdHGq(2WJ53v0Qn1Mz{PDkU<|Se#s{%MG*JeS?E+XB%&hjuiE)Mj o$N*62k{t^m0a7u;C>TTl08`xeT?W_MFaQ7m07*qoM6N<$f_~07DF6Tf delta 240 zcmdnMIFo6DVf|%K7sn8b-sFS@0tQLKYx*|*?f1XDnSZ|Iv;5r$P8a|X1J`Qbf))m15i%FM^etfz(9c~!D-r&72}XJ)YbB*>@_ACJnn{qEl)$#W*psHWy)dt+vNQ|rS+nx#C>kr!Amh#vge zzhO7mJJ#UC>^%AR>QaAv{LSz8=h@qEHlWCjSdi5Tr#>(o?mxjG#x22S^ZSFOl<65B n9v=Myse-3^?0!1~4JI%!_+1b7PULyg$N&VMu6{1-oD!M<(%fww diff --git a/src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_fletching.png b/src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_fletching.png index 8ab8093984906a46375bc2ffe8d76d6314d637a7..d9834d79b15fd37c8a38d18648ec2f038c728ac1 100644 GIT binary patch delta 100 zcmV-q0Gt1&0f7OKBwa{JL_t(IjbmUK1;ZK0%F6yHOJjI=_C} z;tb2k$iUD{wl_e)&(H6_k&zL327p{bk?l4%Hssq*cK`sSq!_FKD7E+i0000!Ji09UCezlJd>} sYjZl(T5s#%FN|lz7$N68mR=lh^7tE48P45700000NkvXXt^-0~f?YB@+yDRo diff --git a/src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_head.png b/src/main/resources/assets/tinker/textures/items/bolt/bedrockium_uie_bolt_head.png index f28f9a0701c21ced4816cea6687b98c98b138647..bb02b44299e2bdc161af3db759b1ed8c7d275533 100644 GIT binary patch delta 84 zcmeBUESjL=XX)wU7$PD0_Mjs#g8~op0j?-x)y)Bxn+72ZqJEx1|@$Yq87+p00i_>zopr04if3UH||9 delta 112 zcmV-$0FVE2jscJ)YE?-@K~#7F?U1_(06_>uy{*PTOR)tDu@MWiA3YE@*v#+_*1#XU zQ3n1OB2w;N`}1cvlgiAs)`HB0h-kLc1Xk6)iilulWA4x=umY@0y@-SeXlaL%W-cJAu$WG zl$27U-unaM9oUXUGx*jTg%B>y(7Xh|?3|-926^w_nh~%Fa4UALm5$^1*bFnU`~c=s g3dIh0M0D{}XpoU;tec5&$f~^~nAU!ubFI002ovPDHLkU;%b|AL_t(I%VS^|av(A%@4tOez<;tdho)!#_l}LP4N1!+-GEtZ x*8iWnd}VD|X7+!woxg40zW)rPU=$2W003^i6pcP^?^*x=002ovPDHLkV1k{vD5?Me delta 123 zcmV->0EGY60rmlqf^=U=L_t(|oMU955U|kQfXJM@|IeO1VmP>N10%@>gr;Zy|Mc-= zov4Up6Ui=^wPyYQ-@kv=9XxcXY1QxPh+zN#002ovPDHLkV1hYtIu!r_ diff --git a/src/main/resources/assets/tinker/textures/items/bolt/inverted_bolt_shaft.png b/src/main/resources/assets/tinker/textures/items/bolt/inverted_bolt_shaft.png index 6552e25ed9ebf09b46dfab73d7f5a2330c00a27e..384f58f12f07248811d24782af5d4da2a6c086c3 100644 GIT binary patch delta 139 zcmV;60CfMo0)+yQf`4vFL_t(IjqT9O3P4~GhG7@XPKlZ=In^I>NLGsE_%rwSxdyXP z%DaE2uQ80jcZ#M3PT4?&lX-(%w^V8U{6NJFGl(cZ1h`{{<%gssxMzkPr_@Vkk9@*a t8LbjL@C7d`Xg@aD$32xpOYwKR0bw^giO82@RR91007*qoLg8*7>YD0Jng0G5w&OKmE>QD@OIPbuv^1J>1F&nxX~1Hj=8M;F z)|qK*G{xeu8K(iuw`}@<>CU}6OEs0IU;>&k3|O{h^Z(2D9z52WDabSh5}_HxfGc+% xFqkVyH~9wy5v3W!fVP5MqBUYQfE+-v0Ra1uJS;M-od*B_002ovPDHLkV1kK+S}*_r diff --git a/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_head.png b/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_head.png index 3b0302a0f0247fca5ababd8702146cdfec90754c..8d162e00ff6efea91d4ea7fca2defbc86b997c07 100644 GIT binary patch delta 71 zcmeyz{Em6UdPaLKPZ!4!i_^&o5=9CZPd~8dn7sDque#VzJPespHw1k4y)|%di(Am& bG?9_v^-Uq2tEW#WFaUw4tDnm{r-UW|Ti6}d delta 87 zcmV-d0I2`&1O5ZBuK`awNklam%)D+pNUk>Wu<>n#287@>|mzM taNyKkhWXnr5Umfx5VACmf>A(o008(u5L7Wu{(}Gj002ovPDHLkV1nOnCBXmy diff --git a/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_shaft.png b/src/main/resources/assets/tinker/textures/items/bolt/magical_wood_bolt_shaft.png index e9e0caae15607d7556c0eb5e655c0bd24ef45e2e..cbaf17aaf6aae461c5d4fd6642786327bccb5bbc 100644 GIT binary patch delta 82 zcmZ3*@{@VPdPXl(PZ!4!i_^&o60BbsJLA~?^Pj!^!+&C$fbX2 zNl6L$hJZAxtE*Gy3Xo=yD?&m-$TtWS9!^e9|IN(Izy^`+5)h7yi^FdS$ToZmU*Vi3llpg}@Z zKuh>3tV9Myq)K7Lmw@~C?sU+#{%Hb?vAnKp?(OORo?xw|d7ir=2V)q9EQH8CklT@6 z4oDowkz$NwjQNO_aCM(dfN;)9YfVb2ub>kEWmp;LG))vjphsm{NJ?4t!P^X=6BxE_ zqm)t`f@=G|HzyAe1XxY4Z}i?1Ks5t~3DshFdpPF^!sQn|0sq-RZ{ne$umAu607*qo IM6N<$f~Fx{&;S4c diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_blade.png b/src/main/resources/assets/tinker/textures/items/broadsword/bedrockium_uie_sword_blade.png index 9706abb96e2bd73582a10caa30bf615b40d08804..513da17d3f3adb9627a0f2da9909f71cb4af9cb5 100644 GIT binary patch delta 145 zcmV;C0B-+>0<8g%B!6^CL_t(I%k7cD2>>As1O>q=?7&Y*8F_0#_K<#aY(Tj0-hJ+I z3zARP+0{}WsP`T?A`-N@)*5TAFtfabGJ^>7-a99i05nyNF-A^`j%9aGGUl8!sMxKw z?2OnH8Km=IuR0?E-T6+YIv;@yGyc8&`nWFTZA?f%z{l+X015yANkvXXu0mjfTu?y| delta 235 zcmVLrfq|*1 zksz1|8qM(p!C>#ui!N|sU|8n;W)yySVHgTwp6B7k=1ys?B~4Q-%Yv@!pznZ_B#|u3 z5XUj*dB(b~xEz7Dec#8nZLn<{<2Yg%26ZU{!BtgZnkKlei)5y0(6;S0aoV;lOY%II zvMhyU=h$Bz6h$FQDFi_P$8pg2{cihA@X-d9j?4tIXXZ1Qy^(<6<5W}@5!7{UoF$2| lqA1!k^X|rh=kt#?@CM!pF;eS5ncU9>0%LZI*a55mXM=;Rpex-NX*hhwlSn*01;Uf=~`y-9PW-VOi&0000{y`*B2Ub35DJd)bSX+{!*oKB6B*L08~}00000 LNkvXXu0mjfc(g7t delta 165 zcmV;W09yZs0l@)~B!7rWL_t(|0qsyL4!|G`?PhUk1i@hu9EXJaaTpH41yC45mm(In zOt2+$kd*ZEUSC^SZ(ZQG3rH!^7=tqc`yE7N?>#7`?xn|g8?)A0thGXG4PuO!+K3zd z6GY04F~~VXO6kmx;3vPY;G9FwIcTk4k*VQMW0z9;*dc^zWga4T6G9+a4?cVcwlXM( T;vV4D00000NkvXXu0mjfiG)Tm diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_accessory.png b/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_accessory.png index 467962ac841e441d8843d71489381a780a91e37e..f35c6518535515005d7f492f8697a5bf59403108 100644 GIT binary patch delta 196 zcmV;#06YJO1HJ-~f`6w;L_t(I%k7fE3W7isMdw3X1n&BPb`K)LRWgQ-O$34qiL_Cl zI?m_aKATf`9NyL_t(|oMZg||33pIfQ2I6qXwWFFk#)M|Nnq=QIH=aSq5;j zurR#%@}+L#y3POdgM5iL1a3gOpBLkV^_%}+e)hC(+Qx1Fv;4h?G6W?IIGI6QMuuO1 z{}Af{R0GoeJQ*1_ZU2Ad-u=4XwVVDk{$pe)3dQdoj935}@_%#V*8k@pKdMs_5oKs! zz5ah?Xdq5QutsB^zc=Hw&D;L}{`-&N*{4r+eZUyP6+0}8w(a=;>(4)i6hG8J%kqWr z+t+OT{~b@5urL5KZWbj`adhc8^e~$5P$q(@E2%+iGp0y*WZ8fsly2X-mYKt UhqW!M00000Ne4wvM6N<$f`uNA!2kdN diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_blade.png b/src/main/resources/assets/tinker/textures/items/broadsword/inverted_sword_blade.png index cd5935449ee1313320d15254d434ea656fbe2774..5a5586e15cdaf126c9882cf7405334de5730fc5f 100644 GIT binary patch delta 254 zcmVfQG{=e(mMBAwP*p3by7U+8vfhGz`<%T);70b~}@1dsLy z@)QA~KSV@qVtdgb(AsRtk=X%wTdj((@ZdxU<`nDVBhXOEbsfm>y3ru%bYZ z+qT5haC2;Hik%hUj|sfh2H7(?8o!CHx&t-y7x;m|73+fG+3dTQ-T(jq07*qoM6N<$ Ef}xju2LJ#7 delta 296 zcmV+@0oVTb0-ytsfqwxBNkl@-xHNHSo~&Rzcx9y(GdDJ#S9`Q1APpd*NPLI0+$|BoCvP^YA<%<%E`8wPJH zizaU;Cq|+S=-sg8|MtzB>eRKg7+$@2!QgFg+vMl$#0ZijXn#Q4inagu@7+@;Ei1?H z_SGwfU{~j+P#0%Lm^@wsdN*$Qzjyb}IzeG!hL0aUFa&$KqiDu!z@!~Jftq*MiAqQ? zeE#@>A@dk7)UH-p!*@{}%)STMJISXs+=PV@N3sY9E z`fn8)RqK_OQ)}uMT-yS*nJ5D$tyuYg+N#yHp+yz7eLxogT~_g*=vbHvwK=q)tkyOx zrgq};mH&y3#wkFXfw(p}zqEGtsx`G!R;>C@ayszOD*SIA5c+@m%GLj=nvg~fpn(AZ X3%}rIeFQRq00000NkvXXu0mjfJR)rX delta 275 zcmV+u0qp+Q0*nKYf`9c%L_t(|oMZg||33pIfQ3{Iol95z|MTxZLv?H+(E9(RW1sOiPeZ%ng?>`2jUC_O3#eY^N#yTlEc?KJE zQwE^crkaFk;=C|*)$0EnHf*jF5ENqg@bWnWGc$8j9aJ+x1Aiv3T=k!YiK$LnR*u2a z#DD=908K@a;f%;?a2hZTX!DA-8|$Q{Wf)#Od&aro`Y7g0`a=&^~ka|5Fz()FnnoHzkG! z6Qvn$07&z?O`Gddlj54vf{E7*HlS_#tpDpaZ>md-iv?;X&L-I?1_+A?F{C6UG-ZU5 bt{DUX#jZ5e3#eJ$00000NkvXXu0mjf1;bFb diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_accessory.png b/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_accessory.png index 33fd3eed1a1a51093e63c0da1687a81dd292efd1..8f50755a2209091a0e4da62b62db00e55c99a224 100644 GIT binary patch delta 94 zcmX@X(#o=7J!6=or;B5VMQ?I~1Zy*gN|odv_QWop7v~BW-?0(?&)E=XLL| y|Md@?aUjNNV|fQxgp;4@3(>B{{AtWP*%%n^&3EkmY2P2u00f?{elF{r5}E+;jwI0l delta 162 zcmV;T0A2ru1jq!iuK|CANklzzvwc z?E>Sqd#@NA%#=wogoy|>cmWGCXa2Sej0_A6|I14MGB7YeTmcm$&H#i4gZ~a@$}pk- z_zb}*0SgB$B{7C;_g>+438CmCB+r=WW$>S%EqDME0|NuYwR;+`NYw`i0K{@MwSvZ_ QYXATM07*qoM6N<$f}r6)_5c6? diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_blade.png b/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_blade.png index ff346fb6ca5cf3fa1c6f0890bc8a0d4568f82c3b..0254c60f3ae5d5bc9ceb0988639f9fb87288bf4a 100644 GIT binary patch delta 84 zcmdnM@|$_XdPW~}PZ!4!i{9h}1!k2h$v^Fhn@q}|@A$iaU;OkE=7d@NXD>5cR*^I~ oVyd6RA?GzKu|etV;)Zh!44sMb#dEJF&SL-qPgg&ebxsLQ0Iu>ONB{r; delta 138 zcmey(yn$uIddB)3PZ!4!i{9iE1!k2h$v^EIXP&sYW~s`tfUsZFOPCX8o$Zw~%!$-K zc>n}F`kqaG{zPKk-Rh$T^|x8w7V#WdI#WaZ!DXKd3^URU1>@Sn^X-x|j%70#&MK60 oSd+#UbI}5%Fv+C9=^zsWTSvfmja~nbGXR07tDnm{C#HlZ06FYDGynhq diff --git a/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_blade_broken.png b/src/main/resources/assets/tinker/textures/items/broadsword/magical_wood_sword_blade_broken.png index ec050816be58db3e4eac238a1af94f021fb74f63..1393ea8235f25ac601b2448c0e6c0d7273f7bda7 100644 GIT binary patch delta 95 zcmV-l0HFWS1cn5#uK`y=Nklfzopr0PvU`f&c&j delta 109 zcmV-z0FwXw1EmD8uK@vJldu66Ut-iUVbknjrp$2d-YcRkW5lNUz^S_o^S51K#H|gB z0f}A)|Fx9F7_QxWMYLuVn-9&?_@C%yK$O2RG+*DZOP*$!0c2}tU|;|Mm2oGLuEoXY P00000NkvXXu0mjfl(I8o diff --git a/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_handle.png b/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_handle.png index 24004fb3b5dac922de0aba79b0a0a5ad68fbeb33..fecab16bf2dfeea8df37eeb70548741d3c0a2bb1 100644 GIT binary patch delta 92 zcmV-i0Hgn&0eX-mRzXQbK~y-)V_+BsqhQd2xVX6gQ>IM$PnKo{1%>}!US9tV3=IC0 yrP;{H=)a7N40)PC&Sqw2CeP_0CzE9}r2qhb78UEC{E5HLOf diff --git a/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head.png b/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head.png index 86a03474e2695b521eec44144cddf350b6ae82c8..f82f0ac8bada670cb1be5eed1536d563e290be2c 100644 GIT binary patch delta 122 zcmV-=0EPeF0ha-gBy(O#L_t(I%VS^|2w-4f@Sh^hQ>IM$PnIDvGBW>-jEw$kYiomP zk_`z73HjgH*a&t3h)uH7y}Z2sgIoc^WN9Yb-)wAbq}z&YGs*si*$mRm%*;%FoRj73 cQ9wEX04H%V-Xy;6#Q*>R07*qoM6N<$f=-Ax{{R30 delta 194 zcmV;z06qVg0p0TBGwksrOEAE*W*s zIWoqO5Q0)l6l2`j3Lsf2MLB2mqEgD_vJ@*!TVZb2fPuqREQ?_{A6a0QCVbq3AU_*Z=?k07*qoM6N<$f`N2iK>z>% diff --git a/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head_broken.png b/src/main/resources/assets/tinker/textures/items/chisel/bedrockium_uie_chisel_head_broken.png index 728c4fcf1fe2367504b4b776a6d00cb06927d78e..1b007ec20619bd7fba486cbe584c8055c66c9646 100644 GIT binary patch delta 92 zcmV-i0Hgn`0eX-mRzXQbK~y-)V_+BsB!Q5SkpE}gK8TQ@-B0{b8T7^t?Nwn6o{4;|}dy}1W xP)bp~16&eQN^Fd2b{>qHAP}v8dYdlr04+}(Lle!HQvd(}2>?k&PDHLkV1iZ3I5+?R diff --git a/src/main/resources/assets/tinker/textures/items/chisel/inverted_chisel_handle.png b/src/main/resources/assets/tinker/textures/items/chisel/inverted_chisel_handle.png index db8aa262c5771ce0941afee7bd9f61e875503f0a..e7f7d6faba3f143a2a495b507148a181ae5b1fe3 100644 GIT binary patch delta 104 zcmV-u0GI!W0^uNRSM@0~{9mRm&#Y_I5x^<_{L0h{iD-_H= z8B?24*GRg*%ewmh`=?~omUMKJp&6(t2&lQNvyXJmC2bx511FQyYAd?>$dB{VrdIMb cj{@QW01r<-E^2Z?EC2ui07*qoM6N<$f?Kv$HUIzs delta 247 zcmVfV|J=3~MzRb@sjB^d;lla4)SCML zvs)S&Nira*qWb^oGiT}q`1u(wUA|nG+t&4;Bm2{E_!++c_{CsiV$w9Zs*HFS zWHmJZzk2<8ow~Ya6Du1l!_?X;;=`bzt@Hn7pp!M#)thEC)o?Q+%Mmo7tgG+;&0DwX z4E6P!dMZj8(dF?PP}b4?{|->Ix~f`JS9uYJX1oTJv~~Qyefu`h&l*h~W!N?2HK3=e xg0Zxz^*=t%cntu7?z(Ecnh6>}3>XFm004ZxO)mnBmBau5002ovPDHLkV1hS5eWCyW diff --git a/src/main/resources/assets/tinker/textures/items/chisel/inverted_chisel_head_broken.png b/src/main/resources/assets/tinker/textures/items/chisel/inverted_chisel_head_broken.png index 904746ebb31c524076f56ccf1abec9605bae3ad6..dbe6ddd1e181f718798e6ba56b0d1b21b3a00712 100644 GIT binary patch delta 119 zcmV--0Eqvm0`dWnf^b_&L_t(IjbmUK1tftfOBVkpTl0jaOaBL^rqxa*$B>@I%l`W% zr`FC`w2*Yo?eiD?cZrOy?OI5N&5bi>|91!tuLaR0Yi^k{@4tNrQ1gsA4QZWRCk002ovPDHLkV1gX7H4*>- delta 173 zcmV;e08;<*0jC0xf`5=nL_t(|oMU955U`9e1Ewrl{68lqmXRz2CM;e0fA4{VbyINQs!vbBsu`~VH7QAqjWg!_uO`pHtr@QYAV5enK?8^Z b!@vLlp&&F5Q2yBE00000NkvXXu0mjf-poys diff --git a/src/main/resources/assets/tinker/textures/items/chisel/magical_wood_chisel_handle.png b/src/main/resources/assets/tinker/textures/items/chisel/magical_wood_chisel_handle.png index 9222a3fc584999341a1f19c3be72aad4230e9679..92a7fb0eb6649bb9dbb07c96e79c7d79a1d13258 100644 GIT binary patch delta 64 zcmZo<`Nq6qEhD4Jv_AgUzC+FX^TJB0C)xY<#ZR|6YruTsnhz%fgKMDF UVwq)gO&EZ{)78&qol`;+09_Xts{jB1 delta 75 zcmV-R0JQ)11AzpvtpNc)ldb_4Jrkpr37cjuB{7Brr|yzx^Pzbf{}a6oh_W3+^Y#6@ hRO&4=b`{3pv0nC9#Ib;&aXq+wx0 rFlCxSG)0=p^7jzbOqB#P3Wx^)xn@4U_Z;4700000NkvXXu0mjfZ_gx$ delta 147 zcmV;E0BryI1GfaQtpR^^NklmdKI;Vst02(S7E&u=k delta 92 zcmaFH+{m(FEn|qir;B5VMQ?I~1glD;i+=O}7fC)#GRh2sj~TQ~6gkW8cQi@j&1hEKN*0))78&qol`;+0FwVBB>(^b diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_guard.png b/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_guard.png index 10f2639a37ecf5387f0adb6b44d3885bc582c4d0..dee0483c2f25c60bb4edb998b5bb356fb3ba63fd 100644 GIT binary patch delta 89 zcmV-f0H*(o0e6rjQ$9&VK~y-)V_+BsqhQbgYisNO>FMeJDKfyz%j>^^fx&-@Tmmvc vMn;A*L)h5Z{)1dZwgE~?O8-HaZV>XAne;ZfQ~%!?cihO#!%juJ?Nd+$9jrkVv(* P00000NkvXXu0mjfTCXRG diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_handle.png b/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_handle.png index 336192f56fcc5b80b65c5a65dec7b82ae150eaca..52c528472296bd89f806ca756a503126175500c5 100644 GIT binary patch delta 101 zcmV-r0Gj`_0fGULBwk5LL_t(I%VS^|1*2e40wpD-|9yRZ|H;y9ZEgKuTU-0Tfq}t) zvTO!vl#!7kU2}SRI@sorkdXgmIXfsQh&*S50LaN?IU5Q9(B2xJGPM^?00000NkvXX Hu0mjfp-w5> delta 152 zcmV;J0B8S#0ki>-B!7EJL_t(|0qu~%3BVu>MZax5xPvEg3kPx=M{)*-Z~zrNr=(D@ zH``MW1`-mIM?N1bmIMEEz!*az1e#SR#zW^El~N$3L`vzg8}G*cxCj2+dq=GmIp-;u z*^P_$o|ICs*1m$7-C4E}06v0JYzy)j_H%9^i zn}gU~a{)V_FF#SKFRQf%T5E_g(s9m#7)GG?4z*U8b3)FU9udPSB?3YS;JugI@gl-& zEi#WW0HcUuY};B3r4(vgY(~r8n=&&j&dhCdW@F5q8R64>l`Q!*BaC|&@0wwr_SHw> hVzYQ)Z&B2L>H!hpX+tnyv~d6c002ovPDHLkV1jQ5O8Ni* delta 292 zcmV+<0o(r00lor|BYyz}NklRj$n*|T_GUwmokpyz_xAJ_Z`c!U>FAW)B)Mlbsc3{!hdyL*tQKtQP8&Sb8!L} zMZslR=4qPpIF32J{dE11g%*}13F^AWx~{jFrU_lwoiL|DFq4XDn%^_`eGjT>X3-<^ z-3~~Z7Ueh&G);r5stCjI;mjuozm-X~X&Q2J>J#deKj;!c0Q#yd%P`L~s;c@IOt?E{ q-}gBY{k1RxTpbD;uH4B!7%aL_t(I%jJ@>3BVu_MFXN!*jv~*gQcZ7iVL`aD_{5rA5w+0 zNt1&^1fS2ZUe}j3#t`S6lv1=~jADif_1pqfO(<7YMe{r>48uT8(|1^D8n=E zUDWPYZ3ZA0MWLo$*EJo-p>=sJq#eSu@B8YJ;O?)<#(No}G2y=x-_xLTH5^Dp82|tP M07*qoM6N<$f*Fl-00000 diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_shield.png b/src/main/resources/assets/tinker/textures/items/cleaver/bedrockium_uie_cleaver_shield.png index d2f4cefa0839a3d46b25ae6c623c80df40b41d92..7828cd71bbfaeeca8bc71d1bd402a7cf166b3bb8 100644 GIT binary patch delta 129 zcmV-{0Dk|40-gboBzk2@L_t(Ijn$H&4FE9=11nYCB0L}@GZ+?klrE6T{ip-f4_LQ{eg&}yKD5S;@+EUt$XvFlK?dGG0U0981KkZ=7=Bw_TKfj jrMC}RD(py}=s)!UY~45@5uyXd00000NkvXXu0mjfJH$Ez delta 233 zcmV<`!nVAV8 z7KFr*$W?-ZQqe?(PR)>f#r}S_@#|rC3*>oD(=>tKDNt1vjpGQ$7}(VUS(cFy0_(bB z7zTE!14T~L6k!;mZCef3*Ee01Wl7t%q3?T5HlBwOzSo%Nd18Ju`#eWX%^U;)B}qcZ zrzN~27;+RvXqv{GYt`JPA{RwLob!+5JqvgmVZUnI%d()ZYe*@*wW*^Ey5W5oPv00000NkvXXu0mjfxkzWO diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_guard.png b/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_guard.png index acfe757fb4fbb6f58d0650307c265753c6fb1561..db75275119e928d709df42b63a27ab0c0dba6530 100644 GIT binary patch delta 101 zcmV-r0Gj`b0^k9Vf?i2UL_t(I%VS^|1*2flfQqi3|5e>R|H(F>s=M!hXm;NJIZGD( zr^qD^;gSDmEn7mFA&~{e|LZ1BA>WX?NmKqePMb-YD@XwVB5oVMPdX#)00000NkvXX Hu0mjfecmjK delta 144 zcmV;B0B`@`0g3{Uf`4;KL_t(|oMU955U`9IFlqqR45;Yp`On12z|dA&!bp|@OpHtn zw;w!Un6qTj|CE?Gk_-VG&{kRm*7W*KwG(2u2{PDk(BBv#=8D089g#@`$q;1^_uk9H>Q>1n2+&00{s|MNUMnLSTYCl|TUi diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_handle.png b/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_handle.png index a52c42ffd181ade015d379b6b9e23723a3d295e6..e81dbf46c704742e3e16562fe6078a07edfd0181 100644 GIT binary patch delta 114 zcmV-&0FD2R0__2if@@YuL_t(IjbmUK1*2e4g0_WA|GUN}{wGUw!;CrqBT6c2m+#(9 zx&h6z=lyq&Pp(}tGbN@%?7uBvHOY`jc{~g1lYL}9u83Y#X+Wmhaxtf6h0CE~A Uz^Oewxc~qF07*qoM6N<$f;yZvI{*Lx delta 147 zcmV;E0Bry50gVEXf`4{NL_t(|oMU955U`9IFlqoz3}{=p^#A@ndl+^vp3g|K0SzE|#zZuQxVjQ$JKTVlS#$qiy>g{4kwnd416pR! z|G#(7?z)te#HI)mHG>V1lb2yg0BVjVLo)~f0IBCIj@_@xKnwr?002ovPDHLkV1j%1 BL0kX; diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_head.png b/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_head.png index b37d55a83345c64006f54190ef71bc451e60025d..4a082e883dfdbc75882b535dbf493e6aefa239d2 100644 GIT binary patch delta 261 zcmV+g0s8*X1O5V#fqww!Nklwkm_ z6OY&w>3ms}_<^s9;(Ll9>_8rWIX5?z%008^f^s1!6`X$gA zgXslZDX8we!SX`{(Fh}Kp{FpyYbojR)j2o!Co@cU3@I;xYkn^_TAr`)6q8-5nuQr& z9VJzpZM1qG-oK-BbH)wvMo4zbtZr_5 z0sLW%Wwyt$_%r|OhU1ccv&MRCSrq2@8igrVI2XJ;z9#24;QyBs_{MyBN%XO;00000 LNkvXXu0mjfnS6aV delta 344 zcmV-e0jK`{0?-4HfqwxxNkl@%%5V3}nrLe3P5JG`+2Gm7z;0MM=!GCQWtK~cqHnM?xZD5=O z*YLfDH=dBg*>oma4$`o@0u!unrn=dKwu|NH7hEa0i(-|I zXM$1!$i=`I2T!j(3jV^Sg8ac&i$o9&ADtY7qt`z`jvNF*0WJt+6sqZDE)c?iunQQu zaBiEjR{<9UX;GSi?btvVUH|o&ZOLB0UkMikpOX*c;_^x{%EW1x%WJ>7xm1wn?e)cY q3PUxl0hbE$4F9>gmY_+t7JLJHVOJ}=Od*>90000&+?d<>ChKAJ!=NHvB&09d6=G=~+|7lHawL12W z|E&W>jSYHh`o>BMQSnKb=B(0_nh14oztHbJ4ap2?}T zd0l10OFBn9s`2PP_qW%^m;$ z{rg*Yc-LMAK~XUVaT#d_Jw5#-ayTs)AA5&i=oUxOkm_hzNs*x_VPZbOa+o z19Cfh{{Q^-t4_z>@jt(iaGj8t1cSc5UQ=CC0wYKsuK|VKeSiP^ON)RuJN)P3<*nlt z5MHoj}{9b3^=<=UOP_T|yP=G;IU9+hpCzBCb9aaNsCQbX_l9$P7 z?Be!cSX8u*UqqNeMnSP@Qdtorx>^ha+UCsr|NYyKI&(MA|9nD1b%LTI3~ImtYstyN z(2QX~*Mdd=%Xbpu7_Gc~{tE(a76jU?siEFfmzjZ8Go}mv|7WoG^Z(ByAXq0TB*dVs zq=Hv7h5==X@r*w4iT^>GRn^phn$z)W#&iJ?Y*{#;v19K1{}suJ1T|wd00fBDjMD&8 c0L2CX06eB;1BZyNLI3~&07*qoM6N<$f&pK;;s5{u diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_shield.png b/src/main/resources/assets/tinker/textures/items/cleaver/inverted_cleaver_shield.png index d769b9ab838cd062104f3701f243cdda53bc7251..73bbf6799277a54b105216948f4e877d4deb24b6 100644 GIT binary patch delta 172 zcmV;d08{_v0;U3xf`5-mL_t(Ijn$Ds3WG2ZMZLF<6h-JFrIH%N3Tj#@Q7Pg=jb3hy zf(OWKN#@yTN;xg}c&oxPYND=M1#OiOvy a|7HW$j#<4k5iPp_0000deYSYFF$^&lN1zaBH4hZ znX~_Mad6bhh>12uczQ6BWI!`WGbd-Aw1@~;Gf0eR13;R2xw-2kg@u~Jp_+*{pkeCt z|2#mOrGPevdAKnm%Mmo7VG2+)7bndgrnB)HP%~lDe?Fkipm-*v8LI&;1$m6Cw(t0l&)Ikl l0D&;1cqYpLQUJvU003#MJk!(DF~a}=002ovPDHLkV1neMYpVbN diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_guard.png b/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_guard.png index e688c1239fbfbe3569b97e01abe43cff16347db6..c19e5098f09936f9ecf1ebf861ade51b8abb356f 100644 GIT binary patch delta 72 zcmZo>dC$CIJ)?uRr;B5VMQ?I~1nc623k@#%&HojACNkc&%$p*~#B}}p>!3W2qk0Q1 cY&=*QCaf0Y_L}_lHUkiNy85}Sb4q9e0MsiQSO5S3 delta 92 zcmV-i0Hgo!1A_#xuK`p)Nkl*xuOPG*3nvRzlNp%Smy1=!2uSjtKcDPLbR~}1H(>3 Vg;RIeTYqH$0#8>zmvv4FO#qxz8ub7G delta 100 zcmV-q0Gt2$1Dph~uK@vAldu66Ruik930<>;nKHwHQ+J8BkP%t4mXa95wR^7^=5M>e zh+i8TNc1xJe`ub@|3ohXqMeSS`TBlc@-)K?AX_s70|NjfBp{Gg0;YQa0000W$-GqNFMYerA53?l~s0A>`4cxUYfumAu607*qoM6N<$f*b85>;M1& delta 149 zcmZo<+0C+HJ!5^jr;B5VMQ?J#0s(_bi!3gleqeu-O{Gfm&-EaohE z+{U;h%gwMs=4?c)g6=W*Eoo~MK*n!VvF>4H=&*`qH;;zopr03f72 ArvLx| diff --git a/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_head_broken.png b/src/main/resources/assets/tinker/textures/items/cleaver/magical_wood_cleaver_head_broken.png index 363caf3059e146ddb599deb78407fa2db2e0bd67..09f6ce9ebfe1997d55d699b7731b930e0650bde3 100644 GIT binary patch delta 99 zcmV-p0G$8U1d0T(uK`;|NklO@bZyHiI-TYzQXbW|B3JG@FqPAzL%LHyB0^000*uh8EDcw-f*X002ovPDHLk FV1jvrCvX4& delta 176 zcmV;h08jsl1l9zwuK|CONklsT~z+mv7iBy|mn!CE0iE{z6%^$z~K+(*=z`%gl1;{pk{PKfARY4R*GXuUr zM7LR0L6qUZskDT&DbsOAJLkzfRvTVC{lK0X2!t(X@t?i?BR=fcbeq{AR($)~(#s*5GfhKN*J55E zc|V@*6A^7$l!%gyh>0a3GwUP(Xd=@0sn9?6a*EH<-P4ts6U$XpwHAHUt?WD!y7yx~ Z@B&)I7`rNj%n$$o002ovPDHLkV1h_JG5r7l diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_body.png b/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_body.png index 7f2058ed0a9fd8b80784bb9f1b0575125a864c5e..2146e4eefaa1c2164a08b9928053353d5827f236 100644 GIT binary patch delta 144 zcmV;B0B`?~0;~a$B!6>BL_t(I%k7b|3BWK61P#JlXaIu?8@z%h&@gU2y22aMq|2Lh z5eQZP+`m%#=ew!3#*ui=8Sc)TsA`l_0#`&hqt;rOS**1<8W`l9w-^hW*CxR4y>AM- y7l;rAoq&oi6^jp1QJ%#fzj%zn$GJ(+$pwR1K8EY|K4$;`00{s|MNUMnLSTYmz(6Me delta 243 zcmVn^ZMvYDNo48ec>(19dL#2xyF4#ei7C{R_Ek;Kvwuogv;a9tPk zJYyV3?E9|8YKtUbWLYMHAV8ky=(-MdU4P)81YSkcH1Ir6LTspN7zTwzIY`u7vTa+W zX^OHeu`CPvzE_kO74YqG9E-MXaZHEfILZj4f)h>o-21+dX_`nTdu8Iq-8hY(^b delta 277 zcmV+w0qXwB0k8s)B!BlwL_t(|0iBYu4n#l@hUYHVdIAlFL=>W-(Wn$^ty1khyoAKN zcmNs_4Tb153WZ`XGl^~7ZFWg!Gduoo{$=(B5>HVStZiFZmW8XwaU}N5D}NHpvY4*x zkR%DDX$tc^gX1_51OY>Yx?u7v5YF=)s;UA_)40U8ZK&&7$bXW!EK3&0F}vKTD6^n5 z>Ri`lhGEcAaW5576sZAHT?HckBhY!FX&Q1Kh5`4=@d?8a)^&w_-<4qm=o7Lm!~A(DU)ASU bck&D7v{WY_2oBO$00000NkvXXu0mjfu5^93 diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_1.png b/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_1.png index 0e19f9d341d1b92cf26787b8d677723fa6069284..b6ca7ef1660981038fc58fe4b83110ad8c91e916 100644 GIT binary patch delta 161 zcmV;S0AByF0=)r{B!7fSL_t(I%f(Y64getxo8ccA3_+u@d}3eN5BT~n6+@5{8_DIG z)X{acK;(dk=omvwDVyX44zIN~Q%XAL)Yh81#kE%Ly>BwJZv%+o1`$PIcZ74!IVMI} z^b6pOmBFwWJzGWYgx{RQf!P356?Qh*%L;dWUg2te8-M_>2O0pbkMR{A@|sqps~HpZ P00000NkvXXu0mjfag;_% delta 277 zcmV+w0qXv}0k8s)B!BlwL_t(|0i{zr3WPum%`RIC9zhEQ5lcHkJcNy>@CF{n+H2To zWg~)(7B+&d?W`}b!+ynag=Avpy(Gh%xzK?xO;gb{4NcP|(S6@D_bM|#0^7EQuIm(r zAtgyd!!VF#S>$=10EMd{_+}u3R1^hinkFHR<4~UG%w;Ec-hYBD%S2t*v@8o%Rke$K zp`tSquImcZGpEUl-7N?L8pn|^zA71bK0+MFh|k;OVVtk< b2lEbs+)-suM-Dp900000NkvXXu0mjfu3dlS diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_2.png b/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_2.png index 6cca867bb4038158fc0718af729e19ac018d67a8..b7fdca011a010b1f2cb2c1bcd63aa075da324fd4 100644 GIT binary patch delta 163 zcmV;U09^mM0=@x|BYyyeNkl%JfdUwClP9r~SLQ(_xln%=djf{}ztp z5F{L2iJB%!61Hs<@ANKlC+mh`AW4!Px|p8IEQ%uLy6&~_+I1eD=V2U2ZhyxvCEmo3 l?Z2dK+y2P@s~G;P{0|qYQ|ZzQT~`1A002ovPDHLkV1nouhZz6> diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_3.png b/src/main/resources/assets/tinker/textures/items/crossbow/bedrockium_uie_crossbow_bow_3.png index 5590fdece3c6140a300bcf302ded7d264680a188..ca1905e1bd51ca000ce707287f33046d69b050b2 100644 GIT binary patch delta 165 zcmV;W09yaC0>J^0B!7rWL_t(I%f*wi4Zt7_1Zh};iiU;(sA*Y(71)5)9la$-ZW0WN zl$Tzv&VCu=+=fz0q-}=A80h6uM#W?^ zB&xOU0iOwz5gFcw^%G&k+YPX^qlM}CNO06ZUzX`Oo|gAdd>(0V9AC8jRWG^#nFL=K TQ)O9S00000NkvXXu0mjf*Y!x7 delta 278 zcmV+x0qOq10kHy*B!BoxL_t(|0i9B@4n$B89CxQs=@b++8ns#!Dz(N}_yesU@)vrM zXe1JaL`f&_ZZ~)0k~{Z~WM%E!nc3M#!5@$7x?^L}J@E`o2fgG|HicJkLc{RezYK3FA1jOxJaX7;YkE zN<7aKj^n)frut!oVfY{5kWJ!n^FzunpLJbt^DoF<`(b7~^ z#j-4r+VYN`C$KCFNs{c!^6BNFEHq66-M3*F^2leW@><@R@ri>ioE?87I6FQOaG0if c`tQ2~(GXY)PY=(SX#fBK07*qoM6N<$f>siRJpcdz diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_binding.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_binding.png index 06fd213f0d5fe17bb8816bdd0c2089cb3c90a0e0..db347a65b9e1a63c19d599eb642d20bbd8fda8e0 100644 GIT binary patch delta 127 zcmV-_0D%9;0{Q`vf_P&|L_t(IjbmV-Hkftf$bYgmr*`&(HBa2Jk90%gY8v61?EM4( zcdy<^ydgcCcEAvnz3aD<=8CTMTmCzQMuIgt_yvLKeo_tT*|`1x#GQx84@4N4 hyqAKQ7zHB|001J`Dz}QZ2V(#L002ovPDHLkV1ipsJ(d6f delta 205 zcmV;;05bpj0mlN6f`70{L_t(|oMU955U`*N%sO)9f0~UABUuKdcJ_lcPu#KZf4+wk zQHH<`h^uM*KfAmTtZCi!$qe1AH~udT^(SZu*npl*JN}pWd4LtiRn`4p)Yio4myq(G zXcvGqcdg&@f7`O93?R)8enJ0>1HBph*Khq_2&9SfLRp{>V@A)$?f(N)GXLkh+krI^ z(u`sN*d_j+U=5S^9{Hc^Ok7N0L?Z|gs~M*Oq<~Qa27>_r^ujz7il~P%00000NkvXX Hu0mjfwGLv} diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_body.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_body.png index 677ea66b01823778b537d936f00e0e0d39390f70..a15c39907859b975c9207282763600069742e3c5 100644 GIT binary patch delta 197 zcmV;$06PDd1HJ-~fqwv}NklHgyb0jA%ouLEUUtxZVk&!k-ygujx;u?9S&GslCPf^U` z#b+pH^LL1A*`*m2*XD>~mhNbb^2y&J)$1)Enb%NQL%IOb00000NkvXXu0mjf%@kgh delta 287 zcmV+)0pR|=0+$1jfqwx2Nklv7))<|E-6Q>b`#Y z#*o+8@PAT$1BM}Z1Cf=9k>S^`Uko2UzGpam;7DCTL(~5W4S#hghTt`z8R&|t=GOoF z-n_1pkd|b4^5R8Z1(4rSTg^z60U*#;3o+!*v*&fX^0Exy|NJ4|3&@5vwzdEN&+wn& z&a-EAO&uNo>nbW3i8cTP>Z>Zj8k##g|KEG}9%x7>(2#OQl2c+WP!q@nyN({KYi#fM lPgYU}IUi&Q6BrW<0{|NtZ?mQ2{UZPX002ovPDHLkV1i)Zj$Hr% diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow.png index bfe2428374c9a5aa701ecb21fd9b5ad2f5218944..19bde67046a02e8f713a88bfbfa6d6f5b3af2b7a 100644 GIT binary patch delta 248 zcmVISo5@sGDd7_uo~c-n(=@0?0*@I|Nj1AkW*H{sTr#Q z-btxo%^>!LeR~;!7@s3C4cIzwHcs2{8W5aQ@c;hxtKa}SyJr{ChJX!7Y3cZX``p<& zNd-j)ITht5paI0Y0Hpc;l}mMEataJGGEz8>lmGw# diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_1.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_1.png index 316648d290640fa4f477d9a5850090c38496180f..738dc19bed62383f4cfb292ce7dd2d35c1d9d9d9 100644 GIT binary patch delta 250 zcmVoqfqwwpNkld}2qymf?hy_s<)&K3o zBWkUK!)h%9f@`e;L%{6Kn>Q0SB)qudzYS0^2$xQt@xNr^wEv}3X8tdqHHSDC*anCF zw+7l+K6MuHP6mOH{Nn!*1493ktT`wrpEM0r1O6E~|IK~;|8rXaF&Ub(ftvklEqw!O z%lapgW`JLM)_)^6&ssBY-`bL%e$s9CN=p52;Obsm*xpTE;Ms>q{nvMPt1W2hAm0ET zN9WqSh8FS+aEglguj}LrbU`Qi@xO?ej6o{^03QQm@v|E^kN^Mx07*qoM6N<$g6sx& Ax&QzG delta 328 zcmV-O0k{710>A^1fqwxhNklqlzt-QV&Hj zhdrs(L%}By5yU?r@$AJ*-ys;J5%C3b>So8?wKrp$WMG$J$@gUvev43`wvSIqP9{K# z01)lj-QdhN&MbJVe?swl=u4?UrK#o-kTD2?fIQE`T)}3qPk-Yu^i4nCbOk8|$T_e% z4hEh%!PiFw25Ky?i1XGiW<8TB*y!}=VR)$l%7rrp>+Q}I26%hCN4@ff{40368vgsX zT*2CYo4!9|F!boJ2CwzS*qLU#w7_gt aVN*Y;LUbzds||4g00004(|$cp8FEX&wh%}0?UA2qaT9u!H6 z7Lg5Sa^gqcw&d8mrQG!#Ue|N?J}<{HM(r9XTQ=1G07|KfJ+=nCBqQN(9XSUWJBPh?#dVtEEhu5Q+p~i~G{Xu9 z{49;h9D<@FDQn>yR80$MRVSgO(RhCfFQ}Pg2(n5u*Np-P+cioRiew+p;RXHm1{u9V zE6 delta 341 zcmV-b0jmD>0?h-EfqwxuNkl26jd!l5GbYzyNhMGb72CLkyTwTfw+& n_3Hmop`m1%0FDK6HG=>E2BdGoy#EQ$00000NkvXXu0mjfCpV}p diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_3.png b/src/main/resources/assets/tinker/textures/items/crossbow/inverted_crossbow_bow_3.png index c2b4069916169d0ae83954064edded5c9f2f859a..296c85d763e6fe9d6cfed5b8f34287c90565a5e6 100644 GIT binary patch delta 312 zcmV-80muG?1hE5`JaKAiJ8G8 zB&Z2wz>gol8EWF9@w?#G#fuD#KqtEe1vUNs`;P(S-IDMyMt@{ASPe)lt@uB`yMyuH z-@gnF0f9}GF_Dbe)L}Isp{Vr#(#aDTfd()f+Oi3!Myv)TBqT5_UAmM}K|z6`u&|J! zzrUZ5euM#O)ph?LynWAL?di>6sI16HjApn2rIV)rfBg7y9Sa91gM+Vc6EJj%(hN2L zlt_#N!xgNCe002ovP6b4+LSTZWaKowq diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_binding.png b/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_binding.png index 4aa176e161b9622a53ac037c7f24120722bab189..3de2025670f48a31ab29d43f9c05ccfe797da5e8 100644 GIT binary patch delta 82 zcmV-Y0ImQ11Nj56uK`LmNklb%707*qoM6N<$f((Zv1poj5 delta 86 zcmV-c0IC1^1N{TAuK`XuNklK}I6JUNr6U{Rd^wOM@mDY24aPu;W0d%GoI0^=b}+|I zu8Ne$^ELGm)B&HrV5%YoFjDC#Sg;UHlHdqSY@|1e_&g)ytRyG^0000k?-OOfyI$SuQ}<%s>i&X#g2Owr2VR(830P26d6Et e+8%s~2M7SA0B0%WtKkv=0000-Q=gjx^ zlIHG?G9zK;sEqjC-@8o27r2XhGPcQZKgnp5R!}>n>AlJ>gc)ddP#S|uZZN}(c@+~F Y8Ptl*r=DKG!_EK%p00i_>zopr02X^eQUCw| diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_1.png b/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_1.png index 16e69e424b0c5e20edc4707133b9f11618055a73..4fa8c9fb542706960a11c84a6f634bdff741941f 100644 GIT binary patch delta 124 zcmV-?0E7S61fvA7uK{#lNklk?-OOfyI$SuQ}<%s>i&X#g2Owr2VR(830P26d6Et e+8%s~2M7SA0B0%WtKkv=0000-Q=gjx^ zlIHG?G9zK;sEqjC-@8o27r2XhGPcQZKgnp5R!}>n>AlJ>gc)ddP#S|uZZN}(c@+~F Y8Ptl*r=DKG!_EK%p00i_>zopr02X^eQUCw| diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_2.png b/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_2.png index 80652ef93b8c2df89b221c94a31293435e589a4e..9a17deb82d3f40d5ab6854657fc9b18f33c8f055 100644 GIT binary patch delta 119 zcmV--0EqwH1fB%2uK{mbNkl5q002ovPDHLkV1f^gFMt35 delta 183 zcmbQoa+hVpddB*ho-U3d7QM+S3PLJXl7HNvoxfk!II$53S|fU+ypnj5l=kp+6@^Q> zh(=0ENbvjv%TJt;Hp7jLjjfG&`MXKam}UTZGt`;$_+kqhroAQsd^1d ga=94p3iBH=Ffaz2%j$ePWX=Etp00i_>zopr07D%|%>V!Z diff --git a/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_3.png b/src/main/resources/assets/tinker/textures/items/crossbow/magical_wood_crossbow_bow_3.png index 5a7bedd483f78bba0501fff40cfb31ea211eee82..2564b905a353ef95107f89322068cfa7d09285ad 100644 GIT binary patch delta 123 zcmV->0EGYL1fm46uK{yjNkld!oDDO8Xieyv=?{E^z zq=W>|KVzXwYnG}UI{*XlB3BYyykNklsj zX91-~2tn6d4Dj7rOWu1OC@=;?R~V@JKE+q{y)%&UK79vlj3U`jfVI*8ReZVa=s&&_ XsiR}@Zk)0f00000NkvXXu0mjfP4G^^ delta 300 zcmV+{0n`4(0mcH5BYy!6Nklwc; z2alkMAQ}iFA_ih$s5@2QFgrRjlaJ6{-Bta)`auC7e5$H$kIyAZ!dn7C5HM)lHsUyj z=XtD?=Q)1)bg>a!6a{2i#xzYZO%uNFBTZA3Whq=%K=86G41d>k&1r^VVB5AWvm)P4 zHtLr$Q=b&pb)5{lu0!AV43p!f00n6ohJhqWP*oM?dA@@bqjfq1${s}#T-Qa@G!R9R z>;Wc$Qzr>1iUKO1dfxjb;Ca1lLDMuI-ny>12|RQ6`=Nrz>;z|7hHcvp?{wigkgwr93?N|ojJ9R_a*-+m$#99!2P z2rhk1sxb#qEr@!8RRo! zjJgF#cg|4=K@M_#nD17>NG_%5Z@w4Yzy6#K*jlS^fZO-pZyWVl>gqq%2Rq$csMCn~ QB>(^b07*qoM6N<$g83av9smFU delta 276 zcmV+v0qg$00j~m(B!BivL_t(|0p(FK3WGopoQr~mpkSemAlO+5KEfyH2mFhFv(-|t z5X3?(tSr5_3kFF}N$LphE_*w(b8`Yee7^6?^SEIc_=+IQG6u$RjIu0|rYZ9@O#_Xq zn?T^Is^B;dmSusaY4AJ`ecz*PTXCy^!0WogG);6}$7`l(!hbLfFPzTZi$I%Q*X7eN z3^|YE$oZ>4rsa7qciGaiEcW3YcgbDwRjEoX|Hl;B$GhZ?dbp8CmpdpBX!M20z U-fF?wrx}32)78&qol`;+0Qe&o&Hw-a delta 87 zcmV-d0I2_9c90}eJxN4CRCodHkiiWAFbD#h&cP52!~UyS+oS^+K0Y+^JRq#OS)kVf tk^;a}xf#hQLm#lG2gHEJz)1iA002ovPDHLkV1fY?BJBVG diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/bedrockium_uie_cutlass_handle.png b/src/main/resources/assets/tinker/textures/items/cutlass/bedrockium_uie_cutlass_handle.png index 939996cb2bbbaaffeb44ee8cbc3ae6f2fb610b9f..45b5e99d8e74e51b04abee0f3e215a9aab13d108 100644 GIT binary patch delta 83 zcmV-Z0IdI#0dbHdO*lzJK~y-6V_+BsqhNRf85x=X1_lQI$=0l(pzt3=lcl+&q~t#{ pGc)O$K~6R^Gb7JtnC;|h1^_Xc633%Qqfr0=002ovPDHLkV1imTAc6n@ delta 116 zcmV-)0E_=|k^zt;Zdpl0K~#7F?NGr9z%U53jbsXka5zU6U+!SJLLpE44G|PMJUx$2 z90xXaKtxJatNY%)4uZ_gl$k5s>p?cN8e_DtWAlXq$#YJM2y*uq1Kvr-&?osX8Qcf_ W9~d-nF&)DI0000V+45QR+-18SgLpi&?K3f;Gg%1?k>z~Y&| z8~_PQ9Q#~3&vb05Qq@fy);#GgKfgCK7NUlB%FwS*#*k8qyueHwlDC2;izTez(={gP z3YpgAk*aC%HN$wmL?<4hJ9=}ra9NfWFsBZu3$(%rK|e-28h?PRTUWz}!q9k@I_QOy zWv;O=9N6%hTe|c)x(uJR0fSH8+m_$TRS$Yxo2zGBS=2gLt|?BYF5RB2a^C;io-fq< zNYH!@u{mGsr62ih(Px6^u+Q)X-b?$deO^$&56GJ$aj)zL5)XOl2Z>&Pp5Lse>Hq)$ M07*qoM6N<$f@pAlF8}}l delta 343 zcmV-d0jU1}0?z}GfqwxwNklxTl3&bIuc$Q@+_V@Gqo{jK_h|^r{=ZpdzN(ros z@OG4|&9;X3Ss~0fA_1jaug8;L0dYD~)9H&~l)<7bfl%E2kAK3G#P>XG1;me;n!Ub> zk3|WTpgtKPjQVCN@i|A=b?p|0S+3?4_0H?QH}gAyAtuq7?in+WEb*WZDSWRF$?M zVXen%U4bc{5_4^niCC>ZA<%_8Jw77$R(S(JT%6(HDO1nmv2dINtM^t5gUfR? p4``@iZDK3HL>F-@plkd;;0s_HaOccW%;Nw6002ovPDHLkV1mM>qGbR8 diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_blade_broken.png b/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_blade_broken.png index 06ad0b1ed0bdfde2a5c99463c922a2c1d9184bfb..b763046f70d8e5ad38016160d79ed48d6b1bab52 100644 GIT binary patch delta 267 zcmV+m0rdXX1A_yQfqww(NklX- zLGbO}_c8I*8+)(kS67g(J~uAwrAG=?tX?N*6mpTb16i;7{@>gr8lz(UW2EWvNV;JPS RQ~&?~07*qoL z;hghbzi$pd-oZYDq`LyL9KA}tUJt6OCPnb!d7c~GjUJ}00mPy z>e~7ScC{^AicT*L{Z~gMpw>KN-xsEsieT$jAP(yb1svN=et3K}$KxRig}k++l_(fH zHGt)JaBsOcC|C02KY3FD8l5iR_V1?2jW`yNw*DXR4R?HhU0>F#$N&HU07*qoM6N<$g4}1Hn*aa+ diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_guard.png b/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_guard.png index bae7e5b1f8cc0e54ea136bb964b95da15ec6cae7..1ee93ef1625b98ef2d3d5da68f880a61e3be6428 100644 GIT binary patch delta 93 zcmV-j0HXit0oVbMf>uFEL_t(I%VYTe|33pIm|@g_Q3I%IK;6V?|Lgju{BM{t<3Gs; z)bvjJPqqtc`=|V;$P0B7rc!1=(~KGa2Q(G{?B@Ee1%b6V00000NkvXXu0mjfl~ycn delta 110 zcmV-!0FnRL0qFsdf@e}mL_t(|oMZg||33pIfQ2I6qXvu`fNntjr0M?|{{CZNVq;;b z&rW9~$$;9v$^V;+a*5W2VnE%5sbp&g8^Fj&wqA$~8Bm)}e1KsC0K@STo?Q{1 QfdBvi07*qoM6N<$f~Z9@O8@`> diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_handle.png b/src/main/resources/assets/tinker/textures/items/cutlass/inverted_cutlass_handle.png index 8105eee3516582e0304aca42efacd1bc6195952d..0096e8a654ced30e3dae6d2e62c799141b762fd4 100644 GIT binary patch delta 112 zcmV-$0FVFw0qX&ff@xGqL_t(I%VYTe|33pIm|@g_Q3D320rd-({Rd&P3}{-i;(um) zcP&{4v@Bco-zhYrwqeoo|0H{%b;a8MxjhqrnwR}2D-1f;ZusB6YTbWw0ucbhZTH4W SyhJVl0000GyO delta 132 zcmV-~0DJ%I0sjGzf_-R7L_t(|oMZg||33pIfQ2I6qXvu`Kr;gx7A^;;?S}YBMv@I^ zUb^!CtLIPa#3ZGgNOnQ%^40$jY}`<1=j-289~(iG?QjFyR<8U1^4T+>WaRcK+^ECcn->*xYA;=mR zHUyKW8Ke=0iFQ7^X0rSZGk_$GxNIle0FpIRYyic!!wjLw0GJ_UYaU?$0G@|-)_`~$ Q%K!iX07*qoM6N<$g3d)N^Z)<= delta 179 zcmbQta-C(vTE_aRo-U3d7QM+S3XCdMl7HNvoxfk!II&fvH_9uC2LztE^-H*jMoLOZ z@cc6tS}eIN(5Gd(W8gcj<`qiX&f(_9hyUb?OMH}KxU8dgh+Evc;FaE;pCFAEybjlU z)(Nt8a5Xb8f0vZe!l;%sw~sr)v?1blr%{8z0RzdKKebzOj=yU9d0WpQZuj@Dp!P(y d+kp+z3=C7G%#G^nJ{)BL0#8>zmvv4FO#rt5M3(>n diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_blade_broken.png b/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_blade_broken.png index a46581a2e81f8582ddda387102193e4cf89204fb..6e5543dd382bbc5b7322a31063b9ef0995602336 100644 GIT binary patch delta 110 zcmV-!0FnRC1d{}?tpR3HNklaRcK+^ECcn->*xYA;=mR zHUxt;6YT<+W{^f0CfVsQ14#BavH>J(#AZAFG!MM(FheLZ0A>i;nnxG_032LwyJ)FL QWdHyG07*qoM6N<$f^M=YTmS$7 delta 171 zcmV;c095~z1kVJptpR_HNkl!lH2|hrOoSIMcHq=qhWXnr!1WR31(-&d zt;pg;8GvppGGM}`37hk=0j#DXYsP0gUKbDxFia-JcC0R#zwILe44$7%y(%2^fWE)!z| i1B1XtGqu482s~Z=T-G@yGywobXd0aW diff --git a/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_handle.png b/src/main/resources/assets/tinker/textures/items/cutlass/magical_wood_cutlass_handle.png index 681d96dabbeb2ca1a92af2d104c16436754b3ad5..4962c0fe020ad7d2064edf904f65ca031210004a 100644 GIT binary patch delta 68 zcmZo>dC9zCEu)RPr;B5VMQ?I~1nc62iY6ER=Kl&l+n&9XG5^G~Ama1azq_Vb&W$FVdQ&MBb@0K+RA?f?J) delta 94 zcmaFK+|06JEn}FYr;B5VMQ?I~1nc62iY6ER=Kq~>Z2vn$&$q0L^!Dsg;g-B;8o&E{ xSK_~I+&w?GE^GuTx&Hn2q$edj%qOn$Fxbr$m%Fp|%OeIL@O1TaS?83{1OSqsDSrR} diff --git a/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_accessory.png b/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_accessory.png index c3c9e5d5f0c7c91b538c2ad3cc33e1eed8fa055e..d10d8e37d27de7c204dacd1f2f0eb05b6920b6c3 100644 GIT binary patch delta 93 zcmV-j0HXh{0eg@nS3*fdK~y-)V_+Bs!wtyD$ovOkvJGHnX8s=+7e|>PAkFIP>XaE0 z5)$&iq@;v0LktWI{+pSZ{RbIFk#{IEU}yjUWtSOO9LHBL00000NkvXXu0mjf&Fdor delta 145 zcmV;C0B-+#t^trFe|1SjK~#7F?NGr9z#tHdefV(&aRb2_oWda;#vw!}@ZFM!V6lbz zl?uT-E(y8A|F*k;*7_t?7CT0AtrgyTteA+=fHlQRDYVv*bDrkpjJPG>fFf%xLI|Id z2#TKIoI9nIFvcLp_{y6SbhDI_D5dmv=l=poARRC4InlcS3jhEBNkvXXu0mjfCCx(b diff --git a/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade.png b/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade.png index f93e5a70f9f94767096dddee7add58e5f43d5527..04d240a9426df4b5dd57801a6a6064180b93d362 100644 GIT binary patch delta 128 zcmV-`0Du4W0i6MmBza^>L_t(I%k7Y{4Ztu61T9%&3N~=_@)*=Gkau9;PZcXIt`aHN zAOBBlp8@~@(A`;bsxG iM_<2>^xoNiUd{!Si#YNNbk?8%0000KDjFh1`i}pzEeE$B@y`Tp+Yl$6x!8wO@UEdeTk>atlETg{fX&gu5Vn-Hu#Ztjp55qu02$W@sJkPOh z8}@w{vF|I06WpmN3K(NN$odSk|7QUnS8MG%6H(YYL&=wmD5d<@B}0$#h7EiG{RTSp T7RY@=00000NkvXXu0mjf7!6+d diff --git a/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade_broken.png b/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_blade_broken.png index ebc7b22a70d18a728579070052896e04afee5d55..9a709798e92feb7dc16790caa750de9c1d0de41b 100644 GIT binary patch delta 119 zcmV--0EqwA0h9rdByd|vL_t(I%VS^|Qoz8#;6DhHrCCNs=06B)YiomPk~L46GUb0` zV Z0|1mYHG}fLdL{q>002ovPDHLkV1gB7Gfe;h delta 186 zcmV;r07d_l0oDPKB!8VrL_t(|0qsz+4Fe$zG$9=&9by9-=AedM7>Xenh7w9D3P(ml z|HVIP6X}s`&e&(4f&V(zS|mHGew~9I)>>n&6~-7qc-6ia*xf{kF+yt%q?C|zhLqBd za^y%d=Nz4LQ$962vH)8J-g{(>fl>;D5R+F*VH13FG>Oa@gEORn@D=B_TL=Mr?{hLD o($2TFSB>Y}+J6R*`{5t>0K_ge4D!$e2><{907*qoM6N<$f?j1!Q~&?~ diff --git a/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_handle.png b/src/main/resources/assets/tinker/textures/items/dagger/bedrockium_uie_dagger_handle.png index 41b66336a33298410c02de333b3329431227d32d..518c7537f94503b794746b3f031439784f8a7495 100644 GIT binary patch delta 99 zcmV-p0G$7+0e}IJBwR;HL_t&-8STNL6~HhEMNtMp;4%LoG6_0UW#88ssA)y+wd?w) zh~S((oF delta 141 zcmV;80CN9;0jU9yB!6&8L_t(|0qs!13BVu>OiNwB3B(C}If-wlaxjN*0U!AVQX&-6 zpZydc26E)c9SH}!b^>cA;GE-93a6BK=EFmaVvLN4V2puU>uaZVdcGbamx%~^@6cMC vGK=>V$T_pM7QFYL%;Fs#LSX4Z{)QX3QXg>22QiKS0000H6d91(*jiiAKbd?(3i>Af z_ew~v&FStV-;ms%ey|}Wlc$kyNYR8T|1(?LYa8b+B;SydNmKuKE?NG6n5P{8ZJs7v TTRgL;00000NkvXXu0mjf5~nmt delta 180 zcmV;l089Vu0j>g&f`6AuL_t(|oMU955U`9IFxU(zn>zFVzyJRkdU7%t$#%iVw{PnT z`X~RNP?$@UAt(lPWv4S1^iBGI>*9sFobJB=Q%Z{n8iL`12}OB~xjp^=?_Rl5S2B6p z|DN0|yoO*6#K|Rvj71Zs{QvstV_oCCh5zf5;&B>+GZy*^axEB3CQbd%!N!Kq0r;b_ iCoh}yFd!9BYybf700002PYKwaMYFBL7NSeP>YBTEpm-S7mE$r^CUAd7& o%`lMD-uZvQnziI<9tCs+03xkVX0lE#KmY&$07*qoM6N<$f+470sQ>@~ delta 248 zcmVOL_u{4h zkDoYECn+J$psA|TM3M`ptz7y4(1}xZ0s;aIuiw07P*zcf%MmnS?&{V5&s@J*CnPAu z@b%kQ25U?6ru+zq^9dR-d)4ayr?1}vY8GVp^yw3Wi>XOdY;kZ9BeEKt2FwC#zHsw) zorJhJ!>7-m7;Ln)nj!-H8PV0@G~m>wD-1$H!VDijePpmuQ)vqK$JC71fH^IVj5+O{ y|4md?7;tIEYXAsLsVv8-kthR*0iy;mFaQ8q;zUeZIWrvE2Pb7}8{{}ug{YQqYPYg=c` zBF&JJp8o%i(Q&oGxdpZE$!WC>Q>PJcKz?`c|B~+B+Tfi0+KRr3wdFvU5Un|IY+V2}dPEZq^JM?nRDmrgoK0`zI^+}@cZu{xEw(P^1FNgGyMNoCnPAy zpsJ|I@c;k+riSb+;=GX4(f$AYnX`3#eEbZbzkX&=Qjl-zE^8@bL{@{-fYJ$*{{Q~< z8?0GbNf9K3p&73M=PzDnU;--t^63+UGJ`_X#L99E&3FyiGk-Q?S^uQ}KY#vYm{?JY sRWn`#K%lEI52r?=3?K%K8oHq)$07*qoM6N<$f-8r6aR2}S diff --git a/src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_handle.png b/src/main/resources/assets/tinker/textures/items/dagger/inverted_dagger_handle.png index eab91d9d9b267156291a653ffc2c13a5f8fab024..2ca6d08abcdbbc48f49cbbcc7532d2ac548916fd 100644 GIT binary patch delta 102 zcmV-s0Ga=T0^tFWf?rBWL_t(IjbmUK1*2e4g6g>o{=38`{GYsf&402q$CX#rlBKzJ z{^I|(VUe}nt5%V&xdy1&IwZWdVi=!zYNiwb07kwd!0Je?od5s;07*qo IM6N<$f;ML{kN^Mx delta 137 zcmV;40CxZ30fPdNf`4pDL_t(|oMU955U`9IFlqoz45*&F;Qz@32N?YQd>C>=Ll{Xi z0Hpcxty^_K%}vB;Mlqmv{^I`!wr{KR3kf7zGu(h0pyqvBx77KD1~-+4g%Pb8ZU8SA r2ZJ|Ib4565n&AeNhli4^5e5KWVLr;B5VMQ?I~1nXg5l`6?U?1^1G7AF49Mb5j5@33_$hJ566W#i#x ZUv;Y7A diff --git a/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade.png b/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade.png index 0d9042c0338e66d1e68ffcb7fd8da72bcd6b7451..8c0494d4e1234e7ffd49f373af8057d2fb98a016 100644 GIT binary patch delta 86 zcmZ3*@|$_XT1G!hPZ!4!i_^&o5BPLu&K&0-?F3}*JXP~-@D0a>%6+*OA8YdGM}Cujh&W(EcZh6AVWqG-lz05O_z n8bGXOf-ZouacLd}g9QKp?+z-WZ?tIH00000NkvXXu0mjf$dNV% diff --git a/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade_broken.png b/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_blade_broken.png index 10b5fd31ce5a89459d95ece09f1f4435cab72a11..b7debe4509621600034c18dc573d645c1d279e5b 100644 GIT binary patch delta 90 zcmV-g0Hyz|1pfoDtpQR!Nkl1xeLon%vfHZXHxPdia->*xW w0q8c9tQlrA$xf%pW)L9TW~xQoD4-(%0C1&37qrLUC;$Ke07*qoM6N<$g2_!J+W-In delta 135 zcmV;20C@lZ1FQtFtpR^(Nklam%)EzF(y(pGcYhPIG8CjAR9uI z0f}A)|Fx9F7#z%$8O-c&p~x|kV)KDhcNrKM7#QYny8ze6LX6E~BD`=hWX*UDfY~f2 p!i&{rf(8(>nJ9oQ+D5@(1OT2=B;j$y$k_k@002ovPDHLkV1m~BH^Tq` diff --git a/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_handle.png b/src/main/resources/assets/tinker/textures/items/dagger/magical_wood_dagger_handle.png index 24d238d2c13d723c80a7185ed7a9aaf0ca3c8f37..cf3d19f58c55a51c1a9ef921992d405a3d63f21a 100644 GIT binary patch delta 80 zcmbQp@|AhRT1F3JPZ!4!i{9h}3D(640ZlIY&HuTjoBlUvY%(c-zGLG0pBHR+Kbgkg kU++CHZ3bgX_A(I$h5$pE+SpIxtqefm>FVdQ&MBb@03@^@Q~&?~ delta 108 zcmV-y0F(dq1Ca!07*qo IM6N<$fIAxf<4oKDo^Pj0@Th3d=g_|I2rtb;R%QECGN^idl-Pg)78&qol`;+07W_t=Sb5K(Ria-!(Yb_IzFwETINUX=R=N#z0!`|E6XY>+LQ&pRD0wQL*cXo_nuKWA% YK30_$O9Zbbg#Z8m07*qoM6N<$g3T5)AOHXW diff --git a/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_handle.png b/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_handle.png index fe26fb03e20be51d3efee32c27e3d87664c25784..ebe3df10dd2021b7ec92f7b0af973d107e728685 100644 GIT binary patch delta 118 zcmV-+0Ez$J0h0lcByUx zUhCi2r>ZbBhzQznL?AQa?iicLa8=>nJIijH3DL@T&cWUrZ7Y)rkFq%?^T*rv_Xtl8 YJfh++0yMA|qyPW_07*qoM6N<$f;MtDRR910 delta 194 zcmV;z06qVc0p0NJhd|*F z7y_Biptea7tlTWgAm+{Y<_G@o=P$7DJ6_j?<2Yh#*;h;8oFiil=6Qxv%FwEN6sYsE zEETraKGw7hfncQ+3L%$<{m w99=MZPR5uarG)2sg4UXH-^I3VNYP8b0k9f3fOC&S6951J07*qoM6N<$f@eKha{vGU diff --git a/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_head.png b/src/main/resources/assets/tinker/textures/items/excavator/bedrockium_uie_excavator_head.png index c20c8089ed0c4066e210047e7e2bcb2ab1158d3f..608217efecf3079ceac26f9f287997f36f2fd627 100644 GIT binary patch delta 157 zcmV;O0Al}(0=WT@B!7TOL_t(I%k5FQ2>>Aw6a=fV0~5gx3=KuF5gV`pQ_G!W7A|+q z4sJju*?D#~Mgi|V%q?1L*n7iTt2beC?;W*PVVWI_V~ipqhY;kYlyJNb2PvL&VvHfY z);e2IMYUXv9X>U#U+0@fIaKJnKtvee;P&00000 LNkvXXu0mjf6gfcY delta 239 zcmVw``(S5h=KERb9N+hq4*$e0ibB>A!Lk|R}a045`4J<81a1j@93dhZn55GM4 zHdh=MkW??mcwKL)_YS&q4##i^0b>lLl*Bd6B!%cPMmafWFw}fI;k6d#oZ{vNgj;Ly z-lLR)TC0Syfq4r83Nvi)eYSxv&mcB3zy0YOe|=In9=bw#_7CdC;{X5v07*qoM6N<$ Ef@AnS@&Et; delta 228 zcmV35?>snLH_kGz}Gu}*B5y!DMK;(I@(=>%rO1Ew6 z5hsa-D=cUnM;yl?Z9x!VU02NW>|Hw8woO1)Rbk(Egkgwb7+ui!y@-D$p!K3C&~+W6 zC<2w2WdX-Aq0K1XOXwYm7N==KS(XAOLDMuyl7#Od4kS77=P}i?EQ1|~#OLMR!hYl3 e{-^J+Uf=`XuS3^CHs;p=0000ZPj Y0Ak7@zC2gF;s5{u07*qoM6N<$g3l8)#Q*>R delta 163 zcmV;U09^m^0i6Pnf`5idL_t(|oMU955U`8@1G*P3`afspYzARbQHEn1*D;c0z@)`X z{?A*ms7_K=hCy6Pior2F>i_?4(Mh&2X0RU>0Er-Xw Rz83%h002ovPDHLkV1ghDNmT#< diff --git a/src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_grip.png b/src/main/resources/assets/tinker/textures/items/excavator/inverted_excavator_grip.png index 07e71f09e5d7145dcebac04ad9265bdaff18afe5..143810a31b134e508476998050808f0b87b04acc 100644 GIT binary patch delta 98 zcmV-o0G7uf5DvI`dUVk4fyx( zAH$w=7wSNC^Tf&jYx8qSGK8h4u7B@pcJUlDkdzdw!D85c?N($#e~WK b$#DSyV|YGuD;dEN00000NkvXXu0mjfCB9Yh delta 229 zcmVz5Dm;?5r%CCe>6C)C@KtwZ8E`Gb0lNBNG$DnO^hf>ufD7n)=F1h|&x; zfQ6Zr;ndkPb*!wc434(8OAOTEUzT!W+7|~$riWUED{ex@!mMtgUkRG5W zOW%N6uh_&|3oqZ=iOWeaq#LN&#NDgbB`mTwDmTA2Hovge(#xlIGO>n$Yk6{j!@G7Ssj)E!Xoz=geC<@A#wofBEv&b$!d0 z|1XM)gd0MX0X;xXOO~#v6BH0+ShZwX-Nfa~|K~?S3?XPhH&FA6g^TM1`1u(G1o#+) zg#;K@EM8hS8E8l@&=7(KfUM!;<6{sJ6=4t+7iW0;>Jg;5cVGl7Bk@ac=XM-Lw|ym|ea z;q%8&3`y~EP3h3sAn1kkhzQ0xKtnEGIA0eK;NSG0;XgwVUEnA1$PGSw|06N*y#}BMIwY;j!daO(Uy|FaWQ7`qlM{9l$3&q$I1Q|8b8 zKWovlx(SOG{GT&-L0!kfh5sw!A%+k%0Hk=vyajav0s;&N4j!#jQc`AEG-rNYCs4c` zXb52!{AXa`<>h4%5fNb!6%l24@$v;jbaG--IWaD1S+L;$`hQic>%_&y8AL_J7@j|W z&hYy6YlamI7S?qwT=c&zJ`TSNY7!C{+kt_0|K_c_moHy3ynOYN;mhYQ49TfUO(j6h zM1?^mFvL56hFrLCu`VDyw26U%k)b4>#8{{R8qy1lf#SFXMszu%(*ZWkBpHAUj2b`% a0|58oV2?d`G7ZN70000VpMQz=V#00000NkvXXu0mjfaHk-t delta 125 zcmeytyo6=LddAWOPZ!4!i{9h}3D%w#5tS;*Khwn?CqH=pFhOJPCT?fjIOYkahZ%M$ z`uyOTvHva8zopr0IXp%i2wiq diff --git a/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_grip.png b/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_grip.png index 5d7c36a9605f1db25f90b521a5f069afe668dd8c..3b46aaadf7b06f51bd46b5c987a27114633f7d93 100644 GIT binary patch delta 70 zcmbQp@|JnSdPX}D*ol&F@{KDv?t2s~Z=T-G@yGywppOBsOx delta 106 zcmaFMJdtI?dd4JQPZ!4!i{9h}3D(64A_gF!RwenTz3^H7?gJjH7$HRf28Nr<1egA2Nbz6*0#8>zmvv4F FO#pvWBe4Jg diff --git a/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_handle.png b/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_handle.png index 4843a672d01420394430b7427fc1edaac8eecb60..7aafb77a473e213c964430f618abc7d2827026f0 100644 GIT binary patch delta 88 zcmV-e0H^=J1pfoDuK`dyNklRUZHWR69jLsNFRH0000`nY1*DsoWuzpr%+L5J^-kv=VZ|x1| z`Mf>$z$!Mj85=Uo41(3XjN7;qX7SJ2867-RKyjsRXmM1DH`;qxU0HmCW!EqF)-+O#HwFyv2|kr0#8>zmvv4FO#myv9)$n^ delta 159 zcmbQia-C(vdPc^{lQ%Gm*Dsbn@kJcrFGB zHD|kAI|EefaDiclB464m9(KRGsR;=Q4cTg(0aMuA4koZO@I{#mnuYyYah?GPJYD@< J);T3K0RY?MKcxTw diff --git a/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_head_broken.png b/src/main/resources/assets/tinker/textures/items/excavator/magical_wood_excavator_head_broken.png index 6dee37c90fa84fa4407e6bf96e8ba7c7a6ca63bd..b9b9334986b67ea4e4fd925b1c0fbb11acbad01c 100644 GIT binary patch delta 108 zcmV-y0F(dQ1d{}?uK{FFNkl00zttvYe*2qRaK#@`-?sTzS9q& zt81wsRdo#>oD?+M%W3V`cvPkVV#l#Ou)^mUa1Bn*%+0I)^b7~^w79EmMT09181Zr}`PBt0Ie j>JDI(KjQuS{`?dJg3>UJuOThf00000NkvXXu0mjfaivd5 diff --git a/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_handle.png b/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_handle.png index d5d2edf22385cc13a1b54d254f92b2b3e88e16ce..a20de6fdf2aa8b164f111d4c1e95b6009673dd1f 100644 GIT binary patch delta 132 zcmV-~0DJ$J0-*trBzK;SVbia;{x>xBkrIebbWFJ657 zk{q)k{3|(Uq?91R?vA}T=A8Er#27KgK&|y2ZmpsBuED&SpqYKtEW>Lp?YBAmRdXpt m6NQqnRh}(N!f>+e_mcyXPCUmx(q~Zs0000bh9C)x1eaw=(=<_4Ri^|h^G9g_ls%54a@m*_Xi-}NFngXy!!S_Wwwryy7^k{K zd=m5=MbV{TWELpfbzSQF{;!@9qzV2uL^EDEya7F5Nbg1qzOMiP002ovPDHLkV1nNK BZ3_SZ diff --git a/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head.png b/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head.png index cc7af35ee9748ac1849d29612c3f09ee80daf097..dacd6ba2c36b0fd0c53784eba2f3f3dc62d7632e 100644 GIT binary patch delta 240 zcmVMCvMkaxjl>uw zrKCXUl1$VPf;K`n5@HBZ2bkQt(`+fgwrvVT`JSdg8Ml(mo@qqmI4bC&&cDN8hhf+S zY;Z=L=UGvvI1KbXzMU7hzVG)vbxU)4eUO>Dx#yfen?acZbwtYZm$z_xl@xKI(R;5% qbGHAFkI9^jWM}^QNnbvk|6ecv3fb+22ToZ40000%T7BYy#nNkl zzY;8LEk(pi3$;=aBvnWo2ubed44b%FUAEuA+$MjFT(4J{rit6_2F8aFwA*c!&1S&@!{Ja8 z4u^wqZyUn9-G4586tme3p#neQ$K!EH;v5={23*$_oe1jnx}XWQz@c(cnr4Sy$PD|A?LS)D5}*eMxzl} zL@5O(mdj;Kr&F;r{MUCtCy5g#XCZQKfg7Mq=;WlA7A9yU`9U63`3H8poje@+{uzA& XLinmd)y>l`00000NkvXXu0mjfa#+IH diff --git a/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head_broken.png b/src/main/resources/assets/tinker/textures/items/frypan/bedrockium_uie_frypan_head_broken.png index 6fe6db112ec7dee499adf9218be360deb005f7e4..e61ed3c8679e74a11b0564f13940ac91ca8ceaf8 100644 GIT binary patch delta 246 zcmV|5QGKMQ`lSBNE&-fOVOKn0WV;c`|jgg z7>PXd1iKd)qRGz8{-h`#R#}#|EQ|GhZ%?t81qpOrXZyZ8_($-O+%$~=$lJDA+qO22 zqfOJ~KqyNlRk;u-5@HB(4=~8O6P#uNj^i+urSDsJ+;9?+vv0bteV^yqckXp|5g3Ny z6j0+tTG!QqJAGmQYN%3H2CA395W@M-y@YSa2br!bD8}fHse5)3$^s%H)QS*Dr|@%> w>NJ5>RXI`4I?s~Ri2#vQ&g&8zAOHXW delta 437 zcmV;m0ZRUn0?q@FBYy#vNkl-Cyit!7H4lKJH8`(&hz zL6oc23WY*JluoBjuh+xl@$m4D^ip_mD49&ES|k!dwOU2L-+xCUkw7pQluI}qMz`Bl zteC7nj8NzExvCJw<#N%@Znwkzen%)2()oBiV!z*e-V(4nE1%D2IZ~(6Y&J0(jli!` zsYoXZR{~a#$KzP9*YNr5@%a6IESF22z?r-4yIp=RBs&C9Ng)2;!*t%1_SAf#p1OE>rKe^CH{*M zMK+rSdu0-13>e4(wpuOO>CO#Mx@JIwL)-{;CZZe;hc0S|I-ygN-ddoMlQ5e?;e*}+q`7?|NsAqbOcOu!{U|yV@t|wYvwNe4-+HWfX2lu|9d8+ zplBxAfR-hz{(HnH)wV&MO{xKmoy%AJ|M%}dLq${sBZed+h8PeA002h3ZM*7WoO}QP N002ovPDHLkV1m)!PBj1k diff --git a/src/main/resources/assets/tinker/textures/items/frypan/inverted_frypan_head.png b/src/main/resources/assets/tinker/textures/items/frypan/inverted_frypan_head.png index 870b008f4dcdb403d0f2fb0c712d95f5f697b1c2..812d120b3ee090d78708d5ceafa9a1eb6f800ed4 100644 GIT binary patch delta 387 zcmV-}0et?41gis(F@I%AL_t(I%hi(GYQjJehJBb`ShZM1qe<1+XiQ8RTf|e+Sm}fO z@3W;vQ6fskf={-cUFgA6#mg=XOD?`Y-^@-dcH*$foU{3gi#vACVe1V+5m%ZXL=~MD z*lfvJv^pKcrVFk(9ty69S}%Y(2;mN&p}H-oB53-D4I9sR-hZaQQh?F(q1bm+9>Mo8 z`vI~>1L@m3gx%qQmkH094yv62a<+?{<;svmsVb}9^^v&IA?C6VzfK8mLT~q>dJkmL zLV^1Kf@Kl>9YVI-0c^~(6kr7-*+P-DlNEzN9dWIU3q{)wSnOB`{XFTKeuzrDgR5#C zN!^g3gegc^*nGj0yxDSnppEwr3USf!he#VHQhMzdtfST)AWgx0`aiD_aWS~KMyfRR zlx}PdFs_!U$`JE9{*-SK7y1HfK91moBhn7#_oY@j{`cKw5}S8TZ77z54Beu=^H*9x hVy#!3^T7XeJ^@-R(Z7<}nzaA`002ovPDHLkV1iabyvP6m delta 480 zcmV<60U!RW1BV2VF@M2HL_t(Ijn$G*YZGx0hM(E(ZZ^%f2TQ=@l8@p+3W7zc7xx?V zrjiu2mlYNSJ+$;7QsWm0D3%nZA}IJ#49R-Xw&u?&+0AdqLnRW^+Ou<+!^}MM&hQEs zL~H-8;<}Kg1nbx3@A|^IgC9OAgCRT3y%4|>p>^<1v2231)qg2yjtJ0dAL`EYXQ2rA zr6nxO!gU;ukB>m%?#4zG+&on?2WY)M(Cy}nP%Q9$pV43l2)1qE`z4OPe#2bpWm}&#_rm3+WzuYnF*%~j za5((aq)N3~C4Y`%!bT&SRbUJPc%Fwb21|rdk^oAc8`3nLRa-1F3lPD!ZE`huUV$V@ zKp;&sCKH3}Iv~P=bD9xr77*NCmqxuFeLp$DD-^LTL4IH9x()!9%4NR9F=4$P1=p^g z@x;*&RH5^^L%CcA6xVeDp<1cZ>vkEB$6)jyK6v#;A6Y%!4b5aityV(>^4!qrbkRKL z;pS!(+`4hL52ldzp(4WL-R;nI9I`Cq{)4TE{QG4LJm>S1#=T591fn WIkrXSn9TzK0000{VB(WqXX?U;f???-H+OZ;d}n52u|G;Y52YARB>%BxN=)BLG?0pJ zVq?FA?XnB;GL~X6iHxLN;3xVc>7QK6P1DAX+d#hILkmJ=Dt}cZO$VaCfJQvMNUw7$ zxq}~Gkcoq2sf@H!MbT?vT{Ey&(7|-S8{9w3wLJ|7M{Rk~>VPR&tQZ!8n;s5(cVtKu z!^uwr@z9rv;y%*014TEGDC+RqArjP;#Vkx)6_mm&WSkn9_Pc?2lB!X{PPGQrv?7Ce zHU~dE#cH7lg@25;>mp@Ylvg962ETiW1jSg6h-#9);rrbn| zhe-39zskpfjPK^Lk}Hsjhe9)eeng$^8a;P@_t|6O%PM0Ul~$N0e2%yLNwbL0dh))U b@c+~YG;i15bWGDF5g@Oy0E~FqR zg^FnYLgTtvBaAW>ECxRoE`@F+1{7;biy|nvcO~s21*@fth_xDP5@RMauPX~_8oKsu z?>!Iq9*(es3N!PDSPYs?(xc~P>)h&UeDlt*@eBW6&Jz(F$A6(P`^um+=?lYRj6p=U z2Na4g&67vdd@QeeyLx)Cw1s8I$vwR91h(I+>JMCZ4?!#7=G2r|n3*%%0tiA%t1I5frOPI2H9RmVt!M@T1A|G9ojQ%tkwa;+S+$| zd;2Jr7EoG)68aN^)GHMt(}2))hPWB#vpJK!GwCT25{Uss6qd7_YGoZTT)Ud_(-%ji zE8t(55W&yg_O#Myt(lm(?o<2SR_U&QP0;JN2CX52^zfM-_y0rv1^0BY&AJf^!2kdN N07*qoLNklR7zW`q1la(P##OEAa11jDrvd1;gESqQr}6*dHXSex;^TD%Hrqj(ukY6d w(*#{Xu?r{;1FFOV#p!@5DUm99Vdww=o=ybDab_@e00000Nks-uM6N<$f=?1QZU6uP delta 237 zcmVFlIv(CcmL`hMo9)iC?;XK5uA)V!9mIGzJ zqR1G|rkyU&mkvY_2S8@s7%k^0kCg!;h(Fl;!x)VB007Q_`nF{@Ku!gAcFuCd%tILa zkfMPo6!L-_Rg7L`2Y@j4F$r3Tu2T#Gs8lH$Tx$g>8bj}G!EQsJ0q~r`$3twhaqSl> n=gsf;K!@PlP3!~N#y^TX7{7D_hDbRA00000NkvXXu0mjf_x5J( diff --git a/src/main/resources/assets/tinker/textures/items/frypan/magical_wood_frypan_head_broken.png b/src/main/resources/assets/tinker/textures/items/frypan/magical_wood_frypan_head_broken.png index 0ca1cdcbcc4ea24e8af807592a1721be306e1bc1..435b15982084691ac00e091a866e0e040b7be8a0 100644 GIT binary patch delta 169 zcmV;a09OCT1Qak+xzSU^t)Fhe1TP6t#;iB!o8Lk9o= XTm$ntU__V45J1-`Eyf2Id;01V zhCx^jNc1xJ57Wrc!vPon_~i%OAebRcxHPvcIK&9EQA~svZWuog2ZOX2AKZm3guEax z`H%rZGcasF%E^H4Ek<-r(qepYXUj`IWY~U`lc6Bz55t5hEDV31*54T(K9`4k=jp3Y zm|lPZn6qJ;3v<h{FI*0}hIkNTr>{OSXeo)o oZDv4A2ee6v*bEv%*Eoy-01X>{o=`~iHUIzs07*qoM6N<$f((3xtpET3 diff --git a/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_back.png b/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_back.png index 8625ca1913500b97f6f90869dc9968070d551535..b106e355490738ba70655bb1fad977ab739fd304 100644 GIT binary patch delta 115 zcmV-(0F3{%0gwTZBy3knL_t(I%VS^|1!RMekdXh(%*_AE(yXqo{-2eV^}m6E0qF+x z_4WO4Y;62Lefo6LT>!FKTU-0Tv9U4fwuAg!Qc?o88N?>p=^z_rWMsg2Gzkqh007N! VBXKgYU)2Br002ovPDHLkV1izHHst^S delta 152 zcmV;J0B8S@0ki>-B!7EJL_t(|0qu}64FDk&Lwf-d6kvgs4GRcB23nAW21GEDFffyU z0R};)ta}KRFq?A_pk{!nETWejfrIc;oGFHNEbc&fVGw5zq6;`pT!rjkeGsDavB9NK8=^_FVIgj51tEXMpFCH5jBdx7> RF)RQ8002ovPDHLkV1gNBEYSb} delta 149 zcmV;G0BZk?0kHv)B!75GL_t(|0qu}64!|G?MQPK`D|iDJM`v|%G~Ug#xqAg?8XRdb z-CSfK0saH>;ZKxO&{~UHYvlTyH+W4@2mxY@;GE;*bxm-s6^$|Iz5iTa()2RHDJ9G~ zi|{3Fq3cSiIc}|qx@RhcG{%75y9f)|X&(nRIPd~^EFpr52o7)o00000NkvXXu0mjf DwW~gs diff --git a/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_handle.png b/src/main/resources/assets/tinker/textures/items/hammer/bedrockium_uie_hammer_handle.png index 56fc0d24e5aa834beabfda45564ef2ce69653c0f..d3698065d4031ce32bc1d0d6be43095968fc9590 100644 GIT binary patch delta 131 zcmV-}0DS*|0-ynqBz$K{L_t(I%VS^|1;ZVvtE>MvFfjPf#>VzvMn>j8Nt&IUoc;#| z1^xH(^7y&L-K< l$e~TL%^(2M1jFQ{6#y?pIl+mD&Hw-a002ovPDHLkV1iaiJ(>Uj delta 228 zcmV#uvyY&p-z*BeuZ{robfM;;$ zN?f}W1aT8cLdq{hN}CqDEe0lm$$v9H6P)YsCy=J8$+FD&zHgEwF|G%Dt|W7Lo|`z1 zA%s8_MQEDFsl8GB8tl9*3xXg(+qTeJJ7IEf1qhdAiEZ0Z*Io5jm<6ufY|yq+3iCXp z>pG0%__4EPb^$wwVF)QD)^)`+P5Ye{yUq)fRaF_nMNwcFhQlyfkGAc!`@a7PeiV5A e-=nq(+PDM1yiG;f2gvUL0000MvFfjPf#>VzvMn>j8Nt&IUoc;#| z1^xH(^7pE4Y9*P%jEeO=k#ux}8K&|zfas%GYoqbe~F*)}78R5r*a}M`?2Wu^) ul+G|;@5?xC@|<(NtWHeJ_`i3-MDPYC<}x0ifs5Aw0000Now<3dLNHWoCGS0Htw}r;OlvLby%U0dGCSuer9?5t-GpVvAj~;u zDy8fYYb_aLcqkZx0SD$eCyg;SN^5Q7NGa(y00*^|QeRE*jXQ;dA%tKD2surFciZ49 w41)dOgb?`4yuJnS?->!}8okXtd z!t*>hj&psD+qcd`gT!$hBS{h{ih_BbF-;Tdx;}O1;X%iaWPdpfL*#i5Q54ZM4YqB= zx~^E31zp!MEd!>w0DWDOB-Z6P4nYuL9LKYUVL+B;;27fvAiJ8Tp{gnrMe)T++qN)G z^LYj|msTMsf*`N~6ec;5Wf@Tvy&gbA?)UpaPI#UNtwWjY`_96Ax&n!*KFBxQwhvv` zVHgI=vP7DuEGRz)M0!=UO5gX4_W1|c{|Qv%NK^%FJ3VG{r``FnKYY|YFSuV8D779$xz+Z-V|kP&B#Qo<`u_|{byle zWqA4gIYU`zTT_UY6(a*Ffw<+^vH!mr7#RLCFfhP0kAlGh02FvHEE=|Yt~USx002ov JPDHLkV1iifNRt2n diff --git a/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_front.png b/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_front.png index c3b252be26696a5ee8adddcdd4ce5eb2b243a83a..a4f1047d1bd73aba314c60afdc4a3d0f2e041e60 100644 GIT binary patch delta 130 zcmV-|0Db?_0jvR#F?(i7L_t(IjbmUS0<1Z9?EkVO$Nn!peC$6l>QTUIpk^am``X}? zwA%H@NHhSX!O+&a)-5!+HY6pzmL$!aK$@*>!I~{x+(^?50vmw_1Scie1|}qvt{DWj k01a3}s-H)}C>SsR0I#+#6{UST;{X5v07*qoM6N<$f)_$IXaE2J delta 168 zcmV;Z09XI40nq`FF@K9mL_t(IjbmgW0<1Z9?EkNS3=IGOGcZKkS}`KaF%iHTMh6MJ?wV^fFI1^*cs7?jl27`V9waB9X2wj4Y5e<97WWB*CkI0{C=fB*nK WwkxRn2`Kph000005AXR0?GoAf`79~L_t(I%VYTe|33pIm|@g_!ES(CeDZ%iH_!i$Q8EAPX3zdl zk^!!9iT~B?9BZutLu!lrC;unO1>Pwc|5dGRYb^spY72V$|C8i}fUMmAYPJrw=Keth zHDeeMQCRw4&&9pgHZ&aQ>`DJg3dESQ%KxU`ezndqakaPt3`wT}vE|i3&AzoRK+W|e zXa*Y)mYe_I)YG@tE+o9RW;$t_!3NY!oAJML(zO4j{S*I_laK(^$=IN#A73;80000< KMNUMnLSTYo8*739 delta 241 zcmV(04<9_J6A>0>Ffui7!loIg0Y0gj{~z4FQzs%S&R}M3-PBW%gHD_x~ado0H@3Xlk<+$mU$Uno$ghEwB22 z_twoiQJ`jPdt01-#%e%ZMa}=4SFhCZ3krfYHxQ{AY(RKk!T95Ot4Q8Q{h{15yC+8dmP(F$B2YwweT#xo}gk~>@s+?MYzIJJJRT)@wNzyBCH<)dG z0A;e;&>8D;E(_kCVDCcgz~cdVM7N6Xowy87IEN#q1k?sBe>P9E*B8xl%&;` delta 242 zcmV zDjKV139Yx|NQ&M z@aNYrhUrc9L}`W_kloPy|LWySb>b2d46YWYO~h&j8<190_y6{dn{^^0A`C8;W=$zE su|(SrHb7rXjX_^ay$PfXUufe30NV9HJmw;m>;M1&07*qoM6N<$f)Z|W#{d8T diff --git a/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_head.png b/src/main/resources/assets/tinker/textures/items/hammer/inverted_hammer_head.png index 82b5fd927c0a4e80a3f34d9bc249589c5e880911..05ce1da2353527aad008137d6ef3e0eea5938a2b 100644 GIT binary patch delta 273 zcmV+s0q*|q0=NQ@Fn<8@Nkl0_;6V`B7Xb4HrPDw<& z`6m{FL;?zO$8`syB&-n=RHZvpaZ3BmrxeQlu3ED=jNi^0P!X` z(wqQcD9ANvCc)5~!d|QpT{A*{g}ElD=4x9*vu~s+tYC@ol7Bph{BQtqTo|?sr8huX zZ9(blAg+he%*W;&v-SV!G3bv2M0vKqNFgFYNl~F1Bz^bBHnx`x-w`ER^8mW#K-CRY zS{-P^FBIwxo+8QCM;Ir}@&i8ELD&37QC4usyOD?+Ouh**IifGzgXrXV??w9P&2$4b XVuR<~!V81|015yANkvXXu0mjf5T|{~ delta 328 zcmV-O0k{6R0`CHlFn<9lNkl&K@kAU8i&N)Bm4EKEgc6)-E!k9BEhZ9} zR)>dXlg?9{%W_Q>ZyO(ySdc(~rIlrTA9}9?yskkI5T7f@QH7hj4Ep`x22o%qxtE=t zpJRR@&eZe_U1MlHw(yL>$>-Jh*hFxHP5b@YWv%7>xT3@ttO$6<5R1mRcU^|!V+9FD zDb^cuU9GB4t3l0+_e|4uIXuc`w`@DqJOCxFWjnc_SzX)6l=SB(LK`l$mOd~9ezp0Z aKi~~As)MUP<6qnW0000vYE1Mp_)oS0H3@eA85kHCp1%6Tz(lI% z?i{!OZg#I2-0WVFZu7#1;Qxo_Y5c#wU-v)E3q-pBrh$QhfuXCLnPL963ych;gaNVv eFwLW2umAuz6dr<(a(yNM0000qZmMrX1D?5YKGf-%;8CwdwDCt4#EurM$% lFw9@W!N9=4K$^`^003smJ%Z5$t4;s_002ovPDHLkV1ieZIxGMH diff --git a/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_handle_broken.png b/src/main/resources/assets/tinker/textures/items/hammer/magical_wood_hammer_handle_broken.png index b8b77395c4c6d44882f9cc7a123e0354b8a4f66e..693a494df2720b750f35f5ccec26eb32aaaad3ca 100644 GIT binary patch delta 95 zcmV-l0HFW41cn5#uK`y=Nkl!8 z29WG*iUW*nTd@Tg(FTDO9-61||N4Gi@@=OizyR$_K87)aB4Ypm002ovPDHLkV1lwA BC^i59 delta 146 zcmV;D0B!$<1h@pSuK|B_Nkl*BddAWOPZ!4!i{9h}1tyg$$v^FhNmr6H>`eS0*ZVffzGQ1KiMhX?+q^-= zIl-*CpuA67VsZ+H$HhZ!2^PoFIO3WUxGwN6=<-g8Q`WRe0IF_cnzlxwQPQETO2OK& cmr075p~tcH{=wO69x(ucr>mdKI;Vst0H)C`*Z=?k delta 204 zcmZ3&@`+``ddB*7o-U3d7QM+S3QQ_hl7HGaKF{BMphM@lOV6_-6Xba=CDlYc{U|lz zMe2wBYrg2u(bqlJ{z!@q2;6d{Cg!FkBqUf=`t>ye!NbSm9RFXg_Aglf!1TaDAIWp| zU!NJbDYEP>cyJ|_$FNS0Z%6ruT@3TR&-BU}8UVqW_`{Aa7Glpp7QPWGUhK}ZsA~<+ z=j#OqXYQ9ZPF%ovgXiU|G&Pxy8+)2^6gK{HW3**p;3#lyos)9lFar>Hy85}Sb4q9e E0P5ddI{*Lx diff --git a/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_accessory.png b/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_accessory.png index 78d2e79b334064a662399b2f2e5ee6ed8e9b6829..539be6e1c911cf849d1fde1cf02e8115c4fd13fc 100644 GIT binary patch delta 92 zcmZ3-ST#W<%+b@uF~p)bIYEMTae_zVzJ2@t_xASwKWTR0zopr0A^4n>;M1& delta 145 zcmV;C0B-+!t^trFe|1SjK~#7F?NG4|z#t4W-PjN#5AX+{@c`%W2?L)XF{A~l2q6$% zE0HO2V#_g3odo`sfOC$lwKTeBBe0r{F(iaQN(tWk#%s-r*yCDj;+!Mrj1WTQUj4zY zk1;YSB_1KX@30+dwtobw6Q$H_{S7Obl*=3N&K!*Gl$Nsq3jhEBNkvXXu0mjfp(j5$ diff --git a/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_handle.png b/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_handle.png index b64411339ff948c5df1202ec706171f1b5b2a538..59ba75129ad9b0314e42ec53bfdc2d9c3951ca6f 100644 GIT binary patch delta 97 zcmV-n0G|J|0e_GrTSiGlK~y-)V_+BsSb?^-_J6W9J2^T1H!v{xPmv+&>gxad`uhGi zHa1db2*oY|c_%0+h%%S3va*5=@$&Mb%sZoLlZF5Q5jq|RU^rQ500000NkvXXu0mjf DHn}LQ delta 150 zcmV;H0BQe!vjLDKe|kwoK~#7F?NG4|z#t5BD>1P01Os0%GV&1*@ErrUFr-C-g;3EB z-CzlFV#_x6n>S#Lq4|cR=LlJANeF>2BBKVh))Zr;5W>>Q!PpI`B2r3}Qjk)5ykij> zA35hkDOKIzjg!t}^X`MZ_vD;g#$n_R)HwaW=MN2Bct{?G5DK7&C;$Ke07*qoM6N<$ Eg2CfJegFUf diff --git a/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_head.png b/src/main/resources/assets/tinker/textures/items/javelin/bedrockium_uie_javelin_head.png index 796729ea5e91d02702fa017ecba1ed9a2ef31bb1..10cb8dbb41e6327d1e941694b9d3b3275c13ad21 100644 GIT binary patch delta 116 zcmV-)0E_><0g(ZaByCtpL_t(I%VRJwF!(PcBLl|_qymruK|w+P`}+F+hlGTHG06t7 zv9bNv*474NW@cv6TmmuxWUH5#*MBD`Col#XLXsneHx delta 161 zcmV;S0ABx*0lfi`B!7fSL_t(|0qsyL4h10$>^@!)oB@f$pimr{OJLAwG&nTD5O!&T zuia#uOg~9~GnX-DwbtNRDdjpjCH{AlwHBOn5M$is^4`;znCAn|`O;b=7-LIHx%MUs zkb+VQdhamCz?l#N%sEM4{8CETD1?AoE99KX!+7nuO=aWMUmE-rc$WeOA75LVoQ zWoe&L)&7^6TSR&_*@H$i8=$*WRZTzip?>j*2+GW57}=|D1BW;80i-z;=RkUPz5oCK M07*qoM6N<$f>yLFssI20 diff --git a/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_accessory.png b/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_accessory.png index 8af2030ced1977314169afb3892234403ec5bda2..ce0e3eafd5cfc87e1b11a0875a1a03751636c99f 100644 GIT binary patch delta 129 zcmV-{0Dk|a0{j7xf_i01L_t(I%VYTe|33pIm|@g_Q3L2|Kwwq<|C}i^{*!G$(~@QX z!y8*`%Vy2~Pqr6YmM;IF(A8U8IeX53vcq8Vs@4B<`X|)(FIf1W>_D8qZvFqJsncs` jELlo^=r3Hm9_#`DFlhFz&Xt5|00000NkvXXu0mjf6aGQm delta 171 zcmV;c0960{0i^Xhw_v^}M&-ve(ngTb3Xaj1aBN9e}3IdlKFr6e?MM@2AB zS-s}}&8JW6CM;a^zaT!2k>o(k2@PRfuzth;$IoBX&0MnW1G<+i{$Cms%Se_1+t#o9f8hQ5y1qq= z{ujl?5i|tD0I$Fx#w|cY_P>5#*SUD{|MFP;F2U*rAD|(tHm?7F=;^znav6``-~8h1C$eu@L3&&$wvwrak`$Z$GK4S+eYZOAMwV y1fwy|*N<@l(2xWmO|lDM0GDQ>4ZsJ6fdK$(|3H0N8a7A(00007S@AY`_Mr0{j8? WlI*bPb*zm50000c83f`6<@L_t(|oMUX9JO4ii3k$`0K>>NOg|1t3M^D$h%c9lV0L!+*3{=)xNiSa}k!U9s| zY;VhO{>n85P7V%+7tfwCNJvQ%?}gl`2*ydvR{U2{Q>_DO7DAPjXsS+3Al?fgA`fUt z&yuD8rKF@7Dih*J3q%;BB!;xm$1s3gFlxZ40U!VXw5u=={X1C=00000NkvXXu0mjf D6a`b@ diff --git a/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_head_broken.png b/src/main/resources/assets/tinker/textures/items/javelin/inverted_javelin_head_broken.png index bf099b0bd34860a0f571c355f5c66e611d87764f..389b7eee109256b25dea1170ebed23033f840925 100644 GIT binary patch delta 86 zcmV-c0IC1;0nq`Ff=@b0L_t(IjbmUKG$15B^M62c>i_z_{{Qv;{r|}_B%!S0KM>b8 s^iL$ufW*q0|4oyokf(VRjDn#J0D6iQC2uosdH?_b07*qoM6N<$f-J`;&;S4c delta 120 zcmV-;0Ehq40rLTnf^l3)L_t(|oMU955U^0qfROae|9}4cVbIssVqjooU}!8XWF*Oe zH8ZC(CX`kDfB52Mor0uf6Ui)n{ delta 104 zcmey&Jdb6=T1Lj0$?F)!qAnht*4o}?=q2}wftj!fyAZ_iWL(iF3o-Hwo`F& c=Hxa8h7HC_nagM0NMZm2Pgg&ebxsLQ04Zf0pa1{> delta 123 zcmV->0EGYT1E2)3tpRghNklry<))U5`u=1 drEwGx2LO!qBvRz*hmZgO002ovPDHLkV1fdlG>`xQ diff --git a/src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_head.png b/src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_head.png index 290fbbfa0a571f95a5d695a6677e2251939613df..0272dad522857f3f2e8046d6c38d87b5ebd0b324 100644 GIT binary patch delta 93 zcmdnY(!{c1En}#Ir;B5V#pz^^FNQz*dn7$r6@0IMfBnzi#J}0b*+I%-*6!jv2WF%= wCjgn^W-QHyk?R-|H<>J!K4iemdKI;Vst0MtGsIRF3v delta 143 zcmZo-+03$GEn|J5r;B5VMQ^gt7sDUt8(5y@?>unAfhi#=At6CS``_sa5?`7dfq?O@ z!y=xF+W+Q&9uQzZ scSqGyMnYo2Ikl_*7bl4D$T2XuE|ZU(y_|C&0}yz!yZX7Tb4q9e0NqYEfB*mh diff --git a/src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_head_broken.png b/src/main/resources/assets/tinker/textures/items/javelin/magical_wood_javelin_head_broken.png index 76bad6b0a7b8a3d995c7ff7aaf1713adaff6ff09..2a481aa4040437e6d357e50c1d3964f56f354317 100644 GIT binary patch delta 72 zcmeBSdCRtyvcW$c{>1j%2VTkA9zq6k=#)JU~JYD@<);T3K F0RU1ICZ+%Y diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom.png index 3e4e3eddec191259c2dc226f90cf75de4341e54d..a5cfe3999c94fc7b698c828fa8c4a2bfd0fba464 100644 GIT binary patch delta 110 zcmV-!0FnQ=0gC~UBxh1dL_t(I%VS^|1;YuLnVJ1JGBWy4wgGW*asS!a*#3uvgph8C zf`S6rb{QF&|71JAv9Xad142VX{~H(>{3ko`2G;prUS8xm9~J{3Om6f80KoGp5feyx Q!TkmtVgLXD delta 156 zcmV;N0Av4)0k{E>B!7QNL_t(|0qv174ge7pL}&L1B5I{t;Tjs3);ogA86-CIlig+; zl$(`|F!{#w;UAysKnP)Y@5kz+&ijCK4y6>Nl$Jsc23Tu{QVOj#)LO-(KO-S9#vsNx zQ~#=w0J_B2T64LigU#!`Z{hPMA=t%#0&>pS!Dj&Y1C(qwrWFf?4kKGM4}q}&0000< KMNUMnLSTY9wM5_m diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_1.png index 122df71ec9b41995cc9329d067cee9d62a81ae3a..0720c9f64772d16daed914bb59cabdedf3efc684 100644 GIT binary patch delta 122 zcmV-=0EPeN0ha-gBy(O#L_t(I%VS^|1=I&-W@i75jEw%1rPQjQ{`u07*qoM6N<$f-;RVNdN!< delta 202 zcmV;*05$)Y0pwE zk3^XukDr?;r8x~n0Vt(#90#P7L(NU`x~^Rxr)dK41{YO0=k1j$&j0`b07*qoM6N<$ Ef|(>;VgLXD diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_bottom_2.png index 990a8c1504116eb88a97a467a22a593abeae0725..aad55af77142f91ee006e6f0004461bda4ca6bb5 100644 GIT binary patch delta 119 zcmV--0EqwC0h9rdByd|vL_t(IjqQ-36+kfv1FM*#0*^x=nF1{PZ;`J$K%w%VPjWA7 z{k+G_psHwv-5r?;5kW-UmoPI#1bgrMa8-ebdduVWV=yW(Gh}A3fSIAHbN%*#BmF}+ Z`~mtWG4LaOczFN-002ovPDHLkV1gtzG&leN delta 188 zcmV;t07L(j0oVbMB!8btL_t(|0qv484ula9g=e?W=+qKwr9xCrp>|$JZ~&D~sj?v< zBwMh_cE3bOy!qyNz%%}kfKsYTDeEcvy$X#nl`#gT6tLDFL0&6>b6zpVkaLC@<94>{ zzV4lK6(LklI}gb0@@w~*fiY%4uht0&A%GC#sn y9Hf+HO1{g)xj?;ln4Nq)LX=~Sk(LMXGd=>D=ULBSvJEogA5``v!$iw qe`{-Nu;%daaPquBmd&GJ!~+0hB^3KZ5)D=W00003m`BpZX}UQ{VxKg%SDZm_WJ!0000-0g(ZaByCtpL_t(I%VS_55hy4q{D)yPGqe9hX^M-B`wzoxY;6C%yu82| zWC%gqK$?tcH@Wd^b|je=1y^Z)?= WA1YOVdi0L~0000J8Cw7V N002ovPDHLkV1m45L1+K~ diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_1.png index a71227df55f7aa736e468ff6c5ead1eeb145ae4d..7ce8a07caa551b739ebec32d6738c0bae41d0821 100644 GIT binary patch delta 120 zcmV-;0Ehp@0hIxeByn6xL_t(I%VS`mCy0xS`_IC{^54wN42+4^q@bVx)({#R`rpgT z>wjZoBbaSqV1U~YkOq)um?k45qyI88GAJ0QW{`~_4cgk;aK#}ZA^%D8FHAGTC>RAp a0ssK|k1xn8N!}X(000074V~!+aU=tA|KyjdfkI?>kB<5JJE?2k$*@9}E{t zDQc}#6k|k6>EabaSjdI>F2`~7)*6g4$T?3|N(pQ2t>HX610rLrZ`;<-+&jMsJU4+4 XS+_H9BE18z00000NkvXXu0mjfW!y>} diff --git a/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/longbow/bedrockium_uie_bow_top_2.png index 09662f282db8ebfd5d4e88469847f8ca73f4b03b..77202cb64f89922de3527942b6c0dc7b909e3510 100644 GIT binary patch delta 123 zcmV->0EGY10hj@hBy?X%L_t(I%VS`mH(+65`EO=s2F65bh>MH+ub`j+*AyBW`oFQU z5lkBx7~nPpq!^?bq|nRD>%X?P_J1QIqyI88GH{GjGss4eVvr`7;*gLKFecisFwG33 dU=$1q007K=FPmwzE}#Ga002ovPDHLkV1oRyGj;#~ delta 181 zcmV;m080Ou0nq`FB!8GmL_t(|0qsyR3dA4~oPdxYqzWWuAgNLWU*lsf1+DymU}a|^ zf(Uy=NOw6nuDK#x%@fJXx^D#-W3=ykJ5x$^tW6(42tiUx48zb^(==h*Hdt#> zN}*c^$8pfIEXX+{r3B|3`o2d9p$VPfy?^guo@c7HLTil}<1Wbs=e%`e%}Ncl(=~4%HhQ8(Xk-HfHRRO5}2OcK%;oS^3x8 z$cQO9H#gUSZ6hxa&jx9xO@hlJ+}zlDoSmEu4C2HOm>Bmo1sbR@Feua+oDF=uZwCVq Nc)I$ztaD0e0svz7C3^q> delta 157 zcmV;O0Al}&0l5K?B!7TOL_t(|0qu|>4g?_(1bY=8fkGfj@Pya!LSBL71v~+ZAOyo) zcEshxUQXVM9Wk9rsyma$-{<)CL5z`d&QMCdQEM$~tth1&Ujw}Nbb@nEj4{w!i>E!?zK7f&E(mhR@e03 zD>1dUq;~>&24pt2{P#>us;!tXiF^ZcTieKve*o2TG!j$yTMhI80000cZ zAAenbN6-I>6(vL)0yZEjzxe;zQ>W`392}cS(TwDR{|x*B{0#s9|0P8)vH^??AK$-c zU}R(_-GGFO>i_4?oT;<7wQrhSTS=1h!3MCgu`|fX$}w>8@iUTaJJ`>Hq)$ diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_1.png index aea5079ecc1a525cd1f6342734df5553a132fa62..5f7f2a1a321c1fe0655cb30c78e657136aeda597 100644 GIT binary patch delta 193 zcmV;y06zcX0=oi`f`6n*L_t(I%VYTe|33pIm|@faOalUnEB@;^xcn!}fato$|E3;Z zwf12VwISuz|4B9=rmp$FM{GiENNE-6E(ir`GIDjVji{*oPgWR2Rn`1=j)<&{swC5Z zg!;z+*1iF?$xUsf8&KBS`QI@lv^J-`<3Cx^SlZF~KO#4`wmPV@n>+(RE(l0Xtu5~A vBF})#me&8a0fDud?d|``PKjA$Xa->bR5sv7-pVAY00000NkvXXu0mjf6$fA_ delta 232 zcmV7G`XUj zBsYK!0A&YpNeKovCT5asha12MwDZT0A3&P)j0HB}^Y1?lZ(qM*kW^A4&wy#wRgBpk i9sj3RRFD`43=9A&_dEC{%N&~k00006x$|8lwpwf;GUL~BMdz$ZQPznZ0Otv8WQ z$7w)lX*GEUc%^3nLtnQxvZ{`B16<>i|I2FY)y7sekfa%5Kr?L8e^pb9+Mv85@(l1y oO8GCTu1UTDARL-UTJ*s%0NUKw6m7)ldjJ3c07*qoM6N<$g5)AuoB#j- delta 221 zcmV<303!di0@nhNf`7nCL_t(|oMZg||33pIfQ2I6!_)xpw2c23j~-!oa`g%$$p!@F z75%?->{uN)A3uX{PX7PRQzjBL1jPVQgtBpPGH97uHLai6O_~e*Gjso6IC`Yc(B6?~ z%_s)^`~R1LgNK*l50EAWU<4u;7cY4R{9|Bb`15HL;f@=Ys$M X01H1woz>6w00000NkvXXu0mjfA(3Qm diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_3.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_bottom_3.png index eb77e2441dcd148b318a28097c153b4f92eb505b..77960fda107de926c5eb8b1cae58c1d9e8f59f32 100644 GIT binary patch delta 179 zcmV;k08IbR0<8j&f`67tL_t(I%VYTe|33pIm|@faOatmCO#W{d7Wtnn1L}Gw{I~EA zs`XFLs+~Av#(%O5@J>oj{~!6ayM3P5EyLw4D^qCzeeJZ0*Ci-2JAT>$bzU}g?5^kYDB-0D+Q>Xp+h)=4W hPHq^0FsYhB7yw|1=Yi{dU`_x4002ovPDHLkV1ml5Q!D@g delta 212 zcmV;_04x8k0?q=Ef`7M3L_t(|oMZg||33pIfQ2I6!_0As8+Y6%}Q0G}LP%Ml*^5O_Qho-wm`q+|#WopGeIp z1~4))Fo*%2{*RHggatPMr0vc127tWq{@r^967?etsL0A>6kwhGKO;4jBqIO;Ix<(8aer?B O0000HQ7|F_05<$4KnoM| Q^#A|>07*qoM6N<$f}jsKM*si- delta 155 zcmV;M0A&B^0hI!ff`5KVL_t(|oMU955U>nh16J?Z_dnFdiIFS=*6ly||M-PVbtQe1 z{`VB+;WY%qfK7*v{6BT=MjbO7D}#ZW8X*Uu8nEHuq5r3^UaMnZWMVMZRBsA(awN?Q z0rqx`jkD(dH_*~x@VBuhs2Rfm5U5W}CQ2ht14sp<1`GxR02B-|BPTco4(9*>002ov JPDHLkV1hbZLBs$6 diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top.png index 7615c22d4d6d621a41b32f077e3b41ab0a956b01..dda1fd2225a31ab541f8a0dfb1aafba54146b40b 100644 GIT binary patch delta 147 zcmV;E0BrxW0*wNYf`4{NL_t(I%VS_55rmgi{0HH%!jk`C#by7A(^OgaKdh|se;81s zs-tVIRd`gbX+TJAI8Y3)#@L4D|B=;o|214ZYRy6-YE>LuYEx<&|EITf{?F{}BW$~t zo9BP)h-jdu`v0l*EnrNlml@I<$8`~yk4h{w; zR#t}TCYQU%gR51Vm&L1y$!H_{|00000NkvXXu0mjfgi}yF diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_1.png index 1c6a5a6c8dbae51a5858d317117834f5ab8503d3..d643f6d86a562989b8da3ae33ff89ae6199a31d2 100644 GIT binary patch delta 175 zcmV;g08szO0;vL!f`5`pL_t(I%VYTe|33pIm?Xt1wGIE1YwG_eSJ(YdZ)*8ZlmYo2 z-TyON+W)6DHvhK>i>P%=POEiEN~v{9NUAOE?8dDztG)9-2)m}F*9I4s)H=o{)|NK6 z{V!>1hT!H_+%Cvy>G=W7f`70{L_t(|oMZg||33pIfQ1yrsdbJ2!4?8B3p*RbjM{2Of(8_H z_Wb|#=MTf*zke96+`Li8$IHj?@BcrBfB*h5ly&v|$7w)zM;F*{x9{EqYT{*h_vS5w zt*&0v|Nnm>3K*Ffy2?thyCAc*^Z%{8ck6g~xEKu7RGWZqW=2qw5Cdu`Wkgqt)qv^M z<%~XAdH>ZVBpA9%i!n42Gynv)Oq+yPBS8a*1)~Ox8UO+Sonk*9_dsK=00000NkvXX Hu0mjf?Y&|+ diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_2.png index e92946b196f2be94df3621d0386b34665932bdbc..b792a64fe6c055fc9d467ab089aea50578e46ba7 100644 GIT binary patch delta 169 zcmV;a09OCS0;2+uf`5!jL_t(I%VYTe|33pIm}Cu^ZN2|9+aZ`J1Cqi=svIMrGOht^sHv7VbpZP}E`|H~#%{$Dv| zDsC5Kws!v4bM>foh={H&?w$BQAILB4>;__pvxy1=hw!NXMIzn(|EV5`qXvu`KobK1 XLZRbmoOm8j00000NkvXXu0mjf7oJmr delta 203 zcmV;+05t!j0>uK5f`6__L_t(|oMZg||33pIfQ3{IS?zuQ85kk#X%$6`1Pw?juZB30 zk%@tokB8y(@#A$u0s;*0KYU;)nZWuVrvd5pE&u=j`@?Yb)QLJFVPUYPpFe+Q@bL3) zVgMS+3^cGUI}5uDvf8@-pE!OLtkK)ozv<799}G+^Oh6eXhD6Tn97bfdSPhs~RmSLe z>EeGQV-tp+qC7@yYVaBW0{d4i#jBB^0mOn)14a!10RT2XG+*wnb$tK;002ovPDHLk FV1kG%TnGRF diff --git a/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_3.png b/src/main/resources/assets/tinker/textures/items/longbow/inverted_bow_top_3.png index 1b3a9894f79817261d48066194f1d78e88559a14..cc8268680bfba44faff388cbf7bc2d2767143361 100644 GIT binary patch delta 167 zcmV;Y09gOQ0-*wsf`5uhL_t(I%VYTe|33pIn1SX7Q{jcio0pn^QuITK>?*jkS%>U(W?I8aLJ`hI@7&U+x3;^K~ V<%h;W>I47)002ovPDHLkV1hhhQCa{1 delta 199 zcmV;&0671l0>J{1f`6(>L_t(|oMZg||33pIfQ2I6#2Ap@((<2~fsuiUiHYI=zkdwB z{{Ch7_4^M4BalC%seuuv0i|v2|9}1c$8h=D^*R9o0fx_?K7qx#xwsgB<}ti`_l}{m zv->|*0}5JN|6jO#wN6k-kilGEuL)>911k#)!(X5aKme#8$Uy$j&|X%8-31eBsu=^) zvi_^f$uhK8lrxeQ1{-Eg!>f^?0mOn)14a!10RYybHoRDoZB76H002ovPDHLkV1g4* BUSt3O diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom.png index 10d2bf1bbd11e63a0627aa3f5f181f98a7249c2e..e51921173504757bab995b83b422275c4a4b2313 100644 GIT binary patch delta 73 zcmZ3>(!jD|JtL#d(!jD|JtL#dlKXA=$M2fylKPw^;(8#Aoo WG@4asa><+l2s~Z=T-G@yGywo4U>7<7 delta 95 zcmV-l0HFW*1C|7^uK@v4ldu65QK~*BYz9$e07Whk6X7M<07eF=v$d4O7_QxW#V~){ z1xB)5K#uJw1}Ms1rOW_PMOLy5U|@iT0jbdk0|1rJ5^rEIKWYE~002ovPDHLkV1l$= BBE|p! diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom_3.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_bottom_3.png index e93117e3f0f05e2e6192007fdef819ebdd0e6d9e..34659603fbf6db1b439daa30c073fea77524a75e 100644 GIT binary patch delta 62 zcmZo>`O3UuJtL#x7>?>KIKf~jc#pBHanYU7Q#=BpDXRB1JLA~? ed-gi90Rh7fZf?sZd;5eKfWXt$&t;ucLK6V?j2RRF diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_grip.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_grip.png index d9fb675cbee8cc23052f88904baa364119fba94a..fdd45e2b00b7976c5a8f12b73574f575a880ba81 100644 GIT binary patch delta 71 zcmeBVdB?nAJ)^yrr;B5V#p&b(iG2zePd~7Cowd98&OiMej(`3W(o7=Xaj)z4*}Q$iB}GR7Pt delta 98 zcmV-o0GX>k8)>0Bb8T?1aBx_pO5d8npJdOX?_v;ci0H&!s r#|?}@nn|*qEKS&4!7vI&!SDwFaJ(|n=7*qU00000NkvXXu0mjfHD)AP delta 118 zcmeyvJeOs|dd9p+PZ!4!i{9iE1woZ6$v^JTj3=!+dC+I3W8gcj<`qiX&f(_9b<7D; zTc;e60D&Ve6_R{&c5zRizyB?hGPfP`mMKR9Ok#I`?@Ii)joW3X)auXf2Q?&)F))aG Wi$_gyo3ft)2s~Z=T-G@yGywq0S}kM% diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_1.png index e56f2ba1214b8d02e48e0bea8992c72c05ac67c3..4093981811dd7045bacfe85750cccbee996a0812 100644 GIT binary patch delta 85 zcmV-b0IL6;1pEWAuK`UsNklb8T?1aBx_pO5d8npJdOX?_v;ci0H&!s r#|?}@nn|*qEKS&4!7vI&!SDwFaJ(|n=7*qU00000NkvXXu0mjfHD)AP delta 118 zcmeyvJeOs|dd9p+PZ!4!i{9iE1woZ6$v^JTj3=!+dC+I3W8gcj<`qiX&f(_9b<7D; zTc;e60D&Ve6_R{&c5zRizyB?hGPfP`mMKR9Ok#I`?@Ii)joW3X)auXf2Q?&)F))aG Wi$_gyo3ft)2s~Z=T-G@yGywq0S}kM% diff --git a/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/longbow/magical_wood_bow_top_2.png index be523a70f409f93cd9540c73189b98210a24d926..d1c8e9d045102b56ef5a7a682c41da38db7cde9f 100644 GIT binary patch delta 84 zcmV-a0IUC$1p5Q9uK`RqNkl*y9 q0FVY425BV8c5JR-7zLwX_yPd;Su&bDD_*An0000w&5YlG?i@F`0b(M&3O{gs1oi{4uK`CgNkl7}Oxq%iupDjMsqf9Jl|-cws{@7$2Ia@&EdM lUBU){0NJ*Wf>AKE006p}GMXs7$bYez|e*5R12cdgFOF^u*@c;k-07*qoM6N<$g2GxlWdHyG delta 228 zcmV6qnpwMRHx&NRk9fDKt%USzQ>k?fbqiibC`JF81-I zs;aaQ!ZeJT+qOO64;Q-vZSR?fVZgR+R;+ajBy&_z6v6YnQ!>R)|3TmPhHSGe1nk*@c_ht zSTjaxuc%VhrVUgb8_Cfn_W8~h_~OKIY)A{k5GR5oA*D1VW?6=HU2#4_&hy+PNrE&@ z(Y7t7X%f3fpzSD%uq?|>lVk$P%M~OSMS-fS;QKzhuG=jP+F-ttOkLN8_*v}Z4w|Mh zLTqC5JfrXX?eWm%<>Q{CZQ>vZFpeX%*4A391Cq{y`*B2Ub35DJd)bSX+{!*oKB6B*L08~}00000 LNkvXXu0mjfc(g7t delta 165 zcmV;W09yZs0l@)~B!7rWL_t(|0qsyL4!|G`?PhUk1i@hu9EXJaaTpH41yC45mm(In zOt2+$kd*ZEUSC^SZ(ZQG3rH!^7=tqc`yE7N?>#7`?xn|g8?)A0thGXG4PuO!+K3zd z6GY04F~~VXO6kmx;3vPY;G9FwIcTk4k*VQMW0z9;*dc^zWga4T6G9+a4?cVcwlXM( T;vV4D00000NkvXXu0mjfiG)Tm diff --git a/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_accessory.png b/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_accessory.png index e57061d2182a407f17701f134c1f55fe7cd6ed12..f9a51223f1a6312561b8168e7b079a77ee161c3b 100644 GIT binary patch delta 151 zcmV;I0BHZX0+9lcf`58RL_t(I%VYTe|33pIm|@g_Q3H?-=$JF_f6L6-|J!HJ{ZFz1 zla{UcU)|eZ8=jh0YwO`v+dO^7f0A9$vtZHxhDlTZ`^Uu9TDiK_)=!-LpR6#bpEUV@ zKx}+%ZT}?l45;p%@V~IJskXLn;(xMZp<&XL|8$E+0HuQOjt~Xef_(r0002ovPDHLk FV1mEoQRn~w delta 190 zcmV;v073te0=NQ@f`6e&L_t(|oMZg||33pIfQ2I6qXrB+13Kr<|NrOjUj}9-CWeZX zBu0`9n7n-D|IZ&k*4?>ro#ENzCk%i7{Qh5)kxrB$U;}a^!x?)QF8;5ntIzP``;WTq z>(i+#BE{|XY;y0h)e;E{2lo=R^%w!k_ sv=rqtHcp=Uzdkpc_%J{R#A*fs0Av+F)8O24RR91007*qoM6N<$f=41==O&+mPf;lV3_~_002ovPDHLkV1kPqYF+>U delta 277 zcmV+w0qXwM0*(Waf`9i(L_t(|oMZg||33q%V99}l|9}7c&%n;a$iPCX=K1>%{GT;- zTAiGnJcFN~PZLQ7%-Xr{|NPlA>*N&_7~H+QnxY--8HqMv)~V6&%91AjZ)%g?(h!2zL}paDA$ z9s0j|$48c=+)Dg{xNA>Fa1SI2su>IoR1^XvS&40ifn- zD^}IXD=IQL85=d(+hW&@*9EeQKtG$A;?<1P00*F^zrZBwh{M@Lxxm@Zj-Y0|1`rE| bfdK$CpHX;xE)E9x00000NkvXXu0mjf!BH%!`13ycxN3;wL1Ef z86qbn8T^bxCoDIbI58eFq|(COUCEjSA3L|m0eaBf}U{8(!00008vTs^-r53;r`R zG1u+extqbq*`bLf1KMWK|G#YhoH`jk?Cw8U8ae zG!-NyF@nU2GGM~IS^rrX80zHZ6&P6l|8L4qOlE}15j3EG-hZ6`ix;h|lao_m@U^pQ zN=rg$CTPHUT538Yx*D7YOaw+1%fEkhva<3F{}>pXvao2z zX~2Yev;QwzvI4Bx!`iGVBRvDFW}F86VPIqs6PI9cv9oB(Oi9D38K(gyNhyrqe=+{g tO-aV98K(gtP#~K@STkM&hy}yI006UeQ}PI!b6NlZ002ovPDHLkV1klyiqil9 diff --git a/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_handle.png b/src/main/resources/assets/tinker/textures/items/longsword/inverted_longsword_handle.png index 299f41ec2528e47fdbd91513bd126fa57f2cc6d1..f15137cdb02773e3a6cd633ba9aecfa2b8e77631 100644 GIT binary patch delta 151 zcmV;I0BHZM0+9lcf`58RL_t(I%VYTe|33pIm|@g_Q3G%pFlpK9|1M$C|H(3-XW_E{ z(fK8{OLuK2-GKJFi~l=^Mc1y|y#7DQUg(&&_n; rUzdDCU?>&Js6c o;a5GY;4m>wV1dVH4Fy>S29=W`G7}ya`Z554r>mdKI;Vst0DEK~9RL6T delta 130 zcmey(ypmA%-Lsd{SwdC zKTMdh|1Fd9MYe>?K3lj8GSyBo)Xd_PVz{iMcIb4$gDbH-XDfIW+>HI0JFcE-(3TZg iExDZWNR}LH2onQ)mBV+*osl67K;Y@>=d#Wzp$P!E9yKcf diff --git a/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_blade_broken.png b/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_blade_broken.png index 4bcddaf746467b5293bbff15028de55161437fce..0ed840ea68324d1248e03a66bdfbe702f28888c0 100644 GIT binary patch delta 95 zcmX@g(#Eo3J!80&r;B5VMQ?I~0<%h$}7>`<4C{u z%ta@jH5Pw6)RyomSIyg)BVdUni^e4zE)RAFU;e-i!JR@03_#%N>gTe~DWM4f{=g$) delta 159 zcmZo;Im)tOJ!5^Nr;B5VMQ?J70<%h$s z!-N_8-!ds*WIJFIzx#U^NIvo3HtrstBUOyga*7wbYs~8W#AKGPeEP8|!}QG)8U6GR z%+Xal)E#W>Cw?GDO!#4{MZqgQzq1yx4r|ipunDZL6bTULWMFvs-bV8N%tKuaK;Y@> K=d#Wzp$Pz86hsIB diff --git a/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_handle.png b/src/main/resources/assets/tinker/textures/items/longsword/magical_wood_longsword_handle.png index c79cb7ca7ecdbe4b42b69878c41cdad6a7645000..4afc9e1a0b6da7cf00066d7d5cdd6f6e4ec6c8f0 100644 GIT binary patch delta 82 zcmV-Y0ImO_1o;E7uK`LmNklG!2_h3B4;0( or$N5v>-%-d(+o3!Y|TIb07v{NlvT2|)Bpeg07*qoM6N<$g1>_!B>(^b delta 122 zcmV-=0EPeg1EB=4uK{vhNklW6M3?RkX7$DKh;Qyg{8vhf$4E~d(5vKY2eqHi3!weu> cGXnzy0A%efqFp91KL7v#07*qoM6N<$f^7vdB>(^b diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_binding.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_binding.png index 61d670bb02e946c396fda1e65da00523110f6239..0bc7acc5f4fa402e4aaaa7c077d03869ac42d4c4 100644 GIT binary patch delta 86 zcmbQiSTaE+z}nNrF~p)bIYEMTae_z!Luu*P|00=rIXQpMA3NqYPtniM?>{dO&%f;K q?EljzPE@=rFhNZqEiFyW)0iP)vOu8hx_$c@fWXt$&t;ucLK6VBjv&JT delta 122 zcmV-=0EPc_m;sO^bYDqCK~#7F?T|4Fz%U3!ZHJs9d+w2AKB*bk{|A z{{Mv!IoUuqur|7{_p2yEbd1piU+sQ85UCd9lmGw#07*qoM6N<$g18?z!~g&Q delta 223 zcmV<503iRP0s8@vB!9w5L_t(|0qu}63WP8aMgQ)ipp~^)*;v?k21}3N6>L402k{m* zf?Xh8ASBrxAz_tBtd|Xhfyuo8Cm;Xw3kf{#d?Jb>Q`a@5l;E6WU027wLIQ2unqe4F zmL;^-nCIESAr=J3acsJ-GfmT&An-jfj^hrIKv5Kzuy-AD&RDVxLI|X3ifNj>b7XjU zsH$prN|MAI7y;+|v<-s$zQ?jG$nzYZQ=2aki9pIF^DnZ%A8U{?;WKS)LLcO@c^dL976cwy+5nM zM@*+_ttHGkg`+Jvfa&bb^>faW?wo_x8pjm~&18%rT>ZoIgd49<`PWbD15o==fQai5 QXdC_uk?p2HY}wo`3I;5<*^Wm#m3kDLO5 zqYuM?aU7ww#=h^c)?!^(=?YH33R)m%Sw;fwFgcDxCipABVuE(aH|YP)Uw(h!3)TKh U19{O%GXMYp07*qoM6N<$f(Z9x*Z=?k diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_head_broken.png index 3683487500181f473462a09f586181a1af8c3505..dc361810566239e35733603d8ede624bcf0e07e8 100644 GIT binary patch delta 155 zcmV;M0A&C70k;8=B!7NML_t(I%k5FS2?QY&6a=dfVCE?2^5oSEurckzEAk-lz;pzE)>m+M_ku!h&KQL002ov JPDHLkV1nr6Li_*# delta 219 zcmV<103`pn0rvrrB!9k1L_t(|0qsyR3WP8a9OV!@!NNiW1+lR6F+R;_*!UB{4=C7L z1`-m;xeG}dvAzq*&Mv#N%mi;vRaKVW8;+kH$I(vHWRoPZ!!TIah+Oi7L@LV?X__LA zW6bl+Tn-^J5vjkfYee$1EQ2uyLI|Aa83h**p(qL{rO@|1?NmY2G>rScvx*N_fzY-s zmSsU**N{?T+cs#eaU2J;f(mHDS;+I8N_1VvcwHAOcwE5KcOW}A_)GqM@lSsK2fpiA VKGgegRyY6v002ovPDHLkV1hq5VL<=@ diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_shield.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/bedrockium_uie_lumberaxe_shield.png index f3bed20bcbaa7dbecc5fec74da05c477d5107169..ccdb9f591b3bf20e99c5d9c05ef4418926a2e47e 100644 GIT binary patch delta 96 zcmV-m0H6P$0e+AqT181jK~y-)V_+DWKwVw^zl@B`f3h@}l$87j;gFCJ(hYEOa{3Rl zT}eslKQlA)f08wWaC&+=7?bP*ke`t;!zdU9NB{tFp&nQgf%Pu{0000{paGC1d}m2SK~#7F?NGT5z#t4fq>Mp}*n^oEi=jY*k_jx!!AR*%o5b?d z`0jkhMHgz?@SruoFC< kH+r?+yIFj#|M~I{+=lfb&X`WFA^-pY07*qoM6N<$f|^A<%OGL_t(IjbmUK1*2dTV1UGm>i=YGPOq*1A6-;Z>z|QDo*`L{ z&Huym3Ts1wIIq2vbVI5pPWfLoY3lz9AWe!s0Na)ry!S7y9{>OV07*qoM6N<$g5Z`Z A9smFU delta 122 zcmV-=0EPeA0rdfpf^%L;L_t(|oMU955U`9IFlxXsG$65}`v3fnRz|W6NUyE`|K;n~ zI{%EU{~KpaBiazS0n98c41fOoWng1tugh!i{6DF(oG3%!1_%fUG6)C?HU0blpP?f^ chiDf709wHs)450B2mk;807*qoM6N<$f(WKIw*UYD diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_handle.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/inverted_lumberaxe_handle.png index 448015180fc40e74558f7941a6f9c42eef882aa9..96bca1a70e4b284daa539f6964f5c6f649696f92 100644 GIT binary patch delta 208 zcmV;>05AXk0?GoAf`79~L_t&-8STMa3&C(02jKT};l`Dc!-ZoMIV_unl0~a`NzN%k z(?W_%%xrwVpReG5&GXRT&uGpT2<8jOwly5QCrE@knIn+Oa-z{<>+OL=$ioSIi8RM$ zm3Q6?B%(f=!k5f&M3Q-JKS3gt;TZm8hNCrwS63VKEyLPFH%TpoN)^s^x@@{H(6@T) zEu{W{W3tL+?(_L^2Z_*@8-%MhF6stf>>Ehb!ES0{#M!f`8{pL_t(|oMU955U`9IFjNf4>+Jb|`O+l@adB}57e^b06kmTv zq7BGy@A`l4%$YiI32_ETXS=2pZ(l}adAtT>w6y;}57aCwD$3yE=Gv6*?Zb$!2B!g8 ztsVa_oIhVDBqYS(?B>>#>5HiurvaHQZT~L^5T8|pO01_l$ zF?;`!Q&*wrB6JYJ!R4(6UHnK)^1hFQSe#5;#WUW^^KkBkUog$AE}x$Deb#OgoS0M# zi%aZptS8P|&P}S_)xc|1aA6*GxHCwE=tU6^vl(w?HQ)Pn1%KJ=3zDN3^^p_HLBQzb zI2qsEsn%d(QXOp%l71XxtwRz)*g~;VVgdynjj2{j5;>a6c z-wNMjbUI9IWm)O2;i{4{&jIl2e(=TF)l`0~jo0$AMZv+=X5;KXf1eM9wq$Pp+D_&G P0000X$F@NPrL_t(IjqQ*MwMSyn9%*mf^{9GP-|Oz9J zOkk{nj^}qYTIVbCCz|lpoZp|bN;u_nfJeA?tJq6KMIB| Z006iODAKuO3TFTS002ovPDHLkV1m+hIS&8; delta 147 zcmV;E0BryA0gVEXf`4{NL_t(|oMU955U>nQ1N`#}|C{S*GgPIeFp_M5UvA<5KY#wz z{r&f^iDVZ96_x#G`1h}lgOdX;MzjIG`NjW#{`ytN&Be*U#K_3N%*0HZ0cP4-3=IGO zH?c4?F)#uRs7Ov^B*}o=n-LBunyJKIxcn(LT g9%E)xV$c^xhQ=l0%!PXliy45x)78&qol`;+09k+=egFUf delta 90 zcmeyu+{m(FJ!6oqr;B5VMQ?I~1nc4ik%R^p{pSBmUL`tRnJm**6&fosl16h;myz6dIpcKG_o;pPvB>k`0Q@Y00f?{elF{r5}E*w3?py= diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_handle.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_handle.png index 20051bb1ace9048b85660f6ea0277580beef4a34..5149876a219d84f3b66bbb95026c2b8602aded27 100644 GIT binary patch delta 82 zcmV-Y0ImPM1o;E7uK`LmNklbYybcN delta 151 zcmV;I0BHaD1HA;WuK|B~Nkl=5obOXGff+a@a2U4`+yh&Yz(D6Ggl851ib(N002ovPDHLk FV1h4NK4Aa= diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_head.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_head.png index 94df4c9522624a2383a5cd86d30cfbf5b99dd571..46aa4883f0358a38f802b6919e40060adf873edc 100644 GIT binary patch delta 108 zcmV-y0F(dL1d{}?uK{FFNkl=ImtN{QZ#$&3Z+63JI O0000|CZ_T+V)-w1yfpZ`^pGK}7gOoABy# c5uSPmhOLv0CW@N*o@W38Pgg&ebxsLQ0QllbZ~y=R diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_head_broken.png index 50e7dc7702cbd2a4cf0fe7a0936935381d2cf4a4..b0f8695e3c934f3f1035d3ed7d9a0371ea22d695 100644 GIT binary patch delta 113 zcmV-%0FM8@1egS{uK{UPNkl-n$N-`ZL3cLHfQ1dg#2Wx}HVlI_6Kw#p7mziRWB|HB6h-AI7`6ZaJkeO2 T*zYB100000NkvXXu0mjfk{Bu1 delta 152 zcmbQivX5oMddB)HPZ!4!i{9h}1xA%B$v^&IjDGa%9CMlUY=S(`rKB336Kw*y49v{T zhu1kL@%*uo(MV$9ZLqBVw~f2UKfX380SGPx2{rF#TFNGYWaC6dYVEpo8_Wrj_7pvS4eqd*K-LE-G;I1@p0Rs?ty85}Sb4q9e E0NL3)H2?qr diff --git a/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_shield.png b/src/main/resources/assets/tinker/textures/items/lumberaxe/magical_wood_lumberaxe_shield.png index 3d6775683288654d09dab5bb6d49af9c064de1a9..5fec760d0ae82922b007f972050782d339fed376 100644 GIT binary patch delta 76 zcmeBV`OLgwJ)?`hr;B5VMQ?I~#LNZO$KTd3ntrf;lc|0VhuV3D8EKn%9Ip9HV^rWh gF+=6-;)EN_3~Nl(ieCtBsb&BIPgg&ebxsLQ0GKNsTmS$7 delta 98 zcmey&+{vPN)78&qol`;+0QRgX ALjV8( diff --git a/src/main/resources/assets/tinker/textures/items/materials/bucket_fiery_metal.png b/src/main/resources/assets/tinker/textures/items/materials/bucket_fiery_metal.png index 8461f9b5e3b246be4e92581c1a10cce62237e51b..19dc384c277e766e85f9a9e3110ca1ac3f409d5b 100644 GIT binary patch delta 231 zcmVn&)=_3L)wM2n%LoOcYv3Da(Kqf`wfv6;+*HYC#Z8Zcc9jx*Ft=yg@Te0GJ6t h;ch_w7gGJ?<1L|K8HcgQ(vScE002ovPDHLkV1i21VCw(? delta 395 zcmV;60d)S8BB~>>0}u}eVoOIv0Qdms0Au+PRwR-TDt`f3NklZ&b{Zm=N!(3|CY2bXj#@evvpn11~E;O_s0i@llwg0yS}1p4{-2(e?MR|*|lxk0NlDBp6BHklSttE zKC{^@AK=amGA$MhOw***Y5@=g0bP5rcah{{H*R>-J8ly@olf2cfaiGxK>)yLG}tU&+( diff --git a/src/main/resources/assets/tinker/textures/items/materials/bucket_knightmetal.png b/src/main/resources/assets/tinker/textures/items/materials/bucket_knightmetal.png index 685aae983a64b022b2c27b99a550c4e5c00aa964..d73767ce3fc3c1dba79846474c55f9d2b796b4a0 100644 GIT binary patch delta 230 zcmVxTI*Iaz*-w1 zDTs7=i~%Twr~@Dj%*L1~w2)Gk0VxE7Qz;cy-Ck-z5NvL4Zvna*ADP>I(ll3nu1EZ!sD#I{*Lx07*qoM6N<$f{u7(2LJ#7 delta 387 zcmV-}0et?EBA_F%0uT=dVoOIv0Qdms0Au+PRwR@E4=R5FPf0{UR5;7UlQB=iKorM+ zB{pnLOFB3-Bo5k@LHq;`E;1T6Cl?)DSjxl%OBWNv7jR)~(htDGB4J_07zZ_m#CkpI zYQzD!6e!U|6aUl8yLZ3$zjt@=-_o*@<#Ktth#kjK`5*|^>bJ5sp4Y1sYy$uhB@}D} z5hVcARgiy{-h5uKB85cH>zI~_HHXAef{Z0jahv$o zvJK){S1jAWv`n5K$F!TB%|{5skV>TjK;!xX8B4Wx)wltmR;%Irel}n-nGl8{fC4S# z`DeU5jp_IMn;k45uIqAodCbAyk;>n_-jYjfKxStH=98VaS}gz$_fHrOhpJG1NFMGb zyl})@t`Z(HA8~e`)?eH^=}0002ovPDHLkV1mFgvrhm3 diff --git a/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_back.png b/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_back.png index dc4634a871238ba58b16e2b528d4376c0ab77514..7296b7166308eb8a218abe3e68d0d237fee7a0d8 100644 GIT binary patch delta 94 zcmV-k0HOb~0ep}oSVKufK~y-)V_+Bs^atwd>i=bAWd4(-*}%Zye`90g|GvJy{~;kE z3iqW~2E08XMExxxCI2><{907*qoM6N<$f>yXH AGynhq delta 149 zcmV;G0BZkyvH_4Je|bqnK~#7F?NBiaz#t5arMS5{Its3i;xGKC?+`~H;OOWd(mDiJ zr9&43A(!JWfrC>&Bw&m|r4-U@Mqp)HYcYfXLI_AHL5z{zD@M|kQdsXDrIbX$)`8(_ ztuf~udhbDNjn^P|JLe3XbEviMTBqK=dCcvgPYFD8tsOmG52w|A00000NkvXXu0mjf Dq&Yxh diff --git a/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_handle.png b/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_handle.png index dfe32a3bcd0f9c65278d36c835e11f46b69022ec..b95261a8b544e9d47343ba0861b95e2cf703adec 100644 GIT binary patch delta 134 zcmV;10D1qA0;2(tB!6m2L_t(I%jJ@>4FDkw1CfxJf`XogDnn2rYIey2tZd}s2f&n{ z{&I2T5dJr%6y%&C!D}t-y)oy!Utne!V`z55y?3DWC0dn1@=H< z0165!7GMB$;YG6Lh{Und#*%#}>ps2v!yg{4wd8p&rgUYT5Zg43R8<8L!8A>GG8aA} zw=7F4V;o1U>uR}cD4b;(mSuT?Ls;me<|vA&ZtHeIn~M8sd~K#po1HJwMf1I-y1n>Zt_(_R_X)U_|0000>AsMFrQePhk@r!7_D5ae*vg<-R$-aOH8t z+6N)kfBYn+A9Bu~PEl2FtvPl$TuRwtGxJ)jGjmLWz*@^iWDg{ehFd^{Fq(`p;^#ns tNA})#6C#Q?c|{mBnRA{!_Hy~+0f(hHVk>4HE5b9YOOJjBczn* z`~GK=tU+DZSl1PtbF^)X5CX{boaA->NZ$mI5y8u{z&QtF3`e$YJGi4r!L+96LI@1Q zfU+#1l!Esj*4mxjj}*w&WJKCDO{l60jIpmIq&@qY!0icq05PdI;lZ+=B>(^b07*qo IM6N<$g3$kC3;+NC diff --git a/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_head_broken.png b/src/main/resources/assets/tinker/textures/items/mattock/bedrockium_uie_mattock_head_broken.png index 1eb9bad4b2a98a382cabab729444463ca7a48abe..bcf4be79f41c69f474ea3a90356aa7977e81d26a 100644 GIT binary patch delta 127 zcmV-_0D%A50h|GlBzR*D4C007bXF$p-!Mo$0$002ovPDHLkV1ihFHf8_- delta 189 zcmV;u07Czq0oehNB!8euL_t(|0qsyb3d1lAeeIMbTgDtBH^>ICMTLn(!2S-z4yXt3wBIi-YB z3Y>HB-oskkV4CDiL<**9Le3eCF@z9cjDZlM;%aaPzjKmKCpN6>ieVU_wMLAwD)~w9 rNks9sZ5YQ9Qp!dN^=`jE@b?E^P;ffm!n4oC00000NkvXXu0mjfT4q^- diff --git a/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_back.png b/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_back.png index f9dae3d66a0a12b0dcd096fce17e74e9cea18683..5785e1f4bb19002b3aca5aa21f9d58c239f1a469 100644 GIT binary patch delta 133 zcmV;00DAwU0)PULf_`a9L_t(IjbmUK1@s3oO)dZHXU_S5_Uu`P|NsA!rnz?7tp7f_ zrL_(T>9w^}r~N0{0FZ{d8MFVx3@9ilAl(44A=795w~a}tZ2%fZmI1ZXrv0~zkE?B+ nJ(oNKz^<4!lk_kc1=s-qf3--+%O2 zowJSgf3gDc|NlP>jLiQSSeco~i-o4lOvZW!=KobGNu-4VBO)Us3b!dMeJCa*sv7_R XGaxJ5yBDWK00000NkvXXu0mjf^E*v% diff --git a/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_handle.png b/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_handle.png index bb109e9f92a12d4f710e0d2c9855fefc7e5a58ff..6f63290067d5c225734eeac0f8d9d27363be35ba 100644 GIT binary patch delta 208 zcmV;>05AW81IhxBf`79~L_t(I%hl7(3W7ishGFlsf*@MB@CJmFAT}nNHBjhM!5>be zc8OoRAo6c))nbxWJ>q8gZ2n^R>PDD z1*(De4xECqK1RLqB;XVbQ>KIQC}8I$HX@{OBpw9ptibjZlSz0eXy3shFR^k3`7`1# zz^fVi@Ir#;#UFsrj9n1ZbzLvgxqoGra(L{O*cZd#{%O0000< KMNUMnLSTYYoMG<( delta 266 zcmV+l0rmdM0)qpPf`9BuL_t(|oMZg||33pIfQ2I617bk$s#X7aSlJlT0|OXIHlTI+ zs{c=4yspz%kZvN`1C-x0HHD_KkYGl1dAtUIG{1WL9;ar!22?Lv_W$wIXMc5is)|h|I5gulpnBob z|Ic2$s?$_az^fUn0rfzeA3l0ir=y|TR1q42S2KnItt(djfBx!Kowho0no$hs0H(0} zkAR`AB-fNrz}XlEbOAL#d-1ML52!hh1kG>*SeRHCRHVh5@`3|N(hLFs?J;1W#$@mq Q00000NkvXXt^-0~f|^WzasU7T diff --git a/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_head.png b/src/main/resources/assets/tinker/textures/items/mattock/inverted_mattock_head.png index 41e9dc7ca5458ecdbbff6cd3747b50bd15cfc04f..16af9baed004b43dacb24c1cb789acf0bfd9f38c 100644 GIT binary patch delta 191 zcmV;w06_or0=WW^f`6h(L_t(I%VYTe|33phJb&rp|M=wbYMuww>=YGSJ7@XQ|0El* zVDX~=F0t{o(Iw@zQH3S7^KiHXx6{D}B!CS7;h55j+8L`>{3po^bCxan?~#~N8(Cad z8!E;u1*01Qt9+B|E;(*L0a tMgN^*;{VTFx%@v#29OnvqXvu^0|1sm=AL4^hJOG6002ovPDHLkV1m60U-|$5 delta 250 zcmVrsEU;E7}sjP;H)*QMf{CPKiwn0Fo}35@-TThRg4QgfLAA_UZY0Ue3aXujmJ zcpPlog7x9d9nz_pPT@!3ky18?g!nA8I$ikHG+}!@^A--M?l%bq9x3~eXAgCXkPY+I z2K4b1*!}yeX&FBPuQdGHm5dTt{~8eG5Bvmh1Np*KYR&?f(M` p%lmW(Fa)mw%zu9}FtIQ*{QUcuVZ+w#b^reU`yXm$ied;}1O72G zGCY6&ib0r{m*LOf-wa1jpQ`))@8AC@8*@gY4DdIzX8it(8E6>H{~3P&`CIqq-Ft?M zSFY4?u(JLSGB;u*XaERA*jRuS0%PkxD+?>b);)U}7Oz~%@a_B8|1l1>j06pUfhb!m putA}grYPb>8-NRp8Zayj003IAO``D*V%`7%002ovPDHLkV1hs%b1?t_ diff --git a/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_back.png b/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_back.png index 0a012b38e960b5527635bd03757f95980ee63741..a97cf6b40e357c5c6178fa75b07e66a66c81c358 100644 GIT binary patch delta 83 zcmV-Z0IdI<1o{K8uK`OoNkl2gCd|9HhAb8Hg&flB*Tr3d&3v1#kcW XonaH_^l}}300000NkvXXu0mjfeeEwx diff --git a/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_handle.png b/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_handle.png index 56cc2507cf77f42f04c70c2f27e689a072c505fe..27720da2e37bb99e96bd4ffe76baf770ebd4eb63 100644 GIT binary patch delta 83 zcmV-Z0IdJJ1o{K8uK`OoNkl*RrF#VT*=)rns-l+^g;OXk;vd$@?2>{ey BKr8?N diff --git a/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head.png b/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head.png index 1e1de1eacebcfcfff1e01ad91c2c8c70b264c310..36ac2a55e33c1c307c5bdd0045e7cd29797d9d7d 100644 GIT binary patch delta 82 zcmdnT(#^7AJtL$0sxmi@e7!)u^+Q(ywyjA!p;w*NQfEPEokX@jCfkERhz mn!wGr1=23t6c;CmJYZtrZ*lR~?UsAY00f?{elF{r5}E)bAs!0= delta 133 zcmeBX*~hYBJtJe)+A3kVMf18!(tIv-ZhRZdd z=EyW}k&q92|Dc5Nj3{5)DIO45f3GI($B(D%hcAcE4~S{H&cL?Bp~N8gSQdvP^9IS1 k-v_gKruQ@jItVf_l>V`KmFKhnDFYCAy85}Sb4q9e09QdcjsO4v diff --git a/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head_broken.png b/src/main/resources/assets/tinker/textures/items/mattock/magical_wood_mattock_head_broken.png index 27db81def3103c79de6336b70dcae5d2bc9a1891..a15cb56dcb5e0884c48aaff6d0b34b3f6b28964c 100644 GIT binary patch delta 91 zcmdnU(!{c1J!7z)r;B5VMQ?J#0#lDKMnCuurDWTg_%rvMG-63}DDS)de-?}NC0@qN vh#LYt$3!HVj5~6iFYqeeo)BojRlvx=v(hSUrKA1<1|aZs^>bP0l+XkK39ld7 delta 139 zcmV;60CfL?1hE9LuK|B;Nkl6` tPYf{c5HtXrLAM{gMloa*i~@=Q0J5Pe$Tju2mjD0&07*qoM6LruV1oL9J5T@s diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_arrow_shaft.png index 617e320ab9efef806b520aaf86c590fdaed9b8e9..2644d1560bb86ce7d096f401af187aeccbfe08df 100644 GIT binary patch delta 114 zcmV-&0FD3r0gnNYBx_blL_t(I%VS^|UckV>;J=xf*?+PPkdcx3Z)9ZjUqM0PKSi#f z*btCQrc9agKQ1nA5O~MS%ZoCXFf%iQ4WT%88XFraa|z5l6uU%QTbnuoJ9zRB01b;X U4L?E2=>Px#07*qoM6N<$f?fnJH2?qr delta 224 zcmV<603ZL40sH}wB!9z6L_t(|0o_tN4ul{O9W~Y_78b_B+RDm9=p8&2r=sKp6qJOH zj?V@X2%EsF)h1HROeQlg@4W$D_SSW^+qT&!vg&l0a}G)=nCJO6$QJ-(tTM(x-}jF| zQWCzNrpY3N?0KG-Oe(*T2@Yf!1`t93rL;I#XLfxn$XS*J?pZMLOS#ZAjotUXc%34H z0H(FB2qADBN0v!ZTL1{z{gH7T!JQgo9QR@o27hH|Y}a)lrHsa2N=N~nv2ELeGdAu2 axBdX(@^&%4hjkaV~{w}UVz!Gt*s5lB)I@)2*_41FR%YjPEP+rLPAJ40OSIg|3QX;*dzri qvaKMEB_$=Ky9C)Vq62XR0swSVLc~XPJ=p*N002ovPDHLkU;%>seKOGi delta 223 zcmV<503iRQ0s8@vB!9w5L_t(|0qsyR3WP8a9FKc}XlErpz)F08Pq6ieenRj8f{j>M ziDl|Q2zzc23`q{`?*a?ElbK<6@PCNh46-aE8{7BYF7nAyAejv9Zey8gTMOQGjpe@YZ!j(=@2-+SNas+qNa%;2Hb( ZSRdVnNf(`uSpNV3002ovPDHLkV1hV#W{dy; diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_axe_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_axe_head.png index d7b3b114ade0e113330d4c77912d031264de0a8f..b33b646bdcedd209b213c043f701c399439d6c3b 100644 GIT binary patch delta 133 zcmV;00DAxE0ipqrBz|d0L_t(I%VS^|1+)V)GBW=`m~72crcC+Y*x2~rz`)=?$(oIf zjQ(qDYr`=!Gc)mqgoK2E4G0Pf`tRlC1;!;MCI3ONwvnU$3lOglL_ksc->4It;M ntE+>tgJoH;ZQCu!Y+^86 zmL;5X^iS>k4)1-!(oBlOFhnUO>bi!tmJFJvfl>$;-v`}4Bn zIH0xu$UF&N^#;Wd0)!A4#}P$Qu!}36Kl58%*Tp>fo5TwT?m)hFXjygu0000clzwOV zgc0+{-j^MCjPv*Asl)Iab{vP~oExmQ)%W>%o*SHVawAyRRYC|i(CodJecx-(wr#R3 z%b5UH9Y`s)AS<&nAnx&~fICvutxWh{fib4#UlqWLRJPK< zfXb#u9{=?XdZ3CQQTeZLz!hMo2smpDL7xK8W*-Li(x5qmR*V1u N002ovPDHLkV1li4W;Fl+ delta 351 zcmV-l0igcw0r>)uBYy!vNklhKoL_L9xZ}QgJHFX{`1{WnTX;U7ooSj(B~(?# z`FzIlctppJ&8BFi#NCKEg!4}T;{g6VV$$8qp_y+kXp z-|xG&ZAG|PEMVKVh{ofwa1_u@p696R8bwhI9T&?RMzk zdcAf{)4+9I@YJfRq@Fnw^6T{)4M_fY{qRFC>?D!8{BR; z91aKJ34{x^I&@>IF(@7|{_In26V7Xl4a=FNWSiqd&d7cRQW$)zZU_PG^Vql<@xg!~6#f(95E82s1P)2P*Bi+kQ~vj=~8jGn+6l(pbmH zu?Yr{#fVP{G91G#dwU=7t#|@uSsGgS()Ycgh4?=N@;rx>lCZh1>&Hu$Wkzd_^E~N# z<_I2Q9ab=oBj$O=aU7`Y8vDLuUDt>o0XE)kim)0X1h#F1Qdug=6^@-a7+e$us;WZQ zbqU4`B?XwBbGYvt(=>tow{2_Q5dVw>7(5IEnx=6*v-D+ITotKb@a3#WfmAkPG)wt* aFo6dsA4@+OctS$}0000=umY@0y@-SeXlaL%W-cJAu$WG zl$27U-unaM9oUXUGx*jTg%B>y(7Xh|?3|-926^w_nh~%Fa4UALm5$^1*bFnU`~c=s g3dI72ZqJEx1|@$Yq87+p00i_>zopr04if3UH||9 delta 112 zcmV-$0FVE2jscJ)YE?-@K~#7F?U1_(06_>uy{*PTOR)tDu@MWiA3YE@*v#+_*1#XU zQ3n1OB2w;N`}1cvlgiAs)`HB0h-kLc1Xk6)iilulWA4xdv&Q>IM$9}*G*$9Qdp*#xr1z`)=?Gcz-oCfctc f&3J7Y1=I%su%|D@h$2g>00000NkvXXu0mjfIGZ$j delta 191 zcmV;w06_nm0owtPB!8kwL_t(|0qsyR3dA4~oU77@JRoHtBwc)jwY874_7UO>1ixTq zXJKLG-3ljnkm8CfQeQzqthJXg%s&xaT#BbXc!!W=(_uc`E zqbQfhUTp|gI#GIyS?qsg0^0r0p;e0+9I0d7M+-|o)fy?Eh`|Wna{eI7Rc7K_a*{xP9^*j%+*GnPC zap1Zxw%aWQ6yx$yfQOAn1I%EtSYWf+;B-21=FuTv!4O*qqtEAaT(4KGRx8-Ht(gQt zpk)Y_^YR~M%0lvRIE3%}>MRfrhXV$K0ir0v^Z8^6InO9zG#Y8Ne!s5*jOx7Ae>@&@ zGQ|yn^?F@n7Jimxq1)|Zxm0k8p(B!72FL_t(|0qu}63cw%?MSp9-(M8a~LwF81!7F%Q#nr1wihCo4 z(#=31_0EIc&Z6-jfi5LI^bHHN8;hJ1HevAY1y9zzrKa9%s#H2n`Vc00006jg5`}gRq8%2Kk1#xVXR#A=@C3 z#_7|igE7cJvJ8NE2ZUK!S^tye6;ObJFvun4<>llV!p_eAUt3$7Jg+HGrES}y9Dry721QXI@7KQXX#L?U%TRF)-KYf~kE;9f4gNrvK|`eOh9002ovPDHLkV1gt8Y32X` diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_crossbow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_crossbow_limb.png index e5bb9b699a433e20fe6904a7e887f7adf28326a3..27bf689f3e33a7c875ecfb24c9e3db1e8a23d94a 100644 GIT binary patch delta 162 zcmV;T0A2s70=@x|B!7iTL_t(I%iU5t3cw%?6$DS=;O-(0j-EnS@8TW2Z^{c~DA*R_ z*1#hmzK@B<{JX{&R7zol5N>!S%B7q$#TXfDEykRaduwek0yiOg?`fW&VVhs z)=Is1COmxvxW#T+fChq%AzVB1lb$^tmDF;~BmF+Z5%w@%% zOXYbkf*_#2?XimCjr_ zI;}NnW@^q^DoIGhvuy$<)6DcE{3nUl`tB8|SAXC~TH}>R>=2(JDm4HA002ovPDHLk FV1m?UL*4)Y delta 234 zcmV72M5Cn+h7|XK2 z zfSP4l%D(Ri!w`<+!1sOBb&WjFv92q+uKU3%r`2?jB#9J7A+~KxRaIj80}WIgIwAD6 kEfiE|w`&UAUViZ62g`*-)Uc0Q0000007*qoM6N<$f@=0_{{R30 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_frypan_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_frypan_head.png index 6d02d35bf3dbe960396d862b33569f6b51167179..f633f02a504f41f11e460c926747b930de90e295 100644 GIT binary patch delta 240 zcmVYJvifDl5tMRd*?scl=svMjdmy6$%&l2S^guImzGEb~0u z${EE@-C$R$P19_#_UpPD$U9X>aZet{adSj`=z^+{hhf<4a%p!IAqf;YbRqSkHodwzW9yXOr4y1qUER4NsNzR_re z?RNVyPGOK;R8=)1k%+NaEI?^A8sI&f%?hABmbwFgLB(Pb`+xl&p->2=QVIQjADK)B z_xoLdm}D1=8Y#0Potmb><#JIK;l0^xias0;(Qdb`JXNgb=J9yGqtPh5UN5fKt7&IK&x~^lh*`Qjj!teKEFc{#qPNx&f0kw~E1?FwzuKOT>c>Ws0*n9t{V2a^kh z0_ycTmdmBs=JUCL(DsTGhq+k{Odae6Pts>a>bYD_XhO4@>-8Gb>C}-UJzyY(PCkWA z3I>BTNiyHeQNH`79cYsA+{lJNyuM4M{eQ?WLO{1a^ev>200000NkvXXu0mjfw)ot6 diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_full_guard.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_full_guard.png index 66e3070a52d8f530a710ac5e30eb34aaa1e33d10..df97dfefec49a4598e8af1f1d25114fd23ab7a21 100644 GIT binary patch delta 157 zcmV;O0Al~G0=WT@B!7TOL_t(I%iWT(2>>Aw1O>q=t^)(bGRy=m$O6plcb_$qkIw(- zU)XTY*;8Zwe`1VaLyz@CJ2&P$&L>h7=m?-twvhj0LE99it||9F|Z4RidFz7}&X-IH74Hk0cc00000 LNkvXXu0mjfp7BS- delta 274 zcmV+t0qy>|0j&a%B!BctL_t(|0o_qMiiJQBtn~v1f)@}31;NZruOWzM@mgNMPz*Iy z6H$!3fygX1tnk>GW#jh-dOqFNHPzjC|Mm4>32B-NV$So#zV8a&U{Ghi?+e;>T@XT` zu4|NKDal^(=Ii6RGtu)rIF5rjj?r};wrxY(wu%CUfRb(7Mt@aR$g&K_alkZ948x!# z^Fzh?{LY|dSu%MXN8IYhB6~1Rlgu#;LpuQmwRJI&{>-29UDpMb&GU@k&HR&qB(!JtB%nI_KFq!W YY*A6&W&t9O01E&B07*qoM6N<$g4#xcPyhe` diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_hammer_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_hammer_head.png index 18fd571cba3be2682046a4c6e141cc54f8cf4cd0..e1f79ffdae61d34109b17a1fe0de4fbab4f983cc 100644 GIT binary patch delta 196 zcmV;#06YKH0^b3UBYyy-5Pl$f3X{cP5ex>K@kJ55h!^kzR*yT& zH}J}aMYrt^3<~=Fjb7LPmiL}&t%UU$thJ^P0$FPb`(tH*opVf(QX(P59!ZRmT5AlR zbJ7@ta?VV$6$N&oiUtWlSf!L?jNv#RBf%;Lhs#jD@0&^~>^-FS&W-aeCl85Iib+6* y*=!H>aRU2@vDVsCe}56!2Kej$0M%pV->MhIvuKGr7#-380000gykT{`2*236^Cs!!Xb^4e~sHtCK_q zkH>?ZPA3#afoYmVl4I=q$o>-Qe81l@&oduU6a~L#jQF8YK_sFR*mWQN{Q-{oalaY%IL-h7 N002ovPDHLkV1lCMjGX`g diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_knife_blade.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_knife_blade.png index d6f0eab5fb926ffad2d9a2bdfaeffd5a386e8472..fc5ee0945727c55886e8b9f394bc86235b6c9867 100644 GIT binary patch delta 110 zcmaFJ*v&XWB|XT~#WBR9H#tFq)rC<~a^`Z0_yp`InuY{Xab|O)b_qG)FDEI5}ClQjyQNC1tj|1p`B0n!egnj#bwf OfWXt$&t;ucLK6TbLMbW$ delta 197 zcmV;$06PDR0pS6VB!8$$L_t(|0qu~z4Z|Q1g&&E$g5| z0HU)*K_Dmt7>OU>qc3*eP^%h z%8W5M=U|M1l(Nw`fnq{!&-08B0+dpSF?O}xFA#hj2bN{QG(Jr~VJg00000NkvXXu0mjfp=nys diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_guard.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_guard.png index 86a1141b5325e30bfc89977eb8d37cfe6b3dc78a..00ea35d259e0dc042710d8a42394d7118c944fc2 100644 GIT binary patch delta 117 zcmV-*0E++J0g?fbByL$rL_t(I%VS^|1sFg^M&>^VlWl;3fx&+T1qI3s0ckENDfu4~ z67rvH1Ju>kDffz#lhc0?O}0xwnps&{|C^bafej+d5N2j(uvg;Z;>dRi%r#`YVweK} Xxo9TiAfe!V00000NkvXXu0mjfnItcV delta 193 zcmV;y06zbc0o?(RB!8qyL_t(|0qsyR4ul{O98aw5jE#w<53u3^yn%v8@)*J!sOg}B zaJQWSjMv|hOtL#W%x(t%*Cw#1>Soc#{sSNt(J_sAd_jD3OeV!P~8(fx{l*mwrztD v0x`zs64rCQayjSWlLM@^kAYtQ{Zjn~U;r?i@6b4W00000NkvXXu0mjfG1yu} diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_large_sword_blade.png index 6185967ea87ae1e9b3004b68aa97d639dd74af61..3a83d2f79b44646a5e0b41b0fee9cd13d031de7b 100644 GIT binary patch delta 177 zcmV;i08anM0?YxBBYyysNklo+Te0JLkZ`xL=3#tnJz!8r%kTHXVA5#c!}j4`11z7w$F)*2XN zAm$>d7bsPsx)1WL%?kxfW^E{7j z+psJP)^)`+O=#Pe;}6!mzhM|mQ52+U3fs0}nkGb1L{Sv4#eWH$BncA)frVkneBWpE z_AGYG62~zMf&f{TVV>tbhGE!!za$_PUDr>~bzOt*$v;! z+hn}m<-LkzvaI=L=KHKDdgEG_#hmB)h_-FL=RD61{J!taCBP=crfE!;Wp)*gB%cU}Ubks$!p5c(%504^_jTt+UJ!)~`jzu*6o1Xin64TVB@y0wGoaJyAe~Ml8jWH&916Z%E@gi{pLjeTxZm$styaGYE|-hEM5jdl zTk`q5Ag9v_w8PUBdkcHtS2xi zSS%Kt&u0nBW`DD=+wDTZNX!J(=dA*Efmx^1sl03~u@+kM1?3@ zNDU}nrBXq&*@VmGqD#!Eh8Mn0qXt?RAZ?@u8Xr-YK{USP^ZCGb#p7|4KYgqq91e?! zQi0#^mzLG*b^2i_&PoVuw_9W~8FM}cg8^o<8C`k>hJOYWi|SH&@oEcafhCVdBkcy< zZZ~k~NP%sX3Yd))r~{+eD(*C@&V9XJn-n*jjSLd;Z!Vm5{!B6Xv(xDWja=L9HfY2d z>vp?Ai^XER>J(C`lzKcKvET0n{JSs_@6?Gqt2N>{%EUghA3UQS`#W%#Pyhe`07*qo IM6N<$g0)lnM*si- diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_lumberaxe_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_lumberaxe_head.png index 92c0509f33cb290d017d04ae0c673ca8f55f4287..396143755da03cf84462bb0c392b45ed14f25b95 100644 GIT binary patch delta 155 zcmV;M0A&A+0=EH>B!7NML_t(I%k7Y@4Zt82glk|56b6AISR4{bUxduI2^15&PWL^jJPQB-002ov JPDHLkV1ljbK<@wm delta 240 zcmV$Q;1sumYXm`x#9Y7H+NfIo}f+&iPEAHc}NMV*` z0u@C8!!XeIJ?gqX@lOS+*uXSR?EB6XP1C@2U99VhX__>RmT8ckrs=_HmSr&&3xYuY zVHl9-xu$suqPVK6!0Gcm!?tadWr=OuWSemu73L>A9g!<~o(JFe(RH1$I5`YM#BnUS q>a=xKfH5!6MvU9Gy*whZU$-|H;!Jc33n>c#0000ZSO3q(#s+4SARV|G+egu-2~JX{`}s9C8bxt7!J#!x)2{GuP`VWSGnlI+ao=rR-s~ z)*C+)>WMHVr9=n;&bc0j?g?iyr34`aT5IR=yZ$)mo$IF`e->Z^g5e>J7R=pM00000 LNkvXXu0mjf1e8W^ diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_pickaxe_head.png index 5550e7751b1983d91ef33c1a1ee91d51a8556ec2..6613b7613ff9e353761702b2eb38cdea4997c7f7 100644 GIT binary patch delta 142 zcmV;90CE3<0;&O!B!6*9L_t(I%VS^|1t>s9M&>^@Op+l61_u9)jEw$kYis{kS6Bb< z<>mFCnVI=NNSq{>goK2Ev6GV%7=sKV$q;12*x1;>t|8ewFaUB%NlD57#>PgltH?40 wb%7 delta 230 zcmVWL65BERj2e0jyC*Muv3F zadC0~8yg${hlGTXu9<~}<$q965P8l9`Ps|Mi!whmGcym6&17pPJG5abjQ)uP1V9?e ca`u1&04za0Czfz66#xJL07*qoM6N<$f*r*(1^@s6 delta 242 zcmVA;ZPKX%d(7=Qnaos zb43D=Lxy2+ZQGJDhUR%@G6N}2O6j_;^L2-uXeQL0=Q(ZLMr+HmMB~HcgqqQ9Aq02) z0KPAmzX0W`syNJAd#QX1KpEWzJNE3aUjTU=NAC7CO{W4#{INp-o~^ZJET+ssyOX=| shBCd%B!6{DL_t(IjqQ&i3IHJxMJ;*?yTKwD>_(#qUc?J{0jtOT%M1t` z$FOZ5yy%;+Qa|6|oWn8a46QXp4^v7AA;5c&IVaXysI{W^&LL71vets65NV7-jFF{P z;;+ye@~qi=vttZ-nn!$nHh$Mx1N6>y0WP2djIXqvc$41aL!$FgJsusyS4TtV;o0h zS%!685yvrk~i`I6y^pYmPZJD>}=+Jzo?|BiB!}c zf8FViL_t(IjbmUK1@r-ojEw)q#l^vxWX&K=At51POtb;KyuANm zSX*2BKPxNie?vnww+|ZgKUe4hyXho6o4c- i9R`qXCE58S3;+Q0r79B_x1$&U0000|!R zhBnZ#6_Vh~d-+rU_x%MxQUUxKC7-Li^MbYTJceVFcgi~H*G(papyVDvX(IJHpuqU;~Bhvw?*vX0Gb5|-T c7XBdd0V>Zbo}lLb9smFU07*qoM6N<$f+$N)`Tzg` diff --git a/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/bedrockium_uie_sword_blade.png index e3e8af367f3878aee55e12843d6d19a13339a436..be202ddccf2ee5e1fae94dc5eccb802ae3adcec4 100644 GIT binary patch delta 141 zcmV;80CNA50;vIzB!6&8L_t(I%jJ{14FoX=L|3vz6?EWa3WG2hg7c!cR={zW4tx`2A0O8zG7!skPHI9o$VH+E&74St5>OIF5t9 z?;l$K(I8DzIgTUteaAe{XxkRcvK$6??POYuqL4xegkcERb#E~Y1J2`Wv13vn<29uBx+?5_Mf0wUMQqSo3K6Jw;DGnG=7O&|bV2!Wh)R}3EU2@t^Y52|Af z>b+B~b?uTBWD_`oGdP?o&zwLBikO+nXnISYjbp8SrYuV;!$-+9`Bib+AZx9U?VN*M zk~wX*Ei>6Vfo)bk2PW@i+T`{~)c#Jsg#*FNyAeVDX`O$s4?werE45uO0000007*qo IM6N<$g3=~gxc~qF delta 356 zcmV-q0h|8m0saDzBYy!!NklO=G`RWtt{)T~}fb z0&Extdp@6ZKA$N~Q(Bfq`UD09_xqjZd8WSascD+S4)l7x*njPIqtod`UDr`v*U}Hx zm4t?2pt39}NfPekLNMT7K@1GrBxuXFZ5qdsilX4mz~X!)fDx5=o=4Z~mEt(2Rp-HN z+fttAyO^DVU~$$U*-lke^msgW%mVi%e$*QS)peb42SGrVWvLLZYg{S<)1Ib@mz`x9 z_u_S6-wqazk6ji3@_nCAI}Af!Hrf$0S!X~|6v;UGgKSt5Fr#dBV0azaQOV_Ukx66% zFsn;~q}zi^e%cd`a~y{qk4L$t+^7gtf}@!KQ2ho}?w33C2T`B^0000&0&XszjHb~ae9B44XlyedFYNe82y<+?Geek9Hh+;Ds8Lhwa}QdnTL1t607*qoM6N<$ Ef)C$7!TXm)1awBuPXRMesZi$8n&lDrv4iBcSWLnCBT~S%1ptbUwL<0<76_94yO% zzVBu16Mnd|<{$`!VHo05M5q8+hw9+FvuT>h^IUmXSpuEcb(OJ;qQJiIN|?rf1PG^T zifNjVW!WW6fgj3@O=sJ-<%6+Nc3DEg>lU#x4*&8=(62fsDqix$;UnLXpt0*)K f!!4N1zvl`l;0zC~ zKrAiJW$f$d`#)p%wz`7$zW);{i*Oo(GZu;}iWs}QC;ne_aDPA0B|t+eup5Fm8cR#_ z8N2$X{9n3nPhI}xng1u|rehdFFddW?gs6m6nVZJg zvS{i5y*qc-6-}A>zb^;j5~5RLO05AWI1IhxBf`79~L_t(I%VS^|1sGt*<*WZUo;m-2^|6!xR~$a}pJW5JoWJnj z(#yBj!po=D)ZMFg@qxqtXKvj=yg}nG19n`#`v2$8Uktx~{bKn0_b)?)tra6l z2K@Q+o1vqwuI@j>f1m;X7#1Hm{Quk6uMFwl9#{>+FyQy^zYHMF42+Bn%q+|d6Fb`L ze*XBuFm22B|5-ks7=~bR!5^^G8JU>mCzVYa19+>k%6dG=xO&%-wt7|D4_X{(HqG)F|2j4Vw?-lNG27fUa3Y dN;r%#006{YNKf4v2JZj>002ovPDHLkV1oYJQ@j8G delta 239 zcmVV$=bfClaUpXup}(+~^;=I=Z3zZa-kP*8w@5eOI0m{vD`-@*ThPWD(0!7zZ6laqm& znVI3oj~@)&+}sQdK!2>7Kfi9)j=lfWJe)BM!7w1g(wq@wBWTzwlP1;i^71fz`SOKf z-O@!sLv{lVLG=#SFn~FC?%o6c|Nr~Pux|09x=)`zGqAF<67~WzNOpDr8?*rEA|@am phb0_{N(Tuz0+46}@PUCh006?HMuo0v1R($b002ovPDHLkV1lgCa)kf@ diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_battlesign_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_battlesign_head.png index b0c3cb4a0a485e4723b491c1e57c133bedd54df6..4374dc36d47ead167dfe1798b24a63a7fc1e5feb 100644 GIT binary patch delta 393 zcmV;40e1eP1c3yQf`4jBL_t(IPvw!@N&-<7hJ7(Jv{LBcVa6GqG7sYs%fvE||5#QO zSaiDZUAn59psS)tkRoYbWVQArK{Ibq8-CV4@$LU#+vWNjqtHL3jiY0#4hEDqdZgCs z6s>+s%;oAf$y+sAZ*@rJy%*D@Ux2L9r^?;|7LzIX)EGPw`F}?z!yz&|4fqrlrFIvR zp2Mphpfli#FJ7{IO3bSIZWA+M$pW0R%IM*mtDMbaWCx@=1_iVP7PK`>bE*c96tw{E zPy}9Cfj_3f&-(%}b^y9P3alnj;#UNq&;~N~2HXM=3?tuc!xvSNV^>PP2-6Nov_@WcR-nyp+BG0000u3M9EZo`XYPySTzSZMwaGgzx)WH0MmgwntFTPvGVG z8OHAxIA=JjUqcYev@9H4))BK<3l5J@kfb%`f#)NWNyF?LqCrf0oM{JP7{YNJ#Bl^a z2z2kR>+1FCQhy1rjRx%g3MAH+7Qrd@JP)&zdBmD)pj;}do)J(x3l!IH8d}!_7)qMD z1;#lNw5fJ}NfpF&0tpRNRhSg-pPnI?&FPu-092;YY!;G^ixY$k4#t=kN=cIu5*7iJ zP9^E9pt8B4W>D==+)^!(ztKyQIEo^q)3zSmu(}uI;v+YpP%QjBnLpV-`4a^?divR!s07*qoM6N<$g6%NJasU7T diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_binding.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_binding.png index d6428c64f637543c47026f1d742e4c48421121c4..0517d5ad3fe31b223bcac238124fc3c6965ea494 100644 GIT binary patch delta 207 zcmV;=05JcO1IYrAf`76}L_t&-8STN%3W87&2GDt-2x=#U{S(nbY!N-oJWH3v@KUrE zFC!yYjGpRiKCXZQ;)l^LBC|`u{)jl*}Oq5s~*Arz^Rm=KCF5K z`vX6lH*8g794^>a9yEk01k?4FN3)PKRnSl-7lcvFlhuY3S4e_}xa1D=DCR^ICU=;w zHhe7v)JH0cFpAj}0&1mYg=Ku?R2=9RlRG4$ppHyEZla*SFCUf%XLBx{LhAqk002ov JPDHLkV1k;7Te1KE delta 281 zcmV+!0p|Y60+Iuef`9u-L_t(|oMU955U>nG16Ce9_Me%Vks-v!k`Y;a#eu_M@labE z6mbj#{{R2WFlX|#x^>4+{tvP;2P<9))I71Pvo5>1sEMEpA{=ZPK^l5mn!$$r{{5Sw zt**ANs;Q|d+}@UvpaCEd4m4!JuD$I5%g)URb*K!2em3C)FipWjDn- zJAgGT-FNW++$odlmhRpCKib(9e=L9k4P-M+GYCXG*)xKo@!#LSguRg9;fgh|K(T{O fd=MsOQUL%M5)y1Y=o&ZK00000NkvXXu0mjf*KLOd diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_bolt.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_bolt.png index cf8cb9aaa5807c65ccc76389d6151ff52ddb6bac..b71b2d2453b99d5d2992ca576b5781867b38ee71 100644 GIT binary patch delta 147 zcmV;E0Brxq0*wNYf`4{NL_t(IjbmUK1@r+m)93t8tZDpDp5~cz{yPMR)^;shNxA_o z3l{&k@b;_iUa^LB%^i!E{WtgWsqJ04j&#k_)^Gf8>mOJ5VP_R~|k_p5~zo0Po#3dpJ!>OAG)2002ovPDHLkV1kf+ BNLl~@ delta 205 zcmV;;05boL0>=W7f`70{L_t(|oMU955U`9IK%4x7c8iYNzG`=4fMgO8LI)4*R1=$0;oAQEv+fd+Y_&53`PTHZrb{P`TTixaX`%} zL}S<8L_t(I%VS^|av;32{=Y+F`hT)C2NqTQH*oW+4JxW2-GHXW wtN({)=hyn>m;NW)`O|mo`_C{6M!}#207Zrqz#R#=6aWAK07*qoM6N<$g1xaR*Z=?k delta 123 zcmV->0EGY50rmlqf^=U=L_t(|oMU955U|kQfbh!t|1V#>U^p;;CL_rP1Qu2Nzj^j_ zosy1T6Ui=UTD6ifDMcq dFlqn@007|P8}CAW-)sN?002ovPDHLkV1jiZH}3!d diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_bow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_bow_limb.png index 47a77c5678bbdf6258e9d2781b9515e97cf9f89f..0b4a3fa0ca1fd6c9d4f0f03f465fc5d7d29f79d0 100644 GIT binary patch delta 170 zcmV;b09F6g0;B?vf`5%kL_t(IjbmUK1w#n*t>5y$YxVm7?JL&&CrZPF^_%`r-njMu zw5>b-PuRHSzn+U*tyMr!t){(G?ey)taU0UOVDbNs6|4X2IlI<6gof8Tg+`8CP3&;S4c07*qoM6N<$f=)+UfdBvi delta 218 zcmV<0044vV0@MPKf`7e9L_t(|oMU955U`9IKt}`m)^GX$=g)73zkmNSR7Qj_5;S1K z`c40tnV1=vS(q7q{rST%Z}Ox%9v&Ws_wPS2Oy9oyf2OA^BUS?%7cBnI&cVSjZ_4C4 zAt50KCPpTP*Kgi1z1R&P6$}Fd0PBx9 UAs^AEMgRZ+07*qoM6N<$f(&hAIsgCw diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_chisel_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_chisel_head.png index 22911cf10c6778a97aa38b884b621ce16d942e2d..ff22b5e171ac13a2ca28d50c064dd2798aca5bff 100644 GIT binary patch delta 144 zcmV;B0B`@<0*V5Vf`4;KL_t(IjbmUKIbh4)z5glDy!*erwodJ8atv7y)Fi8^Rcq?( zS}UWWRl9N@iH3kQm;g0Ps;bp4-n)-9%`1Sm8#_7IE(RL1cpr(H*X)JZyo^*QgTQL2 y=B4BW+A^r07n5T%$e%_aKT{ItWchh$0{~s;N44g@g(m<200{s|MNUMnLSTY=azY{i delta 223 zcmV<503iR00@(tPf`7tEL_t(|oMU955U>m#1Genl``^denUO35w(Q;gKRYkKZZ*)5 zP&7jb8n7OyDKjUxPC`nWp)fnQZsoqc|HGXSh7dI17f`7V4;i{<%xDUCaw6UZ zD}c6lwY1e0)KoPwFfcO2qG`r!z#5?Dj<$}vVxZj_sm%oT)c1V%bu_J{UL>umo@B1I+NcD1ea!lFrVfw>X*Ap=hEof3 zFDMU@g=5==#e*Ece`O?keVbr-#wZfq!nzG0+)!6eBri-yub3 zws2t5&J%Z)clQV&&KEq(0POV-j3tNZhwu}T@1Gn_YWo}1*<5i1n-qeM_fUDE1h9n- zFW%7jv6{I64A>X}jh|*0wE)TD27Q3p4nnc5mcCHzu-@*mzuv0nzmWFddIM8hzh_C4 Ss<;3E002ovP6b4+LSTY~$APN= delta 334 zcmV-U0kQss1I7c8fqwxnNklfHcc%Xn_Nbjgy1n|L@-nqT*r-xcCRw0YeYOXAlGi-gGSf$LRtP`19vCgNT?o!(X5wAkA!8G~+ek z>({RgVn99oKu0gI;!=do0Fd+LKrx`I%D~9P%rLtT)87PLU}4B*>Hq)$ diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_crossbar.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_crossbar.png index 43ccfe28a5056b47ee2aa0267cc665ef0017d97e..cda16718c1f61019497a3a17339ad4b1df11ff89 100644 GIT binary patch delta 125 zcmV-@0D}Lh0{8)tf_7m^L_t(I%VS^|1+)Px4<7ly;=tkmWE-&N$npQ~;SseUgVr25 z`JZf8xP?X38aunzt_B)NvH`1)9Qz-Vl2+>)8d1CY@Uj17dj+J~Jv_2@$s}8*`inVKpGc#*z`FdG6FHb#LFkWmtXW`2SF#7|{lR024D410NqB1JEZ7 z5P}33fIz5?72_J9&7iQDGi7q!##3ki`fuwX=jd9S-rD`2Y_I4!xz*}A zxYTBL^^tB!ZujK>Chp#~x%DlzneDygg$F1gvpV|z>p8pCraO`26-2m9{;%f*3=eW$ w0s^IzXZ<&D@u18lMSWBLpTBXFd;_Qs06C*gJ6i#hkN^Mx07*qoM6N<$f@~ delta 297 zcmV+^0oMMz0-*ztfqwxCNkl>xP z^8X3NxkMR)V!+-7a~VOJ5AE1iS2}s-|6jj;F-#<25QY~(HW&0x`M+n=`Z^FlrLp7x zocao!hF}fE|Ns5~iT?~NEUXNt4(zQMSiR8UFnJPrMgkU~*|LV?NL&zkmN`IJ$dBT^i6U zv(UUkFd@NWAs^_P{o6OyrMLI~pIKQ9H-zYvI1%WY(#f;_@7}l$#U&&q?=a>Db7p)_Dgk?C8sCx00000NkvXXu0mjfP}h!Y diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_crossbow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_crossbow_limb.png index 917f22f26dc2498cec2630b7546d3da916beb202..7ce6da700fcff11afc31e591e015c335494f8938 100644 GIT binary patch delta 262 zcmV+h0r~#21OEb$fqww#Nkl+_!Gi|7lxy{GYq~;QytEj{)fe z|M6;^ylMOYzBTLr>pHsB+6IQy+6RZ#8o7DaTKWam2BfCfntJ)wt~h=MyCEIRR{qy> zb^~jgwSCwB=^MBHpS5Mj|HTK6{av*a1D z8t8YYu!!0nS8tGSKv-sW?eW(*hf zu37(o{?sXT!a~9f(J3iSX`XJ3B!_{BhzLVcc1}~AgDpYLC4V32|`-9&RpT^`aU817E*>A{iG0z;fE1DJpi7()zP+}z|D z00JVy!VLfa{xc=d07jq#-oJlOl4cYGLd;DVw_LdV-&0SU=qLmM0E_=iqjyC2dH?_b M07*qoM6N<$f+w<&RWmfI6_Jy#Ncw*gkbg@W5@PC#R<8Nq7aqch z(}0Ovcl>Y3%B&ND+Wh*}ONMuE-!gpp@`a&l?);{@KtKF0$oKYOTmTIDIsM&rZ(hD) zc>nG_!`H9h7#ij;YO3(}CN2yTfYG)H81f}aiFI|;XEd=fGBc!kIFl9&almMsziaRR rL^tdj2^s(bgdQ{#G=LZ|@CEh~ZvU2w(mP;foedI8Kq2zU4h)ono)LDL^>*m%bCHh=w<0*syy#lE5P2)>2c z50Et)NMF|>><$M!O?bw1Q0)wmvt8sYSB4}?Ray0}kHnP@F_(S#c}j2-dbDcW|xV#h-0=SkP}LsZ%wTvY2w z>V^a*OhLlJ4tpNt&6eu}ZM?owh>M0lMA|Ts(re#f9kuQNX$s!c|9XXpi^0V;Ql+V< zbYp9PakWHMhM3p!r+kUH&=*kiegr2Rk#;D*&$Y_&zwa)S*t|<>L$MrW=oamrzS05` gYrWc>2LAhb2c#X*zd7mLD*ylh07*qoM6N<$g7Ip%EC2ui delta 503 zcmVg9|E#f# z8hUlpz;%I>6Zo||Vq^mS@v}iMLgU>V#cL@9^!m1ebl_KKGk-*92=v;PX#~#|VNfU( zAf<$x%i-nQB?ZI%P2p8F?-iia0(#BIyo?A1YP z5+WJLub+EtpT1yh+pe3ld5kd$C(J>eCh+gqg#Pf!1dTvVOolb|qu5EFE?e>mUfpElRL$oU9t3oetm`AUgD%=fG zsZ^}mG)>TIwdq~r!Qx{5Pk31cOmdG%XqXuJv>7N4E{#aHA4UZ002ovPDHLkV1m`O?pgo< diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_full_guard.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_full_guard.png index 0cec292f326381de1ff25eae0cd9c4754512f6c6..c4059720ac37e297cbe3aadd49436d130272fc79 100644 GIT binary patch delta 241 zcmV$~(rQ}sUD=yVW3=9i33&Ud zhK7(*fG;IsyxEBhvaL2Eg%Sc88I%1{>;fE+nIOYPi4|2Os&%X`H!+EBS~O#uR|mtl rh^O&*lJFxf**~n^D;f7M;NOTBHm`H5PjZ)800000NkvXXu0mjf@6&MI delta 310 zcmV-60m=UA0rIsTuCiHYIw@81m3_BM<}8?X|n z@z<|E4D%*WuKV=)6T{y>e;Ae?IQ&1_!IqJr0V@t4`9Ej!q`LqA|1*63`i zwRKJCnz0(N;_z{x=81J6_JD%PDHLkV1j_`d29dx delta 355 zcmV-p0i6Da1KR_Tfqwx+NklYU7{$+RqAsq5;HHCl21AP=xOG%fD=0Pi z1|^7ag$xS5Lq&%|B~9x;6gQa z%8nyC0U!jBO>1l@fJNp5W0y~>DmHRk=1>W$WHyaFPbvx+&3}b`&P$JuSe=Vc5dmD1 zc|ULPtaToML@fEKDubXyWaqa0JpZyPws1? z>v_-@7g#JnqO+!No7a}j!#86IwA?o&Bng2pU>6E}Mc;{Z5&>kipFP78ug=O`1OmiB z+jSvJGG3ZZ_*|5xZ;7Fn2~@1r#a*SsL%{gh1fI#fcXVhjY0)x!{)22f#Y&XKK0f77 zjRuSub6-HHNjmGfP1C14&ip4J)5A0{U=WQA_yQc`f^A0KEqnj~002ovPDHLkV1lmz Bpc?=H diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_knife_blade.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_knife_blade.png index 586d30df8d5791da35fe5f4b9dc479b588046ea6..f2cdccb38914cb723c115f48e58b39c4bf1a64b3 100644 GIT binary patch delta 163 zcmV;U09^mo0-XYof`5idL_t(IjbmUK1w?_ZTX+56zGcV%Ej#x9Ct35B9lQVQyL!|* zheg$H+O>}~1GaD3_21CV6RdgT?gJ!h20B~M*`wAaG`e=(zQd$x2Km*<-K*9$Ji2!M z?t`Rh207K(!@JfkGNyLT!DFOp25B(!@~icXj;~#F;0Wm<4jeOtY|SGS0016tMhB30 R?-l?6002ovPDHLkV1hafP>TQn delta 219 zcmV<103`pN0@VVLf`7hAL_t(|oMU955U`981GaA6^`GhgKZd_7tPDOL&Wt1(uw}>Y z|5d%cbs~a74EZT3O(eNs`<7k*tNQxDn)6cAn*3ZH7}3?>G+;Z>+2ugZVnV_USs58k z{!X?SnsFMiWyjwC)&0G7;vzuJDQQiCI5cB5VB_us|Lc3Z>r_O9gc#B?vYGk6l002ovPDHLkV1mNUWibE% diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_large_guard.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_large_guard.png index 5522e4592cc094c4fdaa0193fd17c2964f9b5fb2..d9c3d6d2526c979e0adf0569b9d00e4e1698cedc 100644 GIT binary patch delta 143 zcmV;A0C4}#0*L~Uf`4*JL_t(I%VS^|1sI@y*8Kl<(`NoB+km=hv;I4H`_wkhnNPkU z)f1=vS5#968nTEyL#iiC{;#O2UfZ%@DfzAdc>&^z1^+>qyzrPl=f8rAYORB}Z*ASQ xIpiAxiWNs6zuNklWEui9sD35|F*A$-0LTwGKExxU*#H0l00>D%PDHLkV1ktZK@$J~ delta 212 zcmV;_04x8A0?q=Ef`7M3L_t(|oMU955U>nG1L|kZ|NsBbFNUV9bVjla`2XiO!=bI4 z>l)|G|6iYyNYD@r1DdkZ7^^2v`@f*818B%1pdoR14Z$7;|NjCp0|PS)Ga(0HH=wm3 zml5QJxou5AS1kAs601*1!0Hm5u>kUa-Sj#C=XbQ$DX42O)J;vB^S>!81;Y@$(b$xk z0yYHXrNi4c)z#0O^S?12)ewT|0AvV=1{=hH874$0B$z>D8-NQ8ya518BSg%xe2;Vh O0000k|`tW5NB+R@^^F@R&?NDVCt=4U8xW3;vodgn#ELgojuhk%Ef+dkx+7 zh6jHy*TU@&LXs88s)iiFoz)N1c{+DsFTr7QF4XFLXFImztRx&bPw-%C^58Z_ytAEY z=P1Q~sp}Y;dmh}SwmsCgkJ^rv%24$thTK#2D59jq5y<9{C|991KhWpKzG!kfi)8f; pTB8Ny@cTdbq8t%@Pxj7NqdzR=h1VI3!Epcp002ovPDHLkV1h2Uk@Nrn delta 357 zcmV-r0h<1t1KtCWf`3OzL_t(|oMU955U|kAfYk>M{|C{Gj0_CS%n)sXHkOP;8L;N? zvHy*g<#ik!oD2f|{0w|R9G#fdM3f7b?%wymwyd;{i<6Uqi;Ihai-(&bEH1t&$kvLH zpaC;CZu#F-Q&q>#&cVO|G=Q6%n;|$dx+&bjmJy}~rvY=e?tl2-US9{cnIGt69v&XB z&2b*CjL7P+8ZdMHCa`8spk`h^J_bG@4v&q)(2Ugpkh8m*o9eiL&gBK#Dj*=h5S^UT z6y;=(p&7$~`P+B>Z?3JW0|gd8&{mMno$f`1Ptxgy4pHEsFOkdjs|Il zhBjUU7VkUwzh0}c9;}%M=yXs#hXMUeNHg4kSfKybojUV>N>^7M$ltN4X-y$k<^(mP zcp=ElgmLAO00000NkvXXu0mjf DcrmQe diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_largeplate.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_largeplate.png index c99412ba64c3ef17d65f4897825d74a0956932b9..2edd46db7a2e42b51945280983ea920cfe2aef76 100644 GIT binary patch delta 468 zcmV;_0W1FS1k41Gf`7G1L_t&-8Lh!jYLihE#^K+4&P|4GC$&kwG{$a0`~!lb;3~8r zI1pTf19#&_9JmINB*uv=kmTNT{61-_ovP2nzY@LYFJ2|R$iO%-#^W)&wxj*n5gC91 z0T{2}zTxuO6BT-Gx8wVE^X};61b4^Wh?eZ#K|o6)g2+a+#(&+1k9hg?@%u}l(9@`J zbbO4vlM$TFI(#(3%n%@VVqb}D%;s~ZlQRyCo|O?oL~TsFb7Te*gLKH+7?=!6jLV1v zqc=8TCZ=6SMCEKcAi!(^T-02qQ6nAQ^OlBQ}Qbw2= z#&1T?5RpkrWG0Yg!0PiCzOGhCkU%$`Ac;R212YC@2AO0g-!^LolGv`+%on!-v9FCx zt{J}sCXo?HLK2d2cQTT0xx@u6lEr)i;##5S<1zBWolT1iYOB;*k&I}83`|L6vg~HG z;D$mkTI1e>`%EWO+>FSewu&KI1n!0b613WgFmCwp@l*Z{{)eAOuGuGvDE+bk0000< KMNUMnLSTXfp5NO5 delta 504 zcmVlqf`8dbL_t(|oTXCBYTQ5&tm)C}X#2J+X)SiwpAhW4ASQwQf_+F9 z0(%JLBXaO}hTs))2zlI%G>=q|yk2DAoPp7!yQjLUdJO(^W%_vk;ZxLihyik+66AS~ z&Uf&)UCJS4hxg{oXRP0yn*`vy4!_#w>%q|xthEp;2tK0cH-C&4M1&9s;u-gN_Tn`@ zzI}7G-Z3zf32PG>w5(t!6NpGUZx|1~O9173j$$?)OOR~BLWAH~a9qRiAdE=` zktD!)sxt&+JZJp~AQyvM?rBkyszWhfq~zZ}zaddj)g@w#Xqy%p*<>~w1B5^i&Cu0E z?WD8?-t`D#;eRPh7&N;LGX_ZXNIT1h-*&sDkrvgWMn-_PX;R$MtDN0suV4>gGdpNj zFg;u!C%TU2&1mY+A2)0;7`q?!&O|kk8Y3m>6ck3se*Nt`wFlJ8Wdg2>Su*j_MS{q^ z49_{MVK>co@Pxa)-l9G^(Sf3OntvpLCf#)(It*PTNpa{gUoBx7@-%x<&k!Fnu)MN{ z<}6n$j@-dHMMd6PoJOhh83`sq4!>a)Egb4wS#d=&Qn4N uG6q<0Hn@0sdW9#f1aSH4%v?U@G}k{Ut+M!a5N^@{0000?|=WFefRl4$r?{RfBpaJm!JQ|6%=bl zW#wv*1NlU2KJ)zTe=%8kutpbzT5Zzy9WYo_7AL$$;z#bO3SF-diDZov9aUQ)&IM$ l-u%D&#_j(g_GqHU4gg1BWryI*wg~_L002ovPDHLkV1g_Hd%FMt delta 281 zcmV+!0p|YY0+Iuef`9u-L_t(|oMU955U`8@1FnAm`~S!HZw$slyo@9naO(N%|J=NM z3{ILVb^reUWjGGxTS|&z7=qP+Gtb}t_cAl8`_J&7K~_$V;nj;54BvkLA>Iq$zkXr( z|NkF@th@rl|9}4&L_|dyI`ebu_T7H;-$_-D5w8Itr+b?k)qlw=Dl+{2`wwW)e+E$r zDX@Wme*Yruf}cOWgEhT;{v2$xgtQdcAW;bk28REb-oP-xR#A>|-_3jf8JHLuI?GDx z{{H#PATBM#@bAxWhTlJa5Elkc>PldL?znXIKNB+x10ypN!{1-O7(Dc}iHijoz@~vD f1Bd|wZvX(;vJz$x?X_VA00000NkvXXu0mjf3n7Xc diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_medium_guard.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_medium_guard.png index 37d11e8a29837f795a85b70fd9df5fbf968d94e4..541984d52c472d6e2a4f2d27177e0cbce4e06011 100644 GIT binary patch delta 122 zcmV-=0EPdl0`&oqf^%L;L_t(I%VS^|1+)Y6x9|Qxck8bIGdFJePqOA^`wsq3DlVz@ zijJwZ@$su&w0ke8PwPai)qEZV*If1Il`Rzt8F5andgxOn%z{|pTO8J5qVUpH&w#5xc^ z*3}8a5S(6sDP9b;ebu5xb*#+H#Cri1FfxdXi{X?dXaLA1AShQv0KG+~3qXco4?v;~ dzz2qb0RYknGoBWMgdqR`002ovPDHLkV1i*IPx1f& diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_pickaxe_head.png index bfda96f8daeec65d7d1fc9c142b43fe3b545c8d7..bcd80c174eff17a04afd652f4782f4c10cd517a2 100644 GIT binary patch delta 204 zcmV;-05kuI1I7Z7f`6|`L_t(IjbmUK1t_3n*4+PHa~J&YUa%O5m;Uctw(|dkm23W! zWJv3@ng10{&1;R^J!|cQLu;-50&6F(UjKjM>UG2$)HHGO|JErp|91dg;}Q{F>lPJL zYwZs*hy+7m0OS=b-+)^8=veX$0D;~`%ll`qcI=UPVT}As}yb&s{{G0p0T# z{WoxSqs#zR3+vi0U{sT30L+k%IrGUk00gFN+De%LR0jYF*;{?7*}HWB0000n013G5S{m;bA%)ki53=B*R%xo+SAbvr3 z2qRGjRHP*{woaS*f6n}Qb%H`d47@x%41a$AVVJmj{eK3A{|xz|K^O*Mc%eEgov~@+ zVICa^#A&`tLu3AcnNy} z8z@bPX6#+G?EjX{o9dR%n^)Jnc-jBr*eJLKM8!gJTol-lbwHQ=`}K!37r?;3zke9M ze))f`6V#L_t(I%VS^|2(aSR`Tsj^-}_It=Fpt{TCxmSeC*VJ-<0&) ztvBwFu6fSB!(f}YT)RoS=2?3W{P&1YtX*;PEIFDF|MyExuU!gsKFOLVY~TIgB{sfx z!Qo@1Ywp{!6OQO^E9{fKYh#7_)002JEVzNy#e#8I(002ovPDHLkV1njOVm<%> delta 281 zcmV+!0p|X-0+Iuef`9u-L_t(|oMU955U`M=X~n7Y{{;m389Y>#7)dq&qEwfDgPH4Ep} zC1m9^`Dm##BFhmpVAkHl|F^7IQWu+^*%V=J%!n?J*MJGzcYpt1wO~$NOj>$Vw3Qi# zX1oUUZQ1dE&$_jBVacgY3AR>PHRCj(Z`1bw8<#Aui_XYwN^`KmsTr#Qy+F;|SFfxK zNk}578N&dOv$w2RUKf#)N|a_413)%!TnY^BjI5>-n#z`j0~=xUQIB~1Py?J z2sdZOrQ5gvKXLjTLvM8j?l8ayqCGtc#{xNE7#IKmCPYybsSi#800000NkvXXu0mjf D3`~GV diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_shovel_head.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_shovel_head.png index 539037a37f8b7b2e1c2cbdefe012836d3493e4bc..5c08f8c375d0c38530fc3c1ad40dc51d7e5ce342 100644 GIT binary patch delta 161 zcmV;S0AByy0-FMmf`5cbL_t(IjbmUK1+)co_a6Me`0%m+3l1FnPrBxPhyUxEo7d`@ zThu!E`qwTvaD;e679TnJU(ehUsL`+1H#V+T&%&~H>9Lc<8L;Bi+5ZMs*0qlQ0YJ_1 zVB7V91}r;vig*`*4DnA$0viHy$x>1@!@U7?GRP%MkCUMp1{#R=_Xr07qbxwpQr|(_ P00000NkvXXu0mjf0bxxd delta 227 zcmV<90383D0^I_Tf`7(IL_t(|oMU955U`9IfZu?*dk_9+V`F9b`Vzf48F={k89smbzyPwAkpZg@Fb#+>GiC%CvRr)H)Vfda-!Z&<^@^dq ze_~UVl^OA205W9pv6KIMON#2sCroULw#2R(rvV@kYh}*36le%O&3Fv}foPy1_~Z#1 dKnxgo0{{-LJy8WEJO2Ox002ovPDHLkV1njxWFP_5aehKVa-0pH%CeoK|ZCG=yjaK;Y8%KmUWWa%%%Jb85YkQfqJgA<_9D zr)M-a*9K?j)?WDhoixp7KY#n5)!bTp4QT7tpMU?K2lB}Zc^?@2^0!~48!&n+a07*qoM6N<$g3AI?z5oCK delta 223 zcmV<503iRM0@(tPf`7tEL_t(|oMU955U`9IK%4?TZX(JB=fC{=&&e;Oysb|EG4g z)#X*!H2wekkKxy^pSbM7Zh$c_7b7U-HJBl`UjFv$KS>6F08BFo=yI`Pbv|ALhy??0 Z005#;JD6h5r3?T7002ovPDHLkV1fypZO;Gz diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_sword_blade.png index cb3292153fd4579f79dbfe385a6160bce08b7f7f..0adb13de2e2b30f92834be1bb7e3a0792985d060 100644 GIT binary patch delta 212 zcmV;_04x8K1I_}Ff`7M3L_t(I%jJ{N3W7ioMf(;_Dx)aWO|!H}i~1mG(J>TZ7X?Z3 z#eQ~DzrgL)c|Yeemzl|AJo79o4Bj6Msv3o1%5zi?4v_l;!saU`h%$zXX~E{=!OA%S zt()P3ILT1fNe@nq9Z+5jhr^7cY!Fx;U63>b;v^jo)4af$xlM<)dj?5w;g@^t?pPzrx(IA!Ho?IvC1wj8cXp`jH<*a!zmY-J$yc O0000`!L zc_y4I2iKiW*r>r{6zjK-nP7}zsTSC-^xpiaKs-l!YG6t!27VGHxKgnDc9CU*I_#&m*RF?4 z0^h)&=G&B-+KVN6UAMA!t-xAuVB0N7DdC!%$0y*DAn_jvk5hfI+92Y=Nw_4~CFcI0 gz*<4moGthU1rsn{dwvy$-v9sr07*qoM6N<$g7~kA6aWAK diff --git a/src/main/resources/assets/tinker/textures/items/parts/inverted_toughbind.png b/src/main/resources/assets/tinker/textures/items/parts/inverted_toughbind.png index d6d38ddeb6f3c0b883ade46cb7952bc0b052e638..d3eb534c16c30062279e9ea38d250269da1cbb30 100644 GIT binary patch delta 338 zcmV-Y0j>VW1j_@Ef`2qgL_t(I%gvMBPQpMCg?S$QBVbf$OMf*Y(AN4q^9qek3`F9E ziGfVhhNcaKrb!6~<7G?Gob|DQrSr z)8XkG$DR0eBuF6iOu#Is(kyV1lDrWyn3IrBBpI3v4;LBj9Vlm1Z3oU6bF142j`y#P z45OIpstyvf&DnVddpD2bgc{7gY}y-Uk%{mO+_y=&$cRlo*A3wIf6~TzO3h9esx6U; zjCYH?Ok=t*Zc9MBcfen5@0p8S-FBeb6pC?PlNnta*I+mg5UoE7r*IsORZ~>(ie4;l kjMkr2wjIoubT}XI3!WUVnO)=#t^fc407*qoM6N<$f{go|F8}}l delta 463 zcmV;=0Wki{1IGlAf`70{L_t(|oUM|siYWD6r)Ijf~aR{SLvo!bvkzn!5o9AyT1Q-{`3DwfkAYbO-!r~L$XdC%YXSCpO^@Mb90Lh*>arDW`L-R>$=ES|5@*anKgx$w^40c2yxBTET_1&(W;d{KztSp6n)Roy=(s z%SPT6CzX`SLUVoaP>5`KNpdbbSTs#uDHg~{!<{S#0-)?9RW=_QSk1Eqwh)%Yj+UD*7^cv4aG<+uL7(ITsz&C&@x<2<=63)n2)_8b!jzzL6#5;R?YIJ6Lz^V(mx=6+%IXOPCxVXqPRon+`MV6%2 z-8}+~L3C!y^OQw}q8-3DV4>jfA$_0f3HiFfksgfqwwfNklhM)h!W+c#=ktlu=4GHGvCxW9Df&UIAUu!W?Jv~3p{3LBnEHBfOvp4nX)UE z{9t<{#4}=dQiCsF1TAeLo-f&>>F^iIpxsf3RaLKUAXKV=_Gu>}R#gLriD#x;>cgPhNb3f6W_Pr*QZ(JuNB#00000>J~2fqwxiNkl6S#s69J=hpG@^D~sj#x_L+ z`7y%e2pZ70Z1w+n^XJv^^6@bgr=~YWc)Kwo%i}emZ{4QM z?v#mjydcfVDR?zw7%*kaj{l2hPOB3T5MW4+jA@E+bHb|`#elwb8~-nxJ+qFVUw|PI zWV3?}LCtUjCPDx;uK-0AFE2x4R#sDlr5RD0;RZ+ui!v0HS2Qs)Gc$yfpc!sJguN9> bnvekiQxabO9(lii00000NkvXXu0mjf7c`%k diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_arrow_shaft.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_arrow_shaft.png index 2eb605c10c5e56ca6fb61e38f49e078de15074c7..be7a4330041f98d84fa130e8dcc3cd5342ee812a 100644 GIT binary patch delta 82 zcmV-Y0ImPS1o;E7uK`LmNklE!x;UCIri$N;JX0EN#=#p0t0asU7T07*qoM6N<$f|Xby<^TWy delta 157 zcmV;O0Am071H%NcuK|C5NklRIy-aXJLVhriYY5yGhvsRJ z>=H(FL$s8{7_QxW#V~){1xDQ35P%7pGk@C!#%uRpF*ukh6YU+WwvgfyCTxPFxCF21 z#JGfDKoK$os~3;~IRT5)CFG-%;8U)-ki|Ij=Q(hUMB zhH0)zu!Ccw4FM^HY3|N(17niC0@6Sg17QA#8A5VcAhXGG39 fKBm!vOG1KyOV#GsUmnKE3_#%N>gTe~DWM4fTW(3X diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_axe_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_axe_head.png index 197b5bb399baf95474210a23bdccbb8285ecb0fc..c676d9bccf646944f59c4f4689668f12c76c277f 100644 GIT binary patch delta 101 zcmV-r0Gj{01dIf*uK`_1NklHYhllOI z;-?B82Z=)r+qWt_=RbU0yuLtFou{LB;zTZn>F0EdZ2W|{co=}d)78&qol`;+0DE#X AuK)l5 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_battlesign_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_battlesign_head.png index 93539882411c1f145b45410f6b714f0c29baacdf..844457b427b70b590b147e3c9f6841d8fbc54a7e 100644 GIT binary patch delta 129 zcmV-{0Dk|H1*inDuK{^vNkl|SU z43Y<_!)gFb^TLK;oET;ZRs#rWMm7Ym0T;LFfHBA>7$3w2(L@b%7 M07*qoM6N<$f}Ij77XSbN delta 163 zcmV;U09^l(1jz)juK|CBNklam%)D+pNUk>Wu<>n#287@>|mzM taNyKkhWXnr5Umfx5VACmf>A(o008(u5L7Wu{(}Gj002ovPDHLkV1nOnCBXmy diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_bow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_bow_limb.png index d5291df8231a95a1e6b070008685aaf03bf220e1..6ab3096b284b95d89d3a2c42da7af67c5363cee1 100644 GIT binary patch delta 91 zcmZ3&(#W!59b>Sar;B5V#p&b(307wgl`6?U?TM328w$$%ZvS`wZ1OMu{`&6w0x7%( vdp0Qkun*L0$aJ~xuw}C&!?H?~YcDw%bj_{)_Bg!T%m4(Qu6{1-oD!MPYL}%!X7pWiQkImcvmMKP_+fYgZ2)0Z)B5|fy z&agvklaYae#GiJ_riV;3+;mk9cg&c}x?nhc7g&_)nH0FwNKZ>yl>(NW;R0 qV9GRuXo@tG pl_AI^S;Ape+8T!NCdp$A49?P)%Q_ayc{2ckr>mdKI;RB2CIH?IG-3b% diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_chunk.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_chunk.png index eb8d5562f994cbeebe6b7b78e373b5a7d19bd37d..532c37a93062f9d3b8e18f48d917abfa07bcb397 100644 GIT binary patch delta 119 zcmV--0EqwV1fB%2uK{mbNklhF!HzTo&^41~08Asv2EYsfVX`!%8$^)-6enq# Z0|3GOdj6;A$%g;{002ovPDHLkV1jJ%FSY;x delta 197 zcmV;$06PDk1nUH_uK|CjNkl>7v^ufz&L-~1;(eZJ`r>UK|oBB9ykC1E`mFDhNoWb00000NkvXXu0mjfl{-#+ diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbar.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbar.png index 51caecd3a12f38380f856b69c3ed77bf9613f466..e4e713d42e19bcf0cc6d5fb0cb346383d3455bd6 100644 GIT binary patch delta 88 zcmZ3(@}GIbdd2{2PZ!4!i_^&o60BPoJLA~?JI+vI7Bge{zx;&4gk$eyw*SBW{q>}D s4v)(VE2R>gHHug_m9yyuxHHxzopr00|%V3=9VUaT&sd&w1uXj~KSBmBgn6w-+Eb8vJKqcm?+k nHdo*@fC1I-LxFPl8X!o@ut=00000NkvXX Hu0mjfUVJG2 delta 197 zcmeBSdCjt6J!AcHPZ!4!i{9h}iMoVD=MVKkSBw)c&v}vRutl-w1yg4n+yAXoj!3M# zTYdBZ5E#_oX5}%h;B_!-X>4qKcx!KX1#jZP^j$kIDzg93f*Ri zyNE_gZkckVppDy4+##o>!qulmTu$u;Lq3C{!qJZAnMSsU8-vRY4>9LU7%Vt;sGi+8 v6=cYi4+gTe~DWM4fjayEs diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbow_limb.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_crossbow_limb.png index 365c1792ab9acad6eaf81a917ef9d403d052fdf2..2c86e7582cf0cf31f2c3e6fa9507bf07a24a7d99 100644 GIT binary patch delta 105 zcmV-v0G9vG1djx;t^r|8NklMl;#!CZi$`OrL#|JV2H{>SHhWWa(h zaQ~4u!~8XOvD<(Jz!fEW8T{8$5@Wb_?-kLS85kHCn21$4L<}K7j^}}K0mXpW#Dfd~ Xn7K0pWe~=H00000NkvXXu0mjfiSGA3cjpR~fec24vj#p}6mOX5 x=WwtkPl{<+Gg0O2iM9hKlVqogENv8IVVGnXtNwj+`a1?7@O1TaS?83{1OSu?BZ2?` delta 145 zcmbQja-3zudPc_P$r~6&>-*0OsMX9`dh~}x-2MM&1HyiZFZbRc#c=t|fddB$KFyJd zb1vA`&!!mW9zZGl7MXVOpS7N9l>cZU!LmboFyt$Ly5Q1OR7bIsgCw diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_frypan_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_frypan_head.png index 13657b4683af1cf022c407381a552f17aeec2106..cc9565952ad7487a4ed425dd1e194459f41ca632 100644 GIT binary patch delta 140 zcmV;70CWG91+oONuK|B@_+B;Pk=AQd>gCfd{pc8X6rrovZ0KX$aQVEKYBsT zH7g@eV_omg7Y%YD%r%=vQDoR3P8P_8gw(x6ks*m106<*={cUGvflLKd_atf{ONQwp zf-ISa@iayyax36~>J9*0hL|J_T!vPioWPVCwQC1l`w?9`Sanxqh-L=BGlRE7d~~ag pSD?G&r~kl&;M1Q-fqcgQ(H+zBY9};;Jgx qX@^3EOKMUZC66>HEAlckFf2{5Yi*pkg_8jYJYD@*UDi1zGywq0mpHTl diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_hammer_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_hammer_head.png index 1f3d096b7ee32cf60178cf25e1308e01e930b117..8d30a931de6c6f947b8a7fbb664bde444eb1a25a 100644 GIT binary patch delta 122 zcmV-=0EPeg1fc}5uK{vhNkl^_48q+xZeUE3As|Hy8-n2&n<01&f+;{ZfGRG5d5xs-fEfVN2ntxTVgzOY+3A7o c#58mO0Mze=-)s-abN~PV07*qoM6N<$f>XsYzyJUM delta 211 zcmV;^04)EZ1o;H8uK|CxNklHkHZcux005#)NmG`;4{`ti N002ovPDHLkV1m9mSpWb4 diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_knife_blade.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_knife_blade.png index b02c89377eedd2194b9c4bce29a99c6271e8d8d8..de9506b8da267f5bcd5070a20db7d5c1d7bf6a9d 100644 GIT binary patch delta 80 zcmbQw@|}6ZdPWapPZ!4!i{9h}309Xz7yah{20qiCy_4Dg|N8gWlkymRJ}<14dXgP? kL%=4mdKI;Vst0AC{^0ssI2 delta 120 zcmV-;0Ehqg1D^!2uK{pdNklPC`$A)_zz>x-*y2-4-+w(wUopd%1Zx| z?gE%*bE8KL^Ve`-*pAl#m}W5%UWNmw?qb!9(*R;MV>N&j%@_udsu?Rt^fLI59Bre3 aFaQ9vCobXrsr^#`0000oQRQ diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_large_guard.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_large_guard.png index 55a25776dfb845bfa223d9b95897c094dd3a207e..e2060a739332c513f43d31cd1fd2647943dd3b86 100644 GIT binary patch delta 85 zcmdnS@`riDdPZLhPZ!4!i{9h}304V(i>Dvha|EY2l=n$LZPUr&P`fYC#oHiRRJ;FO peb*tDXF^?jowqhDJ<*WJ!@xM-D0*!(voQk@c)I$ztaD0e0swkRAISg! delta 144 zcmV;B0B`^N1GWUPuK|B@NklMC*#H0l07*qoM6N<$f`_mpssI20 delta 156 zcmV;N0Av4w1i}QcuK|C4NklNklpa!Upvi(mgPV_SPk7B^}{ks1T&C~ebo#TcV zgVcc3Vi*9^JhR##FNPU{VF0q`g$==2F|r{z4FD+w*?_JYCPtJ2AbfF~4puhN2H^7s weGH(;3ls$++0jUGLZT=sgE-`125JBRYz4n>fj77500000Nks-uM6N<$f&@T2EdT%j delta 278 zcmV+x0qOp<1iJ;WuK|DeNklxF7AF~EupwO%(b{KYlOF^+N&m;)>EKR{0G7{Bm!ZZiKk@Oo z8F{yZm)D$qTC!TJPNRt}Gwt*CJ_f)6Zsu@0=>)9S3WEh|fWLp{!1qLRQC5W0$u-Lz z01x#?f$yPJ(lBe4h~NeQAhi+m#n#31#g^1YVpbvmVDt4T?t26JsufT#VGuy8q)~#@ zSP@W^mDsSe-K`u+(z c?+5D_^W|avuAdG~9{>OV07*qoM6N<$f;-2A(EtDd diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_lumberaxe_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_lumberaxe_head.png index d2954e757daf521038c2fee91576c54ea2f02a70..8e5e9716fbc49091f09120d940102fb44dbcc487 100644 GIT binary patch delta 106 zcmV-w0G0pL1d#-=uK{9BNkl8npzEn>pu0%Xk$3=9lfN@5Jy zyn76Uc_+ cHEo0f0Je-Wk%(@zZ~y=R07*qoM6N<$f;Hw(WB>pF diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_medium_guard.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_medium_guard.png index 7574b22a7a0aebb5630460751e093dc3dfad6db2..97cdd50788a3bb03f5bc144b5adb74466682464b 100644 GIT binary patch delta 85 zcmZ3$@`riDdPZLhPZ!4!i_^&o60BR8JLA~?C(h70d)G4WzqlDov*FFQh7Vu=?s_84 pWZaR&>~K%zmvv4FO#s&kArt@r delta 121 zcmV-<0EYkk1E2)3uK{sfNklNO63*xWA?Pjw8A7s4uz8Ct17L;>ya6C@kZk~R>`ToJ22!|F{&+-*$l!n>dDGqL;ycEhRAq zF%e$4*nv}baTSo3;1ginqTx4$ah++O34h)wt5i(%@ zwhN5c?!96-c}|YO!Au!Lo}dB9hF}9k8GsLvWWcL8pUF1>pEn#x0{9Z!zyJUiX)a8N S+aRU@0000qIkZ(Uzf5ZO19nyAja7^0k(K1N%Qsny5wnQKuh043jhGJM^9Cn#KH~M00000NkvXXu0mjf DHi1C^ diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_scythe_head.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_scythe_head.png index ed79b3d295568f4acdc943810f7171624293464d..024ade262d53a9fada83857e4acd431a378cef54 100644 GIT binary patch delta 97 zcmV-n0G|KA1c(H%uK`&^NklG(1i%EauK|C2NklC!Y|Z~~@FX5uKC`j0@!=Co%eL#^>mQe>wlSWV^|R7K;)qLyQ$>G z|6C6eN)`})n3@0t76q^L&KVqd)e1D(Aa3{ft_5jL43=VU5{!8a49tBRjtmdKI;Vst06Q%rtpET3 delta 135 zcmey*ypCnVddB)JPZ!4!i{9h}304tiw$#%jhUI54{xnrZ!o9-GPgl%lG2_E)5l+!&fI7B nyLnzKO?k=}G5~?6tDnm{r-UW|dD1jX diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_sword_blade.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_sword_blade.png index 2c9e0d6ed86175c473c2588aa7d99d0def656d51..5f3bf145902915f9642f0f7f8bac6b99d60e3dc3 100644 GIT binary patch delta 87 zcmV-d0I2`81pWiCuK`awNklED delta 142 zcmV;90CE5R1GEINuK|B>NklT zh8#fyV4BU19x-fLD~TbG*9*v+Po9%wxOVRqiu3UrK#XRb1`w+ms{t_0Vj{c@uikvd ws~N)pQZ+MRiv?0NV+Dy`2LF*0%?JPhD0fP#UC!|j00000Nks-uM6N<$f|2?am%)Eh)UY5+IG8EJxc}#GyTFJ| zGrAhM0Zpx87qrU`=e~B;|nz0I+Y1PjK!ZU6uP diff --git a/src/main/resources/assets/tinker/textures/items/parts/magical_wood_toughrod.png b/src/main/resources/assets/tinker/textures/items/parts/magical_wood_toughrod.png index 52962c2410d3d05cbe44981b3ffa37b2eb89f6c8..97e798b8470f57d945398bdce7d80b0d86bf4e83 100644 GIT binary patch delta 83 zcmV-Z0IdJY1o{K8uK`OoNklpTe&1*CjuRlAXRO1prcBXjh{SAV2^B002ovPDHLkV1mYijGeH9gX~t^+F`982 zK&)o029Tl|!vIn>qZmMrW)zzb&C~dQeZTI1PTk* diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_accessory.png b/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_accessory.png index 309dac5ddfc4ca3275307bbec01fb3d97ec04e9f..cc14a0af2a59a1f8356adc5a7d9926667340ee5e 100644 GIT binary patch delta 76 zcmZo-%$lI$X6WhS7-G?zoFEbD;O6$so?~*ZLvr%t|C+(e{_t~hDxMcmS6}}B)~#Dp gb|#7RFwJ6M*t?0ZoVVimZU!LmboFyt=akR{07gFoiWC`viXkWwH6yX|ef0z6(#E}I zIFZK@RfX;bC7T)C9cwL6azsE?&*i;0=A3us%;d`Mjxh%4wW+iJGCi28^5yR4eijj- a%eQ zJiyJroP`i|+qU{TV36LROG?}5=a!ie0?xT*Y|ouGX4YC)N=WJ3%xBPSXw{y{?m5~o z(8kRBzJvE3VvHYU4*>`t#{s33d)3BIa_i10T}nB9D)j%XKLI+GI*1B)zFGhP002ov JPDHLkV1mJBV0{1p diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head.png index a7c5f674aca3553d3f130544918c7839bd9daf04..861254972df197bf66e267a79d7570122f5270ed 100644 GIT binary patch delta 143 zcmeBUTFp2?rM}41#WBR6`a2BHr*7?00bPKu6{1-oD!Mz0+l{NdE&em%3x69$Z+3M+(*OVf07*qoM6N<$g2I<+N&o-= diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/pickaxe/bedrockium_uie_pickaxe_head_broken.png index 027ee6b62b96c86c40d554151ab680e41b944045..16de8a52e78613f5b2dd80d0cb6abd222be59f89 100644 GIT binary patch delta 128 zcmV-`0Du4J0i6MmBza^>L_t(I%VS^|)Idf?=6^^?$bS%RU|{f{WCK8&y}Z2sJ2^T1 z*Vfhs8wA26y8?tuN=m>OW-!UF0eJ!B8g+Gb(p`aU2*?$Ujg9}was|vwAXktTs4)Li i delta 204 zcmV;-05kuc0q6mcB!90-L_t(|0qsyR3WP8a9FJ>6{D4@BwWSa6308SWo|VT0Qm0Fq zHfd7in1FDI9I-gK;sUcvc6Wx|!Ee8D9P_^KnR!{3e6{W4s(94abw!L3^E@M^1PT#H zzbcbJNGUTx61QR|8ipG1gkcz9twjg{&bh)Zp+VNbr4!i)y%r*t(#9gES0000d* diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_accessory.png b/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_accessory.png index 2784693cb673e66c4f6de7cdaa656214e8596a86..57ce34647d7687455b41a6f492c71bab61474536 100644 GIT binary patch delta 91 zcmV-h0Hpuv0oDPKf>b|AL_t(I%VYTe|33pIm|b4l002ovPDHLkV1njID2@OC delta 110 zcmV-!0FnRJ0qFsdf@e}mL_t(|oMZg||33pIfQ2I6bT?qxmM#Aofpnyg4MTMA;|zSF)@aJ|Nb@oLlPs&fXQ{$jOb!REEYx$7_0^W0A@%Px##AY Q@&Et;07*qoM6N<$g1&Dr9smFU diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_handle.png b/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_handle.png index efc671a20b730efef24221bf7a7825325f0f0764..4f298015d97b55f29aaaa5bf75e079f579be562f 100644 GIT binary patch delta 155 zcmV;M0A&B;0+j-gf`5KVL_t(IjbmUK1tftV6$;hsqx10>kvlh(zpWD-E?=~e96vAmA6Hyj zyAo&!$(mUAkCNWKB)6D(rb#0jl-%LrvXzIFZzG{!eZq*Z$0g%@VI!Knz0%% z6X@qF_a8wt$0y*`j9~yMwD+GnU*~UXNYG{s13>Y7{LJ|}Uo#`Te#U8l@c;h|Ud9GZ j(IjX_F(8ISjW7TJ22NDcuG&-x00000NkvXXu0mjfep79U diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head.png b/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head.png index 6a75ea54e8e7c7643725d0f1922f93797716ac95..036e71b91bc86751913c0d4a6e06c342f95971a7 100644 GIT binary patch delta 204 zcmV;-05kuu0`&oqF@LW~L_t(IjbmUKl%QkQ-2Yv37yR#Duo#G!{_k71^8bXDYyOjD zNb9tj{}oNmYmMAJYwd$WYpwkPYbUN=|9|4@b;KLgG;#9()+sapcK}`E5)obN78O$q z5+}(J7yx<2$~U0aJvz3QECWEGchR!{j-e5?W}ZH^y^EKTZ$*f;e_(C*+(qOW&^>?A ze*b!=nfa>xI=@1c#tS`&iv2pB{%Wf`ocD1pT*rxaT(<`0LD~Ve9%vtq4X0u!y&U z6`_8x_vQaW0O0KMO1sf*b0e2yJ)0#NC+t^i0VpSxUGpsf5PyW{D&iq)tGtXxO=}Iq z_~A6{5A-wgquO_mx>ers3&&MI><={6^1Mzj)_mpA-z=8=&V8%^HVx3I9hp*jJIHt$ zrf&(U0f6Zw!M(bVcWMB@IfqWh%dEcFj(XbaM#~*?-o?}N?|^^Q41;|}xo?$ch5!Hn M07*qoM6N<$f{{~y`v3p{ diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/pickaxe/inverted_pickaxe_head_broken.png index e933f9b372aea73ef527581eab7cae11a76458be..2a9a1f10a6ab24256ed7fa434d2736f4e3b0c34d 100644 GIT binary patch delta 172 zcmV;d08{^y0@VSKF@KLqL_t(I%VS^|)S!F8;{V+Xmj3Tsw(|dkm23W!Y(Uqnx&Mva zJ!|cQLu;-50&6F(UjKjM>UE?U)H-G6|Bkr}{<}m(*SbZ;)PlrFHU#3GrT?vb18Uu) zV{6GW00ep$E&J~n8c}QJ=~LUgcp3SISo;UocF$czo&nwS7bX2SaCRf#09fpRFvBPq aBme-g2}f9GFRq&a00003Hlh#^GSC24jZp(6i(t#)~zjm4cS7 zH#Ea`C{p=>zO*P)u4<{Atm&pj0KlRMI%YuN12a(%A*Z(Y$H~;_u07*qoM6N<$f(g`du>b%7 diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_accessory.png b/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_accessory.png index c8c6bdc3937ccf9d1bfb34cb8ae7b5473c71b672..c66b26ab68d3ba6810fdacdfbe08ae52c9923cd3 100644 GIT binary patch delta 73 zcmZo+`M|tkJ)@(Jr;B5VMQ?I~M5MyS(+})9Cg(bo_uc;g`giF`^OQvA5A_oiMRq2M d^f1k0U|o<1fH&bF6*2Ung9@CB$@yK diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_handle.png b/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_handle.png index 9fb281bef7e60b3e5322edff66d97a7b3629998a..e616f2397fbc0d581b42e136698e30fbd861204c 100644 GIT binary patch delta 66 zcmZ3*@`HK9dPYW*$r~6&OxQ1exxQzEVnu^V`STsU7U{tvq1V5^p0r#tjp61jO-2U3 WO^y++x0MnYfWXt$&t;ucLK6V2d>SAC delta 116 zcmeytyozPRdPc^y$r~6&()_;|{qQ$E+jAtV%pf?;qTrR@;Xk?J0bc}680M!nv8hx^ z{<$6`l)R(ty=d539w6{($vL)Mayd7LrSy8nBNo!?3oPcXe}7%o-}nr}CevUhhEwO= UrBuCVG%)~yr>mdKI;Vst0NJ4|!TE1dRl+uK`|3NklFbco`0B5IC#p1IAWdHyG07*qo IM6N<$g4QZ3rT_o{ delta 163 zcmV;U09^l#1jz)juK|CBNklLfUIVbX$lT}=!~8WIaF;L_T_!8Sl0|3?}FihsT RJf;8u002ovPDHLkV1lU5M0)@L diff --git a/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_head_broken.png b/src/main/resources/assets/tinker/textures/items/pickaxe/magical_wood_pickaxe_head_broken.png index 64e284149959caac64ce6381e24a79e64055c8a7..4355f230ee75852c3844adf169107043a12ca882 100644 GIT binary patch delta 87 zcmV-d0I2`81pWiCuK`awNkl)A$eL tQ)CFmE`fQ6>_DZ+0OXiq7zM)x00047Hscx;$dCX4002ovPDHLkV1j%FBV7Oh delta 142 zcmeyzyoF`MddB(!PZ!4!i{9h}iHrjt9*&EqAFNOL_a|38;ERD^a(DAgqh=ruWA0?? zjAQ%1yZFvO`B}?9%HI`eigPe?@%HRFc;|)S;XkG_JUjvK1)j3bc$ED;&Tx*6I{SA% u=8cIBc^pOwibomPTy!SLO<0^@z|6oRr`la7Ru#Yi1fH&JelF{r5}E+{OgEwc diff --git a/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_accessory.png b/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_accessory.png index 687ddf4c4657ee108fef38faa4361e7567ffddd3..54358494550eb1b194fb4d734e009e0b68b9eb41 100644 GIT binary patch delta 105 zcmV-v0G9v10fqsPBw|fTL_t(IjqQ#x4FEw11WyPKXwX1OjUhbXcR%|Mpt$NLAyku{ za~_WcnF-!lG&6_@RQ3NOnL>A?s&?y?A_DFXmW*XCvtpc1*5WljXeJ{pvhtQ>00000 LNkvXXu0mjfF#0I7 delta 163 zcmV;U09^lu0lxu|B!7lUL_t(|0qsz+4a6V}yw_(87N9_)WDw?HA@*PfHedltghWRL z5lE(rk|%Y|HV!SW2_rvz&S^2 z4c_}7$!|@dl!9{(wN~Vu$vbg%n$QXCrNkD&T}xC6S2C_BWy RA`$=q002ovPDHLkV1oL*MTP(X diff --git a/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade.png b/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade.png index a0767f1e7e644d94a987ad1b9513d778d87d9237..b92e71fb0de8697655da85276409ef49484c6d8c 100644 GIT binary patch delta 116 zcmV-)0E_?L0g(ZaByCtpL_t(I%k7b|4FDkw1Cdz61wD;Lks;Ej%`Qyt-+@5)H^Av+ zH$KM3oSSX}>$*0j)D%f4D5Wg5RzMPC%q5Zq zC5&KpQv7Ldey-@Y;SEjuPQA%sBA`JfY^`lqr-Kkjpq%6I-~8TzC+Pn;AW8blFaQ7m07*qoM6N<$f(A5IuK)l5 diff --git a/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade_broken.png b/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_blade_broken.png index eed6f8aadf93b58a8cf3fe98ad0b6c1c189f9fe7..ad50e6b23d0b0e321a87eb33079b311dc4e2a596 100644 GIT binary patch delta 93 zcmZ3*SUo`{+{x3$F~s6@a)Jcw7RFn*Zv7V(5&1Vcx1p!!%>QG@j{PqzESw_gw9%V~ whv#2)Wo6(qp|rHL4T?ZwN@co9=0yPph8qth;!ItAxEX-J)78&qol`;+0CHs|*#H0l delta 141 zcmV;80CN9(ssWHBe{o4fK~#7F?T|4FfFTHl?T_Xz(9m3ahv*PNH*e?y4$l6#8@040 zh#>m$-h)?{6397ojFC_9pLT?Z(0hm0+7@Cofb2pD?7asff-%POPE{a)Ij3>XK}zXJ viTtQ-t>s!Pmr}NNRDdkSj?CAW68Hh}78@YbId&5O0000<2SrXqu0mjfQ-we< diff --git a/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_handle.png b/src/main/resources/assets/tinker/textures/items/rapier/bedrockium_uie_rapier_handle.png index 3f62937c602fffea8a123364308e0a5ed9a86663..dcf73b5c4dbf8e120cd0f806b89451d61e8f5a28 100644 GIT binary patch delta 97 zcmV-n0G|KI0e_GrTSiGlK~y-6V_+Bsqkvu@G&JmW6ci|T2}Rxkxx~oGh%)bhTmr%XP>>)ypr*a400000NkvXXu0mjf DAm1sd delta 171 zcmV;c095~f$N`Wfe~(E-K~#7F?NBie!ypX2RAFXgVr6H6PcXCcT_j!s5?^3pfGUwd zRhmfY(kWhSpM2-D@x=3izkR@3+qKsHY~kw+JYwE^7-Qg^`x04>!&kkOvI`-QQbGt} z@@8>G{KPruol=TY3Sx{q_tptRB3h nchQpnBnKkM0BjluPdWeqNtE;1bt(8b00000NkvXXu0mjf@l8ER delta 169 zcmV;a09OBi0;2+uf`5!jL_t(|oMZg||33pIfQ2I6qXrCB112t8@&Et7{|p5&k&Gl6 zFm=VM|Ns8|W4LtjQk{W;UK2?!n7Cy5|6Tj`)rpG;Gw2%_H04G{Fp^}zUxxn-qQXK9 ze7w92e}S$*1_TY5ynMy~ix)1`fox^~=9{9JC`M#?qFkV_uOi=su90X1ko`-R0fYbm XB7rW^+^*#H00000NkvXXu0mjfz9~+> diff --git a/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_blade.png b/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_blade.png index ad36ed3cbc2a7afe64183fd934c38f64dd05ff62..66623a96b0fae49ba107b06735a37fb5d068511a 100644 GIT binary patch delta 195 zcmV;!06hPV1HA%}f`6t-L_t(IjbkWpZ2g~BTJ;|Y7|6j4Wev^$wf#bBQwz$-G6YPN zR@MC14-BhKEi5J35ICc>s_wsze@JawNhL{!pm0iS8vYvwN7QBj4I|3{5H722{O_2M zO0*$Z1-(l8^3_NtqZQ%TF;%V-kOe1ir-e(=%`FDvVEE zV?;WANC-k)PBUch0OOOi5hC*?jUy6)#>M>uZ@0S`4UTFfa(}f+V?!b|xSBq)mtn*F z+yp3)NRwiVoB3;PME<^TmdUq$+%4YO(*{GME0HxIPr@DYb%e=m#yft1^Q8QXHv$D> zLQ*}8$;+HQ&YIZGO-g}0uJ<#}?c0J|$pB}5dkv`siYD1O9e0er+Hc-qm9odRfvWri a;2W@bZ{gK{mJNmg0000;@z>w)~&Aeb;}o4On~b(*Nk1 z`r4^mcl;;Y3#(6``yX4|P&;?;f&XNO!K#yI|0gxI*3R0w|3BG*xcbz&|1mX9wR3hK m{7-f)tT=J{|7c32p#cCA^!ceE?akW&0000r{3Rs(_zbs7Kt{quj*rcHGm9320Xoa}KLf-?+4Obi+S|NH-c z$IcyfK(qd*x;bDq1aBaQni(+y!T*h$w$w2(G5t?=vBNNgU@$C%m>M$v{rC5OxVZ`G lE`R}Cnu#_59~cG(004!QF^#F3wekP}002ovPDHLkV1mNRS<(Oi diff --git a/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_handle.png b/src/main/resources/assets/tinker/textures/items/rapier/inverted_rapier_handle.png index 7e630906ebd067409f598b7e0e655f5dc8945013..1c6839d5c084e74c1a931e9c876ed29252407a3c 100644 GIT binary patch delta 149 zcmV;G0BZlb0*?Zaf`52PL_t(I%VYTe|33pIm|@g_Q3HrIz$`TKf5)n||H(FB(v}_n z1M^F2+m^5XPqr5(ZQ1_cBrvqLcg@ECWQRfDx=sH>3QKDzZ`|^q>_D8kYv+H5==j=2 z8`u9QI~L~e-1a{xuc&tQx;5lS-=?*z|L<72>^}gC|MbV0#|~~A00000NkvXXu0mjf D`n*o1 delta 192 zcmV;x06+ha0=fc_f`6k)L_t(|oMZg||33pIfQ2I6qXvv91I)vs{s)DIFqDS|F_L9K zOnf}U{@r`(+W-FhUl|dCVhB+N6kMZtb>Lx>K8TyGD?Kfiwe zKX&+V-4s^l|2cl%j3gNV0)>ITjNClz|CcXZR>#lq`+uxo068Pcv5@BK#>n>n@Ba;3 u_tbIz{rjJ+XiRYPWEB4L^*`J1Ukm^$NjRc{gYAg`0000n% diff --git a/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade.png b/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade.png index ec09a2a417e32e9745af9036ed6b5c9663de47b5..7907f9b1a7c766a9b7ace00250a9a1199341b165 100644 GIT binary patch delta 77 zcmdnP@`ZWBdPY|RPZ!4!i_^&-UyOe6AL4n!G~wCn-=&)7PcGQ>IwpCP_uVcqN=bD7 hP+-)OC~|?1fx&W_&4K3Nnu82L;OXk;vd$@?2>>3dAF2QV delta 150 zcmV;H0BQg91H1&VuK|B}Nklz znx{dLOUO2a5#10iB{7C;_g*o~-*$l!w>BIGkYfl|1*90lgiUb%whN5c?!97gFjFQN zJ1n>)pf>+^FjHn=U|{%<%OyAsAjJ@ZfTHv<3J3!LiWooBJ)REjYXATM07*qoM6N<$ Eg7ttu1poj5 diff --git a/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade_broken.png b/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_blade_broken.png index 55a9f5e93b36f6b28ce3cc26b1d5142e9c555fd1..57eb3fc2129e44ed9991c3797f91553f9d37b912 100644 GIT binary patch delta 67 zcmZ3=@``!GdPZwCPZ!4!i_^&o608ym7f(O1=Lk-5DDS(iV3?BV{Gq@o#iaI<00RTZ W7Ud_EE812v0D-5gpUXO@geCw&7Z?@* delta 126 zcmV-^0D=GN1EmD8uK{*pNkl?_j3Pz`(%pAD2sT8bFF6 g1OX|rG78850G{U~)eGGEkN^Mx07*qoM6N<$f=vK8r~m)} diff --git a/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_handle.png b/src/main/resources/assets/tinker/textures/items/rapier/magical_wood_rapier_handle.png index 92f089d5ec804adf570743613151c30ccf5ce172..bec6d18088846155ce1aa1998a127a4ef8e28a4c 100644 GIT binary patch delta 78 zcmdnV@|AhRdPX-xPZ!4!i{9h}3D(68ataquKd3M7yIn8fJ5iBax{1A0G34X9g_TlM iq>F0z>pg92FkrZNO=F7ViP_BzK;Y@>=d#Wzp$P!admi8b delta 147 zcmey$ypv_addB)vPZ!4!i{9h}3D(68Tn!T^G`Z+E|Bv!Y;<^5AZ_y!oI$@?|_58(Z`LCzi~wgn%qIhMjR*D^I$=S;oN4z`)??>gTe~DWM4f9dkd! diff --git a/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_accessory.png b/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_accessory.png index 218de2882300ceffeb453332e2ca1236b15f4abd..4e8958172e76b19f385fe58fbc1ae06f89eadf8f 100644 GIT binary patch delta 114 zcmV-&0FD380gnNYBx_blL_t(IjqQ)25x_tQ1iugj{tSaaQUIR*OS!1{47|+xUAS|8 z?h_Fl%bCgUrmD^(s!Dg?N4lGz>% delta 179 zcmV;k08Ian0nY)DB!8AkL_t(|0qv173&bD{h0}x1g0rBzATB!k|3`mp!ZH=3{pz5APb<@x-9McPR=F5tgSfc3|IEzH|H;yHZd6)nI002ovPDHLkV1kmrCEWl3 delta 90 zcmXS_oS+iw;OXKRQo;Ckf;BIL1BbJ|q9ZG_P(X{g&6WJ~&gyKtzJI^xsea+EiLn>w uOwaQ4&`d@K3*%o+9T#pdJ)eHd?*Vho7Xgp(!`?3#fWXt$&t;ucLK6VWX(Cqu diff --git a/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_handle.png b/src/main/resources/assets/tinker/textures/items/scythe/bedrockium_uie_scythe_handle.png index ac7091a5da2ab92240646c2e51b513aa9fa73771..11b503c5133bcd8b00dc609b5fe317b76264eba4 100644 GIT binary patch delta 183 zcmV;o07(DJ0@4AHBYyyyNklOhv~S*SVQwjA=`dHH6TJAaBL6$Rr4mb1Ou_Du^I2^Dyn`pkc`owf`E3`GMd7 lxsR8?{wR3m0K=~YUES}VWbHNMfIR>J002ovPDHLkV1lI9Q$hd$ delta 304 zcmV-00nh%@0m=f9BYy!ANkljStM9>!)85{c;-{435 zfiDmvGr>R%LK=N3uWz6z3MR`kdr84@9Hy!&3&W5} zA_V}(aTM0jIY|=QwvEcNqzedSUDs*fcX|{-9?ei&mW2$%pntCGq)#LtoXfWM?Z?inm*7zR3ygU<7$zq;NzxVZqH2HSOA zm(K_XK@dDGf+-ENEX(-JP(?iJ09fAXUj)wjKE43f2xBL_t(I%k9sx3BVu_h2d-5!rsD0a05$A5nRLtT)@_GUw8*; zgGrUb9}chj@I)T!y~7v-z9}U*=O8=PTEQ7(z?5F^Ar#;EfOxliL+JV(C9pUCO-yDkd}K5I_b>J1SO*)8K6V}0000P1 z#$ck-SwO-40or5*?Hd3g326pl0Ly3d U;*mNM*#H0l07*qoM6N<$f(9&E?f?J) delta 235 zcmVu z9{^KRDSU-EIF422dCb&aCgiKaLf1$T1UL*rM3^ewR7mWIQDpM%e$O-~0wQfU>--x; znk-jP>NRfA$xe?2NMeKY{EG$RFq8^ZFq$o90z5xp5W=V}=O58%ic|?hoP(>yvs-mJ l`Od@<$1RD3$1~L&=?&FpO1~kr3snFB002ovPDHLkV1lQ)X+Hn} diff --git a/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_binding.png b/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_binding.png index ce63294b2783ddbdb2fe5703949b48a73443b93c..3f9178effdd6bf79b08d691035070d0a49eab769 100644 GIT binary patch delta 90 zcmV-g0Hy!w0o4JJf>S<8L_t(I%VYTe|33pIm|+APFl+6G|EqTHBv13y6|4T+`Ulpo wB-a2-Z{PpXx%uQ9upFonghzTbjv9c#0Lst#cE;%`-T(jq07*qoM6N<$g5wS=fB*mh delta 110 zcmV-!0FnRI0qFsdf@e}mL_t(|oMZg||33pIfQ2I6L)(Da>o)!u;Nc|CfN3jN|6j3u zd0kFcMiW^EELpsmK}kso%qGi#yu2I`)fDFD#z>X{5kQSF_7IN7Q3DVF05LWbSctFc QrvLx|07*qoM6N<$g67XITL1t6 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_handle.png b/src/main/resources/assets/tinker/textures/items/scythe/inverted_scythe_handle.png index 89dde9a62683316fb7bc8f9f994080beb0b92624..2feacbc82ca12e03e52560e2db853996c973234e 100644 GIT binary patch delta 286 zcmV+(0pb4e1C|4jfqwx1Nkl`HjwV8^=9{>S&vwvY^T z2o{xc5S8+vSy$%nZUn+~4vBIFsFO%qf@DR8wzz>% delta 376 zcmV-;0f+vU1MmZofqwy6Nkl)8;w}ad9vo!+^Ru^Zy?>aG?N+(bI z&&0&UaOmKHIu}>BCN_3`7(g;(JVL;c)HUB?<`cx+dbmH;j$Lp9FnHa>y#TcBNU7A=~SQyG8LQ%Yi zVgM*`4jedG_wD<421iH7CI&{3?My(K{|wbJkyyio1zGdaBS-241q2uz9PFBk!$PoX zz-a(8(4ybJesMAA>+3e1J9DnCW66sD6)_P64FMZ4b?w^!`wkwdb9HfS$_oi$oU~@m z|8wUr*Y&Ml{l6$Q6t5w07l@0A!v#Tx%mx~g8ba6`U<3I7|7S4QP-%)s(m;%65C8y? W$$m>8rAD#<00007>0Q>GAS(8j~Z{%<^X?7wqBU@ZunI5^d6Sy%uK zvZ}4@CDJt@u=>E^|10+H{cq>xQ>$-dTdQVlQmbNQR15MV134*R#jd^oZ9Kec^=#~F ui(5NL(+mSkw{QQS+tf;)=20*TXa)eMW=RU9=?YE&0000=Ns!% z`2Dk$-9BdQ58SksCJaLWj4^!rzSvsRtk)HQx^$43Z?=Ml;aykH1qglv%%8zZr6`sw zUZ>%xs|ShMdLxHJ%&0$bgD@b9B93yTRIPcp^e5BhN^*s_RyLP!HQHUdD^5%n3wih2 ekHs%9PxB82GDkzeE`{L$0000`{F t!~Um{V~ATq(tn@f`6Y$L_t(|oMU7l0E#-h{{Q*&pW)yCzYM>A{b88ZRL6)c&w@{L zU`E#en>X(;FfcOK{r&d`Xb1yCMq|r=AfI7IT{R;?1J=)&23F)86aODXGchsM-Mx3W zj**FpAsuMY%=#KeyavF)-X#m+2C=fT)cpgp@7=x2kOnk_C^Z9+4RT9J0()WiqWOfq qfDP0000PZ!4!i_^&o60BF)JLA~?YhJ3U-T$t>i`UY`zq!bHSMePUW0sTy q2aYfu^;_Qcf2Ejkh^KJN6$S?02l}3j44XFVdQ&MBb@08ULW2mk;8 diff --git a/src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_binding.png b/src/main/resources/assets/tinker/textures/items/scythe/magical_wood_scythe_binding.png index a870a6601a3240a0803972716ca64eac779c616f..a9cad3e2616f546e7cf4f46597dd7f1687be8c3a 100644 GIT binary patch delta 74 zcmeBS`N+IsJ)@JZr;B5VMQ?I~1ZzsOi+=Ne1)pipUjHurU;cc@#C!&i&xhI)KJhL% e@pExP1QWwfJCRdnPSf}qfWXt$&t;ucLK6U~WFFH1 delta 101 zcmey!+{3bAJ!7ngr;B5VMQ?I~1Z&TeET1n%Kh7Tj0++sLuYZ^R&(`cToRE89+SW-t zNlJToKtSh-M8Vs8+HKk2;|$N-FKc|GAi;W=n}K1X44?GhIVXApQFm?k# zg4g%!Vo1WA4AY3$`5?(d^EBWJ3EGOyi7*V(M3k-A{D+K*4q2j{iOT?(W|;rUj#peU hL6q&pqy?%bO8|uxe#%}s_f-G@002ovPDHLkV1j5wIR^j$ delta 206 zcmV;<05Sij1oQ;3uK|CsNklQ2dXfcx!2(^~prq^dg=7AK2000twNu}=KRMY?f002ovPDHLk FV1nk{C-DFP delta 159 zcmV;Q0AT-$1jPifuK|C7Nkl8GvL9ia{{oX7`GLfx+Pa{B0K)vAO`CixlOqGKea& zGQ7V3n_>PM4(u+#?;>pm28OE)^Ve`-ga=U|(aYdJw!j?)qhJ?c0RU@;EVmXa6)0|NuY z$1gt^p1%5oVh~;fuo?96%MS)OyH^bJ*Kjb*-*$nKCQjQ{`u07*qoM6N<$f-;RVNdN!< delta 202 zcmV;*05$)Y0pwE zk3^XukDr?;r8x~n0Vt(#90#P7L(NU`x~^Rxr)dK41{YO0=k1j$&j0`b07*qoM6N<$ Ef|(>;VgLXD diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_1.png index 122df71ec9b41995cc9329d067cee9d62a81ae3a..0720c9f64772d16daed914bb59cabdedf3efc684 100644 GIT binary patch delta 122 zcmV-=0EPeN0ha-gBy(O#L_t(I%VS^|1=I&-W@i75jEw%1rPQjQ{`u07*qoM6N<$f-;RVNdN!< delta 202 zcmV;*05$)Y0pwE zk3^XukDr?;r8x~n0Vt(#90#P7L(NU`x~^Rxr)dK41{YO0=k1j$&j0`b07*qoM6N<$ Ef|(>;VgLXD diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_bottom_2.png index 990a8c1504116eb88a97a467a22a593abeae0725..aad55af77142f91ee006e6f0004461bda4ca6bb5 100644 GIT binary patch delta 119 zcmV--0EqwC0h9rdByd|vL_t(IjqQ-36+kfv1FM*#0*^x=nF1{PZ;`J$K%w%VPjWA7 z{k+G_psHwv-5r?;5kW-UmoPI#1bgrMa8-ebdduVWV=yW(Gh}A3fSIAHbN%*#BmF}+ Z`~mtWG4LaOczFN-002ovPDHLkV1gtzG&leN delta 188 zcmV;t07L(j0oVbMB!8btL_t(|0qv484ula9g=e?W=+qKwr9xCrp>|$JZ~&D~sj?v< zBwMh_cE3bOy!qyNz%%}kfKsYTDeEcvy$X#nl`#gT6tLDFL0&6>b6zpVkaLC@<94>{ zzV4lK6(LklI}gb0@@w~*fiY%4uht0&A%GC#sn y9Hf+HO1{g)xj?;ln4Nq)LX=~Sk(LMXGd=wjZoBbaSqV1U~YkOq)um?k45qyI88GAJ0QW{`~_4cgk;aK#}ZA^%D8FHAGTC>RAp a0ssK|k1xn8N!}X(000074V~!+aU=tA|KyjdfkI?>kB<5JJE?2k$*@9}E{t zDQc}#6k|k6>EabaSjdI>F2`~7)*6g4$T?3|N(pQ2t>HX610rLrZ`;<-+&jMsJU4+4 XS+_H9BE18z00000NkvXXu0mjfW!y>} diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top_1.png index a71227df55f7aa736e468ff6c5ead1eeb145ae4d..7ce8a07caa551b739ebec32d6738c0bae41d0821 100644 GIT binary patch delta 120 zcmV-;0Ehp@0hIxeByn6xL_t(I%VS`mCy0xS`_IC{^54wN42+4^q@bVx)({#R`rpgT z>wjZoBbaSqV1U~YkOq)um?k45qyI88GAJ0QW{`~_4cgk;aK#}ZA^%D8FHAGTC>RAp a0ssK|k1xn8N!}X(000074V~!+aU=tA|KyjdfkI?>kB<5JJE?2k$*@9}E{t zDQc}#6k|k6>EabaSjdI>F2`~7)*6g4$T?3|N(pQ2t>HX610rLrZ`;<-+&jMsJU4+4 XS+_H9BE18z00000NkvXXu0mjfW!y>} diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/shortbow/bedrockium_uie_bow_top_2.png index 09662f282db8ebfd5d4e88469847f8ca73f4b03b..77202cb64f89922de3527942b6c0dc7b909e3510 100644 GIT binary patch delta 123 zcmV->0EGY10hj@hBy?X%L_t(I%VS`mH(+65`EO=s2F65bh>MH+ub`j+*AyBW`oFQU z5lkBx7~nPpq!^?bq|nRD>%X?P_J1QIqyI88GH{GjGss4eVvr`7;*gLKFecisFwG33 dU=$1q007K=FPmwzE}#Ga002ovPDHLkV1oRyGj;#~ delta 181 zcmV;m080Ou0nq`FB!8GmL_t(|0qsyR3dA4~oPdxYqzWWuAgNLWU*lsf1+DymU}a|^ zf(Uy=NOw6nuDK#x%@fJXx^D#-W3=ykJ5x$^tW6(42tiUx48zb^(==h*Hdt#> zN}*c^$8pfIEXX+{r3B|3`o2d9p$VPfy?^guo@c7HLTil}<1Wbs=e%`e%}Ncl(=~4%HhQ8(Xk-HfHRRO5}2OcK%;oS^3x8 z$cQO9H#gUSZ6hxa&jx9xO@hlJ+}zlDoSmEu4C2HOm>Bmo1sbR@Feua+oDF=uZwCVq Nc)I$ztaD0e0svz7C3^q> delta 157 zcmV;O0Al}&0l5K?B!7TOL_t(|0qu|>4g?_(1bY=8fkGfj@Pya!LSBL71v~+ZAOyo) zcEshxUQXVM9Wk9rsyma$-{<)CL5z`d&QMCdQEM$~tth1&Ujw}Nbb@nEj4{w!0<=N(G>i00000NkvXXu0mjf%F$KP delta 222 zcmV<403rXk0@wnOf`7qDL_t(|oMZg||33pIfQ2I6!_j1Cei{BZa`~(E~B`Z`2XC95R%;h Y01i($V*c@0`v3p{07*qoM6N<$f^NiY-v9sr diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_1.png index e17d6b710f9064767e1bcd2b218c50f84fd92bb0..aa451868429229afdcefc8446531d5624fb0b9a5 100644 GIT binary patch delta 186 zcmV;r07d`U0<;2$qZ zQR^BSUORR1;{PNY&^&qSf48uR+KCGnk?w+)DbxOISXk9gTD15-Sz*vUW5$24s2Iu& z(6O$0*k zn{s1`(~M#OI|~zol9Cd!`Y;Uufk%%XF)$KsHsyzT~T^kQ!)Vd_;!*Py?C@^B4sM1^?%h5PdKJ Y0C+({Ew3ft%K!iX07*qoM6N<$g29ku>Hq)$ diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_2.png index eb34e92f1c98f661d7da6c43183144b4c8fca657..0eb41d0b72c9bc48250b19df783eb1b3540c521c 100644 GIT binary patch delta 166 zcmV;X09pUT0-yqrf`5rgL_t(Ijbr%#|33pIm?F)?)qv%D_x|@zNd8Zj0qcR915-0< zvm2UgcN{rFlp!dbjX(nm+d7EWjAFnRpytr5oZ4+9Xhtz$Gthv%rdE<{M==28|NQ3G z+U?{T0P=reN?Pq6atzoF)Er+_TziB>&2R(u0u5-LK9e#7vL9;d$Tt9l$c83f`6<@L_t(|oMZg||33pIfQ2I6!_+M1vtCXa7&C^FaUr`++jkcyVNl00000NkvXXu0mjf DLy=iJ diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_3.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_bottom_3.png index 93e931a40c32ff28d12c20f43cb5df52d7da66d2..fd8ae40f99edeb056593d589c16c3522dbf5293f 100644 GIT binary patch delta 162 zcmV;T0A2sV0-OSnf`5fcL_t(I%VYTe|33pIm|@faOata^-SOW(JnBDL1}xdJUuZYry<%J193Gy`i~wGr0zUVj!!zt#%W+1}p%@LVObWu^Rxwq-q9X0LKsUluZC8 Qvj6}907*qoM6N<$g2g0EH2?qr delta 199 zcmV;&0671g0>J{1f`6(>L_t(|oMZg||33pIfQ2I6!_ffY*`Nj6~V z&Yl04En8Nnq@>8O>cD~jVGa%i4M8#B9}p`lDKU6B**66dp&7-1RY2R9EL~BTofO~X zN2F#H1AYUsyqp}vUt)El8}Q@LKZg4c9xyPGYXCD7sanwt06+m{RaFLN@?8ML%*+g= zW-Yh@peVd^=MKYv8%y#Ghr%q#j&lmSsi zrT^o~tNzDV*8JD7vaNLp4X-ux@UE59)vt{$DZ{NX5ol9PY59LObIV$DZ{J!q3#;19 z=C=PCjjjI^friDER^oO+P-gCbEn5emM!(vW+J^rr^^O0NYAx#jlN1J~UOxY0O3MFJ iH4sM)7&U-q1^@s!v)i0?`7Hf`7V6L_t(|oMZg||33pIfQ1yrsdWwi|NZ^P@Z;-O29UkWCiXHC zG$6XT>^}=DD+41F6T``a2kRuHr5L__{=)F$=@W*y((?Z}4M?i4`~Um*FNQNmkJJf@ zh%mf=`#K-`0 z`m~x#Mxw%C?X*dZX5PO4RW&skW;fMiXd-9;2%Orw8Lviy1`rEI4Hz{51ON>1L?PSL RYGD8X002ovPDHLkV1lN~Y`Opd diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top_1.png index 5ffed3dc783a8f5e8150d2d0b9662904113d059f..e657984bfe930d92d0377951788e50b778bc7609 100644 GIT binary patch delta 162 zcmV;T0A2sZ0-OSnf`5fcL_t(Ijbr%#|33pIm?Xtz{r&&T`zQRb1mfBW6aEurKm|}? z1yDmdP_uJlYHfH)MQwO#WvzQ^Ms54lX}C3(05z5YHM*vx12t6Cf;6{Ho%$by+ow(a z-wD)=(*;F9jaHE{wSGB;wXHx6El^BS82Du6{cpyhiR?feH5*{m0Gb&90KO6F6bWdr Q5dZ)H07*qoM6N<$g0n3~XaE2J delta 203 zcmV;+05t!c0>uK5f`6__L_t(|oMZg||33pIfQ1yr43$|~jOc2y8qiyi z&*+<-|KC(og`opF002ovPDHLk FV1j^0TFn3e diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top_2.png b/src/main/resources/assets/tinker/textures/items/shortbow/inverted_bow_top_2.png index 69877f364fb5432294aab2404367840214dcc32f..a4b3614194da3e7a181e2b63256c5c7200c54020 100644 GIT binary patch delta 173 zcmV;e08;wfFU}RWdND?VdUN zfA5@m|0m3wkJ|;!lcxMvH8HDo2@0w0ojn(*VebDvBuzwxfhK!c`2T(^8Ym9LQ3FN| bposwhcYEdrYPd?+00000NkvXXu0mjfW4u`Z delta 205 zcmV;;05bol0>=W7f`70{L_t(|oMZg||33pIfQ3{Ity8A{|M&MF10y3NLrq=|BS8ad zx_kbE6#xJCAFOHl@?~`j3W^Mm9zJ9c=HvN~(}1Q4lm7qy^P6GuqQ!LziV6&jK=}Ca zV}{Jk%qAvgW(H;^MuyCU1ne$onLPFXlBG-QzkTMM|J`%u|L>a*!QFG` z|8JQ#<3C;lK$<{U)7rk)J0_u4$Ih|V(AljvFgdL@Fe$ZG)7q|f^3oN!G|&AH(%=)9 zSUYw3%Ky_>to%P?<;wqap?Dq;&jMn+F7S;{{twbT@PRmLz!|6k#9#mt!s;YJR!RW? O0000qr6ciX3fZo1w^Ckm7zrcU2 z26W7t_kZcqrF9_1IXPKPKnE}|0x>I89>`?yba!D$4GY8Wf;ft_B*tUMj{W!WaAU}d t2xBBG3^py8gI6O#1BeBq28;nKGPBvH>t~?cOVf`P(iq5@P^dQKFZ@ ze=Q|3k~HIV0Vx2*05K6>k_}*FpuqVkE+EHt6ay6Hu2N=zs3I#_2EYNa2?rej087{& U&%RAq;s5{u07*qoM6N<$g2m=3%m4rY diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_1.png b/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_1.png index 4f6addc6817dfaa33e6b7403fa494beb4f6059f5..5a82507b20f45d3246ca73294f207c23623e745c 100644 GIT binary patch delta 78 zcmV-U0I~n51cU^zuK@u-ldu64K$ER`VM8$301%sO1IX4)w#`&CU|^k3w(T$j4$ae` k%z*3rb;&mXW(Ya@0Bux1N{gWi)c^nh07*qoM6N<$g6E4LKmY&$ delta 114 zcmV-&0FD2I1gHeCuK@vMldu64WD~2N30<>;nKGPBvH>t~?cOVf`P(iq5@P^dQKFZ@ ze=Q|3k~HIV0Vx2*05K6>k_}*FpuqVkE+EHt6ay6Hu2N=zs3I#_2EYNa2?rej087{& U&%RAq;s5{u07*qoM6N<$g2m=3%m4rY diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_2.png b/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_2.png index 797648eb64580f6628edb4e931535e2348948d40..1488d36545db7360a1cf8de651f3ae01b6cf3b46 100644 GIT binary patch delta 78 zcmZ3@(!#P~JtL#T4wKhbCORA3U=Wy{!+heJ&$hG8#~Hf*_-{*_!Px#RGa&82 i*T1`-NHZ9>$kZ~p&$ahj+Hau100f?{elF{r5}E)3vL9Oj delta 117 zcmV-*0E+*F1giwFuK@vPldu64XA`TQ30<>;nKGPBvH>t~?cOVf`P(iq5@P^dQKFZ@ ze=Q|3k~HIV0V#mG28fC9l57AY15)T8ICYmK|D(7-QSK_qwxbvzs>n)~0dPQU!a)ZB XLLnZQKZ(v;00000NkvXXu0mjf-mWdl diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_3.png b/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_bottom_3.png index 63536d0f55992563e69f03f3c0ea1175f531327c..a51b6bb8f7b6a43b24dd0c550d347cc0d3f5095d 100644 GIT binary patch delta 76 zcmV-S0JHy_1cC&xuK@u*ldu64K9j9^VM8$301%sO1IX4)w#|db0J8m0H3JUK)1b_N i>-%-dHvnb`sd@nP#y?71at`MJ0000;nKGPBvH>t~?cOVf`P(iq5@P^dQKFZ@ ze=Q|3k~HIV0V#mG28fC94zLRp<*rg@fT$uXWzHcs@gM^Lb$l0@LA-IP00000NkvXX Hu0mjf?R+N1 diff --git a/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_top.png b/src/main/resources/assets/tinker/textures/items/shortbow/magical_wood_bow_top.png index 350a266428e44eb477946573ed298b06eb3945ab..4e25f9de2f463bb7c17860db11a6882fd37b57f8 100644 GIT binary patch delta 91 zcmV-h0Hpt|1cC&xuK`m&Nkl*SBz%-(3BFVoX14!013P!-|` w5M)g-jYPWu**21$3Ted1E%ag zrLgM6sRIWRKFBZUPLSF<<%k3b9C4|T~56#o~e|^6$enVgy zx^vv%7^Imf7r->4YarU$AOJFeBn_ir6bvW;0ANQt{T7)I=Kufz07*qoM6N<$f;)dC Ai~s-t delta 134 zcmZo=Sb0jd}UILq9)nk4-p|<*;b_!FpX)LmplO-81x{~%iupQOq9m%95*;#*bofHhvsSgzrJ4= rw;?c%AjM?60Av6`MWbL83>p9c9?ClXS@od300000NkvXXu0mjf;)EfC delta 122 zcmeyvypUzXdd8wyPZ!4!i{9h}iHrjt9*&EqAFPil`n)|hAw_XXptmQFo|@XB(+7ZH zfkydM$B>Cr8ygQkun!YgsgnG2JxC~7K=@&*MZqgQzw2l3moaYV-&K6)-{azc8WOC{ a+zbq6(N~t6B zZaf7!XOvQ2%D&F1Yr>e!#u#a>N$>qu_HN)H0j#w$=aezVz9wV+)(Ak^AML!*`Bk)) bf5krmzdb5W90fcc00000NkvXXu0mjf=;cdD diff --git a/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head.png b/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head.png index 5230c15b366db6c82159743e26acb7701c89010f..b804ea2e87d6895b9b2c5d38d241ed42a040fdc7 100644 GIT binary patch delta 129 zcmV-{0Dk}L0iFSnBzk2@L_t(I%VS^|Qoz8#;6Dh5goOMjS+k6c%zq;zBQVz1*8UIT zlcagdlqvrk8yo+Zl$3zkM7sjyWHvUo|6X2R|DBwiz_x>2!OYD3pCrG7G=mHw$#!gE jK$73l0a-SWf}sEaoo6(M$|_8900000NkvXXu0mjfzFs@O delta 207 zcmV;=05Jca0qX&fB!99=L_t(|0qv2o4TLZZMSo5w!30zk2vJcn1S7Bn8!!|@Fal{Z zL7GHL5v56rh?BiQlrd1qSeE4>|1?cF&y!hhB$lf0`={$VwxyKd zy@%FXyjdwUf{){Xa}FT{48wryx+n#T2`IKw3hTNe#t35!nnM{10O7XK8?%aS&jez002ov JPDHLkV1hGTTBra3 diff --git a/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head_broken.png b/src/main/resources/assets/tinker/textures/items/shovel/bedrockium_uie_shovel_head_broken.png index dc4df45c54a3181a691db76c7c18b621d0da14a4..5e14e7be6bdb7e6d2748d2be1868a4a72521c61b 100644 GIT binary patch delta 131 zcmV-}0DS-40iXepBz$K{L_t(I%k7Y>4FoX^1y_ocD$ET+ESF$t>{8r7Dxc+tE_Z09 z9X@)W>v|MshM7@S9LpktyQ8YCwGa`GD33EUeQGJ5?^2?B*6 zAq0Z!?r;H?HM^oDjF_4C^JfM>e?yN0&iPIK$8kUiQP~bTQaMV}#z!NN$hxj5rC^@t u3Vyu<=Ukn=s`Q5Iy6P2rxu^f{H}C?Awl?n$DT6Qo0000rl!5;q^3l{vRYeE75-xcoR Tp1hVq00000NkvXXu0mjf{IgO! delta 202 zcmV;*05$)g0>lE4f`6?^L_t(|oMZg||33pIfQ2I6qXy8)fSM^Y{+~a4n!(E2mZ3T& zfsrHw>ZZ;9zkBDdx`5z-rpkmk49$2AsGmOT|JBQv@oL6tK-J{w|M%?LSr-%>)Kq~- zGgbp?rcVEV{pyvvKq54w7|=U^{{LT$j0}ek9HMRBSWki#Q>1%eY^M7h4}h3 z<;BGkr5VM5qQpc-9%d$B=KM#jUQ`1>AT2JQXq#aG0IDZHzKptO@&Et;07*qoM6N<$ Ef)CVW)Bpeg diff --git a/src/main/resources/assets/tinker/textures/items/shovel/inverted_shovel_head.png b/src/main/resources/assets/tinker/textures/items/shovel/inverted_shovel_head.png index 055ff8230154bbe2f6715b7b8e1a385ddd043ce8..441515a1f4dd73fc892fbdefca0a8c9c32909998 100644 GIT binary patch delta 162 zcmV;T0A2t20m}i9F@J?gL_t(IjbmUKQef`hgZ~#FKK6gXfn)zk*SzoWe_eC)T0L`% zS_fbM+64!W5O2uhBPajsnOg!i`qlcz#?|UsSk^8*c9J*)R-8Kf-@wYc*3mxzs5u^N zyFSo>Wyekt?*fn^{s~E7LqINBN{VKg(Hs6A1w#!00Q7S}&Fn~C QWB>pF07*qoM6N<$g89Kok^lez delta 208 zcmV;>05AW`0r>%tF@Lj3L_t(IjbmUKXuwE{;<6QAS5Qvu;9Rv{|OE@j6@l*_{hos-NglU!eZhKyaECY4{zUQU}a-v zAj$YGCrKkRSbFRv`I<+;UUkyJ$8~f16G_m`(NMDxz-)1+0H)@ z=z`c-%b-11}jdT{XeCprH-42 zhe29OlEFDBq$%3UjHK{mSbXf{e|-n1+NH-&{U=EyGFW=-B>9?0!C(de$;vzvZ@Tr6 P00000NkvXXu0mjfn%QO= diff --git a/src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_handle.png b/src/main/resources/assets/tinker/textures/items/shovel/magical_wood_shovel_handle.png index ad264915367fb0316c842b542b579c076c11650e..c45f6ba5f481285917784836161de3daf0849e27 100644 GIT binary patch delta 85 zcmZ3@@`riDdPZLhPZ!4!i_^&o60FLMDpity>`nY1+jppW7nk=*|C}Xm#=<`#ZPOgy pOAdt%vG><|&r2%_zhF9-fg!rmV5REASzj1{z|+;wWt~$(697>9AOQdX delta 132 zcmV-~0DJ%Z1FHnEuK|2#Nkl$Gfo%4G#@y17q4cl1`y+HtOmdWDKX>+!~8WIL}|vb`TBlc moS}^iu)r7)8%fhl6#xJ+UNcBcs%Z@X0000G5SV5V z?#^)o8$z@J=$aQc1cNcjE+AVovLR$^MmB_D6bwfI08{QiEfxO`AOHXW07*qoM6N<$ Ef(LIU$p8QV delta 163 zcmeBVImxnNJ!5^Vr;B5VMQ?I~M8*M+u17BV&HoL){mB)Vkd%;+i14_mqkHW5gS78m zjv*7LHZ~r7@E;^M)8pcq0|yQie3~P3`1SAo4~tlM9j=`@fB2w++M&}0|0kNo%v)jL z@x|!J`lTwzKw?0}2MQisiLH0o7Igi>2SioZQMQA-|ang j!N=%;=!C@yCzu%~%~5==Uv*TO0SG)@{an^LB{Ts59Lznk diff --git a/src/main/resources/assets/tinker/textures/items/shuriken/bedrockium_uie_shuriken.png b/src/main/resources/assets/tinker/textures/items/shuriken/bedrockium_uie_shuriken.png index d83d26c322c4f51d00a9f3f5ff1ef4176230b6b8..be8d160cc1f7668d168506913ded701178a30ee3 100644 GIT binary patch delta 130 zcmV-|0Db@40iOYoBztB_L_t(I%VS`m1`rn)|F5B;0mft*z{tq>-_Xzyj6rOY4FK63 z5)$&?)6)}-L56@_MY18<+S>os)YQP3mzNieNe&A~N5}tia&n|=1_3E4DX`N)nj<12 k$O}}M&1AV?6pUB^04KjG@@Gy->i_@%07*qoM6N<$f(T7G9RL6T delta 191 zcmV;w06_nr0owtPB!8kwL_t(|0qsyR3d1lAJU3H@44D$hm?3#e!2dV?fx#F&crkcz zIYB*isYA!sAjvvT$4U71DGDshQs;T*7uH(Ar0GZxa=iB#$5BElRf+Y62pq?Oec!RJ zE3WGTMd+$Wq}e^svkt?6Qi{wu=cJ~T8b^S)Bo2si_YeZMZ8$^DnGik=lhg#*(19@q tF-B;uL080Y#WYQF#8ueDB0 ztLVF*2fZV?R+G#*nkmVJitw5WX|IhC3tDOW48#-bgkk50000tFI=qS;9zGsb?bJWxtc1&lw~Xa=S1N*gayV(3u_N$oVH@s{}VTF*75Ul zGXQlpWfRbhVgLw$!oW;b6~t<~`s8Wdq@~OM=S4>n=K`2lrYu_ybao`;gr&;}YQ``C s1VEZWbU}0!Q89sG0I6WqfWcq@06LsX)KnPBT>t<807*qoM6N<$f+bFI5C8xG diff --git a/src/main/resources/assets/tinker/textures/items/shuriken/magical_wood_shuriken.png b/src/main/resources/assets/tinker/textures/items/shuriken/magical_wood_shuriken.png index bac61bdb7ee64a8bc63e7e217245542db8653f26..0ceab423eafee7665b2352e5840264b9b585749b 100644 GIT binary patch delta 86 zcmZ3+@|StTdPYA>PZ!4!i{9jf1#BK)jDGMRPLVFC-T&_YI~ns&JdBx4nQe)iVw^*r q#mrbHzZaEQreQPTWuO692P4DhM>Y+P3maV-fWXt$&t;ucLK6Vr;vm-m delta 127 zcmV-_0D%Af1EvJ9uK{;rNklu(!UH^ zN@6I6k>mm`B{8_*wR^9Kb`4wsxrV^KFn`+xMwlis5niHQz=SSv?cOVf1E=ni6&?%> hNHIc|=20+W0RT3DC`1683+n&?002ovPDHLkV1l-nFrEMa diff --git a/src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_blade.png b/src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_blade.png index 495006116a2a3b3260ce7827aeb5521f2ba4f2f2..212349332e70924456dcda4a034c9116801a5910 100644 GIT binary patch delta 147 zcmV;E0Brw*0>AsMFqhr(puSw6Ifg89M0el?)xQyz?J5@ zgZmItJ^zc&eJ(j?^xk0xi3mKU6xn8Qt%be!eY=9SR)i2R#z1TBzMY%qoB}D#_nXvH zN^&zB#2D|}Rb89eIDfS+cYg$*P#lgxYbW`f^abzPgT>x@(WcFvQ{^W1`hAiy+Dd-@}R1NME7 zG)*xK1Lk>tIfhFD2dt_J<2ZtI4y6>5!0EK5t!wk@J4qTzYfebhu`58TvZfCn@(= hq~t#1|N4~)d;qA7Jg8L*^G5&x002ovPDHLkV1lMuV&nh- diff --git a/src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_handle.png b/src/main/resources/assets/tinker/textures/items/throwingknife/bedrockium_uie_knife_handle.png index 26e2fa674b044c0197497e5d8a200296fe2f0383..e8dc4282e113b12b7ac9007b8ccfbabb46d94315 100644 GIT binary patch delta 92 zcmV-i0Hgn{0eX-mRzXQbK~y-)V_+BsqkvXGMn>kpl9JMYvNflqr2G#G3L@PAeSLkf y%^;d=XM<>xHG`ZB(oB}KLBPPkfIMeY0{{TwmKh$G=JO^10000nrgmH~_9~8`*5mwB`T+3IG5}MNUMnLSTaAQ9p

YMQ2$}gbS45+zf?gHX8=eBqM2Wj?4X*{cf;a;@ zdj7k|CDmH^`q%2%Io8?*2Gv$go<_XWbAT=|^YX3Lv3IPs4N?rL^+`#uEuAo#I0FiL z`u=++rTo`(bgs4X3#|1{O05Nj1IZ!po0{>zY~qyv<&&oZ>B(e79Vvbu1>^$&x2{tM T`SOxO00000NkvXXu0mjfR7-J1 delta 279 zcmV+y0qFkI0+0icf`9o*L_t(|oMU955U|kQfTmgV{{Q~-o1r-?oslF1$|p_z&&kfg zux;I%I`80+CZb)C-`)G4nVFg4@Sfdue}4U9@CyxVs!2{@Bxpcxd-s1P7AA&USFYB* zd-I0j``51w!lEJ!fByVMQHR?FjEoF7E?=$t`2H=!*Uz6Bgnxtu87%GWn;O!S8IhIY zG~oaL{|xWnyk_|J^$UZburLE35dZ%B7egIZ0}6Wj{@=WIjp4`lZw!3=0t|eDf(&X} znoZpWxr{^^FrlOftk5?#Cg=T0000ts@4Di N002ovPDHLkV1mmwM}YtU diff --git a/src/main/resources/assets/tinker/textures/items/throwingknife/magical_wood_knife_blade.png b/src/main/resources/assets/tinker/textures/items/throwingknife/magical_wood_knife_blade.png index bc9cfa4e5dfb663355483f306580bb565c6c2427..04a35831922c3c2473fb07001ee0a63b0480a6ac 100644 GIT binary patch delta 101 zcmV-r0Gj{Q1d0T(tpQy~Nkl0+jd6-6uqHgG=)FB7}zRObUnp~4%00000NkvXX Hu0mjf`%Wv# delta 176 zcmeBTxx%txEo1#8PZ!4!i{9h}i6VuIrytZWntrfeVt!{xZ|c(ez$22K7f&2Ga6m!# z*l_`=Z+(e}M8w*D-qt(tb)&%IiH$%ozr8u}tCk`gTbsYes{$#8%V*9XJ_yut;KRq$ z{B6tE+bz6t&cRFK0aL_bkn#3szV*k~82~}TR@vo@1_2tA6Tbg{sogSvqhy1)!tw7K b3ltd`^1teTHICB^U;qM7S3j3^P6g-1oQ*2tpP_eNklHIB~LTV0J1ex3ILkeBBU|5kB$HU002ovPDHLkV1m#9BisN0 delta 113 zcmV-%0FM9k1C|7^tpRCNNklry&_68hRuiOY5Y(0GWbuDMwsU7`*q3F3^Rai&6ENFSV|>n T9H_Z!00000NkvXXu0mjf%3m;< diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/chandelier.json b/src/main/resources/assets/utilitiesinexcess/blockstates/chandelier.json new file mode 100644 index 00000000..339bcb0b --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/chandelier.json @@ -0,0 +1,8 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/chandelier" }, + "meta=1": { "model": "utilitiesinexcess:blocks/chandelier_copper" }, + "meta=2": { "model": "utilitiesinexcess:blocks/chandelier_redstone" }, + "meta=3": { "model": "utilitiesinexcess:blocks/chandelier_soul" } + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/diamond_spike.json b/src/main/resources/assets/utilitiesinexcess/blockstates/diamond_spike.json new file mode 100644 index 00000000..c04b7bb6 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/diamond_spike.json @@ -0,0 +1,5 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/diamond_spike"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/drum.json b/src/main/resources/assets/utilitiesinexcess/blockstates/drum.json new file mode 100644 index 00000000..2c1899bf --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/drum.json @@ -0,0 +1,5 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/drum"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/giga_torch.json b/src/main/resources/assets/utilitiesinexcess/blockstates/giga_torch.json new file mode 100644 index 00000000..132a75f6 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/giga_torch.json @@ -0,0 +1,5 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/giga_torch"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/gold_spike.json b/src/main/resources/assets/utilitiesinexcess/blockstates/gold_spike.json new file mode 100644 index 00000000..4a2dd8d0 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/gold_spike.json @@ -0,0 +1,5 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/gold_spike"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/iron_spike.json b/src/main/resources/assets/utilitiesinexcess/blockstates/iron_spike.json new file mode 100644 index 00000000..d2c2d4d9 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/iron_spike.json @@ -0,0 +1,5 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/iron_spike"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/blockstates/wood_spike.json b/src/main/resources/assets/utilitiesinexcess/blockstates/wood_spike.json new file mode 100644 index 00000000..02db5b76 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/blockstates/wood_spike.json @@ -0,0 +1,5 @@ +{ + "variants": { + "meta=0": { "model": "utilitiesinexcess:blocks/wood_spike"} + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index b7abac53..e8b692fe 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -43,6 +43,9 @@ tile.compressed_gravel.6.name=Septuple Compressed Gravel tile.compressed_gravel.7.name=Octuple Compressed Gravel tile.compressed_gravel.desc=%,d Gravel +nei.title.uie.plugin=UtilitiesInExcess NEI Plugin +nei.title.uie.qed=QED Recipes + nei.infopage.uie.compressed.1=Tons of spare blocks lying around? Save yourself some space by compacting them. Compressible blocks can be repeatedly compressed up to eight times! tile.floating_block.name=Floating Block @@ -50,15 +53,15 @@ tile.floating_block.name=Floating Block nei.infopage.uie.floating_block.1=Floating blocks can be placed in midair. Helpful for building in the middle of the sky. tile.ethereal_glass.0.name=Ethereal Glass +tile.ethereal_glass.1.name=Ineffable Glass tile.ethereal_glass.2.name=Dark Ethereal Glass tile.ethereal_glass.3.name=Ethereal Glass (Inverted) +tile.ethereal_glass.4.name=Ineffable Glass (Inverted) tile.ethereal_glass.5.name=Dark Ethereal Glass (Inverted) -nei.infopage.uie.ethereal_glass.0=Ethereal Glass makes for the perfect zombie-proof door. It stops all creatures in their tracks while letting players through. Sneaking causes players to collide with this block. -nei.infopage.uie.ethereal_glass.1=Placeholder +nei.infopage.uie.ethereal_glass.0=Ethereal Glass makes for the perfect zombie-proof door. It stops all creatures in their tracks while letting players through. Sneaking causes players to collide with this block. Ineffable Glass is a variant block with connected textures. nei.infopage.uie.ethereal_glass.2=Dark Ethereal Glass works just like Ethereal Glass, stopping creatures and allowing players who aren't sneaking to pass through, but it also blocks light. How can you see through it? Stop asking so many questions! -nei.infopage.uie.ethereal_glass.3=Ethereal Glass (Inverted) has the exact opposite functionality as Ethereal Glass. Mobs can phase through, while it is solid to non-sneaking players. -nei.infopage.uie.ethereal_glass.4=Placeholder +nei.infopage.uie.ethereal_glass.3=Ethereal Glass (Inverted) has the exact opposite functionality as Ethereal Glass. Mobs can phase through, while it is solid to non-sneaking players. Ineffable Glass (Inverted) is a variant block with connected textures. nei.infopage.uie.ethereal_glass.5=Dark Ethereal Glass (Inverted) has the exact opposite functionality as Dark Ethereal Glass. Mobs can phase through, while it is solid to non-sneaking players. It still blocks all light. tile.decorative_glass.0.name=Smooth Glass @@ -67,12 +70,13 @@ tile.decorative_glass.2.name=Bricked Glass tile.decorative_glass.3.name=Creepy Glass tile.decorative_glass.4.name=Gilded Glass tile.decorative_glass.5.name=Obsidian Glass -tile.decorative_glass.6.name=Latticed Glass +tile.decorative_glass.6.name=Vortex Glass tile.decorative_glass.7.name=Glowing Glass tile.decorative_glass.8.name=Beloved Glass tile.decorative_glass.9.name=Tiled Glass tile.decorative_glass.10.name=Dark Glass tile.decorative_glass.11.name=Reinforced Dark Glass +tile.decorative_glass.12.name=Latticed Glass tile.decorative_block.0.name=Diamond-Etched Computational Matrix tile.decorative_block.1.name=Sand-Infused Endstone @@ -168,10 +172,12 @@ item.architects_wand.name=Architect's Wand tooltip.architects_wand.1=Can place up to %s blocks at once nei.infopage.uie.architects_wand.1=This wand is designed to aid the bearer in construction by placing many blocks at the same time. While looking at a block, you will see a wireframe indicating how a set of blocks will be extended by the wand. +nei.infopage.uie.architects_wand.2=When holding a building block in your off-hand, the wand will try to place it instead. +nei.infopage.uie.architects_wand.3=If, instead of holding a block, you hold a trowel, random blocks from your hotbar will be placed. -item.gluttons_axe.name=Glutton's Axe +item.gourmands_axe.name=Gourmand's Axe -nei.infopage.uie.gluttons_axe.1=This axe contains potent restorative magic that will restore the bearer's hunger while it is held. Attacking with the axe will heal whatever is hit at the cost of hunger - but this healing is deadly to the undead. +nei.infopage.uie.gourmands_axe.1=This axe contains potent restorative magic that will restore the bearer's hunger while it is held. Attacking with the axe will heal whatever is hit at the cost of hunger - but this healing is deadly to the undead. item.destruction_pickaxe.name=Destruction Pickaxe @@ -221,14 +227,60 @@ nei.infopage.uie.iron_spike.1=Iron spikes will kill enemies that walk on them, d nei.infopage.uie.gold_spike.1=Gold spikes will kill enemies that walk on them, dropping their experience and non-"player-only" loot. nei.infopage.uie.diamond_spike.1=Diamond spikes will kill enemies that walk on them, dropping experience and "player-only" loot. -item.heavenly_ring.name=Heavenly Ring -nei.infopage.uie.heavenly_ring.1=Grants the bearer the power of creative flight while in the inventory. -nei.infopage.uie.heavenly_ring.2=Grants the bearer the power of creative flight while equipped in a baubles slot. -item.heavenly_ring.type.0=No wings -item.heavenly_ring.type.1=type 1 -item.heavenly_ring.type.2=type 2 -item.heavenly_ring.type.3=type 3 -item.heavenly_ring.type.4=type 4 +item.heavenly_ring_feather.name=Heavenly Ring (Feathered) +item.heavenly_ring_dragon.name=Heavenly Ring (Draconic) +item.heavenly_ring_fairy.name=Heavenly Ring (Fairy) +item.heavenly_ring_metal.name=Heavenly Ring (Metallic) +item.heavenly_ring_magic.name=Heavenly Ring (Magical) +item.heavenly_ring.desc=Use in hand to cycle through different appearances. +nei.infopage.uie.heavenly_ring.1=Grants the bearer the power of creative flight while in the inventory. There are many different wing appearances for each type. Use the item in your hand to cycle between different appearances! +nei.infopage.uie.heavenly_ring.2=Grants the bearer the power of creative flight while equipped in a baubles slot. There are many different wing appearances for each type. Use the item in your hand to cycle between different appearances! + +item.heavenly_ring_feather.type.0=Chibi +item.heavenly_ring_feather.type.1=Angelic +item.heavenly_ring_feather.type.2=Storm +item.heavenly_ring_feather.type.3=Phoenix +item.heavenly_ring_feather.type.4=Swan +item.heavenly_ring_feather.type.5=Raven +item.heavenly_ring_feather.type.6=Falcon +item.heavenly_ring_feather.type.7=Macaw + +item.heavenly_ring_dragon.type.0=Red +item.heavenly_ring_dragon.type.1=Ebony +item.heavenly_ring_dragon.type.2=Golden +item.heavenly_ring_dragon.type.3=Leviathan +item.heavenly_ring_dragon.type.4=Green +item.heavenly_ring_dragon.type.5=Flower +item.heavenly_ring_dragon.type.6=Purple +item.heavenly_ring_dragon.type.7=Moon + +item.heavenly_ring_fairy.type.0=Rainbow +item.heavenly_ring_fairy.type.1=Pixie +item.heavenly_ring_fairy.type.2=Monarch +item.heavenly_ring_fairy.type.3=Lunamoth +item.heavenly_ring_fairy.type.4=Autumn +item.heavenly_ring_fairy.type.5=Blacklight +item.heavenly_ring_fairy.type.6=Jeweled Wasp +item.heavenly_ring_fairy.type.7=Leaf + +item.heavenly_ring_magic.type.0=Invisible +item.heavenly_ring_magic.type.1=Ice +item.heavenly_ring_magic.type.2=Fire +item.heavenly_ring_magic.type.3=Lightning +item.heavenly_ring_magic.type.4=End +item.heavenly_ring_magic.type.5=Plasma +item.heavenly_ring_magic.type.6=Crackling +item.heavenly_ring_magic.type.7=Jelly + +item.heavenly_ring_metal.type.0=Golden +item.heavenly_ring_metal.type.1=Silver +item.heavenly_ring_metal.type.2=Copper +item.heavenly_ring_metal.type.3=Glass +item.heavenly_ring_metal.type.4=Neonblade +item.heavenly_ring_metal.type.5=Nanotech +item.heavenly_ring_metal.type.6=Mayfly +item.heavenly_ring_metal.type.7=Steampunk +chat.heavenly_ring_modify=Ring appearance is now %s. item.watering_can_basic.name=Basic Watering Can item.watering_can_advanced.name=Advanced Watering Can @@ -323,7 +375,8 @@ tile.potion_generator_plusplus.name=Potion Generator nei.infopage.uie.potion_generator.1=Generates RF from potions. The more complex the potion is (the more steps involved in making it) the more RF/t it will generate. -gui.energy.tooltip=RF: %s / %s +gui.tooltip.energy-max=RF: %s / %s +gui.tooltip.energy-tick= RF/t item.golden_bag.name=Golden Bag of Holding nei.infopage.uie.golden_bag.1=A fancy bag which can carry a double chest's worth of items. Right click to open. @@ -349,6 +402,10 @@ utilitiesinexcess.config.item.watering_can_flowering=Watering Can Flowering tile.block_update_detector.name=Block Update Detector nei.infopage.uie.block_update_detector.1=This mechanism keeps tabs on neighboring blocks and will emit a redstone pulse if any of them receive a block update. +tile.advanced_block_update_detector.name=Advanced Block Update Detector +nei.infopage.uie.advanced.block_update_detector.1=Like the standard Block Update Detector, this block will emit a redstone pulse on neighboring block updates. However, it also reacts to changes to tile-entity data or metadata even without a block update. Shift right click any face of the ABUD to toggle scanning on that side. +chat.tile.advanced_block_update_detector.toggle=Side %s set to redstone output %s. + tile.drum.name=Drum tile.drum.desc=Holds %s buckets of fluid tile.drum.desc.fluid=Currently holding %s %sL @@ -357,6 +414,8 @@ tile.drum.chat.empty=Drum is empty nei.infopage.uie.drum.1=Drums are simple fluid tanks that keep their contents when broken. +gui.title.trash_can.name=Trash Can +gui.title.trash_can_fluid.name=Trash Can (Fluid) tile.trash_can_item.name=Trash Can (Item) tile.trash_can_fluid.name=Trash Can (Fluid) tile.trash_can_energy.name=Trash Can (Energy) @@ -464,6 +523,17 @@ nei.infopage.uie.temporal_gate.3=Right-click the portal in any other dimension t nei.infopage.uie.temporal_gate.4=You will appear at the most recent portal placed in the End of Time. If it no longer exists, you will appear at the bedrock below where you originally entered. If even that is gone, the platform will reappear, replacing anything in its way. nei.infopage.uie.temporal_gate.5=§4§oWas that red star in the sky always there? +tile.chandelier.0.name=Chandelier +tile.chandelier.1.name=Copper Chandelier +tile.chandelier.2.name=Redstone Chandelier +tile.chandelier.3.name=Soul Chandelier +tile.chandelier.desc=%d block radius (square) +nei.infopage.uie.chandelier.1=A torch that prevents natural mob spawning in range. Spawners are not affected. Must hang from a block. + +tile.giga_torch.name=Giga Torch +tile.giga_torch.desc=%d block radius (square) +nei.infopage.uie.giga_torch.1=A torch that prevents natural mob spawning in range. Spawners are not affected. + tile.trading_post.name=Trading Post tile.trading_post.villager_count=Found %,d Villagers tile.trading_post.search_hint=Search... @@ -510,6 +580,10 @@ nei.infopage.uie.ticon_inverted=If a Tinker's Construct tool is made using entir nei.infopage.uie.ticon_magic_wood=If a Tinker's Construct tool is made using entirely magical wooden parts, it will gain 8 additional modifiers. nei.infopage.uie.ticon_bedrockium=Tinker's Construct tools made with a bedrockium part are heavy and will slow the wielder down while held. +ue_wall.name=%s Wall +ue_fence.name=%s Fence +ue_sphere.name=%s Impossible Object + tile.void_quarry.name=Void Quarry tile.void_marker.name=Void Marker tile.utilitiesinexcess:void_quarry_upgrade.0.name=Void Quarry World Hole Upgrade diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier.json new file mode 100644 index 00000000..94389f51 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier.json @@ -0,0 +1,30 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "1": "utilitiesinexcess:models/chandelier", + "particle": "utilitiesinexcess:models/chandelier" + }, + "elements": [ + { + "from": [0.8, 0, 8], + "to": [15.2, 16, 8], + "shade": false, + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + }, + { + "from": [8, 0, 0.8], + "to": [8, 16, 15.2], + "shade": false, + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "faces": { + "east": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#1"} + } + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_copper.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_copper.json new file mode 100644 index 00000000..71f3d0fd --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_copper.json @@ -0,0 +1,7 @@ +{ + "parent": "utilitiesinexcess:blocks/chandelier", + "textures": { + "1": "utilitiesinexcess:models/chandelier_copper", + "particle": "utilitiesinexcess:models/chandelier_copper" + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_redstone.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_redstone.json new file mode 100644 index 00000000..249e1a04 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_redstone.json @@ -0,0 +1,7 @@ +{ + "parent": "utilitiesinexcess:blocks/chandelier", + "textures": { + "1": "utilitiesinexcess:models/chandelier_redstone", + "particle": "utilitiesinexcess:models/chandelier_redstone" + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_soul.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_soul.json new file mode 100644 index 00000000..139eedc0 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/chandelier_soul.json @@ -0,0 +1,7 @@ +{ + "parent": "utilitiesinexcess:blocks/chandelier", + "textures": { + "1": "utilitiesinexcess:models/chandelier_soul", + "particle": "utilitiesinexcess:models/chandelier_soul" + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/diamond_spike.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/diamond_spike.json new file mode 100644 index 00000000..389884a7 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/diamond_spike.json @@ -0,0 +1,6 @@ +{ + "parent": "utilitiesinexcess:blocks/wood_spike", + "textures": { + "0": "utilitiesinexcess:models/diamond_spike" + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/drum.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/drum.json new file mode 100644 index 00000000..a406d5a9 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/drum.json @@ -0,0 +1,186 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "1": "utilitiesinexcess:models/drum" + }, + "elements": [ + { + "name": "side", + "from": [2, 14, 3], + "to": [3, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 14, 3]}, + "faces": { + "north": {"uv": [4, 9, 4.25, 9.5], "texture": "#1"}, + "east": {"uv": [7.5, 2.5, 10.25, 3], "texture": "#1"}, + "south": {"uv": [4.25, 9, 4.5, 9.5], "texture": "#1"}, + "west": {"uv": [7.5, 3, 10.25, 3.5], "texture": "#1"}, + "up": {"uv": [5.75, 11.25, 5.5, 8.5], "texture": "#1"}, + "down": {"uv": [6, 8.5, 5.75, 11.25], "texture": "#1"} + } + }, + { + "name": "side", + "from": [2, 14, 2], + "to": [13, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 14, 2]}, + "faces": { + "north": {"uv": [7.5, 3.5, 10.25, 4], "texture": "#1"}, + "east": {"uv": [4.5, 9, 4.75, 9.5], "texture": "#1"}, + "south": {"uv": [7.5, 4, 10.25, 4.5], "texture": "#1"}, + "west": {"uv": [4.75, 9, 5, 9.5], "texture": "#1"}, + "up": {"uv": [8.75, 8.75, 6, 8.5], "texture": "#1"}, + "down": {"uv": [8.75, 8.75, 6, 9], "texture": "#1"} + } + }, + { + "name": "top", + "from": [3, 15, 3], + "to": [13, 15, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 14, 2]}, + "faces": { + "north": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "east": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "south": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "west": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "up": {"uv": [7.5, 2.5, 5, 0], "texture": "#1"}, + "down": {"uv": [7.5, 2.5, 5, 5], "texture": "#1"} + } + }, + { + "name": "side", + "from": [13, 14, 2], + "to": [14, 16, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 14, 2]}, + "faces": { + "north": {"uv": [5, 9, 5.25, 9.5], "texture": "#1"}, + "east": {"uv": [7.5, 4.5, 10.25, 5], "texture": "#1"}, + "south": {"uv": [5.25, 9, 5.5, 9.5], "texture": "#1"}, + "west": {"uv": [5, 7.5, 7.75, 8], "texture": "#1"}, + "up": {"uv": [9, 11.25, 8.75, 8.5], "texture": "#1"}, + "down": {"uv": [0.25, 9, 0, 11.75], "texture": "#1"} + } + }, + { + "name": "side", + "from": [3, 14, 13], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 14, 2]}, + "faces": { + "north": {"uv": [7.5, 5, 10.25, 5.5], "texture": "#1"}, + "east": {"uv": [6, 9.25, 6.25, 9.75], "texture": "#1"}, + "south": {"uv": [7.5, 5.5, 10.25, 6], "texture": "#1"}, + "west": {"uv": [6.25, 9.25, 6.5, 9.75], "texture": "#1"}, + "up": {"uv": [3, 9.25, 0.25, 9], "texture": "#1"}, + "down": {"uv": [8.75, 9, 6, 9.25], "texture": "#1"} + } + }, + { + "name": "middle", + "from": [3, 2, 3], + "to": [13, 14, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 2, 3]}, + "faces": { + "north": {"uv": [0, 0, 2.5, 3], "texture": "#1"}, + "east": {"uv": [2.5, 0, 5, 3], "texture": "#1"}, + "south": {"uv": [0, 3, 2.5, 6], "texture": "#1"}, + "west": {"uv": [2.5, 3, 5, 6], "texture": "#1"}, + "up": {"uv": [7.5, 7.5, 5, 5], "texture": "#1"}, + "down": {"uv": [2.5, 6, 0, 8.5], "texture": "#1"} + } + }, + { + "name": "sideW", + "from": [2, 0, 3], + "to": [3, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 3]}, + "faces": { + "north": {"uv": [6.5, 9.25, 6.75, 9.75], "texture": "#1"}, + "east": {"uv": [7.5, 6, 10.25, 6.5], "texture": "#1"}, + "south": {"uv": [6.75, 9.25, 7, 9.75], "texture": "#1"}, + "west": {"uv": [7.5, 6.5, 10.25, 7], "texture": "#1"}, + "up": {"uv": [3.25, 11.75, 3, 9], "texture": "#1"}, + "down": {"uv": [3.5, 9, 3.25, 11.75], "texture": "#1"} + } + }, + { + "name": "sideN", + "from": [2, 0, 2], + "to": [13, 2, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [7.5, 7, 10.25, 7.5], "texture": "#1"}, + "east": {"uv": [7, 9.25, 7.25, 9.75], "texture": "#1"}, + "south": {"uv": [7.75, 7.5, 10.5, 8], "texture": "#1"}, + "west": {"uv": [7.25, 9.25, 7.5, 9.75], "texture": "#1"}, + "up": {"uv": [11.75, 8.75, 9, 8.5], "texture": "#1"}, + "down": {"uv": [11.75, 8.75, 9, 9], "texture": "#1"} + } + }, + { + "name": "bottom", + "from": [3, 1, 3], + "to": [13, 1, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 1, 2]}, + "faces": { + "north": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "east": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "south": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "west": {"uv": [0, 0, 2.5, 0], "texture": "#1"}, + "up": {"uv": [5, 8.5, 2.5, 6], "texture": "#1"}, + "down": {"uv": [10, 0, 7.5, 2.5], "texture": "#1"} + } + }, + { + "name": "sideE", + "from": [13, 0, 2], + "to": [14, 2, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [7.5, 9.25, 7.75, 9.75], "texture": "#1"}, + "east": {"uv": [5, 8, 7.75, 8.5], "texture": "#1"}, + "south": {"uv": [7.75, 9.25, 8, 9.75], "texture": "#1"}, + "west": {"uv": [7.75, 8, 10.5, 8.5], "texture": "#1"}, + "up": {"uv": [3.75, 11.75, 3.5, 9], "texture": "#1"}, + "down": {"uv": [4, 9, 3.75, 11.75], "texture": "#1"} + } + }, + { + "name": "sideS", + "from": [3, 0, 13], + "to": [14, 2, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 0, 2]}, + "faces": { + "north": {"uv": [0, 8.5, 2.75, 9], "texture": "#1"}, + "east": {"uv": [8, 9.25, 8.25, 9.75], "texture": "#1"}, + "south": {"uv": [2.75, 8.5, 5.5, 9], "texture": "#1"}, + "west": {"uv": [8.25, 9.25, 8.5, 9.75], "texture": "#1"}, + "up": {"uv": [11.75, 9.25, 9, 9], "texture": "#1"}, + "down": {"uv": [3, 9.25, 0.25, 9.5], "texture": "#1"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "top", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4] + }, + 5, + { + "name": "bottom", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9, 10] + } + ] + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/giga_torch.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/giga_torch.json new file mode 100644 index 00000000..653c21d9 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/giga_torch.json @@ -0,0 +1,86 @@ +{ + "format_version": "1.21.11", + "credit": "Made with Blockbench", + "textures": { + "0": "utilitiesinexcess:models/giga_torch" + }, + "elements": [ + { + "from": [ + 6, + 0, + 6 + ], + "to": [ + 10, + 12, + 10 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 8, + 0, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 4, + 12 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 4, + 4 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 4, + 4 + ], + "texture": "#0" + } + } + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/gold_spike.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/gold_spike.json new file mode 100644 index 00000000..378b19f6 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/gold_spike.json @@ -0,0 +1,6 @@ +{ + "parent": "utilitiesinexcess:blocks/wood_spike", + "textures": { + "0": "utilitiesinexcess:models/gold_spike" + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/iron_spike.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/iron_spike.json new file mode 100644 index 00000000..17173d72 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/iron_spike.json @@ -0,0 +1,6 @@ +{ + "parent": "utilitiesinexcess:blocks/wood_spike", + "textures": { + "0": "utilitiesinexcess:models/iron_spike" + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/models/blocks/wood_spike.json b/src/main/resources/assets/utilitiesinexcess/models/blocks/wood_spike.json new file mode 100644 index 00000000..a865a138 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/models/blocks/wood_spike.json @@ -0,0 +1,166 @@ +{ + "format_version": "1.21.6", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "utilitiesinexcess:models/wood_spike" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [4, 11, 8, 11.5], "texture": "#0"}, + "east": {"uv": [4, 11.5, 8, 12], "texture": "#0"}, + "south": {"uv": [0, 11, 4, 11.5], "texture": "#0"}, + "west": {"uv": [0, 11.5, 4, 12], "texture": "#0"}, + "up": {"uv": [8, 16, 4, 12], "texture": "#0"}, + "down": {"uv": [4, 12, 0, 16], "texture": "#0"} + } + }, + { + "from": [1, 2, 1], + "to": [7, 4, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 1]}, + "faces": { + "north": {"uv": [8.5, 12.5, 10, 13], "texture": "#0"}, + "east": {"uv": [8.5, 13.5, 10, 14], "texture": "#0"}, + "south": {"uv": [8.5, 13, 10, 13.5], "texture": "#0"}, + "west": {"uv": [8.5, 14, 10, 14.5], "texture": "#0"}, + "up": {"uv": [10, 16, 8.5, 14.5], "texture": "#0"} + } + }, + { + "from": [1, 2, 9], + "to": [7, 4, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 0, 9]}, + "faces": { + "north": {"uv": [10.5, 12.5, 12, 13], "texture": "#0"}, + "east": {"uv": [10.5, 13.5, 12, 14], "texture": "#0"}, + "south": {"uv": [10.5, 13, 12, 13.5], "texture": "#0"}, + "west": {"uv": [10.5, 14, 12, 14.5], "texture": "#0"}, + "up": {"uv": [12, 16, 10.5, 14.5], "texture": "#0"} + } + }, + { + "from": [9, 2, 1], + "to": [15, 4, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 0, 1]}, + "faces": { + "north": {"uv": [12.5, 12.5, 14, 13], "texture": "#0"}, + "east": {"uv": [12.5, 13.5, 14, 14], "texture": "#0"}, + "south": {"uv": [12.5, 13, 14, 13.5], "texture": "#0"}, + "west": {"uv": [12.5, 14, 14, 14.5], "texture": "#0"}, + "up": {"uv": [14, 16, 12.5, 14.5], "texture": "#0"} + } + }, + { + "from": [9, 2, 9], + "to": [15, 4, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 0, 9]}, + "faces": { + "north": {"uv": [14.5, 12.5, 16, 13], "texture": "#0"}, + "east": {"uv": [14.5, 13.5, 16, 14], "texture": "#0"}, + "south": {"uv": [14.5, 13, 16, 13.5], "texture": "#0"}, + "west": {"uv": [14.5, 14, 16, 14.5], "texture": "#0"}, + "up": {"uv": [16, 16, 14.5, 14.5], "texture": "#0"} + } + }, + { + "from": [2, 4, 2], + "to": [6, 7, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 2, 1]}, + "faces": { + "north": {"uv": [8.75, 8, 9.75, 8.75], "texture": "#0"}, + "east": {"uv": [8.75, 9.5, 9.75, 10.25], "texture": "#0"}, + "south": {"uv": [8.75, 8.75, 9.75, 9.5], "texture": "#0"}, + "west": {"uv": [8.75, 10.25, 9.75, 11], "texture": "#0"}, + "up": {"uv": [9.75, 12, 8.75, 11], "texture": "#0"} + } + }, + { + "from": [10, 4, 2], + "to": [14, 7, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 2, 1]}, + "faces": { + "north": {"uv": [12.75, 8, 13.75, 8.75], "texture": "#0"}, + "east": {"uv": [12.75, 9.5, 13.75, 10.25], "texture": "#0"}, + "south": {"uv": [12.75, 8.75, 13.75, 9.5], "texture": "#0"}, + "west": {"uv": [12.75, 10.25, 13.75, 11], "texture": "#0"}, + "up": {"uv": [13.75, 12, 12.75, 11], "texture": "#0"} + } + }, + { + "from": [2, 4, 10], + "to": [6, 7, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 2, 9]}, + "faces": { + "north": {"uv": [10.75, 8, 11.75, 8.75], "texture": "#0"}, + "east": {"uv": [10.75, 9.5, 11.75, 10.25], "texture": "#0"}, + "south": {"uv": [10.75, 8.75, 11.75, 9.5], "texture": "#0"}, + "west": {"uv": [10.75, 10.25, 11.75, 11], "texture": "#0"}, + "up": {"uv": [11.75, 12, 10.75, 11], "texture": "#0"} + } + }, + { + "from": [10, 4, 10], + "to": [14, 7, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 2, 9]}, + "faces": { + "north": {"uv": [14.75, 8, 15.75, 8.75], "texture": "#0"}, + "east": {"uv": [14.75, 9.5, 15.75, 10.25], "texture": "#0"}, + "south": {"uv": [14.75, 8.75, 15.75, 9.5], "texture": "#0"}, + "west": {"uv": [14.75, 10.25, 15.75, 11], "texture": "#0"}, + "up": {"uv": [15.75, 12, 14.75, 11], "texture": "#0"} + } + }, + { + "from": [3, 7, 3], + "to": [5, 12, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 5, 1]}, + "faces": { + "north": {"uv": [9, 2, 9.5, 3.25], "texture": "#0"}, + "east": {"uv": [9, 4.5, 9.5, 5.75], "texture": "#0"}, + "south": {"uv": [9, 3.25, 9.5, 4.5], "texture": "#0"}, + "west": {"uv": [9, 5.75, 9.5, 7], "texture": "#0"}, + "up": {"uv": [9.5, 7.5, 9, 7], "texture": "#0"} + } + }, + { + "from": [3, 7, 11], + "to": [5, 12, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [1, 5, 9]}, + "faces": { + "north": {"uv": [11, 2, 11.5, 3.25], "texture": "#0"}, + "east": {"uv": [11, 4.5, 11.5, 5.75], "texture": "#0"}, + "south": {"uv": [11, 3.25, 11.5, 4.5], "texture": "#0"}, + "west": {"uv": [11, 5.75, 11.5, 7], "texture": "#0"}, + "up": {"uv": [11.5, 7.5, 11, 7], "texture": "#0"} + } + }, + { + "from": [11, 7, 3], + "to": [13, 12, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 1]}, + "faces": { + "north": {"uv": [13, 2, 13.5, 3.25], "texture": "#0"}, + "east": {"uv": [13, 4.5, 13.5, 5.75], "texture": "#0"}, + "south": {"uv": [13, 3.25, 13.5, 4.5], "texture": "#0"}, + "west": {"uv": [13, 5.75, 13.5, 7], "texture": "#0"}, + "up": {"uv": [13.5, 7.5, 13, 7], "texture": "#0"} + } + }, + { + "from": [11, 7, 11], + "to": [13, 12, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 5, 9]}, + "faces": { + "north": {"uv": [15, 2, 15.5, 3.25], "texture": "#0"}, + "east": {"uv": [15, 4.5, 15.5, 5.75], "texture": "#0"}, + "south": {"uv": [15, 3.25, 15.5, 4.5], "texture": "#0"}, + "west": {"uv": [15, 5.75, 15.5, 7], "texture": "#0"}, + "up": {"uv": [15.5, 7.5, 15, 7], "texture": "#0"} + } + } + ] +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_active.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_active.png new file mode 100644 index 0000000000000000000000000000000000000000..240c3096a8bf5b00047a7faca25cc8a149299a0f GIT binary patch literal 358 zcmV-s0h#`ZP)Px$AW1|)R5(wClf4auFbsv+fB|kL3K~ipBqm@1Dky0vK@>FfNY}B#t(4Pe>E#Uf zS3GPI`{mhAk}S&tD9h5U_p7Q3MN!y4z}LR~gwHfhVcWK7e?c+xJiiFE0q(b(p=laJ z+qR+a`|wCpgW||B0_12>K_rkU62O|s6;ByP0Gl=m6qaQP<2Z({>x>X^0CD6P0W#Kg zwGBzWmT@J=KaS(v14;H$^E@};tF&Pl%rAZ3>^ps9L=;uPze!izE^fMR2`H{x(_<>bgE% zWp!TT`j#9OK%fO#K$E-`d~7U1PZTmeQ?2=bJ#Xz{pA6bv)aI_rqyPW_07*qoM6N<$ Eg61@pWdHyG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_inactive.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/advanced_block_update_detector_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..5b178168441d2cf09fd2d9c38526aebe58487be2 GIT binary patch literal 370 zcmV-&0ge8NP)Px$EJ;K`R5(w4lc92iKoCUl6Rs*McOpN8z#uVH@dZRhp+I7gPzVej&A094&0TMX ztt6tEWp}#inOQDbmIY9jrA5E4swxykVef#o&b7Yqn5HRg+ZN-0P|iHhKLR=c&D;Hn zrZKc_8~VNvU)P&Kd2mbsJK9td1c(v=>`7etlwks>>5xQWS(Y%4W9Yih1OXo)4~_|7 zV_nzh!OL=5Mk>zwIF542#yywPDgh2O@gTD>!o5sL!;B1r_I z1k#J-Z=>~~uItlPR_8UYzsS)60@_dnG|5N7=f)EBiz24qRD1qizqiha5A#(}5VK1W QW&i*H07*qoM6N<$f{T=$*8l(j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/bedrockium_block.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/bedrockium_block.png index 628b1854bdac4c2f71f483d99d8cb4a54197198b..8af26031f4acda8eda24488a2bb40a0f99c6b24c 100644 GIT binary patch delta 229 zcmV}S0oNRg2(Ux9>sGvIg%rnhII#T zjYFNpC09!6L)2RBKj&;9NAMi;;4ToYHA5-ohKN@V@0tLDF@|BzX~6SZ%Ro+ZE`T=P zs-Ad^;Q~N(d=z+eV^OD;;d0u$HDpBPq=N_C!IC((8 z1M5HqbjE0Q=58kH2z&c`ynEmRP-6vt0ga>2c)UpeTp;qk3vX9B%DIWUOi?9PJ1!H~ fQdjy{ysz{Z#Y3og8`o|m00000NkvXXu0mjfB_(C5 delta 390 zcmV;10eSw70<8m(FnxigHx7e>i}Ld3LzrH`~9A( zswj#g`rl;aed>!t`i7MshvmKh$oStW2SUfW^ZCs6dYwMgw@G1Ih%cT=N{RPAzG`^i kvG2XdT03bfr9?`}AH(k3=4;ZWF#rGn07*qoM6N<$f~L#Ae*gdg diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/blackout_curtains.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/blackout_curtains.png index cd081f9bc28d264c59be0e74a326c0b2b768a694..8c73058061a6315088a7c241301d1989bf22e6ba 100644 GIT binary patch delta 258 zcmV+d0sa2@0_OsdZGYuSL_t(2k!4cL3WP8avs3XiJc%eMUPS-@yR^F5MzUi!hcd5r zlBkX2xUMVCuIuJ`-uE46-}lorZQF(z^Of|$}$S^>;WvCHj^ev?3Cjh>R6EWM`sTt$MKYJhyElvMcvC5Jf5`eg1 zVHzzOC`vR*lA$$CQ`a^1$t&-e@Yw2ki-U|}5Hp?)UY6u?gRDy#&juyMwc;D|6-j;V z@g4}EM5!eu|Bd|b!0GP=8RtoR59kkR119-&qcBYYF7QYG0Mqg)BG~u(y#N3J07*qo IM6N<$f|@~k*+7c07Cx{5Qx;qh}9e+DxhB5IsRMpI4`m+jE zl%f#^Qc5os9HXyBN-0c3BouNfCFcx(!D=NI@r!lU9U1}@4k8i^c(oOFu_4f@Dj2wX zR#oON>#=Zkk6VZ+!|OlzzC%QE&Sv(Ow7${$9RNl|J`cBwUKxN7JeV1Web9J8i-W4- bBmV&Un>cvi1P;`y00000NkvXXu0mjfrSE%p diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/blessed_earth_side.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/blessed_earth_side.png index d8dc054b7827ed5c7626cd355bbdd952a39fc102..f75356eb88dc944d77cef2ccfff42f79e11eeaac 100644 GIT binary patch delta 394 zcmV;50d@YQ1-Ju{IDY|ZNkl8^WXHhJkBbPgY+ibqk?LJEPeEt;kc^lUUd+7B7v|4vE9dULK!wV5& zoPs%SGO0?!YV{!r4Cb3QHK$_(7RY8}f-M$Z!D%~wf*_CwMGL4fnVR&dQ}O-CN82@n zBQdDI3Q2J&W`BdVk;X;^n54m!FbpG`KJ{DMHg$e5K|6tV`wy1_K4`U$=_gyC^EvrT z^2Mj(Y)7B77FOI+(Oqp(&}-DJk*1TXRjW-^{?&&}cLf3Jt(8T8PDB*0614vsrXH z9oWXlCs3_ctwfKS7>~#Cap5Z>kuZY6K8%c9uvpoxq8+PI1L<@cKA#`c)7Rnk`e0jI z%j4C+c^>v37eO`4^wz@pw=y7Lj?f0&QmWl-V0i zpq6{Bl1?WF@#*C^g=rIaE~^3OuSN0UX%6AwVf-lXs&B;FgS%7aMx~BWpC2cW9>Jr9 z6^uqBV2mco#2ncDN2m>yJ1Q#xZT)1)J!i^i(euFE&3pZL^-v7OK@44rk`~EHBZ(Lk_kK^M` zY;L}d?d`d^x%nAKM_*%q|5FTyuVZa(HoDy>F&Mmz(dd2NTYvBFen&ez{F22hE6+0- zfbYe{=`31bf0gU*?uXdgdKZ_MKjP%17ybTBEG<2a_VDm0#^Z(TzP$V_uC7KgnS6`A zy^pc8GoS37>%O}BBEuOLYTEhvFzMdj{>lQ$2M3@36=SCXfL?DpSzcd{^L%6DO|;X~ zekNO804VJe6n~RruNfKc(N6~V_miZ>3rr-SPq&cBL}2oGQs5dkPBKnl!Ys%VNf7qT zt8WrD;#E^*15IF240J)aWXThzfH9yPBUBfKOn0X3V=4bsS*f)BKflQ}?&5&h*078n4m7b+4! qv7f_pu2Gt`wL0kxsD3n(uzCb6lcp$hpxrwF0000aeVVYfSQex8KQ zW~a{vO{>zQJ`BTv%jHC~`H1oHAauQjm6a7DD-xrw8yg##mxc(ma6a>_lC;stb!SDZ*v01E0y{q zT^R@jNL>b3S65<-eRF1-R-;PQq4EJ>lICc&T9S07QYFSEX;*G4zRdOKMk^MJ;MQMU zTofXe>+bV;MNX|&m(6zjNz|}MW^6Px+0W%}C1#IsI4l`(g_KYzBz3pjZPbYoVdCM* zW^?o)C&T0Qdf{|BWuVMv70G0h$Z9g73L{&s7V3kjOc|GwOFK6gmSJHgZX8813Gnpv fv?zXQ{~P=V)XR#8m@hzG00000NkvXXu0mjfX*yvQ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector.png deleted file mode 100644 index fcfbab950ec5ec49552a3a60edf7f6c8fc539130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv=}#LT=BJwMkF1yemk zJqzi~S1W*OwxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;aB>!N_{ z%yt&AcovWi0trA2(hsB2EM;J3V3@$pzyefZU}S8-xBy}*NC)czh)Gj`Y!F}qn!^NE z8DwbzWI=Tq8W@0NS2rjM2hX$605StST^vI!{F6-#41SzPx$AW1|)R5(wCld%niFbqZ6fB{&Ef`*a?i3wPM3Q8JE5CsiA(sitGD{=akUd}=2 zuK2{n{y(-8CwZP|&>n{+qEX!8_hcFC-p>113 z*L7h}AWj?;P&%G0l2#EBVGo;lm0lVh5u=(KfRZLjZp6ZF}LV**NJ+qQ6mf?io> z;6(lv!y)H+#yucqIUy89VUYb!Q}d1EXzOttb{nAt1Xx8B2_fx?EGQ<*Kx)251UMN1 znoAFYfYf|_p6G?hKoBRC@UMv?3qHf>7W9LIEU49AE51nJ{*b5>0kRO8J`is`Xqx8n zDRW(rfPc!Cfdrn0Nlo(WeVC%B%!o>iF};tiA8$YMA2a=LS|57LmH+?%07*qoM6N<$ Eg2kAUtpET3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector_inactive.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/block_update_detector_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..b623fdfe8323412ff507b2dedce942a0e7b7b958 GIT binary patch literal 366 zcmV-!0g?WRP)Px$C`m*?R5(w4lOYm=Knz8Dgw9m86}=DwgTyey38<<$tLtBq-ko9|2SSO)^(lPbzSXmgccCMiYO97+7nq&PE>)^e2)ll zG6D>j83X~T`Tp+bTOfKNDiFj8Eqo7A0)B`h3%Vm%Ch`2CJa1yMPm4uqsVpTnwEzGB M07*qoM6N<$g7?3fdH?_b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_0.png index f0fb00712bfeddd6e748b45469e0e875c4432f9d..9a9ec499f95e74dddf0982922153b19bb3af5119 100644 GIT binary patch delta 571 zcmV-B0>u5!2H*scFn~Ca@;M%l^Bpm2 zwVHG~9huE$N+y#WFT7qaA0CefyU26(tyVb@ zN&SAGE8`4bG#aJr^~&)uj3mP0Fjqss|5hrMI57|ikc`>y_ew_quvjc4GMNmu+ij}V zYV>};c|Lp*Ab){=zaO1WCr*?dfh&{AM8amX@db<@k4G8|2Fypd+f`bHAqiwoCKFn% zRvZsSgxzkZX0u6+MuRK*d_ICQI8Ucjy5H~21!RK)=rj}x@!e=N{*j3Jq{(1Ny4h?L z|8lvcN~OYN&t@|!6bigM3?OHcZGt!ipqd0gGXDGhet%_eFou8>i9~|im8{FT%jGg} zqGTTbK)M9wJxF^_%n{9GtL;M8Mi2F6}2gn2qW5* z&@1&)t!iPL5F(I>(X7m(bWBIcf6->{;)Ba~9^fnvM>sq@bO(b0uIsX~vB7*kr`>Kd zolaR=TH^Qjmu|O9zu#v(9wUk(k|dE%r}6oGh;O*dOd2j8p&jmMx#L_5BJ_GaR#sMcd3nLBs_Mns+8SS9Ul@i# zqtWL9}f=?h@yz9s${cSLZJ{(PftjaM7dlh8jYf=Dkmo=RI62FS;ldk|5o1H z+haDH;kquxVv$;{#_H-SvMjT{zRu3h4uwJifPdL+2EcGQq}%Nx{`vEVKp;S`*ZbF? z*=$m&RM2%D%d&_@qa+duEX%?)O~Tx6G p79`cT5prV2iGl~&2cu+wwpcudiMifyo z{(v9bQuUbS9fqAyUEN*Pt9d*gv0ANSu~?)~C`dM&6|dJTPN$RmbUMv5Fb0D`%x1IL z?RLpzGQ?}aV33>p{VvbvQ^w=5l*?tFN28H^J|CIQW-_18iGM2=i*i1nrPu3`SVQL1 z=_KuTo0nM8Xp{u2)k?n`4u_IRB&1X-k!Z8oh~Mx3Bf!Oezn4y@BlUWnKm_&seP+fU zcgbW@E|&}OSZGO$$K%Wf!2eaLR2UeEL_}eByPaMU2pkTFX!(3z&-{A5*dM+CD5CH8 zE63xJfvO^CWq-5TM02@ZJV5co;UI&-fO>ShUA_OA*nZS_%wH*Xy-@zgR4!R;y9$>2yk~5laHq zlPVL!0f20Z0Ks?(6VCVqfQIXOC z?f?u@5Wr&9E~?jH1yof(2mQ}~s k*qA)rK^uLv?(_NN2Z*@|&M(V}_W%F@07*qoM6N<$f@Z1%k^lez delta 795 zcmV+$1LXY31iuE5F@O0!1Fp2u`LMHEF8MIn>PAW0HpI2>kUV}nwugdhksn}1DYS*BPl;<_&Re4bXT zMJN=aR;v*Tg*ZMw#&unuo}Lg#qY>qD8QZp5TU!HQG#UY*X&P^DZvaS=#AGrd5{Ynk zcgOzzK7t@106aWAkjZ3NtyXxRhbW5F>vg`qzKBMn0NA#TAP5u+1pr=NUg-6Di2v$e zU0v~ihQlG2Wq)yhe~&1NTwGi*9*=Pxhg2#>x7#HejUsBAMzvZcnM`tcc*t}*MO9U9 zZfe*qcAH+WM>HB`JRY;Xy-lOhU@aDl{mtcabUGa@%c9%u((QJML?SE} z3s$QYwrvvx0g*@q-}ljV9ox1U3At(jA@!wDt{H`^Ep8fpePD^dwZnQX&lF) z*=!OHhtYMNPN##SC`gjTS|XA7dwzaSGMOZw&m&0^v)PPtxy*98L{(K1i3GZ?<9Qyt zyStdCiRXC?heJewdcBS;%gpCFW0;<(2%jFV9QLt?r!!S5GIRW7D@exrF1SCn~_4O4| z6fq2gLZN`Fs?_Us6h)z0trCmHFbspUvoqe`-_bOU)oS%S<)fn`etv!kf`EsI2OP)Y z&!0bNnno^{||wSCC3VdLgMjw#O-!VE|-%`CL`f+Sp0s!p3~{H-idKI z9O81h#Ow8{pLi=4i;2(YlXAH%l}betiG(I|=UlB;C6!945r4;9p-_;|&rb!msGQH| zWjGwlcsy1k;P>}ew%e`ko6TlgpxtgutJRWhHY<@x)*htc71uo(e>SqMQtRDL`jaz3B+OBDn3dcEZ5 z=SLF_BMKv|6@Lf>^wMZF+<#WrA&*(q5>!bL^M5OCis58%Wk)`{pjG>cI{1-eFc(|5Pqm48~TW-HHIv)NQY0CW%D-rjT^ z^h_{`W)cVr3l__OKA%rrDzoDDChqrpHI{{i0)&y>Za1xH05}5>kH`O}08*(`(qMF8 z?$9(kFdY&A1%MILF1o?qqW@$vY5ySf#TR2#{CUK1r&Y%O{{F6}V`K-MPN%R?oaqZ> k9!;N^5gQvH>eD*@e=x|(us}Hb&j0`b07*qoM6N<$f`GOOApigX delta 748 zcmVg5EO_Q=LDT;#idW{P3 z@$o^Y(?LqfcDqFg!E81oiXtq_0>JluR8{5d>ytM!=bco8%0t0zbwnb^E`at zM+m`aG$M{;f`1?YU^1BiAaq?P3_}Kk0VgLXBuRp<>)hVn^8Eaa=Xs3BW0uP$K@ebB z7I7S7+csesqSfp5f3;c-RaNmkkJW0$YPG^NO|mRQN{R3Llx2x&niNHWVHi9qO?(gqO(-eSOt;S$5pxth>SS)yXd7)aZVt*J0@9*z__(Gsrmi2Fcf1its z3l0wt5kin83D?)x6h(oq>ogh-48vfv+0gIzab1`Bd`?jm2!JpQd3$>!O;b$MWV_vR zcXvme*7-;h*QMbk8%o}SP&4aadfKR-v;b!M{}wOWnobc$`;IF7^B)fMyk zob7gtloC}4LA%{%I2>|%dPkOQe)2{eE9In@x0G-@Q->vCF6^ z3T0Vh+culc22ImQk^}%%RZ&gTWVu|jTCH}jUteEDQADfNqFSw@>pDRYP!t7@O^*ILPBG83I>G%CShPy&H~lu9MZ=kpSa#Uv7m=yxuc(=$09k4JnypM*jo zy(iyECX*5lhoxGrO08CtbULlYocXTT>ypi8HOS+wTrNv0m48xT$2yP4W0_8;8YDcQ zPucJH?%iUs&<4F;Pdc5B6bc1NBohAsKt7+(GMP+dI2>vsMYGvVHk*xpa|fII{jLDi zFp>jJqyK;O`+Y5h9q%wYolY(z00^g8Eb2UT{(L@iyWRAcE(Y}b{p5PRYN0WrF~T~y zz@gP@$>nm9`G0)w>H&xa=kQdQ?yPJ4C z9yM4N777q7d%a%T(E#`c0O!;Nkf1{{IzStmrUUL!04M-h%(&6`C(m=DD1X9QOArL?_j?@2q1)|} z=Q(+vBa5P7Fc@%kb%pD?04$eFrqe0={hln#0FY7=$1y<=P}eoa7>qHv0GrK*UayC> zma;4nLXad0d7cvl0RV9vbl1Fecs>SF~%SPs;Z*ZYOz=> z&{_j(Q375Hk*`X$?feeQ52CR33Xln5oB4$dc8(#jqm%EWyxZ(!1Fx9Fa+TH`x~Vc z^ZA@st3|)xM{A9HI-SV#{A}Uv?Ts)Dsp}f8H7_qOBuRo&ia3r5!;r~j0zgp|NXKz- zU6+rK4}XLZgki{dJjV09^A?uNB}ys6Fy!g!i6lul9*@*@jVq<3+wJoB_{eB9LTk-x zwL0s(zrSZTo1OPjRn_?(4hQ7rI5#&pw%u;yc^-M5Q&kmG%JYu^)>@QO97qlagb*B$M*v*c#r1ukpPwJnG^MU< zthMZRJMuiI)9KJ?G`P69IQL-~((Cnb90$+y_z&#AXOJ2396kU5002ovPDHLkV1fv_ BUe5pk diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_4.png index 233796939710c4b8ce5ce248dfed895dc1197c14..0ba921d6f3e408a65c81e007d40b03b774ac2a2d 100644 GIT binary patch delta 495 zcmV&Gw%jI%LEEbE&&t|i_^BxL?EF2D7G#XW${2-Z3 z8dj^-tX{8Mu~@WJDy2JqqtUQZsU#zhw`#SjVt@mX2~;W-oqrff{eItCt=2CFU?!8X zLZP5y@)L=~UjUFhosO+mD_blUDqgSGw%Kg#a5%^(HW&=-e!mNV8b%7z>GThsB)8dY zrb2*wy`DXvPdlH_iqR1Oa1nrpG2`d+vD@vYb26FyfWF_aU9VRa(-8phL-zqhaDmm! zhEMY2@emiI(MUjW#Ml6+ z1AgFu0_ODO_xo+f<54k;*5~uNcwn_`>IVP^fOwk_H=R!PH3y*BN%ed>4_F0bARn^=6=0i z8o>eZUFO;X>mvX$oJf_~APJu@5qJF~VaCOm66pXDc><%jxR?>6RhKU-`njx delta 669 zcmV;O0%HA@1i=N6Fnbgcd=Sb6( z5CZ4(nYykCA&}=er_+gH7Z)fH7$ zQB@UMYoaLP`}-RJDJ8P+d(t$eC<-1QAGy7~C5~gBo`0T*q6i@btJR9lW`i+?>+5TZ zqCiRsfQq8%uMh%Y+E7&$bzRf8Ek#iPa5x-Dl7!FCPwKj6KA-=4Mc?;0=eP{n@Angt zAp~AuU-|m_B1sYshXZMvvRp0!@ZO`WwSSE4hY*6Qsu+d=Yc1RD zmi>ND2!8?ZJyIz}mSrp!3-0gl@!nIG<@Cv1-lA*Ey( z2Ap#Y!$8+{6TZe6hGCcx)>?BupE;dQ=%#5f#-O#PZCm=jpPDWvx;WE&PuF$RtCdoS z<#IVX=djjJS9tGHN|7W9-uwRr`!6Si;Cw!#wHD?d`7udX(tgC>00000NkvXXu0mjf D;kZDr diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_5.png index d39a6e0f6aabb88af0a457ab4d9a17f906548d58..454bbea38d6c00c26f48b63961b84ece834c7deb 100644 GIT binary patch delta 468 zcmV;_0W1EZ1^NS!Fn-|Nk?2 zd<7YNhcM}Mr8=o(LbY18a=9$)bUM~XZK2=RPAx7X`skH(pU+1x@LjLhInnp~wKPqYOhpi&57h^zzyVcx;e0;Ze!mwO5;xA*>(wro zi;c%)_0L2^z<;><{k~qDPNy<_z|ZGXTC7$p5up(x`)DO18jwJr4yKLU?WPz;>D%pA zRWe#gaso7f#LGmu&1R$5oPcB()$vpw7zJ&>>HzN>0T~_f-#e;>KzmRu7Bv#a2pE7* z0zs+bmy|fkX!dUt5$=A!i-d)OgudVJw_0!ld|z`-flcxGf56v&C`7{NCE~vStT0%7 zs#gUpkpq7Bof0uL^7Vz74a77Bf-nKXCxJ7U{wrgM?J+9EC;kV&#atH6wqtDo0000< KMNUMnLSTY=Ox+*= delta 637 zcmV-@0)qYe1EK|xFn z5CYzN#9B*T*PKo#j4|Bmdc9KDHQ(RgXsvmDePtL1x~`)rifIZl#^AlDC zqiGsmUS3$Q*H~-WZns!#QA)8~E?KYFhzP6Iil%AMT7LteZ};u{p5yU28T9%2N!N9g zsi)Hk=N$X}p1$vy&1N{~(Bn8xfB+m02b^;gfgc|q9FIqwbNu}L;GAQzSO5@0z!XLC zpNJ4+oDh9}erB~=F^(fjDcZIrrG$vE*=#r*4#XI5e>8Pnb9Z;g)6)|%M%uO|#z;{V zJU%|M+ji}yRc^USDG_5ttyZgCRTWApa?W_~$vIEwGR7bxq?G=LM})rbxm+%P9NdH< zgo%9-nL?CvrYuWB2-D~QT5Hr|vB<+PAR=h3r#Ne^Da&#a55s^lhO#VCO40W{#u)wq X3~NwsIR*$k00000NkvXXu0mjf0h}$A diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_6.png index 4ef5215c4fe2fafbb8e4630fce61bbdd73fe542d..13991115cf7a425fd25da31bfff4408f0f95441d 100644 GIT binary patch delta 417 zcmV;S0bc%|1jqxBF@J(dL_t(IjZKqVtHLl4gi{-B>jfVQh1UQ7&%_5o5N{|}YrZ*5 zPXlS1&CKj(H=E7p^C6AEh%pBKzu&L+v)N25d+f|C%Vf**T>p^|GYM(^d_JQXM1Z!j zij>ayXGTCpQ3MNd_PdMSd47pp^Vnnps$<1yTBH;L?ayKukX!}IwZ z6AMNHCi}jR$3q9?00LLp@AulfN|1>_$>xKRL%g`8fVSIhsH#eKqH#qK_J~$=vbYA| zwr%Bw`;$03NPjt#6N^OGm&90%Jvo2`fnoCLbQ<3YBTIyV#4MLfk*6fQQ?Au&r9BnF zGm*05G#W^_kP)iuT4LAhRUn9nGO;^X%AKFF=lOgd!*zv-5D^9roOty{O5Om-C4%IJ za>F2C8+(_L=(0rAOZ0=9cAUG?$+f`LuBQwU0XNLllN!NO+q5%(%OpXieg~*M00000 LNkvXXu0mjf)62^8 delta 503 zcmV8z*y#{ZDG#<}rB*y6O4uF~A?zGkb2q6H_TEpFOcSHmLRYgQF5kW+VF(M+=S_fEb z4OJbrTI+qtj9M$TR;;x~&Y2EmW|UHxrs=;XGeiV;M^y*A)_)oSpp-(45i>(oQB~ZX z5CS=8VvGama=8F-yWQ@LQcB(%RF!2}0EjV?b7oyvM1;4uH%cjdetuF);XF@TYgh+ct8}yuZJ*?>onF3}IFE4$z1De}8{}X{|9$6UTAj?tFZFFiq2N zNmV(|^DZ`kyMJS5?E6l)R8@I;dg9^XfqmcEwrx0a90&baN9qVrHb20LJjw*Vot+08v#BAu!J~s`|en5#e^b@%Z=% zz`Cv+$3cvd<2Wd#+!=@n=Xqjg%=66i^E0Z-&(9B~6mZscC8b142~{0hx%+*UV~pc| ze}50U-JuWy>$(Ck&ofK^=0D3ML8ZHYg}nd(002ovPDHLkV1k^E@QVNd diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_cobblestone_7.png index e1be94bc0fbd3e0d9704a490d5d7d99b3481ca2b..2dec85a4b17479f8a834e3eb1663e8bda9002e39 100644 GIT binary patch delta 318 zcmV-E0m1&31LgvdF@GRQL_t(IPi2x<3dArBMALh3kozCh%M*-nydO%`W~`PKMG+)b zRfV!F-A0e?JkLKd@-rpXbsd_faT08F`Q(pd5M_J>mJsawK6G8@zP4@6Pp$+qBS0Zp zLJ$IE7zX?6k#QUyOiR{+O5zUynWiah+vY^~eTVZrO@~Oc$$!)zU_jS(h39!p7t#B^ z28Ixy+VmNSgz`vQ*VX=jCD_Mt_-woa5x|=EzVEx0u9qPK9IxBA07x&9OdGri0fIiy zvsKAP{wlx;iOPg*Sr#V%4Ef(0bzLG5SVA=bwGrig2y~XrA>ITasz^y8f#5R(hNBgs z)2jw25F*{zs5e7Wf{seJp)=N&;9kr9Kf!l$`Aej->ekL7wkh9WOp}`m6&i0 zGeFF2_yIDD2XmYqW=aVn5^Sz{~)E_xp{t)q( zKK8MWL2~%2dMuM4m)Y+=OvKF5!tV6Fg}e6t4g|ks{9EaJmA{k!0DSxr1jmKmfdBvi M07*qoM6N<$g2Ym&`v3p{ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_0.png index 338ae59d8b6a5a17ec3657c00b79d356fbb66459..66b32bf7d29fc98550772a35822a69c96ddced3f 100644 GIT binary patch delta 284 zcmV+%0ptGd1j7Q5Fn<93NklWrGzrBAX$o{+K_ON3`gZ3V@+-amzC~!RF zY+(CIMOsy3WUCZQqay{5Ic_4yI0o|16tCWb1CPt$M>x}HZ)i0Iz5^$czd=d20E|81 iuIu98K5Oo!!4((t5$!NjxV{(w0000~k+zR!AohmdjB|eFhI7P)>M8|T%Y|hL%XD^ACB8Zijy56AR} zV@g^E$L*2KstflbOR^;6ad=YdmV@xeB!wSPGRjk!rGGB*#vLUT8gLs5l5wKqkFr&D z%i(Cx1mNwb&y+fuh%52#4RbqNYbQxX0pN}hF$j3PwZ>_~VP!eZP%}vm+K53w0tL%% zv!P}A^YaT|o7dBAjN`AY=B6faR%(XMhqG^!L6Xh@_RTFVw--&IB(rAd5vdYh*B_C{ zstdH-UP1IJ^>0Me^=P?0>ei(HazAD#6hL|P>|rSU;NA+Si;oyzT_D>m*E(){{)qo! Wq$$Yk*V0000Wi|;Xyc&z&#J>9y!cI^8lDBrJAT{*p1yiiduj{1b=XtiM}8jsm}`F!$aDM zP*odU!%Rfg00!}tKdI@Ojey<|Xo4b9G(Eo+paxo*e?s<$8LJxjd*HeIv64!qpyN@_ zEKI*rfmY2J6{?Db(J2KTv)x1;W3R|RL%ewl3_P!=nQ)}xZ)h_GeFscb{yLr67<*4R h#%O>4taT3!eiS@&)H5o1@O=OP002ovPDHLkV1nRpgRTGo delta 576 zcmV-G0>Ayj0_6mdFnfgc5Qd+mPSPfElH!n%I4XjwxTypJMWRwF z=z&uYx%3zHukZsnaY0BNxNxfirz);g6|hsKwM*@losUAp!CK2n=dv@qJ0I^mGpWP9 z_S_350El1;K&w_}`OXU`l=G|cyLIW&s+Cz$SF=ZNo^Nn@?SHe`Sf^IW^Y~GP^3Fat zzXxnK);ZYSLa&x6WEBo}x5z4KJP~5r*Q5^j+Vjd<27saK)9bc59@t3f82W-ebbSDN z-8Sz(|3LAA37OUl-d24WfaUlMU7w~_qGRY-j!#`v8M%VGrp7@nCkm7XD7YtBj!(zX z>64>NcwMw3jq0_9Em|UGx%;yNkGcH`g9dK$n6xMS1;gn!JBN)%9Ybv%Y zP}D;1USvs@WIPE^O5d~*!3;$NQ|d-@0khO4-lU_1!hZm6=K>{3RPs@_s&Cr#x@`bH zemkM=s4-XK(+5_zH>yWUD)PGn{BX+l#zT$=HpP67v9`lXc!eKMNt5E#a%gBJ{`@jI zy|`X%V-kO>T3VREW$73?U%sD5gCv~+ted}#ToF&8B(r1aF{u)s7feX2g&ZSS#Gf+% z#tdDbkvS{qn^FJeek@NYKA14B2M6)=Aq7C;SIppD16wIoVGD O0000F+eL&2t3cbcx_kl^SYTXDQ$8PfH=G|nsuEL-`&9yRDX<(C?-EF5&#Sc5};U# zC1BTe$wvzYzz3r|NmNxV`qDYnhUjO2^nIW8uhzWI0o1_W7+@&DGx2Onzugo7nt>mZ z{-RtKBiRf}N`0^J0VFnIgRU!)6JvG zxqR1Unka6r2K>5I1PuEjJ>Mge%8-WrkVq=JfeS!4 zaOwFTH&+AHvZyWsuyaWy6~lhWXdH2Q76OMWVGGNUqlXc0;1bK!kf({FD_s+0EK}N!O`)FP%{t0J9{e zDMXdQ8*kr`w?nJFZy&6cjwUfe>>=vHwrB2MS~wa<+<#mR0QmOf)>sk2Tb8rmSS`mk zV;f0j+F7^o;OvvZd%kDXY5A9IRnj;=4mO3>eEsra$A1`jI}`YN#cD}juB$;h@?GQe z-=ij$>COaBlSzVB_cUX$hpXD0zunUdxOuG2Ia!1TFwwO!LjfKoqk z(mmv1kuf909!(+Gctv=6u_Fk;V0|Q2MT!+Vye@`;`fHj4}Ccu{EF9 zi2+)HLf~;ePM5F#eqK$Nlr}jCKpb8f&8|y{uc5aD6=Nfc$$t-v1ONkq1SnQw2{;Tx z^3j3;@WCig5>*w8zH|v$3Fy@lF+a;w41h|sfwnl+Ir-)|Npr2 zH0{7HMH-t(tt7;babO1%1N9}zdoT9)mj_P|_Xpit0JL$>Bp&m+rj2Dh6231hO%jg@ zWTg?qfLgVPVSpG0Si6VG%-7!DPPls$`FCsg*skNxre^T;aDRWO8$oM;B0ws`0h$>KE5>ge(=~(G@q* z2$95N>c${Tw}0dH{0s8=2WcFUXQ@Y$XDK;Ok7OFcTB2Kv=w0ZCi}E+&G(?ul4;NKK zQiWbfhd^MvJwfm7a#c8PMx zb+T}|+OT+>1MvOlv!^1a_vn|kqtM6IWk6koXOeyP^?x*uJUUzcLmSIrK8p{w>-hHd zBeFb&CXK_31ioHUwHVvEASE}U=egNhWT`F^SX9lC(kY>h-l1E|;M4otgYEWcv*W|v zl%iBKpdO?I2qWXYGMtJ%HI1m#*ChjKK|#oh$FZQI~`wx#*J z&K;l$C|q1d!AStRB({lB9K{pbtg6Z!uUj*Gy6bR1pG^P0AAe>ey5m$A0l?a>PnJNk z0%O3g>+B?!E)0MV22NjzB#FSJGYUnGM9%@2ecy)!IznQdV&u@hbs%=*nSD3jPcb+! z0C9jbCQB{HpxQ>@KzsGG`q{nECEd1WqOYZ9zfOy-$8UDCq$}Pt!l)JkRZnpS8E) Z;0LNgS8M}AZg2nq002ovPDHLkV1hpdnW_K) delta 564 zcmV-40?YmG0@(zRFn&7_@1h3DA!LeL=bG$Q_Fc65& zSc*L6*lJ=w06+!;8?I>gkHmgJo=8+@(Zihq2;0?@ssSjQY{%`~z^ zzS!&D0#K}De(Vm2!8(S^m^Yy%l>uoI;p{*bM{J6mvemr5UQyMGG>NEcMWqd@8z1rj zmZm|OflZNfzuj|tvj*U9R|0Uq-2?DM4uCQP$97aDtaEg|MTS0QtI6UBfJ39^c{=;M z{Z0@^bX`yA3x6EEWN>?(65M>kY`+4qDe_s#`TDU^=&q+x2Cp-AhP5ejWb>0WiRQ~? zt2s1^velH&vb(NF24Z9&ywTf3Jzl74H4{HHimFyKlk?cI)mZ071~L#F&ypu-Q|;%8 zn-w|hQ+d5K374bm56&;9Up{5!g!jYapCERihSfbK22>p3=xERhuJn6lQa zE+r?RJT2>uMRpOMtaJahuopx)qnK=-+WLGy432-KVM&W!WQ3Cd0000P;4uU`og^9tRI8k81XhOoms5>?;WakOI|8)`R-j~KCg2J zXaNcr=UH$PfG){xViZU5f;QW>HOJ!;r`OO=*HdNs`*|}P(SIGMx<~-lcC0LcWCiAc z!!X!MEL|7?9}Jwn5=jz)NoN#_8i}3*F2`|933PpGLd+R{#<}>?lyq{ulU;yF( zXHJ${&Ox<}#DVteXZ5ptp-Z}5i~s& W=t$wWB8u?<0000lK6F@OF^L_t(Ijb)R|Zrd;rMUNgN9nqHDKn@BmT6EX{|C;WK7KMvC zMq^3VgQ7@vp-6U8Zsx@S?%bIh?6sPl^8h$M0U$-h`<(NhC=A#7U>#CK1c{8NJWHrs zgA_3UN<=uhqrIGwA|}(4esCD;R=;iyt+51qttKU60>Idj!+$=ZY6g~>C)b`ux!HzA>rhaGF};9PW<`OqC`yk zs)v`lo3~)B!`P8jOM=N`?1&jg>ZT{vlEXfsYzB6TVgkxLZ3MfGn4F*flW-sulQk@B gUSxeAI~VWy2V7Q1$C0DB{r~^~07*qoM6N<$f_cmh?*IS* diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_dirt_6.png index 21163d1c8a69fd32ce42116312f59c31937cee8e..d9a0eaa0259937a80fdc67dcc0460f542222a7e7 100644 GIT binary patch delta 338 zcmV-Y0j>VN1o{GyF@H2kL_t(IPi>RSuEH=3M2nzTghxwwL;^Ob64LF4J^%k*+Yun;t^}3nd-p&kYKs;qFrIl^^ep-6AC5|9z(p&LQ7w?9 zB5;n*x4<3I5KHYQ`eW2(0jR;AgKlW?7IamQ&B!STG%ynQEBWUXv`F0hbe7_BJ#40Lwr!3jwEN(EtDd07*qoM6N<$f_2TJ_5c6? delta 536 zcmV+z0_Xku0=@*0F@N|;L_t(Ijb)SDa^oNjhCgf|rX-W3o7rw}y6^vHy=W)XNgdll zz+RAe+AcSUgGTxfGP~ev$rXTH+wN?~&%0a-eb=q;Nej+)n8Ee+xE&a0!C4D{w;kC< z=F1spExX`YQbx3_@i+^UC}tO2_10nlQRQ(L_?!~=wGHmuS$|Xkc-#eE&m*?vN*M9;D5A_YwTPPK*^OZX<5mNgU2oJgwQI!eT5ozs|xm3BQh8fNyW(EaX}n2i|s!vtSIcvAmx@0aol^6B|dB%LF;6rb07M zlkK#REB+8X*I792Bd2}jIt!wiMGJk{k!x)b+&W`C5#X&-s}7y;NE|E%~Q2G2Mx z&Dzt2TuQUDw;eHT(3@FWNByex&sA$9{rxgE2yyVFl&KYFtw_o&nz6R0R#=kW+^1{u zl5&&r4nb7e28XFFmXsN%g>7&=?gE!75eH8NE?;KDL~m=Z^}i7|)>Bou%X}Z}ujgC} a{{RsMMiI`a`V|lW0000i>UUWu^>SOb;9O z&Fn0=$q(B&oGF*#L^<*eC)dSwIw+5M+(I$#lc&JWIXB-c2l}jz7@E4NCZ!^9A|X{f z)dFiHM|rs10p>izFM3D93T(uOFu`*#$r0b!RQ3V)s@@LBTqenbj%_@FP# z(i(-z137@9n{1Ip&7h+}s$7vo%K?Jxy0(Jv`lMK02v7s`L?CuC0&YJVL4F|s2W%h? zQsqHKf-GA;HRw3dUJ+EGo!tsh0&O<}8tgld-OPfo`Jsz!JhX0&8UaOW0v)TfBgDEf z)bJ(RHHu-q2|~_$B$f2;FX*Y>!r0KTsd?h$$^3_I3rdo1ee&x=NpB5~zOeV6=l{31 bHaPeJ-x(&ge!NYJ00000NkvXXu0mjf)KHhl delta 499 zcmV6Z7=%%?^mgR%7g)%y&##i zyGRHFvUQHnv73{0(++?!P6?iW-^>i}{r=z7kl=BX_(-DE0Eoe%lG!d_NC?bH zs7{Dls}ul_;L7 zN=^d6^#=P|8i(84_W1@tYlehC2fPH2gg|RXQzIN-D5Y{p!t3+G>+=G@`Iz@uWT;`< z@l9=SR-PhKKYvIm0`UI5vew46G}b!y9YG9k6!VN=Ee#P*DeMLAH2$120HxGjjdg1n zee@s(H=5!A0w13%z|Q?=VxA(<=>=5#P+^#7$aX&FoqtM^YiXR1ne#DoEsd&5Rl}zl zqvJh}db4d+WvwIO{d=I8PR~34LlUkxG*&K{*|2g9o@|`r!z?#M>-K>DYxU9ek4qU8 z@+7oo&|%X~Yc?DhJani{AMU#)*QP_pJB7Q6Tpw|5##$;l38y)6DUCb{9k~3M4R?^x pjsD*VyAbJGxyyVX>z{Ws<1d9xFUiSMDg*!k002ovPDHLkV1j{u?Rx+K diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_0.png index 1ee0e07213f6202b73cef4854497c4d4ae6c7e6a..3385e6e263f39a227f389f5add4beb1041b8aec9 100644 GIT binary patch delta 488 zcmVS$^ zKob*CBcAYp#>6i?sp#)qJKGGQ9Hy^t-<#Rl-PTx(uE@-ENNmfJEptOwqfv>3=XFh| zEip|~F%_EBbKU_$!3i-yP9?YH<@rh4H%+lq2{}D>|>!UKWPOhBj8ky`Cs1>owUQCG5U zB|U+IT*j9Hz(ta))vA`oIPTrHn!48#a_(U^os^R!M}w@Nf*?}>;5`7zjpfL^3NRyZ zu$T2YqA=gv&3`Lh1LI@v6sCf@xw~!+EL*!?#=rirVn1uED-a25H|~{y2S#{S^)ir* zI-N>MN4&kcuCapKJP-+OA_PEA#JzD6sFlqkM)xX!uZ{;;*#~xe*fREv_Z}Yv127ic zCjS2P<>%{L570nZrs%NkVS$?4)VbMdG0a#@-rrtbqG9c`i7(D6mwdMA5bwo&#%rQ& zrF^qx?J7|51dx>zf;+lUfu)7820&=JwepY?fG7n}9+PMjH)3Lhf&oDpP@4>l4SrRC eajv6r^zR>R1S*%(EE4ws0000RfhEN@X0! z#`SzW&m|U<$Ye9vwgW)3amMV-EC8vJN=FA zw)%aFiz=x^900>Ga9tN!o?vZlowc=fe$)-7r}CtwXn!EC)sC5(&J)RGa}*cmIR1Ks z+!-)_+|Tll_*)wgM$pJERN0i6^ZC$zb-FaS63BMLHfM5(SmdJI_kEY&;s!NXy&Lwl00000NkvXXu0mjfV!2m~ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_1.png index 6b5dd2d4fb61fec303e431cf4d1d5c3a23e1948f..2f068dacc1dd91059c3da5dbac59a3610afe93a8 100644 GIT binary patch delta 480 zcmV<60U!R<1%?EWFnf(M9+4?HROzwJ~{ny?&dXQyYXy1IMUI!+~NHxef0IFz+Bbd*X_JQn3uDTi#^ zX6%GRd@gr@@OF?akV}PAdVibI^T;Dr%G33wOE2RQwJ%yU7=H|O?2K_g95TM=b80pl zEMh?sL6D7rx#()L5P+`RS&?VcDK%ov#IAF4J3Pzw_ zE&DP6xG3aaug7Ic9QVea$9pcJst+rwKv!LtgHpc;f-C}n+yju@O2(rsAQ^%BdBx{Q zgysF&d*C&=6@SoE*xBaI)1$Yt>=aGLzr~VKt0;B_qQEKUObK{kgf~5tLCC1n?X-Br zr`Z#ZHFfhq6mSzE0CGNO#wkFp(k#K|o(1sL$pKdBgLHe{GWHUm&t3@wuoAk7%f*5g zKfio{2Eww4uG?N0=OaP)Hfbt{>H!+hY3%?}FfLbURSpBMi#AV%#qksQg WXbX2Ul?tE$0000C&|FlOK#Qk!_c;|&rVV*$Mczx zB!cl6fVxo0oZABcN@WFA2xjKm>~{B3lcsghv`$*MR8~;r+@qb~CtIzlw0~xsboX{C1Y^$oC$!rgin7f5 z#u@{AKomzfp3m9o5&k_sK%tOFdcVA!EI#jG^^P#j#q`kkT%JA^XXxm)4 zBNU}drc^HReQS$GqXocVU{jRuegugWTNMKP;)0F!H5}JLn=|h^abTZwlO%KugS?ze zvu|#GW?&B<-F`J1vM~QLZKgs#hqN$nCezOvL@9BMZJ!}TJvHQWIifgD$A9_>6{ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_2.png index a02e413e49c517b7eb48a5e8af1c49502ac01310..3172e46601f862da4ae882271ee872e953c72b66 100644 GIT binary patch delta 508 zcmVCyFn@L_oe4|#Wl8Vx4A}9Uwq#u zYSmT#*BGF>RuK!yje1Q+!+}I$Ak9WyyiM2aLvc1bOok8G>VNf!y(BS3Y?4@Dg!Az} zC(?sNZm+K;`#RyOIM1eBUteD2`RPgQc8hAPj$u*)BrAbpKA+3g)ejQzTHIE6JDzkcSW`OeTm8u(790Qx(lnK~KY#fH1B7I)wkUg%pleh&8+A3Ye9x1_T+NfCbV(*|T=s3U zBwH0?Z`-Y6h*3Wj&vifbPJ-#Atg0sjb+FMk2{!O3T!#-N2)4N|es=iCc;k#Oj$>)B yw`ijvhuHPR!jnWBU|Tg8L!T<3eqBHMF~4{8Cc#I>cV#>P0000DP<{uVOzcY{35@g z4*^=BDG(qD0_8<@3dOO^n@Eu&DfK}x-OIe}Vldy}%r_$zH#f(;$eB!Du-{kIbwkrO z*gYHVX{u@uKoUPP8U+ByT%aYfxf5venR#{eE z(em@M`#*_I5YQZ20JJ+`wOaAv{X3fWl(Wu)5dhydkA&fjFr1;?K__0X*W9oFLc1D( zqR6?N&KdfKx_@r44^2&$CG>;l^O=T(SK0k!_yw!{R5(s`?-HQ^ZL|UgX%SFRAOAH*bDn zGI`1D@_&RmxwzoN`*;7s1_-B@BvC|FS19FTNhOIk8zz&N-Rw%9HiCFQV-o~KY04jO zen+LS^XzCi2A_fS!i6Fqe$I8rv7Rks8Tl}$7g$rPUBuQxh z^UFWbKuDHsMcG9Hs5a|WGCbF%SdHdnoSewS#HA0@6Jpt-5PQoqbrS=>ORnSmtDOl_ zO@OR&Lr@1BWitUr*>P-sARRc>UjJl5aY8nfLL&bEuc&yh)K*og zP(h>*fhs9UypBCiA54sB&&xc-=6vuI}EPorzvWepu(=_;AfC$47 z%d)v%E&y2lS}`6?$+86B4>=((3OuEl&Sq$>xw-j>5H9vf;)#61i5x}|=GXw>DaCrd z=Kkj$rfFw(^y=%+%bxLQ%6K%zQ>r6xHXF8^-`%Vz3MP{ofge)W2GN+BG)r)-cC*&4 z)VwGF*zdOQY=1ZwXsz1?L4ZiJHYnLsgi!=UtR5dw$_HRPnsy&csgON|k^+GB^AmQd zHGv<}>q!7Mn+;V};VH${V#(EF$#%QpEQ(Q5bmTNm2!jxzl!xbgB*`AP)a+iiOvY2B zlzhMaO0rL=O-)`D>|VB%mF_GF;UL;0IbhLnF`F|PPk+0^iK8LDdaH6gnRWgThm7N~ z!8VP-btMw$5cd0AUS9F^v}X1AK%QqT7uRU5 z|C4>fA;~C;93fpvUDtg6@`*uw&h%C0U^wLd{_dUZ*2aWnzo)7-QYvgIT@Je)gZRAj zE@j&Y)@ob-VH9ylQ-0ijBQFYkug%8#FrOc7$0k0D$?_bnOM0?LSr(LKNf`F2>I&Zv z*zaEOJReinI6`o28m!T1cxy(j0HzfhhcPh z#V7gy|A>21QUM>*-91fCPO@3+u2v)4w#jiEy06y>=W4aeE3mr3V76W1|Kd}`RmeiH zavBsxBkFfUQp%yW@0)#>yjF`koepELAPCsvI3}$%lUQH`7=Mk1Y+Ae2@AW9?w0RYS z57sQpC`l61O~q=gnvp96)5!zd`({(xe!r*n`jwV>PG7qny&25+TC9i(lv1TM34)^p zuU4y)6gY@R!y)@~398Xxw(vyovMe&e5$9`F_%9_PIhOzefXE1YoX<*v^FY~0!vPai zDmTR~-~d@7d4Do4G9G`9Z1dTaRef$h*g$}!TmnA0LMcIlciS!H`GO`{N@)@^_GFYz z#;Lgh_pgZ{z`eV!`X?DA=a`(O2TXve>xLnNaF9Nr2RMstWX4%;As(4B%mpw(nx>}H zQ+7ZDAz8AC>}vw3zBT=`Fy|Oe&(jw&zYhn>pBEQph+smf)mjxzbj&;8**}denu!b; z*&t|_LxUt(-P7QqY$m`Q_`b&up#ibSPaao84rgG4!GM}>5sZXo6Y(Tb2G}qd@>F4h d%X*EYf4{SqZ4;o8wyppG002ovPDHLkV1gC-;~D?} delta 604 zcmV-i0;Bzn1c3#RFnwY+9X~bM|No?Iu?rOF1wpZ0 zE0%R3DN=oqqleDR00YkO@DNiyG|e*SjB}2XGo=*DvLLDor8PNc08)w=Z2%~x05Ip7 z%6q?fXL&pxnPa5ud#te-t(ihVD#bL70C->Dv*+#YjcFWFMt^I3y@O>zX^oTuV+`}0 zaLxgsn+N8cQBqRxb}QAA5kjEe5!cBU@6Vi$=dD&Z4PAF7#l&I1XAFVQpFfey0)Q~q z0x*Th>9{t#d#!F7E|&}K<=0jVAyC&lyss&xASi`#9H{O$#u)Ac1HZ*K^}Ipp`}`DRIscrWLunwmhBAXs!9@-@oa*o;hcx5V*dz z#5r>9x>cYMD1f0Kh$#Z_bXt-7{>HvJ;O%a6aC$nEQh(xh8<}(F)^&)oEGVUDb`4tV z)kD*8|D_H4zh6H$ky1*$)yQ{(dbdL>4Zx4@-AoDQ(z)Mn6nUA)us`+36Xjz}q~9v=^jvkqg{Maem1jKMm`_1a>MBgBaJ zo^c$R##IsLJ)){;+ZL5#!di1Ub*l^Gul5=8`i=i4cOyd$(w9 qSV|$yX>$Qk3BgjzmjA4mW#KnolR4h)cFo-Y0000zIaW+{9R^Eit zG@;cZBBeZ z^W69;W@C*FT>;osCChu$^m0C*scBwmU)S_?I?(7;Cw}0I*tIy*H3jmOmOTY&sloBNPbUadBKT}l}ROA`ko(!{UUGSv(CISF+ z_kHz`GC+nl(WM6rfUR3Z5gXwkeLxSO3vFbEE>p-*h8X|@6h&b=ywD8b3ww^$34AajGtFH|%z;h~T}aiqKl4wub6Dv@wVX0HtKCu>iEzHcbkqh!DKv za6BM6GcOCyI;=6oln5aZ^X`d)Acr`t>hr-E1i98~`yTPREhc zam3%Xei%5P&s@%L4=trc=y!M@Xsw~Bl^9pL`-?fJ$A!y0bDO6JO-u>ZLA?iSti|L~ zu+E~jrXL1+27iA3c)_{N|1Uc^C#-c?>(E+JL|B#^N@~UXfYKU(^Z86E1@9ampFi>O z`4gAv!hYD}tj5`GUyLi(Sd7sc?;R;_$n$k#JdGG@`S$$_%e){}h$(TsPUMog&NIMP z1%P!~$t43Yo;Kv=HnSfN1lK<@IE^1DIdi+M6cKJ^Mt{}T&|0(WcNlB89EO2=l^)pt zz5V+hq}Bvy(MoLu{ceZR27sSGUWjq!`S~*?=LhzmV_73HC5%!E5#e%q<8(YQ-Z7t^ zp7`hG?+5m~jgi;aSBhk`)^vx%Q}fPa?bawFf^`n(9M|iFbAJ0gA+WA1DMp<4sIFt0 zCQQi%=SLjIT4Iby6}p^Rmm4`}prcknM9677+-jvNMb~w7-n(Xuh1STwwd}o4(AxX_ chhAIbe>Jc+!l$_F82|tP07*qoM6N<$f^r5QvH$=8 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_gravel_6.png index a13bfcdd9c6b639cb920dfdc96e8d9951b38ae41..30295955ee728f5a1092757850ac798cb6665651 100644 GIT binary patch delta 458 zcmV;*0X6>71n>ipFnMWHr?f23_&Ns>fCb|7MG>RKg9VyR9iZ_8Di;Da89L4W$b_kK><><*r;0itv6e(~Edcn``Sq#nkG4eK|mku zUNYr{84Zh8yDPWM^RU*4F*15*j6oj*aSrjG-a7zhMoh;ag7nkH_y8?_WPs1m0M28dTggrJHwBY(ySfG!VMYpD0cX*wBn zoO9?uiU27moO1`rA9OVYYOOfHi%|BRS_{1&W2lAzK&h1}PF%lzBdAi%i1W<0Z7>?^ zS^xR+LY!utRMNH~j6o?o?qp%j0H|h^oXP2SXIRZ}4#vsat0HCxz8Tb5;9uUAsK5yK(o=>3T6b|Zv%x6O&*y~k=L?}=Ir5fO6E z#Bj`NwH}{*>1M6rRjIY|{`Q8oc7LzU3}V2mQp%xtGo$R8S`BcF(P^z=wGd)FHuiME ug%F0S!X+43v-=L5KEW8D_kZ<127du|1~o1j5k15J00001mgpcF@K#&L_t(IPhFGQa)U4oMKco;F#DbmG9B8yHUIy8uFrKvnLY?% zS-QGfd`hoZpCpOTvdm{`>N#I77inxMwjlBe+I%eT#K#54Vd#C=Hr~0+S5+1MTVIx? zuj^VignwilM_&|$Ku#cH9Qs~T6uE-yI)a$sgP!NvPtz3qoPXGyu7R!rlw~0~29m7} zx*>B9%hp$c8H@zroZG2!`SE=EuWgfly$}(+n3Z8lOlof;0L(ql-QGl_49Kwz&d0F|fURqrMn=k@ z2M9eN0NM!5INKCP$_N7x0LyW|-*o{^C|h>U1pfzswN{xur+KzOT%vCQlx?)L-QmkW zn;2I)``dlQGQi3JZ2!^u@8VIm0N8`7D&^1wBmZ1#T{W}#fUtF4=ZicBlW=b$b?C|J md7k&DDzT?~c*4gs{rdqR$uFbo5>KN500001+I6x?|Nk4?6lj{*vM90#ySr(1 z5kO!#GvqL}T4TDSst`d$;1NhlBoQJ4fH^0cGr*(fPEyqKSe4b3OZFr#SU_WX>Vpwb%KwgJv^IqE;&-YB(_Oz7K&5WyHb z=~OX&0$_78dZ+jGuF%X#3F1^OIU{o(01+Xpa=9-2{`|OumdnC&S?-Nf5=0KVF?Pfw zD5a7_0NAz-KYv$tdwJ#d^2*jXT5V+g7n~)dS%gv)8%BuG!&$BiqRQLP?~Fe1aLkNt z@ATe@Q(a041=#n&oJOmS<+>aUd#AN4C6|Yt<%zM6dx-Yl4+~j@RvSr#(i){T&ajbH z$SQoUp8&W!NrbBTp`f;gh_LTF@9)2`F?f0XhM%(i9DnrJ*M~98NUgQF-EM5#O3`xU z-~EW|wxU|@YfB=C2-A#xbZkr{r9|(YqKDUMb~O3IHr?-u{QUS}x>NMH3-vjnC|Q*; zj)|u^SZ8W7k?7q@I3Y0>uAwi=g{T;_U^Ux1B_boGL&N(w9XeFkU^djiZn+POsTO8^4Xj4-tgpq;paC6Es`$TT6@NdIkx3}=C7fhd;9VO; zL>@(G_Z6b@81l+C3h8B(%L?}6)5t|#SMl?BYOjZ6H`Sw*U&rr~5AomxlA#I2#mU5{ z_)t=Q{|$o__g9b#P9wPUl8Zd+YlWoK-bDNxB|4E!%pw$UKuOIZyz4+V=ED0Wod6z3 zD&l0IqT<0x&VPe+>@`{*UxUTAmzYB~{FddMpRKW!uiFD07nU8&psl$QQgdSkl&BlBca$}I zH+qrJxL6WZC0_`H*pz?C0%(SrkX*B_4idGD0t#slyMId{r2ja#h|7yD)t4_S2(cr7 zsAHuw89iMOA=%7z%;5XMx@hAvl$e_XsUm%k%acM{1isBau1sS;(sa%ikrJc0GF3%LejX(pi_H`6OWYz1hz(4GZ{w}X{hL(p9Qn>A0M-#Lq0V< zs({pQZ{#4-{o`bnO^VP6r{}S~(G9OLqb7Y?)YS6y3%vHhO93&}kf5?_LLP@v|bVt4}T4jhPi*zr9VgXY4= zHT(ZW+3Vm~n^7zi(Xd-IFzKs79T^_h!)mUDw)HytY>jNxKu;6&9k*dM)bUEwH;Sj2 YzX1r^@-P5IqW}N^07*qoM6N<$g2feH5C8xG delta 798 zcmV+(1L6FO2EqoAF@O9?L_t(IjU~^^ZW~nqfZ>16IdjY0;!6^{fzm`cMWrkdp&+qf z$G%U%g2!WlK!|;jx+zE?M4^$XlBP`^JMq|Kk3DDZEcyoDXMFeVH*FY%v~5e>mRQQ6 zs5DhoA*IALP3pR#scWP#X`6zQ4oc$B(dOgnw;X{P%K9XV0T)8>Ar# zx+7G%V*ltNuf|UijiP8ZwtT?%KmLjmnDoOt?07p|ycx4UjA#JIQ~;FOYp^V4=YQi_ z9aiZAU1XH9#4$a@Mz5H~S6p7bBjrVj>o{cF4AGjrID5e+O-b{Zf(>C5vfn?%c5Gh1 zy+HZC4@OJm^?zBUQ}#QD09b*CkdpWB+(YL%rc(HJmu0eIzPje44?n>)O+=cexQ@d# ze#7YF$IO!nhE(j7iN=VF+a7Fu9D$w*?PAKPA4MGe9euFGsX1z>pm6|F4Mxkl(L!&D}ZzBpwv zc}u^)$IbEzQ(4r;mUuN~K3}j-SB&nTkn5cB^Pi~7isd3f?1nw^CS@5X9G~1p2!pz= zF_mIEn{s<|0|1S|zt8`{cYAdF1KPGB3H-XdhKiPZLoP-JgXaiW*Q_!I<(AN?&vrW7=VkC`*)oSBh^2Rfj5oC_U9e^Uy{X7J%6(dLkr`wxQ*zp4;j^u z)X6-u>H;dp5vqkPG@AxawKbHp!B%_-FO(igin|B(${v2#W6+XI&{Ip$#3^d4d?=}M z`i?MuzU03=B~@ zc|0$4-mvbg$_JG7b(GTYS3p1#n?TI#S!N`RX342s=$I zN|_Bdk0g**N~BY-ZSy-Z(A8B;D!nZRxlM$FL%0ym$74Qbqo>VEH`N1S;tr}tn7c#( zjmEW*w0~$a7!_Th#0z5siNiV8OvX_~8Y+6{XThxbC&sMkkWYQj+8|9UHVz`)KQ4FJ zqzsL4A%vs-am1s(7Fd9jh&~leCFbBB?Ia0SZi^a!jZYC52T=tAysaH_!p|#nAB=nu zl~SnHwJo?t9-F(MtD^6Mc2c00vtoD><_?^Rc~Cfxy%K{K#OGb*ewxU(#_-@>OvyGjYG$Gj4*LVhP7ALzeWQ4a`3t~8s>6pDpfmsg002ov JPDHLkV1j2STr~gy delta 785 zcmV+s1Md9%1+@l{F@Nt#L_t(IjU~~`ZroG=fZ^Zg`1p8yn@ciIXlWp!Dp?>>KrC3X z?gOykIavS_Vhd6iP$3X%T85-ao6KZlkH_}-epv9m!e@Q^&DSOf0*o;XrbF49wyWv7 z4k;zJvKe~A(Dz7TV+Mmijae@*a2yBQ_eVT?_8D4+IJU#T7k>-Jdm{#8kd`2roFLmR z`$wl-EuJF=Nn>iXe8P7>{EBU1GYbzGjYeF(Td)_07(gobtplDKBO2Q~$e|CtYHE(a;VEeuY zmLc+HY>E~8<9|Z{lNa7?9>G`o2fhbp^f4P+PoN{6v~;Xqt+qY1wrt z7+5ZE@zj{JPrt(VJ*Iw)6cSHIh$xJx`i%K}PT%*$?|;Q)+Z;deIX*tY(GG11oAQp= zum3;_LECqPlgBt(A%u{)GQx2*p`KzJ4`ErzL9@J0X?877o}Q81CurBD+SPPT%Xa+_ zZC_z$Sw=nN$V#&7HW&=9invQ|5w^k6nybZM#0N3acublm*p{NMO0=U9Q52!2&x=2w z|Noq2gnvPZ<4Uv$*^3UDPA9nTi1lg(Kz#HiMz+*Vji{;}wzPTr`5DXQEwkAk>&*?e zt>~>CX}%&!Qu1QU@kb{#baU zV6ZrUd5-VS7<+S!83=;_QFj$u1T>=~X0|IwK;0Fk& zC9e}^;UQ*_*p?CGMajrQXw9g$TblL;r4)AC zReb;RFSJcVS?+lMgA=l3MNt$?qd8TZn(WYiKpr;E;B z2{m$$7#KkTV1IOWZGCV9a1z9fqPthNv(q>}o+YSNETwb5;^boR#as zAk1d)#}*)FGEYg9@c1SUn5TAfaz%{}Q#-==*{VpT znMJ#~EyZIA?&%u|WV`9@$~QBx%t@qW4wwNAQMqK{l4R7X&x8%n182JJ9#9eY(DllG zI|-oQzke3l!XQCiSfEL}^tN$)_);`;;W#6M@VDHF*`Qw)R%|?}(WxOQ86zSUW!=B7 z_M}Knx_8_y9PK|AMn2ev6qo5U)3gzQo)~2bL78>C_8cE8i{iu?81SxlC;`8FN76da zEuquil8$hU9v}C2!7^z=QWhs~MN44Jj?71poj507*qoM6N<$ Ef+|;5;s5{u delta 732 zcmV<20wewR1%U>TF@L*BL_t(IjRnC;Yh+abfYI*`@7_05)k{?pV~4b;Af_D_;z|&7 zA^rpx{#0=(t_49GMLKDNc1)^L_3F)c@*MHy7ayfOFCZl%0i`q{ctQwBDN$OHLL#P! z5{i@(wyHTE9?)8&b89eGAca8*MbkD|t4WzcAjs?r8E5k4nt!(W50L~hcGRmCvvX)r z*sSFH@4n^D!yQ6E0+iMO2n1SdRJ2Gb=!TZbb^P$-FKA_vlOGwUj{C=d$V`TF0c#A? zI3bhb_V$Kx=owstW29P?tWVC7TJf~sqHS&gSmZUwVaIxT27oRLq?BBoKVxzZts+IX zqU}2N-42@-Xn)lrr*T4Q#jbha>bat? zN=WZ!h>GY0|K9z~u{q-0gma!T93jDW_eh}^Tz~i(MOjc6rwAdixpxIZ;G@Tw8l5Sm6n_#W44E-hrbee6DFiAScJ~c# z^t}7xn!~=qSj#ldc;}hNh7cXP8wQL~Ow-Kdk0cUSFL-LU2$jf;;mzG&oSvPsST1Oq z1}!uxL^7?BRZ$>i#>+o{CC`?0ZA(>EWJY3S#d>i@y;@?eWxv}2uzB_=Nk*La$l1+E zA$jrfHGkXfBlXD%`{M&jXGAg5^g9mCk-qP^dgnQAp1HgEi5L@o-y_R>LBP>AEtk(P zkU|h*L`%if(~iS_4**GU^Xit;)+~z+q(q+QNFN-U3>O@~zx<7^AAm$Z^nCFCC#>rW zHp{mt&5Eil5t*l-59FqVBoW_y{dqE(2I28BVpVib@E(~7q!0|_NS@~$+aqOBU{p>& z3<#BoUZQ=RAtt0BGE77y$CD- O0000)tM?A)81-LvQHBW0Ou@Z1bMCj-~nKyE)dZR-VGdmY|> z8vD*>a(CozZ^HL&SbJ;wmh$AMU)VyaXyT=B!OgCtkjo%1#(%S1a^-ywhleHc*+Hpb zJoy{Qdl>>`P$_4zxDPPso?zHJ!9Z*@_@ovO>X^izF^k%m$8AL2I=Y>A3hw7kq%7+> ziusHL)({Wt=v`GYjvDCwu1atN?PghkKOpMY6lgwf;r6Blzqk$4cqR;l1_6jpN1n7< z)Y7xpIYuZM`+s3oSq#HEf*(hy9Ashbt|kmh{*KV9V!3?4b$E>V;>NMTHbK~*&e=dUptHB=I_vMvN6o8`YyfyjhOT`P?gTSf__ zJQSS-q5kPj6N|^oq%J=b5VB)^#)Bp*l^k;JmejyaD}RIg$vJLEZT+b-B;)wHi9uKs zX?+A2N1C0CM%`0wCzFeWRcXf-ro)z2nk?e}nHG-{qQOTEq}|Wk`pqPMZu@Bt$Uugu z+3+zH8J*ybvf(^1)5GjSiue_?aWiSB04x@FDq9(3r3(i#Y18o;t}frJX3}Ivg791K z!fd$+lz$bClWOd&AXV@TttfT>x&5j|>dSo+ok~YuDWe3ero|NY}4Nq3sk=0~J%4J)EHetz>iQGfOQ>OSN!ITX?TVz)H2a+w|}IRu%I~G@bgbU^5OYC zB2WQi3;=>)tU-%M6{dM2riovE{R5*8jX4t6iH|S;VVxzVjCYP0BZBhy_`ovHEU70E zX*UhKvkTNH$Nqrz-UF}+9m9NNx7`C^nt-Zsd2z*>62>T@bd1x)X*%F+!03p^7*S(5 z^e^0e{+50^fPX2Zy09!O#wpiV*LWBBbbMmX3vJu5riD^Lb6TM&HNl5>zcchBDMeCB z#4sB~0~K&)!?8agredArW2=F2a>Vb@)<+g{SRj<#tKo0-?1;2Nlc{P6Zob=HC;a;aG3DLJE7 z5D}JT!H2*&4m2U)OkiFXL@Ol=HkSkia!$mU*e_pfN$Wy9MVhvwR456kN{W>vGlfD; cmAoeY2hkZ}4_Pw{Z~y=R07*qoM6N<$g4pd#h5!Hn diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_4.png index 2866b671e6deb70e2e93fb096e72bd372dd28d9a..a35f14704959c2e7b8767319ec97d587dc216ba7 100644 GIT binary patch delta 650 zcmV;50(Jeh1+N8=F@I@EL_t&-83n;XawA0$K+&IBS>0{fqY>6<0wTt&Sg~LY7bm#D zEI0sM00_o*1Q-XYN#?jE=;ZxBMz5&4Qg{(QwiFq^QXtbezKaWn!*q5y>7K$UHs zNt$V`(mfFAhzQoBQ|pb^gr9!=o>DfZY2;Q4V;*^a{=)J2h^k`4fQj+>*Wc*9Qnn3C zDFI+>R zjby^{@yL(|-hVDHRNu(iXuS{t>fXT>9R7Lzon={Rz0z7^^92IV=l>XN;_1_OOyfXK zBO*f5gjzB@8pAl??(E;cW4#rIY2?F)6PAs>!BVcgy!?fz5aA@dM^sP|LB&u_O!*!q zqX;RC%iB!bI$wYL#5^zLoT*zS-09mwgrl`}A{yO0rGL&eFXVK`Wxi0_f@b00*S~qc z-!ttd)D%%A+)-6DTSC-0pWn!~9$(}bCjW#VCa&+h&X%f|J50bsa05E8gM+T9UR z_J=)}^O^gH2d>K-DH$#sOS!PjE2R`pA5XN}SmsweptXitGJ;00jpONnh~N>ZD%b0U z`FaI_fPXK~FN}GIr2!&H$*_n(F`D1_`Ipa(;{*Z%OyiDPD>-Lc>jVu1x_5>=0$>F6 z)=8=i!$?xYdq+*Etx&d&5NBN%#$m+LK(8Iwf{G#^Plr%dJe=O0X`1M*(p$%J#=Vm? k(RxEg0SJNsqC5Ws{KHn#R!*J-00000NkvXXt^-0~f_?orfB*mh delta 656 zcmV;B0&o4V1+@i`F@JAKL_t(IjWv@?jw3}BMbCQ?k(p(?U8dY_fz-u_5d+4}#t|Fn z0SkZ)0HUi(0%JQrkrDA81B(S*>E5ezo5a-L4}_wN-13>~!;-fi{(guX*nI2@iRtr6VmEHUSWX`0w>cBly2T0?`9*Uagg9~kE= zsL_07&6N;^4u*7?@z=OX)8?m#_Q{!hzjmTh+9Mj6%kY- zs(~SGQ4)#}JaRpc)V1;Tx6h2@L`sRW7Tk=sPPiLdYJbDM(yWooNVQA~4_wD9xlU*j z{(1Y0$NipRGoVosRoo0!MNX_#hI6!~yExT<1qv}O#$K&ypT q8!;u!8bJfKRrG(sa2)Vv{0IEQR?>(+fyn>>00{s|MNUMnLSTa1q%1Q4 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/compressed_sand_5.png index 743e87ce576872b23633f96701e8997f9f264e39..5a5afd5d2e16b7f0b74c07b282e79759b9ef22cf 100644 GIT binary patch delta 620 zcmV-y0+aoj1(F4jF@H=+L_t&-83n=1ZW~7sK+#)|o*_j_rf4g#O*R3t_5Xi_fvl4c zh#^yOWRf$}-PM(IOjj=|yaz*;M1 zo_KyfV{Sx)wcfeBeMMBr9GLA96;wnJ3>9Pc2NXvUG@aY~ooKflO2l`SkHa{`7JJg4P<- zG=qQu^JTQB^+xeRk01#E#t23T|9*YLNfE);p~>d@9s!qm+WF(`q1^ zs3>xNeoR$m@^l^mIMU0IfeWCamWcSlsHt#W$)oq4^24m=vIcFcsshXXlf z-mYi*XryHLXnzo(5d(%oz(22lv&_pqXYaIF0JvN(WSjW;$6qNWldOP%ilL@P;N+5t zG1xusSZXCth2!yrCBqvm^~U-2E22Wgz-)`Cpdx}`s2EdvKuIWqM&kN*!<+N`%TLVn zz24qBF#>N35d-b+faBrRe#1v4>BM!uQhh;_@bBvj`+xnOX)~cFhzdlYs%SC;F)o+y zq_kySSEgwqnUG}SVR~e{-H?)TyIujv(-R@V7z6cj2V(!Y=X$xYeR$xud`Ha)8gsoe z&kMCyPNx&SJInk^1h_kzED<=PcMhi~M1=8f?{>Q|-)?sx176N&O4?wS-y<0E>Enm^ z;rReKt!y<)nLt2*scdPzkyEC-6ZjqO;S3kPe0?PmFnoXnB8EG}7>I!{H(G6^lBw%T z&Kc80tBz=(qR8p^7^=#M!5D*5CWd$1os=?TIHpGTj=n!w5Cr!_{{bJ5Osqx@CinmV N002ovPDHLkV1iY*Du611mOgbF@GCLL_t&-83n84*55&+o3~?odz^lBg=G3Q0&%1popHFmJ3iF&WLx`1s)o`z#PN2JnPe_dV$JEjVg5Dccak*ZY>!kI@?f#6LQ76nbc=_);2&xjZ3o>C62uE_v z8ipf;${DW*5y|^Meq)Y-o0FMTLasqo(N-i7WCfK$uyE^)aUd(qjK|9lu9qu)>qtTZ zRv{DC+(6Fb^?_OAoF~0^%!R3Q=}+wYhBf0D2LNrmQ-3Nd3yUm}xZR#O&y#)MIp!NC zqX@=27-O>5;`#oL%w!xtse*{0xjPW#D)xQj?|=R!B57{SIlzqWovI}38*UB~>kQ1C zMis)z3LcMN^uB>0BDh}etT<`ji3~&nkh$>I0B96cB&d*_OsGuc@HXFAbJ4cNoRi)f zW{oui88n!L-ap^UOk@?AN$(q#i-^QqqcSlwA_9{DD4>AK8ziLU?v002ov JPDHLkV1nM&1nB?( delta 576 zcmV-G0>Ay?1m*;gF@GRQL_t(IjXjgijulr7gg@KoboZTm86Y6BV1e@fZ-ta7i$uVL zJ9GYQv*<~@^1`ZeRoU|R=8|Rx2}vR%WG0zsF9MkWAV30Yg|!AMN-Aix>4pfXdmt*zH90Qt7_)&UnT{_Pf6OoRY5ji12GXp{)p|>B5K1g>w z9M1v3b8DDYK7YLbgqcySf`E#mrbgn_S|F3-axm7U)WY@lh^dkj#_Bx%`wav#1Jwgj zK}A3?L=4q}VhDny(VrXc!P}3&F?z>d&CP&Voy?>x55S3ZG8|`NTIszZny4!Gr|(>j z3w5ji9~Udn4T>pAjct;G4Iy(qyt6V{rmM}5+V<`W4hMq zaXU030?;B-^mfdfs;!#6O9)xrsxE7tGE*TlRksk%*Qu&hEq|iq80MTZ!`j=-43IhP zTK@U-2^xXN&M!c%tHiO)gr^%%l+}k+KZ&S>}rub?st*tb^WR?Ifm{< zlifun&H4Ja*3wm~OZNijbr~^ye*85u&71@gAv06k<{Wf8ZqwS^7{mSXCL;7^)$;rN zA?Pj8N~4Xeaf8n+Qt|ni5QM?cg!g>t!sgCyz6M)Evpf{y*;e8%sH)f ziU_S-`*f{k*YqJZ>(apqI0mqy)HEy3jXl8WlDwozGEp^gmEf63Y$S~`Oh7c+-k4a^5z1?tkWFj-Ef{IB|^vD8&szzmy zbYzX`j-&ZU(c0GI{pj1>9mSyEqAd&m7)>?AV|raO_rzVBoe$8o0$GLpXjL6QOE(tCM4-b5zdj5!ZDU9U>+_ZMwR zBM8ilP8GtaN}kUry$=vXCfoKwgwt9lGZ6_u=E4N%02KvVov%D&GI-B7F@rXOIVZg} z%o;x9^hoITx!2+?GK<~^l}=`zjY~|n6o`K{2dFIm0HIqpTBY9I;s5{u07*qoM6N<$ Ef{?B0?f?J) diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank.png deleted file mode 100644 index c72b150d7c1e38cadbecc95bd88620daad4b7238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1IggaDrqS0F7V zq3Nn&lV)kyA7(v2NcQG}w0DPR{r+S&^JzfVJ_GY9dES}&LEb7xHkS7GB?bvi(RmM( zXaA2s`{eZPKi95Zo3d(KOI>?rR#s$KP?=NL8Y82d;mOylclA&A>dH58zfj)@v_qjJ z$S;`TKYlQ2*4i?lT7FL##}J9B$pWs-Jj&4w44PX-8BgY{PXJ0Wc)I$ztaD0e0suV4 BV_g6M diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_left.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_left.png new file mode 100644 index 0000000000000000000000000000000000000000..aa10c88679863abcf820a8684afc808028498d44 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|GCW-zLo9le z1HuA+_;aQ?h+nvP;XwCCDF+W@GiQl{Ofy3hmxDWa5*6Hx?VJsG9Ih=`zqa?f01xv8 z(_~|Yn*wv#4wx)X{w0}^nZmdKI;Vst0K@1t>;M1& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_right.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_blank_right.png new file mode 100644 index 0000000000000000000000000000000000000000..4839b1a4913b5b7c17b5c3154ca4e68f3a0adbe7 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|ay(reLo9le z1HuA+_;aQ?h+nvP;XwCCDF+W@GiQl{Ofy3hmxDWa5*6Hx?VJsG9Ih`}zqa?X01xwq zn_NZ=(-kdv8#0}ae=$CA=?Y6<;w;CUCbkD$E;+Lbr5f@$^v-Iq1Oq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_down.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_down.png index 277814f6af7c3a459dcffd73c8bf8e2f32c0fcc4..f6f6a2df6650d707443e34430f20419011fa82e2 100644 GIT binary patch delta 145 zcmeBVTEsX(vYw5BfkC+T`!pcMSRCZ;#IWw1%u66A#?!?yB%<~01xGFh0g;wO_dqkT zbq#Cp{I^Rlp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNHfpT^vI!dXoi2lUbP0l+XkK)fR7Q diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_left.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_left.png index 5d8a6afc5abc029ef2af37fa1980663ddc9a0b99..fbcbfb0a82f2e26b7f2cb8ed57b0f7e37c5206a0 100644 GIT binary patch delta 157 zcmbQvw2pCtWIY=L1A}nw_h~?iu{g-xiDBJ2nU_FLhNp{TNW|gffUtlc{+wwGZZK3^ z-~MkUCG~&r9-Dv7Hlp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNCv0T^vI!dXoiQnR${j8X6}~ohT^DpUTK{KCxncLB)cZCoQJ1 tt`L;VNZZ7h%J`~>kOQKp4Ga=YWP7HuD=@o#K9mt%Im1QyC>xJNMIH-7F>^(lp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNCu~T^vI!dXoiQnR${j8X6}~oGK{EpUTK{KCxo{j1LZ`r5fA; s$~F-fePmBDg?P$mEaOXMYzopr0MGq&yZ`_I diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_up.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/conveyor_belt_up.png index 3e524e978ff39a95648fa6b51f7128c0ddc16013..b260bcea645ccf232d28c5ba115b927588827cbd 100644 GIT binary patch delta 148 zcmeBTTFN*}a~x_51zesjlagn16ILE5@`;pK`X$?Dk^w=}}$X=koRMwu@bxrDs(ymf=``<>zJx z?!ZH=5(ytxGo~M5VCJzzopr002Wa AasU7T literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0zmA*!3-o-7PBt_QjEnx?oJHr&dIz4auNc3LR^8g zl!T_MhE1BKVSkwQ{2lp7r~a+03T_S^Eskr{sBO>IZqN7};3b+m{$5G)3n< zOrHHe{_K;}xBpzbc5TY4Z7p@}nORwpVL@e1U2BYtZiXjcuin)^-K#6#!2LpfBhU_o zk|4iehX44%q*-grfNFI-T^vI!dXoi2lU)3C5mdKI;Vst0Cz-j6#xJL diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_0.png index 691bba56bc3f8a72800642e4aac8ea3210b9c0f7..9c57ad10ed8ce851e1fac60eb3a1d1b15a73d219 100644 GIT binary patch delta 109 zcmV-z0FwXB0h$4jG-gprL_t(I%VS^|1*2fl0~U3~|6Hbe|H;w}(kNY&48|aXNYcz1 z=nB^i!|cw6|4A}HC?g7vK?Z=th&F)3$r7$vA~^(1lVkwQ5RhgN#-|woV0ka-F4{Zr P00000NkvXXu0mjf^y@5= delta 161 zcmV;S0ABx^0nGuBG=GFiL_t(IjbmUK1*2fl0~U3~|6Hbe|M9B9CBbE?_g~P~l!1YP zf#KJu&;S42yw8YD9acfkK-d35igGAoZ!Vr=___ByhI*VX`2OuX!ay!g1|~ictm>Gs z3I6~11t?LcQ P00000NkvXXu0mjff;&sL diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_1.png index fa534f0784b00f34f43a24db3ddc318783af162c..43d05adb802e8285b6a63814f52799b76c2f1f0e 100644 GIT binary patch delta 120 zcmV-;0EhqD0i^+uG;v%>L_t(IjbmUK1*3r0fJI&LKbNWAf3h@#G)fmGgE7b;k~DJ$ zy23TXFuSuM@rHmDi)Kdu7s`l&W00XFxd2%+$OR-Bz@Q)n*DR470;WM?L~CYJmB)&) a83F*=X*~D6dw3E60000(DlENq8y6Yn~Ucde(pVwp&qLX{(XAG@awx6!{7f1*E8{n zV09@IRzW@y6wRDmoLDvEG~oOBt8g~k?_UhxzkNp$Lk5^(peG>ppNW+ftKxsZe={&V cc!r_}0Nwm8ntB0;y#N3J07*qoM6N<$f|Q<9v;Y7A diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_2.png index f465e1bea0fd8f6c7d2b941f7869cb57e62f17bd..f4d410271e7e3d226fec973a8575998a1970ab1c 100644 GIT binary patch delta 131 zcmV-}0DS*}0GGS&M}mS&Jf>7ryX1{p+>X3juY zxMmn;cQz#65CK0IxJHTO5HKdm0FYwQ%;^6@8BuTyaurG5K-LU$3F)DzAO+S8az2Pn ll199kkY*-TdAu0i5CC_hO#I1rak>Bi002ovPDHLkV1ff2HM9T# delta 213 zcmV;`04o2m0f7RLG=I2BL_t(IjqQ=K3c^4TL?^+E4M$kln@J;{#Zg0o}Tuv<0%+XY* z@THGpxnb+F006kJw*UZ7RX8tJtreQoFtEN2r;Bl80>Xe?A*}Zwr3}ayjIK5Bn^LK= P00000NkvXXu0mjfcRF4m diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_3.png index 2929686c6dcef462b511aa29eab0c7086db85215..cf497bf94e7f3bf03c1d573eaacbb87c75682542 100644 GIT binary patch delta 157 zcmV;O0Al~70?7f8G=G3eL_t(I%VS^|1+)b$>WcrlO!fYgr5U7Ax+ocpK?aeenKRJ! zKM2DN5b$#W^GPxQrWuCWoehaM0AwRfqeOBD7?WfGNU>;U^nam@C^#m`3m|~38RQbu zqd`FmtQq8d5Sw%ZpoWm98Ce66W>S?0V`MSh2BK+zv9XCE8x{fp-}PKk1YYa200000 LNkvXXu0mjf?xH?c delta 248 zcmV_ON3Aqg+FC<&>|=X1Q{l!z@0mnE&T!h(Pmi? z!Tf{Pt!h)N3N%8}^tK3})jY+`?B=ZQJNLeG&v`u9W4D+^p}0vbqccMdH;Lu=A_1T( z-sS85!O+c_I?~Bfk)@~3htU~MmTH}71prRMm8uWUPic#n>2VR}O~0(k^PwHX0_Ddm zR_W1*fMx$!Jz8i5v=KgU?~F!z7mn*tu5YG4BEZ}A1^~ORc)GkAjWLYC7Xp9uAN;k| y4L?2`1iqM-1wdQZic|e9fqxgey2Ecy2?E~_BuJwp8G`fx0000UIwR diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_4.png index bdc99ba74e64e476a938ef3afe18c1ce9790f25e..f8a66773ab0e30f5d251e2388619665a6bea6d74 100644 GIT binary patch delta 181 zcmV;m080PV0^k9VGk*Y=Nkl1m#N-=7Inq{AR2^;)+pfT@}D!%6|70R zC>e}F27$yta(Fev6oF_Eh8ch?hSv~~Bup_(GYlgej@Jb+g)og0$su5j>2WxrFv`UyAn+g4GoO zX7>*Zy$!NA9!c&g)YF8ugCPKu>pT3t0ihP&E^li)E&C839e+wS%f`Clmv?sn$UQ}G zJQ8O>sOMULd(+IF!Isf;uU>k|K2)L|q^DEoa-%_Zabp}s_DMF&DExrJ56C@5sD&ts z+yQnIE%O#}I|e{?VqVX$YBikS*grWIfS@e!x?P@6&zxR2(nLrT`OUKM34cMoR(0Fs wiy}>=<@*49l_RC$jNS|j7HH2!a^BQ zaCyNhGk*aiNklI2en-gCB_Q@G97u`7=zv3 zfgO#NF=n$gyTHyZnU2VG1VHSBkh9~!+m+%dNj(8z-dMk1H+O!H(mOb~ybyqBl~HXr zdAqtU<(5Y$6+1d<`DVB8;4iVU75?=6uIQvv(HelC)ymfj9N!=y=YlZbSIe9J0(8V} U$_kd}!~g&Q07*qoM6N<$g6=b!B>(^b diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/crops/ender_lotus_stage_6.png index b2fb6f91c56c1f149950cf63d17dfdc5c6be013a..cb34f052912c76796b98812dd07c19db5a74b8a5 100644 GIT binary patch delta 210 zcmV;@04@K41N{MzGk*ZINkl~!3=?E28qGsacbrabcGuL!VC&hU<~8Kn+a delta 343 zcmV-d0jU1{0f7UMGk*a%NklI*#76KHEELo>MlqY2&1NiQ$Jt!ObpFlEobzAKfq{PwHwv{Ih59#6 zX=0zd2{-n;=AI1( z1ewMTDHzxZUNXY32qOego^Sd>2$Ja)lJhG^2w}`rG9no!D9=ZEJ^(?cu{kpnm~nM+ zl}fb&z_9jx_E66*%^uFQILG?ofd=qXMY&$*<@j_VcQIN`O{=;5Ph19$NwV?y>doHieZ|ii<036faLIM=5Vt755h1*&^5#4v1%6Za{)^V+nIwg%n+Dnm^erc zNG(K$l>~94rxWOPf&Olc%#xMXT0m7o0(O?ZA%^*WS23QDXM8V|+BYm-Z10(@6 z0E9uBkTJ*wAT@BvD`4yO1rZ&^WHu!{3p~_Q>v|| z%+n}&=7Y-%HjX;vg=7Xy&4I2FX9O=Y4|{!eQeIKc&MfMEAgsw#K5y;>fI2_bETdVOn11HWsSc7@IX{z0^ZV8HLhWKS z>XJsi;8!jn&eDk~sc0GiQ4qjOPZZ^5$SI;ApeXkX63K!v5ERA900000NkvXXu0mjf D*I=mH diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/cursed_earth_side.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/cursed_earth_side.png index ad017bb783d4bf06e3d226975ce357a133c0eacd..38d01ebe230e4fc9cf233d74cf0154f18fd2542d 100644 GIT binary patch delta 435 zcmV;k0Zjg<1>pmbIDY|?NklFaqcavmZE{u764|F6L`UE;kSyNMYCU zBmu(qECSXf{FbBy@SE}FLLD(z6@^U`d=&@}<*;SFg&>sJOdb2kT1$M*g3h!{qPRek2$H z5CP?irtCXUQ-8*SK89h)AF|M3rWKPV7C)pvbiPXO9qVn?C>F z?u@~O`UBjVn7Cu@4{+_yy_#q=#wK85NF=-zOr%trLWfp6eM~z=$vEf3YZ?=8@@3B4 z?>^4C_tWNQT-VH(;nb?gn7_C{{9$fqxjf+WIlK`U13y*X?y;3bx~Tg+>m1P5~>qn=m|Pd8>@M^c`r^<3nzH z^a{Q&y;VVHTOMJx_&{OW^}#oIwtf{CPCUi?^fW@9K_oMIbw{i{zBlQnObbRwEBdd}$=CzVXGxA8a9R9x!7v z3pE(+{uv3Tv$FjKNBvDG+K%eJ@2z5aV+VmFO~{w4%Fn}Onoj_`Z0!8_OI_%b870v~ z7BMC8Ul;v!hzTa6e-rCvvAIu@7|cr^;=2>0iY8@K#p z6cZWpCYUTz)E1Z^L5=$rh3Vrk8O(W*jclWynJyF=RNs|D3V9ETJ~7#tY=(_~138UU URLSb^8UO$Q07*qoM6N<$f`Q*HdH?_b diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/cursed_earth_top.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/cursed_earth_top.png index dd5e42918742a55233cf6f60d2ea467ab501d68f..636beec5e1f4952870337bd60211e0ae833ee630 100644 GIT binary patch delta 697 zcmV;q0!IC;2rIZgDt8vXd)Hqq4JpJYLze>ghRD zq&9}MwdWW9zQV~O&3I{;(TFnD6r42UraNqLxjPxNS9h)YJe+Tt{^g_iE3!q=S`OH#VAchbmUUCa1!7b{-Zoo0<{w1v z8mb6NH!ZC+RUefno5&Xtfg-`zR(sCld@afq!(8RFm&Sh_%>-X15DjJ9Y!MXzL;9OX zyI2B~JDD)BLyzKY$WwpdAFq$!hkTbANtr>uG@ly6%N z$yRLvVm1RE(k_Y_#qBkSPVjYquZp@$7e!Wzqn4bZdv5yCTqdALx<~*c+p-i+?Nv-y z;u{Fy)Ny~m(w#(TFc#lpuyh zSDO@M^bft?@s@Dh7*s(QVaw4G9hF!l;iy3d1_UvJxZMb`w^0uj*orb)$5m^nChkM*sjvN_p00000NkvXXu0mjfI{HzW delta 765 zcmVT*H#0^IWRLf|3)Au=PctTd?;cj0x(m+xzxn}!FCPCiTCkm!%y^+&Zkb zuUEq;A)apx7IwB?>=YZwMf7|f1lelupjT4Vzy5m}#-Z!G>Tbiqc)xTD0N~T`x6F}JU{E}nk z@nR5Cn`~K@5(y*-etqwI7uyRfbs0sQvCk4sw< zIO(u@U|8Bze;)#QX?*CZUq&&T;-y-#gA>8Dmkea0B%&z_FpzCk8@7w{*<7h`FQYcn vQp-SQVRIWoTE`&OsBUCyGrj-j!>j)RBK?My|f00000NkvXXu0mjf2c&bM diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_0.png index 2def15583a153f2f84e44cfd6aa6fde48825fb02..a3cf5592a34b8f9de9afb4ee1eac7cb2208d730e 100644 GIT binary patch delta 303 zcmV+~0nq;G1IYrABYyx1a7bBm000XT000XT0n*)m`~Uy|`$5ld%oLPz*#p z01}FzK#GJSAvz{u6-G$K5G=q33_`&aRJ6247wJV8lL87W|DS#L{rxY|Y`a`;+FUg2 zZ2MDomvbKOw>-Wcd3`^J&{~*ss!{D~w@+~cvNnLi6e23L27mWD@q&%M0%|AqWNN7o z5}Znbci=4xhb(SL9gu{+N+RlOzlyk_7E$A5AEXbEd(*Y>phXpsMASnVL~6wie_DiNL>CU`FE=e26~Xxgql0lOZx)cUOHnt*e2?XY}X84+y!D$h#W{ zBUOKsn6q*0Wbc^0_g*gBYy#&NklIOby>o9GGk15-{dV{4x998$A`-bQJl#Yq4_DFR-FZ~M zK8>muCsFO}*en>nQs*{_Cyx!(#^3AmrY&C9_oT6PAg$d)X@Bk?nFV`X-Ii{7!(v=z zHUK0@tBF<@t!`G?h{^q>C=0?82};R+(hjOk779sq*qE&C2n8%bm9{Kl_U&DlBEvqd z+0qmVFhC3#Qxwd9eoOf6^YcO@$M~g5aHw>C>1Ji2w+_pn>3^ri= zvzh0FZcjq4_kRU0KmC{qlu0l!rNG>m&IwU*+QJ;PpMO+3Cve)t147Sx21|?kz|uKk zSSo@^zE(;44oelgcXOyB8BCX%kDM@3EZA^x_wMC{y=U(m%>7a=+mhTcn3>89hj~Vd zb`ThhATyzmGy5?=C&A|*guAZmxRQYQICDeXJu!&0;YnR&-U5z>jw|$$@yA2~Hb_fm z1KtHeRP*Xs*npA9{9|4I00030|G@6td;kCd21!IgR09CCJmoi%w+!(B0000t-IM+rFeHYdoyp|yt!-Cb=S5* zgG+y~YsF2|(JOWwiie|Ch`Eo42UgrQ9SOl?a%hhaZO81TV}H-HQ!A@uf7bc*>BwVp zAq)g`;qd+A!sfr%_V#-2`1W(!)Mx|P?N23Q?cfk zI#8A;DS<}NCrbwu{TF8*@KvFLbpqJ+0}=DA9Q|a;7Pi3>mH&+>xx(ST00000NkvXX Hu0mjf8004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?fhTDJ)X=LVr*I00KQpL_t(I%cYY$ zZyQGxg}*y9yR$D+q*gWzCq=3hsq_Ckcd1hZNSxT9Wm}fW6}9BfJB0w#Zqnp*w>kLE z!96m~ZwlXNX6C=t(|>mxfIoi!4J{C2LPQX)Ng+~OL&=a*1O%lug+fUgQHq~``4t6_ zVnmEk)f%6KQh#bt5L1FmFpXjHg_tz9sjyu`jPXLy4?QttVp0s-%!|zroK6z}!DU24 zV*^*~k-y*W*p8NAc#fcEX1sHxQZe4F>8g(4XQUE*a5QZT67c85?T7bVUDrHLo}4o? z^K%5Hgb*Ev{ho*WJN6F~ITzN$mMD(>{T)!SohAE3DSsK~!ZQJY4}tC26N1CG7EB9Ln(fPh!_yaX zfNp4U=X^0(&L@IP9P@X}FvXBVrcf>sa!MGhX!@4y6H;or z&496j(tm;|1J>Y9PpsA>rnj7qr;7ms`}>K-9qHF2NqJ)Qgt%}$-cVVA7+J4gvE(zm zzjjpBHytRg8HP36?V2Zd;PCklr4+WU**|{7RxP18OjGgc{h!!oz!-TZ=;={Kpq%;V z?K`fzYhJ$kk<~EL+YP7bNc5Va+YqA1`HH?XUs`uzF0;rCgJO64870EaI1+F)v7_Mm zxSPwQ=RZos*IxDnwMnvPC`}zm+f9L!!pi?3| TSXKho00000NkvXXu0mjf&4Ndi diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_10.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_10.png index f5c18a0bb8fab5d865c0dd1fbe3961e689f919bb..63be3703d1ac68f1eb07a6bf3ec5e2453a0f0fbe 100644 GIT binary patch delta 500 zcmVt*F2vVN^Bu^4q3K?Ps>*P3a#Epgw`$K$c>_kVlK<#LutBrHTX91h|M zUI4)1a0o!o=d+4ywVK6ZF$*1!M+F@<8jb$f3Wb7lMx&7c#Ncwds4M6s<@0$fm&;Zx z7A+EqSiN4iQmJIUUQhAY>!sXa1O&nX0}@)TmT1$3jucKNlc2%eJ&$!H`1cDvm#14cjtKme#z zD%S7!ZL`_PH=Ry(XC&fm%>l&V^Z5k(B>{CwrU*aA9WCPVxBwUd09G#sbaD+~Kr$@a z?Y2(hgTX)m&*xJN0u5Lr2^gv~S2CGYG6`<}4`8rfuWc=x&1#h)L~#HFqXRySI|ZB= zzc7_bi7gByB0mua#UQ&u6N4dp=e}4hbPtEa0uTcNKR-Vbg>~`s{P#7RP5ICTW33cI q9}tPimxT%spO?2AZ;$=$2jmaPUQgUp>JrcZ0000}N11knVLB!2;OQb$4o*~u(_00004XF*Lt006O%3;baP0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?n`CAr%67lz#&N00EUrL_t(I%Y~A? zuA?vzg};puqVQCR0ym+8hR*53qvdJR4;^U43hdyg@OX_}JztZiGIbBG84N-4beD5a9b$KyfB4PmV%3x&=(>bi~~ zq3how)E)MSUw>a;c<=GvvuztnDe^o|y1w7<*a-MA7={6BEn4fCEF$s0X&OWX5uvK8 zgk?5O({I9@&u5lpK}1;Bm8z<6&LvF3cv;)FQ8?!u)>@`%Vi*SId5*{^qk4Hp= z)9J+hey3>~0JPS;Uau6uITtAffN>nrS~HF#MNx3O-Qvu~7>qG!t?9asY%fTNs;anN zugTq?w&lJ5_#jw!T~~l;*|IFj^PFwlBD-~6DT)Gsd7jCvwE!&35+8zTLSb-ZV7n~K zFAetY3o+rGLn#%%y>Yzv(G$Q&17l3GYZ0OAx_{a`oPPqg>E6q7+@pQ~0000UKq&^W=TZu7<%AmSb`I=Su76`&z2L)nc@%X1wM9SSxvL|90h#8GmQFV*q>z#3OBQQP5IY zX!zVp0Mxa)UGp&x z42?}|s2Ce<));3h#U)G81F&!a_#;U}g=aMlPgFEKIg|Rc3gWr}z>c$kdJUFm-YFS< zq3+^==F43b%71kocP{k(?y8io+Fqj61#$$OnK< z{k?4jQNv!pIlb4}_78pTUTQR%vvXVRW3Pdw004AQ7Jq^8|B0B2H&rt+3+0-{00#gD zz6#KADbNSm4y26a?Ya>WR~y>~z}ix9Wh4j#8VMjun#3J5Vi>Vr^Ux{=D6{cjE4y~h znrmg(&JS9dj~gaOAA#`syL8-uJvvO;(RJgCxQ~sqi?Pr8FU@+EK5VQx@&Et;5M*US lM>0f3L>xpnFhMgmK{GixGdJyV(iH#z002ovPDHLkV1nKR_i_LL delta 473 zcmV;~0Ve*t1o8urBYyw^b5ch_0olnce*gdg1ZP1_K>z@;j|==^1poj5AY({UO#lFT zCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^ z000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2k8t92_`k@1%J-l0003tNkl~1IDX?Q=s@57rG z@XHaV0PeaE!C_PafL10-bfpb%i9L-UeFK2bMb8Jd51yHG055vht}!0(K^8>!{}w=3$BOc+YMSL%(4vUY*y9$Lc5CsKa zjUtFIEbJ{5!OF`2|Ej%AWMc@)wK#}zXOe7UvaYL;ZQJBH4mrG6DjpJx)`o5R4EPo#XvmpSCNqm?muoVy> zl~AM-g&9+rZ@^iWNy6R`Fqt5-h004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY4yFJA4yFNz+^KH>000McNliru=?fhV95;S0HGjAO0099>L_t(I%XL#p za>O7EY)SYfng4%oGAUPCYUMz{7zif{sTVEC>-CkGj;aCxNCE&N;t@BqelGx!d2@&e zNcOkzKrkL)cZZ1J=kuuq4LG0hr*bJ}$tlh1XlqH@00DrRm0$)(1d>Z@dfpgcsL%84 z_v1LWjWaU@YJYh;g8lNX)m?dJ1{JvpcHrx}wqqP8*Gnizy^0Ew36DycOo+;Z#LPev z%&ZRP;G#A)bj+`^xfz|6g+x@kKr6X0crT4q2d#{@(yitZ%;fDL7!Z+eRaGG-+llz) z_iDEu?Eb@lU2n>NiR&U|CL-dt>;Cv$vp{)&zZW$f5*(Nb@aAoLe%s+aZ@dZO)0l*>Q7N~a}hFDIe#o)Vqn1~VpHPx2;N=} zOxNBs`MX5{LE3 z$J0WT8H@>#t01SfFYH1zs*e0-aobfhA}-u7iCW_I&w)z-5N4H2(tA55Rq#=OGqd4N zGDSQE1W90+N`Hd?Dm5#3p~Z^aNwA zv@YzBAr}Q!IU;wA81ljShR8*eWCLTVo#w85@ndX?RpX;i zxlYf?JZOa$6P0IIfsz2`O#r4ERlOERaoW+%;1>dtS!feg*aSd&L;*3*#2)jjUYq!H z*@a09^vx^FW0RD;dlb{gkoM@35k>j004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmYE+YT{E+YYWr9XB6000McNliru=?fkS6EJdayMN{Y00R+8L_t(I%Y~3j zZyRM8g`b)6B{Lbv(>QTM?oH(2q-h(viGYCEAe9{~*dQTxL8Sc={S#$Tf)G`Ogpd%Z z5{dvR*^~tcgutzvSVv(aG9HgTw!e>sg#>Ik(peno)zR}Fgb?y?=N@g#f9C)5 zo+qRtgpdcBZGVO|i)bXull?4-2@@d%jmx)KsO}N!p7BCzjl=9NYClXMeWIE{Mp-8W zkhG>5Hci6T24`Lwfux$+Wa{Z>1d0NYD5c!*n2`i$ZXLhVA_xV%IbTEtDBF3$)&|G> z_h@$lbY17dqdTZFLMD@;>7L`ZZ33FaEsKfd45!Om{C`lL92BJ2HmM#xpwsr5NX(*Z z7US_LhKEL&pIIb*?L#_2hmbIE>@)T+zQa{#2VhWea&V85eZunEd(;{QlxUZ>aPhnr zSJywnwZFqK42}y~Dk~pw;qe{pMv-{&OSIS4M<|L{(MNr3Vy_ZQ5SIwO3xIR;{7y z2EOOh4Fa4>7GOYd@aLzP(NVnM6p18^iR(G2VSmZ$^(~IFp93(O7{#`0M3fkQyGbG$ zM?J~iXGn|j@Rwc8XaeWd!HQc%jS#EXw{XipGCrQb7&a)EiU79pHamo}NmeL^@IMG8r;-{r-08X4Lk^V`QrA<3IJP#c9Ea?@{fT6b7l zxqpPJD)f4N7M_1Wu~ej5t^j~gkf9Co*{?{%CXrGMHrVroTzdX3#rji9#S*hKGbpNp zg2JWgGks2OT`EqV*xcfPz%V^IR23prY8(Hga_yM7 zcI+9?%$+-zMIr?_tM5o>bw2FBGSsCV=H-9-|9Oy?_Hlg6j(@e*e*4{&dK6)boOQRK}Dek}TadG7kMFG++*=tl7UTAh( z3Z*=vP%vMWOr}@tH!T2Ss4YpnWG{+29W6=H1z&w)ky2xDX*VnQp5f%6V0yX0n4Ax~ zg3DNPTmgAUIe&C^d}3YYyiCoTb>ZV!f2X}h%*iHT*KB@#Nl?% zkG~ljkw=n(uMB~*%wxlLJ)~WOUk3)ySJXnua-Gpr6@Nsx0((u%`OLCa3($q3)0Q}* zg0Tv%4UwPIzew3^Qt~t>H#uB?h&+-Gv!z3O+sF4Dx-FMyua|^=g^H4#9Qe!=h^h{` z2b~IB#Toqz#kk;Fqk~{}xuDw&`EzLSq$JA=J~~wVHBNDbz!46uz>;L}YFv=zB?mG< z0IZUjdw-pfmlHz}_>_+2!BN2JSQGjlQPtya%Vqq|GFiB|u4J=G7-$fq!qVGo^5VSU z-7?|BU4ySAla<7E1X*6NQ`MZl$=T$F&yJy0EvR{tyXxkH^UI9T5BU1iD!-h8v4Xd= z6}}SeHx;9~BJdQCdL=L36s$KcxDI^{a;PoYCVZx*1m8b#2|UR^ji*-)2(bpF4C004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0LK9H0OKt8@&5n- z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?nt|84o6GzJE{v00MhSL_t(I%cYac zPZLoT#(y1drvsg7X>1S@4GGa;fCVJVBT^qRF~GWEB__Ht?))oUxp1osUBHg6AyE>- zD<}y<3>eVFM573GXlXm812diLqIzM$&a=AroO93pzVDn9l2S^5O#X<|mQF;J@AUa} z93Uj6loLN(zJIR^09tzjnnj+OSxHwa!H}i#Vm_o|+jCn;y^Z#M!MzIxp~;*pKTdCR zIdzHAW`n1b8yss*#Nu&^g#wnDq~zFi4mL6z(|P{pkShZ^LzZB+>Y)J`u?|L?>v1X& z=xv09EQjSPmYJmDx(H#ixp=@@`4>;_M%Y-$@p7p~DStGXb7eFLv9_#Ha%|4B2ZM1k z>tS_&d`mD@I405{YY67w=IFip8zD@DFjb;1LOe_*nVA1V#dWE;E`7Z=tEHc8&usx9 z(uoM4%_O_N4^#mOfMq7pjXK7c%SgRV6@9;wq_ro&h@B^$5Qt3vh>Ghm(imma-&2X9 zI*)z3Mt>#N~d@d7ID5t)3r)<(B1*?#A%pM@|nEq?>2jcR0w~_`XBmwSDCq>#yV0g3SkKN1+w}TGN#Z__n60nIEzQQw5iq*&=st z?y-{KvUFUJ@oA~3bQZ#-yI7_x-Q8@t$0 eD;e-V>-+~c?lq(h5%xs@0000uS5l-j=7M&9^Jt+|Omjou1)?6>l7XhVF3u(;x`;1%H5#BSq{7vqegqAkF~v zaH)9%Kpzue{Yk3;z!3*BV8kqP1VB&+hzvBU0>KVnXaHM-3ksr+ssS020qm&;vF?!( z!CD$%q6W2`YZ{akq6W2&Qzq2FQ=kUSJ8NYH@G8Vcs?|N_PZ7P5ScQLD+4~@Vro;2n l`bc{I`b=55Y8WYGK5scQgtw&`XhZ-2002ovPDHLkV1ikieS`o2 delta 758 zcmV004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0LK9H0OKt8@&5n- z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?nx66C~sN#($dt00L4;L_t(I%caxH zOVm*m!13?>-QT>NA!`&SK_PqKgxXev9tM>S7;Q``XzQkRwGCRgY~z2RxfLOTCfW)b z_JSHKD{KtM=kMO%{k?9B0YzGcXLA;Zb2xksN2GenmP3RCAc{H0Co2D)0Ys{&Y{w@m zEX}UqI1T`{w|}p}T0&ze4-B)q{DDAk5{3bx)|@?G;l1|-+tAGcqL`yt50Fx_v-uk* z3c*@>FWsW{ZXN)=^9SKL_)3w<<+%CiE>n|p`y0G`_5$B)KokNH1JZS|z9w-~$aDsy zHLb-CwAw&-m#_`pG?<>L;%~2Ef&k-dOb`$ngHZ~R&3_?;z<9f4GHHCTfv^cs4ky2ue!LdGS zYlGI(2{!BB>FU2op-`Z=(#h2198$KoKOVn#4I6Y|v?dG`HVJ9Tw<3ffGz#gu#Kc6# zVB;8XYk!^jl^>v^eS@z{Z}80yLO9qYW_x25*LAVhk|YV%*I4Nyr9^G7?HM=#W1~aO z#?WAs7=*wIhn?MZgn%dru#Q9SSP|b_CyZjIXR7-Hre~@c;! zH)~qqdmep*!+RU-8AM(ikue0ugTP?j7Dyrz<8M>!JdII`C{(!V42_?kS*&jyG^l_3 zL>$M6bQV91XvrVJkrLb#jbAkYviY{=ZByxg4H~61SMOg(brre&WP(O1&B(($#C@l@ oJaJ{ee)2dY561Tl#9`n0FEesNmUn+x8UO$Q07*qoM6N<$g6wKS-T(jq diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_6.png index cf0d9f8a0fc944540e19e0f6d8d67719f129c319..7881604a9501c1182d6d30b028c9f65f8bd5da0d 100644 GIT binary patch delta 483 zcmV<90UZAQ1^ok%B!3BTNLh0L01FZT01FZU(%pXi00056Nkl+xr1<>;jNIsueAe+sa$0)$>Kn{Yf5ik~u zg&Y(#n@s^U8VzZrTrNvjtJS2L02l#)$z&o&6h%rRdB5K)5ztnvr95Ijjz(~RN~L0( z%|=Be(Y;oyS%0xul&;t7iUa6-D-;Sp0H@>g(tWqvsQ_UYi~tzmzMF&rXCw%HUmyU! zTr|FaKu)Y3-0%0q;I$RI-3q)#-F3zC-{x8{K$uXm&u% zcLo4C!TEenX7@YuWa$i5AAzO9z!wNxjX(zsKMmBOOI*_b6`)PAkJ<0{e*koI2L8&h zN%kUVg3M+!X@E2W4E)331eqi*L*jfsx6x>%4>lf;CEiE?%m!`F_b)sw68vxYr$W0A Z{ROdBVjGPpK|lZi002ovPDHLkV1gQW;b#B< delta 741 zcmV004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?n+}6$H%#2Y(3w00KctL_t(I%Z-xX zPf}q3h9B|Zf&(5c1tKH{DbBPyfVm)YT|ov4o=RB1zr2 zJ#N0|@&K%Ucz?@SU<`mlu>`>S`X_`-gI;=URu&c)iG+hhBIBep8O$aV#Zn2;c!p?n z8PV8*9PpFQWbhnx7HcoU`q~y9}1J3d)v zH5O~>BNDvM%A5B9wBMPTc^D4epi!^lbh=QKT}DQ(AQ}zm+8g}(S)p04BFld2`xTlr zNN2O?^?&VzgCPWqwU>p(XLRVB%+Ag+;O+mj0kerzDveJbJz(xX;Yx_d;{Xf~`~Hjh zcqgP%UjXp?1I$03Z^`^F7SouIM+k?4IGj$FmY(91WkjQa@?M3Z%R{_=^@2XfMeWZ; zqXDr~BA3mQ*-m12xDhV&IWUPvCMKseu5c(w&tAE+$i4tlXD5oPQmIr}S$RpVTITND zJ|$ujYc4RkskjYdN|0S3L^Bm4Lb X``Kg#@QhAF00000NkvXXu0mjfmf}a? diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_7.png index f42fa9be18f63a35e7e951e6dd36e16562646b66..67f7e3e06f51a4e818538a0e01a891bd895a4269 100644 GIT binary patch delta 463 zcmV;=0Wki(2I&KkB!3BTNLh0L01FZT01FZU(%pXi0004-Nklm&>K+X0w@pU$0lYTrRfX?|ni5qv!MKNHme4=yW>SLmgl+0(BXJIdNbc#4D|@{;Cwh7LV;+A0zh0qBbQK%m`(vP zIFx1SMiULw>3`H4pvReJ|7=V zyCz1SGaf?=JOHfNMFc?H;0|A{m5oRjJh9vD=4%ZTFcM8t|Np)*fZ>kF5C)oK;qg}^kSfSdxO=q2h#Jr-iztQ==30f0_{0!X8%NexUQ5YZy03Bnp_M13Za z(o!BHj`H%v@cfNV0Tgzto%1|-1H1=}Ga6yk=<7T1V9N`|jB@}0002ovPDHLk FV1jU9)+PV| delta 806 zcmV+>1KIrP1HA^2B!2;OQb$4o*~u(_00004XF*Lt006O%3;baP0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?n-1F)NjPWq+>#00MzYL_t(I%UzPs zPV!6?#(y)@&VUqJAcTaFn7H&NTzauy$$J4Vh$}^!D3%s!DQ%}S@4`=#_j@+yY|hE^ zPdq(6d8HI}T{D?X==+}WcuZZ_bX|wFmeFWLmSsdygfWJysxZdz`ua)`1Od;_&j=xK z&f%OR2m+*(G=EKlQi}O}PL^d@Ygw|C0c9BvZStS z0NS>_&M1m#+ZJmrVHlDm3G#3_a6BFf!w?|^d7jgC9eJK#_pa;c`<^sS5ke4#A=cU- znObXRv)NU9p6CD2zEb_q59b`;-`^xj!f-ew5JE7SOt`tZVY}V(@bGY@{O8Xf9v>fR zn&x__wSQ(lp965YTnLf&6h-lmCyT`br4+`PAMbuMKb=lE z=V;rO;c$pC2Bj3gE&YWMf~IN6^BiLgQfrO(o;Z$CN)g8~bzO70T=3o#h9Se@kg_Z( z%Mz_MQ50SK5tL;~nx@>{-Jz6Xy6F1>K;QSgy}eOY6+z$kIOh;TptYu|DzYp? zDaCX;Wjr2Zt)=Tay!RAEfiZ@`V8CE7AlPg+e13k?wk>Iz^7~LJ#qoH=T1(S3#Bq%G ko*(o1jMkdI@3GeM7moON(8D6FYXATM07*qoM6N<$f<=XF4*&oF diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_8.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/decorative_block_8.png index 15714e71924377c0632c5d8aaa164bb2be09188d..3135557310c1a66cfc416dc629841f9df8405b10 100644 GIT binary patch delta 414 zcmV;P0b%~K2Dk%|B!3BTNLh0L01FZT01FZU(%pXi0004MNkl#{TnG%U z4&ed;WEg=e=kwV`bFWq_uYjfqZ4(C=d;sv(!S#CewWvDI(P(7j@z}bqbMi=v<2eV9 z$HNV@MFkPGUVpD`GMTv0CCqC)Z7s{PevO(n&aY#kIsoDTpGeR1{QpDx4Wz4Bgl@1; zr_;YXh{_KR(5gh!?QN59>2?&=h!%8vp004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?n-AIXKcs>3>8300MSNL_t(I%Te(x zDRIt`Wf>s^(lo_6$2g97@0m`glx0bprWj*r+ZJOC+wB&ul;ZXE6(Iy61VRWXrBF)I z_dQA}mdhn&S${H)BX@UqjN?dERlL8yqXE|IHO@JjrlGEDq?F`&PEiy99FIo;lv3>X zdyFxZWeI?G&avC=5JF(BWwlx%rQ~!v5o1J3iBbxH5CUD-VT_?D3aY9?CP{)Z1|bA} z-;*Q>lgR{YEip!f5OiG!K%VE^-rmypJ;N{{r9>|l3xE2)zXYvu&av5SNRs3VczAf= zbUIPjHRto07$aJ1@;paYRYhIbXswY_B80#g!+bs`&vWMUInU3}BuRqz{#xX{r>ZJ+ zk|Zn^i)&k&ri2jq_x|$Vtiv#n=Q)$f1TBOh%QB|ZDaYfHx~>sI{0|_6AkT9Ej4=$u z06^dO=zka^P19Vz?!D*n@sX#erz;@FNL5wD7-`!UYc1B=3qVRqQ50;qTPBkU08P`d z*=$fsvD@v4F_L8&Wm&RXtvH|0IOj0Npp7wv5XkfV+VH2V_ntIO8HRxvBkT2=<#I{a zbu>+L5$SX~@%8n^{r&w_-4FuH<&tq62_Yb*De?X-abzL)#Bj@v(`Fu`{5$D`hD(^l2 Z0Ti5JZjSNMyVpjnqJjm*3hJ?Ac@xBj1w|0SKbgxH$>Av6hp;U>nVIam)9EDl`&~AhjdZ(RIiJru zzuj&+9u5b2JRWkrUS&KU>%OfAgMm0MSF2TNx7(6PBxJYS$$w}xQZQn%SorgDxvUp0 zKNJdydp@7KAc2h_K(pD@U`?dcX*nK`em(^qG?;Li(Smh0o0Ui;@)fh$OwXgy=!e06 zzgMjU3B_Vj^7*`!N+o}+)oOm=39{DfwdOkvF`6K^S}j?vR?_eHrPJvsRa+Md1@(aZ z;c)n2VD6hHDu3FVi#8{a1Oos7RDjFn;u{7f0L(nw_dHML^SMg0f|JSQVcMik)Pr0ur<6d&ZKN=!QYr0uCXSj?hJ03emhmXE2919Wm3L^gll me=HVLZ^GfQ)a&)HfAa_1lVxcGW@;D!0000004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY3ljhU3ljkVnw%H_000McNliru=?n=BBqV{BzJGE600NsyL_t(I%RQ3I zZrfHAMb~|hmnLPBjubR#jb>mZ{}6v_^GE5(v!FoSL5;|YZHbm>zV7365F_I~*c)qY z_4)H(qP1q4X3o!7#F$vEDyC_|drypsvOME(=qSrGoXZ%7i9FA_yW3)|HGKX04@xOS zAf<#c2CX&AvVUNV;o_p@aOm(p@cSRX5ksKs4&2_}Vnq~h-)l%Qkr#(t3jM3b0AIS5Z{r(7O>@-b$|Gq=1h$|fHb&J-DzMl~hl+qYu07xk^jw8-l z+P0zV_Sihna4si=z&u5M{J2MJjrReOgw~o6BGwwL&42jt;UkAb_nH}O+qO*8jMfTk zEg?qgvZ8I>uLUV3K)AlX=F6AA5fQS?Qr9)M>pD)S6YKRFZ4wHhEDJW94ImW78Qv$B zWyV^IF&d>HghbbM*euIv+ZGTM7HczN6herkl!)<#7}Kj2&pa=9A84AIqA0LRDORf$ zW$Ac&I)C832L;10QI-WFkmnBPawdDF1?1rX+W#)>5RzGoO-NJ$U@tu#g9NC~u7 zEX#rq9uXLZ8Rr~%?wIEpt+k?Q8cwGdV)THJQlKabs_Kk!9GRvWNkU2ytu^z!@ci77 z=h;twgP|VW#g-0NB1C+3g;9|Nc*=DR6al z#m&tPZQBw;B*veu$K&zWAGFrId$(b`{STYxjbgQi7{`e$v&5K)LHHkP{(vGu2XRaQ0000< KMNUMnLSTZ8Cw8C! diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/drum.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/drum.png index e480a5a97b59f86a1ce2d84afcadd48f6ef5a6e9..6a84f05ed1fdfb988e1788edde28b2eb70660ac6 100644 GIT binary patch delta 60 zcmey)^p$CX1Scai0|SGqZLZQrMO{X9Ax{^_5DwYol!OExUR5ze0|tf%FF0c}1A>y>hDcmaPH13sQxITiYD_%9z`%N*d1vs_ RJ7PeE44$rjF6*2UngC?t6FUF^ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass.png index d1f09f3ed1813d3c5a56d2c2e230797cbe70bc2c..92e8be15916f82a645afc1a95633280f05b4b2c5 100644 GIT binary patch delta 195 zcmV;!06hP8-~o^%e+h6%S#tmY3labT3lag+-G2N4005FnL_t(I%dJz}4S+BRWdC(s zz$yH34u7k*>5+qiiB*%PytzXvrIeG;dc<<(7ZqN9C?uS`Y`b=-`hB<4<>sp~94`oF zhu1ToQc$ILMMoqsB93i^C~=qrD0#a<&54eGguoOu6#RrEJv5;$gZ@+$v-p=nMkPWM x4srT7ep#ep2GgrN`!dP8QN?H7w~%A;2FNC*G`002ovPDHLkV1iTxQk(z) delta 88 zcmV-e0H^=p0d|liQUP;PM?wIu&K&6g001yaL_t(IjboIOlKRg81<#&6V`Lx#AnQTp ukO-utr2aFJt9cZRf69yPL7y6^Jpcdq!9>S=ep=I&AN+d&RI(-&qr_o95Ha@ zAQzg~fMV|s5zQ=U@)}riX-~)O6Q@R4s!j6Ay*M?(QhlP_e@@sMz`X%A(kqqX+F(t( zTdTB{9X8=fo_@4we&b1_w;CGqa2)G$jI= wIcirKW_Y{tN|-iSu?5VTvU1W)jg#jXI-F@J7JL_t(IjqQ`M4Z|=D1W6-Pd=qc*bNs}dgB!?`FomN)ND~Qh z>8se>u^}Bm*&C8JLuP*F$0$dH&jch@k2ruLX-8{Qa_714m6^7!Y#xaSCu!TN_{|-- t17;VTvH>UnC8>UECz7gr{_i`#0F1{jpU5An-T(jq07*qoL diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass_inverted.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/ethereal_glass_inverted.png index 7277d0799c761821638ce8e8a08e3054ce8d45dd..d279b3538ef0076dc32e5202f78a431960c626b5 100644 GIT binary patch delta 75 zcmeBUESq5HYT)VO7-G?z9I-v`ZoR~{OP7)q*py! fgU?J$Z%Q(B^l!NPnlEG;0}yz+`njxgN@xNAZaN*h delta 99 zcmXTxW1L_Z>*49*7-G?z9J4*|ZatgEij^x9QxurCY}s<)tHHYH?eFY2N^O)p;?n1q za$v>MrLGehMRq4#X$WMN0D>74jM-K;SXDM&dc(uuWG{85qGr`n1|aZs^>bP0l+XkK DInF3a diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/floating_block.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/floating_block.png index 209caf8976997e3d648f22a2f28ce9ffd68a4d73..2181c83ff9d2a7ecd3a45f9ac93de42863968442 100644 GIT binary patch delta 700 zcmV;t0z>_Q0^kLZFnk*hm9p+{PzrKV~U7@uUhq;qPbuW#>Z+}xb`ksSHbuE?E6fVqJ z{4ww0-P=jz^FbtH9!$iBX!RjxxN&!SPWFXIQK_l_&Jv~?0>ulJZNik;AZ3@2D~cVZXfJ+53~v_Mt} z|BJAzf5}`k*sIZ)`%qcsDQu@38E}6CS44*WItAvvLS|8Jg*oP?&H~eNaJl-ZxJSly zY2E4ci!kpQiV~1B=fs@K@;D3RkWPEi-fpGL0+%!Al_!zXW<{La;SlxEEzI54u)oAD zl(TdL3x8OAnwRt~7f!ew{f*n$27TmCBM)ngld*2RDEM*kF~|ZLoE*+zVLp!BluiYM zXl?Ci64*hY-)P>*NwWTOVF>3tVeG#jW`QJ5t2z1~vLcenSU*ub+9OHFY2G*DV=}gE zLc^X4xjN70rTi!ze0000ST6ht2uJ5W$rl$2CNX=ssGiMx!EhFL5o zKx{yXT&2hqP(+CwVjKB7`|kfcf9q#W+igWDsbozG=E+c$5)ms_y+-xg%U!Mt0FmnK zqLMWtM7qwQ6hOEEfEfqOI7Cx;8~7YUDS`=H=U9sDc7JR!hf*_x{CJ^y9dz_@;wU)7 zQS�*n554w?WDbT698G$cH3t$QnA|Qy^X6~l8fib@OoNyXWBf+ TROFZ)00000NkvXXu0mjf|G;8w diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator.png index e99765f153d54ad15e597bd7f7bd38e9c38b6a60..ca73f3b651cf821016ec5e9f3a2f1dafa78bb61a 100644 GIT binary patch delta 86 zcmdnY*uXf!(BI0_#W6%&JF!HKY&zh4UtK!+L!oqN>)^5ej6=ggOK;Y@>=d#Wzp$PyaTOGpy delta 138 zcmV;50CoR>0kZ*+F@J4IL_t(2kz{{RV|~x?_B$LQYsR7hsu~$!=%Kx*DbtYkTaZDR6GdK_6D^?7ZGh^5 sA7ZoN1DY?$<6yjlMTI$A~fB%Fh0}yz+`njxgN@xNA D#MdEZ delta 217 zcmV;~04D!{0rdfpB!8+&L_t(|0nCrF4Z=VW1Xq>_2oW(5x)?+Y6hIZOf&yp(Q4Apk zAVLBHxLtwuy1y6lJF%sa{d>0~f3se-?=dv6=XSoL2CG5>esq@;hQJQ#1w7PH6dY#{ zq?F{LfJNM&NKqD8GJzIZ_RE%O=JHJ7=6{b96dYa)U^&l!-BL2m+$6k$7Of!B_pQv8 zc?<;{u#mzmq9}-#qpTNn+dYQxlS#1IwWxuT4*&oF|Nl5Sg8Bde00v1!K~w_(r%H%1 TxmQrV00000NkvXXu0mjfeot9R diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator_plusplus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/ender_generator_plusplus.png index 34f32466f0e4e661c2751954605c275c59666d2c..e6891b724b9affdcd3b52642aeff00648fb19b5b 100644 GIT binary patch delta 97 zcmeywSU*7}+Rf9&F~p)bdBWt-|Nfk548s5aPi_t5S&<*>BD8ET0EGYA0i^+uF?3%^L_t(2kzMLKWgtS< zgHHoQHL)5XN;$ariP8W!np4+ATkt00000NkvXXu0mjfB0f%k diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/food_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/food_generator_plus.png index 4c02bc70e29c8fa8045e875bb22ea1d5c0cd4229..f29a1507263f3750756aef71a3a33ab6a599c9ae 100644 GIT binary patch delta 140 zcmV;70CWGF0;mCyB!6#7L_t(Ijbo6LRsT;3W&jcYFEEgWQ4FYWT|^Ql*?_o}lK(xU zRmd}7p@uRTBO5}r0Wi&E835DB!NpIy0mwF!>;i0>i8cUP1I+0}8vs&3jO{oL04V?| u#D>44D8ZS8 z7R18|%AjPKpgoFE1xh{u00960f>nF<00006NklC|2?Bs z$TMJ}hB6o<8$z@JFwJBc0Mp39#ZS5c$TpMg0&JRzHUL=z%;`iM08&7V?KlkpDF7+N thLJVn^#VvCHcW9!BxnFdnTZk%0KmOF#m$dO%K!iX07*qoLfjxm zdjoeb-~q%<$f~QZ+E++On!nN3z(?Br?|lT4sKNOC4+)B;^%ZR>swf5gNcTCKzz(qj z{=~SA);M2wLF6aFFwZbgJLoT-f#j=zWkgm~V9G1~s8!SoOm>;ggX(b;5e05pY&nO4 zz%9qFZXBL~Ph|$&-K(Fn7w*R{X45T47EizcgA$xo%d~g`1{jp!jD;$mfI|i)IFqn~ zY_miYjI0zWH9;FF`2YX_|Nm)!1R($b00v1!K~w_(JkFvqT0u!{00000NkvXXu0mjf DWeIB{ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator.png index de5c92e22c4fa0079d84c79f5cd00b9282cee7f2..982552c519a2a39cc923d4d76cecc3a09da1ba70 100644 GIT binary patch delta 20 ccmcb^^pkOdA!Fu5qg<91`4I~yvoVGN08z#VHvj+t delta 142 zcmey#c!z0%A>)LJM!EHSPZVeg>HEt$SLjwOwVQG%e&w|(7enO3Lft)XJBA3C<*clX82DUICXx0EKskVr;B5V#MI;jH)ftQG8zoq8&+tnnz-8z E0HnxOZU6uP diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/furnace_generator_plus.png index b1ba0f85dcc4d1a846f2451c1c1daa61cc8a3c87..ee81c0bac49a04e78e325244066a801d98a420b2 100644 GIT binary patch delta 125 zcmeBRn#DLlr7Y3Y#WBR9H+jP3(Et9NX$*q@^$jMp2J)=Pk984JJJrx?W|rVHjnUxj z4xWSA47<{D+5}P$%wvf+P&>(xB7Kq9!K`HgNH)fC3S)LzW#h*K5)Ne&0jg3by-taw bs(BeOd}?y}Zx>YH!~g`Iu6{1-oD!M3z1uS5?nh20Bl0UFsLXg`f0xp7nS!HK-8dJcf@9rl+wrCYt zB|SF<@5e{R=aGY~OFAcl=lT%#6u}Sl&d(A73ohnh7ZU{4W-ndvA}3gEOX&lW8UO(Q m{{m|Rh5!Hn21!IgR09BbdyX-*lhIQE0000u|4(iWmsCfs-e})EWu|Qqrur7 zJO{HGcBSRC38WsF#}aR#c9J1Q`XaA`S<3>DY>eX+#_Y1n#*YUi9LgjDRHaUOof1h^ b^DgTe~DWM4fq_r<0 delta 236 zcmVeG^6}*C1 zu@H*|YrTNzzCgl|WES=Z9(IG1sPVNSTGi(`mIZ}No6q5u6k(-;K5uI)Z?Xp6bS-p@J`lT#UdjP0BYq#D*q zPFG~%Ex7fcsmIfZ;ig*&^9A06*&x|)0h0$$rtVL$F<_e@%NEk<_Uk#TmjOdWN2E8C SG*c4;5O})!xvX0nh=EF@K6lL_t(IjboIPRsYXG0bpTZU|>khs3uGE{28qbOqAHpz`%gt zfE6s-3@cc)$uj_1BR)g08h}j$E<^BoLE223LE20jpAt+1@HrQo98MP?+l`P0m&DUkPZ=uB5Nx7d5b@_KiXq6Fk>&8Z03e$}qFq2LV5BrV0{|Mb VAuHg3E+PN`002ovPDHLkV1jI^M2r9c diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/high_temperature_furnace_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/high_temperature_furnace_generator_plus.png index 4c9d522a4e1b984b995ea772e144bb457393b9d8..2d70f8e4329609b036a923ec6b37f74bdf3b4a4c 100644 GIT binary patch delta 125 zcmV-@0D}LB0-6DkBz9p*L_t(Ijbo6LRsT;3W&jcYFEEgWQ4FYWT|^Ql$^iAwvtUe? z0Wi(D48dyvx@K&K5M_YV{uf|Ok^#szq8os02tfm2nsK>;C<9Jj`3uGaV*uGkgE?WJadLOQ00000NkvXXu0mjf;Q%jP delta 236 zcmVoPej$Q5!kQ@{eMeI-D)NdCZj2|;d`2)GFPWo4b&X-ol^u4O4ewip#y zB|SFhb*Ez_#q;n!T{oY|u5&S^!{45c$;9?GTF+tEA&N2lra)Rx#mN_8l0RRC1 m|MuRlR{#J221!IgR09BXc8)Rjo&C4~0000>kmkGEC`emKjX<|$Pm+o~fK(-haSS39- z1>LKYQ{Q{Yx}YRoQg|)Ahlmw@m)aZyeE7wRp=n~7)I4n5JPlUI? l^@Q6Z&c0uX8NVAd?3diMSL$Z~0#8>zmvv4FO#p+s8^Hho delta 112 zcmV-$0FVEDn*oq9YE?-@K~yM_W0aFsXCMWzFfcGAW>gcYdj5=7CX$SY+JFX%K9#`P zeSAGQHNe$v*vN|z^e;iviO>L7cQ3XcA-K2^%8JFX0a+a$!BIa94nHuGn!Ew<_&80T S@+4IN0000zopr0J@VR A<^TWy delta 240 zcmVsS~!cY)I7w?v!9#f21f+<40n_4`1RK#LDDAZOA_u1CQOmyE9B?%SHA1hgr1W>w1qVw9@Dd)HJta{DL&1H_(IZ-uocju}=mR zoGZpB_DWli|)LU4qr7iYdtC q3jhHB|C`fi8vp delta 240 zcmVr%;!cYuEt@MmQT39M#2Sh~^(Xa>$z%)=Gij2Sl zkc)KDbCh2YB0bsP_MI+Oz21EOp^Eoj?YI9YZBm*59Mpo~+YSBQ4 zhDYi>SJm631Rkm?D$#6?WI%zU67Fb}3@A`k!riRF>Da{X{v6SpOm{XJ64doJmLQWa q00030{|^&x+5i9m21!IgR09Bt*7Px)j8HHD0000o delta 152 zcmV;J0B8S=0l@)~F@JkWL_t(IjboIPRsYXG0bpTZU|>khs3uGE{28qbOqAHpz`!ur z4N%%Xi$Q7oEboVU z41j6IWe8CQ>`CwiW0DO(){M&#q77KH%Zq#iK$^)ifGUAV|Aa(QW}*ZG09-s(7|!Vh Q%>V!Z07*qoM6N<$g6Wb%7 delta 221 zcmV<303!d30r>%tB!8|+L_t(|0kn?63Bo`SML+4lv#20KY7wyk4<4-}ScXSi5V00P z1P`7S!J}y2f?tNEj^l;Shl}pZ zTY$`rLLFDY5(Nu0kEp;~_GXo!n9S9Nw=4(-(_ASac>w?b|Nr`rSlIvo00v1!K~w_( X$PtDyBzRjl00000NkvXXu0mjfP@81P diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/low_temperature_furnace_generator_plusplus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/low_temperature_furnace_generator_plusplus.png index 8fc64819c2ba8700f19a36b5a70701ca46245298..45cf7ba87ccf993e17a16b711823d49293a46995 100644 GIT binary patch delta 109 zcmV-z0FwXt0g3^TBxX@bL_t(Ijbo6LRsT;3W&jia|C5DL45)8iL=qk%1}wC(0b{ZZ zfN92M2vG*?N$>?@k_|xCjLQ(B4Op|wi+lq>n#nSNDuGD%tB!8|+L_t(|0kn=W3c^4TML)TLwU|N#y^2>5Y(0dHXyGAjJ%m@W z5Q~7dB3O#%Ef|J48_7x*9{e5Vzuhb!j9>qdsXRq-R0?HPK|ok-_i6(js03V6=vFX1 z>;z3ei~hhCZLZ6r0v7wDo`4*~74V`hl9_oDS6~-!v!}g&*ZW+_{f4F&nHR&$r}Iw|Nkmai!uNJ00v1!K~w_( XG|GlCX%r~=00000NkvXXu0mjf9|l?` diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/nether_star_generator.png index a6f456ed70bae61d68bc517384ef25e4ba31d265..07174e4a6af52301070afc50e70b065f4071f0c2 100644 GIT binary patch delta 131 zcmV-}0DS-Q0j&X$F??r9L_t(2kzkK{MpnIO{w^Rw_76e>no_uGID+WGsR2zj77fTw!c>aINywhYG?;L( lVpUB&4J0QG!ikS01OVQ}hzevF{h$B<002ovPDHLkV1jy-Fwp=2 delta 201 zcmV;)05<=v0rCNmF@LN{L_t(2kzU#B!6;AL_t(Ijbo6LRsT;3W&jcYFEEgWQ4FYWU4((JT)Gd&*yIQr z0MfW?`)M%7W(aK!K-P@Q5Ud8k{EV)7(fnOtj2tEy24K^OtQi@D)DmR?HqAHG}Ffbl9Mt;nTZk%0Q8uTZ2&ZpU;qFB00>D%PDHLkV1nAqIkEr% delta 280 zcmV+z0q6d!0kZ;-B!B2hL_t(|0i=yF3c^qjM3Q;83p=enfmqslmYl`bGI#=O z?JUGXER+<2H&F8e`)efttR}l?A-W>mFog=UV@T0!%v+(2)kfCE8L z17X*c0AAmP0$=D~!@Acw6l{{6wL7gG3{~ODbZCGV4}<~)2cQV8c#ym93k80_M8GvO zJJJFsr5J2P3vIOa2$q&!#71nqh^3`R zu+~Nk!A1lnh2Rl1FR-6UNEBk=k)7R{`L(Fkeg8wvlJ9mqTNRS1r3DO&)!Oo$j#q>H z9!&;90YaHh#`d^BQ<(Lpb7_H^zRiUNyvXYwWM=1D|Cs_zKz~3@as0Bw{$kufZ=rw# zK~Mu>*OUNW--QBS=wHLS*EtkywmWMy>nRwD!oyL=052X01qcp65nAyecim?S{D6so zYi4$?^dHRF4L4J?+!n7cYdR7HWJ^%m!|Np_Hp2q+H g00v1!K~w_(rV|~kF`4l0O8@`>07*qoM6N<$g1`iQq5uE@ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/pink_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/pink_generator.png index a9bc86cfff23a38aa42edcda78b69287295523f0..f7bd399e9ef09530e7d9db5ff6070001861c5522 100644 GIT binary patch delta 119 zcmV--0Eqw50igkqF>qT+L_t(2kz*b2t>##&_qx)03{B^ zuLL5v3QQ4%2Dltt1*Ql-4VZ{x4fyq7@dG&;aOuGrtXTD+MGN+r#teSKNdq&=DN9Qv ZAprk!a@^&YJUsva002ovPDHLkV1guuEF}N{ delta 168 zcmV;Z09XH^0nq`FF@K9mL_t(2kz+v4;imc!1|g;__ISXm6apAYP2K=V WA3(}tkX`=(0000Mog3*Z25cIS` rFeTzj6GR(;FI8eSfTGMq2?hX4X?j1C*v`=a0000-A1wiva^AfqhLLe<@9_ZRnb1q0m`8q`D)qVP9K^<quFRbn-OqRd1I1^`VIgUj0R^qT+x002ovPDHLkU;%=805wJc delta 259 zcmV+e0sQ`?0iObpB!ARNL_t(|0i?|_&H+&r#qk>(_?oXZEm2Tei^>Y@KqDF(QCW*h zr&epM06)oldGibjCi&-`d+xbsdQE?D{e@oKztia$-*7*TM**?gY~vH$AQu=g`K-Yenb3ro7*C9%;)_iXZ>TuVb3wD=7{7;8n znU*Ibo6KC0j8ETIfo6YrRbnSo?pp;G0)li2&#v_7rvj#+0~$1suIVfga^Mg&uZvu; zUe2Rtv=|3!-<--G1x+)IZ%}dr00960R)LJMrBDAx)n?9rW}f2d2PzYP(6hTH@#U|)+c7?U0UDs;NZG~$2-dz z7#Ivng8YIR{*wkyou3~I)N3O%X|_;o1{Ry!21#t a28NlvoXXQzs6GR#X7F_Nb6Mw<&;$U%lU+gp diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/potion_generator_plus.png index 5a47319bacf9bb6200f71d4a1584972210271c77..4236e29cbeaa29b53678327096c9dcd3100b37c7 100644 GIT binary patch delta 118 zcmV-+0Ez#T0+RudByU(PU75EFkYE{7RPX|NUZ*~T1dT^R760k@hT&Bk?>_-B- zP~B=8&`aDsBSls;IQ x5lj}jq=4iD00960=4H#_00006Nkl~8N&=C$^eSP09RU|eM+P#Gf{#8 XKKnVfv7PV;00000NkvXXu0mjfKPoS% delta 247 zcmV$-T4+80O&$yjMxcyux||FtB`C(~vKnY2$`za@n>Dn>wYINhZWWWWhHq@W6J zmr^ve52%9GwlKTZ^&!B)_NaYSfxqytRt5b2d^DExW@n(Lr*O$40gD8}WqQoQek8C9 z<+HM7=liFiSgc*JOBM;Z?N{@0VG3mQm~r-r1Poau;6smDh$>)-fDb(lCphkx(g!Ou xf;^u|3P`>H00960fB-ST00006NklqT+L_t(2kzH1sJd0uiwqAgZzI!J+|K zHKrbP4RA#ZHI%XHLD7I|Hl`k&8jx*(u+cT(Hy&;Yx&}0-qlr*v1D+tl>1jOnP@I-X ZLI6LB3^YbFk%s^P002ovPDHLkV1l3QEbRaQ delta 156 zcmV;N0Av550mT83F@JwaL_t(2kzKqMw6a7H6VnTZk%08si9mp4Y-jsO4v07*qoM6N<$g7wTWQ~&?~ delta 245 zcmVcbg_Ml<`3dAr} zhyf@lX@GZ;@;Ezor2I%HJ==GmEu~n@%kLN!lD@~~CPS2>QUma)t|#duWS|T{VKqJO z1+smvLjVW)&0)MJ%Q{M%| n!~nrSBqk7gv2o$N}00000NkvXXu0mjf991v% delta 240 zcmVKDNC*sx!sjWDsd0PG;z$YEp(pgA7|I<>9*6Fd;YP!C9HFLMOI q7XSeN|D+T@m;e9(21!IgR09AS7m_i827$r=0000-@@mSje&0_F$^>bP0 Hl+XkKX)LJMg{d+Li+x4&K0^9OYNo{ieGtc%EeGUg$g&lSy|R6X6Id6-}B($ zx`M|$%NZCL3`&Chf*Jmk22P!y9}Cp$Wq($joF2uUp7-Hv4qq(=UHwyx6-q1O#_U9zFmx Oj=|H_&t;ucLK6VghHP2@ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/solar_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/solar_generator_plus.png index 6482e4fe5e0bbe0099ec956a4c8db07e53ee3a4e..03dd263781494d102634090a8a09b47a06cfb4eb 100644 GIT binary patch delta 113 zcmeyz*vB|QB`eg^#WBR9H~B|><3oGZ8H_Ghw(BWzFP7MlHeFmo_)^OnzQYVDt=0Y_ z3ld744R{VLmz=F=!FymSkdj~%xYUz(qQIo#k;4)VDNR2Q5%ttABVknu2Cu2dmKTXg QC@=tlr>mdKI;Vst0B~9-lK=n! delta 226 zcmV<803H910saAyB!9C>L_t(|0nCyy3WG2dh9BOiOQCC*j=eyqp2f3t>IFJ>aTP@H zK$qP-MK?4}4P85K!m0ObqRR8Ph2~uZvgjCSP zTrULZ?aGN-Q#SnU+Bme`OsU0g!=Qp*~?!we~{)&3$2 z5=xv6cn&O=oULfVdtfP$l3)|K)RT9jz@*`k!x9ZCO+OD2_0%pSVO0qR%byolulnsK P#Q+4Ju6{1-oD!ML_t(|0nC!I4TCTcMNjOLCQ{loSt3mqNfV{XB5ATj8d@Y8 z1~Pt@FyF=k0S!nG?7QcWEx9u1+#V|P&+GHGE%>Dt0vMbwKLf^d;K1O-0191m=M%Wz zT2n&Nztr*5aR=I9Ax%YV>Lxp2fr`wPQZET82^zpScai{vwObr4p#Gm1Pmnv4Bjkc6 zmU=NjZ&yjwnz}K7KWT#n3Vl$Ac?{ro0mV6RU~odf`}wdf5Yhtx0RR8=9)8sT000I_ cL_t&o03XJW@m-sMTL1t607*qoM6N<$f-8DmO#lD@ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator.png index 47ee1c0a20af353eca0f3596b393f0bf3ab9feb7..19ee2fd48a0c7639ee9adbdf425efcbf65beece2 100644 GIT binary patch delta 81 zcmbQmSTn)U+sxC&F+^ix@`TBu>YRoQg|)Ahlmwj)JMpGAal{_}x%zqohf@1g-;HdO l=9;`}cYMHpNl4z4gJJz!%?k0>%jyh3;OXk;vd$@?2>`ho9b5na delta 111 zcmV-#0FeKDngNh8X;eu>K~yM_W0aFsXCMWzFfcGAW>gcYdj5=776?meaU((1_hRcA z7#Nt~e7&`s_1132&qmQeBw&HFE(QA%WRqjVs2_*{B>MrX0g_IL0gR+3Zvf-OF{gBy RJjwt7002ovPDHLkV1nFZEg=8^ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator_plus.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/generators/tnt_generator_plus.png index 44204519be1cb6bdfdefd263199d57f8903e663b..684e5c9acfcd99ccf0478f117646df0091b5635d 100644 GIT binary patch delta 83 zcmaFQSU5q&*TU1qF~p)bdBWt-|Nfk541)jl4JNb(@%h;|*AGZ6HCbYSi|%*W`S_K9HN3ZSOm)HF$QGFkRd~EBtaW1 z|0H;xhd>j^=yiJ%7^))RSAaU%~t8>*7O@O0D-5gpUXO@geCxLA0L$f delta 210 zcmV;@04@J;?*Wh`f22u7K~#7Fq|Y%5!cY)J(ZPL~N>CejV&wu{n+vdVCpKDGWh0ss z_<<>YF)?t-dk_AF*$mtL_a8PfedG9!HB3)q76`ZFE-H9~MWCGSkAMsrGGxe&Bxqyh zp9Ig#InV?$dflD`hAK(mJ~WApUbiQKp-K|C7fm9g*X>DQOsJ9s?nRTx=yiJ%7^)SYoPS_ldOrJ&hO^i6_`ez~xWUc*zUkp3)_|mjhq34H{b9G{KE|fmaPdWs b1RDcOeei`ZvsD%Wjb-q3^>bP0l+XkKYKkzl delta 93 zcmV-j0HXhy0eg@nR{?WUM?wIu&K&6g001>fL_t(Ijbr@x@85q0GQpwm3=9mE7_j-; z?f*>VYKDPP14a!PH2?w_4}AUi|MSDUWE%hgo*5I4nz?^800000NkvXXu0mjf-&!Q) diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_1.png index 02ed9847d7910be3245bef39b713978bd227e2cc..dd79eb741c306f59bc0c6cb8fd025b109c4c41a4 100644 GIT binary patch delta 187 zcmV;s07U<<0oMVLB!3BTNLh0L01FZT01FZU(%pXi0001qNkl;;NlK#BnPP?p002ovPDHLkV1jR{MVtTt delta 147 zcmV;E0Brx)0j~j&B!2;OQb$4nuFf3k0001KNklunpsLb#&opm}0U1ePGo%=R!2~G=wsnyk z@JACc0l-t`cRfF;0gUtAKheC#`6~NS>d@s&C)4~fxbG5*RSWCES diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_10.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_10.png index 3aecddf3aaff544b078b9938a8132d1f58b0de0d..46fa5c0cb5c8b48188c3f33be5238ab32eaaeaa4 100644 GIT binary patch delta 163 zcmV;U09^l~0lxu|B!3BTNLh0L01FZT01FZU(%pXi0001SNkl2t%`m zb7X)l;35v=%;{I3(3av~F9byJT%Q2oq2SDPRe7}~ndC{5oS6pTs@iO--famH@fv)DoJx@N86ar~ko*iF`76MJ_lF6OTB5+H0fWE*mZ6^# n8CYJudWFyFf6(|WXnbY>aYZvY$HjVQ00000NkvXXu0mjfdTuoE diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_11.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_11.png index 29fa71923c0b5a49cd901e1f8bd6d3f3f4410d42..feed6175e19303d9d01f315ac8583bf4f8947f97 100644 GIT binary patch delta 185 zcmZo+yvjI1rJl3EBeIx*fm;ZK886+f`@_J%(C+Et7-Dfc`N4w+fBiYr8VqxI4*l!q zUe$23smUn8j7K?};iF?#AWws)QNTx~3}qi)AO1TGC9^*yrhMgz_}j|-fR}kkCkum* zuEv}VyBZ{z6Bv61JC;Z^012rEK{gR-hb)ChC5(|5jXLJpa3(%UIp3gLsdV|qC#Fqu lY&j<<-$>~(=J7blFzeal{TDyoI0tkSgQu&X%Q~loCIGxbM~?si delta 103 zcmcc0*upqLC4sRx$lZxy-8q?;3=9l*o-U3d7QM+P#>Uo19M~$pz7k~y0b$Eo6B)UC zKK}UlxP3{+pWol}B|>8ivJR|ZY(C5&7O}2rY3{Dw3=F4l2x?4rzg7)2iNVv=&t;uc GLK6U)XeSN; diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_12.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_12.png new file mode 100644 index 0000000000000000000000000000000000000000..fced222c599471764abdd67fb82869a7acf14ea9 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pkS@1 zi(`nz>9s+Qd<_abumA6V%wE$fe*dB9QVkZt6T2!hwzZ|bJ|^H~(fM`9;~xFnaTD%4 z3JD7s9#?i~TX;Ll`_={an^LB{Ts5;QvmM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_2.png index c1b5a41c1eb07c8d77e8ce1a807fab886f50cc59..20ec4143669cc1fc796acf4869b7a4faaa8b81be 100644 GIT binary patch delta 151 zcmV;I0BHY|0kZ*+B!3BTNLh0L01FZT01FZU(%pXi0001GNkl_>jHuX02PpJ0N8R$44{q|Kmmm>Ef7j40Qdi5PY~W1rak}w002ovPDHLk FV1jN&IfVcK delta 119 zcmV--0Eqvy0h9rdBya(9Qb$4nuFf3k0000^Nkl m5ki3FUwH+Pmx>$4s8Kx=jI^O379GF<0000NklTNA>+s3FM^qX zbk>Tr3``4kKXMEnV(@SmZYE%*ZHoN<7oc5n0rd<3`4i-9atr`@jcfxz z`rrnD8AI0qcwkUs0602G1fb}r*Z^?s4X6R&6pSmUq325UC|nCS06B+Y%Y`5e%cUR; c%egQN0R5v;wK|>}m;e9(07*qoM6N<$g2fF*0RR91 delta 92 zcmV-i0HgoQ0eX-mRsnNTM?wIu&K&6g001;eL_t(Ijbr@(xA{KGZx^prw85kHAdb&7C`@c&_@PzF7 zXKdh*At5dA5T>r6@NvH2v4;;ICR!9FiYgnLd3R_1`Ty%TGZ+Z_Oo%wk0|fr@_Z?QK z9=o}tp`qbOy_(XMhpda)c%+z5cyco_3H=X@QP5rG=(0s|&YV95TYW$}#NXv4{{fnF zC&bBY^X6isnjasUCN=_rpk?v|uDXAJ&M`2Y@iSkc&KP;NU2Pns(Ma&A@8}36It;`HofXn>u&0w-N83(uJf}UUT$}bwVnCi z!L%OlFWy0xtOyPQ#YHwBfygUGO=WNo2GSX$GZ~Q)}J-mw;bK z#s|g`f|h}^>|vZIbv5|Ni~^ z&wvCDd?k&~vh~JY6v59AN#nx-x=V=VGr|1=6@>YbSpH}jjE2E52?GEj#Hf-?B`75T O0000GZx^prw85kHAdb&73C zjg5mh`7!f}SA1V~|4nZxys>4nq=clTWaq}8|L5)a&#u2e0SuZrg;vjO1cHmHf=;@I z=Z>+0H7GgB#u;QCSYX&NXG_6?`)}>Lxc|NHbWy$~P|wY{BT9`82+HP)9BZB)f52BY vr8seiWV7=_JvWfJ+mjwgtrzi?U5pGoXFLsb&S&)iUCZF<>gTe~DWM4fwZl~I diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_8.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/glass_8.png index 3dffcfb62506ca0784245f059d16de754bd1b82a..fbb179f4a91d0795cbe5be8104e29adc7c64fbd9 100644 GIT binary patch delta 246 zcmVQO9C_+>SRRSa~aQXNf9625JY!H5Il}Y@jj_? zpB%-`-ctxEWUN*a#j?5o48(JC9?r{iF5E5lmU^C;Hq^xq@;d6;Yp#tB> g78iMD4PSPK)JJpqB)ZOf0nKLcboFyt=akR{05-@gKL7v# delta 119 zcmV--0Eqvd0h9rdBya(9Qb$4nuFf3k0000^Nkl diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..f17ac4cf7e9a3f6f7bcf8dcad27e0eccadbf45c7 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`%BgKl#kFyJ`z?{!I| z-^KaoF2+auSp+0|UF7QIe^jY1sZ^AnzW>vWXCIu`FUr)PFyn^AJmKWtjm!)FC)Mnh zeXeuRsMGi6?aqVJlQoVrhWMy%DGy-$;oJ1vW2&kZrf~-_;bP=!X6a;N;^ty(U})A`cIOmOj=|H_ K&t;ucLK6V-WlgjI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass_inverted.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/ineffable_glass_inverted.png new file mode 100644 index 0000000000000000000000000000000000000000..92e8be15916f82a645afc1a95633280f05b4b2c5 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px`7= z7sn8b(`$oo^EMc8r2H?9IiUHckgtCAwwDu|n>s@$FWa-zS!?N($>*z%6g?9cjjPj8 znX@NnciDi{!heHVCsjG8&3!B0op)++ U*cT5Dpz9bsUHx3vIVCg!0FaPXQUCw| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png index 0684a2486a203af40b5e8fea37f39afcad4022c3..b551eee17b42ca9eb61a0dd85168232660c5c8a7 100644 GIT binary patch delta 663 zcmV;I0%-lT1EK|x7k}^w1^@s63Ag0q00009a7bBm000XT000XT0n*)m`~Uy~R7pfZ zRA}Dqn@v{4APj&xt_PU?9Ko$~1a;xgmCuE)L1L``Ip{;|(@#W%(fFeWNn;B3up+=s~And@; zQ}-@2DDFT+1hGZT+Qwowo#l1a8aKJP+?FWU|F08{`DviaQm9@Agan) zJSZ{ePI!PiFb)r9ibU}MEph`qK$-jDfj|0;2k;MN_w9HfqRPgD^^15Bp?Di(Jn$7M z6alqyH4kv)wmk65Svkct9aTC??FEoo+CLgXl~41^@s6AM^iV00001b5ch_0Itp)=>Px$Zb?KzR5*==lfO#C zP!xy1OD{%qL0d~eCj&x-E`5_ay9@3v;v49jIQalw931RW>{0^RS{$mT*ftn#Gy4Ac-__Fu}-j%6~{D0EqhI`5xfp`jTbU zL=}LJ*UOv_XM=S8cyou8O5k_f0PJrbq?a9rxVFNz75$GWm%vB@_^o*spB^Pk{|DLI z$UOdh{^BPV=|1X@ktO?==EZ4Y^c+Sbi!qzMAVY6jh~V0a5n;N1c=K`zLT`#VIzQHG z*U4OzEX`Iy`F}tLVfyqs|AS?OnyBV}pGMXJj0;Jm@w@Gu1E%yvxpqBu!~~OZFu`y2 zG7gyXJ8KYH=)*EUhw$_BxxWa(TJy$`-qM1vufD0X2H z1Jg*W5LV5?Vk0feyh&X!k<6%?F^z)>+w~pdU|y~nYaq)hV>z18n_@X-{s6}}x+b9@ R5o`be002ovPDHLkV1mPRzzP5W diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png.mcmeta b/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png.mcmeta new file mode 100644 index 00000000..97c73a60 --- /dev/null +++ b/src/main/resources/assets/utilitiesinexcess/textures/blocks/inverted_block.png.mcmeta @@ -0,0 +1,11 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + { "index": 0, "time": 200 }, 1, 2, 3, 4, 5, + 6, 7, 8, 7, + 6, 9, 10, 11, 12, + { "index": 0, "time": 200 }, 13, 14, 13 + ] + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_0.png index a449decfda83ba650f4418e380e7f90a7f528cd7..abe083588b86b59dd326bd914d54375836db6eb6 100644 GIT binary patch delta 48 zcmYd}nP8|b=IP=XV$qxY!(TB$!ZhJZLm+coHzPxA#UH(my}@@FfWXt$&t;ucLK6U# Czz~@L delta 55 zcmaz^o?vJs>*?YcV$qxY=l}oz^=w=W!m6{}c_mB}t~4A>VPMEU#Uiu(VQDY}5O})! KxvXFMGaV$qxYBmVq{`9fz5vJR|ZT+GHJ&dgArR4dQEn)eU`5O})!xvX*?YcV$qxYC;t40`Hf5mTsofxGQ06gm?juVGB8BfGR^%uS8fFZ5O})! KxvX}%WV$qv?BjwM3d(|0*?YcV$qv?C*{w7duG;#PNB1l*?Oc5vJNB|F))0;!pwZUb;el+Anzopr E0L0r71poj5 delta 55 zcmaz`o?vJs>*?YcV$qwNlJMjI{6?k&E}hQ;nca9LOcM+w85qLyndErqZc}Ff0#8>z Jmvv4FO#l&t5oZ7Z diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_12.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_12.png index 2a41569ed799d9f2827685adbfe13aeb845ef543..760f0f2afcd4c0f656e8dea2642a04d63dceb9d4 100644 GIT binary patch delta 51 zcmYd}pJ1pb>FMGaV$qwt!aVJVKWCbRX~LC;K<2h?Mg~d2jRIRlm(F1T0#8>zmvv4F FO#ro@5MBTP delta 55 zcmaz~o?vJs>*?YcV$qwt#ysuEc?ZUXMJ}ILFfL~6kusRU!@wZFg7IRCPO&Wm5O})! KxvX{p95>EgC delta 55 zcmaz`o?vJs>*?YcV$qwNGUMcj`Hf5mTsofxGQ06gm?juVGBE7i!?AnFMGaV$qxY=d#Wz Gp$Py20ur*?YcV$qxY=lp>W^Bb8CxO6@XWOn0~FikL!WMGKMWs;jY{q7D1AnmdKI;Vst E0Ju^SGXMYp delta 55 zcmaz`o?vJs>*?YcV$qwNl92G@yaQvxBA3rA7#FkkNEyuFVPNoeV3co2@$z8+0#8>z Jmvv4FO#lmZ5oQ1Y diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_2.png index 286f1e0f8f156c2de62921479788719b6f3cb1ab..4674632d57de8860bc2580ca5aa70535f536e3b0 100644 GIT binary patch delta 52 zcmYdJm|&}%WV$qxY*?YcV$qxY=lqBN_ROpeokC|9v-L*?YcV$qwNvSR}%WV$qxY*?YcV$qxY=l}eN_ROpeokC|9v-L K=d#Wzp$Py-z!X0K diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_5.png index 4518c22e3df447ed5594dcd372c787c2ae24b659..a78ec2134820d5833660db8c88ff70faeb2c5ae4 100644 GIT binary patch delta 48 zcmYd}nP8|b=IP=XV$qwN@WWqG#x&tdLm+coHzR}L)_($eORVlQ0D-5gpUXO@geCxt CBM=Y( delta 55 zcmaz^o?vJs>*?YcV$qwN^5gu6`Hf5mTsofxGQ06gm?juVGBAYaG0Cki2wu(r1fH&b JF6*2UngA&f5>o&G diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_6.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_6.png index 0e8f746cf4a4df30ce9223b4a5d37ca03426775f..f5e17ec8f1fe47a85feb781b3f111e6cd3161ce7 100644 GIT binary patch delta 52 zcmYdJm|&}%WV$qxY!@l@sy_dn^6^x77dZY|uco-NQ=Go}&{kV1>0}yz+`njxg HN@xNA?NSmd delta 55 zcmYdDo?vJs>*?YcV$qxY$G-SwJsTH;u<9&#UJ28LD-8!z7#I@EnPUvR)UGf9fv2mV J%Q~loCIIsd5iI}! diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_7.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_7.png index 380127849604aa45a7c4d83cf764ccbd7d09681c..b8e362e9b164ea8f97c0816395866eda7f451e87 100644 GIT binary patch delta 51 zcmYd}pJ1pb>FMGaV$qwtV*UF6{+wwNrU_RX0-4*o85#1o*2q_VmG)x*0#8>zmvv4F FO#t9m5y$`l delta 55 zcmaz~o?vJs>*?YcV$qwtX8rpA=N%Xm7P)+0!MK>MN6KIZ4+BG30n?nV8mf5=K;Y@> K=d#Wzp$PyzuM+_P diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_8.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_8.png index eb7ebc6f917df59790ee72bc6690f931927e65fe..f78adfbf5938d4376b628a0da0439935196e9ebe 100644 GIT binary patch delta 52 zcmYdJm|&}%WV$qvyQT*&oy_dn^6^x77dZY|uco-PW_9yEJ|KzG>00K`}KbLh* G2~7ag*?YcV$qvyQ~c~qJsTH;u<9&#UJ28LD-8!z7#RNBGdJ()uaIW|0#8>z Jmvv4FO#u8$5%K^4 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_9.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/lapis_aetherius_9.png index 457e0072ebc1409a6ea502ce7ce73215e1807132..992e9311f26010a8b82599a8bd03bfb9dcd8a9c2 100644 GIT binary patch delta 51 zcmYd}pJ1pb>FMGaV$qwN@ZlgOwJ*?YcV$qwN^5g%1duG;#PNB1l*?Oc5vJNB|F)$>|WtO#CvB;bO2s~Z= KT-G@yGywoC9ulhn diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/magic_wood.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/magic_wood.png index cb821af3695215bf2c65d914bd7fb35086ed80da..ea8a91e10ea54c1ee96f4c31d160f285c36d0c0c 100644 GIT binary patch delta 415 zcmV;Q0bu^=1jPf8Fn_yHBl4dwX(D)m1PSQaY)7h=)bwrrp-Z1e1CK%tTEGw09<>iYtmL| zZt9-k_SiSC?R5eBooGn_f%DDEK!DNVJW5~-Vg3V|j*b5HkthGV z4}l~AL?Es%$RaobAh-65f_ST7>fxOEx*E$2Ake6l#8^rIK++LOj<*ZuFqpLr`tSZQ z0gq0XfIf&s6o2Hi|JVF#-RWJ delta 580 zcmV-K0=xai1L*{iFn<^k_d|IDoNuw8OJV*@uOAm#@Az?bMC$8j`i`~(QQ62`7!DM za5d;No95h&^{&(8z1E-XjxOxSo7)o&N(tAPbgg SwfxWk0000Vq+c z@oz_qEv9kw`SaPni7SN`O3`m(seGRtSG140(g2C~@vIsETq!69vh^}HeE|BpYM{B06;Mg z0s!D3XiT!z0DvMIOU3)-asX(@p-=g0M?h05X8{&DZpNDFgR%QEV(@2~TF3(cq&x>e?zW5!)$;(E++ciH62#@S zBcQRC^zdY;dLopI@me0xC+C@4Gk@Mz0YUCA6rz?ZZ3&+hX`AR_=Q;Na8e zRLuvJs0FO^l43Fn@Hzp?R|B9_Ezq0=l&%Guvw+gIKyy)`bS=Uf+fBo+G-{ar(`t;nj#26=@WGyhNOmK)=U^G5pDB`9M^B?30 z3<-d|70O+YPZ9t!ZGID^MSw{kf!uwd{4g?E0Kx*MYyqRl@LIEk$wUIr*`8!B;5pmP zZCXaMl)41G077gpy_RC+L7fzlj;Zgx0KjSiqX&Q#@mK&I70(eE z1OQK#1s`Df6B8UIQrgmM83X{Nu9g&)hd?U;gOt9WNl6izx>_$kM_s*n0FY^J6!bws oK|w)5K|w)5K|w)5K|zhtf0VhwW<1!)9smFU07*qoM6N<$f|12{DgXcg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier.png new file mode 100644 index 0000000000000000000000000000000000000000..a29ea0067e01aca248f9fd88a73c652bdd4fb15c GIT binary patch literal 2086 zcmbVNZEVzJ9530xjlh^NnGhFBC&G|k+k5F<8*Xgw=I(&oCR?}>4Dek0+}7-_?b`0{ zc9?M*R3PjF7=$38V&sDf5|kKVh%*Bg-#~fMi2`vZ`hl05ih>_NpWbfAFykdQX`iQk ze$Vgse|!F2Ute1@as2f07=}&sc|A+eh?{rbIP}yLiR);{SG~)046~G)_n7#*3!)e{ z&Mq}J8BPAhyr4uZKvaUz5|5||jbZZ_#8n`)LIV%NW=VDvsqRk*ToT0iw6P>@BN=NWW8GCP=Iz{FP*gM`Fu()BqQHj~Edr3oQUo+ZN|l=lJR3*8N(n0(5=Pe9(pLEWyie8* zAPdmvaTCaCizJCWumdL>v_aBtXY3@)+CwDg5;)RobB0_j6df$b4Da_SLc5t-bN^78 zi;93a?x=#G$T|QENX{vuht0m5Y2_`G$XJg%?`8GX%aeVAUu-Qv`R#b4wn|oU<(#e%-Ye-ScO97n(g52sv#^Axi-HG&S?q2? zFtZFrBJ)`qB_0o@oY^01fr#`z$sbbJm5>nw8mw$av3qcJQTMc7k)u!>VZRDAfVvFS zbT<*wln4$~H7p6hbe4+BV&?2-(}Nodey3ROsiTAF{bTfSH8bS=Xfe90>i<`aG6@h` zfZPmGlcosM8_MivL+PjfTN&xK5uI-sj@qd?%{FrMlKmAx8BuGf(SHf-UJM(v&F86X zY!*>kCih+@5CHZ5*h7r(ofRulH2XDcJo+!|dw9+~P-n-0_1y5NJDl*c+`W zZZq2S$v4iV94n8UC|WtCb!))&d3P*!DRr^?$zAK>9eckI`!>DMKdEov^aoqoyNgfD zsr;E??RF71ux{Vd%dd^y)}LST_=UPFxp~aOS_`&GU%%$tD%ZT(Gb(=l;?@;kQMK>W z6{*_m6R=lSKV>;tHX#|@+q3nmdakH<`at5QD`#-ZC=5^VrN?M>}_>p8mT8FF(4oE3r8#v%RY-@?M`>m(#PjqTuWa34Q((y?~!L3i0_x0W5p zo}cm6_LF5R%KNt*a$LH(|5X2h__e;m;}_qY`}uOf~ z)K|ZJYVO((kG*=XEcdNT$&KggUhJIKb!&NYb*S&=DgN62H5*;wj|NJQHO4cpv{i~RWJPuZ=%eT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_copper.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_copper.png new file mode 100644 index 0000000000000000000000000000000000000000..3266d779fa16fe5c019862a708c40283bbecbd4b GIT binary patch literal 2084 zcmbVNe{9rL9PftW*fM?zC^II#o<9b$*B^J+TN}zYc7rW)W7$r&0a4zyue-YI58Cd2 zEPzM?Lo*2cAvzSdfQ)~X#9v{{LQD|BKtPQ|f{D>cNDw3g1foHSueaMV%=i(Tw0(W= z^FE*NulMa6jSWjmi_3~J3@fd#3pb%R?%qX{(bMkgx{h8`%(^xk!+c)%E=cdIOk&vN zfEsOeS|dvZ$A$98ZIa&o%h&zrc zP*f_F@}>Mf!)m7(p64l=rC63k2-42z4oH)_?HywXLtC;`(@_l_cNsy<=yXH^nL6r& zX69*iI~OMuF)9sAit*8|Pg$TW<#A@GmB@jZRB~wMk^A*Y(B}YAgsG!-^V4Vk}dQ zVcKsw{+nUy6m4Aj$aAg9`>2vLXOvQc_r2i3M3!fpBbp*pNEi)Vlje%Um`j#BoQp zLJBHDnU_e03CSeO1~?M%ibPh#0!ly$(TW1tF}7uvicT6xjAwPNk`bdn#?dqv;7Jez zkPL(ZE`@@u;(|bdK}M!yoLkP>3K8m58|5yOJ0Q()O>UG>@oZ5DKyr&+BqTS>P$qKI z>ICt4DCOM#R2(AG`y_u<-8K{_1uR(Ij$-%V>Z0yxy`d+eHO_t$SO9eyXxSp6ScZlJ z(@dxmaGj-+x|}<^`Sjq9f!`^Xd+OLAdH)zaT+NI+KT(YCs`~#Gqg(={IMCZ6YSI+p zdPBM0Y&8AUe=8%qHm>uH!BIPPhxta1KJvc;s3U3%HTvVn>`NF{u(Li~9c}&c@>?ew z4p+_EoSAVmN*7Govx%^dl^h*d%zRkHFpFpQOxZk0$M^VF4P897d(DZX-Pb(p#hT4M zk&@3RebW0?+h@C9yFIdM;PJxg#bqP=GhbhrS6H&-^8BKzIg5l_-Ip&|*x=Qsg7Td| zY|O|bCBLjaT?+@N9h`fmY!MZ~v0EnwwpKNd1fE#wd4KAG9h3V{-t2j1+wr+umVBcX z{U&yQaAUUkSILhdjOr_&<55aIAML#noB92UU)!!N-y4|G$SG$x^m&}ZZx^Du6?0g7 zm(X`|f5#Q`V)#kw&t893+xB-{W%UoK9ANhS~sC8@QG(aAFy-9g` zIkzpzJo@Rb?tRC4J)z3=L*YYbs=1lU&(lIJs|SJu-b2@!#Q8HyhUnU+TXv4IaBGWUcep2T2`K$zy0I*`d40L|JZc<&Ec~z4el)pHdSbKNg-P*2* zz;G%$KtN3(0z<=(gakp5AEGe87!rvH1c-vtNL0`)`$LS5LGWGIl|jajc*)(pcklB) z-(R2iy`@#tCJiipyx3;54fI#~W}r7_-F=JD(@3YUqE|ny@hSD93;gOG{@5nkJfV+j?C$z#Lw_e%o#&7FCH~b zjVH-uGHFjb?5Z9iX^!JaiXj<>KnTL9S4@y16k|jegAW>lE^DT&DwxFx!fKuA#gVI> zF~qeztzzWzgfd2^fJV}G%8Drq6oouatJ7myq;3G!T}~W3{Miszy}33w3_^ zHUlWPfk56ykG{m?c@u_Nkw9VO64E2u2-a(moB<8BP8VQB0=YTDibmthbqGvV52|Xc zt5Q{6E@KR9r)lijS+XLkNn>=k9nc3%=*3alSb}m8G!vv9JY!XkpqxBKbwUHGC`Ts(?6d zS*2VI?W84+2-9H+5jjO7EYWTxX3-58j)j6mcd<>^WpvU&tUIgam53M}5`-QW2!sIL z*2BpVXzC#($|C_Fu^yInS#r)Qgs+qhRJ;1z0htM3&5dF*mK6mL1WW8*T(GJPMLhRe z?jau!WI4A#8HI@S9>wppZm5!(1Uf8>pxoVGUF2Q8SCs_RyZNsH9iT1)b;FBGx*ErT zrp06dSizDBMa-Sue0eZa#cqk^u67KNxOa{oOf#Lq_mrdCRR6znlq-M`1xf^>CQag2 zG^EwdI?GSqsf_Gex6aoENA1)a<{LShK-JoV2{^H1!5s?FPb(aB)RdPQq0-L&&k`o{A1>jU?A%gMsN-?gP)J5MhDdCY{6 zbW!eeaKO=1qgMFlZ1}No$Lxab@5Xj~{Pftrtq-&}uzNN)Rd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_soul.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/chandelier_soul.png new file mode 100644 index 0000000000000000000000000000000000000000..6350310d9ee2d92934a1d05733af7cf5631b965f GIT binary patch literal 2079 zcmbVNd2AF_9G(K9QqxKmERjZsDMuyFxmRaoX`x$aElZoSfkia>cINHw(A}BYnc1TS z1d&UQKqH4yB1P*z$f0S1^=L65#KbFdhRPovAcjH+LaK>He6!sy#grpXGV|Wd``-8c zuJ@bQ>*vnS&wC;d!?66CYEJ_iaqE6)BzhXn%{S06N~>OIU>H?m-8rfE%M%zj(k}b_ zrr$e95Y;FJBsBo3R8&J~44YP-(ty|qO*{ZYvf?JLes+k!Wywt}aCjN7Rtdv$b+ZoV zHP7{l&5a^25#`hIX(<5_M4<`rR5YR(Lds2~c?C4LKGOuAhM0|RVumG%`@QverK&@m zr&v;C7#r^5Dc;F5pv?6Q&M};WW^6R$Bw1cyIRUL_E&|EvQc!5{%*u$NH#ZSBO--Qb zWHL!5ZIr5qXqM-Bn&D`UBN2i$niLbHNW~}_VDLag)Md?-RRy;gK|qb0ZUULw??Y6} z(kezKPAFn@3TQM-F_uqhpd@B-T3nB$#U+u35g3JvX&@|{#cE;IRE@BD7wYWt9Ret} zUT;=oNL!-Otb}1!C6F7LfDDN?d`%jp8=#@abrDu2keMZxH=0nXLtv`9PgNrWnW`T! z8Rwi7%i^UAWJOYw#?ym#Ko2mXn?PxEl8lXHIUj2iI4g4`V;2~vAL>;lIoLE5)WHf2 ze+Lv5jRZ_^U$7(!K~;|eyL_Y`hBv12H*WWez*wfNOxQPM6V11Chb3mQ@mBbci5eN83rr1Y9KK z>}4e2%UCkV*n>_da01RLS>>Fr5TRN&Q0|&C2V@?MWo8i>PZxy%M61}{glJ_MN<`+f zJVZPmNIA1V8HR}T9?9=lH`Jh+1Uj4%Lb1DlbYV>E9S8T5hU*yd$HzPSatgY7 z^PlY8RCB5=x_v~!gikJ>`;)(TZu77eGaGChM;`z3#G|?0y(Q1@d#r7Bb#Zm9E8h7Q zSrHuD%CvvKci6l|t3vA4zm~4~Cn*$tw1J@}7k=?g``S%A7TjoFw(97q`CpB@IdQTB zo6_i8U$$4?qOSkoLQ!nksEIdwF8nh3#;%;UrHenz+ud8fvvb{vm%IUAZJ_p*&u_We zcKP(w^2zJEa{%_8ZO^0@xZCfy_jP{SQP6$7FYj<{>YU=f1C1*dGXCcd9DMa~Zg*j# zHoo=D!9)1T%T+JzJ9en(=XbhR@0q`{>FnD0l~(z3>$2{AuISpgFyCl@IJ_(QTI~Ab zpO*BDh;6Lv%-=UYx9jSW>(e^+j~{1yJeJe3Je7Cs_u0$8PB5q6s9)VWZbE7Cr0GAr z_vRVxBvpT_u8(4Jmn`Cbd%H)xw4-ps-e;$5OI`X=E8af*JjPcPY(c|Qz2{f{y}9

M#v+A7Scgj zgai0655g%$5(JGxc`%g{09*yh(L5+lAZB3tD=%Zv0zLz?gc3vulK4RJf`CLR6qdM% z3ns1tX?zTGKH5V`M+iia96&2YLa~glWMD>k>BwCB8IM7aK;)|!7%#0LIwB|-?E_08 zGz~|@f&>B??M}nd+-L-V>h6Lj5l9p~fs7}(VTm+4kwizKV#pf< z6EBxb=y<$Bp};A~I9M8oC(>v%Jb{EKk+28?D_bj;14^t|X7`DK1<63EKq42wVzibK z;K6I;3=CrGM;}CzF=y zF{~sWmcz1m_$$<7%YP9-VjC1Rrtw8vM4~YXncO!4abq+fUqs8eYb6jq6q3Pfq#)#* zfS75g^+rPXkwSnRmU3ZO_$gDtpG-!R+;Bu9+Hr|M%!d^+r_XjkEIXE^I;I-_*0cc1Ng44WCE5< zB~!5!nkyemBk*0ZyjXW4mEuO?lVT~K*f>%Fa?$|d=d4<*_z0srncxPwQCzX^e3~29 zo#;x#QfV|E7NmfPJrtfBiAU9z^GJoz0|YW8cWXxvNEozwbS4y_M~Z?DfZAebU_fn_ zAwFjGv)~Ky_*crK`xWsJLi#t!|EMm5W914!3VFpLvHR!h!hh9zSeyV!KeJx~NCBkF zKvEe46Dx&9Xh0$n3P3>XEIvWZA3eKc=|Rh3^q}c4f0mqf#awUOX-{t*H2b$Z^(oEU6cynXYNkbd@TEr* zdAfhyZOYPC;HBQAfR4ktl!wHP%$@93aY`ez+QKeqDON|DwW*oz6)pi*=`MNKJId(n z&T^FlBH!#mZZB6=WgKdCN5W^W-`-eXfbq2r*Ev8O>aK1sDtpgNDl73m>ZxPeG2ybZ z?I2@lza{PjYj*AyqNTs`o!V}lItRaGYJZY6ia7MV1Z+HEh;F&=l044xn>VX1dLCqg zuC+DS57hByR35QHYxaizWNm)*^|SeYmbHZOErk-tW2ftRFO%P_O)cACxCOLvZUPVA z{bgI}EqlkK2E8YbQ{RzEas-o4&rqW?H7Hg~X>vH8b;#<-ixpzeA4Tk! zfj{~>KQLGzX*oE>v|BiI>*kB5ERxqw>Roqs%YvPo%*!ikXVnMWVpgZ@p@KdO7D`IO zV_Wp7gD6tp5C8{-}l(G*iOIDXsPe! zAFzYXsX42LZLs|S=T&1Ol*}S4(O!s)2&D9Gwzcg&yF;x7ptCVgco|~T1oLXLy z^ZmPXxXWFkBAsaaZ_?()8{E-r$c=AM8?StKOmS_(US3R7b60S+*?ynP)T?1Z##u93 zH%(5DD9O-}l6+CQ+~Mh=a<|;!a;wQIBwaf9Lt+72BdV zvoUPx>j71);AZw}dyd(Z&ekF`_p<{KR$u4&#fF@3W7Er~%n9LBkGwijALO#k;yk$E z+Y8;NNFw&xvpLU1R{{Z*S#zSeZp+nnr^wEF4o$VxDDSmTk*uobfeH0dVT{YgMM0OZ zEjP4eY_^xmyR8mK)5kR__FOQ$!Xaz15^LNX(H*Pt8frv=%1>0O8AwCNA1w`8xqLM) zEoJY$feV9SHzj*&?dgvf?Q}la=N{~20sORcIBSpb)k7OL7VF*d$PWBDz4PuF(a+Yy z`J><+(}6Tz_CZI%#HoentWG52>^WsepzBoI$g{z3%$E!5J;_g`+0!`@^A(pgPv<8! zZC_NDdi!`&+v^F#+jf`Pbu#B&_Q>74tL7rdf%yHwG7s4Q#5$X|yOURzZ912zyM3`9 zYgT=Bt1rjj(E6=nYgk7YZsu&G2D-SaTXQk`(T%g;9jfwq*sYGdUAMT;s3k!M^1Wz$ zfSUyS_v#;d?3D0fK~qM*$+NPKG9~-N+5LtVdyOKDr*OUZb?Uy@oaHxOCq);-G@B`y zm_5Dpn}8qBte?SLR?rZ$WXT|&L_AJg6WzQ_ICb*!cgM!>%c-&Qxpi#zvP}zHx_b+r z2p!@zvoMc-9kjueng%D-Z*TQ&T94V%8}k8>B!2;OQb$4nuFf3k00023Nkl#R9^uarKO+82DCf12># zrSE|B0hE7l@j2-`pc+8*dTT`oL>CaP8bFrer~{%4h$evO0#Kr*4`9sl!&6gTb!&s^ zb#0c`FPsaub&%<2fB>Qki1zatuy&Yky`A1__iM1%?E(M*000000002QdjOFADg|9h RV(9 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/drum.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/drum.png new file mode 100644 index 0000000000000000000000000000000000000000..9c714b17e121dd0df1ad14f3ca5a1aaf48984293 GIT binary patch literal 672 zcmV;R0$=@!P)m4;%XY_%strLfB$&bCIw(0r6Q3h!g;0UNj zK*?F4sZOxQEYM62s0B;&wORt2$N?S!l?k9Ea8HXo0z3jbH16Me){50t0_($-)kTYC zZFkoTSiLK~`)e*LQoUgHu0(>=^INa6i1Aj>LS*0w3BU3CzZ?WCHYIXii$wt?0K9=c z!-XqH6gDKBQ)OLiH-$kzaMHX01md^698oxws}dmH6eWOu3#1W%qbTKGf_`xVEUeQn zKD2Y``fZi~%SE}bzBB?tq{N6i)frVHfF?)nT$;(7CBRZnxGz3a2uQs~m5$GHQEX7G z7IWot6$DtH*fu}RSX#8K7dop4*!zC~00002@7>U)+a5zTrVHJ^}lLh+7fAo zOChr}IL#PbCg&X3xzp)CzX|uh`YqOcK9iraPSAERiPU4r?D>9)O`7Qw+ex;D99BsN rZuU)w8QdnnWu5R=VOFBZ1RjPN3yWsgAK}{#bQ6Q8tDnm{r-UW|Vd6x5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/gold_spike.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/gold_spike.png index 1fe13b67c841e4e6fc6e0fac34f8ee2c2045500c..cda5086574e1b4cf76e611b00356736ccebcfac2 100644 GIT binary patch literal 3447 zcmbVP2~-o;8ctAIm7;>6VhKqFQL-nHM35~Js0LJ4m8HYX1R^1mCV>P{K~O3lo=a_A zs!-R07DYsmqJV-Tvbul>MMNKqJY*>pMAl9aDDAP!c{yk1&Yk<+@B6p=&q?AYH|GV~ z%d{~V%mP;z?iO^kS6!Ow=>4+r%O-TtlDKS@VK5|u>cT27+C^Y6>I|W$uiTfvkpm)O zBmhE!V3IOSf}$}P8#|>007GFpE(i`5if!>dw+it%A!Lj9Ve%<_i4zpGQ$IW^Cxrx@E!_1}V(82k zA0n4aIApRyp&%*fBt#larn1>=GKEH_(TFI5D2o)!0VPo^BTO@JVHqeDO5{RBj8icJ zK}fjV7LS_x!G|!(46Rr;6(=-eWF;UWQ%Mw+Pm@3hoWV)LrJ_l32qeQII1CocWhj<9 zgO!9Jazqw_`~~&Q@*f1y*z)-^8XvVKENn(XCg(+2PqiM4uQkX;< z+mp)VFew}=l}KT5D3lLSJ^~2^k+Y#F+R776FO9)rvi|@@iv|MZz(0Z^kRw2(VF2o} zFboKW$r5oe9yb$5juRq6q^K}z9evUYKA+<%mdODz2)lA^@u<@zp%6kXpjb15KnOJm z5TG}PHIc<&QHfL<3<5MJlTKsOruTCZFkF>d)&37<4j~}Q@w+O6$zs##R#rriDWDP= z0E10r!4OCUV3Pr3<1Q! zFxsTac$GI~RX6*Pe)69yV{&a)=bMJ3?Ns$R)5y`u%%=brqtsHg(Qof~ro_NLq`qUsli4 z($(Zi)I_m1EHT)1p}|5>BDwLMFIc7G}OY~j`9tlNz`PBx)_{bQ}|5JlbmmxqQAEc!f#H#XV~ z1iXJ`^xkq?%7&Wx9gy1DnnasJ4_tn5c7J;YV(k6=`Y`8?!OqK+OCj2cqlqgZ(Y(4k zYzG5#$s@&Gu<$x7GDrh{s&~3|AUt;B%9=-bjYf->`<=%h({%H^O4pM8>NrqEYKrwBD_hnJd~fcez|wdf~erGOuN;J z8pGy!JLYC6>W#zYOCEC)nzoMYin$?ww%R-E+~Gq-4^9($V^UtjdTGm7yZ!R?2j4N{ zYkTy`r-Ia&MP^%WiwYGB^w2kFdHKz=c}>K z(c$YdNHM%RZ^=kWs&C!+<{_WmBD>q~+|JIq+}3*G`&Z``gF1K?iyf!1qb{uRt=nxN zJ#E@JvCp-KrJbTp?)(O8^0I;XV2C_nnbc&a9BxjnYzVoN6`Ss%ZlmKO#STB=J-TwL zO-JmSW>_8T{Cz$4*TofP)JDQQH9{ArJ7!$RuMz9A$1n5Pn3~VacYNl4{D{AiZ}5wq z8?4pduJD8AgL|K1q!-TU6FL_)O#}oD{Wvj1^Y}(BucTg9d4;-PGFEmryD+QRcvV`G zsj=Gq90uurnYW7~B_L`k<8~P7wd>XLv^@EN^iaFuc3YWSmc8=Ty=;a)r@t7E=2J)^EmOWB}4xB^p2v%jf03s-B<_d0(PnAvfc;BCgX zxE9}jELJXuhOPPSKPAVGm^iU0$%gcOl4ZrFcS5c2@}I;c=zM2!&D=ij+SRcl?72>C zN3mw=fx9mZdU9-r^7hu}EEHD|Zr?k3Z~m5nV5=gbZecc_oLQL;E?x5GT-vkMc*)v* znr%(bs*OK+GrI zPK4rRucMROjzFt}7^)JJQkmaz)1ml0 zX#GgGHTH1T$k7`ZpU-pM62iM`6A1H-tFj*L+se~bFZbexYd!IMShOl@z*B9|Px3Ug zert1WH`_!X(mQzF+OIfZLPRTC_1H)l#omZ5#Fl**k@%$PyJ`okudDPb+I}2dnO~Bs znLs^vsXHy}SpH@JV=^9by>WAZ@?vJA1*!KjqMq6pGd9+q+GjE@mY@E_U=W!*SnF%F zxA&6&8;7yJ8f4_eJnX39tx~i@YEZu>tcmFSdAmk>_bOihU2yGv{x46&p7O)`Lp#g4 zW!<@srA}*o;w>%Ph}AuKgJad5HRCegc?6yN!r9CRa(!1ua=>W*J*?$OsEZXl3r6STrn%@I6@;gv>cCVS60y=J3x=0b}rO=T-Dq*G39UEuqmX;-en zwj6^0Pc4QkZ~4R=bS$VSNII^ep{v_Xd+mF+gJbsX(bCJAZZEw(PL37$m&FR4Qki-@ qc2(})@GisJpK2qj*6iLfI)SN8Q@E83Mv7E_ja+$d+^ddX#Qg@e>x6Ou delta 214 zcmV;{04e|X8u9^1nA&>wZuG4Cx0O2gNXlo^Mo+vRj0-W<=@aadsbTx(0~tT}wIls=W(7kr(6n(*GG z?|}3Hlz(sWIq5r~8bI`VYefe{7Z9x)K$hXC1ELFvCV=PyqEDp{V9fHvQ&U}aYlG=^ zZI;$AoC~&fkm+ZD0HO9`eZ9G5Db=_Vg_-7Tl;toG}(@{yRKp>jxy4~#i!mI+p2sxRM z$R+9)A{b>Bp*WRBi0o#XM+*dV!t6APWe^;YMi@zp27L0xDG(rW4fugV2kGefL^>Ij z%@B*S^$A#Z1_t9`SST>Zj_?F#fBErg>Io0J2 zjm&2Vl%tpgiZTskDsI4JK&li;B*2UhNDEHc*x(^M2rbGH8jw$$QV1!8QaC}PKok%n zkq99<0zrLH9fgyItf5dItxVw4E0rU1)i0oY(cmbD{w^5D5Cg@SQQl+Hj2a0sZ83tt zU>uS8l!;<^Vct4fuN68S5^Z5Q)PfPwS`ElMEh0%AQKlInm{1ZzB@UxP9Fr@As6-+Y z;u2VisU$cAsiXt@wG@`=O08>uUzy_+#&i6vieV@Yt5gahB!gk0RKl~VVJR%cl(1SY zm!m30nqq)0mLd6*hMI=5x~#%^Mhr_+%asIg3#OC`2D;z zPo1R)w58?C1-R)QH~KaDad-(?7f)qnz(mfS-%yjXEr9{p}e2v6|^~erSwdTlN1}jQSIRrK1)j!8d6!=<-JF>SlfE7yr64 zde??@z5zJjPF>T%M$W$s{uB@vo|@qseG9(7Ng(i$MQg(o?2h}%;W6XG$E+$n>7mnY z{98zT{%~)5h*yp0!+omQ6EA()&!)#dI-l()^vd@L`6O!A&OK8`9IiNCLzPZ68n)iP ziGR21ZRt(bUFg~KU6f(^(y@gLij7{)ut(iRy?4_|{puTa0ST$cp~jefqmL&qQ#OW~sHLry9`WPv zWw=`?YE9sd?&{k`Z_RD`eA*{I_sOVI!a%1%eolYfWAF(w8%=>XPFH{>7eaGx_Q^U^m@4|WWn{A%L1Q4y7XZm?&5 zWFl1uGAT((8y%0z%gQ3!n=&$nkI!|e^CJOU1<|s$pkR2$oRJMidbZc3@QIFZ{T|jV zse1nMKd(N`;B(=zrMRG>qhf4+N0p{4caCo1#*?GEVw~$!ik4d4gD+m(*Z%J07OM48Nzu7VtNM zxihW+J;*rkV8Ac+bKmQJ8~*zxU66Eb6WRQw7Y#&QgiTqrD9P>bWhTq zHg#yrqCCVH;?!On6LnU6>DI8SmNCW7S&OZ<#g~o+L&2#p_BIxm3y=KuQ-@|*WoA;x zk>sY~<-n7udQDd4j>Qvn)p;S~?lgN879RH5>=ZBGef_N7_C@!D)z7l1*zvUu-5u@u zm4cYzs!>ilRfl$|<%;*Tc_Tapa^8W{i CV->;x delta 215 zcmX>o`k8TpNGZx^prw85kJWdb&7f`z4yN%Dw7 z>m@({FhhYhn1AbDK48$60HC3+RRD7ZYK8(@1xDsek|5W7s}$-r-0Pd zczT{sh}W>LH9eIU@aq0nJ=St&(L|#O_c8#dYk>#=n%r>Os1iyY)eS7PPS*k>ncqrY z%Ku)XRO!qho~{L~B&a3P13+s(PE22|VNDZZ3N0`KfcMJG13;sp2f*oCpqJzo$dk9D}@>XX|#alq}AeaciOs^ zMhkdiN7bL#8Ae*+bXuTS>b3yb%jHyBzyn}Z9!I#GN()5W;F*z53(N?j2$xf70S|<& zu%F>_YAvwmg-DdkX|%v>1Vp)QAj0J|T5{ls2#9bwjTV@VfGC$|_e~Q4Q7+H! zdl&$Uw0_h r%F4>h%F4>h%F4>h%F4>h%F@{n{}@PNerY4a00000NkvXXu0mjf=ca2= delta 1300 zcmV+v1?&2q2D1u~Fn0D7=A1k)T};cr9&Vq1Y;k#IJg5Fw{el` z;F|jf`DNE#nKIQCzTz5lfeWMv*dYkX1|eCSNNQB&3hA9ZJ3F(I*Q;oYc|dq(JUcV* z_xsN7!K)W9zXCultU?f}I&7H6GXTJRvD9OuFP{Mbokmmlvwzw$Um#>IW z+_2YH38}yR_z7pnN2rBW{CV{cemg%0fW-LKyAL=!K1yj%5eQiIf4{s){Ifq8YZZL{ z><2ym`s!LUfPW8_Mf`pIfUas`IEnR|yf>p3R&gIc;0#Cl*~{=0qc1tB%s>TebruOu z;~DycG5UjXVq$+V);<7a0-Z(^!%4hR@*oC@^dnWref)r0SVg4j=&F`xinQ4u3FC@H z#dLT!AK>y2E@!z3Oh{L?bXyoCjIqrr8Wrw{gll0{|9=GBW{36^yPU=|O(<)ZiEXqi zFDhHi!F;jQ(l-y9M=gbEvZnm)sut#pWg^^8R=C>+9Op&7d9V3m zX&v816i8@**fdKVWD+(!^-yQWM~`Y3jX)a1NsNo^xq!v-NfhX+)<#?Hsup@}rJ45j z<0oLPeSbEsGINolk|{=D+H@_frc_`0rWVMvLO>Q1*prJ1a8hI@I&3DpAY7m`K|!SI zh!hfe04G6mAbCa(xlN`fgt+E$hUlsViiS3UUR&Y%{f#yC+CQ71qr3)g+z?F^M%RK3;S0wSY9{i+`o|_M6IK8(2e3Et39l5-04r47EUz zRJWB>=8JLSa9Ocfq{yC}y|?MWWQ=Qp%kXq>wSd+Db8%M^WL|1;`|{`0#DO`iPU9J_ z-hD`|x9?gY;Ev5s1sont=O&VmR9#08Gn|@{1ZAoPgrF=HbD4q5F-5AL${@uYWS=tB z0)GK}_xWO(ioXIgNr7Pwl1bX{7H8JAI*sPuYk@=*V7Q#%Hef%%s%=YmOH&I79^+|O zOll^){fb#Dq9aw;%!^by=PyMqV9Wh&V0GtbY-;&!J-cHoT`eHsC}3ksr_ppKFT+WU zlX#Z$_R;$6Yzn2U1q7Vxx*Vc_nbd15+<)GUfV&Z3QCl_>CUD=iK!u55LR}l1mn9$@ z=AVH3!USflT$7(1c5r=ji%z4N8t1F@qLI=77dE{)5*s!%MceBzb4}a$cY7~js-P+1 zEY4@yG7REHvOK2@?**K-fGIil`ZlTNwdH-+0u?!&?SM9pyT&2AzUJJM`MBu0gY!@PUf-Ud87AQgk z^4fAKYJnm&fNi-JR>@}hlbWW!_hAq@O?gF|nuA6|7aS8mmuw{`mW^ zLOzu_`1P0buRLI52r@Lld}bSLT7P4keT({5D7g6P8`r1tEOnWYeo5L%%(;GllgpM* z4wLKj2V-4k^PWXX+J%6Lj#M3HU;F{c#)UB=sXVs4A~g9K&aPs876LiQww#vF>aad= z(Vwk-Z)|-dB-ph|dU$wvczAetczAetczAetczAetczEm%{{xjFU9QKbPz{Ix0000< KMNUMnLSTY8jczRf diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_fluid.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/trash_can_fluid.png index c2ea066baf01536cce289c89eeb46f341ed6527e..fdfc868d029f697df3d73cf3b82d2cf4c8345320 100644 GIT binary patch delta 773 zcmV+g1N!`i3Y-RzBYyw^b5ch_0Itp)=>Px%)=5M`RCwC$TCq;WFbw1e5DOa%J4oyd z3S(CK8SsnbvowiGEZ?R%*&KHFEgczXQ!ZsX-0PdczT{sh}W>LH9eIU@aq0nJ=St&(L|#O_c8#dYk>#=n%r>Os1iyY z)eS7PPS*k>ncqrY%Ku)XRO!qho~{L~B&a3P13+s(PE22|VNDZZ3N0`KfcMJG13;sp z2f*oCpnsR-ELEt0Y0Xw~rP1K^_@`o$dk9D}@>XX|#al zq}AeaciOs^MhkdiN7bL#8Ae*+bXuTS>b3yb%jHyBzyn}Z9!I#GN()5W;F*z5 z3(N?j2$xf70S|<&u%F>_YAvwmg-DdkX|%v>1b#%hoKg!!BOt=%G+N+@2#9bwjTV@V zfGC$|_e~Q4Q7+H!dl&$Uw0_h%F4>h%F4>h%F4>h%F4>h%F@{n_^!s(04=T(q`_UhF>Eed3eXnIy(pH<&!IyEC)%^?uI#PLk|AeR1K2 zxHo&>5fAzgoe$@O-|6qaKYz2f)3f9BcYba$s~45opI}?4pMSOkU-sV2xQLjs3{c{H zu>F*v)4@@2+13g+}7jWw4b(r+y9uBt@gw~qN@Mo*>3L7lV3-f3N9>PO7Qc$*BJwJQ$@t% zzy91($|%mMYkw=yj{YldGaI`;yY1YWi;f>PySqd=WLfMbAEn!~YWk_Xs_ z(uc1>8wf@j3?frlR)0js#YE3KJf9B;`G=6REQ1mPLJ2a6jPdn}jYKPyu&O4BMq4Iz zacDQOORPsiRl6*zXjfhIs&oS3B;Ibcj#`pwoRhzhG=Iu^+@j3(Ng!i@@0bcLT6El1 zfu8eJZ(R#zU;89Zft&`=rd8qq)Ia30Z@MWQZ`UcuM&<)XQY~M|IzFBPkXV_mq7O8U zOv729&e31;YL$&eVg*x*#M-nvJ3<|yf@4WQ5fjvtXMvCeMK;jMg~R;`p8{9%fZ<2u z01bk;A%BkHCaXkhnM4EqG(rsJ0~oT|*P^6I!Fn#I2$Uy* zghXVqec)KL;j1NH39-c5j8EsBdM>~M2%@(yONV_>4Y69pdYT7_JvSj2NOD{~8%gD4 z%nYLFET$CIldJc(4vcM@3xK$3z`0SL( zPCm|TDa6{%Rr3_^|x%&-w8&4KGQAs0y0yQlX8=KLjWkiy^0 z`;Q|@-`(Q5Syb1Ub}o=R1r#ACSOw|_RJDEKZewx*;yRudOiJ$r#oMQ9JN_Sx$e1@Q z+kcq95xIab_V+>6UB~#;GP^q{nX56m0HLRVk16;sm=+IkXSjOR+tUxIDKs$`AT-ns zIYdI41S#Qa{rGTHFA9os&U4DSKrcsx5E@$8UY4Ze#x|^Px%)Ja4^RCwC$S}{%pF$|=Ih8odQ(@*v?s__*E7f$R8A8?SGd z-@%`IbKKA0>)ogO+#PKS0G!p0+hCBa>rc-w?oh|0V+jCoN`F!J9M*Mq{{G?791H}X zbX&t-?LO?o>zFSAfSqrfaHw09P!Ra^J?9k!{tXKNYmU8^0RZPQH1zZufWm2QInN+4 z*l@1R+ci87=6p~4&fx&SAqIe{z$eX4b42U~0AbEfD;O3qO98-Um~*D*WXIQVe-r=? zZ=QQ#EC&E5jepI02@n9xP@oOwx|a_av?Ty&sB0C#T!EUQfL4K#`I02aHQy?QdJTC1 z^C$(ZJ+{U&05}Si63l-sg&YB+WzcGzye7)J?{EOv>CrN%^oTY>+7wwW^72m5YJ{}+ z=Z45@gcOL;cKCEHzz&YI!5%$EgphZtr)vRqSWk!}qkkucyzuRX`RQ6fGyRAhwgBjb zzDI);TEIFzj{=^a=M&;JtZPkAr3JjYzg3U5oLMx{Xu`b=!0B2b0)QqroHnY2Qb%59T0k8d9f%4%+*T6QcYw|ep(fZTaD3?d0WjO$QH~RMn zTy4u*%(Akwva+(Wva+(Wva+(Wva+(Wva+&t_5-WNwS(B4aQpxO002ovPDHLkV1h_@ BZ|492 delta 1209 zcmV;q1V;Os2FwYNBYy;eNkl5}Hv``B65Iu=MD2O=-p2Yvx z;z{vPFCrEZ)Cv_us8U4JLa()7!nb^RzS-SwC(Y8`50cEj%^NejZ817VKq%M4I0}T(9UC)n2(IA zby-xguDa+|=>*2fyj^G=v!u{?PyRyFXzO;1HtDlKE`I=Tn~F_ZwB1#K?(;NnoeOP` zK9gNQFW`HsZK5bgIPapcy`80<8o2roKlzBR5UD4Q=0hv^lk4-Bw{eFlCEI)qet>pAxz~+Tcdb>+WHWn4|$ zOLrSn3lL|Cv=ov?dleRoE4FRU--uek%l$p5x$79uEX(fKxLSbFUBF`k|HYCQXld)FaiS5m zzF)nr5!o)}*mW3Wl1h diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/wood_spike.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/models/wood_spike.png index ab6a2fb223621103bf3c64047546d8de3173110a..e389053c3f378a2f830af8255506ba293b9fa137 100644 GIT binary patch literal 3355 zcmbVP3piA1AJ=7xBFRRJHHJ!RX3mV6;Y=pEU$&93rSz%eoWo4arJ2F7QYnOFlO&n2 z(M741ZgQ!}>gHBjwurQHom5Ps)Sf}s_dV_9`Q~}focFx%@BRJ$xA%XZ6X)*cq^|aj znv#-|x{I^D2X6FzcuY=+_%l509Vf)FCnlaP z77G|8QfO!>G1Q#M7Y2~XAPABG3W-7?UzgrQ=u4|?uDh7LS-m+PJv=YgFs^FAHfLB@aGG;5auz5 z3k9Gg0WScLn~WpFjvvGqV#1hp=3`c{SPU1QNDT2{)Wx2O$DAf|I0(Z6K`lWt6(Il? zn9*dE3KAeHHnQ}GX*6>R>Q6VPe%^1-hl3TVRqP)xbA%6L9Dk}(DKLysVSoVBVU&RQ zQK5VZ-wV)xJ0MfywY`MeNRIK_SeB!sXog9=4VyuXmo z#X$l=5C?`7&XPiS$i&&5Ob<@X$NgC>f2kvaLjFER|E^}nou3+`FIN5k6{Cp+z-)*Y zfMQLWgjaY&QgpNN^ppO#GRD@XbiU7Uteq-`lZ_mEn0ytWJd9e1HTpu{&RN*|Bhkg) z#!HgX;p4;CbI|@6Lb?1rQD*6Kl*;-pZhF3}kC};N6>i%+i_^|tCAe=jwMe)<61(>G zucptnGFtoX$YWQWkx~7+O(rHesd-ehMO)`TNHs|`*xYzHUq@OHQ0UvgC|~9uZ++*t z--ciK)E*JNxZii~_=ePI8|8|fyP+F5fwnEW0$`4%uCo4|85*)GiN2Z9@T20?wShN2 zwCPnRorIs2o@a)A>{zkR>TbmFt+=`Qu0>lmXI^(F!o}Mh8)cM*nXR|s!V~kCozW|^ zTDYe1l^vMrP~d%8J|}+HzBRd?*rd*_hix-=ZF?HIUqzGZJao4hRIXh0RNWkBIz7tr zJY7G2*9$=eCDC?Or$h3Ri33AF8#ecdHL?BE;M;|vGQ)euHfX^ z37Q&}b-gA!smMZYyYmM(c_*Xpb4uNW(C&)y4HD(A>hGE8gm5(~fubLj(>JI!t18R1 z``6WG>7E)`U|7U2IZ^%u>a?qWuO2f^CDt}8U__ka^0KLF$&+KUPvZ7by6>mKiwkmE z)oQafYc^kt&+W)CwZ0fYO|fpTNV;X5mR83cmdh!wjxE26OlNZRcQJZu)W55md--)_ zIOXSy8NIqnpygopn|Y6v+Y%d(X*>NOwGJy-@v$Mo6k{Bj*A6uXxJ%UDy+*PM^N$`j zDm&CGGTjroN75t*wQa3!KkUkwp8IW#M0Wyh6>Hn&v^SPTE|Xf|o5~$4t6RByW4S5s zG7XtN6tqSn%G0(+h{X_`G+?38sg z@7JTX4N`ea*WB%|6FU2cU+P$nE?lDlo6K`M&ED%yOu5%|`vunW}AIUfQY^NO1 zY>z10x9N1x8NQ=(-_rKnR-WLE*0b_ly(ZeZ=faQatY4SpwR_)Q|G4M8Z*5ywc5HO# z?m?BeiP1fa%2q_WTjggjs*CGfR^XA6^O4VDXSaVBHORZ| z<~k!oUc(q#1tz|U8rWDvU%sHb#K1Xe@!I9IM8kL@Xt~oxZ4zItibhMQFqwhCbIsI2+ zM<3tmZ~y7S#zH+yru|dH2lU!y(N-D!6IG7l12abld6MqYeXl64;q=>exaXxeP^j@G zxp+W3@4@>wRuugT$8$TKP2vlr)h#K|x>H}*e7L-ac~EtEGy7$SRC;pYVe6--uPZxi zT5lw*>6aD9R-CIfO-Q=+6Z@jph1?AxA^Yw9{DvHj`Ud+3_p3JCS8I=G^8Kn=)Hv)A zX|Q8Rtz z(Q0QM?Mw)2+tXXUE_;hAP83B-wQ>$`*3CKW?MwKH-O#r`A91~UAx-{!x1H6aqA*p` zv7U^PWeFPukIUTlopd+Vb?(~M=GJ-7gFI_w@9k;S|J<6jc>XD!)wk-qTuC-Vnofql zaWWs4wI^L~9H}v9khdN+)(NcUT!W4K?`r5pzkqZ6ayht`dsp7BEenU(_m10ymp4c{ zmvQrs@954>GBi9f_c_>dHRYc2$LhLYaz~A(%i3m9uS>Ho7oYU3^PXW74z@-OK2dku zVHOkT6i`J5SH?eD?WQjs>K7GyhL|39RZc!$Q72D%<@e*UR7Ux-+Lv=1=Cj>AycssZ zZw|EFJtI06k+yPQ=f#qi`kfw?+M(Om?S{e#vkNcjWaY+RpcxeA%VcHU22Hm+vz*u} z?BO1cbV-ZcC$KC$F42~C-(_K51DMxq@yYOg$&abSy)hKU=ZlMjoBcW4Em3~}iaTkA delta 735 zcmV<50wDdH8utZ|B!2;OQb$4nuFf3k00089Nkl)R^0i~eGE2N~%3#33iLW(><#4Dh*&~iGE4m45M@5;rKL7tw&JR$0u%6PNgW3%0(XF3(7(yD8XC?9y+Hbjd2&54IT2a?j7RHT5W4@p| z@>1FX&s>BS0n2?Umbtozhip*R|!Ekbjrp^?+-4Sp18)k{7}2e3SBZ z5hp>ywQ0$YIeMn!tn>C4mCDyeY=BEO-3}uj_lNw1sB6UXQW`0Pa2SG;8ZT$AXQlE| z8VLb%Ral!M9`uqS^0fI<)`ll@fBpXZpXP+K zL(yB7JO1uVWv_`7D@9QhMNt$*Q4~c{6h%=KMNt$*Q4~c{6h%=KMN$4w{sMp<8>Z$q Ru4@1Q002ovPDHLkV1ngHZZQA= diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/pacifists_bench.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/pacifists_bench.png index a681dade59e0c0b51807e00d2af779b044c715cc..43f90478cb42dfd4c3eca32c3d95cc135a06ba6d 100644 GIT binary patch delta 130 zcmV-|0Db?{0jvR#F?(i7L_t(IjbrdP(f>~gX22zJ^^PnGCfWdWjf4zhAVo7aLm04W zW@TXpV_bY>Lof`0DaK|1vKWd1*lZ_c0L%~!14zNtHvpGY@r484K*WX##sWS=@J1uH ku)yUV+9hSGWF}HE0A@-OgH2M1ssI2007*qoM6N<$f~~zUZ~y=R delta 170 zcmV;b09F620n-7HF@KFoL_t(IjbrpT(f`jt0bs!;(YE3p3co5s2&+0qbQhp&LOqXU>8j99pELkdGNHZc?zPy$d~ zfb2(fTXD(3(*ev+_yQ4GGb}w|cmbb(vB{yNMD*BzxdvS$awBS_I4NTofXg7FGZU!* Y0N36{8{ihXWdHyG07*qoM6N<$f=~iMdH?_b diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/pure_love.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/pure_love.png index 37856789cec82faea92b79aa33938b8d96dad8e0..b831d68acf67b73480e840e9652c9a859207c7c7 100644 GIT binary patch delta 759 zcmVAL_t&-83n=5iUoOd^SbAXw-h@KTpLb+B87(XmTMPti39!i)DPJ46(9 zvWr?eCJ3AEj=MVR&g{;Q?|a{#C)~PnK2>E)US#rajgXA@cFcB$ay5ThC=^GUVm(vK zYpO|94MvJtE`)tWHr(?4M?KxtwVIYKsQc434`k{gS4p1LR*E{BY6??_jf`FRcA&7- zF-&7aV@Gsd?)_xou~{g+++VYop7^Q4p*&^2JN1K0 zyQ?~R)9(j!mwFqjRQZ2w`=~dYg&=pK_nQy;?;3clw$@e@t-4Hb_te1U(Q%8PyeDrT z_Re3|ge$*_qPLngNs>h0jM_f#{pkGdw-t+Z8NoScWO4ve5=CbknX`==f=nS-lPOHh z#E=BJB1{?BRw}{4)nBA~CJuHS3Yj36L`jkHaZurK+6E7GGGAp;UU~&P%>t*|SyVW+_KN zGD~dElTW(?uiSrGvtiSgZHp&YWLYcsC_FJv2e#AD>vvB3V)=oa)46%dO%pdJrHkE7 zC;Lwu8C%xT(hypOELNpxE=dl;L=vs{&$_g_ZDXGNHxIr#vgu_1s7`3wvoEG(&pt6K z%7=5$c*@j$J89^Ke|19JYyB5p?ENj_M1NIVQ#W)Rq?v0{REXwVQ&~A$Fjr}ZmX)xi ztp%DEtoL7aw*S1bvEx?#5wB~gE0sDHmE)#x@9KwXZ&=9=QLNO+NTbsH{zR%uRW`Bk pT$@HgNW!=<-P}=(O08o{{s+DNRURjCS}Onm002ovPDHLkV1mOZZzli% delta 764 zcmVRUuB1Kq?WULLea_MdBam0t-wGWhM{-MjZ=X!|YS{C#rw#$~O16YC7N6M-n%WJEC6(kZU6h@9Ze_<-*}?$gl@JzZvj8h^6Q0}M5>R4C8W#uJEX5aGyKWJ<=B zZ&MsgF=Ndbld(dF>;0cdc|;+eSCUmGdd$!LZLC=8)c7FTu!&QRj1e2Hnj*u?-I&zrk1^L2N^ zfwvTD0RfakVNfccc2Zv5U1g5}2MlSgbuoXYX*rZ*GMzEhF>mZ%;EUx4+{sHywd4x7 z=bmew0c**#OvzX#rb!)XI!vfMff7ZT$s8rHnQXAt8?sj_|CPd5D+AV&)5OwX!U;i@ z2`3N&&Oa=9j%Uc(XQX3p^DnWqc|CcFYyH1b;9Sz9O@ofa%(TE0a0JSO9OI`8lvH4} zrAb$oXww9s!2+AfYiuOv$;dcMk3YgK>eTRfVp{mDf!x3Okxs@H<`lSY1O{~KDfj1S u<*Ce^g%{dTcOZ&nj(jk}O+C#sOZ*SL{Z$@Ll*j_3?&Rq|swK zo#J>r;&eLU`v;gzCRi?)Xti3fZ5y-MjMux}4nYubO~2ny0jt#t@1G7XmkWPG_WQl; z8HR!Re9orx`7ALE!xTVNGRASt1+`iY<#HLCrm;$;5=_(NT#_UV*lac_fD-h2&1Mt2 zu8Z+eg+c+271*a&0!{H!_Znw)l(qt4M3x3xEE$DWUI-Sm+ zFP;Ubwgo`V#~_}Bmd000O{MNUMnLSTaE CHNZ0f delta 599 zcmV-d0;v6=CDSIb;}8!9VoOIv0RI600RN!9r<0T55GsEHAxT6*R5;6}lRs+{0T{-A zcjn3!OmasuBv{&S&=d7h`iV4%~} zQ=Ofi$@hPK4F&@RL7;ZKtx8pDwOT5d9GL)?Wl?zi1=BQn`+Pz=oyIT>wqM@E_k9e* z;MKc4%gf8W`LIgu#gu$Lzevz-w-rT^Mx&7`Rq5#HNcDPMfB+pF9O(G?Se2?Y9*;Gd zOf(!0RW3QATyj*YN+64OY}@AP>kOMQ;G$l{G)>a!G+`JfJ+Afj-{IcJ`#jqO6CjEr`u#rR@fgdpFijKJ zbrV1gHw+``)9G}vLN1qMHk%QKA)QW#*=$BGmrDTsejm%SSXx?2;Q2?N+2lup2Txkq zwoNvhMG_ku8?3CXB!GBor_WXf+%SAiAxJdBz{VG8aFrUv^TU-0-*?PSmk}yq^ lVzG!M=JR>7g7Lra{2f|SP@ne~x@G_X002ovPDHLkV1lmGDz^Xt diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock.png deleted file mode 100644 index a9727705f69ad2eb4a172b703f6b726fe841a4f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv=}#LT=BJwMkF1yemk zJqzi~S1W*OwxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHO@Lq;aB>!N_{ z%yt&AcovWi0*fazFuVXNg3)M}G61C}ursg#RT>x>8!#?_m$Nv;eZ8x(p2rK(f2!Eu4S$=yd{_dpunnLoEE0O$-cvoOfVkkQNXSV0b!-%`E4} zfdee5lX(MpR^(?iY?6@Rld))MN@R%Stsbp`ncVu`{viby<20vrO0uz}A5mTp| zCm5bFu`S@9z<5;8!I0sJ`3CLPx$R7pfZR5*=&lR=7uPz;89gC3xVm4v-~62dam}4&p3`@o@dkl2{FSk zh&BKY9*>7Ouh*+c6h+~5I+^bKUi`$|?{@(a0O;WK$;i+5S7@5XG(Hc4P=)}&Kod3S zcfU6c01W*F?$h1`NoB5Wv$o-E5EuVE$7 zEDi~3+cxBRF81?q2w9dHI6%a17=Q+<(gYw)Q%ME{CL}8Z0JziuK=TX$fp%Gz0)*}R zz-8oE3ED($7|rufrwzW{Zf0*@;q@66$Ui0iuIub24B*oskw8hR-wl%Vpss5fOUCol zC?o3kqbv*n@C%|#LzBFIw@g-ot|(x-rmt)3*Be{)ADob1;}+H7uK)l507*qoM6N<$ Eg8O){hX4Qo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock_inactive.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/redstone_clock_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..64683cd595c936ccd3cf6b3e134935b623e41a87 GIT binary patch literal 419 zcmV;U0bKrxP)Px$T}ebiR5(w4lfP<&KoG|75d!IwhsX=077j#H_>Th{!6&c~QXL`)DX!Aa&c@!_ zXWQgAVTLu_r5L~2apv1^XLn9v7&@#hOF`eSs>-ElDr*d1|EquEGtaYI*VXVpBWIc> zK_lSDIF1s$Uaw;3^VvmFWH=0i#L2ncZbBji$RX$#V;}Etu4x)WVm=ARF@yjGTBu2% zPcMRBKL`N|{SBxQ0%R=9VugOz@|n3n<~)eA^UQ< z2ob*D2R5U|j-XA{hS5C#>a@Xq-LRL`VivMZD`eS@Yir9z7%qIFh2qK+TsP z)O9V-lIQv8DPtPcZa_ziNWT-{D6P3Zst N002ovPDHLkV1n1QxGn$y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_side.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_side.png index 8fdb9046c05841204abad402291ac050da81879a..b33408e57e71a03d09e038ee0b003339eeaa0f65 100644 GIT binary patch delta 409 zcmV;K0cQT32bc%2v;mXG0Zfy#0TO=!a7jc#R2Ufr!Lh2GRTKu$_3d+J2*fmsosCVp z^y$+1%r*g^K?vdl1i?lK$aU`gXK&ZaFCX6z000000001N`0&#k-`$T95&@iUuiap! z+*c%J@a<)M`TDTo=N~TLzrBp;;p)~srWvC$RwHzZU_q`+mFOOHdVx^4u>z~W#KbH-H#3YU}RaOE3?zb&~)8jdfr2qh+hFv8I z`1ijj004juDrzqggOvb)H}`*~k+4!$s2s52R^^sK490kz%Su^QdfE&UC&%e=y0L7y zSGiTA3{H<^!1KDyv=VzSl~UnW4K|!46v;hwWVoOIv0RI600RN!9r<0Sh0Z)GcbV)=(R5;6}lf8-+Q4oZ` z>T_mTP!q+>#AGvbGc%vrMDQ7eMSOroFcB8yI(JTY8O(V1>Rt@AlXIYp>Z<V#q`f=H8JuP0n%I!qH~20V9dkCL(CkZ{S3PL;-6h&^Cg19}_qS z$JxLBsG0lQ9w7gH3U98>^Cv5kn4*ywDVTdZ`9Ca2dWfdLh%es;??3Mr5FlZR#Q1{$ zdFp55HLD9~mo0>$N1UpE|FQnv0wJO|gfKj)el>qLY70*B$#;?ts0r&~}m#p4* T#rzHA00000NkvXXu0mjfDlf+m diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_top.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/scaled_chest_top.png index aa78499b9add0cff4b42a9e215b150fcb8ccb0cc..c4ccf4a9010773ab2792e9dcb7161a41ef16e184 100644 GIT binary patch delta 444 zcmV;t0Ym=J2fGKbv;mXG0Zfy#0TO=!lSxEDR2Ufr!9i|hMGytRcv;om2npDMW)H{U z3f!J6pkZf?G#2*%l}W_@>(4(1000000000seEI2~pMQ*1<+&HaFvgj2oz~c)aE7;c zzJ5zK{Qg_z*I!Di>?#8@PV;%%=~m%ci;BDX_pN>X#)e9)ieUPfZf8csv*>>?6Twc| ziyasn-tXi69!We`S!=oP+Zd&^I5T$IN;wlB-G~jZRbG2ZN)l&UCr-CadsKNoiZCL0 ztisqJqY{I2j!L}NcB)0hxX*F05)o~{hL6wVN%9>Fbu%S>hV1~)K2ElN5n;EN$YST;)V#A~2Q87~*ryIjy#?Gj)ilm&3 z7_i|Mmq=(_Mt56P)>>xT48&eVP%t*UeZTCABwmk)SpK`lnWHjR#Y!v`Qtdj&+xJ1) m@b^DY01O6&0sufG2>2hoQsm@AkoC&|0000ISp~ z&cmGNKr)i3G%ZoxD9vVb+I+QUk!-`S1SnV{KviLh^O%$yAw)Q;C}3z+dO5WOo}P=R zXO@XFn@y(?U_mD|VMZ^Fl$$j+u&1CJjY+dM(FuRg$AN9eoQx}eBc>bZC2*SN%{H#l z5KmQf!jL%4jVA2f6v2oiV!t&pXoUw6!LT?>NFssmW(cG;;z+P=JTTy_LIP3PbJYwS z-6Uby;3f^}yb^2{n?+(8sBW%VhJ>kL!SJFe1>J7pKG+lCnY-b1CZ!mt<;2IOY1;_?u{OW?=P)6ECX_4;p{e@?#`4)6!CBIMy- SEUobX00006TfDrQIY3@!}Mj}oB6)aeBU%SP@2YnBE~<1D~mXI zzWVjr7vPVD)fyJpb|fr+1Xjw2>A1+2=HQP`z)eR;(w<=^B!7oRz7d4uWkkh!DOQdH zr4+nO4qh}WVe@_v!bn=MM*^LI1yqoR@={Q~k0hFPdxYIa8;y1crt1oUTtcfx;AFCL803q%Kda%A1g=_}s5Z{A)i^|T zzazdFi6mW;(0>UG!w_s%_p${s?y+0P+U|`|F*+MqTwWIwH3Ht0{>UH|rV$oOcs-a! zdE>TcV3d>F{jq7u(>>t+$ZhG7Md zJjguA^X4byj9)_|7`E(QAtio_ylh7(?>)g(POmkh<4ZP{D)pZykq1dAY#UaPlfGGu z1$uK5_GjhCNtC4Q7>0(;egWf$g{iM|7NGVtg1`Ks`U3xn4{bwy-&crQJpcdz07*qo IM6N<$f;Z^jhX4Qo delta 174 zcmV;f08#(=1J(hMFn<7$NklJZa zy0F>Kz`(%3bnET|jO2-K2sX_yeT>WI%|giw$lwWc3Px$Wl2OqR5*>LQ@c*XKoCp=vE$fxmzSN`P7n|h35k#b2}Fk|prJt&NJxAGAHp{; zJ7atZT^dNS-rIZ3&d#no2dlO0V;y`BZ?^LG`SEA(0T68No@IOgLd(Vz$wp&|(~NO( zd@h4&DXH#7NuPTF`NaU2%H;(gTj#`DE4NSY+=m(L=Y>QHY9@Ke0GDh&6+0Z!Qh0q} zjA_=&Ahv@BteAxiEGWC7#7RQxQ9q>z2+PR~*G!^5VBlsI4_h5tGnzeCFlqx00IWI$ z45BFVw8x7zsk-u1h6)T;h#}ze`jKD(gH~+_EqJH_>MQ3>jS7Oe zI@>5ptPYb1;u20k4~CcyAd$xeX9%r52C&uCPP+JmT~p) zx_c5aNMxbC&+@uyUmWwS(WCIQvU3u7sai<4m-q)@P_Hh3&Hy{D4^00HAkL_t(IPlb~?i(*j_ zh5ZLTf5TAcU-US!kwO21$ps?~1%(a-6HPRd7C}ToL2+MkZFk!Zca6lr;0&k0_gY5A z;5;7p-umiR)w!DAKY!qve(7KEs(XRq!JdYn>2!+o`7A1z%c#|A7z}>~==FLi6bgt& zqX-6rm`o-}r_;!0v#3_9Dqu7kp;#u_Z#J7~wOaW4`ceVM<58}g%jJ+tr4WzD;rIJtGMSWM ziZ{AkE?6#?_azL6LyUjNV|Y9sXti4CbUNtudI|dT4RAOdu-olq?ep_f1#q$5Zo}bl z+-1D!1_^~i^3NNx9E1K_6WJ8E+x-x5gHTSVQ^ck#fc<`tQmF*H-ToBd^?KoQx#08p zQ~*2665ik6|62m5#s63=hCm>o0vJs5kZd#>MFxZ6pC)n&*Xw^(*4R*`iTQk9X3H|@ zgG3@BHCil|yPIscTWR=gHp6PQQURyaNsQ6&_vH|EbD`C0RRHt~GxIDht^k;w)Wu?f zZnrDG;G8*`a5xN`%_acu6U?{3vK0XR%~5tb9pzE2*J}wNgszK3B9e#+D4tgU&%|!? dNk7{A3(){>l5P)fZv6lN002ovPDHLkV1juB1?T_( delta 647 zcmV;20(kwnB&H>>1`rPhVoOIv0RI600RN!9r<0Qd5GsEHQAtEWR5;6xlTAw-Q51%s zd!2DUa$zEvMNp84B8m_)`3K#bU2*BEbXy8tmV%gqxKZfd{(>yTt=(lMSSm_T#6?ge zQ74x%B96mM7n+2&f<4>!o`?6G^Iow~&ZfLlNt%+TAf-V3r5OOQc7&w=F7V`Pk=a%IXpZ>N{N(`BuNOv5W_HNwOZ`% z?ozE*+27x1dU~2DiiqQQ;NbG|k~B?m9EYo`D{R|FDaGmODO+1xY;JA>(CKs#LLh`d zDFuK8n4O&^m&*}F5su>!$1%sp$JA=IeltKen`M7$YKoDO5rQBXI0%9O(=<6cI%0Ko z72CEELa?{D#|L2j88ALRPPf}-ZETG9jm7}rc^>U{8?7~sXQ5Z?(1+CPb$(PTEbQ#i zZnvK<0}zHGuIrM?WL`XD5Avf@p|G*R!NCEJ;|zA-c^=o-*MwpCS|rG3vsjkJ$;rt8 z&}x6Ra9tP6vR-WJjqtW!=jYNAlarJEw+4Wek|>HW41>kRMF8&Z?%3Ym{$q(sDb^kz z`DB`WzPaK1*Jr@(?JY_v%H=YJLIKk>QA*+aKFiC?eJA;R9<4PWn@yr98jLVAGlNnJ z&+{miO3csCV_6oy@3XS9(g$=poqkfA&E{(W(95^$x&%Q$7={cF4^u1_DV0i8t5pCp znG9!VXIxxd^pj`+-7XIg4@^u<&>Jg`W9H`O$mjF;zK_-#%d)U63)3_K5dZU? h(-cxtq!9mTzX8}<>V~ag6d?cr002ovPDHLkV1lKqHfI0; diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate.png deleted file mode 100644 index c7d6c477083277fdf501d3053d0b269711148d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|R(QHNhFJ6_ zn`|rjqp!F2#DX;|&N^^el%;St@7SWmyg1zBQhmu;yST~-)7+b8oUQfW|An$0yL0K@ z{~IQYwU4QuYw;J{fRhK~wg#13 z3`u)h1-Xwf^h6vGJ^sVw@Rx)mOm@y2T+O|79vHKPMbVz^s{joF@G< jHZYhlb*`j@gam`BLXf$GKJQJSn;AS^{an^LB{Ts5NNHJT diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_bottom.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..9af50008709b95f9c06116690ac97871eb445f39 GIT binary patch literal 335 zcmV-V0kHmwP);SdNsM?i50 z6u~373~I@1@-=VUMNGCco%gjfvyJcf)jc1Vu4$TNqv@=&p|~{C#^-(Q?zdwKP9}>U zXf|GEQ%qmwXipkx1EMxaUd=ZdqBT}R1}RsI?ML+jE8jVNVB; zt9Vc=C%bUJza+yK7|34$r%4zQ$sFRPRe&M!5ClyR;LU8?Lj_RGC({FXlZGHJE*qK0 zNDq7h5+e2j50 hhUil%V-Dgu{{V{Jj@A~~+)e-h002ovPDHLkV1g~{gRKAn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_east.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_east.png new file mode 100644 index 0000000000000000000000000000000000000000..a79c6da784fd23decf07485546ab370c858d82c5 GIT binary patch literal 337 zcmV-X0j~auP)-*R6e6&MZmO-;cJyC959(nEa?uOg-6c(#$ zH3HT1brkE$(LZ_QHHi8_@@Bb<5XDka6hR)M*a#%d`|U9Zh++T~p~T5c4ptVv-4xq^qybOVXo^st;MSSTO~U*(AxJi&iC6n9cr45 z1GUR-+Upl*;DZKQ(_5;lO5ff3kRb%prV#v_9wOklKc%HME&v!&0z@N(m+tDI3T7mX z(D+t3c&m!d%tfL5B0%#2@i;!RNTXry96-ecFaj0x*$xnsNwGq-A`TF5#=h@|Vg&Rv z=@xr{70_qIQfeM7Hjq|AZv;5@Mh296K>-TYCd!Qj653OpS~_jzI5T;eA|#eg#cr55 h&RUI_gA$D6`~&VwY^Gvtpwj>V002ovPDHLkV1g9lhSC54 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_south.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_south.png new file mode 100644 index 0000000000000000000000000000000000000000..b27220bb86e1a6d280c8c52acce995534093b562 GIT binary patch literal 338 zcmV-Y0j>UtP)}5fk$&8;Sq@Q_XHG< z2cQTZ!Dmh#%#vxQr3A#JX}dF>-R@f7--hd@9m=wFj3)I5a_8WHYma+3oQ^v`tg2ZM z0_yQRfP0F81FlgKWCkb}(^UY^ilPXs(V`MG2>0vd)}aDs_683K4bqpeQbgn3LC!kV zo2HEf_M1cG#N#Lc>$qe}!Qu<*i~_7(B%t-sJkwOji3GlpvG2Nb$Qf~3XwzoV{PcAt zr-d~AK3<}DS_3Vb3iw0Xb+q=YfZFyhz%B&Tvi?7S2N(xV5XiN1+E_WV3#7xOgG1;K kksOAJMu;tpET3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_top.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_top.png new file mode 100644 index 0000000000000000000000000000000000000000..9af50008709b95f9c06116690ac97871eb445f39 GIT binary patch literal 335 zcmV-V0kHmwP);SdNsM?i50 z6u~373~I@1@-=VUMNGCco%gjfvyJcf)jc1Vu4$TNqv@=&p|~{C#^-(Q?zdwKP9}>U zXf|GEQ%qmwXipkx1EMxaUd=ZdqBT}R1}RsI?ML+jE8jVNVB; zt9Vc=C%bUJza+yK7|34$r%4zQ$sFRPRe&M!5ClyR;LU8?Lj_RGC({FXlZGHJE*qK0 zNDq7h5+e2j50 hhUil%V-Dgu{{V{Jj@A~~+)e-h002ovPDHLkV1g~{gRKAn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_west.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/temporal_gate_west.png new file mode 100644 index 0000000000000000000000000000000000000000..ed67fa04bc5fe2744edefcd4e389fb43f5a10705 GIT binary patch literal 338 zcmV-Y0j>UtP)_N2i7X^rJ;S|4uumAu607*qoM6N<$f+9wb%m4rY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/trading_post_bottom.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/trading_post_bottom.png index db2e6e2e130f0c43ace69afb3f47ad19b605a817..4841228acfe89b0d5bb83129f9eb184e0ff942bb 100644 GIT binary patch delta 366 zcmey&(#bqQrJk`k$lZzY=1HA;1_lO}bVpxD28NCO+YCXYAmIsbo zrvEg!J!Q7jqSc1%>3Ur34uz&#>dt%&3r-ZI>228(DK68wE^XSu>OYOA4Q6%gr1HhA z{r_yC&!SE1|DLZ;vMk8`b=1A!L75}tiracSzFrMIr@dyM{w*D|i>-Yt_X2&!;OXk; Jvd$@?2>{-2hok@i delta 602 zcmV-g0;TusB!3BTNLh0L01FZT01FZU(%pXi0006dNklrr&s_U8*0`Bgne1AP9-}m^!A;-b8Nh!ra zAMzgrx4houtSn0|n9_Q^CWXpcf2AZzs3;0@U01$A(C11uh2iju=81!ds~QAh7zzpn z*f8Jk(|kUo;V`6LuP0Suv)O?1JeSI-itoe2z1*Qqg-bZsbtb`p*YEc!id=C*H6(-| zzA&_@bx-^h2!F!?3=ZS5M~A~39gn^wzFaO{qRC{!L=UBn)|7!6&|pAPwS~S~twa^m zqD!02hJ7N5i=ruWghUS6lZh_~u$IfEIB2aU@N_!y%H<4+)AYtK=s$xKSCfJF)*?mkrIlHjWB1@m->1ZotFS?>hp?&r_V9SL9v0r2haY-}8p3jEbPp zGx8e|U6M4*i^s*} zLnVp=l~MwsD6tbeCUNZE-4hlkJv~3ayYIgH?w(e7XT~`r4}Z3}qRGxys+MJ+3k=!2 z-c51`FT&KB$XS~!y^n3XgwF0~1(J(_VhZU@CJC5@q56Il*yuHJdio2gFjUA(U*9Uk z39%r@8D-$W$H5PXuZABIa7{P%;zFT-R4Rr0`+I1bhH&pIvhz9RL~Iz4ZSBh&%w{vh zF|i~YjYbfj3x5mq$Y!%}-687rC78Fn_=Zmj2-o}kbRSVBf^FLfiCGYgaeh7m!7Jec%DaR9Z?j?eWJng za-A*=G#U*YA0Ol3-~fk*hvLL*Yimn_rc>2>7CQ(6oSpqvB6^-r8K$_nXiKJ6>nAca z2b`T1cU^}7VsyJ*Y-~IwtsDZIDhppcBt`*qQb$4o*~u(_00004XF*Lt006O%3;baP0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmwks%j<00(qQO+^Rk3<4G^0t=|O zrT_o{24YJ`L;x@VFaR)G(ALEO00E^*L_t(IPi<38O9D|8oppiz1E8z!tS>)qlHrZrth3=;HXs%Q@$s_uhTlR3$*bbjzUG zy$H=5M;XR{<+2A-XU?HXqSNp*S1@V58l{DU_(ZXOk^RG2hB*Kv3b41 zP>sL=mz#}}Xow`8gQYkH_7h|_(-djiq_>h3XpTBoEQ*yg6e*?{;6ekfrtUdVi%~9@ zquyhlKKd29Z*S4lgG1epL+!gwT3ugb1Edn2rp69`)e|iK`P`+Os|^~ymU)%`{pSKF zk*%?Tx?iK7}z1KV|OumN=j{$U=dRS&FMT2h1?I>bNf;CaijvKfM8cKq<{{)>| zhfQIiCICDJW+P4gmm){?$CuS8EP4~jAxZ)q;w15)SK>od4cuD*P_Sw?UloWF8NfGc zxMHhgZ2PY9$aDwEc2Z>R*c5au(hH-3DkUkr9cP5{F|MhD#0KgphfdNHM_KkOoxz2M zC(-|y^z$Xgr1yY2IN(C#8pv}7{Lfj$QkN$UK=%vPp5%7i>fA2?0000Ix> zAqoM#{zlYB>n M07*qoM6N<$f|`vo{{R30 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_energy.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_energy.png index 27e252f1533db44f02397055c862273e63100aea..2f04b208d9ca4cb6a3310047137a7ddab025bc3f 100644 GIT binary patch delta 47 zcmX@bbeM61A*1U=BTv4zbvxY{7#MUsT^vIs!Y2zbY6*N)pZF9g#Ng@b=d#Wzp$Pz0 C1P%ZI delta 182 zcmX@ic#3I)A>)LJMxOO2`-|iag*B2?4V mL&%4Ev`OYW}z>do2c2@W-@z$?V4R) zdruT-3F-UGIalabEVY|*D1PO&DHlWa6e`^GW@TBQn4NcNeb0k~>k1z4EN5U~FenM~ t3ugFF91w#kJ9U13EKswKr;B5V#MFtMS^}@KV(Nh+44$rjF6*2UngFwpV@Lo1 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_fluid.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/trash_can_fluid.png index e7bd60ed26af99d23c6807525ad7ddd927bb4960..55fbe64a7141b619bfc7b1e78c9d7e2322d8ae2b 100644 GIT binary patch delta 75 zcmeBUZegAv!O6(Xz`&qto2#@@QJ2w7(bL5-ghMttB_UzW`t%ZuBNFz~Ee$c^eFPTrT=FNHodbNpbc+xWxT9Lu1MLOZoF-?yp$2 z=GtA!(5bI2rh73lAb|wy3wM7OJ)Zve!Mx&?-IU5WFS|64trR{PJvTi8dcA`P)oWeoQq*UD)sfqvP zA6W1BG;?=3>uJl=clOS|EyvWiI}%WV&R`0v!mc)J)0JTn$`?Pv!p8uhZHTP+!iOgSg>%cmhg3NIn2SJ Xwvw6cf6bO~1|aZs^>bP0l+XkK{C*Xv diff --git a/src/main/resources/assets/utilitiesinexcess/textures/gui/vanilla_search.png b/src/main/resources/assets/utilitiesinexcess/textures/gui/vanilla_search.png index 774e84bb025ea4bf4e1ef2c04518944eb107b1e1..20f18e2c753da8352184b83ed05300ff5192736a 100644 GIT binary patch delta 67 zcmeBXESq3ytKsS57-G?z%)!h1*I)D9yLbQ2Gb9HzIVN0L5ZLU-D`nad)SSTM#mJBl Wn6*OV;jE(!K;Y@>=d#Wzp$Pz6m>8M> delta 88 zcmXTxW}ILdWb5hT7-Hd{%)`t3_q>Cmfw6IN0^>}^qyQ!_FE5E18iov!?^igsI2W1p rxE<~&;1CEi{BcRpxxD;)eHH`5B_VIQg&U8DFaUw4tDnm{r-UW|{jwda diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/anti_particulate_shovel.png b/src/main/resources/assets/utilitiesinexcess/textures/items/anti_particulate_shovel.png index 55651ffee807420b7bb401c99e01ca01c527688e..fa89721d87665b055cc75c97affffdefbd3b0008 100644 GIT binary patch delta 305 zcmbQwc!p_$NG(&67Iy3=9k`>5jgR3=A9lx&I`x0{IHb9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!CBxDSDRGs}D)Rygu_bxCyD+#j`D{xoy4f1pttDH{G78)OhW&kE-m@r&AsZ6 zdgSH_3(nNrnx=0^n^E3TZWb_k->ld56SzJ4j3%h%s#@mV_JnsOUW^Q$?J3$bZ9@Hlj$`n2^>bP0l+XkKDKcjv delta 130 zcmV-|0Db?=0-phpBztB_L_t(|USnVwQefGi+y7x0U5+3CX_|Cr7Z@A0q>yF^Ompn| zUa)2mn`i^jHG^o93;+R@`S&Q(ymSBW{~9qzDANq$ldQRA_7k{fk^s8RBmuH*25F$! kX0kQI0LT!E3?K&p02-K?Dwdm{rvLx|07*qoM6N<$f-Mg<{r~^~ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/architects_wand.png b/src/main/resources/assets/utilitiesinexcess/textures/items/architects_wand.png index 57a08208342a5159d7d9c2625776b0cfe4684897..0eed9c5c5c6c312fc1473f3db5be4f0729c51105 100644 GIT binary patch delta 346 zcmV-g0j2(s0{Q}wDSrXk$t-^W000DMK}|sb0I`n?{9y$E001CkNK#Dz0D2|>0Dy!5 z0Qvv`0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2kHR}6gdU-t4?eH000JJOGiWin*g=|w!B0+WdHyGzJEzXK~y-)V_+Zx%-*(* zfouTOycdeu(fE6bHlS?w^vy6$AU2Fol+%HV;f6#vH*7YGh$hYekY;3CVVXfSv9`mV zi>#Sw=OYIgx@I7~g(yRWh2;LrOX>bc4oGO293p6dkf6+eJvHb5;({vw(PDzI(?Oc_ z)m;Az2ulA)^HUBZLCpdJ692W8?EZ@jY5XTS)q!kQmACvaA|y|mW}vMMAWd=-+W$c= sAj@WBO>govg8;~ONns6;(;4Uv0A`b^!kIWHlK=n!07*qoM6N<$f;#Dg!T|A(=oSX5E;5Hw)f zpWFZ6Jh%_%izp~EM6swcN=QgBy?F8B9}6j(PhY;waCOBhhGl@B)o>KQV2mPr3l-QRcfsXlt8Uj?!_4AkZT}Sun1^L zUwiMnbFN!!WeiUOum}@eh$=u!Am=QFI6noTEhJ-t63&n)5J0|{5ujfXB`s1|83Ak; z0jRtar?zkIUEl&fh8DNdZvPoD+Iy3pKBE8pWG7L%>9)}WUg`h<002ovPDHLkV1n?6 BQG);g delta 331 zcmV-R0kr<_0rCQnFn<9oNkl<9OWNHJ0!hr9`6CVd8wnwt5W>CQ2cMv2UsV+V zUDsi)^<4M~dORKg?Du;g({-I&k_7LdvMd1@hQUL--Hs@VIDef^Y&IM3BoIP4Yb{BV z&@>GI(=>T#eLfzK7-N{{nK+Ia$ML&`^Z86&*FNxiy#kP?sfPd#hXeQf9VsQiPXd5E z&uQD1JkL=|VT?g3MV4h~tpU(lBc)^_IcDs>fnFqAiPr$3f#d4aa02pI@ z#WlFt?)!et2SlN@Hn?0a{ukzXeuAZx^nH&~%0q9h2q9ci6mGlSx+F;)uwK9FDcgD; d*3qT+L_t(I%VS`mHs~}k`Hv41rTL_xF;+~_5PX`E4IyX%4~H8V zGngvF*&s}k0Wi(TG|>j2+YI9qZ2-k#0K!K4reI9A0mvBHFtS`gmH`771{5V_iZc^A Z0023)2dI4`k9Yt8002ovPDHLkV1m`CD`@}# delta 121 zcmV-<0EYje0iywsF>+l=L_t(IjbmV-5HO+(80nk-$EV@k#nUKyP&hEnYncCH)g1Dd z8N(1JbVax{004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF;8u3lcjrdad+q~pXh&4VTJ!By8vd8s=VcYkRc>{Nr+$O zKg>lWc?SeQHtMN4{}&Zf{EzG%qBM&LDEwEGH~%jpp!gr=HKJVsvRPlv6~)g)8^Fse z0@f_ZFZ~}qa8L<)L4Z%{zqXPc*3gDUF-`+Ong~S|Q1bztn&l+4{|g96lOE3?%|;rY p|3w9*NY@Mk931@rL748D4ghMCfjsZ$R&oFU002ovPDHLkV1hnLeGLEr delta 168 zcmV;Z09XI=0>lB3B!7!ZL_t(|USnVwv|!nv+yBuqx*D7Sqf0000~1L>mIL znN>v|jFDYJlxC2vAdPYJrh;i6BONd%&Jds?kYbodQEO8$M)nHPUVv#P$qUGV2yz8k hfrxAf=`k?!008B9J}H8SRzv^*002ovPDHLkV1f?&FGK(U delta 200 zcmV;(05|`s0r3HlF@LK`L_t(IjqQ=m3W87&g}>_$mkSmxGz1m&v3ijfJ#8eZ6+%=S zX)!I#KoqIgp5DvhKYyq?a~MTxR)$Sd_%6H^V$YV`tn#yn#W004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF;8u3l$0yg3-jR00006VoOIv0Gj}|0JgkDIe%pU007QOL_t(I%VS_5 z1I*sG?GzO6B};SJ?CG1Mn;SNhYye0DRP#z8eUKyrkTkCX(&tIl40kq=-U#GxCROta zpyq=>dKHL|RiU_u(ti*}(|i@lX8eIBARzHyS;qLkh>+ZWsOCLDO{$b5$Tc8? zh|(+~B>!JdLL06DM1wFvLqN_1DbQ7Q#_D8{94Kt?`k5rB;aXsA&KI N002ovPDHLkV1gvEiP``F delta 173 zcmV;e08;;o1IYo9B!7@eL_t(|USnV&11$S<`#%h$%Mk=1O_T2I`X9T#mvjS=HG^o9 z3>X5MmDBzHgD|of(V9U3q}iw?1#SpQnqdH>*>_?dH2AVZMDgdhNE-nswxe~p+UU=1)A5Htj)5M(n5j?Eh|%{SK@lV<=-Gt2-O#y{$R1_uWgWCLJ|L7H#f zXuxU+K?7i#VFn-@g4GLJT3T%C>gv2?C8D7Z080l7Jzwo)ng9R*07*qoM6N<$f`C3r A2><{9 delta 287 zcmV+)0pR}b0mcH5Fn<96NklSmUsF?A8(a zcjRZWpfWRMM5^)+n2dxP)Wi(MArFVg+B4mI>~roz7yf`GNzRl~qp$d+_oGs36nmkG zz0kDZ`uL-IvUz;|xW1J(HR~)DR_x*ds=(#`6Rb&9;r?>3-+z{FL0+?eE8*c?u+CC3 zu;jMvif54~H(hZZ0$|B<`08zT{~005(qRIn-GPX`uw0#gm&y(JQUmbvbm43tz>d&Z zpcPN$suiCG(^ t97G$=y5;CeSTJ+^nlEv7i)lg&6N7&K8ODv9k{2@ofv2mV%Q~loCIBLhA;|y$ delta 121 zcmZo>T+BGZuqf8k#WBR9H#tFqwa4Jt@5$=_jSUP8Y%2cAtUi<;zV5)y_3!Q^dcrbC$>GY|+b)l)dhkn>Od7DG&<`$lm$MrLM) X=a!0wQ$8Nw$^ZnOu6{1-oD!M8RXczNI5@BjumM1z lrKQEDuCC5YRw5eu005-EX~#-;0xbXl002ovPDHLkV1manE#d$G delta 185 zcmZ3>_=s_WVf`FW7sn8b-sA)YCKD5rf~8BBZgjdSV$gt9q{!<=e_M=~~-Fpt} z%;M_zE8~Bq@fp1P|F>M<;E+kOaC$;QLWA*!nSJ~U(oUPwQfz&eWVx{G@Bo2Qd1$1} zR7sDb*1vbT&-|YFqi0D4bENJWZk2Y%U5qKrYHaN6VoF9=E}moU0jZCQipr_~|1Wj= kufsn(C44nHGhQ$=G@Uej>)dqv1_Kayy85}Sb4q9e04(rH?f?J) diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_1.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_1.png index eacf588206c7a86b67279e96b85620a342ed9f8d..ec31f0d5398de5e3887422d7fe1f7c2e29a6db00 100644 GIT binary patch delta 146 zcmV;D0B!&A0lNW^F@JSQL_t(I%VS_50yH!8RXczNI5@E2GT`QV zaI0b~Ov1_uWgTtSjI*BcXb8BQ16TyOlJ zQPY>83m6#~7#Os)wAlXs{mU-(hw~Fb9q5T@=mP)_G&k6afZpo>00008RZ9~C_T?-7Cv1R& z0}Cz#Zmu`}kIfLG3;=1qb)(@wh$iS-EiElJb#--KvJ%nI2NeKrCwagDI00(_0000< KMNUMnLSTaUJvO2M delta 210 zcmV;@04@K;0s8@vF@Lp5L_t(IjbmUS0yH!aI0a(Gld_{r=GfOczII!T7ly(pzXb4Uh z++1(`pHb77LE1qGuL~F%7#J9|w6xg%{{71?^@sBlAty7SC!(Pb08yYil18ztp#T5? M07*qoM6N<$g5d^MfdBvi diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_3.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_3.png index 6b46595b3776f1041f8dd7d9199eb09c907ff6aa..23707ea9d7562b4a6bb1f3c31111725b56abbc32 100644 GIT binary patch delta 160 zcmV;R0AK%!0?7f8F@J+eL_t(I%VS_50yH!8Rf|nP>8i(`mIZ*qbHlZlB*!P2EmH#*&vu@GGbWLRlQ|0xeK`_Zr0?mdTf zW^wiVmGQsQ_zd3t|68taaL6QCI6WaDp}}~=%szevX{SwTDYiaKvRv48cz{5uJTy{f zs-#Cz>)*TFXMRuo(X*t2Ia2owcZBKt)8Q%^8V3y&QaB=oo12-r%{ps;cKu%}+rlyP zd_(YNpEMh0AZRu@oYq#$!}EWx+P(B6%cf0iY;1J&_U?ZB{{H?qLG>2)f?I@a1$k>3 Y82D-(HfeUdMlt|_r>mdKI;Vst08b8Cp8x;= diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_4.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_4.png index 3b94fdbaeb851fccf405fd2ed7378d03e9fe51ed..93eba59d3fc09ef921dd4d41a34c0b50b56a3b58 100644 GIT binary patch delta 167 zcmV;Y09gNk0?+}FF@K6lL_t(IjbmUS0yH!U0mcyqlm5e7Iou%HXVG~c?>fYlJZ1|VyO8GvpGh8MK7v>@2j)zx{)N<>2+001-- Vm}{kx-*W%}002ovPDHLkV1j~sJu(0Q delta 215 zcmV;|04V>^0e}LKF@L&AL_t(IjbmUS0yH!p~z}sUchNPEM4lL+` zFwKmbz6{b1LU>();R0mMFo4exMg|531}!Zuw!eS>vP=Ep{6x^r=!t0P0|1MrMHi8M R*~b6?002ovPDHLkV1f{LTOj}d diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_5.png b/src/main/resources/assets/utilitiesinexcess/textures/items/fire_battery_overlay_5.png index 90f8c5d7c0ffd96a8585f7e966bc3c322d12dd41..fb5cec7d7f4c9aadf88e1d9d81dcab7a3ef921d3 100644 GIT binary patch delta 178 zcmV;j08Rgl0^0$QF@KdwL_t(I%VS_50yH!=3E7=nx!3t2)YDo7@%v$ zqoywk9~WR`U|?X-($Zr4`}Z%q)E~}II8`D6 dlteW20RVZpOM|H`BIW=9002ovPDHLkV1h1?U)KNt diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/glove.png b/src/main/resources/assets/utilitiesinexcess/textures/items/glove.png index bb0824e5fb21b8fc9be740f22541557a10a062a3..2ed89625a8efba1b781427014758fb7480700837 100644 GIT binary patch delta 193 zcmV;y06zcT0n!1G8Gi-<001BJ|6u?C00DDSM?wIu&K&6g004|hL_t(I%dL|^4uBvG z1hE`Uj6dgz-2DRKq}JG^tOX_5WYYt?Lm}W?e@&<8?!!fIh9!isYr(oVQ)1+vb1noB zGQ(ozo>ICbfEc5O)B$W1fbIZrp8$;s>~KvSt^$4u*B}t4$2#TdAVQ3t%@;VIh7BRj vv5oRLNl&;qPVdgTNFXY_s!PL{H~u3JAE{*Y=@m5B00000NkvXXu0mjf^v6+2 delta 205 zcmV;;05bp50p0Z(PHg5C@Xo)c;9E^FF#MEMn(Hy_o+6x$E_^8B;zSj{=|@w!5h00000NkvXX Hu0mjfUQ$%h diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/glove_bottom.png b/src/main/resources/assets/utilitiesinexcess/textures/items/glove_bottom.png index 2b5a16dcb0b63475029022a96537a4cf2764556b..83169a21125b49367ed1e6dd4de227a50e1c692e 100644 GIT binary patch delta 109 zcmbEak-aXL9cf^{(iXGwYa|K%Q^ z&(F92KRK7<41*U>B70Vi+e*cdLe3i#Zg00Xdh2cUBz~0Gh(! M>FVdQ&MBb@020I}<^TWy delta 101 zcmZo*te7Af&%(gKu=SVuD;He`8@zhq%tN|^xJ`6JlO0DBp^!>a zAS@KNx36Yhh#QxQ?EWdn;nOzTpcE>V;&Q7RFP5R)12UDFnQD2)_0~t`9*~$$k_>Mg z-o_FD-sc5Dzatb}cTn>?6!ZuM-uDGTk5J%!UJz7g>YIoth8au#@j)E)RN8G#H>uD7 O0000cF8$xy)%Dl4SEIvg}yttTM!GjTa7nl9xS9|~p88>%^ SbseYx0000(WNa%>0poK-a8| zl8NY%0&1--WDJl-1+>`!$`W8QLEk)*n5Tf0c?L0NaNpm#c_wWGLt~G&Dq{XEz&W?| b{ExfnRFiF*Ge{O5%~1-=Fm0QpAA>BHNlIYBB~WO}$l zp56bwzxekHOQ`&t;ucLK6TsadOoF diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/golden_bag.png b/src/main/resources/assets/utilitiesinexcess/textures/items/golden_bag.png index 04944aa4a41443caada9f64ba56c1eba338a96ca..b11a5966ad5046cd1a6dd6ec4d43ee4139094354 100644 GIT binary patch delta 141 zcmV;80CNAv1GWK>F@JDLL_t(I%VS^|lwegq!+#LQ#V4rw%XtWfX+-7|Wx&n7>Tpdk z3=$*B75f&VVzRsd(unK|qP+mq48uelfUX&xP0$dKy)37&w3&Rt70XRt82O%L|C5p=^+AG#Ht|;!HrcAtMvmbx}Ze zW;+X5JPXJMfdn81>4(v1mNGCiFic=)U;(NyFfuk^TmUf@q=R(<#H1-eHV7~Q&0zwo z46?KUvY@&Q4GciCKIad3sPUpR z!RgJbzyqu5+W!B~PdL7V=NQ+vb1oTotR}Pc@>s+)o-R`>VXS%ZpI7Nh@@Coj+8nbz z7y@z_!Wzy>2N?2jZ&d5~Z!WPTEI<86myX!0lM07c9Q+^_nKOfd;cr4>rB{BfC&)3L Lu6{1-oD!MeK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a z5n0T@z%2~Ij105pNB{-dOFVsD*S%nA4~ckazmZMG z`C5*c;NHm4d!Ov(=f9|*#O&|j@M!;@DevkhC|=lb!)J@)o;^bUzh0U1-@9YgA9pUF zM?4Ic;lB6&>~CneQoo|R<2ui!CF`Gg&6+B-GE qBQDRjneEun-2C63!}x+U1H&x!BF2t3(O95^89ZJ6T-G@yGywq8*LvIl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.0.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.0.png deleted file mode 100644 index 91d6d7163838432767798bd89562fa1a80d08bc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|=6kw0hFJ98 zooLH-*np>XzN?0<-!&O`mFE5_imuCFNbdRNQpTnn@K<=#7H3wuKNat*nHc{YDox7P zWlQ<(HuEIcnKxH#^b1S_zAg)36@0lZvg51Sgw+N7Obl0+-jz5z0Vsd$+j+^VWQT9s zyxTu!S5G`y_l#AqZAv54&G?g36;c%r=D#hS6}lzS{=^E^HLBAaq*As^SJoT9fBf+e b*AJG&M{(zEx=oe?oyy?p>gTe~DWM4fp*UKr diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.1.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring.wing.1.png deleted file mode 100644 index 00ebd68f4ca64661c42e77fef3b93e23dd341bf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9F3${@^GvDCf{D0tJ; z#WBRg`)t@j!Da)VZtt>}b+HS44(wlCIzz~y{8>-uL9>VJ_9$3PTI|B)(e^rgp6j&I z53Gl;ltdh9sPhGAQoA1)~SHqU}6f>^(7z5 zbY6dsJ>c?X$E}Aq{|GS3UN$bMkyqMKrQq`5;K&qIHkfukIy#Pf=PIE>W7nmTk7wmAabC|P rtoPw;4(qOod%hh{@I1MHgTe~DWM4fe|UB* diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.png new file mode 100644 index 0000000000000000000000000000000000000000..577686aaa346084160b7a52d9226885e46913dc1 GIT binary patch literal 404 zcmV;F0c-w=P)H=uTTtY`iJ0_%5KW34TtS1Z-2VtZf&aKH0Lg*W zU>E|^yu{G(e-%4B*bpE_)(F-Nk^`y1Fa*SzuB!U~fVuhqeFg?#g&^lT**kzShz$}0 z$$`{>)S?)W&du|GgNDZcOU}+FMeJ<>chRav(JzwIDqx zegl~f(|q;9rT-vcpr;Sk80a7H-_OqvZU{&%N?5_11Jb-^$@2fNU%v)B9VV|JFaN)$ zqUyhsqvL-80fpH0ZBwbR7l6|l+9}sK^Vq+&Y^Tav+Hg)*-e_R?KVkINs|qFPzp9x zv{KNEn5v+M66`?`dMMP7q6eiYZBZ|xH!p(Fi-I5s1r`6I$7iPQ)q}h7VqSQeff?pE z&-1=BV`Kky1VIHNP1A&;D9Gh<7%FUO>6}bm*D+LOQB*@5cVSr;bWOvFb_b5*4hLGV z&q%@hR1nR25sUBQI91PNf6-ejsfW$^`Hh z)vOcruv9{e^?Ot-Vz=PpB%5f@FG*-BmEw&FRjW*&fCmKJwQananZW|>d{!>wpi;&H zZBA6C0(N=x8?$gJSChhH?>EZZP`1iomiiQo| z{9tw#O~Ri~PGX<=wbjC!=i@`8fx~7K7j*;MUIDvlZ9Q)}ctt?hcCbVH_BelEuVby~ z<2BX&Xt(iwejf4oI39Z*_R|8F3H(IBDYu9(RPutr!%hd+Sj(SrjMcm)lUuQ@8MsGV zQ+MkH9wZK2(M^1wp2jx<7ul)(BTy1@zNjAkJgJ{Ya^PhnkGG+03jAST=6~xyg^gkq dqZmbY@e93x3e(K+{1N~F002ovPDHLkV1lwm4zvIO literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.1.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.1.png new file mode 100644 index 0000000000000000000000000000000000000000..43a6ca86ae5502be4997880c713dca60cdf01c2c GIT binary patch literal 752 zcmVpHqDe$SR7l6Qmbq#hQ51#;RH%|tK8sENd+{089dqeFD+7#X#(x z1O&!J(U}oFkZQH6+JJ)r@SMXj4Z*SB@AuWrJvmFS*L%neGawhhdcCghHIRVV>vp?J zPM{2kv*xXaA|F{0J@q474de=dfCvONa4gO}%dtSUoXE`83?w5;0EA~`Mqn2Wc4RFU ziwelqEGaVT+M)u+qCE)o;>p9I9C!=_#4`e-jb^ji{B|r_urGU&YXFc|qwPb49=Lb`S zLwO&X_mP%C57<&5EyCO3c%MBoM*+Z=0g+GF&%F4m!?D!!>?!lw;^6pIwMj%lR7l6YmRU?wK^TSUGuYDBXky|6AQ;fZ1wlm%D59uX3ks$} z304uKA-IGX+&~S8DAs)miv~mim7)l^2iaO$c1kUv1uI2G6u0-|%n;z!+!iMJlisJV z=lo~Ry$%lld2T0(adWSTO>!iUjl*Od3Zm2BB0*oX1Yv$WD1vxMkn*rA#E#JXet+5tbInGSWq6>yEC9x;HTYP!8NIL8Gkb6D8@0Fi_;j3Ca0K2;6k*sHjX#6& zur_T$=aW@LojZ(`K^V}6VNkynJugF;t=S1eG!`yH>B*TSNF0Gz;zT5+uIOu&!t^2- zrRnbIs#pyR+2uFGb_O+)=aQ4IOl9)}30~h=h|DOCz_Bt`pP5Y(=z$KBRC8@8esss+ z@8BL-_2FoJBtcP%3z~{Z-M!ubZQ*k6z_DJ;Ntn(8VtO8gA)}nZMtWmm(aK28xv?Uk z_tZ)(HoaU&QYx^m=JJzfp!0Dc2AabejLxtz3WkbROdU=h9WiGkp+d;+-I`8?prgToYHynfp2r>GT7PJ xDS$N=dNNo>%oM=J)TPMo-}0fGFOHlKt@TjDRUQ&F zBpWGtDItrF8VCq_ARr4b6&K-%cJeY9(@N7avzw{isNAXt*Q%EudT710RqNYJ|3Cpg z`T3B4k;|E|T3?PeoEhsnTv+RMAiKc;k_nPp1M=hjpf7Y_OIH-zELMwYU-!n+;E?KerLh)pKQ-+h4i)M+rSy&ubjF=21prFN1DbfXC}J^-p(560eul8%9q znyHykQ6Ow5=|-EHkSBz(nY##4ks1g6iTB$0#6UyxMK{BDvm~A9CJST{KXQX1PzTgt zTB6WIuRlLJJTYZ_Fg+;m3k6BK&@M0XuP5Mn^A@zG9EG+B7)KP!%fndJ+6<|~4yoIP zEUR^K! zi$LMvq4He$Wt<*cG~OG(W_tRlnSHg;xQ7o^kyKG9S?rp8f~{r_v_cJWQ3)g!m5}Ib zk!3Oete?5_ntgaH>{xu`EV$ZjB&nim49IEmKwNSd3Of&_M?kS}@Q2FV`?0k1>Q|}f z>^G^`{YA<-znhbDBLzapoEr?TApeWf)nF6r1g$uTLTdyi?E^Rxzn!can`+mO-wNnQ z6AAg1P^XIbEv)wXerEeGV583k^1mo;B}B?n6j~z?t2JO+qR_=g`MUY%r|O^0>k5QW z+j^gGB}o^N@(>iwJc_uUMO9~PTxxE_fpdcicJ`5_KnQ6`x{3BHk*75+?9@A>hb{>= z-T1?plr@40M*<`hL`*TrU-Axri{b8lcUDsa$WqzE2c2Sz1!O5noNkb1%a$#LKLjs~ U*>6#KtpET307*qoM6N<$f&$@!!2kdN literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.4.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.4.png new file mode 100644 index 0000000000000000000000000000000000000000..c30f27d0a8e32cf8342eee3925f10001c3d26c75 GIT binary patch literal 873 zcmV-v1D5=WP)pI8%ab#R7l6|l>bl6aU91#^Id3M>8`s^b(hP02^Sp;4K0Ss*DR;2 zxLnScG+n2tWLRQEOP16yUX=X@<7AZaKr`6J+jPYpCPQ}*KjG98$^wyL0wUy|DE>xW^WVHd~c?%N*GnrWB65fjA;}M+S+OX6XsR$Dh4Hprb z&Ltsw1P0B2t# zDSa(OR6Bx%9gjq6(<8MCH|ZJXl?mNvLbu03^n)@IIxETg)PU_{1G9UZiSRlIIzp*Q zK>fl8ggrXKJ$XdkD#i48FV^mAGCl;D({qwZubPPU7O2qQasjOtFt?WQJsXj)c#v=G zWL9MXfVEu#5(8D}ea;}jO9ik@hg76Rv(t{@VhK?mbovghjJN9I_$qMA5~S%=23rx^(;ius>Skt@?pZRe>dJOrYX=7L&X#!tz%!IA82yl7^TYqQ}h} z80XxeysAZ+xM>zk8gl8E_04NSGOb8+HOiFIpO9glnX%heplg4^$P=F#V_Sfftobvr zfe*7hQcSdr(3}*M1MpY0Sb$Rh7VN+N>o@cRV&=e>KX=Y=00000NkvXXu0mjfUM`!# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.5.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_dragon.wing.5.png new file mode 100644 index 0000000000000000000000000000000000000000..a340f913766a894f2932801efe05af45e521bf95 GIT binary patch literal 980 zcmV;_11tQAP)pIhDk(0R7i>KmfKEKSsccF5FcPJCf=L5@CD`(jENcb5|KoSGeA*@ zQELu6D?Vd9u@b_l~sDS;jZY$@#O1}rT-TiR}DyLb0q>+`=>GQ`F!T1@6*zT}^^ zR7y^xe&v~SRO}WcxmBeh0)!i&2Nm8eiOM|0j}oZ+MqKnD$c(A z5zm{|1EVJQDTorki}6jz7NVmeC@*8Ed%ICRP{4q57`e2J&H5>*^>$n&!(VQkkhR$` zNi~8%;}G0UqY?(x<4mt|c&J)GkJK$y!bBR=#U)Hz{#hDYE(U$HfI@!~+N%hjoSu@2 ztAYtBbxRT=k_aOK)w&YWaQ9XavBo!uHjX2DWl+Lm13y(fduU(}9gJfCo=hl=PQUm8 zpKX4`FTX?T>Js2d0p1wZ4)AVULUZ?54xony`Yw1ROe~>jQw=LfHv|Be2JX&N<-nC9 zxF0CwgphH3r4fJ1dqAhS7{paVU0jBqXo&*Ou~qXA*@WT1F?O zTeGk`MtkTWh{}+mzWC~tr!D9+9HG`E#%+PxfIFR86h|zSeGI!3z)l}Q77YnZ3_yO7 zjDKi9CpbQ}rZLvKS{qQiO|zdRLpwv{ndlSDQHH)u<3E9-oullbmeQ(}aQM2vHem4{ znNhOjDRC=}>Q!G3S+8}mn(-+mvU&|-J^`pH{YgYYR7l6&*8fk;aU8(${t4eDN)j_{Xf$6^h%#MQ6q9df6sfy7 z<(%s3+(}zSWh~!H7W3^^s8b?QL`_>(DACmsHzkeVp6>nm&E_XQ*AL#?YoC37dhGpv zy1#qC{*1JUMlz$GQk2lf8_V#I!uVQwj#q#S$Lv9T71J`% zhBP?AMjn{H(pWe|>*ZlGqwmU>O99OvwF9M3Cb3H&qX}-HBGti@6GN1yd?GpQw!DQS zurO}}o9ES&9nsB|eV-|a?crQfAE)=eN3;5t{Gf8?BXmJsm?A!KKBkW=dwMC3w^5%p z!10)S@`GFFwUOZ8fo@GZx!Y`9()3fL?&VT)AIa;=k4oA6)BoMCw0LJW3xUQ8Tj$^hhFP zs*Wc`4$LuDdD}uj+ZMEt9@$0i&Mu76Pbu8p#My)wEO*x+MplHcQNG4k&3Wy-+S)0N z`ABWX08M9y=(ssdchygx7k`tY!u*cN8Al19Zus}BZLN1bM}vDXZ0O*+#zu*@lY2RK zy6*fSKdy!XXXL7^WGZABTOx;|Sn|Vqu^e(xl-SMli-WY^_>Lj!wrj?d$l;=~u~h57 z&|Ex3)p0vbPBedajr`!^@q0-KYLL*C9$Kuqb}4shk>#$L`b#J5^=(=fX z9NS`b-4kQAX9`x6o!Ed25+YESf@?f=7&rZXd}89e3=Hu)%pt|Kk$dpI9!W$&R7l6|mRU$tQ5eUMsbiuvxSKjUihJW!3O25jrsmjaKb(7m$tclU;*fSPg~wqo8mMT!hEo<=34l@qsDvhH!0|#z7dTa}dTu zmDP#7LxYef)bb7Uf|n?RO1(q{Z_%D{0g*sJq+@1e1I&pOTwOWw0P}>4VX@O z@eTzhf$(tMsdx503E9>gP^C5CU~Ugi6p!N73oS-R<}fp}2!p`@y&lFx&1v`9+eGR; zr59Q4Qqvnza-<*aPscGiF^j1$3lyYhKpJ!0gM)t6!t#%SPWIct0l846HR4P~AKF?! zV`6+3I^80cmJBOgX=jXZX-)#@NQ6NmyUZNsWVfKafp>MQJyh>U;5Va2yK@i~Iuxbg2f>L63~Tjl=spP>|P!`iF1O->0Ezoo7H=LlYi> z637$pAw9hT`3Jg|mupM&05ro>m>65&-zB$>(sn&w@!!HlTk8;Bc282U7BkaY{=oF( zJgd&`fOo(p{@wf<>W6iDG<^fO3I$u*}ljp_!S{51Zsd=1^1I zs2${#9Kv##3~Nq5WQdE&aIqXRxtR+^X*Z*}BsVU;Ja26^o9&WsJ@xi{Ki{Y4eP4m# zU#Mp*4650|8}Q{W{Kk<-OoWdbE%tlhEeD@xLcFf!Vo1^(H-viR5ko9xVgTJ-BLhzL z9#;J#OBA4Uq)!a7aqCsjq`}{M&LFp%hpNtihBg!QZB}S%n^=!LVu($6$G*H{xOLAg z91MTJ>wm)5p$`tH7up&l^N30MpcH-xy@SMY9ILU>WsDDRg41>-56gPA~~0M0DViLq7?l41r}F5F&h}oQ}Evf zF*A99ESV<$3rQsw2S%g=kccZ`v+ct+??Q)V8lC0|oLoP`w&Htb|mghFGLTc0pC@z@O<0nJyEh7&?lF P00000NkvXXu0mjf4=v4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.0.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.0.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc3f731c152f1f0f6c2ad4bc4928ea3ed4d78ec GIT binary patch literal 867 zcmV-p1DyPcP)4?`K;5sJU!jzP4D@8 zp58n97fw%tdcEXd>$1kdm8uD}HBPiOPRc5VkW|S1tu2vL-id3)%WUEvp2QOO6c`u+ z{q;Fyqr7`s$2;fiu|zz~DtfAxPtdV;6bGlcl7O2_pl|RX>vbtxOGZI0r7kbiAvYCc zDva|lp)9B%upfdMw6C^s!w*+$T}ZNiI8;Z;hgCdYs%P96!EDN6!kW(Pz+S>LhhY9I zaB9Ju2Z0O@kHnB4iUOl{ zTpj~ieM3kxPO5Aay=OtC{+xw5KW<$Xi;Zui+&Tt5h0vq0(hKp>3gKuBr3XH`J%uDI z?~OLz|K>9ad?AkAYNF%nG+x~xt2eudnqv4PF#?7-0YjVxV-QoHLPmEONmlk=4Ht6u zVblp1+jo;=3-aR#1X{vGo5KWeMDZDdEH*7uGvMbnvjy z{5;x0Wlxk*2Y77Ywyja;hRoX$WW6$9{F<7~SC}Z?NmGMhun6C}&QToyonPaXR8Ou^ ze%DVy91ae~ko9`>;V0yzN`v|1?aY)vMXN#R?G|dM-{MU4EN7Jq*h8;U)wv7VC|~T? zU_D%n_4q?9l|6^8{uvyN=}cSq;OyE%$9L(-M!EmKG&!-a1nq%xEJuE!E%!0(Up|Q~ z?^y=(pQroOn+e%yJJNQ_nFD21UL3%t?qX3rg7c?V>ONH?8|}ddcE~@rZQU-r3-uJ~ zrqFBMj8wYe@?HA#Te(x%iloX5bvE+*7qME@%-0W-Fwa3Kh|iRpkW_i3caVb7IDNh6 zz!HNoFGPd^X*D1IOM3tS002ovPDHLkV1k+OnqB|^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.1.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.1.png new file mode 100644 index 0000000000000000000000000000000000000000..3623a18c944695dfd82827c077b5ff68d673129f GIT binary patch literal 853 zcmV-b1FHOqP)pI2T4RhR7l6|mf25QK@`UQ>zbx9eQcAawrVuhsx@jA18yj;v2gBH<+J|0z>X)3{RcpLu)tkSU)UDrERO`Rh+`nU753mOFUE!1q-W*;5ejzt5{lTfVKHOCd$DII&iFaxTO-(PqHvv=!nMW_ zW~(oN#ZrX2A9vxOMHb{qPoQKygy+^mSV*4ytuUTiz5q_H?4pg)%<@Mr+q;kGFKRz@ ztW&s`xRY4IU?nhKj?~BOki2U?k=1UaZn+csR)a7|U;{coh!y9+&mQ!4F*+o#YwXHW zV@xhQq~%H<$XESfns?I@*)bAj_POPZX7-Z3Zz?n1Y1^#mKzfW+b1vG_vyVnT4f&=s z#U3T&8#|F@+iloETcShS)O&#RSz?bWwf#)V=-5Bj^8)LEV4t>BE=4x8`#q+Fcuo@W$0x8N z&4`1RPn^=7GCSht40`)AdfXC59X~9T$lAMTvLLn0fs8XwdSJ;54H_>k8+Op?*#n*y z#)0?sig)Dcup#xV8!Vbj=+XzE+!O$b!inA&%Kg=G8KUIY(=*8ttzPiLgdqT(Ye6Vp zxrFou4U{eIOtQIh(l6AXip0`Io7S+deIt431^>duOIy z(4z7|`3?mNLlCD|X`{7q$@9SpXO5aAH9vcfnv4M$uhK>N2~VNYg@~qXA+pHTM90{( f)YCx!>reUt6N9_>1d^iJ00000NkvXXu0mjfgus>H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.2.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.2.png new file mode 100644 index 0000000000000000000000000000000000000000..907fbebee495adcf96b312f9e191ee8648251b08 GIT binary patch literal 873 zcmV-v1D5=WP)pI8%ab#R7l6|mECI`RT#z>{09o9P_b<`yK`pd%=gajc2iKA{Yuj` zjizxiRqzX?rBWJ8lU@i0(j<*FTWn05&`|#bz4ThEH`)skN{mX8(pqe?Nw-aV`*U`d zhzN?^%!NW9csXz`<~Q$q&hwmD?EfMvm8T;8pd&R*O`t1DL^6R83Q|g3*Twh!up$BN zwj~`wb*4<1k2TkCN7-ZRgbMa*!`dIFsO?%=^u5m#%&u0$UnoPtIkcoZ?K; zVXR>DK~Zw1U~#tWaIV{B@r@L<_f6L4U2>Klj#kq&9LH%5cpw0N5sdN6evk2z%dHa` zmWOq|8#KB8T8fYQTxR<%E)5uAXN~hS45RhS(g6N4V(|S-l5YlV&X#PZ$|m(O!Go&C zo#T>wlO}T&iEn5~UEiD?_GL|aI~-O!DY#u{l8=aY)y;kjKbJimkGSGIEF@GfqTwDH;4k?78E12}ikWaV9j%P%V2 z8+wNM?j5Y1-a`H2c651R7i>C)!k2%cNDUo=?ts&N+`l@xPBc0=VN5|AH`d>?cLDof^;-_>5K*Im=0T*i#DMS zS*e+DVTiP1f9$4xrh~5elQ{osV)Fjpn>yS;>o~e#QfO zj`$iW8)-)W(2DubMp~jaI%mISI;31VsLV+t8uJl;8X1uJ8?0cso+6(lWAQAzZ=`s*T81vnx8j{` z7MP2lm%3!^`1yr(K+$vC1v%d2w3K=d=Pqj z?yp64Plq|wK-0Jl&8P`&z)Y*C=*CMoU2`oAiB`gOE*f_vzYYmdH)avvtX9B!9APK= zgX?J*d)P5yW?;#U=Sdr$8K(fR(JSpt9$Z|0DHgks`j7#8q!D9KLuFBnrPr{FUID@o zx7_>R{haOT&gG9Q`zijVl)~%B(fMjH{9cE<`g1%Y6GQS_cUEd{XB>r^t<5JTuy8r20J8;0Zo50fG+F%KAbS*(|!xxHQy_xdwXU)+6Wc&+^ W?0b%KW)md<0000pHa7jc#R7l6|mfK5IQ5eP7T+Tj;8uV0ufG!|$x`TYGbWBvrE+v+s|BNTu9cbXMi+^ycYocBKfWAf8;ohFxIC0k9<>e0Rh` zSf&8(S+8@4u16@$`CTfJm5^T zgg$_g*k=jQx5LTqB0JUdP=zo?Z-NUUjLy6?VN?!f8I}MQELdn~=&E4EryCKU#%KjN zC7m&BaX=o*HU^6v?7b)<^{Y750RHfUbFVQU>z3}rFkL_1W@q&#TXOKqt%AYR5_n4E z$IBW=sx*E#!0BdOh;_-CEyBJ%b+G-o#`WuLSgqNXANjUIja}yihi?mxR5&;$XEpvP z4q50!nF7uSz*x^xV3s{Y1@ud2Z_fx0lsg%z(K+|VW&%uSi?HyM3`4m~dUnMd>})!b z#z2W+;Jn7p5}m#7bOne52jEt2)Df{HEH`pwP|5^{ZfRx>-xaaMnuNv@VD&MU0NeM= z!(Ax@qC(OXFV#X-zxT*is=!ES@-y^H;E=q!Ch8R(2gaC8=xm!An139(vn-h9tG!_8Bz_K_m2OMG=PoB3_c$57j=r8N zYplCF6Y4mOwZQ^#uo$d&X-sp*-`DNdsS2skvmEflF`zXclYg((?o0vHmkri#O!4o+ kA2&|ce}t`QMJr0^7Zb6w$QaDTDgXcg07*qoM6N<$f=g9Ai~s-t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.5.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.5.png new file mode 100644 index 0000000000000000000000000000000000000000..a62ec5f97c5e4af5aaa9e33dd43c684370ef8a39 GIT binary patch literal 1096 zcmV-O1h@N%P)m~k)BGZK;YYXy4RmgL;VwhV^+~h*UXwWR$j;g30`KDt?RfmvvxKX+vFsZDK z)bL`&NU}~`Pp8}2psrtIUID#|<>Kodnn2A$RQ%CRaaxEho_a z=EbkIos0>q5yKS~x||C28CFEMle@%=af27FvyGU%GuYR>Aanmq6kpsy>S#hebPIiL zFSfv9#BgK;E~Hv@f}-el^5=Ck-*$z0DOa(YE|X=v#`I<9nNZh-bmJxgKX}o$_Oe0W zhD}+F7>;cDTO3d{QZVxZrKWx|W4c*r@iM32TjHDpgq|5f)%7dmyuUNP|2Zj^HkL|d zh~cuyv)DEM043o~q?%8Xns0QG@xRDj?7(?1VLQ1YPVU>pvTRoxKt;E^7**vwKw4fq{uk!tJSRA>PiQ&b>>YT)C zYe-5uk15H`YnJ_(?GH&%m19TV);bc>k1%!08lu7+n6;Zo zQ?H>i?=jigeM~Vr5x&S1Wt3_UkzqK^40RQ;DZ5y(_6qTZZnPit;otEL#rqzDEF}cr z{F9(M4@!FtVz}(0loIW67S1@uH2YcNbv1;BZ(!PzW28EoP(6J>;8%Spk{u{Myp62q zJ7kTmDDB%2!(|s6$uu?-xbi5;m0p%4o+DCUi8{_fc+wUon_Xzk73h{9M7nn$*{QEl z=4?awB2Vlg&CQuZ zp&u9|A-0CXhz1;49wHCkLU!pY%KY7kk&-yxg}&f2e!V{;4L&4d-C>eUpYryKUgUL0 z7`L+nMV1ROlA@w3&|3GPsPUlO*F*fQdNSs9GkfV>4AH9)qd_&h68ZcppH>`6pHR7l6g*4u6qR}_F@7tbknW5*t!?F5gVWD;XLN!_tiGdW?$ z7)U|@Lqb|q1!%x3qO`O@RiRZ8B$W!HqSvi@R|$#3C0AS^0pb;S4IbcUJO~~Djl)Pw zv-j0EYp=c6Y?td}JZ>?CTS~EWpoPV}=Lq^2*fCI)M;J1GM)2wE0N8JXoiOj+Kn&*D zkqkTG8E!E5`Ucr(i>_^$PW{}{fDKAflfm|RW}aL}j7-oKFyXO4@okn;UkRyrfc$2g zVsxcDpr(9dgSo?ZZB&Tn5zDiDeaMB; z>9h@Y#?@aRA}T`&u~DSP5{voYPzS3x3Kqom_h9Fp?E4mXFpZ#pPOH3yF|g_!=nLdn z_1;1$tlF3=H>?bEM8+0zdz1K@rY(ZPM9VzKidxPe~^(AZPX? zhD*rl22#M_?Al$zxdrEzwvhONsa&HD22)h**u|>Eq0}?=3baW9$Vtzm74?#b2tKSR9-Tr-R7XaWuroJ9HD67+P=f5 zb(3(cj&b!0Bl$JwvbxLT)_YD|JJ!IBhRf+y!sQW-f#w0JQ~-_ zuUYD#@&FNE6K&!m!cqm-@ilf8vZVjpB#@tVc*k0pVBtP(nxW}qr1EV(nKyAw?;~`1 z6Mxa{&i_*E9YaZtl3QG+XTrdJYA?!H=g9v3BWiZuc{HicphoA3H%;`$GQDeGBG&5Y z_pjmCr@E76EM6yGIDr(`kur6Z$_%v^cjz6hbO{U`#gob5)yEM>QuMS-nE(8aFIVZ_ zWh>TqgoN27duE;N);g+I>;82z7}-Z$JH_t7_6K8c0Q5ClE-Ek2*#H0l07*qoM6N<$ Eg0nA*+5i9m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.7.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_fairy.wing.7.png new file mode 100644 index 0000000000000000000000000000000000000000..01c0a42828aa7a3fc6f1316d9598be183fd37d98 GIT binary patch literal 897 zcmV-{1AhF8P)pIGf6~2R2UiU!NG47RUE+a@9(`gvpX~0?QYveple&8RHR6v0mOvF za6v8{P51-+m%Qu6Xgqi@k!T{u#7MM8Vys%Ct%Me6x47G~GqXE8JMWn$p1hD{NlXl% z5C40@h~9YnH0jhmXYL=B&0kuy{@h~}h9_8la{*gew5O59mdk=IWC+7SLDK0nD#O17 z6`$Fw)|s-#D;t!4!~xN8?fNC!`zg0R|A{oo$8EQi^;QmmAb(>eL!jl*1B_djoEMyh7*O zKz7zU3^>*};qY9U>U5ReR-dUCgkheMJkF?3)yaE9`rQGxusjV@ znF2qw>^^YJ9P#kWC4$JuFKJGks&Rj_!~AifHZ#MA@80Cj2bn;|(^7T_?QLi@%OtU( zyYKJ=kEj|^3d$^;m}cWni{x>_ATAh}QNA!))p(vqb1@{G2za#9BR{_t920Uw~c`~3F zI%XGh5XahgDWXApic{w!`e~1oXP3C?-EmuAIAKik+B;=;Xtsp4ng<&(m72w2F-8|j z?CI%4ntae>?xlIY{$zuDH=HmAwb#z^eeiw9!pl|iyhJz=QVs)kWInK2?$JCsM=%i} znz5pGmq|oHR7l6|liN!IK@^Amqaz}+EQ_L~%S)OMMNgF`l^5JKH5A)G zZByILg2K|SQc-D|yR-h$Z?z^6&D$>b3H__+M zw9bzN*e)s<^zfi2(;g*+bOfGjr6qh)&k0pF8phflVQD zS3^S;YG}I(6ssN4i`0(989~1@-g}4kKnkIUDwuKw!QvZs3l+Rd?T)G+K=OoO|CC^0 zDNbpBYcYh%RfG$#aQbA8asbg)A(Xqne z=vc;k9jMittsFbY(UGoMS)@*6*!?1Qilnu#iaJi)d=x@f##K^+$HLI-aBGCY?SX`v zy038;2md7jmzS_G8^!YEE?t?9cQ}Z9RhkwgBt;pH8J51J8=pA{_b3C`81wrw0|NsC bga5%NsYb`w3bB2h00000NkvXXu0mjf6pGhP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.1.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.1.png new file mode 100644 index 0000000000000000000000000000000000000000..c533e5fc55bc0f23813e48ff450ba55996f864f0 GIT binary patch literal 716 zcmV;-0yF)IP)pHen~_@R7l6|m0wR2K@`RNZH-TU2SfCM2UCz}Q4`@o62T%MA~6It z3aO+a<&ObMX<^$gExT>E+wJalXXbdO1;dkxbn%IsoZReevcEm|-kC`x{xPy&lZTL* z$555~01~l>{^*rtmmFKG~lP zpn7>Ic>oozKo&pbHYWB7e-In+=la-&QX+S_{oI2Jssx==r;xSH^2v)lVI$PNSb&+e zq~G&*x1|VNsI~#+F?Su7(YC5n9fGE`yI6Wi7-YEE_1qeJ*05Q|kkBq+s2kHwg1%AX z?Bk=@fL0|1$Ie7bMuI>=n1r$kj|x!gBVm(Qr5_p=`SUPKX%1u$gn=*tS)$uoi;Fvi z9dXStOD~VMzbA7;1B1>SEOQ2)bI#JfM-(0@LLx}B!hF%T-W06L>m19v%;(XeU=YhN zi{oh2Hu=3T1Ba9d((L4_?>nfrj}aI?LqVRWYDwz4#G#)D;nFr)t?{VAnF zZ%(x?re$$|!rj?O+BXJ@aJ~=gI6JIZ1tRhhc+E?PHn&9B;9q2*+!ZKm8VE*)a%iys z8rW_a=(-p1y#_?D02vjp9O}Kuh5RfvHgrif&}+S=yEBA7uRBrVeoX5e03i=-nI-5n zw(Cd(8}(y&?b@H|)Pr;BOdoH&A!?Jc0qaJJz#o0N%`E%(YcMdt*{xi#w)qO4Yeiw# ysd8A339H6(R{rh&>ojNdpwtt0aTj;-zvDL`pFN#D(>%Ta0000pH*-1n}R7l6|m0wSiaTLdW5&0)|!X!mNXeb0a1rkO6h&&Gh0-B7H$v6k1-ViWsX~uSf!LfLSZpqI87-JfEF=A31N!bkj7?=AX=xV@YOyhJ zv3?vJe#GY1KB93BYqd0gLg9ch`GfL zIM@j=0S?u5a$#V778kak6;XKo7VDcYvAmMQ@}nJ0C$ks|B;fSTK%sG=@}{hOphjoH zVkU?22!}vu9+B8QT)sGBGZ}RD1YopApwzLrQ6t0I>B-NsfpV3eUN-$gq*HV3I(pes>b zuRxDIL>dc1ZyF)PMCk`YVEnV_G>?E=+C*?-9ulcqxM#}moS{FAzQGuVMmczcNu-ya zVDf$zHa3hc^S1*e~*iX-SSFa%m5ktboc`l;1Xh#FgkUB;^VR@8~r z=oyHi*BOQ0;07B^L9Mfb8BU_ZUq`4OZTtK5~7(-ph;<pHZ%IT!R7l6|mDx+wQ5460=p~{j!G}u5jY>(uv56U%Tt)+p(s7ww zCdGx)bjl@hL(8$;%`r98OsyOh7c@%=$%-)($z`NWlTryPgg_s9|D*%`1I=%Gnh)I9 z`{A5(&-Yqc{R8!mcgXX&jMe|3$2*6Qif*n+63j1rp!8;=AsK_J()_}fTx)*3jbo|M zhZkornoo8`5<|KqmaSz4t2!^{^FuJ3Xzwhh^rNvWXI<~bOvMqStlqVVVh^=&;-;+q zY&ItIGq;C<6AvjBl{3|9Z4`6_N3s;%Cfp30vk$QI%%9m}S0X?5i-eDVZyg(-0VGx~xSbVrL_j zrKf&OY8=^_2xYy`lbP5g23%Wqg_X1`f*DNk5vG;*Z;9CclELeHPJDkC%67L8YxOqF zDwC)`UT%D;!Y%ZTL#*gy*qn>yz0ME)BX`E~Z5c_kX`enP>kJ{f&CZTS3B#MYBkR?~H8#Tr&>&aqGsPp&l4^hzHW+4FTeg*QEN`s*B6 z9CYAQtr$Z}BBiz!%xfjw4GAPi8ZAs)JBw|Z>XW1I^<$_?M0fr{>Y~NQcHRy=Lvv8L zu<5cV)b|81qIF@sPQ;p4MpvRQ1wQ8)jX%b4gbMXZ0rOK=;KcI=H^ys^GF@R$cakTS zyOniD$!YbCrPfs~e0~n(+c8`sX6WiEx>R1YpYx>JIn%sfP=`{w(-!3ayV5<4GUq&M jq(%FzELgB$!BqYLAyjL3U?l5x00000NkvXXu0mjf(X~W= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.4.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.4.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe763a5e6ec75d18542602329a9b99658866ffe GIT binary patch literal 871 zcmV-t1DO1YP)pI8A(JzR7l6|mg`R%K@`Pp(!a$&(^m|(NG+nYDuwz0<*ncYQ9uo% zBDyRn3KZlaD1r+H(I6U6?@nsd&t+|zrjy)k_`+|_y=Tr$N5}v5&n%@<4b6lOCZh!l z^A0#1PO1gG3T$w27|Tm;1cM>es#VqaXTy%ru zqPV+j;Q9F(;(C01K;u?GDs>90#RSQK0|Or!Fc8>>Ak^^CY?8_bgFZdAP^(?xh(HPDz>$8Tf=Q#K;b;iS}O^#zh8mf-4G5Ac*J6HhUR*OO1XfmQXV#&seNc)pBytYW>_o^QtCmNi=fdUg{=pwCT?mKJV|Q9NT<$FtzI*za9u(+lSJk$K?X9m50uMQWSStH z&J`32MN(5lByvn(j((rhTm=R^OUG#=am*TKT5SOb2S>2CcL4XQ7xB{sN~IExk4{j& zD$`s~;PrSAjc^PY=JtQK^|yfv#R%MPA3;Od-rl97P(>n<#8EVci;GKqOD3_o;l;e& zLJChQkqqsh%h6E{tX2o5&MI=bJT8hC3|JKeq|<3q$RolZ(s`W2)TFk3ph7WbUv*lvnW-aKUG))^qeJeb*_|?=!?DPW!*Lv) z#UgeBelnP!fI3JJk4U-KcEOhKRZ8tA)*LsB_8 zX@J+e$r4DVQcM3L5TV`OGFDq#J5Z}Nba%Q49)?o+>2;nUFN(XmWTbYMwO0)Hp&|9_ x0DoPg(w?3Hmb+q5{E-*l%Y4Oq^sj%8eg{k@1-3X*+M)me002ovPDHLkV1g)Hg)jgB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.5.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.5.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab4b690e317b23e9e8435b0fb12908ebec488f9 GIT binary patch literal 609 zcmV-n0-pVeP)pH6G=otR7l6&mB*?AK@dg#3UkgmX9YzuA)?~OjsE{%)Z-MCxVL8W z8ir|Sq)*?vw|YXMuaQotC7Dd>mC0lz6y%6Tqf#oBq*AHKU@(yJc&yMsz==dcQmK@b z%VlY`T2imqWwBW3)o3*Qp^->LfEEe`RR?4;naFCjlIe8n56tKDT28z}UANm+=xjEV z^?I#P-nju;3@H9_@Avx(91e#Hq_jN8XLn#Wo0V#{D!pD$)dHQ*=jtt`cLmmJHEFlo z8X)GT6forthr@nA0@G|Z6#{@csU<|fQAwZ1VzJ+$@pxQA)9G|HofaBv70Sz<%f&|) z21+^c3?L9Tz&qL^m&>VI7av)aKBScU{a!(%(MZ9Bg$pRZU4VE43@<6=ZnsmVrV=3U z@YN+a24rzcx7}{_ETsp5@tkr}2{)jH1pvKxy0z@$- zrkr--{0yX2EV^7SKYhou&1R#UC>D$ACuOEzT@(T&p(sTSA>pWF6Q-0NWHT;6AeYNU z6*30`lmIbDor`}q=(FeZsmZi6m5rd1(y|d$x&c`nzmCVF0{Qq_fH=}ftxI5R5E2wT z9uEbc&u8_MmcToL^P8|ezOLGu&+_xr7IJiXm+x`{x547@s> vP6{NMuh&aM6Bv+zp8%QT9pw!a_;1D^NwbFBTwNI=00000NkvXXu0mjfzljO+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.6.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_feather.wing.6.png new file mode 100644 index 0000000000000000000000000000000000000000..db8cc8a5132e40140dfdf8898ada2bdcf45d53bc GIT binary patch literal 820 zcmV-41Izr0P)pH=1D|BR7i>KmP=2QK^TSIyF|Kv1LNjbMn7z``go5))bJ%C$d$n7DGGK{u`piHZJ*$0^Z-xHEpAD^D`pd2;5w zb7l@4_%9_Dw(E)fTrpQ05r>|r!?3qxhxx5qrV0@%`5<>Eb6g(FvpiMcS}Dh9!cER+ zkr(PQsVSv>RI+ZS2clf93~_zDn@htfZcOxWHtQ$lZj%q{HXi5R<kxMYH!P&bI&jI7_jz<5fclyOrX^l>ilW$sj(*^wmoYrVuJ zvwXk~eIqfqiKUyf)cS)AM9o|rjZx|CV&OuO*s-e@O5pGxc@NS#ow8YdvSU6P4lw)fnZn0U|*}|A` z6c$eMp?0DjMuIjS&!4QZ`(+2eNhV-jJ@HPgx??0g8qqWwl3o)*yO!E;w{UGC7nbnI zk>P%oM|<`rHs#S$h`GcuYlKsqfSWlfnMej4*bOc6LYME%FqV(dEu8u+YSMlS!FCPR zp*Y!ygjsz={(ikRUuCio#jZO{(5fQj)X~#rBPs^U+^PWZ;pzhAVv>Nhg_y@6CbmhG zfdikl6+?4_{J^?4*6uPnlBY|QK)n>o{Q*%3S}{0U+SEstfxddVNo6D_x>mz*!YMAk zmfo-(lM*@p(#H>Pm@Fp91k6a{W$BAJl*w_w-fq99m&i|b<5DwN|d)sMD17!$t(7h&<|`6n*x(7Ca0%6)!i3gCBr|Mr>1nG*A7(zuMx y$^+~Ay8DThg=q>&&%XiIwe$WBTbt{D1pEQUadM0z+1NG!0000pICrLy>R7i=v)@w*pQ2+<<<1&R@dz3R<+wyKU=X7JO%+wyM6t%2H zf{}_?mJnEhJ*><{;iGr-ayCs&OC>CwFUrRvv=A$M2hxW!is(yF^sNv7&b>2{zTUeX z_;cW1I6waPTsVi2Y2y$fI2=I0&Q+5kz8FQsi(IA|RElvbI1pnq2%3EX@12C$w9FLY zB%OcgNxpgBmqtysL7LT>R)JQs;@dlGCl2k=K7bk9zO z(FMZ^Dk)MKOu;}eIHV=GN#A$SyxBl-%^boXyfBNPJd$P^!8xlJyulFE$O#_C5qwxD z!l$A@Oym)KIVZu9Of5gOfFg~lUa)mPflE)|p>4X?5R8`u<9D+T?~4eAZC=ok6T`pd z&W+)46%zDT1mSrx!RsCwCh8>k*dxZ*svr*h(-VmCCJpX27?Env;g8x=892`y@a%3F z22KRwbJJ`NoM@BbTVDvikJ<3n8HDnh9k68;^9PewufUeQTT$yYaiFJFj92|KxI0#1 z{GA28pH)x zG6%*K-v32G{w*c*k3wm4!&2CW$SrM%-&YM|ZZ8bkcR6sAqZ(_=dJwyN^t&J+hiZ;N zmD~?i`eSG_S~yU@xfhlK4-A<@h}+|Vaa%8h18K|f)eoRtejf|s+Yy~Tgoun79gI(An&#Wx=KO2(@&9Ng0KD$zD%?u4lAirEsT+RCNrph(^dG$`GPD3q|y0 zD9pFPtnGs_y^eyf!C1?L10||_4w5Zu;N}pu7i42t-^GCoEv3R9(Ep=ST@6%;oluw> z5SujyWo(J?Hv;jz15;pVY$MljuCWf$_7Ny_yL@v6VVlbJF36*5IZzsT)#o6GN_E!| zzU0mn$UgH4I1Qd^7?ttFe;~V`egXfXEU1j{@-OHYY&z;UjPLjhN@eNkwUzP$00000 LNkvXXu0mjfoMn)b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4b3976cf27129289ce710d73c5b5de4c1d57e8 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5hd`K7RKu$QC|K?3 z;uvCaIypgt)xz=io16dB*F^CiQ!qO@EB?>l==z^Wxh>YcdjH>l(zE{#3`xxf7uybq zG@CTf;S)ZeoAs;y<4xlYiV9|N%nn=|e@dot02zKUTkGp>cPSd2Rj}N{rXXGP=w0lF uBmuUKotJv@IE>Vyj5lqb_|d@c6GP6vMN^J@b({k_gTd3)&t;ucLK6Uaf=P@3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.0.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.0.png new file mode 100644 index 0000000000000000000000000000000000000000..36773ee0cd1eeb5d85033baba94a1593a72a1616 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s1|*Ak?@s|zoCO|{#S9F5he4R}c>anMprDke ui(`m{e&)apj(>u~uR8{JbiNrW5el);D!ZU{u@XQv|gh8F$!{~~yg sDl3oIOs$VGZ_S1+`Ay!bQ>WJT1f`>;6$~~*F8}}l07*qoM6N<$f-Vz_Pyhe` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.2.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.2.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4bd3c56649574453d738ea2605c94c6a7ecc6a GIT binary patch literal 822 zcmV-61Ihe}P)pH=t)FDR7l6&mRU$tVHC$NWG>_6GGp2TZG=fkDP@!ut+pW%BUvJX zB^E>&K~ZX2nL(uyJ+wTuycp2}C9P<*P^4LymDD7r4%%qm(qXh&?%ezRdYbUDY;Hm4 z`TNfAob#P?{+}fMrU6n@T1+`00g~=kKig2|hv@bz<3s6+KB2L1}LWu56LAX(F+ z0HlT`ab*oFCsgYKY|Aj6mGjJX^42i`Qt$qR>aPc9HRzIIU%~i$&h0UDZit{gBf1`t zJl7|7iKiPa0Rj3;=q#Vv>#a;`=Spm&t00=z+z>vjGM*23M!p*vs#>)|;p#j$&*B}_ zrQtebqGN5?}#B9H)t*NT+^- zetQ|>QZnMyWJKlozpyO-rEzTy^zDYrX0MhH_=8|DI z)lcbplqzV=6v&%Z(LO`*-WfaK-eJI1GUBeIC>XgU0(*Ak6Waz;=^x3}(90A?DU^+M z`Hsf-_vV>99oa#z0qKh+h=7aV#^*i)z3+w65GPc?*#+O5bX1c5^wY|5q}2xyXFzw@L~~YH1wW>3Hb6rK0w`5d)}gsU5cbNlm&a zdheEK2FqiGcrgdsr^EMZggphhBi_@% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.3.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.3.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c0b84bb028b6445a0b95a22fba1ba3417c5725 GIT binary patch literal 852 zcmV-a1FQUrP)pI21!IgR7l6wmfuShQ545-`qpbye?j(;DJH2TnzezM_E13(ZVyH) zLPP|;WEM;HP$W^J;f8_{{j?U0GS@c96-|A}L`vOdUH6x!yR**d&hF0a%-rT&oMHL_ z!Okdj*vmZ(!~N{{d(ORc5z++n<)ja7RPfZTd5keYS7CSzAUAp+bB4wPVavddcm4Kj*VC$;;66Tj*Vl8xK z?6|ntQ{oOk+s9-K1S>h}9Tr%Z3KQawR1hESkhIXmob`&5XB5z#(4|U;&bv%FMcHjK z*hZ{$mM4Rqd+%$Z@^4edKmaBEO;|Z)K%opRX6GzfVtmXTpRpwHXOvAjjy5U4A0G~2 z1+1%{(3PN&nXuTjie@iw>r-;Nw+8F7bPZGt%0w=N_!S2Vy)MO(UK3d~I&w^+M=Sll z8#!KP@PskP4K-A416u*WQ4fhaZ{ya<@RQvf?W#$uR(6%%QI*F~mM$nL1O-IZP^D@q zHC!-5U>{3+SXXWX-B;Z}k5<)&YkdiY0udlvKN2d2C~vOCi2XEudrTs(?G~IoK?030Zf#5et&1W zC0{V?t0Aj&04No{PJpq2BO`wtgIy?V>il+xAqtgPa+axfQjS9{f4hQsTMMvZKw|6D zEgl6bTU@WLCEvXHsxF1N17&Mr%3#K8Ri%;c{U&k)c)mLfcN{}4{Z~W=i>M6+u6qzQ eR+RPMD*6e4=mg0000F6|2143a|3R2;7P8kT{s&>0r7#B|W2#y>{bKh2 z!Zn_7OOvyoNfK!Ys7w^#=zh$WV|N$Wr9smQP6j zFXJCgxur16xN0lGK8)TP1CP(JHV>2pMHL{J9`~QCp#f~DoVgn~XhCrZvj`=%=H{|f zH6Mb46cn7GL=-VI;J=ui6WGTf%v4c9{VW1YC@?JI;Q{t7&9Vs0hoA%l%O)TiIn`3t zLQpCMrA$~>fCV>l7NKgM1X&15EFjBRQ~luvgT#}!q=UuzbJMBsOOU04E&(V8>m}y? z7fp=)FBuX{{dmNe!C{31)vGK@& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.5.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.5.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8d7f82b61e831a3f83da793485a1d15361de3b GIT binary patch literal 1028 zcmV+f1pE7mP)pIwn;=mR7l6YmTgQ^R~W}p$i|pvQNfBv7vgJ5=A!5Z6%EQXoe7#E zrZX{Q-c8itD<<^9hdL7{1d$1w6u}^hCyJsG!weyn>4Jjzmd2nUE`U&^t+HJNp@rk$ zbB}Aq_(7#tpXB7EFL{3V|GZuwpSM`ncXpWL`@qacK8l;$v3wlG14O>h&zF!hzlkUc zWQd^ly)JZQP-I24aYZK0eR6xtGY%@yv?~kjJ4bOyZAbp1huo_plk)r2YWN*q+(O){ zFUCLho_b+{gvzB743it+yh@QD)ja5|qHj1RQH@-Ab^3qAtDKrwN|@&N6K48tLz1c< z&HJ6$8gv4h(Yqik%3s*_-2LBzXe$|-=V4j)Tq~yd#v?n_3b{ZkzL#KH)QbK~6cTx< zv^>tPOaj;WXCwZLDr9`s#-Qsk-FE|`{eKmg1?&?nN&WaybqtO_C<-)pl>tVM*@ZQu z&Lbzx%ED;DnOFxbSv@3g)+2GJ>Yk7^;Vx=6xID1RlrAz*O(zXIq=6$=BkJ=**c8+N z)yM>-&iDtnlY3E@&;w)e4WX};@|-mpC=_W685HY(j5}lfCz|6}lh3WfssIy`$KND7 z#@CCy`B&L+F#L}9#EB!~xH_$G28Wt;l0N6#rm|dCG?iKjXTl`0)krzCR_O7JxMxS` z@CHHVY}@hT<(_EQShBD2+qIT?VAyZvJWamd0+yVJo;%drb?8H6xhFvuLN#i6T z^b-S7k2K&&=o7>S92I+ir-G}RidpJfJlsuRgKV2rB6z|HptcO4QWK`ga@L#xV#4Dh1KfU2IL9GDdp(9La{Nh>3K@9MeHi1dO3{c z`o}1UXz+koc=cWZxDc}LlHju z7o>$$ikrukh|)=lJt2Q1H@s0~xzzp1X6cPhPGwhqjo`$dsdb)h(Dr|^9FOkMvCyta zQC(IR_}lC{>W;)Yf&gOhVBJ73%I*Va3|-}vwP y0Bjc)`Fv;_0&`E9kEf7LBjKYcWbGj+rRW90?<;!JJXlQt0000pH$w@>(R7l6|mG4VaQ5eT>|3WW{@{JKeN-u1bpfAFL0wW=FTue~x zhhSx*d8LvxG%Pd?qs+#Va)~-=n$ZtRb4#XWCRw3I(~uMg?am+DbWyo9QPLyy>%bp;MO`+(4Jk#ATH)8ozEKzZ;ct>6D6&@wSGVj>ToF(e zKv))k2P%u7z%_lnbSlZ>SqOr?>eGxt{mr8aF&ndcA`r4Q=;c=gL|As35lZq~AtClS zS@ya=7F1I{Y{h&tcSKm#9wO{)dIMZ0u=t&6Q2cb3)?7=fMi;g&+pUPRyQzNi}`eU zpOp!)B)^3M$?;z_bpP zK?(~8-8EVWD6Y&^0dq3zVE2wA^xv%)9UfKe&9pqU9Go9vdb1!fM`fB=Jmu>RU(J!hyoX+IGwpCg*LAb)YapBO`Rw(mD~!w0lM@rdOIg zw?xCqtWogmNY)VX(bNnmzpwAGM4?7nMuS`|eRqPAV9joy{`kyg0u^QSPaP>uEh z$kQ%jqWLG=7e3tNwPU}5aMW&mn8&Sks4#NlSl7ftZAFzA-p6Y{x0t4R?tlF2@e5_= V+A;_1X`=uD002ovPDHLkV1n)2Y`p*g literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.7.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_magic.wing.7.png new file mode 100644 index 0000000000000000000000000000000000000000..4aba211628d5ed4b3839fe964dd931b750d8efb0 GIT binary patch literal 686 zcmV;f0#W^mP)pHU`a$lR2UiU!A(rkaU2KWUt72A;vo-hZPhwdx^lg!)yc8Zi_4eg zduZyA>87@FHhR$l8<~bCW|EqYFnqzGd{h)))=~#5YGh<$5+IDP{>_tzj&F=rW zJS^z{QlKv)p}vB``&GpLO4b$a$<*YL#8^tHCK;s+JfZZON@9E!YYV8u-HZo|Djd+M zi2ZS)T}laW#WWXKgmc3M=Y|VSzAjWchak$=5aZ)EhBrl9HB4ebg)rQHO@9H zkpr`yMSStE;*-ybGXwQF+R%zT5s2|o-m4>ETw zjqpwlj@9T88>jIyK2nvkz|i^_%NBXN-l$2SJf2p4sAL%&;y4ur<45J#k6K!Z&TZeg- zLm4<^HGD?eb1MWXI!Y9DQ0`ehF}^Zy80oUC8yB?-Bz4yz;HEXaLiL#gsRit0Js zuG@m-?lR3Q5&!@I07*qoM6N<$f?9Ji!~g&Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.png new file mode 100644 index 0000000000000000000000000000000000000000..f981cf80a34364c6cb0bfa25aa40fbb934e8ddc6 GIT binary patch literal 430 zcmV;f0a5;mP)F4q3nI+_?@zOaV-O#Nfq(%S!^F|mGJqKW&*uZx z9R2_QYV`kq8$$no=ym$vWW)ErK9cQ!eFW?O4okNG|5v&G|Nm|_SPh8%y2%l22-p>1 zL!g@fPjmS{)m!-gkNYkE&u;MkzkZVO|JgMf|MS(E{{KIdjj0*gi5D`M!J1#)mHn>jssCf#)i4x!yIB73>S+3JVyKPV0Bjy6ZwD7_ErD;C-nc_%0N4-}hX3mlH%LJBRWA#9|1ZRS&`Q+fXspECX5c|Nqwi2(b14 z*Lybq|G!U#v)^7Z{J*q^5sax~;rpw$|1WKp09&wgvdsUT9bypNA_BoZlK=1Q7ytk2 zqVfMZO%z(%k;(Y~$w{OC7uTr&zpzjo5FiRnuV(!J{l5MG zySt75-`&IuHw12JpVa@C7mcu5N)`ZF`2Usf|D%hgz&?6+)ezHCU}}AMOp7{s5fpzQ z3s0?-#2R-XOIs6I{_SiR1*=)mPK7K13d$GfjKG$_d<1d?a)JT-7HH|QB~q066c%jX z?>qmWQG=A{+C;&56FKh4PAJ$cMNf^eqz{T)s+Ob37EmqekAhJ!3P!;wpcw!FnaX2f T66m*d00000NkvXXu0mjfzx3Zu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.1.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.1.png new file mode 100644 index 0000000000000000000000000000000000000000..5ccdda726d9d8a80fc01e1392af152774b039b9b GIT binary patch literal 843 zcmV-R1GM~!P)pH{YgYYR7l6|)=N(lQ4|O8*~q7G;R+LD`~ohF3l|zqOoS)~BP@zB zQVCLl3N59)N?WMW2z?L(blQr(vZmF@3|Ms0v9A@ zy7MGA(^<^?=FFUPZUx~;RO)nxzgyjIyciulTi8E!EUT9FXL#W zH#X2MiV)O{CpH_>Yiszvy2^p{<|a~GTS(K&g=%Om!w5;OuOm1!gRnA>@ccYN$s{B? z#xof#Zf|qca#FO$Zbv$sMT#<#<`hV?3c^Xk2=&WT@WrO^_Tw}Xi-c0PMwc5W!r0SG zlu3{v@1zWIk`OsgSe!6+E^{~#Pau(5LWWSS)t(<(($LH?FWqpMAa7L0;CK`Rp)q(u z5xAug?mlZlg|Q8lMl;G94e(7*Lu>2FAKb@e^h;sbhkfW319c(sdOYfb?AtNaMQtDw+9yRgoZ8Id2Th*V zfdQxr+Wi6Ef3GJ#aMUL!P}BR8x5>LtpZVmeb2!vP@92%N5gMGGBQU}%)=kHVa%*@eBzZip4M#jqwZ} zgkIIwsarI;(6n_@bt-(f@J`XdrsbfAxKUeQAdu!F%aU(T2ZP)b9>dMrhQfeVomN=s zJF<#on=spS+4gixr!NecLnpp|!|%PleUx_j^2X-Ef~+l)D?j;I%h2nsGPf5F%%P$z z;|u+XVi8$bK((d2u&CDVK>e#e{My;U5@k6~sJ7dRM}>wBZVyZ@7hf8^Uicr!#a~I+ Vzoc86_(}i(002ovPDHLkV1o6dgvBDEl!8zYKftMUac~qt#7%JP zV#UEpbkMjHWkDxJm9k=e%aiV)3X=Rw1b-~(fS@?I~E&v5I|8>K~=HN z^P*VgQlTykAY|R`Q-}2Yy(w~ISLwaFMi6ep+n>ByDB>lD0!eC#Q%BD#P6MvLjf4RS zeYZ{?)DuU(F?qLutt{hei^XPS%o9`oGlS2ALVCx=7^7$PaHK~_B(Qb7pRhmS- zfVDWKmpZ({OtB^WgOI+s)1|!}6KDzJbBvDdXZQFBdk?gz*Sb8ND>L(pS1d~6FtB5ZJZVu!}v7*v=oCqgEZ$z(GBhhJy3*#3Ag!8iZ_ N002ovPDHLkV1jT{=<5Ig literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.3.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.3.png new file mode 100644 index 0000000000000000000000000000000000000000..97b61cff089436a2955756a41dfbda09a5609739 GIT binary patch literal 691 zcmV;k0!;mhP)pHWl2OqR7l6|)Xhs2aTo`1|AXid5xwl8Q;-J*3CTkTFA}{#9g4El zwulZDDb}SRIz&|85-$sN$P^O^q`j5vZW~CU=1a2es_nWvYwO^+HtxLd+td7hA#{ph zhP~(m4|AH|XTCGfJXKYjsyquqxnWVD30mqJr#r;R zzTdyT#IbKe4MwFS=o8y;J+9zzC=S10$Lr>4uvgozmdWvVV_?D{>M;w{D|&G!(S^$i z6?LNtyd2i?;?fMh*r^ys+iY`chf%g|x znltm%O8KGPK9NV)bm0bV#7`QDU z(ptVi3$-D{P7LC!VcE$nY79#Ba3n^qqh0wDpHh};1M7I#itWD?x?m4WKv^LdF+P2i zD;9|*Wmu>GEJE@loc}ybYf4V~4YD zT9)~?Va*<5uWUMhy$n^4#~`#kK~QsPNd5~wB;sJULLe(oRwtIQs*=?%rYj3>)mClZ Z`VHUgG{avn*>eB@002ovPDHLkV1k7iJ>38R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.4.png b/src/main/resources/assets/utilitiesinexcess/textures/items/heavenly_ring_metal.wing.4.png new file mode 100644 index 0000000000000000000000000000000000000000..37e2706b07c635cbf9e409205c669813648e206e GIT binary patch literal 690 zcmV;j0!{siP)pHWJyFpR7l6YmP=?8Q51$_0#=aXwzPRM4M`+1naQK3Q)ww7t;Q-% zFjA@rE?g8BJ`q$TAR4`x2@*kkEN0cF;DbbL)q=!WM6dy&I7?BN>PAFCeB}4u(Ln05 z&dq_JfqRGh%{lX*Gh;HXBDzQyhE*p3Q^UkF68Xd$DKC8)QXLEit}rk0VyZfVLDkL| zmQ<2!t;CA6T9QA^M|`-TrEx+Vf?SgElPAnZY&fUwM4~JrRub`<2kd4}!tFDi=qBAb zrNtr71R*E_Uh{z6x#j~t?7;a63-(lF=r3)8P!O<0VXwd;GkiUXM^~&EuMA@IbO1F9 zTIAJdtc>55J82Zq=dO)*d+Eop$P^KEj?rMa(){D{dM*Me%FVywAVH{ZpGPRHnWu<*W_3V#v@R8~} z6pVS#iGhd9emE5;L`D2%_AZxxP%--&3&)xbyCY zp};83GW&*386qHcDb>-s|AX#NKJ~*>@E8ZZr9*phpdQen>5FM|>weRnLS8TqdY6v0 z=xi^hmPD{mRHl$J|9j70uyN2iW)_<1k>_FfiJ$MNYX)nJ=&XRf_kswLV0)l1Db#yi z!2Y=?L?X5a`i_~T=){B?hD4pGqe(K@^4e5%NQtkj*9#$RACWm8f2?ljnK%Vcl+*s?{px^LhKQR;wjfxD!~r-4>YZx*M=`I!!t}#$df( zj}N*kY`WS8p)neqFW8fS^hSVGDi!h3n3sSJ1_KI$fKsWH z@@K(%6c6J*8i{_h*<1rbmm3~xAGNlE!4JTE-&e3X>wICeK*} zJy3N(EuQT_qYBK#O9Ukf%ZY+6Y(cLDiV7es5%f^?a$z<&n{zA>fB{8tARQb_&?Cae n#(VhFpocpJVs;MvpFcmJMFpHP)S5VR7l6&mCZ|3VHC#ie~?69w93&O)0(~z+RW0W8!IBmENddQ zMJZwqMKUUxn^J61U}$O7u8hz=ai z%ia9$b3P5@U$Ex93>d}v=&sm}us0pHfe85Z;|h%YTo|8+VO;m)bj~KcoDQO`d?ywb zqx#?--W>va-CcmeOZ#9P-;b1$Gj6(RnwAHBd!a3jRCCa|Mm(<2z1dqU&UbTZ7Fy4` zKgE;52T4A1>yT*Q5x!sx1!-hhJXlW?5a*uCDp}V)u23gJ#O{*aXVCt&Tzf_ z03oYWJ3BX=9FVDeT$zQXPwgwZ@@`)PdIp-%8@YzT(VK`)1TgV7lzci_v*)cR1Px(ElET{R7l6wmTOFtR~X0nvSln=G++!HZqi_NP;NFT%wg8JEVxTFixb4@00+fR z5Gq2g6i5Xtwb05%pwPLt3^wkdCDsHPYz%>7<*G=fTqX>pfbQeI{MYy3>IfrgYx-g5 z%X@Cm^E=Nu|L2_7$;pb++s*^^ebT-Y{Y75T%V?xsS+E;Ujw;JN{t$(GfEIffg~!~` zRqAISthXc0VmN{&Xv1 zgWaGNtaehy@rIDYM8f+n;KlkOdY3EO_%!gppku;tAN7hIc0!YUa4KjM$|Rpy95j~f zL&pA%I3DN>ampT?_~0$Xv$l}&3n?*}8h?mOyj}K-ChG(P7vq@77qIZN%okChov}>EdXETr%PDgHP0D*j0Ao^==W*W*%TWp8sC3+#%`*q}czY5KlE=UP-g;dBz zD(46?xzQ-f;UV2DlJuiHP?!^H0jNtQ$k+d28!#)JfuwEDL@RRh3&06q|FbTe_0KCC6wM!w9Js>S7UTXY<&2JYj%B#)76sg~7fqJbEx_ zpF$%8T#4aeRRC((E5Ody7DSeI<0pmWIWP{Bh6iY_J`EB7B#Clt_#PJKW^9L^{MR;K zPw*i1Ut2ZcT+XxfQxIw!pDmln8K%UAVRWz$%cdu|(q|)dqAkW^P?79Q>WX~fDkmWk zaTpuv$Fn69?)ChFv+ToUYYpbULR-@!e&0LLDOZx2zs~*m;qlXmlJ}Y;TqHoMj}nr; zy8{BP5lMC&d z5FOG?#u^7##pkdvKMQuHVa-^bs?d7i*vJ4{HMIoF4s{26zx%qz%AzdHP8(nDw_;|> zNPr7-v$((uBrij0cHp{B>npCl9FR(0Dv{^SPt8bwFK*N*@#FJ^cSxab`i@)87#+Gx zWZ%|OkIFK!V}Zl^ZXDpt$upztyp5=G9ln+1IR;8eJw`Qxh9Bf+$qy0fhl!g}b4?0| zML07xj_U7=aI-;8qNHw<>T3>)u%h@PYLzmq*Z$v^zX6ZmzRIFB#)AL=002ovPDHLk FV1l<<97X^D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_active.png b/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_active.png index fb460947022d8e636ac935f6c27c38f8a12356db..7181405d78b2e4e069b805ea69b7a1cc2e102d25 100644 GIT binary patch delta 446 zcmZ3*_JnzYK|SLY`dj>;_ygyh z(q2ZhgfAPmnymK9?Pc89`^0?0eV2>9PqwGe-jo~vE;Z`!);764e#=eyue7o6{q!KI zF#fYcZbbw8O}RaHW1m-kFs!aW^Z5W%)uV%tiswCV$NA_Za8>S zZUrwtPzM4nn8EJ(oIgo!%fEX!o;WUl-@E$zgYVyuos&DV&%ErD`GNWN2bgUh*a$tJ kXwl!o4s;v}nowWM7`$|rYSY2B9~pqa)78&qol`;+0PoV;+5i9m delta 774 zcmV+h1Nr>q1F8m)FnaaSy&PIkrffBojL5Q6sI&}3Q zSzs4gs6zyutcxfA1nH26h@yjm7cnTKgO|>oqR@+oKhRK0Bz1qx>|$$&-5FC=U_;qDUdH}M^6G+7h4I|))xZyk*^uQh(;p$#=Zf-^4=bq))=~x za!ggR4aT2_2Gr&-(V)Tm{SW|Za~OcW2rPO`r=j>j-~JW=ca^l~{2Oz*qZ6pjVP=&! z0IPy*Isw3}(tl>%i;@+Xof~sG$7tC*Sh8hFbR2-OchllQt;5eATpjFnB&yhhXK%iM?fF1FI7<)Ac=he8 zcu=eGs|RDfZD>86jzkrCp!Ia}s9F!kOSSTzDceE2zqY;mJ9d2ll^s z$pl^=nC-_Cx2yBu<%5p^JikBVI$yR2Q=6-v1AmAIrx4VJnLs=c4-gN;gF=W0;sN4;cu)xO;9vCMF9wnaRpHh#o&W#<07*qoM6N<$ Ef;j($_y7O^ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_inactive.png b/src/main/resources/assets/utilitiesinexcess/textures/items/inversion_sigil_inactive.png index f2d12dd308e09438098bd402229bf445667488b2..bca5005fb895e3ecdc5bb902326b83e4708036e6 100644 GIT binary patch delta 196 zcmV;#06YKQ0_*{hFn<81Nkl08v=73P6LRE yMyv*4OGwBG2ssg9O-RVelNbz3_SDNvlmGzlxA8i5g`Ug+0000k$B+>jN--e(JPiwhMw7zt1`wth(+W;JH3gIBqQM6jVhDKopMU zUF=mL$W~oz+YYu+u5*nX_-FDwnLXkRg8vn$Nb_&*M-Nh28`>*WMT)h1ve(6nPPClP z1zMEVAgKXD2`~{rvRXnr%4$3t?O(mNMC>&SqWO@|R48hW#xKkAaeE#wm-_$!002ov JPDHLkV1j|Oj)DLH diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/inverted_ingot.png b/src/main/resources/assets/utilitiesinexcess/textures/items/inverted_ingot.png index 5192097e5d4c0c7c7d81035a5461e654233632ae..89d66ff2a944f6be79cbaae9ebf79fb44229d2e0 100644 GIT binary patch delta 403 zcmV;E0c`&40=ff`F@JPPL_t(Ijn$HGO9DX<#xMGoAt54ih#VqE97iJ@$8j7YA`&Jc z;)@X1@DwVQ^Y58y+K1^IOf#FN1qr>Yg@;*|eSR}Lvx@R>mKaU2HJRbBOwHjK{cw(t zt2Jt-2}#3%yJ>hFa@!A(vo(StW-JS0sT9Q1X^3eWM3X7d41W{++58O=Po#l256c(q z&KKAWMyTpKL{wGkTul-{gG*;&*<4OWzIP};d_tv1@8dH0z_1;-ux*kf&8F*qF>wV3SFnwKxIpFpd4+n`k_HLc z#=YsoaHvwX27gzzIt(_i1XwIFvjuRc*~CDd8psu~7*eWMp-{Pz<{hBVfG)j*o5H1Y zhZ(>?hVWUTQh_3w8Bng*p+on1tiAPSKTa_mAvev+=Ow@^mt{6Kv)c55+S3`fXuLnp xzcC1K2gs92&?jOYHGN+`&332HkMif&I~g5LOxQP;`V0U7002ovPDHLkV1k4{w=Mtx delta 324 zcmV-K0lWUX1MC8jF@GjWL_t(Ijn$H&j>1q7MbFS0YDg85kd&ZsJ_Cv78<6Pg z{z6Sf1+9G_fkR;W2W1eXZ~HbI*6xnFx$oY&GnohfrmVGUt<~>*_?v0Km&?U*#uyoR z`DDuToZIb&$d_zBpL05$7@EjWNsq?^fWGeuf`IjUO%MbCsDHkthr9)&WA5TmZQke`K9v?$WRpB6=0aZ7^ z_9j0$^F+Yjx8;kQV1dqLhF84-Dw+m+iXybHq`83#uk(4X0vNeG7*%z|!N0zNGiM5J?@vd2@D+PpqWlQ#6M1+TJME=#~hF82VU z40Ot1747j1rKUee?bH;2Fj>WW=r^#b^U4Lhy{JN$MciN(;K|B>I!zE6YP^Az5s6IB zD-}2^zZdY@phE@@uY;OGsZ)o^fDFlm_Rh*>c*9{bD1TL}aLv!tv$jKq{`b42$w&K3e*vGVmizK1 S3P%6{00{s|MNUMnLSTZ?js&Lw delta 355 zcmV-p0i6D}1d9WZF@Hr#L_t(IjlGhgj>13?hQFmXUx!kDP$$tMovpeu#VT=)DjI`_OH>l35sscc3O%Mc@ z`yucN0yrEF0PJ=^OB}#q!jK^a~L>XhG?R3B20e^TtpLm|fd_KqXJOD)A zUYpGZtu=m86g(aek|c3PX+kv^$FV(ME*Aj&;c&=)zh}GMl4Thp;iT=OeW-cP8`Q%S>`x3MSHy-B0?C3*2HhNou(=4^_o1-5fM8tz-%_N`Rnzv zxeqWH44k%WM_i>8VHnz4zu#xESlD}7YwRx^k4HwM5m6LzyWOmah_GBP9jJ~V2$bD} zs;W4hPDD|}^?L1unq%8Tdmp->j{>wdvJ3jt_yX#gYMv!I@ vCMzI8-sqb-vkPPZN&ZJSglx?t2mk=?nOG;0)ppqc0000;GiHX4->3g$Q-{+4WU%|(ew=c6!(hwl6$}=l z<_zED1sO>80s{jBgN3L$g8-`tUe^)j1+u}iKezwm3cOK(02Kh3swlGjl&RzZ0000< KMNUMnLSTY5FG*tn diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/mob_jar.png b/src/main/resources/assets/utilitiesinexcess/textures/items/mob_jar.png index fba3bfe4de5d98271371f73d8dd01dfc25a969d5..925630d3bf9d7a9eacead1eb279bfa1ff20f0187 100644 GIT binary patch delta 95 zcmV-l0HFVz0f_;SF<3)ML_t(I%VS`mCV24R!GB^fPR*oPM7ALW)gUWCS4@;EVT!OR zCdqcP)C{Zv6h|Xn48Rvd1P#EKKB$|N$<9pV0ssxWt6*yL_t(IjbmV-5HKQh9z1yPpBPOF3JQ!Eg2ZaZtCko;2&zF= zfUX#uW+r?FVf8CT&cmVxrwfP$6dM2s5ueBW)t|FX3n)mZAEeZSr(j+AWQbQHi z^j-l>P)RiTFaf$Bv8z07rZtLrpl=&wq&4i^Us`r{wZfE8J^ML;Y{tuW3ALqdX?AdoxCAH9P00000NkvXXu0mjfogz{y delta 310 zcmV-60m=U90o?+SFn<9TNklGBSwQ1if$2PPwFPk1N~EOr(NLQM3vm;(SVN0orf zK+ewIdzX(fm6*G>arlvbv9pSjZ{RLFOEF*b;63snH`3ql2O%a}_j^^v^X$yQ@^}7) z6lYu-neqUz#+vJXQ1^o(g4fN1GXv;)xC$J)!~g&Q07*qo IM6N<$f>;}o%>V!Z diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/precision_shears.png b/src/main/resources/assets/utilitiesinexcess/textures/items/precision_shears.png index b60a37c4fd80bcd0bff55e79cc1d166f9272e261..a190ef2ba7674a30c1dd093fb486cc700b43c83f 100644 GIT binary patch delta 352 zcmV-m0iXWJ0s8`wB!2;OQb$4o*~u(_00004XF*Lt006O%3;baP0000WV@Og>004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF;8u3l#+p5lDnA00006VoOIv0CoVI0GAN_|9|EH006&9L_t(I%hi!R z3c@fLhI@pH)=F(P)LL3pI;dS7#KBA0dpHXo!og!?@^r7fLf{+H*lzklh6JAH`-$iM ze4Pn-G^puuum$ y=VsWZ6s7U@15@<1GQ%0AfS??uQz((5|HvC?-Fp7F?t^^*00004(% delta 172 zcmV;d08{__0>}Z7B!7=dL_t(|USnVw^gw0)z5gJr5p(1}x*S0O(kRw<>c3G-%KzB) zz5gfO*+sk|xHJ=G2tLgqK3?yDH1FL18>|SMW{{yo8vqkS*4#4t32p004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009a7bBm000XU000XU0RWnu z7ytkO2XskIMF;8u3l#(`-81xw00006VoOIv0CoVI0GAN_|9|EH0081iL_t(I%hi!f z3c@fHMN_fh2c+VsQd4lIFIrqMo z2=Vjs+6e{SDY?yvzJ>t}y*X`;sg+*N*6DWjzk+9@J>ar}YdGgQDg;Nt3UEWgmV!}< z-FGKsgeP)GoqU!gzFcCcs$ju;!KU?IXKXf*{(>CGBQ3dxN*J!d7~?G*4>qJHsAQYr zW*DsB!}*ut;gFu6!3_IFd@#c*EyKVX5FQI)BDZAh8{#rE-6-^zFBnE2lOgU=H+TTl hTPY+qx$8#%p(h2YYSfL%Z&3gM002ovPDHLkV1mY%m9_u? delta 148 zcmV;F0BirA1F!**B!72FL_t(|USnVw^gw0)z5gJr5p(1}x*S0O(kRwS<+s(+?QL_t(Y$F0{vZ`v>z24MIHu%g}f6RHTBaGUVjxYuYC9IHub z!WB*8ZW4SCiDa&52ma-p`2AuCEt(YPP<>J*^61U$*clAy8jkC~W^VOF`JL^$Q?Z4 z>gdW-q0bi#8h=jYY4b6|JL~2nGxRy^>j{ugt_sv9INjva@wEB8@6hK^u8>dG(^JC3 z6)}pU+vg8Frq4-;d|qS*kKfP3(I2Lccuc8%Ud1PUPVDo_(4VdRjs9f4JO_BVULXx) zR&_mh`kb)PGoHN^@GSdyIIS;rM1KP6^XzV)J?gVSe}A@;)>rOgz1J_;hM_9&)WXa* zap9R#KEm{wg%X~0ekF@)&$`2&yXbIOs=t196M`guayzv#RgB=&iUPx_qN=T!_1x)m%DC4(ude!dLRw#PFEqvV_r>gPpS|nv3;p_1w7x1g=T+H$ l=GYG(+P_-Ql=3nA`&xf-!1KT7)qgy`<%|^_8=jM11ER>+cryS1 delta 708 zcmV;#0z3Wt2Y?8Ws(-6VL_t(Y$F0{vYvMo{24MXMx|O}}Pbfi~cw3xpGrfjg^jH?s z#H%cL9~0*u6Bw_u2mj?xGVeFh*vdjChw?!|AKtw2n+yhY4afE0@n|soHrCgJ9wv-U zf4z+cgUO4On>YRMuYT-_W{|ljzU$$^j~CNs@YtekhLo+;qkkEG6!kE9RqCV%{ejb; zvHrl}WBnChM(vm0UUxmA+#ALdc{D6)zFp>E_>8M&h*?yS=hS%kSrv{w+m=DF0{MU; zcYq}g?FF&02qQnzC)iwxk5f!PfrOC zSHviaZl6E!m_8>V@_CUNJbph9M}L?);x?u2{VG1`bJE_g4E@>4-{?=)%X5H->j$J^ z%&M;EPM;GNdd9Pt0-j|b52xo#9nqhF`aHYaXOH?U(0`w;q~|Ml@x0eRunj|1-pRtu znz-;xDIa0_%t8szp7L??`%^EV>wGlKc!G=lmBF)=*ZI`zw~pXcNWXn&~+j6kPB z`%92#Lw$CekL`0n`%A+F@&Q8~083f4q5UPgeRkwIs)#%SgKrq~*ygkN0~qp2$@8q& zv0Kl%Y=0RRM*T62IcxJV9(90+FP-%{N1rbkG;GLY^D)Dkb@Ndr`po-!eB@I}f!g?+ zn|wMRo6q`yK6AB1K4ni&22Uu7Aw;*&A9zfkQ;vLIRS8ef&lA%AqVsBywD(JV(&x0j zU!|b)D($bbmuJ^Kug>zW=T4tf#=Y)&b=Aic(mC@b_tKu91?{gpefF;3FZ9osqUWn} qb6%D9HK%>?q5Wk&Q_9Ee_qBfGfaibDtN#EzzU7P?#XvffSp%Y-Xn2tT diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/reversing_hoe.png b/src/main/resources/assets/utilitiesinexcess/textures/items/reversing_hoe.png index 4e69482726fcb9c2a90c135c2bdc0024df33543e..28270b89db9a0545b3881b88f5b66906482d8a62 100644 GIT binary patch delta 331 zcmbQs_>5_SNG(&67Iy3=9k`>5jgR3=A9lx&I`x0{IHb9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!CBxDSXEXGi-1uds7cIo?(@zi(`nz>Ewh3sx$WH-ma5S^De&m z=B4za+0tgrAK5nXGCs0R6TIl1*v7$q>aVzH*bo0rjtb5W5ux`!*~`y=Q9mhGS#i}T z`6pZx6kV#>S4n90JT^6#|w%YW<_RoYqg*B`03HGTeHL43lSoC)z)pPX$p^Pad) za*3x){Mo5{7??9Jg>6!fH@+Fj%9U!#nY&>A(vzESMqK`FFTda7L_t(|USnXOC0O?7_J0^gmm>&3nkL=Z^*?rfFBp?;2nZXs zq`(bPnSbwp%j_ql83r>1gm>=${a+*I2x$g@0LW&LD?o;j>>Zf1K{k`6nIdPyY(|$O i2u5ut1CVVqr2qii9gvKgaACIq0000E)e-c@Ne1&9>AYTTCDm4a%h86~fUqGRT z7Yq!g1`G_Z5*Qe)W-u^_7tGleXakhsEbxddW?v!UEG7dvkC5Dcs{d@+RP4oW?!J zHH_7#)BNxAT;@nR{KG|Z!J<|?~(CT@;&G5N@*aGUEg&!Wz2JjHsO(q_C>m@b&i z;qlS0Pfc765#{S;1Rb`9mgS&nAP*=k&OcDLV6TXe9syDR<# o&^oJ|vl1DWNOnj{zTjjqIC$iwDSycxpjQ|?UHx3vIVCg!037Uu!vFvP delta 233 zcmVhIy0R%U0l{tvefEVee zYoR?vaqktnb6+pv+Ntyi@dVRN9V$X&XrZ$TBwyy`2l#iHEsKaq<}oubOtb}CYhkTL z(=@tSnx>IA0TD@6Rfyvl0MNEAm>JVFX_Ai#nAy~I4dA4MH~zYwWlMI@XSiC~00000NkvXXu0mjf9gkz@ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/watering_can_advanced.png b/src/main/resources/assets/utilitiesinexcess/textures/items/watering_can_advanced.png index d8b91dd3941d1270f41dcbc18b88176c7ba62304..6eb4d3f5d7baf9948c178875e508ad9d42ec5846 100644 GIT binary patch delta 177 zcmV;i08anf0{;P!R)3U9L_t(I%VS_?V`HEMGtk9=$8Y}q2Vt@dK-P%O5IDm*rTsq$ zqbpdv=fQt$Y!m}P8Y64x|Hq~PB#w=ZVF1h!WJ#Df$Y7A1ZA`^~c@qaP#u^47#V~&& zy9y)*GX$m?Mq>mT%n)<~K$s{4kPRW*0GI+?2H*?>d^&jVe+c zj3A875V!$0agF~$7|Ml%0~a1aS*UCn02=_(C?+YvkPs0G7DNWy4(^AtP}wj5cfqUY zFEA8<3>xHQ2EUNPwwAjkkGUG55iC-5Ce`Zs%HdYkbh#BKapMKU?9ifW$(x! zqo@v&Vt8@s7$eLOlt2U-l2FkJHv}1g48aCa3;+R`AqzUnp(6MJh5;Y|GQ`Hi3ChC+ zAm@X;0b*k{02@G#LYQU{z-s^~)Il)=(hQ}Ga*M83?SPM0t1~J85jW9nQ=U^ TYD|X!0000y{D4^005auL_t(I%f*w?3BVu> zL|w{V{Bj7Vavs0jCglnT8WStD(2s-kl01?~gNTGT3ZDR4Yg_f+1=9X9f!A!s696AM zXMr@J)+$y!0nk`V5nTYmx8emr$e5%LFmfp+i80_AaFa5kStMxBUj*LKez|M0r$ZLzma9lj(2CqBqI2vzVKmv13--NEvTw0 z0f15p?eCfSIRP_+nQxm*DO5_KmFToWj1k5d8OQMinCJQOd>|OdQR=!z+qQovKnUUT ze9!;@a?S`LplO?AT;Yuu})ZaN^W_a((Ifr2wZf)H=b{Qn^J#}4oOQ5xuX`1Ln@Gek$ z3)kj@3s;p=+N@h$cr6luqn|y~e{2ds;@H?22EYtKmV}9e3aMV47hxMxenAK{o(|i827$5V8$`DZpg_&M?4d0D2e@WhnqC)M17o#{$tQ5$0TE eJTRFF9|iyeJkca?J@000055s>DhAM#=@Z=2xBM5^O!+-pV?5Z$ZKL#z&QU*?L zh<$IqFfhUlfx7?%K!#KlTEh)N1|UPQ0Tcs30A@%>|52z2et=;B2!ISJ$h3y?FagN< zAa8)!SPj4ikfRW$83b_V1&}T5Yz*Ll0|g)`hCs3K^B0i@fB?$YjK20Gc}N3W#+nF55}+ zDp{H_3;_{JGE)E9*f>xyNDQVJmps@2NfBYNK!Tw3|9W>nFb1(?$uoc$b8-sc y5-^1zF_>-mlH>XqoDscZ&(CunACHnKIw_%)RZOv>?^Ci-x2YJo&?2F1Sevq@?DPkHNve_h&xj zT4$GZ{DYcarJAInV%y30`NyTr*oH za^J~`g**J4b({M(ul-tis<`COY4OB;0`qkae5$k3dn4R1-vMqKoN;5Ly2`b=nQN+E Qz5SLsO+?*%?h$rU2zM)f4ExJx^AyS zIDev?lXFuSU!uCJ@Zk`yN52yirr&?}=G+^e|Go@xpx_ymYPc@!`}3&PI>%N&`!n~{ zGTAMslI~R3oGQKOH7RD!UUkoN`SL;Y(NrV!Z From 0b7404f7c0208bf81a321d1e58e1fe99c66fc625 Mon Sep 17 00:00:00 2001 From: Mika Hensel <41554385+MalTeeez@users.noreply.github.com> Date: Sun, 7 Jun 2026 05:47:38 +0200 Subject: [PATCH 28/28] Add particles & update particle packets, rename package to be less cursed --- dependencies.gradle | 1 + .../utilitiesinexcess/ModBlocks.java | 6 +-- .../BlockVoidMarker.java | 2 +- .../BlockVoidQuarry.java | 2 +- .../BlockVoidQuarryUpgrade.java | 2 +- .../VoidQuarryUpgradeManager.java | 2 +- .../tileentities/TileEntityVoidQuarry.java | 42 ++++++++++++++++++- .../config/blocks/VoidQuarryConfig.java | 4 +- .../network/client/ParticlePacket.java | 32 +++++++++++++- 9 files changed, 81 insertions(+), 12 deletions(-) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/{void_quarry => voidquarry}/BlockVoidMarker.java (99%) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/{void_quarry => voidquarry}/BlockVoidQuarry.java (99%) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/{void_quarry => voidquarry}/BlockVoidQuarryUpgrade.java (99%) rename src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/{void_quarry => voidquarry}/VoidQuarryUpgradeManager.java (99%) diff --git a/dependencies.gradle b/dependencies.gradle index 2dc154d3..21435513 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -63,6 +63,7 @@ dependencies { runtimeOnlyNonPublishable('curse.maven:chicken-chunks-229316:2233250') // Testing performance with void quarry inserts runtimeOnlyNonPublishable("com.github.GTNewHorizons:EnderCore:0.5.0:dev") { transitive = false } + runtimeOnlyNonPublishable("com.github.GTNewHorizons:EnderIO:2.10.29:dev") { transitive = false } runtimeOnlyNonPublishable('com.github.GTNewHorizons:Avaritiaddons:1.9.3-GTNH:dev') { transitive = true } runtimeOnlyNonPublishable('com.github.GTNewHorizons:Avaritia:1.81-pre:dev') { transitive = false } runtimeOnlyNonPublishable('com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-789-GTNH:dev') { transitive = true } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index bf32aedd..e48c879c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -53,9 +53,9 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockRedstoneGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockSolarGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockTNTGenerator; -import com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry.BlockVoidMarker; -import com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry.BlockVoidQuarry; -import com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry.BlockVoidQuarryUpgrade; +import com.fouristhenumber.utilitiesinexcess.common.blocks.voidquarry.BlockVoidMarker; +import com.fouristhenumber.utilitiesinexcess.common.blocks.voidquarry.BlockVoidQuarry; +import com.fouristhenumber.utilitiesinexcess.common.blocks.voidquarry.BlockVoidQuarryUpgrade; import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderLotusConfig; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidMarker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/BlockVoidMarker.java similarity index 99% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidMarker.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/BlockVoidMarker.java index bbcbe397..2c060477 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidMarker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/BlockVoidMarker.java @@ -1,4 +1,4 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry; +package com.fouristhenumber.utilitiesinexcess.common.blocks.voidquarry; import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/BlockVoidQuarry.java similarity index 99% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarry.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/BlockVoidQuarry.java index d440479a..17d4f187 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/BlockVoidQuarry.java @@ -1,4 +1,4 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry; +package com.fouristhenumber.utilitiesinexcess.common.blocks.voidquarry; import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarryUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/BlockVoidQuarryUpgrade.java similarity index 99% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarryUpgrade.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/BlockVoidQuarryUpgrade.java index 0b514060..5593489f 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/BlockVoidQuarryUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/BlockVoidQuarryUpgrade.java @@ -1,4 +1,4 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry; +package com.fouristhenumber.utilitiesinexcess.common.blocks.voidquarry; import static com.gtnewhorizon.gtnhlib.client.model.ModelISBRH.JSON_ISBRH_ID; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/VoidQuarryUpgradeManager.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/VoidQuarryUpgradeManager.java similarity index 99% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/VoidQuarryUpgradeManager.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/VoidQuarryUpgradeManager.java index f2e37503..2cc39afc 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/void_quarry/VoidQuarryUpgradeManager.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/voidquarry/VoidQuarryUpgradeManager.java @@ -1,4 +1,4 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry; +package com.fouristhenumber.utilitiesinexcess.common.blocks.voidquarry; import java.util.HashMap; import java.util.HashSet; diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityVoidQuarry.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityVoidQuarry.java index ac170cf8..d7950f5d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityVoidQuarry.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/TileEntityVoidQuarry.java @@ -49,10 +49,12 @@ import org.joml.Vector4i; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; -import com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry.BlockVoidQuarryUpgrade; -import com.fouristhenumber.utilitiesinexcess.common.blocks.void_quarry.VoidQuarryUpgradeManager; +import com.fouristhenumber.utilitiesinexcess.common.blocks.voidquarry.BlockVoidQuarryUpgrade; +import com.fouristhenumber.utilitiesinexcess.common.blocks.voidquarry.VoidQuarryUpgradeManager; import com.fouristhenumber.utilitiesinexcess.common.tileentities.utils.LoadableTE; import com.fouristhenumber.utilitiesinexcess.config.blocks.VoidQuarryConfig; +import com.fouristhenumber.utilitiesinexcess.network.PacketHandler; +import com.fouristhenumber.utilitiesinexcess.network.client.ParticlePacket; import com.fouristhenumber.utilitiesinexcess.utils.DirectionUtil; import com.fouristhenumber.utilitiesinexcess.utils.Tuple; import com.fouristhenumber.utilitiesinexcess.utils.UIEUtils; @@ -64,6 +66,7 @@ import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; +import cpw.mods.fml.common.network.NetworkRegistry; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; @@ -1067,6 +1070,7 @@ public void scanSidesForTEs() { * Does not check for anything, should be called after tryHarvestCurrentBlock() returns true. */ private void removeCurrentBlock() { + spawnParticle(dx, dy, dz); worldObj.setBlock( dx, dy, @@ -1074,6 +1078,40 @@ private void removeCurrentBlock() { upgradeManager.has(VoidQuarryUpgradeManager.VoidQuarryUpgrade.WORLD_HOLE) ? Blocks.air : REPLACE_BLOCK); } + /** + * Spawns particles around the broken block for nearby players. + */ + public void spawnParticle(int x, int y, int z) { + NetworkRegistry.TargetPoint targetPoint = new NetworkRegistry.TargetPoint( + worldObj.provider.dimensionId, + x, + y, + z, + 64); + for (double dx = 0.1; dx <= 0.9; dx += 0.2) { + for (double dy = 0.1; dy <= 0.9; dy += 0.2) { + for (double dz = 0.1; dz <= 0.9; dz += 0.2) { + double d0 = x + dx + worldObj.rand.nextFloat() * 0.25; + double d1 = y + dy + worldObj.rand.nextFloat() * 0.25; + double d2 = z + dz + worldObj.rand.nextFloat() * 0.25; + + PacketHandler.INSTANCE.sendToAllAround( + new ParticlePacket( + "depthsuspend", + d0, + d1, + d2, + 1, + 0, + 0, + 0 + ), + targetPoint); + } + } + } + } + /** * Update the time left data with a new data point of blocks broken this tick & recalculate the estimate every * second diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/VoidQuarryConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/VoidQuarryConfig.java index 5ea8e4e0..87533be6 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/VoidQuarryConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/blocks/VoidQuarryConfig.java @@ -39,12 +39,12 @@ public class VoidQuarryConfig { @Config.Comment("Block type to replace mined blocks with if the world hole upgrade isn't present.") public static String voidQuarryReplaceBlock; - @Config.DefaultInt(400) + @Config.DefaultInt(1) @Config.Comment("The amount of blocks the quarry tries to mine per tick, without speed upgrades.") public static int voidQuarryBaseSpeed; @Config.DefaultDouble(2D) - @Config.Comment("The multiplier applied to the base speed mine speed.") + @Config.Comment("The multiplier applied to the base mine speed.") public static double voidQuarrySpeed1Multiplier; @Config.DefaultDouble(8D) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/ParticlePacket.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/ParticlePacket.java index 235ba03f..f19e9767 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/ParticlePacket.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/network/client/ParticlePacket.java @@ -15,6 +15,7 @@ public class ParticlePacket implements IMessage { private String particleName; private double x, y, z; + private double velocityX, velocityY, velocityZ; private int frequency; public ParticlePacket() {} // Required @@ -24,6 +25,21 @@ public ParticlePacket(String particleName, double x, double y, double z, int fre this.x = x; this.y = y; this.z = z; + this.velocityX = 0; + this.velocityY = 0; + this.velocityZ = 0; + this.frequency = frequency; + } + + public ParticlePacket(String particleName, double x, double y, double z, int frequency, double velocityX, + double velocityY, double velocityZ) { + this.particleName = particleName; + this.x = x; + this.y = y; + this.z = z; + this.velocityX = velocityX; + this.velocityY = velocityY; + this.velocityZ = velocityZ; this.frequency = frequency; } @@ -33,6 +49,9 @@ public void fromBytes(ByteBuf buf) { this.x = buf.readDouble(); this.y = buf.readDouble(); this.z = buf.readDouble(); + this.velocityX = buf.readDouble(); + this.velocityY = buf.readDouble(); + this.velocityZ = buf.readDouble(); this.frequency = buf.readInt(); } @@ -42,6 +61,9 @@ public void toBytes(ByteBuf buf) { buf.writeDouble(x); buf.writeDouble(y); buf.writeDouble(z); + buf.writeDouble(velocityX); + buf.writeDouble(velocityY); + buf.writeDouble(velocityZ); buf.writeInt(frequency); } @@ -52,7 +74,15 @@ public static class Handler implements IMessageHandler public IMessage onMessage(ParticlePacket message, MessageContext ctx) { World world = Minecraft.getMinecraft().theWorld; for (int i = 0; i < message.frequency; i++) { // Send the particle multiple times based on frequency - world.spawnParticle(message.particleName, message.x, message.y, message.z, 0.0D, 0.0D, 0.0D); + world.spawnParticle( + message.particleName, + message.x, + message.y, + message.z, + message.velocityX, + message.velocityY, + message.velocityZ + ); } return null; }