The Crushing Wheel

- Crushing wheels can now apply recipes to contained items
- Added a new generic recipe type for processing
- Improved Crushing Wheel model
- Improved gui models of large wheels
- Improved gui models of harvesters and drills
- Added several crushing recipes
- Fixed Water wheel updating rotation speeds incosistently
This commit is contained in:
simibubi 2019-08-22 15:52:15 +02:00
parent 911363c6a0
commit efcdd3c03e
68 changed files with 2059 additions and 275 deletions

View file

@ -7,6 +7,7 @@ import com.simibubi.create.modules.contraptions.base.HalfAxisBlock;
import com.simibubi.create.modules.contraptions.generators.MotorBlock; import com.simibubi.create.modules.contraptions.generators.MotorBlock;
import com.simibubi.create.modules.contraptions.generators.WaterWheelBlock; 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.DrillBlock; import com.simibubi.create.modules.contraptions.receivers.DrillBlock;
import com.simibubi.create.modules.contraptions.receivers.HarvesterBlock; import com.simibubi.create.modules.contraptions.receivers.HarvesterBlock;
import com.simibubi.create.modules.contraptions.receivers.TurntableBlock; import com.simibubi.create.modules.contraptions.receivers.TurntableBlock;
@ -66,6 +67,7 @@ public enum AllBlocks {
TURNTABLE(new TurntableBlock()), TURNTABLE(new TurntableBlock()),
HALF_AXIS(new HalfAxisBlock()), HALF_AXIS(new HalfAxisBlock()),
CRUSHING_WHEEL(new CrushingWheelBlock()), CRUSHING_WHEEL(new CrushingWheelBlock()),
CRUSHING_WHEEL_CONTROLLER(new CrushingWheelControllerBlock()),
MECHANICAL_PISTON(new MechanicalPistonBlock(false)), MECHANICAL_PISTON(new MechanicalPistonBlock(false)),
STICKY_MECHANICAL_PISTON(new MechanicalPistonBlock(true)), STICKY_MECHANICAL_PISTON(new MechanicalPistonBlock(true)),

View file

@ -2,23 +2,48 @@ package com.simibubi.create;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.simibubi.create.modules.contraptions.base.ProcessingRecipeSerializer;
import com.simibubi.create.modules.contraptions.receivers.CrushingRecipe;
import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunUpgradeRecipe; import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunUpgradeRecipe;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.registry.Registry;
import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.RegistryEvent;
public enum AllRecipes { public enum AllRecipes {
Placement_Handgun_Upgrade(BuilderGunUpgradeRecipe.Serializer::new), Placement_Handgun_Upgrade(BuilderGunUpgradeRecipe.Serializer::new, IRecipeType.CRAFTING),
Crushing(() -> {
return new ProcessingRecipeSerializer<>(CrushingRecipe::new);
}, Types.CRUSHING),
; ;
public static class Types {
public static IRecipeType<CrushingRecipe> CRUSHING = register("crushing");
static <T extends IRecipe<?>> IRecipeType<T> register(final String key) {
return Registry.register(Registry.RECIPE_TYPE, new ResourceLocation(key), new IRecipeType<T>() {
public String toString() {
return key;
}
});
}
}
public IRecipeSerializer<?> serializer; public IRecipeSerializer<?> serializer;
public Supplier<IRecipeSerializer<?>> supplier; public Supplier<IRecipeSerializer<?>> supplier;
public IRecipeType<? extends IRecipe<? extends IInventory>> type;
private AllRecipes(Supplier<IRecipeSerializer<?>> supplier) { private AllRecipes(Supplier<IRecipeSerializer<?>> supplier,
IRecipeType<? extends IRecipe<? extends IInventory>> type) {
this.supplier = supplier; this.supplier = supplier;
this.type = type;
} }
public static void register(RegistryEvent.Register<IRecipeSerializer<?>> event) { public static void register(RegistryEvent.Register<IRecipeSerializer<?>> event) {

View file

@ -6,6 +6,7 @@ import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.modules.contraptions.generators.MotorTileEntity; import com.simibubi.create.modules.contraptions.generators.MotorTileEntity;
import com.simibubi.create.modules.contraptions.generators.MotorTileEntityRenderer; import com.simibubi.create.modules.contraptions.generators.MotorTileEntityRenderer;
import com.simibubi.create.modules.contraptions.generators.WaterWheelTileEntity; import com.simibubi.create.modules.contraptions.generators.WaterWheelTileEntity;
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelControllerTileEntity;
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelTileEntity; import com.simibubi.create.modules.contraptions.receivers.CrushingWheelTileEntity;
import com.simibubi.create.modules.contraptions.receivers.DrillTileEntity; import com.simibubi.create.modules.contraptions.receivers.DrillTileEntity;
import com.simibubi.create.modules.contraptions.receivers.TurntableTileEntity; import com.simibubi.create.modules.contraptions.receivers.TurntableTileEntity;
@ -53,6 +54,7 @@ public enum AllTileEntities {
MECHANICAL_PISTON(MechanicalPistonTileEntity::new, AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON), MECHANICAL_PISTON(MechanicalPistonTileEntity::new, AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON),
DRILL(DrillTileEntity::new, AllBlocks.DRILL), DRILL(DrillTileEntity::new, AllBlocks.DRILL),
CRUSHING_WHEEL(CrushingWheelTileEntity::new, AllBlocks.CRUSHING_WHEEL), CRUSHING_WHEEL(CrushingWheelTileEntity::new, AllBlocks.CRUSHING_WHEEL),
CRUSHING_WHEEL_CONTROLLER(CrushingWheelControllerTileEntity::new, AllBlocks.CRUSHING_WHEEL_CONTROLLER),
WATER_WHEEL(WaterWheelTileEntity::new, AllBlocks.WATER_WHEEL), WATER_WHEEL(WaterWheelTileEntity::new, AllBlocks.WATER_WHEEL),
; ;

View file

@ -0,0 +1,96 @@
package com.simibubi.create.modules.contraptions.base;
import java.util.ArrayList;
import java.util.List;
import com.simibubi.create.AllRecipes;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
public abstract class ProcessingRecipe<T extends IInventory> implements IRecipe<T> {
protected final List<Ingredient> ingredients;
protected final List<StochasticOutput> results;
private final IRecipeType<?> type;
private final IRecipeSerializer<?> serializer;
protected final ResourceLocation id;
protected final String group;
protected final int processingDuration;
public ProcessingRecipe(AllRecipes recipeType, ResourceLocation id, String group,
List<Ingredient> ingredients, List<StochasticOutput> results, int processingDuration) {
this.type = recipeType.type;
this.serializer = recipeType.serializer;
this.id = id;
this.group = group;
this.ingredients = ingredients;
this.results = results;
this.processingDuration = processingDuration;
}
@Override
public NonNullList<Ingredient> getIngredients() {
NonNullList<Ingredient> nonnulllist = NonNullList.create();
nonnulllist.addAll(this.ingredients);
return nonnulllist;
}
public int getProcessingDuration() {
return processingDuration;
}
public List<StochasticOutput> getAllResults() {
return results;
}
public List<ItemStack> rollResults() {
List<ItemStack> stacks = new ArrayList<>();
for (StochasticOutput output : results) {
ItemStack stack = output.rollOutput();
if (!stack.isEmpty())
stacks.add(stack);
}
return stacks;
}
@Override
public ItemStack getCraftingResult(T inv) {
return getRecipeOutput();
}
@Override
public boolean canFit(int width, int height) {
return true;
}
@Override
public ItemStack getRecipeOutput() {
return results.isEmpty() ? ItemStack.EMPTY : results.get(0).getStack();
}
@Override
public ResourceLocation getId() {
return id;
}
@Override
public IRecipeSerializer<?> getSerializer() {
return serializer;
}
@Override
public String getGroup() {
return group;
}
@Override
public IRecipeType<?> getType() {
return type;
}
}

View file

@ -0,0 +1,83 @@
package com.simibubi.create.modules.contraptions.base;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.JSONUtils;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.registry.Registry;
public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
extends net.minecraftforge.registries.ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<T> {
protected final IRecipeFactory<T> factory;
public ProcessingRecipeSerializer(IRecipeFactory<T> factory) {
this.factory = factory;
}
@SuppressWarnings("deprecation")
public T read(ResourceLocation recipeId, JsonObject json) {
String s = JSONUtils.getString(json, "group", "");
List<Ingredient> ingredients = new ArrayList<>();
for (JsonElement e : JSONUtils.getJsonArray(json, "ingredients")) {
ingredients.add(Ingredient.deserialize(e));
}
List<StochasticOutput> results = new ArrayList<>();
for (JsonElement e : JSONUtils.getJsonArray(json, "results")) {
String s1 = JSONUtils.getString(e.getAsJsonObject().get("item"), "item");
int i = JSONUtils.getInt(e.getAsJsonObject().get("count"), "count");
float chance = 1;
if (JSONUtils.hasField((JsonObject) e, "chance"))
chance = JSONUtils.getFloat(e.getAsJsonObject().get("chance"), "chance");
ItemStack itemstack = new ItemStack(Registry.ITEM.getOrDefault(new ResourceLocation(s1)), i);
results.add(new StochasticOutput(itemstack, chance));
}
int duration = JSONUtils.getInt(json, "processingTime");
return this.factory.create(recipeId, s, ingredients, results, duration);
}
public T read(ResourceLocation recipeId, PacketBuffer buffer) {
String s = buffer.readString(32767);
List<Ingredient> ingredients = new ArrayList<>();
for (int i = 0; i < buffer.readInt(); i++)
ingredients.add(Ingredient.read(buffer));
List<StochasticOutput> results = new ArrayList<>();
for (int i = 0; i < buffer.readInt(); i++)
results.add(StochasticOutput.read(buffer));
int duration = buffer.readInt();
return this.factory.create(recipeId, s, ingredients, results, duration);
}
public void write(PacketBuffer buffer, T recipe) {
buffer.writeString(recipe.group);
buffer.writeInt(recipe.ingredients.size());
recipe.ingredients.forEach(i -> i.write(buffer));
buffer.writeInt(recipe.results.size());
recipe.results.forEach(i -> i.write(buffer));
buffer.writeInt(recipe.processingDuration);
}
public interface IRecipeFactory<T extends ProcessingRecipe<?>> {
T create(ResourceLocation id, String group, List<Ingredient> ingredients, List<StochasticOutput> results, int duration);
}
}

View file

@ -0,0 +1,44 @@
package com.simibubi.create.modules.contraptions.base;
import java.util.Random;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer;
public class StochasticOutput {
private static Random r = new Random();
private ItemStack stack;
private float chance;
public StochasticOutput(ItemStack stack, float chance) {
this.stack = stack;
this.chance = chance;
}
public ItemStack getStack() {
return stack;
}
public float getChance() {
return chance;
}
public ItemStack rollOutput() {
int outputAmount = stack.getCount();
for (int roll = 0; roll < stack.getCount(); roll++)
if (r.nextFloat() > chance)
outputAmount--;
return outputAmount > 0 ? new ItemStack(stack.getItem(), outputAmount) : ItemStack.EMPTY;
}
public void write(PacketBuffer buf) {
buf.writeItemStack(getStack());
buf.writeFloat(getChance());
}
public static StochasticOutput read(PacketBuffer buf) {
return new StochasticOutput(buf.readItemStack(), buf.readFloat());
}
}

View file

@ -1,14 +1,6 @@
package com.simibubi.create.modules.contraptions.generators; package com.simibubi.create.modules.contraptions.generators;
import static net.minecraft.util.Direction.DOWN;
import static net.minecraft.util.Direction.EAST;
import static net.minecraft.util.Direction.NORTH;
import static net.minecraft.util.Direction.SOUTH;
import static net.minecraft.util.Direction.UP;
import static net.minecraft.util.Direction.WEST;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -47,7 +39,7 @@ public class WaterWheelBlock extends HorizontalKineticBlock {
protected boolean hasStaticPart() { protected boolean hasStaticPart() {
return false; return false;
} }
@Override @Override
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) { public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
for (Direction direction : Direction.values()) { for (Direction direction : Direction.values()) {

View file

@ -59,10 +59,10 @@ public class WaterWheelTileEntity extends KineticTileEntity {
speed += i; speed += i;
if (this.speed != speed) { if (this.speed != speed) {
RotationPropagator.handleRemoved(world, pos, this);
this.setSpeed(speed); this.setSpeed(speed);
hasFlows = speed != 0; hasFlows = speed != 0;
notifyBlockUpdate(); notifyBlockUpdate();
RotationPropagator.handleRemoved(world, pos, this);
RotationPropagator.handleAdded(world, pos, this); RotationPropagator.handleAdded(world, pos, this);
} }

View file

@ -0,0 +1,28 @@
package com.simibubi.create.modules.contraptions.receivers;
import java.util.List;
import com.simibubi.create.AllRecipes;
import com.simibubi.create.modules.contraptions.base.ProcessingRecipe;
import com.simibubi.create.modules.contraptions.base.StochasticOutput;
import com.simibubi.create.modules.contraptions.receivers.CrushingWheelControllerTileEntity.Inventory;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
public class CrushingRecipe extends ProcessingRecipe<CrushingWheelControllerTileEntity.Inventory> {
public CrushingRecipe(ResourceLocation id, String group, List<Ingredient> ingredients,
List<StochasticOutput> results, int processingDuration) {
super(AllRecipes.Crushing, id, group, ingredients, results, processingDuration);
}
@Override
public boolean matches(Inventory inv, World worldIn) {
if (inv.isEmpty())
return false;
return ingredients.get(0).test(inv.getStackInSlot(0));
}
}

View file

@ -1,18 +1,30 @@
package com.simibubi.create.modules.contraptions.receivers; package com.simibubi.create.modules.contraptions.receivers;
import static com.simibubi.create.modules.contraptions.receivers.CrushingWheelControllerBlock.VALID;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock; import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity;
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;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class CrushingWheelBlock extends RotatedPillarKineticBlock { public class CrushingWheelBlock extends RotatedPillarKineticBlock {
public static final VoxelShape COLLISION_SHAPE = makeCuboidShape(0, 0, 0, 16, 22, 16);
public CrushingWheelBlock() { public CrushingWheelBlock() {
super(Properties.from(Blocks.DIORITE)); super(Properties.from(Blocks.DIORITE));
} }
@ -26,12 +38,129 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
public Axis getRotationAxis(BlockState state) { public Axis getRotationAxis(BlockState state) {
return state.get(AXIS); return state.get(AXIS);
} }
@Override
public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos,
ISelectionContext context) {
return COLLISION_SHAPE;
}
@Override
public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn,
BlockPos currentPos, BlockPos facingPos) {
updateControllers(stateIn, worldIn.getWorld(), currentPos, facing);
return stateIn;
}
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
for (Direction d : Direction.values()) {
if (d.getAxis() == state.get(AXIS) || d.getAxis().isVertical())
continue;
if (AllBlocks.CRUSHING_WHEEL_CONTROLLER.typeOf(worldIn.getBlockState(pos.offset(d))))
worldIn.setBlockState(pos.offset(d), Blocks.AIR.getDefaultState());
}
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) {
worldIn.removeTileEntity(pos);
}
}
@Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
for (Direction d : Direction.values())
updateControllers(state, worldIn, pos, d);
}
public void updateControllers(BlockState state, World world, BlockPos pos, Direction facing) {
if (facing.getAxis() == state.get(AXIS) || facing.getAxis().isVertical())
return;
BlockPos controllerPos = pos.offset(facing);
BlockPos otherWheelPos = pos.offset(facing, 2);
boolean controllerExists = AllBlocks.CRUSHING_WHEEL_CONTROLLER.typeOf(world.getBlockState(controllerPos));
boolean controllerIsValid = controllerExists && world.getBlockState(controllerPos).get(VALID);
boolean controllerShouldExist = false;
boolean controllerShouldBeValid = false;
if (AllBlocks.CRUSHING_WHEEL.typeOf(world.getBlockState(otherWheelPos))) {
controllerShouldExist = true;
KineticTileEntity te = (KineticTileEntity) world.getTileEntity(pos);
KineticTileEntity otherTe = (KineticTileEntity) world.getTileEntity(otherWheelPos);
if (te != null && otherTe != null && -te.getSpeed() == otherTe.getSpeed() && te.getSpeed() != 0) {
float signum = Math.signum(te.getSpeed()) * (state.get(AXIS) == Axis.X ? -1 : 1);
controllerShouldBeValid = facing.getAxisDirection().getOffset() != signum;
}
}
if (!controllerShouldExist) {
if (controllerExists)
world.setBlockState(controllerPos, Blocks.AIR.getDefaultState());
return;
}
if (!controllerExists) {
if (!world.getBlockState(controllerPos).getMaterial().isReplaceable())
return;
world.setBlockState(controllerPos,
AllBlocks.CRUSHING_WHEEL_CONTROLLER.get().getDefaultState().with(VALID, controllerShouldBeValid));
} else if (controllerIsValid != controllerShouldBeValid) {
world.setBlockState(controllerPos, world.getBlockState(controllerPos).with(VALID, controllerShouldBeValid));
}
((CrushingWheelControllerBlock) AllBlocks.CRUSHING_WHEEL_CONTROLLER.block)
.updateSpeed(world.getBlockState(controllerPos), world, controllerPos);
}
@Override
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) {
KineticTileEntity te = (KineticTileEntity) worldIn.getTileEntity(pos);
if (te == null)
return;
if (entityIn.posY < pos.getY() + 1.25f || !entityIn.onGround)
return;
double x = 0;
double z = 0;
if (state.get(AXIS) == Axis.X) {
z = te.getSpeed() / 20f;
x += (pos.getX() + .5f - entityIn.posX) * .1f;
}
if (state.get(AXIS) == Axis.Z) {
x = te.getSpeed() / -20f;
z += (pos.getZ() + .5f - entityIn.posZ) * .1f;
}
entityIn.setMotion(entityIn.getMotion().add(x, 0, z));
}
@Override
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
for (Direction direction : Direction.values()) {
BlockPos neighbourPos = pos.offset(direction);
BlockState neighbourState = worldIn.getBlockState(neighbourPos);
if (!AllBlocks.CRUSHING_WHEEL.typeOf(neighbourState))
continue;
if (neighbourState.get(AXIS) != state.get(AXIS) || state.get(AXIS) != direction.getAxis())
return false;
}
return true;
}
@Override @Override
public boolean isAxisTowards(World world, BlockPos pos, BlockState state, Direction face) { public boolean isAxisTowards(World world, BlockPos pos, BlockState state, Direction face) {
return face.getAxis() == state.get(AXIS); return face.getAxis() == state.get(AXIS);
} }
@Override
public BlockRenderLayer getRenderLayer() {
return BlockRenderLayer.CUTOUT;
}
@Override @Override
protected boolean hasStaticPart() { protected boolean hasStaticPart() {
return false; return false;

View file

@ -0,0 +1,136 @@
package com.simibubi.create.modules.contraptions.receivers;
import java.util.Random;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IWithoutBlockItem;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.World;
public class CrushingWheelControllerBlock extends Block implements IWithoutBlockItem {
public static final BooleanProperty VALID = BooleanProperty.create("valid");
public CrushingWheelControllerBlock() {
super(Properties.from(Blocks.AIR));
}
@Override
public boolean hasTileEntity(BlockState state) {
return state.get(VALID);
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return new CrushingWheelControllerTileEntity();
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
builder.add(VALID);
super.fillStateContainer(builder);
}
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) {
if (!state.get(VALID))
return;
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn.getTileEntity(pos);
if (te == null)
return;
if (te.processingEntity == entityIn)
entityIn.setMotionMultiplier(state, new Vec3d(0.25D, (double) 0.05F, 0.25D));
}
@Override
public void onLanded(IBlockReader worldIn, Entity entityIn) {
super.onLanded(worldIn, entityIn);
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn
.getTileEntity(entityIn.getPosition().down());
if (te == null)
return;
if (te.isOccupied())
return;
te.startCrushing(entityIn);
}
@Override
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
if (!stateIn.get(VALID))
return;
if (rand.nextInt(1) != 0)
return;
double d0 = (double) ((float) pos.getX() + rand.nextFloat());
double d1 = (double) ((float) pos.getY() + rand.nextFloat());
double d2 = (double) ((float) pos.getZ() + rand.nextFloat());
worldIn.addParticle(ParticleTypes.CRIT, d0, d1, d2, 0.0D, 0.0D, 0.0D);
}
@Override
public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn,
BlockPos currentPos, BlockPos facingPos) {
updateSpeed(stateIn, worldIn.getWorld(), currentPos);
return stateIn;
}
public void updateSpeed(BlockState state, World world, BlockPos pos) {
if (!state.get(VALID))
return;
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) world.getTileEntity(pos);
if (te == null)
return;
for (Direction d : Direction.values()) {
if (d.getAxis().isVertical())
continue;
BlockState neighbour = world.getBlockState(pos.offset(d));
if (!AllBlocks.CRUSHING_WHEEL.typeOf(neighbour))
continue;
if (neighbour.get(BlockStateProperties.AXIS) == d.getAxis())
continue;
KineticTileEntity wheelTe = (KineticTileEntity) world.getTileEntity(pos.offset(d));
te.crushingspeed = Math.abs(wheelTe.getSpeed() / 50f);
break;
}
}
@Override
public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos,
ISelectionContext context) {
if (!state.get(VALID))
return VoxelShapes.fullCube();
Entity entity = context.getEntity();
if (entity != null) {
if (new AxisAlignedBB(pos).contains(entity.getPositionVec()))
return VoxelShapes.empty();
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn.getTileEntity(pos);
if (te == null)
return VoxelShapes.fullCube();
if (te.processingEntity == entity)
return VoxelShapes.empty();
}
return VoxelShapes.fullCube();
}
}

View file

@ -0,0 +1,260 @@
package com.simibubi.create.modules.contraptions.receivers;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.UUID;
import com.simibubi.create.AllRecipes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.block.SyncedTileEntity;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.inventory.ItemStackHelper;
import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.particles.BlockParticleData;
import net.minecraft.particles.IParticleData;
import net.minecraft.particles.ItemParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.util.DamageSource;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public class CrushingWheelControllerTileEntity extends SyncedTileEntity implements ITickableTileEntity {
public static class Inventory extends RecipeWrapper {
protected int processingDuration;
protected boolean appliedRecipe;
public Inventory() {
super(new ItemStackHandler(10));
}
@Override
public void clear() {
super.clear();
processingDuration = 0;
appliedRecipe = false;
}
public void write(CompoundNBT nbt) {
NonNullList<ItemStack> stacks = NonNullList.create();
for (int slot = 0; slot < inv.getSlots(); slot++) {
ItemStack stack = inv.getStackInSlot(slot);
stacks.add(stack);
}
ItemStackHelper.saveAllItems(nbt, stacks);
nbt.putInt("ProcessingTime", processingDuration);
nbt.putBoolean("AppliedRecipe", appliedRecipe);
}
public static Inventory read(CompoundNBT nbt) {
Inventory inventory = new Inventory();
NonNullList<ItemStack> stacks = NonNullList.withSize(10, ItemStack.EMPTY);
ItemStackHelper.loadAllItems(nbt, stacks);
for (int slot = 0; slot < stacks.size(); slot++)
inventory.setInventorySlotContents(slot, stacks.get(slot));
inventory.processingDuration = nbt.getInt("ProcessingTime");
inventory.appliedRecipe = nbt.getBoolean("AppliedRecipe");
return inventory;
}
public ItemStackHandler getItems() {
return (ItemStackHandler) inv;
}
}
private static DamageSource damageSource = new DamageSource("create.crush").setDamageBypassesArmor()
.setDifficultyScaled();
public Entity processingEntity;
private UUID entityUUID;
private Inventory contents;
public float crushingspeed;
public CrushingWheelControllerTileEntity() {
super(AllTileEntities.CRUSHING_WHEEL_CONTROLLER.type);
contents = new Inventory();
}
@Override
public void tick() {
if (!isOccupied())
return;
float speed = crushingspeed / 2.5f;
if (!hasEntity()) {
float processingSpeed = speed / (!contents.appliedRecipe? contents.getStackInSlot(0).getCount() : 1);
contents.processingDuration -= processingSpeed;
spawnParticles(contents.getStackInSlot(0));
if (world.isRemote)
return;
if (contents.processingDuration < 20 && !contents.appliedRecipe) {
applyRecipe();
contents.appliedRecipe = true;
world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16);
return;
}
Vec3d outPos = new Vec3d(pos).add(.5, -.5, .5);
if (contents.processingDuration <= 0) {
for (int slot = 0; slot < contents.getSizeInventory(); slot++) {
ItemStack stack = contents.getStackInSlot(slot);
if (stack.isEmpty())
continue;
ItemEntity entityIn = new ItemEntity(world, outPos.x, outPos.y, outPos.z, stack);
entityIn.setMotion(Vec3d.ZERO);
world.addEntity(entityIn);
}
contents.clear();
world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16);
return;
}
return;
}
if (!processingEntity.isAlive()
|| !processingEntity.getBoundingBox().intersects(new AxisAlignedBB(pos).grow(.5f))) {
clear();
return;
}
processingEntity.setMotion(new Vec3d(0, Math.max(-speed / 4f, -.5f), 0));
if (world.isRemote)
return;
if (!(processingEntity instanceof ItemEntity)) {
processingEntity.attackEntityFrom(damageSource, 4);
return;
}
ItemEntity itemEntity = (ItemEntity) processingEntity;
if (processingEntity.posY < pos.getY() + .25f) {
insertItem(itemEntity);
itemEntity.remove();
world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16);
}
}
protected void spawnParticles(ItemStack stack) {
if (stack == null || stack.isEmpty())
return;
IParticleData particleData = null;
if (stack.getItem() instanceof BlockItem)
particleData = new BlockParticleData(ParticleTypes.BLOCK,
((BlockItem) stack.getItem()).getBlock().getDefaultState());
else
particleData = new ItemParticleData(ParticleTypes.ITEM, stack);
Random r = world.rand;
world.addParticle(particleData, pos.getX() + r.nextFloat(), pos.getY() + r.nextFloat(),
pos.getZ() + r.nextFloat(), 0, 0, 0);
}
private void applyRecipe() {
Optional<CrushingRecipe> recipe = world.getRecipeManager().getRecipe(AllRecipes.Types.CRUSHING, contents,
world);
if (recipe.isPresent()) {
int rolls = contents.getStackInSlot(0).getCount();
contents.clear();
for (int roll = 0; roll < rolls; roll++) {
List<ItemStack> rolledResults = recipe.get().rollResults();
for (int i = 0; i < rolledResults.size(); i++) {
ItemStack stack = rolledResults.get(i);
for (int slot = 0; slot < contents.getSizeInventory(); slot++) {
stack = contents.getItems().insertItem(slot, stack, false);
if (stack.isEmpty())
break;
}
}
}
} else {
contents.clear();
}
}
@Override
public CompoundNBT write(CompoundNBT compound) {
if (hasEntity())
compound.put("Entity", NBTUtil.writeUniqueId(entityUUID));
contents.write(compound);
compound.putFloat("Speed", crushingspeed);
return super.write(compound);
}
@Override
public void read(CompoundNBT compound) {
super.read(compound);
if (compound.contains("Entity")) {
entityUUID = NBTUtil.readUniqueId(compound.getCompound("Entity"));
List<Entity> search = world.getEntitiesInAABBexcluding(null, new AxisAlignedBB(getPos()),
e -> entityUUID.equals(e.getUniqueID()));
if (search.isEmpty())
clear();
else
processingEntity = search.get(0);
}
crushingspeed = compound.getFloat("Speed");
contents = Inventory.read(compound);
}
public void startCrushing(Entity entity) {
processingEntity = entity;
entityUUID = entity.getUniqueID();
}
private void insertItem(ItemEntity entity) {
contents.clear();
contents.setInventorySlotContents(0, entity.getItem());
Optional<CrushingRecipe> recipe = world.getRecipeManager().getRecipe(AllRecipes.Types.CRUSHING, contents,
world);
contents.processingDuration = recipe.isPresent() ? recipe.get().getProcessingDuration() : 100;
contents.appliedRecipe = false;
}
public void clear() {
processingEntity = null;
entityUUID = null;
}
public boolean isOccupied() {
return hasEntity() || !contents.isEmpty();
}
public boolean hasEntity() {
return processingEntity != null;
}
}

