From 7cabcfca3c8f8c7b045e19ed288bc379dc6b8faf Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 30 Apr 2023 18:06:55 +0200 Subject: [PATCH] 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 --- src/generated/resources/.cache/cache | 2 +- .../models/block/industrial_iron_block.json | 5 +- .../java/com/simibubi/create/AllBlocks.java | 4 +- .../java/com/simibubi/create/AllShapes.java | 4 +- .../components/actors/RollerRenderer.java | 6 +- .../fluids/actors/FluidDrainingBehaviour.java | 32 ++--- .../belts/tunnel/BrassTunnelBlockEntity.java | 31 +++-- .../belts/tunnel/BrassTunnelCTBehaviour.java | 20 ++- .../belts/tunnel/BrassTunnelModeSlot.java | 18 +++ .../block/diodes/BrassDiodeScrollSlot.java | 5 + .../block/display/AllDisplayBehaviours.java | 5 + .../display/source/BoilerDisplaySource.java | 6 +- .../foundation/block/connected/CTModel.java | 2 +- .../connected/ConnectedTextureBehaviour.java | 10 +- .../blockEntity/behaviour/ValueBox.java | 23 ++-- .../behaviour/ValueBoxTransform.java | 4 + .../block/chute/block_diagonal_encased.json | 3 +- .../block/contraption_controls/block.json | 11 +- .../models/block/mechanical_mixer/item.json | 4 +- .../create/models/block/millstone/block.json | 124 ++++-------------- .../create/models/block/millstone/inner.json | 47 +++---- .../create/models/block/millstone/item.json | 114 ++++++---------- .../block/diodes/pulse_extender/idle.png | Bin 2007 -> 312 bytes .../block/diodes/pulse_extender/item.png | Bin 2047 -> 312 bytes .../block/diodes/pulse_extender/powered.png | Bin 2014 -> 321 bytes .../pulse_extender/powered_powering.png | Bin 2030 -> 312 bytes .../block/diodes/pulse_extender/powering.png | Bin 2028 -> 322 bytes .../block/diodes/pulse_repeater/idle.png | Bin 2007 -> 317 bytes .../block/diodes/pulse_repeater/item.png | Bin 2061 -> 317 bytes .../block/diodes/pulse_repeater/powered.png | Bin 2016 -> 324 bytes .../pulse_repeater/powered_powering.png | Bin 2013 -> 316 bytes .../block/diodes/pulse_repeater/powering.png | Bin 2027 -> 325 bytes .../create/textures/block/millstone.png | Bin 514 -> 704 bytes 33 files changed, 203 insertions(+), 277 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelModeSlot.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 09d057eca..9242273a8 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -1129,7 +1129,7 @@ d13df8a5920c5778d98081fb0e97f045e2fd46a2 assets/create/models/block/horizontal_f a5938ddd48109f067a19a90a0f9abab655c18821 assets/create/models/block/horizontal_framed_glass_pane_post.json 41645919ece236df5804a5a73ef682720194de34 assets/create/models/block/horizontal_framed_glass_pane_side.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 65da656d412d973865f50ab7f02e278fe5398bea assets/create/models/block/jungle_window_pane_noside.json 9f4144df2e6b35c1fad04e594be5adb3b107bdb8 assets/create/models/block/jungle_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/models/block/industrial_iron_block.json b/src/generated/resources/assets/create/models/block/industrial_iron_block.json index 555454819..6b62aa6ff 100644 --- a/src/generated/resources/assets/create/models/block/industrial_iron_block.json +++ b/src/generated/resources/assets/create/models/block/industrial_iron_block.json @@ -1,6 +1,7 @@ { - "parent": "minecraft:block/cube_all", + "parent": "minecraft:block/cube_column", "textures": { - "all": "create:block/industrial_iron_block" + "side": "create:block/industrial_iron_block", + "end": "create:block/industrial_iron_block_top" } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 16da50350..545277640 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -2238,7 +2238,9 @@ public class AllBlocks { .properties(p -> p.sound(SoundType.NETHERITE_BLOCK)) .properties(p -> p.requiresCorrectToolForDrops()) .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) .lang("Block of Industrial Iron") .recipe((c, p) -> p.stonecutting(DataIngredient.tag(Tags.Items.INGOTS_IRON), c::get, 2)) diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index eccd213e5..0df89e703 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -253,8 +253,8 @@ public class AllShapes { .build(), SPOUT = shape(1, 2, 1, 15, 14, 15).add(2, 0, 2, 14, 16, 14) .build(), - MILLSTONE = shape(0, 0, 0, 16, 6, 16).add(2, 6, 2, 14, 13, 14) - .add(3, 13, 3, 13, 16, 13) + MILLSTONE = shape(0, 0, 0, 16, 6, 16).add(2, 6, 2, 14, 12, 14) + .add(3, 12, 3, 13, 16, 13) .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) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerRenderer.java index a2e56d578..3d051214c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/RollerRenderer.java @@ -64,9 +64,9 @@ public class RollerRenderer extends SmartBlockEntityRenderer if (context.contraption.stalled) speed = 0; - superBuffer.translate(Vec3.atLowerCornerOf(facing.getNormal()) - .scale(17 / 16f)) - .transform(matrices.getModel()); + superBuffer.transform(matrices.getModel()) + .translate(Vec3.atLowerCornerOf(facing.getNormal()) + .scale(17 / 16f)); HarvesterRenderer.transform(context.world, facing, superBuffer, speed, Vec3.ZERO); PoseStack viewProjection = matrices.getViewProjection(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java index e69476af3..9de3aae43 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java @@ -83,10 +83,21 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { if (validationFrontier.isEmpty() && !queue.isEmpty() && !simulate && revalidateIn == 0) 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()) { // Dont dequeue here, so we can decide not to dequeue a valid entry when // simulating - BlockPos currentPos = queue.first().pos(); + BlockPos currentPos = queue.first() + .pos(); + BlockState blockState = world.getBlockState(currentPos); BlockState emptied = blockState; Fluid fluid = Fluids.EMPTY; @@ -137,12 +148,6 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { playEffect(world, currentPos, fluid, true); blockEntity.award(AllAdvancements.HOSE_PULLEY); - if (infinite) { - if (FluidHelper.isLava(fluid)) - blockEntity.award(AllAdvancements.HOSE_PULLEY_LAVA); - return true; - } - if (!blockEntity.isVirtual()) world.setBlock(currentPos, emptied, 2 | 16); affectedArea = BBHelper.encapsulate(affectedArea, currentPos); @@ -273,20 +278,11 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { visited.clear(); } - Level world = getWorld(); int maxBlocks = maxBlocks(); if (visited.size() > maxBlocks && canDrainInfinitely(fluid) && !queue.isEmpty()) { infinite = true; - // Find first block with valid fluid - while (true) { - BlockPos first = queue.first().pos(); - if (canPullFluidsFrom(world.getBlockState(first), first) != FluidBlockType.SOURCE) { - queue.dequeue(); - continue; - } - break; - } - BlockPos firstValid = queue.first().pos(); + BlockPos firstValid = queue.first() + .pos(); frontier.clear(); visited.clear(); queue.clear(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelBlockEntity.java index 819ded765..4795d42a4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelBlockEntity.java @@ -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.FunnelBlock; 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.filtering.FilteringBehaviour; import com.simibubi.create.foundation.blockEntity.behaviour.filtering.SidedFilteringBehaviour; @@ -66,7 +65,7 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa ItemStack stackToDistribute; Direction stackEnteredFrom; - + float distributionProgress; int distributionDistanceLeft; int distributionDistanceRight; @@ -98,8 +97,9 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); behaviours.add(selectionMode = new ScrollOptionBehaviour<>(SelectionMode.class, - Lang.translateDirect("logistics.when_multiple_outputs_available"), this, - new CenteredSideValueBoxTransform((state, d) -> d == Direction.UP))); + Lang.translateDirect("logistics.when_multiple_outputs_available"), this, new BrassTunnelModeSlot())); + + selectionMode.onlyActiveWhen(this::hasDistributionBehaviour); // Propagate settings across connected tunnels selectionMode.withCallback(setting -> { @@ -159,7 +159,8 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa continue; distributionTargets.get(!tunnel.flapFilterEmpty(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) distributionDistanceLeft = Math.max(distributionDistanceLeft, -distance); else @@ -527,7 +528,7 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa continue; if (!tunnelBE.sides.contains(direction)) continue; - + BlockPos offset = tunnelBE.worldPosition.below() .relative(direction); @@ -578,11 +579,11 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa compound.putBoolean("SyncedOutput", syncedOutputActive); compound.putBoolean("ConnectedLeft", connectedLeft); compound.putBoolean("ConnectedRight", connectedRight); - + compound.put("StackToDistribute", stackToDistribute.serializeNBT()); if (stackEnteredFrom != null) NBTHelper.writeEnum(compound, "StackEnteredFrom", stackEnteredFrom); - + compound.putFloat("DistributionProgress", distributionProgress); compound.putInt("PreviousIndex", previousOutputIndex); compound.putInt("DistanceLeft", distributionDistanceLeft); @@ -610,7 +611,7 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa syncedOutputActive = compound.getBoolean("SyncedOutput"); connectedLeft = compound.getBoolean("ConnectedLeft"); connectedRight = compound.getBoolean("ConnectedRight"); - + stackToDistribute = ItemStack.of(compound.getCompound("StackToDistribute")); stackEnteredFrom = compound.contains("StackEnteredFrom") ? NBTHelper.readEnum(compound, "StackEnteredFrom", Direction.class) @@ -718,7 +719,7 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa super.invalidate(); tunnelCapability.invalidate(); } - + @Override public void destroy() { super.destroy(); @@ -781,20 +782,22 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa List allStacks = grabAllStacksOfGroup(true); if (allStacks.isEmpty()) return false; - + tooltip.add(componentSpacing.plainCopy() .append(Lang.translateDirect("tooltip.brass_tunnel.contains")) .withStyle(ChatFormatting.WHITE)); for (ItemStack item : allStacks) { tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.brass_tunnel.contains_entry", Components.translatable(item.getDescriptionId()) - .getString(), item.getCount())) + .append(Lang.translateDirect("tooltip.brass_tunnel.contains_entry", + Components.translatable(item.getDescriptionId()) + .getString(), + item.getCount())) .withStyle(ChatFormatting.GRAY)); } tooltip.add(componentSpacing.plainCopy() .append(Lang.translateDirect("tooltip.brass_tunnel.retrieve")) .withStyle(ChatFormatting.DARK_GRAY)); - + return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelCTBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelCTBehaviour.java index e6bbc3711..9b34ce129 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelCTBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelCTBehaviour.java @@ -4,39 +4,45 @@ import org.jetbrains.annotations.Nullable; import com.simibubi.create.AllSpriteShifts; 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 net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; 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 public CTSpriteShiftEntry getShift(BlockState state, Direction direction, @Nullable TextureAtlasSprite sprite) { return direction == Direction.UP ? AllSpriteShifts.BRASS_TUNNEL_TOP : null; } - + @Override protected boolean reverseUVs(BlockState state, Direction face) { return true; } @Override - public boolean connectsTo(BlockState state, BlockState other, BlockAndTintGetter reader, BlockPos pos, BlockPos otherPos, - Direction face) { + public boolean connectsTo(BlockState state, BlockState other, BlockAndTintGetter reader, BlockPos pos, + BlockPos otherPos, Direction face) { int yDiff = otherPos.getY() - pos.getY(); int zDiff = otherPos.getZ() - pos.getZ(); if (yDiff != 0) return false; - BlockEntity be = reader.getBlockEntity(pos); - if (!(be instanceof BrassTunnelBlockEntity)) + if (!(reader.getBlockEntity(pos) instanceof BrassTunnelBlockEntity tunnelBE)) return false; - BrassTunnelBlockEntity tunnelBE = (BrassTunnelBlockEntity) be; boolean leftSide = zDiff > 0; return tunnelBE.isConnected(leftSide); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelModeSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelModeSlot.java new file mode 100644 index 000000000..df78e2e6e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BrassTunnelModeSlot.java @@ -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; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java index c7ff8f1bc..c68cbb2ce 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/diodes/BrassDiodeScrollSlot.java @@ -25,4 +25,9 @@ public class BrassDiodeScrollSlot extends ValueBoxTransform { .rotateX(90); } + @Override + public int getOverrideColor() { + return 0x592424; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/AllDisplayBehaviours.java b/src/main/java/com/simibubi/create/content/logistics/block/display/AllDisplayBehaviours.java index 395df3671..9ac06e8fe 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/AllDisplayBehaviours.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/AllDisplayBehaviours.java @@ -28,6 +28,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; 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.minecraftforge.registries.ForgeRegistries; @@ -222,6 +223,10 @@ public class AllDisplayBehaviours { DisplayTarget targetOfBlock = targetOf(blockState); 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) return targetOfBlock; return targetOfBlockEntity; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/display/source/BoilerDisplaySource.java b/src/main/java/com/simibubi/create/content/logistics/block/display/source/BoilerDisplaySource.java index 3739c7491..cd5587d49 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/display/source/BoilerDisplaySource.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/display/source/BoilerDisplaySource.java @@ -134,9 +134,9 @@ public class BoilerDisplaySource extends DisplaySource { } return Stream.of(List.of(Lang.translateDirect(label, boiler.getHeatLevelTextComponent())), - List.of(size, boiler.getSizeComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.BLACK)), - List.of(water, boiler.getWaterComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.BLACK)), - List.of(heat, boiler.getHeatComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.BLACK))); + List.of(size, boiler.getSizeComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.RESET)), + List.of(water, boiler.getWaterComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.RESET)), + List.of(heat, boiler.getHeatComponent(!forFlapDisplay, forFlapDisplay, ChatFormatting.RESET))); } private int labelWidth() { diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java index 5ebc760b0..11465af71 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/CTModel.java @@ -50,7 +50,7 @@ public class CTModel extends BakedModelWrapperWithData { && !(actualState.getBlock()instanceof CopycatBlock ufb && !ufb.canFaceBeOccluded(actualState, face))) continue; - CTType dataType = behaviour.getDataType(state, face); + CTType dataType = behaviour.getDataType(world, pos, state, face); if (dataType == null) continue; CTContext context = behaviour.buildContext(world, pos, state, face, dataType.getContextRequirement()); diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java b/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java index 2aebf798a..19ab70b89 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java @@ -21,7 +21,7 @@ public abstract class ConnectedTextureBehaviour { // TODO: allow more than one data type per state/face? @Nullable - public abstract CTType getDataType(BlockState state, Direction direction); + public abstract CTType getDataType(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction direction); public boolean buildContextForOccludedDirections() { return false; @@ -32,7 +32,7 @@ public abstract class ConnectedTextureBehaviour { BlockPos blockingPos = otherPos.relative(face); BlockState blockState = reader.getBlockState(pos); - if (blockState.getBlock()instanceof CopycatBlock ufb + if (blockState.getBlock() instanceof CopycatBlock ufb && ufb.isUnblockableConnectivitySide(reader, blockState, face, pos, otherPos)) return false; @@ -60,7 +60,7 @@ public abstract class ConnectedTextureBehaviour { .relative(vertical, sv); BlockState blockState = reader.getBlockState(pos); - if (blockState.getBlock()instanceof CopycatBlock ufb + if (blockState.getBlock() instanceof CopycatBlock ufb && ufb.isIgnoredConnectivitySide(reader, blockState, face, pos, p)) return false; @@ -73,7 +73,7 @@ public abstract class ConnectedTextureBehaviour { BlockPos 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); return connectiveMaterial == null ? blockState : connectiveMaterial; } @@ -274,7 +274,7 @@ public abstract class ConnectedTextureBehaviour { @Override @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); if (shift == null) { return null; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java index 5f127af71..662c3ea99 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBox.java @@ -30,8 +30,8 @@ public class ValueBox extends ChasingAABBOutline { protected Component scrollTooltip = Components.immutableEmpty(); protected Vec3 labelOffset = Vec3.ZERO; - protected int passiveColor; - protected int highlightColor; + public int overrideColor = -1; + public boolean isPassive; protected BlockPos pos; @@ -65,6 +65,11 @@ public class ValueBox extends ChasingAABBOutline { this.isPassive = passive; return this; } + + public ValueBox withColor(int color) { + this.overrideColor = color; + return this; + } @Override public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { @@ -183,7 +188,7 @@ public class ValueBox extends ChasingAABBOutline { Font font = Minecraft.getInstance().font; float scale = 3; ms.scale(scale, scale, 1); - ms.translate(-4, -4, 5); + ms.translate(-4, -3.75, 5); int stringWidth = font.width(text); float numberScale = (float) font.lineHeight / stringWidth; @@ -195,7 +200,8 @@ public class ValueBox extends ChasingAABBOutline { ms.scale(numberScale, numberScale, numberScale); 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; ms.scale(scale, scale, scale); 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, - int shadowColor) { + protected void renderHoveringText(PoseStack ms, MultiBufferSource buffer, Component text, int color) { ms.pushPose(); drawString(ms, buffer, text, 0, 0, color); - ms.translate(0, 0, -.25); - drawString(ms, buffer, text, 1, 1, shadowColor); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java index e3495d993..e449b0fcc 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxTransform.java @@ -43,6 +43,10 @@ public abstract class ValueBoxTransform { public boolean shouldRender(BlockState state) { return state.getMaterial() != Material.AIR && getLocalOffset(state) != null; } + + public int getOverrideColor() { + return -1; + } protected Vec3 rotateHorizontally(BlockState state, Vec3 vec) { float yRot = 0; diff --git a/src/main/resources/assets/create/models/block/chute/block_diagonal_encased.json b/src/main/resources/assets/create/models/block/chute/block_diagonal_encased.json index 171bec4b5..ce1871c01 100644 --- a/src/main/resources/assets/create/models/block/chute/block_diagonal_encased.json +++ b/src/main/resources/assets/create/models/block/chute/block_diagonal_encased.json @@ -4,6 +4,7 @@ "textures": { "3": "create:block/chute", "4": "create:block/chute_large", + "5": "create:block/industrial_iron_block_top", "particle": "create:block/industrial_iron_block" }, "elements": [ @@ -15,7 +16,7 @@ "east": {"uv": [0, 0, 16, 16], "texture": "#particle"}, "south": {"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"} } }, diff --git a/src/main/resources/assets/create/models/block/contraption_controls/block.json b/src/main/resources/assets/create/models/block/contraption_controls/block.json index 82d694c11..c5a41c6dc 100644 --- a/src/main/resources/assets/create/models/block/contraption_controls/block.json +++ b/src/main/resources/assets/create/models/block/contraption_controls/block.json @@ -22,7 +22,7 @@ "from": [2, 5, 14], "to": [14, 14, 16], "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"}, "up": {"uv": [1, 0, 7, 1], "rotation": 180, "texture": "#4"} } @@ -42,7 +42,8 @@ }, { "from": [2, 5, 7], - "to": [14, 10, 15], + "to": [14, 10.1, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0.1, 0]}, "faces": { "north": {"uv": [1, 16, 7, 13.5], "rotation": 180, "texture": "#4"}, "down": {"uv": [1, 16, 7, 12], "rotation": 180, "texture": "#4"} @@ -58,9 +59,9 @@ } }, { - "from": [2, 9, 7], - "to": [14, 10, 15], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 10, 7]}, + "from": [2, 9.1, 7], + "to": [14, 10.1, 15], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 10.1, 7]}, "faces": { "up": {"uv": [1, 9.5, 7, 13.5], "rotation": 180, "texture": "#4"} } diff --git a/src/main/resources/assets/create/models/block/mechanical_mixer/item.json b/src/main/resources/assets/create/models/block/mechanical_mixer/item.json index 88a8a8ef7..e51e594a9 100644 --- a/src/main/resources/assets/create/models/block/mechanical_mixer/item.json +++ b/src/main/resources/assets/create/models/block/mechanical_mixer/item.json @@ -314,8 +314,8 @@ }, "gui": { "rotation": [30, 225, 0], - "translation": [0, -1.5, 0], - "scale": [0.4, 0.4, 0.4] + "translation": [0, -2.25, 0], + "scale": [0.45, 0.45, 0.45] }, "fixed": { "translation": [0, -3, 0], diff --git a/src/main/resources/assets/create/models/block/millstone/block.json b/src/main/resources/assets/create/models/block/millstone/block.json index 68afc7d11..073d639d5 100644 --- a/src/main/resources/assets/create/models/block/millstone/block.json +++ b/src/main/resources/assets/create/models/block/millstone/block.json @@ -4,66 +4,10 @@ "textures": { "0": "create:block/gearbox", "5": "create:block/millstone", - "6": "block/polished_andesite", - "13": "block/stripped_spruce_log", - "particle": "block/polished_andesite" + "8": "create:block/andesite_casing", + "particle": "create:block/palettes/stone_types/cap/andesite_cut_cap" }, "elements": [ - { - "from": [3, 13, 3], - "to": [5, 16, 13], - "faces": { - "north": {"uv": [0, 3, 3, 5], "rotation": 90, "texture": "#13"}, - "east": {"uv": [0, 0, 10, 3], "texture": "#13"}, - "south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#13"}, - "west": {"uv": [0, 0, 3, 10], "rotation": 90, "texture": "#13"}, - "up": {"uv": [5, 3, 7, 13], "texture": "#13"}, - "down": {"uv": [0, 0, 2, 10], "texture": "#13"} - } - }, - { - "from": [11, 13, 3], - "to": [13, 16, 13], - "faces": { - "north": {"uv": [0, 7, 3, 9], "rotation": 90, "texture": "#13"}, - "east": {"uv": [0, 10, 3, 0], "rotation": 90, "texture": "#13"}, - "south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#13"}, - "west": {"uv": [10, 0, 0, 3], "texture": "#13"}, - "up": {"uv": [5, 2, 3, 12], "texture": "#13"}, - "down": {"uv": [2, 0, 0, 10], "texture": "#13"} - } - }, - { - "from": [5, 13, 11], - "to": [11, 16, 13], - "faces": { - "north": {"uv": [0, 0, 6, 3], "texture": "#13"}, - "east": {"uv": [0, 0, 2, 3], "texture": "#13"}, - "south": {"uv": [0, 3, 3, 9], "rotation": 90, "texture": "#13"}, - "west": {"uv": [0, 0, 2, 3], "texture": "#13"}, - "up": {"uv": [10, 4, 12, 10], "rotation": 90, "texture": "#13"}, - "down": {"uv": [0, 0, 6, 2], "texture": "#13"} - } - }, - { - "from": [5, 13, 5], - "to": [11, 15, 11], - "faces": { - "up": {"uv": [6, 0, 9, 3], "rotation": 90, "texture": "#5"} - } - }, - { - "from": [5, 13, 3], - "to": [11, 16, 5], - "faces": { - "north": {"uv": [0, 9, 3, 3], "rotation": 90, "texture": "#13"}, - "east": {"uv": [2, 0, 0, 3], "texture": "#13"}, - "south": {"uv": [6, 0, 0, 3], "texture": "#13"}, - "west": {"uv": [2, 0, 0, 3], "texture": "#13"}, - "up": {"uv": [7, 3, 5, 9], "rotation": 270, "texture": "#13"}, - "down": {"uv": [0, 2, 6, 0], "texture": "#13"} - } - }, { "name": "bottom", "from": [0, 0, 0], @@ -73,7 +17,7 @@ "east": {"uv": [7, 13, 8, 16], "texture": "#5"}, "south": {"uv": [0, 13, 8, 16], "texture": "#5"}, "west": {"uv": [0, 13, 1, 16], "texture": "#5"}, - "up": {"uv": [0.5, 8.5, 8.5, 9.5], "texture": "#5"}, + "up": {"uv": [0, 0, 16, 2], "texture": "#8"}, "down": {"uv": [0, 14, 16, 16], "texture": "#0"} } }, @@ -86,7 +30,7 @@ "east": {"uv": [8, 13, 7, 16], "texture": "#5"}, "south": {"uv": [8, 13, 0, 16], "texture": "#5"}, "west": {"uv": [1, 13, 0, 16], "texture": "#5"}, - "up": {"uv": [0.5, 9.5, 8.5, 8.5], "texture": "#5"}, + "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#8"}, "down": {"uv": [0, 16, 16, 14], "texture": "#0"} } }, @@ -96,7 +40,7 @@ "faces": { "east": {"uv": [1, 13, 7, 16], "texture": "#5"}, "west": {"uv": [1, 13, 7, 16], "texture": "#5"}, - "up": {"uv": [1.5, 8.5, 7.5, 9.5], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 14, 2, 2], "texture": "#8"}, "down": {"uv": [0, 2, 2, 14], "texture": "#0"} } }, @@ -106,7 +50,7 @@ "faces": { "east": {"uv": [7, 13, 1, 16], "texture": "#5"}, "west": {"uv": [7, 13, 1, 16], "texture": "#5"}, - "up": {"uv": [1.5, 9.5, 7.5, 8.5], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 14, 2, 2], "rotation": 180, "texture": "#8"}, "down": {"uv": [2, 2, 0, 14], "texture": "#0"} } }, @@ -114,50 +58,30 @@ "from": [2, 1, 2], "to": [14, 6, 14], "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"} } + }, + { + "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": { - "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, + "groups": [ { "name": "bottom", "origin": [8, 8, 8], - "children": [5, 6, 7, 8, 9] - } + "color": 0, + "children": [0, 1, 2, 3, 4] + }, + 5 ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/millstone/inner.json b/src/main/resources/assets/create/models/block/millstone/inner.json index 7ed24f315..65af3b42b 100644 --- a/src/main/resources/assets/create/models/block/millstone/inner.json +++ b/src/main/resources/assets/create/models/block/millstone/inner.json @@ -11,8 +11,9 @@ "elements": [ { "name": "Gear5", - "from": [6.5, 6.5, -1], - "to": [9.5, 12.5, 17], + "from": [6.5, 6, -1], + "to": [9.5, 12, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]}, "faces": { "north": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "texture": "#5"}, @@ -24,9 +25,9 @@ }, { "name": "Gear6", - "from": [6.5, 6.5, -1], - "to": [9.5, 12.5, 17], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [6.5, 6, -1], + "to": [9.5, 12, 17], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 7.5, 8]}, "faces": { "north": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "texture": "#5"}, @@ -38,9 +39,9 @@ }, { "name": "Gear7", - "from": [-1, 6.5, 6.5], - "to": [17, 12.5, 9.5], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [-1, 6, 6.5], + "to": [17, 12, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 7.5, 8]}, "faces": { "north": {"uv": [0, 10, 9, 13], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, @@ -52,8 +53,9 @@ }, { "name": "Gear7", - "from": [-1, 6.5, 6.5], - "to": [17, 12.5, 9.5], + "from": [-1, 6, 6.5], + "to": [17, 12, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]}, "faces": { "north": {"uv": [0, 10, 9, 13], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, @@ -65,9 +67,9 @@ }, { "name": "GearCaseInner", - "from": [2, 7, 2], - "to": [14, 12, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 8.5, 8]}, + "from": [2, 6.5, 2], + "to": [14, 11.5, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]}, "faces": { "north": {"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"} } }, - { - "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", "from": [6, 0, 6], @@ -142,12 +131,14 @@ { "name": "cogwheel", "origin": [8, 8, 8], - "children": [0, 1, 2, 3, 4, 5] + "color": 0, + "children": [0, 1, 2, 3, 4] }, { "name": "shaft_half", "origin": [8, 8, 8], - "children": [6] + "color": 0, + "children": [5] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/millstone/item.json b/src/main/resources/assets/create/models/block/millstone/item.json index 643f75be3..37c07bdd9 100644 --- a/src/main/resources/assets/create/models/block/millstone/item.json +++ b/src/main/resources/assets/create/models/block/millstone/item.json @@ -3,16 +3,16 @@ "parent": "block/block", "textures": { "0": "create:block/gearbox", - "3": "block/stripped_spruce_log", "5": "create:block/millstone", - "6": "block/polished_andesite", - "particle": "block/polished_andesite" + "8": "create:block/andesite_casing", + "particle": "create:block/palettes/stone_types/cap/andesite_cut_cap" }, "elements": [ { "name": "Gear5", - "from": [6.5, 6.5, -1], - "to": [9.5, 12.5, 17], + "from": [6.5, 6, -1], + "to": [9.5, 12, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]}, "faces": { "north": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "texture": "#5"}, @@ -24,9 +24,9 @@ }, { "name": "Gear6", - "from": [6.5, 6.5, -1], - "to": [9.5, 12.5, 17], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [6.5, 6, -1], + "to": [9.5, 12, 17], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 7.5, 8]}, "faces": { "north": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, "east": {"uv": [0, 10, 9, 13], "texture": "#5"}, @@ -38,9 +38,9 @@ }, { "name": "Gear7", - "from": [-1, 6.5, 6.5], - "to": [17, 12.5, 9.5], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [-1, 6, 6.5], + "to": [17, 12, 9.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 7.5, 8]}, "faces": { "north": {"uv": [0, 10, 9, 13], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, @@ -52,8 +52,9 @@ }, { "name": "Gear7", - "from": [-1, 6.5, 6.5], - "to": [17, 12.5, 9.5], + "from": [-1, 6, 6.5], + "to": [17, 12, 9.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]}, "faces": { "north": {"uv": [0, 10, 9, 13], "texture": "#5"}, "east": {"uv": [9, 10, 10.5, 13], "texture": "#5"}, @@ -65,8 +66,9 @@ }, { "name": "GearCaseInner", - "from": [2, 6.6, 2], - "to": [14, 11.6, 14], + "from": [2, 6.1, 2], + "to": [14, 11.1, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]}, "faces": { "north": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, "east": {"uv": [0, 6, 6, 8.5], "texture": "#5"}, @@ -78,8 +80,9 @@ }, { "name": "GearCaseOuter", - "from": [4, 6, 4], - "to": [12, 13, 12], + "from": [4, 5.5, 4], + "to": [12, 12.5, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [0, -0.5, 0]}, "faces": { "north": {"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"} } }, - { - "from": [5, 13, 5], - "to": [11, 15, 11], - "faces": { - "up": {"uv": [6, 0, 9, 3], "rotation": 90, "texture": "#5"} - } - }, { "name": "bottom", "from": [0, 0, 0], @@ -103,7 +99,7 @@ "east": {"uv": [7, 13, 8, 16], "texture": "#5"}, "south": {"uv": [0, 13, 8, 16], "texture": "#5"}, "west": {"uv": [0, 13, 1, 16], "texture": "#5"}, - "up": {"uv": [0.5, 8.5, 8.5, 9.5], "texture": "#5"}, + "up": {"uv": [0, 0, 16, 2], "texture": "#8"}, "down": {"uv": [0, 14, 16, 16], "texture": "#0"} } }, @@ -116,7 +112,7 @@ "east": {"uv": [8, 13, 7, 16], "texture": "#5"}, "south": {"uv": [8, 13, 0, 16], "texture": "#5"}, "west": {"uv": [1, 13, 0, 16], "texture": "#5"}, - "up": {"uv": [0.5, 9.5, 8.5, 8.5], "texture": "#5"}, + "up": {"uv": [0, 0, 16, 2], "rotation": 180, "texture": "#8"}, "down": {"uv": [0, 16, 16, 14], "texture": "#0"} } }, @@ -126,7 +122,7 @@ "faces": { "east": {"uv": [1, 13, 7, 16], "texture": "#5"}, "west": {"uv": [1, 13, 7, 16], "texture": "#5"}, - "up": {"uv": [1.5, 8.5, 7.5, 9.5], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 14, 2, 2], "texture": "#8"}, "down": {"uv": [0, 2, 2, 14], "texture": "#0"} } }, @@ -136,7 +132,7 @@ "faces": { "east": {"uv": [7, 13, 1, 16], "texture": "#5"}, "west": {"uv": [7, 13, 1, 16], "texture": "#5"}, - "up": {"uv": [1.5, 9.5, 7.5, 8.5], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 14, 2, 2], "rotation": 180, "texture": "#8"}, "down": {"uv": [2, 2, 0, 14], "texture": "#0"} } }, @@ -144,56 +140,20 @@ "from": [2, 1, 2], "to": [14, 6, 14], "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"} } }, { - "from": [11, 13, 3], + "from": [3, 12, 3], "to": [13, 16, 13], "faces": { - "north": {"uv": [0, 7, 3, 9], "rotation": 90, "texture": "#3"}, - "east": {"uv": [0, 10, 3, 0], "rotation": 90, "texture": "#3"}, - "south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#3"}, - "west": {"uv": [10, 0, 0, 3], "texture": "#3"}, - "up": {"uv": [5, 2, 3, 12], "texture": "#3"}, - "down": {"uv": [2, 0, 0, 10], "texture": "#3"} - } - }, - { - "from": [5, 13, 11], - "to": [11, 16, 13], - "faces": { - "north": {"uv": [0, 0, 6, 3], "texture": "#3"}, - "east": {"uv": [0, 0, 2, 3], "texture": "#3"}, - "south": {"uv": [0, 3, 3, 9], "rotation": 90, "texture": "#3"}, - "west": {"uv": [0, 0, 2, 3], "texture": "#3"}, - "up": {"uv": [10, 4, 12, 10], "rotation": 90, "texture": "#3"}, - "down": {"uv": [0, 0, 6, 2], "texture": "#3"} - } - }, - { - "from": [5, 13, 3], - "to": [11, 16, 5], - "faces": { - "north": {"uv": [0, 9, 3, 3], "rotation": 90, "texture": "#3"}, - "east": {"uv": [2, 0, 0, 3], "texture": "#3"}, - "south": {"uv": [6, 0, 0, 3], "texture": "#3"}, - "west": {"uv": [2, 0, 0, 3], "texture": "#3"}, - "up": {"uv": [7, 3, 5, 9], "rotation": 270, "texture": "#3"}, - "down": {"uv": [0, 2, 6, 0], "texture": "#3"} - } - }, - { - "from": [3, 13, 3], - "to": [5, 16, 13], - "faces": { - "north": {"uv": [0, 3, 3, 5], "rotation": 90, "texture": "#3"}, - "east": {"uv": [0, 0, 10, 3], "texture": "#3"}, - "south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#3"}, - "west": {"uv": [0, 0, 3, 10], "rotation": 90, "texture": "#3"}, - "up": {"uv": [5, 3, 7, 13], "texture": "#3"}, - "down": {"uv": [0, 0, 2, 10], "texture": "#3"} + "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"} } } ], @@ -201,11 +161,15 @@ { "name": "cogwheel", "origin": [8, 8, 8], + "color": 0, "children": [0, 1, 2, 3, 4, 5] - }, 6, + }, { "name": "bottom", "origin": [8, 8, 8], - "children": [7, 8, 9, 10, 11] - }, 12, 13, 14, 15] + "color": 0, + "children": [6, 7, 8, 9, 10] + }, + 11 + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/diodes/pulse_extender/idle.png b/src/main/resources/assets/create/textures/block/diodes/pulse_extender/idle.png index 531db9e346e95a6177e414b2b3306f90db2a751c..a9d512542182fe358be53f6d8c4a3149ac525dbc 100644 GIT binary patch delta 296 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 delta 2024 zcmV{gSaechcOYsk4kqKrH(m5J1{h$91^B+7+ zY>o3#Lkhv-amgjl=%{_3e%d`o)~)~Rq4Q7X?F6G0w6X`IJAbos#;^6^ZXxK+1o>|p z`Bg`cR3ky(^wJqR{_<1`;&o|*! zn{6d$o2|Cst(1sK>>x+YP^Lkh8rn(~Iy&wg(K1(-HKr0daTO~hZoV`)N|GijES0;6 zI3s-PLhIbL&VQ?$&%O79!w*|j>$EX$<5y5&oSV1r5$pcLoW&UFs2%&L! z^9$hXy&v;JtbjqkU{)BIZP_AvJ(m5M&U;|8+#(Hwd{G1BY#xDkCz}3+$6~$%Q+AKiB91| z*^77H`{1KjpL{k!f(t%`5W|eQ93{HwV~8L!jCe1b9LW@mXYPnN~E1B-P@1e)8 zJ@q``YkxzA8-9clhmJJz&Dvr0$NPVKrjgBt0w{Ey*bln7dzkw*Zw6TZjW_-cb7oTaFEGcZ z%QxQMu-0ZKtc$T7g%eXNh(7I_S+ip?j#n28K7X`z&%eqIAea7m{p z(toY~17qI3Ienl=?4IfBUQsg-Y$JvZQFd^j+hXYln061n1KunV;Z?-LeS1_&H-Ef) zrJ}GE$+W+caW{eR@YU-DNfrUS7w9O>esIax*31s48$*O4Uurw;C2ZMAI>Mpssg8_) zn~A7eCz`BCV4K$<()_l5Fgyeq^b!+9&wqx3aXRA>QAtuZMgYc+I`onD$pF?xx6f9G zlmi)JS{f}ua9$(;+v~9cVO`t>5DetBKbn(x8}w6i^LN$T`D|13I>Mo$wn=5&o}IF> z+dbjE`;3IlT90pxpf0Ainc&zW#?y(O!N}^eK9KqmB6%BLD`F_Qy{99`>vaJ1-G9sB zK~Z+JAWLhPeR3aGG%nKsMjdSiVBA_eL6(%p;otxS!(qM5J=QOV$X30oNNr0qlZV&axraZof_wyp%N027yCFaAFmDavEqS1p zhT}cSQZ6SU*_i5urczz%8R$0)2!G1%!4X%@Gze8@D~~J`(lMAcb$=nDq2GB5I-4!n zLGXo0;9omcZ^utWjr*7mf2#i{?afjDBwr9&haALPcxu=uU#RieVY>Z;@BTH3%MOvy zgW+lW!E($S0PiCl>iieTKj?hr1e0g|K7sEaQ*e#hK2#f0=kcK+ecXBY#D6Pp7AY_K zr;2`;v;tQ6PCqYc^A5ar2nexeYT?AGhCt@Fww-XabQl7boe3A0ZK|hJ7LotM9>mSh zU#&SuRbaJ?ODZ&z5I8-!(jjt7zWWny1!Zhg5*j{Go~Zpsf$E zq10QsVaEM%lPQMMSIM6Q2V8q8`XGN7|A#fcO6vDYjS>ac@3i6c%ku@3U@bB4 zeh%?T^tHpq$MexUefQjR&$%C*P+_qkrNmtk5kEYTh=2S90U$k+R<`2af>oN&$6XCT zLvv?WikabzZs-7%t*n|Qq?A!T3Sj?mzcil*5O=kP=JGxxvn$2%$#DRvK@ibd^~|bS zd`#Tcrry2vE@3w!+AeP=`V&MXlFhxI`f*PP$L8Hid6o4Ds zUSInaAP64#A*WhB`q5IY&friCKngejJemeT7)C%wwK{rtIH+wH|97}(Ua@wdn0D_E z72ukjPn&fQ`F`@JE8t_3vr|3?&{6GC0IORSfPYU1!0e7{t5$5Md~TB?%-*rsql{Iv zC`qS_SxylV{k)Up_VTYx^e0UFtKeXzN75XSwrVR|eRw_7(A;MWgC*a2|KE3N&n<}hemdvL z_T(aW!?O$wOBooxO~1AqXbxwAM`SSr1K)lSX0)hh4ORh)_IbKEhG+!a_H*+cQQ!cw z*Vy0r_OCqFZM!w6Q=Hl%fsNf|zk3~BES61)a1vN)5j`g`DQuE|37>%^0rjg`lE^S zj+~a4d8Wl##8+g$#d=f9`7d`AIx3ZvP1)4`F;&fGJ8m`KC>iK922WQ%mvv4FO#n~d Bc!vN0 delta 2011 zcmV<12PF8x0^Sdh8Gix*005AYXf^-<1(teLSaechcOYT6|)2+0fOc5jF=tV<%>#pznq5Vzf;|60CjItKh?SEa_>ohrD+Jd)IA||ne95q9k26bu}D^=*|xU*tpt}NGD6y?NKtdO|*(qNS&O`@<=?jquh z@X>`Xx#^NuDStw8BakwI8R5tuU-J{eZ{9Jgg^!3}J#Ak>FXo8@O*hK?1{naMv2pX4 zgYWk|<_TBQ%ou444K)P z>@!YhP~=>=NO8rNP_)F7O0Ec>>Z-4yYK=A3+_*_|&9~6B#gjeJnssJ^{_ff{Yp_(E#Z=|K&vs*};hf@YoZ6Eh&jj)1sM1Q5_X zF|(1J>kMd8aD%9|AZU=201gK`#&JZrpp)H zKA_fSC9D@>D+{MjtswhikC|h3EXMIQ1;ICC9e??nTKi>`m!sz68TmbXDQjj@ta}l& zH}WMtyCj%iixpe8jVuq6aMVqO@5oFELu-^0;;X#NH za>{f~;ool8Dk3b$wTjv^t_ezibY?C3RKvaf-KeFvIroLSPp$iFBSOwp!7xmhbku)1 zF@LYw+}@5z>>k_Iz52}DPJ8vyfmr%>Ogl@T-EP1lytw%w-ySNZ<5XU=QgN*n$+UhY z_dpHtea(77iS2PQDJ=++{hNq<8O>BS#p4*gXI-CUcgc0jw)I3?*JWeRmWNqDASQ<2 z7S@7WCzjjX7Qtp67~mh>)>Wl?h}(44M1N_S$6@zfO5_y;0T)t3xtWW@SF{gYTb;nW71S?lj2yH5;v#FIK)*q)~GF6pDPjMf9}E5kxA>S18k8tbZ_n zG6O2_2sj~v%IktIamZd2-K9n}R#Uyzh%_AgCrgI3z2^ufqCT%~nh5K`ZDN@^Zx{oK}zKaK?<}M%MlBZtEv$#b5;jQl!K8n}Y%qr(- z1%S_XR-DEC`(*g6w~5ac;;D50MdiG#G_TkBsgN&3uPfE}JKToGUY1DokbfeNQycOe z@9P1+M&k8yF5ahG{M;~aO+Kc1S(#fGk#fFj;jK1fjI6I@CBd|1=c42)T+s(R4C7FQon0cQGXQv^0DiC{{v}3Z@y?=B>dk}N&D+<|`B3cs z7M{$_ElnT4Kg+s#0B;{Hc`|1QG{tz>$hvuVJX@M8(yJqpl7IAM?(XCHD`Nm$Y5nf? z*Azi;BMHT=*5{8s(;M8lH3mQ_wFg+513-9QO2+gC?szt>?Ro#-@T>cWwNt^gkvD{4 zs43ps>{#UF+s`lzNA_rncbgXg2Bxo+QZF}|p_F0?ZkgWLZu3G@oC)edrBtyW$1bwD zEv1zHlz(u1AXL~`<(V=Yq;L908~@4j7vNJps4i5KxRg==n7ls85IgMh-ZFq`08gK7 t*HK-lT5AHxG+s24-sXjTQqtA7`xjgH-r^5-SStVk002ovPDHLkV1hJ6;OqbZ diff --git a/src/main/resources/assets/create/textures/block/diodes/pulse_extender/powered_powering.png b/src/main/resources/assets/create/textures/block/diodes/pulse_extender/powered_powering.png index 37b62271b0a6b4b36f58aaa6536ff55ed67ac669..94628093deacd7ec9792e2dd6d88bb1b6aa8288b 100644 GIT binary patch delta 296 zcmV+@0oVTS54Zx58Gi!+001a04^sdD00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z001^nOjJdCeS3?Ii@UqKtg5V~007MZ0L9A1o@qzFj#ZgjJ^A_h($dnec~AS?ea@g- z_seYLw_|cgF^&OPUH||932;bRa{vGizW@LZzX3P}QzQTY0Dp@~L_t(2Q$3Fh4g?_x zLqSj+f4KL*>{8v?CJ1R7;Sq6&PWz2XL|AiHmXsvil2|n>gqbKz&B$ve79y+lX-B<1 zwHl4Ntl0=zw>8H##+>f2;V^vF9l_;qV%Oy`{)z2#zKJlpL7(^|jJvjX)LDzef+Q*) u92NwnB*{vrgCV5^6W}i9MFuqnCjJ6%Z3c3($YS#V0000m5IE8d?mS{$P<@3MM?!7rzl3Uh7)!Gb8svCQKR_&AKiaVOl- zW?K>0W~(i@DPRQ}S!oW9v)0KWUc6KU(J!}$x1%DWO9_BDtyI2zlO^f} z#l;-M#FsC9obsHeP6An|#$yQngv4vM3vfVHI_6Q5%vx4;Xv|@mTSLmndszGF8FFiD z!+%O6<}&9KA; z?1gTMSAfDf>cQTsyX5UdvZh`v>@#hr@_%f3tmuHF!}-0k;4q41{m9xPwpsE6`$wbO z*dWzG-xjPJX1cpOL4P=*fNTt!^b$3ni)>q347UBP z^o>_Eqt>S;!#p=Zt? zo(wrNRtYYmY|naxWwQZZ351@n4)G^{Z*n%bjpAA@j_754!eJHrVsx-f0o#k~0x1d7+K08?0)y-shZ@2kq_+24>RXNSGbbsEJ(LO5V zXBmTB>L=d@4uP_(4jSlt)rLHyCG4lkNW5OwFMO)GPxpNQKg(eIen!9REzC#Rdn#Od zyIyDG_t$2=Z`aAX!Nx&#QvBrrzIz6gjO8KHXE>~EM?G?dx=%fALgN2uM<*CoJrGK} zsK0a?d2s-rU4yh5{83*VV}HGhU%MKDr(JJ)no7`Qj>4xn_wA#1dbCdbrFH7#+G?I_ zYxp>2?~db_O`v(#Fh2UvpL@#PvAyj>(H1A<(7z^WC^FQn`2hd`00v@9M??Ss00000 z`9r&Z00009a7bBm000ia000ia0czHX2><{92XskIMF-~u8Vf55mw!QPHvj+u#z{m$ zR4C7FQZZ{&Q5Zdu8weTt?rRqtDEJ8VMldA-r_z=Tid*Rrx;wgwA=4w1I6VUX0o}yC zqk|M8rAVNm)tXmnUm(F+iMii(h%cmr!$+?#!EgHR`OZD(yWErV8@`khH$_C;SdfU4 z1OcG5Rx;Y~IYN}H)qe{BfG+U88I+4<$8`W0ZK8f8q?B1F3!rn{$<^vPpa67l^m4WO z1n4w__04qv=tB_EW$!ZTM?}Qz56!@C!fvNT2dx8d#Umn-AGVhUXGFOKH?NHWaIN*bH{a$6f(J<`?)AQY8JW>^_1*#irBoZRv|9j#>(0rT(bQQ? z&uhEx{~dk}|FHI4F>U4zVHj$P-|r19^7-Ot7=|-Gn&QLO6@aN3E2Y${J!UASSb|4p zv~bwE(iErshGbtZmigmsifnI>Qc7>dJ32WM9IVn>i32h=W222%t9F6YhF{sLBylOF z0I+;#nITTtWVZ^S0N};T{RS#q6&pTd@5-G000SaNLh0L01m$Z01m$aIDZ9GBme*ak4Z#9R47wD zj|&dOAP7W3P;C9+w)em54tBefAmn8t3=u=L+iy%F!kV+Pq$Hpvv1-;(%tU~i!>^fG zh^*G*+-m1ht5F}*PV100o1;IVkKz6T58$&d7^lCERi_8|JC={}Islr5KKKLRS=(CF zUK@uY2?|dfhARZ6B)M+dJ+c&Jy004~Vm^^0bqq}W1$n;)$2uFRf&c&j07*qoM6N<$ Ef)!PJg#Z8m delta 2025 zcmVuKpYr~CLeZNKdh0L_$DMFT zn{6ev%~o4*S4xC9+d)drP^Lkh8lIIZd{pin@MNwm$6S=aiK|!vI`gK%L6S6y!cw`5 z05##u7dq^w!+&0-2+NHi$^>PECI5MwKM8zuk5MgRM1Z3kya0D<)+jy&1G z9Eemn0-y}fS(FP9Am_NjNmdaLY$A9B+gKCmkY&ef9)GCE2^ztn z?8K>a&b#2EOD-EPUcK|)2S0Nz2MHQn@F9d4Qpi!FMi+eyF~$^g;v`5(mwXB-rj&Aq z&8#N7jMW(uITtQcw7B9+D6yoHE9g_Ty6S7Fv8I|EH)+~j^DVU4Qp=q>sARf!*L@E? z_SEwL*MEi#9d7s$MjUD63$=~v%l!+~XrsmlQd2Hms9`pQspwEav(C7Q84zP7ARZ_Vq}G5IO!%fjchjL0ikwcH|WCdM(%6e3}XE!-1r;h%!KZLK#on9 zC*0nk)@CKF2VyG=XH2ai`(lroV^$WUd<-G*;eT02K8DslJ>|zz^LCAVuU^U;nH1}u z#OOtQSZU{I?@S#R+>ZOtaWmT7cUh-^lRJ0+ffnGWduN+UMgRElO^f} z#l;-M#MfT>IORD_n*_2@jmHrD35nNi7vO-Zbj+h9nYFCy(3rz=w}zCD@9_51GvwBm z!hcF5<cQToyX3uxWKF$T*k{^KYL@(f{%CYN z8>Bke+k!Pp%Ma>4Wy+?BM>~>+GIZePDvlL{`9YPG9W`vYZ+yGQS)%51k!{P0f!c4q z|KWV)ym@1Xufvgy6usJAtpS%^%@eRHg&&Z(>0JW4hc4PMq8GJm1v zl~T2WoJsd8)c%`)B$=--x)nW!artWt5bM*Z#TqjZ*sn(^pc|LdY zvJvyLlM?n@r;|<3PwL^coh{CN)2;bWP3{3@wvO`)xitepiUEDyMlZoqu;_v@aF% zvy4G5^^2`>;b^uOOOHc~JIeGyDapi^l}2BlkdD1xJ-n;5hBDY)qJ3Al@H#o3MyE|F3s z(9l-xuhbt%v{qu?eGc)56mhup`4ha;ednHc&V9U-@HRXtCC-b8xUnD+#R&pHX})B% z;d6*ETdfrU0EfW0x_@6TmL1mtV6+K4p^#E$oD6{0UMpLzWq|^4c&?YN)`mc>pG z=H2U87A~OsKHvK#T$x^4E9}2JPB|F>oA=jTnYI@+MY!juoPUfnohmNn>BXMFc)2ot z>%sDwF#yiAe)aP61VQj14n^(urw@J8A6>pW1wbj)1S~BHK)CLNjOmY@>C~jQ>;B*2 zXYV&_PZZO}-Vg+Vrs&O9*CGdBegr`<=A$XvX`BKWnSoMDJ=&bWcpJ(jZ;lg z!rSo5#WH`KO=6Ml?NLgZo6GI)?+Ol9X}-h(8JL05=J~_hUz2}sKJqFnl{hY?6aZ!~ z%`(IZdwgg8B9Z`JKYaqAvQn|p1d#CSemvW3$ScKDZKr<$!TQ_GBCh^H00000NkvXX Hu0mjf<5J)o diff --git a/src/main/resources/assets/create/textures/block/diodes/pulse_repeater/idle.png b/src/main/resources/assets/create/textures/block/diodes/pulse_repeater/idle.png index ce7e369e8e011d33c4074afc72f64dd373b5599f..84e70803fa2995eff3f9ea621fcbcf94668b428c 100644 GIT binary patch delta 301 zcmV+|0n+~054{4A8Gi!+001a04^sdD00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z0022qOjJdCeS3?Ii@UqKtg5Vdcz8zv0xSan#mdE=X-B_~Rhe2n`T6|5%_j#KZK(4e00000NkvXXu0mjfz`lKi delta 2004 zcmV;_2P^o!0@n|a8Gix*005AYXf^-<1(t+UL{Hy3feE^?iNle3SY3g0Tu#*@wZMw|{cZFM5BkVD#Yy>DvXl z#qg`(kk2_={)a}@+hAWm@%bC0#WDJ}E;|o5_-)h{VJ$ynjj&k{f{(;8qCcpC9uZ!C#&+s)dh;U_BjQK`-Ws15G!|{012Sp>c52 z<>2eNKjsBk0fM^R9ARL#WwR(sPi)Bw00Et1-SI`CP1JZriGyr~G9-Y&dJ-j1HZTVw zCmaD#hUP4e3lJbxZcvh)hzB+iaRk}86KK)0@;*nZ0Dm79F9Fyj$pFhaMf?O85kpx; zovL~b8Z~J)UcB?_y$^ooTn-Xk(BMM|F{F^AL>D#s7-Ebm=EO;mlA3%9DW;TihRp0t z){NU36gd|zQe4sEODM6Vk}JZex~kRJP-9IsH*V5g)8<=fv89$fb%c`Xu50%_^w?9+ z1F<$_xPPI;k1*m$Bj2bURKGm`18Q_ofMssGN*lasO$LRuyx+7sP=a;8$}YWI!%4|00d`8m&Am{H^T-)R zPh2}idkJan;7^wqXZ)42&R)oF@)X*|w;OKj7>SYnO;OyYD5-k_yz52vJ}!k2j~Au3 zOMiLuqHVqD{1)XbwMXbSVXAh&wtBB-)8|{6c$BGi7SK(pK2Yjo+la7Cx9$&1b9g?i z{Ah0~D#Pu2*Inu`)gEE_@t5JSwm}m*r8|c7LfuCFqW{O0YF(%;PsrtyA@PwtsQLY? zM*lz|?Z`&|*eO!0HzAjEQxOqWw@QuS3V%8mLWHh-r~o9VA?>K{sJF$=Y<}+{a>Khr zv7lS^6Hp=d5OYYRFRWTL$8FHq?`RA{F(LTRt?2u0(@)Bq@3ij=w>cQbP<$wt0zLst zIbqoDB+f=pl;O79>4UgtX(um-R*XM`d7D@x@=^-zUr55TI&}oSsrI!uP{Y}giC-;AecwT`89w%U zuA#i5v@g{XvLju-$DF3-1Y*xe;W=^#I^ho2Q4L3@ZjpWIH3Xs_PK+|rQcnl!#C8rb zo6_=CZ!3mC-Fnb%$rnS+&z2N-EPsg=&>inLC*ke@2%|-92E%v$U|8s{mY@Wb0|`b2 z-YN36M+~`ys|8j^trn!J^iV#HdX3Z|^>EdhA;jG_!Bq%6_JKSwE1TBZISY%MJWA!TZYd z`suV!hrL4Fe4Go0=+!;okJF$vRa8oUnmM7~wsAFcZRVZx4+F>NdE=mg@%R}$-liyI z>PTm}>*!|q4`++Dy`HIP4u3@_j%EUvGaW@lWFPycm#ZRr`7-pK*iQURcIMa7&iy)6 zE)w%&GX207vu-l~1#heWXs;)?!2kdN24YJ`L;wH)0002_L%V+f000SaNLh0L01mJD3o8zgEUzvA00F>BL_t(2&uvmcXnzwy6n$AH5OT=O zG!!gFXplO3Xi33iEjb8YY%3yyH$CFA5q8-o@%gJlmsqtA`#!15HKNq8o@I zRy6a+LtIE%JbWCti~lhEdH>D(pZTv4u7^q~{0$=F#DheXB?tiZ`MR?XfYj1i*V=8h zA3x~_>7~2(mai-`Z-3-Q&bqi43#C+9mI3@bchL`0<_)?7sim)?2SG%G?jY{PewgZH zbvh0DL0X-x#=V$2#1qy|)`+OExpuKOTLJK?_3g%scQ_tV6d7Y)-n?-7+z9~j!7rgz zX>sLD=l$oRECYCTYelP)e_$!WTC*t2a-ul5c#59yiJYWXrGLw}&mTDl;KtiX|***j?b|YhqdAh|6V+>1h$qg$z+lQ8tLbx6-%q?UWrkS#NVg9x3Z;U;P8s0NWRBI!NjO0000YQ;MM diff --git a/src/main/resources/assets/create/textures/block/diodes/pulse_repeater/item.png b/src/main/resources/assets/create/textures/block/diodes/pulse_repeater/item.png index 9b3e3e328a3252e5c0d82e8617fcc03d8df80634..1237aef808e0f2485be3cf5069777391c28cf8f2 100644 GIT binary patch delta 301 zcmeAb*vm9QvYwfNfk8u;KNv_c76-XIF|0c$^AgBmNq6*hWMJ6X&;2Kn709;?@Ck9P zuC4Cw?cTk6_nK8}Dk>`68JTpL8IGPhIxo|Ge_!a#DBH6P3`-dp)>r!fzEgW{LDcut zIZw7H7r7fss(aJ`4dE>Ch%9Dc;5z`qj9J$@IqQLR%Uxh+Qmf*N{sV%C-MgVVmzzPE|I(9vmDT644$rjF6*2Ung9Ymc31!a delta 2059 zcmV+m2=w>80*w%m8Gix*005AYXf^-<1;u()SaechcOYO7exr>N1 z!nZ86?oI2yN`DbIHv%cZt+<$fe$AfHQz$h7F%k$Q->>=?z-=xYmYtk zJm70XhJPD=grOsjH1dtwLG{b~A5f!%8ZV?Ko!+QnRdq62ENJE#KQRMh>%@N0jopLXuW>W5^`CI#-ymlubpHc#Y`VPQ z_6=%nX2QA<+fg`eY6a03d(0fOV=<1`6a;U^I)Cz-TKh7}r=#ZEGxB@(QufTGSkEG6 z7g^i4BD+3&UHDR?0+u=LUfSSIYceRL<-ODDKnnJIE4%cn4JS{|6JVz_+?)%gIG3F9 zsEKRlQC>8y8SLru;*3uzYwZKsO`fz}e7oVcmJt{^+!V!aijsODz`HhT2yqDnf4nGt zyMKf?AEd1}UD#JSOYOOIt1v~ox2?ZNv+46KOgzHWIuq!o^g${0v2}!7rd#%hr8ztw zR$;Uk5k14~d)8g*P}QEx@?$T83+odgIz~TycPOUa`Q&?9`{cq zGb9)-bWjTkP|ESbcE@n`<~SLA*d0z~hGpN0CP^=KIJZwCJt5j@TNe@7+h){*kbjYS z0v55_?(iQjZSsnvDeif$PU&c;k*XYTnmLh;=JOj3R~o4&Id*^vg^rKKE1eW?1&Mi0 z6Yi69U-M{2qn?dAfKBg5+$cl(Cq>d$w>x-DIFjXhoZHOav>Z!%VDP7dY4_1{-zO_!kNwTEzL_e@R9UcLeMOU@S`6+61&g)d;4iBz7}xLr-_L9x+Gu{ z@&(gCpU1~G$ReTLW-eDNgMaY38JkzmpBdX*(A)Ck>TW)_C}x(_8?&cZ8A5m3$nIoe z{Nud(2cPPPo+GqX`+Xs#qBicPL$BFuBNOaZ!@ra-^IFG_P&gFdZqYX+=I6Tpl`Z~I zj)s6V{{lmh|Lp~fTlW9}00v@9M??Ss00000`9r&Z00009a7bBm0Dk}u!2kdb!2!6D zYwZ9400(qQO+^Ri1R4t~5gjC=+W-Io$w@>(R4C7FQqOA>K^T2mCKz(a%rq7(wct`J z@nDURV;geo#j1!1`XBTv3SuaDQP9$J4`Ppc)?0f`4?TpIT7LvfoZuSL7R`LqL)?`*Upgdi6)&Y=OI_sKS&F$wex?Xhc z;iLIm^Q;@VfwRs8MkuB7G7sSIx`nP6v98zYNiE|l0th1Nb$TW+@i4{F;&|kBy{I@^ zG=ZUA;tBl;pNKN63v>Qd0l=5$e&uxo|Dpwyfabl~iGN^y zX5#?B&<(BtSbte-0X#YYRuA34^$VMg152T3pRE+mUp0ZDN&2=}Ht z3BPT(1qZ7@dk#+U-&tb20z_BcEMZ=XE{P^;EB pnvBfS@=`L}+>mpXOm$rS117K3J;2<_CIA2c07*qoLV$U003+NPW%7>010qNS#tmY4!{5a4u8M_YSxJf0001vNkl&w-j^EETEZD#gw8jXNCh1 z4O?<|5F#yQKbGpTm!j1A&_f%fRYz|RXuX?#z#P~p6UJemW0qkK{*GzAe-41Et`mO% zJY#G1SYzMC5G{Cou^?ET<+^EQza=xveK`?v@Z1fni^31rNC#`164>bg0000sD9a?&ol3WI=%tl8z?R|MTx*{)LB$ zopBnXPu^QRF1f@RlW3o(pK-5|b?f(f==_rTxWO0&qwK}t&VR0)^^4x$BN%{Pi_I5&Y&IqgvRA2-?%J735-`IM6hs%wLcJ5E=(J zT?W41`!O%T3J}y~<_HC|Et^GAdVEWk0|@98` za>5Y+Wk}BAxBvlC zlQrXX21U+=ixgM1_!3GispJaxsjh1EHPl#B&5fHh*R=T-T5PH1P93gfy6f6~4?XtO z^MJ1n8Gml*@FR>k(#SVz2h}g{KR}HRYP^t|bm2w~t07EAiv`U*qZ2bA#*Tn^m8ALvFY-L z+XvLz%!G9zwxe*`)C!_6_LwDG0t9>wm~=YVF%7e;hR*&&coDOW8A%Vm*tP zU1V+FitPIAb>T~m3Rvc}tF*zJ)?`pf%X_EQffTHJE4%cr4JRe11lTDJH|Ihr&Lw9Q zHF3=pi)?UbN@)X*|w;OJ28G(`gO;OyYD5-k_ylbO+AD2Mz$BRj<|@x9kr~b9g?i z{Ah0?D#Pr1)?MmQ)t<}pV=u#DO@k&>N_Q0Lg}ROUMgET?)w)nymXOOPL*jGypyv0# z8vO%>v~xG=#}1KNy$QLTlM0WhxK4(LUR@yS;lxNIE%kJuPHblr zvnefK`L?17)GY_yntV~j{9Tjcj(;Yx0=i@U<|Nz|0B*FX&0yHh9}ElqRuiOvav(vg zz&k{~)`%h3K4qp;rGCIf`trxhmc+)tQm)fdMFR{Yx->Blk%VW@d;_sq^Q|d1<+G2FwplV^Iv!q`pdfUwJZPt00v@9M??Ss00000`9r&Z00009 za7bBm000ib000ib0l1NC?EnA(2XskIMF-~u8Vf5FZBABH0005NNqKuSmYj?JeGX%kfG?a8YAKnezU^IQD1i%>61UxMOAhgcNxWPzHGX_Dp4C?Fe{Z4{J-cG_I5q0H!WZF$BO__xsiwfEfS} v9=@uhwp3$la^xCM8fkBHLmnyZYG3^WqHWtD1v1|000000NkvXXu0mjf-aXGE diff --git a/src/main/resources/assets/create/textures/block/diodes/pulse_repeater/powered_powering.png b/src/main/resources/assets/create/textures/block/diodes/pulse_repeater/powered_powering.png index 58d2cc43968db92ed9a11423400abdd0addc5b75..27e9929d861b1e65c2d29bea5f7f8fe828cc9709 100644 GIT binary patch delta 300 zcmV+{0n`5754-}98Gi!+001a04^sdD00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z0022qOjJdCeS3?Ii@UqKtg5VdczDeK0Hpu`#mdE=X-B_~Rhe2n`T600009a7bBm000ia000ia0czHX34Z_p0E|gQK~yMHJ&y?v z#UKbo5nQl!!QTI{f6(?%f{>R%fG9w;(_69#OH4VIQdmF>ql!64VJ-{@AR1D3cMu}2 z^}4s(ebuVe$JARpq)q4O2lO$_K41=P)&=9V&#~$>2Y<)1F+K-CQ`dt(0M6LfJoeak yF$5l8EC^O-NhO(f_FD?G$P`89k|M$-@|KMU0 zYn;~@QV158OD=K7L$vqR_qgWBy5s-6X#bP>@&jWOjIt)x?SHSb=TG@?jZpN(2l9^v za+%>*!gd ze+2lvugkmuD?rd6VUE~fwq>a(o^Ec*K>&fA$GG@K+9qmzu*AW(hchIAzy=aefvhqs zkrR#pD8q9W#{~$G_uSwlJCOivB6tMbSfg~vvgb9ARDS_JUV&Rih@&QKE}JhNv;d6m#MvNJ*bU(iBrlIm2dl zCi{%l84@`cE>c|aB@`{Oq>?M>Q(g5nRIRb5nj1H1uK5<4w%Ah3ojRywy6e7&u08hD z^8nX|41YKL2t!94Y2*vFjq0cS7pT!jjSr-zoL;D5R&^>mRM4z5eqsj1*bxxdi2w-A z6EhphIiAQ(%xq$0g=aYFCpL|2HWUD%>%@N0h24$Zk8v}I_1|#gpCD%@bpHc#Y`Q#f z`vSE#D`7nlTUj_`Y6aOBd(0fOV=<18M+m$b>wn0{qqUDwJ}fm~u92Usm$IHrigi!o z=@e_rDyr-KtqY&qi0+sy*zNFzQzPdM`9eLU9*6UI*TUKn)g0#=d3Ngo)Y~Jud?>{4 zwt~WTJZ6`!otJugll`H4{@PRQ60c>&dny_dx2pkw-6|U`nGxKmE%v%zgPb9Be9Ce+ zZGZ0|-5&Q#PNeUs^=)`=$e!-qpE;V3V6@xi9rW=6D&q{3^7@K4!>uPxtR*N?aK0I2=Y>a2%TfzSE0p9VpQ}cuhpkVe*$*n` zl)BSFt^LJzRiD-yQ@UKPW6`8xYkskz2!A2f+Fpr8B&@`^-|-a?qE9t_#T!b^nYNe zh)WRJ=LV;}%8B0D!eK9Vwucp~Ug%{P=5O0bax&ne2#Wog_{Cd6p`ISW5A=OUCU1CC@o8&^@aj~%Dh~2AdU&`5xQ-5H5STUsM{&;Er1rqhNX z#+foJtrnKfAeQ#U6ia)B^UYx9?UFBf% zo1Hv162>NEs%+n#I<=q1v6)P}O!>HxfAXkA8^tx zp7sISX?Qiq{1UBq4xgiuw1W%v2>gz1o5#bOWcb=|b2$E5A$IBfW#v>O&wrwMS4jF) zJ+GNqPP(N&sD-1jq3XmC?o}Idbogflz*)?M4(52nFJ9+BSd*xJ=2-^wb(CB(?<(d8 zQS+P|m)&|D|LLpGdk*c=fwh^9+||U~r~TV;p>7YdDXeC3zNhzYvc62N4B0MrlK?nu^fVNBN?kElg zJ2(UdW7|BXzCa48rOiFpA-)m^hl97zN6&CM_dDPH&f%Uf6Vw8w6z+nEIPoA6B?$sR zWvb$=10c0@)-{eA%YU1jEugu+KEF86yuRx@>!MC1lu~(_2k`GaLhDYi+wMv&eH9%D zBI>rgQ77`l6i13>pam31icu$`Ch>%&2PGoP?5xd|CJF$~8b4Rx?c;ugVQ7qb|Ki!B zC!+wO^DCiMZf2p}{QNyD^8h})T+k}#A6Sa9R?o`39L`S8Jb$F^6OoeCD);==(;Mdi z+*tc@=R8FaTu4H3yZ!A;&-Dfqj|%{dF%7`eh5!hyQ!=hMki*%uw$}ge@aOk6Yo~%~ zBK0Sh;=SD;9yz`E6^7xxK9=IcgG&Gd*EhzPtzBjqV_1Squ2(obxU>{!f?6;=Ih|ab zQp)H4%8NU09#ac8R%NQf%V*D&UN5zPueG2$TTS9hDFI+?e2gIg&bq%VO909MHr{-y sp*mY-YjR}jZ|g~Kb3+~}>1toS1zRuI6u6>M&Hw-a07*qoM6N<$f=Rd9RR910 diff --git a/src/main/resources/assets/create/textures/block/diodes/pulse_repeater/powering.png b/src/main/resources/assets/create/textures/block/diodes/pulse_repeater/powering.png index 4318b67cb9d1d3ad6d418cf9b157808e108cdb21..ae3bbd2328e904a0f5ab431e5c0b091cbb2c7d3c 100644 GIT binary patch delta 309 zcmV-50m}aC55)qI8Gi!+001a04^sdD00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z002KwOjJdCeS3?Ii@UqKtg5VdczDeK0Hpu`#mdE=X-B_~Rhe2n`T6&w-j^EETEZD#gw8jXNCh1 z4O?<|5F#yQKbGpTm!j1A&_f%fRYz|RXuX?#z#P~p6UJemW0qkK{*GzAe-41Et`mO% zJY#G1SYzMC5H5Ipu^?ET<+^EQza=xvecd1;4xYPVby4^M*I@^2oLt~~00000NkvXX Hu0mjfmr#49 delta 2024 zcmV#o1|Mf)$APd_k5!6<7|-GBZnd;XRWXN00pK9GM~ zAjb^98rHn$+43JA)n?VcUh(;j(c&0=?Jm23FodsGC>(($$#GFJAt3vV^oV65n=bVV+FsMCk`~jDDyAG00@nZ zo4*2l-{&$fzzPubSC}IKLauGlv=P@pRk+z8%Uo3I3?codwAh3bNQy{C% zO5}ti0Lt*3#c=@wu%6O9jn3<0oc7j2!`Sod|%? zJTbG8oa2ey#LOl}R(OV!eqz(eWZPnFlVaVI zc)G>fvWn{ZeCxvZHln*G3wAqv;nc`^L%vWCsmI|w-nFoHL^a3xMxNbz0QL4rE?)}q zd#s?aU60wNv-47KZ?eC1&tH2NJL0vhcuz$`;&wFvut#O1B{PB>wZ&f7YmhsHj&E7+ zrhn}nq{riaXh6O8t_ydyuX8%=H2YnzB(0(ILm-z$x@qiGPm zwBn3J-eb4}Ol90*QeI!tX1MjFiM0ep3eGo!>^ykXv@ErNv_eT<^0{hcdb9OmH2Xp2 zo>F%^sI|Y?uIkfzV@k*6Iu=bDw&oWbihmGNt?iX)n3Psr)Fl)l-3z+K;j=a7t}$yJ zdc_EJGLefbU@`LVpj2 zins)keQt2ttDNYQEgbe@XM0$&>V;l*VZPf&lA8gCA}IEE;umiPg?f4fKhXEd?FK&d zyWFgubS*ojqqHoA)*A`{D)Vy9fjB0#o4<#pn#*>|r%2Urx-$}uwzNj@p8X32Os5S& zj5Blc4Yh*`wnBjy)7X*;h@xYAA=Ts*%GTnP4VvztmnY%A;sZ|F z#nV1OI}NYqm|vpxmBaUFB<-v$A9|l^PWSybYX2~BX^pZ=d{25sX=S=_vwLnEPs4ZWPB^<)C@*-#TIAC zX3;l_gMIH)sPz?WG^w}iet&Tg^f?(Kr*%NKZuZpS;x0x}3jWubg)QbHPm49euFqjI zvOEpYhi2^bZp)dqD~}~QUzH6aB&`> zb*|TKccqrTiVg%3b=%#j6Zv6E!=-Vc1(b$MQ757%@r32kG7)9A7iP<2MF3wKKOgVB z!{rFW&=~Xb$?Y4rt^kORPJ~wZ>il@~{nwl<0C@FuUaP!+V1FsbLOmx7aws=Zy-r&n zL`qVt{M~2Mr_KR5wf6P)QHmhAkc8rP`}3!s>kYQ5}iZ+E|YI|eXtePfK-*ky(>h9$VVUwLtd%|pS)s!UdR`Rtj^#fLw#XLpu^+Dt8pE2RX0k!vFi z0dUqme{}yUvH;$^SOrj7n>r)~IpxK;vvP}B7(igl zrZrs?Cd{5YM?;2x$4lFzvGC8G+*@==L7;_yij;s)u7XMZ zvRlvo#&4`{2s^gUcsj@ZJ8xwh6%?0`&qJu;vL}b{rxSA82UHz8m?9o~Y<2D0 zvel?kK&aMh$_BUahK)d@wlU4wcqG>i5(kTSjW zXyv?y@8S$z45<(5w@h^vd-FFnK$7968uv+;-%lO}E<2^L^>J`doDBNx1&BpP=cp8oT5m`D1fb_nYmxQ~BPyWu3O`t~9S-|L}jkwql^tGi#;? zUyYL|$DS!ysgPP;IaB|0(adE(i)M!92^Dkv>|=;HUijw_|HQ+l%yv(#g{-9VgSB!2{FK}|sb0I`n?{9y$E003i9OjJbx006(iz`nr0wYa&ox45*j zth2GJtgx)3rmUo;oTH?ho1L7Nmz$H8laZ8_ija_rkB^9qh=z!Vg@=ZJf{1*7fOC0y zZ*g#HZF6aCa%E^~T3uQw91kBB3mFj!1ONa4006=ZE2#hg0Dl2=QchC%mXX` zm+S3zZG=S@h%g{>JKus+EkH`@loP0t>nRIO1k3`45U}g{AqAx*7Q*qUN+zds&7JF-;voh!KgnBrh~Iq-Vea76mAOkXjbl zbsZx9Aa;_Mi>DDvl&29M=O5GpGW#evGa_Rx5KFl)hG8%f(+5H5Lkek9JicZ@BP?OL z7>FkQ7$MHb`_U(pLce>*(^P{lPU`rf?^+X^) e-r48XgYXOPpD)knCqQNZ0000