From 95da47e824dcc94284245568470f7863189a5ad0 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Sat, 18 Oct 2025 13:18:34 +0000 Subject: [PATCH] Remove empty components object from exported Geyser mappings, make pack manifest generation optional, more options in datagen --- .../rainbow/datagen/RainbowModelProvider.java | 36 ++++++++++++++----- .../definition/GeyserBaseDefinition.java | 32 ++++++++--------- .../geysermc/rainbow/pack/BedrockPack.java | 9 ++--- 3 files changed, 48 insertions(+), 29 deletions(-) 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 487257e..7766ec9 100644 --- a/datagen/src/main/java/org/geysermc/rainbow/datagen/RainbowModelProvider.java +++ b/datagen/src/main/java/org/geysermc/rainbow/datagen/RainbowModelProvider.java @@ -52,26 +52,44 @@ public abstract class RainbowModelProvider extends FabricModelProvider { private final CompletableFuture registries; private final Map, EquipmentClientInfo> equipmentInfos; - private final Path outputRoot; + private final String packName; + private final Path geyserMappingsPath; + private final Path packPath; + private Map itemInfos; private Map models; protected RainbowModelProvider(FabricDataOutput output, CompletableFuture registries, - Map, EquipmentClientInfo> equipmentInfos, ResourceLocation outputRoot) { + Map, EquipmentClientInfo> equipmentInfos, String packName, + ResourceLocation outputRoot, Path geyserMappingsPath, Path packPath) { super(output); this.registries = registries; this.equipmentInfos = equipmentInfos; - this.outputRoot = output.createPathProvider(PackOutput.Target.RESOURCE_PACK, outputRoot.getPath()) + this.packName = packName; + + Path computedOutputRoot = output.createPathProvider(PackOutput.Target.RESOURCE_PACK, outputRoot.getPath()) .file(outputRoot, "").getParent(); + this.geyserMappingsPath = computedOutputRoot.resolve(geyserMappingsPath); + this.packPath = computedOutputRoot.resolve(packPath); } protected RainbowModelProvider(FabricDataOutput output, CompletableFuture registries, - Map, EquipmentClientInfo> equipmentInfos) { - this(output, registries, equipmentInfos, ResourceLocation.withDefaultNamespace("bedrock")); + Map, EquipmentClientInfo> equipmentInfos, String packName, + ResourceLocation outputRoot) { + this(output, registries, equipmentInfos, packName, outputRoot, Path.of("geyser_mappings.json"), Path.of("pack")); + } + + protected RainbowModelProvider(FabricDataOutput output, CompletableFuture registries, + Map, EquipmentClientInfo> equipmentInfos, String packName) { + this(output, registries, equipmentInfos, packName, ResourceLocation.withDefaultNamespace("bedrock")); + } + + protected RainbowModelProvider(FabricDataOutput output, CompletableFuture registries, String packName) { + this(output, registries, Map.of(), packName); } protected RainbowModelProvider(FabricDataOutput output, CompletableFuture registries) { - this(output, registries, Map.of()); + this(output, registries, Rainbow.MOD_ID + "-generated"); } @Override @@ -81,7 +99,7 @@ public abstract class RainbowModelProvider extends FabricModelProvider { CompletableFuture bedrockPack = ClientPackLoader.openClientResources() .thenCompose(resourceManager -> registries.thenApply(registries -> { try (resourceManager) { - BedrockPack pack = createBedrockPack(outputRoot, new Serializer(output, registries), + BedrockPack pack = createBedrockPack(new Serializer(output, registries), new DatagenResolver(resourceManager, equipmentInfos, itemInfos, models)).build(); for (Item item : itemInfos.keySet()) { @@ -94,8 +112,8 @@ public abstract class RainbowModelProvider extends FabricModelProvider { return CompletableFuture.allOf(vanillaModels, bedrockPack.thenCompose(BedrockPack::save)); } - protected BedrockPack.Builder createBedrockPack(Path outputRoot, PackSerializer serializer, AssetResolver resolver) { - return BedrockPack.builder("rainbow", outputRoot.resolve("geyser_mappings.json"), outputRoot.resolve("pack"), serializer, resolver) + protected BedrockPack.Builder createBedrockPack(PackSerializer serializer, AssetResolver resolver) { + return BedrockPack.builder(packName, geyserMappingsPath, packPath, serializer, resolver) .withReporter(path -> new ProblemReporter.ScopedCollector(path, PROBLEM_LOGGER)); } diff --git a/rainbow/src/main/java/org/geysermc/rainbow/definition/GeyserBaseDefinition.java b/rainbow/src/main/java/org/geysermc/rainbow/definition/GeyserBaseDefinition.java index 66f3f04..96edb79 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/definition/GeyserBaseDefinition.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/definition/GeyserBaseDefinition.java @@ -12,29 +12,29 @@ import org.geysermc.rainbow.definition.predicate.GeyserPredicate; import java.util.List; import java.util.Optional; -import java.util.function.Function; // TODO other keys, etc. -// TODO sometimes still includes components key when patch before filtering is not empty but after is // TODO display name can be a component public record GeyserBaseDefinition(ResourceLocation bedrockIdentifier, Optional displayName, List predicates, BedrockOptions bedrockOptions, DataComponentPatch components) { private static final List> SUPPORTED_COMPONENTS = List.of(DataComponents.CONSUMABLE, DataComponents.EQUIPPABLE, DataComponents.FOOD, DataComponents.MAX_DAMAGE, DataComponents.MAX_STACK_SIZE, DataComponents.USE_COOLDOWN, DataComponents.ENCHANTABLE, DataComponents.ENCHANTMENT_GLINT_OVERRIDE); - private static final Codec FILTERED_COMPONENT_MAP_CODEC = DataComponentPatch.CODEC.xmap(Function.identity(), patch -> { - DataComponentPatch.Builder filtered = DataComponentPatch.builder(); - patch.entrySet().stream() - .filter(entry -> entry.getValue().isEmpty() || SUPPORTED_COMPONENTS.contains(entry.getKey())) - .forEach(entry -> { - if (entry.getValue().isPresent()) { - filtered.set((DataComponentType) entry.getKey(), entry.getValue().orElseThrow()); - } else { - filtered.remove(entry.getKey()); - } - }); - return filtered.build(); - }); + private static final MapCodec FILTERED_COMPONENT_MAP_CODEC = DataComponentPatch.CODEC.optionalFieldOf("components") + .xmap(optional -> optional.orElse(DataComponentPatch.EMPTY), patch -> { + DataComponentPatch.Builder filtered = DataComponentPatch.builder(); + patch.entrySet().stream() + .filter(entry -> entry.getValue().isEmpty() || SUPPORTED_COMPONENTS.contains(entry.getKey())) + .forEach(entry -> { + if (entry.getValue().isPresent()) { + filtered.set((DataComponentType) entry.getKey(), entry.getValue().orElseThrow()); + } else { + filtered.remove(entry.getKey()); + } + }); + DataComponentPatch built = filtered.build(); + return built.isEmpty() ? Optional.empty() : Optional.of(built); + }); public static final MapCodec MAP_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( @@ -42,7 +42,7 @@ public record GeyserBaseDefinition(ResourceLocation bedrockIdentifier, Optional< Codec.STRING.optionalFieldOf("display_name").forGetter(GeyserBaseDefinition::displayName), GeyserPredicate.LIST_CODEC.optionalFieldOf("predicate", List.of()).forGetter(GeyserBaseDefinition::predicates), BedrockOptions.CODEC.optionalFieldOf("bedrock_options", BedrockOptions.DEFAULT).forGetter(GeyserBaseDefinition::bedrockOptions), - FILTERED_COMPONENT_MAP_CODEC.optionalFieldOf("components", DataComponentPatch.EMPTY).forGetter(GeyserBaseDefinition::components) + FILTERED_COMPONENT_MAP_CODEC.forGetter(GeyserBaseDefinition::components) ).apply(instance, GeyserBaseDefinition::new) ); diff --git a/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java b/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java index 641780f..c22fd64 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java @@ -37,7 +37,7 @@ import java.util.function.UnaryOperator; public class BedrockPack { private final String name; - private final PackManifest manifest; + private final Optional manifest; private final PackPaths paths; private final PackSerializer serializer; @@ -49,7 +49,7 @@ public class BedrockPack { private final PackContext context; private final ProblemReporter reporter; - public BedrockPack(String name, PackManifest manifest, PackPaths paths, PackSerializer serializer, AssetResolver assetResolver, + public BedrockPack(String name, Optional manifest, PackPaths paths, PackSerializer serializer, AssetResolver assetResolver, Optional geometryRenderer, ProblemReporter reporter, boolean reportSuccesses) { this.name = name; @@ -122,7 +122,7 @@ public class BedrockPack { List> futures = new ArrayList<>(); futures.add(serializer.saveJson(GeyserMappings.CODEC, context.mappings(), paths.mappings())); - futures.add(serializer.saveJson(PackManifest.CODEC, manifest, paths.manifest())); + manifest.ifPresent(manifest -> futures.add(serializer.saveJson(PackManifest.CODEC, manifest, paths.manifest()))); futures.add(serializer.saveJson(BedrockTextureAtlas.CODEC, BedrockTextureAtlas.itemAtlas(name, itemTextures), paths.itemAtlas())); Function> textureSaver = texture -> { @@ -275,7 +275,8 @@ public class BedrockPack { PackPaths paths = new PackPaths(mappingsPath, packRootPath, attachablesPath.apply(packRootPath), geometryPath.apply(packRootPath), animationPath.apply(packRootPath), manifestPath.apply(packRootPath), itemAtlasPath.apply(packRootPath), Optional.ofNullable(packZipFile)); - return new BedrockPack(name, manifest, paths, packSerializer, assetResolver, Optional.ofNullable(geometryRenderer), reporter.apply(() -> "Bedrock pack " + name + " "), reportSuccesses); + return new BedrockPack(name, Optional.ofNullable(manifest), paths, packSerializer, assetResolver, Optional.ofNullable(geometryRenderer), + reporter.apply(() -> "Bedrock pack " + name + " "), reportSuccesses); } private static UnaryOperator resolve(Path child) {