View file

@ -3,10 +3,20 @@ package com.simibubi.create.modules.contraptions.receivers;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import net.minecraft.util.Direction;
public class CrushingWheelTileEntity extends KineticTileEntity { public class CrushingWheelTileEntity extends KineticTileEntity {
public CrushingWheelTileEntity() { public CrushingWheelTileEntity() {
super(AllTileEntities.CRUSHING_WHEEL.type); super(AllTileEntities.CRUSHING_WHEEL.type);
} }
@Override
public void onSpeedChanged() {
super.onSpeedChanged();
for (Direction d : Direction.values())
((CrushingWheelBlock) getBlockState().getBlock()).updateControllers(getBlockState(), getWorld(), getPos(),
d);
}
} }

View file

@ -0,0 +1,6 @@
{
"variants": {
"valid=true": { "model": "block/air" },
"valid=false": { "model": "block/air" }
}
}

View file

@ -61,6 +61,8 @@
"block.create.creative_crate": "Schematicannon Creatifier", "block.create.creative_crate": "Schematicannon Creatifier",
"block.create.cocoa_log": "Cocoa Jungle Log", "block.create.cocoa_log": "Cocoa Jungle Log",
"death.attack.create.crush": "%1$s was crushed by a dangerous contraption",
"itemGroup.create": "Create" "itemGroup.create": "Create"
} }

