Dynamic Render to go

- Added animation capabilities for blocks usable with the mechanical piston
- New models for the harvester and the drill
This commit is contained in:
simibubi 2019-10-19 15:42:42 +02:00
parent 835a4a638b
commit d8ab5dc122
40 changed files with 1076 additions and 897 deletions

View file

@ -11,8 +11,10 @@ import com.simibubi.create.modules.contraptions.generators.WaterWheelBlock;
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelBlock;
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelControllerBlock;
import com.simibubi.create.modules.contraptions.receivers.DrillBlock;
import com.simibubi.create.modules.contraptions.receivers.DrillBlock.DrillHeadBlock;
import com.simibubi.create.modules.contraptions.receivers.EncasedFanBlock;
import com.simibubi.create.modules.contraptions.receivers.HarvesterBlock;
import com.simibubi.create.modules.contraptions.receivers.HarvesterBlock.HarvesterBladeBlock;
import com.simibubi.create.modules.contraptions.receivers.MechanicalPressBlock;
import com.simibubi.create.modules.contraptions.receivers.TurntableBlock;
import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalBearingBlock;
@ -118,7 +120,9 @@ public enum AllBlocks {
TRANSLATION_CHASSIS_SECONDARY(new TranslationChassisBlock()),
ROTATION_CHASSIS(new RotationChassisBlock()),
DRILL(new DrillBlock()),
DRILL_HEAD(new DrillHeadBlock()),
HARVESTER(new HarvesterBlock()),
HARVESTER_BLADE(new HarvesterBladeBlock()),
__LOGISTICS__(),
CONTACT(new ContactBlock()),

View file

@ -9,8 +9,11 @@ import com.simibubi.create.modules.contraptions.generators.WaterWheelTileEntity;
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelControllerTileEntity;
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelTileEntity;
import com.simibubi.create.modules.contraptions.receivers.DrillTileEntity;
import com.simibubi.create.modules.contraptions.receivers.DrillTileEntityRenderer;
import com.simibubi.create.modules.contraptions.receivers.EncasedFanTileEntity;
import com.simibubi.create.modules.contraptions.receivers.EncasedFanTileEntityRenderer;
import com.simibubi.create.modules.contraptions.receivers.HarvesterTileEntity;
import com.simibubi.create.modules.contraptions.receivers.HarvesterTileEntityRenderer;
import com.simibubi.create.modules.contraptions.receivers.MechanicalPressTileEntity;
import com.simibubi.create.modules.contraptions.receivers.MechanicalPressTileEntityRenderer;
import com.simibubi.create.modules.contraptions.receivers.TurntableTileEntity;
@ -91,12 +94,10 @@ public enum AllTileEntities {
BELT(BeltTileEntity::new, AllBlocks.BELT),
MECHANICAL_PISTON(MechanicalPistonTileEntity::new, AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON),
MECHANICAL_BEARING(MechanicalBearingTileEntity::new, AllBlocks.MECHANICAL_BEARING),
CHASSIS(
ChassisTileEntity::new,
AllBlocks.ROTATION_CHASSIS,
AllBlocks.TRANSLATION_CHASSIS,
CHASSIS(ChassisTileEntity::new, AllBlocks.ROTATION_CHASSIS, AllBlocks.TRANSLATION_CHASSIS,
AllBlocks.TRANSLATION_CHASSIS_SECONDARY),
DRILL(DrillTileEntity::new, AllBlocks.DRILL),
HARVESTER(HarvesterTileEntity::new, AllBlocks.HARVESTER),
CRUSHING_WHEEL(CrushingWheelTileEntity::new, AllBlocks.CRUSHING_WHEEL),
CRUSHING_WHEEL_CONTROLLER(CrushingWheelControllerTileEntity::new, AllBlocks.CRUSHING_WHEEL_CONTROLLER),
WATER_WHEEL(WaterWheelTileEntity::new, AllBlocks.WATER_WHEEL),
@ -161,6 +162,7 @@ public enum AllTileEntities {
bind(TurntableTileEntity.class, new KineticTileEntityRenderer());
bind(MotorTileEntity.class, new MotorTileEntityRenderer());
bind(EncasedShaftTileEntity.class, new EncasedShaftTileEntityRenderer());
bind(DrillTileEntity.class, new DrillTileEntityRenderer());
bind(EncasedFanTileEntity.class, new EncasedFanTileEntityRenderer());
bind(GearboxTileEntity.class, new GearboxTileEntityRenderer());
bind(GearshiftTileEntity.class, new SplitShaftTileEntityRenderer());
@ -168,7 +170,6 @@ public enum AllTileEntities {
bind(BeltTileEntity.class, new BeltTileEntityRenderer());
bind(MechanicalPistonTileEntity.class, new MechanicalPistonTileEntityRenderer());
bind(MechanicalBearingTileEntity.class, new MechanicalBearingTileEntityRenderer());
bind(DrillTileEntity.class, new KineticTileEntityRenderer());
bind(CrushingWheelTileEntity.class, new KineticTileEntityRenderer());
bind(WaterWheelTileEntity.class, new KineticTileEntityRenderer());
bind(RedstoneBridgeTileEntity.class, new LinkedTileEntityRenderer());
@ -179,6 +180,7 @@ public enum AllTileEntities {
bind(FlexpeaterTileEntity.class, new FlexpeaterTileEntityRenderer());
bind(LogisticalControllerTileEntity.class, new LogisticalControllerTileEntityRenderer());
bind(LogisticiansTableTileEntity.class, new LogisticiansTableTileEntityRenderer());
bind(HarvesterTileEntity.class, new HarvesterTileEntityRenderer());
}
@OnlyIn(Dist.CLIENT)

View file

@ -21,6 +21,7 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.model.animation.Animation;
import net.minecraftforge.client.model.animation.TileEntityRendererFast;
@ -32,7 +33,7 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
protected static Map<BlockState, BufferManipulator> cachedBuffers;
protected class BlockModelSpinner extends BufferManipulator {
protected static class BlockModelSpinner extends BufferManipulator {
public BlockModelSpinner(ByteBuffer original) {
super(original);
@ -50,7 +51,7 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
x = getX(original, vertex) - .5f;
y = getY(original, vertex) - .5f;
z = getZ(original, vertex) - .5f;
putPos(mutable, vertex, rotateX(x, y, z, sin, cos, axis) + .5f + xIn,
rotateY(x, y, z, sin, cos, axis) + .5f + yIn, rotateZ(x, y, z, sin, cos, axis) + .5f + zIn);
putLight(mutable, vertex, packedLightCoords);
@ -69,7 +70,7 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
int destroyStage, BufferBuilder buffer) {
final BlockState state = getRenderedBlockState(te);
cacheIfMissing(state, BlockModelSpinner::new);
cacheIfMissing(state, getWorld(), BlockModelSpinner::new);
final BlockPos pos = te.getPos();
Axis axis = ((IRotate) te.getBlockState().getBlock()).getRotationAxis(te.getBlockState());
@ -77,17 +78,22 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
float offset = getRotationOffsetForPosition(te, pos, axis);
float angle = (float) (((time * te.getSpeed() + offset) % 360) / 180 * (float) Math.PI);
renderFromCache(buffer, state, (float) x, (float) y, (float) z, pos, axis, angle);
renderFromCache(buffer, state, getWorld(), (float) x, (float) y, (float) z, pos, axis, angle);
}
protected void renderFromCache(BufferBuilder buffer, BlockState state, float x, float y, float z, BlockPos pos,
Axis axis, float angle) {
int packedLightmapCoords = state.getPackedLightmapCoords(getWorld(), pos);
buffer.putBulkData(((BlockModelSpinner) cachedBuffers.get(state)).getTransformed(x, y, z, angle, axis,
protected static void renderFromCache(BufferBuilder buffer, BlockState state, World world, float x, float y,
float z, BlockPos pos, Axis axis, float angle) {
int packedLightmapCoords = state.getPackedLightmapCoords(world, pos);
buffer.putBulkData(((BlockModelSpinner) getBuffer(state)).getTransformed(x, y, z, angle, axis,
packedLightmapCoords));
}
protected void cacheIfMissing(final BlockState state, Function<ByteBuffer, BufferManipulator> factory) {
public static BufferManipulator getBuffer(BlockState state) {
return cachedBuffers.get(state);
}
public static void cacheIfMissing(final BlockState state, World world,
Function<ByteBuffer, BufferManipulator> factory) {
if (!cachedBuffers.containsKey(state)) {
BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher();
BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer();
@ -97,7 +103,7 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
builder.setTranslation(0, 1, 0);
builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK);
blockRenderer.renderModelFlat(getWorld(), originalModel, state, BlockPos.ZERO.down(), builder, true, random, 42,
blockRenderer.renderModelFlat(world, originalModel, state, BlockPos.ZERO.down(), builder, true, random, 42,
EmptyModelData.INSTANCE);
builder.finishDrawing();
@ -123,5 +129,5 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
if (cachedBuffers != null)
cachedBuffers.clear();
}
}

View file

@ -2,23 +2,22 @@ package com.simibubi.create.modules.contraptions.receivers;
import java.util.List;
import com.simibubi.create.foundation.block.IRenderUtilityBlock;
import com.simibubi.create.foundation.block.IWithTileEntity;
import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock;
import com.simibubi.create.modules.contraptions.base.IRotate;
import com.simibubi.create.modules.contraptions.receivers.constructs.IHaveMovementBehavior;
import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalPistonTileEntity;
import com.simibubi.create.modules.contraptions.relays.ShaftBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.DirectionalBlock;
import net.minecraft.block.material.PushReaction;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack;
import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
@ -27,33 +26,26 @@ import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class DrillBlock extends DirectionalKineticBlock implements IHaveMovementBehavior {
public class DrillBlock extends DirectionalKineticBlock
implements IHaveMovementBehavior, IWithTileEntity<DrillTileEntity> {
protected static final VoxelShape CORE_SHAPE = makeCuboidShape(3, 3, 3, 13, 13, 13),
DRILL_SHAPE_X = VoxelShapes.or(CORE_SHAPE, ShaftBlock.AXIS_X),
DRILL_SHAPE_Y = VoxelShapes.or(CORE_SHAPE, ShaftBlock.AXIS_Y),
DRILL_SHAPE_Z = VoxelShapes.or(CORE_SHAPE, ShaftBlock.AXIS_Z);
public static final BooleanProperty FIXATED = BooleanProperty.create("fixated");
public DrillBlock() {
super(Properties.from(Blocks.IRON_BLOCK));
setDefaultState(getDefaultState().with(FIXATED, true));
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
builder.add(FIXATED);
super.fillStateContainer(builder);
}
@Override
public boolean hasTileEntity(BlockState state) {
return !state.get(FIXATED);
return true;
}
@Override
@ -75,6 +67,12 @@ public class DrillBlock extends DirectionalKineticBlock implements IHaveMovement
return CORE_SHAPE;
}
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
withTileEntityDo(worldIn, pos, DrillTileEntity::destroyNextTick);
}
@Override
public Axis getRotationAxis(BlockState state) {
return state.get(FACING).getAxis();
@ -82,78 +80,42 @@ public class DrillBlock extends DirectionalKineticBlock implements IHaveMovement
@Override
public boolean hasShaftTowards(World world, BlockPos pos, BlockState state, Direction face) {
return !state.get(FIXATED) && face == state.get(FACING).getOpposite();
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
return super.getStateForPlacement(context).with(FIXATED,
!canConnectTo(context.getWorld(), context.getPos(), context.getFace().getOpposite()));
}
private boolean canConnectTo(IWorld world, BlockPos pos, Direction direction) {
BlockPos offsetPos = pos.offset(direction);
BlockState blockStateAttached = world.getBlockState(offsetPos);
if (blockStateAttached.getBlock() instanceof IRotate && ((IRotate) blockStateAttached.getBlock())
.hasShaftTowards(world.getWorld(), offsetPos, blockStateAttached, direction.getOpposite())) {
return true;
}
return false;
return face == state.get(FACING).getOpposite();
}
@Override
public PushReaction getPushReaction(BlockState state) {
return state.get(FIXATED) ? PushReaction.NORMAL : PushReaction.BLOCK;
}
@Override
public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn,
BlockPos currentPos, BlockPos facingPos) {
if (facing == stateIn.get(FACING).getOpposite()) {
boolean connected = canConnectTo(worldIn, currentPos, facing);
boolean fixated = stateIn.get(FIXATED);
if (!fixated && !connected)
worldIn.getWorld().removeTileEntity(currentPos);
return stateIn.with(FIXATED, !connected);
}
if (facing != stateIn.get(FACING))
return stateIn;
DrillTileEntity te = (DrillTileEntity) worldIn.getTileEntity(currentPos);
if (te != null)
te.destroyNextTick();
return stateIn;
}
@Override
public boolean canRenderInLayer(BlockState state, BlockRenderLayer layer) {
return state.get(FIXATED) && layer == BlockRenderLayer.SOLID;
return PushReaction.PUSH_ONLY;
}
@Override
protected boolean hasStaticPart() {
return false;
return true;
}
@Override
public IMovementContext visitPosition(World world, BlockPos pos, BlockState block, Direction movement,
MechanicalPistonTileEntity piston) {
IMovementContext context = IdleMovementContext.INSTANCE;
if (movement != block.get(FACING))
return context;
@OnlyIn(value = Dist.CLIENT)
public void renderInConstruct(MovementContext context, double x, double y, double z, BufferBuilder buffer) {
DrillTileEntityRenderer.renderInConstruct(context, x, y, z, buffer);
}
@Override
public void visitPosition(MovementContext context) {
Direction movement = context.getMovementDirection();
BlockState block = context.state;
if (movement != block.get(FACING))
return;
World world = context.world;
BlockPos pos = context.currentGridPos;
pos = pos.offset(movement);
BlockState stateVisited = world.getBlockState(pos);
if (stateVisited.getCollisionShape(world, pos).isEmpty())
return context;
return;
if (stateVisited.getBlockHardness(world, pos) == -1)
return context;
return;
world.playEvent(2001, pos, Block.getStateId(stateVisited));
List<ItemStack> drops = Block.getDrops(stateVisited, (ServerWorld) world, pos, null);
@ -165,8 +127,20 @@ public class DrillBlock extends DirectionalKineticBlock implements IHaveMovement
new Vec3d(movement.getDirectionVec()).add(0, 0.5f, 0).scale(world.rand.nextFloat() * .3f));
world.addEntity(itemEntity);
}
}
public static class DrillHeadBlock extends DirectionalBlock implements IRenderUtilityBlock {
public DrillHeadBlock() {
super(Properties.from(Blocks.AIR));
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
builder.add(FACING);
super.fillStateContainer(builder);
}
return context;
}
}

View file

@ -0,0 +1,46 @@
package com.simibubi.create.modules.contraptions.receivers;
import static net.minecraft.state.properties.BlockStateProperties.FACING;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.modules.contraptions.base.IRotate;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.modules.contraptions.receivers.constructs.IHaveMovementBehavior.MovementContext;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.client.model.animation.Animation;
public class DrillTileEntityRenderer extends KineticTileEntityRenderer {
@Override
protected BlockState getRenderedBlockState(KineticTileEntity te) {
return getRenderedBlockState(te.getBlockState());
}
private static BlockState getRenderedBlockState(BlockState state) {
return AllBlocks.DRILL_HEAD.get().getDefaultState().with(FACING, state.get(FACING));
}
public static void renderInConstruct(MovementContext context, double x, double y, double z, BufferBuilder buffer) {
World world = context.world;
BlockState state = context.state;
BlockPos pos = context.currentGridPos;
final BlockState renderedState = getRenderedBlockState(state);
cacheIfMissing(renderedState, world, BlockModelSpinner::new);
float speed = context.getMovementDirection() == state.get(FACING)? 100 : 0;
Axis axis = ((IRotate) state.getBlock()).getRotationAxis(state);
float time = Animation.getWorldTime(Minecraft.getInstance().world,
Minecraft.getInstance().getRenderPartialTicks());
float angle = (float) (((time * speed) % 360) / 180 * (float) Math.PI);
renderFromCache(buffer, renderedState, world, (float) x, (float) y, (float) z, pos, axis, angle);
}
}

View file

@ -3,8 +3,8 @@ package com.simibubi.create.modules.contraptions.receivers;
import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IRenderUtilityBlock;
import com.simibubi.create.modules.contraptions.receivers.constructs.IHaveMovementBehavior;
import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalPistonTileEntity;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
@ -12,6 +12,8 @@ import net.minecraft.block.Blocks;
import net.minecraft.block.CropsBlock;
import net.minecraft.block.HorizontalBlock;
import net.minecraft.block.SugarCaneBlock;
import net.minecraft.block.material.PushReaction;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack;
@ -19,6 +21,7 @@ import net.minecraft.state.IProperty;
import net.minecraft.state.IntegerProperty;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
@ -30,6 +33,8 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.IPlantable;
public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBehavior {
@ -42,6 +47,21 @@ public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBeha
super(Properties.from(Blocks.IRON_BLOCK));
}
@Override
public boolean hasTileEntity(BlockState state) {
return true;
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return new HarvesterTileEntity();
}
@Override
public PushReaction getPushReaction(BlockState state) {
return PushReaction.PUSH_ONLY;
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
Direction direction = state.get(HORIZONTAL_FACING);
@ -63,6 +83,12 @@ public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBeha
builder.add(HORIZONTAL_FACING);
super.fillStateContainer(builder);
}
@Override
@OnlyIn(value = Dist.CLIENT)
public void renderInConstruct(MovementContext context, double x, double y, double z, BufferBuilder buffer) {
HarvesterTileEntityRenderer.renderInConstruct(context, x, y, z, buffer);
}
@Override
public BlockRenderLayer getRenderLayer() {
@ -93,12 +119,14 @@ public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBeha
}
@Override
public IMovementContext visitPosition(World world, BlockPos pos, BlockState block, Direction movement,
MechanicalPistonTileEntity piston) {
IMovementContext context = IdleMovementContext.INSTANCE;
public void visitPosition(MovementContext context) {
Direction movement = context.getMovementDirection();
World world = context.world;
BlockState block = context.state;
BlockPos pos = context.currentGridPos;
if (movement != block.get(HORIZONTAL_FACING))
return context;
return;
BlockState stateVisited = world.getBlockState(pos);
boolean notCropButCuttable = false;
@ -113,7 +141,7 @@ public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBeha
if (isValidOther(world, pos, stateVisited))
notCropButCuttable = true;
else
return context;
return;
}
List<ItemStack> drops = Block.getDrops(stateVisited, (ServerWorld) world, pos, null);
@ -131,8 +159,6 @@ public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBeha
new Vec3d(movement.getDirectionVec()).add(0, 0.5f, 0).scale(world.rand.nextFloat() * .3f));
world.addEntity(itemEntity);
}
return context;
}
private boolean isValidCrop(World world, BlockPos pos, BlockState state) {
@ -201,4 +227,23 @@ public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBeha
return Blocks.AIR.getDefaultState();
}
public static class HarvesterBladeBlock extends HorizontalBlock implements IRenderUtilityBlock {
public HarvesterBladeBlock() {
super(Properties.from(Blocks.AIR));
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
builder.add(HORIZONTAL_FACING);
super.fillStateContainer(builder);
}
@Override
public BlockRenderLayer getRenderLayer() {
return BlockRenderLayer.SOLID;
}
}
}

View file

@ -0,0 +1,17 @@
package com.simibubi.create.modules.contraptions.receivers;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.block.SyncedTileEntity;
public class HarvesterTileEntity extends SyncedTileEntity {
public HarvesterTileEntity() {
super(AllTileEntities.HARVESTER.type);
}
@Override
public boolean hasFastRenderer() {
return true;
}
}

View file

@ -0,0 +1,97 @@
package com.simibubi.create.modules.contraptions.receivers;
import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING;
import java.nio.ByteBuffer;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.utility.BufferManipulator;
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.modules.contraptions.receivers.constructs.IHaveMovementBehavior.MovementContext;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.client.model.animation.Animation;
public class HarvesterTileEntityRenderer extends TileEntityRenderer<HarvesterTileEntity> {
protected static class HarvesterRenderer extends BufferManipulator {
public HarvesterRenderer(ByteBuffer original) {
super(original);
}
public ByteBuffer getTransformed(float xIn, float yIn, float zIn, float angle, Direction facing,
int packedLightCoords) {
original.rewind();
mutable.rewind();
float cos = MathHelper.cos(angle);
float sin = MathHelper.sin(angle);
float x, y, z = 0;
Axis axis = facing.rotateYCCW().getAxis();
int axisDirection = -facing.getAxisDirection().getOffset();
float originOffset = 1 / 16f;
float xOffset = axis == Axis.X ? 0 : originOffset * axisDirection;
float zOffset = axis == Axis.Z ? 0 : originOffset * axisDirection;
for (int vertex = 0; vertex < vertexCount(original); vertex++) {
x = getX(original, vertex) - .5f + xOffset;
y = getY(original, vertex) - .5f + 2 * originOffset;
z = getZ(original, vertex) - .5f + zOffset;
putPos(mutable, vertex, rotateX(x, y, z, sin, cos, axis) + .5f - xOffset + xIn,
rotateY(x, y, z, sin, cos, axis) + .5f - 2 * originOffset + yIn,
rotateZ(x, y, z, sin, cos, axis) + .5f - zOffset + zIn);
putLight(mutable, vertex, packedLightCoords);
}
return mutable;
}
}
public static void renderInConstruct(MovementContext context, double x, double y, double z, BufferBuilder buffer) {
World world = context.world;
BlockState state = context.state;
BlockPos pos = context.currentGridPos;
Direction facing = context.getMovementDirection();
float speed = facing == state.get(HORIZONTAL_FACING) ? 100 * facing.getAxisDirection().getOffset() : 0;
if (facing.getAxis() == Axis.X)
speed = -speed;
float time = Animation.getWorldTime(Minecraft.getInstance().world,
Minecraft.getInstance().getRenderPartialTicks());
float angle = (float) (((time * speed) % 360) / 180 * (float) Math.PI);
render(world, state, pos, x, y, z, angle, buffer);
}
@Override
public void renderTileEntityFast(HarvesterTileEntity te, double x, double y, double z, float partialTicks,
int destroyStage, BufferBuilder buffer) {
render(te.getWorld(), te.getBlockState(), te.getPos(), x, y, z, 0, buffer);
}
public static void render(World world, BlockState state, BlockPos pos, double x, double y, double z, float angle,
BufferBuilder buffer) {
if (!AllBlocks.HARVESTER.typeOf(state))
return;
BlockState renderedState = AllBlocks.HARVESTER_BLADE.get().getDefaultState().with(HORIZONTAL_FACING,
state.get(HORIZONTAL_FACING));
KineticTileEntityRenderer.cacheIfMissing(renderedState, world, HarvesterRenderer::new);
HarvesterRenderer renderer = (HarvesterRenderer) KineticTileEntityRenderer.getBuffer(renderedState);
buffer.putBulkData(renderer.getTransformed((float) x, (float) y, (float) z, angle, state.get(HORIZONTAL_FACING),
state.getPackedLightmapCoords(world, pos)));
}
}

View file

@ -40,7 +40,7 @@ public class MechanicalPressTileEntityRenderer extends KineticTileEntityRenderer
super.renderTileEntityFast(te, x, y, z, partialTicks, destroyStage, buffer);
final BlockState state = getRenderedHeadBlockState(te);
cacheIfMissing(state, HeadTranslator::new);
cacheIfMissing(state, getWorld(), HeadTranslator::new);
final BlockPos pos = te.getPos();

View file

@ -1,15 +1,21 @@
package com.simibubi.create.modules.contraptions.receivers.constructs;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public interface IHaveMovementBehavior {
default IMovementContext visitPosition(World world, BlockPos pos, BlockState block, Direction movement,
MechanicalPistonTileEntity piston) {
return IdleMovementContext.INSTANCE;
public enum MoverType {
PISTON, BEARING, MINECART;
}
default void visitPosition(MovementContext context) {
}
default void tick(MechanicalPistonTileEntity piston) {
@ -19,14 +25,32 @@ public interface IHaveMovementBehavior {
return false;
}
public interface IMovementContext {
default boolean isBlocking() {
return false;
public class MovementContext {
public BlockPos currentGridPos;
public Vec3d movementVec;
public float movementSpeedModifier = 1;
public MoverType moverType;
public Object mover;
public World world;
public BlockState state;
public MovementContext(World world, BlockState state, MoverType moverType, Object mover) {
this.world = world;
this.state = state;
this.moverType = moverType;
this.mover = mover;
}
public Direction getMovementDirection() {
return Direction.getFacingFromVector(movementVec.x, movementVec.y, movementVec.z);
}
}
public static class IdleMovementContext implements IMovementContext {
public static IdleMovementContext INSTANCE = new IdleMovementContext();
@OnlyIn(value = Dist.CLIENT)
default void renderInConstruct(MovementContext context, double x, double y, double z, BufferBuilder buffer) {
}
}

View file

@ -45,8 +45,8 @@ public class MechanicalBearingTileEntityRenderer extends KineticTileEntityRender
BlockState capState = AllBlocks.MECHANICAL_BEARING_TOP.get().getDefaultState().with(BlockStateProperties.FACING,
facing);
cacheIfMissing(shaftState, BlockModelSpinner::new);
cacheIfMissing(capState, BlockModelSpinner::new);
cacheIfMissing(shaftState, getWorld(), BlockModelSpinner::new);
cacheIfMissing(capState, getWorld(), BlockModelSpinner::new);
float offset = getRotationOffsetForPosition(te, pos, facing.getAxis());
float angle = (time * te.getSpeed()) % 360;
@ -55,8 +55,9 @@ public class MechanicalBearingTileEntityRenderer extends KineticTileEntityRender
angle = angle / 180f * (float) Math.PI;
float interpolatedAngle = bearingTe.getInterpolatedAngle(partialTicks);
renderFromCache(buffer, shaftState, (float) x, (float) y, (float) z, pos, facing.getAxis(), angle);
renderFromCache(buffer, capState, (float) x, (float) y, (float) z, pos, facing.getAxis(), interpolatedAngle);
renderFromCache(buffer, shaftState, getWorld(), (float) x, (float) y, (float) z, pos, facing.getAxis(), angle);
renderFromCache(buffer, capState, getWorld(), (float) x, (float) y, (float) z, pos, facing.getAxis(),
interpolatedAngle);
if (!bearingTe.running)
return;
@ -110,7 +111,7 @@ public class MechanicalBearingTileEntityRenderer extends KineticTileEntityRender
return AllBlocks.SHAFT.block.getDefaultState().with(BlockStateProperties.AXIS,
((IRotate) te.getBlockState().getBlock()).getRotationAxis(te.getBlockState()));
}
public static void invalidateCache() {
if (cachedConstructs != null)
cachedConstructs.invalidateAll();

View file

@ -5,10 +5,14 @@ import static com.simibubi.create.CreateConfig.parameters;
import java.util.Arrays;
import java.util.Iterator;
import org.apache.commons.lang3.tuple.MutablePair;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.Create;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.receivers.constructs.IHaveMovementBehavior.MovementContext;
import com.simibubi.create.modules.contraptions.receivers.constructs.IHaveMovementBehavior.MoverType;
import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalPistonBlock.PistonState;
import net.minecraft.block.BlockState;
@ -78,8 +82,16 @@ public class MechanicalPistonTileEntity extends KineticTileEntity implements ITi
public void read(CompoundNBT tag) {
running = tag.getBoolean("Running");
offset = tag.getFloat("Offset");
if (running && !TranslationConstruct.isFrozen())
if (running && !TranslationConstruct.isFrozen()) {
movingConstruct = TranslationConstruct.fromNBT(tag.getCompound("Construct"));
for (MutablePair<BlockInfo, MovementContext> pair : movingConstruct.actors) {
MovementContext context = new MovementContext(world, pair.left.state, MoverType.PISTON, this);
Direction direction = getBlockState().get(BlockStateProperties.FACING);
context.movementVec = new Vec3d(direction.getDirectionVec()).scale(getMovementSpeed()).normalize();
context.currentGridPos = pair.left.pos.offset(direction, getModulatedOffset(offset));
pair.setRight(context);
}
}
super.read(tag);
}
@ -90,10 +102,15 @@ public class MechanicalPistonTileEntity extends KineticTileEntity implements ITi
Direction direction = getBlockState().get(BlockStateProperties.FACING);
for (BlockInfo block : movingConstruct.actors) {
for (MutablePair<BlockInfo, MovementContext> pair : movingConstruct.actors) {
BlockInfo block = pair.left;
MovementContext context = pair.right;
BlockPos newPos = block.pos.offset(direction, getModulatedOffset(newOffset));
context.currentGridPos = newPos;
IHaveMovementBehavior actor = (IHaveMovementBehavior) block.state.getBlock();
actor.visitPosition(world, block.pos.offset(direction, getModulatedOffset(newOffset)), block.state,
getMovementSpeed() > 0 ? direction : direction.getOpposite(), this);
actor.visitPosition(context);
}
}
@ -132,6 +149,13 @@ public class MechanicalPistonTileEntity extends KineticTileEntity implements ITi
getWorld().setBlockState(startPos, Blocks.AIR.getDefaultState(), 67);
}
for (MutablePair<BlockInfo, MovementContext> pair : movingConstruct.actors) {
MovementContext context = new MovementContext(world, pair.left.state, MoverType.PISTON, this);
context.movementVec = new Vec3d(direction.getDirectionVec()).scale(getMovementSpeed()).normalize();
context.currentGridPos = pair.left.pos.offset(direction, getModulatedOffset(offset));
pair.setRight(context);
}
onBlockVisited(offset);
}
@ -160,7 +184,10 @@ public class MechanicalPistonTileEntity extends KineticTileEntity implements ITi
getWorld().setBlockState(targetPos, state, 3);
TileEntity tileEntity = world.getTileEntity(targetPos);
if (tileEntity != null && block.nbt != null) {
((ChassisTileEntity) tileEntity).setRange(block.nbt.getInt("Range"));
block.nbt.putInt("x", targetPos.getX());
block.nbt.putInt("y", targetPos.getY());
block.nbt.putInt("z", targetPos.getZ());
tileEntity.read(block.nbt);
}
}
@ -181,6 +208,13 @@ public class MechanicalPistonTileEntity extends KineticTileEntity implements ITi
if (running) {
if (speed == 0)
disassembleConstruct();
else {
for (MutablePair<BlockInfo, MovementContext> pair : movingConstruct.actors)
pair.right.movementVec = new Vec3d(
getBlockState().get(BlockStateProperties.FACING).getDirectionVec())
.scale(getMovementSpeed()).normalize();
sendData();
}
return;
}
assembleConstruct();

View file

@ -3,6 +3,7 @@ package com.simibubi.create.modules.contraptions.receivers.constructs;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.opengl.GL11;
import com.google.common.cache.Cache;
@ -12,6 +13,7 @@ import com.simibubi.create.foundation.utility.PlacementSimulationWorld;
import com.simibubi.create.modules.contraptions.base.IRotate;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.modules.contraptions.receivers.constructs.IHaveMovementBehavior.MovementContext;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
@ -21,6 +23,7 @@ import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.gen.feature.template.Template.BlockInfo;
import net.minecraftforge.client.model.data.EmptyModelData;
@ -43,6 +46,17 @@ public class MechanicalPistonTileEntityRenderer extends KineticTileEntityRendere
cacheConstructIfMissing(pistonTe.movingConstruct);
renderConstructFromCache(pistonTe.movingConstruct, pistonTe, x, y, z, partialTicks, buffer);
for (Pair<BlockInfo, MovementContext> actor : pistonTe.movingConstruct.actors) {
MovementContext context = actor.getRight();
if (context == null)
continue;
final Vec3d offset = pistonTe.getConstructOffset(partialTicks);
BlockInfo blockInfo = actor.getLeft();
IHaveMovementBehavior block = (IHaveMovementBehavior) blockInfo.state.getBlock();
BlockPos pos = blockInfo.pos.subtract(te.getPos());
block.renderInConstruct(context, x + offset.x + pos.getX(),
y + offset.y + pos.getY(), z + offset.z + pos.getZ(), buffer);
}
}
@ -89,7 +103,7 @@ public class MechanicalPistonTileEntityRenderer extends KineticTileEntityRendere
return AllBlocks.SHAFT.block.getDefaultState().with(BlockStateProperties.AXIS,
((IRotate) te.getBlockState().getBlock()).getRotationAxis(te.getBlockState()));
}
public static void invalidateCache() {
if (cachedConstructs != null)
cachedConstructs.invalidateAll();

View file

@ -26,6 +26,8 @@ import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IWorld;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber
@ -53,14 +55,14 @@ public class MovingConstructHandler {
Vec3d movementVec = new Vec3d(te.getBlockState().get(BlockStateProperties.FACING).getDirectionVec());
TranslationConstruct construct = te.movingConstruct;
if (world.isRemote) {
renderedBBs.clear();
// if (construct.collisionBoxFront != null)
// renderedBBs.add(construct.collisionBoxFront.offset(te.getConstructOffset(0)));
// if (construct.collisionBoxBack != null)
// renderedBBs.add(construct.collisionBoxBack.offset(te.getConstructOffset(0)));
}
// if (world.isRemote) {
// renderedBBs.clear();
// if (construct.pistonCollisionBox != null)
// renderedBBs.add(construct.pistonCollisionBox.offset(te.getConstructOffset(0)));
// if (construct.constructCollisionBox != null)
// renderedBBs.add(construct.constructCollisionBox.offset(te.getConstructOffset(0)));
//
// }
if (construct.getCollisionBoxFront() != null) {
AxisAlignedBB constructBB = construct.getCollisionBoxFront().offset(te.getConstructOffset(0)).grow(.5f);
@ -164,8 +166,8 @@ public class MovingConstructHandler {
return movingPistons.get(mechanicalPistonTileEntity.getWorld());
}
// @SubscribeEvent
// public static void onRenderWorld(RenderWorldLastEvent event) {
@SubscribeEvent
public static void onRenderWorld(RenderWorldLastEvent event) {
// for (AxisAlignedBB bb : renderedBBs) {
// TessellatorHelper.prepareForDrawing();
// GlStateManager.disableTexture();
@ -177,6 +179,6 @@ public class MovingConstructHandler {
// GlStateManager.enableTexture();
// TessellatorHelper.cleanUpAfterDrawing();
// }
// }
}
}

View file

@ -16,8 +16,11 @@ import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import org.apache.commons.lang3.tuple.MutablePair;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.CreateConfig;
import com.simibubi.create.modules.contraptions.receivers.constructs.IHaveMovementBehavior.MovementContext;
import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalPistonBlock.PistonState;
import net.minecraft.block.BlockState;
@ -43,7 +46,7 @@ import net.minecraft.world.gen.feature.template.Template.BlockInfo;
public class TranslationConstruct {
protected Map<BlockPos, BlockInfo> blocks;
protected List<BlockInfo> actors;
protected List<MutablePair<BlockInfo, MovementContext>> actors;
protected AxisAlignedBB constructCollisionBox;
protected AxisAlignedBB pistonCollisionBox;
@ -59,7 +62,7 @@ public class TranslationConstruct {
blocks = new HashMap<>();
actors = new ArrayList<>();
}
public static TranslationConstruct movePistonAt(World world, BlockPos pos, Direction direction, boolean retract) {
if (isFrozen())
return null;
@ -157,7 +160,7 @@ public class TranslationConstruct {
private boolean searchMovedStructure(World world, BlockPos pos, Direction direction) {
List<BlockPos> frontier = new ArrayList<>();
Set<BlockPos> visited = new HashSet<>();
constructCollisionBox = new AxisAlignedBB(pos);
constructCollisionBox = new AxisAlignedBB(pos.offset(direction, initialExtensionProgress));
frontier.add(pos);
for (int offset = 1; offset <= parameters.maxChassisRange.get(); offset++) {
@ -205,8 +208,18 @@ public class TranslationConstruct {
if (isChassis(state) && !moveChassis(world, pos, direction, frontier, visited))
return false;
if (state.getBlock() instanceof SlimeBlock)
for (Direction offset : Direction.values())
frontier.add(pos.offset(offset));
for (Direction offset : Direction.values()) {
BlockPos offsetPos = pos.offset(offset);
if (offset.getAxis() == direction.getAxis()) {
BlockState blockState = world.getBlockState(offsetPos);
if (AllBlocks.MECHANICAL_PISTON.typeOf(blockState)
|| AllBlocks.STICKY_MECHANICAL_PISTON.typeOf(blockState)
|| AllBlocks.MECHANICAL_PISTON_HEAD.typeOf(blockState))
continue;
}
if (!visited.contains(offsetPos))
frontier.add(offsetPos);
}
add(pos, capture(world, pos));
return true;
@ -215,11 +228,15 @@ public class TranslationConstruct {
private boolean moveChassis(World world, BlockPos pos, Direction movementDirection, List<BlockPos> frontier,
Set<BlockPos> visited) {
List<BlockInfo> cluster = getChassisClusterAt(world, pos);
if (cluster == null)
return false;
if (cluster.isEmpty())
return true;
Set<BlockPos> validChassis = new HashSet<>(cluster.size());
cluster.forEach(info -> validChassis.add(info.pos));
BlockInfo anchorChassis = cluster.get(0);
Axis chassisAxis = anchorChassis.state.get(AXIS);
int chassisCoord = chassisAxis.getCoordinate(anchorChassis.pos.getX(), anchorChassis.pos.getY(),
@ -277,6 +294,10 @@ public class TranslationConstruct {
if (!pushing && notInRange)
continue;
// Chassis not part of cluster
if (!validChassis.contains(currentChassisPos))
continue;
boolean isBaseChassis = currentPos.equals(currentChassisPos);
if (!isBaseChassis) {
// Don't pull if chassis not sticky
@ -373,7 +394,7 @@ public class TranslationConstruct {
return state.get(BlockStateProperties.HORIZONTAL_FACING) == facing;
return false;
}
private static boolean isChassis(BlockState state) {
return TranslationChassisBlock.isChassis(state);
}
@ -386,14 +407,14 @@ public class TranslationConstruct {
return false;
return PistonBlock.canPush(blockState, world, pos, direction, true, direction);
}
private void add(BlockPos pos, BlockInfo block) {
BlockPos localPos = pos.offset(orientation, -initialExtensionProgress);
BlockInfo blockInfo = new BlockInfo(localPos, block.state, block.nbt);
blocks.put(localPos, blockInfo);
if (block.state.getBlock() instanceof IHaveMovementBehavior)
actors.add(blockInfo);
constructCollisionBox.union(new AxisAlignedBB(localPos));
actors.add(MutablePair.of(blockInfo, null));
constructCollisionBox = constructCollisionBox.union(new AxisAlignedBB(localPos));
}
private static BlockInfo capture(World world, BlockPos pos) {
@ -482,7 +503,7 @@ public class TranslationConstruct {
// Find blocks with special movement behaviour
construct.blocks.values().forEach(block -> {
if (block.state.getBlock() instanceof IHaveMovementBehavior)
construct.actors.add(block);
construct.actors.add(MutablePair.of(block, null));
});
return construct;

View file

@ -101,16 +101,22 @@ public class ContactBlock extends ProperDirectionalBlock implements IHaveMovemen
}
@Override
public IMovementContext visitPosition(World world, BlockPos pos, BlockState block, Direction movement,
MechanicalPistonTileEntity piston) {
public void visitPosition(MovementContext context) {
BlockState block = context.state;
World world = context.world;
BlockPos pos = context.currentGridPos;
Direction direction = block.get(FACING);
if (!hasValidContact(world, pos, direction))
return IdleMovementContext.INSTANCE;
return;
if (context.moverType != MoverType.PISTON)
return;
int ticksToStayActive = (int) Math.ceil(1 / Math.abs(piston.getMovementSpeed()));
int ticksToStayActive = (int) Math
.ceil(1 / Math.abs(((MechanicalPistonTileEntity) context.mover).getMovementSpeed()));
world.setBlockState(pos.offset(direction), world.getBlockState(pos.offset(direction)).with(POWERED, true));
world.getPendingBlockTicks().scheduleTick(pos.offset(direction), this, ticksToStayActive, TickPriority.NORMAL);
return IdleMovementContext.INSTANCE;
return;
}
}

View file

@ -31,7 +31,7 @@ public class GearboxTileEntityRenderer extends KineticTileEntityRenderer {
continue;
BlockState state = defaultState.with(BlockStateProperties.FACING, direction);
cacheIfMissing(state, BlockModelSpinner::new);
cacheIfMissing(state, getWorld(), BlockModelSpinner::new);
float offset = getRotationOffsetForPosition(te, pos, axis);
float angle = (time * te.getSpeed()) % 360;
@ -48,7 +48,7 @@ public class GearboxTileEntityRenderer extends KineticTileEntityRenderer {
angle += offset;
angle = angle / 180f * (float) Math.PI;
renderFromCache(buffer, state, (float) x, (float) y, (float) z, pos, axis, angle);
renderFromCache(buffer, state, getWorld(), (float) x, (float) y, (float) z, pos, axis, angle);
}
}

View file

@ -29,7 +29,7 @@ public class SplitShaftTileEntityRenderer extends KineticTileEntityRenderer {
continue;
BlockState state = defaultState.with(BlockStateProperties.FACING, direction);
cacheIfMissing(state, BlockModelSpinner::new);
cacheIfMissing(state, getWorld(), BlockModelSpinner::new);
float offset = getRotationOffsetForPosition(te, pos, axis);
float angle = (time * te.getSpeed()) % 360;
@ -42,7 +42,7 @@ public class SplitShaftTileEntityRenderer extends KineticTileEntityRenderer {
angle += offset;
angle = angle / 180f * (float) Math.PI;
renderFromCache(buffer, state, (float) x, (float) y, (float) z, pos, axis, angle);
renderFromCache(buffer, state, getWorld(), (float) x, (float) y, (float) z, pos, axis, angle);
}
}

View file

@ -98,7 +98,7 @@ public class BeltTileEntityRenderer extends KineticTileEntityRenderer {
if (beltEntity.hasPulley())
super.renderTileEntityFast(te, x, y, z, partialTicks, destroyStage, buffer);
cacheIfMissing(beltEntity.getBlockState(), BeltModelAnimator::new);
cacheIfMissing(beltEntity.getBlockState(), getWorld(), BeltModelAnimator::new);
renderBeltFromCache(beltEntity, (float) x, (float) y, (float) z, buffer);
}

View file

@ -1,17 +1,16 @@
{
"variants": {
"fixated=false,facing=up": { "model": "create:block/drill", "x": 90 },
"fixated=false,facing=down": { "model": "create:block/drill", "x": 270 },
"fixated=false,facing=north": { "model": "create:block/drill", "y": 180 },
"fixated=false,facing=south": { "model": "create:block/drill" },
"fixated=false,facing=east": { "model": "create:block/drill", "y": 270 },
"fixated=false,facing=west": { "model": "create:block/drill", "y": 90 },
"fixated=true,facing=up": { "model": "create:block/drill_fixated", "x": 90 },
"fixated=true,facing=down": { "model": "create:block/drill_fixated", "x": 270 },
"fixated=true,facing=north": { "model": "create:block/drill_fixated", "y": 180 },
"fixated=true,facing=south": { "model": "create:block/drill_fixated" },
"fixated=true,facing=east": { "model": "create:block/drill_fixated", "y": 270 },
"fixated=true,facing=west": { "model": "create:block/drill_fixated", "y": 90 }
}
"forge_marker": 1,
"defaults": {
"model": "create:block/drill_base"
},
"variants": {
"facing": {
"north": { "y": 180 },
"south": { },
"west": { "y": 90 },
"up": { "x": 90 },
"down": { "x": 270 },
"east": { "y": 270 }
}
}
}

View file

@ -0,0 +1,16 @@
{
"forge_marker": 1,
"defaults": {
"model": "create:block/drill"
},
"variants": {
"facing": {
"north": { "y": 180 },
"south": { },
"west": { "y": 90 },
"up": { "x": 90 },
"down": { "x": 270 },
"east": { "y": 270 }
}
}
}

View file

@ -1,8 +1,14 @@
{
"forge_marker": 1,
"defaults": {
"model": "create:block/harvester"
},
"variants": {
"facing=north": { "model": "create:block/harvester", "y": 180 },
"facing=south": { "model": "create:block/harvester" },
"facing=east": { "model": "create:block/harvester", "y": 270 },
"facing=west": { "model": "create:block/harvester", "y": 90 }
"facing": {
"north": { "y": 180 },
"south": {},
"east": { "y": 270 },
"west": { "y": 90 }
}
}
}

View file

@ -0,0 +1,14 @@
{
"forge_marker": 1,
"defaults": {
"model": "create:block/harvester_blade"
},
"variants": {
"facing": {
"north": { "y": 180 },
"south": {},
"east": { "y": 270 },
"west": { "y": 90 }
}
}
}

View file

@ -1,17 +1,41 @@
{
"forge_marker": 1,
"variants": {
"axis=x,sticky_top=false,sticky_bottom=false": { "model": "create:block/translation_chassis", "x": 90, "y": 90 },
"axis=x,sticky_top=true,sticky_bottom=false": { "model": "create:block/translation_chassis_top_sticky", "x": 90, "y": 90 },
"axis=x,sticky_top=false,sticky_bottom=true": { "model": "create:block/translation_chassis_bottom_sticky", "x": 90, "y": 90 },
"axis=x,sticky_top=true,sticky_bottom=true": { "model": "create:block/translation_chassis_both_sticky", "x": 90, "y": 90 },
"axis=y,sticky_top=false,sticky_bottom=false": { "model": "create:block/translation_chassis" },
"axis=y,sticky_top=true,sticky_bottom=false": { "model": "create:block/translation_chassis_top_sticky" },
"axis=y,sticky_top=false,sticky_bottom=true": { "model": "create:block/translation_chassis_bottom_sticky" },
"axis=y,sticky_top=true,sticky_bottom=true": { "model": "create:block/translation_chassis_both_sticky" },
"axis=z,sticky_top=false,sticky_bottom=false": { "model": "create:block/translation_chassis", "x": 90, "y": 180 },
"axis=z,sticky_top=true,sticky_bottom=false": { "model": "create:block/translation_chassis_top_sticky", "x": 90, "y": 180 },
"axis=z,sticky_top=false,sticky_bottom=true": { "model": "create:block/translation_chassis_bottom_sticky", "x": 90, "y": 180 },
"axis=z,sticky_top=true,sticky_bottom=true": { "model": "create:block/translation_chassis_both_sticky", "x": 90, "y": 180 }
}
"forge_marker": 1,
"defaults": {
"model": "block/cube_bottom_top",
"textures": {
"side": "create:block/translation_chassis_side"
},
"transform": "forge:default-block"
},
"variants": {
"axis": {
"x": { "x": 90, "y": 90 },
"y": { },
"z": { "x": 90, "y": 180 }
},
"sticky_top": {
"false": {
"textures": {
"top": "create:block/translation_chassis_top"
}
},
"true": {
"textures": {
"top": "create:block/translation_chassis_top_sticky"
}
}
},
"sticky_bottom": {
"false": {
"textures": {
"bottom": "create:block/translation_chassis_top"
}
},
"true": {
"textures": {
"bottom": "create:block/translation_chassis_top_sticky"
}
}
}
}
}

View file

@ -1,22 +1,41 @@
{
"forge_marker": 1,
"defaults": {
"textures": {
"side": "create:block/translation_chassis_side_alt"
}
},
"variants": {
"axis=x,sticky_top=false,sticky_bottom=false": { "model": "create:block/translation_chassis", "x": 90, "y": 90 },
"axis=x,sticky_top=true,sticky_bottom=false": { "model": "create:block/translation_chassis_top_sticky", "x": 90, "y": 90 },
"axis=x,sticky_top=false,sticky_bottom=true": { "model": "create:block/translation_chassis_bottom_sticky", "x": 90, "y": 90 },
"axis=x,sticky_top=true,sticky_bottom=true": { "model": "create:block/translation_chassis_both_sticky", "x": 90, "y": 90 },
"axis=y,sticky_top=false,sticky_bottom=false": { "model": "create:block/translation_chassis" },
"axis=y,sticky_top=true,sticky_bottom=false": { "model": "create:block/translation_chassis_top_sticky" },
"axis=y,sticky_top=false,sticky_bottom=true": { "model": "create:block/translation_chassis_bottom_sticky" },
"axis=y,sticky_top=true,sticky_bottom=true": { "model": "create:block/translation_chassis_both_sticky" },
"axis=z,sticky_top=false,sticky_bottom=false": { "model": "create:block/translation_chassis", "x": 90, "y": 180 },
"axis=z,sticky_top=true,sticky_bottom=false": { "model": "create:block/translation_chassis_top_sticky", "x": 90, "y": 180 },
"axis=z,sticky_top=false,sticky_bottom=true": { "model": "create:block/translation_chassis_bottom_sticky", "x": 90, "y": 180 },
"axis=z,sticky_top=true,sticky_bottom=true": { "model": "create:block/translation_chassis_both_sticky", "x": 90, "y": 180 }
}
"forge_marker": 1,
"defaults": {
"model": "block/cube_bottom_top",
"textures": {
"side": "create:block/translation_chassis_side_alt"
},
"transform": "forge:default-block"
},
"variants": {
"axis": {
"x": { "x": 90, "y": 90 },
"y": { },
"z": { "x": 90, "y": 180 }
},
"sticky_top": {
"false": {
"textures": {
"top": "create:block/translation_chassis_top"
}
},
"true": {
"textures": {
"top": "create:block/translation_chassis_top_sticky"
}
}
},
"sticky_bottom": {
"false": {
"textures": {
"bottom": "create:block/translation_chassis_top"
}
},
"true": {
"textures": {
"bottom": "create:block/translation_chassis_top_sticky"
}
}
}
}
}

View file

@ -0,0 +1,10 @@
{
"parent": "block/block",
"display": {
"gui": {
"rotation": [ 30, 45, 0 ],
"translation": [ 0, 0, 0],
"scale":[ 0.625, 0.625, 0.625 ]
}
}
}

View file

@ -1,179 +1,79 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"parent": "block/cube",
"__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"textures": {
"particle": "block/anvil",
"0": "create:block/axis_top",
"1": "create:block/axis",
"2": "block/anvil",
"3": "block/smooth_stone",
"4": "block/polished_andesite"
"gearbox_top": "create:block/gearbox_top",
"anvil": "minecraft:block/anvil",
"gearbox": "create:block/gearbox",
"axis_top": "create:block/axis_top",
"axis": "create:block/axis",
"andesite_casing_short": "create:block/andesite_casing_short"
},
"elements": [
{
"name": "Axle",
"from": [ 6.0, 6.0, 0.0 ],
"to": [ 10.0, 10.0, 4.0 ],
"shade": false,
"name": "Drill",
"from": [ 4, 4, 11 ],
"to": [ 12, 12, 13 ],
"faces": {
"north": { "texture": "#0", "uv": [ 6.0, 6.0, 10.0, 10.0 ] },
"east": { "texture": "#1", "uv": [ 6.0, 12.0, 10.0, 16.0 ], "rotation": 90 },
"west": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 4.0 ], "rotation": 270 },
"up": { "texture": "#1", "uv": [ 6.0, 12.0, 10.0, 16.0 ] },
"down": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 4.0 ], "rotation": 180 }
"north": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 13 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 12 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 13, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 12, 5 ] }
}
},
{
"name": "Core",
"from": [ 5.0, 5.0, 4.0 ],
"to": [ 11.0, 11.0, 12.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 45.0 },
"name": "Drill",
"from": [ 5, 5, 13 ],
"to": [ 11, 11, 15 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 22.5 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 6.0 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 6.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 6.0 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 6.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 8.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 8.0 ] }
"north": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 11 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 10 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 11, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 10, 5 ] }
}
},
{
"name": "Top",
"from": [ 6.0, 11.0, 7.0 ],
"to": [ 10.0, 13.0, 13.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"name": "Drill",
"from": [ 6, 6, 15 ],
"to": [ 10, 10, 17 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 2.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 2.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 6.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 6.0 ] }
"north": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 9 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 8 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 9, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 8, 5 ] }
}
},
{
"name": "Bottom",
"from": [ 6.0, 3.0, 7.0 ],
"to": [ 10.0, 5.0, 13.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"name": "Drill",
"from": [ 7, 7, 17 ],
"to": [ 9, 9, 19 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 2.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 2.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 6.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 6.0 ] }
"north": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 7 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 6 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 7, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 6, 5 ] }
}
},
{
"name": "Left",
"from": [ 3.0, 6.0, 7.0 ],
"to": [ 5.0, 10.0, 13.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"name": "Shaft",
"from": [ 6, 6, 0 ],
"to": [ 10, 10, 11 ],
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 4.0 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 4.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 4.0 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 4.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 6.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 6.0 ] }
}
},
{
"name": "Right",
"from": [ 11.0, 6.0, 7.0 ],
"to": [ 13.0, 10.0, 13.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 4.0 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 4.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 4.0 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 4.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 6.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 6.0 ] }
}
},
{
"name": "Bit1",
"from": [ 6.0, 6.0, 12.0 ],
"to": [ 10.0, 10.0, 16.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 22.5 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 4.0 ] }
}
},
{
"name": "Bit2",
"from": [ 6.499999992549419, 6.499999992549419, 15.0 ],
"to": [ 9.49999999254942, 9.49999999254942, 19.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 3.0, 3.0 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 3.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 3.0, 3.0 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 3.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 3.0, 4.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 3.0, 4.0 ] }
}
},
{
"name": "Bit3",
"from": [ 7.0, 7.0, 18.0 ],
"to": [ 9.0, 9.0, 22.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 4.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 4.0 ] }
}
},
{
"name": "Cross1",
"from": [ 6.0, 2.0, 3.0 ],
"to": [ 10.0, 14.0, 7.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 22.5 },
"faces": {
"north": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ] },
"east": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ] },
"south": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ] },
"west": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ] },
"up": { "texture": "#0", "uv": [ 6.0, 6.0, 10.0, 10.0 ] },
"down": { "texture": "#0", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }
}
},
{
"name": "Cross2",
"from": [ 2.0, 6.0, 3.0 ],
"to": [ 14.0, 10.0, 7.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 22.5 },
"faces": {
"north": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ], "rotation": 270 },
"east": { "texture": "#0", "uv": [ 6.0, 6.0, 10.0, 10.0 ] },
"south": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ], "rotation": 90 },
"west": { "texture": "#0", "uv": [ 6.0, 6.0, 10.0, 10.0 ] },
"up": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ], "rotation": 90 },
"down": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ], "rotation": 270 }
}
},
{
"name": "Connector",
"from": [ 5.0, 5.0, 2.0 ],
"to": [ 11.0, 11.0, 4.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#3", "uv": [ 5.0, 5.0, 11.0, 11.0 ] },
"east": { "texture": "#4", "uv": [ 0.0, 6.0, 2.0, 12.0 ], "rotation": 180 },
"west": { "texture": "#4", "uv": [ 0.0, 5.0, 2.0, 11.0 ] },
"up": { "texture": "#4", "uv": [ 4.0, 0.0, 10.0, 2.0 ] },
"down": { "texture": "#4", "uv": [ 4.0, 0.0, 10.0, 2.0 ], "rotation": 180 }
"north": { "texture": "#axis_top", "uv": [ 6, 6, 10, 10 ] },
"east": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ], "rotation": 90 },
"west": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ], "rotation": 270 },
"up": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ] },
"down": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ] }
}
}
]

