Are we there yet

- Fixed non-vanilla signs not accepted as valid display targets
- Fixed roller not rotating with correct transforms when flywheel is disabled
- Brass tunnels with no distribution behaviour no longer show the mode switcher
- Used more contrasting colours for diode and tunnel value inputs
- Fixed crash when hose pulley cannot find reference fluid for infinite draining
- Fixed incorrect vertical textures for encased chutes and industrial iron blocks
This commit is contained in:
simibubi 2023-04-30 18:06:55 +02:00
parent 5f0893e65b
commit 7cabcfca3c
33 changed files with 203 additions and 277 deletions

View file

@ -1129,7 +1129,7 @@ d13df8a5920c5778d98081fb0e97f045e2fd46a2 assets/create/models/block/horizontal_f
a5938ddd48109f067a19a90a0f9abab655c18821 assets/create/models/block/horizontal_framed_glass_pane_post.json a5938ddd48109f067a19a90a0f9abab655c18821 assets/create/models/block/horizontal_framed_glass_pane_post.json
41645919ece236df5804a5a73ef682720194de34 assets/create/models/block/horizontal_framed_glass_pane_side.json 41645919ece236df5804a5a73ef682720194de34 assets/create/models/block/horizontal_framed_glass_pane_side.json
8bc0abaabdc62d0c27730dba7eb6da54607b7e96 assets/create/models/block/horizontal_framed_glass_pane_side_alt.json 8bc0abaabdc62d0c27730dba7eb6da54607b7e96 assets/create/models/block/horizontal_framed_glass_pane_side_alt.json
07c1e1bcd87766cf324ac11ce1488856d1db86c3 assets/create/models/block/industrial_iron_block.json cb425a5ba6d27004e071b407a2d262b702bba065 assets/create/models/block/industrial_iron_block.json
35253c91ed72c7c2ce981c384d334c1113851469 assets/create/models/block/jungle_window.json 35253c91ed72c7c2ce981c384d334c1113851469 assets/create/models/block/jungle_window.json
65da656d412d973865f50ab7f02e278fe5398bea assets/create/models/block/jungle_window_pane_noside.json 65da656d412d973865f50ab7f02e278fe5398bea assets/create/models/block/jungle_window_pane_noside.json
9f4144df2e6b35c1fad04e594be5adb3b107bdb8 assets/create/models/block/jungle_window_pane_noside_alt.json 9f4144df2e6b35c1fad04e594be5adb3b107bdb8 assets/create/models/block/jungle_window_pane_noside_alt.json

View file

@ -1,6 +1,7 @@
{ {
"parent": "minecraft:block/cube_all", "parent": "minecraft:block/cube_column",
"textures": { "textures": {
"all": "create:block/industrial_iron_block" "side": "create:block/industrial_iron_block",
"end": "create:block/industrial_iron_block_top"
} }
} }

View file

