No turning back

- Mechanical Pumps no longer reverse direction based on kinetic input
- Fixed pipe connections pulling fluids with half the speed compared to a directly attached pump
- Substantially increased speed of visual flow propagation inside pipe networks
- Fixed observers on elevator contacts firing in the wrong order when triggered by manual floor selection
- Portable storage interfaces now stall for longer after an exchange has happened, and shorter otherwise
This commit is contained in:
simibubi 2023-03-22 12:32:22 +01:00
parent bc0f349840
commit 8799fb38e8
16 changed files with 193 additions and 366 deletions

View file

@ -92,7 +92,7 @@ public class AllPartialModels {
ARM_HEAD = block("mechanical_arm/head"), ARM_CLAW_BASE = block("mechanical_arm/claw_base"),
ARM_CLAW_GRIP = block("mechanical_arm/claw_grip"),
MECHANICAL_PUMP_ARROW = block("mechanical_pump/arrow"), MECHANICAL_PUMP_COG = block("mechanical_pump/cog"),
MECHANICAL_PUMP_COG = block("mechanical_pump/cog"),
FLUID_PIPE_CASING = block("fluid_pipe/casing"), FLUID_VALVE_POINTER = block("fluid_valve/pointer"),
SPOUT_TOP = block("spout/top"), SPOUT_MIDDLE = block("spout/middle"), SPOUT_BOTTOM = block("spout/bottom"),

View file

@ -109,7 +109,7 @@ public class AllShapes {
.add(5, -1, 6, 11, 0, 8)
.forHorizontal(SOUTH),
PUMP = shape(2, 0, 2, 14, 5, 14).add(4, 0, 4, 12, 16, 12)
.add(3, 12, 3, 13, 16, 13)
.add(3, 11, 3, 13, 16, 13)
.forDirectional(Direction.UP),
CRUSHING_WHEEL_CONTROLLER_COLLISION = shape(0, 0, 0, 16, 13, 16).forDirectional(Direction.DOWN),

View file

@ -84,7 +84,7 @@ public abstract class PortableStorageInterfaceBlockEntity extends SmartBlockEnti
}
}
transferTimer = Math.min(transferTimer, ANIMATION * 2 + getTransferTimeout());
transferTimer = Math.min(transferTimer, ANIMATION * 2 + timeUnit);
boolean timerCanDecrement = transferTimer > ANIMATION || transferTimer > 0 && keepAlive == 0
&& (isVirtual() || !level.isClientSide || transferTimer != ANIMATION);
@ -180,7 +180,7 @@ public abstract class PortableStorageInterfaceBlockEntity extends SmartBlockEnti
}
public void startConnecting() {
transferTimer = getTransferTimeout() + ANIMATION * 2;
transferTimer = 6 + ANIMATION * 2;
}
public void onContentTransferred() {

View file

@ -90,9 +90,13 @@ public class ElevatorContactBlock extends WrenchableDirectionalBlock
if (pState.getValue(CALLING))
return;
ElevatorColumn elevatorColumn = ElevatorColumn.getOrCreate(pLevel, getColumnCoords(pLevel, pPos));
callToContactAndUpdate(elevatorColumn, pState, pLevel, pPos);
}
public void callToContactAndUpdate(ElevatorColumn elevatorColumn, BlockState pState, Level pLevel, BlockPos pPos) {
pLevel.setBlock(pPos, pState.cycle(CALLING), 2);
ElevatorColumn elevatorColumn = ElevatorColumn.getOrCreate(pLevel, getColumnCoords(pLevel, pPos));
for (BlockPos otherPos : elevatorColumn.getContacts()) {
if (otherPos.equals(pPos))
continue;

View file

@ -1,6 +1,5 @@
package com.simibubi.create.content.contraptions.components.structureMovement.elevator;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity;
import com.simibubi.create.foundation.networking.SimplePacketBase;
@ -41,7 +40,7 @@ public class ElevatorTargetFloorPacket extends SimplePacketBase {
.getEntity(entityId);
if (!(entityByID instanceof AbstractContraptionEntity ace))
return;
if (!(ace.getContraption()instanceof ElevatorContraption ec))
if (!(ace.getContraption() instanceof ElevatorContraption ec))
return;
if (ace.distanceToSqr(sender) > 50 * 50)
return;
@ -53,18 +52,12 @@ public class ElevatorTargetFloorPacket extends SimplePacketBase {
if (ec.isTargetUnreachable(targetY))
return;
for (BlockPos otherPos : elevatorColumn.getContacts()) {
BlockState otherState = level.getBlockState(otherPos);
if (!AllBlocks.ELEVATOR_CONTACT.has(otherState))
continue;
level.setBlock(otherPos, otherState.setValue(ElevatorContactBlock.CALLING, otherPos.getY() == targetY),
2);
AllBlocks.ELEVATOR_CONTACT.get()
.scheduleActivation(level, otherPos);
}
BlockPos pos = elevatorColumn.contactAt(targetY);
BlockState blockState = level.getBlockState(pos);
if (!(blockState.getBlock() instanceof ElevatorContactBlock ecb))
return;
elevatorColumn.target(targetY);
elevatorColumn.markDirty();
ecb.callToContactAndUpdate(elevatorColumn, blockState, level, pos);
});
return true;
}

View file

@ -201,7 +201,7 @@ public class PipeConnection {
particleSplashNextTick = false;
}
float flowSpeed = 1 / 32f + Mth.clamp(pressure.get(flow.inbound) / 512f, 0, 1) * 31 / 32f;
float flowSpeed = 1 / 32f + Mth.clamp(pressure.get(flow.inbound) / 128f, 0, 1) * 31 / 32f;
flow.progress.setValue(Math.min(flow.progress.getValue() + flowSpeed, 1));
if (flow.progress.getValue() >= 1)
flow.complete = true;

View file

@ -32,6 +32,7 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.world.ticks.TickPriority;
@ -107,20 +108,33 @@ public class PumpBlock extends DirectionalKineticBlock
Player player = context.getPlayer();
toPlace = ProperWaterloggedBlock.withWater(level, toPlace, pos);
if (player != null && player.isSteppingCarefully())
return toPlace;
Direction nearestLookingDirection = context.getNearestLookingDirection();
Direction targetDirection = context.getPlayer() != null && context.getPlayer()
.isShiftKeyDown() ? nearestLookingDirection : nearestLookingDirection.getOpposite();
Direction bestConnectedDirection = null;
double bestDistance = Double.MAX_VALUE;
for (Direction d : Iterate.directions) {
BlockPos adjPos = pos.relative(d);
BlockState adjState = level.getBlockState(adjPos);
if (!FluidPipeBlock.canConnectTo(level, adjPos, adjState, d))
continue;
toPlace = toPlace.setValue(FACING, d);
if (context.getClickedFace() == d.getOpposite())
break;
double distance = Vec3.atLowerCornerOf(d.getNormal())
.distanceTo(Vec3.atLowerCornerOf(targetDirection.getNormal()));
if (distance > bestDistance)
continue;
bestDistance = distance;
bestConnectedDirection = d;
}
return toPlace;
if (bestConnectedDirection == null)
return toPlace;
if (bestConnectedDirection.getAxis() == targetDirection.getAxis())
return toPlace;
if (player.isSteppingCarefully() && bestConnectedDirection.getAxis() != targetDirection.getAxis())
return toPlace;
return toPlace.setValue(FACING, bestConnectedDirection);
}
public static boolean isPump(BlockState state) {

View file

@ -21,8 +21,6 @@ import com.simibubi.create.foundation.utility.BlockFace;
import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
@ -38,15 +36,14 @@ import net.minecraftforge.fluids.capability.IFluidHandler;
public class PumpBlockEntity extends KineticBlockEntity {
LerpedFloat arrowDirection;
Couple<MutableBoolean> sidesToUpdate;
boolean pressureUpdate;
boolean reversed;
// Backcompat- flips any pump blockstate that loads with reversed=true
boolean scheduleFlip;
public PumpBlockEntity(BlockEntityType<?> typeIn, BlockPos pos, BlockState state) {
super(typeIn, pos, state);
arrowDirection = LerpedFloat.linear()
.startWithValue(1);
sidesToUpdate = Couple.create(MutableBoolean::new);
}
@ -58,55 +55,36 @@ public class PumpBlockEntity extends KineticBlockEntity {
registerAwardables(behaviours, AllAdvancements.PUMP);
}
@Override
public void initialize() {
super.initialize();
reversed = getSpeed() < 0;
}
@Override
public void tick() {
super.tick();
float speed = getSpeed();
if (level.isClientSide) {
if (speed == 0)
return;
arrowDirection.chase(speed >= 0 ? 1 : -1, .5f, Chaser.EXP);
arrowDirection.tickChaser();
if (!isVirtual())
return;
if (level.isClientSide && !isVirtual())
return;
if (scheduleFlip) {
level.setBlockAndUpdate(worldPosition,
getBlockState().setValue(PumpBlock.FACING, getBlockState().getValue(PumpBlock.FACING)
.getOpposite()));
scheduleFlip = false;
}
// if (pressureUpdate)
// updatePressureChange();
sidesToUpdate.forEachWithContext((update, isFront) -> {
if (update.isFalse())
return;
update.setFalse();
distributePressureTo(isFront ? getFront() : getFront().getOpposite());
});
if (speed == 0)
return;
if (speed < 0 != reversed) {
reversed = speed < 0;
updatePressureChange();
return;
}
}
@Override
public void onSpeedChanged(float previousSpeed) {
super.onSpeedChanged(previousSpeed);
if (previousSpeed == getSpeed())
if (Math.abs(previousSpeed) == Math.abs(getSpeed()))
return;
if (speed != 0) {
reversed = speed < 0;
if (speed != 0)
award(AllAdvancements.PUMP);
}
if (level.isClientSide && !isVirtual())
return;
@ -126,6 +104,13 @@ public class PumpBlockEntity extends KineticBlockEntity {
sidesToUpdate.forEach(MutableBoolean::setTrue);
}
@Override
protected void read(CompoundTag compound, boolean clientPacket) {
super.read(compound, clientPacket);
if (compound.getBoolean("Reversed"))
scheduleFlip = true;
}
protected void distributePressureTo(Direction side) {
if (getSpeed() == 0)
return;
@ -216,7 +201,7 @@ public class PumpBlockEntity extends KineticBlockEntity {
float pressure = Math.abs(getSpeed());
for (Set<BlockFace> set : validFaces.values()) {
int parallelBranches = set.size();
int parallelBranches = Math.max(1, set.size() - 1);
for (BlockFace face : set) {
BlockPos pipePos = face.getPos();
Direction pipeSide = face.getFace();
@ -309,18 +294,6 @@ public class PumpBlockEntity extends KineticBlockEntity {
return FluidPropagator.isOpenEnd(world, blockFace.getPos(), face);
}
@Override
public void write(CompoundTag compound, boolean clientPacket) {
compound.putBoolean("Reversed", reversed);
super.write(compound, clientPacket);
}
@Override
protected void read(CompoundTag compound, boolean clientPacket) {
reversed = compound.getBoolean("Reversed");
super.read(compound, clientPacket);
}
public void updatePipesOnSide(Direction side) {
if (!isSideAccessible(side))
return;
@ -359,7 +332,7 @@ public class PumpBlockEntity extends KineticBlockEntity {
}
public boolean isPullingOnSide(boolean front) {
return front == reversed;
return !front;
}
class PumpFluidTransferBehaviour extends FluidTransportBehaviour {

View file

@ -3,74 +3,28 @@ package com.simibubi.create.content.contraptions.fluids;
import com.jozufozu.flywheel.api.Instancer;
import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.api.instance.DynamicInstance;
import com.jozufozu.flywheel.core.Materials;
import com.jozufozu.flywheel.core.materials.model.ModelData;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.contraptions.base.SingleRotatingInstance;
import com.simibubi.create.content.contraptions.base.flwdata.RotatingData;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
public class PumpCogInstance extends SingleRotatingInstance<PumpBlockEntity> implements DynamicInstance {
private final ModelData[] arrows = new ModelData[2];
private final Direction direction = blockState.getValue(PumpBlock.FACING);
public PumpCogInstance(MaterialManager materialManager, PumpBlockEntity blockEntity) {
super(materialManager, blockEntity);
}
@Override
public void init() {
super.init();
materialManager.defaultSolid()
.material(Materials.TRANSFORMED)
.getModel(AllPartialModels.MECHANICAL_PUMP_ARROW, blockState)
.createInstances(arrows);
public PumpCogInstance(MaterialManager materialManager, PumpBlockEntity blockEntity) {
super(materialManager, blockEntity);
}
@Override
public void beginFrame() {}
@Override
public void beginFrame() {
float angle = Mth.lerp(blockEntity.arrowDirection.getValue(AnimationTickHolder.getPartialTicks()), 0, 90) - 90;
for (int i = 0, arrowsLength = arrows.length; i < arrowsLength; i++) {
arrows[i].loadIdentity()
.translate(getInstancePosition())
.centre()
.rotateY(AngleHelper.horizontalAngle(direction) + 180)
.rotateX(-AngleHelper.verticalAngle(direction) - 90)
.unCentre()
.translate(.5, 14 / 16f, .5)
.rotateY(90 * i)
.rotateZ(angle)
.translateBack(.5, 14 / 16f, .5);
}
}
@Override
public void updateLight() {
super.updateLight();
relight(pos, arrows);
}
@Override
protected Instancer<RotatingData> getModel() {
protected Instancer<RotatingData> getModel() {
BlockState referenceState = blockEntity.getBlockState();
Direction facing = referenceState.getValue(BlockStateProperties.FACING);
return getRotatingMaterial().getModel(AllPartialModels.MECHANICAL_PUMP_COG, referenceState, facing);
}
@Override
public void remove() {
super.remove();
for (ModelData arrow : arrows) {
arrow.delete();
}
}
}

View file

@ -1,20 +1,12 @@
package com.simibubi.create.content.contraptions.fluids;
import com.jozufozu.flywheel.backend.Backend;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.content.contraptions.base.KineticBlockEntityRenderer;
import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.render.SuperByteBuffer;
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.util.Mth;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
public class PumpRenderer extends KineticBlockEntityRenderer<PumpBlockEntity> {
@ -22,30 +14,6 @@ public class PumpRenderer extends KineticBlockEntityRenderer<PumpBlockEntity> {
super(context);
}
@Override
protected void renderSafe(PumpBlockEntity be, float partialTicks, PoseStack ms, MultiBufferSource buffer,
int light, int overlay) {
super.renderSafe(be, partialTicks, ms, buffer, light, overlay);
if (Backend.canUseInstancing(be.getLevel())) return;
Vec3 rotationOffset = new Vec3(.5, 14 / 16f, .5);
BlockState blockState = be.getBlockState();
float angle = Mth.lerp(be.arrowDirection.getValue(partialTicks), 0, 90) - 90;
SuperByteBuffer arrow = CachedBufferer.partial(AllPartialModels.MECHANICAL_PUMP_ARROW, blockState);
for (float yRot : new float[] { 0, 90 }) {
Direction direction = blockState.getValue(PumpBlock.FACING);
arrow.centre()
.rotateY(AngleHelper.horizontalAngle(direction) + 180)
.rotateX(-AngleHelper.verticalAngle(direction) - 90)
.unCentre()
.translate(rotationOffset)
.rotateY(yRot)
.rotateZ(angle)
.translateBack(rotationOffset)
.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.solid()));
}
}
@Override
protected SuperByteBuffer getRotatedModel(PumpBlockEntity be, BlockState state) {
return CachedBufferer.partialFacing(AllPartialModels.MECHANICAL_PUMP_COG, state);

View file

@ -5,7 +5,7 @@ public class CLogistics extends ConfigBase {
public final ConfigInt defaultExtractionLimit =
i(64, 1, 64, "defaultExtractionLimit", Comments.defaultExtractionLimit);
public final ConfigInt defaultExtractionTimer = i(8, 1, "defaultExtractionTimer", Comments.defaultExtractionTimer);
public final ConfigInt psiTimeout = i(20, 1, "psiTimeout", Comments.psiTimeout);
public final ConfigInt psiTimeout = i(60, 1, "psiTimeout", Comments.psiTimeout);
public final ConfigInt mechanicalArmRange = i(5, 1, "mechanicalArmRange", Comments.mechanicalArmRange);
public final ConfigInt linkRange = i(256, 1, "linkRange", Comments.linkRange);
public final ConfigInt displayLinkRange = i(64, 1, "displayLinkRange", Comments.displayLinkRange);

View file

@ -1,117 +0,0 @@
{
"credit": "Made with Blockbench",
"parent": "create:block/large_wheels",
"textures": {
"4": "create:block/pump",
"particle": "create:block/fluid_pipe"
},
"elements": [
{
"from": [7, 11.5, 1.5],
"to": [9, 13.5, 2.5],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 14.5, 9.5]},
"faces": {
"north": {"uv": [12, 2, 14, 4], "rotation": 270, "texture": "#4"},
"east": {"uv": [12, 2, 14, 3], "rotation": 270, "texture": "#4"},
"south": {"uv": [14, 2, 12, 4], "rotation": 90, "texture": "#4"},
"west": {"uv": [12, 3, 14, 4], "rotation": 90, "texture": "#4"},
"up": {"uv": [12, 3, 14, 4], "texture": "#4"},
"down": {"uv": [12, 2, 13, 4], "rotation": 90, "texture": "#4"}
}
},
{
"from": [7, 11.5, 13.5],
"to": [9, 13.5, 14.5],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 14.5, 6.5]},
"faces": {
"north": {"uv": [14, 4, 12, 2], "rotation": 90, "texture": "#4"},
"east": {"uv": [12, 3, 14, 2], "rotation": 270, "texture": "#4"},
"south": {"uv": [12, 4, 14, 2], "rotation": 270, "texture": "#4"},
"west": {"uv": [12, 4, 14, 3], "rotation": 90, "texture": "#4"},
"up": {"uv": [12, 4, 14, 3], "texture": "#4"},
"down": {"uv": [13, 2, 12, 4], "rotation": 90, "texture": "#4"}
}
},
{
"from": [7, 13.5, 1.5],
"to": [11, 15.5, 2.5],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 14.5, 9.5]},
"faces": {
"north": {"uv": [14, 0, 16, 4], "rotation": 270, "texture": "#4"},
"east": {"uv": [14, 0, 16, 1], "rotation": 270, "texture": "#4"},
"south": {"uv": [16, 0, 14, 4], "rotation": 90, "texture": "#4"},
"west": {"uv": [12, 3, 14, 4], "rotation": 270, "texture": "#4"},
"up": {"uv": [15, 0, 16, 4], "rotation": 90, "texture": "#4"},
"down": {"uv": [12, 0, 13, 4], "rotation": 270, "texture": "#4"}
}
},
{
"from": [7, 13.5, 13.5],
"to": [11, 15.5, 14.5],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 14.5, 6.5]},
"faces": {
"north": {"uv": [16, 4, 14, 0], "rotation": 90, "texture": "#4"},
"east": {"uv": [14, 1, 16, 0], "rotation": 270, "texture": "#4"},
"south": {"uv": [14, 4, 16, 0], "rotation": 270, "texture": "#4"},
"west": {"uv": [12, 4, 14, 3], "rotation": 270, "texture": "#4"},
"up": {"uv": [16, 0, 15, 4], "rotation": 90, "texture": "#4"},
"down": {"uv": [13, 0, 12, 4], "rotation": 270, "texture": "#4"}
}
},
{
"name": "rod",
"from": [7.5, 13.5, 1],
"to": [8.5, 14.5, 15],
"rotation": {"angle": 0, "axis": "y", "origin": [15.5, 21.5, 10]},
"faces": {
"north": {"uv": [0, 15, 1, 16], "texture": "#4"},
"east": {"uv": [0, 15, 14, 16], "texture": "#4"},
"south": {"uv": [0, 15, 1, 16], "texture": "#4"},
"west": {"uv": [0, 15, 14, 16], "texture": "#4"},
"up": {"uv": [0, 15, 14, 16], "rotation": 90, "texture": "#4"},
"down": {"uv": [0, 15, 14, 16], "rotation": 90, "texture": "#4"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, -149, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, -149, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, -55, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, -55, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 1, 1.25],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 45, 0],
"translation": [2.5, -0.5, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"rotation": [0, 180, 0],
"translation": [0, 1.75, -4.5],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [
{
"name": "arrow",
"origin": [8, 8, 8],
"children": [0, 1, 2, 3, 4]
}
]
}

View file

@ -37,17 +37,67 @@
},
{
"name": "front",
"from": [3, 12, 3],
"from": [3, 11, 3],
"to": [13, 16, 13],
"rotation": {"angle": 0, "axis": "z", "origin": [8.33333, 8.5, 8]},
"faces": {
"north": {"uv": [12, 4, 16, 14], "rotation": 90, "texture": "#4"},
"east": {"uv": [12, 4, 16, 14], "rotation": 90, "texture": "#4"},
"south": {"uv": [12, 4, 16, 14], "rotation": 90, "texture": "#4"},
"west": {"uv": [12, 4, 16, 14], "rotation": 90, "texture": "#4"},
"north": {"uv": [10.5, 2.5, 13, 7.5], "rotation": 90, "texture": "#2"},
"east": {"uv": [10.5, 2.5, 13, 7.5], "rotation": 90, "texture": "#2"},
"south": {"uv": [10.5, 2.5, 13, 7.5], "rotation": 90, "texture": "#2"},
"west": {"uv": [10.5, 2.5, 13, 7.5], "rotation": 90, "texture": "#2"},
"up": {"uv": [11, 11, 16, 16], "texture": "#2"},
"down": {"uv": [6, 11, 11, 16], "texture": "#2"}
}
},
{
"from": [5.85355, 13.25, 1.75],
"to": [9.85355, 15.25, 13.75],
"rotation": {"angle": 45, "axis": "z", "origin": [8.35355, 13.25, 7.75]},
"faces": {
"north": {"uv": [16, 0, 12, 2], "texture": "#4"},
"east": {"uv": [15, 0, 16, 2], "texture": "#4"},
"south": {"uv": [12, 0, 16, 2], "texture": "#4"},
"west": {"uv": [12, 0, 13, 2], "texture": "#4"},
"up": {"uv": [12, 0, 16, 1], "texture": "#4"},
"down": {"uv": [12, 1, 16, 2], "texture": "#4"}
}
},
{
"from": [7.85355, 11.25, 1.75],
"to": [9.85355, 13.25, 13.75],
"rotation": {"angle": 45, "axis": "z", "origin": [8.35355, 13.25, 7.75]},
"faces": {
"north": {"uv": [16, 2, 14, 4], "texture": "#4"},
"east": {"uv": [15, 2, 16, 4], "texture": "#4"},
"south": {"uv": [14, 2, 16, 4], "texture": "#4"},
"west": {"uv": [14, 2, 15, 4], "texture": "#4"},
"down": {"uv": [14, 3, 16, 4], "texture": "#4"}
}
},
{
"from": [2.35355, 10.75, 7.75],
"to": [14.35355, 12.75, 9.75],
"rotation": {"angle": -45, "axis": "x", "origin": [8.35355, 13.25, 7.75]},
"faces": {
"north": {"uv": [14, 2, 15, 4], "texture": "#4"},
"east": {"uv": [16, 2, 14, 4], "texture": "#4"},
"south": {"uv": [15, 2, 16, 4], "texture": "#4"},
"west": {"uv": [14, 2, 16, 4], "texture": "#4"},
"down": {"uv": [14, 3, 16, 4], "rotation": 270, "texture": "#4"}
}
},
{
"from": [2.35355, 12.75, 5.75],
"to": [14.35355, 14.75, 9.75],
"rotation": {"angle": -45, "axis": "x", "origin": [8.35355, 13.25, 7.75]},
"faces": {
"north": {"uv": [12, 0, 13, 2], "texture": "#4"},
"east": {"uv": [16, 0, 12, 2], "texture": "#4"},
"south": {"uv": [15, 0, 16, 2], "texture": "#4"},
"west": {"uv": [12, 0, 16, 2], "texture": "#4"},
"up": {"uv": [12, 0, 16, 1], "rotation": 90, "texture": "#4"},
"down": {"uv": [12, 1, 16, 2], "rotation": 270, "texture": "#4"}
}
}
],
"display": {
@ -87,6 +137,10 @@
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1, 2]
}
},
3,
4,
5,
6
]
}

View file

@ -8,72 +8,6 @@
"particle": "create:block/pump"
},
"elements": [
{
"from": [1, 3, 1.5],
"to": [3, 5, 2.5],
"rotation": {"angle": -45, "axis": "z", "origin": [6.5, 4, 8]},
"faces": {
"north": {"uv": [12, 2, 14, 4], "texture": "#4"},
"east": {"uv": [12, 2, 13, 4], "texture": "#4"},
"south": {"uv": [14, 2, 12, 4], "texture": "#4"},
"west": {"uv": [12, 3, 14, 4], "rotation": 270, "texture": "#4"},
"up": {"uv": [12, 2, 14, 3], "rotation": 180, "texture": "#4"},
"down": {"uv": [12, 3, 14, 4], "texture": "#4"}
}
},
{
"from": [1, 3, 13.5],
"to": [3, 5, 14.5],
"rotation": {"angle": -45, "axis": "z", "origin": [6.5, 4, 8]},
"faces": {
"north": {"uv": [14, 4, 12, 2], "rotation": 180, "texture": "#4"},
"east": {"uv": [13, 2, 12, 4], "texture": "#4"},
"south": {"uv": [12, 4, 14, 2], "rotation": 180, "texture": "#4"},
"west": {"uv": [12, 4, 14, 3], "rotation": 270, "texture": "#4"},
"up": {"uv": [12, 3, 14, 2], "rotation": 180, "texture": "#4"},
"down": {"uv": [12, 4, 14, 3], "texture": "#4"}
}
},
{
"from": [-1, 3, 1.5],
"to": [1, 7, 2.5],
"rotation": {"angle": -45, "axis": "z", "origin": [6.5, 4, 8]},
"faces": {
"north": {"uv": [14, 0, 16, 4], "texture": "#4"},
"east": {"uv": [12, 0, 13, 4], "rotation": 180, "texture": "#4"},
"south": {"uv": [16, 0, 14, 4], "texture": "#4"},
"west": {"uv": [15, 0, 16, 4], "texture": "#4"},
"up": {"uv": [14, 0, 16, 1], "rotation": 180, "texture": "#4"},
"down": {"uv": [12, 3, 14, 4], "rotation": 180, "texture": "#4"}
}
},
{
"from": [-1, 3, 13.5],
"to": [1, 7, 14.5],
"rotation": {"angle": -45, "axis": "z", "origin": [6.5, 4, 8]},
"faces": {
"north": {"uv": [16, 4, 14, 0], "rotation": 180, "texture": "#4"},
"east": {"uv": [13, 0, 12, 4], "rotation": 180, "texture": "#4"},
"south": {"uv": [14, 4, 16, 0], "rotation": 180, "texture": "#4"},
"west": {"uv": [16, 0, 15, 4], "texture": "#4"},
"up": {"uv": [14, 1, 16, 0], "rotation": 180, "texture": "#4"},
"down": {"uv": [12, 4, 14, 3], "rotation": 180, "texture": "#4"}
}
},
{
"name": "rod",
"from": [2, 8, 1],
"to": [3, 9, 15],
"rotation": {"angle": 0, "axis": "y", "origin": [8.5, 16, 8]},
"faces": {
"north": {"uv": [0, 15, 1, 16], "rotation": 90, "texture": "#4"},
"east": {"uv": [0, 15, 14, 16], "texture": "#4"},
"south": {"uv": [0, 15, 1, 16], "rotation": 270, "texture": "#4"},
"west": {"uv": [0, 15, 14, 16], "texture": "#4"},
"up": {"uv": [0, 15, 14, 16], "rotation": 270, "texture": "#4"},
"down": {"uv": [0, 15, 14, 16], "rotation": 270, "texture": "#4"}
}
},
{
"name": "Gear5",
"from": [5.5, 7, -1],
@ -158,6 +92,20 @@
"down": {"uv": [11.5, 15.5, 15.5, 11.5], "texture": "#2"}
}
},
{
"name": "front",
"from": [0.5, 3.5, 3],
"to": [5.5, 13.5, 13],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [10.5, 2.5, 13, 7.5], "rotation": 180, "texture": "#2"},
"east": {"uv": [6, 11, 11, 16], "rotation": 270, "texture": "#2"},
"south": {"uv": [10.5, 2.5, 13, 7.5], "texture": "#2"},
"west": {"uv": [11, 11, 16, 16], "rotation": 270, "texture": "#2"},
"up": {"uv": [10.5, 2.5, 13, 7.5], "texture": "#2"},
"down": {"uv": [10.5, 2.5, 13, 7.5], "texture": "#2"}
}
},
{
"name": "back",
"from": [11.5, 2.5, 2],
@ -173,17 +121,53 @@
}
},
{
"name": "front",
"from": [0.5, 3.5, 3],
"to": [4.5, 13.5, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [8.5, 10.5, 8]},
"from": [1.70355, 6.15, 2],
"to": [3.70355, 10.15, 14],
"rotation": {"angle": 45, "axis": "z", "origin": [3.35355, 8.25, 7.75]},
"faces": {
"north": {"uv": [12, 4, 16, 14], "rotation": 180, "texture": "#4"},
"east": {"uv": [6, 11, 11, 16], "rotation": 270, "texture": "#2"},
"south": {"uv": [12, 4, 16, 14], "texture": "#4"},
"west": {"uv": [11, 11, 16, 16], "rotation": 270, "texture": "#2"},
"up": {"uv": [12, 4, 16, 14], "texture": "#4"},
"down": {"uv": [12, 4, 16, 14], "texture": "#4"}
"north": {"uv": [16, 0, 12, 2], "rotation": 90, "texture": "#4"},
"east": {"uv": [12, 1, 16, 2], "rotation": 270, "texture": "#4"},
"south": {"uv": [12, 0, 16, 2], "rotation": 270, "texture": "#4"},
"west": {"uv": [12, 0, 16, 1], "rotation": 270, "texture": "#4"},
"up": {"uv": [15, 0, 16, 2], "rotation": 270, "texture": "#4"},
"down": {"uv": [12, 0, 13, 2], "rotation": 270, "texture": "#4"}
}
},
{
"from": [3.70355, 8.15, 2],
"to": [5.70355, 10.15, 14],
"rotation": {"angle": 45, "axis": "z", "origin": [3.35355, 8.25, 7.75]},
"faces": {
"north": {"uv": [16, 2, 14, 4], "rotation": 90, "texture": "#4"},
"east": {"uv": [14, 3, 16, 4], "rotation": 270, "texture": "#4"},
"south": {"uv": [14, 2, 16, 4], "rotation": 270, "texture": "#4"},
"up": {"uv": [15, 2, 16, 4], "rotation": 270, "texture": "#4"},
"down": {"uv": [14, 2, 15, 4], "rotation": 270, "texture": "#4"}
}
},
{
"from": [3.85355, 2.5, 7.75],
"to": [5.85355, 14.5, 9.75],
"rotation": {"angle": -45, "axis": "y", "origin": [3.35355, 8.25, 7.75]},
"faces": {
"north": {"uv": [14, 2, 15, 4], "rotation": 90, "texture": "#4"},
"east": {"uv": [14, 3, 16, 4], "rotation": 180, "texture": "#4"},
"south": {"uv": [15, 2, 16, 4], "rotation": 270, "texture": "#4"},
"up": {"uv": [16, 2, 14, 4], "rotation": 270, "texture": "#4"},
"down": {"uv": [14, 2, 16, 4], "rotation": 270, "texture": "#4"}
}
},
{
"from": [1.85355, 2.5, 5.75],
"to": [3.85355, 14.5, 9.75],
"rotation": {"angle": -45, "axis": "y", "origin": [3.35355, 8.25, 7.75]},
"faces": {
"north": {"uv": [12, 0, 13, 2], "rotation": 90, "texture": "#4"},
"east": {"uv": [12, 1, 16, 2], "rotation": 180, "texture": "#4"},
"south": {"uv": [15, 0, 16, 2], "rotation": 270, "texture": "#4"},
"west": {"uv": [12, 0, 16, 1], "texture": "#4"},
"up": {"uv": [16, 0, 12, 2], "rotation": 270, "texture": "#4"},
"down": {"uv": [12, 0, 16, 2], "rotation": 270, "texture": "#4"}
}
}
],
@ -220,22 +204,22 @@
},
"groups": [
{
"name": "arrow",
"name": "cogwheel",
"origin": [8, 8, 8],
"color": 0,
"children": [0, 1, 2, 3, 4]
},
{
"name": "cogwheel",
"origin": [8, 8, 8],
"color": 0,
"children": [5, 6, 7, 8, 9]
},
{
"name": "pump",
"origin": [8, 8, 8],
"color": 0,
"children": [10, 11, 12]
"children": [5, 6, 7]
},
{
"name": "Arrow",
"origin": [8, 8, 8],
"color": 0,
"children": [8, 9, 10, 11]
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 808 B

After

Width:  |  Height:  |  Size: 881 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 678 B

After

Width:  |  Height:  |  Size: 684 B