View file

@ -1,6 +1,7 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"textures": {
"textures": {
"particle": "create:block/gearbox_top",
"gearbox_top": "create:block/gearbox_top",
"anvil": "minecraft:block/anvil",
"gearbox": "create:block/gearbox",
@ -63,61 +64,6 @@
"south": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 270 }
}
},
{
"name": "Drill",
"from": [ 4, 4, 11 ],
"to": [ 12, 12, 13 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 13 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 12 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 13, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 12, 5 ] }
}
},
{
"name": "Drill",
"from": [ 5, 5, 13 ],
"to": [ 11, 11, 15 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 22.5 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 11 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 10 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 11, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 10, 5 ] }
}
},
{
"name": "Drill",
"from": [ 6, 6, 15 ],
"to": [ 10, 10, 17 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 9 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 8 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 9, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 8, 5 ] }
}
},
{
"name": "Drill",
"from": [ 7, 7, 17 ],
"to": [ 9, 9, 19 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 7 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 6 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 7, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 6, 5 ] }
}
}
]
}

View file

@ -1,174 +0,0 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"parent": "block/cube",
"display": {
"gui": {
"rotation": [ 30, 45, 0 ],
"translation": [ 0, 0, 0],
"scale":[ 0.625, 0.625, 0.625 ]
}
},
"textures": {
"particle": "block/anvil",
"0": "block/anvil",
"1": "create:block/axis",
"2": "create:block/axis_top",
"3": "block/smooth_stone",
"4": "block/polished_andesite"
},
"elements": [
{
"name": "Core",
"from": [ 5.0, 5.0, 4.0 ],
"to": [ 11.0, 11.0, 12.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 6.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 8.0, 6.0 ] },
"south": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 6.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 8.0, 6.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 8.0 ] },
"down": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 8.0 ] }
}
},
{
"name": "Top",
"from": [ 6.0, 11.0, 7.0 ],
"to": [ 10.0, 13.0, 13.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 2.0 ] },
"south": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 2.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 6.0 ] },
"down": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 6.0 ] }
}
},
{
"name": "Bottom",
"from": [ 6.0, 3.0, 7.0 ],
"to": [ 10.0, 5.0, 13.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 2.0 ] },
"south": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 2.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 6.0 ] },
"down": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 6.0 ] }
}
},
{
"name": "Left",
"from": [ 3.0, 6.0, 7.0 ],
"to": [ 5.0, 10.0, 13.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 4.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 4.0 ] },
"south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 4.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 4.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 6.0 ] },
"down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 6.0 ] }
}
},
{
"name": "Right",
"from": [ 11.0, 6.0, 7.0 ],
"to": [ 13.0, 10.0, 13.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 4.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 4.0 ] },
"south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 4.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 4.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 6.0 ] },
"down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 6.0 ] }
}
},
{
"name": "Bit1",
"from": [ 6.0, 6.0, 12.0 ],
"to": [ 10.0, 10.0, 16.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 22.5 },
"faces": {
"north": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"south": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"down": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 4.0 ] }
}
},
{
"name": "Bit2",
"from": [ 6.499999992549419, 6.499999992549419, 15.0 ],
"to": [ 9.49999999254942, 9.49999999254942, 19.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 3.0 ] },
"south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 3.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 4.0 ] },
"down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 4.0 ] }
}
},
{
"name": "Bit3",
"from": [ 7.0, 7.0, 18.0 ],
"to": [ 9.0, 9.0, 22.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 2.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 4.0 ] },
"down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 4.0 ] }
}
},
{
"name": "Cross1",
"from": [ 6.0, 2.0, 3.0 ],
"to": [ 10.0, 14.0, 7.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 22.5 },
"faces": {
"north": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ] },
"east": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ] },
"south": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ] },
"west": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ] },
"up": { "texture": "#2", "uv": [ 6.0, 6.0, 10.0, 10.0 ] },
"down": { "texture": "#2", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }
}
},
{
"name": "Cross2",
"from": [ 2.0, 6.0, 3.0 ],
"to": [ 14.0, 10.0, 7.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 22.5 },
"faces": {
"north": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ], "rotation": 270 },
"east": { "texture": "#2", "uv": [ 6.0, 6.0, 10.0, 10.0 ] },
"south": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ], "rotation": 90 },
"west": { "texture": "#2", "uv": [ 6.0, 6.0, 10.0, 10.0 ] },
"up": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ], "rotation": 90 },
"down": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 16.0 ], "rotation": 270 }
}
},
{
"name": "Connector",
"from": [ 4.0, 4.0, 0.0 ],
"to": [ 12.0, 12.0, 4.0 ],
"faces": {
"north": { "texture": "#3", "uv": [ 4.0, 4.0, 12.0, 12.0 ] },
"east": { "texture": "#4", "uv": [ 0.0, 4.0, 4.0, 12.0 ], "rotation": 180 },
"south": { "texture": "#4", "uv": [ 4.0, 4.0, 12.0, 12.0 ] },
"west": { "texture": "#4", "uv": [ 0.0, 4.0, 4.0, 12.0 ] },
"up": { "texture": "#4", "uv": [ 4.0, 0.0, 12.0, 4.0 ] },
"down": { "texture": "#4", "uv": [ 4.0, 0.0, 12.0, 4.0 ], "rotation": 180 }
}
}
]
}