View file

@ -1,353 +1,271 @@
{ {
"__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", "parent": "create:block/large_wheels",
"textures": { "textures": {
"particle": "create:block/polished_dolomite", "particle": "minecraft:block/polished_andesite",
"0": "create:block/axis", "spruce_log_top": "minecraft:block/spruce_log",
"1": "create:block/axis_top", "axis_top": "create:block/axis_top",
"2": "create:block/polished_dolomite", "axis": "create:block/axis",
"3": "block/stripped_spruce_log" "crushing_wheel": "create:block/crushing_wheel",
"1": "minecraft:block/polished_andesite",
"spruce_log": "minecraft:block/spruce_log"
}, },
"elements": [ "elements": [
{ {
"name": "Axis", "name": "Axis",
"from": [ 6.0, 0.0, 6.0 ], "from": [ 6, 0, 6 ],
"to": [ 10.0, 16.0, 10.0 ], "to": [ 10, 16, 10 ],
"shade": false,
"faces": { "faces": {
"north": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] }, "north": { "texture": "#axis", "uv": [ 6, 0, 10, 16 ] },
"east": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] }, "east": { "texture": "#axis", "uv": [ 6, 0, 10, 16 ] },
"south": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] }, "south": { "texture": "#axis", "uv": [ 6, 0, 10, 16 ] },
"west": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] }, "west": { "texture": "#axis", "uv": [ 6, 0, 10, 16 ] },
"up": { "texture": "#1", "uv": [ 6.0, 6.0, 10.0, 10.0 ] }, "up": { "texture": "#axis_top", "uv": [ 6, 6, 10, 10 ] },
"down": { "texture": "#1", "uv": [ 6.0, 6.0, 10.0, 10.0 ] } "down": { "texture": "#axis_top", "uv": [ 6, 6, 10, 10 ] }
} }
}, },
{ {
"name": "B11", "name": "B11",
"from": [ 9.0, 2.100000001490116, 2.0 ], "from": [ 9, 2.1, 2 ],
"to": [ 24.0, 13.899999998509884, 10.0 ], "to": [ 24, 13.9, 10 ],
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.799999997019768 ] }, "north": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.799999997019768 ] }, "east": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"south": { "texture": "#2", "uv": [ 0.0, 2.0, 15.0, 13.799999997019768 ] }, "south": { "texture": "#1", "uv": [ 0, 2, 15, 13.8 ] },
"west": { "texture": "#2", "uv": [ 0.0, 2.0, 8.0, 13.799999997019768 ] }, "west": { "texture": "#1", "uv": [ 0, 2, 8, 13.8 ] },
"up": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 9.0 ], "rotation": 180 }, "up": { "texture": "#1", "uv": [ 0, 1, 15, 9 ], "rotation": 180 },
"down": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 9.0 ], "rotation": 180 } "down": { "texture": "#1", "uv": [ 0, 1, 15, 9 ], "rotation": 180 }
} }
}, },
{ {
"name": "B12", "name": "B12",
"from": [ 9.0, 2.2000000029802322, 2.0 ], "from": [ 9, 2, 2 ],
"to": [ 24.0, 13.799999997019768, 10.0 ], "to": [ 24, 14, 10 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 22.5 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 22.5 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.599999994039536 ] }, "north": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.599999994039536 ] }, "east": { "texture": "#1", "uv": [ 0, 0, 8, 12 ] },
"south": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.599999994039536 ] }, "south": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"west": { "texture": "#2", "uv": [ 0.0, 1.0, 8.0, 12.599999994039536 ] }, "west": { "texture": "#1", "uv": [ 0, 1, 8, 13 ] },
"up": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 9.0 ], "rotation": 180 }, "up": { "texture": "#1", "uv": [ 0, 1, 15, 9 ], "rotation": 180 },
"down": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 9.0 ], "rotation": 180 } "down": { "texture": "#1", "uv": [ 0, 1, 15, 9 ], "rotation": 180 }
} }
}, },
{ {
"name": "B13", "name": "B13",
"from": [ 9.0, 2.3000000044703484, 2.0 ], "from": [ 9, 2.1, 2 ],
"to": [ 24.0, 13.699999995529652, 10.0 ], "to": [ 24, 13.9, 10 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45.0 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.399999991059303 ] }, "north": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.399999991059303 ] }, "east": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"south": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.399999991059303 ] }, "south": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.399999991059303 ] }, "west": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"up": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 9.0 ], "rotation": 180 }, "up": { "texture": "#1", "uv": [ 0, 1, 15, 9 ], "rotation": 180 },
"down": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 9.0 ], "rotation": 180 } "down": { "texture": "#1", "uv": [ 0, 1, 15, 9 ], "rotation": 180 }
} }
}, },
{ {
"name": "B14", "name": "B14",
"from": [ 9.0, 2.0, 2.0 ], "from": [ 9, 2, 2 ],
"to": [ 24.0, 14.0, 9.0 ], "to": [ 24, 14, 9 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": -22.5 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 13.0 ] }, "north": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"east": { "texture": "#2", "uv": [ 4.0, 0.0, 11.0, 12.0 ] }, "east": { "texture": "#1", "uv": [ 4, 0, 11, 12 ] },
"south": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 13.0 ] }, "south": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 7.0, 12.0 ] }, "west": { "texture": "#1", "uv": [ 0, 0, 7, 12 ] },
"up": { "texture": "#2", "uv": [ 0.0, 4.0, 15.0, 11.0 ], "rotation": 180 }, "up": { "texture": "#1", "uv": [ 0, 4, 15, 11 ], "rotation": 180 },
"down": { "texture": "#2", "uv": [ 0.0, 4.0, 15.0, 11.0 ], "rotation": 180 } "down": { "texture": "#1", "uv": [ 0, 4, 15, 11 ], "rotation": 180 }
} }
}, },
{ {
"name": "B21", "name": "B21",
"from": [ -8.0, 2.100000001490116, 6.0 ], "from": [ -8, 2.1, 6 ],
"to": [ 7.0, 13.899999998509884, 14.0 ], "to": [ 7, 13.9, 14 ],
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.799999997019768 ] }, "north": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.799999997019768 ] }, "east": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"south": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.799999997019768 ] }, "south": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.799999997019768 ] }, "west": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"up": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 9.0 ] }, "up": { "texture": "#1", "uv": [ 0, 1, 15, 9 ] },
"down": { "texture": "#2", "uv": [ 0.0, 2.0, 15.0, 10.0 ] } "down": { "texture": "#1", "uv": [ 0, 2, 15, 10 ] }
} }
}, },
{ {
"name": "B22", "name": "B22",
"from": [ -8.0, 2.2000000029802322, 6.0 ], "from": [ -8, 2, 6 ],
"to": [ 7.0, 13.799999997019768, 14.0 ], "to": [ 7, 14, 14 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 22.5 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 22.5 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.599999994039536 ] }, "north": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.599999994039536 ] }, "east": { "texture": "#1", "uv": [ 0, 0, 8, 12 ] },
"south": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.599999994039536 ] }, "south": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.599999994039536 ] }, "west": { "texture": "#1", "uv": [ 0, 0, 8, 12 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 15.0, 8.0 ] }, "up": { "texture": "#1", "uv": [ 0, 0, 15, 8 ] },
"down": { "texture": "#2", "uv": [ 0.0, 2.0, 15.0, 10.0 ] } "down": { "texture": "#1", "uv": [ 0, 2, 15, 10 ] }
} }
}, },
{ {
"name": "B23", "name": "B23",
"from": [ -8.0, 2.3000000044703484, 6.0 ], "from": [ -8, 2.1, 6 ],
"to": [ 7.0, 13.699999995529652, 14.0 ], "to": [ 7, 13.9, 14 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45.0 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.399999991059303 ] }, "north": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.399999991059303 ] }, "east": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"south": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.399999991059303 ] }, "south": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"west": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.399999991059303 ] }, "west": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 15.0, 8.0 ] }, "up": { "texture": "#1", "uv": [ 0, 0, 15, 8 ] },
"down": { "texture": "#2", "uv": [ 0.0, 2.0, 15.0, 10.0 ] } "down": { "texture": "#1", "uv": [ 0, 2, 15, 10 ] }
} }
}, },
{ {
"name": "B24", "name": "B24",
"from": [ -8.0, 2.0, 7.0 ], "from": [ -8, 2, 7 ],
"to": [ 7.0, 14.0, 14.0 ], "to": [ 7, 14, 14 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": -22.5 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 13.0 ] }, "north": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"east": { "texture": "#2", "uv": [ 0.0, 0.0, 7.0, 12.0 ] }, "east": { "texture": "#1", "uv": [ 0, 0, 7, 12 ] },
"south": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 13.0 ] }, "south": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"west": { "texture": "#2", "uv": [ 1.0, 0.0, 8.0, 12.0 ] }, "west": { "texture": "#1", "uv": [ 1, 0, 8, 12 ] },
"up": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 8.0 ] }, "up": { "texture": "#1", "uv": [ 0, 1, 15, 8 ] },
"down": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 8.0 ] } "down": { "texture": "#1", "uv": [ 0, 1, 15, 8 ] }
} }
}, },
{ {
"name": "B31", "name": "B31",
"from": [ 2.0, 2.100000001490116, -8.0 ], "from": [ 2, 2.1, -8 ],
"to": [ 10.0, 13.899999998509884, 7.0 ], "to": [ 10, 13.9, 7 ],
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.799999997019768 ] }, "north": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"east": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.799999997019768 ] }, "east": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.799999997019768 ] }, "south": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"west": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.799999997019768 ] }, "west": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"up": { "texture": "#2", "uv": [ 9.0, 0.0, 1.0, 15.0 ] }, "up": { "texture": "#1", "uv": [ 9, 0, 1, 15 ] },
"down": { "texture": "#2", "uv": [ 11.0, 0.0, 3.0, 15.0 ], "rotation": 180 } "down": { "texture": "#1", "uv": [ 11, 0, 3, 15 ], "rotation": 180 }
} }
}, },
{ {
"name": "B32", "name": "B32",
"from": [ 2.0, 2.0, -8.0 ], "from": [ 2, 2, -8 ],
"to": [ 9.0, 14.0, 7.0 ], "to": [ 9, 14, 7 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": -22.5 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 1.0, 0.0, 8.0, 12.0 ] }, "north": { "texture": "#1", "uv": [ 1, 0, 8, 12 ] },
"east": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 13.0 ] }, "east": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 7.0, 12.0 ] }, "south": { "texture": "#1", "uv": [ 0, 0, 7, 12 ] },
"west": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 13.0 ] }, "west": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"up": { "texture": "#2", "uv": [ 12.0, 0.0, 5.0, 15.0 ] }, "up": { "texture": "#1", "uv": [ 12, 0, 5, 15 ] },
"down": { "texture": "#2", "uv": [ 12.0, 0.0, 5.0, 15.0 ], "rotation": 180 } "down": { "texture": "#1", "uv": [ 12, 0, 5, 15 ], "rotation": 180 }
} }
}, },
{ {
"name": "B33", "name": "B33",
"from": [ 2.0, 2.2000000029802322, -8.0 ], "from": [ 2, 2, -8 ],
"to": [ 10.0, 13.799999997019768, 7.0 ], "to": [ 10, 14, 7 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 22.5 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 22.5 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.599999994039536 ] }, "north": { "texture": "#1", "uv": [ 0, 0, 8, 12 ] },
"east": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.599999994039536 ] }, "east": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.599999994039536 ] }, "south": { "texture": "#1", "uv": [ 0, 0, 8, 12 ] },
"west": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.599999994039536 ] }, "west": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"up": { "texture": "#2", "uv": [ 9.0, 0.0, 1.0, 15.0 ] }, "up": { "texture": "#1", "uv": [ 9, 0, 1, 15 ] },
"down": { "texture": "#2", "uv": [ 9.0, 0.0, 1.0, 15.0 ], "rotation": 180 } "down": { "texture": "#1", "uv": [ 9, 0, 1, 15 ], "rotation": 180 }
} }
}, },
{ {
"name": "B34", "name": "B34",
"from": [ 2.0, 2.3000000044703484, -8.0 ], "from": [ 2, 2.1, -8 ],
"to": [ 10.0, 13.699999995529652, 7.0 ], "to": [ 10, 13.9, 7 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45.0 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.399999991059303 ] }, "north": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"east": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.399999991059303 ] }, "east": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.399999991059303 ] }, "south": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"west": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.399999991059303 ] }, "west": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"up": { "texture": "#2", "uv": [ 9.0, 0.0, 1.0, 15.0 ] }, "up": { "texture": "#1", "uv": [ 9, 0, 1, 15 ] },
"down": { "texture": "#2", "uv": [ 12.0, 0.0, 4.0, 15.0 ], "rotation": 180 } "down": { "texture": "#1", "uv": [ 12, 0, 4, 15 ], "rotation": 180 }
} }
}, },
{ {
"name": "B41", "name": "B41",
"from": [ 6.0, 2.100000001490116, 9.0 ], "from": [ 6, 2.1, 9 ],
"to": [ 14.0, 13.899999998509884, 24.0 ], "to": [ 14, 13.9, 24 ],
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.799999997019768 ] }, "north": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"east": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.799999997019768 ] }, "east": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.799999997019768 ] }, "south": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"west": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.799999997019768 ] }, "west": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"up": { "texture": "#2", "uv": [ 9.0, 0.0, 1.0, 15.0 ], "rotation": 180 }, "up": { "texture": "#1", "uv": [ 9, 0, 1, 15 ], "rotation": 180 },
"down": { "texture": "#2", "uv": [ 11.0, 0.0, 3.0, 15.0 ] } "down": { "texture": "#1", "uv": [ 11, 0, 3, 15 ] }
} }
}, },
{ {
"name": "B42", "name": "B42",
"from": [ 7.0, 2.0, 9.0 ], "from": [ 7, 2, 9 ],
"to": [ 14.0, 14.0, 24.0 ], "to": [ 14, 14, 24 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -22.5 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": -22.5 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 7.0, 12.0 ] }, "north": { "texture": "#1", "uv": [ 0, 0, 7, 12 ] },
"east": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 13.0 ] }, "east": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"south": { "texture": "#2", "uv": [ 2.0, 0.0, 9.0, 12.0 ] }, "south": { "texture": "#1", "uv": [ 2, 0, 9, 12 ] },
"west": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 13.0 ] }, "west": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"up": { "texture": "#2", "uv": [ 9.0, 0.0, 2.0, 15.0 ], "rotation": 180 }, "up": { "texture": "#1", "uv": [ 9, 0, 2, 15 ], "rotation": 180 },
"down": { "texture": "#2", "uv": [ 9.0, 0.0, 2.0, 15.0 ] } "down": { "texture": "#1", "uv": [ 9, 0, 2, 15 ] }
} }
}, },
{ {
"name": "B43", "name": "B43",
"from": [ 6.0, 2.2000000029802322, 9.0 ], "from": [ 6, 2, 9 ],
"to": [ 14.0, 13.799999997019768, 24.0 ], "to": [ 14, 14, 24 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 22.5 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 22.5 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.599999994039536 ] }, "north": { "texture": "#1", "uv": [ 0, 0, 8, 12 ] },
"east": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.599999994039536 ] }, "east": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.599999994039536 ] }, "south": { "texture": "#1", "uv": [ 0, 0, 8, 12 ] },
"west": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.599999994039536 ] }, "west": { "texture": "#1", "uv": [ 0, 1, 15, 13 ] },
"up": { "texture": "#2", "uv": [ 9.0, 0.0, 1.0, 15.0 ], "rotation": 180 }, "up": { "texture": "#1", "uv": [ 9, 0, 1, 15 ], "rotation": 180 },
"down": { "texture": "#2", "uv": [ 11.0, 0.0, 3.0, 15.0 ] } "down": { "texture": "#1", "uv": [ 11, 0, 3, 15 ] }
} }
}, },
{ {
"name": "B44", "name": "B44",
"from": [ 6.0, 2.3000000044703484, 9.0 ], "from": [ 6, 2.1, 9 ],
"to": [ 14.0, 13.699999995529652, 24.0 ], "to": [ 14, 13.9, 24 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45.0 },
"faces": { "faces": {
"north": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.399999991059303 ] }, "north": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"east": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.399999991059303 ] }, "east": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"south": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 11.399999991059303 ] }, "south": { "texture": "#1", "uv": [ 0, 0, 8, 11.8 ] },
"west": { "texture": "#2", "uv": [ 0.0, 1.0, 15.0, 12.399999991059303 ] }, "west": { "texture": "#1", "uv": [ 0, 1, 15, 12.8 ] },
"up": { "texture": "#2", "uv": [ 9.0, 0.0, 1.0, 15.0 ], "rotation": 180 }, "up": { "texture": "#1", "uv": [ 9, 0, 1, 15 ], "rotation": 180 },
"down": { "texture": "#2", "uv": [ 9.0, 0.0, 1.0, 15.0 ] } "down": { "texture": "#1", "uv": [ 9, 0, 1, 15 ] }
} }
}, },
{ {
"name": "Reinforcement", "name": "AxisCoat",
"from": [ 18.0, 1.6000000089406967, 2.999999985098839 ], "from": [ 4, 1, 4 ],
"to": [ 20.0, 14.399999991059303, 12.999999985098839 ], "to": [ 12, 15, 12 ],
"shade": false,
"faces": { "faces": {
"north": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.799999982118607 ] }, "north": { "texture": "#spruce_log", "uv": [ 4, 1, 12, 15 ] },
"east": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.799999982118607 ] }, "east": { "texture": "#spruce_log", "uv": [ 4, 1, 12, 15 ] },
"south": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.799999982118607 ] }, "south": { "texture": "#spruce_log", "uv": [ 4, 1, 12, 15 ] },
"west": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.799999982118607 ] }, "west": { "texture": "#spruce_log", "uv": [ 4, 1, 12, 15 ] },
"up": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 10.0 ] }, "up": { "texture": "#spruce_log_top", "uv": [ 4, 4, 12, 12 ] },
"down": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 10.0 ] } "down": { "texture": "#spruce_log_top", "uv": [ 4, 4, 12, 12 ] }
} }
}, },
{ {
"name": "Cube", "name": "Cover",
"from": [ 18.0, 1.5000000074505806, 3.0 ], "from": [ -4, 1.9, -4 ],
"to": [ 20.0, 14.49999999254942, 13.0 ], "to": [ 20, 14.1, 20 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 },
"faces": { "faces": {
"north": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.999999985098839 ] }, "up": { "texture": "#crushing_wheel", "uv": [ 2, 2, 14, 14 ] },
"east": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.999999985098839 ] }, "down": { "texture": "#crushing_wheel", "uv": [ 2, 2, 14, 14 ] }
"south": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.999999985098839 ] },
"west": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.999999985098839 ] },
"up": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 10.0 ] },
"down": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 10.0 ] }
}
},
{
"name": "Cube",
"from": [ 18.0, 1.5000000074505806, 3.0 ],
"to": [ 20.0, 14.49999999254942, 13.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.999999985098839 ] },
"east": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.999999985098839 ] },
"south": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.999999985098839 ] },
"west": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.999999985098839 ] },
"up": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 10.0 ] },
"down": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 10.0 ] }
}
},
{
"name": "Cube",
"from": [ -4.0, 1.5000000074505806, 3.0 ],
"to": [ -2.0, 14.49999999254942, 13.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.999999985098839 ] },
"east": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.999999985098839 ] },
"south": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.999999985098839 ] },
"west": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.999999985098839 ] },
"up": { "texture": "#3", "uv": [ 14.0, 0.0, 16.0, 10.0 ] },
"down": { "texture": "#3", "uv": [ 14.0, 0.0, 16.0, 10.0 ] }
}
},
{
"name": "Cube",
"from": [ -4.0, 1.5000000074505806, 3.0 ],
"to": [ -2.0, 14.49999999254942, 13.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 },
"faces": {
"north": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.999999985098839 ] },
"east": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.999999985098839 ] },
"south": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.999999985098839 ] },
"west": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.999999985098839 ] },
"up": { "texture": "#3", "uv": [ 14.0, 0.0, 16.0, 10.0 ] },
"down": { "texture": "#3", "uv": [ 14.0, 0.0, 16.0, 10.0 ] }
}
},
{
"name": "Cube",
"from": [ -4.0, 1.6000000089406967, 3.0 ],
"to": [ -2.0, 14.399999991059303, 13.0 ],
"faces": {
"north": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.799999982118607 ] },
"east": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.799999982118607 ] },
"south": { "texture": "#3", "uv": [ 0.0, 1.0, 2.0, 13.799999982118607 ] },
"west": { "texture": "#3", "uv": [ 0.0, 0.0, 10.0, 12.799999982118607 ] },
"up": { "texture": "#3", "uv": [ 14.0, 0.0, 16.0, 10.0 ] },
"down": { "texture": "#3", "uv": [ 14.0, 0.0, 16.0, 10.0 ] }
}
},
{
"name": "Cube",
"from": [ 3.0, 1.6000000089406967, -4.0 ],
"to": [ 13.0, 14.399999991059303, -2.0 ],
"faces": {
"north": { "texture": "#3", "uv": [ 0.0, 1.0, 10.0, 13.799999982118607 ] },
"east": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 12.799999982118607 ] },
"south": { "texture": "#3", "uv": [ 0.0, 1.0, 10.0, 13.799999982118607 ] },
"west": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 12.799999982118607 ] },
"up": { "texture": "#3", "uv": [ 0.0, 3.0, 2.0, 13.0 ], "rotation": 270 },
"down": { "texture": "#3", "uv": [ 0.0, 3.0, 2.0, 13.0 ], "rotation": 90 }
}
},
{
"name": "Cube",
"from": [ 3.0, 1.6000000089406967, 18.0 ],
"to": [ 13.0, 14.399999991059303, 20.0 ],
"faces": {
"north": { "texture": "#3", "uv": [ 0.0, 1.0, 10.0, 13.799999982118607 ] },
"east": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 12.799999982118607 ] },
"south": { "texture": "#3", "uv": [ 0.0, 1.0, 10.0, 13.799999982118607 ] },
"west": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 12.799999982118607 ] },
"up": { "texture": "#3", "uv": [ 0.0, 3.0, 2.0, 13.0 ], "rotation": 90 },
"down": { "texture": "#3", "uv": [ 0.0, 3.0, 2.0, 12.0 ], "rotation": 270 }
} }
} }
] ]