@ -2238,7 +2238,9 @@ public class AllBlocks {
.properties(p -> p.sound(SoundType.NETHERITE_BLOCK)) .properties(p -> p.sound(SoundType.NETHERITE_BLOCK))
.properties(p -> p.requiresCorrectToolForDrops()) .properties(p -> p.requiresCorrectToolForDrops())
.transform(pickaxeOnly()) .transform(pickaxeOnly())
.blockstate(simpleCubeAll("industrial_iron_block")) .blockstate((c, p) -> p.simpleBlock(c.get(), p.models()
.cubeColumn(c.getName(), p.modLoc("block/industrial_iron_block"),
p.modLoc("block/industrial_iron_block_top"))))
.tag(AllBlockTags.WRENCH_PICKUP.tag) .tag(AllBlockTags.WRENCH_PICKUP.tag)
.lang("Block of Industrial Iron") .lang("Block of Industrial Iron")
.recipe((c, p) -> p.stonecutting(DataIngredient.tag(Tags.Items.INGOTS_IRON), c::get, 2)) .recipe((c, p) -> p.stonecutting(DataIngredient.tag(Tags.Items.INGOTS_IRON), c::get, 2))

View file

@ -253,8 +253,8 @@ public class AllShapes {
.build(), .build(),
SPOUT = shape(1, 2, 1, 15, 14, 15).add(2, 0, 2, 14, 16, 14) SPOUT = shape(1, 2, 1, 15, 14, 15).add(2, 0, 2, 14, 16, 14)
.build(), .build(),
MILLSTONE = shape(0, 0, 0, 16, 6, 16).add(2, 6, 2, 14, 13, 14) MILLSTONE = shape(0, 0, 0, 16, 6, 16).add(2, 6, 2, 14, 12, 14)
.add(3, 13, 3, 13, 16, 13) .add(3, 12, 3, 13, 16, 13)
.build(), .build(),
CUCKOO_CLOCK = shape(1, 0, 1, 15, 19, 15).build(), CUCKOO_CLOCK = shape(1, 0, 1, 15, 19, 15).build(),
GAUGE_SHAPE_UP = shape(1, 0, 0, 15, 2, 16).add(2, 2, 1, 14, 14, 15) GAUGE_SHAPE_UP = shape(1, 0, 0, 15, 2, 16).add(2, 2, 1, 14, 14, 15)

View file

@ -64,9 +64,9 @@ public class RollerRenderer extends SmartBlockEntityRenderer<RollerBlockEntity>
if (context.contraption.stalled) if (context.contraption.stalled)
speed = 0; speed = 0;
superBuffer.translate(Vec3.atLowerCornerOf(facing.getNormal()) superBuffer.transform(matrices.getModel())
.scale(17 / 16f)) .translate(Vec3.atLowerCornerOf(facing.getNormal())
.transform(matrices.getModel()); .scale(17 / 16f));
HarvesterRenderer.transform(context.world, facing, superBuffer, speed, Vec3.ZERO); HarvesterRenderer.transform(context.world, facing, superBuffer, speed, Vec3.ZERO);
PoseStack viewProjection = matrices.getViewProjection(); PoseStack viewProjection = matrices.getViewProjection();

View file

@ -83,10 +83,21 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour {
if (validationFrontier.isEmpty() && !queue.isEmpty() && !simulate && revalidateIn == 0) if (validationFrontier.isEmpty() && !queue.isEmpty() && !simulate && revalidateIn == 0)
revalidate(root); revalidate(root);
if (infinite) {
blockEntity.award(AllAdvancements.HOSE_PULLEY);
if (FluidHelper.isLava(fluid))
blockEntity.award(AllAdvancements.HOSE_PULLEY_LAVA);
playEffect(world, root, fluid, true);
return true;
}
while (!queue.isEmpty()) { while (!queue.isEmpty()) {
// Dont dequeue here, so we can decide not to dequeue a valid entry when // Dont dequeue here, so we can decide not to dequeue a valid entry when
// simulating // simulating
BlockPos currentPos = queue.first().pos(); BlockPos currentPos = queue.first()
.pos();
BlockState blockState = world.getBlockState(currentPos); BlockState blockState = world.getBlockState(currentPos);
BlockState emptied = blockState; BlockState emptied = blockState;
Fluid fluid = Fluids.EMPTY; Fluid fluid = Fluids.EMPTY;
@ -137,12 +148,6 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour {
playEffect(world, currentPos, fluid, true); playEffect(world, currentPos, fluid, true);
blockEntity.award(AllAdvancements.HOSE_PULLEY); blockEntity.award(AllAdvancements.HOSE_PULLEY);
if (infinite) {
if (FluidHelper.isLava(fluid))
blockEntity.award(AllAdvancements.HOSE_PULLEY_LAVA);
return true;
}
if (!blockEntity.isVirtual()) if (!blockEntity.isVirtual())
world.setBlock(currentPos, emptied, 2 | 16); world.setBlock(currentPos, emptied, 2 | 16);
affectedArea = BBHelper.encapsulate(affectedArea, currentPos); affectedArea = BBHelper.encapsulate(affectedArea, currentPos);
@ -273,20 +278,11 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour {
visited.clear(); visited.clear();
} }
Level world = getWorld();
int maxBlocks = maxBlocks(); int maxBlocks = maxBlocks();
if (visited.size() > maxBlocks && canDrainInfinitely(fluid) && !queue.isEmpty()) { if (visited.size() > maxBlocks && canDrainInfinitely(fluid) && !queue.isEmpty()) {
infinite = true; infinite = true;
// Find first block with valid fluid BlockPos firstValid = queue.first()
while (true) { .pos();
BlockPos first = queue.first().pos();
if (canPullFluidsFrom(world.getBlockState(first), first) != FluidBlockType.SOURCE) {
queue.dequeue();
continue;
}
break;
}
BlockPos firstValid = queue.first().pos();
frontier.clear(); frontier.clear();
visited.clear(); visited.clear();
queue.clear(); queue.clear();

View file

@ -21,7 +21,6 @@ import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape;
import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.foundation.blockEntity.BlockEntityBehaviour; import com.simibubi.create.foundation.blockEntity.BlockEntityBehaviour;
import com.simibubi.create.foundation.blockEntity.behaviour.CenteredSideValueBoxTransform;
import com.simibubi.create.foundation.blockEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.blockEntity.behaviour.filtering.SidedFilteringBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.SidedFilteringBehaviour;
@ -66,7 +65,7 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa
ItemStack stackToDistribute; ItemStack stackToDistribute;
Direction stackEnteredFrom; Direction stackEnteredFrom;
float distributionProgress; float distributionProgress;
int distributionDistanceLeft; int distributionDistanceLeft;
int distributionDistanceRight; int distributionDistanceRight;
@ -98,8 +97,9 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa
public void addBehaviours(List<BlockEntityBehaviour> behaviours) { public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
super.addBehaviours(behaviours); super.addBehaviours(behaviours);
behaviours.add(selectionMode = new ScrollOptionBehaviour<>(SelectionMode.class, behaviours.add(selectionMode = new ScrollOptionBehaviour<>(SelectionMode.class,
Lang.translateDirect("logistics.when_multiple_outputs_available"), this, Lang.translateDirect("logistics.when_multiple_outputs_available"), this, new BrassTunnelModeSlot()));
new CenteredSideValueBoxTransform((state, d) -> d == Direction.UP)));
selectionMode.onlyActiveWhen(this::hasDistributionBehaviour);
// Propagate settings across connected tunnels // Propagate settings across connected tunnels
selectionMode.withCallback(setting -> { selectionMode.withCallback(setting -> {
@ -159,7 +159,8 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa
continue; continue;
distributionTargets.get(!tunnel.flapFilterEmpty(output)) distributionTargets.get(!tunnel.flapFilterEmpty(output))
.add(Pair.of(tunnel.worldPosition, output)); .add(Pair.of(tunnel.worldPosition, output));
int distance = tunnel.worldPosition.getX() + tunnel.worldPosition.getZ() - worldPosition.getX() - worldPosition.getZ(); int distance = tunnel.worldPosition.getX() + tunnel.worldPosition.getZ() - worldPosition.getX()
- worldPosition.getZ();
if (distance < 0) if (distance < 0)
distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance); distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance);
else else
@ -527,7 +528,7 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa
continue; continue;
if (!tunnelBE.sides.contains(direction)) if (!tunnelBE.sides.contains(direction))
continue; continue;
BlockPos offset = tunnelBE.worldPosition.below() BlockPos offset = tunnelBE.worldPosition.below()
.relative(direction); .relative(direction);
@ -578,11 +579,11 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa
compound.putBoolean("SyncedOutput", syncedOutputActive); compound.putBoolean("SyncedOutput", syncedOutputActive);
compound.putBoolean("ConnectedLeft", connectedLeft); compound.putBoolean("ConnectedLeft", connectedLeft);
compound.putBoolean("ConnectedRight", connectedRight); compound.putBoolean("ConnectedRight", connectedRight);
compound.put("StackToDistribute", stackToDistribute.serializeNBT()); compound.put("StackToDistribute", stackToDistribute.serializeNBT());
if (stackEnteredFrom != null) if (stackEnteredFrom != null)
NBTHelper.writeEnum(compound, "StackEnteredFrom", stackEnteredFrom); NBTHelper.writeEnum(compound, "StackEnteredFrom", stackEnteredFrom);
compound.putFloat("DistributionProgress", distributionProgress); compound.putFloat("DistributionProgress", distributionProgress);
compound.putInt("PreviousIndex", previousOutputIndex); compound.putInt("PreviousIndex", previousOutputIndex);
compound.putInt("DistanceLeft", distributionDistanceLeft); compound.putInt("DistanceLeft", distributionDistanceLeft);
@ -610,7 +611,7 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa
syncedOutputActive = compound.getBoolean("SyncedOutput"); syncedOutputActive = compound.getBoolean("SyncedOutput");
connectedLeft = compound.getBoolean("ConnectedLeft"); connectedLeft = compound.getBoolean("ConnectedLeft");
connectedRight = compound.getBoolean("ConnectedRight"); connectedRight = compound.getBoolean("ConnectedRight");
stackToDistribute = ItemStack.of(compound.getCompound("StackToDistribute")); stackToDistribute = ItemStack.of(compound.getCompound("StackToDistribute"));
stackEnteredFrom = stackEnteredFrom =
compound.contains("StackEnteredFrom") ? NBTHelper.readEnum(compound, "StackEnteredFrom", Direction.class) compound.contains("StackEnteredFrom") ? NBTHelper.readEnum(compound, "StackEnteredFrom", Direction.class)
@ -718,7 +719,7 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa
super.invalidate(); super.invalidate();
tunnelCapability.invalidate(); tunnelCapability.invalidate();
} }
@Override @Override
public void destroy() { public void destroy() {
super.destroy(); super.destroy();
@ -781,20 +782,22 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa
List<ItemStack> allStacks = grabAllStacksOfGroup(true); List<ItemStack> allStacks = grabAllStacksOfGroup(true);
if (allStacks.isEmpty()) if (allStacks.isEmpty())
return false; return false;
tooltip.add(componentSpacing.plainCopy() tooltip.add(componentSpacing.plainCopy()
.append(Lang.translateDirect("tooltip.brass_tunnel.contains")) .append(Lang.translateDirect("tooltip.brass_tunnel.contains"))
.withStyle(ChatFormatting.WHITE)); .withStyle(ChatFormatting.WHITE));
for (ItemStack item : allStacks) { for (ItemStack item : allStacks) {
tooltip.add(componentSpacing.plainCopy() tooltip.add(componentSpacing.plainCopy()
.append(Lang.translateDirect("tooltip.brass_tunnel.contains_entry", Components.translatable(item.getDescriptionId()) .append(Lang.translateDirect("tooltip.brass_tunnel.contains_entry",
.getString(), item.getCount())) Components.translatable(item.getDescriptionId())
.getString(),
item.getCount()))
.withStyle(ChatFormatting.GRAY)); .withStyle(ChatFormatting.GRAY));
} }
tooltip.add(componentSpacing.plainCopy() tooltip.add(componentSpacing.plainCopy()
.append(Lang.translateDirect("tooltip.brass_tunnel.retrieve")) .append(Lang.translateDirect("tooltip.brass_tunnel.retrieve"))
.withStyle(ChatFormatting.DARK_GRAY)); .withStyle(ChatFormatting.DARK_GRAY));
return true; return true;
} }

View file

@ -4,39 +4,45 @@ import org.jetbrains.annotations.Nullable;
import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.AllSpriteShifts;
import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry;
import com.simibubi.create.foundation.block.connected.CTType;
import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
public class BrassTunnelCTBehaviour extends ConnectedTextureBehaviour.Base { public class BrassTunnelCTBehaviour extends ConnectedTextureBehaviour.Base {
@Override
public @Nullable CTType getDataType(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction direction) {
if (!(world.getBlockEntity(pos) instanceof BrassTunnelBlockEntity tunnelBE)
|| !tunnelBE.hasDistributionBehaviour())
return null;
return super.getDataType(world, pos, state, direction);
}
@Override @Override
public CTSpriteShiftEntry getShift(BlockState state, Direction direction, @Nullable TextureAtlasSprite sprite) { public CTSpriteShiftEntry getShift(BlockState state, Direction direction, @Nullable TextureAtlasSprite sprite) {
return direction == Direction.UP ? AllSpriteShifts.BRASS_TUNNEL_TOP : null; return direction == Direction.UP ? AllSpriteShifts.BRASS_TUNNEL_TOP : null;
} }
@Override @Override
protected boolean reverseUVs(BlockState state, Direction face) { protected boolean reverseUVs(BlockState state, Direction face) {
return true; return true;
} }
@Override @Override
public boolean connectsTo(BlockState state, BlockState other, BlockAndTintGetter reader, BlockPos pos, BlockPos otherPos, public boolean connectsTo(BlockState state, BlockState other, BlockAndTintGetter reader, BlockPos pos,
Direction face) { BlockPos otherPos, Direction face) {
int yDiff = otherPos.getY() - pos.getY(); int yDiff = otherPos.getY() - pos.getY();
int zDiff = otherPos.getZ() - pos.getZ(); int zDiff = otherPos.getZ() - pos.getZ();
if (yDiff != 0) if (yDiff != 0)
return false; return false;
BlockEntity be = reader.getBlockEntity(pos); if (!(reader.getBlockEntity(pos) instanceof BrassTunnelBlockEntity tunnelBE))
if (!(be instanceof BrassTunnelBlockEntity))
return false; return false;
BrassTunnelBlockEntity tunnelBE = (BrassTunnelBlockEntity) be;
boolean leftSide = zDiff > 0; boolean leftSide = zDiff > 0;
return tunnelBE.isConnected(leftSide); return tunnelBE.isConnected(leftSide);
} }

View file

@ -0,0 +1,18 @@
package com.simibubi.create.content.logistics.block.belts.tunnel;
import com.simibubi.create.foundation.blockEntity.behaviour.CenteredSideValueBoxTransform;
import net.minecraft.core.Direction;
public class BrassTunnelModeSlot extends CenteredSideValueBoxTransform {
public BrassTunnelModeSlot() {
super((state, d) -> d == Direction.UP);
}
@Override
public int getOverrideColor() {
return 0x592424;
}
}

View file

@ -25,4 +25,9 @@ public class BrassDiodeScrollSlot extends ValueBoxTransform {
.rotateX(90); .rotateX(90);
} }
@Override
public int getOverrideColor() {
return 0x592424;
}
} }

View file

@ -28,6 +28,7 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.entity.SignBlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
@ -222,6 +223,10 @@ public class AllDisplayBehaviours {
DisplayTarget targetOfBlock = targetOf(blockState); DisplayTarget targetOfBlock = targetOf(blockState);
DisplayTarget targetOfBlockEntity = blockEntity == null ? null : targetOf(blockEntity); DisplayTarget targetOfBlockEntity = blockEntity == null ? null : targetOf(blockEntity);
// Commonly added by mods, but with a non-vanilla blockentitytype
if (targetOfBlockEntity == null && blockEntity instanceof SignBlockEntity)
targetOfBlockEntity = targetOf(BlockEntityType.SIGN);
if (targetOfBlockEntity == null) if (targetOfBlockEntity == null)
return targetOfBlock; return targetOfBlock;
return targetOfBlockEntity; return targetOfBlockEntity;

View file

@ -134,9 +134,9 @@ public class BoilerDisplaySource extends DisplaySource {
} }
return Stream.of(List.of(Lang.translateDirect(label, boiler.getHeatLevelTextComponent())), return Stream.of(List.of(Lang.translateDirect(label, boiler.getHeatLevelTextComponent())),
List.of(size, boiler.getSizeComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.BLACK)), List.of(size, boiler.getSizeComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.RESET)),
List.of(water, boiler.getWaterComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.BLACK)), List.of(water, boiler.getWaterComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.RESET)),
List.of(heat, boiler.getHeatComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.BLACK))); List.of(heat, boiler.getHeatComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.RESET)));
} }
private int labelWidth() { private int labelWidth() {

View file

@ -50,7 +50,7 @@ public class CTModel extends BakedModelWrapperWithData {
&& !(actualState.getBlock()instanceof CopycatBlock ufb && !(actualState.getBlock()instanceof CopycatBlock ufb
&& !ufb.canFaceBeOccluded(actualState, face))) && !ufb.canFaceBeOccluded(actualState, face)))
continue; continue;
CTType dataType = behaviour.getDataType(state, face); CTType dataType = behaviour.getDataType(world, pos, state, face);
if (dataType == null) if (dataType == null)
continue; continue;
CTContext context = behaviour.buildContext(world, pos, state, face, dataType.getContextRequirement()); CTContext context = behaviour.buildContext(world, pos, state, face, dataType.getContextRequirement());

View file

@ -21,7 +21,7 @@ public abstract class ConnectedTextureBehaviour {
// TODO: allow more than one data type per state/face? // TODO: allow more than one data type per state/face?
@Nullable @Nullable
public abstract CTType getDataType(BlockState state, Direction direction); public abstract CTType getDataType(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction direction);
public boolean buildContextForOccludedDirections() { public boolean buildContextForOccludedDirections() {
return false; return false;
@ -32,7 +32,7 @@ public abstract class ConnectedTextureBehaviour {
BlockPos blockingPos = otherPos.relative(face); BlockPos blockingPos = otherPos.relative(face);
BlockState blockState = reader.getBlockState(pos); BlockState blockState = reader.getBlockState(pos);
if (blockState.getBlock()instanceof CopycatBlock ufb if (blockState.getBlock() instanceof CopycatBlock ufb
&& ufb.isUnblockableConnectivitySide(reader, blockState, face, pos, otherPos)) && ufb.isUnblockableConnectivitySide(reader, blockState, face, pos, otherPos))
return false; return false;
@ -60,7 +60,7 @@ public abstract class ConnectedTextureBehaviour {
.relative(vertical, sv); .relative(vertical, sv);
BlockState blockState = reader.getBlockState(pos); BlockState blockState = reader.getBlockState(pos);
if (blockState.getBlock()instanceof CopycatBlock ufb if (blockState.getBlock() instanceof CopycatBlock ufb
&& ufb.isIgnoredConnectivitySide(reader, blockState, face, pos, p)) && ufb.isIgnoredConnectivitySide(reader, blockState, face, pos, p))
return false; return false;
@ -73,7 +73,7 @@ public abstract class ConnectedTextureBehaviour {
BlockPos toPos) { BlockPos toPos) {
BlockState blockState = reader.getBlockState(toPos); BlockState blockState = reader.getBlockState(toPos);
if (blockState.getBlock()instanceof CopycatBlock ufb) { if (blockState.getBlock() instanceof CopycatBlock ufb) {
BlockState connectiveMaterial = ufb.getConnectiveMaterial(reader, reference, face, fromPos, toPos); BlockState connectiveMaterial = ufb.getConnectiveMaterial(reader, reference, face, fromPos, toPos);
return connectiveMaterial == null ? blockState : connectiveMaterial; return connectiveMaterial == null ? blockState : connectiveMaterial;
} }
@ -274,7 +274,7 @@ public abstract class ConnectedTextureBehaviour {
@Override @Override
@Nullable @Nullable
public CTType getDataType(BlockState state, Direction direction) { public CTType getDataType(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction direction) {
CTSpriteShiftEntry shift = getShift(state, direction, null); CTSpriteShiftEntry shift = getShift(state, direction, null);
if (shift == null) { if (shift == null) {
return null; return null;

View file

@ -30,8 +30,8 @@ public class ValueBox extends ChasingAABBOutline {
protected Component scrollTooltip = Components.immutableEmpty(); protected Component scrollTooltip = Components.immutableEmpty();
protected Vec3 labelOffset = Vec3.ZERO; protected Vec3 labelOffset = Vec3.ZERO;
protected int passiveColor; public int overrideColor = -1;
protected int highlightColor;
public boolean isPassive; public boolean isPassive;
protected BlockPos pos; protected BlockPos pos;
@ -65,6 +65,11 @@ public class ValueBox extends ChasingAABBOutline {
this.isPassive = passive; this.isPassive = passive;
return this; return this;
} }
public ValueBox withColor(int color) {
this.overrideColor = color;
return this;
}
@Override @Override
public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) {
@ -183,7 +188,7 @@ public class ValueBox extends ChasingAABBOutline {
Font font = Minecraft.getInstance().font; Font font = Minecraft.getInstance().font;
float scale = 3; float scale = 3;
ms.scale(scale, scale, 1); ms.scale(scale, scale, 1);
ms.translate(-4, -4, 5); ms.translate(-4, -3.75, 5);
int stringWidth = font.width(text); int stringWidth = font.width(text);
float numberScale = (float) font.lineHeight / stringWidth; float numberScale = (float) font.lineHeight / stringWidth;
@ -195,7 +200,8 @@ public class ValueBox extends ChasingAABBOutline {
ms.scale(numberScale, numberScale, numberScale); ms.scale(numberScale, numberScale, numberScale);
ms.translate(singleDigit ? stringWidth / 2 : 0, singleDigit ? -verticalMargin : verticalMargin, 0); ms.translate(singleDigit ? stringWidth / 2 : 0, singleDigit ? -verticalMargin : verticalMargin, 0);
renderHoveringText(ms, buffer, text, 0xEDEDED, 0x4f4f4f); int overrideColor = transform.getOverrideColor();
renderHoveringText(ms, buffer, text, overrideColor != -1 ? overrideColor : 0xEDEDED);
} }
} }
@ -214,17 +220,16 @@ public class ValueBox extends ChasingAABBOutline {
float scale = 2 * 16; float scale = 2 * 16;
ms.scale(scale, scale, scale); ms.scale(scale, scale, scale);
ms.translate(-.5f, -.5f, 5 / 32f); ms.translate(-.5f, -.5f, 5 / 32f);
icon.render(ms, buffer, 0xFFFFFF);
int overrideColor = transform.getOverrideColor();
icon.render(ms, buffer, overrideColor != -1 ? overrideColor : 0xFFFFFF);
} }
} }
protected void renderHoveringText(PoseStack ms, MultiBufferSource buffer, Component text, int color, protected void renderHoveringText(PoseStack ms, MultiBufferSource buffer, Component text, int color) {
int shadowColor) {
ms.pushPose(); ms.pushPose();
drawString(ms, buffer, text, 0, 0, color); drawString(ms, buffer, text, 0, 0, color);
ms.translate(0, 0, -.25);
drawString(ms, buffer, text, 1, 1, shadowColor);
ms.popPose(); ms.popPose();
} }

View file

@ -43,6 +43,10 @@ public abstract class ValueBoxTransform {
public boolean shouldRender(BlockState state) { public boolean shouldRender(BlockState state) {
return state.getMaterial() != Material.AIR && getLocalOffset(state) != null; return state.getMaterial() != Material.AIR && getLocalOffset(state) != null;
} }
public int getOverrideColor() {
return -1;
}
protected Vec3 rotateHorizontally(BlockState state, Vec3 vec) { protected Vec3 rotateHorizontally(BlockState state, Vec3 vec) {
float yRot = 0; float yRot = 0;

View file

@ -4,6 +4,7 @@
"textures": { "textures": {
"3": "create:block/chute", "3": "create:block/chute",
"4": "create:block/chute_large", "4": "create:block/chute_large",
"5": "create:block/industrial_iron_block_top",
"particle": "create:block/industrial_iron_block" "particle": "create:block/industrial_iron_block"
}, },
"elements": [ "elements": [
@ -15,7 +16,7 @@
"east": {"uv": [0, 0, 16, 16], "texture": "#particle"}, "east": {"uv": [0, 0, 16, 16], "texture": "#particle"},
"south": {"uv": [0, 0, 16, 16], "texture": "#particle"}, "south": {"uv": [0, 0, 16, 16], "texture": "#particle"},
"west": {"uv": [0, 0, 16, 16], "texture": "#particle"}, "west": {"uv": [0, 0, 16, 16], "texture": "#particle"},
"up": {"uv": [0, 0, 16, 16], "texture": "#particle"}, "up": {"uv": [0, 0, 16, 16], "texture": "#5"},
"down": {"uv": [0, 0, 8, 8], "texture": "#4"} "down": {"uv": [0, 0, 8, 8], "texture": "#4"}
} }
}, },

View file

@ -22,7 +22,7 @@
"from": [2, 5, 14], "from": [2, 5, 14],
"to": [14, 14, 16], "to": [14, 14, 16],
"faces": { "faces": {
"north": {"uv": [1, 0, 7, 4.5], "texture": "#1_7"}, "north": {"uv": [1, 0, 7, 3.5], "texture": "#1_7"},
"south": {"uv": [1, 0, 7, 4.5], "texture": "#4"}, "south": {"uv": [1, 0, 7, 4.5], "texture": "#4"},
"up": {"uv": [1, 0, 7, 1], "rotation": 180, "texture": "#4"} "up": {"uv": [1, 0, 7, 1], "rotation": 180, "texture": "#4"}
} }
@ -42,7 +42,8 @@
}, },
{ {
"from": [2, 5, 7], "from": [2, 5, 7],
"to": [14, 10, 15], "to": [14, 10.1, 15],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 0.1, 0]},
"faces": { "faces": {
"north": {"uv": [1, 16, 7, 13.5], "rotation": 180, "texture": "#4"}, "north": {"uv": [1, 16, 7, 13.5], "rotation": 180, "texture": "#4"},
"down": {"uv": [1, 16, 7, 12], "rotation": 180, "texture": "#4"} "down": {"uv": [1, 16, 7, 12], "rotation": 180, "texture": "#4"}
@ -58,9 +59,9 @@
} }
}, },
{ {
"from": [2, 9, 7], "from": [2, 9.1, 7],
"to": [14, 10, 15], "to": [14, 10.1, 15],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, 10, 7]}, "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 10.1, 7]},
"faces": { "faces": {
"up": {"uv": [1, 9.5, 7, 13.5], "rotation": 180, "texture": "#4"} "up": {"uv": [1, 9.5, 7, 13.5], "rotation": 180, "texture": "#4"}
} }

View file

@ -314,8 +314,8 @@
}, },
"gui": { "gui": {
"rotation": [30, 225, 0], "rotation": [30, 225, 0],
"translation": [0, -1.5, 0], "translation": [0, -2.25, 0],
"scale": [0.4, 0.4, 0.4] "scale": [0.45, 0.45, 0.45]
}, },
"fixed": { "fixed": {
"translation": [0, -3, 0], "translation": [0, -3, 0],

View file

@ -4,66 +4,10 @@
"textures": { "textures": {
"0": "create:block/gearbox", "0": "create:block/gearbox",
"5": "create:block/millstone", "5": "create:block/millstone",
"6": "block/polished_andesite", "8": "create:block/andesite_casing",
"13": "block/stripped_spruce_log", "particle": "create:block/palettes/stone_types/cap/andesite_cut_cap"
"particle": "block/polished_andesite"
}, },
"elements": [ "elements": [
{
"from": [3, 13, 3],
"to": [5, 16, 13],
"faces": {
"north": {"uv": [0, 3, 3, 5], "rotation": 90, "texture": "#13"},
"east": {"uv": [0, 0, 10, 3], "texture": "#13"},
"south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#13"},
"west": {"uv": [0, 0, 3, 10], "rotation": 90, "texture": "#13"},
"up": {"uv": [5, 3, 7, 13], "texture": "#13"},
"down": {"uv": [0, 0, 2, 10], "texture": "#13"}
}
},
{
"from": [11, 13, 3],
"to": [13, 16, 13],
"faces": {
"north": {"uv": [0, 7, 3, 9], "rotation": 90, "texture": "#13"},
"east": {"uv": [0, 10, 3, 0], "rotation": 90, "texture": "#13"},
"south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#13"},
"west": {"uv": [10, 0, 0, 3], "texture": "#13"},
"up": {"uv": [5, 2, 3, 12], "texture": "#13"},
"down": {"uv": [2, 0, 0, 10], "texture": "#13"}
}
},
{
"from": [5, 13, 11],
"to": [11, 16, 13],
"faces": {
"north": {"uv": [0, 0, 6, 3], "texture": "#13"},
"east": {"uv": [0, 0, 2, 3], "texture": "#13"},
"south": {"uv": [0, 3, 3, 9], "rotation": 90, "texture": "#13"},
"west": {"uv": [0, 0, 2, 3], "texture": "#13"},
"up": {"uv": [10, 4, 12, 10], "rotation": 90, "texture": "#13"},
"down": {"uv": [0, 0, 6, 2], "texture": "#13"}
}
},
{
"from": [5, 13, 5],
"to": [11, 15, 11],
"faces": {
"up": {"uv": [6, 0, 9, 3], "rotation": 90, "texture": "#5"}
}
},
{
"from": [5, 13, 3],
"to": [11, 16, 5],
"faces": {
"north": {"uv": [0, 9, 3, 3], "rotation": 90, "texture": "#13"},
"east": {"uv": [2, 0, 0, 3], "texture": "#13"},
"south": {"uv": [6, 0, 0, 3], "texture": "#13"},
"west": {"uv": [2, 0, 0, 3], "texture": "#13"},
"up": {"uv": [7, 3, 5, 9], "rotation": 270, "texture": "#13"},
"down": {"uv": [0, 2, 6, 0], "texture": "#13"}
}
},
{ {
"name": "bottom", "name": "bottom",
"from": [0, 0, 0], "from": [0, 0, 0],
@ -73,7 +17,7 @@
"east": {"uv": [7, 13, 8, 16], "texture": "#5"}, "east": {"uv": [7, 13, 8, 16], "texture": "#5"},
"south": {"uv": [0, 13, 8, 16], "texture": "#5"}, "south": {"uv": [0, 13, 8, 16], "texture": "#5"},
"west": {"uv": [0, 13, 1, 16], "texture": "#5"}, "west": {"uv": [0, 13, 1, 16], "texture": "#5"},
"up": {"uv": [0.5, 8.5, 8.5, 9.5], "texture": "#5"}, "up": {"uv": [0, 0, 16, 2], "texture": "#8"},
"down": {"uv": [0, 14, 16, 16], "texture": "#0"} "down": {"uv": [0, 14, 16, 16], "texture": "#0"}
} }
}, },
@ -86,7 +30,7 @@
"east": {"uv": [8, 13, 7, 16], "texture": "#5"}, "east": {"uv": [8, 13, 7, 16], "texture": "#5"},
"south": {"uv": [8, 13, 0, 16], "texture": "#5"}, "south": {"uv": [8, 13, 0, 16], "texture": "#5"},
"west": {"uv": [1, 13, 0, 16], "texture": "#5"}, "west": {"uv": [1, 13, 0, 16], "texture": "#5"},
"up": {"uv": [0.5, 9.5, 8.5, 8.5], "texture": "#5"}, "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#8"},
"down": {"uv": [0, 16, 16, 14], "texture": "#0"} "down": {"uv": [0, 16, 16, 14], "texture": "#0"}
} }
}, },
@ -96,7 +40,7 @@
"faces": { "faces": {
"east": {"uv": [1, 13, 7, 16], "texture": "#5"}, "east": {"uv": [1, 13, 7, 16], "texture": "#5"},
"west": {"uv": [1, 13, 7, 16], "texture": "#5"}, "west": {"uv": [1, 13, 7, 16], "texture": "#5"},
"up": {"uv": [1.5, 8.5, 7.5, 9.5], "rotation": 270, "texture": "#5"}, "up": {"uv": [0, 14, 2, 2], "texture": "#8"},
"down": {"uv": [0, 2, 2, 14], "texture": "#0"} "down": {"uv": [0, 2, 2, 14], "texture": "#0"}
} }
}, },
@ -106,7 +50,7 @@
"faces": { "faces": {
"east": {"uv": [7, 13, 1, 16], "texture": "#5"}, "east": {"uv": [7, 13, 1, 16], "texture": "#5"},
"west": {"uv": [7, 13, 1, 16], "texture": "#5"}, "west": {"uv": [7, 13, 1, 16], "texture": "#5"},
"up": {"uv": [1.5, 9.5, 7.5, 8.5], "rotation": 270, "texture": "#5"}, "up": {"uv": [0, 14, 2, 2], "rotation": 180, "texture": "#8"},
"down": {"uv": [2, 2, 0, 14], "texture": "#0"} "down": {"uv": [2, 2, 0, 14], "texture": "#0"}
} }
}, },
@ -114,50 +58,30 @@
"from": [2, 1, 2], "from": [2, 1, 2],
"to": [14, 6, 14], "to": [14, 6, 14],
"faces": { "faces": {
"up": {"uv": [2, 2, 14, 14], "rotation": 270, "texture": "#6"}, "up": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#5"},
"down": {"uv": [2, 2, 14, 14], "texture": "#0"} "down": {"uv": [2, 2, 14, 14], "texture": "#0"}
} }
},
{
"from": [3, 12, 3],
"to": [13, 16, 13],
"faces": {
"north": {"uv": [11, 9, 16, 11], "texture": "#5"},
"east": {"uv": [11, 9, 16, 11], "texture": "#5"},
"south": {"uv": [11, 9, 16, 11], "texture": "#5"},
"west": {"uv": [11, 9, 16, 11], "texture": "#5"},
"up": {"uv": [16, 11, 11, 16], "texture": "#5"},
"down": {"uv": [16, 11, 11, 16], "texture": "#5"}
}
} }
], ],
"display": { "groups": [
"thirdperson_righthand": {
"rotation": [75, -149, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, -149, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, -55, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, -55, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 1, 1.25],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, 45, 0],
"translation": [2.5, -0.5, 0],
"scale": [0.625, 0.625, 0.625]
},
"fixed": {
"rotation": [0, 180, 0],
"translation": [0, 1.75, -4.5],
"scale": [0.5, 0.5, 0.5]
}
},
"groups": [0, 1, 2, 3, 4,
{ {
"name": "bottom", "name": "bottom",
"origin": [8, 8, 8], "origin": [8, 8, 8],
"children": [5, 6, 7, 8, 9] "color": 0,
} "children": [0, 1, 2, 3, 4]
},
5
] ]
} }