View file

@ -1,54 +1,51 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"parent": "block/cube",
"display": {
"gui": {
"rotation": [ 30, 45, 0 ],
"translation": [ 0, 0, 0],
"scale":[ 0.625, 0.625, 0.625 ]
}
},
"__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"textures": {
"particle": "block/anvil",
"0": "block/smooth_stone",
"1": "block/polished_andesite",
"2": "block/anvil",
"3": "block/stonecutter_saw"
"harvester": "create:block/harvester",
"anvil": "minecraft:block/anvil",
"andesite_casing_short": "create:block/andesite_casing_short",
"particle": "create:block/andesite_casing_short"
},
"elements": [
{
"name": "Connector",
"from": [ 1.0, 4.0, 0.0 ],
"to": [ 15.0, 12.0, 4.0 ],
"name": "Core",
"from": [ 0, 2, 0 ],
"to": [ 16, 14, 2.9 ],
"faces": {
"north": { "texture": "#0", "uv": [ 1.0, 4.0, 15.0, 12.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 4.0, 4.0, 12.0 ], "rotation": 180 },
"south": { "texture": "#1", "uv": [ 1.0, 4.0, 15.0, 12.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 4.0, 4.0, 12.0 ] },
"up": { "texture": "#1", "uv": [ 1.0, 0.0, 15.0, 4.0 ] },
"down": { "texture": "#1", "uv": [ 1.0, 0.0, 15.0, 4.0 ], "rotation": 180 }
"north": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 2, 0, 14, 3 ], "rotation": 270 },
"south": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 2, 0, 14, 3 ], "rotation": 90 },
"up": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 16, 2.9 ], "rotation": 180 },
"down": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 16, 2.9 ] }
}
},
{
"name": "Body",
"from": [ 0.0, 6.0, 2.0 ],
"to": [ 16.0, 10.0, 6.0 ],
"name": "Attachment",
"from": [ 0.1, 7, 3 ],
"to": [ 2, 10, 11 ],
"rotation": { "origin": [ 0, 10, 3 ], "axis": "x", "angle": 22.5 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 4.0 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 4.0 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 4.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 4.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 4.0 ] }
"north": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 1.9, 3 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 8, 3 ] },
"south": { "texture": "#andesite_casing_short", "uv": [ 0.1, 8, 2, 11 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 8, 3 ] },
"up": { "texture": "#andesite_casing_short", "uv": [ 0.1, 6, 2, 14 ] },
"down": { "texture": "#andesite_casing_short", "uv": [ 0.1, 6, 2, 14 ] }
}
},
{
"name": "Saw",
"from": [ 1.0, 8.0, 6.0 ],
"to": [ 15.0, 8.100000001490116, 13.0 ],
"name": "Attachment",
"from": [ 14, 7, 3 ],
"to": [ 15.9, 10, 11 ],
"rotation": { "origin": [ 0, 10, 3 ], "axis": "x", "angle": 22.5 },
"faces": {
"up": { "texture": "#3", "uv": [ 1.0, 9.0, 15.0, 16.0 ], "rotation": 180 },
"down": { "texture": "#3", "uv": [ 1.0, 9.0, 15.0, 16.0 ] }
"north": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 1.9, 3 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 8, 3 ] },
"south": { "texture": "#andesite_casing_short", "uv": [ 14, 8, 15.9, 11 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 8, 3 ] },
"up": { "texture": "#andesite_casing_short", "uv": [ 14, 6, 15.9, 14 ] },
"down": { "texture": "#andesite_casing_short", "uv": [ 14, 6, 15.9, 14 ] }
}
}
]

