feat!: include Furnace Engine

BREAKING CHANGE: uses normal create instead of fork
This commit is contained in:
Timo Ley 2023-12-04 16:08:50 +01:00
parent 52bfdb7d82
commit 116a0461d8
62 changed files with 2842 additions and 150 deletions

View File

@ -131,9 +131,9 @@ repositories {
dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
//implementation fg.deobf("curse.maven:create-328085:3737418")
implementation fg.deobf("curse.maven:create-328085:4625533")
//implementation fg.deobf("curse.maven:flywheel-486392:3737402")
implementation fg.deobf("com.simibubi.create:create-1.18.2:0.5.1.c:all")
//implementation fg.deobf("com.simibubi.create:create-1.18.2:0.5.1.c:all")
implementation fg.deobf("com.jozufozu.flywheel:flywheel-forge-1.18.2:0.6.9-101")
implementation fg.deobf("com.tterrag.registrate:Registrate:MC1.18.2-1.1.3")
//implementation fg.deobf("curse.maven:immersive-engineering-231951:3377691")
@ -230,3 +230,30 @@ curseforge {
}
}
}
publishing {
tasks.publish.dependsOn 'build'
publications {
mavenJava(MavenPublication) {
artifactId = project.archivesBaseName
artifact sourcesJar
artifact jar
}
}
repositories {
if (project.hasProperty('mvnURL')) {
maven {
credentials {
username findProperty("mvnUsername")
password findProperty("mvnPassword")
}
url = findProperty("mvnURL")
}
}
else {
mavenLocal()
}
}
}

View File

@ -2,10 +2,10 @@ package com.teammoeg.steampowered;
import com.simibubi.create.content.kinetics.BlockStressDefaults;
import com.simibubi.create.content.kinetics.BlockStressValues.IStressValueProvider;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.engine.EngineBlock;
import com.simibubi.create.foundation.utility.Couple;
import com.teammoeg.steampowered.content.alternator.DynamoBlock;
import com.teammoeg.steampowered.create.flywheel.engine.EngineBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import net.minecraft.world.level.block.Block;

View File

@ -27,6 +27,7 @@ import com.simibubi.create.content.kinetics.BlockStressValues;
import com.simibubi.create.foundation.data.CreateRegistrate;
import com.teammoeg.steampowered.client.Particles;
import com.teammoeg.steampowered.client.SteamPoweredClient;
import com.teammoeg.steampowered.create.flywheel.engine.FurnaceEngineInteractions;
import com.teammoeg.steampowered.network.PacketHandler;
import com.teammoeg.steampowered.registrate.SPBlocks;
import com.teammoeg.steampowered.registrate.SPItems;
@ -87,6 +88,7 @@ public class SteamPowered {
SPTiles.register();
SPItems.register();
SPTags.init();
FurnaceEngineInteractions.registerDefaults();
BlockStressValues.registerProvider(MODID,new SPStress());
ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, SPConfig.COMMON_CONFIG);
ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, SPConfig.SERVER_CONFIG);

View File

@ -30,12 +30,12 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.kinetics.base.KineticBlockEntityInstance;
import com.simibubi.create.content.kinetics.base.flwdata.RotatingData;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.teammoeg.steampowered.block.SPBlockPartials;
import com.teammoeg.steampowered.mixin.FlywheelTileEntityAccess;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
import net.minecraft.world.level.block.Rotation;
@ -97,8 +97,7 @@ public class BronzeFlywheelInstance extends KineticBlockEntityInstance<FlywheelB
}
// Mixin
FlywheelTileEntityAccess access = (FlywheelTileEntityAccess) tile;
animate(access.getAngle());
animate(tile.angle);
}
@ -107,9 +106,8 @@ public class BronzeFlywheelInstance extends KineticBlockEntityInstance<FlywheelB
float partialTicks = AnimationTickHolder.getPartialTicks();
// Mixin
FlywheelTileEntityAccess access = (FlywheelTileEntityAccess) blockEntity;
float speed = access.getVisualSpeed().getValue(partialTicks) * 3 / 10f;
float angle = access.getAngle() + speed * partialTicks;
float speed = blockEntity.visualSpeed.getValue(partialTicks) * 3 / 10f;
float angle = blockEntity.angle + speed * partialTicks;
if (Math.abs(angle - lastAngle) < 0.001) return;

View File

@ -30,12 +30,12 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.kinetics.base.KineticBlockEntityInstance;
import com.simibubi.create.content.kinetics.base.flwdata.RotatingData;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.teammoeg.steampowered.block.SPBlockPartials;
import com.teammoeg.steampowered.mixin.FlywheelTileEntityAccess;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
import net.minecraft.world.level.block.Rotation;
@ -97,8 +97,7 @@ public class CastIronFlywheelInstance extends KineticBlockEntityInstance<Flywhee
}
// Mixin
FlywheelTileEntityAccess access = (FlywheelTileEntityAccess) tile;
animate(access.getAngle());
animate(tile.angle);
}
@Override
@ -107,9 +106,8 @@ public class CastIronFlywheelInstance extends KineticBlockEntityInstance<Flywhee
float partialTicks = AnimationTickHolder.getPartialTicks();
// Mixin
FlywheelTileEntityAccess access = (FlywheelTileEntityAccess) blockEntity;
float speed = access.getVisualSpeed().getValue(partialTicks) * 3 / 10f;
float angle = access.getAngle() + speed * partialTicks;
float speed = blockEntity.visualSpeed.getValue(partialTicks) * 3 / 10f;
float angle = blockEntity.angle + speed * partialTicks;
if (Math.abs(angle - lastAngle) < 0.001) return;

View File

@ -30,12 +30,12 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.kinetics.base.KineticBlockEntityInstance;
import com.simibubi.create.content.kinetics.base.flwdata.RotatingData;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.teammoeg.steampowered.block.SPBlockPartials;
import com.teammoeg.steampowered.mixin.FlywheelTileEntityAccess;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
import net.minecraft.world.level.block.Rotation;
@ -97,8 +97,7 @@ public class SteelFlywheelInstance extends KineticBlockEntityInstance<FlywheelBl
}
// Mixin
FlywheelTileEntityAccess access = (FlywheelTileEntityAccess) tile;
animate(access.getAngle());
animate(tile.angle);
}
@Override
@ -107,9 +106,8 @@ public class SteelFlywheelInstance extends KineticBlockEntityInstance<FlywheelBl
float partialTicks = AnimationTickHolder.getPartialTicks();
// Mixin
FlywheelTileEntityAccess access = (FlywheelTileEntityAccess) blockEntity;
float speed = access.getVisualSpeed().getValue(partialTicks) * 3 / 10f;
float angle = access.getAngle() + speed * partialTicks;
float speed = blockEntity.visualSpeed.getValue(partialTicks) * 3 / 10f;
float angle = blockEntity.angle + speed * partialTicks;
if (Math.abs(angle - lastAngle) < 0.001) return;

View File

@ -25,13 +25,12 @@ import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock;
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;
import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.teammoeg.steampowered.block.SPBlockPartials;
import com.teammoeg.steampowered.mixin.FlywheelTileEntityAccess;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.client.renderer.MultiBufferSource;
@ -55,9 +54,8 @@ public class BronzeFlywheelRenderer extends KineticBlockEntityRenderer<KineticBl
BlockState blockState = te.getBlockState();
FlywheelBlockEntity wte = (FlywheelBlockEntity) te;
// Mixin starts
FlywheelTileEntityAccess access = (FlywheelTileEntityAccess) wte;
float speed = access.getVisualSpeed().getValue(partialTicks) * 3.0F / 10.0F;
float angle = access.getAngle() + speed * partialTicks;
float speed = wte.visualSpeed.getValue(partialTicks) * 3.0F / 10.0F;
float angle = wte.angle + speed * partialTicks;
// Mixin ends
VertexConsumer vb = buffer.getBuffer(RenderType.solid());
if (FlywheelBlock.isConnected(blockState)) {

View File

@ -25,13 +25,12 @@ import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock;
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;
import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.teammoeg.steampowered.block.SPBlockPartials;
import com.teammoeg.steampowered.mixin.FlywheelTileEntityAccess;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.client.renderer.MultiBufferSource;
@ -55,9 +54,8 @@ public class CastIronFlywheelRenderer extends KineticBlockEntityRenderer<Kinetic
BlockState blockState = te.getBlockState();
FlywheelBlockEntity wte = (FlywheelBlockEntity) te;
// Mixin starts
FlywheelTileEntityAccess access = (FlywheelTileEntityAccess) wte;
float speed = access.getVisualSpeed().getValue(partialTicks) * 3.0F / 10.0F;
float angle = access.getAngle() + speed * partialTicks;
float speed = wte.visualSpeed.getValue(partialTicks) * 3.0F / 10.0F;
float angle = wte.angle + speed * partialTicks;
// Mixin ends
VertexConsumer vb = buffer.getBuffer(RenderType.solid());
if (FlywheelBlock.isConnected(blockState)) {

View File

@ -25,13 +25,12 @@ import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock;
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;
import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.teammoeg.steampowered.block.SPBlockPartials;
import com.teammoeg.steampowered.mixin.FlywheelTileEntityAccess;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.client.renderer.MultiBufferSource;
@ -55,9 +54,8 @@ public class SteelFlywheelRenderer extends KineticBlockEntityRenderer<KineticBlo
BlockState blockState = te.getBlockState();
FlywheelBlockEntity wte = (FlywheelBlockEntity) te;
// Mixin starts
FlywheelTileEntityAccess access = (FlywheelTileEntityAccess) wte;
float speed = access.getVisualSpeed().getValue(partialTicks) * 3.0F / 10.0F;
float angle = access.getAngle() + speed * partialTicks;
float speed = wte.visualSpeed.getValue(partialTicks) * 3.0F / 10.0F;
float angle = wte.angle + speed * partialTicks;
// Mixin ends
VertexConsumer vb = buffer.getBuffer(RenderType.solid());
if (FlywheelBlock.isConnected(blockState)) {

View File

@ -25,10 +25,11 @@ import javax.annotation.Nullable;
import com.jozufozu.flywheel.core.PartialModel;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.AllShapes;
import com.simibubi.create.content.kinetics.flywheel.engine.EngineBlock;
import com.teammoeg.steampowered.FluidRegistry;
import com.teammoeg.steampowered.ItemRegistry;
import com.teammoeg.steampowered.client.Particles;
import com.teammoeg.steampowered.create.flywheel.PartialModels;
import com.teammoeg.steampowered.create.flywheel.engine.EngineBlock;
import com.teammoeg.steampowered.registrate.SPTiles;
import net.minecraft.world.level.block.Block;
@ -96,7 +97,7 @@ public class SteamEngineBlock extends EngineBlock {
@Nullable
@Override
public PartialModel getFrameModel() {
return AllPartialModels.FURNACE_GENERATOR_FRAME;
return PartialModels.FURNACE_GENERATOR_FRAME;
}
@Override

View File

@ -19,12 +19,13 @@
package com.teammoeg.steampowered.content.engine;
import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.simibubi.create.content.kinetics.flywheel.engine.EngineBlock;
import com.simibubi.create.content.kinetics.flywheel.engine.EngineTileEntity;
import com.teammoeg.steampowered.FluidRegistry;
import com.teammoeg.steampowered.SPTags;
import com.teammoeg.steampowered.create.flywheel.engine.EngineBlock;
import com.teammoeg.steampowered.create.flywheel.engine.EngineTileEntity;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;

View File

@ -18,8 +18,8 @@
package com.teammoeg.steampowered.content.flywheel;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import com.teammoeg.steampowered.registrate.SPTiles;
import net.minecraft.world.level.block.entity.BlockEntityType;

View File

@ -18,8 +18,8 @@
package com.teammoeg.steampowered.content.flywheel;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import com.teammoeg.steampowered.registrate.SPTiles;
import net.minecraft.world.level.block.entity.BlockEntityType;

View File

@ -18,8 +18,8 @@
package com.teammoeg.steampowered.content.flywheel;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import com.teammoeg.steampowered.registrate.SPTiles;
import net.minecraft.world.level.block.entity.BlockEntityType;

View File

@ -0,0 +1,28 @@
package com.teammoeg.steampowered.create.flywheel;
import com.jozufozu.flywheel.core.PartialModel;
import com.simibubi.create.Create;
import com.teammoeg.steampowered.SteamPowered;
public class PartialModels {
public static final PartialModel
FLYWHEEL = block("flywheel/wheel"),
FLYWHEEL_UPPER_ROTATING = block("flywheel/upper_rotating_connector"),
FLYWHEEL_LOWER_ROTATING = block("flywheel/lower_rotating_connector"),
FLYWHEEL_UPPER_SLIDING = block("flywheel/upper_sliding_connector"),
FLYWHEEL_LOWER_SLIDING = block("flywheel/lower_sliding_connector"),
FURNACE_GENERATOR_FRAME = createBlock("furnace_engine/frame");
private static PartialModel block(String path) {
return new PartialModel(SteamPowered.rl("block/" + path));
}
private static PartialModel createBlock(String path) {
return new PartialModel(Create.asResource("block/" + path));
}
public static void init() {
// init static fields
}
}

View File

@ -0,0 +1,93 @@
package com.teammoeg.steampowered.create.flywheel.engine;
import javax.annotation.Nullable;
import com.jozufozu.flywheel.core.PartialModel;
import com.simibubi.create.content.equipment.wrench.IWrenchable;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.HorizontalDirectionalBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public abstract class EngineBlock extends HorizontalDirectionalBlock implements IWrenchable {
protected EngineBlock(Properties builder) {
super(builder);
}
@Override
public boolean canSurvive(BlockState state, LevelReader worldIn, BlockPos pos) {
return isValidPosition(state, worldIn, pos, state.getValue(FACING));
}
@Override
public InteractionResult onWrenched(BlockState state, UseOnContext context) {
return InteractionResult.FAIL;
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
Direction facing = context.getClickedFace();
return defaultBlockState().setValue(FACING,
facing.getAxis().isVertical() ? context.getHorizontalDirection().getOpposite() : facing);
}
@Override
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) {
super.createBlockStateDefinition(builder.add(FACING));
}
@Override
public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
if (worldIn.isClientSide)
return;
if (fromPos.equals(getBaseBlockPos(state, pos))) {
if (!canSurvive(state, worldIn, pos)) {
worldIn.destroyBlock(pos, true);
return;
}
}
}
private boolean isValidPosition(BlockState state, BlockGetter world, BlockPos pos, Direction facing) {
BlockPos baseBlockPos = getBaseBlockPos(state, pos);
if (!isValidBaseBlock(world.getBlockState(baseBlockPos), world, pos))
return false;
for (Direction otherFacing : Iterate.horizontalDirections) {
if (otherFacing == facing)
continue;
BlockPos otherPos = baseBlockPos.relative(otherFacing);
BlockState otherState = world.getBlockState(otherPos);
if (otherState.getBlock() instanceof EngineBlock
&& getBaseBlockPos(otherState, otherPos).equals(baseBlockPos))
return false;
}
return true;
}
public static BlockPos getBaseBlockPos(BlockState state, BlockPos pos) {
return pos.relative(state.getValue(FACING).getOpposite());
}
@Nullable
@OnlyIn(Dist.CLIENT)
public abstract PartialModel getFrameModel();
protected abstract boolean isValidBaseBlock(BlockState baseBlock, BlockGetter world, BlockPos pos);
}

View File

@ -0,0 +1,51 @@
package com.teammoeg.steampowered.create.flywheel.engine;
import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.backend.instancing.blockentity.BlockEntityInstance;
import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.core.materials.model.ModelData;
import com.simibubi.create.foundation.utility.AngleHelper;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
public class EngineInstance extends BlockEntityInstance<EngineTileEntity> {
protected ModelData frame;
public EngineInstance(MaterialManager modelManager, EngineTileEntity tile) {
super(modelManager, tile);
Block block = blockState
.getBlock();
if (!(block instanceof EngineBlock engineBlock))
return;
PartialModel frame = engineBlock.getFrameModel();
Direction facing = blockState.getValue(BlockStateProperties.HORIZONTAL_FACING);
this.frame = getTransformMaterial().getModel(frame, blockState).createInstance();
float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing));
this.frame.loadIdentity()
.translate(getInstancePosition())
.nudge(pos.hashCode())
.centre()
.rotate(Direction.UP, angle)
.unCentre()
.translate(0, 0, -1);
}
@Override
public void remove() {
frame.delete();
}
@Override
public void updateLight() {
relight(pos, frame);
}
}