View file

@ -1,6 +1,13 @@
{ {
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"parent": "block/cube", "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", "particle": "block/anvil",
"0": "block/anvil", "0": "block/anvil",

View file

@ -1,6 +1,13 @@
{ {
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"parent": "block/cube", "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", "particle": "block/anvil",
"0": "block/smooth_stone", "0": "block/smooth_stone",

View file

@ -1,6 +1,6 @@
{ {
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"parent": "block/cube", "parent": "create:block/large_wheels",
"textures": { "textures": {
"particle": "block/stripped_spruce_log", "particle": "block/stripped_spruce_log",
"0": "create:block/axis", "0": "create:block/axis",

View file

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

View file

@ -1,6 +1,6 @@
{ {
"__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)",
"parent": "block/cube", "parent": "create:block/large_wheels",
"textures": { "textures": {
"axis": "create:block/axis", "axis": "create:block/axis",
"axis_top": "create:block/axis_top", "axis_top": "create:block/axis_top",

View file

@ -1,3 +1,3 @@
{ {
"parent": "create:block/drill" "parent": "create:block/drill_fixated"
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:allium"
}
],
"results": [
{
"item": "minecraft:magenta_dye",
"count": 2
},
{
"item": "minecraft:purple_dye",
"count": 2,
"chance": 0.1
},
{
"item": "minecraft:pink_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,22 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:andesite"
}
],
"results": [
{
"item": "minecraft:cobblestone",
"count": 1,
"chance": 0.5
},
{
"item": "minecraft:diorite",
"count": 1,
"chance": 0.25
}
],
"processingTime": 200
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:azure_bluet"
}
],
"results": [
{
"item": "minecraft:light_gray_dye",
"count": 2
},
{
"item": "minecraft:white_dye",
"count": 2,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:blaze_rod"
}
],
"results": [
{
"item": "minecraft:blaze_powder",
"count": 3
},
{
"item": "minecraft:blaze_powder",
"count": 3,
"chance": 0.25
}
],
"processingTime": 100
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:blue_orchid"
}
],
"results": [
{
"item": "minecraft:light_blue_dye",
"count": 2
},
{
"item": "minecraft:light_gray_dye",
"count": 1,
"chance": 0.05
}
],
"processingTime": 50
}

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:bone"
}
],
"results": [
{
"item": "minecraft:bone_meal",
"count": 3
},
{
"item": "minecraft:white_dye",
"count": 1,
"chance": 0.25
},
{
"item": "minecraft:bone_meal",
"count": 3,
"chance": 0.25
}
],
"processingTime": 100
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:bone_meal"
}
],
"results": [
{
"item": "minecraft:white_dye",
"count": 2
},
{
"item": "minecraft:light_gray_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 70
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:cactus"
}
],
"results": [
{
"item": "minecraft:green_dye",
"count": 2
},
{
"item": "minecraft:green_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:charcoal"
}
],
"results": [
{
"item": "minecraft:black_dye",
"count": 1
},
{
"item": "minecraft:gray_dye",
"count": 2,
"chance": 0.1
}
],
"processingTime": 100
}

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:clay"
}
],
"results": [
{
"item": "minecraft:clay_ball",
"count": 3
},
{
"item": "minecraft:clay_ball",
"count": 1,
"chance": 0.5
},
{
"item": "minecraft:flint",
"count": 1,
"chance": 0.2
}
],
"processingTime": 50
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:coal"
}
],
"results": [
{
"item": "minecraft:black_dye",
"count": 2
},
{
"item": "minecraft:gray_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 100
}

View file

@ -0,0 +1,16 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:cobblestone"
}
],
"results": [
{
"item": "minecraft:gravel",
"count": 1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:cocoa_beans"
}
],
"results": [
{
"item": "minecraft:brown_dye",
"count": 2
},
{
"item": "minecraft:brown_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,16 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:cornflower"
}
],
"results": [
{
"item": "minecraft:blue_dye",
"count": 2
}
],
"processingTime": 50
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:dandelion"
}
],
"results": [
{
"item": "minecraft:yellow_dye",
"count": 2
},
{
"item": "minecraft:yellow_dye",
"count": 1,
"chance": 0.05
}
],
"processingTime": 50
}