View file

@ -0,0 +1,118 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"textures": {
"harvester": "create:block/harvester",
"anvil": "minecraft:block/anvil",
"andesite_casing_short": "create:block/andesite_casing_short"
},
"elements": [
{
"name": "Wheel",
"from": [ 1, 0, 3 ],
"to": [ 1.0625, 12, 15 ],
"rotation": { "origin": [ 8, 6, 9 ], "axis": "x", "angle": -22.5 },
"faces": {
"east": { "texture": "#harvester", "uv": [ 0, 0, 12, 12 ] },
"west": { "texture": "#harvester", "uv": [ 0, 0, 12, 12 ] }
}
},
{
"name": "Trim",
"from": [ 0, 0, 11 ],
"to": [ 16, 2, 12 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"east": { "texture": "#anvil", "uv": [ 0, 0, 1, 2 ] },
"south": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"west": { "texture": "#anvil", "uv": [ 0, 0, 1, 2 ] },
"up": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] },
"down": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] }
}
},
{
"name": "Trim",
"from": [ 0, 10, 6 ],
"to": [ 16, 12, 7 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"east": { "texture": "#anvil", "uv": [ 0, 0, 1, 2 ] },
"south": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"west": { "texture": "#anvil", "uv": [ 0, 0, 1, 2 ] },
"up": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] },
"down": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] }
}
},
{
"name": "Trim",
"from": [ 0, 8, 13 ],
"to": [ 16, 9, 15 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 0, 9, 16, 10 ] },
"east": { "texture": "#anvil", "uv": [ 0, 0, 2, 1 ] },
"south": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] },
"west": { "texture": "#anvil", "uv": [ 0, 0, 2, 1 ] },
"up": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"down": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] }
}
},
{
"name": "Trim",
"from": [ 0, 3, 3 ],
"to": [ 16, 4, 5 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] },
"east": { "texture": "#anvil", "uv": [ 0, 0, 2, 1 ] },
"south": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] },
"west": { "texture": "#anvil", "uv": [ 0, 0, 2, 1 ] },
"up": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"down": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] }
}
},
{
"name": "Blade",
"from": [ 0, 6, 15 ],
"to": [ 16, 8, 15.0625 ],
"faces": {
"north": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ], "rotation": 180 },
"south": { "texture": "#harvester", "uv": [ 16, 12, 0, 14 ], "rotation": 180 }
}
},
{
"name": "Wheel",
"from": [ 15, 0, 3 ],
"to": [ 15.0625, 12, 15 ],
"rotation": { "origin": [ 8, 6, 9 ], "axis": "x", "angle": -22.5 },
"faces": {
"east": { "texture": "#harvester", "uv": [ 0, 0, 12, 12 ] },
"west": { "texture": "#harvester", "uv": [ 0, 0, 12, 12 ] }
}
},
{
"name": "Blade",
"from": [ 0, 4, 3 ],
"to": [ 16, 6, 3.0625 ],
"faces": {
"north": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ] },
"south": { "texture": "#harvester", "uv": [ 16, 12, 0, 14 ] }
}
},
{
"name": "Blade",
"from": [ 0, 12, 7 ],
"to": [ 16, 12.0625, 9 ],
"faces": {
"up": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ], "rotation": 180 },
"down": { "texture": "#harvester", "uv": [ 16, 12, 0, 14 ] }
}
},
{
"name": "Blade",
"from": [ 0, 0.0625, 9 ],
"to": [ 16, 0.125, 11 ],
"faces": {
"up": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ] },
"down": { "texture": "#harvester", "uv": [ 16, 12, 0, 14 ], "rotation": 180 }
}
}
]
}

