From 834b9addce886b107bf33f25d33da9c4c075e817 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Tue, 14 Oct 2025 13:49:24 +0000 Subject: [PATCH] Fix some stuff --- datagen/build.gradle.kts | 4 ++++ .../rainbow/datagen/RainbowModelProvider.java | 1 + .../datagen/mixin/ModelProviderMixin.java | 23 ++++++++----------- datagen/src/main/resources/fabric.mod.json | 5 +++- .../resources/rainbow-datagen.accesswidener | 3 +++ .../GeyserRangeDispatchPredicate.java | 2 +- .../rainbow/mapping/BedrockItemMapper.java | 2 +- .../mapping/geometry/GeometryMapper.java | 13 ++++++++--- 8 files changed, 33 insertions(+), 20 deletions(-) create mode 100644 datagen/src/main/resources/rainbow-datagen.accesswidener diff --git a/datagen/build.gradle.kts b/datagen/build.gradle.kts index 7fa829d..715fcb3 100644 --- a/datagen/build.gradle.kts +++ b/datagen/build.gradle.kts @@ -8,3 +8,7 @@ dependencies { implementation(project(path = ":rainbow", configuration = "namedElements")) include(project(":rainbow")) } + +loom { + accessWidenerPath = file("src/main/resources/rainbow-datagen.accesswidener") +} diff --git a/datagen/src/main/java/org/geysermc/rainbow/datagen/RainbowModelProvider.java b/datagen/src/main/java/org/geysermc/rainbow/datagen/RainbowModelProvider.java index 68389a4..9524f48 100644 --- a/datagen/src/main/java/org/geysermc/rainbow/datagen/RainbowModelProvider.java +++ b/datagen/src/main/java/org/geysermc/rainbow/datagen/RainbowModelProvider.java @@ -81,6 +81,7 @@ public abstract class RainbowModelProvider extends FabricModelProvider { @Override public CompletableFuture saveJson(Codec codec, T object, Path path) { ResourceLocation location = ResourceLocation.withDefaultNamespace(path.toString()); + System.out.println("saving bedrock " + location); return DataProvider.saveStable(output, registries, codec, object, provider.json(location)); } diff --git a/datagen/src/main/java/org/geysermc/rainbow/datagen/mixin/ModelProviderMixin.java b/datagen/src/main/java/org/geysermc/rainbow/datagen/mixin/ModelProviderMixin.java index 2cf9664..678b22f 100644 --- a/datagen/src/main/java/org/geysermc/rainbow/datagen/mixin/ModelProviderMixin.java +++ b/datagen/src/main/java/org/geysermc/rainbow/datagen/mixin/ModelProviderMixin.java @@ -1,31 +1,26 @@ package org.geysermc.rainbow.datagen.mixin; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.client.data.models.ModelProvider; +import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import org.geysermc.rainbow.datagen.RainbowModelProvider; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.concurrent.CompletableFuture; @Mixin(ModelProvider.class) public abstract class ModelProviderMixin implements DataProvider { - @WrapOperation(method = "run", at = @At(value = "NEW", target = "Lnet/minecraft/client/data/models/ModelProvider$ItemInfoCollector;")) - public Object setItemInfosInRainbowModelProvider(Operation original) { - Object itemInfoCollector = original.call(); + @Inject(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/data/models/BlockModelGenerators;run()V")) + public void setItemInfosInRainbowModelProvider(CachedOutput output, CallbackInfoReturnable> callbackInfoReturnable, + @Local ModelProvider.ItemInfoCollector itemInfoCollector, @Local ModelProvider.SimpleModelCollector simpleModelCollector) { if ((Object) this instanceof RainbowModelProvider rainbowModelProvider) { rainbowModelProvider.setItemInfosMap(((ItemInfoCollectorAccessor) itemInfoCollector).getItemInfos()); - } - return itemInfoCollector; - } - - @WrapOperation(method = "run", at = @At(value = "NEW", target = "Lnet/minecraft/client/data/models/ModelProvider$SimpleModelCollector;")) - public Object setModelsInRainbowModelProvider(Operation original) { - Object simpleModelCollector = original.call(); - if ((Object) this instanceof RainbowModelProvider rainbowModelProvider) { rainbowModelProvider.setModels(((SimpleModelCollectorAccessor) simpleModelCollector).getModels()); } - return simpleModelCollector; } } diff --git a/datagen/src/main/resources/fabric.mod.json b/datagen/src/main/resources/fabric.mod.json index ff57f94..95fa4bd 100644 --- a/datagen/src/main/resources/fabric.mod.json +++ b/datagen/src/main/resources/fabric.mod.json @@ -14,7 +14,10 @@ }, "license": "MIT", "environment": "client", - "mixins": [], + "mixins": [ + "rainbow-datagen.mixins.json" + ], + "accessWidener": "rainbow-datagen.accesswidener", "depends": { "fabricloader": ">=${loader_version}", "fabric-api": "*", diff --git a/datagen/src/main/resources/rainbow-datagen.accesswidener b/datagen/src/main/resources/rainbow-datagen.accesswidener new file mode 100644 index 0000000..5ab114f --- /dev/null +++ b/datagen/src/main/resources/rainbow-datagen.accesswidener @@ -0,0 +1,3 @@ +accessWidener v2 named +accessible class net/minecraft/client/data/models/ModelProvider$ItemInfoCollector +accessible class net/minecraft/client/data/models/ModelProvider$SimpleModelCollector diff --git a/rainbow/src/main/java/org/geysermc/rainbow/definition/predicate/GeyserRangeDispatchPredicate.java b/rainbow/src/main/java/org/geysermc/rainbow/definition/predicate/GeyserRangeDispatchPredicate.java index 537a3f7..d58c7bb 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/definition/predicate/GeyserRangeDispatchPredicate.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/definition/predicate/GeyserRangeDispatchPredicate.java @@ -24,7 +24,7 @@ public record GeyserRangeDispatchPredicate(Property property, float threshold, f @Override public Type type() { - return null; + return Type.RANGE_DISPATCH; } public interface Property { diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java b/rainbow/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java index 27c054d..cf94d06 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java @@ -277,7 +277,7 @@ public class BedrockItemMapper { String safeIdentifier = base.textureName(); String bone = "bone"; ResourceLocation geometryTexture = texture; - Optional bedrockGeometry = customModel.map(model -> GeometryMapper.mapGeometry(safeIdentifier, bone, model, geometryTexture)); + Optional bedrockGeometry = customModel.flatMap(model -> GeometryMapper.mapGeometry(safeIdentifier, bone, model, geometryTexture)); Optional bedrockAnimation = customModel.map(model -> AnimationMapper.mapAnimation(safeIdentifier, bone, model.getTopTransforms())); boolean exportTexture = true; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/GeometryMapper.java b/rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/GeometryMapper.java index 58eed4f..550095b 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/GeometryMapper.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/GeometryMapper.java @@ -5,6 +5,7 @@ import net.minecraft.client.renderer.block.model.BlockElementFace; import net.minecraft.client.renderer.block.model.BlockElementRotation; import net.minecraft.client.renderer.block.model.SimpleUnbakedGeometry; import net.minecraft.client.resources.model.ResolvedModel; +import net.minecraft.client.resources.model.UnbakedGeometry; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import org.geysermc.rainbow.pack.geometry.BedrockGeometry; @@ -13,11 +14,17 @@ import org.joml.Vector3f; import org.joml.Vector3fc; import java.util.Map; +import java.util.Optional; public class GeometryMapper { private static final Vector3fc CENTRE_OFFSET = new Vector3f(8.0F, 0.0F, 8.0F); - public static BedrockGeometryContext mapGeometry(String identifier, String boneName, ResolvedModel model, ResourceLocation texture) { + public static Optional mapGeometry(String identifier, String boneName, ResolvedModel model, ResourceLocation texture) { + UnbakedGeometry top = model.getTopGeometry(); + if (top == UnbakedGeometry.EMPTY) { + return Optional.empty(); + } + BedrockGeometry.Builder builder = BedrockGeometry.builder(identifier); // Blockbench seems to always use these values TODO that's wrong builder.withVisibleBoundsWidth(4.0F); @@ -33,7 +40,7 @@ public class GeometryMapper { Vector3f min = new Vector3f(Float.MAX_VALUE); Vector3f max = new Vector3f(Float.MIN_VALUE); - SimpleUnbakedGeometry geometry = (SimpleUnbakedGeometry) model.getTopGeometry(); + SimpleUnbakedGeometry geometry = (SimpleUnbakedGeometry) top; for (BlockElement element : geometry.elements()) { // TODO the origin here is wrong, some models seem to be mirrored weirdly in blockbench BedrockGeometry.Cube cube = mapBlockElement(element).build(); @@ -48,7 +55,7 @@ public class GeometryMapper { // Bind to the bone of the current item slot bone.withBinding("q.item_slot_to_bone_name(context.item_slot)"); - return new BedrockGeometryContext(builder.withBone(bone).build(), texture); + return Optional.of(new BedrockGeometryContext(builder.withBone(bone).build(), texture)); } private static BedrockGeometry.Cube.Builder mapBlockElement(BlockElement element) {