View file

@ -0,0 +1,31 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:diamond_horse_armor"
}
],
"results": [
{
"item": "minecraft:diamond",
"count": 1
},
{
"item": "minecraft:leather",
"count": 2,
"chance": 0.5
},
{
"item": "minecraft:diamond",
"count": 3,
"chance": 0.1
},
{
"item": "minecraft:string",
"count": 2,
"chance": 0.25
}
],
"processingTime": 200
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:diorite"
}
],
"results": [
{
"item": "minecraft:cobblestone",
"count": 1
},
{
"item": "minecraft:quartz",
"count": 1,
"chance": 0.5
}
],
"processingTime": 200
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:fern"
}
],
"results": [
{
"item": "minecraft:green_dye",
"count": 1
},
{
"item": "minecraft:wheat_seeds",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,36 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:golden_horse_armor"
}
],
"results": [
{
"item": "minecraft:gold_ingot",
"count": 2
},
{
"item": "minecraft:leather",
"count": 2,
"chance": 0.5
},
{
"item": "minecraft:gold_ingot",
"count": 2,
"chance": 0.5
},
{
"item": "minecraft:string",
"count": 2,
"chance": 0.25
},
{
"item": "minecraft:gold_nugget",
"count": 8,
"chance": 0.25
}
],
"processingTime": 200
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:granite"
}
],
"results": [
{
"item": "minecraft:diorite",
"count": 1
},
{
"item": "minecraft:quartz",
"count": 1,
"chance": 0.5
}
],
"processingTime": 200
}