View file

@ -1,137 +0,0 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"textures": {
"gearbox_top": "create:block/gearbox_top",
"anvil": "minecraft:block/anvil",
"gearbox": "create:block/gearbox",
"axis_top": "create:block/axis_top",
"axis": "create:block/axis",
"andesite_casing_short": "create:block/andesite_casing_short"
},
"elements": [
{
"name": "Body",
"from": [ 2, 2, 1 ],
"to": [ 14, 14, 11 ],
"faces": {
"north": { "texture": "#gearbox", "uv": [ 2, 2, 14, 14 ] },
"south": { "texture": "#gearbox", "uv": [ 2, 2, 14, 14 ] }
}
},
{
"name": "Bottom",
"from": [ 0, 0, 0 ],
"to": [ 16, 2, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 0, 14, 16, 16 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 2, 16 ], "rotation": 270 },
"south": { "texture": "#gearbox_top", "uv": [ 0, 14, 16, 16 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 2, 16 ], "rotation": 270 },
"up": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] },
"down": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] }
}
},
{
"name": "Top",
"from": [ 0, 14, 0 ],
"to": [ 16, 16, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 0, 0, 16, 2 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 14, 4, 16, 16 ], "rotation": 270 },
"south": { "texture": "#gearbox_top", "uv": [ 0, 0, 16, 2 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 14, 4, 16, 16 ], "rotation": 270 },
"up": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] },
"down": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] }
}
},
{
"name": "Side",
"from": [ 0, 2, 0 ],
"to": [ 2, 14, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 90 },
"south": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 270 }
}
},
{
"name": "Side",
"from": [ 14, 2, 0 ],
"to": [ 16, 14, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 90 },
"south": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 270 }
}
},
{
"name": "Drill",
"from": [ 4, 4, 11 ],
"to": [ 12, 12, 13 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 13 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 12 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 13, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 12, 5 ] }
}
},
{
"name": "Drill",
"from": [ 5, 5, 13 ],
"to": [ 11, 11, 15 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 22.5 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 11 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 10 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 11, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 10, 5 ] }
}
},
{
"name": "Drill",
"from": [ 6, 6, 15 ],
"to": [ 10, 10, 17 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 9 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 8 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 9, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 8, 5 ] }
}
},
{
"name": "Drill",
"from": [ 7, 7, 17 ],
"to": [ 9, 9, 19 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 7 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 6 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 7, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 6, 5 ] }
}
},
{
"name": "Shaft",
"from": [ 6, 6, 0 ],
"to": [ 10, 10, 11 ],
"faces": {
"north": { "texture": "#axis_top", "uv": [ 6, 6, 10, 10 ] },
"east": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ], "rotation": 90 },
"west": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ], "rotation": 270 },
"up": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ] },
"down": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ] }
}
}
]
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/saw",
"textures": {
"stonecutter_saw": "create:block/static_saw",
}
}

