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.CrushingWheelBlock;
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelControllerBlock; import com.simibubi.create.modules.contraptions.receivers.CrushingWheelControllerBlock;
import com.simibubi.create.modules.contraptions.receivers.DrillBlock; 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.EncasedFanBlock;
import com.simibubi.create.modules.contraptions.receivers.HarvesterBlock; 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.MechanicalPressBlock;
import com.simibubi.create.modules.contraptions.receivers.TurntableBlock; import com.simibubi.create.modules.contraptions.receivers.TurntableBlock;
import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalBearingBlock; import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalBearingBlock;
@ -118,7 +120,9 @@ public enum AllBlocks {
TRANSLATION_CHASSIS_SECONDARY(new TranslationChassisBlock()), TRANSLATION_CHASSIS_SECONDARY(new TranslationChassisBlock()),
ROTATION_CHASSIS(new RotationChassisBlock()), ROTATION_CHASSIS(new RotationChassisBlock()),
DRILL(new DrillBlock()), DRILL(new DrillBlock()),
DRILL_HEAD(new DrillHeadBlock()),
HARVESTER(new HarvesterBlock()), HARVESTER(new HarvesterBlock()),
HARVESTER_BLADE(new HarvesterBladeBlock()),
__LOGISTICS__(), __LOGISTICS__(),
CONTACT(new ContactBlock()), 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.CrushingWheelControllerTileEntity;
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelTileEntity; import com.simibubi.create.modules.contraptions.receivers.CrushingWheelTileEntity;
import com.simibubi.create.modules.contraptions.receivers.DrillTileEntity; 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.EncasedFanTileEntity;
import com.simibubi.create.modules.contraptions.receivers.EncasedFanTileEntityRenderer; 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.MechanicalPressTileEntity;
import com.simibubi.create.modules.contraptions.receivers.MechanicalPressTileEntityRenderer; import com.simibubi.create.modules.contraptions.receivers.MechanicalPressTileEntityRenderer;
import com.simibubi.create.modules.contraptions.receivers.TurntableTileEntity; import com.simibubi.create.modules.contraptions.receivers.TurntableTileEntity;
@ -91,12 +94,10 @@ public enum AllTileEntities {
BELT(BeltTileEntity::new, AllBlocks.BELT), BELT(BeltTileEntity::new, AllBlocks.BELT),
MECHANICAL_PISTON(MechanicalPistonTileEntity::new, AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON), MECHANICAL_PISTON(MechanicalPistonTileEntity::new, AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON),
MECHANICAL_BEARING(MechanicalBearingTileEntity::new, AllBlocks.MECHANICAL_BEARING), MECHANICAL_BEARING(MechanicalBearingTileEntity::new, AllBlocks.MECHANICAL_BEARING),
CHASSIS( CHASSIS(ChassisTileEntity::new, AllBlocks.ROTATION_CHASSIS, AllBlocks.TRANSLATION_CHASSIS,
ChassisTileEntity::new,
AllBlocks.ROTATION_CHASSIS,
AllBlocks.TRANSLATION_CHASSIS,
AllBlocks.TRANSLATION_CHASSIS_SECONDARY), AllBlocks.TRANSLATION_CHASSIS_SECONDARY),
DRILL(DrillTileEntity::new, AllBlocks.DRILL), DRILL(DrillTileEntity::new, AllBlocks.DRILL),
HARVESTER(HarvesterTileEntity::new, AllBlocks.HARVESTER),
CRUSHING_WHEEL(CrushingWheelTileEntity::new, AllBlocks.CRUSHING_WHEEL), CRUSHING_WHEEL(CrushingWheelTileEntity::new, AllBlocks.CRUSHING_WHEEL),
CRUSHING_WHEEL_CONTROLLER(CrushingWheelControllerTileEntity::new, AllBlocks.CRUSHING_WHEEL_CONTROLLER), CRUSHING_WHEEL_CONTROLLER(CrushingWheelControllerTileEntity::new, AllBlocks.CRUSHING_WHEEL_CONTROLLER),
WATER_WHEEL(WaterWheelTileEntity::new, AllBlocks.WATER_WHEEL), WATER_WHEEL(WaterWheelTileEntity::new, AllBlocks.WATER_WHEEL),
@ -161,6 +162,7 @@ public enum AllTileEntities {
bind(TurntableTileEntity.class, new KineticTileEntityRenderer()); bind(TurntableTileEntity.class, new KineticTileEntityRenderer());
bind(MotorTileEntity.class, new MotorTileEntityRenderer()); bind(MotorTileEntity.class, new MotorTileEntityRenderer());
bind(EncasedShaftTileEntity.class, new EncasedShaftTileEntityRenderer()); bind(EncasedShaftTileEntity.class, new EncasedShaftTileEntityRenderer());
bind(DrillTileEntity.class, new DrillTileEntityRenderer());
bind(EncasedFanTileEntity.class, new EncasedFanTileEntityRenderer()); bind(EncasedFanTileEntity.class, new EncasedFanTileEntityRenderer());
bind(GearboxTileEntity.class, new GearboxTileEntityRenderer()); bind(GearboxTileEntity.class, new GearboxTileEntityRenderer());
bind(GearshiftTileEntity.class, new SplitShaftTileEntityRenderer()); bind(GearshiftTileEntity.class, new SplitShaftTileEntityRenderer());
@ -168,7 +170,6 @@ public enum AllTileEntities {
bind(BeltTileEntity.class, new BeltTileEntityRenderer()); bind(BeltTileEntity.class, new BeltTileEntityRenderer());
bind(MechanicalPistonTileEntity.class, new MechanicalPistonTileEntityRenderer()); bind(MechanicalPistonTileEntity.class, new MechanicalPistonTileEntityRenderer());
bind(MechanicalBearingTileEntity.class, new MechanicalBearingTileEntityRenderer()); bind(MechanicalBearingTileEntity.class, new MechanicalBearingTileEntityRenderer());
bind(DrillTileEntity.class, new KineticTileEntityRenderer());
bind(CrushingWheelTileEntity.class, new KineticTileEntityRenderer()); bind(CrushingWheelTileEntity.class, new KineticTileEntityRenderer());
bind(WaterWheelTileEntity.class, new KineticTileEntityRenderer()); bind(WaterWheelTileEntity.class, new KineticTileEntityRenderer());
bind(RedstoneBridgeTileEntity.class, new LinkedTileEntityRenderer()); bind(RedstoneBridgeTileEntity.class, new LinkedTileEntityRenderer());
@ -179,6 +180,7 @@ public enum AllTileEntities {
bind(FlexpeaterTileEntity.class, new FlexpeaterTileEntityRenderer()); bind(FlexpeaterTileEntity.class, new FlexpeaterTileEntityRenderer());
bind(LogisticalControllerTileEntity.class, new LogisticalControllerTileEntityRenderer()); bind(LogisticalControllerTileEntity.class, new LogisticalControllerTileEntityRenderer());
bind(LogisticiansTableTileEntity.class, new LogisticiansTableTileEntityRenderer()); bind(LogisticiansTableTileEntity.class, new LogisticiansTableTileEntityRenderer());
bind(HarvesterTileEntity.class, new HarvesterTileEntityRenderer());
} }
@OnlyIn(Dist.CLIENT) @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.Direction.Axis;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.model.animation.Animation; import net.minecraftforge.client.model.animation.Animation;
import net.minecraftforge.client.model.animation.TileEntityRendererFast; import net.minecraftforge.client.model.animation.TileEntityRendererFast;
@ -32,7 +33,7 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
protected static Map<BlockState, BufferManipulator> cachedBuffers; protected static Map<BlockState, BufferManipulator> cachedBuffers;
protected class BlockModelSpinner extends BufferManipulator { protected static class BlockModelSpinner extends BufferManipulator {
public BlockModelSpinner(ByteBuffer original) { public BlockModelSpinner(ByteBuffer original) {
super(original); super(original);
@ -50,7 +51,7 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
x = getX(original, vertex) - .5f; x = getX(original, vertex) - .5f;
y = getY(original, vertex) - .5f; y = getY(original, vertex) - .5f;
z = getZ(original, vertex) - .5f; z = getZ(original, vertex) - .5f;
putPos(mutable, vertex, rotateX(x, y, z, sin, cos, axis) + .5f + xIn, 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); rotateY(x, y, z, sin, cos, axis) + .5f + yIn, rotateZ(x, y, z, sin, cos, axis) + .5f + zIn);
putLight(mutable, vertex, packedLightCoords); putLight(mutable, vertex, packedLightCoords);
@ -69,7 +70,7 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
int destroyStage, BufferBuilder buffer) { int destroyStage, BufferBuilder buffer) {
final BlockState state = getRenderedBlockState(te); final BlockState state = getRenderedBlockState(te);
cacheIfMissing(state, BlockModelSpinner::new); cacheIfMissing(state, getWorld(), BlockModelSpinner::new);
final BlockPos pos = te.getPos(); final BlockPos pos = te.getPos();
Axis axis = ((IRotate) te.getBlockState().getBlock()).getRotationAxis(te.getBlockState()); 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 offset = getRotationOffsetForPosition(te, pos, axis);
float angle = (float) (((time * te.getSpeed() + offset) % 360) / 180 * (float) Math.PI); 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, protected static void renderFromCache(BufferBuilder buffer, BlockState state, World world, float x, float y,
Axis axis, float angle) { float z, BlockPos pos, Axis axis, float angle) {
int packedLightmapCoords = state.getPackedLightmapCoords(getWorld(), pos); int packedLightmapCoords = state.getPackedLightmapCoords(world, pos);
buffer.putBulkData(((BlockModelSpinner) cachedBuffers.get(state)).getTransformed(x, y, z, angle, axis, buffer.putBulkData(((BlockModelSpinner) getBuffer(state)).getTransformed(x, y, z, angle, axis,
packedLightmapCoords)); 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)) { if (!cachedBuffers.containsKey(state)) {
BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher();
BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer(); BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer();
@ -97,7 +103,7 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
builder.setTranslation(0, 1, 0); builder.setTranslation(0, 1, 0);
builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); 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); EmptyModelData.INSTANCE);
builder.finishDrawing(); builder.finishDrawing();
@ -123,5 +129,5 @@ public class KineticTileEntityRenderer extends TileEntityRendererFast<KineticTil
if (cachedBuffers != null) if (cachedBuffers != null)
cachedBuffers.clear(); cachedBuffers.clear();
} }
} }

View file

@ -2,23 +2,22 @@ package com.simibubi.create.modules.contraptions.receivers;
import java.util.List; 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.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.IHaveMovementBehavior;
import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalPistonTileEntity;
import com.simibubi.create.modules.contraptions.relays.ShaftBlock; import com.simibubi.create.modules.contraptions.relays.ShaftBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.DirectionalBlock;
import net.minecraft.block.material.PushReaction; import net.minecraft.block.material.PushReaction;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.StateContainer.Builder;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos; 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.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.util.math.shapes.VoxelShapes;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld; 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), 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_X = VoxelShapes.or(CORE_SHAPE, ShaftBlock.AXIS_X),
DRILL_SHAPE_Y = VoxelShapes.or(CORE_SHAPE, ShaftBlock.AXIS_Y), DRILL_SHAPE_Y = VoxelShapes.or(CORE_SHAPE, ShaftBlock.AXIS_Y),
DRILL_SHAPE_Z = VoxelShapes.or(CORE_SHAPE, ShaftBlock.AXIS_Z); DRILL_SHAPE_Z = VoxelShapes.or(CORE_SHAPE, ShaftBlock.AXIS_Z);
public static final BooleanProperty FIXATED = BooleanProperty.create("fixated");
public DrillBlock() { public DrillBlock() {
super(Properties.from(Blocks.IRON_BLOCK)); 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 @Override
public boolean hasTileEntity(BlockState state) { public boolean hasTileEntity(BlockState state) {
return !state.get(FIXATED); return true;
} }
@Override @Override
@ -75,6 +67,12 @@ public class DrillBlock extends DirectionalKineticBlock implements IHaveMovement
return CORE_SHAPE; 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 @Override
public Axis getRotationAxis(BlockState state) { public Axis getRotationAxis(BlockState state) {
return state.get(FACING).getAxis(); return state.get(FACING).getAxis();
@ -82,78 +80,42 @@ public class DrillBlock extends DirectionalKineticBlock implements IHaveMovement
@Override @Override
public boolean hasShaftTowards(World world, BlockPos pos, BlockState state, Direction face) { public boolean hasShaftTowards(World world, BlockPos pos, BlockState state, Direction face) {
return !state.get(FIXATED) && face == state.get(FACING).getOpposite(); return 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;
} }
@Override @Override
public PushReaction getPushReaction(BlockState state) { public PushReaction getPushReaction(BlockState state) {
return state.get(FIXATED) ? PushReaction.NORMAL : PushReaction.BLOCK; return PushReaction.PUSH_ONLY;
}
@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;
} }
@Override @Override
protected boolean hasStaticPart() { protected boolean hasStaticPart() {
return false; return true;
} }
@Override @Override
public IMovementContext visitPosition(World world, BlockPos pos, BlockState block, Direction movement, @OnlyIn(value = Dist.CLIENT)
MechanicalPistonTileEntity piston) { public void renderInConstruct(MovementContext context, double x, double y, double z, BufferBuilder buffer) {
IMovementContext context = IdleMovementContext.INSTANCE; DrillTileEntityRenderer.renderInConstruct(context, x, y, z, buffer);
}
if (movement != block.get(FACING))
return context;
@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); pos = pos.offset(movement);
BlockState stateVisited = world.getBlockState(pos); BlockState stateVisited = world.getBlockState(pos);
if (stateVisited.getCollisionShape(world, pos).isEmpty()) if (stateVisited.getCollisionShape(world, pos).isEmpty())
return context; return;
if (stateVisited.getBlockHardness(world, pos) == -1) if (stateVisited.getBlockHardness(world, pos) == -1)
return context; return;
world.playEvent(2001, pos, Block.getStateId(stateVisited)); world.playEvent(2001, pos, Block.getStateId(stateVisited));
List<ItemStack> drops = Block.getDrops(stateVisited, (ServerWorld) world, pos, null); 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)); new Vec3d(movement.getDirectionVec()).add(0, 0.5f, 0).scale(world.rand.nextFloat() * .3f));
world.addEntity(itemEntity); 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 java.util.List;
import com.simibubi.create.AllBlocks; 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.IHaveMovementBehavior;
import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalPistonTileEntity;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -12,6 +12,8 @@ import net.minecraft.block.Blocks;
import net.minecraft.block.CropsBlock; import net.minecraft.block.CropsBlock;
import net.minecraft.block.HorizontalBlock; import net.minecraft.block.HorizontalBlock;
import net.minecraft.block.SugarCaneBlock; 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.entity.item.ItemEntity;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@ -19,6 +21,7 @@ import net.minecraft.state.IProperty;
import net.minecraft.state.IntegerProperty; import net.minecraft.state.IntegerProperty;
import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -30,6 +33,8 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld; import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.IPlantable;
public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBehavior { public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBehavior {
@ -42,6 +47,21 @@ public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBeha
super(Properties.from(Blocks.IRON_BLOCK)); 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 @Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
Direction direction = state.get(HORIZONTAL_FACING); Direction direction = state.get(HORIZONTAL_FACING);
@ -63,6 +83,12 @@ public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBeha
builder.add(HORIZONTAL_FACING); builder.add(HORIZONTAL_FACING);
super.fillStateContainer(builder); 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 @Override
public BlockRenderLayer getRenderLayer() { public BlockRenderLayer getRenderLayer() {
@ -93,12 +119,14 @@ public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBeha
} }
@Override @Override
public IMovementContext visitPosition(World world, BlockPos pos, BlockState block, Direction movement, public void visitPosition(MovementContext context) {
MechanicalPistonTileEntity piston) { Direction movement = context.getMovementDirection();
IMovementContext context = IdleMovementContext.INSTANCE; World world = context.world;
BlockState block = context.state;
BlockPos pos = context.currentGridPos;
if (movement != block.get(HORIZONTAL_FACING)) if (movement != block.get(HORIZONTAL_FACING))
return context; return;
BlockState stateVisited = world.getBlockState(pos); BlockState stateVisited = world.getBlockState(pos);
boolean notCropButCuttable = false; boolean notCropButCuttable = false;
@ -113,7 +141,7 @@ public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBeha
if (isValidOther(world, pos, stateVisited)) if (isValidOther(world, pos, stateVisited))
notCropButCuttable = true; notCropButCuttable = true;
else else
return context; return;
} }
List<ItemStack> drops = Block.getDrops(stateVisited, (ServerWorld) world, pos, null); 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)); new Vec3d(movement.getDirectionVec()).add(0, 0.5f, 0).scale(world.rand.nextFloat() * .3f));
world.addEntity(itemEntity); world.addEntity(itemEntity);
} }
return context;
} }
private boolean isValidCrop(World world, BlockPos pos, BlockState state) { private boolean isValidCrop(World world, BlockPos pos, BlockState state) {
@ -201,4 +227,23 @@ public class HarvesterBlock extends HorizontalBlock implements IHaveMovementBeha
return Blocks.AIR.getDefaultState(); 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); super.renderTileEntityFast(te, x, y, z, partialTicks, destroyStage, buffer);
final BlockState state = getRenderedHeadBlockState(te); final BlockState state = getRenderedHeadBlockState(te);
cacheIfMissing(state, HeadTranslator::new); cacheIfMissing(state, getWorld(), HeadTranslator::new);
final BlockPos pos = te.getPos(); final BlockPos pos = te.getPos();

View file

@ -1,15 +1,21 @@
package com.simibubi.create.modules.contraptions.receivers.constructs; package com.simibubi.create.modules.contraptions.receivers.constructs;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public interface IHaveMovementBehavior { public interface IHaveMovementBehavior {
default IMovementContext visitPosition(World world, BlockPos pos, BlockState block, Direction movement, public enum MoverType {
MechanicalPistonTileEntity piston) { PISTON, BEARING, MINECART;
return IdleMovementContext.INSTANCE; }
default void visitPosition(MovementContext context) {
} }
default void tick(MechanicalPistonTileEntity piston) { default void tick(MechanicalPistonTileEntity piston) {
@ -19,14 +25,32 @@ public interface IHaveMovementBehavior {
return false; return false;
} }
public interface IMovementContext { public class MovementContext {
default boolean isBlocking() {
return false; 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 { @OnlyIn(value = Dist.CLIENT)
public static IdleMovementContext INSTANCE = new IdleMovementContext(); 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, BlockState capState = AllBlocks.MECHANICAL_BEARING_TOP.get().getDefaultState().with(BlockStateProperties.FACING,
facing); facing);
cacheIfMissing(shaftState, BlockModelSpinner::new); cacheIfMissing(shaftState, getWorld(), BlockModelSpinner::new);
cacheIfMissing(capState, BlockModelSpinner::new); cacheIfMissing(capState, getWorld(), BlockModelSpinner::new);
float offset = getRotationOffsetForPosition(te, pos, facing.getAxis()); float offset = getRotationOffsetForPosition(te, pos, facing.getAxis());
float angle = (time * te.getSpeed()) % 360; float angle = (time * te.getSpeed()) % 360;
@ -55,8 +55,9 @@ public class MechanicalBearingTileEntityRenderer extends KineticTileEntityRender
angle = angle / 180f * (float) Math.PI; angle = angle / 180f * (float) Math.PI;
float interpolatedAngle = bearingTe.getInterpolatedAngle(partialTicks); float interpolatedAngle = bearingTe.getInterpolatedAngle(partialTicks);
renderFromCache(buffer, shaftState, (float) x, (float) y, (float) z, pos, facing.getAxis(), angle); renderFromCache(buffer, shaftState, getWorld(), (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, capState, getWorld(), (float) x, (float) y, (float) z, pos, facing.getAxis(),
interpolatedAngle);
if (!bearingTe.running) if (!bearingTe.running)
return; return;
@ -110,7 +111,7 @@ public class MechanicalBearingTileEntityRenderer extends KineticTileEntityRender
return AllBlocks.SHAFT.block.getDefaultState().with(BlockStateProperties.AXIS, return AllBlocks.SHAFT.block.getDefaultState().with(BlockStateProperties.AXIS,
((IRotate) te.getBlockState().getBlock()).getRotationAxis(te.getBlockState())); ((IRotate) te.getBlockState().getBlock()).getRotationAxis(te.getBlockState()));
} }
public static void invalidateCache() { public static void invalidateCache() {
if (cachedConstructs != null) if (cachedConstructs != null)
cachedConstructs.invalidateAll(); cachedConstructs.invalidateAll();

View file

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

View file

@ -3,6 +3,7 @@ package com.simibubi.create.modules.contraptions.receivers.constructs;
import java.util.Random; import java.util.Random;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import com.google.common.cache.Cache; 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.IRotate;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer; 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.block.BlockState;
import net.minecraft.client.Minecraft; 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.model.IBakedModel;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.gen.feature.template.Template.BlockInfo; import net.minecraft.world.gen.feature.template.Template.BlockInfo;
import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.EmptyModelData;
@ -43,6 +46,17 @@ public class MechanicalPistonTileEntityRenderer extends KineticTileEntityRendere
cacheConstructIfMissing(pistonTe.movingConstruct); cacheConstructIfMissing(pistonTe.movingConstruct);
renderConstructFromCache(pistonTe.movingConstruct, pistonTe, x, y, z, partialTicks, buffer); 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, return AllBlocks.SHAFT.block.getDefaultState().with(BlockStateProperties.AXIS,
((IRotate) te.getBlockState().getBlock()).getRotationAxis(te.getBlockState())); ((IRotate) te.getBlockState().getBlock()).getRotationAxis(te.getBlockState()));
} }
public static void invalidateCache() { public static void invalidateCache() {
if (cachedConstructs != null) if (cachedConstructs != null)
cachedConstructs.invalidateAll(); 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.util.math.shapes.VoxelShape;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber @EventBusSubscriber
@ -53,14 +55,14 @@ public class MovingConstructHandler {
Vec3d movementVec = new Vec3d(te.getBlockState().get(BlockStateProperties.FACING).getDirectionVec()); Vec3d movementVec = new Vec3d(te.getBlockState().get(BlockStateProperties.FACING).getDirectionVec());
TranslationConstruct construct = te.movingConstruct; TranslationConstruct construct = te.movingConstruct;
if (world.isRemote) { // if (world.isRemote) {
renderedBBs.clear(); // renderedBBs.clear();
// if (construct.collisionBoxFront != null) // if (construct.pistonCollisionBox != null)
// renderedBBs.add(construct.collisionBoxFront.offset(te.getConstructOffset(0))); // renderedBBs.add(construct.pistonCollisionBox.offset(te.getConstructOffset(0)));
// if (construct.collisionBoxBack != null) // if (construct.constructCollisionBox != null)
// renderedBBs.add(construct.collisionBoxBack.offset(te.getConstructOffset(0))); // renderedBBs.add(construct.constructCollisionBox.offset(te.getConstructOffset(0)));
//
} // }
if (construct.getCollisionBoxFront() != null) { if (construct.getCollisionBoxFront() != null) {
AxisAlignedBB constructBB = construct.getCollisionBoxFront().offset(te.getConstructOffset(0)).grow(.5f); AxisAlignedBB constructBB = construct.getCollisionBoxFront().offset(te.getConstructOffset(0)).grow(.5f);
@ -164,8 +166,8 @@ public class MovingConstructHandler {
return movingPistons.get(mechanicalPistonTileEntity.getWorld()); return movingPistons.get(mechanicalPistonTileEntity.getWorld());
} }
// @SubscribeEvent @SubscribeEvent
// public static void onRenderWorld(RenderWorldLastEvent event) { public static void onRenderWorld(RenderWorldLastEvent event) {
// for (AxisAlignedBB bb : renderedBBs) { // for (AxisAlignedBB bb : renderedBBs) {
// TessellatorHelper.prepareForDrawing(); // TessellatorHelper.prepareForDrawing();
// GlStateManager.disableTexture(); // GlStateManager.disableTexture();
@ -177,6 +179,6 @@ public class MovingConstructHandler {
// GlStateManager.enableTexture(); // GlStateManager.enableTexture();
// TessellatorHelper.cleanUpAfterDrawing(); // TessellatorHelper.cleanUpAfterDrawing();
// } // }
// } }
} }

View file

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

View file

@ -101,16 +101,22 @@ public class ContactBlock extends ProperDirectionalBlock implements IHaveMovemen
} }
@Override @Override
public IMovementContext visitPosition(World world, BlockPos pos, BlockState block, Direction movement, public void visitPosition(MovementContext context) {
MechanicalPistonTileEntity piston) { BlockState block = context.state;
World world = context.world;
BlockPos pos = context.currentGridPos;
Direction direction = block.get(FACING); Direction direction = block.get(FACING);
if (!hasValidContact(world, pos, direction)) 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.setBlockState(pos.offset(direction), world.getBlockState(pos.offset(direction)).with(POWERED, true));
world.getPendingBlockTicks().scheduleTick(pos.offset(direction), this, ticksToStayActive, TickPriority.NORMAL); 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; continue;
BlockState state = defaultState.with(BlockStateProperties.FACING, direction); BlockState state = defaultState.with(BlockStateProperties.FACING, direction);
cacheIfMissing(state, BlockModelSpinner::new); cacheIfMissing(state, getWorld(), BlockModelSpinner::new);
float offset = getRotationOffsetForPosition(te, pos, axis); float offset = getRotationOffsetForPosition(te, pos, axis);
float angle = (time * te.getSpeed()) % 360; float angle = (time * te.getSpeed()) % 360;
@ -48,7 +48,7 @@ public class GearboxTileEntityRenderer extends KineticTileEntityRenderer {
angle += offset; angle += offset;
angle = angle / 180f * (float) Math.PI; 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; continue;
BlockState state = defaultState.with(BlockStateProperties.FACING, direction); BlockState state = defaultState.with(BlockStateProperties.FACING, direction);
cacheIfMissing(state, BlockModelSpinner::new); cacheIfMissing(state, getWorld(), BlockModelSpinner::new);
float offset = getRotationOffsetForPosition(te, pos, axis); float offset = getRotationOffsetForPosition(te, pos, axis);
float angle = (time * te.getSpeed()) % 360; float angle = (time * te.getSpeed()) % 360;
@ -42,7 +42,7 @@ public class SplitShaftTileEntityRenderer extends KineticTileEntityRenderer {
angle += offset; angle += offset;
angle = angle / 180f * (float) Math.PI; 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()) if (beltEntity.hasPulley())
super.renderTileEntityFast(te, x, y, z, partialTicks, destroyStage, buffer); 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); renderBeltFromCache(beltEntity, (float) x, (float) y, (float) z, buffer);
} }

View file

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

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": { "variants": {
"facing=north": { "model": "create:block/harvester", "y": 180 }, "facing": {
"facing=south": { "model": "create:block/harvester" }, "north": { "y": 180 },
"facing=east": { "model": "create:block/harvester", "y": 270 }, "south": {},
"facing=west": { "model": "create:block/harvester", "y": 90 } "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, "forge_marker": 1,
"variants": { "defaults": {
"axis=x,sticky_top=false,sticky_bottom=false": { "model": "create:block/translation_chassis", "x": 90, "y": 90 }, "model": "block/cube_bottom_top",
"axis=x,sticky_top=true,sticky_bottom=false": { "model": "create:block/translation_chassis_top_sticky", "x": 90, "y": 90 }, "textures": {
"axis=x,sticky_top=false,sticky_bottom=true": { "model": "create:block/translation_chassis_bottom_sticky", "x": 90, "y": 90 }, "side": "create:block/translation_chassis_side"
"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" }, "transform": "forge:default-block"
"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" }, "variants": {
"axis=y,sticky_top=true,sticky_bottom=true": { "model": "create:block/translation_chassis_both_sticky" }, "axis": {
"axis=z,sticky_top=false,sticky_bottom=false": { "model": "create:block/translation_chassis", "x": 90, "y": 180 }, "x": { "x": 90, "y": 90 },
"axis=z,sticky_top=true,sticky_bottom=false": { "model": "create:block/translation_chassis_top_sticky", "x": 90, "y": 180 }, "y": { },
"axis=z,sticky_top=false,sticky_bottom=true": { "model": "create:block/translation_chassis_bottom_sticky", "x": 90, "y": 180 }, "z": { "x": 90, "y": 180 }
"axis=z,sticky_top=true,sticky_bottom=true": { "model": "create:block/translation_chassis_both_sticky", "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, "forge_marker": 1,
"defaults": { "defaults": {
"textures": { "model": "block/cube_bottom_top",
"side": "create:block/translation_chassis_side_alt" "textures": {
} "side": "create:block/translation_chassis_side_alt"
}, },
"variants": { "transform": "forge:default-block"
"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 }, "variants": {
"axis=x,sticky_top=false,sticky_bottom=true": { "model": "create:block/translation_chassis_bottom_sticky", "x": 90, "y": 90 }, "axis": {
"axis=x,sticky_top=true,sticky_bottom=true": { "model": "create:block/translation_chassis_both_sticky", "x": 90, "y": 90 }, "x": { "x": 90, "y": 90 },
"axis=y,sticky_top=false,sticky_bottom=false": { "model": "create:block/translation_chassis" }, "y": { },
"axis=y,sticky_top=true,sticky_bottom=false": { "model": "create:block/translation_chassis_top_sticky" }, "z": { "x": 90, "y": 180 }
"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" }, "sticky_top": {
"axis=z,sticky_top=false,sticky_bottom=false": { "model": "create:block/translation_chassis", "x": 90, "y": 180 }, "false": {
"axis=z,sticky_top=true,sticky_bottom=false": { "model": "create:block/translation_chassis_top_sticky", "x": 90, "y": 180 }, "textures": {
"axis=z,sticky_top=false,sticky_bottom=true": { "model": "create:block/translation_chassis_bottom_sticky", "x": 90, "y": 180 }, "top": "create:block/translation_chassis_top"
"axis=z,sticky_top=true,sticky_bottom=true": { "model": "create:block/translation_chassis_both_sticky", "x": 90, "y": 180 } }
} },
"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/)", "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"parent": "block/cube",
"textures": { "textures": {
"particle": "block/anvil", "gearbox_top": "create:block/gearbox_top",
"0": "create:block/axis_top", "anvil": "minecraft:block/anvil",
"1": "create:block/axis", "gearbox": "create:block/gearbox",
"2": "block/anvil", "axis_top": "create:block/axis_top",
"3": "block/smooth_stone", "axis": "create:block/axis",
"4": "block/polished_andesite" "andesite_casing_short": "create:block/andesite_casing_short"
}, },
"elements": [ "elements": [
{ {
"name": "Axle", "name": "Drill",
"from": [ 6.0, 6.0, 0.0 ], "from": [ 4, 4, 11 ],
"to": [ 10.0, 10.0, 4.0 ], "to": [ 12, 12, 13 ],
"shade": false,
"faces": { "faces": {
"north": { "texture": "#0", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, "north": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"east": { "texture": "#1", "uv": [ 6.0, 12.0, 10.0, 16.0 ], "rotation": 90 }, "east": { "texture": "#anvil", "uv": [ 10, 5, 12, 13 ] },
"west": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 4.0 ], "rotation": 270 }, "south": { "texture": "#anvil", "uv": [ 3, 3, 11, 11 ] },
"up": { "texture": "#1", "uv": [ 6.0, 12.0, 10.0, 16.0 ] }, "west": { "texture": "#anvil", "uv": [ 8, 4, 10, 12 ] },
"down": { "texture": "#1", "uv": [ 6.0, 0.0, 10.0, 4.0 ], "rotation": 180 } "up": { "texture": "#anvil", "uv": [ 5, 5, 13, 7 ] },
"down": { "texture": "#anvil", "uv": [ 4, 3, 12, 5 ] }
} }
}, },
{ {
"name": "Core", "name": "Drill",
"from": [ 5.0, 5.0, 4.0 ], "from": [ 5, 5, 13 ],
"to": [ 11.0, 11.0, 12.0 ], "to": [ 11, 11, 15 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 45.0 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 22.5 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 6.0 ] }, "north": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 6.0 ] }, "east": { "texture": "#anvil", "uv": [ 10, 5, 12, 11 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 6.0 ] }, "south": { "texture": "#anvil", "uv": [ 3, 3, 9, 9 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 6.0 ] }, "west": { "texture": "#anvil", "uv": [ 8, 4, 10, 10 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 8.0 ] }, "up": { "texture": "#anvil", "uv": [ 5, 5, 11, 7 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 8.0 ] } "down": { "texture": "#anvil", "uv": [ 4, 3, 10, 5 ] }
} }
}, },
{ {
"name": "Top", "name": "Drill",
"from": [ 6.0, 11.0, 7.0 ], "from": [ 6, 6, 15 ],
"to": [ 10.0, 13.0, 13.0 ], "to": [ 10, 10, 17 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": 45.0 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 2.0 ] }, "north": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 2.0 ] }, "east": { "texture": "#anvil", "uv": [ 10, 5, 12, 9 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 2.0 ] }, "south": { "texture": "#anvil", "uv": [ 3, 3, 7, 7 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 2.0 ] }, "west": { "texture": "#anvil", "uv": [ 8, 4, 10, 8 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 6.0 ] }, "up": { "texture": "#anvil", "uv": [ 5, 5, 9, 7 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 6.0 ] } "down": { "texture": "#anvil", "uv": [ 4, 3, 8, 5 ] }
} }
}, },
{ {
"name": "Bottom", "name": "Drill",
"from": [ 6.0, 3.0, 7.0 ], "from": [ 7, 7, 17 ],
"to": [ 10.0, 5.0, 13.0 ], "to": [ 9, 9, 19 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "z", "angle": -22.5 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 2.0 ] }, "north": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 2.0 ] }, "east": { "texture": "#anvil", "uv": [ 10, 5, 12, 7 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 2.0 ] }, "south": { "texture": "#anvil", "uv": [ 3, 3, 5, 5 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 2.0 ] }, "west": { "texture": "#anvil", "uv": [ 8, 4, 10, 6 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 6.0 ] }, "up": { "texture": "#anvil", "uv": [ 5, 5, 7, 7 ] },
"down": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 6.0 ] } "down": { "texture": "#anvil", "uv": [ 4, 3, 6, 5 ] }
} }
}, },
{ {
"name": "Left", "name": "Shaft",
"from": [ 3.0, 6.0, 7.0 ], "from": [ 6, 6, 0 ],
"to": [ 5.0, 10.0, 13.0 ], "to": [ 10, 10, 11 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": -22.5 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 4.0 ] }, "north": { "texture": "#axis_top", "uv": [ 6, 6, 10, 10 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 4.0 ] }, "east": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ], "rotation": 90 },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 4.0 ] }, "west": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ], "rotation": 270 },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 6.0, 4.0 ] }, "up": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 2.0, 6.0 ] }, "down": { "texture": "#axis", "uv": [ 6, 0, 10, 11 ] }
"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 }
} }
} }
] ]

View file

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