View File

@ -0,0 +1,45 @@
package com.teammoeg.steampowered.create.flywheel.engine;
import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.core.PartialModel;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer;
import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.utility.AngleHelper;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.Block;
public class EngineRenderer<T extends EngineTileEntity> extends SafeBlockEntityRenderer<T> {
public EngineRenderer(BlockEntityRendererProvider.Context context) {
}
@Override
protected void renderSafe(T te, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light,
int overlay) {
if (Backend.canUseInstancing(te.getLevel())) return;
Block block = te.getBlockState()
.getBlock();
if (block instanceof EngineBlock) {
EngineBlock engineBlock = (EngineBlock) block;
PartialModel frame = engineBlock.getFrameModel();
if (frame != null) {
Direction facing = te.getBlockState()
.getValue(EngineBlock.FACING);
float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing));
CachedBufferer.partial(frame, te.getBlockState())
.rotateCentered(Direction.UP, angle)
.translate(0, 0, -1)
.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.solid()));
}
}
}
}

View File

@ -0,0 +1,92 @@
package com.teammoeg.steampowered.create.flywheel.engine;
import java.util.List;
import com.simibubi.create.foundation.blockEntity.SmartBlockEntity;
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import com.teammoeg.steampowered.registrate.SPBlocks;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
public class EngineTileEntity extends SmartBlockEntity {
public float appliedCapacity;
public float appliedSpeed;
protected FlywheelBlockEntity poweredWheel;
public EngineTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
@Override
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
}
@Override
protected AABB createRenderBoundingBox() {
return super.createRenderBoundingBox().inflate(1.5f);
}
@Override
public void lazyTick() {
super.lazyTick();
if (level.isClientSide)
return;
if (poweredWheel != null && poweredWheel.isRemoved())
poweredWheel = null;
if (poweredWheel == null)
attachWheel();
}
public void attachWheel() {
Direction engineFacing = getBlockState().getValue(EngineBlock.FACING);
BlockPos wheelPos = worldPosition.relative(engineFacing, 2);
BlockState wheelState = level.getBlockState(wheelPos);
if (!SPBlocks.FLYWHEEL.has(wheelState))
return;
Direction wheelFacing = wheelState.getValue(FlywheelBlock.HORIZONTAL_FACING);
if (wheelFacing.getAxis() != engineFacing.getClockWise().getAxis())
return;
if (FlywheelBlock.isConnected(wheelState)
&& FlywheelBlock.getConnection(wheelState) != engineFacing.getOpposite())
return;
BlockEntity te = level.getBlockEntity(wheelPos);
if (te.isRemoved())
return;
if (te instanceof FlywheelBlockEntity) {
if (!FlywheelBlock.isConnected(wheelState))
FlywheelBlock.setConnection(level, te.getBlockPos(), te.getBlockState(), engineFacing.getOpposite());
poweredWheel = (FlywheelBlockEntity) te;
refreshWheelSpeed();
}
}
public void detachWheel() {
if (poweredWheel == null || poweredWheel.isRemoved())
return;
poweredWheel.setRotation(0, 0);
FlywheelBlock.setConnection(level, poweredWheel.getBlockPos(), poweredWheel.getBlockState(), null);
poweredWheel = null;
}
@Override
public void remove() {
detachWheel();
super.remove();
}
protected void refreshWheelSpeed() {
if (poweredWheel == null)
return;
poweredWheel.setRotation(appliedSpeed, appliedCapacity);
}
}

View File

@ -0,0 +1,91 @@
package com.teammoeg.steampowered.create.flywheel.engine;
import com.jozufozu.flywheel.core.PartialModel;
import com.simibubi.create.AllShapes;
import com.simibubi.create.foundation.block.IBE;
import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
import com.teammoeg.steampowered.create.flywheel.PartialModels;
import com.teammoeg.steampowered.registrate.SPBlocks;
import com.teammoeg.steampowered.registrate.SPTiles;
import net.minecraft.core.BlockPos;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.AbstractFurnaceBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock;
import net.minecraftforge.eventbus.api.Event.Result;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber
public class FurnaceEngineBlock extends EngineBlock implements IBE<FurnaceEngineTileEntity> {
public FurnaceEngineBlock(Properties properties) {
super(properties);
}
@Override
protected boolean isValidBaseBlock(BlockState baseBlock, BlockGetter world, BlockPos pos) {
return FurnaceEngineInteractions.getHandler(baseBlock).getHeatSource(baseBlock).isValid();
}
@Override
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) {
return AllShapes.FURNACE_ENGINE.get(state.getValue(FACING));
}
@Override
@OnlyIn(Dist.CLIENT)
public PartialModel getFrameModel() {
return PartialModels.FURNACE_GENERATOR_FRAME;
}
@Override
public void neighborChanged(BlockState state, Level worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving);
if (worldIn instanceof WrappedWorld)
return;
if (worldIn.isClientSide)
return;
if (fromPos.equals(getBaseBlockPos(state, pos)))
if (canSurvive(state, worldIn, pos))
withBlockEntityDo(worldIn, pos, FurnaceEngineTileEntity::updateFurnace);
}
@SubscribeEvent
public static void usingFurnaceEngineOnFurnacePreventsGUI(RightClickBlock event) {
ItemStack item = event.getItemStack();
if (!(item.getItem() instanceof BlockItem blockItem))
return;
if (blockItem.getBlock() != SPBlocks.FURNACE_ENGINE.get())
return;
BlockState state = event.getWorld().getBlockState(event.getPos());
if (event.getFace().getAxis().isVertical())
return;
if (state.getBlock() instanceof AbstractFurnaceBlock)
event.setUseBlock(Result.DENY);
}
@Override
public Class<FurnaceEngineTileEntity> getBlockEntityClass() {
return FurnaceEngineTileEntity.class;
}
@Override
public BlockEntityType<? extends FurnaceEngineTileEntity> getBlockEntityType() {
return SPTiles.FURNACE_ENGINE.get();
}
}

View File

@ -0,0 +1,111 @@
package com.teammoeg.steampowered.create.flywheel.engine;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import net.minecraft.world.level.block.AbstractFurnaceBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.registries.IRegistryDelegate;
/**
* Example:
*
* <pre>
* {@code
* FurnaceEngineInteractions.registerHandler(Blocks.REDSTONE_LAMP.delegate, FurnaceEngineInteractions.InteractionHandler.of(
* s -> s.getBlock() instanceof RedstoneLampBlock && s.hasProperty(RedstoneLampBlock.LIT) ?
* (s.getValue(RedstoneLampBlock.LIT) ? HeatSource.ACTIVE : HeatSource.VALID) : HeatSource.EMPTY, s -> 1.5f));
* }
* </pre>
*/
public class FurnaceEngineInteractions {
private static final Map<IRegistryDelegate<Block>, InteractionHandler> HANDLERS = new HashMap<>();
private static final InteractionHandler DEFAULT_HANDLER = new InteractionHandler() {};
public static void registerHandler(IRegistryDelegate<Block> block, InteractionHandler handler) {
HANDLERS.put(block, handler);
}
public static InteractionHandler getHandler(IRegistryDelegate<Block> delegate) {
return HANDLERS.getOrDefault(delegate, DEFAULT_HANDLER);
}
public static InteractionHandler getHandler(BlockState state) {
return getHandler(state.getBlock().delegate);
}
public static void registerDefaults() {
registerHandler(Blocks.BLAST_FURNACE.delegate, InteractionHandler.ofCustomSpeedModifier(state -> 2f));
}
public interface InteractionHandler {
default HeatSource getHeatSource(BlockState state) {
if (state.getBlock() instanceof AbstractFurnaceBlock && state.hasProperty(AbstractFurnaceBlock.LIT)) {
if (state.getValue(AbstractFurnaceBlock.LIT)) {
return HeatSource.ACTIVE;
} else {
return HeatSource.VALID;
}
}
return HeatSource.EMPTY;
}
default float getSpeedModifier(BlockState state) {
return 1f;
};
static InteractionHandler of(Function<BlockState, HeatSource> heatSourceFunc, Function<BlockState, Float> speedModifierFunc) {
return new InteractionHandler() {
@Override
public HeatSource getHeatSource(BlockState state) {
return heatSourceFunc.apply(state);
}
@Override
public float getSpeedModifier(BlockState state) {
return speedModifierFunc.apply(state);
}
};
}
static InteractionHandler ofCustomHeatSource(Function<BlockState, HeatSource> heatSourceFunc) {
return new InteractionHandler() {
@Override
public HeatSource getHeatSource(BlockState state) {
return heatSourceFunc.apply(state);
}
};
}
static InteractionHandler ofCustomSpeedModifier(Function<BlockState, Float> speedModifierFunc) {
return new InteractionHandler() {
@Override
public float getSpeedModifier(BlockState state) {
return speedModifierFunc.apply(state);
}
};
}
}
public enum HeatSource {
EMPTY,
VALID,
ACTIVE;
public boolean isEmpty() {
return this == EMPTY;
}
public boolean isValid() {
return this != EMPTY;
}
public boolean isActive() {
return this == ACTIVE;
}
}
}