View file

@ -1,10 +1,124 @@
{
"parent": "create:block/drill_fixated",
"display": {
"fixed": {
"rotation": [ 0, 180, 0 ],
"translation": [ 0, 0, -3],
"scale":[ 0.5, 0.5, 0.5 ]
"__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"textures": {
"gearbox_top": "create:block/gearbox_top",
"anvil": "minecraft:block/anvil",
"gearbox": "create:block/gearbox",
"andesite_casing_short": "create:block/andesite_casing_short"
},
"parent": "create:block/block",
"elements": [
{
"name": "Body",
"from": [ 2, 2, 1 ],
"to": [ 14, 14, 11 ],
"faces": {
"north": { "texture": "#gearbox", "uv": [ 2, 2, 14, 14 ] },
"south": { "texture": "#gearbox", "uv": [ 2, 2, 14, 14 ] }
}
},
{
"name": "Bottom",
"from": [ 0, 0, 0 ],
"to": [ 16, 2, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 0, 14, 16, 16 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 2, 16 ], "rotation": 270 },
"south": { "texture": "#gearbox_top", "uv": [ 0, 14, 16, 16 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 2, 16 ], "rotation": 270 },
"up": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] },
"down": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] }
}
},
{
"name": "Top",
"from": [ 0, 14, 0 ],
"to": [ 16, 16, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 0, 0, 16, 2 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 14, 4, 16, 16 ], "rotation": 270 },
"south": { "texture": "#gearbox_top", "uv": [ 0, 0, 16, 2 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 14, 4, 16, 16 ], "rotation": 270 },
"up": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] },
"down": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] }
}
},
{
"name": "Side",
"from": [ 0, 2, 0 ],
"to": [ 2, 14, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 90 },
"south": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 270 }
}
},
{
"name": "Side",
"from": [ 14, 2, 0 ],
"to": [ 16, 14, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 90 },
"south": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 270 }
}
},
{
"name": "Drill",
"from": [ 4, 4, 11 ],
"to": [ 12, 12, 13 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 13 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 12 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 13, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 12, 5 ] }
}
},
{
"name": "Drill",
"from": [ 5, 5, 13 ],
"to": [ 11, 11, 15 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 22.5 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 11 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 10 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 11, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 10, 5 ] }
}
},
{
"name": "Drill",
"from": [ 6, 6, 15 ],
"to": [ 10, 10, 17 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 9 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 8 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 9, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 8, 5 ] }
}
},
{
"name": "Drill",
"from": [ 7, 7, 17 ],
"to": [ 9, 9, 19 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 7 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 6 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 7, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 6, 5 ] }
}
}
}
]
}

