The Millstone

- Added Millstone
- Added Milling recipe type
- Crushing wheels can apply milling recipes
- Added a command for clearing the buffer cache
- Any cog-containing machine can now connect to large cogwheels
- Added French localization by Kiro
- Removed unused lang entries
This commit is contained in:
simibubi 2020-03-26 23:03:56 +01:00
parent 30bb98468f
commit c3f781b762
78 changed files with 2212 additions and 136 deletions

View File

@ -67,6 +67,7 @@ public enum AllBlockPartials {
ROPE_COIL("pulley/rope_coil"),
ROPE_HALF("pulley/rope_half"),
ROPE_HALF_MAGNET("pulley/rope_half_magnet"),
MILL_STONE_COG("millstone/inner"),
;

View File

@ -31,6 +31,7 @@ import com.simibubi.create.modules.contraptions.components.fan.EncasedFanBlock;
import com.simibubi.create.modules.contraptions.components.fan.NozzleBlock;
import com.simibubi.create.modules.contraptions.components.flywheel.FlywheelBlock;
import com.simibubi.create.modules.contraptions.components.flywheel.engine.FurnaceEngineBlock;
import com.simibubi.create.modules.contraptions.components.millstone.MillstoneBlock;
import com.simibubi.create.modules.contraptions.components.mixer.MechanicalMixerBlock;
import com.simibubi.create.modules.contraptions.components.motor.MotorBlock;
import com.simibubi.create.modules.contraptions.components.press.MechanicalPressBlock;
@ -131,6 +132,7 @@ public enum AllBlocks {
CUCKOO_CLOCK(new CuckooClockBlock(false)),
MYSTERIOUS_CUCKOO_CLOCK(new CuckooClockBlock(true)),
MILLSTONE(new MillstoneBlock()),
CRUSHING_WHEEL(new CrushingWheelBlock()),
CRUSHING_WHEEL_CONTROLLER(new CrushingWheelControllerBlock()),
MECHANICAL_PRESS(new MechanicalPressBlock()),

View File

@ -7,6 +7,7 @@ import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.components.crafter.MechanicalCraftingRecipe;
import com.simibubi.create.modules.contraptions.components.crusher.CrushingRecipe;
import com.simibubi.create.modules.contraptions.components.fan.SplashingRecipe;
import com.simibubi.create.modules.contraptions.components.millstone.MillingRecipe;
import com.simibubi.create.modules.contraptions.components.mixer.MixingRecipe;
import com.simibubi.create.modules.contraptions.components.press.PressingRecipe;
import com.simibubi.create.modules.contraptions.components.saw.CuttingRecipe;
@ -30,6 +31,7 @@ public enum AllRecipes {
BLOCKZAPPER_UPGRADE(BlockzapperUpgradeRecipe.Serializer::new, IRecipeType.CRAFTING),
MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new),
CRUSHING(processingSerializer(CrushingRecipe::new)),
MILLING(processingSerializer(MillingRecipe::new)),
SPLASHING(processingSerializer(SplashingRecipe::new)),
PRESSING(processingSerializer(PressingRecipe::new)),
CUTTING(processingSerializer(CuttingRecipe::new)),

View File

@ -34,6 +34,8 @@ import com.simibubi.create.modules.contraptions.components.flywheel.FlywheelRend
import com.simibubi.create.modules.contraptions.components.flywheel.FlywheelTileEntity;
import com.simibubi.create.modules.contraptions.components.flywheel.engine.EngineRenderer;
import com.simibubi.create.modules.contraptions.components.flywheel.engine.FurnaceEngineTileEntity;
import com.simibubi.create.modules.contraptions.components.millstone.MillstoneRenderer;
import com.simibubi.create.modules.contraptions.components.millstone.MillstoneTileEntity;
import com.simibubi.create.modules.contraptions.components.mixer.MechanicalMixerTileEntity;
import com.simibubi.create.modules.contraptions.components.mixer.MechanicalMixerTileEntityRenderer;
import com.simibubi.create.modules.contraptions.components.motor.MotorTileEntity;
@ -129,6 +131,8 @@ public enum AllTileEntities {
HARVESTER(HarvesterTileEntity::new, AllBlocks.HARVESTER),
FLYWHEEL(FlywheelTileEntity::new, AllBlocks.FLYWHEEL),
FURNACE_ENGINE(FurnaceEngineTileEntity::new, AllBlocks.FURNACE_ENGINE),
MILLSTONE(MillstoneTileEntity::new, AllBlocks.MILLSTONE),
CRUSHING_WHEEL(CrushingWheelTileEntity::new, AllBlocks.CRUSHING_WHEEL),
CRUSHING_WHEEL_CONTROLLER(CrushingWheelControllerTileEntity::new, AllBlocks.CRUSHING_WHEEL_CONTROLLER),
WATER_WHEEL(WaterWheelTileEntity::new, AllBlocks.WATER_WHEEL),
@ -216,6 +220,7 @@ public enum AllTileEntities {
bind(PulleyTileEntity.class, new PulleyRenderer());
bind(HarvesterTileEntity.class, new HarvesterTileEntityRenderer());
bind(MillstoneTileEntity.class, new MillstoneRenderer());
bind(CrushingWheelTileEntity.class, new KineticTileEntityRenderer());
bind(MechanicalPressTileEntity.class, new MechanicalPressTileEntityRenderer());
bind(MechanicalMixerTileEntity.class, new MechanicalMixerTileEntityRenderer());

View File

@ -108,6 +108,8 @@ public class CreateJEI implements IModPlugin {
@Override
public void registerRecipes(IRecipeRegistration registration) {
registration.addRecipes(findRecipes(AllRecipes.CRUSHING), crushingCategory.getUid());
registration.addRecipes(findRecipesByTypeExcluding(AllRecipes.MILLING.getType(), AllRecipes.CRUSHING.getType()),
crushingCategory.getUid());
registration.addRecipes(findRecipes(AllRecipes.SPLASHING), splashingCategory.getUid());
registration.addRecipes(findRecipes(AllRecipes.PRESSING), pressingCategory.getUid());
registration.addRecipes(findRecipesById(AllRecipes.BLOCKZAPPER_UPGRADE.serializer.getRegistryName()),

View File

@ -12,7 +12,7 @@ import com.simibubi.create.compat.jei.DoubleItemIcon;
import com.simibubi.create.compat.jei.EmptyBackground;
import com.simibubi.create.compat.jei.category.animations.AnimatedCrushingWheels;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.components.crusher.CrushingRecipe;
import com.simibubi.create.modules.contraptions.components.crusher.AbstractCrushingRecipe;
import com.simibubi.create.modules.contraptions.processing.ProcessingOutput;
import mezz.jei.api.constants.VanillaTypes;
@ -24,7 +24,7 @@ import mezz.jei.api.recipe.category.IRecipeCategory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class CrushingCategory implements IRecipeCategory<CrushingRecipe> {
public class CrushingCategory implements IRecipeCategory<AbstractCrushingRecipe> {
private static ResourceLocation ID = new ResourceLocation(Create.ID, "crushing");
private AnimatedCrushingWheels crushingWheels = new AnimatedCrushingWheels();
@ -47,8 +47,8 @@ public class CrushingCategory implements IRecipeCategory<CrushingRecipe> {
}
@Override
public Class<? extends CrushingRecipe> getRecipeClass() {
return CrushingRecipe.class;
public Class<? extends AbstractCrushingRecipe> getRecipeClass() {
return AbstractCrushingRecipe.class;
}
@Override
@ -62,13 +62,13 @@ public class CrushingCategory implements IRecipeCategory<CrushingRecipe> {
}
@Override
public void setIngredients(CrushingRecipe recipe, IIngredients ingredients) {
public void setIngredients(AbstractCrushingRecipe recipe, IIngredients ingredients) {
ingredients.setInputIngredients(recipe.getIngredients());
ingredients.setOutputs(VanillaTypes.ITEM, recipe.getPossibleOutputs());
}
@Override
public void setRecipe(IRecipeLayout recipeLayout, CrushingRecipe recipe, IIngredients ingredients) {
public void setRecipe(IRecipeLayout recipeLayout, AbstractCrushingRecipe recipe, IIngredients ingredients) {
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
itemStacks.init(0, true, 50, 2);
itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks()));
@ -85,7 +85,7 @@ public class CrushingCategory implements IRecipeCategory<CrushingRecipe> {
}
@Override
public void draw(CrushingRecipe recipe, double mouseX, double mouseY) {
public void draw(AbstractCrushingRecipe recipe, double mouseX, double mouseY) {
List<ProcessingOutput> results = recipe.getRollableResults();
ScreenResources.JEI_SLOT.draw(50, 2);
ScreenResources.JEI_DOWN_ARROW.draw(72, 7);

View File

@ -40,6 +40,7 @@ public class StressConfigDefaults {
case SAW:
case DEPLOYER:
case MECHANICAL_MIXER:
case MILLSTONE:
return 4;
case MECHANICAL_CRAFTER:

View File

@ -0,0 +1,27 @@
package com.simibubi.create.foundation.command;
import com.mojang.brigadier.builder.ArgumentBuilder;
import com.simibubi.create.CreateClient;
import net.minecraft.command.CommandSource;
import net.minecraft.command.Commands;
import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
public class ClearBufferCacheCommand {
static ArgumentBuilder<CommandSource, ?> register() {
return Commands.literal("clearRenderBuffers").requires(cs -> cs.hasPermissionLevel(0)).executes(ctx -> {
DistExecutor.runWhenOn(Dist.CLIENT, () -> ClearBufferCacheCommand::execute);
ctx.getSource().sendFeedback(new StringTextComponent("Cleared rendering buffers."), true);
return 1;
});
}
@OnlyIn(Dist.CLIENT)
private static void execute() {
CreateClient.bufferCache.invalidate();
}
}

View File

@ -1,6 +1,7 @@
package com.simibubi.create.foundation.command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.ArgumentBuilder;
import net.minecraft.command.CommandSource;
import net.minecraft.command.Commands;
@ -9,6 +10,12 @@ public class CreateCommand {
public CreateCommand(CommandDispatcher<CommandSource> dispatcher) {
// KillTPSCommand.register(dispatcher); Commented out for release
dispatcher.register(Commands.literal("create").then(ToggleDebugCommand.register()));
addCreateCommand(dispatcher, ToggleDebugCommand.register());
addCreateCommand(dispatcher, ClearBufferCacheCommand.register());
}
public void addCreateCommand(CommandDispatcher<CommandSource> dispatcher,
ArgumentBuilder<CommandSource, ?> register) {
dispatcher.register(Commands.literal("create").then(register));
}
}

View File

@ -29,10 +29,10 @@ public class AllShapes {
SIX_VOXEL_POLE = shape(5, 0, 5, 11, 16, 11).forAxis(),
BELT_FUNNEL = shape(3, -4, 11, 13, 8, 17).forHorizontal(SOUTH),
FUNNEL = shape(1, 1, 13, 15, 15, 17).forDirectional(SOUTH),
EXTRACTOR = shape(4, 2, 11, 12, 10, 17).forDirectional(SOUTH)
.withVerticalShapes(cuboid(4, 11, 4, 12, 17, 12)),
TRANSPOSER = shape(4, 4, -1, 12, 12, 1).add(5, 5, 0, 11, 11, 16).add(4, 4, 11, 12, 12, 17)
.forDirectional(SOUTH),
EXTRACTOR =
shape(4, 2, 11, 12, 10, 17).forDirectional(SOUTH).withVerticalShapes(cuboid(4, 11, 4, 12, 17, 12)),
TRANSPOSER =
shape(4, 4, -1, 12, 12, 1).add(5, 5, 0, 11, 11, 16).add(4, 4, 11, 12, 12, 17).forDirectional(SOUTH),
FURNACE_ENGINE = shape(1, 1, 0, 15, 15, 16).add(0, 0, 9, 16, 16, 14).forHorizontal(Direction.SOUTH),
PORTABLE_STORAGE_INTERFACE = shape(0, 0, 0, 16, 12, 16).add(3, 12, 3, 13, 16, 13).forDirectional(),
PULLEY = shape(0, 0, 0, 16, 16, 2).add(1, 1, 2, 15, 15, 14).add(0, 0, 14, 16, 16, 16).forHorizontalAxis(),
@ -57,6 +57,7 @@ public class AllShapes {
BELT_COLLISION_MASK = cuboid(0, 0, 0, 16, 19, 16),
SCHEMATICANNON_SHAPE = shape(1, 0, 1, 15, 8, 15).add(0.5, 8, 0.5, 15.5, 11, 15.5).build(),
PULLEY_MAGNET = shape(3, 0, 3, 13, 2, 13).add(FOUR_VOXEL_POLE.get(UP)).build(),
MILLSTONE = shape(0, 0, 0, 16, 6, 16).add(2, 6, 2, 14, 13, 14).add(3, 13, 3, 13, 16, 13).build(),
GAUGE_SHAPE_UP = shape(1, 0, 0, 15, 2, 16).add(2, 2, 1, 14, 14, 15).build()
;
@ -64,15 +65,16 @@ public class AllShapes {
// Internally Shared Shapes
private static final VoxelShape
PISTON_HEAD = Blocks.PISTON_HEAD.getDefaultState().with(DirectionalBlock.FACING, UP)
.with(PistonHeadBlock.SHORT, true).getShape(null, null),
PISTON_HEAD =
Blocks.PISTON_HEAD.getDefaultState().with(DirectionalBlock.FACING, UP).with(PistonHeadBlock.SHORT, true)
.getShape(null, null),
PISTON_EXTENDED = shape(CASING_12PX.get(UP)).add(FOUR_VOXEL_POLE.get(Axis.Y)).build(),
SMALL_GEAR_SHAPE = cuboid(2, 6, 2, 14, 10, 14), LARGE_GEAR_SHAPE = cuboid(0, 6, 0, 16, 10, 16),
VERTICAL_TABLET_SHAPE = cuboid(3, 1, -1, 13, 15, 3), SQUARE_TABLET_SHAPE = cuboid(2, 2, -1, 14, 14, 3),
LOGISTICS_TABLE_SLOPE = shape(0, 10, 15, 16, 14, 10.667).add(0, 12, 10.667, 16, 16, 6.333)
.add(0, 14, 6.333, 16, 18, 2).build(),
SCHEMATICS_TABLE_SLOPE = shape(0, 10, 16, 16, 14, 11).add(0, 12, 11, 16, 16, 6).add(0, 14, 6, 16, 18, 1)
.build()
LOGISTICS_TABLE_SLOPE =
shape(0, 10, 15, 16, 14, 10.667).add(0, 12, 10.667, 16, 16, 6.333).add(0, 14, 6.333, 16, 18, 2).build(),
SCHEMATICS_TABLE_SLOPE =
shape(0, 10, 16, 16, 14, 11).add(0, 12, 11, 16, 16, 6).add(0, 14, 6, 16, 18, 1).build()
;
@ -84,8 +86,8 @@ public class AllShapes {
SMALL_GEAR = shape(SMALL_GEAR_SHAPE).add(SIX_VOXEL_POLE.get(Axis.Y)).forAxis(),
LARGE_GEAR = shape(LARGE_GEAR_SHAPE).add(SIX_VOXEL_POLE.get(Axis.Y)).forAxis(),
LOGISTICAL_CONTROLLER = shape(SQUARE_TABLET_SHAPE).forDirectional(SOUTH),
REDSTONE_BRIDGE = shape(VERTICAL_TABLET_SHAPE).forDirectional(SOUTH)
.withVerticalShapes(LOGISTICAL_CONTROLLER.get(UP)),
REDSTONE_BRIDGE =
shape(VERTICAL_TABLET_SHAPE).forDirectional(SOUTH).withVerticalShapes(LOGISTICAL_CONTROLLER.get(UP)),
LOGISTICS_TABLE = shape(TABLE_POLE_SHAPE).add(LOGISTICS_TABLE_SLOPE).forHorizontal(SOUTH),
SCHEMATICS_TABLE = shape(TABLE_POLE_SHAPE).add(SCHEMATICS_TABLE_SLOPE).forDirectional(SOUTH)
@ -120,8 +122,8 @@ public class AllShapes {
}
Builder erase(double x1, double y1, double z1, double x2, double y2, double z2) {
this.shape = VoxelShapes.combineAndSimplify(shape, cuboid(x1, y1, z1, x2, y2, z2),
IBooleanFunction.ONLY_FIRST);
this.shape =
VoxelShapes.combineAndSimplify(shape, cuboid(x1, y1, z1, x2, y2, z2), IBooleanFunction.ONLY_FIRST);
return this;
}

View File

@ -1,7 +1,6 @@
package com.simibubi.create.modules.contraptions;
import static com.simibubi.create.AllBlocks.BELT;
import static com.simibubi.create.AllBlocks.COGWHEEL;
import static com.simibubi.create.AllBlocks.LARGE_COGWHEEL;
import static net.minecraft.state.properties.BlockStateProperties.AXIS;
@ -58,8 +57,8 @@ public class RotationPropagator {
alignedAxes && definitionFrom.hasShaftTowards(world, from.getPos(), stateFrom, direction)
&& definitionTo.hasShaftTowards(world, to.getPos(), stateTo, direction.getOpposite());
boolean connectedByGears = definitionFrom.hasCogsTowards(world, from.getPos(), stateFrom, direction)
&& definitionTo.hasCogsTowards(world, to.getPos(), stateTo, direction.getOpposite());
boolean connectedByGears = definitionFrom.hasIntegratedCogwheel(world, from.getPos(), stateFrom)
&& definitionTo.hasIntegratedCogwheel(world, to.getPos(), stateTo);
// Belt <-> Belt
if (from instanceof BeltTileEntity && to instanceof BeltTileEntity && !connectedByAxis) {
@ -91,10 +90,12 @@ public class RotationPropagator {
}
// Gear <-> Large Gear
if (isLargeToSmallGear(stateFrom, stateTo, diff))
return -2f;
if (isLargeToSmallGear(stateTo, stateFrom, diff))
return -.5f;
if (LARGE_COGWHEEL.typeOf(stateFrom) && definitionTo.hasIntegratedCogwheel(world, to.getPos(), stateTo))
if (isLargeToSmallGear(stateFrom, stateTo, definitionTo, diff))
return -2f;
if (LARGE_COGWHEEL.typeOf(stateTo) && definitionFrom.hasIntegratedCogwheel(world, from.getPos(), stateFrom))
if (isLargeToSmallGear(stateTo, stateFrom, definitionFrom, diff))
return -.5f;
// Gear <-> Gear
if (connectedByGears) {
@ -102,6 +103,8 @@ public class RotationPropagator {
return 0;
if (LARGE_COGWHEEL.typeOf(stateTo))
return 0;
if (direction.getAxis() == definitionFrom.getRotationAxis(stateFrom))
return 0;
if (definitionFrom.getRotationAxis(stateFrom) == definitionTo.getRotationAxis(stateTo))
return -1;
}
@ -157,11 +160,9 @@ public class RotationPropagator {
return 1;
}
private static boolean isLargeToSmallGear(BlockState from, BlockState to, BlockPos diff) {
if (!LARGE_COGWHEEL.typeOf(from) || !COGWHEEL.typeOf(to))
return false;
private static boolean isLargeToSmallGear(BlockState from, BlockState to, IRotate defTo, BlockPos diff) {
Axis axisFrom = from.get(AXIS);
if (axisFrom != to.get(AXIS))
if (axisFrom != defTo.getRotationAxis(to))
return false;
if (axisFrom.getCoordinate(diff.getX(), diff.getY(), diff.getZ()) != 0)
return false;
@ -407,8 +408,13 @@ public class RotationPropagator {
BlockState blockState = te.getBlockState();
boolean isLargeWheel = LARGE_COGWHEEL.typeOf(blockState);
if (COGWHEEL.typeOf(blockState) || isLargeWheel || BELT.typeOf(blockState)) {
Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
if (!(blockState.getBlock() instanceof IRotate))
return neighbours;
IRotate block = (IRotate) blockState.getBlock();
if (block.hasIntegratedCogwheel(te.getWorld(), te.getPos(), blockState) || isLargeWheel
|| BELT.typeOf(blockState)) {
Axis axis = block.getRotationAxis(blockState);
BlockPos.getAllInBox(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1)).forEach(offset -> {
if (!isLargeWheel && axis.getCoordinate(offset.getX(), offset.getY(), offset.getZ()) != 0)

View File

@ -118,8 +118,8 @@ public interface IRotate extends IWrenchable {
}
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face);
public boolean hasCogsTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face);
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state);
public Axis getRotationAxis(BlockState state);

View File

@ -55,7 +55,7 @@ public abstract class KineticBlock extends Block implements IRotate {
}
@Override
public boolean hasCogsTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
return false;
}

View File

@ -67,8 +67,8 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock
}
@Override
public boolean hasCogsTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return state.get(HORIZONTAL_FACING).getAxis() != face.getAxis();
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
return true;
}
@Override

View File

@ -0,0 +1,20 @@
package com.simibubi.create.modules.contraptions.components.crusher;
import java.util.List;
import com.simibubi.create.AllRecipes;
import com.simibubi.create.modules.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.modules.contraptions.processing.ProcessingOutput;
import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public abstract class AbstractCrushingRecipe extends ProcessingRecipe<RecipeWrapper> {
public AbstractCrushingRecipe(AllRecipes recipeType, ResourceLocation id, String group,
List<ProcessingIngredient> ingredients, List<ProcessingOutput> results, int processingDuration) {
super(recipeType, id, group, ingredients, results, processingDuration);
}
}

View File

@ -5,13 +5,12 @@ import java.util.List;
import com.simibubi.create.AllRecipes;
import com.simibubi.create.modules.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.modules.contraptions.processing.ProcessingOutput;
import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public class CrushingRecipe extends ProcessingRecipe<RecipeWrapper> {
public class CrushingRecipe extends AbstractCrushingRecipe {
public CrushingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) {

View File

@ -13,6 +13,7 @@ import com.simibubi.create.foundation.block.SyncedTileEntity;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.processing.ProcessingInventory;
import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
@ -172,8 +173,7 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
}
private void applyRecipe() {
Optional<CrushingRecipe> recipe =
world.getRecipeManager().getRecipe(AllRecipes.CRUSHING.getType(), wrapper, world);
Optional<ProcessingRecipe<RecipeWrapper>> recipe = findRecipe();
List<ItemStack> list = new ArrayList<>();
if (recipe.isPresent()) {
@ -194,6 +194,14 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
}
public Optional<ProcessingRecipe<RecipeWrapper>> findRecipe() {
Optional<ProcessingRecipe<RecipeWrapper>> crushingRecipe =
world.getRecipeManager().getRecipe(AllRecipes.CRUSHING.getType(), wrapper, world);
if (!crushingRecipe.isPresent())
crushingRecipe = world.getRecipeManager().getRecipe(AllRecipes.MILLING.getType(), wrapper, world);
return crushingRecipe;
}
@Override
public CompoundNBT write(CompoundNBT compound) {
if (hasEntity() && !isFrozen())
@ -222,8 +230,7 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
}
private void itemInserted(ItemStack stack) {
Optional<CrushingRecipe> recipe =
world.getRecipeManager().getRecipe(AllRecipes.CRUSHING.getType(), wrapper, world);
Optional<ProcessingRecipe<RecipeWrapper>> recipe = findRecipe();
inventory.remainingTime = recipe.isPresent() ? recipe.get().getProcessingDuration() : 100;
inventory.appliedRecipe = false;
}

View File

@ -0,0 +1,33 @@
package com.simibubi.create.modules.contraptions.components.millstone;
import java.util.List;
import com.simibubi.create.AllRecipes;
import com.simibubi.create.modules.contraptions.components.crusher.AbstractCrushingRecipe;
import com.simibubi.create.modules.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.modules.contraptions.processing.ProcessingOutput;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public class MillingRecipe extends AbstractCrushingRecipe {
public MillingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) {
super(AllRecipes.MILLING, id, group, ingredients, results, processingDuration);
}
@Override
public boolean matches(RecipeWrapper inv, World worldIn) {
if (inv.isEmpty())
return false;
return ingredients.get(0).test(inv.getStackInSlot(0));
}
@Override
protected int getMaxOutputCount() {
return 7;
}
}

View File

@ -0,0 +1,53 @@
package com.simibubi.create.modules.contraptions.components.millstone;
import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.modules.contraptions.base.KineticBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader;
public class MillstoneBlock extends KineticBlock {
public MillstoneBlock() {
super(Properties.from(Blocks.ANDESITE));
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return new MillstoneTileEntity();
}
@Override
protected boolean hasStaticPart() {
return true;
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
return AllShapes.MILLSTONE;
}
@Override
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return face == Direction.DOWN;
}
@Override
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
return true;
}
@Override
public Axis getRotationAxis(BlockState state) {
return Axis.Y;
}
}

View File

@ -0,0 +1,16 @@
package com.simibubi.create.modules.contraptions.components.millstone;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.utility.SuperByteBuffer;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
public class MillstoneRenderer extends KineticTileEntityRenderer {
@Override
protected SuperByteBuffer getRotatedModel(KineticTileEntity te) {
return CreateClient.bufferCache.renderPartial(AllBlockPartials.MILL_STONE_COG, te.getBlockState());
}
}

View File

@ -0,0 +1,175 @@
package com.simibubi.create.modules.contraptions.components.millstone;
import java.util.Optional;
import com.simibubi.create.AllRecipes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.particles.ItemParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.CombinedInvWrapper;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public class MillstoneTileEntity extends KineticTileEntity {
public ItemStackHandler inputInv;
public ItemStackHandler outputInv;
public int timer;
private MillingRecipe lastRecipe;
public MillstoneTileEntity() {
super(AllTileEntities.MILLSTONE.type);
inputInv = new ItemStackHandler(1);
outputInv = new ItemStackHandler(9);
}
@Override
public void tick() {
super.tick();
if (getSpeed() == 0)
return;
for (int i = 0; i < outputInv.getSlots(); i++)
if (outputInv.getStackInSlot(i).getCount() == outputInv.getSlotLimit(i))
return;
if (timer > 0) {
timer -= getProcessingSpeed();
if (world.isRemote) {
spawnParticles();
return;
}
if (timer <= 0)
process();
return;
}
if (inputInv.getStackInSlot(0).isEmpty())
return;
RecipeWrapper inventoryIn = new RecipeWrapper(inputInv);
if (lastRecipe == null || !lastRecipe.matches(inventoryIn, world)) {
Optional<MillingRecipe> recipe =
world.getRecipeManager().getRecipe(AllRecipes.MILLING.getType(), inventoryIn, world);
inputInv.getStackInSlot(0).shrink(1);
if (!recipe.isPresent()) {
timer = 100;
sendData();
} else {
lastRecipe = recipe.get();
timer = lastRecipe.getProcessingDuration();
sendData();
}
return;
}
timer = lastRecipe.getProcessingDuration();
sendData();
}
private void process() {
RecipeWrapper inventoryIn = new RecipeWrapper(inputInv);
ItemStack stackInSlot = inputInv.getStackInSlot(0);
stackInSlot.shrink(1);
inputInv.setStackInSlot(0, stackInSlot);
if (lastRecipe == null || !lastRecipe.matches(inventoryIn, world)) {
Optional<MillingRecipe> recipe =
world.getRecipeManager().getRecipe(AllRecipes.MILLING.getType(), inventoryIn, world);
if (!recipe.isPresent())
return;
lastRecipe = recipe.get();
}
lastRecipe.rollResults().forEach(stack -> ItemHandlerHelper.insertItemStacked(outputInv, stack, false));
sendData();
markDirty();
}
public void spawnParticles() {
ItemStack stackInSlot = inputInv.getStackInSlot(0);
if (stackInSlot.isEmpty())
return;
ItemParticleData data = new ItemParticleData(ParticleTypes.ITEM, stackInSlot);
float angle = world.rand.nextFloat() * 360;
Vec3d offset = new Vec3d(0, 0, 0.5f);
offset = VecHelper.rotate(offset, angle, Axis.Y);
Vec3d target = VecHelper.rotate(offset, getSpeed() > 0 ? 25 : -25, Axis.Y);
Vec3d center = offset.add(VecHelper.getCenterOf(pos));
target = VecHelper.offsetRandomly(target.subtract(offset), world.rand, 1 / 128f);
world.addParticle(data, center.x, center.y, center.z, target.x, target.y, target.z);
}
@Override
public CompoundNBT write(CompoundNBT compound) {
compound.putInt("Timer", timer);
compound.put("InputInventory", inputInv.serializeNBT());
compound.put("OutputInventory", outputInv.serializeNBT());
return super.write(compound);
}
@Override
public void read(CompoundNBT compound) {
timer = compound.getInt("Timer");
inputInv.deserializeNBT(compound.getCompound("InputInventory"));
outputInv.deserializeNBT(compound.getCompound("OutputInventory"));
super.read(compound);
}
public int getProcessingSpeed() {
return MathHelper.clamp((int) Math.abs(getSpeed() / 16f), 1, 512);
}
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
return LazyOptional.of(MillstoneInventoryHandler::new).cast();
return super.getCapability(cap, side);
}
private class MillstoneInventoryHandler extends CombinedInvWrapper {
public MillstoneInventoryHandler() {
super(inputInv, outputInv);
}
@Override
public boolean isItemValid(int slot, ItemStack stack) {
if (outputInv == getHandlerFromIndex(getIndexForSlot(slot)))
return false;
return super.isItemValid(slot, stack);
}
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
if (outputInv == getHandlerFromIndex(getIndexForSlot(slot)))
return stack;
return super.insertItem(slot, stack, simulate);
}
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate) {
if (inputInv == getHandlerFromIndex(getIndexForSlot(slot)))
return ItemStack.EMPTY;
return super.extractItem(slot, amount, simulate);
}
}
}

View File

@ -66,8 +66,8 @@ public class MechanicalMixerBlock extends KineticBlock
}
@Override
public boolean hasCogsTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return face.getAxis().isHorizontal();
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
return true;
}
@Override

View File

@ -64,7 +64,7 @@ public class CogWheelBlock extends ShaftBlock implements IHaveCustomBlockItem {
}
if (!(block instanceof IRotate)
|| !(((IRotate) block).hasCogsTowards(world, placedOnPos, placedAgainst, context.getFace()))) {
|| !(((IRotate) block).hasIntegratedCogwheel(world, placedOnPos, placedAgainst))) {
Axis preferredAxis = getPreferredAxis(context);
if (preferredAxis != null)
return this.getDefaultState().with(AXIS, preferredAxis);
@ -91,8 +91,8 @@ public class CogWheelBlock extends ShaftBlock implements IHaveCustomBlockItem {
// IRotate
@Override
public boolean hasCogsTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return !isLarge && face.getAxis() != state.get(AXIS);
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
return !isLarge;
}
@Override

View File

@ -0,0 +1,5 @@
{
"variants": {
"": { "model": "create:block/millstone/casing" }
}
}

View File

@ -16,7 +16,6 @@
"item.create.goggles": "Engineer's Goggles",
"item.create.filter": "Filter",
"item.create.property_filter": "Attribute Filter",
"item.create.logistical_filter": "Address Filter",
"item.create.rose_quartz": "Rose Quartz",
"item.create.polished_rose_quartz": "Polished Rose Quartz",
"item.create.refined_radiance": "Refined Radiance",
@ -53,13 +52,6 @@
"item.create.electron_tube": "Electron Tube",
"item.create.integrated_circuit": "Integrated Circuit",
"item.create.logistical_controller_supply": "Item Supply",
"item.create.logistical_controller_request": "Item Request",
"item.create.logistical_controller_storage": "Item Storage",
"item.create.logistical_controller_calculation": "Ingredient Calculator",
"item.create.logistical_controller_transactions": "Task Manager",
"item.create.logistical_dial": "Logistical Dial",
"item.create.blazing_pickaxe": "Blazing Pickaxe",
"item.create.blazing_shovel": "Blazing Shovel",
"item.create.blazing_axe": "Blazing Axe",
@ -101,6 +93,7 @@
"block.create.cuckoo_clock": "Cuckoo Clock",
"block.create.creative_motor": "Motor",
"block.create.belt": "Mechanical Belt",
"block.create.millstone": "Millstone",
"block.create.crushing_wheel": "Crushing Wheel",
"block.create.drill": "Mechanical Drill",
"block.create.portable_storage_interface": "Portable Storage Interface",
@ -147,11 +140,6 @@
"block.create.toggle_latch": "Powered Toggle Latch",
"block.create.flexpeater": "Adjustable Repeater",
"block.create.entity_detector": "Belt Observer",
"block.create.logistical_casing": "Logistical Casing",
"block.create.logistical_controller": "Logistical Controller",
"block.create.logistical_index": "Logistical Index",
"block.create.logisticians_table": "Logistician's Table",
"block.create.package_funnel": "Package Funnel",
"block.create.belt_tunnel": "Conveyor Tunnel",
"block.create.sequenced_gearshift": "Sequenced Gearshift",
@ -269,8 +257,6 @@
"block.create.cocoa_log": "Cocoa Jungle Log",
"block.create.shop_shelf": "Shelf",
"_comment": "-------------------------] UI & MESSAGES [------------------------------------------------",
"death.attack.create.crush": "%1$s was processed by Crushing Wheels",
@ -544,20 +530,6 @@
"create.schematicannon.status.schematicNotPlaced": "Schematic Not Deployed",
"create.schematicannon.status.schematicExpired": "Schematic File Expired",
"create.gui.index.title": "Logistical Index",
"create.gui.index.targetAddressSelect": "Destination Address",
"create.gui.index.confirmOrder": "Confirm Order",
"create.logistics.priority": "Priority",
"create.logistics.priority.lowest": "Lowest",
"create.logistics.priority.low": "Low",
"create.logistics.priority.high": "High",
"create.logistics.priority.highest": "Highest",
"create.gui.logistical_controller.active_mode": "Active Mode",
"create.gui.logistical_controller.passive_mode": "Passive Mode",
"create.gui.requester.requestedItemCount": "Requested Amount",
"create.gui.storage.passiveModeOnly": "Item Storage is Passive Only",
"create.gui.filter.blacklist": "Blacklist",
"create.gui.filter.blacklist.description": "Items pass if they do NOT match any of the above. An empty Blacklist accepts everything.",
"create.gui.filter.whitelist": "Whitelist",
@ -1161,16 +1133,5 @@
"tool.create.rose_quartz.tooltip": "ROSE QUARTZ TOOLS",
"tool.create.rose_quartz.tooltip.summary": "This tool grants you a _greater_ _reach_ for _breaking_ _blocks_ or _placing_ _blocks_ from the off-hand.",
"item.create.logistical_controller_calculation.tooltip": "WIP",
"item.create.logistical_controller_request.tooltip": "WIP",
"item.create.logistical_controller_storage.tooltip": "WIP",
"item.create.logistical_controller_supply.tooltip": "WIP",
"item.create.logistical_controller_transactions.tooltip": "WIP",
"block.create.logistical_index.tooltip": "WIP",
"block.create.package_funnel.tooltip": "WIP",
"block.create.logisticians_table.tooltip": "WIP",
"item.create.logistical_dial.tooltip": "WIP",
"item.create.logistical_filter.tooltip": "WIP",
"itemGroup.create": "Create"
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,163 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "create:block/gearbox",
"5": "create:block/millstone",
"6": "block/polished_andesite",
"13": "block/stripped_spruce_log",
"particle": "block/polished_andesite"
},
"elements": [
{
"from": [3, 13, 3],
"to": [5, 16, 13],
"faces": {
"north": {"uv": [0, 3, 3, 5], "rotation": 90, "texture": "#13"},
"east": {"uv": [0, 0, 10, 3], "texture": "#13"},
"south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#13"},
"west": {"uv": [0, 0, 3, 10], "rotation": 90, "texture": "#13"},
"up": {"uv": [5, 3, 7, 13], "texture": "#13"},
"down": {"uv": [0, 0, 2, 10], "texture": "#13"}
}
},
{
"from": [11, 13, 3],
"to": [13, 16, 13],
"faces": {
"north": {"uv": [0, 7, 3, 9], "rotation": 90, "texture": "#13"},
"east": {"uv": [0, 10, 3, 0], "rotation": 90, "texture": "#13"},
"south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#13"},
"west": {"uv": [10, 0, 0, 3], "texture": "#13"},
"up": {"uv": [5, 2, 3, 12], "texture": "#13"},
"down": {"uv": [2, 0, 0, 10], "texture": "#13"}
}
},
{
"from": [5, 13, 11],
"to": [11, 16, 13],
"faces": {
"north": {"uv": [0, 0, 6, 3], "texture": "#13"},
"east": {"uv": [0, 0, 2, 3], "texture": "#13"},
"south": {"uv": [0, 3, 3, 9], "rotation": 90, "texture": "#13"},
"west": {"uv": [0, 0, 2, 3], "texture": "#13"},
"up": {"uv": [10, 4, 12, 10], "rotation": 90, "texture": "#13"},
"down": {"uv": [0, 0, 6, 2], "texture": "#13"}
}
},
{
"from": [5, 13, 5],
"to": [11, 15, 11],
"faces": {
"up": {"uv": [6, 0, 9, 3], "rotation": 90, "texture": "#5"}
}
},
{
"from": [5, 13, 3],
"to": [11, 16, 5],
"faces": {
"north": {"uv": [0, 9, 3, 3], "rotation": 90, "texture": "#13"},
"east": {"uv": [2, 0, 0, 3], "texture": "#13"},
"south": {"uv": [6, 0, 0, 3], "texture": "#13"},
"west": {"uv": [2, 0, 0, 3], "texture": "#13"},
"up": {"uv": [7, 3, 5, 9], "rotation": 270, "texture": "#13"},
"down": {"uv": [0, 2, 6, 0], "texture": "#13"}
}
},
{
"name": "bottom",
"from": [0, 0, 0],
"to": [16, 6, 2],
"faces": {
"north": {"uv": [0, 13, 8, 16], "texture": "#5"},
"east": {"uv": [7, 13, 8, 16], "texture": "#5"},
"south": {"uv": [0, 13, 8, 16], "texture": "#5"},
"west": {"uv": [0, 13, 1, 16], "texture": "#5"},
"up": {"uv": [0.5, 8.5, 8.5, 9.5], "texture": "#5"},
"down": {"uv": [0, 14, 16, 16], "texture": "#0"}
}
},
{
"name": "bottom",
"from": [0, 0, 14],
"to": [16, 6, 16],
"faces": {
"north": {"uv": [8, 13, 0, 16], "texture": "#5"},
"east": {"uv": [8, 13, 7, 16], "texture": "#5"},
"south": {"uv": [8, 13, 0, 16], "texture": "#5"},
"west": {"uv": [1, 13, 0, 16], "texture": "#5"},
"up": {"uv": [0.5, 9.5, 8.5, 8.5], "texture": "#5"},
"down": {"uv": [0, 16, 16, 14], "texture": "#0"}
}
},
{
"from": [0, 0, 2],
"to": [2, 6, 14],
"faces": {
"east": {"uv": [1, 13, 7, 16], "texture": "#5"},
"west": {"uv": [1, 13, 7, 16], "texture": "#5"},
"up": {"uv": [1.5, 8.5, 7.5, 9.5], "rotation": 270, "texture": "#5"},
"down": {"uv": [0, 2, 2, 14], "texture": "#0"}
}
},
{
"from": [14, 0, 2],
"to": [16, 6, 14],
"faces": {
"east": {"uv": [7, 13, 1, 16], "texture": "#5"},
"west": {"uv": [7, 13, 1, 16], "texture": "#5"},
"up": {"uv": [1.5, 9.5, 7.5, 8.5], "rotation": 270, "texture": "#5"},
"down": {"uv": [2, 2, 0, 14], "texture": "#0"}
}
},
{
"from": [2, 1, 2],
"to": [14, 6, 14],
"faces": {
"up": {"uv": [2, 2, 14, 14], "rotation": 270, "texture": "#6"},
"down": {"uv": [2, 2, 14, 14], "texture": "#0"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, -149, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, -149, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, -55, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, -55, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 1, 1.25],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 45, 0],
"translation": [2.5, -0.5, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"rotation": [0, 180, 0],
"translation": [0, 1.75, -4.5],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [0, 1, 2, 3, 4,
{
"name": "bottom",
"origin": [8, 8, 8],
"children": [5, 6, 7, 8, 9]
}
]
}

View File

@ -0,0 +1,150 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"5": "create:block/millstone",
"particle": "create:block/axis",
"1_0": "create:block/axis",
"1_1": "create:block/axis_top"
},
"elements": [
{
"name": "Gear5",
"from": [6.5, 6.5, -1],
"to": [9.5, 12.5, 17],
"faces": {
"north": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"east": {"uv": [0, 10, 9, 13], "texture": "#5"},
"south": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"west": {"uv": [0, 10, 9, 13], "texture": "#5"},
"up": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}
}
},
{
"name": "Gear6",
"from": [6.5, 6.5, -1],
"to": [9.5, 12.5, 17],
"rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"east": {"uv": [0, 10, 9, 13], "texture": "#5"},
"south": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"west": {"uv": [0, 10, 9, 13], "texture": "#5"},
"up": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}
}
},
{
"name": "Gear7",
"from": [-1, 6.5, 6.5],
"to": [17, 12.5, 9.5],
"rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 10, 9, 13], "texture": "#5"},
"east": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"south": {"uv": [0, 10, 9, 13], "texture": "#5"},
"west": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"up": {"uv": [0, 8.5, 9, 10], "texture": "#5"},
"down": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"}
}
},
{
"name": "Gear7",
"from": [-1, 6.5, 6.5],
"to": [17, 12.5, 9.5],
"faces": {
"north": {"uv": [0, 10, 9, 13], "texture": "#5"},
"east": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"south": {"uv": [0, 10, 9, 13], "texture": "#5"},
"west": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"up": {"uv": [0, 8.5, 9, 10], "texture": "#5"},
"down": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"}
}
},
{
"name": "GearCaseInner",
"from": [2, 6.6, 2],
"to": [14, 11.6, 14],
"faces": {
"north": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
"east": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
"south": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
"west": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
"up": {"uv": [0, 0, 6, 6], "texture": "#5"},
"down": {"uv": [0, 0, 6, 6], "texture": "#5"}
}
},
{
"name": "GearCaseOuter",
"from": [4, 6, 4],
"to": [12, 13, 12],
"faces": {
"north": {"uv": [1, 1.5, 5, 5], "texture": "#5"},
"east": {"uv": [1, 1.5, 5, 5], "texture": "#5"},
"south": {"uv": [1, 1.5, 5, 5], "texture": "#5"},
"west": {"uv": [1, 1.5, 5, 5], "texture": "#5"}
}
},
{
"name": "Axis",
"from": [6, 0, 6],
"to": [10, 8, 10],
"shade": false,
"faces": {
"north": {"uv": [6, 0, 10, 8], "rotation": 180, "texture": "#1_0"},
"east": {"uv": [6, 0, 10, 8], "rotation": 180, "texture": "#1_0"},
"south": {"uv": [6, 0, 10, 8], "rotation": 180, "texture": "#1_0"},
"west": {"uv": [6, 0, 10, 8], "rotation": 180, "texture": "#1_0"},
"up": {"uv": [6, 6, 10, 10], "texture": "#1_1"},
"down": {"uv": [6, 6, 10, 10], "texture": "#1_1"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, -149, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, -149, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, -55, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, -55, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 1, 1.25],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 45, 0],
"translation": [2.5, -0.5, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"rotation": [0, 180, 0],
"translation": [0, 1.75, -4.5],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "cogwheel",
"origin": [8, 8, 8],
"children": [0, 1, 2, 3, 4, 5]
},
{
"name": "shaft_half",
"origin": [8, 8, 8],
"children": [6]
}
]
}

View File

@ -0,0 +1,211 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "create:block/gearbox",
"3": "block/stripped_spruce_log",
"5": "create:block/millstone",
"6": "block/polished_andesite",
"particle": "block/polished_andesite"
},
"elements": [
{
"name": "Gear5",
"from": [6.5, 6.5, -1],
"to": [9.5, 12.5, 17],
"faces": {
"north": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"east": {"uv": [0, 10, 9, 13], "texture": "#5"},
"south": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"west": {"uv": [0, 10, 9, 13], "texture": "#5"},
"up": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}
}
},
{
"name": "Gear6",
"from": [6.5, 6.5, -1],
"to": [9.5, 12.5, 17],
"rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"east": {"uv": [0, 10, 9, 13], "texture": "#5"},
"south": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"west": {"uv": [0, 10, 9, 13], "texture": "#5"},
"up": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 8.5, 9, 10], "rotation": 90, "texture": "#5"}
}
},
{
"name": "Gear7",
"from": [-1, 6.5, 6.5],
"to": [17, 12.5, 9.5],
"rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 10, 9, 13], "texture": "#5"},
"east": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"south": {"uv": [0, 10, 9, 13], "texture": "#5"},
"west": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"up": {"uv": [0, 8.5, 9, 10], "texture": "#5"},
"down": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"}
}
},
{
"name": "Gear7",
"from": [-1, 6.5, 6.5],
"to": [17, 12.5, 9.5],
"faces": {
"north": {"uv": [0, 10, 9, 13], "texture": "#5"},
"east": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"south": {"uv": [0, 10, 9, 13], "texture": "#5"},
"west": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"up": {"uv": [0, 8.5, 9, 10], "texture": "#5"},
"down": {"uv": [0, 8.5, 9, 10], "rotation": 180, "texture": "#5"}
}
},
{
"name": "GearCaseInner",
"from": [2, 6.6, 2],
"to": [14, 11.6, 14],
"faces": {
"north": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
"east": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
"south": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
"west": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
"up": {"uv": [0, 0, 6, 6], "texture": "#5"},
"down": {"uv": [0, 0, 6, 6], "texture": "#5"}
}
},
{
"name": "GearCaseOuter",
"from": [4, 6, 4],
"to": [12, 13, 12],
"faces": {
"north": {"uv": [1, 1.5, 5, 5], "texture": "#5"},
"east": {"uv": [1, 1.5, 5, 5], "texture": "#5"},
"south": {"uv": [1, 1.5, 5, 5], "texture": "#5"},
"west": {"uv": [1, 1.5, 5, 5], "texture": "#5"}
}
},
{
"from": [5, 13, 5],
"to": [11, 15, 11],
"faces": {
"up": {"uv": [6, 0, 9, 3], "rotation": 90, "texture": "#5"}
}
},
{
"name": "bottom",
"from": [0, 0, 0],
"to": [16, 6, 2],
"faces": {
"north": {"uv": [0, 13, 8, 16], "texture": "#5"},
"east": {"uv": [7, 13, 8, 16], "texture": "#5"},
"south": {"uv": [0, 13, 8, 16], "texture": "#5"},
"west": {"uv": [0, 13, 1, 16], "texture": "#5"},
"up": {"uv": [0.5, 8.5, 8.5, 9.5], "texture": "#5"},
"down": {"uv": [0, 14, 16, 16], "texture": "#0"}
}
},
{
"name": "bottom",
"from": [0, 0, 14],
"to": [16, 6, 16],
"faces": {
"north": {"uv": [8, 13, 0, 16], "texture": "#5"},
"east": {"uv": [8, 13, 7, 16], "texture": "#5"},
"south": {"uv": [8, 13, 0, 16], "texture": "#5"},
"west": {"uv": [1, 13, 0, 16], "texture": "#5"},
"up": {"uv": [0.5, 9.5, 8.5, 8.5], "texture": "#5"},
"down": {"uv": [0, 16, 16, 14], "texture": "#0"}
}
},
{
"from": [0, 0, 2],
"to": [2, 6, 14],
"faces": {
"east": {"uv": [1, 13, 7, 16], "texture": "#5"},
"west": {"uv": [1, 13, 7, 16], "texture": "#5"},
"up": {"uv": [1.5, 8.5, 7.5, 9.5], "rotation": 270, "texture": "#5"},
"down": {"uv": [0, 2, 2, 14], "texture": "#0"}
}
},
{
"from": [14, 0, 2],
"to": [16, 6, 14],
"faces": {
"east": {"uv": [7, 13, 1, 16], "texture": "#5"},
"west": {"uv": [7, 13, 1, 16], "texture": "#5"},
"up": {"uv": [1.5, 9.5, 7.5, 8.5], "rotation": 270, "texture": "#5"},
"down": {"uv": [2, 2, 0, 14], "texture": "#0"}
}
},
{
"from": [2, 1, 2],
"to": [14, 6, 14],
"faces": {
"up": {"uv": [2, 2, 14, 14], "rotation": 270, "texture": "#6"},
"down": {"uv": [2, 2, 14, 14], "texture": "#0"}
}
},
{
"from": [11, 13, 3],
"to": [13, 16, 13],
"faces": {
"north": {"uv": [0, 7, 3, 9], "rotation": 90, "texture": "#3"},
"east": {"uv": [0, 10, 3, 0], "rotation": 90, "texture": "#3"},
"south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#3"},
"west": {"uv": [10, 0, 0, 3], "texture": "#3"},
"up": {"uv": [5, 2, 3, 12], "texture": "#3"},
"down": {"uv": [2, 0, 0, 10], "texture": "#3"}
}
},
{
"from": [5, 13, 11],
"to": [11, 16, 13],
"faces": {
"north": {"uv": [0, 0, 6, 3], "texture": "#3"},
"east": {"uv": [0, 0, 2, 3], "texture": "#3"},
"south": {"uv": [0, 3, 3, 9], "rotation": 90, "texture": "#3"},
"west": {"uv": [0, 0, 2, 3], "texture": "#3"},
"up": {"uv": [10, 4, 12, 10], "rotation": 90, "texture": "#3"},
"down": {"uv": [0, 0, 6, 2], "texture": "#3"}
}
},
{
"from": [5, 13, 3],
"to": [11, 16, 5],
"faces": {
"north": {"uv": [0, 9, 3, 3], "rotation": 90, "texture": "#3"},
"east": {"uv": [2, 0, 0, 3], "texture": "#3"},
"south": {"uv": [6, 0, 0, 3], "texture": "#3"},
"west": {"uv": [2, 0, 0, 3], "texture": "#3"},
"up": {"uv": [7, 3, 5, 9], "rotation": 270, "texture": "#3"},
"down": {"uv": [0, 2, 6, 0], "texture": "#3"}
}
},
{
"from": [3, 13, 3],
"to": [5, 16, 13],
"faces": {
"north": {"uv": [0, 3, 3, 5], "rotation": 90, "texture": "#3"},
"east": {"uv": [0, 0, 10, 3], "texture": "#3"},
"south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#3"},
"west": {"uv": [0, 0, 3, 10], "rotation": 90, "texture": "#3"},
"up": {"uv": [5, 3, 7, 13], "texture": "#3"},
"down": {"uv": [0, 0, 2, 10], "texture": "#3"}
}
}
],
"groups": [
{
"name": "cogwheel",
"origin": [8, 8, 8],
"children": [0, 1, 2, 3, 4, 5]
}, 6,
{
"name": "bottom",
"origin": [8, 8, 8],
"children": [7, 8, 9, 10, 11]
}, 12, 13, 14, 15]
}

View File

@ -0,0 +1,3 @@
{
"parent": "create:block/millstone/item"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 933 B

View File

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "create:millstone"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View File

@ -0,0 +1,32 @@
{
"type": "crafting_shaped",
"pattern": [
" P ",
"ACA",
" S "
],
"key": {
"C": {
"item": "create:cogwheel"
},
"A": {
"item": "create:andesite_alloy"
},
"S": {
"tag": "forge:stone"
},
"P": {
"tag": "minecraft:planks"
}
},
"result": {
"item": "create:millstone",
"count": 1
},
"conditions": [
{
"type": "create:module",
"module": "contraptions"
}
]
}

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:allium"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:andesite"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:azure_bluet"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:blue_orchid"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:bone"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:bone_meal"

View File

@ -9,7 +9,7 @@
}
}
],
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:cactus"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:charcoal"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:clay"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:coal"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:cobblestone"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:cocoa_beans"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:cornflower"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:dandelion"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:diamond_horse_armor"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:diorite"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:fern"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:golden_horse_armor"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:granite"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:grass"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:gravel"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:ink_sac"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:iron_horse_armor"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:lapis_lazuli"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:large_fern"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:leather_horse_armor"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:lilac"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:lily_of_the_valley"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:orange_tulip"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:oxeye_daisy"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:peony"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:pink_tulip"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:poppy"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:red_tulip"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:rose_bush"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:saddle"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:sand"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:sugar_cane"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:sunflower"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:tall_grass"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:terracotta"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:wheat"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:white_tulip"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"item": "minecraft:wither_rose"

View File

@ -1,5 +1,5 @@
{
"type": "create:crushing",
"type": "create:milling",
"ingredients": [
{
"tag": "minecraft:wool"