From cea90d50e45aa6c6823071bd5fa4cb4e0599ab15 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 15 Jan 2020 21:56:53 +0100 Subject: [PATCH] Crafter Connectivity - Mechanical Crafters can now be connected using a wrench - Connected crafters "share" an input inventory - Added texture connectivity for all faces --- .../java/com/simibubi/create/AllBlocks.java | 17 +- .../foundation/block/connected/CTModel.java | 2 + .../block/connected/CTSpriteShifter.java | 4 +- .../crafter/ConnectedInputHandler.java | 287 ++++++++++++++++++ .../crafter/ConnectedInputRenderer.java | 84 +++++ .../components/crafter/InputCTBehaviour.java | 73 +++++ .../crafter/MechanicalCrafterBlock.java | 177 ++++++++++- .../crafter/MechanicalCrafterTileEntity.java | 93 +++++- .../MechanicalCrafterTileEntityRenderer.java | 73 ++++- .../blockstates/mechanical_crafter.json | 16 +- .../blockstates/mechanical_crafter_arrow.json | 17 +- .../blockstates/mechanical_crafter_belt.json | 17 +- .../mechanical_crafter_belt_frame.json | 17 +- .../blockstates/mechanical_crafter_lid.json | 17 +- .../create/models/block/crafter/arrow.json | 38 +-- .../create/models/block/crafter/belt.json | 18 +- .../models/block/crafter/belt_animated.json | 7 +- .../create/models/block/crafter/casing.json | 130 ++++---- .../create/models/block/crafter/item.json | 9 +- .../create/models/block/crafter/lid.json | 6 +- .../create/models/block/mixer_base.json | 9 +- .../assets/create/models/item/filter.json | 4 - .../textures/block/connected/brass_casing.png | Bin 0 -> 2988 bytes .../textures/block/connected/crafter_side.png | Bin 0 -> 841 bytes .../create/textures/block/copper_ore.png | Bin 809 -> 776 bytes .../textures/block/crafter_thingies.png | Bin 464 -> 477 bytes .../create/textures/block/crafter_top.png | Bin 3229 -> 540 bytes 27 files changed, 911 insertions(+), 204 deletions(-) create mode 100644 src/main/java/com/simibubi/create/modules/contraptions/components/crafter/ConnectedInputHandler.java create mode 100644 src/main/java/com/simibubi/create/modules/contraptions/components/crafter/ConnectedInputRenderer.java create mode 100644 src/main/java/com/simibubi/create/modules/contraptions/components/crafter/InputCTBehaviour.java create mode 100644 src/main/resources/assets/create/textures/block/connected/brass_casing.png create mode 100644 src/main/resources/assets/create/textures/block/connected/crafter_side.png diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 8700b2185..248dd66a4 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -135,10 +135,10 @@ public enum AllBlocks { MECHANICAL_MIXER_HEAD(new RenderUtilityBlock()), BASIN(new BasinBlock()), MECHANICAL_CRAFTER(new MechanicalCrafterBlock()), - MECHANICAL_CRAFTER_LID(new RenderUtilityDirectionalBlock()), - MECHANICAL_CRAFTER_ARROW(new RenderUtilityDirectionalBlock()), - MECHANICAL_CRAFTER_BELT_FRAME(new RenderUtilityDirectionalBlock()), - MECHANICAL_CRAFTER_BELT(new RenderUtilityDirectionalBlock()), + MECHANICAL_CRAFTER_LID(new RenderUtilityBlock()), + MECHANICAL_CRAFTER_ARROW(new RenderUtilityBlock()), + MECHANICAL_CRAFTER_BELT_FRAME(new RenderUtilityBlock()), + MECHANICAL_CRAFTER_BELT(new RenderUtilityBlock()), SPEED_GAUGE(new GaugeBlock(GaugeBlock.Type.SPEED)), STRESS_GAUGE(new GaugeBlock(GaugeBlock.Type.STRESS)), GAUGE_DIAL(new RenderUtilityBlock()), @@ -221,10 +221,9 @@ public enum AllBlocks { LIMESTONE_BRICKS(new Block(Properties.from(LIMESTONE.block)), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL), POLISHED_LIMESTONE(new Block(Properties.from(LIMESTONE.block)), ComesWith.SLAB), LIMESTONE_PILLAR(new RotatedPillarBlock(Properties.from(LIMESTONE.block))), - LIMESTONE_LAYERS( - new LayeredCTBlock(Properties.from(LIMESTONE.block), - CTSpriteShifter.get(CTType.HORIZONTAL, "limestone_layers"), - CTSpriteShifter.get(CTType.OMNIDIRECTIONAL, "polished_limestone"))), + LIMESTONE_LAYERS(new LayeredCTBlock(Properties.from(LIMESTONE.block), + CTSpriteShifter.get(CTType.HORIZONTAL, "limestone_layers"), + CTSpriteShifter.get(CTType.OMNIDIRECTIONAL, "polished_limestone"))), WEATHERED_LIMESTONE(new Block(Properties.from(Blocks.ANDESITE)), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL), WEATHERED_LIMESTONE_BRICKS(new Block(Properties.from(WEATHERED_LIMESTONE.block)), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL), @@ -240,7 +239,7 @@ public enum AllBlocks { __MATERIALS__(), COPPER_ORE(new CopperOreBlock()), ZINC_ORE(new Block(Properties.from(Blocks.GOLD_ORE))), - + ; private enum ComesWith { diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java index 71c87bffa..c74e53728 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java @@ -79,6 +79,8 @@ public class CTModel extends BakedModelWrapper { CTSpriteShiftEntry spriteShift = behaviour.get(state, quad.getFace()); if (spriteShift == null) continue; + if (quad.getSprite() != spriteShift.getOriginal()) + continue; int index = data.get(quad.getFace()); if (index == -1) continue; diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShifter.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShifter.java index 8425a6381..321fe3538 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShifter.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTSpriteShifter.java @@ -17,8 +17,8 @@ public class CTSpriteShifter extends SpriteShifter { public static CTSpriteShiftEntry get(CTType type, String blockTextureName, String connectedTextureName) { String originalLocation = "block/" + blockTextureName; - String targetLocation = "block/connected/" + blockTextureName; - String key = originalLocation + "->" + targetLocation; + String targetLocation = "block/connected/" + connectedTextureName; + String key = type.name() + ":" + originalLocation + "->" + targetLocation; if (textures.containsKey(key)) return (CTSpriteShiftEntry) textures.get(key); diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/ConnectedInputHandler.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/ConnectedInputHandler.java new file mode 100644 index 000000000..a5560c027 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/ConnectedInputHandler.java @@ -0,0 +1,287 @@ +package com.simibubi.create.modules.contraptions.components.crafter; + +import static com.simibubi.create.AllBlocks.MECHANICAL_CRAFTER; +import static com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.tuple.Pair; + +import com.google.common.base.Predicates; +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.utility.RaycastHelper; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.IEnviromentBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.LogicalSide; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; + +@EventBusSubscriber +public class ConnectedInputHandler { + + @SubscribeEvent + public static void onBlockActivated(PlayerInteractEvent.RightClickBlock event) { + World world = event.getWorld(); + BlockPos pos = event.getPos(); + PlayerEntity player = event.getPlayer(); + Hand hand = event.getHand(); + ItemStack heldItem = player.getHeldItem(hand); + + if (player.isSneaking()) + return; + if (!AllItems.WRENCH.typeOf(heldItem)) + return; + BlockState blockState = world.getBlockState(pos); + if (!MECHANICAL_CRAFTER.typeOf(blockState)) + return; + + BlockRayTraceResult ray = RaycastHelper.rayTraceRange(world, player, 10); + if (ray == null) + return; + if (ray.getFace() == blockState.get(MechanicalCrafterBlock.HORIZONTAL_FACING)) + return; + + Direction activatedDirection = getActivatedDirection(world, pos, ray.getFace(), ray.getHitVec()); + if (activatedDirection != null) { + if (event.getSide() != LogicalSide.CLIENT) + toggleConnection(world, pos, pos.offset(activatedDirection)); + event.setCanceled(true); + event.setCancellationResult(ActionResultType.SUCCESS); + world.playSound(null, pos, SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, SoundCategory.BLOCKS, .25f, .1f); + } + } + + public static List> getConnectiveSides(World world, BlockPos pos, Direction face) { + List> sides = new ArrayList<>(6); + BlockState refState = world.getBlockState(pos); + Direction refDirection = refState.get(HORIZONTAL_FACING); + Vec3d faceOffset = new Vec3d(face.getDirectionVec()).scale(.5).add(VecHelper.getCenterOf(BlockPos.ZERO)); + + if (Block.hasSolidSide(world.getBlockState(pos.offset(face)), world, pos.offset(face), face.getOpposite())) + return sides; + + for (Direction direction : Direction.values()) { + if (direction.getAxis() == face.getAxis()) + continue; + if (direction.getAxis() == refDirection.getAxis()) + continue; + BlockPos neighbourPos = pos.offset(direction); + BlockState neighbour = world.getBlockState(neighbourPos); + if (!MECHANICAL_CRAFTER.typeOf(neighbour)) + continue; + if (refDirection != neighbour.get(HORIZONTAL_FACING)) + continue; + if (Block.hasSolidSide(world.getBlockState(neighbourPos.offset(face)), world, neighbourPos.offset(face), + face.getOpposite())) + continue; + + Vec3d bbPos = new Vec3d(direction.getDirectionVec()).scale(.5).add(faceOffset); + sides.add(Pair.of(direction, bbPos)); + } + + return sides; + } + + public static Direction getActivatedDirection(World world, BlockPos pos, Direction face, Vec3d hit) { + Vec3d localHit = hit.subtract(pos.getX(), pos.getY(), pos.getZ()); + for (Pair pair : getConnectiveSides(world, pos, face)) { + Vec3d bbPos = pair.getRight(); + AxisAlignedBB bb = new AxisAlignedBB(bbPos, bbPos).grow(1 / 6f); + if (bb.contains(localHit)) + return pair.getKey(); + } + return null; + } + + public static void toggleConnection(World world, BlockPos pos, BlockPos pos2) { + MechanicalCrafterTileEntity crafter1 = getCrafter(world, pos); + MechanicalCrafterTileEntity crafter2 = getCrafter(world, pos2); + + if (crafter1 == null || crafter2 == null) + return; + + BlockPos controllerPos1 = crafter1.getPos().add(crafter1.input.data.get(0)); + BlockPos controllerPos2 = crafter2.getPos().add(crafter2.input.data.get(0)); + + if (controllerPos1.equals(controllerPos2)) { + MechanicalCrafterTileEntity controller = getCrafter(world, controllerPos1); + + Set positions = controller.input.data.stream().map(l -> controllerPos1.add(l)) + .collect(Collectors.toSet()); + List frontier = new LinkedList<>(); + List splitGroup = new ArrayList<>(); + + frontier.add(pos2); + positions.remove(pos2); + positions.remove(pos); + while (!frontier.isEmpty()) { + BlockPos current = frontier.remove(0); + for (Direction direction : Direction.values()) { + BlockPos next = current.offset(direction); + if (!positions.remove(next)) + continue; + splitGroup.add(next); + frontier.add(next); + } + } + + initAndAddAll(world, crafter1, positions); + initAndAddAll(world, crafter2, splitGroup); + + crafter1.markDirty(); + crafter1.connectivityChanged(); + crafter2.markDirty(); + crafter2.connectivityChanged(); + return; + } + + if (!crafter1.input.isController) + crafter1 = getCrafter(world, controllerPos1); + if (!crafter2.input.isController) + crafter2 = getCrafter(world, controllerPos2); + if (crafter1 == null || crafter2 == null) + return; + + connectControllers(world, crafter1, crafter2); + + world.setBlockState(crafter1.getPos(), crafter1.getBlockState(), 3); + + crafter1.markDirty(); + crafter1.connectivityChanged(); + crafter2.markDirty(); + crafter2.connectivityChanged(); + } + + public static void initAndAddAll(World world, MechanicalCrafterTileEntity crafter, Collection positions) { + crafter.input = new ConnectedInput(); + positions.forEach(splitPos -> { + modifyAndUpdate(world, splitPos, input -> { + input.attachTo(crafter.getPos(), splitPos); + crafter.input.data.add(splitPos.subtract(crafter.getPos())); + }); + }); + } + + public static void connectControllers(World world, MechanicalCrafterTileEntity crafter1, + MechanicalCrafterTileEntity crafter2) { + + crafter1.input.data.forEach(offset -> { + BlockPos connectedPos = crafter1.getPos().add(offset); + modifyAndUpdate(world, connectedPos, input -> { + }); + }); + + crafter2.input.data.forEach(offset -> { + if (offset.equals(BlockPos.ZERO)) + return; + BlockPos connectedPos = crafter2.getPos().add(offset); + modifyAndUpdate(world, connectedPos, input -> { + input.attachTo(crafter1.getPos(), connectedPos); + crafter1.input.data.add(BlockPos.ZERO.subtract(input.data.get(0))); + }); + }); + + crafter2.input.attachTo(crafter1.getPos(), crafter2.getPos()); + crafter1.input.data.add(BlockPos.ZERO.subtract(crafter2.input.data.get(0))); + } + + public static MechanicalCrafterTileEntity getCrafter(IEnviromentBlockReader reader, BlockPos pos) { + TileEntity te = reader.getTileEntity(pos); + if (!(te instanceof MechanicalCrafterTileEntity)) + return null; + return (MechanicalCrafterTileEntity) te; + } + + public static ConnectedInput getInput(IEnviromentBlockReader reader, BlockPos pos) { + MechanicalCrafterTileEntity crafter = getCrafter(reader, pos); + return crafter == null ? null : crafter.input; + } + + private static void modifyAndUpdate(World world, BlockPos pos, Consumer callback) { + TileEntity te = world.getTileEntity(pos); + if (!(te instanceof MechanicalCrafterTileEntity)) + return; + + MechanicalCrafterTileEntity crafter = (MechanicalCrafterTileEntity) te; + callback.accept(crafter.input); + crafter.markDirty(); + crafter.connectivityChanged(); + } + + public static class ConnectedInput { + boolean isController; + List data = new ArrayList<>(); + + public ConnectedInput() { + isController = true; + data.add(BlockPos.ZERO); + } + + public void attachTo(BlockPos controllerPos, BlockPos myPos) { + isController = false; + data.clear(); + data.add(controllerPos.subtract(myPos)); + } + + public IItemHandler getItemHandler(World world, BlockPos pos) { + if (!isController) { + BlockPos controllerPos = pos.add(data.get(0)); + ConnectedInput input = getInput(world, controllerPos); + if (input == this || input == null || !input.isController) + return new ItemStackHandler(); + return input.getItemHandler(world, controllerPos); + } + + List list = data.stream().map(l -> getCrafter(world, pos.add(l))) + .filter(Predicates.notNull()).map(crafter -> crafter.inventory).collect(Collectors.toList()); + return new CombinedInvWrapper(Arrays.copyOf(list.toArray(), list.size(), IItemHandlerModifiable[].class)); + } + + public void write(CompoundNBT nbt) { + nbt.putBoolean("Controller", isController); + ListNBT list = new ListNBT(); + data.forEach(pos -> list.add(NBTUtil.writeBlockPos(pos))); + nbt.put("Data", list); + } + + public void read(CompoundNBT nbt) { + isController = nbt.getBoolean("Controller"); + data.clear(); + nbt.getList("Data", NBT.TAG_COMPOUND).forEach(inbt -> data.add(NBTUtil.readBlockPos((CompoundNBT) inbt))); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/ConnectedInputRenderer.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/ConnectedInputRenderer.java new file mode 100644 index 000000000..77d63149b --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/ConnectedInputRenderer.java @@ -0,0 +1,84 @@ +package com.simibubi.create.modules.contraptions.components.crafter; + +import org.apache.commons.lang3.tuple.Pair; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.behaviour.ValueBox; +import com.simibubi.create.foundation.behaviour.ValueBoxRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.GlHelper; +import com.simibubi.create.foundation.utility.TessellatorHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.RayTraceResult.Type; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.DrawBlockHighlightEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber(value = Dist.CLIENT) +public class ConnectedInputRenderer { + + @SubscribeEvent + public static void renderBlockHighlight(DrawBlockHighlightEvent event) { + RayTraceResult target = event.getTarget(); + if (!(target instanceof BlockRayTraceResult)) + return; + + BlockRayTraceResult result = (BlockRayTraceResult) target; + ClientWorld world = Minecraft.getInstance().world; + BlockPos pos = result.getPos(); + BlockState blockState = world.getBlockState(pos); + PlayerEntity player = Minecraft.getInstance().player; + ItemStack heldItem = player.getHeldItem(Hand.MAIN_HAND); + Direction face = result.getFace(); + + if (player.isSneaking()) + return; + if (!AllItems.WRENCH.typeOf(heldItem)) + return; + if (!AllBlocks.MECHANICAL_CRAFTER.typeOf(blockState)) + return; + if (target.getType() != Type.BLOCK) + return; + if (face == blockState.get(MechanicalCrafterBlock.HORIZONTAL_FACING)) + return; + + TessellatorHelper.prepareForDrawing(); + GlStateManager.translated(pos.getX(), pos.getY(), pos.getZ()); + Direction activatedDirection = ConnectedInputHandler.getActivatedDirection(world, pos, face, + result.getHitVec()); + + for (Pair pair : ConnectedInputHandler.getConnectiveSides(world, pos, face)) { + + int zRot = face == Direction.UP ? 90 : face == Direction.DOWN ? 270 : 0; + float yRot = AngleHelper.horizontalAngle(face.getOpposite()); + Vec3d rotation = new Vec3d(0, yRot, zRot); + + GlHelper.renderTransformed(pair.getValue(), rotation, .5f, () -> { + + String label = "Connect / Disconnect";// Lang.translate("crafter.connect"); + AxisAlignedBB bb = new AxisAlignedBB(Vec3d.ZERO, Vec3d.ZERO).grow(1/3f); + ValueBox box = new ValueBox(label, bb); + box.withColors(0x018383, 0x42e6a4).offsetLabel(new Vec3d(10, 0, 0)); + ValueBoxRenderer.renderBox(box, activatedDirection == pair.getKey()); + + }); + } + + TessellatorHelper.cleanUpAfterDrawing(); + } +} diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/InputCTBehaviour.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/InputCTBehaviour.java new file mode 100644 index 000000000..d2b37ac89 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/InputCTBehaviour.java @@ -0,0 +1,73 @@ +package com.simibubi.create.modules.contraptions.components.crafter; + +import static com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING; + +import java.util.Arrays; + +import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; +import com.simibubi.create.foundation.block.connected.CTSpriteShifter; +import com.simibubi.create.foundation.block.connected.CTSpriteShifter.CTType; +import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; +import com.simibubi.create.modules.contraptions.components.crafter.ConnectedInputHandler.ConnectedInput; + +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IEnviromentBlockReader; + +public class InputCTBehaviour extends ConnectedTextureBehaviour { + + static final CTSpriteShiftEntry front = CTSpriteShifter.get(CTType.OMNIDIRECTIONAL, "crafter_top", "brass_casing"); + static final CTSpriteShiftEntry side = CTSpriteShifter.get(CTType.VERTICAL, "crafter_side"); + static final CTSpriteShiftEntry otherSide = CTSpriteShifter.get(CTType.HORIZONTAL, "crafter_side"); + + @Override + public boolean connectsTo(BlockState state, BlockState other, IEnviromentBlockReader reader, BlockPos pos, + BlockPos otherPos, Direction face) { + if (state.getBlock() != other.getBlock()) + return false; + if (state.get(HORIZONTAL_FACING) != other.get(HORIZONTAL_FACING)) + return false; + + ConnectedInput input1 = ConnectedInputHandler.getInput(reader, pos); + ConnectedInput input2 = ConnectedInputHandler.getInput(reader, otherPos); + + if (input1 == null || input2 == null) + return false; + if (pos.add(input1.data.get(0)).equals(otherPos.add(input2.data.get(0)))) + return true; + + return false; + } + + @Override + protected boolean shouldFlipUVs(BlockState state, Direction direction) { + if (!direction.getAxis().isVertical()) + return false; + Direction facing = state.get(HORIZONTAL_FACING); + if (facing.getAxis() == direction.getAxis()) + return false; + + boolean isNegative = facing.getAxisDirection() == AxisDirection.NEGATIVE; + if (direction == Direction.DOWN && facing.getAxis() == Axis.Z) + return !isNegative; + return isNegative; + } + + @Override + public CTSpriteShiftEntry get(BlockState state, Direction direction) { + Direction facing = state.get(HORIZONTAL_FACING); + boolean isFront = facing.getAxis() == direction.getAxis(); + boolean isVertical = direction.getAxis().isVertical(); + boolean facingX = facing.getAxis() == Axis.X; + return isFront ? front : isVertical && !facingX ? otherSide : side; + } + + @Override + public Iterable getAllCTShifts() { + return Arrays.asList(front, side); + } + +} diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterBlock.java index 75ae257c0..b20cf277c 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterBlock.java @@ -1,24 +1,52 @@ package com.simibubi.create.modules.contraptions.components.crafter; +import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.block.IWithTileEntity; -import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock; +import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; +import com.simibubi.create.foundation.block.connected.IHaveConnectedTextures; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock; +import com.simibubi.create.modules.contraptions.components.crafter.ConnectedInputHandler.ConnectedInput; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.state.EnumProperty; +import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.Hand; +import net.minecraft.util.IStringSerializable; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; +import net.minecraftforge.items.ItemHandlerHelper; -public class MechanicalCrafterBlock extends DirectionalKineticBlock - implements IWithTileEntity { +public class MechanicalCrafterBlock extends HorizontalKineticBlock + implements IWithTileEntity, IHaveConnectedTextures { + + public static final EnumProperty POINTING = EnumProperty.create("pointing", Pointing.class); public MechanicalCrafterBlock() { super(Properties.from(Blocks.GOLD_BLOCK)); + setDefaultState(getDefaultState().with(POINTING, Pointing.UP)); + } + + @Override + protected void fillStateContainer(Builder builder) { + super.fillStateContainer(builder.add(POINTING)); } @Override @@ -33,21 +61,106 @@ public class MechanicalCrafterBlock extends DirectionalKineticBlock @Override public boolean hasCogsTowards(World world, BlockPos pos, BlockState state, Direction face) { - return state.get(FACING).getAxis() != face.getAxis(); + return state.get(HORIZONTAL_FACING).getAxis() != face.getAxis(); } @Override public Axis getRotationAxis(BlockState state) { - return state.get(FACING).getAxis(); + return state.get(HORIZONTAL_FACING).getAxis(); } @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - BlockPos placedOnPos = context.getPos().offset(context.getFace().getOpposite()); + Direction face = context.getFace(); + BlockPos placedOnPos = context.getPos().offset(face.getOpposite()); BlockState blockState = context.getWorld().getBlockState(placedOnPos); - if ((blockState.getBlock() == this) && !context.isPlacerSneaking()) - return getDefaultState().with(FACING, blockState.get(FACING)); - return super.getStateForPlacement(context); + + if ((blockState.getBlock() != this) || context.isPlacerSneaking()) { + BlockState stateForPlacement = super.getStateForPlacement(context); + Direction direction = stateForPlacement.get(HORIZONTAL_FACING); + if (direction != face) + stateForPlacement = stateForPlacement.with(POINTING, pointingFromFacing(face, direction)); + return stateForPlacement; + } + + Direction otherFacing = blockState.get(HORIZONTAL_FACING); + Pointing pointing = pointingFromFacing(face, otherFacing); + return getDefaultState().with(HORIZONTAL_FACING, otherFacing).with(POINTING, pointing); + } + + @Override + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { + for (Direction direction : Direction.values()) { + if (direction.getAxis() == state.get(HORIZONTAL_FACING).getAxis()) + continue; + + BlockPos otherPos = pos.offset(direction); + ConnectedInput thisInput = ConnectedInputHandler.getInput(worldIn, pos); + ConnectedInput otherInput = ConnectedInputHandler.getInput(worldIn, otherPos); + + if (thisInput == null || otherInput == null) + continue; + if (!pos.add(thisInput.data.get(0)).equals(otherPos.add(otherInput.data.get(0)))) + continue; + + ConnectedInputHandler.toggleConnection(worldIn, pos, otherPos); + } + + worldIn.removeTileEntity(pos); + } + } + + public static Pointing pointingFromFacing(Direction pointingFace, Direction blockFacing) { + boolean positive = blockFacing.getAxisDirection() == AxisDirection.POSITIVE; + + Pointing pointing = pointingFace == Direction.DOWN ? Pointing.UP : Pointing.DOWN; + if (pointingFace == Direction.EAST) + pointing = positive ? Pointing.LEFT : Pointing.RIGHT; + if (pointingFace == Direction.WEST) + pointing = positive ? Pointing.RIGHT : Pointing.LEFT; + if (pointingFace == Direction.NORTH) + pointing = positive ? Pointing.LEFT : Pointing.RIGHT; + if (pointingFace == Direction.SOUTH) + pointing = positive ? Pointing.RIGHT : Pointing.LEFT; + return pointing; + } + + @Override + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + if (context.getFace() == state.get(HORIZONTAL_FACING)) { + context.getWorld().setBlockState(context.getPos(), state.cycle(POINTING)); + return ActionResultType.SUCCESS; + } + + return super.onWrenched(state, context); + } + + @Override + public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + BlockRayTraceResult hit) { + ItemStack heldItem = player.getHeldItem(handIn); + boolean isHand = heldItem.isEmpty() && handIn == Hand.MAIN_HAND; + + TileEntity te = worldIn.getTileEntity(pos); + if (!(te instanceof MechanicalCrafterTileEntity)) + return false; + MechanicalCrafterTileEntity crafter = (MechanicalCrafterTileEntity) te; + + if (hit.getFace() == state.get(HORIZONTAL_FACING)) { + ItemStack inSlot = crafter.inventory.getStackInSlot(0); + if (inSlot.isEmpty()) + return false; + if (!isHand && !ItemHandlerHelper.canItemStacksStack(heldItem, inSlot)) + return false; + if (worldIn.isRemote) + return true; + player.inventory.placeItemBackInInventory(worldIn, inSlot); + crafter.inventory.setStackInSlot(0, ItemStack.EMPTY); + return true; + } + + return false; } @Override @@ -65,4 +178,50 @@ public class MechanicalCrafterBlock extends DirectionalKineticBlock return .75f; } + public static Direction getTargetDirection(BlockState state) { + Direction facing = state.get(HORIZONTAL_FACING); + Pointing point = state.get(POINTING); + Vec3d targetVec = new Vec3d(0, 1, 0); + targetVec = VecHelper.rotate(targetVec, -point.getXRotation(), Axis.Z); + targetVec = VecHelper.rotate(targetVec, AngleHelper.horizontalAngle(facing), Axis.Y); + return Direction.getFacingFromVector(targetVec.x, targetVec.y, targetVec.z); + } + + public static boolean isValidTarget(World world, BlockPos targetPos, BlockState crafterState) { + BlockState targetState = world.getBlockState(targetPos); + if (!world.isBlockPresent(targetPos)) + return false; + if (!AllBlocks.MECHANICAL_CRAFTER.typeOf(targetState)) + return false; + if (crafterState.get(HORIZONTAL_FACING) != targetState.get(HORIZONTAL_FACING)) + return false; + if (Math.abs(crafterState.get(POINTING).xRotation - targetState.get(POINTING).xRotation) == 180) + return false; + return true; + } + + public enum Pointing implements IStringSerializable { + UP(0), LEFT(270), DOWN(180), RIGHT(90); + + private int xRotation; + + private Pointing(int xRotation) { + this.xRotation = xRotation; + } + + @Override + public String getName() { + return Lang.asId(name()); + } + + public int getXRotation() { + return xRotation; + } + } + + @Override + public ConnectedTextureBehaviour getBehaviour() { + return new InputCTBehaviour(); + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntity.java index 00c63b2bd..301b8255b 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntity.java @@ -2,16 +2,107 @@ package com.simibubi.create.modules.contraptions.components.crafter; import com.simibubi.create.AllTileEntities; import com.simibubi.create.modules.contraptions.base.KineticTileEntity; +import com.simibubi.create.modules.contraptions.components.crafter.ConnectedInputHandler.ConnectedInput; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; public class MechanicalCrafterTileEntity extends KineticTileEntity { + enum Phase { + IDLE, ACCEPTING, ASSEMBLING, EXPORTING + } + + protected ItemStackHandler inventory = new ItemStackHandler(1) { + + @Override + public int getSlotLimit(int slot) { + return 1; + } + + public ItemStack extractItem(int slot, int amount, boolean simulate) { + return ItemStack.EMPTY; + }; + + protected void onContentsChanged(int slot) { + markDirty(); + sendData(); + }; + + }; + + protected ConnectedInput input = new ConnectedInput(); + protected LazyOptional invSupplier = LazyOptional.of(() -> input.getItemHandler(world, pos)); + protected boolean reRender; + public MechanicalCrafterTileEntity() { super(AllTileEntities.MECHANICAL_CRAFTER.type); } - + @Override public boolean hasFastRenderer() { return false; } + @Override + public CompoundNBT write(CompoundNBT compound) { + compound.put("Inventory", inventory.serializeNBT()); + CompoundNBT inputNBT = new CompoundNBT(); + input.write(inputNBT); + compound.put("ConnectedInput", inputNBT); + return super.write(compound); + } + + @Override + public CompoundNBT writeToClient(CompoundNBT tag) { + if (reRender) { + tag.putBoolean("Redraw", true); + reRender = false; + } + return super.writeToClient(tag); + } + + @Override + public void readClientUpdate(CompoundNBT tag) { + if (tag.contains("Redraw")) + world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 16); + super.readClientUpdate(tag); + } + + @Override + public void read(CompoundNBT compound) { + inventory.deserializeNBT(compound.getCompound("Inventory")); + input.read(compound.getCompound("ConnectedInput")); + super.read(compound); + } + + @Override + public void remove() { + invSupplier.invalidate(); + super.remove(); + } + + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { + if (getBlockState().get(MechanicalCrafterBlock.HORIZONTAL_FACING) == side) + return LazyOptional.empty(); + return invSupplier.cast(); + } + return super.getCapability(cap, side); + } + + public void connectivityChanged() { + reRender = true; + sendData(); + invSupplier.invalidate(); + invSupplier = LazyOptional.of(() -> input.getItemHandler(world, pos)); + } + } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntityRenderer.java b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntityRenderer.java index 29d9c0b58..d24923098 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/crafter/MechanicalCrafterTileEntityRenderer.java @@ -1,35 +1,100 @@ package com.simibubi.create.modules.contraptions.components.crafter; +import com.mojang.blaze3d.platform.GlStateManager; import com.simibubi.create.AllBlocks; +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.SuperByteBuffer; import com.simibubi.create.foundation.utility.TessellatorHelper; import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer; import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.item.ItemStack; import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +@SuppressWarnings("deprecation") public class MechanicalCrafterTileEntityRenderer extends TileEntityRenderer { @Override - public void render(MechanicalCrafterTileEntity tileEntityIn, double x, double y, double z, float partialTicks, + public void render(MechanicalCrafterTileEntity te, double x, double y, double z, float partialTicks, int destroyStage) { - super.render(tileEntityIn, x, y, z, partialTicks, destroyStage); + super.render(te, x, y, z, partialTicks, destroyStage); + if (!AllBlocks.MECHANICAL_CRAFTER.typeOf(te.getBlockState())) + return; + + GlStateManager.pushMatrix(); + Direction facing = te.getBlockState().get(MechanicalCrafterBlock.HORIZONTAL_FACING); + Vec3d vec = new Vec3d(facing.getDirectionVec()).scale(.58).add(.5, .5, .5); + GlStateManager.translated(x + vec.x, y + vec.y, z + vec.z); + GlStateManager.scalef(1 / 2f, 1 / 2f, 1 / 2f); + float yRot = AngleHelper.horizontalAngle(facing); + GlStateManager.rotated(yRot, 0, 1, 0); + renderItems(te); + GlStateManager.popMatrix(); TessellatorHelper.prepareFastRender(); TessellatorHelper.begin(DefaultVertexFormats.BLOCK); - renderTileEntityFast(tileEntityIn, x, y, z, partialTicks, destroyStage, Tessellator.getInstance().getBuffer()); + renderTileEntityFast(te, x, y, z, partialTicks, destroyStage, Tessellator.getInstance().getBuffer()); TessellatorHelper.draw(); } + public void renderItems(MechanicalCrafterTileEntity te) { + RenderHelper.enableStandardItemLighting(); + + ItemStack stack = te.inventory.getStackInSlot(0); + if (!stack.isEmpty()) + Minecraft.getInstance().getItemRenderer().renderItem(stack, TransformType.FIXED); + + RenderHelper.disableStandardItemLighting(); + } + @Override public void renderTileEntityFast(MechanicalCrafterTileEntity te, double x, double y, double z, float partialTicks, int destroyStage, BufferBuilder buffer) { + BlockState blockState = te.getBlockState(); BlockState renderedState = AllBlocks.SHAFTLESS_COGWHEEL.get().getDefaultState().with(BlockStateProperties.AXIS, - te.getBlockState().get(BlockStateProperties.FACING).getAxis()); + blockState.get(MechanicalCrafterBlock.HORIZONTAL_FACING).getAxis()); KineticTileEntityRenderer.renderRotatingKineticBlock(te, getWorld(), renderedState, x, y, z, buffer); + + Direction targetDirection = MechanicalCrafterBlock.getTargetDirection(blockState); + BlockPos pos = te.getPos(); + +// SuperByteBuffer lidBuffer = renderAndTransform(AllBlocks.MECHANICAL_CRAFTER_LID, blockState, pos); +// lidBuffer.translate(x, y, z).renderInto(buffer); + + if (MechanicalCrafterBlock.isValidTarget(getWorld(), pos.offset(targetDirection), blockState)) { + SuperByteBuffer beltBuffer = renderAndTransform(AllBlocks.MECHANICAL_CRAFTER_BELT, blockState, pos); + SuperByteBuffer beltFrameBuffer = renderAndTransform(AllBlocks.MECHANICAL_CRAFTER_BELT_FRAME, blockState, + pos); + beltBuffer.translate(x, y, z).renderInto(buffer); + beltFrameBuffer.translate(x, y, z).renderInto(buffer); + + } else { + SuperByteBuffer arrowBuffer = renderAndTransform(AllBlocks.MECHANICAL_CRAFTER_ARROW, blockState, pos); + arrowBuffer.translate(x, y, z).renderInto(buffer); + } + + } + + private SuperByteBuffer renderAndTransform(AllBlocks renderBlock, BlockState crafterState, BlockPos pos) { + SuperByteBuffer buffer = CreateClient.bufferCache.renderGenericBlockModel(renderBlock.getDefault()); + float xRot = crafterState.get(MechanicalCrafterBlock.POINTING).getXRotation(); + float yRot = AngleHelper.horizontalAngle(crafterState.get(MechanicalCrafterBlock.HORIZONTAL_FACING)); + buffer.rotateCentered(Axis.X, (float) ((xRot) / 180 * Math.PI)); + buffer.rotateCentered(Axis.Y, (float) ((yRot + 90) / 180 * Math.PI)); + buffer.light(crafterState.getPackedLightmapCoords(getWorld(), pos)); + return buffer; } } diff --git a/src/main/resources/assets/create/blockstates/mechanical_crafter.json b/src/main/resources/assets/create/blockstates/mechanical_crafter.json index 531b0f2ae..1fd617a5c 100644 --- a/src/main/resources/assets/create/blockstates/mechanical_crafter.json +++ b/src/main/resources/assets/create/blockstates/mechanical_crafter.json @@ -4,13 +4,17 @@ "model": "create:block/crafter/casing" }, "variants": { + "pointing": { + "up": {}, + "left": {}, + "down": {}, + "right": {} + }, "facing": { - "north": { "x": 90 }, - "south": { "x": 90, "y": 180 }, - "west": { "x": 90, "y": 270 }, - "up": { }, - "down": { "x": 180 }, - "east": { "x": 90, "y": 90 } + "north": { "y": 90 }, + "south": { "y": 270 }, + "west": { "y": 0 }, + "east": { "y": 180 } } } } \ No newline at end of file diff --git a/src/main/resources/assets/create/blockstates/mechanical_crafter_arrow.json b/src/main/resources/assets/create/blockstates/mechanical_crafter_arrow.json index 10d2f58ac..8879a4a94 100644 --- a/src/main/resources/assets/create/blockstates/mechanical_crafter_arrow.json +++ b/src/main/resources/assets/create/blockstates/mechanical_crafter_arrow.json @@ -1,16 +1,5 @@ { - "forge_marker": 1, - "defaults": { - "model": "create:block/crafter/arrow" - }, - "variants": { - "facing": { - "north": { "y": 180 }, - "south": { }, - "west": { "y": 90 }, - "up": { "x": 90 }, - "down": { "x": 270 }, - "east": { "y": 270 } - } - } + "variants": { + "": { "model": "create:block/crafter/arrow" } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/blockstates/mechanical_crafter_belt.json b/src/main/resources/assets/create/blockstates/mechanical_crafter_belt.json index 35ba376e4..3302564ca 100644 --- a/src/main/resources/assets/create/blockstates/mechanical_crafter_belt.json +++ b/src/main/resources/assets/create/blockstates/mechanical_crafter_belt.json @@ -1,16 +1,5 @@ { - "forge_marker": 1, - "defaults": { - "model": "create:block/crafter/belt_animated" - }, - "variants": { - "facing": { - "north": { "y": 180 }, - "south": { }, - "west": { "y": 90 }, - "up": { "x": 90 }, - "down": { "x": 270 }, - "east": { "y": 270 } - } - } + "variants": { + "": { "model": "create:block/crafter/belt_animated" } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/blockstates/mechanical_crafter_belt_frame.json b/src/main/resources/assets/create/blockstates/mechanical_crafter_belt_frame.json index 8f4366a9b..a5dfa332e 100644 --- a/src/main/resources/assets/create/blockstates/mechanical_crafter_belt_frame.json +++ b/src/main/resources/assets/create/blockstates/mechanical_crafter_belt_frame.json @@ -1,16 +1,5 @@ { - "forge_marker": 1, - "defaults": { - "model": "create:block/crafter/belt" - }, - "variants": { - "facing": { - "north": { "y": 180 }, - "south": { }, - "west": { "y": 90 }, - "up": { "x": 90 }, - "down": { "x": 270 }, - "east": { "y": 270 } - } - } + "variants": { + "": { "model": "create:block/crafter/belt" } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/blockstates/mechanical_crafter_lid.json b/src/main/resources/assets/create/blockstates/mechanical_crafter_lid.json index 2eb2612b9..adf126f17 100644 --- a/src/main/resources/assets/create/blockstates/mechanical_crafter_lid.json +++ b/src/main/resources/assets/create/blockstates/mechanical_crafter_lid.json @@ -1,16 +1,5 @@ { - "forge_marker": 1, - "defaults": { - "model": "create:block/crafter/lid" - }, - "variants": { - "facing": { - "north": { "y": 180 }, - "south": { }, - "west": { "y": 90 }, - "up": { "x": 90 }, - "down": { "x": 270 }, - "east": { "y": 270 } - } - } + "variants": { + "": { "model": "create:block/crafter/lid" } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/crafter/arrow.json b/src/main/resources/assets/create/models/block/crafter/arrow.json index 586552b85..ec9b6e618 100644 --- a/src/main/resources/assets/create/models/block/crafter/arrow.json +++ b/src/main/resources/assets/create/models/block/crafter/arrow.json @@ -7,36 +7,36 @@ "elements": [ { "name": "arrow", - "from": [5, 16, 12], - "to": [11, 17, 14], + "from": [-1, 12, 5], + "to": [0, 14, 11], "faces": { - "north": {"uv": [12, 0, 13, 6], "rotation": 90, "texture": "#3"}, - "east": {"uv": [12, 0, 14, 1], "rotation": 180, "texture": "#3"}, - "south": {"uv": [13, 0, 14, 6], "rotation": 90, "texture": "#3"}, - "west": {"uv": [12, 5, 14, 6], "texture": "#3"}, - "up": {"uv": [12, 0, 14, 6], "rotation": 90, "texture": "#3"} + "north": {"uv": [12, 0, 14, 1], "rotation": 270, "texture": "#3"}, + "south": {"uv": [12, 5, 14, 6], "rotation": 270, "texture": "#3"}, + "west": {"uv": [12, 0, 14, 6], "rotation": 270, "texture": "#3"}, + "up": {"uv": [13, 0, 14, 6], "texture": "#3"}, + "down": {"uv": [12, 0, 13, 6], "texture": "#3"} } }, { "name": "arrow", - "from": [6, 16, 14], - "to": [10, 17, 15], + "from": [-1, 14, 6], + "to": [0, 15, 10], "faces": { - "east": {"uv": [14, 1, 15, 2], "rotation": 180, "texture": "#3"}, - "south": {"uv": [14, 1, 15, 5], "rotation": 90, "texture": "#3"}, - "west": {"uv": [14, 4, 15, 5], "texture": "#3"}, - "up": {"uv": [14, 1, 15, 5], "rotation": 90, "texture": "#3"} + "north": {"uv": [14, 1, 15, 2], "rotation": 270, "texture": "#3"}, + "south": {"uv": [14, 4, 15, 5], "rotation": 270, "texture": "#3"}, + "west": {"uv": [14, 1, 15, 5], "rotation": 270, "texture": "#3"}, + "up": {"uv": [14, 1, 15, 5], "texture": "#3"} } }, { "name": "arrow", - "from": [7, 16, 15], - "to": [9, 17, 16], + "from": [-1, 15, 7], + "to": [0, 16, 9], "faces": { - "east": {"uv": [15, 2, 16, 3], "rotation": 180, "texture": "#3"}, - "south": {"uv": [15, 2, 16, 4], "rotation": 90, "texture": "#3"}, - "west": {"uv": [15, 3, 16, 4], "texture": "#3"}, - "up": {"uv": [15, 2, 16, 4], "rotation": 90, "texture": "#3"} + "north": {"uv": [15, 2, 16, 3], "rotation": 270, "texture": "#3"}, + "south": {"uv": [15, 3, 16, 4], "rotation": 270, "texture": "#3"}, + "west": {"uv": [15, 2, 16, 4], "rotation": 270, "texture": "#3"}, + "up": {"uv": [15, 2, 16, 4], "texture": "#3"} } } ] diff --git a/src/main/resources/assets/create/models/block/crafter/belt.json b/src/main/resources/assets/create/models/block/crafter/belt.json index a671b764b..829a7cd19 100644 --- a/src/main/resources/assets/create/models/block/crafter/belt.json +++ b/src/main/resources/assets/create/models/block/crafter/belt.json @@ -7,22 +7,20 @@ "elements": [ { "name": "belt", - "from": [10, 15.5, 12], - "to": [11, 16.5, 20], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 17, 8]}, + "from": [-0.5, 12, 5], + "to": [0.5, 20, 6], "faces": { - "east": {"uv": [2, 4, 3, 12], "rotation": 90, "texture": "#5"}, - "up": {"uv": [2, 4, 3, 12], "rotation": 180, "texture": "#5"} + "north": {"uv": [2, 4, 3, 12], "rotation": 180, "texture": "#5"}, + "west": {"uv": [2, 4, 3, 12], "texture": "#5"} } }, { "name": "belt", - "from": [5, 15.5, 12], - "to": [6, 16.5, 20], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 17, 8]}, + "from": [-0.5, 12, 10], + "to": [0.5, 20, 11], "faces": { - "west": {"uv": [2, 4, 3, 12], "rotation": 90, "texture": "#5"}, - "up": {"uv": [13, 4, 14, 12], "rotation": 180, "texture": "#5"} + "south": {"uv": [2, 4, 3, 12], "texture": "#5"}, + "west": {"uv": [13, 4, 14, 12], "texture": "#5"} } } ] diff --git a/src/main/resources/assets/create/models/block/crafter/belt_animated.json b/src/main/resources/assets/create/models/block/crafter/belt_animated.json index 47c997ffe..15d25f198 100644 --- a/src/main/resources/assets/create/models/block/crafter/belt_animated.json +++ b/src/main/resources/assets/create/models/block/crafter/belt_animated.json @@ -7,11 +7,10 @@ "elements": [ { "name": "belt_animated", - "from": [6, 15.5, 12], - "to": [10, 16.5, 20], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 17, 8]}, + "from": [-0.5, 12, 6], + "to": [0.5, 20, 10], "faces": { - "up": {"uv": [0, 6, 4, 14], "rotation": 180, "texture": "#3"} + "west": {"uv": [0, 6, 4, 14], "texture": "#3"} } } ] diff --git a/src/main/resources/assets/create/models/block/crafter/casing.json b/src/main/resources/assets/create/models/block/crafter/casing.json index 6af64966a..151a2b565 100644 --- a/src/main/resources/assets/create/models/block/crafter/casing.json +++ b/src/main/resources/assets/create/models/block/crafter/casing.json @@ -12,124 +12,120 @@ "elements": [ { "name": "Top", - "from": [0, 10, 0], - "to": [16, 16, 16], + "from": [0, 0, 0], + "to": [6, 16, 16], "faces": { - "north": {"uv": [0, 0, 16, 6], "texture": "#4"}, - "east": {"uv": [0, 0, 16, 6], "texture": "#4"}, - "south": {"uv": [0, 0, 16, 6], "texture": "#4"}, - "west": {"uv": [0, 0, 16, 6], "texture": "#4"}, - "up": {"uv": [0, 0, 2, 2], "rotation": 270, "texture": "#6"}, - "down": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#7"} + "north": {"uv": [0, 0, 16, 6], "rotation": 90, "texture": "#4"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#7"}, + "south": {"uv": [16, 0, 0, 6], "rotation": 270, "texture": "#4"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#6"}, + "up": {"uv": [0, 0, 16, 6], "rotation": 270, "texture": "#4"}, + "down": {"uv": [0, 0, 16, 6], "rotation": 270, "texture": "#4"} } }, { "name": "Bottom", - "from": [0, 0, 0], - "to": [16, 6, 16], + "from": [10, 0, 0], + "to": [16, 16, 16], "faces": { - "north": {"uv": [0, 10, 16, 16], "texture": "#4"}, - "east": {"uv": [0, 10, 16, 16], "texture": "#4"}, - "south": {"uv": [0, 10, 16, 16], "texture": "#4"}, - "west": {"uv": [0, 10, 16, 16], "texture": "#4"}, - "up": {"uv": [0, 0, 16, 16], "texture": "#5"}, - "down": {"uv": [0, 0, 2, 2], "texture": "#6"} + "north": {"uv": [0, 10, 16, 16], "rotation": 90, "texture": "#4"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#6"}, + "south": {"uv": [16, 10, 0, 16], "rotation": 270, "texture": "#4"}, + "west": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 10, 16, 16], "rotation": 270, "texture": "#4"}, + "down": {"uv": [0, 10, 16, 16], "rotation": 270, "texture": "#4"} } }, { "name": "Side1", - "from": [16, 6, 0], - "to": [16, 10, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [24, 8, 8]}, + "from": [6, 15.9, 0], + "to": [10, 16, 16], "faces": { - "east": {"uv": [0, 6, 16, 10], "texture": "#4"}, - "west": {"uv": [0, 6, 16, 10], "texture": "#4"} + "up": {"uv": [0, 6, 16, 10], "rotation": 270, "texture": "#4"}, + "down": {"uv": [0, 6, 16, 10], "rotation": 270, "texture": "#4"} } }, { "name": "Side2", - "from": [0, 6, 0], - "to": [0, 10, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [-8, 8, 8]}, + "from": [6, 0, 0], + "to": [10, 0.1, 16], "faces": { - "east": {"uv": [0, 6, 16, 10], "texture": "#4"}, - "west": {"uv": [0, 6, 16, 10], "texture": "#4"} + "up": {"uv": [0, 6, 16, 10], "rotation": 270, "texture": "#4"}, + "down": {"uv": [0, 6, 16, 10], "rotation": 270, "texture": "#4"} } }, { "name": "Side3", - "from": [0, 6, 0], - "to": [16, 10, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -8]}, + "from": [6, 0, 0], + "to": [10, 16, 0.1], "faces": { - "north": {"uv": [0, 6, 16, 10], "texture": "#4"}, - "south": {"uv": [0, 6, 16, 10], "texture": "#4"} + "north": {"uv": [0, 6, 16, 10], "rotation": 90, "texture": "#4"}, + "south": {"uv": [0, 6, 16, 10], "rotation": 270, "texture": "#4"} } }, { "name": "Side4", - "from": [0, 6, 16], - "to": [16, 10, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 24]}, + "from": [6, 0, 15.9], + "to": [10, 16, 16], "faces": { - "north": {"uv": [0, 6, 16, 10], "texture": "#4"}, - "south": {"uv": [0, 6, 16, 10], "texture": "#4"} + "north": {"uv": [0, 6, 16, 10], "rotation": 90, "texture": "#4"}, + "south": {"uv": [16, 6, 0, 10], "rotation": 270, "texture": "#4"} } }, { "name": "valve_case", - "from": [4, 16, 4], - "to": [5, 17, 12], + "from": [-1, 4, 4], + "to": [0, 5, 12], "faces": { - "north": {"uv": [8, 2, 9, 3], "texture": "#5"}, - "east": {"uv": [4, 2, 12, 3], "texture": "#5"}, - "south": {"uv": [7, 2, 8, 3], "texture": "#5"}, - "west": {"uv": [4, 2, 12, 3], "texture": "#5"}, - "up": {"uv": [2, 4, 3, 12], "texture": "#5"} + "north": {"uv": [8, 2, 9, 3], "rotation": 90, "texture": "#5"}, + "south": {"uv": [7, 2, 8, 3], "rotation": 270, "texture": "#5"}, + "west": {"uv": [2, 4, 3, 12], "rotation": 270, "texture": "#5"}, + "up": {"uv": [4, 2, 12, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [4, 2, 12, 3], "rotation": 270, "texture": "#5"} } }, { "name": "valve_case", - "from": [11, 16, 4], - "to": [12, 17, 12], + "from": [-1, 11, 4], + "to": [0, 12, 12], "faces": { - "north": {"uv": [8, 2, 9, 3], "texture": "#5"}, - "east": {"uv": [4, 2, 12, 3], "texture": "#5"}, - "south": {"uv": [7, 2, 8, 3], "texture": "#5"}, - "west": {"uv": [4, 2, 12, 3], "texture": "#5"}, - "up": {"uv": [2, 4, 3, 12], "texture": "#5"} + "north": {"uv": [8, 2, 9, 3], "rotation": 90, "texture": "#5"}, + "south": {"uv": [7, 2, 8, 3], "rotation": 270, "texture": "#5"}, + "west": {"uv": [2, 4, 3, 12], "rotation": 270, "texture": "#5"}, + "up": {"uv": [4, 2, 12, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [4, 2, 12, 3], "rotation": 270, "texture": "#5"} } }, { "name": "valve_case", - "from": [5, 16, 4], - "to": [11, 17, 5], + "from": [-1, 5, 4], + "to": [0, 11, 5], "faces": { - "north": {"uv": [6, 2, 12, 3], "texture": "#5"}, - "east": {"uv": [2, 4, 3, 5], "texture": "#5"}, - "south": {"uv": [5, 2, 11, 3], "texture": "#5"}, - "west": {"uv": [2, 4, 3, 5], "texture": "#5"}, - "up": {"uv": [5, 2, 11, 3], "texture": "#5"} + "north": {"uv": [6, 2, 12, 3], "rotation": 90, "texture": "#5"}, + "south": {"uv": [5, 2, 11, 3], "rotation": 270, "texture": "#5"}, + "west": {"uv": [5, 2, 11, 3], "rotation": 270, "texture": "#5"}, + "up": {"uv": [2, 4, 3, 5], "rotation": 270, "texture": "#5"}, + "down": {"uv": [2, 4, 3, 5], "rotation": 270, "texture": "#5"} } }, { "name": "valve_case", - "from": [5, 16, 11], - "to": [11, 17, 12], + "from": [-1, 5, 11], + "to": [0, 11, 12], "faces": { - "north": {"uv": [6, 2, 12, 3], "texture": "#5"}, - "east": {"uv": [2, 4, 3, 5], "texture": "#5"}, - "south": {"uv": [5, 2, 11, 3], "texture": "#5"}, - "west": {"uv": [2, 4, 3, 5], "texture": "#5"}, - "up": {"uv": [5, 2, 11, 3], "texture": "#5"} + "north": {"uv": [6, 2, 12, 3], "rotation": 90, "texture": "#5"}, + "south": {"uv": [5, 2, 11, 3], "rotation": 270, "texture": "#5"}, + "west": {"uv": [5, 2, 11, 3], "rotation": 270, "texture": "#5"}, + "up": {"uv": [2, 4, 3, 5], "rotation": 270, "texture": "#5"}, + "down": {"uv": [2, 4, 3, 5], "rotation": 270, "texture": "#5"} } }, { "name": "opening", - "from": [5, 15.5, 5], - "to": [11, 16.5, 11], + "from": [-0.5, 5, 5], + "to": [0.5, 11, 11], "faces": { - "up": {"uv": [6, 0, 12, 6], "texture": "#3"} + "west": {"uv": [6, 0, 12, 6], "rotation": 270, "texture": "#3"} } } ] diff --git a/src/main/resources/assets/create/models/block/crafter/item.json b/src/main/resources/assets/create/models/block/crafter/item.json index face943a7..d786976bd 100644 --- a/src/main/resources/assets/create/models/block/crafter/item.json +++ b/src/main/resources/assets/create/models/block/crafter/item.json @@ -9,8 +9,7 @@ "5": "create:block/brass_casing", "6": "create:block/crafter_top", "7": "create:block/crafter_topunderside", - "particle": "block/stripped_spruce_log", - "2_3": "create:block/crafter_thingies" + "particle": "block/stripped_spruce_log" }, "elements": [ { @@ -22,7 +21,7 @@ "east": {"uv": [0, 0, 16, 6], "texture": "#4"}, "south": {"uv": [0, 0, 16, 6], "texture": "#4"}, "west": {"uv": [0, 0, 16, 6], "texture": "#4"}, - "up": {"uv": [0, 0, 2, 2], "rotation": 270, "texture": "#6"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#6"}, "down": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#7"} } }, @@ -36,7 +35,7 @@ "south": {"uv": [0, 10, 16, 16], "texture": "#4"}, "west": {"uv": [0, 10, 16, 16], "texture": "#4"}, "up": {"uv": [0, 0, 16, 16], "texture": "#5"}, - "down": {"uv": [0, 0, 2, 2], "texture": "#6"} + "down": {"uv": [0, 0, 16, 16], "texture": "#6"} } }, { @@ -224,7 +223,7 @@ "from": [5, 16, 5], "to": [11, 17, 11], "faces": { - "up": {"uv": [0, 0, 6, 6], "texture": "#2_3"} + "up": {"uv": [0, 0, 6, 6], "texture": "#3"} } } ], diff --git a/src/main/resources/assets/create/models/block/crafter/lid.json b/src/main/resources/assets/create/models/block/crafter/lid.json index 2f385ecfa..eccfcb78e 100644 --- a/src/main/resources/assets/create/models/block/crafter/lid.json +++ b/src/main/resources/assets/create/models/block/crafter/lid.json @@ -7,10 +7,10 @@ "elements": [ { "name": "valve_lid", - "from": [5, 16, 5], - "to": [11, 17, 11], + "from": [-1, 5, 5], + "to": [0, 11, 11], "faces": { - "up": {"uv": [0, 0, 6, 6], "texture": "#3"} + "west": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#3"} } } ] diff --git a/src/main/resources/assets/create/models/block/mixer_base.json b/src/main/resources/assets/create/models/block/mixer_base.json index fe9f46be1..ab4f92b93 100644 --- a/src/main/resources/assets/create/models/block/mixer_base.json +++ b/src/main/resources/assets/create/models/block/mixer_base.json @@ -3,7 +3,6 @@ "parent": "block/cube", "ambientocclusion": false, "textures": { - "1": "block/stripped_spruce_log", "2": "block/spruce_log_top", "4": "create:block/mixer_base_side", "11": "create:block/mechanical_press_top", @@ -39,7 +38,7 @@ { "name": "Side1", "from": [0, 6, 0], - "to": [0, 10, 16], + "to": [0.1, 10, 16], "faces": { "east": {"uv": [0, 6, 16, 10], "texture": "#4"}, "west": {"uv": [0, 6, 16, 10], "texture": "#4"} @@ -47,7 +46,7 @@ }, { "name": "Side2", - "from": [16, 6, 0], + "from": [15.9, 6, 0], "to": [16, 10, 16], "faces": { "east": {"uv": [0, 6, 16, 10], "texture": "#4"}, @@ -56,7 +55,7 @@ }, { "name": "Side3", - "from": [0, 6, 16], + "from": [0, 6, 15.9], "to": [16, 10, 16], "faces": { "north": {"uv": [0, 6, 16, 10], "texture": "#4"}, @@ -66,7 +65,7 @@ { "name": "Side4", "from": [0, 6, 0], - "to": [16, 10, 0], + "to": [16, 10, 0.1], "faces": { "north": {"uv": [0, 6, 16, 10], "texture": "#4"}, "south": {"uv": [0, 6, 16, 10], "texture": "#4"} diff --git a/src/main/resources/assets/create/models/item/filter.json b/src/main/resources/assets/create/models/item/filter.json index 3e13eb13e..1f0cf52d6 100644 --- a/src/main/resources/assets/create/models/item/filter.json +++ b/src/main/resources/assets/create/models/item/filter.json @@ -49,9 +49,7 @@ "to": [13, 1.5, 4], "faces": { "north": {"uv": [2, 7, 12, 8], "texture": "#2"}, - "east": {"uv": [0, 0, 1, 1], "texture": "#missing"}, "south": {"uv": [3, 7, 13, 8], "texture": "#2"}, - "west": {"uv": [0, 0, 1, 1], "texture": "#missing"}, "up": {"uv": [3, 7, 13, 8], "texture": "#2"}, "down": {"uv": [3, 7, 13, 8], "texture": "#2"} } @@ -62,9 +60,7 @@ "to": [13, 1.5, 13], "faces": { "north": {"uv": [13, 7, 3, 8], "texture": "#2"}, - "east": {"uv": [1, 0, 0, 1], "texture": "#missing"}, "south": {"uv": [14, 7, 4, 8], "texture": "#2"}, - "west": {"uv": [1, 0, 0, 1], "texture": "#missing"}, "up": {"uv": [3, 8, 13, 7], "texture": "#2"}, "down": {"uv": [3, 8, 13, 7], "texture": "#2"} } diff --git a/src/main/resources/assets/create/textures/block/connected/brass_casing.png b/src/main/resources/assets/create/textures/block/connected/brass_casing.png new file mode 100644 index 0000000000000000000000000000000000000000..025c381d443728e0305a4fb81ad69ba4742c535d GIT binary patch literal 2988 zcmeHJe>jtCAAf8~j4hQ`FK6gbQW+|dF*0Sy(rY8z+&?{90_!xu?J1|KIC+&wV}jbKm#p`{Vw6KllAy*ONn~ z956EYmjMJpMr0q79~e`$eH9YCXC#+YV9+`3cVHjH6PUdRixrWcUwJ}MO#y0&t_wj( zh}4-w71wNAZXMzZ>K~uV)PoN}uTyd>Vq#t=g{B$++_^1nF%hlRN_wzmXk_ zNxtp0dL4C3O>Dt4X4A|uu^J9762xD z*u70o$UKi0jlv=X9=XrwpH(}hsMNko7fUn;`dBfqRJV;kPKNrk=1yh?W?SEo)_}g`-Pn*e*kf$)^}iL$tO%6BA?hA@K2Bv@BmF7 zN2Cpe7pi;FulxjTbnC2GmM_paC%j^p)Sq%)bTNDd573?H1a)Ef)hWdfF_FZqA)eTw zy0>Dg?kxYxk6H$BUF*@Czj($lN@#=kTtG~M8p&`OEjBaS`&QOaer0M&qWt(fKO{Hp3v|(XdYNNr)huOl*FAC>Hw2#N@OjJYng(-YfK-TKy~(Z0P3VG=26$>i~Of~5|_mmUA0lr zI&GCs#MH}b4dV%t)o6`cURwwsIDR&S$53uqMYEwXZMCnLQVr=RJ_8k>0f>6te~bQg z^XA7+%K?yRR77qW)k~$>p@ctm-#zpQz(?5SF;31OS9;ukIKx|5_%b*YJ#KYNrSl1< zKR@AJY9WYhx3=&RVX0ekeqMs!-Iuw}>WawWdx(YEdUxG=uw8waY29$l zf*S9|t;dIlh<@3?)aw1e#tjZrm_Hepg?VdmC{Bfc1*z_mik#DgbzjCC!^v`+-+uW z8g!`=Jfrw{T$HEQjm3wi4B6}LD!R%{lX>nJ@r-*{UM^pn!`Ne`5i1ZBT00!cmxw6f zc1E+CF{KiHGk;G|OWC7P=H(I{0K1>!OEOS$?To>Pil_%gfhmLRG(!aYNYJHs_&Xg! zM<#qeLzPj;we`b=!e$p;RIesy}ba-V@^^^3S)c$@g4t7G5h>!GDEGi@F-Gh@nkiywQ17eg6Fp`N8hWKYL{IRn7x}=lb#2h)(1^zq4M3&7nqx hlWwqpRV-I1%!AH&e<*Z2wnF>ML-wYSc>BWA{|4q|?8X29 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/connected/crafter_side.png b/src/main/resources/assets/create/textures/block/connected/crafter_side.png new file mode 100644 index 0000000000000000000000000000000000000000..c47eefaf18fab3683319942dc88d0bbe46d566bd GIT binary patch literal 841 zcmV-P1GfB$P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ940^UhPK~z{r#a2CU z(?A%0e0E|xcG@PPDTNA&4j_;aN>!-?{DO`ku_GiT`U7BLK;kzruplv3g^>YuL4t(^ zMm9uQPzC)=oH&U;xcBS}iPa%@RO%z0?(Ti=Iln&Nogd@=y~`;SaNOx)#;=TORTT9i zfwk5ef?kM{#gHa3m;u;!2?k5h3)_gIAuJyB-E%NY23)%=Cfj_sja#eN1UF1(we*Y{ z2^X1&cqakZ@qrd9js@E?U?Ap`CK$$v5Ya<|ZXe-bAo`Ni)r$leE5kHR*kuO4;-Jhk zjH3i$KSCI$d=eW@i7z*!x8rZgA9URAWJ{QHx_U<6;-J09lVChM3vnDF2mp#wYMue zDkzt%yrl=JHy%G~rL~#!c>VId2$+tEikt0LLYH4qvQKRS^&dQ3$M(k$`1vhcz4k#M zYE`{?W!ZgpvDv_noqbe%7fH%bX?oHjl1g$>Ft#k7xqPfFjuQjY_eW(Bx*UP>e-_H^yMo^OVHK-_f1%gYu$u- zdn(Wb;}20qQLpU>j)Lw4r|Ji!UfT~8IbFTBA1HFVdTl>Ym<-l1K zZ9i~Y(DnnT1#LfYTF~|bgmF&Q4-lxY?FYKyV1iTi15&T;2TtM$s(SG|zIpXJ-fVr& zhtTixpNRhFbX@v_zNqORFEP&T?6&i$nqJEfG@DIP6N(&R8b9EAv!Z>*egOCjmFGqY T$H`pw00000NkvXXu0mjf_Z)!1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/copper_ore.png b/src/main/resources/assets/create/textures/block/copper_ore.png index 15ae2cda0ea739158730582cece534684d73d58c..bd09258d7e42f72375f898c739a030234393fd5c 100644 GIT binary patch delta 715 zcmV;+0yO=p28afbNq@os01mrR!xE|fsWt4r*kn&HxWXF?<0~FMbYzpp64+%ArKV(@<7`V23#W zeRxX=LVsUhnkv6U9H7dqJs1O#EIC(XX1HKOv@nm+k zN38x9Q>hfl>fsLL<4DrR_7OY_p|Vp?y_A5Xu~7Y4FJ;ZcH=>iM2wFqiUL$`(sL0m z9*;j88mjvJNl7Nu7CX%_Bt;sG1~tR76h+1P*x=yc&E|tvt2LcWKke^FCI5YFVeoL zU0#yVnrv)rMAym1;Fm|;)akY;zs|Dkwbmmpr(-6(k+Id>X=~mgMW%kPsLHgJ)=JXl za#1v$%VY(|c3GBhUp#jF?4^a5LmxO*G#H9-Jm}@OqkplvU!^vONYX@SXD7zR2HWcl zw! zs<*C%R-r_tC|J?-^t4ha*zI=0>-8$p)jh$lXj5!fedC^xN{2!r#8@sov_80Uree3d zy`zJ|A%Ezr?Bi_NR()ypi5jHQ80Xd9)rGYJg2$ZxySI!^r`cRZdORNNSdydw7vniz zr4#~zz>~hdA~!YQ(^ZyZR29WwR8#FvN>wO8@#CJJBJuF~N1M%tI5a*AJ&F1G;SoQ6 z3)3{6R4S~5&*xKbKtiX{ zpi+|axRtnPW=lCu)A%k+auE=PjL~Q$8yXrIhAAs8A=HGNS3n~TNqI?*$70DuGMCMv e1_3Zp6#oJ}0Fq|3FpVt$0000-VDQ!ZwSHHTS=)PP^&laIC$qeNGjNVyM`dUKXK6AVF4Aa*=#N~B2bll zF^$E=X*b<%wSW1gWmzbfjjWgfkE>e-D%&+Uj)S5|Ilj7kS~{Mj#gyQ?HcZn*68YRy zbEW|%6C1wob4)opQcqYX)RF6U)P*{Kx`O9TbD<7jVKG4$QbAj0hhsXKj?@!$AYU6vn@MD>V+Lmd1*I zS{J8I3OYFyd;t*$M<<`a2k-?P^a%tf2k{+r5(+w55Fw@7Nv!oxq)nRKYtCs?Old`N z@&`9Lx!mu&=Q|OHd+Qn@fzoLE0hM@nTpS!-a{U#^>YK3#Fa6U5Z^6ct0)}GkiT>rSHg4Q(fCuTe*l@zGApDfu5WHVHelZ6#T6n@0`{acFEosj$VjrL+>02$jk8gbKfb3hNVEC-PX^l|mWIROAX+vHbX76N43;p4_@e>SeR}octt7Ugua0J4O@^W z3Csj(?!Z(C{Vp5O^w%^8G+JxgMROAMDT$r!)_NS>-#tZbza<6WMw^OKqOI7{37TG~ zC8x8p(=Q3*)kfW)8E9?qU%@n^we_~Kwhg;9{*z>=yegBtu%|vs3ydu;AuVvlgfdTH z=k$2>aDUIPA(ne9wmD*&j9`9sLURuUk8kn3sRP@`Tn~xAnMUImR6QN(5IIo|00000 LNkvXXu0mjfnp4|M literal 3229 zcmeHJiC5Cu7ylv{kRhp+l@>Lcnlp)|xhJ@!VlJg-V`GxpjE-eODr%x4ZfGS|F6EN` zY{qIzw5D;%1=JFk8PP`56h$+0M#lhA5rLSm^ZO@$=ltfKci(+?IrqN%dH0?3a!&fV zqc-o}3;+O%;Nj{Aa@qzVpy0YZbxQ^^NQ|GmGr;QC{}U8o;ZEL80Pu{dp$Jt604Q+M zE8sY&H{YviXQ<_PP#b5m&GpOe1hX9ktgi3joxVqQ`g`hz2JWYPf0#di5enpu9#f;#)*=O!Cf=X_Ls#Gd4#lPcU z1pYS>fY19Rf$s!}_4Dxud-eZ$0RB?=0q~ZPB#)pN0MP8*AP6`5(M142>?XK61tf(0 za#o|X)MiTtX`IqINoFpSTTe8rRKC>~&$m2R-wD4PO};zY?p$pd|sC^*`M15i({$??8J`?A0m22P?)!mP!Fkf`gi zO;V(=S1}l+1@vVPyF92#L0Kv*bc6H1%x!)TEAp>YON~v6n!-Ir6@110HsQ(aIBcth z(NMw4rOH3qlDv@Fgw~c7Faos{aEa{AK`8|7C6&HGYF{_a79SB9;gguZ?oL z?CH+LrfT!&o^6BZe{?25@iO%CeCNWfp7Gs;GavODrhUWWm-iZ!EbOB^Zd|d@kAGr4 zk*EoIDV4@gzI$U_ohIKb(ORxBD7iHMW9|LxTqIu9W2;E;`SAA>Rv#1MH zTnQWp!26+3Ah@L|opY`Rw1Qt# z#=SnhOSPwAMrdvKMXZ<7l(R>AlUS9gx0QJlc;`PpOzy5J=2rEKE>h8Y=2JDBAo*IS zWD%7qcHN9aGJNqY^dPTmX55m9P#e8r($f>T0Nob<%8y;6dwwNu*(O8@9H}Bn0-(oY zT|+QC|B~QzpYm~J{o*!X?j;*HH^V+`7RUG{Z0oS=1ufa1FxR_qllfqds0fb%vXU(29H|pREVCrJu)0@h; z%vm^nB-vU)AqDtZ`}Y)oThMrqGT-|^)Tw<|jA7)|04@l*nZ z3`W&>p#x!;k{i!9p@I**oIJ)y=Cg<6_(RYOqEqYJ;?>L<7Nb5cEw;8a{HLC!M}F2TFNt+9Dsx`DKv2B7~9x`$i;bERo~Bxv=JP-KDe+ zIlz5L`I5+kM+)Gg2e)hIpcCtIfTsmFl_|^^&iyUuZuuc5t3Hco^92-T)tj*pgzwsQ zc{!jiGYQ3U4QsidgvpnFV>VrX+a6*bs?9z$x9R>g_apT6dTJM%2k%``6=3e816ncp zaSk?^M>Q&FbE9=f?>gJkzEQXG`De^{c+)>z}+Kg#7S+#y3hMl6r`1l#(o&O0wxdY~-?Gc|Ch$-?<3^|2h0P~%A6^~~}2 z*;^~=_K;jqWYHZ^#x$_Hsm4-6+@o0wH4~fdr3`fzJ85qdhNQxroEmjA-z-htf3(6b zj;2zjsbvGD;b+%|9z*#mbU{KJQ(9$*>Ao3({YjG6sXq1A!|G=J2?Yt_+M|8Yy%5?5 zZau~Jb27)t>+{ro=!Z$C%F+5}G=5RWPnCaY<0jFg348Wh8udTc5L2-oX8HH3-D|oN x5nFKWTHXwFsb@I3Ws_G+9&`Mtn2OoUBuW6~@k?6RzcxO2gyTN0Ea&s|zX8m3SaSdX