View file

@ -1,10 +1,161 @@
{
"parent": "create:block/harvester",
"display": {
"fixed": {
"rotation": [ 0, 180, 0 ],
"translation": [ 0, 0, -3],
"scale":[ 0.5, 0.5, 0.5 ]
"__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"parent": "create:block/block",
"textures": {
"harvester": "create:block/harvester",
"anvil": "minecraft:block/anvil",
"andesite_casing_short": "create:block/andesite_casing_short",
"particle": "create:block/andesite_casing_short"
},
"elements": [
{
"name": "Core",
"from": [ 0, 2, 0 ],
"to": [ 16, 14, 2.9 ],
"faces": {
"north": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 2, 0, 14, 3 ], "rotation": 270 },
"south": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 2, 0, 14, 3 ], "rotation": 90 },
"up": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 16, 2.9 ], "rotation": 180 },
"down": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 16, 2.9 ] }
}
},
{
"name": "Wheel",
"from": [ 1, 0, 3 ],
"to": [ 1, 12, 15 ],
"rotation": { "origin": [ 8, 6, 9 ], "axis": "x", "angle": -22.5 },
"faces": {
"east": { "texture": "#harvester", "uv": [ 0, 0, 12, 12 ] },
"west": { "texture": "#harvester", "uv": [ 0, 0, 12, 12 ] }
}
},
{
"name": "Trim",
"from": [ 0, 0, 11 ],
"to": [ 16, 2, 12 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"east": { "texture": "#anvil", "uv": [ 0, 0, 1, 2 ] },
"south": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"west": { "texture": "#anvil", "uv": [ 0, 0, 1, 2 ] },
"up": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] },
"down": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] }
}
},
{
"name": "Trim",
"from": [ 0, 10, 6 ],
"to": [ 16, 12, 7 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"east": { "texture": "#anvil", "uv": [ 0, 0, 1, 2 ] },
"south": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"west": { "texture": "#anvil", "uv": [ 0, 0, 1, 2 ] },
"up": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] },
"down": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] }
}
},
{
"name": "Trim",
"from": [ 0, 8, 13 ],
"to": [ 16, 9, 15 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 0, 9, 16, 10 ] },
"east": { "texture": "#anvil", "uv": [ 0, 0, 2, 1 ] },
"south": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] },
"west": { "texture": "#anvil", "uv": [ 0, 0, 2, 1 ] },
"up": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"down": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] }
}
},
{
"name": "Trim",
"from": [ 0, 3, 3 ],
"to": [ 16, 4, 5 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] },
"east": { "texture": "#anvil", "uv": [ 0, 0, 2, 1 ] },
"south": { "texture": "#anvil", "uv": [ 0, 0, 16, 1 ] },
"west": { "texture": "#anvil", "uv": [ 0, 0, 2, 1 ] },
"up": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] },
"down": { "texture": "#anvil", "uv": [ 0, 0, 16, 2 ] }
}
},
{
"name": "Blade",
"from": [ 0, 6, 15 ],
"to": [ 16, 8, 15 ],
"faces": {
"north": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ], "rotation": 180 },
"south": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ], "rotation": 180 }
}
},
{
"name": "Wheel",
"from": [ 15, 0, 3 ],
"to": [ 15, 12, 15 ],
"rotation": { "origin": [ 8, 6, 9 ], "axis": "x", "angle": -22.5 },
"faces": {
"east": { "texture": "#harvester", "uv": [ 0, 0, 12, 12 ] },
"west": { "texture": "#harvester", "uv": [ 0, 0, 12, 12 ] }
}
},
{
"name": "Blade",
"from": [ 0, 4, 3 ],
"to": [ 16, 6, 3 ],
"faces": {
"north": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ] },
"south": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ] }
}
},
{
"name": "Blade",
"from": [ 0, 12, 7 ],
"to": [ 16, 12, 9 ],
"faces": {
"up": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ], "rotation": 180 },
"down": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ] }
}
},
{
"name": "Blade",
"from": [ 0, 0, 9 ],
"to": [ 16, 0, 11 ],
"faces": {
"up": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ] },
"down": { "texture": "#harvester", "uv": [ 0, 12, 16, 14 ], "rotation": 180 }
}
},
{
"name": "Attachment",
"from": [ 0.1, 7, 3 ],
"to": [ 2, 10, 11 ],
"rotation": { "origin": [ 0, 10, 3 ], "axis": "x", "angle": 22.5 },
"faces": {
"north": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 1.9, 3 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 8, 3 ] },
"south": { "texture": "#andesite_casing_short", "uv": [ 0.1, 8, 2, 11 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 8, 3 ] },
"up": { "texture": "#andesite_casing_short", "uv": [ 0.1, 6, 2, 14 ] },
"down": { "texture": "#andesite_casing_short", "uv": [ 0.1, 6, 2, 14 ] }
}
},
{
"name": "Attachment",
"from": [ 14, 7, 3 ],
"to": [ 15.9, 10, 11 ],
"rotation": { "origin": [ 0, 10, 3 ], "axis": "x", "angle": 22.5 },
"faces": {
"north": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 1.9, 3 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 8, 3 ] },
"south": { "texture": "#andesite_casing_short", "uv": [ 14, 8, 15.9, 11 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 0, 0, 8, 3 ] },
"up": { "texture": "#andesite_casing_short", "uv": [ 14, 6, 15.9, 14 ] },
"down": { "texture": "#andesite_casing_short", "uv": [ 14, 6, 15.9, 14 ] }
}
}
}
]
}