View file

@ -0,0 +1,17 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:grass"
}
],
"results": [
{
"item": "minecraft:wheat_seeds",
"count": 1,
"chance": 0.25
}
],
"processingTime": 50
}

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:gravel"
}
],
"results": [
{
"item": "minecraft:sand",
"count": 1
},
{
"item": "minecraft:clay_ball",
"count": 1,
"chance": 0.1
},
{
"item": "minecraft:flint",
"count": 1,
"chance": 0.2
}
],
"processingTime": 50
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:ink_sac"
}
],
"results": [
{
"item": "minecraft:black_dye",
"count": 2
},
{
"item": "minecraft:gray_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 100
}

View file

@ -0,0 +1,36 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:iron_horse_armor"
}
],
"results": [
{
"item": "minecraft:iron_ingot",
"count": 2
},
{
"item": "minecraft:leather",
"count": 2,
"chance": 0.5
},
{
"item": "minecraft:iron_ingot",
"count": 2,
"chance": 0.5
},
{
"item": "minecraft:string",
"count": 2,
"chance": 0.25
},
{
"item": "minecraft:iron_nugget",
"count": 8,
"chance": 0.25
}
],
"processingTime": 200
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:lapis_lazuli"
}
],
"results": [
{
"item": "minecraft:blue_dye",
"count": 2
},
{
"item": "minecraft:blue_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 100
}

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:large_fern"
}
],
"results": [
{
"item": "minecraft:green_dye",
"count": 2
},
{
"item": "minecraft:green_dye",
"count": 1,
"chance": 0.5
},
{
"item": "minecraft:wheat_seeds",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,31 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:leather_horse_armor"
}
],
"results": [
{
"item": "minecraft:leather",
"count": 3
},
{
"item": "minecraft:leather",
"count": 2,
"chance": 0.5
},
{
"item": "minecraft:string",
"count": 2,
"chance": 0.25
},
{
"item": "minecraft:iron_nugget",
"count": 8,
"chance": 0.25
}
],
"processingTime": 200
}

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:lilac"
}
],
"results": [
{
"item": "minecraft:magenta_dye",
"count": 3
},
{
"item": "minecraft:magenta_dye",
"count": 1,
"chance": 0.25
},
{
"item": "minecraft:purple_dye",
"count": 1,
"chance": 0.25
}
],
"processingTime": 100
}

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:lily_of_the_valley"
}
],
"results": [
{
"item": "minecraft:white_dye",
"count": 2
},
{
"item": "minecraft:lime_dye",
"count": 1,
"chance": 0.1
},
{
"item": "minecraft:white_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:orange_tulip"
}
],
"results": [
{
"item": "minecraft:orange_dye",
"count": 2
},
{
"item": "minecraft:lime_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:oxeye_daisy"
}
],
"results": [
{
"item": "minecraft:light_gray_dye",
"count": 2
},
{
"item": "minecraft:white_dye",
"count": 1,
"chance": 0.2
},
{
"item": "minecraft:yellow_dye",
"count": 1,
"chance": 0.05
}
],
"processingTime": 50
}

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:peony"
}
],
"results": [
{
"item": "minecraft:pink_dye",
"count": 3
},
{
"item": "minecraft:magenta_dye",
"count": 1,
"chance": 0.25
},
{
"item": "minecraft:pink_dye",
"count": 1,
"chance": 0.25
}
],
"processingTime": 100
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:pink_tulip"
}
],
"results": [
{
"item": "minecraft:pink_dye",
"count": 2
},
{
"item": "minecraft:lime_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:poppy"
}
],
"results": [
{
"item": "minecraft:red_dye",
"count": 2
},
{
"item": "minecraft:green_dye",
"count": 1,
"chance": 0.05
}
],
"processingTime": 50
}