View file

@ -11,8 +11,9 @@
"elements": [ "elements": [
{ {
"name": "Gear5", "name": "Gear5",
"from": [6.5, 6.5, -1], "from": [6.5, 6, -1],
"to": [9.5, 12.5, 17], "to": [9.5, 12, 17],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]},
"faces": { "faces": {
"north": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "north": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"east": {"uv": [0, 10, 9, 13], "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "texture": "#5"},
@ -24,9 +25,9 @@
}, },
{ {
"name": "Gear6", "name": "Gear6",
"from": [6.5, 6.5, -1], "from": [6.5, 6, -1],
"to": [9.5, 12.5, 17], "to": [9.5, 12, 17],
"rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, "rotation": {"angle": 45, "axis": "y", "origin": [8, 7.5, 8]},
"faces": { "faces": {
"north": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "north": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"east": {"uv": [0, 10, 9, 13], "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "texture": "#5"},
@ -38,9 +39,9 @@
}, },
{ {
"name": "Gear7", "name": "Gear7",
"from": [-1, 6.5, 6.5], "from": [-1, 6, 6.5],
"to": [17, 12.5, 9.5], "to": [17, 12, 9.5],
"rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, "rotation": {"angle": 45, "axis": "y", "origin": [8, 7.5, 8]},
"faces": { "faces": {
"north": {"uv": [0, 10, 9, 13], "texture": "#5"}, "north": {"uv": [0, 10, 9, 13], "texture": "#5"},
"east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
@ -52,8 +53,9 @@
}, },
{ {
"name": "Gear7", "name": "Gear7",
"from": [-1, 6.5, 6.5], "from": [-1, 6, 6.5],
"to": [17, 12.5, 9.5], "to": [17, 12, 9.5],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]},
"faces": { "faces": {
"north": {"uv": [0, 10, 9, 13], "texture": "#5"}, "north": {"uv": [0, 10, 9, 13], "texture": "#5"},
"east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
@ -65,9 +67,9 @@
}, },
{ {
"name": "GearCaseInner", "name": "GearCaseInner",
"from": [2, 7, 2], "from": [2, 6.5, 2],
"to": [14, 12, 14], "to": [14, 11.5, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": { "faces": {
"north": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, "north": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
"east": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, "east": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
@ -77,19 +79,6 @@
"down": {"uv": [0, 0, 6, 6], "texture": "#5"} "down": {"uv": [0, 0, 6, 6], "texture": "#5"}
} }
}, },
{
"name": "GearCaseOuter",
"from": [4, 6, 4],
"to": [12, 13, 12],
"faces": {
"north": {"uv": [6, 4.5, 10, 8], "texture": "#5"},
"east": {"uv": [6, 4.5, 10, 8], "texture": "#5"},
"south": {"uv": [6, 4.5, 10, 8], "texture": "#5"},
"west": {"uv": [6, 4.5, 10, 8], "texture": "#5"},
"up": {"uv": [1, 1, 5, 5], "texture": "#5"},
"down": {"uv": [1, 1, 5, 5], "texture": "#5"}
}
},
{ {
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
@ -142,12 +131,14 @@
{ {
"name": "cogwheel", "name": "cogwheel",
"origin": [8, 8, 8], "origin": [8, 8, 8],
"children": [0, 1, 2, 3, 4, 5] "color": 0,
"children": [0, 1, 2, 3, 4]
}, },
{ {
"name": "shaft_half", "name": "shaft_half",
"origin": [8, 8, 8], "origin": [8, 8, 8],
"children": [6] "color": 0,
"children": [5]
} }
] ]
} }

View file

@ -3,16 +3,16 @@
"parent": "block/block", "parent": "block/block",
"textures": { "textures": {
"0": "create:block/gearbox", "0": "create:block/gearbox",
"3": "block/stripped_spruce_log",
"5": "create:block/millstone", "5": "create:block/millstone",
"6": "block/polished_andesite", "8": "create:block/andesite_casing",
"particle": "block/polished_andesite" "particle": "create:block/palettes/stone_types/cap/andesite_cut_cap"
}, },
"elements": [ "elements": [
{ {
"name": "Gear5", "name": "Gear5",
"from": [6.5, 6.5, -1], "from": [6.5, 6, -1],
"to": [9.5, 12.5, 17], "to": [9.5, 12, 17],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]},
"faces": { "faces": {
"north": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "north": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"east": {"uv": [0, 10, 9, 13], "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "texture": "#5"},
@ -24,9 +24,9 @@
}, },
{ {
"name": "Gear6", "name": "Gear6",
"from": [6.5, 6.5, -1], "from": [6.5, 6, -1],
"to": [9.5, 12.5, 17], "to": [9.5, 12, 17],
"rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, "rotation": {"angle": 45, "axis": "y", "origin": [8, 7.5, 8]},
"faces": { "faces": {
"north": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "north": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
"east": {"uv": [0, 10, 9, 13], "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "texture": "#5"},
@ -38,9 +38,9 @@
}, },
{ {
"name": "Gear7", "name": "Gear7",
"from": [-1, 6.5, 6.5], "from": [-1, 6, 6.5],
"to": [17, 12.5, 9.5], "to": [17, 12, 9.5],
"rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, "rotation": {"angle": 45, "axis": "y", "origin": [8, 7.5, 8]},
"faces": { "faces": {
"north": {"uv": [0, 10, 9, 13], "texture": "#5"}, "north": {"uv": [0, 10, 9, 13], "texture": "#5"},
"east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
@ -52,8 +52,9 @@
}, },
{ {
"name": "Gear7", "name": "Gear7",
"from": [-1, 6.5, 6.5], "from": [-1, 6, 6.5],
"to": [17, 12.5, 9.5], "to": [17, 12, 9.5],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]},
"faces": { "faces": {
"north": {"uv": [0, 10, 9, 13], "texture": "#5"}, "north": {"uv": [0, 10, 9, 13], "texture": "#5"},
"east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"},
@ -65,8 +66,9 @@
}, },
{ {
"name": "GearCaseInner", "name": "GearCaseInner",
"from": [2, 6.6, 2], "from": [2, 6.1, 2],
"to": [14, 11.6, 14], "to": [14, 11.1, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]},
"faces": { "faces": {
"north": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, "north": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
"east": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, "east": {"uv": [0, 6, 6, 8.5], "texture": "#5"},
@ -78,8 +80,9 @@
}, },
{ {
"name": "GearCaseOuter", "name": "GearCaseOuter",
"from": [4, 6, 4], "from": [4, 5.5, 4],
"to": [12, 13, 12], "to": [12, 12.5, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]},
"faces": { "faces": {
"north": {"uv": [1, 1.5, 5, 5], "texture": "#5"}, "north": {"uv": [1, 1.5, 5, 5], "texture": "#5"},
"east": {"uv": [1, 1.5, 5, 5], "texture": "#5"}, "east": {"uv": [1, 1.5, 5, 5], "texture": "#5"},
@ -87,13 +90,6 @@
"west": {"uv": [1, 1.5, 5, 5], "texture": "#5"} "west": {"uv": [1, 1.5, 5, 5], "texture": "#5"}
} }
}, },
{
"from": [5, 13, 5],
"to": [11, 15, 11],
"faces": {
"up": {"uv": [6, 0, 9, 3], "rotation": 90, "texture": "#5"}
}
},
{ {
"name": "bottom", "name": "bottom",
"from": [0, 0, 0], "from": [0, 0, 0],
@ -103,7 +99,7 @@
"east": {"uv": [7, 13, 8, 16], "texture": "#5"}, "east": {"uv": [7, 13, 8, 16], "texture": "#5"},
"south": {"uv": [0, 13, 8, 16], "texture": "#5"}, "south": {"uv": [0, 13, 8, 16], "texture": "#5"},
"west": {"uv": [0, 13, 1, 16], "texture": "#5"}, "west": {"uv": [0, 13, 1, 16], "texture": "#5"},
"up": {"uv": [0.5, 8.5, 8.5, 9.5], "texture": "#5"}, "up": {"uv": [0, 0, 16, 2], "texture": "#8"},
"down": {"uv": [0, 14, 16, 16], "texture": "#0"} "down": {"uv": [0, 14, 16, 16], "texture": "#0"}
} }
}, },
@ -116,7 +112,7 @@
"east": {"uv": [8, 13, 7, 16], "texture": "#5"}, "east": {"uv": [8, 13, 7, 16], "texture": "#5"},
"south": {"uv": [8, 13, 0, 16], "texture": "#5"}, "south": {"uv": [8, 13, 0, 16], "texture": "#5"},
"west": {"uv": [1, 13, 0, 16], "texture": "#5"}, "west": {"uv": [1, 13, 0, 16], "texture": "#5"},
"up": {"uv": [0.5, 9.5, 8.5, 8.5], "texture": "#5"}, "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#8"},
"down": {"uv": [0, 16, 16, 14], "texture": "#0"} "down": {"uv": [0, 16, 16, 14], "texture": "#0"}
} }
}, },
@ -126,7 +122,7 @@
"faces": { "faces": {
"east": {"uv": [1, 13, 7, 16], "texture": "#5"}, "east": {"uv": [1, 13, 7, 16], "texture": "#5"},
"west": {"uv": [1, 13, 7, 16], "texture": "#5"}, "west": {"uv": [1, 13, 7, 16], "texture": "#5"},
"up": {"uv": [1.5, 8.5, 7.5, 9.5], "rotation": 270, "texture": "#5"}, "up": {"uv": [0, 14, 2, 2], "texture": "#8"},
"down": {"uv": [0, 2, 2, 14], "texture": "#0"} "down": {"uv": [0, 2, 2, 14], "texture": "#0"}
} }
}, },
@ -136,7 +132,7 @@
"faces": { "faces": {
"east": {"uv": [7, 13, 1, 16], "texture": "#5"}, "east": {"uv": [7, 13, 1, 16], "texture": "#5"},
"west": {"uv": [7, 13, 1, 16], "texture": "#5"}, "west": {"uv": [7, 13, 1, 16], "texture": "#5"},
"up": {"uv": [1.5, 9.5, 7.5, 8.5], "rotation": 270, "texture": "#5"}, "up": {"uv": [0, 14, 2, 2], "rotation": 180, "texture": "#8"},
"down": {"uv": [2, 2, 0, 14], "texture": "#0"} "down": {"uv": [2, 2, 0, 14], "texture": "#0"}
} }
}, },
@ -144,56 +140,20 @@
"from": [2, 1, 2], "from": [2, 1, 2],
"to": [14, 6, 14], "to": [14, 6, 14],
"faces": { "faces": {
"up": {"uv": [2, 2, 14, 14], "rotation": 270, "texture": "#6"}, "up": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#5"},
"down": {"uv": [2, 2, 14, 14], "texture": "#0"} "down": {"uv": [2, 2, 14, 14], "texture": "#0"}
} }
}, },
{ {
"from": [11, 13, 3], "from": [3, 12, 3],
"to": [13, 16, 13], "to": [13, 16, 13],
"faces": { "faces": {
"north": {"uv": [0, 7, 3, 9], "rotation": 90, "texture": "#3"}, "north": {"uv": [11, 9, 16, 11], "texture": "#5"},
"east": {"uv": [0, 10, 3, 0], "rotation": 90, "texture": "#3"}, "east": {"uv": [11, 9, 16, 11], "texture": "#5"},
"south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#3"}, "south": {"uv": [11, 9, 16, 11], "texture": "#5"},
"west": {"uv": [10, 0, 0, 3], "texture": "#3"}, "west": {"uv": [11, 9, 16, 11], "texture": "#5"},
"up": {"uv": [5, 2, 3, 12], "texture": "#3"}, "up": {"uv": [16, 11, 11, 16], "texture": "#5"},
"down": {"uv": [2, 0, 0, 10], "texture": "#3"} "down": {"uv": [16, 11, 11, 16], "texture": "#5"}
}
},
{
"from": [5, 13, 11],
"to": [11, 16, 13],
"faces": {
"north": {"uv": [0, 0, 6, 3], "texture": "#3"},
"east": {"uv": [0, 0, 2, 3], "texture": "#3"},
"south": {"uv": [0, 3, 3, 9], "rotation": 90, "texture": "#3"},
"west": {"uv": [0, 0, 2, 3], "texture": "#3"},
"up": {"uv": [10, 4, 12, 10], "rotation": 90, "texture": "#3"},
"down": {"uv": [0, 0, 6, 2], "texture": "#3"}
}
},
{
"from": [5, 13, 3],
"to": [11, 16, 5],
"faces": {
"north": {"uv": [0, 9, 3, 3], "rotation": 90, "texture": "#3"},
"east": {"uv": [2, 0, 0, 3], "texture": "#3"},
"south": {"uv": [6, 0, 0, 3], "texture": "#3"},
"west": {"uv": [2, 0, 0, 3], "texture": "#3"},
"up": {"uv": [7, 3, 5, 9], "rotation": 270, "texture": "#3"},
"down": {"uv": [0, 2, 6, 0], "texture": "#3"}
}
},
{
"from": [3, 13, 3],
"to": [5, 16, 13],
"faces": {
"north": {"uv": [0, 3, 3, 5], "rotation": 90, "texture": "#3"},
"east": {"uv": [0, 0, 10, 3], "texture": "#3"},
"south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#3"},
"west": {"uv": [0, 0, 3, 10], "rotation": 90, "texture": "#3"},
"up": {"uv": [5, 3, 7, 13], "texture": "#3"},
"down": {"uv": [0, 0, 2, 10], "texture": "#3"}
} }
} }
], ],
@ -201,11 +161,15 @@
{ {
"name": "cogwheel", "name": "cogwheel",
"origin": [8, 8, 8], "origin": [8, 8, 8],
"color": 0,
"children": [0, 1, 2, 3, 4, 5] "children": [0, 1, 2, 3, 4, 5]
}, 6, },
{ {
"name": "bottom", "name": "bottom",
"origin": [8, 8, 8], "origin": [8, 8, 8],
"children": [7, 8, 9, 10, 11] "color": 0,
}, 12, 13, 14, 15] "children": [6, 7, 8, 9, 10]
},
11
]
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 317 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 317 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 514 B

After

Width:  |  Height:  |  Size: 704 B