View file

@ -1,123 +0,0 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"textures": {
"gearbox_top": "create:block/gearbox_top",
"anvil": "minecraft:block/anvil",
"gearbox": "create:block/gearbox",
"andesite_casing_short": "create:block/andesite_casing_short"
},
"elements": [
{
"name": "Body",
"from": [ 2, 2, 1 ],
"to": [ 14, 14, 11 ],
"faces": {
"north": { "texture": "#gearbox", "uv": [ 2, 2, 14, 14 ] },
"south": { "texture": "#gearbox", "uv": [ 2, 2, 14, 14 ] }
}
},
{
"name": "Bottom",
"from": [ 0, 0, 0 ],
"to": [ 16, 2, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 0, 14, 16, 16 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 2, 16 ], "rotation": 270 },
"south": { "texture": "#gearbox_top", "uv": [ 0, 14, 16, 16 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 2, 16 ], "rotation": 270 },
"up": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] },
"down": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] }
}
},
{
"name": "Top",
"from": [ 0, 14, 0 ],
"to": [ 16, 16, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 0, 0, 16, 2 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 14, 4, 16, 16 ], "rotation": 270 },
"south": { "texture": "#gearbox_top", "uv": [ 0, 0, 16, 2 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 14, 4, 16, 16 ], "rotation": 270 },
"up": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] },
"down": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] }
}
},
{
"name": "Side",
"from": [ 0, 2, 0 ],
"to": [ 2, 14, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 90 },
"south": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 270 }
}
},
{
"name": "Side",
"from": [ 14, 2, 0 ],
"to": [ 16, 14, 12 ],
"faces": {
"north": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] },
"east": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 90 },
"south": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] },
"west": { "texture": "#andesite_casing_short", "uv": [ 2, 4, 14, 16 ], "rotation": 270 }
}
},
{
"name": "Drill",
"from": [ 4, 4, 11 ],
"to": [ 12, 12, 13 ],
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 13 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 12 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 13, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 12, 5 ] }
}
},
{
"name": "Drill",
"from": [ 5, 5, 13 ],
"to": [ 11, 11, 15 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 22.5 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 11 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 10 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 11, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 10, 5 ] }
}
},
{
"name": "Drill",
"from": [ 6, 6, 15 ],
"to": [ 10, 10, 17 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 9 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 8 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 9, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 8, 5 ] }
}
},
{
"name": "Drill",
"from": [ 7, 7, 17 ],
"to": [ 9, 9, 19 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": -22.5 },
"faces": {
"north": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"east": { "texture": "#anvil", "uv": [ 10, 5, 12, 7 ] },
"south": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"west": { "texture": "#anvil", "uv": [ 8, 4, 10, 6 ] },
"up": { "texture": "#anvil", "uv": [ 5, 5, 7, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 6, 5 ] }
}
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 465 B

After

Width:  |  Height:  |  Size: 551 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B