View File

@ -0,0 +1,43 @@
package com.teammoeg.steampowered.create.flywheel.engine;
import com.simibubi.create.content.kinetics.BlockStressValues;
import com.teammoeg.steampowered.create.flywheel.engine.FurnaceEngineInteractions.HeatSource;
import com.teammoeg.steampowered.create.flywheel.engine.FurnaceEngineInteractions.InteractionHandler;
import com.teammoeg.steampowered.registrate.SPBlocks;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
public class FurnaceEngineTileEntity extends EngineTileEntity {
public FurnaceEngineTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
@Override
public void lazyTick() {
updateFurnace();
super.lazyTick();
}
public void updateFurnace() {
BlockState state = level.getBlockState(EngineBlock.getBaseBlockPos(getBlockState(), worldPosition));
InteractionHandler handler = FurnaceEngineInteractions.getHandler(state);
HeatSource heatSource = handler.getHeatSource(state);
if (heatSource.isEmpty())
return;
float modifier = handler.getSpeedModifier(state);
boolean active = heatSource.isActive();
float speed = active ? 16 * modifier : 0;
float capacity =
(float) (active ? BlockStressValues.getCapacity(SPBlocks.FURNACE_ENGINE.get())
: 0);
appliedCapacity = capacity;
appliedSpeed = speed;
refreshWheelSpeed();
}
}

View File

@ -0,0 +1,122 @@
package com.teammoeg.steampowered.create.flywheel.legacy;
import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock;
import com.simibubi.create.foundation.block.IBE;
import com.simibubi.create.foundation.utility.Lang;
import com.teammoeg.steampowered.create.flywheel.engine.EngineTileEntity;
import com.teammoeg.steampowered.create.flywheel.engine.FurnaceEngineBlock;
import com.teammoeg.steampowered.registrate.SPTiles;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraft.world.level.block.state.properties.EnumProperty;
public class FlywheelBlock extends HorizontalKineticBlock implements IBE<FlywheelBlockEntity> {
public static final EnumProperty<ConnectionState> CONNECTION = EnumProperty.create("connection", ConnectionState.class);
public FlywheelBlock(Properties properties) {
super(properties);
registerDefaultState(defaultBlockState().setValue(CONNECTION, ConnectionState.NONE));
}
@Override
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) {
super.createBlockStateDefinition(builder.add(CONNECTION));
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
Direction preferred = getPreferredHorizontalFacing(context);
if (preferred != null)
return defaultBlockState().setValue(HORIZONTAL_FACING, preferred.getOpposite());
return this.defaultBlockState().setValue(HORIZONTAL_FACING, context.getHorizontalDirection());
}
public static boolean isConnected(BlockState state) {
return getConnection(state) != null;
}
public static Direction getConnection(BlockState state) {
Direction facing = state.getValue(HORIZONTAL_FACING);
ConnectionState connection = state.getValue(CONNECTION);
if (connection == ConnectionState.LEFT)
return facing.getCounterClockWise();
if (connection == ConnectionState.RIGHT)
return facing.getClockWise();
return null;
}
public static void setConnection(Level world, BlockPos pos, BlockState state, Direction direction) {
Direction facing = state.getValue(HORIZONTAL_FACING);
ConnectionState connection = ConnectionState.NONE;
if (direction == facing.getClockWise())
connection = ConnectionState.RIGHT;
if (direction == facing.getCounterClockWise())
connection = ConnectionState.LEFT;
world.setBlock(pos, state.setValue(CONNECTION, connection), 18);
//AllTriggers.triggerForNearbyPlayers(AllTriggers.FLYWHEEL, world, pos, 4);
}
@Override
public boolean hasShaftTowards(LevelReader world, BlockPos pos, BlockState state, Direction face) {
return face == state.getValue(HORIZONTAL_FACING).getOpposite();
}
@Override
public Axis getRotationAxis(BlockState state) {
return state.getValue(HORIZONTAL_FACING).getAxis();
}
@Override
public InteractionResult onWrenched(BlockState state, UseOnContext context) {
Direction connection = getConnection(state);
if (connection == null)
return super.onWrenched(state ,context);
if (context.getClickedFace().getAxis() == state.getValue(HORIZONTAL_FACING).getAxis())
return InteractionResult.PASS;
Level world = context.getLevel();
BlockPos enginePos = context.getClickedPos().relative(connection, 2);
BlockState engine = world.getBlockState(enginePos);
if (engine.getBlock() instanceof FurnaceEngineBlock)
((FurnaceEngineBlock) engine.getBlock()).withBlockEntityDo(world, enginePos, EngineTileEntity::detachWheel);
return super.onWrenched(state.setValue(CONNECTION, ConnectionState.NONE), context);
}
public enum ConnectionState implements StringRepresentable {
NONE, LEFT, RIGHT;
@Override
public String getSerializedName() {
return Lang.asId(name());
}
}
@Override
public Class<FlywheelBlockEntity> getBlockEntityClass() {
return FlywheelBlockEntity.class;
}
@Override
public BlockEntityType<? extends FlywheelBlockEntity> getBlockEntityType() {
return SPTiles.FLYWHEEL.get();
}
}

View File

@ -0,0 +1,132 @@
package com.teammoeg.steampowered.create.flywheel.legacy;
import com.simibubi.create.content.kinetics.base.GeneratingKineticBlockEntity;
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser;
import com.teammoeg.steampowered.content.engine.SteamEngineTileEntity;
import com.teammoeg.steampowered.create.flywheel.engine.EngineBlock;
import com.teammoeg.steampowered.create.flywheel.engine.EngineTileEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
public class FlywheelBlockEntity extends GeneratingKineticBlockEntity {
private float generatedCapacity;
private float generatedSpeed;
private int stoppingCooldown;
// Client
public LerpedFloat visualSpeed = LerpedFloat.linear();
public float angle;
public FlywheelBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
public void setRotation(float speed, float capacity) {
if (generatedSpeed != speed || generatedCapacity != capacity) {
if (speed == 0) {
if (stoppingCooldown == 0)
stoppingCooldown = 40;
return;
}
stoppingCooldown = 0;
generatedSpeed = speed;
generatedCapacity = capacity;
updateGeneratedRotation();
}
}
@Override
public float getGeneratedSpeed() {
return convertToDirection(generatedSpeed, getBlockState().getValue(FlywheelBlock.HORIZONTAL_FACING));
}
@Override
public float calculateAddedStressCapacity() {
return lastCapacityProvided = generatedCapacity;
}
@Override
protected AABB createRenderBoundingBox() {
return super.createRenderBoundingBox().inflate(2);
}
@Override
public void write(CompoundTag compound, boolean clientPacket) {
compound.putFloat("GeneratedSpeed", generatedSpeed);
compound.putFloat("GeneratedCapacity", generatedCapacity);
compound.putInt("Cooldown", stoppingCooldown);
super.write(compound, clientPacket);
}
@Override
protected void read(CompoundTag compound, boolean clientPacket) {
generatedSpeed = compound.getFloat("GeneratedSpeed");
generatedCapacity = compound.getFloat("GeneratedCapacity");
stoppingCooldown = compound.getInt("Cooldown");
super.read(compound, clientPacket);
if (clientPacket)
visualSpeed.chase(getGeneratedSpeed(), 1 / 64f, Chaser.EXP);
}
@Override
public void tick() {
// Old Mixin start
Direction at=FlywheelBlock.getConnection(getBlockState());
if(at!=null) {
BlockPos eng=this.getBlockPos().relative(at,2);
Block b=this.getLevel().getBlockState(eng).getBlock();
if(!(b instanceof EngineBlock)) {
FlywheelBlock.setConnection(getLevel(),getBlockPos(),getBlockState(),null);
this.setRotation(0,0);
}else {
BlockEntity te=this.getLevel().getBlockEntity(eng);
if(te instanceof EngineTileEntity) {
if(te instanceof SteamEngineTileEntity) {
SteamEngineTileEntity ete=(SteamEngineTileEntity) te;
if(ete.getFlywheel()!=this.getBlockState().getBlock())
this.setRotation(0,0);
}
}else this.setRotation(0,0);
}
}else this.setRotation(0,0);
// Old Mixin stop
super.tick();
if (level.isClientSide) {
float targetSpeed = isVirtual() ? speed : getGeneratedSpeed();
visualSpeed.updateChaseTarget(targetSpeed);
visualSpeed.tickChaser();
angle += visualSpeed.getValue() * 3 / 10f;
angle %= 360;
return;
}
/*
* After getting moved by pistons the generatedSpeed attribute reads 16 but the
* actual speed stays at 0, if it happens update rotation
*/
if (getGeneratedSpeed() != 0 && getSpeed() == 0)
updateGeneratedRotation();
if (stoppingCooldown == 0)
return;
stoppingCooldown--;
if (stoppingCooldown == 0) {
generatedCapacity = 0;
generatedSpeed = 0;
updateGeneratedRotation();
}
}
}

View File

@ -0,0 +1,30 @@
package com.teammoeg.steampowered.create.flywheel.legacy;
import com.simibubi.create.foundation.data.SpecialBlockStateGen;
import com.tterrag.registrate.providers.DataGenContext;
import com.tterrag.registrate.providers.RegistrateBlockstateProvider;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.generators.ModelFile;
public class FlywheelGenerator extends SpecialBlockStateGen {
@Override
protected int getXRotation(BlockState state) {
return 0;
}
@Override
protected int getYRotation(BlockState state) {
return horizontalAngle(state.getValue(FlywheelBlock.HORIZONTAL_FACING)) + 90;
}
@Override
public <T extends Block> ModelFile getModel(DataGenContext<Block, T> ctx, RegistrateBlockstateProvider prov,
BlockState state) {
return prov.models()
.getExistingFile(prov.modLoc("block/" + ctx.getName() + "/casing_" + state.getValue(FlywheelBlock.CONNECTION)
.getSerializedName()));
}
}

View File