View file

@ -0,0 +1,31 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:prismarine_crystals"
}
],
"results": [
{
"item": "minecraft:prismarine_shard",
"count": 2
},
{
"item": "minecraft:quartz",
"count": 2,
"chance": 0.75
},
{
"item": "minecraft:prismarine_shard",
"count": 2,
"chance": 0.125
},
{
"item": "minecraft:glowstone_dust",
"count": 3,
"chance": 0.1
}
],
"processingTime": 150
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:red_tulip"
}
],
"results": [
{
"item": "minecraft:red_dye",
"count": 2
},
{
"item": "minecraft:lime_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:rose_bush"
}
],
"results": [
{
"item": "minecraft:red_dye",
"count": 3
},
{
"item": "minecraft:green_dye",
"count": 2,
"chance": 0.05
},
{
"item": "minecraft:red_dye",
"count": 2,
"chance": 0.25
}
],
"processingTime": 50
}

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:saddle"
}
],
"results": [
{
"item": "minecraft:leather",
"count": 3
},
{
"item": "minecraft:leather",
"count": 2,
"chance": 0.5
},
{
"item": "minecraft:iron_nugget",
"count": 8,
"chance": 0.25
}
],
"processingTime": 200
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:sugar_cane"
}
],
"results": [
{
"item": "minecraft:sugar",
"count": 2
},
{
"item": "minecraft:sugar",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,26 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:sunflower"
}
],
"results": [
{
"item": "minecraft:yellow_dye",
"count": 3
},
{
"item": "minecraft:yellow_dye",
"count": 1,
"chance": 0.25
},
{
"item": "minecraft:orange_dye",
"count": 1,
"chance": 0.25
}
],
"processingTime": 100
}

View file

@ -0,0 +1,17 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:tall_grass"
}
],
"results": [
{
"item": "minecraft:wheat_seeds",
"count": 2,
"chance": 0.25
}
],
"processingTime": 100
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:white_tulip"
}
],
"results": [
{
"item": "minecraft:white_dye",
"count": 2
},
{
"item": "minecraft:lime_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"item": "minecraft:wither_rose"
}
],
"results": [
{
"item": "minecraft:black_dye",
"count": 2
},
{
"item": "minecraft:black_dye",
"count": 1,
"chance": 0.1
}
],
"processingTime": 50
}

View file

@ -0,0 +1,21 @@
{
"type": "create:crushing",
"group": "minecraft:misc",
"ingredients": [
{
"tag": "minecraft:wool"
}
],
"results": [
{
"item": "minecraft:string",
"count": 2
},
{
"item": "minecraft:string",
"count": 2,
"chance": 0.5
}
],
"processingTime": 100
}

View file

@ -1,6 +1,6 @@
{ {
"replace": false, "replace": false,
"values": [ "values": [
"create:belt" "create:belt", "create:crushing_wheel"
] ]
} }