From 5f1c96d3c8873d182b9e393cd4ceb766b3af77d7 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Wed, 5 Feb 2025 21:26:11 -0800 Subject: [PATCH 01/13] Scrolling into the distance - Import models from Kryppers - Add scrolling animation to belts on large bogeys - Duplicate scrolling instance to extend TransformedInstance so it can actually be used in a bogey --- .../com/simibubi/create/AllPartialModels.java | 1 + .../com/simibubi/create/AllSpriteShifts.java | 2 + .../burner/ScrollTransformedInstance.java | 63 + .../trains/bogey/StandardBogeyRenderer.java | 21 + .../trains/bogey/StandardBogeyVisual.java | 18 + .../foundation/render/AllInstanceTypes.java | 36 + .../instance/cull/scrolling_transformed.glsl | 5 + .../instance/scrolling_transformed.vert | 12 + .../models/block/track/bogey/bogey_drive.mtl | 7 +- .../models/block/track/bogey/bogey_drive.obj | 1435 +++-------------- .../block/track/bogey/bogey_drive_belt.json | 6 + .../block/track/bogey/bogey_drive_belt.mtl | 5 + .../block/track/bogey/bogey_drive_belt.obj | 130 ++ .../textures/block/bogey/belt_scroll.png | Bin 0 -> 291 bytes 14 files changed, 557 insertions(+), 1184 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/processing/burner/ScrollTransformedInstance.java create mode 100644 src/main/resources/assets/create/flywheel/instance/cull/scrolling_transformed.glsl create mode 100644 src/main/resources/assets/create/flywheel/instance/scrolling_transformed.vert create mode 100644 src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.json create mode 100644 src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.mtl create mode 100644 src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.obj create mode 100644 src/main/resources/assets/create/textures/block/bogey/belt_scroll.png diff --git a/src/main/java/com/simibubi/create/AllPartialModels.java b/src/main/java/com/simibubi/create/AllPartialModels.java index ac4b66cdda..149c6aa459 100644 --- a/src/main/java/com/simibubi/create/AllPartialModels.java +++ b/src/main/java/com/simibubi/create/AllPartialModels.java @@ -158,6 +158,7 @@ public class AllPartialModels { BOGEY_FRAME = block("track/bogey/bogey_frame"), SMALL_BOGEY_WHEELS = block("track/bogey/bogey_wheel"), BOGEY_PIN = block("track/bogey/bogey_drive_wheel_pin"), BOGEY_PISTON = block("track/bogey/bogey_drive_piston"), BOGEY_DRIVE = block("track/bogey/bogey_drive"), LARGE_BOGEY_WHEELS = block("track/bogey/bogey_drive_wheel"), + BOGEY_DRIVE_BELT = block("track/bogey/bogey_drive_belt"), TRAIN_COUPLING_HEAD = block("track/bogey/coupling_head"), TRAIN_COUPLING_CABLE = block("track/bogey/coupling_cable"), diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 8191d4c6e1..b319e12559 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -94,6 +94,8 @@ public class AllSpriteShifts { ANDESIDE_BELT_CASING = get("block/belt/brass_belt_casing", "block/belt/andesite_belt_casing"), CRAFTER_THINGIES = get("block/crafter_thingies", "block/crafter_thingies"); + public static final SpriteShiftEntry BOGEY_BELT = get("block/bogey/belt", "block/bogey/belt_scroll"); + static { populateMaps(); } diff --git a/src/main/java/com/simibubi/create/content/processing/burner/ScrollTransformedInstance.java b/src/main/java/com/simibubi/create/content/processing/burner/ScrollTransformedInstance.java new file mode 100644 index 0000000000..5cf697c6b9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/processing/burner/ScrollTransformedInstance.java @@ -0,0 +1,63 @@ +package com.simibubi.create.content.processing.burner; + +import org.joml.Quaternionf; +import org.joml.Quaternionfc; + +import dev.engine_room.flywheel.api.instance.InstanceHandle; +import dev.engine_room.flywheel.api.instance.InstanceType; +import dev.engine_room.flywheel.lib.instance.TransformedInstance; +import net.createmod.catnip.render.SpriteShiftEntry; +import net.minecraft.core.Vec3i; + +public class ScrollTransformedInstance extends TransformedInstance { + public float speedU; + public float speedV; + + public float offsetU; + public float offsetV; + + public float diffU; + public float diffV; + + public float scaleU; + public float scaleV; + + public ScrollTransformedInstance(InstanceType type, InstanceHandle handle) { + super(type, handle); + } + + public ScrollTransformedInstance setSpriteShift(SpriteShiftEntry spriteShift) { + return setSpriteShift(spriteShift, 0.5f, 0.5f); + } + public ScrollTransformedInstance setSpriteShift(SpriteShiftEntry spriteShift, float factorU, float factorV) { + float spriteWidth = spriteShift.getTarget() + .getU1() + - spriteShift.getTarget() + .getU0(); + + float spriteHeight = spriteShift.getTarget() + .getV1() + - spriteShift.getTarget() + .getV0(); + + scaleU = spriteWidth * factorU; + scaleV = spriteHeight * factorV; + + diffU = spriteShift.getTarget().getU0() - spriteShift.getOriginal().getU0(); + diffV = spriteShift.getTarget().getV0() - spriteShift.getOriginal().getV0(); + + return this; + } + + public ScrollTransformedInstance speed(float speedU, float speedV) { + this.speedU = speedU; + this.speedV = speedV; + return this; + } + + public ScrollTransformedInstance offset(float offsetU, float offsetV) { + this.offsetU = offsetU; + this.offsetV = offsetV; + return this; + } +} diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyRenderer.java b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyRenderer.java index fbd23291ce..0103b190b0 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock; import net.createmod.catnip.render.CachedBuffers; @@ -14,6 +15,7 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; import net.minecraft.world.level.block.Blocks; public class StandardBogeyRenderer implements BogeyRenderer { @@ -59,6 +61,9 @@ public class StandardBogeyRenderer implements BogeyRenderer { } public static class Large extends StandardBogeyRenderer { + public static final float BELT_RADIUS_PX = 5f; + public static final float BELT_RADIUS_IN_UV_SPACE = BELT_RADIUS_PX / 16f; + @Override public void render(CompoundTag bogeyData, float wheelAngle, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int light, int overlay, boolean inContraption) { super.render(bogeyData, wheelAngle, partialTick, poseStack, bufferSource, light, overlay, inContraption); @@ -83,6 +88,22 @@ public class StandardBogeyRenderer implements BogeyRenderer { .overlay(overlay) .renderInto(poseStack, buffer); + float spriteSize = AllSpriteShifts.BOGEY_BELT.getTarget() + .getV1() + - AllSpriteShifts.BOGEY_BELT.getTarget() + .getV0(); + + float scroll = BELT_RADIUS_IN_UV_SPACE * Mth.DEG_TO_RAD * wheelAngle; + scroll = scroll - Mth.floor(scroll); + scroll = scroll * spriteSize * 0.5f; + + CachedBuffers.partial(AllPartialModels.BOGEY_DRIVE_BELT, Blocks.AIR.defaultBlockState()) + .scale(1 - 1 / 512f) + .light(light) + .overlay(overlay) + .shiftUVScrolling(AllSpriteShifts.BOGEY_BELT, scroll) + .renderInto(poseStack, buffer); + CachedBuffers.partial(AllPartialModels.BOGEY_PISTON, Blocks.AIR.defaultBlockState()) .translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle))) .light(light) diff --git a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java index 80f2ce24d5..fac4075f3e 100644 --- a/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java +++ b/src/main/java/com/simibubi/create/content/trains/bogey/StandardBogeyVisual.java @@ -6,6 +6,9 @@ import org.jetbrains.annotations.Nullable; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.AllPartialModels; +import com.simibubi.create.AllSpriteShifts; +import com.simibubi.create.content.processing.burner.ScrollTransformedInstance; +import com.simibubi.create.foundation.render.AllInstanceTypes; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.visualization.VisualizationContext; @@ -15,6 +18,7 @@ import dev.engine_room.flywheel.lib.model.Models; import net.createmod.catnip.math.AngleHelper; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; public class StandardBogeyVisual implements BogeyVisual { private final TransformedInstance shaft1; @@ -139,6 +143,7 @@ public class StandardBogeyVisual implements BogeyVisual { private final TransformedInstance secondaryShaft1; private final TransformedInstance secondaryShaft2; private final TransformedInstance drive; + private final ScrollTransformedInstance belt; private final TransformedInstance piston; private final TransformedInstance wheels; private final TransformedInstance pin; @@ -152,6 +157,9 @@ public class StandardBogeyVisual implements BogeyVisual { drive = ctx.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.BOGEY_DRIVE)) .createInstance(); + belt = ctx.instancerProvider() + .instancer(AllInstanceTypes.SCROLLING_TRANSFORMED, Models.partial(AllPartialModels.BOGEY_DRIVE_BELT)) + .createInstance(); piston = ctx.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.BOGEY_PISTON)) .createInstance(); @@ -161,6 +169,8 @@ public class StandardBogeyVisual implements BogeyVisual { pin = ctx.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.BOGEY_PIN)) .createInstance(); + + belt.setSpriteShift(AllSpriteShifts.BOGEY_BELT); } @Override @@ -183,6 +193,10 @@ public class StandardBogeyVisual implements BogeyVisual { drive.setTransform(poseStack) .scale(1 - 1/512f) .setChanged(); + belt.offset(0, StandardBogeyRenderer.Large.BELT_RADIUS_IN_UV_SPACE * Mth.DEG_TO_RAD * wheelAngle) + .setTransform(poseStack) + .scale(1 - 1/512f) + .setChanged(); piston.setTransform(poseStack) .translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle))) .setChanged(); @@ -205,6 +219,7 @@ public class StandardBogeyVisual implements BogeyVisual { secondaryShaft2.setZeroTransform().setChanged(); wheels.setZeroTransform().setChanged(); drive.setZeroTransform().setChanged(); + belt.setZeroTransform().setChanged(); piston.setZeroTransform().setChanged(); pin.setZeroTransform().setChanged(); } @@ -216,6 +231,7 @@ public class StandardBogeyVisual implements BogeyVisual { secondaryShaft2.light(packedLight).setChanged(); wheels.light(packedLight).setChanged(); drive.light(packedLight).setChanged(); + belt.light(packedLight).setChanged(); piston.light(packedLight).setChanged(); pin.light(packedLight).setChanged(); } @@ -227,6 +243,7 @@ public class StandardBogeyVisual implements BogeyVisual { consumer.accept(secondaryShaft2); consumer.accept(wheels); consumer.accept(drive); + consumer.accept(belt); consumer.accept(piston); consumer.accept(pin); } @@ -238,6 +255,7 @@ public class StandardBogeyVisual implements BogeyVisual { secondaryShaft2.delete(); wheels.delete(); drive.delete(); + belt.delete(); piston.delete(); pin.delete(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java index 007e14ff68..811fe04cd1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java @@ -6,6 +6,7 @@ import org.lwjgl.system.MemoryUtil; import com.simibubi.create.content.kinetics.base.RotatingInstance; import com.simibubi.create.content.processing.burner.ScrollInstance; +import com.simibubi.create.content.processing.burner.ScrollTransformedInstance; import dev.engine_room.flywheel.api.instance.InstanceType; import dev.engine_room.flywheel.api.layout.FloatRepr; @@ -87,6 +88,41 @@ public class AllInstanceTypes { }) .build(); + // TODO: Switch everything to this? Right now it's only used for bogey belts. + // It takes a decent few more bytes to represent but perhaps it can be packed + // down into 96 by sacrificing precision + public static final InstanceType SCROLLING_TRANSFORMED = SimpleInstanceType.builder(ScrollTransformedInstance::new) + .cullShader(asResource("instance/cull/scrolling_transformed.glsl")) + .vertexShader(asResource("instance/scrolling_transformed.vert")) + .layout(LayoutBuilder.create() + .matrix("pose", FloatRepr.FLOAT, 4) + .vector("color", FloatRepr.NORMALIZED_UNSIGNED_BYTE, 4) + .vector("light", IntegerRepr.SHORT, 2) + .vector("overlay", IntegerRepr.SHORT, 2) + .vector("speed", FloatRepr.FLOAT, 2) + .vector("diff", FloatRepr.FLOAT, 2) + .vector("scale", FloatRepr.FLOAT, 2) + .vector("offset", FloatRepr.FLOAT, 2) + .build()) + .writer((ptr, instance) -> { + ExtraMemoryOps.putMatrix4f(ptr, instance.pose); + MemoryUtil.memPutByte(ptr + 64, instance.red); + MemoryUtil.memPutByte(ptr + 65, instance.green); + MemoryUtil.memPutByte(ptr + 66, instance.blue); + MemoryUtil.memPutByte(ptr + 67, instance.alpha); + ExtraMemoryOps.put2x16(ptr + 68, instance.light); + ExtraMemoryOps.put2x16(ptr + 72, instance.overlay); + MemoryUtil.memPutFloat(ptr + 76, instance.speedU); + MemoryUtil.memPutFloat(ptr + 80, instance.speedV); + MemoryUtil.memPutFloat(ptr + 84, instance.diffU); + MemoryUtil.memPutFloat(ptr + 88, instance.diffV); + MemoryUtil.memPutFloat(ptr + 92, instance.scaleU); + MemoryUtil.memPutFloat(ptr + 96, instance.scaleV); + MemoryUtil.memPutFloat(ptr + 100, instance.offsetU); + MemoryUtil.memPutFloat(ptr + 104, instance.offsetV); + }) + .build(); + public static void init() { // noop } diff --git a/src/main/resources/assets/create/flywheel/instance/cull/scrolling_transformed.glsl b/src/main/resources/assets/create/flywheel/instance/cull/scrolling_transformed.glsl new file mode 100644 index 0000000000..c8d9a275ca --- /dev/null +++ b/src/main/resources/assets/create/flywheel/instance/cull/scrolling_transformed.glsl @@ -0,0 +1,5 @@ +#include "flywheel:util/matrix.glsl" + +void flw_transformBoundingSphere(in FlwInstance i, inout vec3 center, inout float radius) { + transformBoundingSphere(i.pose, center, radius); +} diff --git a/src/main/resources/assets/create/flywheel/instance/scrolling_transformed.vert b/src/main/resources/assets/create/flywheel/instance/scrolling_transformed.vert new file mode 100644 index 0000000000..1bacc8d194 --- /dev/null +++ b/src/main/resources/assets/create/flywheel/instance/scrolling_transformed.vert @@ -0,0 +1,12 @@ +#include "flywheel:util/matrix.glsl" + +void flw_instanceVertex(in FlwInstance instance) { + flw_vertexPos = instance.pose * flw_vertexPos; + flw_vertexNormal = mat3(transpose(inverse(instance.pose))) * flw_vertexNormal; + + vec2 scroll = fract(instance.speed * flw_renderTicks + instance.offset) * instance.scale; + + flw_vertexTexCoord = flw_vertexTexCoord + instance.diff + scroll; + flw_vertexOverlay = instance.overlay; + flw_vertexLight = max(vec2(instance.light) / 256., flw_vertexLight); +} diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.mtl b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.mtl index 5e922e0b7f..e95c3d9010 100644 --- a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.mtl +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.mtl @@ -1,8 +1,5 @@ -# Blender MTL File: 'Bogey.blend' -# Material Count: 4 - -newmtl Belts -map_Kd #belt +# Blender 4.3.2 MTL File: 'Bogey.blend' +# www.blender.org newmtl Bogey_Body map_Kd #bogey diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.obj b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.obj index 1ef72c40cb..b041890144 100644 --- a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.obj +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.obj @@ -1,7 +1,7 @@ -# Blender v3.0.1 OBJ File: 'Bogey.blend' +# Blender 4.3.2 # www.blender.org mtllib bogey_drive.mtl -o Cube.050_Cube.042 +o Cube.050 v 0.437500 0.687500 0.318750 v 0.437500 1.375000 0.318750 v 0.437500 0.687500 -0.318750 @@ -234,62 +234,6 @@ v -0.437500 0.500000 1.250000 v -0.437500 1.000000 1.250000 v -0.437500 0.500000 0.750000 v -0.437500 1.000000 0.750000 -v 0.500000 1.000000 -1.062500 -v 0.687500 1.000000 -1.062500 -v 0.500000 1.310930 -0.311848 -v 0.687500 1.310930 -0.311848 -v -0.500000 1.000000 -1.062500 -v -0.687500 1.000000 -1.062500 -v -0.500000 1.310930 -0.311848 -v -0.687500 1.310930 -0.311848 -v 0.500000 1.000000 1.062500 -v 0.687500 1.000000 1.062500 -v 0.500000 1.310930 0.311848 -v 0.687500 1.310930 0.311848 -v -0.500000 1.000000 1.062500 -v -0.687500 1.000000 1.062500 -v -0.500000 1.310930 0.311848 -v -0.687500 1.310930 0.311848 -v 0.500000 0.656250 0.939394 -v 0.687500 0.656250 0.939394 -v 0.500000 0.656250 -1.060606 -v 0.687500 0.656250 -1.060606 -v 0.500000 0.656250 -0.060606 -v 0.687500 0.656250 -0.060606 -v -0.500000 0.593750 0.939394 -v -0.687500 0.593750 0.939394 -v -0.500000 0.593750 -1.060606 -v -0.687500 0.593750 -1.060606 -v -0.500000 0.593750 -0.060606 -v -0.687500 0.593750 -0.060606 -v 0.500000 0.942259 -1.038583 -v 0.687500 0.942259 -1.038583 -v 0.500000 1.253189 -0.287931 -v 0.687500 1.253189 -0.287931 -v -0.500000 0.942259 -1.038583 -v -0.687500 0.942259 -1.038583 -v -0.500000 1.253189 -0.287931 -v -0.687500 1.253189 -0.287931 -v 0.500000 0.942259 1.038583 -v 0.687500 0.942259 1.038583 -v 0.500000 1.253189 0.287931 -v 0.687500 1.253189 0.287931 -v -0.500000 0.942259 1.038583 -v -0.687500 0.942259 1.038583 -v -0.500000 1.253189 0.287931 -v -0.687500 1.253189 0.287931 -v 0.500000 0.593750 0.939394 -v 0.687500 0.593750 0.939394 -v 0.500000 0.593750 -1.060606 -v 0.687500 0.593750 -1.060606 -v 0.500000 0.593750 -0.060606 -v 0.687500 0.593750 -0.060606 -v -0.500000 0.531250 0.939394 -v -0.687500 0.531250 0.939394 -v -0.500000 0.531250 -1.060606 -v -0.687500 0.531250 -1.060606 -v -0.500000 0.531250 -0.060606 -v -0.687500 0.531250 -0.060606 v 0.000000 0.562500 -0.937500 v 0.000000 0.562500 -1.187500 v -0.750000 0.375000 -0.937500 @@ -330,1156 +274,289 @@ v 1.191942 0.816942 0.937500 v 1.191942 0.816942 1.187500 v 0.672335 0.562500 0.937500 v 0.672335 0.562500 1.187500 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn -0.7071 0.7071 -0.0000 +vt 0.812500 0.656250 vt 0.812500 1.000000 -vt 0.500000 0.656250 -vt 0.812500 0.656250 -vt 0.968750 1.000000 -vt 0.812500 0.656250 -vt 0.968750 0.656250 -vt 0.968750 1.000000 -vt 0.968750 0.656250 -vt 0.500000 0.500000 -vt 0.812500 0.656250 -vt 0.500000 0.500000 -vt 0.812500 0.500000 -vt 0.500000 0.656250 -vt 0.812500 1.000000 -vt 0.812500 0.656250 -vt 0.812500 0.656250 -vt 0.968750 1.000000 -vt 0.968750 0.656250 -vt 0.968750 1.000000 -vt 0.968750 0.656250 -vt 0.500000 0.500000 -vt 0.500000 0.500000 -vt 0.812500 0.656250 -vt 0.812500 0.500000 -vt 0.187500 0.187500 -vt 0.500000 0.500000 -vt 0.500000 0.187500 -vt 0.187500 0.000000 -vt 0.500000 0.187500 -vt 0.500000 0.000000 -vt 0.187500 0.500000 -vt 0.500000 0.187500 -vt 0.500000 0.500000 -vt 0.187500 0.500000 -vt 0.000000 0.187500 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.187500 0.187500 -vt 0.500000 -0.000000 -vt 0.875000 0.656250 -vt 1.000000 0.625000 -vt 0.875000 0.625000 -vt 0.500000 0.937500 -vt 0.375000 0.687500 -vt 0.375000 0.937500 -vt 0.843750 0.375000 -vt 0.843750 0.625000 -vt 1.000000 0.625000 -vt 0.875000 0.656250 -vt 1.000000 0.656250 -vt 0.875000 0.625000 -vt 0.843750 0.375000 -vt 0.843750 0.625000 -vt 0.843750 0.375000 -vt 0.875000 0.625000 -vt 0.843750 0.625000 -vt 0.875000 0.375000 -vt 1.000000 0.625000 -vt 0.843750 0.375000 -vt 0.875000 0.625000 -vt 0.843750 0.625000 -vt 0.875000 0.656250 -vt 0.875000 0.656250 -vt 1.000000 0.625000 -vt 1.000000 0.656250 -vt 0.500000 0.500000 -vt 0.187500 0.187500 -vt 0.500000 0.187500 -vt 0.500000 0.187500 -vt 0.187500 0.000000 -vt 0.500000 0.000000 -vt 0.500000 0.187500 -vt 0.187500 0.500000 -vt 0.500000 0.500000 -vt 0.000000 0.187500 -vt 0.187500 0.500000 -vt 0.000000 0.500000 -vt 0.187500 0.187500 -vt 0.000000 0.500000 -vt 0.500000 -0.000000 -vt 1.000000 0.625000 -vt 0.875000 0.656250 -vt 0.875000 0.625000 -vt 0.375000 0.687500 -vt 0.500000 0.937500 -vt 0.375000 0.937500 -vt 0.843750 0.375000 -vt 0.843750 0.625000 -vt 0.875000 0.656250 -vt 1.000000 0.625000 -vt 1.000000 0.656250 -vt 0.843750 0.375000 -vt 0.875000 0.625000 -vt 0.843750 0.625000 -vt 0.875000 0.625000 -vt 0.843750 0.375000 -vt 0.843750 0.625000 -vt 1.000000 0.625000 -vt 0.875000 0.375000 -vt 0.875000 0.625000 -vt 0.843750 0.375000 -vt 0.843750 0.625000 -vt 0.875000 0.656250 -vt 1.000000 0.625000 -vt 0.875000 0.656250 -vt 1.000000 0.656250 -vt 0.500000 0.500000 -vt 0.187500 0.187500 -vt 0.500000 0.187500 -vt 0.500000 0.187500 -vt 0.187500 0.000000 -vt 0.500000 0.000000 -vt 0.500000 0.187500 -vt 0.187500 0.500000 -vt 0.500000 0.500000 -vt 0.000000 0.187500 -vt 0.187500 0.500000 -vt 0.000000 0.500000 -vt 0.187500 0.187500 -vt 0.000000 0.500000 -vt 0.500000 -0.000000 -vt 1.000000 0.625000 -vt 0.875000 0.656250 -vt 0.875000 0.625000 -vt 0.375000 0.687500 -vt 0.500000 0.937500 -vt 0.375000 0.937500 -vt 0.843750 0.375000 -vt 0.843750 0.625000 -vt 0.875000 0.656250 -vt 1.000000 0.625000 -vt 1.000000 0.656250 -vt 0.843750 0.375000 -vt 0.875000 0.625000 -vt 0.843750 0.625000 -vt 0.875000 0.625000 -vt 0.843750 0.375000 -vt 0.843750 0.625000 -vt 1.000000 0.625000 -vt 0.875000 0.375000 -vt 0.843750 0.625000 -vt 0.875000 0.375000 -vt 0.843750 0.375000 -vt 0.875000 0.656250 -vt 1.000000 0.625000 -vt 0.875000 0.656250 -vt 1.000000 0.656250 -vt 0.187500 0.187500 -vt 0.500000 0.500000 -vt 0.500000 0.187500 -vt 0.187500 0.000000 -vt 0.500000 0.187500 -vt 0.500000 0.000000 -vt 0.187500 0.500000 -vt 0.500000 0.187500 -vt 0.500000 0.500000 -vt 0.187500 0.500000 -vt 0.000000 0.187500 -vt 0.000000 0.500000 -vt 0.000000 0.500000 -vt 0.187500 0.187500 -vt 0.500000 -0.000000 -vt 0.875000 0.656250 -vt 1.000000 0.625000 -vt 0.875000 0.625000 -vt 0.500000 0.937500 -vt 0.375000 0.687500 -vt 0.375000 0.937500 -vt 0.843750 0.375000 -vt 0.843750 0.625000 -vt 1.000000 0.625000 -vt 0.875000 0.656250 -vt 1.000000 0.656250 -vt 0.875000 0.625000 -vt 0.843750 0.375000 -vt 0.843750 0.625000 -vt 0.843750 0.375000 -vt 0.875000 0.625000 -vt 0.843750 0.625000 -vt 0.875000 0.375000 -vt 1.000000 0.625000 -vt 0.843750 0.625000 -vt 0.875000 0.375000 -vt 0.875000 0.625000 -vt 0.875000 0.656250 -vt 0.875000 0.656250 -vt 1.000000 0.625000 -vt 1.000000 0.656250 -vt 0.500000 0.500000 -vt 0.750000 0.250000 -vt 0.750000 0.500000 -vt 0.812500 0.250000 -vt 0.656250 0.000000 -vt 0.812500 0.000000 -vt 0.656250 0.250000 -vt 0.500000 0.000000 -vt 0.656250 0.000000 -vt 0.500000 0.250000 -vt 0.500000 0.000000 -vt 0.656250 0.250000 -vt 0.812500 0.000000 -vt 0.812500 0.250000 -vt 0.750000 0.250000 -vt 0.500000 0.500000 -vt 0.750000 0.500000 -vt 0.656250 0.000000 -vt 0.812500 0.250000 -vt 0.812500 0.000000 -vt 0.500000 0.000000 -vt 0.656250 0.250000 -vt 0.656250 0.000000 -vt 0.500000 0.250000 -vt 0.500000 0.000000 -vt 0.812500 0.000000 -vt 0.656250 0.250000 -vt 0.812500 0.250000 -vt 0.750000 0.250000 -vt 0.500000 0.500000 -vt 0.750000 0.500000 -vt 0.656250 0.000000 -vt 0.812500 0.250000 -vt 0.812500 0.000000 -vt 0.500000 0.000000 -vt 0.656250 0.250000 -vt 0.656250 0.000000 -vt 0.500000 0.250000 -vt 0.500000 0.000000 -vt 0.812500 0.000000 -vt 0.656250 0.250000 -vt 0.812500 0.250000 -vt 0.500000 0.500000 -vt 0.750000 0.250000 -vt 0.750000 0.500000 -vt 0.812500 0.250000 -vt 0.656250 0.000000 -vt 0.812500 0.000000 -vt 0.656250 0.250000 -vt 0.500000 0.000000 -vt 0.656250 0.000000 -vt 0.500000 0.250000 -vt 0.500000 0.000000 -vt 0.656250 0.250000 -vt 0.812500 0.000000 -vt 0.812500 0.250000 vt 0.500000 1.000000 -vt 0.812500 1.000000 -vt 0.812500 0.500000 vt 0.500000 0.656250 -vt 0.500000 1.000000 -vt 0.812500 1.000000 +vt 0.968750 0.656250 +vt 0.968750 1.000000 +vt 0.500000 0.500000 vt 0.812500 0.500000 -vt 0.500000 0.656250 +vt 0.500000 0.187500 +vt 0.187500 0.187500 vt 0.187500 0.500000 -vt 0.187500 0.187500 -vt 0.187500 0.187500 -vt -0.000000 0.187500 +vt 0.500000 0.000000 vt 0.187500 0.000000 +vt 0.000000 0.500000 +vt 0.000000 0.187500 +vt 0.875000 0.625000 +vt 1.000000 0.625000 vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.375000 0.937500 +vt 0.375000 0.687500 vt 0.500000 0.687500 -vt 0.875000 0.375000 -vt 0.875000 0.625000 -vt 0.875000 0.375000 -vt 1.000000 0.375000 -vt 0.875000 0.375000 -vt 1.000000 0.656250 -vt 0.875000 0.625000 -vt 0.187500 0.500000 -vt 0.187500 0.187500 -vt 0.187500 0.187500 -vt -0.000000 0.187500 -vt 0.187500 0.000000 -vt 1.000000 0.656250 -vt 0.500000 0.687500 -vt 0.875000 0.375000 -vt 0.875000 0.625000 -vt 0.875000 0.375000 -vt 1.000000 0.375000 -vt 0.875000 0.375000 -vt 1.000000 0.656250 -vt 0.875000 0.625000 -vt 0.187500 0.500000 -vt 0.187500 0.187500 -vt 0.187500 0.187500 -vt -0.000000 0.187500 -vt 0.187500 0.000000 -vt 1.000000 0.656250 -vt 0.500000 0.687500 -vt 0.875000 0.375000 -vt 0.875000 0.625000 -vt 0.875000 0.375000 -vt 1.000000 0.375000 -vt 0.875000 0.625000 -vt 1.000000 0.656250 -vt 0.875000 0.625000 -vt 0.187500 0.500000 -vt 0.187500 0.187500 -vt 0.187500 0.187500 -vt -0.000000 0.187500 -vt 0.187500 0.000000 -vt 1.000000 0.656250 -vt 0.500000 0.687500 -vt 0.875000 0.375000 -vt 0.875000 0.625000 -vt 0.875000 0.375000 -vt 1.000000 0.375000 +vt 0.500000 0.937500 +vt 0.843750 0.625000 vt 0.843750 0.375000 -vt 1.000000 0.656250 -vt 0.875000 0.625000 -vt 0.500000 0.250000 -vt 0.656250 0.250000 -vt 0.500000 0.250000 -vt 0.656250 0.250000 -vt 0.656250 0.000000 -vt 0.500000 0.250000 -vt 0.656250 0.250000 -vt 0.500000 0.250000 -vt 0.656250 0.250000 -vt 0.656250 0.000000 -vt 0.500000 0.250000 -vt 0.656250 0.250000 -vt 0.500000 0.250000 -vt 0.656250 0.250000 -vt 0.656250 0.000000 -vt 0.500000 0.250000 -vt 0.656250 0.250000 -vt 0.500000 0.250000 -vt 0.656250 0.250000 -vt 0.656250 0.000000 -vt 0.718750 0.468750 -vt 0.625000 0.375000 -vt 0.718750 0.375000 -vt 0.718750 0.468750 -vt 0.625000 0.375000 -vt 0.718750 0.375000 -vt 0.718750 0.468750 -vt 0.625000 0.375000 -vt 0.718750 0.375000 -vt 0.718750 0.468750 -vt 0.625000 0.375000 -vt 0.718750 0.375000 -vt 0.812500 0.375000 -vt 0.718750 0.375000 -vt 0.625000 0.375000 -vt 0.718750 0.468750 -vt 0.718750 0.375000 -vt 0.625000 0.375000 -vt 0.718750 0.468750 -vt 0.718750 0.375000 -vt 0.625000 0.375000 -vt 0.718750 0.468750 -vt 0.718750 0.375000 -vt 0.625000 0.375000 -vt 0.718750 0.468750 -vt 0.718750 0.375000 -vt 0.812500 0.375000 -vt 0.718750 0.375000 -vt 0.375000 0.000000 -vt 0.000000 0.125000 -vt 0.375000 0.125000 -vt 0.336167 0.218750 -vt 0.000000 0.218750 -vt 0.336167 0.125000 -vt -0.000000 0.000000 -vt 0.336167 0.000000 -vt 0.336167 0.218750 -vt 0.000000 0.125000 -vt 0.375000 0.125000 -vt 0.687500 0.125000 -vt 0.413832 0.218750 -vt 0.687500 0.125000 -vt 0.687500 0.218750 -vt 0.413833 0.218750 -vt 0.413832 0.000000 -vt 0.687500 0.125000 -vt 0.413833 0.125000 -vt 0.375000 0.000000 -vt 0.375000 0.125000 -vt 0.336167 0.218750 -vt 0.336167 0.125000 -vt 0.336167 0.000000 -vt 0.336167 0.218750 -vt 0.375000 0.125000 -vt 0.687500 0.125000 -vt 0.687500 0.125000 -vt 0.413832 0.218750 -vt 0.687500 0.218750 -vt 0.413833 0.218750 -vt 0.687500 0.125000 -vt 0.413832 0.000000 -vt 0.413833 0.125000 -vt 0.000000 0.125000 -vt 0.375000 0.000000 -vt 0.375000 0.125000 -vt 0.336167 0.218750 -vt 0.000000 0.218750 -vt -0.000000 0.000000 -vt 0.336167 0.125000 -vt 0.336167 0.000000 -vt 0.000000 0.125000 -vt 0.336167 0.218750 -vt 0.375000 0.125000 -vt 0.687500 0.125000 -vt 0.687500 0.125000 -vt 0.413832 0.218750 -vt 0.687500 0.218750 -vt 0.413833 0.218750 -vt 0.687500 0.125000 -vt 0.413832 0.000000 -vt 0.413833 0.125000 -vt 0.375000 0.000000 -vt 0.375000 0.125000 -vt 0.336167 0.218750 -vt 0.336167 0.125000 -vt 0.336167 0.000000 -vt 0.336167 0.218750 -vt 0.375000 0.125000 -vt 0.687500 0.125000 -vt 0.413832 0.218750 -vt 0.687500 0.125000 -vt 0.687500 0.218750 -vt 0.413833 0.218750 -vt 0.413832 0.000000 -vt 0.687500 0.125000 -vt 0.413833 0.125000 -vt 0.625000 0.468750 -vt 0.625000 0.468750 -vt 0.625000 0.468750 -vt 0.625000 0.468750 -vt 0.812500 0.468750 -vt 0.625000 0.468750 -vt 0.625000 0.468750 -vt 0.625000 0.468750 -vt 0.625000 0.468750 -vt 0.812500 0.468750 -vt -0.000000 0.000000 -vt 0.000000 0.125000 -vt 0.000000 0.218750 -vt 0.687500 0.000000 -vt 0.687500 0.218750 -vt 0.687500 0.000000 -vt 0.687500 0.000000 -vt 0.687500 0.218750 -vt 0.687500 0.000000 -vt -0.000000 0.000000 -vt 0.000000 0.125000 -vt 0.000000 0.218750 -vt 0.687500 0.000000 -vt 0.687500 0.218750 -vt 0.687500 0.000000 -vt 0.687500 0.000000 -vt 0.687500 0.218750 -vt 0.687500 0.000000 -vt 0.437500 1.000000 -vt 0.687500 0.562500 +vt 0.875000 0.375000 +vt 1.000000 0.375000 vt 0.687500 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.562500 +vt 0.687500 0.562500 +vt 0.312500 0.312500 vt 0.312500 0.562500 -vt 0.750000 0.312500 -vt 0.312500 0.312500 -vt 0.437500 1.000000 -vt 0.687500 0.562500 -vt 0.687500 1.000000 vt 0.750000 0.562500 -vt 0.312500 0.312500 vt 0.750000 0.312500 -vt 0.437500 0.562500 -vt 0.000000 1.000000 vt 0.000000 0.562500 vt 0.000000 1.000000 -vt 0.437500 0.562500 -vt 0.312500 0.000000 -vt 0.000000 0.562500 vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 1.000000 0.687500 vt 1.000000 1.000000 vt 0.687500 0.687500 -vt 1.000000 0.687500 -vt 0.312500 0.000000 -vt 0.000000 0.562500 -vt 0.000000 -0.000000 -vt 1.000000 1.000000 -vt 0.687500 0.687500 -vt 1.000000 0.687500 -vt 0.312500 0.000000 -vt 0.000000 0.562500 -vt 0.000000 -0.000000 -vt 0.312500 0.000000 -vt 0.000000 0.562500 -vt 0.000000 -0.000000 -vt 0.968750 0.687500 -vt 0.718750 0.562500 vt 0.968750 0.562500 vt 0.968750 0.687500 +vt 0.718750 0.687500 vt 0.718750 0.562500 -vt 0.968750 0.562500 -vt 0.968750 0.687500 -vt 0.718750 0.562500 -vt 0.968750 0.562500 -vt 0.968750 0.687500 -vt 0.718750 0.562500 -vt 0.968750 0.562500 -vt 0.968750 0.718750 -vt 0.718750 0.968750 vt 0.718750 0.718750 -vt 0.750000 0.312500 -vt 0.812500 0.562500 -vt 0.750000 0.562500 -vt 0.812500 0.312500 -vt 0.906250 0.562500 -vt 0.812500 0.562500 -vt 0.750000 0.312500 -vt 0.750000 0.562500 -vt 0.812500 0.562500 -vt 0.750000 0.312500 -vt 0.750000 0.562500 -vt 0.906250 0.562500 -vt 0.812500 0.312500 -vt 0.750000 0.562500 -vt 0.812500 0.312500 -vt 0.812500 0.562500 -vt 0.812500 0.562500 -vt 0.750000 0.312500 -vt 0.750000 0.562500 -vt 0.906250 0.562500 -vt 0.812500 0.312500 -vt 0.750000 0.562500 -vt 0.812500 0.312500 -vt 0.812500 0.562500 -vt 0.750000 0.312500 -vt 0.812500 0.562500 -vt 0.750000 0.562500 -vt 0.812500 0.312500 -vt 0.906250 0.562500 -vt 0.812500 0.312500 -vt 0.750000 0.562500 -vt 0.812500 0.562500 -vt 0.625000 0.000000 -vt 0.312500 0.312500 -vt 0.312500 0.000000 -vt 0.625000 0.000000 -vt 0.312500 0.312500 -vt 0.312500 0.000000 -vt 0.625000 0.000000 -vt 0.312500 0.312500 -vt 0.312500 0.000000 -vt 0.625000 0.312500 -vt 0.937500 0.000000 -vt 0.625000 -0.000000 -vt 0.937500 0.000000 -vt 0.625000 0.312500 -vt 0.625000 0.000000 -vt 0.937500 0.312500 -vt 0.625000 0.000000 -vt 0.625000 0.312500 -vt 0.312500 0.312500 -vt 0.625000 0.000000 -vt 0.312500 0.000000 -vt 0.312500 0.312500 -vt 0.625000 0.000000 -vt 0.312500 0.000000 -vt 0.312500 0.312500 -vt 0.625000 0.000000 -vt 0.312500 0.000000 -vt 0.937500 0.000000 -vt 0.625000 0.312500 -vt 0.625000 -0.000000 -vt 0.625000 0.312500 -vt 0.937500 0.000000 -vt 0.625000 0.000000 -vt 0.625000 0.000000 -vt 0.937500 0.312500 -vt 0.625000 0.312500 -vt 0.593750 0.031250 -vt 0.343750 0.281250 -vt 0.343750 0.031250 -vt 0.343750 0.281250 -vt 0.593750 0.031250 -vt 0.343750 0.031250 -vt 0.343750 0.281250 -vt 0.593750 0.031250 -vt 0.343750 0.031250 -vt 0.593750 0.031250 -vt 0.343750 0.281250 -vt 0.343750 0.031250 -vt 0.437500 0.562500 -vt 0.750000 0.562500 -vt 0.312500 0.562500 -vt 0.437500 1.000000 -vt 0.000000 0.562500 -vt 0.312500 0.562500 -vt 0.687500 1.000000 -vt 0.312500 0.562500 -vt 0.687500 1.000000 -vt 0.312500 0.562500 -vt 0.312500 0.562500 -vt 0.718750 0.687500 -vt 0.718750 0.687500 -vt 0.718750 0.687500 -vt 0.718750 0.687500 +vt 0.968750 0.718750 vt 0.968750 0.968750 -vt 0.906250 0.312500 +vt 0.718750 0.968750 vt 0.812500 0.312500 +vt 0.812500 0.562500 vt 0.906250 0.312500 -vt 0.750000 0.312500 -vt 0.906250 0.312500 -vt 0.750000 0.312500 -vt 0.906250 0.312500 -vt 0.750000 0.312500 +vt 0.906250 0.562500 +vt 0.625000 0.000000 vt 0.625000 0.312500 -vt 0.937500 0.312500 -vt 0.937500 0.312500 -vt 0.937500 0.000000 -vt 0.625000 0.312500 -vt 0.937500 0.312500 +vt 0.625000 -0.000000 vt 0.937500 0.312500 vt 0.937500 0.000000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.468750 +vt 0.750000 0.500000 +vt 0.500000 0.250000 +vt 0.750000 0.250000 +vt 0.812500 0.000000 +vt 0.812500 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.343750 0.031250 +vt 0.593750 0.031250 vt 0.593750 0.281250 -vt 0.593750 0.281250 -vt 0.593750 0.281250 -vt 0.593750 0.281250 -vt 0.312500 1.000000 -vt 0.125000 0.187500 -vt 0.312500 0.187500 -vt 0.875000 0.187500 -vt 0.687500 1.000000 -vt 0.687500 0.187500 -vt 0.125000 1.000000 -vt 0.312500 0.187500 -vt 0.312500 1.000000 -vt 0.687500 0.187500 -vt 0.875000 1.000000 -vt 0.687500 1.000000 -vt 0.125000 0.000000 -vt 0.312500 1.000000 -vt 0.312500 0.000000 -vt 0.125000 0.000000 -vt 0.312500 1.000000 -vt 0.312500 0.000000 -vt 0.312500 1.000000 -vt 0.125000 1.000000 -vt 0.312500 0.000000 -vt 0.312500 1.000000 -vt 0.125000 0.000000 -vt 0.312500 0.000000 -vt 0.125000 0.187500 -vt 0.312500 1.000000 -vt 0.312500 0.187500 -vt 0.687500 1.000000 -vt 0.875000 0.187500 -vt 0.687500 0.187500 -vt 0.312500 0.187500 -vt 0.125000 1.000000 -vt 0.312500 1.000000 -vt 0.875000 1.000000 -vt 0.687500 0.187500 -vt 0.687500 1.000000 -vt 0.312500 1.000000 -vt 0.125000 0.000000 -vt 0.312500 0.000000 -vt 0.312500 1.000000 -vt 0.125000 0.000000 -vt 0.312500 0.000000 -vt 0.125000 1.000000 -vt 0.312500 1.000000 -vt 0.312500 0.000000 -vt 0.125000 0.000000 -vt 0.312500 1.000000 -vt 0.312500 0.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.875000 1.000000 -vt 0.875000 1.000000 -vt 0.125000 0.187500 -vt 0.125000 0.187500 -vt 0.875000 0.187500 -vt 0.875000 0.187500 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 0.000000 -vt 0.125000 0.000000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 0.0000 -1.0000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -vn 1.0000 0.0000 0.0000 -vn -0.7071 -0.7071 0.0000 -vn 0.7071 0.7071 0.0000 -vn 0.7071 -0.7071 0.0000 -vn -0.7071 0.7071 0.0000 -vn 0.0000 0.9239 -0.3827 -vn 0.0000 0.9239 0.3827 -vn 0.0000 -0.9239 0.3827 -vn 0.0000 -0.9239 -0.3827 -vn 0.0000 -0.3827 -0.9239 -vn 0.0000 0.3827 0.9239 -vn 0.0000 -0.3827 0.9239 -vn 0.0000 0.3827 -0.9239 +vt 0.343750 0.281250 +vt 0.375000 0.125000 +vt 0.375000 0.000000 +vt 0.000000 0.125000 +vt 0.000000 0.218750 +vt 0.336167 0.218750 +vt 0.336167 0.000000 +vt 0.336167 0.125000 +vt 0.336167 0.218750 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.687500 0.218750 +vt 0.413832 0.218750 +vt 0.413833 0.218750 +vt 0.413833 0.125000 +vt 0.413832 0.000000 +s 0 usemtl Bogey_Piston -s off -f 2/1/1 3/2/1 1/3/1 -f 4/4/2 7/5/2 3/6/2 -f 6/7/3 1/3/3 5/8/3 -f 7/9/4 1/3/4 3/2/4 -f 4/10/5 6/11/5 8/12/5 -f 11/13/6 10/14/6 9/15/6 -f 15/16/2 12/17/2 11/18/2 -f 9/15/3 14/19/3 13/20/3 -f 9/15/4 15/21/4 11/13/4 -f 14/22/5 12/23/5 16/24/5 -f 18/25/1 19/26/1 17/27/1 -f 20/28/2 23/29/2 19/30/2 -f 24/31/6 21/32/6 23/33/6 -f 23/34/4 17/35/4 19/36/4 -f 20/37/5 22/38/5 24/31/5 -f 22/38/3 17/39/3 21/32/3 -f 32/40/5 26/41/5 30/42/5 -f 26/43/2 29/44/2 30/45/2 -f 30/42/1 31/46/1 32/47/1 -f 27/48/4 29/49/4 25/50/4 -f 28/51/6 25/52/6 26/53/6 -f 34/54/1 35/55/1 33/56/1 -f 36/57/3 39/58/3 35/55/3 -f 40/59/6 37/60/6 39/61/6 -f 39/58/5 33/62/5 35/55/5 -f 36/63/4 38/64/4 40/65/4 -f 43/66/6 42/67/6 41/68/6 -f 47/69/2 44/70/2 43/71/2 -f 45/72/1 48/73/1 47/74/1 -f 41/75/4 47/76/4 43/77/4 -f 46/78/5 44/79/5 48/73/5 -f 41/80/3 46/78/3 45/72/3 -f 50/81/5 56/82/5 54/83/5 -f 53/84/2 50/85/2 54/86/2 -f 55/87/6 54/83/6 56/88/6 -f 53/89/4 51/90/4 49/91/4 -f 49/92/1 52/93/1 50/94/1 -f 59/95/6 58/96/6 57/97/6 -f 63/98/3 60/99/3 59/95/3 -f 61/100/1 64/101/1 63/102/1 -f 57/103/5 63/98/5 59/95/5 -f 62/104/4 60/105/4 64/106/4 -f 67/107/1 66/108/1 65/109/1 -f 71/110/3 68/111/3 67/112/3 -f 69/113/6 72/114/6 71/115/6 -f 65/116/4 71/117/4 67/118/4 -f 70/119/5 68/120/5 72/114/5 -f 65/121/2 70/119/2 69/113/2 -f 74/122/5 80/123/5 78/124/5 -f 77/125/3 74/126/3 78/127/3 -f 79/128/1 78/124/1 80/129/1 -f 77/130/4 75/131/4 73/132/4 -f 73/133/6 76/134/6 74/135/6 -f 83/136/1 82/137/1 81/138/1 -f 87/139/2 84/140/2 83/136/2 -f 87/141/6 86/142/6 88/143/6 -f 81/144/5 87/139/5 83/136/5 -f 86/145/4 84/146/4 88/147/4 -f 90/148/6 91/149/6 89/150/6 -f 92/151/3 95/152/3 91/153/3 -f 96/154/1 93/155/1 95/156/1 -f 95/157/4 89/158/4 91/159/4 -f 92/160/5 94/161/5 96/154/5 -f 94/161/2 89/162/2 93/155/2 -f 104/163/5 98/164/5 102/165/5 -f 98/166/3 101/167/3 102/168/3 -f 102/165/6 103/169/6 104/170/6 -f 99/171/4 101/172/4 97/173/4 -f 100/174/1 97/175/1 98/176/1 -f 106/177/6 107/178/6 105/179/6 -f 108/180/2 111/181/2 107/178/2 -f 111/182/1 110/183/1 109/184/1 -f 111/181/5 105/185/5 107/178/5 -f 108/186/4 110/187/4 112/188/4 -f 202/189/6 203/190/6 201/191/6 -f 204/192/3 207/193/3 203/194/3 -f 206/195/2 201/196/2 205/197/2 -f 207/193/4 201/198/4 203/199/4 -f 204/200/5 206/201/5 208/202/5 -f 211/203/1 210/204/1 209/205/1 -f 215/206/3 212/207/3 211/208/3 -f 209/209/2 214/210/2 213/211/2 -f 209/212/4 215/206/4 211/213/4 -f 214/214/5 212/215/5 216/216/5 -f 219/217/6 218/218/6 217/219/6 -f 223/220/2 220/221/2 219/222/2 -f 217/223/3 222/224/3 221/225/3 -f 217/226/4 223/220/4 219/227/4 -f 222/228/5 220/229/5 224/230/5 -f 226/231/1 227/232/1 225/233/1 -f 228/234/2 231/235/2 227/236/2 -f 230/237/3 225/238/3 229/239/3 -f 231/235/4 225/240/4 227/241/4 -f 228/242/5 230/243/5 232/244/5 -f 2/1/1 4/245/1 3/2/1 -f 4/4/2 8/246/2 7/5/2 -f 6/7/3 2/1/3 1/3/3 -f 7/9/4 5/247/4 1/3/4 -f 4/10/5 2/248/5 6/11/5 -f 11/13/6 12/249/6 10/14/6 -f 15/16/2 16/250/2 12/17/2 -f 9/15/3 10/14/3 14/19/3 -f 9/15/4 13/251/4 15/21/4 -f 14/22/5 10/252/5 12/23/5 -f 18/25/1 20/253/1 19/26/1 -f 20/28/2 24/254/2 23/29/2 -f 24/31/6 22/38/6 21/32/6 -f 23/34/4 21/255/4 17/35/4 -f 20/37/5 18/256/5 22/38/5 -f 22/38/3 18/257/3 17/39/3 -f 32/40/5 28/258/5 26/41/5 -f 26/43/2 25/259/2 29/44/2 -f 30/42/1 29/260/1 31/46/1 -f 27/48/4 31/261/4 29/49/4 -f 28/51/6 27/262/6 25/52/6 -f 34/54/1 36/57/1 35/55/1 -f 36/57/3 40/263/3 39/58/3 -f 40/59/6 38/264/6 37/60/6 -f 39/58/5 37/265/5 33/62/5 -f 36/63/4 34/266/4 38/64/4 -f 43/66/6 44/267/6 42/67/6 -f 47/69/2 48/268/2 44/70/2 -f 45/72/1 46/78/1 48/73/1 -f 41/75/4 45/269/4 47/76/4 -f 46/78/5 42/270/5 44/79/5 -f 41/80/3 42/271/3 46/78/3 -f 50/81/5 52/272/5 56/82/5 -f 53/84/2 49/273/2 50/85/2 -f 55/87/6 53/274/6 54/83/6 -f 53/89/4 55/275/4 51/90/4 -f 49/92/1 51/276/1 52/93/1 -f 59/95/6 60/99/6 58/96/6 -f 63/98/3 64/277/3 60/99/3 -f 61/100/1 62/278/1 64/101/1 -f 57/103/5 61/279/5 63/98/5 -f 62/104/4 58/280/4 60/105/4 -f 67/107/1 68/281/1 66/108/1 -f 71/110/3 72/282/3 68/111/3 -f 69/113/6 70/119/6 72/114/6 -f 65/116/4 69/283/4 71/117/4 -f 70/119/5 66/284/5 68/120/5 -f 65/121/2 66/285/2 70/119/2 -f 74/122/5 76/286/5 80/123/5 -f 77/125/3 73/287/3 74/126/3 -f 79/128/1 77/288/1 78/124/1 -f 77/130/4 79/289/4 75/131/4 -f 73/133/6 75/290/6 76/134/6 -f 83/136/1 84/140/1 82/137/1 -f 87/139/2 88/291/2 84/140/2 -f 87/141/6 85/292/6 86/142/6 -f 81/144/5 85/293/5 87/139/5 -f 86/145/4 82/294/4 84/146/4 -f 90/148/6 92/295/6 91/149/6 -f 92/151/3 96/296/3 95/152/3 -f 96/154/1 94/161/1 93/155/1 -f 95/157/4 93/297/4 89/158/4 -f 92/160/5 90/298/5 94/161/5 -f 94/161/2 90/299/2 89/162/2 -f 104/163/5 100/300/5 98/164/5 -f 98/166/3 97/301/3 101/167/3 -f 102/165/6 101/302/6 103/169/6 -f 99/171/4 103/303/4 101/172/4 -f 100/174/1 99/304/1 97/175/1 -f 106/177/6 108/180/6 107/178/6 -f 108/180/2 112/305/2 111/181/2 -f 111/182/1 112/306/1 110/183/1 -f 111/181/5 109/307/5 105/185/5 -f 108/186/4 106/308/4 110/187/4 -f 202/189/6 204/309/6 203/190/6 -f 204/192/3 208/310/3 207/193/3 -f 206/195/2 202/311/2 201/196/2 -f 207/193/4 205/312/4 201/198/4 -f 204/200/5 202/313/5 206/201/5 -f 211/203/1 212/314/1 210/204/1 -f 215/206/3 216/315/3 212/207/3 -f 209/209/2 210/316/2 214/210/2 -f 209/212/4 213/317/4 215/206/4 -f 214/214/5 210/318/5 212/215/5 -f 219/217/6 220/319/6 218/218/6 -f 223/220/2 224/320/2 220/221/2 -f 217/223/3 218/321/3 222/224/3 -f 217/226/4 221/322/4 223/220/4 -f 222/228/5 218/323/5 220/229/5 -f 226/231/1 228/324/1 227/232/1 -f 228/234/2 232/325/2 231/235/2 -f 230/237/3 226/326/3 225/238/3 -f 231/235/4 229/327/4 225/240/4 -f 228/242/5 226/328/5 230/243/5 +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 3/5/2 4/6/2 8/2/2 7/1/2 +f 5/5/3 6/6/3 2/2/3 1/1/3 +f 3/4/4 7/7/4 5/8/4 1/1/4 +f 8/8/5 4/1/5 2/4/5 6/7/5 +f 9/1/6 11/4/6 12/3/6 10/2/6 +f 11/5/2 15/1/2 16/2/2 12/6/2 +f 13/5/3 9/1/3 10/2/3 14/6/3 +f 11/4/4 9/1/4 13/8/4 15/7/4 +f 16/8/5 14/7/5 10/4/5 12/1/5 +f 17/9/1 18/10/1 20/11/1 19/7/1 +f 19/12/2 20/13/2 24/10/2 23/9/2 +f 23/7/6 24/11/6 22/10/6 21/9/6 +f 19/14/4 23/11/4 21/10/4 17/15/4 +f 24/11/5 20/14/5 18/15/5 22/10/5 +f 21/9/3 22/10/3 18/13/3 17/12/3 +f 30/16/4 26/17/4 28/18/4 32/19/4 +f 30/20/3 29/21/3 25/22/3 26/23/3 +f 32/24/6 31/25/6 29/26/6 30/16/6 +f 25/18/5 29/19/5 31/16/5 27/17/5 +f 26/24/1 25/25/1 27/26/1 28/16/1 +f 33/24/1 34/25/1 36/26/1 35/16/1 +f 35/16/3 36/26/3 40/27/3 39/17/3 +f 39/24/6 40/25/6 38/26/6 37/16/6 +f 35/16/5 39/17/5 37/18/5 33/19/5 +f 40/18/4 36/19/4 34/16/4 38/17/4 +f 41/9/6 43/7/6 44/11/6 42/10/6 +f 43/12/2 47/9/2 48/10/2 44/13/2 +f 47/7/1 45/9/1 46/10/1 48/11/1 +f 43/14/4 41/15/4 45/10/4 47/11/4 +f 48/11/5 46/10/5 42/15/5 44/14/5 +f 45/9/3 41/12/3 42/13/3 46/10/3 +f 54/16/4 56/19/4 52/18/4 50/17/4 +f 54/20/3 50/23/3 49/22/3 53/21/3 +f 56/24/1 54/16/1 53/26/1 55/25/1 +f 49/18/5 51/17/5 55/16/5 53/19/5 +f 50/24/6 52/16/6 51/26/6 49/25/6 +f 57/24/6 59/16/6 60/26/6 58/25/6 +f 59/16/3 63/17/3 64/27/3 60/26/3 +f 63/24/1 61/16/1 62/26/1 64/25/1 +f 59/16/5 57/19/5 61/18/5 63/17/5 +f 64/18/4 62/17/4 58/16/4 60/19/4 +f 65/9/1 67/7/1 68/11/1 66/10/1 +f 67/12/3 71/9/3 72/10/3 68/13/3 +f 71/7/6 69/9/6 70/10/6 72/11/6 +f 67/14/4 65/15/4 69/10/4 71/11/4 +f 72/11/5 70/10/5 66/15/5 68/14/5 +f 69/9/2 65/12/2 66/13/2 70/10/2 +f 78/16/4 80/19/4 76/18/4 74/17/4 +f 78/20/2 74/23/2 73/22/2 77/21/2 +f 80/24/6 78/16/6 77/26/6 79/25/6 +f 73/18/5 75/17/5 79/16/5 77/19/5 +f 74/24/1 76/16/1 75/26/1 73/25/1 +f 81/24/1 83/16/1 84/26/1 82/25/1 +f 83/16/2 87/17/2 88/27/2 84/26/2 +f 87/24/6 85/16/6 86/26/6 88/25/6 +f 83/16/5 81/19/5 85/18/5 87/17/5 +f 88/18/4 86/17/4 82/16/4 84/19/4 +f 89/9/6 90/10/6 92/11/6 91/7/6 +f 91/12/3 92/13/3 96/10/3 95/9/3 +f 95/7/1 96/11/1 94/10/1 93/9/1 +f 91/14/4 95/11/4 93/10/4 89/15/4 +f 96/11/5 92/14/5 90/15/5 94/10/5 +f 93/9/2 94/10/2 90/13/2 89/12/2 +f 102/16/4 98/17/4 100/18/4 104/19/4 +f 102/20/2 101/21/2 97/22/2 98/23/2 +f 104/24/1 103/25/1 101/26/1 102/16/1 +f 97/18/5 101/19/5 103/16/5 99/17/5 +f 98/24/6 97/25/6 99/26/6 100/16/6 +f 105/24/6 106/25/6 108/26/6 107/16/6 +f 107/16/2 108/26/2 112/27/2 111/17/2 +f 111/24/1 112/25/1 110/26/1 109/16/1 +f 107/16/5 111/17/5 109/18/5 105/19/5 +f 112/18/4 108/19/4 106/16/4 110/17/4 +f 201/66/6 202/7/6 204/67/6 203/68/6 +f 203/69/3 204/70/3 208/71/3 207/72/3 +f 205/72/2 206/71/2 202/67/2 201/12/2 +f 203/12/4 207/72/4 205/71/4 201/67/4 +f 208/70/5 204/71/5 202/72/5 206/69/5 +f 209/66/1 211/68/1 212/67/1 210/7/1 +f 211/69/3 215/72/3 216/71/3 212/70/3 +f 213/72/2 209/12/2 210/67/2 214/71/2 +f 211/12/4 209/67/4 213/71/4 215/72/4 +f 216/70/5 214/69/5 210/72/5 212/71/5 +f 217/66/6 219/68/6 220/67/6 218/7/6 +f 219/69/2 223/72/2 224/71/2 220/70/2 +f 221/72/3 217/12/3 218/67/3 222/71/3 +f 219/12/4 217/67/4 221/71/4 223/72/4 +f 224/70/5 222/69/5 218/72/5 220/71/5 +f 225/66/1 226/7/1 228/67/1 227/68/1 +f 227/69/2 228/70/2 232/71/2 231/72/2 +f 229/72/3 230/71/3 226/67/3 225/12/3 +f 227/12/4 231/72/4 229/71/4 225/67/4 +f 232/70/5 228/71/5 226/72/5 230/69/5 usemtl wheel_Large -f 178/329/1 179/330/1 177/331/1 -f 180/332/2 183/333/2 179/334/2 -f 184/335/6 181/336/6 183/337/6 -f 182/338/3 177/339/3 181/340/3 -f 180/341/5 182/338/5 184/342/5 -f 195/343/1 194/344/1 193/345/1 -f 199/346/3 196/347/3 195/348/3 -f 197/349/6 200/350/6 199/351/6 -f 193/352/2 198/353/2 197/354/2 -f 198/353/5 196/355/5 200/356/5 -f 296/357/4 292/358/4 291/359/4 -f 299/360/3 292/358/3 289/361/3 -f 299/362/5 290/363/5 300/364/5 -f 300/365/2 293/366/2 296/367/2 -f 297/368/7 296/357/7 291/359/7 -f 300/369/2 298/370/2 295/371/2 -f 299/372/3 297/368/3 291/359/3 -f 300/373/8 294/374/8 299/375/8 -f 292/358/4 304/376/4 301/377/4 -f 292/358/3 307/378/3 289/361/3 -f 290/363/5 307/379/5 308/380/5 -f 293/366/2 308/381/2 304/382/2 -f 304/376/9 305/383/9 301/377/9 -f 306/384/2 308/385/2 303/386/2 -f 305/383/3 307/387/3 301/377/3 -f 302/388/10 308/389/10 307/390/10 -f 312/391/4 316/392/4 311/393/4 -f 312/391/2 319/394/2 309/395/2 -f 310/396/5 319/397/5 320/398/5 -f 313/399/3 320/400/3 316/401/3 -f 316/392/7 317/402/7 311/393/7 -f 318/403/3 320/404/3 315/405/3 -f 317/402/2 319/406/2 311/393/2 -f 314/407/8 320/408/8 319/409/8 -f 324/410/4 312/391/4 321/411/4 -f 327/412/2 312/391/2 309/395/2 -f 327/413/5 310/396/5 328/414/5 -f 328/415/3 313/399/3 324/416/3 -f 325/417/9 324/410/9 321/411/9 -f 328/418/3 326/419/3 323/420/3 -f 327/421/2 325/417/2 321/411/2 -f 328/422/10 322/423/10 327/424/10 -f 178/329/1 180/425/1 179/330/1 -f 180/332/2 184/426/2 183/333/2 -f 184/335/6 182/427/6 181/336/6 -f 182/338/3 178/428/3 177/339/3 -f 180/341/5 178/429/5 182/338/5 -f 195/343/1 196/430/1 194/344/1 -f 199/346/3 200/431/3 196/347/3 -f 197/349/6 198/432/6 200/350/6 -f 193/352/2 194/433/2 198/353/2 -f 198/353/5 194/434/5 196/355/5 -f 296/357/4 293/435/4 292/358/4 -f 299/360/3 291/359/3 292/358/3 -f 299/362/5 289/436/5 290/363/5 -f 300/365/2 290/437/2 293/366/2 -f 297/368/7 298/438/7 296/357/7 -f 300/369/2 296/367/2 298/370/2 -f 299/372/3 294/439/3 297/368/3 -f 300/373/8 295/440/8 294/374/8 -f 292/358/4 293/435/4 304/376/4 -f 292/358/3 301/377/3 307/378/3 -f 290/363/5 289/436/5 307/379/5 -f 293/366/2 290/437/2 308/381/2 -f 304/376/9 306/441/9 305/383/9 -f 306/384/2 304/382/2 308/385/2 -f 305/383/3 302/442/3 307/387/3 -f 302/388/10 303/443/10 308/389/10 -f 312/391/4 313/444/4 316/392/4 -f 312/391/2 311/393/2 319/394/2 -f 310/396/5 309/445/5 319/397/5 -f 313/399/3 310/446/3 320/400/3 -f 316/392/7 318/447/7 317/402/7 -f 318/403/3 316/401/3 320/404/3 -f 317/402/2 314/448/2 319/406/2 -f 314/407/8 315/449/8 320/408/8 -f 324/410/4 313/444/4 312/391/4 -f 327/412/2 321/411/2 312/391/2 -f 327/413/5 309/445/5 310/396/5 -f 328/415/3 310/446/3 313/399/3 -f 325/417/9 326/450/9 324/410/9 -f 328/418/3 324/416/3 326/419/3 -f 327/421/2 322/451/2 325/417/2 -f 328/422/10 323/452/10 322/423/10 +f 177/60/1 178/61/1 180/62/1 179/63/1 +f 179/60/2 180/61/2 184/62/2 183/63/2 +f 183/60/6 184/61/6 182/62/6 181/63/6 +f 181/60/3 182/61/3 178/62/3 177/63/3 +f 184/60/5 180/64/5 178/65/5 182/61/5 +f 193/60/1 195/63/1 196/62/1 194/61/1 +f 195/60/3 199/63/3 200/62/3 196/61/3 +f 199/60/6 197/63/6 198/62/6 200/61/6 +f 197/60/2 193/63/2 194/62/2 198/61/2 +f 200/60/5 198/61/5 194/65/5 196/64/5 +f 235/77/4 240/78/4 237/38/4 236/79/4 +f 233/80/3 243/81/3 235/77/3 236/79/3 +f 244/82/5 243/83/5 233/79/5 234/38/5 +f 240/77/2 244/84/2 234/80/2 237/79/2 +f 235/77/8 241/85/8 242/86/8 240/78/8 +f 239/87/2 244/88/2 240/77/2 242/85/2 +f 235/77/3 243/89/3 238/87/3 241/85/3 +f 243/90/9 244/91/9 239/86/9 238/85/9 +f 245/77/4 236/79/4 237/38/4 248/78/4 +f 233/80/3 236/79/3 245/77/3 251/81/3 +f 252/82/5 234/38/5 233/79/5 251/83/5 +f 248/77/2 237/79/2 234/80/2 252/84/2 +f 245/77/7 248/78/7 250/86/7 249/85/7 +f 247/87/2 250/85/2 248/77/2 252/88/2 +f 245/77/3 249/85/3 246/87/3 251/89/3 +f 251/90/10 246/85/10 247/86/10 252/91/10 +f 255/77/4 256/79/4 257/38/4 260/78/4 +f 253/80/2 256/79/2 255/77/2 263/81/2 +f 264/82/5 254/38/5 253/79/5 263/83/5 +f 260/77/3 257/79/3 254/80/3 264/84/3 +f 255/77/8 260/78/8 262/86/8 261/85/8 +f 259/87/3 262/85/3 260/77/3 264/88/3 +f 255/77/2 261/85/2 258/87/2 263/89/2 +f 263/90/9 258/85/9 259/86/9 264/91/9 +f 265/77/4 268/78/4 257/38/4 256/79/4 +f 253/80/2 271/81/2 265/77/2 256/79/2 +f 272/82/5 271/83/5 253/79/5 254/38/5 +f 268/77/3 272/84/3 254/80/3 257/79/3 +f 265/77/7 269/85/7 270/86/7 268/78/7 +f 267/87/3 272/88/3 268/77/3 270/85/3 +f 265/77/2 271/89/2 266/87/2 269/85/2 +f 271/90/10 272/91/10 267/86/10 266/85/10 usemtl Bogey_Body -f 114/453/1 115/454/1 113/455/1 -f 116/456/2 119/457/2 115/458/2 -f 120/459/6 117/460/6 119/461/6 -f 118/462/3 113/463/3 117/464/3 -f 119/465/4 113/466/4 115/467/4 -f 116/468/5 118/469/5 120/459/5 -f 122/470/1 123/471/1 121/472/1 -f 124/473/2 127/474/2 123/475/2 -f 128/476/6 125/477/6 127/478/6 -f 126/479/3 121/480/3 125/481/3 -f 127/482/4 121/483/4 123/484/4 -f 124/485/5 126/486/5 128/487/5 -f 130/488/1 131/489/1 129/490/1 -f 132/491/2 135/492/2 131/493/2 -f 136/494/6 133/495/6 135/496/6 -f 134/497/3 129/498/3 133/499/3 -f 132/500/5 134/501/5 136/502/5 -f 142/503/2 140/504/2 138/505/2 -f 143/506/9 139/507/9 140/504/9 -f 139/508/3 141/509/3 137/510/3 -f 148/511/2 150/512/2 146/513/2 -f 147/514/7 151/515/7 148/511/7 -f 145/516/3 152/517/3 147/518/3 -f 156/519/3 158/520/3 154/521/3 -f 155/522/9 159/523/9 156/519/9 -f 153/524/2 160/525/2 155/526/2 -f 166/527/3 164/528/3 162/529/3 -f 167/530/7 163/531/7 164/528/7 -f 168/532/2 161/533/2 163/534/2 -f 170/535/6 171/536/6 169/537/6 -f 172/538/3 175/539/3 171/540/3 -f 176/541/1 173/542/1 175/543/1 -f 174/544/2 169/545/2 173/546/2 -f 175/547/4 169/548/4 171/549/4 -f 172/550/5 174/551/5 176/552/5 -f 187/553/6 186/554/6 185/555/6 -f 191/556/2 188/557/2 187/558/2 -f 189/559/1 192/560/1 191/561/1 -f 185/562/3 190/563/3 189/564/3 -f 185/565/4 191/566/4 187/567/4 -f 190/568/5 188/569/5 192/570/5 -f 208/571/1 205/572/1 207/573/1 -f 213/574/6 216/575/6 215/576/6 -f 221/577/1 224/578/1 223/579/1 -f 232/580/6 229/581/6 231/582/6 -f 114/453/1 116/583/1 115/454/1 -f 116/456/2 120/584/2 119/457/2 -f 120/459/6 118/469/6 117/460/6 -f 118/462/3 114/585/3 113/463/3 -f 119/465/4 117/586/4 113/466/4 -f 116/468/5 114/587/5 118/469/5 -f 122/470/1 124/588/1 123/471/1 -f 124/473/2 128/589/2 127/474/2 -f 128/476/6 126/590/6 125/477/6 -f 126/479/3 122/591/3 121/480/3 -f 127/482/4 125/592/4 121/483/4 -f 124/485/5 122/593/5 126/486/5 -f 130/488/1 132/594/1 131/489/1 -f 132/491/2 136/595/2 135/492/2 -f 136/494/6 134/596/6 133/495/6 -f 134/497/3 130/597/3 129/498/3 -f 132/500/5 130/598/5 134/501/5 -f 142/503/2 143/506/2 140/504/2 -f 143/506/9 144/599/9 139/507/9 -f 139/508/3 144/600/3 141/509/3 -f 148/511/2 151/515/2 150/512/2 -f 147/514/7 152/601/7 151/515/7 -f 145/516/3 149/602/3 152/517/3 -f 156/519/3 159/523/3 158/520/3 -f 155/522/9 160/603/9 159/523/9 -f 153/524/2 157/604/2 160/525/2 -f 166/527/3 167/530/3 164/528/3 -f 167/530/7 168/605/7 163/531/7 -f 168/532/2 165/606/2 161/533/2 -f 170/535/6 172/607/6 171/536/6 -f 172/538/3 176/552/3 175/539/3 -f 176/541/1 174/544/1 173/542/1 -f 174/544/2 170/608/2 169/545/2 -f 175/547/4 173/609/4 169/548/4 -f 172/550/5 170/610/5 174/551/5 -f 187/553/6 188/611/6 186/554/6 -f 191/556/2 192/570/2 188/557/2 -f 189/559/1 190/563/1 192/560/1 -f 185/562/3 186/612/3 190/563/3 -f 185/565/4 189/613/4 191/566/4 -f 190/568/5 186/614/5 188/569/5 -f 208/571/1 206/615/1 205/572/1 -f 213/574/6 214/616/6 216/575/6 -f 221/577/1 222/617/1 224/578/1 -f 232/580/6 230/618/6 229/581/6 -usemtl Belts -f 235/619/11 234/620/11 233/621/11 -f 238/622/11 239/623/11 237/624/11 -f 242/625/12 243/626/12 241/627/12 -f 247/628/12 246/629/12 245/630/12 -f 254/631/5 251/632/5 253/633/5 -f 250/634/5 253/635/5 249/636/5 -f 257/637/5 260/638/5 259/639/5 -f 259/640/5 256/641/5 255/642/5 -f 262/643/13 263/644/13 261/645/13 -f 267/646/13 266/647/13 265/648/13 -f 271/649/14 270/650/14 269/651/14 -f 274/652/14 275/653/14 273/654/14 -f 279/655/4 282/656/4 281/657/4 -f 281/658/4 278/659/4 277/660/4 -f 288/661/4 285/662/4 287/663/4 -f 284/664/4 287/665/4 283/666/4 -f 234/620/15 261/645/15 233/621/15 -f 235/619/16 264/667/16 236/668/16 -f 234/620/6 264/667/6 262/643/6 -f 233/621/1 263/644/1 235/619/1 -f 237/624/15 266/647/15 238/622/15 -f 240/669/16 267/646/16 239/623/16 -f 238/622/1 268/670/1 240/669/1 -f 237/624/6 267/646/6 265/648/6 -f 241/627/17 270/650/17 242/625/17 -f 244/671/18 271/649/18 243/626/18 -f 242/625/6 272/672/6 244/671/6 -f 241/627/1 271/649/1 269/651/1 -f 246/629/17 273/654/17 245/630/17 -f 247/628/18 276/673/18 248/674/18 -f 246/629/1 276/673/1 274/652/1 -f 245/630/6 275/653/6 247/628/6 -f 253/635/1 277/660/1 249/636/1 -f 249/636/3 278/659/3 250/634/3 -f 254/631/6 280/675/6 252/676/6 -f 252/676/2 279/655/2 251/632/2 -f 251/632/1 281/657/1 253/633/1 -f 250/634/6 282/677/6 254/678/6 -f 255/642/6 287/665/6 259/640/6 -f 256/641/3 283/666/3 255/642/3 -f 258/679/1 288/661/1 260/638/1 -f 257/637/2 286/680/2 258/679/2 -f 259/639/6 285/662/6 257/637/6 -f 260/638/1 284/664/1 256/641/1 -f 235/619/11 236/668/11 234/620/11 -f 238/622/11 240/669/11 239/623/11 -f 242/625/12 244/671/12 243/626/12 -f 247/628/12 248/674/12 246/629/12 -f 254/631/5 252/676/5 251/632/5 -f 250/634/5 254/678/5 253/635/5 -f 257/637/5 258/679/5 260/638/5 -f 259/640/5 260/638/5 256/641/5 -f 262/643/13 264/667/13 263/644/13 -f 267/646/13 268/670/13 266/647/13 -f 271/649/14 272/672/14 270/650/14 -f 274/652/14 276/673/14 275/653/14 -f 279/655/4 280/675/4 282/656/4 -f 281/658/4 282/677/4 278/659/4 -f 288/661/4 286/680/4 285/662/4 -f 284/664/4 288/661/4 287/665/4 -f 234/620/15 262/643/15 261/645/15 -f 235/619/16 263/644/16 264/667/16 -f 234/620/6 236/668/6 264/667/6 -f 233/621/1 261/645/1 263/644/1 -f 237/624/15 265/648/15 266/647/15 -f 240/669/16 268/670/16 267/646/16 -f 238/622/1 266/647/1 268/670/1 -f 237/624/6 239/623/6 267/646/6 -f 241/627/17 269/651/17 270/650/17 -f 244/671/18 272/672/18 271/649/18 -f 242/625/6 270/650/6 272/672/6 -f 241/627/1 243/626/1 271/649/1 -f 246/629/17 274/652/17 273/654/17 -f 247/628/18 275/653/18 276/673/18 -f 246/629/1 248/674/1 276/673/1 -f 245/630/6 273/654/6 275/653/6 -f 253/635/1 281/658/1 277/660/1 -f 249/636/3 277/660/3 278/659/3 -f 254/631/6 282/656/6 280/675/6 -f 252/676/2 280/675/2 279/655/2 -f 251/632/1 279/655/1 281/657/1 -f 250/634/6 278/659/6 282/677/6 -f 255/642/6 283/666/6 287/665/6 -f 256/641/3 284/664/3 283/666/3 -f 258/679/1 286/680/1 288/661/1 -f 257/637/2 285/662/2 286/680/2 -f 259/639/6 287/663/6 285/662/6 -f 260/638/1 288/661/1 284/664/1 +f 113/28/1 114/29/1 116/30/1 115/31/1 +f 115/32/2 116/33/2 120/34/2 119/35/2 +f 119/28/6 120/29/6 118/30/6 117/31/6 +f 117/35/3 118/34/3 114/33/3 113/32/3 +f 115/36/4 119/30/4 117/29/4 113/37/4 +f 120/29/5 116/37/5 114/36/5 118/30/5 +f 121/38/1 122/39/1 124/33/1 123/36/1 +f 123/40/2 124/41/2 128/28/2 127/42/2 +f 127/38/6 128/39/6 126/33/6 125/36/6 +f 125/40/3 126/41/3 122/28/3 121/42/3 +f 123/38/4 127/39/4 125/33/4 121/36/4 +f 128/38/5 124/39/5 122/33/5 126/36/5 +f 129/43/1 130/44/1 132/45/1 131/46/1 +f 131/43/2 132/44/2 136/45/2 135/46/2 +f 135/43/6 136/44/6 134/45/6 133/46/6 +f 133/43/3 134/44/3 130/45/3 129/46/3 +f 136/47/5 132/48/5 130/49/5 134/50/5 +f 138/34/2 142/35/2 143/51/2 140/52/2 +f 140/52/7 143/51/7 144/53/7 139/54/7 +f 139/52/3 144/51/3 141/35/3 137/34/3 +f 146/34/2 148/52/2 151/51/2 150/35/2 +f 148/52/8 147/54/8 152/53/8 151/51/8 +f 147/52/3 145/34/3 149/35/3 152/51/3 +f 154/34/3 156/52/3 159/51/3 158/35/3 +f 156/52/7 155/54/7 160/53/7 159/51/7 +f 155/52/2 153/34/2 157/35/2 160/51/2 +f 162/34/3 166/35/3 167/51/3 164/52/3 +f 164/52/8 167/51/8 168/53/8 163/54/8 +f 163/52/2 168/51/2 165/35/2 161/34/2 +f 169/39/6 170/55/6 172/56/6 171/32/6 +f 171/39/3 172/55/3 176/56/3 175/32/3 +f 175/39/1 176/55/1 174/56/1 173/32/1 +f 173/57/2 174/56/2 170/58/2 169/59/2 +f 171/55/4 175/59/4 173/58/4 169/56/4 +f 176/56/5 172/58/5 170/59/5 174/55/5 +f 185/39/6 187/32/6 188/56/6 186/55/6 +f 187/39/2 191/32/2 192/56/2 188/55/2 +f 191/39/1 189/32/1 190/56/1 192/55/1 +f 189/57/3 185/59/3 186/58/3 190/56/3 +f 187/55/4 185/56/4 189/58/4 191/59/4 +f 192/56/5 190/55/5 186/59/5 188/58/5 +f 207/73/1 208/74/1 206/75/1 205/76/1 +f 215/73/6 213/76/6 214/75/6 216/74/6 +f 223/73/1 221/76/1 222/75/1 224/74/1 +f 231/73/6 232/74/6 230/75/6 229/76/6 diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.json b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.json new file mode 100644 index 0000000000..1dadf8e318 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/track/bogey/textures", + "loader": "forge:obj", + "flip_v": true, + "model": "create:models/block/track/bogey/bogey_drive_belt.obj" +} diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.mtl b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.mtl new file mode 100644 index 0000000000..11e3ef5de7 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.mtl @@ -0,0 +1,5 @@ +# Blender 4.3.2 MTL File: 'Bogey.blend' +# www.blender.org + +newmtl Belts +map_Kd #belt diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.obj b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.obj new file mode 100644 index 0000000000..d617907380 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.obj @@ -0,0 +1,130 @@ +# Blender 4.3.2 +# www.blender.org +mtllib bogey_drive_belt.mtl +o Cube.030 +v 0.500000 1.000000 -1.062500 +v 0.687500 1.000000 -1.062500 +v 0.500000 1.310930 -0.311848 +v 0.687500 1.310930 -0.311848 +v -0.500000 1.000000 -1.062500 +v -0.687500 1.000000 -1.062500 +v -0.500000 1.310930 -0.311848 +v -0.687500 1.310930 -0.311848 +v 0.500000 1.000000 1.062500 +v 0.687500 1.000000 1.062500 +v 0.500000 1.310930 0.311848 +v 0.687500 1.310930 0.311848 +v -0.500000 1.000000 1.062500 +v -0.687500 1.000000 1.062500 +v -0.500000 1.310930 0.311848 +v -0.687500 1.310930 0.311848 +v 0.500000 0.656250 0.939394 +v 0.687500 0.656250 0.939394 +v 0.500000 0.656250 -1.060606 +v 0.687500 0.656250 -1.060606 +v 0.500000 0.656250 -0.060606 +v 0.687500 0.656250 -0.060606 +v -0.500000 0.593750 0.939394 +v -0.687500 0.593750 0.939394 +v -0.500000 0.593750 -1.060606 +v -0.687500 0.593750 -1.060606 +v -0.500000 0.593750 -0.060606 +v -0.687500 0.593750 -0.060606 +v 0.500000 0.942259 -1.038583 +v 0.687500 0.942259 -1.038583 +v 0.500000 1.253189 -0.287931 +v 0.687500 1.253189 -0.287931 +v -0.500000 0.942259 -1.038583 +v -0.687500 0.942259 -1.038583 +v -0.500000 1.253189 -0.287931 +v -0.687500 1.253189 -0.287931 +v 0.500000 0.942259 1.038583 +v 0.687500 0.942259 1.038583 +v 0.500000 1.253189 0.287931 +v 0.687500 1.253189 0.287931 +v -0.500000 0.942259 1.038583 +v -0.687500 0.942259 1.038583 +v -0.500000 1.253189 0.287931 +v -0.687500 1.253189 0.287931 +v 0.500000 0.593750 0.939394 +v 0.687500 0.593750 0.939394 +v 0.500000 0.593750 -1.060606 +v 0.687500 0.593750 -1.060606 +v 0.500000 0.593750 -0.060606 +v 0.687500 0.593750 -0.060606 +v -0.500000 0.531250 0.939394 +v -0.687500 0.531250 0.939394 +v -0.500000 0.531250 -1.060606 +v -0.687500 0.531250 -1.060606 +v -0.500000 0.531250 -0.060606 +v -0.687500 0.531250 -0.060606 +vn -0.0000 0.9239 -0.3827 +vn -0.0000 0.9239 0.3827 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.9239 0.3827 +vn -0.0000 -0.9239 -0.3827 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.3827 -0.9239 +vn -0.0000 0.3827 0.9239 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.3827 0.9239 +vn -0.0000 0.3827 -0.9239 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vt 0.312500 0.187500 +vt 0.312500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.187500 +vt 0.687500 0.187500 +vt 0.875000 0.187500 +vt 0.875000 1.000000 +vt 0.687500 1.000000 +vt 0.312500 0.000000 +vt 0.125000 0.000000 +s 0 +usemtl Belts +f 1/1/1 3/2/1 4/3/1 2/4/1 +f 5/5/1 6/6/1 8/7/1 7/8/1 +f 9/2/2 10/3/2 12/4/2 11/1/2 +f 13/8/2 15/5/2 16/6/2 14/7/2 +f 21/9/3 22/10/3 20/3/3 19/2/3 +f 17/9/3 18/10/3 22/3/3 21/2/3 +f 27/9/3 25/2/3 26/10/3 28/3/3 +f 23/9/3 27/2/3 28/3/3 24/10/3 +f 29/1/4 30/4/4 32/3/4 31/2/4 +f 33/5/4 35/8/4 36/7/4 34/6/4 +f 37/2/5 39/1/5 40/4/5 38/3/5 +f 41/8/5 42/7/5 44/6/5 43/5/5 +f 49/9/6 47/2/6 48/3/6 50/10/6 +f 45/9/6 49/2/6 50/3/6 46/10/6 +f 55/9/6 56/3/6 54/10/6 53/2/6 +f 51/9/6 52/10/6 56/3/6 55/2/6 +f 1/1/7 2/4/7 30/4/7 29/1/7 +f 4/3/8 3/2/8 31/2/8 32/3/8 +f 2/4/9 4/3/9 32/3/9 30/4/9 +f 3/2/10 1/1/10 29/1/10 31/2/10 +f 6/6/7 5/5/7 33/5/7 34/6/7 +f 7/8/8 8/7/8 36/7/8 35/8/8 +f 8/7/10 6/6/10 34/6/10 36/7/10 +f 5/5/9 7/8/9 35/8/9 33/5/9 +f 10/3/11 9/2/11 37/2/11 38/3/11 +f 11/1/12 12/4/12 40/4/12 39/1/12 +f 12/4/9 10/3/9 38/3/9 40/4/9 +f 9/2/10 11/1/10 39/1/10 37/2/10 +f 13/8/11 14/7/11 42/7/11 41/8/11 +f 16/6/12 15/5/12 43/5/12 44/6/12 +f 14/7/10 16/6/10 44/6/10 42/7/10 +f 15/5/9 13/8/9 41/8/9 43/5/9 +f 17/9/10 21/2/10 49/2/10 45/9/10 +f 18/10/13 17/9/13 45/9/13 46/10/13 +f 20/3/9 22/10/9 50/10/9 48/3/9 +f 19/2/14 20/3/14 48/3/14 47/2/14 +f 21/9/10 19/2/10 47/2/10 49/9/10 +f 22/3/9 18/10/9 46/10/9 50/3/9 +f 27/2/9 23/9/9 51/9/9 55/2/9 +f 23/9/13 24/10/13 52/10/13 51/9/13 +f 28/3/10 26/10/10 54/10/10 56/3/10 +f 26/10/14 25/2/14 53/2/14 54/10/14 +f 25/2/9 27/9/9 55/9/9 53/2/9 +f 24/10/10 28/3/10 56/3/10 52/10/10 diff --git a/src/main/resources/assets/create/textures/block/bogey/belt_scroll.png b/src/main/resources/assets/create/textures/block/bogey/belt_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..b5fa3926f0d74e12a91819740a91b006cc0d4e30 GIT binary patch literal 291 zcmV+;0o?wHP)^T4c0GvrgK~#9!JdFjS!!Qg(oidr5`(O3T`P<4BJW*$!Bc{wb zb7Jlk)7{jYS#xRk9F)t&VqS+HyuFlb34&i2zUQRAJ*Swum2fSn%=ZJ|4HDl=qH;fK zYPdd$5&&>1=-#nXLd{fV3hFzb;2AC%j2O`WmFLG84OhO_r1x9FR6(m!D_~S&2IE@+ p Date: Thu, 6 Feb 2025 08:30:29 -0800 Subject: [PATCH 02/13] No more monkeys jumping on the belt - Import updated model from Kryppers to fix z-fighting and UV issues on bogey drive belts --- .../foundation/render/AllInstanceTypes.java | 4 +- .../block/track/bogey/bogey_drive_belt.obj | 46 +++++++++++-------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java index 811fe04cd1..da362b8a66 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllInstanceTypes.java @@ -88,8 +88,8 @@ public class AllInstanceTypes { }) .build(); - // TODO: Switch everything to this? Right now it's only used for bogey belts. - // It takes a decent few more bytes to represent but perhaps it can be packed + // TODO: Switch everything using SCROLLING to this? Right now this is only used for bogey belts. + // This takes a decent few more bytes to represent but perhaps it can be packed // down into 96 by sacrificing precision public static final InstanceType SCROLLING_TRANSFORMED = SimpleInstanceType.builder(ScrollTransformedInstance::new) .cullShader(asResource("instance/cull/scrolling_transformed.glsl")) diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.obj b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.obj index d617907380..7d2d467b45 100644 --- a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.obj +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_belt.obj @@ -82,6 +82,16 @@ vt 0.875000 1.000000 vt 0.687500 1.000000 vt 0.312500 0.000000 vt 0.125000 0.000000 +vt 0.187500 0.187500 +vt 0.187500 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.187500 +vt 0.812500 1.000000 +vt 0.812500 0.187500 +vt 0.750000 0.187500 +vt 0.750000 1.000000 +vt 0.250000 0.000000 +vt 0.187500 0.000000 s 0 usemtl Belts f 1/1/1 3/2/1 4/3/1 2/4/1 @@ -90,7 +100,7 @@ f 9/2/2 10/3/2 12/4/2 11/1/2 f 13/8/2 15/5/2 16/6/2 14/7/2 f 21/9/3 22/10/3 20/3/3 19/2/3 f 17/9/3 18/10/3 22/3/3 21/2/3 -f 27/9/3 25/2/3 26/10/3 28/3/3 +f 27/2/3 25/9/3 26/10/3 28/3/3 f 23/9/3 27/2/3 28/3/3 24/10/3 f 29/1/4 30/4/4 32/3/4 31/2/4 f 33/5/4 35/8/4 36/7/4 34/6/4 @@ -98,33 +108,33 @@ f 37/2/5 39/1/5 40/4/5 38/3/5 f 41/8/5 42/7/5 44/6/5 43/5/5 f 49/9/6 47/2/6 48/3/6 50/10/6 f 45/9/6 49/2/6 50/3/6 46/10/6 -f 55/9/6 56/3/6 54/10/6 53/2/6 +f 55/2/6 56/3/6 54/10/6 53/9/6 f 51/9/6 52/10/6 56/3/6 55/2/6 f 1/1/7 2/4/7 30/4/7 29/1/7 f 4/3/8 3/2/8 31/2/8 32/3/8 -f 2/4/9 4/3/9 32/3/9 30/4/9 -f 3/2/10 1/1/10 29/1/10 31/2/10 +f 2/11/9 4/12/9 32/3/9 30/4/9 +f 3/13/10 1/14/10 29/1/10 31/2/10 f 6/6/7 5/5/7 33/5/7 34/6/7 f 7/8/8 8/7/8 36/7/8 35/8/8 -f 8/7/10 6/6/10 34/6/10 36/7/10 -f 5/5/9 7/8/9 35/8/9 33/5/9 +f 8/15/10 6/16/10 34/6/10 36/7/10 +f 5/17/9 7/18/9 35/8/9 33/5/9 f 10/3/11 9/2/11 37/2/11 38/3/11 f 11/1/12 12/4/12 40/4/12 39/1/12 -f 12/4/9 10/3/9 38/3/9 40/4/9 -f 9/2/10 11/1/10 39/1/10 37/2/10 +f 12/11/9 10/12/9 38/3/9 40/4/9 +f 9/13/10 11/14/10 39/1/10 37/2/10 f 13/8/11 14/7/11 42/7/11 41/8/11 f 16/6/12 15/5/12 43/5/12 44/6/12 -f 14/7/10 16/6/10 44/6/10 42/7/10 -f 15/5/9 13/8/9 41/8/9 43/5/9 -f 17/9/10 21/2/10 49/2/10 45/9/10 +f 14/15/10 16/16/10 44/6/10 42/7/10 +f 15/17/9 13/18/9 41/8/9 43/5/9 +f 17/19/10 21/13/10 49/2/10 45/9/10 f 18/10/13 17/9/13 45/9/13 46/10/13 -f 20/3/9 22/10/9 50/10/9 48/3/9 +f 20/12/9 22/20/9 50/10/9 48/3/9 f 19/2/14 20/3/14 48/3/14 47/2/14 -f 21/9/10 19/2/10 47/2/10 49/9/10 -f 22/3/9 18/10/9 46/10/9 50/3/9 -f 27/2/9 23/9/9 51/9/9 55/2/9 +f 21/19/10 19/13/10 47/2/10 49/9/10 +f 22/12/9 18/20/9 46/10/9 50/3/9 +f 27/13/9 23/19/9 51/9/9 55/2/9 f 23/9/13 24/10/13 52/10/13 51/9/13 -f 28/3/10 26/10/10 54/10/10 56/3/10 +f 28/12/10 26/20/10 54/10/10 56/3/10 f 26/10/14 25/2/14 53/2/14 54/10/14 -f 25/2/9 27/9/9 55/9/9 53/2/9 -f 24/10/10 28/3/10 56/3/10 52/10/10 +f 25/13/9 27/19/9 55/9/9 53/2/9 +f 24/20/10 28/12/10 56/3/10 52/10/10 From d19a1b597decc01eac012a86182d58ace8ece5b0 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 6 Feb 2025 21:25:11 -0500 Subject: [PATCH 03/13] Invisi-Face - Fix culling issue with copycat panels - Add redstone lamps to the wrenchable tag --- .../decoration/copycat/CopycatPanelBlock.java | 19 +++---- .../data/CreateRegistrateTags.java | 52 +++++++++---------- 2 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelBlock.java b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelBlock.java index d52c089c8c..94898232a7 100644 --- a/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/copycat/CopycatPanelBlock.java @@ -54,7 +54,7 @@ public class CopycatPanelBlock extends WaterloggedCopycatBlock { @Override public BlockState prepareMaterial(Level pLevel, BlockPos pPos, BlockState pState, Player pPlayer, - InteractionHand pHand, BlockHitResult pHit, BlockState material) { + InteractionHand pHand, BlockHitResult pHit, BlockState material) { if (!CopycatSpecialCases.isTrapdoorMaterial(material)) return super.prepareMaterial(pLevel, pPos, pState, pPlayer, pHand, pHit, material); @@ -73,7 +73,7 @@ public class CopycatPanelBlock extends WaterloggedCopycatBlock { @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult ray) { + BlockHitResult ray) { if (!player.isShiftKeyDown() && player.mayBuild()) { ItemStack heldItem = player.getItemInHand(hand); @@ -90,7 +90,7 @@ public class CopycatPanelBlock extends WaterloggedCopycatBlock { @Override public boolean isIgnoredConnectivitySide(BlockAndTintGetter reader, BlockState state, Direction face, - BlockPos fromPos, BlockPos toPos) { + BlockPos fromPos, BlockPos toPos) { Direction facing = state.getValue(FACING); BlockState toState = reader.getBlockState(toPos); @@ -103,12 +103,12 @@ public class CopycatPanelBlock extends WaterloggedCopycatBlock { return facing == toState.getValue(FACING) .getOpposite() && !(coord != 0 && coord == facing.getAxisDirection() - .getStep()); + .getStep()); } @Override public boolean canConnectTexturesToward(BlockAndTintGetter reader, BlockPos fromPos, BlockPos toPos, - BlockState state) { + BlockState state) { Direction facing = state.getValue(FACING); BlockState toState = reader.getBlockState(toPos); @@ -164,11 +164,6 @@ public class CopycatPanelBlock extends WaterloggedCopycatBlock { return false; } - @Override - public boolean skipRendering(BlockState state, BlockState adjacentState, Direction direction) { - return state.equals(adjacentState) && direction.getAxis().isHorizontal(); - } - @Override public boolean supportsExternalFaceHiding(BlockState state) { return true; @@ -176,7 +171,7 @@ public class CopycatPanelBlock extends WaterloggedCopycatBlock { @Override public boolean hidesNeighborFace(BlockGetter level, BlockPos pos, BlockState state, BlockState neighborState, - Direction dir) { + Direction dir) { if (state.is(this) == neighborState.is(this)) { if (CopycatSpecialCases.isBarsMaterial(getMaterial(level, pos)) && CopycatSpecialCases.isBarsMaterial(getMaterial(level, pos.relative(dir)))) @@ -225,7 +220,7 @@ public class CopycatPanelBlock extends WaterloggedCopycatBlock { @Override public PlacementOffset getOffset(Player player, Level world, BlockState state, BlockPos pos, - BlockHitResult ray) { + BlockHitResult ray) { List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getLocation(), state.getValue(FACING) .getAxis(), diff --git a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java index dd90b22c21..934a62dcae 100644 --- a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java @@ -41,8 +41,8 @@ public class CreateRegistrateTags { prov.tag(AllBlockTags.BRITTLE.tag) .add(Blocks.BELL, Blocks.COCOA, Blocks.FLOWER_POT, Blocks.MOSS_CARPET, Blocks.BAMBOO_SAPLING, - Blocks.BIG_DRIPLEAF, Blocks.VINE, Blocks.TWISTING_VINES_PLANT, Blocks.TWISTING_VINES, - Blocks.WEEPING_VINES_PLANT, Blocks.WEEPING_VINES, Blocks.CAKE + Blocks.BIG_DRIPLEAF, Blocks.VINE, Blocks.TWISTING_VINES_PLANT, Blocks.TWISTING_VINES, + Blocks.WEEPING_VINES_PLANT, Blocks.WEEPING_VINES, Blocks.CAKE ) .addTag(AllBlockTags.CORALS.tag) .addTag(BlockTags.CAVE_VINES) @@ -75,8 +75,8 @@ public class CreateRegistrateTags { prov.tag(AllBlockTags.MOVABLE_EMPTY_COLLIDER.tag) .add(Blocks.COBWEB, Blocks.POWDER_SNOW, Blocks.TRIPWIRE, Blocks.TRIPWIRE_HOOK, Blocks.BAMBOO_SAPLING, - Blocks.VINE, Blocks.TWISTING_VINES_PLANT, Blocks.TWISTING_VINES, Blocks.WEEPING_VINES_PLANT, - Blocks.WEEPING_VINES + Blocks.VINE, Blocks.TWISTING_VINES_PLANT, Blocks.TWISTING_VINES, Blocks.WEEPING_VINES_PLANT, + Blocks.WEEPING_VINES ) .addTag(AllBlockTags.CORALS.tag) .addTag(BlockTags.CAVE_VINES) @@ -102,9 +102,9 @@ public class CreateRegistrateTags { .addTag(BlockTags.WOOL); prov.tag(AllBlockTags.WRENCH_PICKUP.tag) - .add(Blocks.REDSTONE_WIRE, Blocks.REDSTONE_TORCH, Blocks.REPEATER, Blocks.LEVER, - Blocks.COMPARATOR, Blocks.OBSERVER, Blocks.REDSTONE_WALL_TORCH, Blocks.PISTON, Blocks.STICKY_PISTON, - Blocks.TRIPWIRE, Blocks.TRIPWIRE_HOOK, Blocks.DAYLIGHT_DETECTOR, Blocks.TARGET, Blocks.HOPPER) + .add(Blocks.REDSTONE_WIRE, Blocks.REDSTONE_TORCH, Blocks.REPEATER, Blocks.LEVER, Blocks.REDSTONE_LAMP, + Blocks.COMPARATOR, Blocks.OBSERVER, Blocks.REDSTONE_WALL_TORCH, Blocks.PISTON, Blocks.STICKY_PISTON, + Blocks.TRIPWIRE, Blocks.TRIPWIRE_HOOK, Blocks.DAYLIGHT_DETECTOR, Blocks.TARGET, Blocks.HOPPER) .addTag(BlockTags.BUTTONS) .addTag(BlockTags.PRESSURE_PLATES) .addTag(BlockTags.RAILS); @@ -122,33 +122,33 @@ public class CreateRegistrateTags { ); prov.tag(AllBlockTags.ROOTS.tag) - .add(Blocks.MANGROVE_ROOTS); + .add(Blocks.MANGROVE_ROOTS); prov.tag(AllBlockTags.SUGAR_CANE_VARIANTS.tag) - .add(Blocks.SUGAR_CANE); + .add(Blocks.SUGAR_CANE); prov.tag(AllBlockTags.CORALS.tag) .add(Blocks.DEAD_TUBE_CORAL, Blocks.DEAD_BRAIN_CORAL, Blocks.DEAD_BUBBLE_CORAL, Blocks.DEAD_FIRE_CORAL, - Blocks.DEAD_HORN_CORAL, Blocks.TUBE_CORAL, Blocks.BRAIN_CORAL, Blocks.BUBBLE_CORAL, - Blocks.FIRE_CORAL, Blocks.HORN_CORAL, Blocks.DEAD_TUBE_CORAL_FAN, - Blocks.DEAD_BRAIN_CORAL_FAN, Blocks.DEAD_BUBBLE_CORAL_FAN, Blocks.DEAD_FIRE_CORAL_FAN, - Blocks.DEAD_HORN_CORAL_FAN, Blocks.TUBE_CORAL_FAN, Blocks.BRAIN_CORAL_FAN, - Blocks.BUBBLE_CORAL_FAN, Blocks.FIRE_CORAL_FAN, Blocks.HORN_CORAL_FAN, - Blocks.DEAD_TUBE_CORAL_WALL_FAN, Blocks.DEAD_BRAIN_CORAL_WALL_FAN, - Blocks.DEAD_BUBBLE_CORAL_WALL_FAN, Blocks.DEAD_FIRE_CORAL_WALL_FAN, - Blocks.DEAD_HORN_CORAL_WALL_FAN, Blocks.TUBE_CORAL_WALL_FAN, Blocks.BRAIN_CORAL_WALL_FAN, - Blocks.BUBBLE_CORAL_WALL_FAN, Blocks.FIRE_CORAL_WALL_FAN, Blocks.HORN_CORAL_WALL_FAN + Blocks.DEAD_HORN_CORAL, Blocks.TUBE_CORAL, Blocks.BRAIN_CORAL, Blocks.BUBBLE_CORAL, + Blocks.FIRE_CORAL, Blocks.HORN_CORAL, Blocks.DEAD_TUBE_CORAL_FAN, + Blocks.DEAD_BRAIN_CORAL_FAN, Blocks.DEAD_BUBBLE_CORAL_FAN, Blocks.DEAD_FIRE_CORAL_FAN, + Blocks.DEAD_HORN_CORAL_FAN, Blocks.TUBE_CORAL_FAN, Blocks.BRAIN_CORAL_FAN, + Blocks.BUBBLE_CORAL_FAN, Blocks.FIRE_CORAL_FAN, Blocks.HORN_CORAL_FAN, + Blocks.DEAD_TUBE_CORAL_WALL_FAN, Blocks.DEAD_BRAIN_CORAL_WALL_FAN, + Blocks.DEAD_BUBBLE_CORAL_WALL_FAN, Blocks.DEAD_FIRE_CORAL_WALL_FAN, + Blocks.DEAD_HORN_CORAL_WALL_FAN, Blocks.TUBE_CORAL_WALL_FAN, Blocks.BRAIN_CORAL_WALL_FAN, + Blocks.BUBBLE_CORAL_WALL_FAN, Blocks.FIRE_CORAL_WALL_FAN, Blocks.HORN_CORAL_WALL_FAN ); // COMPAT TagGen.addOptional(prov.tag(AllBlockTags.NON_MOVABLE.tag), Mods.IE, List.of( - "connector_lv", "connector_lv_relay", "connector_mv", "connector_mv_relay", - "connector_hv", "connector_hv_relay", "connector_bundled", "connector_structural", - "connector_redstone", "connector_probe", "breaker_switch")); + "connector_lv", "connector_lv_relay", "connector_mv", "connector_mv_relay", + "connector_hv", "connector_hv_relay", "connector_bundled", "connector_structural", + "connector_redstone", "connector_probe", "breaker_switch")); TagGen.addOptional(prov.tag(AllBlockTags.ROOTS.tag), Mods.TF, - List.of("root", "liveroot_block", "mangrove_root")); + List.of("root", "liveroot_block", "mangrove_root")); // VALIDATE @@ -185,7 +185,7 @@ public class CreateRegistrateTags { prov.tag(AllItemTags.UPRIGHT_ON_BELT.tag) .add(Items.GLASS_BOTTLE, Items.POTION, Items.SPLASH_POTION, Items.LINGERING_POTION, - Items.HONEY_BOTTLE, Items.CAKE); + Items.HONEY_BOTTLE, Items.CAKE); prov.tag(AllItemTags.CONTRAPTION_CONTROLLED.tag) .add(Items.BELL, Items.CAMPFIRE, Items.SOUL_CAMPFIRE, Items.DISPENSER, Items.DROPPER); @@ -222,8 +222,8 @@ public class CreateRegistrateTags { TagGen.addOptional(prov.tag(AllItemTags.AMETHYST.tag), Mods.GS, gsPalette("amethyst")); TagGen.addOptional(prov.tag(AllItemTags.UA_CORAL.tag), Mods.UA, List.of("acan_coral", - "finger_coral", "star_coral", "moss_coral", "petal_coral", "branch_coral", - "rock_coral", "pillow_coral", "chrome_coral", "silk_coral")); + "finger_coral", "star_coral", "moss_coral", "petal_coral", "branch_coral", + "rock_coral", "pillow_coral", "chrome_coral", "silk_coral")); // VALIDATE @@ -279,7 +279,7 @@ public class CreateRegistrateTags { helper.add(Mods.GOOD, "muddy_oak", "cypress"); helper.add(Mods.BMK, "blighted_balsa", "willow", "swamp_cypress", "ancient_oak"); helper.add(Mods.RU, "alpha", "ashen", "baobab", "blackwood", "brimwood", "cobalt", "cypress", "dead", "eucalyptus", "joshua", - "kapok", "larch", "magnolia", "maple","mauve", "palm", "pine", "redwood", "socotra", "willow"); + "kapok", "larch", "magnolia", "maple", "mauve", "palm", "pine", "redwood", "socotra", "willow"); TagGen.addOptional(logAppender, Mods.AUTUM, "maple"); From 5b05644243904d31e550ba8365cb3a660bf0a9fd Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 6 Feb 2025 22:22:40 -0500 Subject: [PATCH 04/13] Bad assumptions - Fix tag errors caused by assuming all mods have tags for their logs --- .../RuntimeDataGenerator.java | 37 +++++++++++++++---- .../foundation/events/CommonEvents.java | 2 +- 2 files changed, 31 insertions(+), 8 deletions(-) rename src/main/java/com/simibubi/create/foundation/{recipe => data}/RuntimeDataGenerator.java (78%) diff --git a/src/main/java/com/simibubi/create/foundation/recipe/RuntimeDataGenerator.java b/src/main/java/com/simibubi/create/foundation/data/RuntimeDataGenerator.java similarity index 78% rename from src/main/java/com/simibubi/create/foundation/recipe/RuntimeDataGenerator.java rename to src/main/java/com/simibubi/create/foundation/data/RuntimeDataGenerator.java index c39f1fbede..063ec448c2 100644 --- a/src/main/java/com/simibubi/create/foundation/recipe/RuntimeDataGenerator.java +++ b/src/main/java/com/simibubi/create/foundation/data/RuntimeDataGenerator.java @@ -1,23 +1,30 @@ -package com.simibubi.create.foundation.recipe; +package com.simibubi.create.foundation.data; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.jetbrains.annotations.ApiStatus; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import com.google.gson.JsonObject; +import com.mojang.serialization.JsonOps; import com.simibubi.create.Create; import com.simibubi.create.content.kinetics.saw.CuttingRecipe; import com.simibubi.create.content.processing.recipe.ProcessingRecipe; import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder; -import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder.DataGenResult; import com.simibubi.create.foundation.pack.DynamicPack; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagEntry; +import net.minecraft.tags.TagFile; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; @@ -25,6 +32,7 @@ import net.minecraft.world.item.Item; public class RuntimeDataGenerator { private static final Pattern STRIPPED_WOODS_REGEX = Pattern.compile("stripped_(\\w*)_(log|wood|stem|hyphae)"); private static final Pattern NON_STRIPPED_WOODS_REGEX = Pattern.compile("(?!stripped_)([a-z]+)_(log|wood|stem|hyphae)"); + private static final Multimap TAGS = HashMultimap.create(); private static final Object2ObjectOpenHashMap JSON_FILES = new Object2ObjectOpenHashMap<>(); public static void insertIntoPack(DynamicPack dynamicPack) { @@ -32,17 +40,22 @@ public class RuntimeDataGenerator { cuttingRecipes(itemId); Create.LOGGER.info("Created {} recipes which will be injected into the game", JSON_FILES.size()); - JSON_FILES.forEach(dynamicPack::put); + Create.LOGGER.info("Created {} tags which will be injected into the game", TAGS.size()); + for (Map.Entry> tags : TAGS.asMap().entrySet()) { + TagFile tagFile = new TagFile(new ArrayList<>(tags.getValue()), false); + dynamicPack.put(tags.getKey().withPrefix("tags/items/"), TagFile.CODEC.encodeStart(JsonOps.INSTANCE, tagFile).result().orElseThrow()); + } + JSON_FILES.clear(); JSON_FILES.trim(); + TAGS.clear(); } // logs/woods -> stripped variants // logs/woods both stripped and non stripped -> planks // planks -> stairs, slabs, fences, fence gates, doors, trapdoors, pressure plates, buttons and signs - // also adds stripped logs and woods into the create tag for those private static void cuttingRecipes(ResourceLocation itemId) { String path = itemId.getPath(); @@ -59,7 +72,8 @@ public class RuntimeDataGenerator { if (hasFoundMatch) { String type = match.group(2); - ResourceLocation base = itemId.withPath(match.group(1) + "_"); + ResourceLocation matched = itemId.withPath(match.group(1)); + ResourceLocation base = matched.withSuffix("_"); ResourceLocation nonStrippedId = base.withSuffix(type); ResourceLocation planksId = base.withSuffix("planks"); ResourceLocation stairsId = base.withSuffix("stairs"); @@ -75,8 +89,12 @@ public class RuntimeDataGenerator { if (!noStrippedVariant) { simpleWoodRecipe(nonStrippedId, itemId); simpleWoodRecipe(itemId, planksId, 6); - } else { - simpleWoodRecipe(TagKey.create(Registries.ITEM, nonStrippedId.withSuffix("s")), planksId, 6); + } else if (BuiltInRegistries.ITEM.containsKey(planksId)) { + ResourceLocation tag = Create.asResource("runtime_generated/compat/" + matched.getPath()); + insertIntoTag(tag, itemId); + insertIntoTag(tag, nonStrippedId); + + simpleWoodRecipe(TagKey.create(Registries.ITEM, tag), planksId, 6); } if (!path.contains("_wood") && !path.contains("_hyphae") && BuiltInRegistries.ITEM.containsKey(planksId)) { @@ -93,6 +111,11 @@ public class RuntimeDataGenerator { } } + private static void insertIntoTag(ResourceLocation tag, ResourceLocation itemId) { + if (BuiltInRegistries.ITEM.containsKey(itemId)) + TAGS.put(tag, TagEntry.optionalElement(itemId)); + } + private static void simpleWoodRecipe(ResourceLocation inputId, ResourceLocation outputId) { simpleWoodRecipe(inputId, outputId, 1); } diff --git a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java index b61ef115c0..788cf9c7ee 100644 --- a/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/foundation/events/CommonEvents.java @@ -16,10 +16,10 @@ import com.simibubi.create.content.kinetics.chainConveyor.ServerChainConveyorHan import com.simibubi.create.content.kinetics.drill.CobbleGenOptimisation; import com.simibubi.create.content.redstone.link.controller.LinkedControllerServerHandler; import com.simibubi.create.content.trains.entity.CarriageEntityHandler; +import com.simibubi.create.foundation.data.RuntimeDataGenerator; import com.simibubi.create.foundation.pack.DynamicPack; import com.simibubi.create.foundation.pack.DynamicPackSource; import com.simibubi.create.foundation.recipe.RecipeFinder; -import com.simibubi.create.foundation.recipe.RuntimeDataGenerator; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.TickBasedCache; import com.simibubi.create.infrastructure.command.AllCommands; From 75fd5a2a2635ea6661da76cc5eb3c94264198efa Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Thu, 6 Feb 2025 22:48:16 -0500 Subject: [PATCH 05/13] double fix fix mounted item vaults being openable, in two ways --- .../storage/item/menu/MountedStorageMenus.java | 9 +++++++-- .../logistics/vault/ItemVaultMountedStorage.java | 10 ++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/api/contraption/storage/item/menu/MountedStorageMenus.java b/src/main/java/com/simibubi/create/api/contraption/storage/item/menu/MountedStorageMenus.java index a939c8eee7..4da152b688 100644 --- a/src/main/java/com/simibubi/create/api/contraption/storage/item/menu/MountedStorageMenus.java +++ b/src/main/java/com/simibubi/create/api/contraption/storage/item/menu/MountedStorageMenus.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; +import org.jetbrains.annotations.Nullable; + import net.minecraft.network.chat.Component; import net.minecraft.world.Container; import net.minecraft.world.MenuProvider; @@ -13,9 +15,8 @@ import net.minecraft.world.inventory.ChestMenu; import net.minecraft.world.inventory.DispenserMenu; import net.minecraft.world.inventory.MenuConstructor; import net.minecraft.world.inventory.MenuType; -import net.minecraftforge.items.IItemHandlerModifiable; -import org.jetbrains.annotations.Nullable; +import net.minecraftforge.items.IItemHandlerModifiable; /** * Methods for creating generic menus usable by mounted storages. @@ -33,6 +34,10 @@ public class MountedStorageMenus { if (rows < 1 || rows > 6) return null; + // make sure rows are full + if (handler.getSlots() % 9 != 0) + return null; + MenuType type = GENERIC_CHEST_MENUS.get(rows - 1); Container wrapper = new StorageInteractionWrapper(handler, stillValid, onClose); MenuConstructor constructor = (id, inv, player) -> new ChestMenu(type, id, inv, wrapper, rows); diff --git a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java index 41044545a4..244c533f79 100644 --- a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java +++ b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultMountedStorage.java @@ -6,13 +6,17 @@ import com.mojang.serialization.Codec; import com.simibubi.create.AllMountedStorageTypes; import com.simibubi.create.api.contraption.storage.item.MountedItemStorageType; import com.simibubi.create.api.contraption.storage.item.WrapperMountedItemStorage; +import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.foundation.utility.CreateCodecs; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; + import net.minecraftforge.items.ItemStackHandler; public class ItemVaultMountedStorage extends WrapperMountedItemStorage { @@ -35,6 +39,12 @@ public class ItemVaultMountedStorage extends WrapperMountedItemStorage Date: Fri, 7 Feb 2025 11:11:12 +0100 Subject: [PATCH 06/13] Red light green light - Fixed trains not properly pathfinding to stations with an opposing signal just behind the destination - Chain Drives can now be crafted from zinc nuggets - Fixed address suggestions not reacting to scroll wheel in some HL screens - Fixed stations voiding schedules when disassembling the train - Fixed lighting on signal block indicators --- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 4 +-- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 4 ++- .../encased_chain_drive_from_zinc.json | 35 +++++++++++++++++++ .../encased_chain_drive_from_zinc.json | 21 +++++++++++ .../create/tags/blocks/wrench_pickup.json | 1 + .../factoryBoard/FactoryPanelScreen.java | 3 ++ .../logistics/filter/PackageFilterScreen.java | 7 ++++ .../logistics/packager/PackagerBlock.java | 2 ++ .../RedstoneRequesterScreen.java | 3 ++ .../content/trains/entity/Navigation.java | 2 +- .../content/trains/signal/SignalRenderer.java | 2 ++ .../trains/station/StationBlockEntity.java | 6 ++-- .../trains/station/StationEditPacket.java | 10 +++--- .../data/recipe/StandardRecipeGen.java | 6 ++++ 14 files changed, 94 insertions(+), 12 deletions(-) create mode 100644 src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/encased_chain_drive_from_zinc.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/encased_chain_drive_from_zinc.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 2b95a7969c..bb863db1b8 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-02-05T10:52:51.2144787 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-02-07T11:08:37.2051351 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -4710,7 +4710,7 @@ f02fc9781e8f0ae33ed3b98cf4f46ba6927c7ff8 data/create/tags/blocks/sugar_cane_vari 1b6977d9a399cf6ee042e3f8f5e64e4d3cda5489 data/create/tags/blocks/tree_attachments.json da739ad2160e7df4e0e5cc89587670ce5e9450c3 data/create/tags/blocks/valve_handles.json 72143286fb5cb372a0696550e2eac76ca50e6fbc data/create/tags/blocks/windmill_sails.json -30a54ad8eb06f2335705f5f01d12085ab4841dff data/create/tags/blocks/wrench_pickup.json +a109dab3eeeae64b2eb909ae1b5027716c5dd271 data/create/tags/blocks/wrench_pickup.json 76c0522664726c09461ad4565b6fba80b4f816b2 data/create/tags/entity_types/blaze_burner_capturable.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/create/tags/entity_types/ignore_seat.json 894e1e4fd1e32712abdda18ec64ab13750d3c039 data/create/tags/fluids/bottomless/allow.json diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index a966ecd3bf..5f2baf8e49 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2025-02-02T11:59:39.5980858 Create's Standard Recipes +// 1.20.1 2025-02-07T11:08:37.2861078 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -88,6 +88,7 @@ a85aecdec18802b97c23cf21f57e59bf71bfe690 data/create/advancements/recipes/misc/c 5eddf6af005751b5628d8bc032d064861c7070e0 data/create/advancements/recipes/misc/crafting/kinetics/elevator_pulley.json df55f1a1e16f8a1771b617acfeb22cb5991dbab0 data/create/advancements/recipes/misc/crafting/kinetics/empty_blaze_burner.json b0ec44a665cfcc180f5f6a534ef963f431f252d1 data/create/advancements/recipes/misc/crafting/kinetics/encased_chain_drive.json +dc29c1449cecf840e3c2db0f56884950cad7543c data/create/advancements/recipes/misc/crafting/kinetics/encased_chain_drive_from_zinc.json 82d47f9b54917def4ed1a73b4d90d98071d30341 data/create/advancements/recipes/misc/crafting/kinetics/encased_fan.json aae73187c99468804f57403864846116745d04a0 data/create/advancements/recipes/misc/crafting/kinetics/filter.json 8b85fc7d791aafac0b330d2a7820c71f80257cce data/create/advancements/recipes/misc/crafting/kinetics/fluid_pipe.json @@ -366,6 +367,7 @@ d26d0a2f3836bdc92f9c43913acac2a93d713976 data/create/recipes/crafting/kinetics/d 03bf164f5332018731ac6b216b4f50baed3211bd data/create/recipes/crafting/kinetics/elevator_pulley.json 59278e0e0e75eb1c0f926bc90e19edfda5993261 data/create/recipes/crafting/kinetics/empty_blaze_burner.json ca3e3063cdf135426e28d3474b5289ba1c5d9a1d data/create/recipes/crafting/kinetics/encased_chain_drive.json +1b470cc502f95473da205218bcf7ea1a2354ded2 data/create/recipes/crafting/kinetics/encased_chain_drive_from_zinc.json 7bb683f2398124b62595d6aa0afbdcde80acc028 data/create/recipes/crafting/kinetics/encased_fan.json 6c3a8f04e52a82c675c76963701244c78553cd32 data/create/recipes/crafting/kinetics/filter.json 871fae440820ae1145a86fe2d14a191b81bcd85f data/create/recipes/crafting/kinetics/fluid_pipe.json diff --git a/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/encased_chain_drive_from_zinc.json b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/encased_chain_drive_from_zinc.json new file mode 100644 index 0000000000..0fecd4f33d --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/misc/crafting/kinetics/encased_chain_drive_from_zinc.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "create:andesite_casing" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "create:crafting/kinetics/encased_chain_drive_from_zinc" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "create:crafting/kinetics/encased_chain_drive_from_zinc" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/encased_chain_drive_from_zinc.json b/src/generated/resources/data/create/recipes/crafting/kinetics/encased_chain_drive_from_zinc.json new file mode 100644 index 0000000000..500568d052 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/encased_chain_drive_from_zinc.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "create:andesite_casing" + }, + { + "tag": "forge:nuggets/zinc" + }, + { + "tag": "forge:nuggets/zinc" + }, + { + "tag": "forge:nuggets/zinc" + } + ], + "result": { + "item": "create:encased_chain_drive" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/wrench_pickup.json b/src/generated/resources/data/create/tags/blocks/wrench_pickup.json index ec5718f41d..7ca0a5284e 100644 --- a/src/generated/resources/data/create/tags/blocks/wrench_pickup.json +++ b/src/generated/resources/data/create/tags/blocks/wrench_pickup.json @@ -9,6 +9,7 @@ "minecraft:redstone_torch", "minecraft:repeater", "minecraft:lever", + "minecraft:redstone_lamp", "minecraft:comparator", "minecraft:observer", "minecraft:redstone_wall_torch", diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java index f693742cfa..a3caad6976 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelScreen.java @@ -591,6 +591,9 @@ public class FactoryPanelScreen extends AbstractSimiScreen { public boolean mouseScrolled(double mouseX, double mouseY, double pDelta) { int x = guiLeft; int y = guiTop; + + if (addressBox.mouseScrolled(mouseX, mouseY, pDelta)) + return true; if (craftingActive) return super.mouseScrolled(mouseX, mouseY, pDelta); diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java index be84cdc62c..f03e8503b6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java @@ -77,6 +77,13 @@ public class PackageFilterScreen extends AbstractFilterScreen public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { return super.mouseClicked(pMouseX, pMouseY, pButton); } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double delta) { + if (addressBox.mouseScrolled(mouseX, mouseY, delta)) + return true; + return super.mouseScrolled(mouseX, mouseY, delta); + } @Override public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java index a410e2b533..1879ed74ea 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlock.java @@ -95,6 +95,8 @@ public class PackagerBlock extends WrenchableDirectionalBlock implements IBE { if (be.heldBox.isEmpty()) { diff --git a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java index ee3461c601..1fb143ca79 100644 --- a/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/redstoneRequester/RedstoneRequesterScreen.java @@ -178,6 +178,9 @@ public class RedstoneRequesterScreen extends AbstractSimiContainerScreen { float renderTime = AnimationTickHolder.getRenderTime(be.getLevel()); if (signalState.isRedLight(renderTime)) CachedBuffers.partial(AllPartialModels.SIGNAL_ON, blockState) + .light(LightTexture.FULL_BLOCK) .renderInto(ms, buffer.getBuffer(RenderType.solid())); else CachedBuffers.partial(AllPartialModels.SIGNAL_OFF, blockState) diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java index 7bcf81695b..4c2bb4bd04 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationBlockEntity.java @@ -425,7 +425,7 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab if (!train.disassemble(getAssemblyDirection(), trackPosition.above())) return false; - dropSchedule(sender); + dropSchedule(sender, train); return true; } @@ -456,12 +456,10 @@ public class StationBlockEntity extends SmartBlockEntity implements ITransformab return true; } - public void dropSchedule(@Nullable ServerPlayer sender) { + public void dropSchedule(@Nullable ServerPlayer sender, @Nullable Train train) { GlobalStation station = getStation(); if (station == null) return; - - Train train = station.getPresentTrain(); if (train == null) return; diff --git a/src/main/java/com/simibubi/create/content/trains/station/StationEditPacket.java b/src/main/java/com/simibubi/create/content/trains/station/StationEditPacket.java index ca13624f99..abdb56db7f 100644 --- a/src/main/java/com/simibubi/create/content/trains/station/StationEditPacket.java +++ b/src/main/java/com/simibubi/create/content/trains/station/StationEditPacket.java @@ -92,9 +92,12 @@ public class StationEditPacket extends BlockEntityConfigurationPacket b.requires(I.andesiteCasing()) + .requires(I.zincNugget()) + .requires(I.zincNugget()) + .requires(I.zincNugget())), FLYWHEEL = create(AllBlocks.FLYWHEEL).unlockedByTag(I::brass) .viaShaped(b -> b.define('C', I.brass()) From 8003bfac364107e4b7588e8210b19f50c56246db Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 7 Feb 2025 11:50:20 +0100 Subject: [PATCH 07/13] Carbon copy - Written Filters, Clipboards and Schedules can now be copied onto unwritten ones in the crafting table --- .../82992cbf8f2794d83ac94034835eac0acd7915b9 | 3 +- .../crafting/curiosities/item_copying.json | 4 + .../com/simibubi/create/AllRecipeTypes.java | 4 +- .../clipboard/ClipboardBlockItem.java | 4 +- .../content/logistics/filter/FilterItem.java | 3 +- .../content/trains/schedule/ScheduleItem.java | 3 +- .../data/recipe/StandardRecipeGen.java | 1 + .../foundation/recipe/ItemCopyingRecipe.java | 103 ++++++++++++++++++ 8 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 src/generated/resources/data/create/recipes/crafting/curiosities/item_copying.json create mode 100644 src/main/java/com/simibubi/create/foundation/recipe/ItemCopyingRecipe.java diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 5f2baf8e49..450f76f1a1 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2025-02-07T11:08:37.2861078 Create's Standard Recipes +// 1.20.1 2025-02-07T11:36:36.6037564 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -336,6 +336,7 @@ bbf63119e3ee54afd49fe2ccfe2c06baaa9f6f41 data/create/recipes/crafting/appliances d0bad974476c54315e4b656c67dbf6165d183bbc data/create/recipes/crafting/appliances/tree_fertilizer.json 5b499ce4eee741d17813f96274333abfa2de99a9 data/create/recipes/crafting/curiosities/brown_toolbox.json 05eb422734dcdd4c499437ae564e73af5c2e4673 data/create/recipes/crafting/curiosities/cake.json +b961ce60986ebfed1b0cc0f7053d6e558de13e86 data/create/recipes/crafting/curiosities/item_copying.json c3444000827e1f9553818dedec6d3dba4af9dfcd data/create/recipes/crafting/curiosities/minecart_coupling.json 1323b7c6d30d4e343e010902b7ebbfa2590a4cf5 data/create/recipes/crafting/curiosities/peculiar_bell.json e54646485af774e490409e9912a3799f7ac44e01 data/create/recipes/crafting/curiosities/toolbox_dyeing.json diff --git a/src/generated/resources/data/create/recipes/crafting/curiosities/item_copying.json b/src/generated/resources/data/create/recipes/crafting/curiosities/item_copying.json new file mode 100644 index 0000000000..81fc0b7fd6 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/curiosities/item_copying.json @@ -0,0 +1,4 @@ +{ + "type": "create:item_copying", + "category": "misc" +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllRecipeTypes.java b/src/main/java/com/simibubi/create/AllRecipeTypes.java index 3962526ffe..e8540ed470 100644 --- a/src/main/java/com/simibubi/create/AllRecipeTypes.java +++ b/src/main/java/com/simibubi/create/AllRecipeTypes.java @@ -27,6 +27,7 @@ import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder.Pro import com.simibubi.create.content.processing.recipe.ProcessingRecipeSerializer; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipeSerializer; import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; +import com.simibubi.create.foundation.recipe.ItemCopyingRecipe; import net.createmod.catnip.lang.Lang; import net.minecraft.core.registries.Registries; @@ -64,7 +65,8 @@ public enum AllRecipeTypes implements IRecipeTypeInfo { MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new), SEQUENCED_ASSEMBLY(SequencedAssemblyRecipeSerializer::new), - TOOLBOX_DYEING(() -> new SimpleCraftingRecipeSerializer<>(ToolboxDyeingRecipe::new), () -> RecipeType.CRAFTING, false); + TOOLBOX_DYEING(() -> new SimpleCraftingRecipeSerializer<>(ToolboxDyeingRecipe::new), () -> RecipeType.CRAFTING, false), + ITEM_COPYING(() -> new SimpleCraftingRecipeSerializer<>(ItemCopyingRecipe::new), () -> RecipeType.CRAFTING, false); public static final Predicate> CAN_BE_AUTOMATED = r -> !r.getId() .getPath() diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java index 9f3314a2a6..9aae35a44c 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.equipment.clipboard; import javax.annotation.Nonnull; +import com.simibubi.create.foundation.recipe.ItemCopyingRecipe.SupportsItemCopying; + import net.createmod.catnip.gui.ScreenOpener; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -21,7 +23,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.items.ItemHandlerHelper; -public class ClipboardBlockItem extends BlockItem { +public class ClipboardBlockItem extends BlockItem implements SupportsItemCopying { public ClipboardBlockItem(Block pBlock, Properties pProperties) { super(pBlock, pProperties); diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java index 4eaf0b9b70..eefe7dd387 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java @@ -15,6 +15,7 @@ import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.recipe.ItemCopyingRecipe.SupportsItemCopying; import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; @@ -43,7 +44,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.network.NetworkHooks; -public class FilterItem extends Item implements MenuProvider { +public class FilterItem extends Item implements MenuProvider, SupportsItemCopying { private FilterType type; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java index 4c7281342f..6eb4740bc3 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java @@ -10,6 +10,7 @@ import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.content.trains.schedule.destination.DestinationInstruction; import com.simibubi.create.foundation.advancement.AllAdvancements; +import com.simibubi.create.foundation.recipe.ItemCopyingRecipe.SupportsItemCopying; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.data.Couple; @@ -36,7 +37,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkHooks; -public class ScheduleItem extends Item implements MenuProvider { +public class ScheduleItem extends Item implements MenuProvider, SupportsItemCopying { public ScheduleItem(Properties pProperties) { super(pProperties); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index b5186abb56..cae3b12513 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -202,6 +202,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern(" L ")), TOOLBOX_DYEING = createSpecial(AllRecipeTypes.TOOLBOX_DYEING::getSerializer, "crafting", "toolbox_dyeing"), + ITEM_COPYING = createSpecial(AllRecipeTypes.ITEM_COPYING::getSerializer, "crafting", "item_copying"), MINECART_COUPLING = create(AllItems.MINECART_COUPLING).unlockedBy(I::andesiteAlloy) .viaShaped(b -> b.define('E', I.andesiteAlloy()) diff --git a/src/main/java/com/simibubi/create/foundation/recipe/ItemCopyingRecipe.java b/src/main/java/com/simibubi/create/foundation/recipe/ItemCopyingRecipe.java new file mode 100644 index 0000000000..8779ee0170 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/recipe/ItemCopyingRecipe.java @@ -0,0 +1,103 @@ +package com.simibubi.create.foundation.recipe; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllRecipeTypes; + +import net.createmod.catnip.data.IntAttached; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.Level; + +public class ItemCopyingRecipe extends CustomRecipe { + + public static interface SupportsItemCopying { + + public default ItemStack createCopy(ItemStack original, int count) { + ItemStack copyWithCount = original.copyWithCount(count); + copyWithCount.removeTagKey("Enchantments"); + return copyWithCount; + } + + public default boolean canCopyFromItem(ItemStack item) { + return item.hasTag(); + } + + public default boolean canCopyToItem(ItemStack item) { + return !item.hasTag(); + } + + } + + public ItemCopyingRecipe(ResourceLocation id, CraftingBookCategory category) { + super(id, category); + } + + @Override + public boolean matches(CraftingContainer inv, Level level) { + return copyCheck(inv) != null; + } + + @Override + public ItemStack assemble(CraftingContainer container, RegistryAccess registryAccess) { + IntAttached copyCheck = copyCheck(container); + if (copyCheck == null) + return ItemStack.EMPTY; + + ItemStack itemToCopy = copyCheck.getValue(); + if (!(itemToCopy.getItem() instanceof SupportsItemCopying sic)) + return ItemStack.EMPTY; + + return sic.createCopy(itemToCopy, copyCheck.getFirst() + 1); + } + + @Nullable + private IntAttached copyCheck(CraftingContainer inv) { + ItemStack itemToCopy = ItemStack.EMPTY; + int copyTargets = 0; + + for (int j = 0; j < inv.getContainerSize(); ++j) { + ItemStack itemInSlot = inv.getItem(j); + if (itemInSlot.isEmpty()) + continue; + if (!itemToCopy.isEmpty() && itemToCopy.getItem() != itemInSlot.getItem()) + return null; + if (!(itemInSlot.getItem() instanceof SupportsItemCopying sic)) + continue; + + if (sic.canCopyFromItem(itemInSlot)) { + if (!itemToCopy.isEmpty()) + return null; + itemToCopy = itemInSlot; + continue; + } + + if (sic.canCopyToItem(itemInSlot)) + copyTargets++; + } + + if (itemToCopy.isEmpty() || copyTargets == 0) + return null; + + return IntAttached.with(copyTargets, itemToCopy); + } + + public NonNullList getRemainingItems(CraftingContainer inv) { + NonNullList nonnulllist = NonNullList.withSize(inv.getContainerSize(), ItemStack.EMPTY); + return nonnulllist; + } + + public RecipeSerializer getSerializer() { + return AllRecipeTypes.ITEM_COPYING.getSerializer(); + } + + public boolean canCraftInDimensions(int width, int height) { + return width >= 2 && height >= 2; + } +} From 728efc0a84846b325c5caaec501100c1f0319113 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 7 Feb 2025 13:02:02 +0100 Subject: [PATCH 08/13] Tunes and Tuning - Fixed factory gauge place and break sounds not always playing - Factory gauges can now be clicked like links to copy the logistics frequency - Factory gauges now show an outline when the held item is on the same network - Update changelog --- changelog.md | 14 +++++++- .../2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 ++-- .../resources/assets/create/lang/en_ud.json | 2 +- .../resources/assets/create/lang/en_us.json | 2 +- .../factoryBoard/FactoryPanelBehaviour.java | 17 +++++++++- .../factoryBoard/FactoryPanelBlockEntity.java | 18 +++++++++- .../LogisticallyLinkedBlockItem.java | 18 ++++++---- .../LogisticallyLinkedClientHandler.java | 33 +++++++++++++++++-- .../assets/create/lang/default/interface.json | 2 +- 9 files changed, 94 insertions(+), 18 deletions(-) diff --git a/changelog.md b/changelog.md index a8010ac4f8..e3b3314e4b 100644 --- a/changelog.md +++ b/changelog.md @@ -46,6 +46,7 @@ _Now using Flywheel 1.0_ - All links now use a new ingredient item, the transmitter - New advancement chain for high logistics components - New ponder scenes and category for high logistics components +- Tracks and Trains now have special integration with FTBChunks and Journeymap - Depots can now be used as storage blocks on contraptions - Brass tunnels now try to distribute an item more quickly when it first arrives - Brass tunnels now always prefer filtered sides over non-filtered sides @@ -55,6 +56,7 @@ _Now using Flywheel 1.0_ - In common cobblegen scenarios, stationary drills now skip breaking blocks and just insert the result items into open inventories directly below - Held clipboards can now copy entries from other in-world clipboards +- Filters, Clipboards and Schedules can now be copyied in the crafting table - Metal ladders no longer require a wall if another ladder block is above them - Bells assembled to elevator contraptions now activate when arriving at a floor - Sliding doors placed in front of contraption-mounted sliding doors now open and close automatically @@ -68,6 +70,13 @@ _Now using Flywheel 1.0_ - Wood cutting recipes in mechanical saws - Added pressing recipes for coarse dirt and rooted dirt which both produce dirt paths (#7186) - Updated JEI integration and added potion fluids to the JEI sidebar (#6934) +- Chain Drives can now be crafted from zinc nuggets +- Redstone lamps can now be picked up with the wrench +- New compatibility recipes for Immersive Engineering +- Added missing deploying recipes for copper oxidisation +- Framed and tiled glass panes can now be obtained via stonecutting +- Schematicannon on 'replace blocks with empty' now send block updates at the edges after printing +- The player hitbox used in contraption collision is now slightly shorter #### Bug Fixes @@ -98,7 +107,6 @@ _Now using Flywheel 1.0_ - Fixed mechanical arm interactions with jukeboxes (#5902) - Fixed toolboxes not giving a comparator output signal (#6973) - Fixed copper slabs and stairs being missing from the respective tags (#3080) -- Fix incorrect copycat panel culling when framed glass is used and sodium is installed (Fabricators-of-Create#1540) - Fixed Fix waterlogged bracketed kinetics dropping the bracket (Fabricators-of-Create#1552) - Switched away from using streams in ContraptionCollider fixing a rare crash (#5043) - Fixed pumps not placing fluids into flowing fluids of the same type (#5884) @@ -116,6 +124,10 @@ _Now using Flywheel 1.0_ - Fixed inability to mill cactus when Quark is installed (#7215) - Fixed rare spout crash and offset rendering (#7025) - Fixed deploying food resulting in missing particles and not returning the correct items (#7288) +- Fixed trains not properly pathfinding to stations with an opposing signal just behind the destination +- Fixed stations voiding schedules when disassembling the train +- Fixed lighting on signal block indicators +- Fixed vaults and tanks rotated in place not updating their multiblock correctly #### API Changes diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index bb863db1b8..d8598e8eff 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-02-07T11:08:37.2051351 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-02-07T13:00:03.1304237 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -9f35559111bddd06b79d4039fa2651087d656405 assets/create/lang/en_ud.json -39193b3c803b9e09f14b63d8ad6c00b700505d6e assets/create/lang/en_us.json +cae329ccc1187f88b752581c198792b925b44d4a assets/create/lang/en_ud.json +4943bb06d6be669ac498b1be5902794098aa1c0c assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index fdb7ea4cb7..eb14dbead3 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1529,7 +1529,7 @@ "create.logistically_linked.protected": "pǝʇɔǝʇoɹԀ sı ʞɹoʍʇǝN sɔıʇsıboꞀ", "create.logistically_linked.tooltip": "pǝɹnbıɟuoɔ ʎɔuǝnbǝɹℲ", "create.logistically_linked.tooltip_clear": "ʇǝsǝɹ oʇ pıɹb buıʇɟɐɹɔ uı ǝɔɐןԀ", - "create.logistically_linked.tuned": "ʞuıן sıɥʇ oʇ pǝun⟘", + "create.logistically_linked.tuned": "ʞɹoʍʇǝu sıɥʇ oʇ pǝun⟘", "create.logistics.crafter.click_to_merge": "sǝıɹoʇuǝʌuI ǝbɹǝɯ oʇ ʞɔıןƆ", "create.logistics.crafter.click_to_separate": "sǝıɹoʇuǝʌuI ǝʇɐɹɐdǝs oʇ ʞɔıןƆ", "create.logistics.crafter.connected": "sɹǝʇɟɐɹƆ pǝʇɔǝuuoƆ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 96db58c185..b11b7e1496 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1529,7 +1529,7 @@ "create.logistically_linked.protected": "Logistics Network is Protected", "create.logistically_linked.tooltip": "Frequency configured", "create.logistically_linked.tooltip_clear": "Place in crafting grid to reset", - "create.logistically_linked.tuned": "Tuned to this link", + "create.logistically_linked.tuned": "Tuned to this network", "create.logistics.crafter.click_to_merge": "Click to merge Inventories", "create.logistics.crafter.click_to_separate": "Click to separate Inventories", "create.logistics.crafter.connected": "Connected Crafters", diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index fd43758df9..185f2893e4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -31,6 +31,8 @@ import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.packager.PackagerBlockEntity; import com.simibubi.create.content.logistics.packager.PackagingRequest; import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBehaviour.RequestType; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedBlockItem; +import com.simibubi.create.content.logistics.packagerLink.LogisticallyLinkedClientHandler; import com.simibubi.create.content.logistics.packagerLink.LogisticsManager; import com.simibubi.create.content.logistics.packagerLink.RequestPromise; import com.simibubi.create.content.logistics.packagerLink.RequestPromiseQueue; @@ -277,6 +279,8 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { tickStorageMonitor(); bulb.updateChaseTarget(redstonePowered || satisfied ? 1 : 0); bulb.tickChaser(); + if (active) + tickOutline(); return; } @@ -345,7 +349,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { && promisedSatisfied == shouldPromiseSatisfy && waitingForNetwork == shouldWait) return; - if (!satisfied && shouldSatisfy) { + if (!satisfied && shouldSatisfy && demand > 0) { AllSoundEvents.CONFIRM.playOnServer(getWorld(), getPos(), 0.075f, 1f); AllSoundEvents.CONFIRM_2.playOnServer(getWorld(), getPos(), 0.125f, 0.575f); } @@ -576,6 +580,13 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { super.onShortInteract(player, hand, side, hitResult); return; } + + ItemStack heldItem = player.getItemInHand(hand); + if (heldItem.getItem() instanceof LogisticallyLinkedBlockItem) { + if (!player.level().isClientSide) + LogisticallyLinkedBlockItem.assignFrequency(heldItem, player, network); + return; + } if (player.level().isClientSide) DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(player)); @@ -992,5 +1003,9 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { public boolean writeToClipboard(CompoundTag tag, Direction side) { return false; } + + private void tickOutline() { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> LogisticallyLinkedClientHandler.tickPanel(this)); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java index 002a31cedb..64a5249ac8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBlockEntity.java @@ -15,15 +15,17 @@ import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour; -import net.createmod.catnip.nbt.NBTHelper; import net.createmod.catnip.math.VecHelper; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.nbt.CompoundTag; +import net.minecraft.sounds.SoundSource; import net.minecraft.util.Mth; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -134,6 +136,13 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { behaviour.setNetwork(frequency); redraw = true; lastShape = null; + + if (activePanels() > 1) { + SoundType soundType = getBlockState().getSoundType(); + level.playSound(null, worldPosition, soundType.getPlaceSound(), SoundSource.BLOCKS, + (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F); + } + return true; } return false; @@ -145,6 +154,13 @@ public class FactoryPanelBlockEntity extends SmartBlockEntity { behaviour.disable(); redraw = true; lastShape = null; + + if (activePanels() > 0) { + SoundType soundType = getBlockState().getSoundType(); + level.playSound(null, worldPosition, soundType.getBreakSound(), SoundSource.BLOCKS, + (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F); + } + return true; } return false; diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java index d615a45935..0ba642bab0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedBlockItem.java @@ -89,13 +89,7 @@ public class LogisticallyLinkedBlockItem extends BlockItem { if (!link.mayInteractMessage(player)) return InteractionResult.SUCCESS; - CompoundTag stackTag = stack.getOrCreateTag(); - CompoundTag teTag = new CompoundTag(); - teTag.putUUID("Freq", link.freqId); - stackTag.put(BLOCK_ENTITY_TAG, teTag); - - player.displayClientMessage(CreateLang.translateDirect("logistically_linked.tuned"), true); - stack.setTag(stackTag); + assignFrequency(stack, player, link.freqId); return InteractionResult.SUCCESS; } @@ -108,4 +102,14 @@ public class LogisticallyLinkedBlockItem extends BlockItem { return useOn; } + public static void assignFrequency(ItemStack stack, Player player, UUID frequency) { + CompoundTag stackTag = stack.getOrCreateTag(); + CompoundTag teTag = new CompoundTag(); + teTag.putUUID("Freq", frequency); + stackTag.put(BLOCK_ENTITY_TAG, teTag); + + player.displayClientMessage(CreateLang.translateDirect("logistically_linked.tuned"), true); + stack.setTag(stackTag); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java index e25a9379c3..1f8b2c8389 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packagerLink/LogisticallyLinkedClientHandler.java @@ -4,6 +4,8 @@ import java.util.UUID; import org.apache.commons.lang3.tuple.Pair; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelBehaviour; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnectionHandler; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; import net.createmod.catnip.animation.AnimationTickHolder; @@ -18,7 +20,11 @@ import net.minecraft.world.phys.shapes.VoxelShape; public class LogisticallyLinkedClientHandler { + private static UUID previouslyHeldFrequency; + public static void tick() { + previouslyHeldFrequency = null; + LocalPlayer player = Minecraft.getInstance().player; if (player == null) return; @@ -33,6 +39,8 @@ public class LogisticallyLinkedClientHandler { return; UUID uuid = tag.getUUID("Freq"); + previouslyHeldFrequency = uuid; + for (LogisticallyLinkedBehaviour behaviour : LogisticallyLinkedBehaviour.getAllPresent(uuid, false, true)) { SmartBlockEntity be = behaviour.blockEntity; VoxelShape shape = be.getBlockState() @@ -46,8 +54,9 @@ public class LogisticallyLinkedClientHandler { .size(); i++) { AABB aabb = shape.toAabbs() .get(i); - Outliner.getInstance().showAABB(Pair.of(behaviour, i), aabb.inflate(-1 / 128f) - .move(be.getBlockPos()), 2) + Outliner.getInstance() + .showAABB(Pair.of(behaviour, i), aabb.inflate(-1 / 128f) + .move(be.getBlockPos()), 2) .lineWidth(1 / 32f) .disableLineNormals() .colored(AnimationTickHolder.getTicks() % 16 < 8 ? 0x708DAD : 0x90ADCD); @@ -56,4 +65,24 @@ public class LogisticallyLinkedClientHandler { } } + public static void tickPanel(FactoryPanelBehaviour fpb) { + if (previouslyHeldFrequency == null) + return; + if (!previouslyHeldFrequency.equals(fpb.network)) + return; + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) + return; + if (!player.blockPosition() + .closerThan(fpb.getPos(), 64)) + return; + + Outliner.getInstance() + .showAABB(fpb, FactoryPanelConnectionHandler.getBB(fpb.blockEntity.getBlockState(), fpb.getPanelPosition()) + .inflate(-1.5 / 128f)) + .lineWidth(1 / 32f) + .disableLineNormals() + .colored(AnimationTickHolder.getTicks() % 16 < 8 ? 0x708DAD : 0x90ADCD); + } + } diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 468ce928ac..37f5ea64eb 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -1044,7 +1044,7 @@ "create.display_link.display_on": "Write data to:", "create.display_link.display_on_multiline": "Start writing at:", - "create.logistically_linked.tuned": "Tuned to this link", + "create.logistically_linked.tuned": "Tuned to this network", "create.logistically_linked.new_network_started": "New link network started", "create.logistically_linked.connected": "Connected to existing network successfully", "create.logistically_linked.tooltip": "Frequency configured", From c1268da86a91d624aa2a0e0577a4a31048df68ee Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 7 Feb 2025 14:35:04 +0100 Subject: [PATCH 09/13] Gauges and JEI - Added the ability to pull in items from JEI when configuring gauges initially (empty hand on empty panel) --- .../com/simibubi/create/AllMenuTypes.java | 5 ++ .../simibubi/create/compat/jei/CreateJEI.java | 2 + .../factoryBoard/FactoryPanelBehaviour.java | 47 ++++++++++-- .../factoryBoard/FactoryPanelSetItemMenu.java | 72 ++++++++++++++++++ .../FactoryPanelSetItemScreen.java | 69 +++++++++++++++++ .../create/foundation/gui/AllGuiTextures.java | 1 + .../assets/create/lang/default/interface.json | 1 + .../assets/create/textures/gui/requester.png | Bin 1858 -> 2351 bytes 8 files changed, 189 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSetItemMenu.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSetItemScreen.java diff --git a/src/main/java/com/simibubi/create/AllMenuTypes.java b/src/main/java/com/simibubi/create/AllMenuTypes.java index 9ebd08fe2b..92244483fb 100644 --- a/src/main/java/com/simibubi/create/AllMenuTypes.java +++ b/src/main/java/com/simibubi/create/AllMenuTypes.java @@ -4,6 +4,8 @@ import com.simibubi.create.content.equipment.blueprint.BlueprintMenu; import com.simibubi.create.content.equipment.blueprint.BlueprintScreen; import com.simibubi.create.content.equipment.toolbox.ToolboxMenu; import com.simibubi.create.content.equipment.toolbox.ToolboxScreen; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelSetItemMenu; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelSetItemScreen; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu; import com.simibubi.create.content.logistics.filter.AttributeFilterScreen; import com.simibubi.create.content.logistics.filter.FilterMenu; @@ -76,6 +78,9 @@ public class AllMenuTypes { public static final MenuEntry REDSTONE_REQUESTER = register("redstone_requester", RedstoneRequesterMenu::new, () -> RedstoneRequesterScreen::new); + public static final MenuEntry FACTORY_PANEL_SET_ITEM = + register("factory_panel_set_item", FactoryPanelSetItemMenu::new, () -> FactoryPanelSetItemScreen::new); + private static > MenuEntry register( String name, ForgeMenuFactory factory, NonNullSupplier> screenFactory) { return Create.REGISTRATE diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 1df3820a45..c36ee88ba5 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -59,6 +59,7 @@ import com.simibubi.create.content.kinetics.fan.processing.SplashingRecipe; import com.simibubi.create.content.kinetics.press.MechanicalPressBlockEntity; import com.simibubi.create.content.kinetics.press.PressingRecipe; import com.simibubi.create.content.kinetics.saw.CuttingRecipe; +import com.simibubi.create.content.logistics.factoryBoard.FactoryPanelSetItemScreen; import com.simibubi.create.content.logistics.filter.AbstractFilterScreen; import com.simibubi.create.content.logistics.redstoneRequester.RedstoneRequesterScreen; import com.simibubi.create.content.processing.basin.BasinRecipe; @@ -396,6 +397,7 @@ public class CreateJEI implements IModPlugin { registration.addGhostIngredientHandler(LinkedControllerScreen.class, new GhostIngredientHandler()); registration.addGhostIngredientHandler(ScheduleScreen.class, new GhostIngredientHandler()); registration.addGhostIngredientHandler(RedstoneRequesterScreen.class, new GhostIngredientHandler()); + registration.addGhostIngredientHandler(FactoryPanelSetItemScreen.class, new GhostIngredientHandler()); } private class CategoryBuilder> { diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java index 185f2893e4..249e6a74e6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelBehaviour.java @@ -13,7 +13,6 @@ import java.util.UUID; import javax.annotation.Nullable; -import net.minecraft.network.chat.Component; import org.joml.Math; import com.google.common.collect.HashMultimap; @@ -57,12 +56,16 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.Level; @@ -71,8 +74,9 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.network.NetworkHooks; -public class FactoryPanelBehaviour extends FilteringBehaviour { +public class FactoryPanelBehaviour extends FilteringBehaviour implements MenuProvider { public static final BehaviourType TOP_LEFT = new BehaviourType<>(); public static final BehaviourType TOP_RIGHT = new BehaviourType<>(); @@ -526,6 +530,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { @Override public void onShortInteract(Player player, InteractionHand hand, Direction side, BlockHitResult hitResult) { + // Network is protected if (!Create.LOGISTICS.mayInteract(network, player)) { player.displayClientMessage(CreateLang.translate("logistically_linked.protected") .style(ChatFormatting.RED) @@ -533,6 +538,9 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return; } + boolean isClientSide = player.level().isClientSide; + + // Wrench cycles through arrow bending if (targeting.size() + targetedByLinks.size() > 0 && AllItemTags.WRENCH.matches(player.getItemInHand(hand))) { int sharedMode = -1; boolean notifySelf = false; @@ -547,7 +555,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { if (sharedMode == -1) sharedMode = (connection.arrowBendMode + 1) % 4; connection.arrowBendMode = sharedMode; - if (!player.level().isClientSide) + if (!isClientSide) at.blockEntity.notifyUpdate(); } @@ -555,7 +563,7 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { if (sharedMode == -1) sharedMode = (connection.arrowBendMode + 1) % 4; connection.arrowBendMode = sharedMode; - if (!player.level().isClientSide) + if (!isClientSide) notifySelf = true; } @@ -572,23 +580,34 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { return; } - if (player.level().isClientSide) + // Client might be in the process of connecting a panel + if (isClientSide) if (FactoryPanelConnectionHandler.panelClicked(getWorld(), player, this)) return; + ItemStack heldItem = player.getItemInHand(hand); if (getFilter().isEmpty()) { + // Open screen for setting an item through JEI + if (heldItem.isEmpty()) { + if (!isClientSide && player instanceof ServerPlayer sp) + NetworkHooks.openScreen(sp, this, buf -> getPanelPosition().send(buf)); + return; + } + + // Use regular filter interaction for setting the item super.onShortInteract(player, hand, side, hitResult); return; } - ItemStack heldItem = player.getItemInHand(hand); + // Bind logistics items to this panels' frequency if (heldItem.getItem() instanceof LogisticallyLinkedBlockItem) { - if (!player.level().isClientSide) + if (!isClientSide) LogisticallyLinkedBlockItem.assignFrequency(heldItem, player, network); return; } - if (player.level().isClientSide) + // Open configuration screen + if (isClientSide) DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> displayScreen(player)); } @@ -1008,4 +1027,16 @@ public class FactoryPanelBehaviour extends FilteringBehaviour { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> LogisticallyLinkedClientHandler.tickPanel(this)); } + @Override + public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { + return FactoryPanelSetItemMenu.create(containerId, playerInventory, this); + } + + @Override + public Component getDisplayName() { + return blockEntity.getBlockState() + .getBlock() + .getName(); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSetItemMenu.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSetItemMenu.java new file mode 100644 index 0000000000..c68c094b0c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSetItemMenu.java @@ -0,0 +1,72 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import com.simibubi.create.AllMenuTypes; +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.foundation.gui.menu.GhostItemMenu; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; + +public class FactoryPanelSetItemMenu extends GhostItemMenu { + + public FactoryPanelSetItemMenu(MenuType type, int id, Inventory inv, FactoryPanelBehaviour contentHolder) { + super(type, id, inv, contentHolder); + } + + public FactoryPanelSetItemMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + super(type, id, inv, extraData); + } + + public static FactoryPanelSetItemMenu create(int id, Inventory inv, FactoryPanelBehaviour be) { + return new FactoryPanelSetItemMenu(AllMenuTypes.FACTORY_PANEL_SET_ITEM.get(), id, inv, be); + } + + @Override + protected ItemStackHandler createGhostInventory() { + return new ItemStackHandler(1); + } + + @Override + protected boolean allowRepeats() { + return true; + } + + @Override + @OnlyIn(Dist.CLIENT) + protected FactoryPanelBehaviour createOnClient(FriendlyByteBuf extraData) { + FactoryPanelPosition pos = FactoryPanelPosition.receive(extraData); + return FactoryPanelBehaviour.at(Minecraft.getInstance().level, pos); + } + + @Override + protected void addSlots() { + int playerX = 13; + int playerY = 112; + int slotX = 74; + int slotY = 28; + + addPlayerSlots(playerX, playerY); + addSlot(new SlotItemHandler(ghostInventory, 0, slotX, slotY)); + } + + @Override + protected void saveData(FactoryPanelBehaviour contentHolder) { + if (!contentHolder.setFilter(ghostInventory.getStackInSlot(0))) { + player.displayClientMessage(CreateLang.translateDirect("logistics.filter.invalid_item"), true); + AllSoundEvents.DENY.playOnServer(player.level(), player.blockPosition(), 1, 1); + return; + } + player.level() + .playSound(null, contentHolder.getPos(), SoundEvents.ITEM_FRAME_ADD_ITEM, SoundSource.BLOCKS, .25f, .1f); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSetItemScreen.java b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSetItemScreen.java new file mode 100644 index 0000000000..6becd82492 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/factoryBoard/FactoryPanelSetItemScreen.java @@ -0,0 +1,69 @@ +package com.simibubi.create.content.logistics.factoryBoard; + +import java.util.Collections; +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.menu.AbstractSimiContainerScreen; +import com.simibubi.create.foundation.gui.widget.IconButton; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.createmod.catnip.gui.element.GuiGameElement; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.Rect2i; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; + +public class FactoryPanelSetItemScreen extends AbstractSimiContainerScreen { + + private IconButton confirmButton; + private List extraAreas = Collections.emptyList(); + + public FactoryPanelSetItemScreen(FactoryPanelSetItemMenu container, Inventory inv, Component title) { + super(container, inv, title); + } + + @Override + protected void init() { + int bgHeight = AllGuiTextures.FACTORY_GAUGE_SET_ITEM.getHeight(); + int bgWidth = AllGuiTextures.FACTORY_GAUGE_SET_ITEM.getWidth(); + setWindowSize(bgWidth, bgHeight + AllGuiTextures.PLAYER_INVENTORY.getHeight()); + super.init(); + clearWidgets(); + int x = getGuiLeft(); + int y = getGuiTop(); + + + confirmButton = new IconButton(x + bgWidth - 40, y + bgHeight - 25, AllIcons.I_CONFIRM); + confirmButton.withCallback(() -> minecraft.player.closeContainer()); + addRenderableWidget(confirmButton); + + extraAreas = List.of(new Rect2i(x + bgWidth, y + bgHeight - 30, 40, 20)); + } + + @Override + protected void renderBg(GuiGraphics pGuiGraphics, float pPartialTick, int pMouseX, int pMouseY) { + int x = getGuiLeft(); + int y = getGuiTop(); + AllGuiTextures.FACTORY_GAUGE_SET_ITEM.render(pGuiGraphics, x - 5, y); + renderPlayerInventory(pGuiGraphics, x + 5, y + 94); + + ItemStack stack = AllBlocks.FACTORY_GAUGE.asStack(); + Component title = CreateLang.translate("gui.factory_panel.place_item_to_monitor") + .component(); + pGuiGraphics.drawString(font, title, x + imageWidth / 2 - font.width(title) / 2 - 5, y + 4, 0x3D3C48, false); + + GuiGameElement.of(stack) + .scale(3) + .render(pGuiGraphics, x + 180, y + 48); + } + + @Override + public List getExtraAreas() { + return extraAreas; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 31bcdd9da2..f899d35872 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -157,6 +157,7 @@ public enum AllGuiTextures implements ScreenElement, TextureSheetSegment { FACTORY_GAUGE_RECIPE("factory_gauge", 32, 0, 192, 96), FACTORY_GAUGE_RESTOCK("factory_gauge", 32, 112, 192, 40), FACTORY_GAUGE_BOTTOM("factory_gauge", 32, 176, 200, 64), + FACTORY_GAUGE_SET_ITEM("requester", 16, 160, 184, 88), STOCK_KEEPER_REQUEST_HEADER("stock_keeper", 0, 0, 256, 36), STOCK_KEEPER_REQUEST_BODY("stock_keeper", 0, 48, 256, 20), diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 37f5ea64eb..09e12fc909 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -1094,6 +1094,7 @@ "create.gui.factory_panel.address_missing": "Inactive: missing a target address", "create.gui.factory_panel.no_target_amount_set": "Inactive: no target amount set", "create.gui.factory_panel.has_link_connections": "Gauge has connected links", + "create.gui.factory_panel.place_item_to_monitor": "Place Item to Monitor", "create.gui.redstone_requester.allow_partial": "Allow partial orders", "create.gui.redstone_requester.dont_allow_partial": "Must send all items", diff --git a/src/main/resources/assets/create/textures/gui/requester.png b/src/main/resources/assets/create/textures/gui/requester.png index 39567ab4293a795a3b8e5ddcb4db1c4d63c5f841..76a7fbd678b27a2efec65a946737b14953acc53e 100644 GIT binary patch delta 1992 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 From 3a55a62cd577df33c8bbe697324e6e70a4ddc7ff Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 7 Feb 2025 14:35:23 +0100 Subject: [PATCH 10/13] datagen --- .../.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c | 6 +++--- src/generated/resources/assets/create/lang/en_ud.json | 1 + src/generated/resources/assets/create/lang/en_us.json | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index d8598e8eff..efbd4da21c 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2025-02-07T13:00:03.1304237 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-02-07T14:33:10.4318818 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -642,8 +642,8 @@ b0d8f08968763a5f74e5cd5644377a76a9f39753 assets/create/blockstates/yellow_toolbo fe8c497aacc641c2f01cec90bba9f19e59cc2ed2 assets/create/blockstates/yellow_valve_handle.json e819e93fdcbe9fd9c050a052d2718ff3b3539365 assets/create/blockstates/zinc_block.json 64121dcb216381c83b4fe28aa361ea07c24c9ad0 assets/create/blockstates/zinc_ore.json -cae329ccc1187f88b752581c198792b925b44d4a assets/create/lang/en_ud.json -4943bb06d6be669ac498b1be5902794098aa1c0c assets/create/lang/en_us.json +99c03ec65894ea7d88e3346c5e0c086a7acec6af assets/create/lang/en_ud.json +5f0262b9f6c1139659f6dab4d9c371be50503c0b assets/create/lang/en_us.json a97e1060e00ae701a02e39cd4ef8054cf345fac4 assets/create/models/block/acacia_window.json 103e032c0b1a0a6a27c67da8c91179a564bd281c assets/create/models/block/acacia_window_pane_noside.json fb00b627abda76ad4fea867ca57dbfadd24fffa3 assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index eb14dbead3..e35475712a 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -1220,6 +1220,7 @@ "create.gui.factory_panel.left_click_reset": "ʇǝsǝɹ oʇ ʞɔıןƆ-ʇɟǝꞀ", "create.gui.factory_panel.no_open_promises": "sǝsıɯoɹd uǝdo oN", "create.gui.factory_panel.no_target_amount_set": "ʇǝs ʇunoɯɐ ʇǝbɹɐʇ ou :ǝʌıʇɔɐuI", + "create.gui.factory_panel.place_item_to_monitor": "ɹoʇıuoW oʇ ɯǝʇI ǝɔɐןԀ", "create.gui.factory_panel.promise_prevents_oversending": "˙buıpuǝs-ɹǝʌo sʇuǝʌǝɹd sıɥ⟘", "create.gui.factory_panel.promised_items": "sɯǝʇı pǝsıɯoɹԀ", "create.gui.factory_panel.promises_do_not_expire": "ǝɹıdxǝ ʇou op sǝsıɯoɹԀ", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index b11b7e1496..9420d12373 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1220,6 +1220,7 @@ "create.gui.factory_panel.left_click_reset": "Left-Click to reset", "create.gui.factory_panel.no_open_promises": "No open promises", "create.gui.factory_panel.no_target_amount_set": "Inactive: no target amount set", + "create.gui.factory_panel.place_item_to_monitor": "Place Item to Monitor", "create.gui.factory_panel.promise_prevents_oversending": "This prevents over-sending.", "create.gui.factory_panel.promised_items": "Promised items", "create.gui.factory_panel.promises_do_not_expire": "Promises do not expire", From eb4d78f62142665d1d8e714a7e02e45bdbafc59a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 7 Feb 2025 14:50:49 +0100 Subject: [PATCH 11/13] Update gradle.properties --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 175e8b0d5b..d866dad214 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.caching = true # mod version info # build_info_mod_version is the version that gets filled into CreateBuildInfo.java mod_version = 6.0.0 -build_info_mod_version = 6.0.0-experimental +build_info_mod_version = 6.0.0 artifact_minecraft_version = 1.20.1 minecraft_version = 1.20.1 From 5a1c6890d2895de2eb9b0c0293155a1060ce36c9 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 7 Feb 2025 09:56:33 -0500 Subject: [PATCH 12/13] Repeating controls - Fix lectern controllers causing a stack overflow --- .../redstone/link/controller/LecternControllerBlockEntity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlockEntity.java index 9d4915ca94..b52b5c7779 100644 --- a/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/link/controller/LecternControllerBlockEntity.java @@ -22,6 +22,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; + import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.ForgeMod; @@ -70,7 +71,7 @@ public class LecternControllerBlockEntity extends SmartBlockEntity { } public ItemStack getController() { - return getController(); + return createLinkedController(); } public boolean hasUser() { return user != null; } From ecd40675a851ba43f43458ed4369976c7f15bb15 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Fri, 7 Feb 2025 17:09:23 +0000 Subject: [PATCH 13/13] testing touchups updated assets for vaults, copper tops and starlotte package --- .../copper/copper_shingles_top_connected.png | Bin 3935 -> 3925 bytes .../copper/copper_tiles_top_connected.png | Bin 4169 -> 4272 bytes .../exposed_copper_shingles_top_connected.png | Bin 4150 -> 4166 bytes .../exposed_copper_tiles_top_connected.png | Bin 4211 -> 4239 bytes ...oxidized_copper_shingles_top_connected.png | Bin 3913 -> 3919 bytes .../oxidized_copper_tiles_top_connected.png | Bin 4197 -> 4223 bytes ...eathered_copper_shingles_top_connected.png | Bin 4214 -> 4236 bytes .../weathered_copper_tiles_top_connected.png | Bin 4616 -> 4703 bytes .../textures/block/vault/vault_side_large.png | Bin 398 -> 878 bytes .../block/vault/vault_side_medium.png | Bin 474 -> 1316 bytes .../textures/block/vault/vault_top_large.png | Bin 377 -> 400 bytes .../textures/block/vault/vault_top_medium.png | Bin 388 -> 424 bytes .../textures/item/package/rare_starlotte.png | Bin 1029 -> 1558 bytes 13 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/copper/copper_shingles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/copper_shingles_top_connected.png index db22d5104d2265d7d779ff05d3e33ec792387bc6..11858c7fe8a4bc8cdfe65803fb8cb95c5e8453ec 100644 GIT binary patch delta 3900 zcmV-C55w@^9@QR@Dm4HA0002_L%V+f000SaNLh0L01m?d01m?e$8V@)00007bV*G` z2k8O_5eNbyyQxqB01o1jUl)JWg{Vba?kKTiK}OFcK`TIZgWe4gAV7LEz$~(w#VqCr zH0Bq~dVWB%3ecF1fmvn200v@MkRc5O(6Tgc(WGda#bS{~mZ(P-#dCS;vWlckCj}U= zigoIobMJY6=T_{$|M};)uIGWS)m#R9+mEq-Rz|n)-*?h)W+dIL0Cwq)pf9(I2>{ly_69nS&)d7l>UvggWY==xOjQu&sRR&Rh;uixTRT^b3n zwvxf_=0jB4_0b{#sI=?2?71TfkwK+hM_R<;dR{WdECgR9vGh_50Z2_gD6YM>DfJV#4Qo@h{>Ga|Zd)tpuIzB{F z_nBqkjw#564%4mkYua$!K59)Hh7gj5o|{JB?R%jCuhFt$rVD>49i71SJd}=3#%Kd6R^((n zt2gb*E>LUQ_+$0Ye$Zj=5E>XyE2s@$Xb2&5wBz=%w&K?i0N{AmSWYK_qv%tH9vbi( zEgQwvO+0(~0#CL!V5SR!Iw9;jy*QKc47~{pkkp0D(`5Rz2!I_L7^zO+3SL+?b~hi& zJnmoqBJ6)|KE$(^FXVz!D&+J40?PA%N6K%Td0h5fIKq;3LfGZFeN^ZVt1~$Z>~21k z`IqwXw&}l|+yMa6B963(OLsUpt)SAb!|^QaZa$PLj|afEH<0%z_tOH=Z;oe4vnS=r z=PBUP;_*x}>H6Jw&tn&s4gT-npY6vYU4SAi_sxH`l~JTUy*NV~zF_%mM!G}k=mgtl z9>|U&dK<=AHgJRm*Yn_bmJDq4+rhi(0go#`>lLN&m<5nIs#mw~A!X=z_VPs_J5XS3 zv}~jdJ+LD@x~r+s5JEmjmPTejDc}*0Y$A@Ogn@k4?;FT{K1nG|=1+{&i)RP&W7@^A z98P~qQp#(41Gt_S*j-M$lrXTn`4DR>zIBn=1CaFxy|e8NKAG|Wun^@>NnIeR3#1HP zx`SFVhV3-Z{}iR^ciQQ&MdKCTCs*9$Rvl6^}-tFdP9dHgiLR>VHq2?DExn3x9_3SuER_h{F`Z@bbN>>TN`qh-&E@X zH*!5smcX3HM=wCP@5yvRFX#9GF>8ARKj1M%2s@DJXPEodG{?I?$^w@?7u~*xSFhiq zzGBOrHgn4XS6R(vkko~=0t(sy@VeT-_y75Cx3lo)&k+BL)qzF@jGDvAhigq+zHomj zVc@doj>QR{{u&rXd8z|=pl!5lxrkK!sLG{84*O?i37F9H)JHUWzAS}dc9@61#&?GY z!>Hhbl7$@}Ytv49s=?zVaZ`8!vB9{!r@7kqb< zy5G#~pOt+p$wIymume_5SjhyiJ?>7#yfO@)Yb%*CH=@5uIjS(#Do|~B=H;(VGIQR% zJZruP4U)Vj;Jd*+nrobIW6>4>xT!Vsrmj6_u7b2Y-$5fZff9XeS0^NDeXJ*q#~y@4}p$EaiBz zv@G1QY%r-7pgLe4{$qGRSPh`2K^4ddW6ldH&b-wd$VeR)-7kCY(EM}KLb%U{1;}~$ zhvETh4ZzFgrGz2#u^e24Fz0_JuC6@o8ZEFI*;Sk%th?lRz&!jlLVVPkp094(tB<)x zHW8PlZy57#-;)&_U%Xk(8zJR1y=#<-FgO25JRqr$;HtEU%U&TW4yY^7nRByK3zYlo z1=$3VVpIu|60=+%%YP~!uzyw_TEQUD;;PJxtDC`qHi7y6Sy{Ho^h|%FW&0_xWy=~s zeP0wFFb{t%3=iN6Mg>S7BwM{fpu*zs;LLd?7KS@;>=Cde&>Fx4V2rv)<{lr*Uz>yn z&=u7zQDsHZb{ccKN6dK;oOFeCf;>RZ!+&->z_S9K6g4uAXUSAkYuc!>w)#!Aj@4Wy z(D?ASTTQ3gM0_j_P78mM^YXtF9#FA5f&Ra;Qpdq*MVcvD&6{dn-U~Y;Kt+t>_5=6j zf-^K|8Xk}mIe$dyIBGhIM^=udL?H#9G`oaQCyn`#}~W*)6!vsL`8FoMB{ zkb6>Z{9W*Xg)lroO)2VpUJXK|Fr_n|b9p)n%gMZ-=jRj18u))iX&N5T>J7$neHb3V zbz4yJ04^A%LV~WB5(a8b8~bPFNEDgI-f0n+i=ry4c7c~YS4L-=JM3*g9>e@Niadq~ z4C$kK0~HS-mtWw1LAjW(5Fb~iMI3vN9*of2<3lMBUwIxwxbjO0Ln~O)!V51fTY{R@yzr2DgVC3U~3T3g9TU}GA+I))1ijHTm4Y^~=< zhb!j50~Yu>ys&`B4<~TtR3ujoQv7e4_{>Vr7a=Mz9-LNY!UMSSVR*m-o%VEk57myb`+>a=o@uDc7&B&BDFFik>Kv{&p zhvNaX^90;P;Q_Ru3w*WJ`TYJ_Ik1D2e^o^&AE!i4K126E1wGXXYGCAb%Pe3B-J^JB z2!Vf?dR(3h%u^Q6=@cjGON9_x51`|-D!qyako+X?wDS#`I$sAyd6sf^ zm{RHqOul3l<4#6!O^Sp3IzQhpjXEaDf6;RAp=0Coya_FSi>ufo za?1v8t_SE}-T0UwhrH-Ss9JW?;U$0ik|QN@^1wtG9x$oA&Sx_?IIYN2W?|<8RG*Kc ze|q1XNq)*8D(JiT&C{)Kle)n74GTM)U*JRQJ+5Ml{*UoEoK6Qjn_uAQ{2Xh!H1f$j zUY(u7yY}#T-b7j?5yK^fwkU&FEEXFpuf6LVc-J@B_<@PPygq@MTSh`pAQpd%;RZ3e z`-|~7-oCeHqOV#G5_$qlnl@Gb3%iN0e)0etg%#Xe$)b=-`26Y13JO--3+!xufsu4%X&Tp<>V!EyUoNhNVot4@^v==>Z@ znkMeBIH0RJbzLM?J8(Nlj#81}uvn`#}u z{>4{tJZon8yL}IfKU+(GTeTdVzi*=2Y~%R6hTB`f>h|PHUd0w6v_*K=H*h)~++V+k z?;92hsRXK)gBvVhr)c8chl@zz&D=7suLiij^36|=FXCOZje4s+6TRd1@yj3oRDvJg z^$i@aix@8PdEUhTzpsD8NNNz;BDB~o%GD23<#*gZv`O=MHM*+(_`zvq3`XMs1qshj zps3~Otn~l;^8Z4=H)!+_`n^K&v%*aBFHD=yADmVu_T!WA1Tx!6=L@FM6QUFKy}_jK z70lf7RQa`8=JOmik|#1*OS+UWP^-MfKFZRXC}7QUz95P|sf&Cenlt*|fR6HUD=H+S zPmCmWF;RYPmiaubq;JYWb_!@?;DE01oVtUl)JmLe!!ycQmobf{e~gH(CQ^H}GzN00E{q0kY`TEM_r3 zpfSH7>->OZ6`+xgfvjf10Sv^jAVUfS&@we{(R`R@u~=l0CF(H?>Rg_>tRgAXodN`i zMV>n6+KdxCfeQrZEt|2h{EwKw7mhg*0Z0K{-9LGPToW#vy7#f0RVV@RK&d30{!#q z^;@)h12kH;WaxSxb~k^Ai$g*>o&^B%J}umN&y~NS>r>H7` zs)F8zK4IwC$(vGn+-yiX7DYCl8l(Sc3n(0&VDI65G+H*6VulPzrP?X>wjZHze2BO{ zWR`|IrXUwOXg5i@+t8QZ)uq{!Otg5}bP9!|6FhzL1@QgzK*j#}%`dO{=YRjh|3pG# zz~00AC>)(2zq)@ZcLxBn>6BaqipaD}q#z03?R)Y!Wve6atGhZYy{bH2r2O8)``AA% zhAO|4H?g<<2s?Qb`MWv%?&TA9R&Rh(?G!tC z(FEHRWS~kpN4uyZC6S$s-!qLeXtuMujjEraX zrajpOs!bbzs{HRT=rDH(42-2Rsy7cbgpfJfar;81Nb` z8~N2uJbU>9kGD2pCUd?zA?PaAPGvkpZ^8n^bs_UKnLaH7U zhu3fsb~k??;MvO;azQB-a(Vzh<$1s(<+sf&&U-E#VaYln=yKdX%JjkNOwIzkn-66E zrF^_?4j)eL002o5MN&kiI~l z3V5`5Jd;eizWx4rq-NRRfB*SxKN9K!6k)k_qu<559M|pW->RtnFI>Qhj_fTA$R#rrS5Yh z*Yjiv%z1qD0(ASHOegekjt>yCwl{#8Sw^XL>MLTNKKWvler|HVn&x=-M_J&!=c3#9 z@apwj)K_e|(`IJb=PIk26ymy&RzN`;0A5!b_~F0*<9ZhU{5QnEY;~Yf0i)({^5K7K z)0PihiWxZXxnpsHr@sb9QJ(4m9%vgaTUr1WKdN#Gk-`3HQ359Pd+H+^y`e0*o9r+T ze~s@B4~AjEO*Lz}%w!Jx&7u^F6j7PyS2unB>$rWqwEUHtYU*k*q>Ee1$MV;>X(UAy zZ5VP9C>0J($&#xV6!G_)LxhLmEn8_4gu^7HW5 zRKMW68`p=;%>HR{XeDXL2LiUw3UVtcAGXKciI|sf%F?x!)R-I5XHt$TOtlJB8=iUj zYm>~JH!shcF9L%kuL=0B@K{33xzF>(R@kokXD9$W-4=O(VMJnb4Suo~G_oFJ&X(fv?3?ndetG{Q+$P^ZkF*qHK}rH;tA( zOo1(1)&T1B!tj83_-jFU09P<9K=L5j>J5Aq7Jmk3&MUDX+<{|{fF*%eA07Z>)IBoy z_*nkhBs_qwux5!WD~h($nA1IC&V%5jE2tCX0dgMxv*Q7tUV!hqv8oI!%AaqGM@rT9BNV|E=(VveoeeA}e(ql*-af$!gwI>hfODi~toe zj@w86Zq8@Yh2ul)q*F8F0SS?jn8c5Y2hdp^$L-Bz4)q&i&$&Du1?7Ka-p}*-1ad!qqBIQ; zX!QnTxjqOF;JPiScmNlSQXxUtOECl0rj7m6VknAC$KFX1m5ZV(t9F6sJy%9&I(OLH zel&*paTIwB54fQZ>kU*qfLwlo`vv7L`@H;^Su1( zraZ1nhz!hRPM#Z5mBsy%p34KL>v^)mG?Tf|`GlpIA>DtWY;}BR14$9}@#59tZSa7| zAHVtKbzB$n7@SXLw0Z-1pHF7U9ITALai67U1|5}Gn|2^Q0C^V4+g>^$E*u}iar-_z zfNGT6-~m(~KR+rC7l0nRno0R~{?+TZ(qBk9!O7x3qMw;T7&y7mDJB(zL3vP$D-qS#7!F< zBtKuIr%%2JJlN^>J!pab_$~T*wYCn!0|0*n;t3_AKGS>vjnAs|Djq=clf2XB8#MKN z9k3ZFA;$W7-jebOOul)8wBv->@*LAEz#CQa?Wp51?{2 z3{Rl50s4D#&&1=c4gBh>ucd2Dqn{){%{L@PH1HjR#eZ5izPq=62UnK^++EE=Xp4U^ zbR7-X!Drbtij@z@B;vTd7#0&zT%lq)`1w!Q;NJN6Qp~_&G>XfM0W!-5j?b#NzkUbB z%7-yLVI#MKtIGkh=@kC@`UK~L3oOTmN7j0DQU31yvX37c)>QhpjXEaDUu!w|(6RAZ z)`S+l#zkZinPmf4mjm=Ku7;Q(hrEAiB2+CqX?Tg=nmAr7~*P zaH2eDK0x*PF#0F=%$ek;45EU*i{Cui`Yx^u{Lrwlv-vqbwBF+)vN-%Q8imv8U}y7l z9G#tEEt5nxp2e%v61+`0Ib`6PTH0 z#Pk>v!OEIyh~-N405Vdt)8%KGc7(v-vqrsuhT+hPW;eiA2!qbn(;NPp}-*F}S$&?c7PZ zj*izw6jxGsGqa5T#TB}J4}*(K#B~AU|Dn^HN)G_db{CzVhp49Ed~ktCBm&3nViE@HU&HaNndR^HJuLq7TJpP!<>2gn6P0Eg$7fYsUjtURCs*j41;>BuB7$>#mNoHz@9Qw)8ick8Epm-w<-=6@9k&l{()qj^UDba4 zpi~}%(KtXs!t)6fwH%$5{x2{87WlqFqlduv74mm;Gs(X&?R@^ARG!$6Pr?((Y$weZ zOrs}6C+vNLN$)F|ndPbSYqOlsbJR#qWU`iYDQ2Krev5q+r8R$1z?x;gAdEh)iyJg& z^u7U&@^LH5#lj~>;<}h9zc$PHJgwx=l>N$cJRvOAO`0#DMG2y(AgR7@5Hwt=&Jyt; zJ4t@+Hs|vPHzup@Ab*Q{HPex~c9!`9LkQ(9@N(cQwPEiYIBtKY_Z4cE9Vq|*0~fs4 VJu9GXkN^Mx07(Z$PDHLkV1maZngsv= diff --git a/src/main/resources/assets/create/textures/block/copper/copper_tiles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/copper_tiles_top_connected.png index bdeb1a64513ff19386cfa17b782e0fe4fccba376..a9c4fdac5ac3ef169effa4aa9e079d23f6d82845 100644 GIT binary patch literal 4272 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 diff --git a/src/main/resources/assets/create/textures/block/copper/exposed_copper_shingles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/exposed_copper_shingles_top_connected.png index a41ffc20f326b81c2dc8b4c371de1fcb7bc7f9e3..4b9d3d8952b8f0f805d9f8b854519dcc736ca718 100644 GIT binary patch delta 3952 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 eG(N5z|3BB&XJhs_qz!lg0000{j?zf diff --git a/src/main/resources/assets/create/textures/block/copper/exposed_copper_tiles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/exposed_copper_tiles_top_connected.png index e023afd2420febdbf96e54a08a82e9e3565249d7..c0b4fe3b3e21312b5e4983b22c45445e36490c30 100644 GIT binary patch literal 4239 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 literal 4211 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 GC+`0V^da>C diff --git a/src/main/resources/assets/create/textures/block/copper/oxidized_copper_shingles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/oxidized_copper_shingles_top_connected.png index 723eef13a644f212f1408aad85865126fef5c130..d1ffd8d112052b0ac33cfcf5be1e0aa02aff60db 100644 GIT binary patch delta 3914 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 T?jN!M000R9NkvXXu0mjf8V4st diff --git a/src/main/resources/assets/create/textures/block/copper/weathered_copper_shingles_top_connected.png b/src/main/resources/assets/create/textures/block/copper/weathered_copper_shingles_top_connected.png index 3c1db18d8aa012b331993cb39cf54619d540bcdf..4b63b1569283e48da5a8d9a9733c66d92985035d 100644 GIT binary patch delta 4234 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 Zvo%G#X+6Sl8mihV6-rj2{{i?$1@Zs@ literal 4616 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 diff --git a/src/main/resources/assets/create/textures/block/vault/vault_side_large.png b/src/main/resources/assets/create/textures/block/vault/vault_side_large.png index 9cf1f64925ede9165e836c4fc8a5c997b3d7dc92..f58fbe7e009e7766448e0d6f77241fa378908e01 100644 GIT binary patch delta 867 zcmV-p1DyPh1MUWp7=H)`00020X>r~F000JJOGiWi000000Qp0^e*gdg32;bRa{vGf z6951U69E94oEQKA00(qQO+^Rk0tXN=CKCRt3;+NE`$5hVUk10Dw1n1OWJb{wvWg zTGHc)_VWJ4?fr40y-E50<0lSu0eJoD-L+{snd=?9x2Q+{EYVh#$e-Q$**s+PZysdt z@i6zET(m8~w0|6Q>>iA+y_~$`AYu$1XAX?P>_t5>X+@ui%_kKHeqzix@RiT+*gcpE z@B}!(eF>Bx0TAbbJ^-0Nf41oYhu%FR!B&%??T!{cDt~i8%-F)G<+@x{ed1f67X&Gj zVjcIVP-to{HN z2DyPy9U#y$NXsBag5(0VC_-sfNbC^B^*HFQe7li9%P2sq_+jT1p}O?|@f^|4(*u?- zXV3Hil_iiKK+7O4gJc1Ftq16AiAfJ2J%IFp=6~w}suST>=>a-CKyg5uEui%-P>UWQ z7(Trn2Fgp35hN(DCURPgTo<_tVpq7z3QE}y`&WNpT25^#GU@$3rN~f<%#P&=7Lmka z#@6Nu%Gcy&aqB5EnKxNb65BKuP{jl~o2}CG1O<8BMHNmH=q3{r&t?Coh0UKxunZDx zdR)3ZMS{8m4EruljvrGT(AqeFQe|s68dF(PtB%GRD~Qm!0G$iaxd5FD(7C|Ahr)G; tqN?bUL{aRBC~CSKC&wew1DdJ_+yIrpwsu($ydwYr002ovPDHLkV1kqTfNcN( delta 383 zcmaFI*2g?SqMn7Bfq@~yJ?AZuG6?VqaW$~AaP)A=%uH%&DxW`lvZ;x!rG=BNjfbIu zxwf{Us;ai5V}OfCl$&2-aCjh4)55^d+kuooNswRge^kKmKsi2kXKYT-(wYM;bEwI({?`VfCH!qJrzn z1rZOSWY)$8r3c)HxK<>w?tGb89%&gMXk*LcmY*m8=VjxMf(`}4$5Vo(0-iF*vmER` zXkBsYq_IK#gVK~pDT$V{l9F>u_a?TiW(Mky7kS@SU3}vy_batqcaNw>y;{P~;OfCV VNpDB{6kt#=c)I$ztaD0e0ss+NqeTD! diff --git a/src/main/resources/assets/create/textures/block/vault/vault_side_medium.png b/src/main/resources/assets/create/textures/block/vault/vault_side_medium.png index e5153374727569a27a66f9df1fe9705c38a6e206..e44307a190e2c4c6fd4197858765024cb8ede9cc 100644 GIT binary patch delta 1308 zcmV+%1>^eK1EdO&8Gi-<0063Kaozv`00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF;5u2M{qSfP000EBNkll*O6#gtxBxOr- zWK>0HT8%w42#^j|fdq|_1ToMdh*7kF#{ezRU(-21p+Gw&*?(+!sNui~+QEY}bdZO_ ziETzfT-dQB+Z0L39i+SJD2gIQDl#d)MHG2Q-g~_F-Fx3Xj?FK8bCJ!Y(2pFKs{nw0 z`vbtn+8<-^Ad3&bz38{^ak&aEn@Qou+!v6g9As(6vY}EsfGo{GDIGv59YU6JP)dg= z?(PAAWq;DgfqwzK=#L+lzlTyf008XWv*0)$0Kg?g#{)NX6#($^)taXnaPRIzW(F9B#y-c;JD=TZqv;yB zL^_MO*c^CWZ4N5N3utIH0KkMWj(Y73VlqRGK@>I&4Sy3?uG01~UH|~ZMG#s~nw>6K$NwEkV7^5Jb?E?|B;{Yv%SEB%U5fj z4Dj<$OMk%xK{5k|34+Zrdj!Gs=hqm}Bfi~G)vkU{t~GoB!PN8|Gj=j=J0K+fZx}i_ z(xJVx)odWj6N?Iy!ANt^yA?y&IT=QcUFe?rRs{ql%Ff?`*c)Wav`tGm4ucO^H zmLA=rzO%Wx4L-pm3=%V+SXtddUY4Prml;dS(tiv#H@6{6IfO|#GuqD=X0fj*n7%fN z!p-Xpg5LOQ7GV>{05AUBN4<82NBCM5n_WJ zK!0AAhd#w+DTk@av@;Cw)wg&7zdU)`bgRtdZ~!hLVr6v;hM_|gCoFNx(g6F4Vwn%P zm0>B)D9G_Na{c5k5Xe;^GQfxl=M=rW<@Q#LkQGyNX$^4t@jb+3rX!OoSB^UxYnle2 z%AD($5z;IEFhb`?CEI+z7bn1xeBPX%W`ELIOkBCj7=`C~WYSqCCGN%t*ak@h<^$Xi zqaAzzVRo%@YqxxW9V>iU_<-0TtfRT0qD`Iq{_<$HM_<{iu9}w{Y z0p$bqwh-7H1ci|gU<~kJArGZ=XiJM1ZeGW;=P$y!3dqt7UT?oaUT)Ij>l-^*-+$Oa zv3LZaNsEVm8C-gF3;T)!F_~d#aiw&C`}YfUHiVK7`0d$WBoyk{6IfZ@qDe%1rA6Qk z&`xMrt>tmk_Bc%=Tfkx_MB39~yVN*zB{Ez>gkEtUsCboLB{IE8k*Gw*uM!!z{BeGP@plvq1e6$DDmGYFo3d{13~^dn$s2a1DY zh26M7a|Vn$2#$KWe6%$deJ?P=-wQOy>~pE?WsL)v;K#01w%gX2(^A=>#R1XA$RKYX z)d@!X0@1zzfB@DB`Xy1FV9-fX0Io?<5(q`#4SoVb)CnotGZc>afDz{d{uKisYxcQO2`TW_F9UTK)JfbWuoD2=j zwY3dRO>Av#JXBS+-TV?g!!q}5TNfN22-ND(%hn2{gi3<^g8!ofhDZDN3o$S-I(oV| zhE&{oI=wNkMS-WS@zS(aw)Oe%|8Ek$>(-|_V@sOhcKc&39Pt@P_nWr-SahNHvHS8L z*>z2OxQ$diK1w+M3*%=vA-O8();ba9OKL7DdP_S_9I^S|F|(S%*nhUy)DxRnYHdPF z+poB@PMq>3aH-cS+Xa3$7p&dxG!$}tuH<;9VpXmnt}^k}t8H;4%UlvG~TGyd3B zx3Ympl2b59NVy^0?TAhSi^D1Z73SIvAF|o6$xK-1Bim5GGvkzm!-pe+30@25FkIqP znC9(#LX@FRWgq7P)r)KiceZdDKX+wYX7#OkYNtW>QGOo9JG!0boQ+Zs=KpHEA2NHb zcz&Yhy-R5fKe}HB-urq=EZr{OVAj$f(JnIY`Tkf|w5#m8{df0&{Xe0rS7-f~TF)xs xyOpu0bRi>8=|TBJy!V>ED_Hh_lKt~Qc+0Q3?Ty97KY^jm;OXk;vd$@?2>?kZ%2WUV diff --git a/src/main/resources/assets/create/textures/block/vault/vault_top_large.png b/src/main/resources/assets/create/textures/block/vault/vault_top_large.png index b1323a06acd2afd99be9cc61bb42daa5ef407b57..44b837d810ad3244b4c17f4ba07a65f9509f3a41 100644 GIT binary patch delta 326 zcmV-M0lEJ90+0icBnUQ8OjJbx005CGGk*i;J$V2C00DGTPE!Ct=GbNc0004EOGiWi zhy@);00009a7bBm000XU000XU0RWnu7ytkO2XskIMF;5u2M{VN#d#eo0002fNklI|1%5mE^rtr5ej)gp-f@C_0zWAg*z10-xFzkJ!rko YFY#`5l*ZZzV21c_`_55O4IMPJX)+oKp%`J_}4_d+nFZo}6{is!nG4r;ZQm zIV)Hu>~Vr*<|ntz`~uEAX?=}?G**Ora@#0?ac>Z`jRwkS+*UpR%eF^O}#h@jnh z2EH_gP~Hxsr@W_JLU|u-=$Oc=y?*zEZ%W7Zc6{dy5PR^RTj4|#!zPA1BC3vaWKJ-> zPHEh{Ahu~&N34SCB>Va7|C(%G?7r}M!ShCijB@i={hRk4%($=q>b6bo;+y;YWA}p?1#vn1h=(?l8$c4)igDr>mdKI;Vst0E%;v3jhEB diff --git a/src/main/resources/assets/create/textures/block/vault/vault_top_medium.png b/src/main/resources/assets/create/textures/block/vault/vault_top_medium.png index c902af018c6273399de86419fcc975d55f147836..c28936a15c3e136b931d9b787b172cc4cbf531a1 100644 GIT binary patch delta 365 zcmV-z0h0cN1E>R#7!(Kt0001;w}I>c001*kOjJbx005CGFn{&Y(~AHA00DGTPE!Ct z=GbNc0004EOGiWihy@);00009a7bBm000XU000XU0RWnu7ytkO2XskIMF;5u2M{qN z{P4>l0002)NklFTLXd@-fq@~yJ?AZuG6?Vqah<4RP|x$a(-X)SC<*cl{*MY69w^630_8q? zx;TbZ+)7ReF=Jy=W>ny1`@fLk1WUIu$L?KiZEYO$sP=&*y~N~G_eyqja`#gP_>1W zmZ%RP-grg5AWARl<*7xggm`O!$BHK;E`34>ghT=L0R$2}fFcNx7Mdna+cXedJ8|O6 z?0RoAXU?1%9yUAP&5n~&EFtwTt>)<5_B-GI`+sK!{?8$LjWd6*yqJ~!2@HG`tAw`4 z!K+X4lY8IdfyI+}ahOjI!-$W6@f%_%09d`oMi7uyA&Md#zr?$xSx(&lHeoyBZD${| zYp3xX8!092c6-MdFnSGXdxTDj(DIPB$I|$IGQ%JR*7na5*&ZFsC2~th+uJb!IRk&2 ze}K_FyIEge;pczf`94p4^S-`B89ejj6Fl_7bBye+(y0Z&O9LC7dF92-_qTwRZ&~2d z@)A?i2hg%bRJ)Xq^`|gr;I73}7zjoxV*sS7CL`;rEAa{%SeCikBIBXji?W*2|v5n@oKvkUV~U%tpa=YB`I zQy&5_BVWJ^??D(AhMcC<`V;_KwuXQfYQV@+yg1^BZ}8=3pT;x|1YiggVH!O6_+uRL z1+EM+vTO*zqWf*e#1ZD@*O*Elq~@ILYAa3va2)r>A_Pc<;EWX1Qw3RyuOzODKx;N+ zhqKBcPLhAZjm&I>OsH$DnfU2J09?n))1Z__U$;I7P;Z7v%i%(49GxYUJ1yq^`44XW z*Bkil21+YdCJ&+P&`8ba52`L@Gr|i3(~Q zxbS!AtWyT|YQ@ULZM1YsEM*}BOYV1xQpq9n>nwj6FH6dynIdhw!od48UosW+Qmo2{vZU%NaLrbxJ3hqC4j6`cJ)5LLX#w%6Q_8p8@-lARo5?M0G#2xq1 z*xW4qbK5pa(?PYnjzt(~)|Lc^k7dZV!gA8$DgXvlnlvsGCmF4c+h}ec9vc53VY(yv zI@K1)hQ*aP8pRCsNA1#iT-Qa%zoxeO2tt2oz@!!&r4crPOn}Jx?bY|a+~rJnghvkKZG)e{ev)5k~S$5ob`Ku?8QG{Wdq*@O#aQ(@L034c`!uLHY3qDzzVfh9dZ*~e7 zRr^lRW#@SMgXcfD#ei)Wo;Dl;+hItrZJzBBV5Jv2r%WbzP*C`Exra zdKxG?eUF*#-w7MgTCv#pcX!g}@}Nhhi0f&$iZtMQ9=2@{{Ca)8@f%h_e;HmqXP^>= zVQ5bIpXX@&ha83w$CDkcf_^KuOcRx8Ufcf!a~r>*xoZJw>_saZi+Eds|IdF_&>x=X z@|pD?@uxkHk_iKp3>$c*uEQR=j=O z(29Eoq?3d{PdVv=X2wS@{sV2RkjkS(_wE1y002ovPDHLkV1gLv B(TV^7 delta 966 zcmV;%13CPb421}gDls12cfRx8JMbUdjJo;p;U~wAW2YWIZr%alPV0Yh%J2IDZ@vHN%ta(% zsvFPqa9x)m2(WFNo%%9??<0iZ7vnV+4xVCJ7D5OHgTaL%P?>;aW>na-D~pM*HT(L% z)`A3q&E`6;>(bi!gKxh0ijO{COD+8H!4~gre89rW68(M;_&oJI+rrE9tL*KzSX^o% z#SuYgFSmsW0_%URO#tQ=<^hm0p2)VjvYc8wZjNK)`vL8C8{ZF*;t1QS0T9J9@prpD z#uGKiKeFE1WT(E&%Ifur04uB4X?C8oaPX8O2GnX603sX}AjMJYxnY{c9JqC9hWi`$ zPG2xaFWld_$E{1#6JI5w64P=(*-yh`{|An zJ_5Z%AAq0D*;Gr`b{?Hn5+>82*5;W%9Goe!Tm(GNBdGbrQN(&{6Ys?T<`3WUX#O4I zC?X8QLIf1lR?Wl@1R{*7R8CtLh9Wm*#55bd_R87VGat4%-!RF&%vlUe)h%dMCCt5zvfx9t91 ob|yU6Uf_9?$~TP?{x9tx#Q(cp#%r=r000UA07*qoM6N<$f;Yp?=>Px#