@ -0,0 +1,208 @@
package com.teammoeg.steampowered.create.flywheel.legacy;
import static net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING;
import java.util.Collections;
import java.util.List;
import com.google.common.collect.Lists;
import com.jozufozu.flywheel.api.InstanceData;
import com.jozufozu.flywheel.api.Instancer;
import com.jozufozu.flywheel.api.Material;
import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
import com.jozufozu.flywheel.core.materials.model.ModelData;
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.kinetics.base.KineticBlockEntityInstance;
import com.simibubi.create.content.kinetics.base.flwdata.RotatingData;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.teammoeg.steampowered.create.flywheel.PartialModels;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
import net.minecraft.world.level.block.Rotation;
import net.minecraft.world.level.block.state.BlockState;
public class FlywheelInstance extends KineticBlockEntityInstance<FlywheelBlockEntity> implements DynamicInstance {
protected final Direction facing;
protected final Direction connection;
protected boolean connectedLeft;
protected float connectorAngleMult;
protected final RotatingData shaft;
protected final ModelData wheel;
protected List<ModelData> connectors;
protected ModelData upperRotating;
protected ModelData lowerRotating;
protected ModelData upperSliding;
protected ModelData lowerSliding;
protected float lastAngle = Float.NaN;
public FlywheelInstance(MaterialManager modelManager, FlywheelBlockEntity tile) {
super(modelManager, tile);
facing = blockState.getValue(HORIZONTAL_FACING);
shaft = setup(shaftModel().createInstance());
BlockState referenceState = blockState.rotate(Rotation.CLOCKWISE_90);
wheel = getTransformMaterial()
.getModel(PartialModels.FLYWHEEL, referenceState, referenceState.getValue(HORIZONTAL_FACING))
.createInstance();
connection = FlywheelBlock.getConnection(blockState);
if (connection != null) {
connectedLeft = blockState.getValue(FlywheelBlock.CONNECTION) == FlywheelBlock.ConnectionState.LEFT;
boolean flipAngle = connection.getAxis() == Direction.Axis.X
^ connection.getAxisDirection() == Direction.AxisDirection.NEGATIVE;
connectorAngleMult = flipAngle ? -1 : 1;
Material<ModelData> mat = getTransformMaterial();
upperRotating = mat.getModel(PartialModels.FLYWHEEL_UPPER_ROTATING, blockState)
.createInstance();
lowerRotating = mat.getModel(PartialModels.FLYWHEEL_LOWER_ROTATING, blockState)
.createInstance();
upperSliding = mat.getModel(PartialModels.FLYWHEEL_UPPER_SLIDING, blockState)
.createInstance();
lowerSliding = mat.getModel(PartialModels.FLYWHEEL_LOWER_SLIDING, blockState)
.createInstance();
connectors = Lists.newArrayList(upperRotating, lowerRotating, upperSliding, lowerSliding);
} else {
connectors = Collections.emptyList();
}
animate(tile.angle);
}
@Override
public void beginFrame() {
float partialTicks = AnimationTickHolder.getPartialTicks();
float speed = blockEntity.visualSpeed.getValue(partialTicks) * 3 / 10f;
float angle = blockEntity.angle + speed * partialTicks;
if (Math.abs(angle - lastAngle) < 0.001)
return;
animate(angle);
lastAngle = angle;
}
private void animate(float angle) {
PoseStack ms = new PoseStack();
TransformStack msr = TransformStack.cast(ms);
msr.translate(getInstancePosition());
if (connection != null) {
float rotation = angle * connectorAngleMult;
ms.pushPose();
rotateToFacing(msr, connection);
ms.pushPose();
transformConnector(msr, true, true, rotation, connectedLeft);
upperRotating.setTransform(ms);
ms.popPose();
ms.pushPose();
transformConnector(msr, false, true, rotation, connectedLeft);
lowerRotating.setTransform(ms);
ms.popPose();
ms.pushPose();
transformConnector(msr, true, false, rotation, connectedLeft);
upperSliding.setTransform(ms);
ms.popPose();
ms.pushPose();
transformConnector(msr, false, false, rotation, connectedLeft);
lowerSliding.setTransform(ms);
ms.popPose();
ms.popPose();
}
msr.centre()
.rotate(Direction.get(Direction.AxisDirection.POSITIVE, facing.getAxis()), AngleHelper.rad(angle))
.unCentre();
wheel.setTransform(ms);
}
@Override
public void update() {
updateRotation(shaft);
}
@Override
public void updateLight() {
relight(pos, shaft, wheel);
if (connection != null) {
relight(this.pos.relative(connection), connectors.stream());
}
}
@Override
public void remove() {
shaft.delete();
wheel.delete();
connectors.forEach(InstanceData::delete);
connectors.clear();
}
protected Instancer<RotatingData> shaftModel() {
Direction opposite = facing.getOpposite();
return getRotatingMaterial().getModel(AllPartialModels.SHAFT_HALF, blockState, opposite);
}
protected void transformConnector(TransformStack ms, boolean upper, boolean rotating, float angle,
boolean flip) {
float shift = upper ? 1 / 4f : -1 / 8f;
float offset = upper ? 1 / 4f : 1 / 4f;
float radians = (float) (angle / 180 * Math.PI);
float shifting = Mth.sin(radians) * shift + offset;
float maxAngle = upper ? -5 : -15;
float minAngle = upper ? -45 : 5;
float barAngle = 0;
if (rotating)
barAngle = Mth.lerp((Mth.sin((float) (radians + Math.PI / 2)) + 1) / 2, minAngle, maxAngle);
float pivotX = (upper ? 8f : 3f) / 16;
float pivotY = (upper ? 8f : 2f) / 16;
float pivotZ = (upper ? 23f : 21.5f) / 16f;
ms.translate(pivotX, pivotY, pivotZ + shifting);
if (rotating)
ms.rotate(Direction.EAST, AngleHelper.rad(barAngle));
ms.translate(-pivotX, -pivotY, -pivotZ);
if (flip && !upper)
ms.translate(9 / 16f, 0, 0);
}
protected void rotateToFacing(TransformStack buffer, Direction facing) {
buffer.centre()
.rotate(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing)))
.unCentre();
}
}

View File

@ -0,0 +1,130 @@
package com.teammoeg.steampowered.create.flywheel.legacy;
import static com.simibubi.create.content.kinetics.base.HorizontalKineticBlock.HORIZONTAL_FACING;
import com.jozufozu.flywheel.backend.Backend;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.kinetics.base.KineticBlockEntity;
import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer;
import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.teammoeg.steampowered.create.flywheel.PartialModels;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock.ConnectionState;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.core.Direction.AxisDirection;
import net.minecraft.util.Mth;
import net.minecraft.world.level.block.Rotation;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
public class FlywheelRenderer extends KineticBlockEntityRenderer<FlywheelBlockEntity> {
public FlywheelRenderer(BlockEntityRendererProvider.Context context) {
super(context);
}
@Override
protected void renderSafe(FlywheelBlockEntity te, float partialTicks, PoseStack ms, MultiBufferSource buffer,
int light, int overlay) {
super.renderSafe(te, partialTicks, ms, buffer, light, overlay);
if (Backend.canUseInstancing(te.getLevel())) return;
BlockState blockState = te.getBlockState();
FlywheelBlockEntity wte = (FlywheelBlockEntity) te;
float speed = wte.visualSpeed.getValue(partialTicks) * 3 / 10f;
float angle = wte.angle + speed * partialTicks;
VertexConsumer vb = buffer.getBuffer(RenderType.solid());
if (FlywheelBlock.isConnected(blockState)) {
Direction connection = FlywheelBlock.getConnection(blockState);
light = LevelRenderer.getLightColor(te.getLevel(), blockState, te.getBlockPos()
.relative(connection));
float rotation =
connection.getAxis() == Axis.X ^ connection.getAxisDirection() == AxisDirection.NEGATIVE ? -angle
: angle;
boolean flip = blockState.getValue(FlywheelBlock.CONNECTION) == ConnectionState.LEFT;
transformConnector(
rotateToFacing(CachedBufferer.partial(PartialModels.FLYWHEEL_UPPER_ROTATING, blockState), connection), true, true,
rotation, flip).light(light)
.renderInto(ms, vb);
transformConnector(
rotateToFacing(CachedBufferer.partial(PartialModels.FLYWHEEL_LOWER_ROTATING, blockState), connection), false, true,
rotation, flip).light(light)
.renderInto(ms, vb);
transformConnector(rotateToFacing(CachedBufferer.partial(PartialModels.FLYWHEEL_UPPER_SLIDING, blockState), connection),
true, false, rotation, flip).light(light)
.renderInto(ms, vb);
transformConnector(rotateToFacing(CachedBufferer.partial(PartialModels.FLYWHEEL_LOWER_SLIDING, blockState), connection),
false, false, rotation, flip).light(light)
.renderInto(ms, vb);
}
renderFlywheel(te, ms, light, blockState, angle, vb);
}
private void renderFlywheel(KineticBlockEntity te, PoseStack ms, int light, BlockState blockState, float angle, VertexConsumer vb) {
BlockState referenceState = blockState.rotate(Rotation.CLOCKWISE_90);
Direction facing = referenceState.getValue(BlockStateProperties.HORIZONTAL_FACING);
SuperByteBuffer wheel = CachedBufferer.partialFacing(PartialModels.FLYWHEEL, referenceState, facing);
kineticRotationTransform(wheel, te, blockState.getValue(HORIZONTAL_FACING)
.getAxis(), AngleHelper.rad(angle), light);
wheel.renderInto(ms, vb);
}
@Override
protected SuperByteBuffer getRotatedModel(FlywheelBlockEntity te, BlockState state) {
return CachedBufferer.partialFacing(AllPartialModels.SHAFT_HALF, state, state
.getValue(BlockStateProperties.HORIZONTAL_FACING)
.getOpposite());
}
protected SuperByteBuffer transformConnector(SuperByteBuffer buffer, boolean upper, boolean rotating, float angle,
boolean flip) {
float shift = upper ? 1 / 4f : -1 / 8f;
float offset = upper ? 1 / 4f : 1 / 4f;
float radians = (float) (angle / 180 * Math.PI);
float shifting = Mth.sin(radians) * shift + offset;
float maxAngle = upper ? -5 : -15;
float minAngle = upper ? -45 : 5;
float barAngle = 0;
if (rotating)
barAngle = Mth.lerp((Mth.sin((float) (radians + Math.PI / 2)) + 1) / 2, minAngle, maxAngle);
float pivotX = (upper ? 8f : 3f) / 16;
float pivotY = (upper ? 8f : 2f) / 16;
float pivotZ = (upper ? 23f : 21.5f) / 16f;
buffer.translate(pivotX, pivotY, pivotZ + shifting);
if (rotating)
buffer.rotate(Direction.EAST, AngleHelper.rad(barAngle));
buffer.translate(-pivotX, -pivotY, -pivotZ);
if (flip && !upper)
buffer.translate(9 / 16f, 0, 0);
return buffer;
}
protected SuperByteBuffer rotateToFacing(SuperByteBuffer buffer, Direction facing) {
buffer.rotateCentered(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing)));
return buffer;
}
}

View File

@ -1,34 +0,0 @@
/*
* Copyright (c) 2021 TeamMoeg
*
* This file is part of Steam Powered.
*
* Steam Powered is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* Steam Powered is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Steam Powered. If not, see <https://www.gnu.org/licenses/>.
*/
package com.teammoeg.steampowered.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
@Mixin(FlywheelBlockEntity.class)
public interface FlywheelTileEntityAccess {
@Accessor(remap = false)
LerpedFloat getVisualSpeed();
@Accessor(remap = false)
float getAngle();
}

View File

@ -0,0 +1,19 @@
package com.teammoeg.steampowered.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.simibubi.create.AllPartialModels;
import com.teammoeg.steampowered.create.flywheel.PartialModels;
@Mixin(AllPartialModels.class)
public class MixinAllPartialModels {
@Inject(method = "<clinit>", at = @At("HEAD"), remap = false)
private static void onInit(CallbackInfo ci) {
PartialModels.init();
}
}

View File

@ -1,51 +0,0 @@
package com.teammoeg.steampowered.mixin;
import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.simibubi.create.content.kinetics.base.GeneratingKineticBlockEntity;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.simibubi.create.content.kinetics.flywheel.engine.EngineBlock;
import com.simibubi.create.content.kinetics.flywheel.engine.EngineTileEntity;
import com.teammoeg.steampowered.content.engine.SteamEngineTileEntity;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.core.Direction;
import net.minecraft.core.BlockPos;
@Mixin(FlywheelBlockEntity.class)
public abstract class MixinFlywheel extends GeneratingKineticBlockEntity{
public MixinFlywheel(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
@Shadow(remap=false)
public abstract void setRotation(float speed, float capacity);
@Inject(at=@At("HEAD"),method="tick",remap = false)
public void sp$tick(CallbackInfo cbi) {
Direction at=FlywheelBlock.getConnection(getBlockState());
if(at!=null) {
BlockPos eng=this.getBlockPos().relative(at,2);
Block b=this.getLevel().getBlockState(eng).getBlock();
if(!(b instanceof EngineBlock)) {
FlywheelBlock.setConnection(getLevel(),getBlockPos(),getBlockState(),null);
this.setRotation(0,0);
}else {
BlockEntity te=this.getLevel().getBlockEntity(eng);
if(te instanceof EngineTileEntity) {
if(te instanceof SteamEngineTileEntity) {
SteamEngineTileEntity ete=(SteamEngineTileEntity) te;
if(ete.getFlywheel()!=this.getBlockState().getBlock())
this.setRotation(0,0);
}
}else this.setRotation(0,0);
}
}else this.setRotation(0,0);
}
}

View File

@ -18,8 +18,6 @@
package com.teammoeg.steampowered.ponder;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlock.ConnectionState;
import com.simibubi.create.foundation.ponder.PonderPalette;
import com.simibubi.create.foundation.ponder.SceneBuilder;
import com.simibubi.create.foundation.ponder.SceneBuildingUtil;
@ -30,6 +28,8 @@ import com.teammoeg.steampowered.SPConfig;
import com.teammoeg.steampowered.content.alternator.DynamoBlock;
import com.teammoeg.steampowered.content.burner.BurnerBlock;
import com.teammoeg.steampowered.content.engine.SteamEngineBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock.ConnectionState;
import com.teammoeg.steampowered.registrate.SPBlocks;
import net.minecraft.world.level.block.LeverBlock;

View File

@ -26,9 +26,9 @@ import static com.simibubi.create.foundation.data.TagGen.pickaxeOnly;
import javax.annotation.Nonnull;
import com.simibubi.create.AllTags;
import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.Create;
import com.simibubi.create.content.kinetics.BlockStressDefaults;
import com.simibubi.create.content.kinetics.flywheel.FlywheelGenerator;
import com.simibubi.create.content.kinetics.simpleRelays.BracketedKineticBlockModel;
import com.simibubi.create.content.kinetics.simpleRelays.CogwheelBlockItem;
import com.simibubi.create.foundation.data.BlockStateGen;
@ -50,9 +50,13 @@ import com.teammoeg.steampowered.content.engine.SteelSteamEngineBlock;
import com.teammoeg.steampowered.content.flywheel.BronzeSteamFlywheelBlock;
import com.teammoeg.steampowered.content.flywheel.CastIronSteamFlywheelBlock;
import com.teammoeg.steampowered.content.flywheel.SteelSteamFlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.engine.FurnaceEngineBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlock;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelGenerator;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.MaterialColor;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.SoundType;
@ -229,6 +233,27 @@ public class SPBlocks {
.transform(customItemModel())
.register();
public static final BlockEntry<FlywheelBlock> FLYWHEEL = REGISTRATE.block("flywheel", FlywheelBlock::new)
.initialProperties(SharedProperties::softMetal)
.properties(p -> p.color(MaterialColor.TERRACOTTA_YELLOW))
.properties(BlockBehaviour.Properties::noOcclusion)
.transform(axeOrPickaxe())
.transform(BlockStressDefaults.setNoImpact())
.blockstate(new FlywheelGenerator()::generate)
.item()
.transform(customItemModel())
.register();
public static final BlockEntry<FurnaceEngineBlock> FURNACE_ENGINE = Create.REGISTRATE.block("furnace_engine", FurnaceEngineBlock::new)
.initialProperties(SharedProperties::softMetal)
.transform(pickaxeOnly())
.tag(AllBlockTags.BRITTLE.tag)
.blockstate(BlockStateGen.horizontalBlockProvider(true))
.transform(BlockStressDefaults.setCapacity(1024.0))
.item()
.transform(customItemModel())
.register();
public static void register() {
/*Create.REGISTRATE.addToSection(BRONZE_STEAM_ENGINE, AllSections.KINETICS);
Create.REGISTRATE.addToSection(CAST_IRON_STEAM_ENGINE, AllSections.KINETICS);

View File

@ -18,9 +18,9 @@
package com.teammoeg.steampowered.registrate;
import com.simibubi.create.Create;
import com.simibubi.create.content.kinetics.base.KineticBlockEntityRenderer;
import com.simibubi.create.content.kinetics.base.SingleRotatingInstance;
import com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity;
import com.simibubi.create.foundation.data.CreateRegistrate;
import com.teammoeg.steampowered.SteamPowered;
import com.teammoeg.steampowered.client.instance.BronzeFlywheelInstance;
@ -40,6 +40,12 @@ import com.teammoeg.steampowered.content.cogwheel.MetalCogwheelTileEntity;
import com.teammoeg.steampowered.content.engine.BronzeSteamEngineTileEntity;
import com.teammoeg.steampowered.content.engine.CastIronSteamEngineTileEntity;
import com.teammoeg.steampowered.content.engine.SteelSteamEngineTileEntity;
import com.teammoeg.steampowered.create.flywheel.engine.EngineInstance;
import com.teammoeg.steampowered.create.flywheel.engine.EngineRenderer;
import com.teammoeg.steampowered.create.flywheel.engine.FurnaceEngineTileEntity;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelBlockEntity;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelInstance;
import com.teammoeg.steampowered.create.flywheel.legacy.FlywheelRenderer;
import com.tterrag.registrate.util.entry.BlockEntityEntry;
@ -126,6 +132,20 @@ public class SPTiles {
.renderer(() -> SteelFlywheelRenderer::new)
.register();
public static final BlockEntityEntry<FlywheelBlockEntity> FLYWHEEL = REGISTRATE
.blockEntity("flywheel", FlywheelBlockEntity::new)
.instance(() -> FlywheelInstance::new, false)
.validBlocks(SPBlocks.FLYWHEEL)
.renderer(() -> FlywheelRenderer::new)
.register();
public static final BlockEntityEntry<FurnaceEngineTileEntity> FURNACE_ENGINE = Create.REGISTRATE
.blockEntity("furnace_engine", FurnaceEngineTileEntity::new)
.instance(() -> EngineInstance::new, false)
.validBlocks(SPBlocks.FURNACE_ENGINE)
.renderer(() -> EngineRenderer::new)
.register();
public static void register() {
}
}

View File

@ -0,0 +1,19 @@
{
"variants": {
"facing=north": {
"model": "create:block/furnace_engine/block"
},
"facing=south": {
"model": "create:block/furnace_engine/block",
"y": 180
},
"facing=west": {
"model": "create:block/furnace_engine/block",
"y": 270
},
"facing=east": {
"model": "create:block/furnace_engine/block",
"y": 90
}
}
}

View File

@ -0,0 +1,133 @@
{
"credit": "Made with Blockbench",
"textures": {
"5": "create:block/brass_casing",
"1_1": "create:block/furnace_cylinder",
"particle": "create:block/brass_block"
},
"elements": [
{
"name": "Ring",
"from": [0, 0, 2],
"to": [16, 16, 7],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#5"},
"east": {"uv": [0, 7, 2.5, 15], "texture": "#1_1"},
"south": {"uv": [0, 0, 16, 16], "texture": "#5"},
"west": {"uv": [0, 7, 2.5, 15], "texture": "#1_1"},
"up": {"uv": [0, 7, 2.5, 15], "rotation": 90, "texture": "#1_1"},
"down": {"uv": [0, 7, 2.5, 15], "rotation": 270, "texture": "#1_1"}
}
},
{
"name": "Cylinder",
"from": [1, 1, 0],
"to": [15, 15, 16],
"faces": {
"north": {"uv": [8, 0, 15, 7], "texture": "#1_1"},
"east": {"uv": [0, 0, 8, 7], "rotation": 180, "texture": "#1_1"},
"south": {"uv": [8, 0, 15, 7], "texture": "#1_1"},
"west": {"uv": [0, 0, 8, 7], "texture": "#1_1"},
"up": {"uv": [0, 0, 8, 7], "rotation": 90, "texture": "#1_1"},
"down": {"uv": [0, 0, 8, 7], "rotation": 270, "texture": "#1_1"}
}
},
{
"from": [1.5, 0, 7],
"to": [5.5, 4, 16],
"faces": {
"east": {"uv": [2.5, 7, 7, 9], "rotation": 180, "texture": "#1_1"},
"west": {"uv": [2.5, 7, 7, 9], "rotation": 180, "texture": "#1_1"},
"up": {"uv": [2.5, 7, 7, 9], "rotation": 270, "texture": "#1_1"},
"down": {"uv": [2.5, 7, 7, 9], "rotation": 90, "texture": "#1_1"}
}
},
{
"from": [10.5, 0, 7],
"to": [14.5, 4, 16],
"faces": {
"east": {"uv": [7, 7, 2.5, 9], "rotation": 180, "texture": "#1_1"},
"west": {"uv": [7, 7, 2.5, 9], "rotation": 180, "texture": "#1_1"},
"up": {"uv": [2.5, 9, 7, 7], "rotation": 270, "texture": "#1_1"},
"down": {"uv": [2.5, 9, 7, 7], "rotation": 90, "texture": "#1_1"}
}
},
{
"name": "LowerPort",
"from": [1.5, 0.1, -0.9],
"to": [5.5, 4.1, 2.1],
"faces": {
"north": {"uv": [2.5, 13, 4.5, 15], "texture": "#1_1"},
"east": {"uv": [3, 13, 4.5, 15], "texture": "#1_1"},
"south": {"uv": [10, 0, 14, 4], "texture": "#1_1"},
"west": {"uv": [3, 13, 4.5, 15], "rotation": 180, "texture": "#1_1"},
"up": {"uv": [3, 13, 4.5, 15], "rotation": 270, "texture": "#1_1"},
"down": {"uv": [3, 13, 4.5, 15], "rotation": 90, "texture": "#1_1"}
}
},
{
"name": "LowerPort",
"from": [10.5, 0.1, -0.9],
"to": [14.5, 4.1, 2.1],
"faces": {
"north": {"uv": [4.5, 13, 2.5, 15], "texture": "#1_1"},
"east": {"uv": [4.5, 13, 3, 15], "rotation": 180, "texture": "#1_1"},
"south": {"uv": [14, 0, 10, 4], "texture": "#1_1"},
"west": {"uv": [4.5, 13, 3, 15], "texture": "#1_1"},
"up": {"uv": [3, 15, 4.5, 13], "rotation": 270, "texture": "#1_1"},
"down": {"uv": [3, 15, 4.5, 13], "rotation": 90, "texture": "#1_1"}
}
},
{
"name": "Port",
"from": [4, 4, -1.8],
"to": [12, 12, 0.2],
"faces": {
"north": {"uv": [2.5, 9, 6.5, 13], "texture": "#1_1"},
"east": {"uv": [5.5, 9, 6.5, 13], "texture": "#1_1"},
"west": {"uv": [5.5, 9, 6.5, 13], "rotation": 180, "texture": "#1_1"},
"up": {"uv": [5.5, 9, 6.5, 13], "rotation": 270, "texture": "#1_1"},
"down": {"uv": [5.5, 9, 6.5, 13], "rotation": 90, "texture": "#1_1"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 135, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 135, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 225, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 45, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"rotation": [0, 180, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "SteamCylinder",
"origin": [8, 8, 8],
"children": [0, 1, 2, 3, 4, 5, 6]
}
]
}

View File

@ -0,0 +1,89 @@
{
"credit": "Made with Blockbench",
"textures": {
"particle": "create:block/steam_engine_wheel",
"1_1": "create:block/furnace_cylinder"
},
"elements": [
{
"name": "Cylinder",
"from": [1.1, 1.1, -1.9],
"to": [14.9, 14.9, 0.1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 7]},
"faces": {
"north": {"uv": [8, 0, 15, 7], "texture": "#1_1"},
"east": {"uv": [14, 0, 15, 7], "texture": "#1_1"},
"south": {"uv": [7, 7, 16, 16], "texture": "#1_1"},
"west": {"uv": [14, 0, 15, 7], "rotation": 180, "texture": "#1_1"},
"up": {"uv": [14, 0, 15, 7], "rotation": 270, "texture": "#1_1"},
"down": {"uv": [14, 0, 15, 7], "rotation": 90, "texture": "#1_1"}
}
},
{
"from": [-0.9, 12, -0.9],
"to": [16.9, 16.1, 16.9],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 7]},
"faces": {
"north": {"uv": [7, 7, 16, 9], "texture": "#1_1"},
"east": {"uv": [7, 7, 16, 9], "texture": "#1_1"},
"south": {"uv": [7, 7, 16, 9], "texture": "#1_1"},
"west": {"uv": [7, 7, 16, 9], "texture": "#1_1"},
"up": {"uv": [7, 7, 16, 16], "rotation": 270, "texture": "#1_1"},
"down": {"uv": [7, 7, 16, 16], "rotation": 90, "texture": "#1_1"}
}
},
{
"from": [-0.9, 8, -0.9],
"to": [16.9, 12, 16.9],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 7]},
"faces": {
"north": {"uv": [7, 14, 16, 16], "texture": "#1_1"},
"east": {"uv": [7, 14, 16, 16], "texture": "#1_1"},
"south": {"uv": [7, 14, 16, 16], "texture": "#1_1"},
"west": {"uv": [7, 14, 16, 16], "texture": "#1_1"},
"up": {"uv": [7, 7, 16, 16], "rotation": 270, "texture": "#1_1"},
"down": {"uv": [7, 7, 16, 16], "rotation": 90, "texture": "#1_1"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, -67, 0],
"translation": [0, 2.5, -2],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, -67, 0],
"translation": [0, 2.5, -2],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, -91, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, -91, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"rotation": [90, 0, 0],
"translation": [0, 2, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"translation": [-0.25, 0.75, 0],
"scale": [0.35, 0.35, 0.35]
},
"fixed": {
"scale": [0.45, 0.45, 0.45]
}
},
"groups": [
{
"name": "SteamCylinder",
"origin": [8, 8, 8],
"children": [0, 1, 2]
}
]
}

View File

@ -0,0 +1,123 @@
{
"credit": "Made with Blockbench",
"textures": {
"5": "create:block/brass_casing",
"1_1": "create:block/furnace_cylinder"
},
"elements": [
{
"name": "Ring",
"from": [0, 0, 9],
"to": [16, 16, 14],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#5"},
"east": {"uv": [0, 7, 2.5, 15], "texture": "#1_1"},
"south": {"uv": [0, 0, 16, 16], "texture": "#5"},
"west": {"uv": [0, 7, 2.5, 15], "texture": "#1_1"},
"up": {"uv": [0, 7, 2.5, 15], "rotation": 270, "texture": "#1_1"},
"down": {"uv": [0, 7, 2.5, 15], "rotation": 90, "texture": "#1_1"}
}
},
{
"name": "Cylinder",
"from": [1, 1, 0],
"to": [15, 15, 16],
"faces": {
"north": {"uv": [8, 0, 15, 7], "texture": "#1_1"},
"east": {"uv": [0, 0, 8, 7], "texture": "#1_1"},
"south": {"uv": [8, 0, 15, 7], "texture": "#1_1"},
"west": {"uv": [0, 0, 8, 7], "rotation": 180, "texture": "#1_1"},
"up": {"uv": [0, 0, 8, 7], "rotation": 270, "texture": "#1_1"},
"down": {"uv": [0, 0, 8, 7], "rotation": 90, "texture": "#1_1"}
}
},
{
"from": [10.5, 0, 0],
"to": [14.5, 4, 9],
"faces": {
"east": {"uv": [2.5, 7, 7, 9], "rotation": 180, "texture": "#1_1"},
"west": {"uv": [2.5, 7, 7, 9], "rotation": 180, "texture": "#1_1"},
"up": {"uv": [2.5, 7, 7, 9], "rotation": 90, "texture": "#1_1"},
"down": {"uv": [2.5, 7, 7, 9], "rotation": 270, "texture": "#1_1"}
}
},
{
"name": "LowerPort",
"from": [10.5, 0.1, 13.9],
"to": [14.5, 4.1, 16.9],
"faces": {
"north": {"uv": [10, 0, 14, 4], "texture": "#1_1"},
"east": {"uv": [3, 13, 4.5, 15], "rotation": 180, "texture": "#1_1"},
"south": {"uv": [2.5, 13, 4.5, 15], "texture": "#1_1"},
"west": {"uv": [3, 13, 4.5, 15], "texture": "#1_1"},
"up": {"uv": [3, 13, 4.5, 15], "rotation": 90, "texture": "#1_1"},
"down": {"uv": [3, 13, 4.5, 15], "rotation": 270, "texture": "#1_1"}
}
},
{
"name": "LowerPort",
"from": [1.5, 0.1, 13.9],
"to": [5.5, 4.1, 16.9],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]},
"faces": {
"north": {"uv": [14, 0, 10, 4], "texture": "#1_1"},
"east": {"uv": [4.5, 13, 3, 15], "texture": "#1_1"},
"south": {"uv": [4.5, 13, 2.5, 15], "texture": "#1_1"},
"west": {"uv": [4.5, 13, 3, 15], "rotation": 180, "texture": "#1_1"},
"up": {"uv": [3, 15, 4.5, 13], "rotation": 90, "texture": "#1_1"},
"down": {"uv": [3, 15, 4.5, 13], "rotation": 270, "texture": "#1_1"}
}
},
{
"name": "Port",
"from": [4, 4, 15.8],
"to": [12, 12, 17.8],
"faces": {
"east": {"uv": [5.5, 9, 6.5, 13], "rotation": 180, "texture": "#1_1"},
"south": {"uv": [2.5, 9, 6.5, 13], "texture": "#1_1"},
"west": {"uv": [5.5, 9, 6.5, 13], "texture": "#1_1"},
"up": {"uv": [5.5, 9, 6.5, 13], "rotation": 90, "texture": "#1_1"},
"down": {"uv": [5.5, 9, 6.5, 13], "rotation": 270, "texture": "#1_1"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 135, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 135, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, 225, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 45, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"rotation": [0, 180, 0],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "SteamCylinder",
"origin": [8, 8, 8],
"children": [0, 1, 2, 3, 4, 5]
}
]
}

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 B

View File

@ -0,0 +1,49 @@
{
"variants": {
"connection=none,facing=north": {
"model": "steampowered:block/flywheel/casing_none",
"y": 270
},
"connection=left,facing=north": {
"model": "steampowered:block/flywheel/casing_left",
"y": 270
},
"connection=right,facing=north": {
"model": "steampowered:block/flywheel/casing_right",
"y": 270
},
"connection=none,facing=south": {
"model": "steampowered:block/flywheel/casing_none",
"y": 90
},
"connection=left,facing=south": {
"model": "steampowered:block/flywheel/casing_left",
"y": 90
},
"connection=right,facing=south": {
"model": "steampowered:block/flywheel/casing_right",
"y": 90
},
"connection=none,facing=west": {
"model": "steampowered:block/flywheel/casing_none",
"y": 180
},
"connection=left,facing=west": {
"model": "steampowered:block/flywheel/casing_left",
"y": 180
},
"connection=right,facing=west": {
"model": "steampowered:block/flywheel/casing_right",
"y": 180
},
"connection=none,facing=east": {
"model": "steampowered:block/flywheel/casing_none"
},
"connection=left,facing=east": {
"model": "steampowered:block/flywheel/casing_left"
},
"connection=right,facing=east": {
"model": "steampowered:block/flywheel/casing_right"
}
}
}

View File

@ -22,6 +22,8 @@
"block.steampowered.bronze_burner" : "Bronze Burning Chamber",
"block.steampowered.cast_iron_burner" : "Cast Iron Burning Chamber",
"block.steampowered.steel_burner" : "Steel Burning Chamber",
"block.steampowered.flywheel": "Flywheel",
"block.create.furnace_engine": "Furnace Engine",
"fluid.steampowered.steam": "Steam",
"fluid.steampowered.steam_flowing": "Steam",

View File

@ -0,0 +1,95 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/steam_engine_wheel",
"5": "create:block/brass_casing",
"7": "create:block/brass_gearbox",
"particle": "create:block/steam_engine_wheel"
},
"elements": [
{
"from": [1, 0, 0],
"to": [12, 16, 16],
"faces": {
"north": {"uv": [0, 10, 8, 15.5], "rotation": 270, "texture": "#0"},
"east": {"uv": [0, 0, 16, 16], "texture": "#7"},
"south": {"uv": [8, 15.5, 16, 10], "rotation": 270, "texture": "#0"},
"west": {"uv": [0, 0, 16, 16], "texture": "#7"},
"up": {"uv": [8, 10.5, 16, 16], "rotation": 270, "texture": "#0"},
"down": {"uv": [8, 10.5, 16, 16], "rotation": 270, "texture": "#0"}
}
},
{
"from": [0, 0, 0],
"to": [1, 2, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 24]},
"faces": {
"north": {"uv": [15, 14, 16, 16], "texture": "#5"},
"east": {"uv": [0, 0, 16, 2], "texture": "#5"},
"south": {"uv": [0, 14, 1, 16], "texture": "#5"},
"west": {"uv": [0, 14, 16, 16], "texture": "#5"},
"up": {"uv": [0, 1, 16, 2], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 0, 16, 1], "rotation": 270, "texture": "#5"}
}
},
{
"from": [0, 14, 0],
"to": [1, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 8]},
"faces": {
"north": {"uv": [0, 14, 1, 16], "rotation": 180, "texture": "#5"},
"east": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#5"},
"south": {"uv": [15, 14, 16, 16], "rotation": 180, "texture": "#5"},
"west": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#5"},
"up": {"uv": [0, 0, 16, 1], "rotation": 270, "texture": "#5"},
"down": {"uv": [0, 1, 16, 2], "rotation": 90, "texture": "#5"}
}
},
{
"from": [0, 2, 0],
"to": [1, 14, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 8]},
"faces": {
"north": {"uv": [2, 0, 14, 1], "rotation": 90, "texture": "#5"},
"east": {"uv": [0, 0, 12, 2], "rotation": 270, "texture": "#5"},
"south": {"uv": [2, 1, 14, 2], "rotation": 90, "texture": "#5"},
"west": {"uv": [2, 14, 14, 16], "rotation": 90, "texture": "#5"},
"up": {"uv": [15, 14, 16, 16], "rotation": 180, "texture": "#5"},
"down": {"uv": [0, 14, 1, 16], "texture": "#5"}
}
},
{
"from": [0, 2, 14],
"to": [1, 14, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 8]},
"faces": {
"north": {"uv": [2, 1, 14, 2], "rotation": 270, "texture": "#5"},
"east": {"uv": [0, 0, 12, 2], "rotation": 90, "texture": "#5"},
"south": {"uv": [2, 0, 14, 1], "rotation": 270, "texture": "#5"},
"west": {"uv": [2, 14, 14, 16], "rotation": 270, "texture": "#5"},
"up": {"uv": [0, 14, 1, 16], "texture": "#5"},
"down": {"uv": [15, 14, 16, 16], "rotation": 180, "texture": "#5"}
}
},
{
"from": [10.9, 3, 3],
"to": [19.9, 13, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [11.5, 0, 16, 5], "rotation": 180, "texture": "#0"},
"east": {"uv": [11, 5, 16, 10], "texture": "#0"},
"south": {"uv": [11.5, 0, 16, 5], "texture": "#0"},
"west": {"uv": [11, 5, 16, 10], "texture": "#0"},
"up": {"uv": [11.5, 0, 16, 5], "texture": "#0"},
"down": {"uv": [11.5, 0, 16, 5], "texture": "#0"}
}
}
],
"groups": [
{
"name": "transmission",
"origin": [-8, 8, 8],
"children": [0, 1, 2, 3, 4, 5]
}
]
}

View File

@ -0,0 +1,95 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/steam_engine_wheel",
"5": "create:block/brass_casing",
"7": "create:block/brass_gearbox",
"particle": "create:block/steam_engine_wheel"
},
"elements": [
{
"from": [1, 0, 0],
"to": [12, 16, 16],
"faces": {
"north": {"uv": [8, 10.5, 16, 16], "rotation": 90, "texture": "#0"},
"east": {"uv": [0, 0, 16, 16], "texture": "#7"},
"south": {"uv": [8, 10.5, 16, 16], "rotation": 270, "texture": "#0"},
"west": {"uv": [0, 0, 16, 16], "texture": "#7"},
"up": {"uv": [8, 10.5, 16, 16], "rotation": 270, "texture": "#0"},
"down": {"uv": [8, 10.5, 16, 16], "rotation": 270, "texture": "#0"}
}
},
{
"from": [0, 0, 0],
"to": [1, 2, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 24]},
"faces": {
"north": {"uv": [15, 14, 16, 16], "texture": "#5"},
"east": {"uv": [0, 0, 16, 2], "texture": "#5"},
"south": {"uv": [0, 14, 1, 16], "texture": "#5"},
"west": {"uv": [0, 14, 16, 16], "texture": "#5"},
"up": {"uv": [0, 1, 16, 2], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 0, 16, 1], "rotation": 270, "texture": "#5"}
}
},
{
"from": [0, 14, 0],
"to": [1, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 8]},
"faces": {
"north": {"uv": [0, 14, 1, 16], "rotation": 180, "texture": "#5"},
"east": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#5"},
"south": {"uv": [15, 14, 16, 16], "rotation": 180, "texture": "#5"},
"west": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#5"},
"up": {"uv": [0, 0, 16, 1], "rotation": 270, "texture": "#5"},
"down": {"uv": [0, 1, 16, 2], "rotation": 90, "texture": "#5"}
}
},
{
"from": [0, 2, 0],
"to": [1, 14, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 8]},
"faces": {
"north": {"uv": [2, 0, 14, 1], "rotation": 90, "texture": "#5"},
"east": {"uv": [0, 0, 12, 2], "rotation": 270, "texture": "#5"},
"south": {"uv": [2, 1, 14, 2], "rotation": 90, "texture": "#5"},
"west": {"uv": [2, 14, 14, 16], "rotation": 90, "texture": "#5"},
"up": {"uv": [15, 14, 16, 16], "rotation": 180, "texture": "#5"},
"down": {"uv": [0, 14, 1, 16], "texture": "#5"}
}
},
{
"from": [0, 2, 14],
"to": [1, 14, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 8]},
"faces": {
"north": {"uv": [2, 1, 14, 2], "rotation": 270, "texture": "#5"},
"east": {"uv": [0, 0, 12, 2], "rotation": 90, "texture": "#5"},
"south": {"uv": [2, 0, 14, 1], "rotation": 270, "texture": "#5"},
"west": {"uv": [2, 14, 14, 16], "rotation": 270, "texture": "#5"},
"up": {"uv": [0, 14, 1, 16], "texture": "#5"},
"down": {"uv": [15, 14, 16, 16], "rotation": 180, "texture": "#5"}
}
},
{
"from": [10.9, 3, 3],
"to": [19.9, 13, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [11.5, 0, 16, 5], "rotation": 180, "texture": "#0"},
"east": {"uv": [11, 5, 16, 10], "texture": "#0"},
"south": {"uv": [11.5, 0, 16, 5], "texture": "#0"},
"west": {"uv": [11, 5, 16, 10], "texture": "#0"},
"up": {"uv": [11.5, 0, 16, 5], "texture": "#0"},
"down": {"uv": [11.5, 0, 16, 5], "texture": "#0"}
}
}
],
"groups": [
{
"name": "transmission",
"origin": [-8, 8, 8],
"children": [0, 1, 2, 3, 4, 5]
}
]
}

View File

@ -0,0 +1,95 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/steam_engine_wheel",
"5": "create:block/brass_casing",
"7": "create:block/brass_gearbox",
"particle": "create:block/steam_engine_wheel"
},
"elements": [
{
"from": [1, 0, 0],
"to": [12, 16, 16],
"faces": {
"north": {"uv": [8, 10.5, 16, 16], "rotation": 90, "texture": "#0"},
"east": {"uv": [0, 0, 16, 16], "texture": "#7"},
"south": {"uv": [0, 15.5, 8, 10], "rotation": 270, "texture": "#0"},
"west": {"uv": [0, 0, 16, 16], "texture": "#7"},
"up": {"uv": [8, 10.5, 16, 16], "rotation": 270, "texture": "#0"},
"down": {"uv": [8, 10.5, 16, 16], "rotation": 270, "texture": "#0"}
}
},
{
"from": [0, 0, 0],
"to": [1, 2, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 24]},
"faces": {
"north": {"uv": [15, 14, 16, 16], "texture": "#5"},
"east": {"uv": [0, 0, 16, 2], "texture": "#5"},
"south": {"uv": [0, 14, 1, 16], "texture": "#5"},
"west": {"uv": [0, 14, 16, 16], "texture": "#5"},
"up": {"uv": [0, 1, 16, 2], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 0, 16, 1], "rotation": 270, "texture": "#5"}
}
},
{
"from": [0, 14, 0],
"to": [1, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 8]},
"faces": {
"north": {"uv": [0, 14, 1, 16], "rotation": 180, "texture": "#5"},
"east": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#5"},
"south": {"uv": [15, 14, 16, 16], "rotation": 180, "texture": "#5"},
"west": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#5"},
"up": {"uv": [0, 0, 16, 1], "rotation": 270, "texture": "#5"},
"down": {"uv": [0, 1, 16, 2], "rotation": 90, "texture": "#5"}
}
},
{
"from": [0, 2, 0],
"to": [1, 14, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 8]},
"faces": {
"north": {"uv": [2, 0, 14, 1], "rotation": 90, "texture": "#5"},
"east": {"uv": [0, 0, 12, 2], "rotation": 270, "texture": "#5"},
"south": {"uv": [2, 1, 14, 2], "rotation": 90, "texture": "#5"},
"west": {"uv": [2, 14, 14, 16], "rotation": 90, "texture": "#5"},
"up": {"uv": [15, 14, 16, 16], "rotation": 180, "texture": "#5"},
"down": {"uv": [0, 14, 1, 16], "texture": "#5"}
}
},
{
"from": [0, 2, 14],
"to": [1, 14, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 8]},
"faces": {
"north": {"uv": [2, 1, 14, 2], "rotation": 270, "texture": "#5"},
"east": {"uv": [0, 0, 12, 2], "rotation": 90, "texture": "#5"},
"south": {"uv": [2, 0, 14, 1], "rotation": 270, "texture": "#5"},
"west": {"uv": [2, 14, 14, 16], "rotation": 270, "texture": "#5"},
"up": {"uv": [0, 14, 1, 16], "texture": "#5"},
"down": {"uv": [15, 14, 16, 16], "rotation": 180, "texture": "#5"}
}
},
{
"from": [10.9, 3, 3],
"to": [19.9, 13, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [11.5, 0, 16, 5], "rotation": 180, "texture": "#0"},
"east": {"uv": [11, 5, 16, 10], "texture": "#0"},
"south": {"uv": [11.5, 0, 16, 5], "texture": "#0"},
"west": {"uv": [11, 5, 16, 10], "texture": "#0"},
"up": {"uv": [11.5, 0, 16, 5], "texture": "#0"},
"down": {"uv": [11.5, 0, 16, 5], "texture": "#0"}
}
}
],
"groups": [
{
"name": "transmission",
"origin": [-8, 8, 8],
"children": [0, 1, 2, 3, 4, 5]
}
]
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,381 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/steam_engine_wheel",
"5": "create:block/brass_casing",
"7": "create:block/brass_gearbox",
"particle": "create:block/steam_engine_wheel"
},
"elements": [
{
"from": [29, 1, 11.5],
"to": [32, 3, 13.5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 17]},
"faces": {
"north": {"uv": [6.5, 9, 8, 10], "rotation": 180, "texture": "#0"},
"east": {"uv": [0, 9, 1.5, 10], "rotation": 180, "texture": "#0"},
"south": {"uv": [0, 9, 1.5, 10], "rotation": 180, "texture": "#0"},
"west": {"uv": [0, 9, 1.5, 10], "rotation": 180, "texture": "#0"},
"up": {"uv": [0, 9, 1.5, 10], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 9, 1.5, 10], "rotation": 180, "texture": "#0"}
}
},
{
"from": [14.75, 7, 11.55],
"to": [30.75, 9, 13.45],
"rotation": {"angle": -22.5, "axis": "z", "origin": [15, 8, 21]},
"faces": {
"north": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"},
"south": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"},
"up": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"}
}
},
{
"from": [22, 6, 6],
"to": [32, 10, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [-5, 8, 8]},
"faces": {
"north": {"uv": [2, 7, 7, 9], "texture": "#0"},
"east": {"uv": [0, 7, 2, 9], "texture": "#0"},
"south": {"uv": [2, 7, 7, 9], "texture": "#0"},
"west": {"uv": [0, 7, 2, 9], "texture": "#0"},
"up": {"uv": [2, 7, 7, 9], "texture": "#0"},
"down": {"uv": [2, 7, 7, 9], "texture": "#0"}
}
},
{
"from": [7, 7, 7],
"to": [23, 9, 9],
"rotation": {"angle": -22.5, "axis": "z", "origin": [23, 8, 8]},
"faces": {
"north": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"},
"south": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"},
"up": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"}
}
},
{
"from": [0, 0, 4],
"to": [16, 16, 15],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#7"},
"east": {"uv": [0, 15.5, 8, 10], "rotation": 270, "texture": "#0"},
"south": {"uv": [0, 0, 16, 16], "texture": "#7"},
"west": {"uv": [8, 10.5, 16, 16], "rotation": 90, "texture": "#0"},
"up": {"uv": [8, 10.5, 16, 16], "rotation": 180, "texture": "#0"},
"down": {"uv": [8, 10.5, 16, 16], "texture": "#0"}
}
},
{
"from": [0, 0, 15],
"to": [16, 2, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [24, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 16, 2], "texture": "#5"},
"east": {"uv": [0, 14, 1, 16], "texture": "#5"},
"south": {"uv": [0, 14, 16, 16], "texture": "#5"},
"west": {"uv": [15, 14, 16, 16], "texture": "#5"},
"up": {"uv": [0, 1, 16, 2], "texture": "#5"},
"down": {"uv": [0, 0, 16, 1], "texture": "#5"}
}
},
{
"from": [0, 14, 15],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 16]},
"faces": {
"north": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#5"},
"east": {"uv": [15, 14, 16, 16], "rotation": 180, "texture": "#5"},
"south": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#5"},
"west": {"uv": [0, 14, 1, 16], "rotation": 180, "texture": "#5"},
"up": {"uv": [0, 0, 16, 1], "rotation": 180, "texture": "#5"},
"down": {"uv": [0, 1, 16, 2], "rotation": 180, "texture": "#5"}
}
},
{
"from": [0, 2, 15],
"to": [2, 14, 16],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 16]},
"faces": {
"north": {"uv": [0, 0, 12, 2], "rotation": 270, "texture": "#5"},
"east": {"uv": [2, 1, 14, 2], "rotation": 90, "texture": "#5"},
"south": {"uv": [2, 14, 14, 16], "rotation": 90, "texture": "#5"},
"west": {"uv": [2, 0, 14, 1], "rotation": 90, "texture": "#5"},
"up": {"uv": [15, 14, 16, 16], "rotation": 90, "texture": "#5"},
"down": {"uv": [0, 14, 1, 16], "rotation": 90, "texture": "#5"}
}
},
{
"from": [14, 2, 15],
"to": [16, 14, 16],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 16]},
"faces": {
"north": {"uv": [0, 0, 12, 2], "rotation": 90, "texture": "#5"},
"east": {"uv": [2, 0, 14, 1], "rotation": 270, "texture": "#5"},
"south": {"uv": [2, 14, 14, 16], "rotation": 270, "texture": "#5"},
"west": {"uv": [2, 1, 14, 2], "rotation": 270, "texture": "#5"},
"up": {"uv": [0, 14, 1, 16], "rotation": 270, "texture": "#5"},
"down": {"uv": [15, 14, 16, 16], "rotation": 270, "texture": "#5"}
}
},
{
"from": [3, 3, -3.9],
"to": [13, 13, 5.1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [11, 5, 16, 10], "texture": "#0"},
"east": {"uv": [11.5, 0, 16, 5], "texture": "#0"},
"south": {"uv": [11, 5, 16, 10], "texture": "#0"},
"west": {"uv": [11.5, 0, 16, 5], "rotation": 180, "texture": "#0"},
"up": {"uv": [11.5, 0, 16, 5], "rotation": 270, "texture": "#0"},
"down": {"uv": [11.5, 0, 16, 5], "rotation": 90, "texture": "#0"}
}
},
{
"from": [-0.5, 23.5, -1.9],
"to": [16.5, 28.5, 4.1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [0, 0, 8.5, 2.5], "texture": "#0"},
"east": {"uv": [8.5, 0, 11.5, 2], "texture": "#0"},
"south": {"uv": [0, 0, 8.5, 2.5], "texture": "#0"},
"west": {"uv": [8.5, 0, 11.5, 2.5], "texture": "#0"},
"up": {"uv": [0, 2.5, 8.5, 5.5], "texture": "#0"},
"down": {"uv": [0, 2.5, 8.5, 5.5], "texture": "#0"}
}
},
{
"from": [-0.5, -12.5, -1.9],
"to": [16.5, -7.5, 4.1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"},
"south": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"west": {"uv": [8.5, 0, 11.5, 2], "rotation": 180, "texture": "#0"},
"up": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 180, "texture": "#0"}
}
},
{
"from": [23.5, -0.5, -1.9],
"to": [28.5, 16.5, 4.1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [0, 0, 8.5, 2.5], "rotation": 270, "texture": "#0"},
"east": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 0, 8.5, 2.5], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 90, "texture": "#0"},
"up": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 90, "texture": "#0"},
"down": {"uv": [8.5, 0, 11.5, 2], "rotation": 90, "texture": "#0"}
}
},
{
"from": [-12.5, -0.5, -1.9],
"to": [-7.5, 16.5, 4.1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [0, 0, 8.5, 2.5], "rotation": 90, "texture": "#0"},
"east": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"},
"south": {"uv": [0, 0, 8.5, 2.5], "rotation": 270, "texture": "#0"},
"west": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"},
"up": {"uv": [8.5, 0, 11.5, 2], "rotation": 270, "texture": "#0"},
"down": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 270, "texture": "#0"}
}
},
{
"from": [-0.5, 23.5, -1.85],
"to": [16.5, 28.5, 4.05],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [0, 0, 8.5, 2.5], "texture": "#0"},
"east": {"uv": [8.5, 0, 11.5, 2.5], "texture": "#0"},
"south": {"uv": [0, 0, 8.5, 2.5], "texture": "#0"},
"west": {"uv": [8.5, 0, 11.5, 2.5], "texture": "#0"},
"up": {"uv": [0, 2.5, 8.5, 5.5], "texture": "#0"},
"down": {"uv": [0, 2.5, 8.5, 5.5], "texture": "#0"}
}
},
{
"from": [-0.5, -12.5, -1.85],
"to": [16.5, -7.5, 4.05],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"},
"south": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"west": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"},
"up": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 180, "texture": "#0"}
}
},
{
"from": [-0.5, -12.5, -1.85],
"to": [16.5, -7.5, 4.05],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"},
"south": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"west": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"},
"up": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 180, "texture": "#0"}
}
},
{
"from": [-12.5, -0.5, -1.85],
"to": [-7.5, 16.5, 4.05],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [0, 0, 8.5, 2.5], "rotation": 90, "texture": "#0"},
"east": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"},
"south": {"uv": [0, 0, 8.5, 2.5], "rotation": 270, "texture": "#0"},
"west": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"},
"up": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 270, "texture": "#0"},
"down": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 270, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [6, -8, -0.9],
"to": [10, 3, 3.1],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"east": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [6, 13, -0.9],
"to": [10, 24, 3.1],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"east": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "texture": "#0"}
}
},
{
"name": "spoke",
"from": [-8, 6, -0.9],
"to": [3, 10, 3.1],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"},
"up": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"},
"down": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [13, 6, -0.9],
"to": [24, 10, 3.1],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"},
"up": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"},
"down": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [-8, 6, -0.9],
"to": [3, 10, 3.1],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"},
"up": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"},
"down": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [6, -8, -0.9],
"to": [10, 3, 3.1],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"east": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [13, 6, -0.9],
"to": [24, 10, 3.1],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"},
"up": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"},
"down": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [6, 13, -0.9],
"to": [10, 24, 3.1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1.1]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"east": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "texture": "#0"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, -67, 0],
"translation": [0, 2.5, -2],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, -67, 0],
"translation": [0, 2.5, -2],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, -91, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, -91, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"rotation": [90, 0, 0],
"translation": [0, 2, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 225, 0],
"translation": [-0.25, 0.75, 0],
"scale": [0.35, 0.35, 0.35]
},
"fixed": {
"scale": [0.45, 0.45, 0.45]
}
},
"groups": [
{
"name": "transmission",
"origin": [-8, 8, 8],
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8]
},
{
"name": "wheel",
"origin": [24, 8, 8],
"children": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
}
]
}

View File

@ -0,0 +1,27 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/steam_engine_wheel",
"particle": "create:block/steam_engine_wheel"
},
"elements": [
{
"from": [2.55, 7, 6.75],
"to": [4.45, 9, 22.75],
"rotation": {"angle": 22.5, "axis": "x", "origin": [-5, 8, 7]},
"faces": {
"east": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"},
"west": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"},
"up": {"uv": [0, 9, 8, 10], "rotation": 270, "texture": "#0"},
"down": {"uv": [0, 9, 8, 10], "rotation": 90, "texture": "#0"}
}
}
],
"groups": [
{
"name": "transmission",
"origin": [-8, 8, 8],
"children": [0]
}
]
}

View File

@ -0,0 +1,29 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/steam_engine_wheel",
"particle": "create:block/steam_engine_wheel"
},
"elements": [
{
"from": [2.5, 1, 21],
"to": [4.5, 3, 29],
"rotation": {"angle": 0, "axis": "y", "origin": [-1, 8, 8]},
"faces": {
"north": {"uv": [0, 9, 1, 10], "rotation": 270, "texture": "#0"},
"east": {"uv": [0, 9, 4, 10], "rotation": 180, "texture": "#0"},
"south": {"uv": [0, 9, 1, 10], "rotation": 270, "texture": "#0"},
"west": {"uv": [0, 9, 4, 10], "texture": "#0"},
"up": {"uv": [0, 9, 4, 10], "rotation": 270, "texture": "#0"},
"down": {"uv": [0, 9, 4, 10], "rotation": 270, "texture": "#0"}
}
}
],
"groups": [
{
"name": "transmission",
"origin": [-8, 8, 8],
"children": [0]
}
]
}

View File

@ -0,0 +1,27 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/steam_engine_wheel",
"particle": "create:block/steam_engine_wheel"
},
"elements": [
{
"from": [7, 7, 7],
"to": [9, 9, 23],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 8, 23]},
"faces": {
"east": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"},
"west": {"uv": [0, 9, 8, 10], "rotation": 180, "texture": "#0"},
"up": {"uv": [0, 9, 8, 10], "rotation": 270, "texture": "#0"},
"down": {"uv": [0, 9, 8, 10], "rotation": 90, "texture": "#0"}
}
}
],
"groups": [
{
"name": "transmission",
"origin": [-8, 8, 8],
"children": [0]
}
]
}

View File

@ -0,0 +1,29 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/steam_engine_wheel",
"particle": "create:block/steam_engine_wheel"
},
"elements": [
{
"from": [6, 6, 22],
"to": [10, 10, 32],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -5]},
"faces": {
"north": {"uv": [0, 7, 2, 9], "texture": "#0"},
"east": {"uv": [2, 7, 7, 9], "texture": "#0"},
"south": {"uv": [0, 7, 2, 9], "texture": "#0"},
"west": {"uv": [2, 7, 7, 9], "texture": "#0"},
"up": {"uv": [2, 7, 7, 9], "rotation": 90, "texture": "#0"},
"down": {"uv": [2, 7, 7, 9], "rotation": 270, "texture": "#0"}
}
}
],
"groups": [
{
"name": "transmission",
"origin": [-8, 8, 8],
"children": [0]
}
]
}

View File

@ -0,0 +1,221 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/steam_engine_wheel",
"particle": "create:block/steam_engine_wheel"
},
"elements": [
{
"from": [11.9, 23.5, -0.5],
"to": [17.9, 28.5, 16.5],
"rotation": {"angle": 0, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [8.5, 0, 11.5, 2.5], "texture": "#0"},
"east": {"uv": [0, 0, 8.5, 2.5], "texture": "#0"},
"south": {"uv": [8.5, 0, 11.5, 2], "texture": "#0"},
"west": {"uv": [0, 0, 8.5, 2.5], "texture": "#0"},
"up": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 90, "texture": "#0"},
"down": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"}
}
},
{
"from": [11.9, -12.5, -0.5],
"to": [17.9, -7.5, 16.5],
"rotation": {"angle": 0, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [8.5, 0, 11.5, 2], "rotation": 180, "texture": "#0"},
"east": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"south": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"},
"west": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"up": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"},
"down": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 90, "texture": "#0"}
}
},
{
"from": [11.9, -0.5, 23.5],
"to": [17.9, 16.5, 28.5],
"rotation": {"angle": 0, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 90, "texture": "#0"},
"east": {"uv": [0, 0, 8.5, 2.5], "rotation": 270, "texture": "#0"},
"south": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 0, 8.5, 2.5], "rotation": 90, "texture": "#0"},
"up": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [8.5, 0, 11.5, 2], "texture": "#0"}
}
},
{
"from": [11.9, -0.5, -12.5],
"to": [17.9, 16.5, -7.5],
"rotation": {"angle": 0, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"},
"east": {"uv": [0, 0, 8.5, 2.5], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"},
"west": {"uv": [0, 0, 8.5, 2.5], "rotation": 270, "texture": "#0"},
"up": {"uv": [8.5, 0, 11.5, 2], "texture": "#0"},
"down": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"}
}
},
{
"from": [11.95, 23.5, -0.5],
"to": [17.85, 28.5, 16.5],
"rotation": {"angle": 45, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [8.5, 0, 11.5, 2.5], "texture": "#0"},
"east": {"uv": [0, 0, 8.5, 2.5], "texture": "#0"},
"south": {"uv": [8.5, 0, 11.5, 2.5], "texture": "#0"},
"west": {"uv": [0, 0, 8.5, 2.5], "texture": "#0"},
"up": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 90, "texture": "#0"},
"down": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"}
}
},
{
"from": [11.95, -12.5, -0.5],
"to": [17.85, -7.5, 16.5],
"rotation": {"angle": 45, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"south": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"},
"west": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"up": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"},
"down": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 90, "texture": "#0"}
}
},
{
"from": [11.95, -12.5, -0.5],
"to": [17.85, -7.5, 16.5],
"rotation": {"angle": -45, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"south": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"},
"west": {"uv": [0, 0, 8.5, 2.5], "rotation": 180, "texture": "#0"},
"up": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"},
"down": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 90, "texture": "#0"}
}
},
{
"from": [11.95, -0.5, -12.5],
"to": [17.85, 16.5, -7.5],
"rotation": {"angle": 45, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"},
"east": {"uv": [0, 0, 8.5, 2.5], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 2.5, 8.5, 5.5], "rotation": 270, "texture": "#0"},
"west": {"uv": [0, 0, 8.5, 2.5], "rotation": 270, "texture": "#0"},
"up": {"uv": [8.5, 0, 11.5, 2.5], "texture": "#0"},
"down": {"uv": [8.5, 0, 11.5, 2.5], "rotation": 180, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [12.9, -8, 6],
"to": [16.9, 3, 10],
"rotation": {"angle": 45, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"east": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [12.9, 13, 6],
"to": [16.9, 24, 10],
"rotation": {"angle": 45, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"east": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "texture": "#0"}
}
},
{
"name": "spoke",
"from": [12.9, 6, -8],
"to": [16.9, 10, 3],
"rotation": {"angle": 0, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"east": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"},
"up": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"down": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [12.9, 6, 13],
"to": [16.9, 10, 24],
"rotation": {"angle": 0, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"east": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"},
"up": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"down": {"uv": [9, 4.5, 11, 10], "texture": "#0"}
}
},
{
"name": "spoke",
"from": [12.9, 6, -8],
"to": [16.9, 10, 3],
"rotation": {"angle": 45, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"east": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"},
"up": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"down": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [12.9, -8, 6],
"to": [16.9, 3, 10],
"rotation": {"angle": 0, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"east": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"}
}
},
{
"name": "spoke",
"from": [12.9, 6, 13],
"to": [16.9, 10, 24],
"rotation": {"angle": 45, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"east": {"uv": [9, 4.5, 11, 10], "rotation": 270, "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "rotation": 90, "texture": "#0"},
"up": {"uv": [9, 4.5, 11, 10], "rotation": 180, "texture": "#0"},
"down": {"uv": [9, 4.5, 11, 10], "texture": "#0"}
}
},
{
"name": "spoke",
"from": [12.9, 13, 6],
"to": [16.9, 24, 10],
"rotation": {"angle": 0, "axis": "x", "origin": [14.9, 8, 8]},
"faces": {
"north": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"east": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"south": {"uv": [9, 4.5, 11, 10], "texture": "#0"},
"west": {"uv": [9, 4.5, 11, 10], "texture": "#0"}
}
}
],
"groups": [
{
"name": "transmission",
"origin": [-8, 8, 8],
"children": []
},
{
"name": "wheel",
"origin": [24, 8, 8],
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
}
]
}

View File

@ -0,0 +1,3 @@
{
"parent": "steampowered:block/flywheel/item"
}

View File

@ -0,0 +1,20 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"name": "create:furnace_engine"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View File

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

View File

@ -19,6 +19,8 @@
"steampowered:alternator",
"steampowered:bronze_flywheel",
"steampowered:cast_iron_flywheel",
"steampowered:steel_flywheel"
"steampowered:steel_flywheel",
"create:furnace_engine",
"steampowered:flywheel"
]
}

View File

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

View File

@ -0,0 +1,20 @@
{
"type": "create:mechanical_crafting",
"pattern": [
" BBB",
"CB B",
" BBB"
],
"key": {
"B": {
"tag": "forge:ingots/brass"
},
"C": {
"item": "create:brass_casing"
}
},
"result": {
"item": "steampowered:flywheel"
},
"acceptMirrored": true
}

View File

@ -0,0 +1,31 @@
{
"type": "create:mechanical_crafting",
"pattern": [
"PPB",
"PCI",
"PPB"
],
"key": {
"P": {
"tag": "forge:plates/brass"
},
"B": {
"tag": "forge:ingots/brass"
},
"I": [
{
"item": "minecraft:piston"
},
{
"item": "minecraft:sticky_piston"
}
],
"C": {
"item": "create:brass_casing"
}
},
"result": {
"item": "create:furnace_engine"
},
"acceptMirrored": true
}

View File

@ -5,8 +5,7 @@
"compatibilityLevel": "JAVA_8",
"refmap": "steampowered.refmap.json",
"mixins": [
"FlywheelTileEntityAccess",
"MixinFlywheel"
"MixinAllPartialModels"
],
"client": [
],