From 6a399dd298fa5614a3897a4e76aedada9cae7bdc Mon Sep 17 00:00:00 2001 From: qiuye2024github Date: Fri, 10 Apr 2026 19:23:58 +0800 Subject: [PATCH 01/10] updata --- .devcontainer/devcontainer.json | 47 ++ .gitattributes | 20 + .github/ISSUE_TEMPLATE/000-bug-report.yml | 113 +++ .../ISSUE_TEMPLATE/001-feature-request.yml | 29 + .github/ISSUE_TEMPLATE/config.yml | 5 + .github/actions/build_setup/action.yml | 32 + .github/json/config-latest.json | 35 + .github/json/config.json | 45 ++ .github/labeler.yml | 3 + .github/pull_request_template.md | 26 + .github/release.yml | 26 + .github/workflows/auto-build.yml | 71 ++ .github/workflows/build-on-push.yml | 54 ++ .github/workflows/build.yml | 34 - .github/workflows/clean.yml | 20 + .github/workflows/format-java.yml | 41 + .github/workflows/labeler.yml | 12 + .github/workflows/manage-issue-labels.yml | 23 + .github/workflows/manage-pr-labels.yml | 43 ++ .github/workflows/publish-on-release.yml | 44 ++ .github/workflows/publish.yml | 180 +++++ .github/workflows/sync.yml | 23 + .github/workflows/test-on-push.yml | 62 ++ .github/workflows/update-gradle-cache.yml | 28 + .gitignore | 53 +- .settings/org.eclipse.buildship.core.prefs | 13 - .settings/org.eclipse.jdt.core.prefs | 348 --------- .settings/org.eclipse.jdt.ui.prefs | 3 - CHANGELOG.md | 1 + CODEOWNERS | 7 + build.gradle | 223 +++--- dependencies.gradle | 17 + gradle.properties | 22 +- gradle/forge.versions.toml | 13 + gradle/libs.versions.toml | 25 + gradle/scripts/jars.gradle | 40 + gradle/scripts/moddevgradle.gradle | 122 +++ gradle/scripts/publishing.gradle | 21 + gradle/scripts/repositories.gradle | 35 + gradle/scripts/resources.gradle | 53 ++ gradle/scripts/spotless.gradle | 44 ++ gradle/spotless/spotless.eclipseformat.xml | 400 ++++++++++ gradle/spotless/spotless.importorder | 8 + gradle/spotless/spotless.ktlint | 10 + gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 45633 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 12 +- gradlew.bat | 3 +- lombok.config | 17 +- settings.gradle | 18 +- shell.nix | 20 + .../registrate/AbstractRegistrate.java | 528 +++++++------ .../registrate/Registrate.java | 20 +- .../registrate/builders/AbstractBuilder.java | 86 ++- .../registrate/builders/BiomeBuilder.java | 473 ++++++++++++ .../registrate/builders/BlockBuilder.java | 204 ++--- .../builders/BlockEntityBuilder.java | 81 +- .../registrate/builders/Builder.java | 142 ++-- .../registrate/builders/BuilderCallback.java | 62 ++ .../registrate/builders/EntityBuilder.java | 167 +++-- .../registrate/builders/FluidBuilder.java | 272 ++++--- .../registrate/builders/ItemBuilder.java | 131 ++-- .../registrate/builders/MenuBuilder.java | 33 +- .../registrate/builders/NoConfigBuilder.java | 10 +- .../registrate/builders/package-info.java | 8 + .../modularmc/registrate/package-info.java | 10 + .../registrate/providers/DataGenContext.java | 24 +- .../providers/DataProviderInitializer.java | 57 ++ .../registrate/providers/GeneratorType.java | 3 + .../registrate/providers/ProviderType.java | 36 +- .../RegistrateAdvancementProvider.java | 244 +++--- .../providers/RegistrateDataMapProvider.java | 47 ++ .../providers/RegistrateDataProvider.java | 54 +- .../providers/RegistrateDatapackProvider.java | 29 + .../providers/RegistrateGenericProvider.java | 35 +- .../providers/RegistrateItemTagsProvider.java | 5 +- .../providers/RegistrateLangProvider.java | 30 +- .../RegistrateLookupFillerProvider.java | 3 +- .../providers/RegistrateProvider.java | 4 +- .../providers/RegistrateProviderDelegate.java | 14 +- .../providers/RegistrateTagsProvider.java | 28 +- .../RegistrateBlockModelGenerator.java | 250 +++---- .../RegistrateItemModelGenerator.java | 36 +- .../RegistrateLegacyBlockModelBuilder.java | 152 ++++ .../generators/RegistrateModelProvider.java | 31 + .../generators/RegistrateRecipeProvider.java | 701 ++++++++++++++++++ .../generators/RegistrateRecipeRunner.java | 45 ++ .../providers/generators/package-info.java | 6 + .../loot/RegistrateBlockLootTables.java | 294 ++++++++ .../loot/RegistrateEntityLootTables.java | 36 +- .../loot/RegistrateLootTableProvider.java | 29 +- .../providers/loot/RegistrateLootTables.java | 6 +- .../providers/loot/package-info.java | 6 + .../registrate/providers/package-info.java | 6 + .../util/CreativeModeTabModifier.java | 13 +- .../registrate/util/DataIngredient.java | 40 +- .../registrate/util/DebugMarkers.java | 10 +- .../registrate/util/OneTimeEventReceiver.java | 29 +- .../util/RegistrateDistExecutor.java | 3 +- .../registrate/util/Sequence.java | 14 +- .../util/entry/BlockEntityEntry.java | 33 +- .../registrate/util/entry/BlockEntry.java | 6 +- .../registrate/util/entry/EntityEntry.java | 5 +- .../registrate/util/entry/FluidEntry.java | 13 +- .../registrate/util/entry/ItemEntry.java | 6 +- .../util/entry/ItemProviderEntry.java | 4 +- .../util/entry/LazyRegistryEntry.java | 10 +- .../registrate/util/entry/MenuEntry.java | 10 +- .../registrate/util/entry/RegistryEntry.java | 30 +- .../registrate/util/entry/package-info.java | 6 + .../nullness/FieldsAreNonnullByDefault.java | 10 +- .../util/nullness/NonNullBiConsumer.java | 4 +- .../util/nullness/NonNullBiFunction.java | 4 +- .../util/nullness/NonNullConsumer.java | 13 +- .../util/nullness/NonNullFunction.java | 2 +- .../util/nullness/NonNullSupplier.java | 6 +- .../util/nullness/NonNullUnaryOperator.java | 2 +- .../registrate/util/nullness/NonnullType.java | 7 +- .../util/nullness/NullableSupplier.java | 10 +- .../util/nullness/NullableType.java | 7 +- .../util/nullness/package-info.java | 4 + .../registrate/util/package-info.java | 6 + .../registrate/builders/BiomeBuilder.java | 450 ----------- .../registrate/builders/BuilderCallback.java | 59 -- .../registrate/builders/package-info.java | 4 - .../com/tterrag/registrate/package-info.java | 4 - .../providers/DataProviderInitializer.java | 60 -- .../registrate/providers/GeneratorType.java | 4 - .../providers/RegistrateDataMapProvider.java | 46 -- .../providers/RegistrateDatapackProvider.java | 29 - .../RegistrateLegacyBlockModelBuilder.java | 152 ---- .../generators/RegistrateModelProvider.java | 31 - .../generators/RegistrateRecipeProvider.java | 697 ----------------- .../generators/RegistrateRecipeRunner.java | 45 -- .../providers/generators/package-info.java | 4 - .../loot/RegistrateBlockLootTables.java | 291 -------- .../providers/loot/package-info.java | 4 - .../registrate/providers/package-info.java | 4 - .../registrate/util/entry/package-info.java | 4 - .../util/nullness/package-info.java | 4 - .../tterrag/registrate/util/package-info.java | 4 - .../resources/META-INF/accesstransformer.cfg | 0 .../resources/META-INF/enum_extensions.json | 3 + .../templates/META-INF/neoforge.mods.toml | 35 + .../registrate/test/meta/MethodGenerator.java | 35 +- .../test/meta/ProtectedMethodScraper.java | 22 +- .../test/meta/UpdateBlockLootTables.java | 6 +- .../test/meta/UpdateEntityLootTables.java | 13 + .../test/meta/UpdateRecipeProvider.java | 13 + .../registrate/test/meta/package-info.java | 6 + .../registrate/test/mod/TestMod.java | 249 ++++--- .../registrate/test/mod/package-info.java | 6 + .../test/meta/UpdateEntityLootTables.java | 13 - .../test/meta/UpdateRecipeProvider.java | 13 - .../registrate/test/meta/package-info.java | 4 - .../registrate/test/mod/package-info.java | 4 - src/test/resources/pack.mcmeta | 14 +- 157 files changed, 5647 insertions(+), 3976 deletions(-) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/000-bug-report.yml create mode 100644 .github/ISSUE_TEMPLATE/001-feature-request.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/actions/build_setup/action.yml create mode 100644 .github/json/config-latest.json create mode 100644 .github/json/config.json create mode 100644 .github/labeler.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/release.yml create mode 100644 .github/workflows/auto-build.yml create mode 100644 .github/workflows/build-on-push.yml delete mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/clean.yml create mode 100644 .github/workflows/format-java.yml create mode 100644 .github/workflows/labeler.yml create mode 100644 .github/workflows/manage-issue-labels.yml create mode 100644 .github/workflows/manage-pr-labels.yml create mode 100644 .github/workflows/publish-on-release.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/sync.yml create mode 100644 .github/workflows/test-on-push.yml create mode 100644 .github/workflows/update-gradle-cache.yml delete mode 100644 .settings/org.eclipse.buildship.core.prefs delete mode 100644 .settings/org.eclipse.jdt.core.prefs delete mode 100644 .settings/org.eclipse.jdt.ui.prefs create mode 100644 CHANGELOG.md create mode 100644 CODEOWNERS create mode 100644 dependencies.gradle create mode 100644 gradle/forge.versions.toml create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/scripts/jars.gradle create mode 100644 gradle/scripts/moddevgradle.gradle create mode 100644 gradle/scripts/publishing.gradle create mode 100644 gradle/scripts/repositories.gradle create mode 100644 gradle/scripts/resources.gradle create mode 100644 gradle/scripts/spotless.gradle create mode 100644 gradle/spotless/spotless.eclipseformat.xml create mode 100644 gradle/spotless/spotless.importorder create mode 100644 gradle/spotless/spotless.ktlint create mode 100644 shell.nix rename src/main/java/com/{tterrag => modularmc}/registrate/AbstractRegistrate.java (71%) rename src/main/java/com/{tterrag => modularmc}/registrate/Registrate.java (75%) rename src/main/java/com/{tterrag => modularmc}/registrate/builders/AbstractBuilder.java (70%) create mode 100644 src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java rename src/main/java/com/{tterrag => modularmc}/registrate/builders/BlockBuilder.java (72%) rename src/main/java/com/{tterrag => modularmc}/registrate/builders/BlockEntityBuilder.java (78%) rename src/main/java/com/{tterrag => modularmc}/registrate/builders/Builder.java (67%) create mode 100644 src/main/java/com/modularmc/registrate/builders/BuilderCallback.java rename src/main/java/com/{tterrag => modularmc}/registrate/builders/EntityBuilder.java (62%) rename src/main/java/com/{tterrag => modularmc}/registrate/builders/FluidBuilder.java (71%) rename src/main/java/com/{tterrag => modularmc}/registrate/builders/ItemBuilder.java (73%) rename src/main/java/com/{tterrag => modularmc}/registrate/builders/MenuBuilder.java (82%) rename src/main/java/com/{tterrag => modularmc}/registrate/builders/NoConfigBuilder.java (73%) create mode 100644 src/main/java/com/modularmc/registrate/builders/package-info.java create mode 100644 src/main/java/com/modularmc/registrate/package-info.java rename src/main/java/com/{tterrag => modularmc}/registrate/providers/DataGenContext.java (70%) create mode 100644 src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java create mode 100644 src/main/java/com/modularmc/registrate/providers/GeneratorType.java rename src/main/java/com/{tterrag => modularmc}/registrate/providers/ProviderType.java (88%) rename src/main/java/com/{tterrag => modularmc}/registrate/providers/RegistrateAdvancementProvider.java (88%) create mode 100644 src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java rename src/main/java/com/{tterrag => modularmc}/registrate/providers/RegistrateDataProvider.java (79%) create mode 100644 src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java rename src/main/java/com/{tterrag => modularmc}/registrate/providers/RegistrateGenericProvider.java (79%) rename src/main/java/com/{tterrag => modularmc}/registrate/providers/RegistrateItemTagsProvider.java (95%) rename src/main/java/com/{tterrag => modularmc}/registrate/providers/RegistrateLangProvider.java (87%) rename src/main/java/com/{tterrag => modularmc}/registrate/providers/RegistrateLookupFillerProvider.java (84%) rename src/main/java/com/{tterrag => modularmc}/registrate/providers/RegistrateProvider.java (78%) rename src/main/java/com/{tterrag => modularmc}/registrate/providers/RegistrateProviderDelegate.java (54%) rename src/main/java/com/{tterrag => modularmc}/registrate/providers/RegistrateTagsProvider.java (91%) rename src/main/java/com/{tterrag => modularmc}/registrate/providers/generators/RegistrateBlockModelGenerator.java (81%) rename src/main/java/com/{tterrag => modularmc}/registrate/providers/generators/RegistrateItemModelGenerator.java (73%) create mode 100644 src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java create mode 100644 src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java create mode 100644 src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java create mode 100644 src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java create mode 100644 src/main/java/com/modularmc/registrate/providers/generators/package-info.java create mode 100644 src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java rename src/main/java/com/{tterrag => modularmc}/registrate/providers/loot/RegistrateEntityLootTables.java (62%) rename src/main/java/com/{tterrag => modularmc}/registrate/providers/loot/RegistrateLootTableProvider.java (88%) rename src/main/java/com/{tterrag => modularmc}/registrate/providers/loot/RegistrateLootTables.java (77%) create mode 100644 src/main/java/com/modularmc/registrate/providers/loot/package-info.java create mode 100644 src/main/java/com/modularmc/registrate/providers/package-info.java rename src/main/java/com/{tterrag => modularmc}/registrate/util/CreativeModeTabModifier.java (95%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/DataIngredient.java (79%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/DebugMarkers.java (89%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/OneTimeEventReceiver.java (95%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/RegistrateDistExecutor.java (89%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/Sequence.java (71%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/entry/BlockEntityEntry.java (81%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/entry/BlockEntry.java (87%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/entry/EntityEntry.java (90%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/entry/FluidEntry.java (92%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/entry/ItemEntry.java (82%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/entry/ItemProviderEntry.java (89%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/entry/LazyRegistryEntry.java (85%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/entry/MenuEntry.java (90%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/entry/RegistryEntry.java (70%) create mode 100644 src/main/java/com/modularmc/registrate/util/entry/package-info.java rename src/main/java/com/{tterrag => modularmc}/registrate/util/nullness/FieldsAreNonnullByDefault.java (72%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/nullness/NonNullBiConsumer.java (84%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/nullness/NonNullBiFunction.java (80%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/nullness/NonNullConsumer.java (73%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/nullness/NonNullFunction.java (89%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/nullness/NonNullSupplier.java (93%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/nullness/NonNullUnaryOperator.java (88%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/nullness/NonnullType.java (66%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/nullness/NullableSupplier.java (90%) rename src/main/java/com/{tterrag => modularmc}/registrate/util/nullness/NullableType.java (66%) create mode 100644 src/main/java/com/modularmc/registrate/util/nullness/package-info.java create mode 100644 src/main/java/com/modularmc/registrate/util/package-info.java delete mode 100644 src/main/java/com/tterrag/registrate/builders/BiomeBuilder.java delete mode 100644 src/main/java/com/tterrag/registrate/builders/BuilderCallback.java delete mode 100644 src/main/java/com/tterrag/registrate/builders/package-info.java delete mode 100644 src/main/java/com/tterrag/registrate/package-info.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/DataProviderInitializer.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/GeneratorType.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/RegistrateDataMapProvider.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/RegistrateDatapackProvider.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/generators/RegistrateModelProvider.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/generators/RegistrateRecipeProvider.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/generators/RegistrateRecipeRunner.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/generators/package-info.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/loot/RegistrateBlockLootTables.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/loot/package-info.java delete mode 100644 src/main/java/com/tterrag/registrate/providers/package-info.java delete mode 100644 src/main/java/com/tterrag/registrate/util/entry/package-info.java delete mode 100644 src/main/java/com/tterrag/registrate/util/nullness/package-info.java delete mode 100644 src/main/java/com/tterrag/registrate/util/package-info.java create mode 100644 src/main/resources/META-INF/accesstransformer.cfg create mode 100644 src/main/resources/META-INF/enum_extensions.json create mode 100644 src/main/templates/META-INF/neoforge.mods.toml rename src/test/java/com/{tterrag => modularmc}/registrate/test/meta/MethodGenerator.java (95%) rename src/test/java/com/{tterrag => modularmc}/registrate/test/meta/ProtectedMethodScraper.java (91%) rename src/test/java/com/{tterrag => modularmc}/registrate/test/meta/UpdateBlockLootTables.java (53%) create mode 100644 src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java create mode 100644 src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java create mode 100644 src/test/java/com/modularmc/registrate/test/meta/package-info.java rename src/test/java/com/{tterrag => modularmc}/registrate/test/mod/TestMod.java (71%) create mode 100644 src/test/java/com/modularmc/registrate/test/mod/package-info.java delete mode 100644 src/test/java/com/tterrag/registrate/test/meta/UpdateEntityLootTables.java delete mode 100644 src/test/java/com/tterrag/registrate/test/meta/UpdateRecipeProvider.java delete mode 100644 src/test/java/com/tterrag/registrate/test/meta/package-info.java delete mode 100644 src/test/java/com/tterrag/registrate/test/mod/package-info.java diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..44440af --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,47 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/python +{ + "name": "Docs Codespace", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/base:ubuntu", + "workspaceMount": "source=${localWorkspaceFolder},target=/modern,type=bind", + "workspaceFolder": "/modern/docs", + "features": { + "ghcr.io/devcontainers/features/python:1": { + "installTools": true, + "version": "3.11" + } + }, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + "forwardPorts": [8000], + + // Use 'postCreateCommand' to run commands after the container is created. + "postCreateCommand": "pip3 install --user -r requirements.txt", + + // Configure tool-specific properties. + "customizations": { + "vscode": { + "settings": { + "yaml.schemas": { + "https://squidfunk.github.io/mkdocs-material/schema.json": "mkdocs.yml" + }, + "yaml.customTags": [ + "!ENV scalar", + "!ENV sequence", + "tag:yaml.org,2002:python/name:material.extensions.emoji.to_svg", + "tag:yaml.org,2002:python/name:material.extensions.emoji.twemoji", + "tag:yaml.org,2002:python/name:pymdownx.superfences.fence_code_format" + ], + "git.openRepositoryInParentFolders": "always", + "git.autofetch": "all", + "git.autoStash": true + }, + "extensions": ["redhat.vscode-yaml"] + } + } + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} + diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..67572fd --- /dev/null +++ b/.gitattributes @@ -0,0 +1,20 @@ +# Auto detect text files and normalize to LF +* text=auto eol=lf + +# Ensure these are always LF +*.java text eol=lf +*.kt text eol=lf +*.json text eol=lf +*.gradle text eol=lf +*.properties text eol=lf +*.xml text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.md text eol=lf +*.txt text eol=lf + +# Binary files +*.png binary +*.jpg binary +*.jar binary +*.ogg binary diff --git a/.github/ISSUE_TEMPLATE/000-bug-report.yml b/.github/ISSUE_TEMPLATE/000-bug-report.yml new file mode 100644 index 0000000..126b7a7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/000-bug-report.yml @@ -0,0 +1,113 @@ +name: Bug Report / 错误报告 +description: Report a bug where something is not working as expected. / 报告某物未按预期工作的错误。 +labels: [ "type: bug" ] +body: + - type: checkboxes + id: existing-issue + attributes: + label: Checked for existing issues / 已检查现有问题 + description: You have checked for existing reports of this issue, open or closed. / 您已检查过此问题的现有报告(开放或已关闭)。 + options: + - label: "I have checked for existing issues, and have found none. / 我已检查现有问题,未发现相同报告。" + required: true + - type: checkboxes + id: tried-latest + attributes: + label: Tested latest version / 已测试最新版本 + description: You have checked that this issue occurs on the latest version of Mekanism Extras. / 您已确认此问题在 Mekanism Extras 的最新版本中出现。 + options: + - label: "I have checked that this occurs on the latest version. / 我已确认此问题在最新版本中出现。" + required: true + - type: input + id: mekanismextras-version + attributes: + label: SyncedData Version / SyncedData 版本 + description: The version of SyncedData you were using when this bug was encountered. If you do not know where to find this, look for the mod jar file in the mods folder, or in the mods viewer in-game. / 遇到此错误时使用的 SyncedData 版本。如果不知道如何查找,请查看 mods 文件夹中的 mod jar 文件,或游戏内的模组查看器。 + placeholder: "Example: v2.3.4 / 例如:v2.3.4" + validations: + required: true + - type: dropdown + id: mc-version + attributes: + label: Minecraft Version / Minecraft 版本 + description: The version of Minecraft you were using when this bug was encountered. If you do not know where to find this, it is in the bottom left of the main menu. Any version not listed is not supported. / 遇到此错误时使用的 Minecraft 版本。如果不知道如何查找,它位于主菜单的左下角。未列出的任何版本均不受支持。 + options: + - "26.1 NeoForge" + validations: + required: true + - type: dropdown + id: recipe-viewer + attributes: + label: Recipe Viewer Installed + description: The recipe viewer installed. + options: + - "JEI" + - "REI" + - "EMI" + validations: + required: false + - type: dropdown + id: environment + attributes: + label: Environment / 环境 + description: How you were playing on the world. Hybrid servers are unsupported. / 您在世界中游玩的方式。不支持混合服务器。 + options: + - "Singleplayer / 单人游戏" + - "Multiplayer - Open to LAN / 多人游戏 - 开放局域网" + - "Multiplayer - Dedicated Server / 多人游戏 - 专用服务器" + validations: + required: true + - type: dropdown + id: cross-mod + attributes: + label: Cross-Mod Interaction / 跨模组交互 + description: Does this bug occur because of another mod installed alongside Mekanism Extras? / 此错误是否由于与 Mekanism Extras 同时安装的其他模组引起? + options: + - "Yes / 是" + - "No / 否" + - "Unsure / 不确定" + validations: + required: true + - type: textarea + id: other-mods + attributes: + label: Other Installed Mods / 其他已安装模组 + description: Enter the name of the modpack you're playing, or list all mods you have installed here. / 输入您正在游玩的整合包名称,或在此处列出所有已安装的模组。 + placeholder: "Example: Cosmic Frontiers, Monifactory, Embeddium, NuclearCraft Neoteric, AE2,... / 例如:Cosmic Frontiers, Monifactory, Embeddium, NuclearCraft Neoteric, AE2,..." + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected Behavior / 预期行为 + description: What you expected to happen. Attach screenshots here as necessary. / 您期望发生什么。必要时在此处附加截图。 + placeholder: "Example: Expected to produce X by consuming Y. / 例如:期望通过消耗 Y 来生产 X。" + validations: + required: true + - type: textarea + id: result + attributes: + label: Actual Behavior / 实际行为 + description: What happened despite your expectations. Attach screenshots here as necessary. / 与您预期不符的实际发生情况。必要时在此处附加截图。 + placeholder: "Example: Produced one X but Y was not consumed. / 例如:生产了一个 X 但 Y 未被消耗。" + validations: + required: true + - type: textarea + id: reproduction + attributes: + label: Steps to Reproduce / 重现步骤 + description: How to reproduce the bug. / 如何重现此错误。 + placeholder: "Example: 1) I did X... / 例如:1) 我做了 X..." + validations: + required: true + - type: textarea + id: additional-info + attributes: + label: Additional Information / 附加信息 + description: Any additional information you wish to provide. Please add anything which did not fit into the other sections here. / 您希望提供的任何附加信息。请将不适合其他部分的内容添加在此处。 + placeholder: "Example: This is likely caused by X because... / 例如:这很可能由 X 引起,因为..." + validations: + required: false + - type: markdown + attributes: + value: Thank you for taking the time to fill out this bug report. / 感谢您抽出时间填写此错误报告。 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/001-feature-request.yml b/.github/ISSUE_TEMPLATE/001-feature-request.yml new file mode 100644 index 0000000..883702c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/001-feature-request.yml @@ -0,0 +1,29 @@ +name: Feature Request / 功能请求 +description: Request a new feature. / 请求新功能。 +labels: [ "type: feature" ] +body: + - type: input + id: cross-mod + attributes: + label: Cross-mod Integration / 跨模组集成 + description: "Does this feature involve integration with another mod? If so specify the mod(s). Otherwise, leave this blank. / 此功能是否涉及与其他模组的集成?如果是,请指定模组名称。否则留空。" + placeholder: "Example: Create Mod / 例如:Create Mod" + - type: dropdown + id: mc-version + attributes: + label: Minecraft Version / Minecraft 版本 + description: The version of Minecraft you wish this feature was added for. / 您希望此功能添加到的 Minecraft 版本。 + options: + - "Both" + - "26.1 NeoForge" + - type: textarea + id: description + attributes: + label: Feature Description / 功能描述 + description: "What feature would you like to have? Please describe it here. / 您希望拥有什么功能?请在此描述。" + placeholder: "Example: I want to be able to do... / 例如:我希望能够做..." + validations: + required: true + - type: markdown + attributes: + value: Thank you for taking the time to fill out this feature request. / 感谢您抽出时间填写此功能请求。 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..e4c90c4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Discord / Discord 服务器 + url: https://discord.gg/KqQx9DEJGm + about: Join us on Discord to chat, discuss the game, and more. For bug reports, please use GitHub issues. / 加入我们的 Discord 服务器来闲聊、讨论游戏等。错误报告请使用 GitHub issues。 \ No newline at end of file diff --git a/.github/actions/build_setup/action.yml b/.github/actions/build_setup/action.yml new file mode 100644 index 0000000..c1bf4ed --- /dev/null +++ b/.github/actions/build_setup/action.yml @@ -0,0 +1,32 @@ +name: Build Setup +description: Setup for standard Java builds + +inputs: + update-cache: + description: If cache should be updated + required: false + default: 'false' + ref: + description: 'Ref to checkout' + required: false + +runs: + using: 'composite' + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} + - name: Set up JDK + uses: actions/setup-java@v4 + env: + REF: ${{ inputs.ref || github.ref }} + with: + distribution: temurin + java-version: 25 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + with: + cache-write-only: ${{ inputs.update-cache }} + cache-read-only: ${{ github.ref != 'refs/heads/26.1' }} + add-job-summary: 'on-failure' diff --git a/.github/json/config-latest.json b/.github/json/config-latest.json new file mode 100644 index 0000000..85b09dc --- /dev/null +++ b/.github/json/config-latest.json @@ -0,0 +1,35 @@ +{ + "categories": [ + { + "title": "### Added", + "labels": ["type: feature"] + }, + { + "title": "### Fixed", + "labels": ["type: bugfix"] + }, + { + "title": "### Changed", + "labels": ["type: refactor", "type: translation"] + } + ], + "sort": "ASC", + "template": "## What's Changed since #{{FROM_TAG}}\n#{{CHANGELOG}}\n#{{UNCATEGORIZED}}\n#{{CHANGES}} lines changed - see the [full diff here](#{{RELEASE_DIFF}})", + "pr_template": "- #{{TITLE}} by @#{{AUTHOR}} in [##{{NUMBER}}](#{{URL}})", + "empty_template": "", + "ignore_labels": ["ignore changelog"], + "tag_resolver": { + "method": "semver", + "filter": { + "pattern": "^(?!v?[0-9\\.]+(-26\\.1)?$).+$", + "flags": "gu" + }, + "transformer": { + "pattern": "v?([0-9\\.]+)(-[0-9\\.]+)?", + "target": "$1" + } + }, + "max_pull_requests": 1000, + "max_back_track_time_days": 365, + "base_branches": ["1.20.1"] +} \ No newline at end of file diff --git a/.github/json/config.json b/.github/json/config.json new file mode 100644 index 0000000..19f3993 --- /dev/null +++ b/.github/json/config.json @@ -0,0 +1,45 @@ +{ + "categories": [ + { + "title": "### Added", + "labels": ["type: feature"] + }, + { + "title": "### Fixed", + "labels": ["type: bugfix"] + }, + { + "title": "### Changed", + "labels": ["type: refactor", "type: translation"] + } + ], + "sort": "ASC", + "template": "## Version [v#{{VERSION}}](#{{RELEASE_DIFF}})\n#{{CHANGELOG}} ", + "pr_template": "- #{{TITLE}} by @#{{AUTHOR}} in [##{{NUMBER}}](#{{URL}})", + "custom_placeholders": [ + { + "name": "VERSION", + "source": "TO_TAG", + "transformer": { + "pattern": "v?([0-9\\.]+)(-[0-9\\.]+)?", + "target": "$1" + } + } + ], + "empty_template": "", + "ignore_labels": ["ignore changelog"], + "tag_resolver": { + "method": "semver", + "filter": { + "pattern": "^(?!v?[0-9\\.]+(-26\\.1)?$).+$", + "flags": "gu" + }, + "transformer": { + "pattern": "v?([0-9\\.]+)(-[0-9\\.]+)?", + "target": "$1" + } + }, + "max_pull_requests": 1000, + "max_back_track_time_days": 365, + "base_branches": ["1.20.1"] +} \ No newline at end of file diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 0000000..26bb812 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,3 @@ +# https://github.com/github/issue-labeler#usage +26.1: + - '/^26\.1 NeoForge$/m' \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..e4d6702 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,26 @@ +## What / 目的 +_This section describes what this PR is about. It should be a clear and concise description concerning what this PR is for, why this PR is needed, and why it should be accepted._ +_Linking an issue can be used alternatively to writing a description._ +_此部分描述该 PR 的内容。它应清晰简洁地说明该 PR 的目的、必要性以及为何应该被接受。_ +_也可以通过链接相关 Issue 来替代描述。_ + +## Implementation Details / 实现细节 +_Any implementations in this PR that should be carefully looked over, or that could/should have alternate solutions proposed._ +_本 PR 中任何需要仔细审查的实现细节,或者可能/应该提出替代解决方案的部分。_ + +## Outcome / 结果 +_A short description of what this PR added/fixed/changed/removed._ +_For correct linking of issues please use any of the Closes/Fixes/Resolves keywords. Example: When a PR is fixing a bug use "Fixes: #number-of-bug"_ +_简要描述此 PR 添加/修复/更改/删除了什么。_ +_为了正确链接 Issue,请使用 Closes/Fixes/Resolves 等关键词。例如:当 PR 修复一个 bug 时,使用 "Fixes: #bug编号"_ + +## Additional Information / 附加信息 +_This section is for screenshots to demonstrate any GUI or rendering changes, or any other additional information that reviewers should be aware of._ +_此部分用于放置展示 GUI 或渲染更改的截图,或任何其他审阅者应了解的其他信息。_ + +## Potential Compatibility Issues / 潜在兼容性问题 +_This section is for defining possible compatibility issues. It must be used when there are API changes, item/block/material/machine changes, or recipe changes._ +_此部分用于定义可能的兼容性问题。当存在 API 更改、物品/方块/材料/机器更改或配方更改时,必须使用此部分。_ + +**Please fill in as much useful information as possible. Also, please remove all unused sections, including this and the other explanations.** +**请尽可能填写有用的信息。同时,请删除所有未使用的部分,包括此说明和其他解释。** \ No newline at end of file diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000..3f89d47 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,26 @@ +changelog: + + exclude: + labels: + - "ignore changelog" + + categories: + - title: New Features + labels: + - "type: feature" + + - title: Bug Fixes + labels: + - "type: bug" + + - title: Internal Changes + labels: + - "type: refactor" + + - title: Translation Changes + labels: + - "type: translation" + + - title: Other Changes + labels: + - "*" diff --git a/.github/workflows/auto-build.yml b/.github/workflows/auto-build.yml new file mode 100644 index 0000000..8e18c03 --- /dev/null +++ b/.github/workflows/auto-build.yml @@ -0,0 +1,71 @@ +name: Latest Build + +on: + push: + branches: ['26.1'] + paths: ['src/**', '**/*.gradle', 'gradle.properties'] + +concurrency: + group: auto-build-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ github.token }} + PUBLISH: ${{ !contains(github.event.commits[0].message, '[no-snapshot]') }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} + MAVEN_USER: ${{ secrets.MAVEN_USER }} + SNAPSHOT: true + CI: true + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # do a full checkout instead of a shallow clone of HEAD so spotless's ratchetFrom works + - name: Setup Build + uses: ./.github/actions/build_setup + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Get Mod Version + id: ver + run: echo "version=$(./gradlew -q printVersion)" >> $GITHUB_OUTPUT + - name: Version Suffix + id: suffix + run: echo "VERSION_SUFFIX=$(echo "${{ github.sha }}" | cut -c 1-7)" >> $GITHUB_ENV + - name: Build + run: ./gradlew build + - name: Rename Jars + if: ${{ env.PUBLISH == 'true' }} + run: for file in build/libs/*; do mv "$file" "${file/SHOT/SHOT+$(date --utc '+%Y%m%d-%H%M%S')-${{ env.VERSION_SUFFIX }}}"; done; + - name: Upload Artifacts + if: ${{ env.PUBLISH == 'true' }} + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: build/libs/* + if-no-files-found: error + retention-days: 90 + - name: Changelog + id: changelog + if: ${{ env.PUBLISH == 'true' }} + uses: mikepenz/release-changelog-builder-action@v5 + with: + configuration: "./.github/json/config-latest.json" + toTag: ${{ github.ref }} + fetchViaCommits: true + failOnError: false + - name: Release Latest + if: ${{ env.PUBLISH == 'true' }} + uses: andelf/nightly-release@46e2d5f80828ecc5c2c3c819eb31186a7cf2156c + with: + tag_name: latest-${{ github.ref_name }} + name: '${{ github.ref_name }}-${{ steps.ver.outputs.version}} SNAPSHOT ${{ env.VERSION_SUFFIX }}' + prerelease: true + body: | + The latest build of GTMoreMachine for Minecraft ${{ github.ref_name }}. + Please report any [issues](https://github.com/ModularMCLib/Registrate/issues). + ${{ steps.changelog.outputs.changelog }} + files: build/libs/*.jar diff --git a/.github/workflows/build-on-push.yml b/.github/workflows/build-on-push.yml new file mode 100644 index 0000000..accf677 --- /dev/null +++ b/.github/workflows/build-on-push.yml @@ -0,0 +1,54 @@ +name: Build pull request on push + +on: + pull_request: + paths: ['**'] + +# Cancel previous jobs if PR gets another push +concurrency: + group: PR-build-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + env: + VERSION_SUFFIX: "PR-${{ github.event.number }}" + steps: + - uses: actions/checkout@v4 + - name: Check Path Filter + uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + code: + - 'src/**' + - '*.gradle' + - 'gradle.properties' + - 'gradlew*' + - 'gradle/**' + - name: Setup Build + if: steps.filter.outputs.code == 'true' + uses: ./.github/actions/build_setup + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build + if: steps.filter.outputs.code == 'true' + run: ./gradlew assemble + - name: Rename Jars + if: steps.filter.outputs.code == 'true' + run: for file in build/libs/*; do mv "$file" "${file/.jar/-${{ env.VERSION_SUFFIX }}.jar}"; done; + - name: Upload All Artifacts + if: steps.filter.outputs.code == 'true' + uses: actions/upload-artifact@v4.0.0 + with: + name: Full Package + path: build/libs/* + retention-days: 15 + - name: Upload Main Jar + if: steps.filter.outputs.code == 'true' + uses: actions/upload-artifact@v4.0.0 + with: + name: Main Jar + path: build/libs/*[0-9]-PR-*.jar + retention-days: 15 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 65e7b1a..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Build - -on: [workflow_dispatch, push, pull_request] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Setup Java - run: echo "JAVA_HOME=$JAVA_HOME_21_X64" >> "$GITHUB_ENV" - - - name: NeoGradle Cache - uses: actions/cache@v4 - with: - path: "**/.gradle/repositories/" - key: "${{ runner.os }}-gradle-${{ hashFiles('**/libs.versions.*', '**/*.gradle*', '**/gradle-wrapper.properties') }}" - restore-keys: "${{ runner.os }}-gradle-" - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - with: - gradle-home-cache-cleanup: true - cache-read-only: false - - - name: Validate Gradle Wrapper Integrity - uses: gradle/wrapper-validation-action@v2 - - - name: Build & Publish to Maven - env: - MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }} - run: ./gradlew build publish \ No newline at end of file diff --git a/.github/workflows/clean.yml b/.github/workflows/clean.yml new file mode 100644 index 0000000..8e35795 --- /dev/null +++ b/.github/workflows/clean.yml @@ -0,0 +1,20 @@ +name: Clean Gradle + +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + - name: Setup Build + uses: ./.github/actions/build_setup + with: + update-cache: true + - name: Make gradlew executable + run: chmod +x ./gradlew + - name: Clean + run: ./gradlew clean diff --git a/.github/workflows/format-java.yml b/.github/workflows/format-java.yml new file mode 100644 index 0000000..2abb8cd --- /dev/null +++ b/.github/workflows/format-java.yml @@ -0,0 +1,41 @@ +# Runs formatting requirements +name: Java Formatting + +on: + push: + branches: ['26.1'] + paths: ['src/main/java/**', 'src/test/**'] + pull_request: + paths: ['**'] + +concurrency: + group: formatting-${{ github.ref }} + cancel-in-progress: true + +jobs: + formatting: + name: Formatting + runs-on: ubuntu-latest + permissions: + pull-requests: read + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 # do a full checkout instead of a shallow clone of HEAD so spotless's ratchetFrom works + - name: Check Path Filter + uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + code: + - 'src/main/java/**' + - 'src/test/**' + - name: Setup Build + if: steps.filter.outputs.code == 'true' + uses: ./.github/actions/build_setup + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Run Spotless Formatting Check with Gradle + if: steps.filter.outputs.code == 'true' + run: ./gradlew spotlessCheck --warning-mode all diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 0000000..48cbd8b --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,12 @@ +name: Label PRs + +on: + - pull_request_target + +jobs: + labeler: + permissions: + pull-requests: write + contents: read + uses: ModularMCLib/GithubActions/.github/workflows/labeler.yml@main + secrets: inherit diff --git a/.github/workflows/manage-issue-labels.yml b/.github/workflows/manage-issue-labels.yml new file mode 100644 index 0000000..ec7b5cd --- /dev/null +++ b/.github/workflows/manage-issue-labels.yml @@ -0,0 +1,23 @@ +# Manages labels on new issues +name: Issue Labels + +on: + issues: + types: [opened] + +permissions: + issues: write + contents: read + +jobs: + labels: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: '26.1' + sparse-checkout: '.github/labeler.yml' + - uses: github/issue-labeler@v3.3 + with: + configuration-path: .github/labeler.yml + enable-versioned-regex: 0 diff --git a/.github/workflows/manage-pr-labels.yml b/.github/workflows/manage-pr-labels.yml new file mode 100644 index 0000000..80c2e0c --- /dev/null +++ b/.github/workflows/manage-pr-labels.yml @@ -0,0 +1,43 @@ +# Manages labels on PRs before allowing merging +name: Pull Request Labels + +# Checks for label once PR has been reviewed or label is applied +on: + pull_request: + types: [opened, labeled, unlabeled] + +concurrency: + group: pr-labels-${{ github.head_ref }} + cancel-in-progress: true + +jobs: + labels: + name: Label Check + runs-on: ubuntu-latest + permissions: + pull-requests: read # needed to utilize required-labels + steps: + - name: Check for Merge-Blocking Labels # blocks merge if present + uses: mheap/github-action-required-labels@v5 + with: + mode: exactly + count: 0 + labels: 'do not merge, admin merge' + exit_type: failure + + - name: Check for Required Type Labels # require at least one of these labels + uses: mheap/github-action-required-labels@v5 + with: + mode: minimum + count: 1 + labels: 'type: feature, type: bugfix, type: refactor, type: translation, type: tests, ignore changelog' + exit_type: failure + + - name: Check for Required Release Label # require exactly one of these labels + uses: mheap/github-action-required-labels@v5 + with: + mode: exactly + count: 1 + labels: 'release: api - X.0.0, release: major - 0.X.0, release: Patch - 0.0.X, release: stale' + exit_type: failure + diff --git a/.github/workflows/publish-on-release.yml b/.github/workflows/publish-on-release.yml new file mode 100644 index 0000000..ecd72fb --- /dev/null +++ b/.github/workflows/publish-on-release.yml @@ -0,0 +1,44 @@ +name: Publish on Release + +on: + release: + types: [released] + +jobs: + meta: + name: Metadata + runs-on: ubuntu-latest + outputs: + CHANGELOG: ${{ steps.changelog.outputs.changelog }} + permissions: + contents: write + pull-requests: read + steps: + - name: Get Config + uses: actions/checkout@v4 + with: + ref: ${{ github.ref_name }} + sparse-checkout: '.github/json' + - name: Generate changelog + id: changelog + env: + GITHUB_TOKEN: ${{ github.token }} + uses: mikepenz/release-changelog-builder-action@v5 + with: + configuration: './.github/json/config.json' + ignorePreReleases: true + fetchViaCommits: true + failOnError: true + + publish-26: + name: '26.1' + needs: [ meta ] + if: ${{ contains(github.ref_name, '26.1') }} + secrets: inherit + uses: ./.github/workflows/publish.yml + with: + simulate: ${{ startsWith(github.event.release.name, 'simulate') || github.repository_owner != 'ModularMCLib' }} + tag-name: ${{ github.ref_name }} + version: '26.1' + release-body: ${{ github.event.release.body }} + changelog-body: ${{ needs.meta.outputs.CHANGELOG }} \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..7e5bf0a --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,180 @@ +name: Publish Version + +on: + workflow_call: + inputs: + simulate: + required: false + type: boolean + tag-name: + description: 'Tag to build from and upload to' + required: true + type: string + version: + description: 'Version identifier;' + required: true + type: string + release-body: + description: 'Body for published release notes' + required: false + type: string + changelog-body: + description: 'Body of change notes to insert into CHANGELOG.md' + required: false + type: string + +jobs: + build: + name: Build and Publish to Maven + runs-on: ubuntu-latest + permissions: + contents: write + env: + CI: 'true' + outputs: + ver: ${{ steps.ver.outputs.version }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.branch }} + - name: Setup Build + uses: ./.github/actions/build_setup + with: + ref: ${{ inputs.branch }} + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Get Version + id: ver + run: echo "version=$(./gradlew -q printVersion)" >> $GITHUB_OUTPUT + - name: Build + run: ./gradlew assemble + - name: Upload Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts-${{ inputs.tag-name }} + path: build/libs/* + if-no-files-found: error + retention-days: 3 + - name: Publish + if: ${{ !inputs.simulate }} + env: + MAVEN_USER: ${{ secrets.MAVEN_USER }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} + run: ./gradlew publish + + upload-release-artifacts: + name: Upload Artifacts + needs: build + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: build-artifacts-${{ inputs.tag-name }} + - name: Upload artifacts to release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ inputs.tag-name }} + files: ./*.jar + fail_on_unmatched_files: true + +# publish-modrinth: +# name: Publish to Modrinth +# needs: build +# if: ${{ !inputs.simulate }} +# runs-on: ubuntu-latest +# permissions: +# contents: write +# steps: +# - name: Download artifacts +# uses: actions/download-artifact@v4 +# with: +# name: build-artifacts-${{ inputs.branch }} +# - name: Publish Mod +# env: +# MC_VERSION: ${{ inputs.branch == '1.21' && '1.21.1' || '1.20.1' }} +# LOADER: ${{ inputs.branch == '1.21' && 'neoforge' || 'forge' }} +# JAVA: ${{ inputs.branch == '1.21' && '21' || '17' }} +# VERSION_TYPE: ${{ inputs.branch == '1.21' && 'beta' || 'beta' }} +# uses: Kir-Antipov/mc-publish@v3.3.0 +# with: +# modrinth-id: aADDBrNC +# modrinth-token: ${{ secrets.MODRINTH_TOKEN }} +# files: | +# ./gtmoremachine-${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}.jar +# ./!(gtmoremachine-${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}.jar) +# name: 'GTMoreMachine ${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}' +# version: 'mc${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}' +# version-type: ${{ env.VERSION_TYPE }} +# changelog: ${{ inputs.release-body }} +# loaders: ${{ env.LOADER }} +# java: ${{ env.JAVA }} +# fail-mode: fail +# +# publish-cf: +# name: Publish to CF +# needs: build +# if: ${{ !inputs.simulate }} +# runs-on: ubuntu-latest +# permissions: +# contents: write +# steps: +# - name: Download artifacts +# uses: actions/download-artifact@v4 +# with: +# name: build-artifacts-${{ inputs.branch }} +# - name: Publish Mod +# env: +# MC_VERSION: ${{ inputs.branch == '1.21' && '1.21.1' || '1.20.1' }} +# LOADER: ${{ inputs.branch == '1.21' && 'neoforge' || 'forge' }} +# JAVA: ${{ inputs.branch == '1.21' && '21' || '17' }} +# VERSION_TYPE: ${{ inputs.branch == '1.21' && 'alpha' || 'beta' }} +# uses: Kir-Antipov/mc-publish@v3.3.0 +# with: +# curseforge-id: 1397216 +# curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} +# files: | +# ./gtmoremachine-${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}.jar +# ./!(gtmoremachine-${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}.jar) +# name: 'GTMoreMachine ${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}' +# version: 'mc${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}' +# version-type: ${{ env.VERSION_TYPE }} +# changelog: ${{ inputs.release-body }} +# loaders: ${{ env.LOADER }} +# java: ${{ env.JAVA }} +# fail-mode: fail + + # After successful release, PR version bump and changelog + bump-version-and-changelog: + name: Bump Version and Build Changelog + needs: [ build, upload-release-artifacts ] + if: ${{ always() && !failure() && !cancelled() }} + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.branch }} + - name: Bump Version + run: | + git config user.name 'github-actions[bot]' + git config user.email '41898282+github-actions[bot]@users.noreply.github.com' + git switch -C gh/release-${{ inputs.version }} + BUMPED=$(echo ${{ needs.build.outputs.ver }} | awk -F. '/[0-9]+\./{$NF++;print}' OFS=.) + sed -i "s/= ${{ needs.build.outputs.ver }}/= ${BUMPED}/" gradle.properties + git commit -am "Bump version to ${BUMPED}" + - name: Prepend to CHANGELOG + if: inputs.changelog-body + run: | + { head -n 2 CHANGELOG.md; echo -e "${{ inputs.changelog-body }}"; tail -n +3 CHANGELOG.md; } > temp.md && mv temp.md CHANGELOG.md + git commit -am "Updated CHANGELOG" + - name: Push and PR + env: + GH_TOKEN: ${{ github.token }} + run: | + git push --force --set-upstream origin gh/release-${{ inputs.version }} + gh pr create -B ${{ inputs.version }} -H gh/release-${{ inputs.version }} --title "RELEASE for ${{ inputs.version }} [no-snapshot]" --body "Created by GH Workflow" --label "ignore changelog" diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml new file mode 100644 index 0000000..4890463 --- /dev/null +++ b/.github/workflows/sync.yml @@ -0,0 +1,23 @@ +name: Sync Github Folder + +on: + push: + branches: ['26.1'] + paths: ['.github/**'] + +jobs: + sync: + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ github.token }} + steps: + - uses: actions/checkout@v4 + - run: | + git config user.name 'github-actions[bot]' + git config user.email '41898282+github-actions[bot]@users.noreply.github.com' + git switch -C gh/workflow-sync + git fetch origin + git checkout origin/26.1 -- .github + git add .github + git commit --allow-empty -m "Sync Workflows" + git push --force --set-upstream origin gh/workflow-sync diff --git a/.github/workflows/test-on-push.yml b/.github/workflows/test-on-push.yml new file mode 100644 index 0000000..871ebe2 --- /dev/null +++ b/.github/workflows/test-on-push.yml @@ -0,0 +1,62 @@ +name: Test pull request on push + +on: + pull_request: + paths: ['**'] + +# Cancel previous jobs if PR gets another push +concurrency: + group: PR-test-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: ubuntu-latest + env: + VERSION_SUFFIX: "PR-${{ github.event.number }}" + steps: + - uses: actions/checkout@v4 + - name: Check Path Filter + uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + code: + - 'src/**' + - '*.gradle' + - 'gradle.properties' + - 'gradlew*' + - 'gradle/**' + - name: Setup Build + if: steps.filter.outputs.code == 'true' + uses: ./.github/actions/build_setup + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Run GameTests + if: steps.filter.outputs.code == 'true' + id: gametest + continue-on-error: true + run: ./gradlew runGameTestServer + - name: Update “Tests Passed” / “Tests Failed” labels + if: steps.filter.outputs.code == 'true' && github.event.pull_request.head.repo.full_name == github.repository + uses: actions/github-script@v7 + with: + script: | + const [add, remove] = { + success: ['Tests: Passed','Tests: Failed'], + failure: ['Tests: Failed','Tests: Passed'] + }['${{ steps.gametest.outcome }}']; + + const { owner, repo } = context.repo; + const issue_number = context.payload.pull_request.number; + + await github.rest.issues + .addLabels({ owner, repo, issue_number, labels: [add] }) + .catch(() => {}); + + await github.rest.issues + .removeLabel({ owner, repo, issue_number, name: remove }) + .catch(() => {}); + - name: Fail on GameTest failures + if: steps.filter.outputs.code == 'true' && steps.gametest.outcome == 'failure' + run: exit 1 \ No newline at end of file diff --git a/.github/workflows/update-gradle-cache.yml b/.github/workflows/update-gradle-cache.yml new file mode 100644 index 0000000..1146b6b --- /dev/null +++ b/.github/workflows/update-gradle-cache.yml @@ -0,0 +1,28 @@ +# Updates the Gradle Cache when necessary +name: Update Gradle Cache + +on: + push: + branches: ['26.1'] + paths: ['gradle/**', '**/*.gradle', 'gradle.properties', 'gradlew*', 'src/main/resources/META-INF/accesstransformer.cfg'] + workflow_dispatch: + +concurrency: + group: gradle-cache-${{ github.ref }} + cancel-in-progress: true + +jobs: + update-cache: + name: Update Grade Cache + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + - name: Setup Build + uses: ./.github/actions/build_setup + with: + update-cache: true + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build Project with Gradle + run: ./gradlew assemble --warning-mode all diff --git a/.gitignore b/.gitignore index 60fec7b..de69db8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,32 +1,27 @@ -/download -/eclipseBin -/logs +build/ +*.ipr +run/ +*.iws +out/ +*.iml +.gradle/ +output/ +bin/ +libs/ -## gradle -/.gradle -/build +.classpath +*/.factorypath +.project +.idea/ +.kotlin/ +classes/ +.metadata +.vscode +.settings +*.launch +.architectury-transformer/debug.log +src/generated/resources/.cache/ -## ForgeGradle -/run -/*.launch +*.patch +*.DS_Store -## eclipse -/eclipse -/.metadata -/.classpath -/.project -/bin - -## intellij -/out -/.idea -/*.iml -/*.ipr -/*.iws -/atlassian-ide-plugin.xml - -## gedit -*~ -/revapi-standalone-0.11.5-standalone/ - -runs/ \ No newline at end of file diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 7b8f972..0000000 --- a/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -arguments= -auto.sync=false -build.scans.enabled=false -connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) -connection.project.dir= -eclipse.preferences.version=1 -gradle.user.home= -java.home= -jvm.arguments= -offline.mode=false -override.workspace.settings=false -show.console.view=false -show.executions.view=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 9e22fb7..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,348 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 -org.eclipse.jdt.core.compiler.compliance=21 -org.eclipse.jdt.core.compiler.source=21 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=1 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=1 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert -org.eclipse.jdt.core.formatter.comment.line_length=200 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_if_empty -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_if_empty -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_if_empty -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_if_empty -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_if_empty -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_if_empty -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_if_empty -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_if_empty -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_if_empty -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_if_empty -org.eclipse.jdt.core.formatter.lineSplit=200 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=space -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 1cc0ff0..0000000 --- a/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,3 +0,0 @@ -eclipse.preferences.version=1 -formatter_profile=_Chisel2 -formatter_settings_version=16 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3d87b2d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1 @@ +# ChangeLog- no changes diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..12eca1e --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,7 @@ +# All other changes require the primary team +* @ModularMCLib/registratedevs + +# Specific files requiring admin approval +CODEOWNERS @ModularMCLib/admin +LICENSE @ModularMCLib/admin +/README.md @ModularMCLib/admin diff --git a/build.gradle b/build.gradle index 4581258..cd19a67 100644 --- a/build.gradle +++ b/build.gradle @@ -1,172 +1,117 @@ plugins { - id "io.freefair.lombok" version "8.13" - id 'com.matthewprenger.cursegradle' version '1.4.0' - id 'org.ajoberstar.grgit' version '5.2.2' -// id "com.palantir.revapi" version "1.7.0" - id 'net.neoforged.gradle.userdev' version '7.0.190' + id 'java-library' + id 'org.jetbrains.kotlin.jvm' + id 'eclipse' + id 'idea' + id 'maven-publish' + id 'jacoco' + alias libs.plugins.modDevGradle + //alias libs.plugins.shadow + alias libs.plugins.spotless + alias libs.plugins.lombok } -apply plugin: 'maven-publish' -apply plugin: 'eclipse' - -boolean dev = System.getenv('RELEASE') == null || System.getenv('RELEASE').equals('false') -def getVersion = { - def raw = grgit.describe(commit: 'HEAD', longDescr: true, tags: true) - def desc = (raw == null ? '0.0-0-unknown' : grgit.describe(commit: 'HEAD', longDescr: true, tags: true)).split('-') as List - System.out.println(desc) - def hash = desc.remove(desc.size() - 1).substring(1) - def offset = desc.remove(desc.size() - 1) - return project.mod_version.replace('x', offset) + (System.getenv("GITHUB_RUN_NUMBER") == null ? "+${hash}" : "+${System.getenv("GITHUB_RUN_NUMBER")}") -} - -System.out.println(JavaVersion.current()) - -version = "MC${minecraft_version}-${getVersion()}" -group = "com.tterrag.registrate" -archivesBaseName = "Registrate" +group = maven_group +// Formats the mod version to include the loader, Minecraft version, and '-SNAPSHOT-' if enabled. +boolean isSnapshot = System.getenv("SNAPSHOT") +version = "${mod_version}" + (isSnapshot ? "-SNAPSHOT" : "") +boolean isCI = System.getenv("CI") != null -java.toolchain.languageVersion = JavaLanguageVersion.of(21) -/* -revapi { - oldGroup = project.group - oldName = project.archivesBaseName - oldVersion = 'MC1.18.2-1.0.25' - tasks.revapiAnalyze.dependsOn reobf +java { + toolchain.languageVersion = JavaLanguageVersion.of(25) } -*/ -runs { - configureEach { - systemProperty 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP' - systemProperty 'forge.logging.console.level', 'debug' - - modSource project.sourceSets.test - modSource project.sourceSets.main +sourceSets { + // Include resources generated by data generators. + main.resources { + srcDir 'src/generated/resources' } client { - workingDirectory project.file('run') + compileClasspath += main.output + runtimeClasspath += main.output + main.runtimeClasspath } - server { - workingDirectory project.file('run/server') - programArguments '--nogui' + test { + compileClasspath += main.output + main.compileClasspath + runtimeClasspath += main.output + main.runtimeClasspath } - clientData { - workingDirectory project.file('run') - - programArguments.addAll '--mod', 'testmod', '--all', '--output', rootProject.file('src/generated/resources/').getAbsolutePath(), '--existing', rootProject.file('src/test/resources').getAbsolutePath() + extra { + compileClasspath += main.output + runtimeClasspath += main.output + main.runtimeClasspath } -} -sourceSets.main.resources { - srcDir 'src/generated/resources' + clientExtra { + compileClasspath += client.output + extra.compileClasspath + runtimeClasspath += client.output + client.runtimeClasspath + extra.runtimeClasspath + } } -repositories { - maven { - name = 'tterrag' - url = 'https://maven.tterrag.com/' +configurations { + // set these as unresolvable so we don't accidentally force all dependents to use them with us + clientRuntimeOnly.canBeResolved = false + extraRuntimeOnly.canBeResolved = false + clientExtraRuntimeOnly.canBeResolved = false + testImplementation.canBeResolved = false + testRuntimeOnly.canBeResolved = false + + runtimeClasspath.extendsFrom localRuntime + extraRuntimeClasspath.extendsFrom extraLocalRuntime + clientRuntimeClasspath.extendsFrom clientLocalRuntime + extraClientRuntimeClasspath.extendsFrom clientExtraLocalRuntime + + renderNurseCfg { + canBeConsumed = false } } -dependencies { - implementation "net.neoforged:neoforge:${neo_version}" +apply from: "$rootDir/gradle/scripts/jars.gradle" +apply from: "$rootDir/gradle/scripts/moddevgradle.gradle" +apply from: "$rootDir/gradle/scripts/repositories.gradle" +apply from: "$rootDir/dependencies.gradle" +apply from: "$rootDir/gradle/scripts/resources.gradle" +apply from: "$rootDir/gradle/scripts/publishing.gradle" +apply from: "$rootDir/gradle/scripts/spotless.gradle" - implementation group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2' - testImplementation "org.junit.jupiter:junit-jupiter-api:5.7.2" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.7.2" +tasks.withType(JavaCompile).configureEach { + options.encoding = "UTF-8" + options.compilerArgs << "-Xlint:-removal" + options.compilerArgs << "-Aquiet=true" // Suppress mixin notes } lombok { - version = "1.18.36" + version = "1.18.38" } -delombok { - format = [ - 'suppressWarnings': 'skip', - 'javaLangAsFQN': 'skip' - ] +jacoco { + applyTo runGameTestServer } -jar { - exclude('assets/**', 'data/**', '.cache/**') // Exclude generated assets, can't find a better way to do this :( - manifest { - attributes( - 'FMLModType': 'GAMELIBRARY' - ) +jacocoTestReport { + doFirst { + try { + runGameTestServer.exec() + } catch (RuntimeException ignored) {} } -} - -task sourceJar(type: Jar, dependsOn: classes) { - archiveClassifier = 'sources' - from sourceSets.main.delombokTask - exclude 'com.tterrag.registrate.test.*' -} - -javadoc { - source = delombok - configure (options) { - tags( - 'apiNote:a:API Note:', - 'implNote:a:Implementation Note:' - ) + doLast { + println "Coverage report location:" + println " - file://${layout.buildDirectory.dir('coverage').map(a -> a.file('index.html')).get()}" + println " - file://${layout.buildDirectory.dir('coverage').map(a -> a.file('coverage.xml')).get()}" } -} - -publishing { - tasks.publish.dependsOn 'build' - tasks.publishToMavenLocal.dependsOn 'build' - publications { - mavenJava(MavenPublication) { - artifact jar - artifact sourceJar - } - } - - repositories { - if (project.hasProperty('mavendir')) { - maven { url mavendir } - } - } -} - -repositories { - maven { - url 'https://repo.maven.apache.org/maven2' - name 'Maven Central' + executionData runGameTestServer + sourceSets sourceSets.test + reports { + csv.required = false + xml.required = true + html.outputLocation = layout.buildDirectory.dir('coverage') + xml.outputLocation = layout.buildDirectory.dir('coverage').map(a -> a.file('coverage.xml')) } -} - -String getChangelogText() { - def changelogFile = file('changelog.txt') - String str = '' - int lineCount = 0 - boolean done = false - changelogFile.eachLine { - if (done || it == null) { - return - } - if (it.size() > 1) { - def temp = it - if (lineCount == 0) { - temp = "Chisel ${version}" - temp = "

$temp

" - } else if (it.startsWith('-')) { - temp = "   $temp" - temp = temp.replaceAll("(\\S+\\/\\S+)#([0-9]+)\\b", "\$0") - temp = temp.replaceAll("#([0-9]+)\\b(?!<\\/a>)", "\$0") - } else { - temp = "

$temp

" - } - str += "$temp
" - lineCount++ - return - } else { - done = true - } + afterEvaluate { + classDirectories.setFrom(files(classDirectories.files.collect { + fileTree(dir: it, exclude: '**/client/**') + fileTree(dir: it, exclude: '**/mixins/**') + })) } - return str -} +} \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle new file mode 100644 index 0000000..a44c5cb --- /dev/null +++ b/dependencies.gradle @@ -0,0 +1,17 @@ +dependencies { + compileOnly(libs.jetbrains.annotations) + + testImplementation(libs.testframework.get()) + + // Standard runtime mods // + localRuntime(libs.testframework) + + renderNurseCfg(libs.renderNurse) + + ////////////////////////////////////////////////////// + // Runtime mods for dev testing with unclean client // + ////////////////////////////////////////////////////// + + ////////////////////////// + +} diff --git a/gradle.properties b/gradle.properties index 54ab804..548db01 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,11 +1,15 @@ -# Setup gradle memory -org.gradle.jvmargs=-Xmx3G -org.gradle.daemon=false -org.gradle.caching=true +org.gradle.jvmargs = -Xmx6G +org.gradle.java.installations.auto-download=false +org.gradle.parallel = true +org.gradle.caching = true -mod_version=1.3.x -minecraft_version=1.21.8 -neo_version=21.8.2-beta -neogradle.subsystems.parchment.minecraftVersion=1.21.8 -neogradle.subsystems.parchment.mappingsVersion=2025.07.18 +# Mod Info +mod_id = registrate +mod_name = Registrate +mod_version = 2.0.0 +mod_description = +mod_license = Mozilla Public License Version 2.0 +mod_url = https://github.com/ModularMCLib/Registrate/ +mod_issue_tracker = https://github.com/ModularMCLib/Registrate/issues/ +maven_group = com.modularmc.registrate diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml new file mode 100644 index 0000000..eb179be --- /dev/null +++ b/gradle/forge.versions.toml @@ -0,0 +1,13 @@ +[versions] + + +## modrinth maven ## + +## curseforge maven ## + +## libs ## + + +[libraries] + +[bundles] \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..6f23033 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,25 @@ +[versions] +minecraft = "1.26.1.1" +neoForge = "26.1.1.15-beta" +loader = "4" +shadow = "9.4.0" +spotless = "8.4.0" +modDevGradle = "2.0.141" +lombok = "9.2.0" +jetbrains-annotations = "26.1.0" +renderNurse = "0.0.14" +mixin = "0.8.7" + +[libraries] +minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" } +neoForge = { module = "net.neoforged:neoforge", version.ref = "neoForge" } +testframework = { module = "net.neoforged:testframework", version.ref = "neoForge" } +jetbrains-annotations = { module = "org.jetbrains:annotations", version.ref = "jetbrains-annotations" } +renderNurse = { module = "net.neoforged:render-nurse", version.ref = "renderNurse" } +mixin = { module = "org.spongepowered:mixin", version.ref = "mixin" } + +[plugins] +modDevGradle = { id = "net.neoforged.moddev", version.ref = "modDevGradle" } +shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } +spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } +lombok = { id = "io.freefair.lombok", version.ref = "lombok" } \ No newline at end of file diff --git a/gradle/scripts/jars.gradle b/gradle/scripts/jars.gradle new file mode 100644 index 0000000..d95fbea --- /dev/null +++ b/gradle/scripts/jars.gradle @@ -0,0 +1,40 @@ +jar { + exclude "**/.cache" + exclude "**/SimplifiedToTraditional.properties" +} + +tasks.register('slimJar', Jar) { + dependsOn("classes") + archiveClassifier = "slim" + from sourceSets.main.output +} + +java { + withSourcesJar() +} + +// Use delombok'd files for sources +sourcesJar { + exclude { + sourceSets.main.allSource.contains it.file + } + from delombok +} + +base { + archivesName = "${project.name}-${libs.versions.minecraft.get()}" +} + +afterEvaluate { + tasks.withType(org.gradle.jvm.tasks.Jar).configureEach { + destinationDirectory = file('build/libs/') + manifest.attributes([ + 'Specification-Title': project.name, + 'Specification-Version': mod_version, + 'Specification-Vendor': 'ModularMCLib Team', + 'Implementation-Title': base.archivesName, + 'Implementation-Version': version, + 'Implementation-Vendor': 'ModularMCLib Team', + ]) + } +} diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle new file mode 100644 index 0000000..02735d0 --- /dev/null +++ b/gradle/scripts/moddevgradle.gradle @@ -0,0 +1,122 @@ +import org.gradle.internal.os.OperatingSystem + +static def isJetBrainsRuntime() { + return System.getProperty('java.vm.vendor').contains('JetBrains') +} + +neoForge { + version = libs.versions.neoForge.get() + + accessTransformers { + var file = project.file('src/main/resources/META-INF/accesstransformer.cfg') + from(file) + publish(file) + } + validateAccessTransformers = true + +// interfaceInjectionData { +// var file = project.file('injected_interfaces/interfaces.json') +// from(file) +// publish file +// } +// +// interfaceInjectionData = project.files('injected_interfaces/interfaces.json') + + addModdingDependenciesTo(sourceSets.test) + addModdingDependenciesTo(sourceSets.extra) + + mods { + // define mod <-> source bindings + "${mod_id}" { + sourceSet(sourceSets.main) + sourceSet(sourceSets.client) + sourceSet(sourceSets.test) + sourceSet(sourceSets.extra) + sourceSet(sourceSets.clientExtra) + } + } + + runs { + client { + client() + sourceSet = sourceSets.clientExtra + ideName = "Client" + + + gameDirectory.set(file('run/client')) + systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) + } + + server { + server() + sourceSet = sourceSets.extra + ideName = "Server" + + gameDirectory.set(file('run/server')) + programArguments.addAll('--nogui', '--world', 'world-extra') + systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) + } + + // This run config launches GameTestServer and runs all registered gametests, then exits. + // By default, the server will crash when no gametests are provided. + // The gametest system is also enabled by default for other run configs under the /test command. + gameTestServer { + type = "gameTestServer" + sourceSet = sourceSets.test + ideName = "Game Tests" + + gameDirectory.set(file('run/gametest/server')) + systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) + environment('TEST', 'true') + } + + gameTestClient { + client() + sourceSet = sourceSets.test + ideName = "Game Tests (Client)" + + gameDirectory.set(file('run/gametest/client')) + systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) + environment('TEST', 'true') + } + + data { + clientData() + serverData() + sourceSet = sourceSets.main + ideName = "Data Generation" + + gameDirectory.set(file('run/data')) + // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. + programArguments.addAll('--mod', project.mod_id) + programArguments.addAll('--all') + programArguments.addAll('--output', file('src/generated/resources/').getAbsolutePath()) + programArguments.addAll('--existing', file('src/main/resources/').getAbsolutePath()) + } + + // applies to all the run configs above + configureEach { + // Recommended logging data for a userdev environment + // The markers can be added/remove as needed separated by commas. + // "SCAN": For mods scan. + // "REGISTRIES": For firing of registry events. + // "REGISTRYDUMP": For getting the contents of all registries. + systemProperty 'forge.logging.markers', 'REGISTRIES' + + // Enable assertions for our classes in dev environment + jvmArgument('-ea:com.modularmc.registrate...') + + // Recommended logging level for the console + // You can set various levels here. + // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels + logLevel = org.slf4j.event.Level.INFO + } + } +} + +idea { + module { + downloadSources = true + downloadJavadoc = true + } +} diff --git a/gradle/scripts/publishing.gradle b/gradle/scripts/publishing.gradle new file mode 100644 index 0000000..149eb38 --- /dev/null +++ b/gradle/scripts/publishing.gradle @@ -0,0 +1,21 @@ +publishing { +// publications { +// mavenJava(MavenPublication) { +// artifactId = base.archivesName.get() +// artifact(reobfSlimJar) +// from components.java +// } +// } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { +// Add repositories to publish to here. +// maven { +// url = "https://maven.gtceu.com" +// credentials { +// username = System.getenv("MAVEN_USER") +// password = System.getenv("MAVEN_PASSWORD") +// } +// } + } +} \ No newline at end of file diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle new file mode 100644 index 0000000..7518783 --- /dev/null +++ b/gradle/scripts/repositories.gradle @@ -0,0 +1,35 @@ +repositories { + mavenLocal() + mavenCentral() + // force gradle to download FastUtil & LWJGL from the central maven so we can get source artifacts + exclusiveContent { // Force + forRepository { mavenCentral() } + filter { + includeGroup("it.unimi.dsi") + includeGroup("org.lwjgl") + } + } + maven { + url = "https://maven.quiltmc.org/repository/release/" + } + maven { // JEI + name = "Jared's Maven" + url = "https://maven.blamejared.com/" + } + maven { // JEI mirror, AE2 + name = "ModMaven" + url = "https://modmaven.dev" + } + exclusiveContent { // terraformers - EMI + forRepository { maven { url = "https://maven.terraformersmc.com/releases/" } } + filter { includeGroup("dev.emi") } + } + exclusiveContent { // Modrinth Maven + forRepository { maven { url = "https://api.modrinth.com/maven" } } + filter { includeGroup("maven.modrinth") } + } + exclusiveContent { // Curseforge Maven + forRepository { maven { url = "https://cursemaven.com" } } + filter { includeGroup("curse.maven") } + } +} diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle new file mode 100644 index 0000000..52ba62c --- /dev/null +++ b/gradle/scripts/resources.gradle @@ -0,0 +1,53 @@ +String getConfig(String key) { + return project.properties.get(key) +} + +def mod_id = getConfig("mod_id") +def version = getConfig("version") +def mod_license = getConfig("mod_license") +def mod_name = getConfig("mod_name") +def mod_description = getConfig("mod_description") +def mod_url = getConfig("mod_url") +def mod_issue_tracker = getConfig("mod_issue_tracker") + +String suffix = System.getenv("VERSION_SUFFIX") +String version_toml = "$version" + (suffix ? "+$suffix" : "") + +tasks.register('printVersion') { + doLast { + println mod_version + } +} + +// Create run-folders for non-client configs to avoid pollution of dev envs +tasks.matching { it.name.startsWith('prepare') }.configureEach { + doFirst { + mkdir('run/client') + mkdir('run/server') + mkdir('run/gametest') + mkdir('run/data') + } +} + +var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { + var neoVersion = libs.versions.neoForge.get() + neoVersion = neoVersion.substring(0, neoVersion.lastIndexOf('.')) + var replaceProperties = [ + version : version_toml, + mod_id : mod_id, + minecraft_version : "[26.1,)", + loader_version : libs.versions.loader.get(), + neo_version : neoVersion, + mod_license : mod_license, + mod_name : mod_name, + mod_description : mod_description, + mod_url : mod_url, + mod_issue_tracker : mod_issue_tracker + ] + inputs.properties replaceProperties + expand replaceProperties + from "src/main/templates" + into "build/generated/sources/modMetadata" +} +sourceSets.main.resources.srcDir generateModMetadata +neoForge.ideSyncTask generateModMetadata \ No newline at end of file diff --git a/gradle/scripts/spotless.gradle b/gradle/scripts/spotless.gradle new file mode 100644 index 0000000..5ecb0f9 --- /dev/null +++ b/gradle/scripts/spotless.gradle @@ -0,0 +1,44 @@ +spotless { + encoding 'UTF-8' + + format 'misc', { + target '.gitignore' + + trimTrailingWhitespace() + leadingTabsToSpaces() + endWithNewline() + } + java { + target 'src/main/java/**/*.java', 'src/test/java/**/*.java' + + def orderFile = file("$rootDir/gradle/spotless/spotless.importorder") + def formatFile = file("$rootDir/gradle/spotless/spotless.eclipseformat.xml") + + toggleOffOn() + importOrderFile(orderFile) + removeUnusedImports('cleanthat-javaparser-unnecessaryimport') + trimTrailingWhitespace() + leadingSpacesToTabs() + endWithNewline() + eclipse('4.31').configFile(formatFile) + } + kotlin { + target'src/main/java/**/*.kt', 'src/test/java/**/*.kt' + + def orderFile = file("$rootDir/gradle/spotless/spotless.ktlint") + ktlint().setEditorConfigPath(orderFile) + + toggleOffOn() + trimTrailingWhitespace() + leadingSpacesToTabs() + endWithNewline() + } + json { + target('src/*/resources/**/*.json', 'src/*/resources/**/*.mcmeta') + targetExclude 'src/generated/resources/**' + biome() + trimTrailingWhitespace() + leadingSpacesToTabs() + endWithNewline() + } +} diff --git a/gradle/spotless/spotless.eclipseformat.xml b/gradle/spotless/spotless.eclipseformat.xml new file mode 100644 index 0000000..1c57b3b --- /dev/null +++ b/gradle/spotless/spotless.eclipseformat.xml @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gradle/spotless/spotless.importorder b/gradle/spotless/spotless.importorder new file mode 100644 index 0000000..dc928c6 --- /dev/null +++ b/gradle/spotless/spotless.importorder @@ -0,0 +1,8 @@ +#Organize Import Order +#Sat May 27 02:13:47 CDT 2023 +0=com.modularmc +1=net +2= +3=java +4=javax +5=\# \ No newline at end of file diff --git a/gradle/spotless/spotless.ktlint b/gradle/spotless/spotless.ktlint new file mode 100644 index 0000000..6bab578 --- /dev/null +++ b/gradle/spotless/spotless.ktlint @@ -0,0 +1,10 @@ +[*.{kt,kts}] +ktlint_code_style = intellij_idea +insert_final_newline = true +max_line_length = 200 + +ij_kotlin_imports_layout = com.modularmc.**,|,net.**,|,*,|,java.**,javax.**,kotlin.**,|,^ +ij_kotlin_packages_to_use_import_on_demand = java.util.*,com.modularmc.** +ktlint_standard_class-naming = disabled +ktlint_standard_function-naming = disabled +ktlint_standard_no-wildcard-imports = disabled \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b9530d66f5e68d973ea569d8e19de379189..f8e1ee3125fe0768e9a76ee977ac089eb657005e 100644 GIT binary patch delta 37538 zcmXVXV`Cj`(`}o^Hk!t^ZQHhOJ3HJlcWkp!W81cEn+;Cy=RIGpA8^gAnKf(HbT5GQ z9)Q)_AOh$nCt-sbk->L-2(RO@R%V{kbjp;$lZ62_>n+xVL-8R`kClzfMn{>DotIQ* zEh@6^Ptq5MvGvxlvE+9+_o#h~<`U9b#O|>JB*xI_TPG+q07K4M=12^t!ge*RZvl+p2e$n%bz~ra1qC zDat@WTThQ`Cx83)t@Rsd7ULIa5m5*r55|O?0|rKn&w9I8M}d(NGh!rWVjP~sDYVz= z9;R&7p6Q+%kL`uL-3N+*BIpTYMieh(871AGe)se3>ip63%^iogW*KylunpHLn0iN) z%CdFHT;IxGFq0l-n?ihxj}RF^Iwcl<@avE`iT!3*HZ4Fer*b5ccW#>nGT0x`4UpH* zeSeykHVKDzLCHoHEo~5aSfesdJ^67-%zv8wm`FKD2CxP*naMCOPW7xrU_LR`9~_HX zFrlh+y;QTB#o(Zccs;s;T)_UtA6^_D<4B#8R6T?Fb?OHBD0AuRG`O>4 z`EHSonORRCd%ZRja*4^BH<(AwULatI)C6rGq?9P#C}&APo%HPyG(~gK@y=PHN~8Gk zzkmCyNMS_`;zL#gsI1GQDWU6yHNo43$-s%-1aazH%E%O}(j~nJD@sLT%MfB4AhLv= z_PCa$r=!Lse9aKtsKrRm47^-;yr6Z3`#@UDcyj$^_Ni%{UbFE3_;~su2onW=jf9w! zx=p#RyNQ-kLQ8oTo2a7NKFcb5h0~Pmu#%D2K_c6$Cq!@#*qE$z%fD)^0#?#qIL>2m z6_+35cBFHFMJtzU(oU&Vsn|bXH^_oe?X!<9sL)gFHHA5W#VYOwob*mgUA!zDDpNMb z243q>L&%k@bP^bG@G6Y5Yq9z>c-83zc^TqHqxP&V#cD8CRi{WaL=%h+suHV6#1zDp+CW}sYWe7(HnUCX?b_;JIOm>gD3Dh7m-t%Kii~KBdnp!Mh~iG$eiR_ zDonsR;YX_@GmZ^Hqzl?inlmzi8WtydthD_;k|C$`LlwK;$rF$wl-aBCOyQ#NsEGrf zM$|AQOhxfYvtgF#D7wbjC-L?xKysrjqK>XdTdg4g#z0|9bS1NK7gldbbm07u)X(Pm zmOYp-hfLw1z8Q;`1PdPc!c*DhJQ|DF$Y`AwykWTwtHP|m^h9!JbA_JN`d+<_`XeL8 z+_CV^tXUXE5^F1ZK12sN==;?{$Y$>MJ!$uSd6vIZ=>YCIHOOB=Ex$h^ok8( z`XM9yIaBtXynQzwMNP4c-r;rAE$-pxU;DVjX~t#p1SHcpi2GW1<~aVw_K$Ew&IY%J z_x+>S3g3-Fr%1i!8AI`5P$C+731nxW%_edQP$)*2|0K{h0>FcY6d4Up2>ye$=a{5r z4A{4C>p%Vn>o-a=kUSaz08I$lKLt#prWhUNMvqtM&7D=9AKh9ueqf;JJ4s|9gSk&L zAL7+hMyE|O_AAjRq=02mqU9dajRa0919%8|jK}EI#l-!@#MIR1=lwobfY|{yKOSBu zEr8K_gBy8{T^*s)9vz~ z!{2g>Gxo+my&B0Wa#5e<1RHUyY#!6;KeV_;>L|5aBwx_?dlG*2UOx3c8tK#CI?J?u zpJoG2wJ^s&YU7XWWOs-zF-{V`Ewa~Y1k3Olm^K&JbDKK?Vy>9taRYfTC+Ge7-n(z$ zU4mhk9HWTHwj?5Js7g=aa6(-Hn+ua8kC8UgxBV5k;>n~}JNCbtnT8n`q4IhS!=2W< z7{6sU`WcC_ev_Io5gPX6%?s2n)fi%&r8h1-T@LXcw8`lqMMxHR$W9Pv5np3G#iY^3sggkIcEx`zctQh>4bYcQ7 z0^0wQt_c)Kf(P0rBm+_8k^&ml>=f43(f#R7v7@~lteV|)9H|0H$?XhTk%u6EJ5bZ9 z%@c=8SJ`LD?CqtFxEszle8xSx00e33m}0sv){8#M+=ksNg!9uFR|6nl!Kyea%ou0; zWawkPl`J>#y4eS3=8ROtWSHLq%|rN0O7CCaX`MFvc>czeSfTDLwz@~)hw8D|66y9= zqqLFf#yt^tFmkbJ%~Tl6d^Dm(3(<4QX<%s}s4z}&+S6&ccrBuHZL&I#$C^2{w+ZK5 zIWD7Jog}U}>KeD_7yzu*wa-ye;ZsfQG;jmA2JNnz;uEL+i1LH;`)hEwPQ)PH$fo2H zR_=jzFL3b7L;I%$%)%{gaT-~gDl-w)^uCZ{fzkFjsNOi0+M#OjLayw$}}i{odq)*(6q(cC9zEZGtYchY6-`S(9pNAJep_2(q!ogb2^gUL2j5rt z6Yqu`Ec1xF5&+5yeyOP^j?Y2opa1Z>C14Xr=$7pM1dGR2->0RWX@T(d6@KEmwh3v0He+;&m0 zdz?nl>LwQUw!JpSE)W{hGDqs+r}4*+Ue7{+o#DUtubMY^l=~Z)bX(Rd9$)$e{hL1F z3w&N~b@(GHp5)AR{{ud7tog^%4WhTZBmG~fg>EM8u1BPjIU?3iT*&8m`uTa&BPDOF z)SPQ0^NK9bP=|4j^~SlK!-w1#dn|#D)qdp>?b$y#dwO2@;vO+qQVpGhvMt4;BybK) z(IM#4I0)Z$OKqYbX3nD;8uC+B;S+nI6O_^Ia>`g5+T?#>Qrn9B{rV4a{RX#e%0Iq+ z13~?-%;%7hfiiN*0NLv22EP_@{2^1|X+feR2#J>LnYgs=hR|wYtQd^erh%-;Cqt@u z?nsPA?iMU8a6&f54r>*it29eX`UT}|c7=zDBQ;gIZ~5EnfV__tfu1F5zo`p)TSFD$ z?uo4XoaeiaWtY#p(Z2xjnIJKU8oe&xlE>AZaQs~4a?x5k05$;vFxZJEon3a5?YAna z6&d(x6JzKVG=A*4JSji@9-2J)Dfqg$+dRsyp*L;f!aPd<{OsJ^#)fZJhr5lwKdVUw zDd)cT0cA5Wn|V=4ZOj68IjGOwGU{Pz$RwsJAtVi+UjtDr5YRKW;&dBs1Pg(r{iHdc zRz)E@i_Q@PD6ywWUr>plWXoQ%lURZBQC?E55TFaRp!!jL1&hHCF?kM)m9SnUSkHSG zKvPF;8M#%Q^INbzNKOj^Ht0))l}6-h>;<+iJluj0h>zZ>WRPt$LxXsGVx|`>_zRooyqy0yfF02I#Chvgr5oy)3CR01_edkh;tWu4!yh zNWCQatYMg0D#01UbKyuBO|uQn@L4!*n7c69jbI*)>|!b*IvaV%N>D; zRW%PEU<9F~ju=Kul3$P@^fNk}zkJt!bRnb=_DTyuZ;IEJD#>JF( zq%%jd))bcSilCKn&)(;Q3t@PcTx9JEA{@U+j>zWzvkd_#(qHP-H?0T|7wXR@yQkvx zqM~qm}YAF4c| zS?hO=T;%V3jTdMMPfWLe(A?H9(NcAXBm=EEDT=T4`O{0M_o64}1A?HICS_`NIR{ec z0K(Se2*dSRBOZKM_6};N`?UljFTe6*VV;>bwX8}ka~}bwl#FIA`+*^jdriAa>%7if zIf}J5ZfWhzz;xuM$mzegr0y;kn9$T^^eN4y`Qz0;jc`s*Ssi2`5(?}9P$sGg0r5}b zTxpT2QLyehtu}`>8JBKi=f_~=MW~=700%2bt>{3u5DjzArgSpnwX#pWmJQda)P_6G zTBld9w;|^F%qqw^p*$d13bBZ7n3}%sEX@oeEJ`k>krZKiM@yjO79#R@7>fWd!?rn3 z<*3pvFU?YAmHF44~}(nbJ^!I9D$CgM45<$%`tRzSRCS0q-E55u20fb;j+ z8#k%SVHsHVn(%nNL7G3Js1foYu8Jxe#TC1Ba;4F8g{K{k+bU__AKOQ=?$H(@K#jxr zs$LHoM+l$$`E}5QzOI0xV*!Ur8)WI3a};MFl~GhXzKMWw3{G{e+p@90$C1rMy)(5$ z>2S^NFzVR3EwJ&J+J8*)hKO<)5CzQLl_lHinLd?>3|UNW&ss3pt2ppc5gJUhGn?zb z&_r1NDkF9GKo69ie+)nnG4Q-ltWLL1|DbF|u&xZ-?;iPYU6%V5>Ips>~DKwQ8~?rs6O zF5sq(0H%mg)_yLW5A-`$+|eXluc?%JeP69Jv`^E-cla6GqB8xw+7^l!k(0`!yxhR! z+nE?K*TIp-n&D?C-d|CG6d+^;fmKVyFxJf9QeumbR~BoAUOIn{{DW=itKPr58vPRB z(P-1ENplhePT4~dzp9Dm&_9td_SQxxJMXcx0-M6~H7&o_;S#~vt%8Sw<$Pv8$Y?8i z)rKB)Zd^VW_##?3vvYfr+u71Iq{H{eOfx;6bh*&I-6juO|H{DG6)*tPb@D;j}g zpf6$NN_(3(@kgs9&{%dPkaEz%sV;TS51~E{c6z@R$?=f9tIy##hv?cealPj&W|vBk z5mNs%xB0E#=M(QGpgnTv*T@+`SE$@_ZH?rW`CaRH+YQLFpYC0_7v8#Gx3hTXN5g}X znds6`V==&#t&1=2d^~GbF{eI966qmy)F;?dpIpU(bG+eUS(3A+dQxI#Zhd>2_9Oe| z_|Q9W>`VMGOr3cnE|TmaPnJp|CK3|^IMxm)^P6(eCN$0w@MLmfBwS59Iz}uvh`aIq ztIzK%FtHiV9{Jp;SenRKe_8Z-+%J75}w5}e@R zv8ktF<&fG$!X)k=-rb9oaU%P^^WVg!AY(B@D`W}sx#IK7InK&)xtccE27D{)H+-q> z{wlbYw{ddO7-?!MNXM%xNY7cX$HQOCVb!gn8@Yy)xDlKgrUxLw*V9aF=3PUsNr&+S zmRa(RJ9WQDJ~aOc?{MfF0x8P2fTwjx3`t>JDAIJ{@O{R%*?CWlfcXc#vWMZ1kAJJ5qVH zYlHA0t)Ld(q8v!-BgK(D+9@VkuRDgGne5?Xu8+a}Sdr#+=b(_Kp?+!+%4AvMwjSi?E5| zKa=ru`$IMJRYqyC8@PVWWbdgRhtLy>_ZV&M(eA8p4Vig-^*SN{CeW5rS)pw;Ya-(#LsuKT~!aR%SW>w0cp4@~(!lqOyL3^*a}mliYl-!f6VXY zXt}bsYa)lp7{Oe@GG94s%mX|^yRK7gHL_QCQ)m*;0`phj1zE;_fQ6633R)XX%D6cI`uf{vcxl_-7#orZ@ePvhb##bM z(YjWN`yFvdf=#1`d_bPXjbVaN8VJ} z$`E?5lH@VT(Krp+<;)ntK@c*&Nql}GtWd8C@EZfVy_-2(H-&2)H<}RqEn|++i@muA zwNiW$W2H^zc;)J)?a}4jleW2wixuDaj1L_j6}*$En^#UeBA}QvNEQ00xC3ifVqlOH zP+Y__3e%%}ELQVfJH;#>ocxwI8m7Z=#+sd{UPOro>WEsB1%5Mq^b8HFR~CCd4-J-n zPR+vdQEoLc8_OAVOef?~lS7VNCbB>voJV&yO-1yb@y?;-k?isfg*0TMzg2e+zA6x| zfns{*72y+2%o3}OAw5pAGPX;)p!4__Qr8SaKW`Pn!{at3K5DtJK8aE;FJ~5y*fA9l z^;pt2yWo*$sA-C+@eysl)reWo@akNkn18OK^b7fw9VARawk$Ft$R(bqE5F0=Uz+3a z9}F)2(-Nd1{x{j2lFI==43hK6ly(Z8zd1=U#)U_SAXLj^R2!9(RKX8>CRej?nGX&vZx<>kWS(%xaEWAa4V4fbDqs}ERL41bCJHy1TMp0**h?_ZFj&R9hVVb zFTj;<1!9#*k&`wPtNAC2OLmAyY!F7U*uOghcQ+0qZskjLfARuu{;Vi?9z_*Pl+N2X zZ!1+_@h>U3P(?7ZToI^*Q)9v^!C|1a3)-D9?6rqcgy{+Ng+BYCVF#a4PP&EXhKNF5 zstybN_9A71E{68DN_50{96hC3hJ5^Fbm99#5KqzhEtnv*pTXcs*cutUd+<|4Cy+V# zu2r$G%RiF2nm3lW@;>)dBmZFQQ8gj1=|@K$f$PLh+3K0V>W~0J)+~H^ z!5puU8IG^*)ADBYZ=If10MC+1LvE{9`y8~!cw8AX$kIw{5T7omw}}PkU=;k3ELXC~ zEy+^WW2|Rm!L_@{GAte?W$QD*;#uB-v$ZL48`=K%!LdAz`Hl6Vkb`qoKRa!zoIIk( z?jY*(F9j`#Hjca-sQ+Siu^aYS@cr92Kd}EVI*I@sP=(O>ek2#StbkQnR;o8If|(H! zBdz=-u-#L!i(zAXF$S7xHf`2S(EBkx0Z#rYznr z)(}96(Gkq9e)v*Qm2G3V`gM$ zyXiRZEhG{>2p0JJu=liOyQ_@H&Z&GxVF&;fkTjKC#Q*sDkkTxQ=x`7f9AB#%gWp_} zL2gKn`S3>~T{4oYt~mP-2o2RDCY~snG>rtDd|nam2XP#DxZ=A8MAWvNp~Y_PZqFGu zW>V-@_+Sn76${O*IqlcRNHSUrM?4Pf$geE{98Gr(Nr>i85PtWLJ0wku2)W~SX)A#6 zyfjo^(d3p6qf#@9^r}L$$2epO2fMR!g0Wr>tv7xX$?7D>>5J@IG?xdY!epP;9O+ zIl4cw`yXF|f&DcRUyc{&8(c4EsTv|P>;82eZFPSx^oh+A|FH)#Zov~C!U#O8 zZn$|WVL$P=dIWpYyl{4u45lA za_kO^9jq*YBpVPWOdQU)!~OXtQ%@aob3$Cdwn$Lrc$Vb2EkLO`i}68 zsvTs%q+%C|Q8H4#V@MaZ!#gjo0bXfkdtG576^$9S_$snf2^~J9Cu;milcW^h+)?4x zD=roEDH_AJ%k>y3Z62$xjAb{|vM&j0?jhfu%kdytwDD{nx2zpD68s?n66y_a%FcPh z83X)$xWQhTocII$8GwycNs`I=vI~uG<`fd=uwrngIIHhNBon-voyLc&tO*_R?#864 zRTGA81BAI{E{sU4!6>6^Vwz(WDFWO{^=Y5c^7gSyFe9D++lO_e?QNEW4Cy=o=wq-c z4jAYf3r()=no_ie|F#R3wmsp-gycu=&wpqyBwReAev%;VvAl?Yf+7TbzY&aawxe6s zO7-Vvx3WBEak11tKj-Flf1@?b*&W~A9Ur4;9E$PVO+QPtz9%*XzzlZ_*FaCX_qHq6AY)k5G@EN9LlS5i?4FT03fkP$~|p zt~PxCBA3Tx zMKNyvQc0>`2kyY#SNzHJ+0wBXg8<4;g3&v-Bh5;y#gdb`iF)Mc5*M2fA4+;FQ##!qBSb z2m0Vm^6no@SFqJh_DG3lrap-V|74Ri>%%`)x)qMmxZB#NI2*Py&shoz zUm^m8gDBnwwT+7dFZbkB)_Yg&CYBBvY0=-{y=jSrE)|al*inN~69`E^|Cf4E?ow|q z|BA;j`2U74APF`|9~mD+m(-l*9WX$o#etvFkZPkY~Lb5+iFS=&KyQi1R z&#PjSO(OTrMWbqAg_zB2nG&3wp5sWC8xwspf)63nr?JVPXt3!qj+CfLr_xrR5m%jP zbK9s>Zzv9jTLtMf)slkaAZ`Qp;drZD3X`U$x6mRjGQJ>DcWL+mVM}P>;k;f7P+iy=qHTHqxv>QoE1Bui1}i@zCJzY6#{g7 z%<<3W@%@f7W=A~^EC=j+V5{Z92Os?3X)EB7t|2rjw}ZGNbXb4<%m84fAxcEp1zTbU zT?iZscQ(KTKHtUFEq7;TNv@uoi-u^(Q5K`g9EPoa*SB|9e)1`{9k18N5@DZHUKDxg zd+MK7>3rgs-Q<-=)chnso0Pan3eW z_Mq2pjj&5+P=ugks#yTpq;U-N{pka)d`+D$JsN4Q0(oh`eztymjB$90W}ZWff%r;M zSib5Ot4J&AkohmEUtg>+eo28%{dB`!#axGYy14Wx%fm0EvJh^-filOiihkph_1MXj zRyE{jn?6NRJgK1%Inq%r__jp&#aUlG(%ttXCUex#G9ch($%&+mURrlrvshaU zd+H{UnAeF^*F0^?xt|d)y|UsWiq4~99gn%$%-&WL-NW)^{H`s9dAZU|UQ39ras*Z{ zj0RmS(^~mT(#^9bJvIlqS`qqKHtOAkQ%9oulzVn1CUS?G-;J!ZDeOf5&=*r2vk*S` z>t39G2(Gk4au?wGK^``Yvv#-6Zq*>w46c!CrZ%CZUk*N|!nQ0W0kgclmU4GqfyMr3 z9L{3s&kM8KIYMIOx=DtdawEkP=Fs{-jSC1?SQTN88r=?aOt=rESun9bn^Q)$DI}ORXJ260ss85k`7GIGvrLjfo`o23_%L01R*=45iwDqKbex_!X#NtuAz6W#9;Y=t?(aFpl zwv6nDBS8SGmaf6nznzyU%1^(Ia}N(uazUqepq=(g6@D{G2Oy@5Q+RR zFl{rJ!CKM3tO?hxmox7J;V87b`!z^BQ!OJPG;U^DbmJfjJ87^zfe&$#Z9^_J zBfMh!9N(XOFQ=DBFoU~=sbe9Hdxc#&UtviqvHt?>!uXoQ{EWx>)o5cqI{PlwHvC|^ zg61@rr)O|-_B<2C)qvZxxg^8Nn>3F0dYzR${v%Wj)bx~R|LWl! z^#7>1J~A4JkQ)V*!G;3R(ZE$h|3rk5#RjvRo10T7m6Hk74c8rTtOQfGlFDOmOv7Xl zaYltCXK^y`vrZkSPyOoq4D4#MA!;x$_q*#oB)FN)-3=b{BZrZbP00x3@_D)#Z=U{q znqmO>eUSuMp=0Op`ukFRnmJ00Ubyh#X2F>|_ewIFphs4etW*HsBPHtIATh%jqm?B`fqp()L5fY^~RM9 z<4f}7Jzf!m*#pew%gG9_O0CHCzKH{f{QwJviMJP#b=8y!-*UmNq7#Q39cH;hCE>;p zi{+q-$|pCVOQ9Wc+@^_ROzh_U9=b0x=?ji89Vb~<@+<(U8w=mnqY&*_=Qm|q2pls# zEDa7{-x&f!huW!JMI{0+%y*pBPzi>&kWCE8IBOS`Is_F$e47B@`jXsdW9((o5)??l zxd)61JZhbJaP>&}RTq|#s5i23Qg0Q{S^eV*LQLTZQwP}vxpwCE%#$@5sVtN3Uxvs9 zyX_Pv5_*8f)ctbjl>>F{78=7|TC$b?QO1bcVL}K*MY(1H>Rw?LMuYWQiWlB>B(Q6E z=cB-M#aC*2i&-_>=uZNv3=gIgtw{}bhPZ!7E0s0|veL!7fZI5k+PL%Cz+Yx{vBl42 zO!-WA){JZvW@`{)Uir%f_QI4h=I?+>v1g`yZD;BN|l8oSKSiFX+&z;5Zo1DMmP0H`6AB8>p|X zL^RRoTfrgXCMsPFsD9yfpBF%MVN*-E^}q}}t<`wMbUw8F1tU0an^^WVjrIq=I)S-o z%nV?mG|;-DXQY-5bq0Ya{*VhS9`BiuVq_Dtv)HqSW#7t|E7*Uo?x^Ln+!YC)Ow8 z4>Mi#JF-M5+=F~(dN?l0yG4>{@;(NpsT%+trc|1#XXq)j`P`^Uhf9bT^Gdin0(Ez2 z0bA4{*E10$eG7?%=9;(m>j#&S;mipaxCR8=385}39mab^KnM;hO~b=LjZSS1X5bf2R6qB9D@^x2&ddAqXoUZRF*gJ*If;PkxNwMBY-lb)>Bn%xo>`~CLciJ z`)~n1juAKrl^UXU6i{wB;{~cc>G%r#{wD9D)X$=jdRoFF4ui<_0;Y2w)*>yj_s_UQ z+U_5aw6*0Js(j^G!IF4aTF7uS%2LWmz&~iwC}@LT7CcpltcMmj(NTb__l1+4Z((-R zpcA6y5vua(8~z?w_dE}CqF)R9et<1Uh*#W_huHG@KRMHob_hNAU!hWl2HkS00~E)l z`vuYYOcom&tqI!P5<<(cgBzn>1d)4VAjE_mxyYMOPY!xzm67WR_6%C$gMtWlBqElB zcsNq;Gh8f=&i{U(2_n&eG3?)}-5hL<-UQB#@HzGewqF9Z5^3n*l8f~d#Rl4lgFI?ghnasOs47(&A<_k|s`xW#%l`T_=?(9sLhZKW<(XJgGy-pE zwx`g1@435t1)r?qXfO!0YU^`>O#Yu4tbp&AcFb|NdRst zHZJqx=zO@Dl1xX%DGv$4p@gI;b*hPqSx_}?`MeYJ4S19W?04FjCr0keFgU>XxHqH+ zn=m9`VE)HcoUu0<5GGEQB}LNlFH6hmZd?4O1dQ#+v+^tv5sML_Mi8r@0cPW~CinAX{iW`tHL))MMgr5MC;U*E>Y z2Jzw8+ut{Nfmj$tJ$)XjTw;VmRcM@IqWp7V>N7FV&CKVs#wJaVoD4(wWc8)gz!vPm zp!}5486+}?;l4O!I@2+eZV{p{^5spQ#A9Aw`-8m@Rz>rbuYejCfg`JvZGff^A()+E zQhtS}!~xr~mvF~$Y38~WU3Qdq&g-wY@Jl@NygoxwYqrx>aoS65)9m3NGWHc#PK=ZP=x3q`2)4!2RYQJ_JbhLRZiEpdXGFqLIPNX~%)soe5VxLmE;X zam_*?)T!@ezP|rQp<3?|2vGldYg+#2W}_2O04Vj^&kG{^t&_Teh8pq}ulO64^eTyj z^Ti~~g3vI63Y@oW$*0)Q8yjsTRKxwD1$tU3z@cJ)y-*t3VmKKh)$?3;da-1Dyq>Rn zd^6!iesT5tFux6hmte zdNR4^YHNH*^jJz{q&y$=0f+eo1=T__qvW*92&i?GI{YU3=$}Z6$oGkH;^&da_CrhI zEsm>*Q<*72$!XvuUUsMvyQW4!tL87>Pj3QqBJjvbQ$u0zVpf<1G&G2W1U$Lk9%{U@ zmBff*#4Vik5>x$(iJy!32Qk+;o#_Kv=~RfYU{O%clt1Y9DLv=;^8hp4X(*a76h$t| zff9#Rb%JC<`ki%;I$I51+cAwW=pckAcLNUa4FMA4 zp&etm7c94R~PIPZ$w!WmvQX zl>e`}ozE%xto;l5@c)I}ScD(I=kU+x>?gxNg)OodLOO$w?tXAjH54j^3?Zp1B&k^- z$O?LV>6qHwvhuKtq$VY=l(gzH<1mE7e}{8 zZ&#Gu1bz#ih&U6z7@s=&sIdcdSu0RMR_#u#3;8s2R)WGq^kb_5IzK-kNBOE1OG8Up zF*$9`g!30XWL)UEc=zMHSPtBdMba;+adwuJRh&$iHq&FX)Sbf5!cWTd8|E%sK`Pea z!#*p2BWLxK6nYsJ2~gJjb8JPV-rH~5V5GSYQj_68UBl-a%D%R~r>vBuBh&ha#nmjg z@Y?cPgTfM7jhvLoRwi zdV}^KFy}7nW@7(E2_FoEB0vL*O@Rg>O2L5K#TWr{4*%(MkUsUd?jTN5pdh$?Q^*>5 zEKyPKz>Kg+!Y^5sLCO(jGVWEp8V;@Nw!gcCYKL>UQ1ZGv--dG%GLRdU*Hsc;DBgd_ zH(b*y&cPzL&vjh$-cNK8Oi#>Xb$=on;>*B4J8WuKeH#9DaZ&M1sk2P8GZ|w1u%CAF zIsm-rx1Q?+-3Ye)^QmL<@X}`D8QBA!I9M^)HxLG+XY0rHwrF@paqjP3TwE+7a8(Vi z9fqrA1Xp$sRah}{E!_h%m#m_e|D z!LyS>L#^}u`cYJ|^}xZadb-LaRWx(h{sG|qDYvs82;C1v6YoO{jARvY4}SIUp%&0fz_0G=p1`MzH~fqO=X~!%?}u*!RNBg(dJVAPTNuoL(3t6ch9Z zdd`xjxrSW|rg361w?K+cF+^&V)u-6v>cNppc)=s4d4{rKz__B+`Fs;eZzvq+B|xR+ zWVnP=%R)Xsbd(SkEd$mvBz;4?FMPklnrpHI9)<*^YU*~DTN&sbyWz1Y%y zQ0l$OmzC4MQJ{izD(|TkH!7K(OsNbD_v?7U6U4%uwUj5>`u=5P_C-~S)oZ)=ns7OfR@Vup+J_x**a#l^5S`1%Geya?fcQ*Ebyj`Ip9OWm&41hL{m8eIv z{PEJ{LZB|jsVU}1xt%PpG$}!{R0pv@|F@4Gh1ZEqsF&&oI7D6{no6^(^7YsCPfl`< z>mvJ$zLh~&br%O$ZMZQ$)d-FR75oC_F{*>O<0QSTmEQ7;hoC!(F)lNx`(>(~Y3#N; z+={9>lZDR_h0V?|BB^aaj$X^MS?yACcRbZ$sr$_!NremQ@N8cYI$52CBUjzHrkpKE z-0FFkn2ay*VLSdgtz6SHFdCLD8{bR5^Chvz=xhar+9hKJ_h9}~&O7<-e~VacDwhPA zf7Au_|CZ;^k|F?||GMBO5KJdU43-*Ne+I)%$Fee9TM?zqgAkd1Xb6hMHq70qUB{xC zkm*ju_h#0DO}l_}h(hk)CRU5SgpPEssGa55_c-f1>(w0a@%e_(Lr9LZWotW8qJJ8- zp^GA~POvmd)@i`8DLnh9)uC0sW5*m~wYV1I8Jz2W0}z$zWmN5198`+L@b6^f!q@8!2hh#JL+=NVk;ny~E>$Nn* zBRt-?FCdu$ZnLTcnQ}UaQheQVV~Zw}BpIo9P{PDP zPuE~sfr*hjtq(7ST%g3GHX6tn21 zk=cn+k0yrRlsb_UF81fCd822USRz7_>us~?W$v!%*G^{ZI!_@b3BybkYJ|qZ!Dlya z-6on@KxAK#VL)o19Ds##Y5`m71QtIp+HX}!fn9`R0;3E{@TQGBFgW5tL>KKmh6t%Y z0OXL>j18)z!o6yV5Rbwpzkl;|w$RFUS6o#~^|R?Zl>GG!Hdh~)?nUlT!29VV4HLW| zq})C^b5DRn)gl6V+;q(uXQF!L7U@LsOIczBI$`un&XXcxPuD-hR$rH65Bee4St21` z5rvkX3aiY!@cXfpZF_ZD!rgJi;~F*;0C)r|xwR`TOO8#}+-ACBx2$RFBS`#mQCV`-->M}}d z>Z`v&kq{BbTO1(y#JZ<>|JS1~mn**G9G@w`6kl^(r|VbnH+2@qjV_Dnl$6SI0Mx^R zy?x2K&bdnP8XbnPjKz`X`V*($*0##okj^Dl}zS zC&SKblzOqjU@8quU&KkqapdbS0J6L$=clxBaVy^Z)0Z#aHUksd-r9k2M!ocYnsF9x zENI=PhFA)%u+})%_3GsPc8S*&1$i>^O$m-$P0Z{bS@iu*tyJJsHROt0POIMhWmtdg z)336L=vBE*9}XrW*|(~Wt!8~e?IbCk?b9Ppl{?C+0B&q~c`b6U zLAeR#nFY=K-4oIEJJ=`lO`N-=@@B zp+bixHgRN}IGW3vtvGdSL7W(+5XeKP@D#F{%C$+R2&wCBHVHCV3ZP5MTd6=`>U96O z;xuvwUyUJ7u<*$FZeeu;;O&lZYC!9LCO{lAmui(F*-e8mfK_6Kbcv0HHtXoG8SX#? z`oIVQ&XxOJ9ie)7qf?d~d%Joc#!FWD@_yo$nkHUAkc%Z;+JwozCIZ=H<=^1V~R%b7W6HnM=FDJ(n1Wub`;+!Zp>l;kKi z`T!YNf&T+4{4c-w=XKzQQcfZ&e{G?%7mI;z0ah>Ud z6G9<)Z{I$ZE+_V^*s%HA?g+0gj)9~0GHCTTQYQ1Zw-ewj`ZOE|%?NXrw`y++m>A(O z&5@jRK@7Lre#4Qrwth2Sbpk$y7jUF5Zjr-OhvZE#B^CY;;76?>gxzQS`H_hi%7cH{ zIyLOPbvUgS33_NWC7*@5R91x*GqCc=2wg*E5aTU-458X691rf2=+ z7MDJ5PopQES`*dq6tdqBJrhI^87@(jvVhBmV&z@j+mdh9{h3nvIr260cqD9mSlB7k zJ$_`1i}vZ{fYt!aL~iCa9@F2hlGEQg;_pu1^*5bPP^Bw9dGz>M`dg|EP3MUxw{d!6 z_A<&agvo_?waJd^qs*jo`kc|W=u|gkU$<8LFG8_Dz%DJ2<}xIZB3$V(o_s-?oYAn{~rWbM+z z%U_^HUIdn8AqYqoRIZu#MKQEKoHj6e^nD9Zedh`DcI>6eohZlIs}n7hZ>jE*J+v|Y zf(Kor0^~p8&BkWs*6P8bA)b}J6OYLj#h@_clswn$G?~PdXpDISezerM{v8yp7_emU zzp}=7o)@Zs{dYa4X1*&qYHInyP?k7u*$#E9_zh{tNSg7Fb8vcrK4|9yqGrm&g`3^z zp@4d=X?jk*eETR^%h_;aUJ#crNMf)RktvJ$9-up3()5AK6(v(pv%p>E8ErK6SUs(y?^V!F99=^?JQ@Lfba zl0pOtmVf7eu&=y&SFSNA4$)iKYlAxNR3rfLrjiHS3c(rzdf2Hoco>zB1S5iy42xMI zfR;6#adB8wq(SN*3id3Xv3I&h*c3FDN5C(QTOTkg6crHQf!vLUt!Qt$pfbJ`N9k6> z8|=5@Ek_&G&n(a2LN<0zyE_N3!O}r>+KTZa8HlNZ4%6BXs@E6y-h*wFlj z>n@IbO{Kx>7?I4#HiwPvF>#^~3EBbaN1Q+Q$b^%Mbqe_{xoj~MVbm6xB-%cBsTA*^ zIppY1FKuNeyUo#)1?wb<#)zTs z&P5({m>30-3|QDiuZKcrZw3E)!M`=jDS4B)Lb{@~u~BjyczpS`>18>`sAxxWmg48% z%FVm`drU|yX|gQu(Rx(20((cOEzNW2SNLSAyfLgN@Fw_)r`tW@3JItAH9>8rMP2_M z>5OPI6|_cb4IUG31)w^5&*+uOivH~(_rmP{dUVx11?7%>y}g1=sCk|hk9;*bUC0*d zrfvfK&V`HDM<7eA?w%Dv%0=+4KL-9yvF}jH|7a=*7!r4BAbV^EV;t}kTaZGMM^u*- zvz~qm?baQ9L4R|fe?&1MwC%CdUd4FNkMk{2N=X)>i$j(k2Y`5!!@@^5!Czjg9A5^yq$GGp?abA=6gxx7t>^NKaBvjO3<_J|kxM9kKq{pfI?#Zj=5fHrMGXL|@HVA+e##{sU{9S)OSEPDN#%Hg zUuP5qU~j3E^F0D+dSp-BTGrM=Go(KGJ>;KrBDSlk3jN!5L~NJKtRXH|9OT$!B7)16KN80)F=Roh`gyFTYh;OiVB}P zXj1)d##h3kMuAGZ`49_QD7hIE*DjqdJx=beA^#=hVT=RCPyqh?;~csyVt0M1-saPj z>72|jejnd&)cz1^VB5I(?iu!vpq9}Tbx&|x*ryjAXz%eCV}o#@0|>T8I`QI6Wbp8& zHX6bWVvgq{?|@+eFUIPNc;iaP z98!fmCE&*hM;aM9u)m#ucH^o@Vl@Mbua>9PYQGA4HUMkucCGJSc9jeNvY*SyWlaF) zjxmunVqn{a`^{ciJeb1@YkF|>A33jtjvQI4*oNLqvlQ)N&ZLO60nY%T@p&uZ<&wRA z{E7~7MZL}hPo&F;t^t#b#@(D;A;Deqvepcsj>NYN< zj>*J~X8naFtF~!9|^SBcPvNo;}CTU?L z((ar3)(FZL|0DV|?|L!R2z>Hc{@rVDg2JQMETQZFO~on_+E%NH1R6R3 zm8JHdZtjV$cB~dC;1E|>f&dd_0TV2+DF`sK0A%z~(YEwW5@KfO0~&!2jppL!W;ag_ z>Sa4ON$ctsbh0^>dYpB>is~(E->uXY^Xje3lA<5yYncQ|G6_Je{^Pdy^o#GwM(RJo z_;%D-q)Dnh=j_UpoutUNSx8m^yVDRcr@ znDo%nrfKxJAS@)sFNLJVOO+QfC%dMf;Yw1&5gF9aHCU>s&^22YO-hhq$-XSd1Z&<9 zBFN5{Cy_Bv^>9>4DW{X|l+ypnJO}S+M;W-+~0+lQwlqp9;s=`>v zP!q{B7#5m4-9rQ{(BE7#BpcIt3f)yQCJv>vJKfo0g{>jheYElxccvKeZ`lEKv)_f)io583QTdq>j7sf7W?QyqS1dH>Awvizm+v9MD$ALZVhZnb@LaXwT2FHdur#c>XKS) zVt+5g2n<5kt;}~QX$cEDC=X7lbWq*EIkhh(`YcEb51lpzmk-w8-6_ncu`s!zE}UJim$bvge!v*dBhs1Q9_~Jo}PQLN`r?F>EkZ*aim5I zNYZ))i7_W#g~&&`?W0A9af(K!ydJ(TZlKjR)b8(^VrdLgHX6;R0&bXj|a5J zuE23s){us136mHO>S#D`#vSp_WgT-~$C- zjSEuidz*k1%bBanN5PV*WDG|w9PclUFvsz!y9dK;J`wyea}~?ZMo=EAinf7;G@-^lV)__VAND25Kb+lC zI|2ZS|e+&~8+~d2eGFUl^ z+BM;w;u|PkU;S672a)s7e4sZZE*)ycROthmry-sb{-fuS$E@9FfC2$YYoO-8cyoLg zdOls46TG`sREfx^tHt)1?Oo$E_2X?i{^S)wpf z)|T0u_mO)pI=kq{ID=Cy>0O3pnehDPM$rcm2rzpFK9|uZ`j8_K0EdbO0AY%Ilz%iA z+@~MKx1891oRuz!_YC-kFwPej(3-4V5&p^h6=e2J*$mJ6JUGeX6`E@M&Ar5OrDg;y~%`vh10lK!NJJRO~U*X2USAcdMcTo-^$7R=iiH6B2}otsLhJ{tQn? zzjww%yyJ=iQpO`~o;$j<5II(I{~OTO3lV)H8%HaOdIys41B+S27y>OWZ)P))Efr zZ2w-4dIOa+5#d?WL6cr~+}JcuYs02A>sIYp>}dA$zk*n!0d24Pf54<4keK9?PNxP1KARN;P%{XeDd}F^A$# zU$s8Idt<)m1bYl7|J~zje(1}cU-p0x(3C;^gOHkfD#tFDqRaEzCoW+54H3u4fG-9z z2u4h#qtcjUIf979$(>AgWJ*G;Nq7_LpOS1QspuOuCHI`JnBDp6l?63&6IIZGeptvT z&MJ{6Ghc^-Ji?&|;_`^-96`WpgczwQ7CO#5lwFUhnmi{cH|!6Xl)_s>i_T1uz}~#v zV=0Yu1>V8EIEP!NEjX7#}xM+F;Yt2WwqZ+r9vQ$4N88 z5VVskn#Yt>^)ucBW4?3{>(E9$^yqYH${guj#Qc>=-Yt2ejd`%x7s=#3e&g=LA+$;!#xj7wgPZz+*0&>)pbMa)fpO< zN-JDUnzOu?6H7mqcgSRxd58C_RbUt{m$a;`sm^cbTp_yEy$1ZbnCeVTCZ{}P>7R>m7wY;=U<~bawcSivr)JFf>Tly~ zujR25WyJEb;thB`_=L&_LsfP!DFx-kN2PjMiPU0)XHWku>)}8<0={Noi?HT;%U6H~6_}cX~^OH7P#ScQPI$Siy z;uBYc*$+?zYWz2}$Na>162Dl{RXQb48!UL2K1G6xQ!89XQjEcN`uUHJ>{$XugYQW*=N=% zcT-S&orqcr+_M_OPXd6{>Y-MboP+QRTGQ?7;Xw`>p?4 z3-UzD;mEZ{9Twrjf|RrRYkubqpR1=AlW+Nl|5M{Ab#8Q&J2WIMnMt3x=E10ocn!34 z0uI2qKIZlef^ha3Aq4&~T4R^iEUb!Jl%O)n;w|E~3hgjd-sUot-}d0^i?_)|MsJM@ z7l+i=B0hIU*jA|oO?&8vdry(b@Oc|K{tudjZo86HehL{8B+zAA98VjCcNZD`dxmkS zMggt1CMmp08CjSKseu?M1wF*5KMbb2NEA@K#(#XTOQ~+wyOWguw#WRU9TJs+IF9jH z`Z~y4&;PO^Hd;7|)&rnX86;sMo4&_{iPH`3Y*Xak&#}{SSl8Y?Vk#C={~Q-WVBN5f z45s;j0r;f@X`6wXhSyB0Q7LvSD2P0+iQ#yYo7V34no1?t>9B%HhUX^iYK|;`Ujn9U zvR-+L#mdo6C-%ncG-PYkW3bXiig3O@1{BIQYBh7o(a<3z>Hv|!3~@{UodJz#8Cl|TW->oF<|EwpYF>a|=6AI# z_t%_=pQp>&BfVypmQo>QTI%L#J;kZ92W>$v(cj|}64S`}sAIvk2&1@*(4nrblAuBQ zC{emnv8@`4>Qj)UE171$Hq6)STYTmMOQ5k!ex1s%kV%E_Celbj#6?Eic7SLf#tmk@ z)Yn`Rzwu970c9tQ(}cv4;&Wgr(vxAxRY(Fu<;T^Aqy_0@)8+n4^guZkhDcgLjxvL& z>dANwz~sGAI(7DCl!V5d{C7~Fl`&`nM+z5%1lhq{&{-@b|D~X5;{8cNI-oNC(VeWi zjo-*M?Fy00zJK7Yg=vMd3GhTVKYXWn-x9fz8+p4;=n-1WHDup03Obq;PmD?628Fq( z?Wnqt5#E|9*&c{`L!_FbG>BpO8k^o&>2OP_yhOCBGy2qE}SjsMJ={0pBu1qwz6W`4BV%`iSRD8Nu|- zCnX1}<2~eh)Ht~#a`a*j2z?)GtQ4J{u5-36XaZZ zi`al0uRwoWwh`#l8tU@8a9;4;wk`Mj#Rka2AJ!^vz0~yV4WP`TJBxhdxm^O`)bxiG zq(VffYwQHO2&2C{L3kVE<1AM5-8$u)?s;1Hl;-OKHTej&DM1N(ow?#&t`Y=r6 zUlaSCS!O=U2zl2eYa#3k`HxYmIWB{SKAbw0>4+%)UTl(^u()?)F`^z_&`I6%J z0Mxo$<*Y&{1VhyBf8Z?a2c2~H47|^o_ody37Da5O5 z==5>NOv6*9 zio#t5TpEOLN}Y%T94vp~^Ob>?qm%?98`_Gr^lf4 z4SBrl-*A_6T#Io3<}mt8(s$ab?D32Spl!D25E+&T+I|~<-zBUBP{sO%e3tqdB;cU)tTB(frPIDFOs*=jOeIxt#d-zh;Wb=U^%r$opo>+g=?w z6_u&2x}P>~ykpL}$8_r_tMWMDTL`9uzyciq_Qxvgj-oeL$fT2jAq&w|rwFO2AW)g^ zrTCe8xvHh3*>Q?1SK>SSr9E1WjHmE9IZ8iqTH&aeg(3t2F_KqK+B@<|J@m(%w*Z?e zss*W}6rbGVOSI*O=jfaomViyP?7ua?n_JgThAGcwe~IjHorSF?Q2QpnWVJ_eM5 ztR9IrxZf4<@eW^o1~7_|p|r5`>+XBK{ zJT2geI=n}dvY1XSk|KwT-Yquq9&%b}5>e*F!8~U{4Pz`h*s*#SnEVu zR8tFF=uA+aT9rK2T)8Au%i-vVTNYNP*0^nnuC(D5alN=yxU<&gL%d`!o_1$uZ1NY$ zo|COtb^mE8lUHthr?FN2fz_>d5I!Bhv;S{V(aP&c;)f0dq)Yq1AYY#?Ct$-n)2ued zZUVC~39h5Yvb8=L$$)_iVoAwhi^A}aSL$YqJ4rif`&tNs%HST%(Vle}!Y!kUN-tft zN=VoS7@CM6xZ+&^y$F&bQv5r=egf;&x)7k}ar43Vg!|?u>w)+2oc9B`O6dxkUEg(S znAN^~$83nMRr&5+!ndlm8&J-7O!g})=!nyfD$C`7ZDql&|DOYd{i9ljW7&R$ZpI`r z{avCqd306w3DkG5h!xR|CH8-+wI{UYf_21+cVjph2Gf_C2e=~l(n*mG_f^q*TgQN$ zIYs1!b%wl^9!ksx_xX;Q5G7d0rVW>wy#sPfzYzP@%6w|eK2#^b)O;Nqvu=U*syxb^ z6gg5IlR`PIYir%GnWRcZf8uSUWrJ}>Ah@5=i}ivtJS8nN!gRrs`>46;F0Gl?5Qo9j zAv9Sd%fVP}AK9FM-qtLX@3@UNFtl&usc6rtFr*7RZ6 z4KIV(Bx(KP(R2Z@UI;DCO~zQnjj$ml>Dk?X;m#D9y6`#%k5+}zv5=K?P^~J#9<}1l zR8_X^LZjarBTWx&1Ybd|7_&|QQkGEbDG2tUpHEG4}M*-Ccgb4ODrs?Dv zYj13jBeE-nV}YoX8N@MJu_V0;$37ezqlq#zTo#g#L{M@Jb{L2c63?LxBZ@@Rpq!U0 zxSP5@B2%MI%gHQ--Zw$2gSAGD$z=&VD6&`)6(JmxCLf3@D%^ZbUawCDbL3hczs6Eo z8G}qESUv)zPAjE}8n4(+w1roh>l=7}30BQ$ySMZQmMi!7a{i4|qcJm2i=RkO^o3h6 zo3++toZ1@#UnL6;>9!uh0pY-~SK+vG#ba{7Yo0>Mxgb09e;_5~cI<0onsYTBZcKz= zn|F50cxn~(&UEIfNY{#hDHD$k)Yq!Uvq((RXG zgc1hTPIm!qh%*o^%ce=jJe-(C=`Hp^8Nf6Lezq8D@xe5f!3(LUH8f>HWu&uwB2ulJ zqi(IVcPf>2ONZl7DQT*3ebS~@Z*?Yu&8|{)=T#Y#B&Rlp~k9Q0Fo+m~rR!SNO0iG1a6$C%_#|xLmVVx|H^x zcc>F|l~#1ne&_(jNVCkqiFD`B3-s1Un!o`7jpY^?V&TqaxYrb78rNLN+c10F7ZJar z-?c4A4X@pPSIi7G)48;30%m_eLpwP07D;V6N$(XiCN(&Ap&hEVcBUk+ki63$*DG<} zZkU`3D_Yy)$!m-kqM1&wirJNnkCe4c+-lhzRY=*1$pME~I9||4Zj?WAh8gzFW;q(* zG9C06QU7Y_DgjF0q#~Kj7*Rh(tpV4)4%p+mqo(Eg+34%DB8dS*zwn1cj-yMx#@)RH zxdzRidXfsdlDyrtwsdhjxKlKAN2^k@|J-M^L4&CxWVG9v7$o~r6bj;jxT8$5^Vd?? zBRU+Pf+Yqi36pGHoEZ*672mXYZkx3(s5H()c+(&SF_%6%Kko`=* z&P!ynqY@(hA@ZGhhQ6W<>xlq(`-S%?va&B^?I#)U-~7fQIhvU2DXz#qT7o*WIlK9g%k?aBWQ*1GF<>21%ax2P6){*3;H1{)5 z39J*Kh~2OtIkc6HrF<7{;Pm&IhI}Z&&!rsA_Dii}qMOLN)TpC^qK67_;HfJ2W8QB;Y*nK$eIUwhw4p%g7;xl)Q>5>(Z;en#BX3G%mWIYH$&@)W| z7p^w=L&5WSFOBl+Q(>C;tZ#eaz=8Uv?U8k!CZ=%w?sqw z(nHtsqVj^2U26B0uXTD%A(yM0CffsdBYfMMZOIFwB6`M_YVPPx6p+JOC&_ZeKpfn_ zoVjUM`UH({bCd;uwPYSQpNSX85x}Go;9F%mbe0w7y8(KY(En5TO0y$S6@NkviNPw? zY6q8mHLz*=!O&xgj~?`5XjtZhj}Euj)=2EH=fU8?>}9iSBEutkJ%;&4V#qo2sPMaTenn$ZDZ3OH>r#l#=~3hH29 z@q|TmeQQo!i?OHMjP;EZZf{{m+mW(T9=pRE85Tv25FP!|K#f*mIhx(!4Ko?MZOuTd zPBxs{s$zX1m_>z8K8k}&KB>DfQ-M3E2y4f<3e?AqP79^5er%894BVQNFo0aSwy(Z# zg|Pn9tlA3LTaDAi(ZPzIoRv}!1|jt8>iNjXTjzdvp+IC5K4y3LBlLYx2<`2V;B%#D zvmrei`wme0jST&$0`P)touB+m@ATTw(7o8@{wR2^&KOpE=wQxa0&A>*ic^B+eYbJF zJ|3ZcCo#$q6q>=J%3@^U7Q(?1>OIu?g2u^*$S4kIT8zVj4uZ*tJfTcYRbYa58HI!w zX&nz2om%79eDMH z2UPey*J%##U|Iv440N znQ0h&5J!T?BkZVd$`woHMx#oGO*xxewDt2i`hv6fxWyOK72Dy2t+sscvtws6SMw;Z}&NB?GlKq1ndkG!r}K1VDpUyNaRH^fc%US3hx3Y zY$k$i+JNEA>tdmjjdgAyih~BX5|oF(_WEyJxI*@^)K4o-O~Cfo`N| z7*wC08^3?$6L?4PzaqFp&jO%RxGnVs%(e;iy(p817{)@Q-DzZ(jgblAXWRjmwCXQMC78^Sc=r@FC+2jr& zq`D^T5e`;un^K^y?Uko;JjR4;g;t5{O|ff=vQ0|13!8Yrq2Fs$bUS5wJ_8{XmwLON zES=wj6YY9?)+68>#xdfAcS*E^d7&@FuRUg{%XDE^s;93T>IwAM3Z-hs6I=?#q6$y% zZcaPe2wLlwW*or~ZmvaO?XGl4>Vawgo?uwPAK~fw^Y#rU^bJfqQab|w^M8R`b?NlP zAy^=w2FygHMCL>^FM5Eub(igCbYN@DKL~(VUo-)9L>@s~)WU)#i!)*Ra`5V}J6avo zzF>r1;c)W`BBEbT({B&i{DhuA9=@OoBZ0ljweE8s4)!Jv;*JYju76UrUH_0sC8wlI z8PQ8+{2vFvzNPpnkPY0u1x3@nm9)9IA~QsfL|Gn==ln?vP~9?6W%)VT%B9t4ura@} zpR%toBqBCMSgFgDGGo+L-`=%$o3ZGMKSBT|l`1&`=2FB0RYgMfC`_E0@##&xkQ4<# z-jK2C`pianh(u$gVeqByoL^yr|9Z&OhHfAdTf4FTUZ8=U!i(Xfy#<_?)2 z)xu(8bbi0EbxJ>KHMMflAEM$$)X@5}zQxz;M5d^!(dBetP!&Ql{bh`aKLSYwFO@c0 zsTr^*>_@87MtMI2>o|m}o}9Hu!|_|@o@-`{2>Q2x=hyo?_yUgaq{>H{Hw1)*p@HHn z*nbnI%T6&Y+`W(yObi+2VwiA#HFK*w$Td?4s-n zw+f4`N0x2t0-k@SyBbVKLhL5!`LjQ=AO1toethp7ye_@;yz(IF(p>|PUEXuNAzHWA zc&dtH&)#I53pjb_H|Mh0oWY4J*Z!ehP9~#b-U@P-Sfxky)69kzjJ@8|RL3=^!jWjL z&v2)L=RD-72jM6W?kCvow|&4pA~z~N#HH3~$f_7=yP=A5@LBIW^jPi-(|BtzXtRRf zY_n5c?IO(|52oCINk9Ui;nItZw0fpT&jab0A`5j3MQIb4I)@{*^7Ak{-yc${O&g&- z!D%~Xxoccan?Eg9w)Zw3o2ujV(yA=D29JR&8nNC6?-_cCL+Xcrn(Rc8c|`CbI$-MjZBPvSI8(9e$F< zw(DxqALCmPW?w*Av+Nyn&0?Q4QgU#njl4eu1#?=S{}^fsO$Ze!bmd+BAatQw!Ol5V zASkDy{~8mg?nlid08~ROhn>G(5Va{Mb}rj*wkgh@{>5;??ck-%woKFYNt2dbfnSTt zxVplx^X%e&W|RS}wH9`4r7qD(D;R5gN7Hb&^U9>oYPAGXQRsMA2~9bK`SsV?NMm0f zGgOx@BR0<#H|`#v7Aa)rk#TA_MBAw6rcZ$c3$zp~s3<7Rpk0QO6hT>)ofC3;!dtm0 z@Q5&;gIS|9SAk4d+gtPVY+xI%OJr(9P6eh+YbqnIE^+{fJ4!Vc57VJ-;S|}uJErU0 zFhwoQ(8>EfG+H`WL0ET^EIY z1MRx>yu_#c%PnA2SCP*{)U5wxFuF=lWwvCnJ+zn|s?zcUvx$=nw{k6IlS30cMp+|DtY_QZpd zg+K$f*7;CNn1D*cJ(ddp*!QG_146oT5wUqe79i^B(&?gYqw~0*q#`4)^nZvBh zKS>V&E#VYfL);RZ^)Rh=`+5@^3xU*~pfquEN~`|+r*%VEg#fisG}Ifdq4Eugr?Cb9 z7r|X{+DkL;wW&l-UN~a(0&ZA^5@F%mtZttYfIqS;^4cu=x;!GWb&X$*Wu)0~I{8IN zj>}rhE6p#fa-72#)rsj|hyzNqie2VqLB0+Ums_P*IZV<;N}Rc;b-zI9? zNOCbb)7#SG`Nyw+%^A3;l=%JR)R^#H^WD=9Xx4Vs*zjMLe^l@rN`^7zzU?)mr5nb* zGeTgLewMz0E*BM5e>E89l4popzVLO`Om*eR_Mzfk`Vs5cH^_SGiu6(0&?_p@mir69 zgoBu!3YY1(Jhspin1tZ)1gmY4WtaDUhYt2mnpZHB-hGJD2tf?N8!Gepzxv=2bw7yDaa&0;F zQe?|fWTxec0gs(xSZUm%TZgP`7jb!LbH+B#OzVVUPD73(xm1d=%6$y!W4a3n(t04Q ze~IN-#x@fuCxtnlTV$aNzgTW?D@&=7E-eeOt#6LS0U~hPt<9Iu?prsYw8!DZ#m&;& z^@aAelPk_ut@R@ok)J!63*p!mZe@@!X~z=GPM(rka0z9?S?v++nX2=_#xl-v4IVdq z2g!!YXXlCBR2<(iL!AGT`JqPw|l*`Q{bT}cyq#Wdy=oY>aH1`;)PRAs*@ z$5ujz}5b_iT#D>w_~^ZO5no$^v78NO4A-&;Sjnq+~0IL5qviADqTWiu9{9Lzqs zGSsDU;;{lup*kML$2Ar1W6$J;9>pI^eVE<_0N0ouzc!!fvyvX*4#z4`yrhYVvml>S zE;FR=)dSU*IxL^h^+QkLo~2EO8=GP2j=#x7Y8Q42I+Kc>y;K#{wVnJHROy*JYxel; z=UZ2scS6*UxfSvOK%0PJMK{A+z<$MZ>?7{?8^w*#9JC~bQ^aVBCZPpx;pkB;3&{roxK;EZ3reU9Ww$P2!k7-QESq~@3Pvo}n z6Q&5;9t&C?H0mGQO)hrd|({3pX#D{MWGyw-rD@pC1-~B%vvOgVna% z_R_@q`U#6!KRv349@y$vZ$WLNKOa58xqm$_YdHr2dLh=ke`^_03dk1h1gL0}Xlm2c zoEaMy`cnZRNlN%IC%Ajxa#zW21X-F+6=IX01U(VkVu4+1geS=p&hyRAuW>4ZW}=@A zEZk$%%8FRt7Z-r&Zoqlt6zHEZ>_m=8$+8wPo!`inL!^zZq-X)^2gs<5HQ}Bo?V*d@ z=0B6zB&?AsaT?^y#N@j}OO={p9i>6@{-{@|#pz@nR_Vb(gf4@{MxYz8_A?MbY`WtG z_S^<%Lph2Pu#pr7fk&7I{f&;CxQKUFVjTiyL>&a<^H%^t7vj^c=XTQH_J!cyC!C}r zHvec*Muly#B>|s~jUG1q}z=1u&?*1+keuo?0VXB3C9Ny1xd> zAsNv6vDg6~6x~ztU2gA(geX{T72h&uh#mwrHrfp0;afi7JPj$)QYfnq((`93Lww7Q zg>8<@_*k=67rzyS!wh(^IsCHA+lNNd!Dr#a{t(vd|L%tv*hlZsph25G4ibe<$E9Zf z2>YQW?w7Q{6GI|J?>T$=1P4rH;H+P`pAu_PTB`%je4SekKD7rG-5#nNf7%{<(2Bwg z7f-Ezg<+KHHoOlzDC&0WxLq05nFQe>TQUZMac><&Tc=n}Zgwye4ClcU-cl085VoQp zUAXjMp>x^^Yk?8fcC+=2Ju?x^CbP83Itw-9@>kjd1EY94sd)tykSFan2 zt*1k$UFZ-tU3bV3GB39_NT>-0K_kmk@<5!zPct&j=I()k@IypsGyQKh} z?y209YGHeCe_((qtlyNnpv_OcB2O0#o3wZ40TudeQ8k7P&; z62A@tQRLW+js9TZhA70TmMOyb}i20XpU$>=RCYK8Uc9-`4 zn4ic;uz!I|b27J>!^GIGuq%~W2et|X4EC+{+fgLCf+`*t7<*MoP*Mdw8Y z{_E@5vwX-?BQKmTa1094F5Z~iuT_To@&NU|OP(6FLpDE9s2IAMDE&qtLE*F;Iuirk zJ&R-NmwT6R0CdrZHM%sk6>vU)*?8Wyt`jl~Ih8pTtiIwMo^otUGbmkf_E? zEmDoJty7IqpIUKV7wH0=Wajla;pdS!@$w59IO0RC7=1GvihM$vpzu2JkERm7V{6nZy)G`cbasCF7w($<2&)V8JI^R***&^ zF_Qzrv{87g3O}3zqj1imjY@(q9XxUIlQXk#0 z(nsVdH&O3<3qB?d#Vo2mJ&qe^O?J%8ZBQ;-O(}{|%Q*TLo`$X?4Jq15U2^dw0^5+E zeOznAyegU2v+vc~gXX!X4(+Ph*KuQB)o~24BW>IP0 z;@$N(C#{jrteRb|%&|K$+b#ci)zY=TAqBmix?x9g^GZ(0`Q|`yLy;S<{aV0v*33Ao z6G9TF{c@XK8ol1jk5hVS;mxZSldnZ!+Ia%5d;eB3|XM4Djd)x`&e}5Q!s11xE zBLM*|5d3dbj~z(|xccvho{*h@ej&;vAwfh19kh-91_d1Daz;iHGLk3aWrM>V7j7Gj z=g6;KOk#|F)iOny&pmJt(Q|}@^cKiDHMfS$HTUU<9A-}D9Y5bU=)54-kb}ZP^CNbv zY@CmN+cKPr`pTNJkdxPxDdGud))8ySc~CVtVLG0P%RNH9d*+zHogY_dL)Kk*uhKto_P zn4g0ZZ9>!nHiZ81M0y2n!ovct7+|*>b*MXL;zq9yTe04q->y)VFr|eAxq?Z=LKyvF zt5sO&iDlWN?H5f~~`(y4P(V&>+5u4s(ex^2h(K zU`6n*RafUgtT+AAJ7XYyv7e^cgPHpg6#fz?50NwkWFC^I$;~VPfO!w3d(t962&h|TI{E1rXOKu$$4*(2!xFk0Q_8HMu!aSQJU*M zvh!E|{%$1Aw2(e*l1-}__4JGMWZ}RP5tN~R+XN%bdy1paF0i(h=rz1fU~t65 zfyT#02XDWHpLm@29xn;e0j&UeK56Tp&6DllILlI5^Y8F~Z*S@Ni|8=h^#*myvuVTo zapQ#ooNQ-5A41lo#Wd@W3%o@A4dRkF?4}$jkJ8e9({NFzreQ5^KkN4eXVZ(W(*3_H z9B&6`6aSMxt^Sigf$0+cQ_$fRoa`M;om?zUoy9C|OcNE#(E-sa|DT(!Kqe<7O_`)L zR3gY26r>T6Aw=II0gjW0OjDwFYvPmuD`Pg?E}&_p?t3fVgz&z)!WZ09Ws2|fu(h*m ze>>DR;~?qZ#$qjNHr?&>;ndv)`1v@h1tP2KyFJ_+D4uk$2U%GT){K%JZc?JbTBxe1 z#@Sq;Wd^7=M+6?mFo3y(Q&MlrTB7Awcls?w%civLMVL&|l~!!ZodFLI4!*v=qBXcO zeSDMdFi7mGd7LBT25T_mWa8ws^;5-K)#(F&Px;PPXW1ma~WI%0RhcEPC<%Y&O!UaD>_c3lXrdLv~G z_yZ#RvdmBIryZu7eCba(1J%*~5*Ff8GC24u4-wEYxL~5wGi6z0vcCOl`F~}dc{tSF z`^P7Z>m@JV@N{Em~mO(LD#xk;&HTz!1E{VsUvW`89 z-=}$gSDxuR*ERpWuKPZpbFR;sv)uE3bFyL_!niIY!)7CC#}h(mWDPz=+uW+O&M;!we)|3mycGsKFm-#Q%uA8qb={kGb;q&9{Z z&K}eb@ncbvKha3gSR9qNSY_=U*{qnZl&G>0eAyi9qz@ZwZG$_@bgg0+IKR}g?@rx0 zeP;*kpXr+r=+R@UXYbf*17^4uA6e}q)y2yd!;hAJcatXJ8D_Y|AV!la%z&ZofX3UpPZ)n#OPxDaj7o``!+kG|~x|NgF{hv$4o(g|qxZ&z;%Fq(?ZMSxV|h+ZbUDulo`PNvr8i<7c0xvia#;0KcK zfSjy%9P$3M%Sh5w7ZDdrctRF;F5bc|QvbBpu(4Tfv)8yi{57n}{xKSx>-d<1_#tpG zKB3E0e&nes#>C9(k~jf6;ts=DsuSYw{6N{7c{djH3_zKaVG=w}VYm*ZQTwnbZj(Wt ze!&Wf@ZzuySx~52QTlMS(7i(ZQ#Av{nKJjD=be3Dj}Zow;(~9DGTBNc0BVD*V_0kq-L;bAa(U#w8e{RtmFOhteWkTA!>kO!) zRw_)k!>l-{nwCr+(|?qdJn`L(YJXe*V|TNPHE$ya(RX^00Bi}zgw)>BJ(a`f#p7EP zM%k9Q;o2;88-;MJql#b;pV1FDKNB9{E$#j*P1uIp%J}Ccr4Pz03d!xwxz%AY*^VZQb}=^UmyN zk|A|^>;eXSY_=<~8l*uAwUDJTlqPxo%u^^v%a_~sc0;!ok>Ojnt-cHT;!i&lT83UTy$)Aos#{RPwiSRqBm=y> zd^Y&Bh2CKy(O+B|m9}9OisG$}hDmGkf?FIrMxjc=sc10ke50z`ZB!Lqzh}@fv4+?_Cam9`33e*aLX7$LO}ei=9+%ZWbbW>?XFttN42>ESY2n%BB)GkY0W zs$4mSaZ0d6+hP11X)mdF!Fi_DQ(#P{^(7T*T7D)DopxYPlrKja+xF*Tnb;Y zg0El@gX0bIBksn0U43-GS{JeXQP{9A`y{cWBV}*=*Yeuf_VPXS!TKma$b8Z$45Jg{ zzHpwM`+5H&4s)LJiqcVQ|(rO5?7J^=?z?4p`VxQ$rWHzF)Qq{R7J zTFM7V8n?HsqXY|;6wC?V7Z+_VRcTvrzdD@Ve=^CU_u@COrxW)}>`zLkD7H z{)u%4AEmY5VnQ}Q1O-)G3_49;A8R?~Mu*l&KhI33X#6aw&e1A+I#A|8idQLr7X-#^ zYTIqv$RO~rGPndK(d7Q9D|wI3c^<*|BBQdL@J=1w$HrmDU%ynL0ZKS7&_*~iGJ&04 zL%d-WJIkiVi)-{oXjqtaGwVb;duw0@QFAf3ZsNt*L=QBzRbJR6ifYJbf6Br=}%HHZQ)H)*qWW{cA? zwhtAtY#SM=NrG1&q|`s^udQ5AK^G2&cib)?oGJQJ8E9CNw4IUY(97PB$v?7Dz4h)) z!LRG_jNSDerygQFW;#=Q2mKTW_u6`F`pG-IQib_B^@npJ`y6$>& z)>YH5Jb&lUwt^C>-pSCbL8N(;OmPA(+jray6t&+<1ORuOV>vQd)&Z{p9m0XE86FFra)G1C^5BXZhon6lq8CG;e%ONP(@*8$&#oQX*SUT{jq$)0vu$$s+u`;lL+rJpdOx*Kkl$OyvxVPZJ zudpE-5V0FMS|7XT%`Pn~S+IOg#VP~In$Q(M_r^3(7pO4rvG}DFGK|k3sumHhxp;%Y z5y@{cVV1xraeLB3b-Woddww8K_ik*4EaAIjSFnIo$~MWtumjc~x5|q4tuyebyuTAV z855|Ix!I$DP(7Efg9hFX-Oq8+f}{oGWK*GV}^IS&;F3THTbQ zD$MK2mZoBD<$SiG)keVrhGA4|6Yo>IG4ow|F1%v$gMe^Ny z16t0MdJhGwJ@@AM(*9QL6;8SZr+Xe>++HKfk~72g`x373>m4nwJ;|%bi_nOTtH>{_ z5ZwUleS02XUQE;;Z^bA`@;WInrvWB;iC%KEwT$9}D=tQ1FP|7qw0u&sdyfh+j-1PpDTpa5qD41Z z`plw;XNXp!m(bww$*7p=&7^35kJK8q=?;lZ#i+8cm>4%XTE8^SSo{6Zq93w`y`#A| zyg0EvYSY+x>1)vQH>cP0X*D%+k`i~$Nu#nJXIb-THRjqG&6}e8cn!neyXO?Nkv2Kh z6_h-c?N38+uVC#tx?$RZ@ObFsOL2R6`xp;V^$;YkcTCo2Fun|-YaPlFDaDjFekNoE zcaIuL#o28*6`Et&?TJ$1Sg=RK3T#{VFK~?NeuB~L>C#yXRK~SdQ}Zn~YrCdx!?7ps z5!(uJvVOrMdUA3lxn&!@+FsY57~agHemUWLX5Lpn&_Fmax*0XpC1yNV)CVHg{jQH$ zzph)IaSQ~~WWsQyS<<-@yR2S-K%h#Df0{aU?~1645U_jn0=}{!Kv3$>2iS{W%z$Fn znFTOKSrF*mPF-X)@bfncsE)!YKrDm|20=K;pqA<#RVx5|3#=E2T~X7EWaDhcW6cPH`uNK z!a&Xo0`^(|l79?UfCfrZ_%1sqt;LJu7a05w{QP{V2f zWW#r;Zw~@ppa2%sK^W5##HW!a_3 z@S#jD2qZ@lm8AdwFq{njS58fk0(87g2JH+u$sk#S3+S~HU|3I6fX}ayL0(8G#B5J-puA^=uMcqryUjv(|;eH)OLGG$jV8G;5v$te#Ha6upe zifG9X01yHFbJ_+BC_e>2^_<+MXuJsY&v_D%j`Bq>jVD9XcuDBth7bgjqKI@h;WzZZ uCr~ix;R5>a=jgza1Lx$Pg&s~;AdnbEVBVKxh#?P74`BjV|9ebMmXT>1MV66n;`d~O3dlH`|#m|@P~xDM4|*b zG!d{2EGv3;V^dX={wHP<7nRj>l~bcCa;a%mMMe+BhFK1-5vCD)jDDd|hi&PrE!an; z9R?acSlG?UzrKE5;19p>&)7Yd?JY*I3=rBRQf^pNWH%1k8rrz>r_v&9lgY11P{Myw zREve~A?@=ea$Q}kr2h2Ht{4s%n3)IY>SlsVA}~CCZ&rI4qR7ZA#W*S%6s$synpFGk zr#`QU`>+8~;%Np@!1k~vQ)w1ODIO&#Y)5AL1EUdhh73{B)M-t9MXKqpyXsccI4v=l zwM7j!V|n;-`g2#O@vSS5XNxSndF>SH2R%!u{b!viqba7; zDN>do;sA9P8I`ghh{WHbFmpXuyaT%yNhPzaQBF4hJGKNvFD!E2`MlgGNx(!6P}hlbNU&RwTuZ1bk$!m&z|vfnh28eGO4e*=EHnklPL4 zDRgBgKs|%H(!hGrp@}F2QzYxO0i(aEh(3r}FQdMr4^1lKrYP+xE#5v%@BI7&5LABB zX{SPw|fdrT+;s@HUpIe$dOKh9e1DHk5B@dz#) zTs-3$XZvGp+h;vCedWgajX~JL0I|JrwJWUuxf&<{fk&-j3C3oX z^`qf$gunc=W?uG{`$49|u24%gN!g zGHQ zJ2%G5uKoVkP6&}Ao2VJ1xRU|~EU9_Uvei4$%recFNnCwjwr0wdit%*CMaL@_jq{ob z!mgx1!cb8~nN`~%0bBxje71Wqeo$|zuGCZj|KUs}D?sSJ5Kq`Bb^HN>_XGHRJBiG% zeKdSB#gaLIK4S$i3^L-_3Q7LLOK1Q787kIYKZNEnayY|iHzYl|fYbqi=KcNLvI@5t z?5Vu7pWKL*Z3B4Sl~G)rAz2_z$H~${eD)ftqUhg_b&WuX}qbeLwNjb~Ov!!zV_KR&dENP9C!-=a?!rZrgEK zq7I`CZjH6X76^N2GBF%~r+snP*!rq!Jna;A?&a65 zVOuF{X~ctP1@^8W=;v?iTZfN-Xk(^mWNUoJfu0JF=T3;VjbOZV8WFyULrw#y?|Sgv zS{tKN2-7vEAooAc0`k8N+T&y1v$*nb(Yn4WaYOsIet+%$JxkRxcHBu?$kl?6AD%cT z)!$B}B)5WE)u%_{%HHo@Y#|hCl@m#F$JU?U9OwAc2wbDOIhNst$!BzgNWAC+mD}9X zH%r!ZK|04)}qAr1l4$NDUQTFiGE*Kt$6GP6`ty@>s$M3S4$d{6-?9_jK{ zD?a*%Gs;!%I?$SlAu^JJ(HA9L3t)`g8T<=M7H@y;_jl-Kz96@ILI8!z`J4zr;8MA0 z97#SQ*wXhj=#TuE)XxdUo6Y6~`!;jL)t+Z9yeRBwHrF>jcti`}GXZZHXa1s`Gdgky zIj->jK*%afbMK?Of%&n=OlU37ysuBh)uqEG5=wFa;+|>bt^nu~SHCZpd31PdMnPh7 z9E|M|zwLGhSa!T?rdJ$(QKZaHW(}qXFwSy-uZ|<(_uA6cu`l%WIp8EL{iN?!jI#84 zc?!VthX0bm$ z3d+!wdh&W$UWn7ghzWecE;uQW?l>}iQndz#GdN9=7;~JO9UHXA+;e1o`h(SV-`a&B zWqdXgvXo)&f8=wq7LWP9$sCJ|(Ph+z+_}wO_+m?Ex<;x9m^8M3Bhpyh2s$wM@A5?K zvf?qoe)ypG`G3t;8wF)Tb_pdoOT)??+YHxFe)``~3(gvCg_T2!vWG9{izneeDFDZ!11!(Nb)x!Rsac8t(M+#a!KSM^ zuf0&9t>;c5eJxx6j^^pga?{6*Lz5TfhTbcvZZBu@7h}_^NvKPXEH8jVtDWTW>urmse3b)z=>2x- z2p9PYzuVL%@Q@`{$~VVgc{F#n6*)dGWFv(yBd6q$=6;} zmK#&o{llWE=E6rMx&jKr%PL*5M-$$`lmx_IoMG2_KNSkBNBNQ~N<%Wt$7My`iTV!k z$UNx*L&D%GvF?*LN2`i(;OBs&A;C|a&~<)wi{i8$!G+7=Shn&GX!u}OW0m*J4@KQT zSil%lNgI6)Awdh}8ezY$mWWA9e{5c!$_B|#x_0Z>(Qo7XmfzXL=$l`0n7-l>w6;2g z<_$K56Ph`x4zS@vm|W4O8C?jvFafOX2sXIpPfB1~!Ujxdz~ZwQpPq@hT7--SjF|;b z-T^`)N(nAnK)jm44+f*4@QC=4+PoP@8oUvnfVwXd*XU`#Aq_k*qJ z#M$6M7Y-@nS2CtuMPoLmq1z^&aP@(>Q|;%~14;;SSm*W$2U5xDin2u8c#YS6rzlQA z$C`%Tn7NitCGawN9gbK0FM&Ru(nc;4lW@uvE~|)vgE7@GkH4>*2jQg>5fvg+4fGhh zD?}K%tA}OI+?GCvFqbRgnmcFcVGOBv_Xcc=Uh*lNpd8+TRymyMT7ON=!jUU<^_tAd z;kJ@f)b$O-5Uct~&3YWsxM6%FbdU8M#!~`^byTbXSx`oT0oaj7+VmzNQlfZeabfLGS~Y{|*jZKq0N$vXkAoWX@;>Bg*YzC4@? z3RHEzhL|l`9Y3qFt*Vx>9+~YG2P*nTApAOSQ60sxkM(`p4%d;L?3pE-@Sl#NT5}00 z)s%HV_SNI@BWYn$nB3_agqzX6Y72tHy0K!JbA@rTMNf3Kex?2BNEAhnrgZN3sau&3 zwhfmhv(ugN{5^ua8Dpwe4sFfK-JXS>FcBMD))XQ*J;CEhf$dHKi z@gOHX#UR&r1D*k9xT2-?dFGr?se7q@$GV6_EYi~@E6@)kO--}2iP)|zi$o2Tfel*wUsbDeW3{@#vO&)JoLWHtfEV7 zC6_hy@=iB}Xd9Iq*Ep<^m{x2{Dx=ez9Dx?^iSSnT76ppwz4Af?1m*2Nz^Dp1>GnDf zp`Eo8JC5PF&AOeOb{{%fafaPxe$GQM&*3$a8XmXTeJ=QAFD`(I1i`l+0uPd;a*&V3 z{=q_mI^QlW1qOv6RA7TQ;}q_GZddyeeDjPj(gN#js3`x``5C~9!@GA2?BxMX?>ejo z6pA#aE%26cZ(a%NySFu-R?%FXTYF}ROp`*)OuEyd+Tkyn`G)ZnBr%qXARJX197hs7 z;GoYFp5F_?UkpUW#ma#Muq17(-0ik({0}{hX`i))_pdM8opja4#Xsp=i+9MG2ILoj z625KQW4#VF#PjnBMbe{%R%f1~5_I;)OcS0FTwlxl(4Vw)0QiE-k8XUNfZaOpg2N{9 ztN0c@f4CK&;0Y$Em;iDkL7v;kg1gF@RctmOIlqo)))Rz%zJ|t6SHeerN>4_dogz$J zrpdKB<~RniMq-jdJGr(Dzsw^&6u;giiJ9i!sY~Z{cd#UpH=<3AD~;{8u5u+rC^k{~ z>1)_>S&&o>DxC?UA41yyI1Px}CtvR0Xq=Kzn@F6{Mj;DU`~QOrVPX_nWX8`@B@yms zHv7?5gtSj6h^R1P0S3d`-Za6@UrUHZBmbg<14-u`r8%xY|2Mbb)1*+^BxKJX`feO{ zWwyM&9u6^oC`dJV^zrFTe=Wsr?WWcRWvTqJlk|8DRN*G19vU%_K=+)c7bP`ubeZpRB)Fmt2 zPY)tNI96upYXF&mw8zmupOkp9K#p|kDBP}B>fxYb%IWy3&QM(Z^=7tP@uBVNIx!h~ zT`$pl=F88#heD2?VU@cRZmtCNtH-Nuba70mKKakhUE|0CX8aX$TdvN+rWP792YFF=Zx!2-iMQd z+4Ue90P3??s%K=a7MJeB-eQ~L!(aS1-4BZ}q6?RvLJU4UR<*E1l6#6*MR(4^v&Fb5 zC{sNOQ4RE93Hs(Dkg6&wYPh#4HJNg^5XeGiO0u>lmz7WJ8l8McyV6b8x?^Q2IYfEO zYBfJqUZ}%2d3A+shi`tYEotL8bR8;Xc7qfKzxUQVj@6iD_{9w}H;9+qGfQQ0{w=uW>MK`#;O8TmhLZA|=Lu=p?GW#IldV!+bK zgAY6WAxbj5PDkY-g~r-n1Pg!0>QIOk(c~77=5b$MnC@=9N@kshX?$3U@+$5FZfRM4Fv;|8K`{iR7gSDRWFv+FP}#CRg&oxOe~BmO8J|h4 z@c5>XqDwgEz~sDmyE!!M9N|{VVmbMk`8mFVq7}gcxXd>PoQn>|ybls-nex%>b+W2vEqOw87z_@>?KyQ9!eJsMt*al})tHs63>+_Ki+2`0}lx|ip;70Jj zn7MuT63+hzlYL?S7qe_E%7hIH_yl1(AozbY8D#VQ#M&$8y9(F)Z*;;Zctk#_Iykgx?#yE|Y2AlN+SMJ$|3B zfbh_v+1bT$_x6!0tnJn3V*92)?e=i`G(p`*YkhH&`fipMz+?PLqQ{ldBnaa<{t+B;)-L$t-vMccUqpJ@kH;Q)p)zIy4n$=nv9?8C zx!ZKr`*8zqD7n(`I3`QeD=sAs(DF-r|7f} zO5}>M!?=oTxxu~iGhtX39V2Go0QC~$Hdcp@KCj%KCj4i@Le8d|+wthcL@Av$y#`Di z#9+&yaGF)|1SQ7NMGbBZ8~aebL%&bJKv9sp+)qhS^1yPgI6Qn3nL8NTPFUh0-C#Fo zzFjJjhQEkWi6yBa41qJ8m(GgLIG!bMobXm8&H(2Q(J6>A9eTAeYdw{_WC5=pS{k4(UzR zpw{tCS|N2UdXIY7Np5_mr3fpEH4IfAH;Z#U4+^{B{F!^Ov4bLbGOG_z z1&V$8U-)82M#4%G;+WjQxT8qP4mjAFbIqhNslAIt7{Qr$~C-@NgGH7 zkC@wbw_a9>uC`FG!=hje(KITzxw_0&t3Ub-3en94GQKk7O^WPoQN2-w@2d+p5M(Y` zDJv`BB-mSvE;Hmx(IRN1lWkKS)IAB?Au7k*8X1)7MSKRg{bE>ETuAz|U_uhX5f5-7 z-ag!7Vl5`2es5vsG$e7RlP69;DX=b7r^<+}|9Q ztM^yOO;hVy#ZMOWaTfodb7WRI#czD1Nv?6~r#`INd4l+RhGyn29c#E;Z;H0!ey*{R zvYs~9_zpbVBGw|^PCbH(!?j7}XK4704jKSO0z-f=s2on3PE|?klF4!BGJbXg)h3-d zW6j28eHiwBHo??R6^v_cTmsixBb-7EjY;dp?e*l=PiUzFY zO@!IiBFfN+Nd1NTugu6!Cg-~RQ;wle|BYPvDGYs_;GLq8Fran!VI>xWnK2~OezpHyOH@!1OggEj$VZ1^AU0l-BLco zw1t7s74@TVzb{qSGV+*!>BQM>mhb)B{l@0s>&bu8k|~~Lbi56%%YM1WTr>|Z8hY7T zk?UlyUY<`ka-Ia&R;kS|z%3ISAzdJ?R624OsRwbLE>zfeIzTe2k0KXG%jjx~0LP$2 zugT*g`#wHFn?s9}Vrlr6K2-~femcTr^k}1`5k6|7lnZiiMNM~2MHxJo>(68?5XatX z{`6M!)BusDEa&z!$8~J0agG`74xRmEA-Qacwp}Diky!BdmY&eiKLkH|>~mZ_B>?vV zMBSGh`h44VtZQy+=*7VXqo7?O5r@=M>(try9Sd }= z7CiCGo}H-Hru)yRac=@X`j3R1)3vI|tMt2H^0V1JR^vMNok4mq$B!X`r6Wl8@Ux>ZGWHlPfdf|Kdm-ufj`tep^`j&8zJj=bm?l&y{2 zz2#JM@w~Vmy`|R}<0CaG=Da*N-VxTVMHf$uT^Lzsq1rqk~ znr`R0R=Y-4H|%KYq7)TO5o%2ZDMkm-0}{0DwVO+v^)v}hE9^?vxsp2QS{4}6 zb#)H%+eeE=$8~~LHK%@CmrEQwMwK7U$d%ibalNyyFW~g4(``qdEBOGr_@_AAK%C75 zUQt|T%8hQ!En+=0(@ifk4`*FepU735ol zMe{E4XQU?H+oUS&Z@C#!2=j~*ZYahDDj^fAGhdze+Z!2T!I{I325>j^3x>4qy4{{W zzyv@c5#B|`@Ljz0OJND^nicsT-s)X&GmejRfUy#Bn}zBaiM%bUnd7{Ig3MIk7Wm6+ zg#D%_3&?27f{Yrs6M@chIfe}Y$rXo(K*R3Oc_mqpRd>n@<(l|}oNzMxv!Se#MQ<){~gToDn9cjlxTg z^9(3dvfPj(@W)%7J$O2IFctT9Kb?C!UYTkjm!m^WzRpO!|yGYir$V;eV?bkL48qErEe5sGOI)c-XCVMmKMmT3dQs1 zz6r{i|Cq6&W_L25fg7V7`+Nnr2iH2#WDRRxrt7(V1J`*cUim)p5i_Cap8S1NcoV#` z+2Zc^aypdrQ4VVAar1b+zNfjJS$^&$i#8e30=MxQK4r+Va@?R}4W3Xnch>x(wFGj zs>7j4$bZ3{i%>gcE?(u>{>(`2-z{Mk)n5@K8db~W=qZNyxsM`U^==8OkwrI6l)4#K zNer6rR-27jqPwRY+n|j{15g92cj&t2Q}bt2jvjhr$gVqMxhY6u z)71%*vqK01Hq?nqCIz1_zmJ|!zQ}XLkK1cH=7(?FmItU#ld`A`Xm96yefNm~=Y>b~ zp(TKi(Ra&^kmcBXLMWY!@%4?H!z-3u;V!`>#{M4&ulcr)Vx&6#wbCC*4fi62e}wK= zl}Lj9(5@GmgXU5hWD}l;i@&N@nk~||ZX5Xce+L|E6|B#-X*KAaAnr*yzM^M*ZqaH*`WQ2qIIt0ihtfsNJUSZ|+llUZP~s^kp-B;D!*&pABTS&ov0zr-RX~=K z{-YBty;I_|6G0aUAM*LyaI==~FTXHD5k~-tQ_puYZE`kp%KH9NRh5-9Hm}x>9>Ql< z`K}T^V4zDv3SGVnS(wpRP3c$~5?Lg2+5q}$j)5)#c~9I2`HlU;_WCGK$bw+b&9@r{ zM5fOV*f?C)fF{}$N-Idy+izxMvOxBtN05QZ(azEbYI3Xr+Q6nZx6{7fd{{yz&>`u@ zV0|E!E}k0)fz~f1sLy04o*w(sK@7eIox?&M-S}K|+JaFUs-?qbm&q~Kct?bLWAo;e zADnrk*$GkQ|D181^&fU>{}4#!fBSSq3E5a^39S{ZU^i78mstsHLBb3vR{M`1^B9Y0 zcH+ePG0`ovB=ZdWW}#yOkfD^O&SW^R)OEKRxsoT+KWLUcKc0KdMn7ymDFZZ(Q$L`j zPoJ)NPYSv}oMp7UcfmMf%0spX2hX1!6f!<5imy1~X62s#<`qf4D@Z-1k+qRtzzCAX zK(77-2lm#T56DKyE*Htq9AJt`N_BZQV%&b!NpuOl?<-UA&UQ9?1^K$84}B^nsmU5v zones)j#VbWY^N*C*AH6k@~qK64OKsM$BN9G8HHy<$1BicnPbC$&fCkhCmh(Jw zr`_A!Yj>Bt$qX5a(#?#89|iE|T&Z6S381_Zg3qbRr{D+i%fsEp^4`@LO@+tLTn{QhJ)NmN<@qdM&X5JIiLj0)eO%Q`5gmj|93=m9Cr= zyzV(qQtoAI9B=gdR?Y`%2(Ml4nMenDC0*q5(rxZ<@Rx#BX7LGm<%K>J?mFqez|PNr zi*bD`YBz5cmFI3tp=8fjw~b%nL}g0K{^W;gr_-qF%gCDSER}$2=ov9#IU(nHQ`}|? zcq%oT+a~!iXhXuLXs*~V;|yDMERON!ZL7w$={ZBm;`AHHFE?Lavh+}N1TFqaAP(OP+*nhb9_^b6w zbYhnI%E1qNK*m@uUKLVC{C<0ubcdow-7Q?+{&TQVXU0g74J4TH{zm!MWz4SXMS!5~ z0$Hqus3=b87S3j^;-96V?ueU$KZ?R958zLC^{7URZ;o~M;K$vkwGH(DYn%%HDa{R4 ze||~0V)b%p{dxu@cdXL;dPcmHXLC+3WZ$;X@|6f^{Fhm-W1$x#lPp>9)bZm)$HFv> zlb%iSw_@FhQq;fx(l!^o3V#E0B(&=Nn2cA~dJMMC0&ir2Xz7$KW?B6AMD*`Fqo<;a zoL&m?B+mHSZjpCMj)Z1Ga2olTM?jg&|6zkC3PtSqf3sWW|9lK7Nwj#8Z(t>P#no@< zzTYwBL{+4$o<3f{kw*>;k-@2ziSCQ3H%Z-f>MLeap1L*KNamLRjeYaa=FM~78ulku zceC~PIwCRWxa{&|=Z^tjTzot;*4sM#^Jj7TfhEpbh6@EvloPc@RDF-#&a@1fa9>;| zlAn!2kd-%1NCitp)nH#p00@@dwW7~7Q)aS=s}`j3Y{{YWu5>Fnd~-4b!1|FFWa${Q z+l6H|;}^I%XIroet!%84h|`WkNoCPt)*JGj!xb9I{GokjP6wveGz-lX7DZu0as$Om zs?FiT`gE$Ef(`^iG~yfJcn$MCn8r^U%zL_n67@GO&LZW2TAEsqLU0w+CNhJqZT3TL zkOJPvc9=k2eM(nbBt-){`Jy&VtxX;~IadtsAUOcBeRjj6FwZYp|K{>B5{+r?K_qw> zoA=}`H!BST-e2k8PE!?wi5oq=UiH7tjXC;2=YKYAt&waPKNVxRPJ!OT{9eRr0Hjl- zZ-eyy29~}ZMzsU^LU{V@BL=oUcyBQORSVB1_tB7l3I_Xs5El+42UgZ|m}S8hG+$?H z{}5QU`(mb1A>Rv6^(bOO-8{@uIZOdZR#W+ z?;(Bf+%GFkqTH#e0oFdY1GF)e?c$W>T=(I*p@nA)%ICX{&2N|aX-Ql8JNLg1af%m- zVp!#=L_|xcER5|KxpxshBSv*8-WmeN{q&Dh^%123M%A-l<^|%g)g*?$(SUTE@O`E_ zX{36vi>ArTPkP-O*M29R+tQ*E03teke#4Ha6Ld!Xpyfh600T94XpbWkx0St5wZ7cs z{T%!R5ye7o9d;C=oNc*G zU(OvnZ|XT_!gXq+GT?RN!yoUh=X|8R#KVrr3*B_G)2)=_)WpAd7oNKQwwPhL4G*mx zu>-u=pRXo1YyM8yT^9++LxlP-#6w zioQ0&qw!(s^7oG;UXZw=D$H@d5Sjb^FS5oZ@Zr7xB3tl(kyR5H0*~2aiJ(`K#c&RO zBcbsBR|um!_0t?#5J$4BFIP;=t}VgCZY7Snbau1EK4_JV5w~cgBTty}8h$@gehIBvS>va3H!@H|dB)Xr(NNwDb=y&rH zJF>I*tQ7se7M-Ry+s z-ET~_-Yk)|)wP@@ltmERxbD>7yvP__IQN>B)iYGHD$Ax3)L>Crqua1%zD&AGH}4ug z%UuaV3_g`yhFw0Iwae`Hb79{1Srel4#mqZ>dLmtvG@y=_c9JZ7hy%QfGo$S*`$7_B zU$m&23VNC5(&-y>V<7*MjS1ch(y5|Z3D6h>QEg=cd&(;nC*4-BHNz!s4Q}JD{ryx~ z`n~nFqLcoHleo9Er{NXWl1gA@hgl8mHzuo- z1s7QvLK?N$`2q$+c@Qmqp8rRBkPPDKTyDNp!cvs)ZmZkb*@{9OdgobGh~PC0+SM@o zj1C=DZ#I|Ji{k7ACktQylwg)_iVk_eGkGz6JGKfi%E2C?MNF4Tx=EnM ziLAQs$U#X-Er+Xhhss~hu4Xy|9-~i@$@Dh!EDeTZTWR#uzNc0s+D>y{qWZHQMSV$5 zZawh|$Rm&{Ig_&Y&hMo3tf4l2lBwPI{@4;@fMG}CJ-zy;g$?XjhyZOTl<31#fqnp) z2R?W%?{=%|+u0$|&#(-$9Kl6@rGTov!hZT=+AzvuI*UL=qD+P-^yzO;l2SQHkoMUg zJ>=c+6X&rcpi<&brn@iqbNsf}+gCW81$>pKzIK0QQ&&qMJ4?{EQ6a1Sw;}4$F#;Br z{7w)+`vv9u*B!7j5tF+mYM;5(p{54XX<$ma6bWS7-K2e@AR1C2HoxD3)2Kl|2iUtR zi#AEsa9ZTPT0Z@A4UTHXp!MX;G@N=~ix{xZ2p?WV`t!i54(o~S>Jv>4-F`pQhBC-Y ziu=&LsQD?9SW9sAqt#t8DzD2r@`~IhQ-_+Onh{fGl7r*_-bgBy;8^=_5A*lyoJrbi z`uMJ53c4|K`1G>0wFD6oPI+h43X1O9Iv4#1Bm`@XS?$J`%fU#DbU%@O_6WL z+c50{3HrvT7v->HFFQ;~M|yCaDKT2eQcOYRAcvS~DSi{bUZMu|d)CiaM}@`yI2bX0 znZ5gK#11T1Yeyt!XL6%Wew|u=fbysam_h!VO6Ye5+{6P9_HIu9KEn5Y_Pg+7@h=d4C7708D?SvpCZ`3(y%2_Z}{q9RPMSI3y} zPCa>>4M$Lhomb`!@TWsW=rv}9Lj?@`-yQlnO9@Z=Z$EYKe_aN$EC{@+@^2$Y?{jQ2 zdhVBh0Z zg6m{cjD$lkG36DN8lzQq6_<)>rO8%MpqNEet+aILGX#u+TBuN19hL*gjz?9>DcYs?0K;MYRy>%l zEWrUWCeOhM+2EFu-z`V81fQ=)Cwkw&0yy>EdD;x}L$JM4)W7^o5DAWvtK0U6XJB-4 zP*1<0!+erCET>(9kyZ@T+k6vuXzJHFGHU&WAjtsIDs?LuFB79#h(vnqEFG#b%am)V zk*P2a8Id_pZ6etFiel2yuZKd?sS;Vzu~V8M>v(sKJeXiWCFqLUi4NT@UBvEpkYjQl zKQPtRchS)f(z|Y)!Cy275_Ux51P+G6pd12GTg)wNlI@WAmXVQM@1{oJP@Uu;L2nKf z;Eu~VENMW2NCeL^vo?zDpCv4|ND9!BdrL1J6TFOTB$)M%W0^b%u^#R`cyMX>CHG1f z=!bQwAT>a#dof5+J@s2hJ(y)+s)NyFk=7`df7tpT8hRg+AY02FdA4u;Ua+Kj*SaP@zpL1}Q@X6cz36DswXy zyzjWgz?XKen#NBkchP9~ZwD)D zMGO*kIWNZJl+T?i)EpKWrYe(-aI1f*PcwHnPfHsYDIy8Q%iU3yRmZLg&*u{5M!_i6 z(HVeM7Eo5c?nYDVEZxjlmggQJc$xisv+B_OZ%Nx@^H2A~(k+@0z)*04jfmHyw&eQT zz)wu#1F%kIei=ERma+lHd;%?Jo>qA^T!L35*7_D=b!sMV2sS&AcxT#(J&S`r9X=^& zVAq=pv(jP zR~eA#^bX1*>e->PtSBN#S~O;;P2?{z+$Yzii1GeRw!79|`34XtV>Kd#9+`EIL&JVI zP=?QF|LTJGOtg?!VN+U%OhR^_3JOQu9Azad&*4f(yV9t(yHIKmcqo^yE@6aU7<4pJ z11}EKYj|Y;Y(Eh|Jj6}6xf$-jb{WRd=Zc}}Rb*-tomaC#206LO_n?i{^+lM`SZL`> zH3vli1#}xCuUV*J$I5S$Fv^xgBI;%$J}?<+vDrxXS?{Pb+S4Q}Ffrx~tR@#Fe86Yc zjl|0h=oJR*iBblNr7aE&F|3}P`nCdWz_JO{f~smmcijD*#psKG1Na?P&1ML?>Q z5jPSFpfz4|yZi8zWRm}<$&=YmAVlGuQy6~RXyLU#_GOMdl-tu%_Phq&{> z-7~?r5Idt?P-Q$uS*42uHLypC+L<>ZygOTAFHKtA9u~5zo2#?H&N-Fbg z&mSL5vn~v^r%lz_JrfC%iL$QSXfm|8VoZ(W-B(bPOy+1&+`cg02kqH=TVvW5%Y06l zWk-UNp$Yv$e~ige>kBExwfvFhlHaNG&T{c*hek-$i~_KT@`q~G9_`{Qn1}jiYnR;p z5+_QbSAQ)=j;ld5UrMwv!eQm8 z7m=;`OF_`*GHPUtWid$kdpz$wm&yaJz}^4{N%0IheT$89IyG&bA|G*g!fYKaS`E_| zyGa47ryCTZ)Lbbp9!#leiz{uXYE=NlJS zA4G$~(9)GqA-ToA0~q}FLxI)xl8Dl7?}4K1sR0| z!fGP!-r)loxFUlGw&@ec6zh^y*{doT`tWGpWR?vnUW_dJbT zi(q!kGKQubfYFl3xU0_Yr1U(;J=guovwC7mx*kdVemR1wK@rxpN?OGN}u=L zbo&u=zNGw&EGFLks99Cf?&6*Vq)W**?I|v@%j9QPV)Al|d@HY4$7#prL20@_r2Lc; zrH99RSvh8(qm}NrcY2xYlW+*6v%kKDQz5JatYqT7!B>PbhN9-U;6nyF3D@C3;ZSX; z&_U^Ea6a`f9ke&O2g#&mC9~0ab@PT-gM^3UUIW?!c(<=*S}ttm-`?oQ@C8#H%Zr!v%^Tc_zSJSz)4O|MKjACnlVKib_IW`7TyFA4>`;6U ztwUvovKCfy_XYS<_EzVI>4p;P7?Hozw$Y5*W;W7oN*daP%N_2Rn)Ad%3(vcjS%ddd z-s==U=1GP)E20a&2HH^DUWgwJx@lj0N5GQo1X~kqhsMT=fcXo$;wAw0OYyz38M^pl z8Eg0euB5qz`5L5Fn2T>C6mur$v%u)bgr)>3L1ScXIS1H40TpwQu*Ont=7uCpb-y*? zXzLtA{SF&X$s-Q3St-Il;vQ+JcMfa$=eufaS?IsFO_&?%W@$18dqZ>Oc9N*CRuEUg zUngg4@We|CFF8MrUGa5pV2q;1$H*WsH4UtpNAQO6lk0K46%%dj@kNz?cpaW?Wyf6O z4r?)WEN!F>?10$|2H_JO^C2nf!Czh=W&7I%bU(jdE~oUq#Qc)1Z+;d|?Uj5bwZZ#K z{H7>p+^3kG5h<3g`&I@ZxdyjClC9-{dkf_4-|_vy8{!^?OYgxf7_jydV=C~9=<4C0 zBDmXL4aT-I=+|B>pAhR~=Ny)Z9iMs_J#t15&9svlxrWM#pwkU8i;D|z#JlW|+d){3 z7MZz>eIIY8Y5#s|*^Wg)+qEa$2z;^S5%I&gQnqdp|CCdxPqU@!u>zUg(kA2szcH5t zd{*k5gNBtU8y?pEYA@4&A@>vRRCCIR6!YB*o#SZlp zbLnz2SUwk=DY9NfvW<+{(^B^D^KF;*-({DG0V$t!jcB(}y{(}|ly2K9WkP3QCM9Q> z_uuOOkEeHx&g6NYhqJM5CmY+gZQikMZgj`CZ9Cc6wrxAv*xF}5-{1c{Z>G=mnd{A* zo;lrBS5>Jqe_2UUX*s*FJDVpNzGK93T89r zKvdi~P-U+GauI-*mwA5u$Nk*T%)K@AKZ!G(Nub34Yl*asJ_urDb(zg}xoP(}*?gHb z_^~w_+1Gh^=zbWpleQ8LsAyzA$Q#Jmue3fJWE%bYQ}b0 z;=Di@EN%GK2tuZE8&K13y7VHe$E6u{O>W|6F`&f}FP`d_UW<|b6DH6+;Fv7&kBc@( zI@Zd}g~xx$2TEzE^fmPjD7biZZhFmc0&N^_nliiX%hs>|5b@c-s_FD%qrV2h%*=QsC556+bnPBnVyOCn zV)h!IEK5#lROQt>23{^_b!7|v_2<0_h@cz2M0XbaAJ8rAf(5hw55{TyKN#l>zzf7X zP60Z&PFYs#rV@~f1Ue>4#L{Phj}`188%Sr5DTJE@IwOxPtYIdwNl2oCg@kZGY?uXv zEQB_0rxKPXr_v@MFa)dM#x96ZZ-bU_PO5m()0faUnf~34Hq~jtU)ViKGnLqV+4>Hs#6>GR{%z-owlRa#e(N)!rWuCg%y#F4^QCb*>L zueGrv$npj7AfGS(^j=&S>!4XH8ea6WQwKT_7d$~32Zru+UtC$fX#308(CxjL9y-w# ze>C-}{7AftA$Q})kbO3G%gdEHq^qv0=B=_fBd)xudaoCmDt5u1?E zds*39b~8}qs%v}vtwz?YU36v3%v3V?y1mS0C&v7twQQN`aMi!9qa*-vrm787LSJI( z%l6KTY$+3#Jd2-bgA;5?RzO@t>(EBJhzx}+*P%6r@U$e!5^c49HVYc640G0$0Nb(f z^pRj=Sg|Cp(jFTd=-`uh%@Wl!HHw#4f(!){XVd7~8oQ*q4S$Y21x+i$x5)Vo(@JCK z{V9c4DNtiIbfr<7O?f!01R1z9(RvxA=&JbMF>B0hIob5=_Y&<_Y@lk1AlrO(Rh36u zMJg!GvJ!!&LSUKwW~CN^4HmPqNe{!*pMk_@IUc}tBO(=0K1abNqz9Z3ax^ve0u;F4 zrYw9MW#xq=aLE8u_zQeSZt*GUpw{$0HMQNZHsmSFGlwke*=e-xa8WAm|s# z>qAm6rYZ6R?ZCcn%d`t%sG-RYlO5;vL3Mm8M82RWWPdaB7b(Hg(!=%#o1F)^N+^N{ z7hr6RvTc(k0jGx!o(i;Z*Ka_AFP2yZ;O5d^!hht=A5K1=_rzc|eSCW9Ipi?TC1N9Y zB18oE0{E&lSE*fb6v8jgrD#%D6@O7%v;_*#y>>MskDi>zR3vlwV}D{o^i!YJTg-`L=QmH1Gk}^%sLRYw;QcHton>GVo_;A zZCBr&wnop<2Bg2;P)TejA03eU)Sz{(V}X3F(-M64W3uu%RLHUU3PH1MRGvIlF1+?xj!PXk0ZR-Cm?aWXC6O z?V=^Kz&Rj#Vxd)MOLXo+hq&{HA_X~xpILNrymeRL#{H$z?CJRo%R9brfl!I1K`A3i zRzdgK9FpnOt;8APf}Yu<**olo*n%!YE#9dk72oWG$+Bt&73rzg* zHQ=DUjMi&`rqDH2JlYg8259M(B(PVyDlY2w^9yN_8cp14V&p(s83>Fy z2m*PHk#UGz8KQo_A+xs3FMd^x4=C;}6NEdmX?n#k`g?nlYl0mChi{74zhb~|inN4LJ z!Ys7J1PQHzEgDoK$lFjeRd!B23G`EDIDLzrKad!)R92R$Vlf$VJcu9h#1Ap`fxt+? z&q%_$Cr!a(Dvdh-qUJ}K#rXq8i3wD8+`c-s{zsEJiBbm#W=;1Wcp-*=#@ow3T0m~; zBKN5Wu#Y+|%B1?f?Iu^RsYhaQh`Hc^J3-WdbQPbjbg&&WjwY8%irG}vHxO9G`U4d=J z&HQkRekD4ibrwYTp;!eZ8Q2rM8nw0t(ug*z=K0eWzR}A$FH01Y*gQ@9?O`;Att-PS zpw|;V%lL8cf!Xj@qm-N+-DLPBJj)2swWl0A!QJ=wg3{Q58*?kwHnBvr_|p9_<-seI~g zfk8X6a_UUB)I??1q4?Q8iriI{48z{VMbO~FIB4EH7gYa6IC4C-;!csoMjFnHtI9c$ znUnq@Epel9{sOhl4w!n62<__mT|pkdnRpHlshYvam}>(2aUdX+d@R;_Zc8L#nZ~wR zo|HkUUvi%kU10qJgCh{YEMt#(mne9Sn^LzImyZ%LA{Mls(+n6nN4pMsB?ii+9|N!} z^!G0l(3yJ8H>!Ikrt|6}!Aof+><8G$%bE$hX)#PP1&5obfK=yMujU1Y@al^!5+)Wd zIyybddpgrL=p)2tHV)j9`-=TwQ4WI}Pp*K=WgX-04l1j#YEv^@a%%haRE3;snMDx6 zynSA^o*ZU4?v9okxN0@6XhGslws@2s&QA2{9C`b1zFq2M|HO-_XUT*&;r`y=(rVR= zcWDsQ{UXz%z_?w_UGz&kS#wubVM9=733)`ZQl@d=lp7ST^k3QE97*t3ZgmqL559$A zUbtHmYC?Xlt2_Kt`xYmIIXBP%C%utf3m{Czl6wg?gy&+Wt}%wfZ6Y>WH7rFD`3kF=W5W9-7m>pr%Z*WV&rPPQTvVD!#P`40j#Y)x8CDj zn5A9TXnX1kM1#0D&6o3 zh~inUlL&pjM?J1_8<}`Nj(UQ{{g-`|emvcktgN^%_D-vnw1VoBoUePFiA4$)(EB=I zJad4poi>rElTsRSbrAW}BK+sx>GCj2+7hY=H;%HByFwdXnzQd?Qr3Lok#J_Dh?00kH{Y0(2T_4$+4I4xDpQ7yGBT0sTldS~~D49}2+Z4+Jj(Ag8pO zO7|R?Ie}uthod&2)NqfrSElJQLjWwXmR|VRDcQu~tjsz8fqBzTp}**CLTZ&7MGaL) zD^+M>iMmu`!;ydqBkEiwYS76N)|7ZrMiYQXGbIpJf?QH;s8EMT5nL>!DYe3l&TVA) zg>}1&x^?M-wtT&{!KsQdm5weB$e7bJ9JLU2i4LQhgvN~t;R{+v{-_$bI?zPcELCGk zSnNgx`R1p!wL`lAc~?jDHWwUU` zB$wwf@4bSvZo1Urk<>H*Oo@VFMdS{&Wf0gagp88SjAYj>(Jep zgoS?va6xd1gJ6rFX}G-(k=3CA2i<*}Q$o4!bL9ED6iffGzgQG6)+@I^)PMgVe=$fp z9G}@Wyr2iq%o`vklo6K?k9;V4-yLq}4>sslsC6l=et7f%hc3(2uCU;wX)#on@{JSK zBgX(!U3lQ(nlOQVdv`_kNg7jEod?Nd$v($FGQlNcwYwN!Hu}*w!?gck7vS~3A*ZES zxbS^3c{}rY1E)5YG)!%fX2-2Gs(|>dFsc`t_gU4Lex=5YPP7;h~TdKIqfW+ zJO}A}a}met>Jp-O9h`3>xx{Fd^NQu@a~X=xDHHa4ahndev%cd!3|-qdg-wrLi6j(QT@HZFZq=o7jvt+ACHyj^`}|s z+{5`ZJ0oQ952*sfR9GDKu0+z%i)2Fs!S&c(RO{k`e?6uA;Gv|s%w5dwq)~uQ=jfmy zCa_>skbdv$ips+g+32|n){lOFe-+7^79T&k`#xzY#USTT+Y{mj(||+p^sCozO#DxZ zQ6Lk+`RslyrIi3F0o%^tuJ+?nzflB~^!8B-FXS%{6*Z_U@6R6jpsV|d(X*1wY}2q0 zA-F_1?3242{!ph~)aH?&DKG)S$ji;8$Uybxp9@WnAMtG69F!?xn{o3~8aTCYrVR2TrlcRX*XA;P zkg{;|D*oNjgG$Syk?P9gSF@g*gnNVK#hS*sZVj^1WvT^WRO5*Fbq2Z)s5tP8X!Y^X9x-w6fgdC-H{CU}k8=I9@{;2;-fAd-Sj`ZZA&34Iw z3eT3!mYqI@wV3m%b*g2}yUezm5diXu&P<=UWId2RtpB-U&C}#XnvnM-blou>*gfcy z=R2lo-}bRj;GMQe+p-a0OsGRqd}QW-t&8Qz=$@uYw1iu?gj$!DoJIRdiID%$4$D6~ zedcyemZGF^PJ2}9ZHc=ryLir>Da<%0r(uPerrQ3aU|Rz24-0+cY(CQZ zq*cSVqMtXt`sQpY`7?%^i9<2qBLuzvrj*A!_~H-Lx!ebqRfTVS>iSK|@2k4G^=FSW z{15LY{GTtdqauKF=sB9v40Ki3rg`g8bDq_Ne8^D&z#(@21AbmWXBFainQg^vU5Gl0fjDIQ9(uuf2!8`g4N_0|aD_`hQ6J zs1r9Z%iBAPf1`GLp}WIAsMc{5oq*Bh zb%;IAmA37()#@yYWXX8qSpDJnIUWp*F7NAF;fr-GwsN^v*|>4?lJlPNaTeGujehB} z&%oi#IR=f$oOeGxY&;>5KVshGy3u8nQ33>uBzqSWr1w&I@5=+kY&BDDNNs_js?cMa`S8nlGmsvl_>6-*)Av`CqFZ(w2gSZ&wvse;A&B$9O z`f_iE$F*jDm&Lc2POEfjB@hC6 zG~xmyo@-i6hR~}E#&BRdR*%D`^yM{pOsfh;#{!$RG=tre7H+OfB)Yn^9sLa4g+E;MrLIri*ZD2xZF8oT56*g+3ilC9u-b}=y&hb%2-NN2 z%D`6E*^OY1M%5YqVy+!_1CMp$zEz((3BaR@Ri;H{mYQGk@hDeUNNmA#QbmFIzC3!8 zQ6Q43s&vGpsZ{exGAd3ovgq``2~R}dl1m^-(cc=F>G51z z7@W?46f< z0a9lN8$)!63|?e?8XRR=vKC`K>tHwt+ngFHp;f!4jJy-r854}6Z*tbC&o6hHoMRL5 zLc!{onBzyLbIAgEN~e6Ql^c{8azu$sIEn@ua=B7_&!~J?Ec9n=03Sz^PF&H(6Wtpp z4AD+DD>>tDMdEsLBwU5*1LX=3t?s=sn;^Jy-}J*)p- zl=`rHKmC^DZ>e-g!!60Mslg{C(UUri)9zxYIB+4`nhD&?H08=z*dNBj4*`4qxo*3T z;B+CR_8B3=W1%rXI*Je4dKg?N{Mr%RiiF>x%uqR7;ePsq3HfCwLQfraYV_nvcA?|J4>#qmc zyz(P?RY?pMRNO^^u$;Ww2%N^eT$|aLs=yu~-?p=cp>{4C063IQM4!&48MRKPGi3xJ zD{%~S%&BK1j;{!k`%AARY{Y%>Tse_laml(+Vo4dN05SZ%*0k;r!w(b$*N*rV=Lg89 zV`VhG1l9R1LS-Q>3agzT{RTX=>-vz7hHM}~(eznTcdZuHCY*4M`*HX)`*@qlNc1AG zH8@&-{VIGo)AC?}lRt`3qK&3iOWiGrZ9(W-LoI`2T~&ORn^jl*No0n-oHTx!1WW=g z<}q+;zQGn9{YZ{(_8eYkW+sCx#n8r7QkFwNg3AKI?G9r4v9Z)VcfW}q=aL20hFc_9 zHe~5h*;JXUA$ZpWMA;#9K}Sx-D?%D5!^jE305AxZemu~Z)}{aRf}Ep_w^iS-S&xR{ z#>-sdM@jR=%RH^whQ zO3cX{fGLrGWDF?@(&F%+Kv&of9d@H;a}WjlQ;~0A#uTD1YKf4`?(Y(4=e-9!_lT?O zBqAU)^@a6<-H+WcbOfs@#ZcXVWTICR+5`;&OGknCyih$m#}=Z?Z_83sR826D(VSei zo4fex2}EbO$0*&imApe{KrH{VH2Q8d6!J}UCGZ(7Lp;1U6v7*_AhM@%=lnI!T=9BB3%^an;F;BGv@>h(R?KGSuTT6%XKJ!yjxubCoG5uXKVb6 zhmV}MqTOMK%sV#iN~h9h2kqhhuOjp60X|bX+}ne5l()EDW)SKld+{v>ry=bONXJ3vc)#rX9_(%Sf7 zZE=3NaL9=yAK|YuSDcE~&H&GWu}unkeDNH|+ej_cYo)Tr&mBR`mWv1p`|2p~yNj97O_EpRI-_WXe^IzRfyFfhfU!kBY*1y}kYg7-2heT9G|6e=-rxI$Y zx3JmLAX`5;SBm^|KSLg89`|HG_wn)%7(kcf@*^;)DB_xbY?iF`}VXN0LA| zqP{THSv7Gn#G~woQ(mCR{rBBFq#>9KXdDvK=`?REc@UnAh{q_xhW#MI0+%Y_ghsxL z3n9WyG_#m|=Su1lf&kXumb2wrLC0DafitR0%RHBcue`Y%h|$84!9Jb$=B{ajX)Eb< z36Us9L&8E6q4g)B!3Xnlx_P>}6ia2cnq&ldh>`K~J>I zv?e+|o#)NXvVAOSlZCyj3^nBjj*jjx`zz8aBZSQ4lPnZsB}Ovyz9D!~5w^&*FocOX zJ3W(UUtO@9{lq6LSouFQr{=(YIxhU^2cF4oJ{kPJp^4>XI10@?=4H>3DYQ9BS>LDy z%KwgHmEcJ-NeTYSKp0QFQ8zzP5b(A@#Kc0=v-;I!%K$DZ0!(V*7JU5{Y7t2>f&g+I zeNZ@Oa>KNBJ*h%HS}WQYnN7BcMKKwZc6*zSnk0!D@C9Yk=g932tA!@31y(x~PP;`~ z`I|xIZ%z=Yc<|$<v-%=VYudM>VVu~rIv{H0~HTp?YHnPb-6l5x$kaU%~K zo?CnTj|tl^<`V8gD?94idGtrl*p4GjuN;`nk_f7+c7yoCXWHBDj+i4JZdYe(7_(;< zI(e}1$i?tFKnUI%LCYgo;Y&L2CYPlZ7Vhqc?3$RkOZU_K^ELp(DP>*0dRg;tfQ169 zBrj5I_R3;y-UY<+Y4yDFHfEE6wu!Hb!Zix|nAYi3c8M9dT{ZcdL2l?7&zBF6repMP zmAYJ4fJgRMX2rPbb)CL#daZpHpq3S`eoIQ=6`O0N0rk$t@apffQLY{uxn`<3tSCKB8_Y5Rm9HdO#VNu+Fk8i&&+b` ztwkN1z_dktNhO!IZfi#FHcBav1wC5`b*1`uEy3milJ{SOP6Sr4ir`ij(vu99HD(~^sgBM@j#vAe zSB2YM0wk8hJ_KK`dBnZ@@VDZDO=%mc^Iwnt`J+UM6q>BajWG$J27v8_6I*50)a&xn z<4UVZSN1_Qb{9}%@*Mc>b0w&mxS}EpwN;hhp&80g4}gtn`SMNkV+tP7C052{+3#mn zAdzlD^HmpQ)-@s{yppS?n zFpqY1M$!6{&IP3$Jw%ZRotX$4YhBZdKuUC;@pPL!2Q<}5R`xbICU(b9>^xVQxt>-D zWTLutpJi>j3U-bCp3Ho9DIy8?LJ^?v@fMk-1wwLHGun@j{V?x?O%HbnXhdB`aeRKg zdIXO`7r`^Q=+%D+0zO$0G+(+-;jo;jk4_Bhq+fYAl$^<&RmjL$bbj;l214c`5CTi* z46vj4%RKCDBJI|k+H}D)gn)_D0S7e^%fJxC;8l!KbiO1|1TjaP4P%5g6E5c~9T)%T z&&(pY%{}_oj{+a?oYzF`gJ|~B^-!z z7FJt9-(ZAr+=&o*K>+Eg1w;+FyO#t$t)`>f%$%@StjC&|AoayX9CLLHu!(L^jaG*i zWT_gG%=Frxb#n@xrX-W)mz@Z~;>^WGcx_f?)iKJ(UV=*~@5;RSv$pw4{X->hY5VK^ zGW~K?*eDzLfFnt-I6*5tohzl9*dchHI%$+=1|84D12Jt%738ubau)|H8me$;T6reI z@`Mp=(D>oR_7+?Fv?RNORiqU0hhJ1+ws_58vsaTyw*~&AOf|lG` zL`61hJ;{APzS5|f&uPjLUX#FO+lg{s+q@5vV$gY~Z^*)#X5)z+7|?6iRv^mb9V!za={&|dDVOD9(gd*JumUD~;( z)~9BICZ-iX2s`EHG6TfI0>UjcsaamLed?1gPV<*kU9+6@qZ%|YmKK&e zAM(s0Jr4y5s2_U_@|8mzfcycq!~o@lISVAw^|W6?wwBDJD3M-mBX zq7M-J2Pr^ZzV%T=AH&{2$z$ISG#=S48qR-dl{uCL$Uy7^VgSUzfC?sRp0U$U@tX%( zW7Ut_2+ijmglo#!MTj&bEr%ATGl+LgtDdStt<{2|j8IP*)%vB_YZ>@n>-Ol_cu`m~ zPKKyU4?v%%TbVLQeT?D-Q7)#KaWy|rfE3ZI_p?XjtwFoQKtaV5`r*mQh82#f^GK~yy0a7O=%AWUjg_0;p;ret;__cg?olLP8 z#8mJ7$>}(^D1UXtgOlQ2B<;Xydx35)^F%I~5<@3`{8bpv_9Z~ee&=jKs^+) zw_{*ug29#KOclC?3415tr}iXW32+t zbMZ5=a9G&zLqirFfvs3A;e>;&9_f61%jy$I?M#Rv>HJzNZ1Z3oJ=-Cgb|!}Q{Xr^D#o6?Lte@coLV{D zQosCoqWM2RyD;oTHEstt39XNM751wV{&J9S64OgwLcwdy$vB=^J+=t#M7jHtxj9E> z+Rt4q&7n7o)h=$Fxxo(CF1}Zx3LrEEaHL{Jgw+=l{%N!P zV_NB0pQ%^obv?z5A#5bbD9m?rzIb(X(eK2}E{;e=d3e+8)2h6Xs}z#>Tygu&(^5Ee z6B0yr$vL38MyTDCjpyOs4~1rV{ak#!okQ42lZhNd|C3jYBn%6Et6zbMr%%Q~c-JL2 zdZ~12JMdbnMuTG|BR~IB=@~TySako{S;TopM*B+j9#@uFH#c!6f8(-*{A8O)R_EFL z9-bgBNtc!rE=2hblP(p``Wn->^HhIFQaQLdFKS^_{W35yYwU`;0wnNzqnP>y=ZuhC zDz{$#lx{KW%kWI|tB%90jM`%lGNU4xlSll$Cy=HB75RvkmaoF5UQFxw{2(oeNAAY5|0EXL zJ#S=S+a@5e^|(mlFfPIfEH=!`%SixC^?}ki#kwDu-JUN$Tew<43=5AlE`XUOVCiL00l?#-Ud*TyU*b?^S7kA}2$ zQgLubc`IOuUuCWV&|fBYuM4Hfd}55afI#J~-DA5mL^fAi5(BwH;&5oUGI0ZCKFWsC}XnCN$U z896lZ9pbi(hvEH-izo?jfLB_fU4AQ{Q+4`aESZZ34dG3+=at>5TDuEuwXP454?DcE zf|Thr;!v}Hhd0aWy=??-ZU z%;GX@`GnXC|nVl?*5{K}ztYL=&SomWOVZ2s83?f>0*2C;sc`oXv`YWi;;m|Z&| z(7JVccKq)O3=yFH*mC|`^~nC;BMyZiM*^*9aB-GLJ+|#cXxojm^e>D5_No@t44M8U z->qO(amqPTiIT#HSEuT{)9f$$QaVTX8C;PYd_Im97}G2xYS1I z_SMyO#tZjNMs|iE5cmaI52L#GcyuIxo}{0)Lh^>-tJC`Y#J&yNm3la_2IDgbhdXo^ zubYT+XR0a@x=aSVWRmHU+TBUB7qju2T?I-X<-lYVM3U{L$e)$H>JY1`9V&m%bUQowweBF!4Hs3v#DS+ z(<&+o{^$8O5n|mtoCYyf6`xD0nNPdh37Q4Ao|6+0il-^+OGiXC8MgK6V`g{~^4G-| z6!pys7m!!V}ETg*BTl7kg_Us>eM*6mo=SMw~TJ4M+z%o~V5P zbMZsr=Yo5<`+CmOetx+80s~PnjO(8?cOl}x(;6es3|4HoIX%ZGVERp{(f4es_LH2drMscI=6kf!VDw z8O^m7GWJ1dnqC^a`mB}q$X@#|{j?+O6@Gc*R0^WM?fLQFJG-Dx5+M60$FlyPFCQ2a z2u#v`4LVTumy4^JoszSIqnWd-m6?l_k-e#{nKOflt&xk1x*7z?zY-9T7`6X%m5!C? zbwX`wN)|zf`C()K&s7?M-t$M)KN27g+*rTxLc1q0C?Jz7i8BvjAgv9(Ac)TPc@lxuB1%HNy2LL!konB4j-DRq zwCD~lx{~xHqIX~U6ZSH(6(E8+5%(p;<{%q~7(oBYeVwRf9nJ(Vcx2PH=h&*RRmq30 zk#7`k)Wi@Nqyc}r_`q+sNn38nn(@bkw?1b8{{;`Oi+#}X6S-X20=vVy)BTotP>9Ec zF_tU#JbWJ^)U#I+VX)ZxV{oe%D3^ zic#E42|hh^$3T(1?+rit9KmLaUFc3shQv4S=$vPFj-i0)JT@91($D0qRa*e;%SYM8 z94;b`jlz!E_th`A;2FIC*VPTrfSQ4kmF&5A z(vGt}%lJ8g9B`31=V%dD;9H{Su&JP4bHER%)28On&~Z8FttfL8OLpS2A~`K zm6i2&?Wr??*i}keI_MO$JQUn$V1%PN=Jl!5u<*D%$@k0}SQK`R+rO_Mf)JVs_~X;uMXxGiG|}igH@i zJ=;^mf^lJXNMA>s3Fg8&5D9<$=b^ea(bI=Ms4BNODhYpL9G;P2Lt@Xj{XUt0v#%A- zICU-+t|RF1mBC9ej@F?r7KnVDVxiM}oI5Khnp_XZ*x6>|-e7D_6rE1sgLe>y%(p81 zM1Gvshf`e?`aAusn=-y1(kw@~$782YvAea>-aog_Xzzc2#g#+y>db$hKMIilKN*0~ z2$fXdfDiQj7s&O`=WNuXU`{1&0Ta2H#yQ;AU!}nRSU8?C1$?+EFd#nOuCtp^_a?K` zMw;zj_!GWoZfIl(%MU~_*{Q{&tc2e->0dO@Uk7&&^Ow~dBEcVqge@>W9UT+q0^z>^ zZHCs$x+rkuP7-vMDV5bqsw+#T;h&0Zt>vh3phFhz1nF1m#>jT7k%Rj4y78TNYsuDlHSS@T434J^TT zf8^WKrc8aqS+fw7aO;lbL|1^C)`d#hGR>mu4P9qV1-W+R`82<CTK^W_1eJGhzQ4`s6T5m47*#z7q73y`{VT+8$6Z8Cv7j)V<jnKALJSFX;uXg3xJ8=FO1JN8Ldy#%CO|4UhI=II5k86{ z$PG!xBXqhQt$l3^nr%NkL=?D*WaN4+B!1p2G(7i1W5)6{(+_Iwo(MP^JI-B-nHL zfw_99B3if;h`2>_9P+sCaR0)B=43c=F;#x z(A)=|-Ub1aM?cIHDXdhHPLGaeyl?zG-mbl0x`E%_Pgwp4ZPQHd@2(CH<9+_qzskcKdk7Ob7dowIzIo+xCqRQZi|%uyN66DiniHVRKo!-5 z>i`oz`wk`fQkD*h%+e`@P;!D6g_YzKsoAAZ_s};8`q6VAN!1lnV>#SqCwch^>d?^G z^+T)QZjBw&1t861m9_#CN}2}Nbw2nAP&hOfc!*xiL~#6$1)=dTXVW3#giD1ZaEvF@ z!WgNZ`y=>w%~NnlCy{j+@H+=wKwT|y;d|wECWKA5Jgk?)A4nR5iuhES$yC9o;vjH* zrpF|qzj)G6JE2Q$pj<-=T6zkKgn&!v7(3U)xYZc`JfOvG>p#zR*$MoxPJaB7=&}@2 z;<7ijWSCe#keyhZ(nYqcoUY%B@W<&uArKVq_FcE|W5~#UzeJ_e7ByLedova?2)6 z7wR#FHkVY=MN+nXo$O4f-Fcq#&%B@c{oeOI@0>aB?>Y1R`l=~y4Z|&a7=W*5(vkWJ zPJeD<(C=5~`rVCJik>&X8ljp8-3;_*HdZ)FI4?DGD_l36b1+xv>9Vw#RVHcBB`1-C z_U?Z4bg{rKy_Xvx=%BOe2dEukPxuQC?htKsE8g4jylXV5Yp+}8`+IdQYipfMZkPu} zUF}u;0G-a%h%|J*$Fq89WnY!7{}Qoq?Few)n6Qkk>0I1B9G9 zE0Lmt8>xu+iWYt}WU@VR)xE1i7NH~BWYa>;)#i3P5^m*yn%S}D)bSWT*g|9$R#28D z-8B{JwJMMpu8xLhqn&TJH+;IxBSs{gCsybgrK)JO<=_TGkZccF`;A7v-%|RnEtWr@ z=*i=p;hcE*PC0iuRbcR?C}@(AH#T_lWKH{#DJQ=TpGO`ojB*J-MH_zO>fslYKIyed zB+Bqf+y%ep<|GMeo6DZey?cMfSA&PCk=-hbU`{BoHR`OPaJk#EMq|>^! zwBq_;h2Xf*Y5k4N=)PiGm6mG;O#@GLPt{vJ@NDf-r`>i4RB8+%XiFGbY$JliPDR}0 z@Tu9^lR1%`ODPEnXiYSvopj@zIl(+%Q4}8ER$9pvaF=qct5s<=fnD7fJ{=;FTBnwj zuNorsH@%`v@|DwCosN^gl>1hS@6fBozbY9<&yTLTAaJC1i^AiZB;{-NkQo-CCir#| zQ;RW`6hjkMiu^Lvy&BS#U#I5dH*4;*uAPW2c>bKzgYfX>lc)ekcOg(Dj};;M}|3&4}WuPz5x+hi8?HYClyQ8BV=9 zl;oAPh%+Yg;$I(UJGsea&{WgC*L_8x-P`6+SmUFO{@YD8Q~C8P4nOf0hQcYk0)}0T zYYzXRrE8s*(&xW&`8$W}?ee;n?!7Fc{aHNMIBd*PH=2G%4;zXJ{t4;Z+LXpnJKZ9?)#WhQ@vNl>IhZ?sk$w(_!4g~#`Xsv zZDZsv^BOq=ZBfqDeOs8dCqwM6QR5=+WI31xZkR(3i&YN}i_Q9*C+~r4M)s?EY@$bU zyA9eJR^#nzIk)lUZ_0ROBL+>ckBOO`Tjjg%bj~IpddaYSz2pWdW_D|WwsCxvw)otr zoFG5!^5JIIw&!AsTB0zo?l+>ZPU>VeD<5v;j4dGQ{GHEL@wt>c+EAGvY8~8rHswzj z;Zwr`)rSVB%SD#QMB(~uHNMI9&W}^#9g0lFaiw2I4{G^{8N+4)&foWIK zKm+a5Qb6i8@YBIynNK+cSz}-kZU#0&!S9`1*I>X%9ck1v1(vYXhZCg7Mr_cNf&_g7 zG^)(Q5Q4B#lb1+gF)&XDeU+a!&qJyUwdC#_e%Ce^`C3SUrCw=ZQm})TEXBY!6dalv zb>{+8-3DgL95Ws-Bk2bkj2EGqr~Q;NinQc{sc2I>jfTdM`H}p1CfrSDV$21mO9WWv zFYqJCv_wXV=yOm}e8fzElY6%cyrGZm6p&!468L{kWRVpj5V*oJA!-PsW5%Fi0{}c? zDx||QO=AdJi-FYX2w&&}%j9$+$OHp8+99=tnQPCe%^9O>67?8Sg1|-8WsTc^NVxSkEDD>5LE>c}W zg=PPH04hQlknBAJqF*9d_FxnQ>0`hGHUJkR0~}R!Ak&ZU>;&s%5FFUlf5igO5th|2 zAxIAssXPtO|aS!8@$ma;0$k1HjekAj1x#;|N72SK1tBfU^S zkb2rQr1^hE8)U3hAO81-*BxAiu%ppH(D2_jgvPM!QUyUvF)4Or&485o>OVn{_UY;L F{{RkpxF!Gq diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da..c61a118 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6..adff685 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -173,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -206,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a21..c4bdd3a 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/lombok.config b/lombok.config index 1a22292..14fae36 100644 --- a/lombok.config +++ b/lombok.config @@ -1,3 +1,16 @@ -# This file is generated by the 'io.freefair.lombok' Gradle plugin +# this is the highest directory lombok should search for config files config.stopBubbling = true -lombok.addJavaxGeneratedAnnotation = true + +# use jetbrains nullability annotations +lombok.addNullAnnotations = jetbrains + +# add annotations that @Getter and @Setter should copy from the field +lombok.copyableAnnotations += dev.latvian.mods.rhino.util.HideFromJS +# all the api status annotations +lombok.copyableAnnotations += org.jetbrains.annotations.ApiStatus.Experimental +lombok.copyableAnnotations += org.jetbrains.annotations.ApiStatus.Internal +lombok.copyableAnnotations += org.jetbrains.annotations.ApiStatus.Obsolete +lombok.copyableAnnotations += org.jetbrains.annotations.ApiStatus.ScheduledForRemoval +lombok.copyableAnnotations += org.jetbrains.annotations.ApiStatus.AvailableSince +lombok.copyableAnnotations += org.jetbrains.annotations.ApiStatus.NonExtendable +lombok.copyableAnnotations += org.jetbrains.annotations.ApiStatus.OverrideOnly diff --git a/settings.gradle b/settings.gradle index c237d27..5c1624c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,12 @@ pluginManagement { repositories { + mavenLocal() gradlePluginPortal() maven { url = 'https://maven.neoforged.net/releases' } + maven { url = "https://maven.quiltmc.org/repository/release" } + } + plugins { + id 'org.jetbrains.kotlin.jvm' version '2.3.20' } } @@ -9,4 +14,15 @@ plugins { id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' } -rootProject.name = 'Registrate' \ No newline at end of file +dependencyResolutionManagement { + repositories { + mavenCentral() + } + versionCatalogs { + forge { + from(files("gradle/forge.versions.toml")) + } + } +} + +rootProject.name = "${mod_id}" diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..a35c327 --- /dev/null +++ b/shell.nix @@ -0,0 +1,20 @@ +with import {}; +let + libs = [ + pkgs.glfw + pkgs.libGL + pkgs.libpulseaudio + ]; + + existingLDPath = builtins.getEnv "LD_LIBRARY_PATH"; + + LDPath = if builtins.stringLength existingLDPath == 0 then + "${lib.makeLibraryPath libs}" + else + "${lib.makeLibraryPath libs}:${existingLDPath}" + ; +in + mkShell { + buildInputs = libs; + LD_LIBRARY_PATH = LDPath; + } diff --git a/src/main/java/com/tterrag/registrate/AbstractRegistrate.java b/src/main/java/com/modularmc/registrate/AbstractRegistrate.java similarity index 71% rename from src/main/java/com/tterrag/registrate/AbstractRegistrate.java rename to src/main/java/com/modularmc/registrate/AbstractRegistrate.java index 032870f..aa9b883 100644 --- a/src/main/java/com/tterrag/registrate/AbstractRegistrate.java +++ b/src/main/java/com/modularmc/registrate/AbstractRegistrate.java @@ -1,27 +1,35 @@ -package com.tterrag.registrate; +package com.modularmc.registrate; + +import com.modularmc.registrate.builders.BlockBuilder; +import com.modularmc.registrate.builders.BlockEntityBuilder; +import com.modularmc.registrate.builders.BlockEntityBuilder.BlockEntityFactory; +import com.modularmc.registrate.builders.Builder; +import com.modularmc.registrate.builders.BuilderCallback; +import com.modularmc.registrate.builders.EntityBuilder; +import com.modularmc.registrate.builders.FluidBuilder; +import com.modularmc.registrate.builders.ItemBuilder; +import com.modularmc.registrate.builders.MenuBuilder; +import com.modularmc.registrate.builders.MenuBuilder.ForgeMenuFactory; +import com.modularmc.registrate.builders.MenuBuilder.MenuFactory; +import com.modularmc.registrate.builders.MenuBuilder.ScreenFactory; +import com.modularmc.registrate.builders.NoConfigBuilder; +import com.modularmc.registrate.providers.DataProviderInitializer; +import com.modularmc.registrate.providers.GeneratorType; +import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.RegistrateDataProvider; +import com.modularmc.registrate.providers.RegistrateLangProvider; +import com.modularmc.registrate.util.CreativeModeTabModifier; +import com.modularmc.registrate.util.DebugMarkers; +import com.modularmc.registrate.util.OneTimeEventReceiver; +import com.modularmc.registrate.util.entry.ItemEntry; +import com.modularmc.registrate.util.entry.RegistryEntry; +import com.modularmc.registrate.util.nullness.NonNullBiFunction; +import com.modularmc.registrate.util.nullness.NonNullConsumer; +import com.modularmc.registrate.util.nullness.NonNullFunction; +import com.modularmc.registrate.util.nullness.NonNullSupplier; +import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; +import com.modularmc.registrate.util.nullness.NonnullType; -import com.google.common.base.Preconditions; -import com.google.common.collect.*; -import com.mojang.serialization.Codec; -import com.tterrag.registrate.builders.*; -import com.tterrag.registrate.builders.BlockEntityBuilder.BlockEntityFactory; -import com.tterrag.registrate.builders.MenuBuilder.ForgeMenuFactory; -import com.tterrag.registrate.builders.MenuBuilder.MenuFactory; -import com.tterrag.registrate.builders.MenuBuilder.ScreenFactory; -import com.tterrag.registrate.providers.*; -import com.tterrag.registrate.util.CreativeModeTabModifier; -import com.tterrag.registrate.util.DebugMarkers; -import com.tterrag.registrate.util.OneTimeEventReceiver; -import com.tterrag.registrate.util.entry.ItemEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; -import com.tterrag.registrate.util.nullness.*; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; -import lombok.Value; -import lombok.experimental.Accessors; -import lombok.extern.log4j.Log4j2; -import net.minecraft.Util; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.MenuAccess; import net.minecraft.client.multiplayer.ClientPacketListener; @@ -29,8 +37,9 @@ import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Util; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType.EntityFactory; import net.minecraft.world.entity.MobCategory; @@ -49,12 +58,20 @@ import net.neoforged.neoforge.fluids.BaseFlowingFluid; import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.registries.*; + +import com.google.common.base.Preconditions; +import com.google.common.collect.*; +import com.mojang.serialization.Codec; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; +import lombok.Value; +import lombok.experimental.Accessors; +import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.message.Message; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.util.*; import java.util.Map.Entry; import java.util.function.Consumer; @@ -62,18 +79,24 @@ import java.util.function.UnaryOperator; import java.util.stream.Collectors; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + /** * Manages all registrations and data generators for a mod. *

- * Generally not thread-safe, as it holds the current name of the object being built statefully, and uses non-concurrent collections. + * Generally not thread-safe, as it holds the current name of the object being built statefully, and uses + * non-concurrent collections. *

- * Begin a new object via {@link #object(String)}. This name will be used for all future entries until the next invocation of {@link #object(String)}. Alternatively, the methods that accept a name + * Begin a new object via {@link #object(String)}. This name will be used for all future entries until the next + * invocation of {@link #object(String)}. Alternatively, the methods that accept a name * parameter (such as {@link #block(String, NonNullFunction)}) can be used. These do not affect the current name state. *

* A simple use may look like: * *

  * {@code
+ *
  * public static final Registrate REGISTRATE = Registrate.create("mymod");
  *
  * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
@@ -90,7 +113,8 @@ public abstract class AbstractRegistrate> {
 
     @Value
     private class Registration {
-        ResourceLocation name;
+
+        Identifier name;
         ResourceKey> type;
         NonNullSupplier creator;
         RegistryEntry delegate;
@@ -98,10 +122,10 @@ private class Registration {
         @Getter(value = AccessLevel.NONE)
         List> callbacks = new ArrayList<>();
 
-        Registration(ResourceLocation name, ResourceKey> type, NonNullSupplier creator, NonNullFunction, ? extends RegistryEntry> entryFactory) {
+        Registration(Identifier name, ResourceKey> type, NonNullSupplier creator, NonNullFunction, ? extends RegistryEntry> entryFactory) {
             this.name = name;
             this.type = type;
-            this.creator =  creator.lazy();
+            this.creator = creator.lazy();
             this.delegate = entryFactory.apply(DeferredHolder.create(type, name));
         }
 
@@ -128,7 +152,10 @@ public static boolean isDevEnvironment() {
     }
 
     private final Table>, String, Registration> registrations = HashBasedTable.create();
-    /** Expected to be emptied by the time registration occurs, is emptied by {@link #accept(String, ResourceKey, Builder, NonNullSupplier, NonNullFunction)} */
+    /**
+     * Expected to be emptied by the time registration occurs, is emptied by
+     * {@link #accept(String, ResourceKey, Builder, NonNullSupplier, NonNullFunction)}
+     */
     private final Multimap>>, NonNullConsumer> registerCallbacks = HashMultimap.create();
     /** Entry-less callbacks that are invoked after the registry type has completely finished */
     private final Multimap>, Runnable> afterRegisterCallbacks = HashMultimap.create();
@@ -150,9 +177,11 @@ public static boolean isDevEnvironment() {
     private final String modid;
 
     /**
-     * Get the mod event bus that event listeners will be registered to. Useful when Registrate is used in mods that use alternative language loaders, such as forgelin.
+     * Get the mod event bus that event listeners will be registered to. Useful when Registrate is used in mods that use
+     * alternative language loaders, such as forgelin.
      */
-    @Getter @Setter
+    @Getter
+    @Setter
     @Nullable
     private IEventBus modEventBus;
 
@@ -164,7 +193,7 @@ public static boolean isDevEnvironment() {
      * Construct a new Registrate for the given mod ID.
      *
      * @param modid
-     *            The mod ID for which objects will be registered
+     *              The mod ID for which objects will be registered
      */
     protected AbstractRegistrate(String modid) {
         this.modid = modid;
@@ -181,7 +210,8 @@ protected final S self() {
     }
 
     /**
-     * Called during {@link Registrate#create(String) creation} to initialize event listeners. Custom implementations may add their own event listeners by overriding this.
+     * Called during {@link Registrate#create(String) creation} to initialize event listeners. Custom implementations
+     * may add their own event listeners by overriding this.
      * 

* Always call {@code super} in your override unless you know what you are doing! * @@ -198,8 +228,9 @@ public S registerEventListeners(IEventBus bus) { Consumer onRegisterLate = this::onRegisterLate; bus.addListener(onRegister); bus.addListener(EventPriority.LOWEST, onRegisterLate); - bus.addListener(this::onBuildCreativeModeTabContents); // Fired multiple times when ever tabs need contents rebuilt (changing op tab perms for example) - + bus.addListener(this::onBuildCreativeModeTabContents); // Fired multiple times when ever tabs need contents + // rebuilt (changing op tab perms for example) + // Register events fire multiple times, so clean them up on common setup OneTimeEventReceiver.addModListener(this, FMLCommonSetupEvent.class, $ -> { OneTimeEventReceiver.unregister(this, onRegister, RegisterEvent.class); @@ -214,11 +245,13 @@ public S registerEventListeners(IEventBus bus) { } /** - * Called once per registry to gather collected registrations and add entries to the registry. May be overriden in custom implementations to perform additional actions upon entry registration, but + * Called once per registry to gather collected registrations and add entries to the registry. May be overriden in + * custom implementations to perform additional actions upon entry registration, but * must call {@code super}. - * + * * @param event - * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the registry type + * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the + * registry type */ protected void onRegister(RegisterEvent event) { ResourceKey> type = event.getRegistryKey(); @@ -253,11 +286,14 @@ protected void onRegister(RegisterEvent event) { } /** - * Called once per registry at the {@link EventPriority#LOWEST lowest priority} to perform any actions that must happen after all other entries have been registered, including from other mods. May - * be overriden in custom implementations to perform additional actions upon entry registration, but must call {@code super}. - * + * Called once per registry at the {@link EventPriority#LOWEST lowest priority} to perform any actions that must + * happen after all other entries have been registered, including from other mods. May + * be overriden in custom implementations to perform additional actions upon entry registration, but must + * call {@code super}. + * * @param event - * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the registry type + * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the + * registry type */ protected void onRegisterLate(RegisterEvent event) { ResourceKey> type = event.getRegistryKey(); @@ -268,16 +304,17 @@ protected void onRegisterLate(RegisterEvent event) { } /** - * Called when a {@link CreativeModeTab} is being populated to fill in any entries that belong there. Can be overriden in custom implementations. - * + * Called when a {@link CreativeModeTab} is being populated to fill in any entries that belong there. Can be + * overriden in custom implementations. + * * @param event - * The event + * The event */ protected void onBuildCreativeModeTabContents(BuildCreativeModeTabContentsEvent event) { var modifier = new CreativeModeTabModifier(event::getFlags, event::hasPermissions, event::accept, event::getParameters); creativeModeTabModifiers.forEach((key, value) -> { - if(event.getTabKey().equals(key)) value.accept(modifier); + if (event.getTabKey().equals(key)) value.accept(modifier); }); } @@ -286,9 +323,9 @@ protected void onBuildCreativeModeTabContents(BuildCreativeModeTabContentsEvent /** * Called when datagen begins to add our provider to the generator. Can be overriden in custom implementations. - * + * * @param event - * The event + * The event */ protected void onData(GatherDataEvent event) { event.getGenerator().addProvider(true, provider = new RegistrateDataProvider(this, modid, event)); @@ -299,7 +336,7 @@ protected void onData(GatherDataEvent event) { * * @return The current entry name * @throws NullPointerException - * if {@link #currentName} is null + * if {@link #currentName} is null */ protected String currentName() { String name = currentName; @@ -308,38 +345,41 @@ protected String currentName() { } /** - * Allows retrieval of a previously created entry, of the current name (from the last invocation of {@link #object(String)}. Useful to retrieve a different entry than the final state of your + * Allows retrieval of a previously created entry, of the current name (from the last invocation of + * {@link #object(String)}. Useful to retrieve a different entry than the final state of your * chain may produce, e.g. * *

      * {@code
+     *
      * public static final RegistryObject MY_BLOCK_ITEM = REGISTRATE.object("my_block")
      *         .block(MyBlock::new)
-     *             .defaultItem()
-     *             .lang("My Special Block")
-     *             .build()
+     *         .defaultItem()
+     *         .lang("My Special Block")
+     *         .build()
      *         .get(Item.class);
      * }
      * 
* * @param - * The type of the registry for which to retrieve the entry + * The type of the registry for which to retrieve the entry * @param - * The type of the entry to return + * The type of the entry to return * @param type - * A {@link ResourceKey} for the registry + * A {@link ResourceKey} for the registry * @return A {@link RegistryEntry} which will supply the requested entry, if it exists * @throws IllegalArgumentException - * if no such registration has been done + * if no such registration has been done * @throws NullPointerException - * if current name has not been set via {@link #object(String)} + * if current name has not been set via {@link #object(String)} */ public RegistryEntry get(ResourceKey> type) { return this.get(currentName(), type); } /** - * Allows retrieval of a previously created entry. Useful to retrieve arbitrary entries that may have been created as side-effects of earlier registrations. + * Allows retrieval of a previously created entry. Useful to retrieve arbitrary entries that may have been created + * as side-effects of earlier registrations. * *
      * {@code
@@ -355,32 +395,33 @@ public  RegistryEntry get(ResourceKey
      *
      * @param 
-     *            The type of the registry for which to retrieve the entry
+     *             The type of the registry for which to retrieve the entry
      * @param 
-     *            The type of the entry to return
+     *             The type of the entry to return
      * @param name
-     *            The name of the registry entry to request
+     *             The name of the registry entry to request
      * @param type
-     *            A {@link ResourceKey} for the registry
+     *             A {@link ResourceKey} for the registry
      * @return A {@link RegistryEntry} which will supply the requested entry, if it exists
      * @throws IllegalArgumentException
-     *             if no such registration has been done
+     *                                  if no such registration has been done
      */
     public  RegistryEntry get(String name, ResourceKey> type) {
         return this.getRegistration(name, type).getDelegate();
     }
 
     /**
-     * Allows retrieval of a previously created entry that may or may not exist. Possibly useful in some very specific scenarios, internally used during fluid registration.
+     * Allows retrieval of a previously created entry that may or may not exist. Possibly useful in some very specific
+     * scenarios, internally used during fluid registration.
      *
      * @param 
-     *            The type of the registry for which to retrieve the entry
+     *             The type of the registry for which to retrieve the entry
      * @param 
-     *            The type of the entry to return
+     *             The type of the entry to return
      * @param name
-     *            The name of the registry entry to request
+     *             The name of the registry entry to request
      * @param type
-     *            A class representing the registry type
+     *             A class representing the registry type
      * @return A {@link RegistryEntry} which will supply the requested entry, if it exists
      */
     public  Optional> getOptional(String name, ResourceKey> type) {
@@ -405,13 +446,15 @@ private  Registration getRegistration(String name, Resourc
     /**
      * Gather a collection of all entries registered for a certain registry
      * 

- * Note that this can be called before registration is complete, but the {@link RegistryEntry entries} will be empty at that time. - * + * Note that this can be called before registration is complete, but the {@link RegistryEntry entries} will be empty + * at that time. + * * @param - * Registry type + * Registry type * @param type - * A {@link ResourceKey} for the registry in question - * @return A collection of {@link RegistryEntry} objects representing all entries in the given registry which are known to this {@link AbstractRegistrate} object. + * A {@link ResourceKey} for the registry in question + * @return A collection of {@link RegistryEntry} objects representing all entries in the given registry which are + * known to this {@link AbstractRegistrate} object. */ @SuppressWarnings({ "null", "unchecked" }) public Collection> getAll(ResourceKey> type) { @@ -419,18 +462,20 @@ public Collection> getAll(ResourceKeyimmediately following registration, before further entries are registered. - * + * Add a callback to be invoked when a certain entry has been registered. This will be invoked immediately + * following registration, before further entries are registered. + * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param name - * The name of the entry to watch (implicitly within the {@link #getModid() modid} of this instance + * The name of the entry to watch (implicitly within the {@link #getModid() modid} of this + * instance * @param registryType - * A {@link ResourceKey} for the registry in question + * A {@link ResourceKey} for the registry in question * @param callback - * The callback to invoke, which will be passed the created entry object + * The callback to invoke, which will be passed the created entry object * @return This {@link AbstractRegistrate} instance */ public S addRegisterCallback(String name, ResourceKey> registryType, NonNullConsumer callback) { @@ -444,14 +489,15 @@ public S addRegisterCallback(String name, ResourceKey - * The registry type + * The registry type * @param registryType - * A {@link ResourceKey} for the registry in question + * A {@link ResourceKey} for the registry in question * @param callback - * The callback to invoke + * The callback to invoke * @return This {@link AbstractRegistrate} instance */ public S addRegisterCallback(ResourceKey> registryType, Runnable callback) { @@ -461,11 +507,11 @@ public S addRegisterCallback(ResourceKey> registryType /** * Check if a certain registry has completed registration. - * + * * @param - * The registry type + * The registry type * @param registryType - * A {@link ResourceKey} for the registry in question + * A {@link ResourceKey} for the registry in question * @return {@code true} iff the given registry has finished the registration step */ public boolean isRegistered(ResourceKey> registryType) { @@ -473,15 +519,17 @@ public boolean isRegistered(ResourceKey> registryType) } /** - * Get the data provider instance for a given {@link GeneratorType}. Only works within datagen context, not during registration or init. + * Get the data provider instance for a given {@link GeneratorType}. Only works within datagen context, not during + * registration or init. * * @param

- * The type of the provider + * The type of the provider * @param type - * A {@link GeneratorType} representing the desired provider - * @return An {@link Optional} holding the provider, or empty if this provider was not registered. This can happen if datagen is run only for client or server providers. + * A {@link GeneratorType} representing the desired provider + * @return An {@link Optional} holding the provider, or empty if this provider was not registered. This can happen + * if datagen is run only for client or server providers. * @throws IllegalStateException - * if datagen has not started yet + * if datagen has not started yet */ public

Optional

getDataProvider(GeneratorType

type) { RegistrateDataProvider provider = this.provider; @@ -492,18 +540,19 @@ public

Optional

getDataProvider(GeneratorType

type) { } /** - * Mostly internal, sets the data generator for a certain entry/type combination. This will replace an existing data gen callback if it exists. + * Mostly internal, sets the data generator for a certain entry/type combination. This will replace an existing data + * gen callback if it exists. * * @param

- * The type of provider + * The type of provider * @param - * The registry type + * The registry type * @param builder - * The builder for the entry + * The builder for the entry * @param type - * The {@link GeneratorType} to generate data for + * The {@link GeneratorType} to generate data for * @param cons - * A callback to be invoked during data generation + * A callback to be invoked during data generation * @return this {@link AbstractRegistrate} */ public S setDataGenerator(Builder builder, GeneratorType type, NonNullConsumer cons) { @@ -511,20 +560,21 @@ public S setDataGenerator(Builder builder, GeneratorType - * The type of provider + * The type of provider * @param - * The registry type + * The registry type * @param entry - * The name of the entry which the provider is for + * The name of the entry which the provider is for * @param registryType - * A {@link Class} representing the registry type of the entry + * A {@link Class} representing the registry type of the entry * @param type - * The {@link GeneratorType} to generate data for + * The {@link GeneratorType} to generate data for * @param cons - * A callback to be invoked during data generation + * A callback to be invoked during data generation * @return this {@link AbstractRegistrate} */ public S setDataGenerator(String entry, ResourceKey> registryType, GeneratorType type, NonNullConsumer cons) { @@ -538,16 +588,17 @@ public S setDataGenerator(String entry, ResourceKey } /** - * Add a data generator callback that is not associated with any entry, which can never replace an existing data generator. + * Add a data generator callback that is not associated with any entry, which can never replace an existing data + * generator. *

* This is useful to add data generator callbacks for miscellaneous data not strictly associated with an entry. * * @param - * The type of provider + * The type of provider * @param type - * The {@link GeneratorType} to generate data for + * The {@link GeneratorType} to generate data for * @param cons - * A callback to be invoked during data generation + * A callback to be invoked during data generation * @return this {@link AbstractRegistrate} */ public S addDataGenerator(GeneratorType type, NonNullConsumer cons) { @@ -578,34 +629,39 @@ public DataProviderInitializer getDataGenInitializer() { }); /** - * Add a custom translation mapping using the vanilla style of ResourceLocation -> translation key conversion. + * Add a custom translation mapping using the vanilla style of Identifier -> translation key conversion. * * @param type - * Type of the object, this is used as a prefix (e.g. {@code ["block", "mymod:myblock"] -> "block.mymod.myblock"}) + * Type of the object, this is used as a prefix (e.g. + * {@code ["block", "mymod:myblock"] -> "block.mymod.myblock"}) * @param id - * ID of the object, which will be converted to a lang key via {@link Util#makeDescriptionId(String, ResourceLocation)} + * ID of the object, which will be converted to a lang key via + * {@link Util#makeDescriptionId(String, Identifier)} * @param localizedName - * (English) translation value + * (English) translation value * @return A {@link MutableComponent} representing the translated text */ - public MutableComponent addLang(String type, ResourceLocation id, String localizedName) { + public MutableComponent addLang(String type, Identifier id, String localizedName) { return addRawLang(Util.makeDescriptionId(type, id), localizedName); } /** - * Add a custom translation mapping using the vanilla style of ResourceLocation -> translation key conversion. Also appends a suffix to the key. + * Add a custom translation mapping using the vanilla style of Identifier -> translation key conversion. Also + * appends a suffix to the key. * * @param type - * Type of the object, this is used as a prefix (e.g. {@code ["block", "mymod:myblock"] -> "block.mymod.myblock"}) + * Type of the object, this is used as a prefix (e.g. + * {@code ["block", "mymod:myblock"] -> "block.mymod.myblock"}) * @param id - * ID of the object, which will be converted to a lang key via {@link Util#makeDescriptionId(String, ResourceLocation)} + * ID of the object, which will be converted to a lang key via + * {@link Util#makeDescriptionId(String, Identifier)} * @param suffix - * A suffix which will be appended to the generated key (separated by a dot) + * A suffix which will be appended to the generated key (separated by a dot) * @param localizedName - * (English) translation value + * (English) translation value * @return A {@link MutableComponent} representing the translated text */ - public MutableComponent addLang(String type, ResourceLocation id, String suffix, String localizedName) { + public MutableComponent addLang(String type, Identifier id, String suffix, String localizedName) { return addRawLang(Util.makeDescriptionId(type, id) + "." + suffix, localizedName); } @@ -613,9 +669,9 @@ public MutableComponent addLang(String type, ResourceLocation id, String suffix, * Add a custom translation mapping directly to the lang provider. * * @param key - * The translation key + * The translation key * @param value - * The (English) translation value + * The (English) translation value * @return A {@link MutableComponent} representing the translated text */ public MutableComponent addRawLang(String key, String value) { @@ -639,11 +695,11 @@ private Optional>>> getEntryForGe * For internal use, calls upon registered data generators to actually create their data. * * @param - * The type of the provider + * The type of the provider * @param type - * The type of provider to run + * The type of provider to run * @param gen - * The provider + * The provider */ @SuppressWarnings("unchecked") public void genData(GeneratorType type, T gen) { @@ -685,10 +741,11 @@ public void genData(GeneratorType type, T gen) { /** * Enable skipping of registry entries and data generators that error during registration/generation. *

- * Should only be used for debugging! {@code skipErrors(true)} will do nothing outside of a dev environment. + * Should only be used for debugging! {@code skipErrors(true)} will do nothing outside of a dev + * environment. * * @param skipErrors - * {@code true} to skip errors during registration/generation + * {@code true} to skip errors during registration/generation * @return this {@link AbstractRegistrate} */ public S skipErrors(boolean skipErrors) { @@ -701,11 +758,12 @@ public S skipErrors(boolean skipErrors) { } /** - * Begin a new object, this is typically used at the beginning of a builder chain. The given name will be used until this method is called again. This makes it simple to create multiple entries + * Begin a new object, this is typically used at the beginning of a builder chain. The given name will be used until + * this method is called again. This makes it simple to create multiple entries * with the same name, as is often the case with blocks/items, items/entities, and blocks/TEs. * * @param name - * The name to use for future entries + * The name to use for future entries * @return this {@link AbstractRegistrate} */ public S object(String name) { @@ -716,10 +774,11 @@ public S object(String name) { /** * Set the default CreativeModeTab to be passed onto future builders. *

- * This special case method should be used if your creative tab instance was not created by Registrate, otherwise use {@link #defaultCreativeTab()}. - * + * This special case method should be used if your creative tab instance was not created by Registrate, otherwise + * use {@link #defaultCreativeTab()}. + * * @param creativeModeTab - * The new default CreativeModeTab type + * The new default CreativeModeTab type * @return This {@link AbstractRegistrate} instance */ public S defaultCreativeTab(ResourceKey creativeModeTab) { @@ -737,7 +796,7 @@ public S defaultCreativeTab(ResourceKey creativeModeTab) { * Calling this method multiple times will add additional callbacks. * * @param creativeModeTab The {@link CreativeModeTab} to register this callback for - * @param modifier The modifier callback to be registered + * @param modifier The modifier callback to be registered * @return This {@link AbstractRegistrate} instance */ public S modifyCreativeModeTab(ResourceKey creativeModeTab, Consumer modifier) { @@ -746,10 +805,12 @@ public S modifyCreativeModeTab(ResourceKey creativeModeTab, Con } /** - * Apply a transformation to this {@link AbstractRegistrate}. Useful to apply helper methods within a fluent chain, e.g. + * Apply a transformation to this {@link AbstractRegistrate}. Useful to apply helper methods within a fluent chain, + * e.g. * *

      * {@code
+     *
      * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
      *         .transform(Utils::createMyBlock)
      *         .get(Block.class);
@@ -757,7 +818,7 @@ public S modifyCreativeModeTab(ResourceKey creativeModeTab, Con
      * 
* * @param func - * The {@link UnaryOperator function} to apply + * The {@link UnaryOperator function} to apply * @return this {@link AbstractRegistrate} */ public S transform(NonNullUnaryOperator func) { @@ -765,11 +826,13 @@ public S transform(NonNullUnaryOperator func) { } /** - * Apply a transformation to this {@link AbstractRegistrate}. Similar to {@link #transform(NonNullUnaryOperator)}, but for actions that return a builder in-progress. Useful to apply helper methods + * Apply a transformation to this {@link AbstractRegistrate}. Similar to {@link #transform(NonNullUnaryOperator)}, + * but for actions that return a builder in-progress. Useful to apply helper methods * within a fluent chain, e.g. * *
      * {@code
+     *
      * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
      *         .transform(Utils::createMyBlock)
      *         .lang("My Block") // Can modify the builder afterwards
@@ -778,15 +841,15 @@ public S transform(NonNullUnaryOperator func) {
      * 
* * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param

- * Parent type + * Parent type * @param - * Self type + * Self type * @param func - * The {@link Function function} to apply + * The {@link Function function} to apply * @return the resultant {@link Builder} */ public > S2 transform(NonNullFunction func) { @@ -794,20 +857,22 @@ public > S2 transform(NonNull } /** - * Create a builder for a new entry. This is typically not needed, unless you are implementing a custom builder type. + * Create a builder for a new entry. This is typically not needed, unless you are implementing a + * custom builder type. *

- * Uses the currently set name (via {@link #object(String)}) as the name for the new entry, and passes it to the factory as the first parameter. + * Uses the currently set name (via {@link #object(String)}) as the name for the new entry, and passes it to the + * factory as the first parameter. * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param

- * Parent type + * Parent type * @param - * Self type + * Self type * @param factory - * The factory to create the builder + * The factory to create the builder * @return The {@link Builder} instance */ public > S2 entry(NonNullBiFunction factory) { @@ -815,20 +880,21 @@ public > S2 entry(NonNullBiFu } /** - * Create a builder for a new entry. This is typically not needed, unless you are implementing a custom builder type. + * Create a builder for a new entry. This is typically not needed, unless you are implementing a + * custom builder type. * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param

- * Parent type + * Parent type * @param - * Self type + * Self type * @param name - * The name to use for the entry + * The name to use for the entry * @param factory - * The factory to create the builder + * The factory to create the builder * @return The {@link Builder} instance */ public > S2 entry(String name, NonNullFunction factory) { @@ -838,30 +904,33 @@ public > S2 entry(String name /** * Factory method to accept a completed builder and add it to the registration queue. *

- * Satisfies the functional interface {@link BuilderCallback}, which is typically given to new builder instances when they are constructed. - * + * Satisfies the functional interface {@link BuilderCallback}, which is typically given to new builder instances + * when they are constructed. + * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param name - * Thename of the entry being created + * Thename of the entry being created * @param type - * The registry to add the entry to + * The registry to add the entry to * @param builder - * The builder instance that was used to create this entry. Not used by default implementation, but custom extensions may use it for some purpose + * The builder instance that was used to create this entry. Not used by default implementation, + * but custom extensions may use it for some purpose * @param creator - * Constructor for the new entry object + * Constructor for the new entry object * @param entryFactory - * Optional custom factory to create special {@link RegistryEntry} types + * Optional custom factory to create special {@link RegistryEntry} types * @return A {@link RegistryEntry} that will hold the created entry after registration is complete */ protected RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier creator, NonNullFunction, ? extends RegistryEntry> entryFactory) { - Registration reg = new Registration<>(ResourceLocation.fromNamespaceAndPath(modid, name), type, creator, entryFactory); + Registration reg = new Registration<>(Identifier.fromNamespaceAndPath(modid, name), type, creator, entryFactory); log.trace(DebugMarkers.REGISTER, "Captured registration for entry {}:{} of type {}", getModid(), name, type.location()); registerCallbacks.removeAll(Pair.of(name, type)).forEach(callback -> { @SuppressWarnings({ "unchecked", "null" }) - @Nonnull NonNullConsumer unsafeCallback = (NonNullConsumer) callback; + @Nonnull + NonNullConsumer unsafeCallback = (NonNullConsumer) callback; reg.addRegisterCallback(unsafeCallback); }); registrations.put(type, name, reg); @@ -869,23 +938,26 @@ protected RegistryEntry accept(String name, ResourceKey * Alternatively, a custom {@link Builder builder} can be created. *

- * This method will automatically subscribe to the {@link NewRegistryEvent} and create the registry at the proper time. Thus, the new registry will not exist immediately after this is called. - * + * This method will automatically subscribe to the {@link NewRegistryEvent} and create the registry at the proper + * time. Thus, the new registry will not exist immediately after this is called. + * * @param - * The type of object the new registry will contain + * The type of object the new registry will contain * @param name - * The ID of this registry + * The ID of this registry * @param builder - * A function to create the {@link RegistryBuilder} that defines the other properties/behaviors of the created registry + * A function to create the {@link RegistryBuilder} that defines the other properties/behaviors of + * the created registry * @return A {@link ResourceKey resource key} referencing the to-be-created registry. */ public ResourceKey> makeRegistry(String name, Function>, RegistryBuilder> builder) { - final ResourceKey> registryId = ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath(getModid(), name)); + final ResourceKey> registryId = ResourceKey.createRegistryKey(Identifier.fromNamespaceAndPath(getModid(), name)); OneTimeEventReceiver.addModListener(this, NewRegistryEvent.class, e -> e.register(builder.apply(registryId).create())); return registryId; } @@ -895,9 +967,10 @@ public ResourceKey> makeRegistry(String name, Function - * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the namespace of the registry key. + * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the + * namespace of the registry key. * - * @param name The ID of this registry + * @param name The ID of this registry * @param codec The codec to be used for loading data from datapacks on servers * @see #makeDatapackRegistry(String, Codec, Codec) */ @@ -909,21 +982,24 @@ public ResourceKey> makeDatapackRegistry(String name, Codec c * Registers the registry key as a datapack registry, which will cause data to be loaded from * a datapack folder based on the registry's name. *

- * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the namespace of the registry key. + * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the + * namespace of the registry key. * - * @param name The ID of this registry - * @param codec The codec to be used for loading data from datapacks on servers + * @param name The ID of this registry + * @param codec The codec to be used for loading data from datapacks on servers * @param networkCodec The codec to be used for syncing loaded data to clients. - * If {@code networkCodec} is null, data will not be synced, and clients are not required to have this - * datapack registry to join a server. - *

- * If {@code networkCodec} is not null, clients must have this datapack registry/mod - * when joining a server that has this datapack registry/mod. - * The data will be synced using the network codec and accessible via {@link ClientPacketListener#registryAccess()}. + * If {@code networkCodec} is null, data will not be synced, and clients are not required to + * have this + * datapack registry to join a server. + *

+ * If {@code networkCodec} is not null, clients must have this datapack registry/mod + * when joining a server that has this datapack registry/mod. + * The data will be synced using the network codec and accessible via + * {@link ClientPacketListener#registryAccess()}. * @see #makeDatapackRegistry(String, Codec) */ public ResourceKey> makeDatapackRegistry(String name, Codec codec, @Nullable Codec networkCodec) { - final ResourceKey> registryId = ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath(getModid(), name)); + final ResourceKey> registryId = ResourceKey.createRegistryKey(Identifier.fromNamespaceAndPath(getModid(), name)); OneTimeEventReceiver.addModListener(this, DataPackRegistryEvent.NewRegistry.class, event -> event.dataPackRegistry(registryId, codec, networkCodec)); return registryId; } @@ -1051,30 +1127,30 @@ public FluidBuilder fluid(NonNullSupplier fluid(ResourceLocation stillTexture, ResourceLocation flowingTexture) { + public FluidBuilder fluid(Identifier stillTexture, Identifier flowingTexture) { return fluid(self(), stillTexture, flowingTexture); } - public FluidBuilder fluid(ResourceLocation stillTexture, ResourceLocation flowingTexture, FluidBuilder.FluidTypeFactory typeFactory) { + public FluidBuilder fluid(Identifier stillTexture, Identifier flowingTexture, FluidBuilder.FluidTypeFactory typeFactory) { return fluid(self(), stillTexture, flowingTexture, typeFactory); } - public FluidBuilder fluid(ResourceLocation stillTexture, ResourceLocation flowingTexture, NonNullSupplier fluidType) { + public FluidBuilder fluid(Identifier stillTexture, Identifier flowingTexture, NonNullSupplier fluidType) { return fluid(self(), stillTexture, flowingTexture, fluidType); } - public FluidBuilder fluid(ResourceLocation stillTexture, ResourceLocation flowingTexture, + public FluidBuilder fluid(Identifier stillTexture, Identifier flowingTexture, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), stillTexture, flowingTexture, fluidFactory); } - public FluidBuilder fluid(ResourceLocation stillTexture, ResourceLocation flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + public FluidBuilder fluid(Identifier stillTexture, Identifier flowingTexture, + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), stillTexture, flowingTexture, typeFactory, fluidFactory); } - public FluidBuilder fluid(ResourceLocation stillTexture, ResourceLocation flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + public FluidBuilder fluid(Identifier stillTexture, Identifier flowingTexture, + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), stillTexture, flowingTexture, fluidType, fluidFactory); } @@ -1090,30 +1166,30 @@ public FluidBuilder fluid(String name, NonNullSuppl return fluid(self(), name, fluidType); } - public FluidBuilder fluid(String name, ResourceLocation stillTexture, ResourceLocation flowingTexture) { + public FluidBuilder fluid(String name, Identifier stillTexture, Identifier flowingTexture) { return fluid(self(), name, stillTexture, flowingTexture); } - public FluidBuilder fluid(String name, ResourceLocation stillTexture, ResourceLocation flowingTexture, FluidBuilder.FluidTypeFactory typeFactory) { + public FluidBuilder fluid(String name, Identifier stillTexture, Identifier flowingTexture, FluidBuilder.FluidTypeFactory typeFactory) { return fluid(self(), name, stillTexture, flowingTexture, typeFactory); } - public FluidBuilder fluid(String name, ResourceLocation stillTexture, ResourceLocation flowingTexture, NonNullSupplier fluidType) { + public FluidBuilder fluid(String name, Identifier stillTexture, Identifier flowingTexture, NonNullSupplier fluidType) { return fluid(self(), name, stillTexture, flowingTexture, fluidType); } - public FluidBuilder fluid(String name, ResourceLocation stillTexture, ResourceLocation flowingTexture, + public FluidBuilder fluid(String name, Identifier stillTexture, Identifier flowingTexture, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), name, stillTexture, flowingTexture, fluidFactory); } - public FluidBuilder fluid(String name, ResourceLocation stillTexture, ResourceLocation flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + public FluidBuilder fluid(String name, Identifier stillTexture, Identifier flowingTexture, + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), name, stillTexture, flowingTexture, typeFactory, fluidFactory); } - public FluidBuilder fluid(String name, ResourceLocation stillTexture, ResourceLocation flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + public FluidBuilder fluid(String name, Identifier stillTexture, Identifier flowingTexture, + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), name, stillTexture, flowingTexture, fluidType, fluidFactory); } @@ -1129,69 +1205,69 @@ public

FluidBuilder fluid(P parent, NonNullSupp return fluid(parent, currentName(), fluidType); } - public

FluidBuilder fluid(P parent, ResourceLocation stillTexture, ResourceLocation flowingTexture) { + public

FluidBuilder fluid(P parent, Identifier stillTexture, Identifier flowingTexture) { return fluid(parent, currentName(), stillTexture, flowingTexture); } - public

FluidBuilder fluid(P parent, ResourceLocation stillTexture, ResourceLocation flowingTexture, FluidBuilder.FluidTypeFactory typeFactory) { + public

FluidBuilder fluid(P parent, Identifier stillTexture, Identifier flowingTexture, FluidBuilder.FluidTypeFactory typeFactory) { return fluid(parent, currentName(), stillTexture, flowingTexture, typeFactory); } - public

FluidBuilder fluid(P parent, ResourceLocation stillTexture, ResourceLocation flowingTexture, NonNullSupplier fluidType) { + public

FluidBuilder fluid(P parent, Identifier stillTexture, Identifier flowingTexture, NonNullSupplier fluidType) { return fluid(parent, currentName(), stillTexture, flowingTexture, fluidType); } - public FluidBuilder fluid(P parent, ResourceLocation stillTexture, ResourceLocation flowingTexture, + public FluidBuilder fluid(P parent, Identifier stillTexture, Identifier flowingTexture, FluidBuilder.FluidFactory fluidFactory) { return fluid(parent, currentName(), stillTexture, flowingTexture, fluidFactory); } - public FluidBuilder fluid(P parent, ResourceLocation stillTexture, ResourceLocation flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + public FluidBuilder fluid(P parent, Identifier stillTexture, Identifier flowingTexture, + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { return fluid(parent, currentName(), stillTexture, flowingTexture, typeFactory, fluidFactory); } - public FluidBuilder fluid(P parent, ResourceLocation stillTexture, ResourceLocation flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + public FluidBuilder fluid(P parent, Identifier stillTexture, Identifier flowingTexture, + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { return fluid(parent, currentName(), stillTexture, flowingTexture, fluidType, fluidFactory); } public

FluidBuilder fluid(P parent, String name) { - return fluid(parent, name, ResourceLocation.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_still"), ResourceLocation.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_flow")); + return fluid(parent, name, Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_still"), Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_flow")); } public

FluidBuilder fluid(P parent, String name, FluidBuilder.FluidTypeFactory typeFactory) { - return fluid(parent, name, ResourceLocation.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_still"), ResourceLocation.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_flow"), typeFactory); + return fluid(parent, name, Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_still"), Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_flow"), typeFactory); } public

FluidBuilder fluid(P parent, String name, NonNullSupplier fluidType) { - return fluid(parent, name, ResourceLocation.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_still"), ResourceLocation.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_flow"), fluidType); + return fluid(parent, name, Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_still"), Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_flow"), fluidType); } - public

FluidBuilder fluid(P parent, String name, ResourceLocation stillTexture, ResourceLocation flowingTexture) { + public

FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture) { return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, FluidType::new)).clientExtension(stillTexture, flowingTexture); } - public

FluidBuilder fluid(P parent, String name, ResourceLocation stillTexture, ResourceLocation flowingTexture, FluidBuilder.FluidTypeFactory typeFactory) { + public

FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, FluidBuilder.FluidTypeFactory typeFactory) { return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, typeFactory)).clientExtension(stillTexture, flowingTexture); } - public

FluidBuilder fluid(P parent, String name, ResourceLocation stillTexture, ResourceLocation flowingTexture, NonNullSupplier fluidType) { + public

FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, NonNullSupplier fluidType) { return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, fluidType)).clientExtension(stillTexture, flowingTexture); } - public FluidBuilder fluid(P parent, String name, ResourceLocation stillTexture, ResourceLocation flowingTexture, + public FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, FluidBuilder.FluidFactory fluidFactory) { return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, fluidFactory)).clientExtension(stillTexture, flowingTexture); } - public FluidBuilder fluid(P parent, String name, ResourceLocation stillTexture, ResourceLocation flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + public FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, typeFactory, fluidFactory)).clientExtension(stillTexture, flowingTexture); } - public FluidBuilder fluid(P parent, String name, ResourceLocation stillTexture, ResourceLocation flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + public FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, fluidType, fluidFactory)).clientExtension(stillTexture, flowingTexture); } @@ -1260,7 +1336,7 @@ public

NoConfigBuilder defaultCreativeT } public

NoConfigBuilder defaultCreativeTab(P parent, String name, Consumer config) { - this.defaultCreativeModeTab = ResourceKey.create(Registries.CREATIVE_MODE_TAB, ResourceLocation.fromNamespaceAndPath(this.modid, name)); + this.defaultCreativeModeTab = ResourceKey.create(Registries.CREATIVE_MODE_TAB, Identifier.fromNamespaceAndPath(this.modid, name)); return this.generic(parent, name, Registries.CREATIVE_MODE_TAB, () -> { var builder = CreativeModeTab.builder() .icon(() -> getAll(Registries.ITEM).stream().findFirst().map(ItemEntry::cast).map(ItemEntry::asStack).orElse(new ItemStack(Items.AIR))) diff --git a/src/main/java/com/tterrag/registrate/Registrate.java b/src/main/java/com/modularmc/registrate/Registrate.java similarity index 75% rename from src/main/java/com/tterrag/registrate/Registrate.java rename to src/main/java/com/modularmc/registrate/Registrate.java index a2e7704..5cf0a30 100644 --- a/src/main/java/com/tterrag/registrate/Registrate.java +++ b/src/main/java/com/modularmc/registrate/Registrate.java @@ -1,20 +1,23 @@ -package com.tterrag.registrate; +package com.modularmc.registrate; -import lombok.extern.log4j.Log4j2; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; +import lombok.extern.log4j.Log4j2; + import java.util.Optional; @Log4j2 public class Registrate extends AbstractRegistrate { + /** - * Create a new {@link Registrate} and register event listeners for registration and data generation. Used in lieu of adding side-effects to constructor, so that alternate initialization + * Create a new {@link Registrate} and register event listeners for registration and data generation. Used in lieu + * of adding side-effects to constructor, so that alternate initialization * strategies can be done in subclasses. - * + * * @param modid - * The mod ID for which objects will be registered + * The mod ID for which objects will be registered * @return The {@link Registrate} instance */ public static Registrate create(String modid) { @@ -22,13 +25,12 @@ public static Registrate create(String modid) { Optional modEventBus = ModList.get().getModContainerById(modid) .map(ModContainer::getEventBus); - + modEventBus.ifPresentOrElse(ret::registerEventListeners, () -> { String message = "# [Registrate] Failed to register eventListeners for mod " + modid + ", This should be reported to this mod's dev #"; - - StringBuilder hashtags = new StringBuilder().append("#".repeat(message.length())); - + StringBuilder hashtags = new StringBuilder().repeat("#", message.length()); + log.fatal(hashtags.toString()); log.fatal(message); log.fatal(hashtags.toString()); diff --git a/src/main/java/com/tterrag/registrate/builders/AbstractBuilder.java b/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java similarity index 70% rename from src/main/java/com/tterrag/registrate/builders/AbstractBuilder.java rename to src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java index aa31699..ffc6003 100644 --- a/src/main/java/com/tterrag/registrate/builders/AbstractBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java @@ -1,29 +1,30 @@ -package com.tterrag.registrate.builders; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.providers.RegistrateLangProvider; -import com.tterrag.registrate.providers.RegistrateTagsProvider; -import com.tterrag.registrate.util.entry.LazyRegistryEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; -import com.tterrag.registrate.util.nullness.NonNullBiFunction; -import com.tterrag.registrate.util.nullness.NonNullFunction; -import com.tterrag.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.util.nullness.NonnullType; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +package com.modularmc.registrate.builders; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.RegistrateLangProvider; +import com.modularmc.registrate.providers.RegistrateTagsProvider; +import com.modularmc.registrate.util.entry.LazyRegistryEntry; +import com.modularmc.registrate.util.entry.RegistryEntry; +import com.modularmc.registrate.util.nullness.NonNullBiFunction; +import com.modularmc.registrate.util.nullness.NonNullFunction; +import com.modularmc.registrate.util.nullness.NonNullSupplier; +import com.modularmc.registrate.util.nullness.NonnullType; import net.minecraft.core.Registry; import net.minecraft.data.tags.TagsProvider; +import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagEntry; import net.minecraft.tags.TagKey; import net.neoforged.neoforge.registries.DeferredHolder; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + import java.util.Arrays; /** @@ -32,7 +33,8 @@ * Provides the most basic functionality, and some utility methods that remove the need to pass the registry class. * * @param - * Type of the registry for the current object. This is the concrete base class that all registry entries must extend, and the type used for the forge registry itself. + * Type of the registry for the current object. This is the concrete base class that all registry entries + * must extend, and the type used for the forge registry itself. * @param * Actual type of the object being built. * @param

@@ -44,15 +46,15 @@ @RequiredArgsConstructor public abstract class AbstractBuilder> implements Builder { - @Getter(onMethod_ = {@Override}) + @Getter(onMethod_ = { @Override }) private final AbstractRegistrate owner; - @Getter(onMethod_ = {@Override}) + @Getter(onMethod_ = { @Override }) private final P parent; - @Getter(onMethod_ = {@Override}) + @Getter(onMethod_ = { @Override }) private final String name; @Getter(AccessLevel.PROTECTED) private final BuilderCallback callback; - @Getter(onMethod_ = {@Override}) + @Getter(onMethod_ = { @Override }) private final ResourceKey> registryKey; private final Multimap>, TagKey> tagsByType = HashMultimap.create(); @@ -64,7 +66,8 @@ public abstract class AbstractBuilder asSupplier() { * Tag this entry with a tag (or tags) of the correct type. Multiple calls will add additional tags. * * @param type - * The provider type (which must be a tag provider) + * The provider type (which must be a tag provider) * @param tags - * The tags to add + * The tags to add * @return this {@link Builder} */ @SuppressWarnings("unchecked") @@ -109,26 +112,27 @@ public final & RegistrateTagsProvider> S tag(Prov /** * Mark this entry as optional when generating tags - * */ + */ @SuppressWarnings("unchecked") - public S asOptional(){ + public S asOptional() { isOptional = true; return (S) this; } protected TagEntry asTag() { - ResourceLocation id = ResourceLocation.fromNamespaceAndPath(getOwner().getModid(), getName()); + Identifier id = Identifier.fromNamespaceAndPath(getOwner().getModid(), getName()); if (isOptional) return TagEntry.optionalElement(id); return TagEntry.element(id); } /** - * Remove a tag (or tags) from this entry of a given type. Useful to remove default tags on fluids, for example. Multiple calls will remove additional tags. + * Remove a tag (or tags) from this entry of a given type. Useful to remove default tags on fluids, for example. + * Multiple calls will remove additional tags. * * @param type - * The provider type (which must be a tag provider) + * The provider type (which must be a tag provider) * @param tags - * The tags to remove + * The tags to remove * @return this {@link Builder} */ @SuppressWarnings("unchecked") @@ -143,11 +147,13 @@ public final & RegistrateTagsProvider> S removeTa } /** - * Set the lang key for this entry to the default value (specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, ResourceKey)}). Generally, specific helpers from concrete + * Set the lang key for this entry to the default value (specified by + * {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, ResourceKey)}). Generally, specific helpers from + * concrete * builders should be used instead. * * @param langKeyProvider - * A function to get the translation key from the entry + * A function to get the translation key from the entry * @return this {@link Builder} */ public S lang(NonNullFunction langKeyProvider) { @@ -155,12 +161,13 @@ public S lang(NonNullFunction langKeyProvider) { } /** - * Set the lang key for this entry to the specified name. Generally, specific helpers from concrete builders should be used instead. + * Set the lang key for this entry to the specified name. Generally, specific helpers from concrete builders should + * be used instead. * * @param langKeyProvider - * A function to get the translation key from the entry + * A function to get the translation key from the entry * @param name - * The name to use + * The name to use * @return this {@link Builder} */ public S lang(NonNullFunction langKeyProvider, String name) { @@ -171,8 +178,7 @@ private S lang(NonNullFunction langKeyProvider, NonNullBiFunction prov.add(langKeyProvider.apply(ctx.getEntry()), localizedNameProvider.apply(prov, ctx::getEntry))); } - public ResourceKey getResourceKey(){ - return ResourceKey.create(getRegistryKey(), ResourceLocation.fromNamespaceAndPath(getOwner().getModid(), getName())); + public ResourceKey getResourceKey() { + return ResourceKey.create(getRegistryKey(), Identifier.fromNamespaceAndPath(getOwner().getModid(), getName())); } - } diff --git a/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java b/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java new file mode 100644 index 0000000..ecc45c6 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java @@ -0,0 +1,473 @@ +// package com.tterrag.registrate.builders; +// +// import java.util.Arrays; +// import java.util.EnumSet; +// +// import javax.annotation.Nonnull; +// +// import com.google.common.collect.HashMultimap; +// import com.google.common.collect.Multimap; +// import com.tterrag.registrate.AbstractRegistrate; +// import com.tterrag.registrate.providers.RegistrateLangProvider; +// import com.tterrag.registrate.util.nullness.NonNullConsumer; +// import com.tterrag.registrate.util.nullness.NonNullFunction; +// import com.tterrag.registrate.util.nullness.NonNullSupplier; +// import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; +// import com.tterrag.registrate.util.nullness.NonnullType; +// +// import net.minecraft.entity.EntityClassification; +// import net.minecraft.entity.EntityType; +// import net.minecraft.world.biome.Biome; +// import net.minecraft.world.biome.Biome.SpawnListEntry; +// import net.minecraft.world.gen.GenerationStage.Carving; +// import net.minecraft.world.gen.GenerationStage.Decoration; +// import net.minecraft.world.gen.carver.ConfiguredCarver; +// import net.minecraft.world.gen.carver.EmptyCarverConfig; +// import net.minecraft.world.gen.carver.ICarverConfig; +// import net.minecraft.world.gen.carver.WorldCarver; +// import net.minecraft.world.gen.feature.ConfiguredFeature; +// import net.minecraft.world.gen.feature.Feature; +// import net.minecraft.world.gen.feature.IFeatureConfig; +// import net.minecraft.world.gen.feature.NoFeatureConfig; +// import net.minecraft.world.gen.placement.IPlacementConfig; +// import net.minecraft.world.gen.placement.NoPlacementConfig; +// import net.minecraft.world.gen.placement.Placement; +// import net.minecraftforge.common.BiomeDictionary; +// import net.minecraftforge.common.BiomeManager; +// +/// ** +// * A builder for biomes, allows for customization of the {@link Biome.Builder biome properties}, and configuration of +// data associated with biomes (lang). +// * +// * @param +// * The type of biome being built +// * @param

+// * Parent object type +// */ +// public class BiomeBuilder extends AbstractBuilder> { +// +// /** +// * Create a new {@link BiomeBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that +// alternate initialization strategies can be done in subclasses. +// *

+// * The biome will be assigned the following data: +// *

    +// *
  • The default translation (via {@link #defaultLang()})
  • +// *
+// * +// * @param +// * The type of the builder +// * @param

+// * Parent object type +// * @param owner +// * The owning {@link AbstractRegistrate} object +// * @param parent +// * The parent object +// * @param name +// * Name of the entry being built +// * @param callback +// * A callback used to actually register the built entry +// * @param factory +// * Factory to create the biome +// * @return A new {@link BiomeBuilder} with reasonable default data generators. +// */ +// public static BiomeBuilder create(AbstractRegistrate owner, P parent, String name, +// BuilderCallback callback, NonNullFunction factory) { +// return new BiomeBuilder<>(owner, parent, name, callback, factory) +// .defaultLang(); +// } +// +// private final NonNullFunction factory; +// +// private NonNullSupplier initialProperties = Biome.Builder::new; +// private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); +// +// private final Multimap>> features = HashMultimap.create(); +// private final Multimap>> carvers = HashMultimap.create(); +// private final Multimap> spawns = HashMultimap.create(); +// +// @SuppressWarnings("null") +// private final EnumSet configuredTypes = EnumSet.noneOf(BiomeManager.BiomeType.class); +// +// protected BiomeBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, +// NonNullFunction factory) { +// super(owner, parent, name, callback, Biome.class); +// this.factory = factory; +// } +// +// /** +// * Modify the properties of the biome. Modifications are done lazily, but the passed function is composed with the +// current one, and as such this method can be called multiple times to perform +// * different operations. +// *

+// * If a different properties instance is returned, it will replace the existing one entirely. +// * +// * @param func +// * The action to perform on the properties +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder properties(NonNullUnaryOperator func) { +// propertiesCallback = propertiesCallback.andThen(func); +// return this; +// } +// +// /** +// * Replace the initial state of the biome properties, without replacing or removing any modifications done via {@link +// #properties(NonNullUnaryOperator)}. +// * +// * @param properties +// * A supplier to to create the initial properties +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder initialProperties(NonNullSupplier properties) { +// initialProperties = properties; +// return this; +// } +// +// /** +// * Set the weight for this biome to generate in the overworld in regions matching the given type. This can only be +// called once per type. +// * +// * @param type +// * The type that controls which climates the biome will spawn in +// * @param weight +// * The weight, or how common this biome should be in that climate +// * @return this {@link BiomeBuilder} +// * @see BiomeManager +// * @throws IllegalArgumentException +// * if this type has already had its weight set +// */ +// public BiomeBuilder typeWeight(BiomeManager.BiomeType type, int weight) { +// if (!configuredTypes.add(type)) { +// throw new IllegalArgumentException("Cannot set a type weight more than once."); +// } +// this.onRegister(b -> BiomeManager.addBiome(type, new BiomeManager.BiomeEntry(b, weight))); +// return this; +// } +// +// /** +// * Add types to the {@link BiomeDictionary} for this biome. Can be called multiple times to add more types. +// * +// * @param types +// * The types to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addDictionaryTypes(BiomeDictionary.Type... types) { +// this.onRegister(b -> BiomeDictionary.addTypes(b, types)); +// return this; +// } +// +// /** +// * Manually add what would have been the "best guess" types from the {@link BiomeDictionary} for this biome. This has +// no effect if no types are added via +// * {@link #addDictionaryTypes(net.minecraftforge.common.BiomeDictionary.Type...)}. +// * +// * @return this {@link BiomeBuilder} +// * @see BiomeDictionary#makeBestGuess(Biome) +// */ +// public BiomeBuilder forceAutomaticDictionaryTypes() { +// this.onRegister(BiomeDictionary::makeBestGuess); +// return this; +// } +// +// /** +// * Copy all {@link Feature features} from another biome. Does not check for duplicates. +// * +// * @param biome +// * The biome to copy features from +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder copyFeatures(NonNullSupplier biome) { +// addFeatures(b -> Arrays.stream(Decoration.values()) +// .forEach(d -> biome.get().getFeatures(d).stream() +// .forEach(f -> b.addFeature(d, f)))); +// return this; +// } +// +// /** +// * Add a feature to this biome, where neither the feature nor the placement have a config. +// * +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param placement +// * How the feature will be placed +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, +// NonNullSupplier> placement) { +// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement); +// } +// +// /** +// * Add a feature to this biome, where the placement does not have a config. +// * +// * @param +// * The type of config the feature requires +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param featureConfig +// * The config for the feature +// * @param placement +// * How the feature will be placed +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> +// feature, FC featureConfig, NonNullSupplier> placement) { +// return addFeature(stage, feature, featureConfig, placement, IPlacementConfig.NO_PLACEMENT_CONFIG); +// } +// +// /** +// * Add a feature to this biome, where the feature does not have a config. +// * @param +// * The type of config the placement requires +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param placement +// * How the feature will be placed +// * @param placementConfig +// * The config for the placement +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, +// NonNullSupplier> feature, NonNullSupplier> placement, PC placementConfig) { +// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement, placementConfig); +// } +// +// /** +// * Add a feature to this biome. +// * +// * @param +// * The type of config the feature requires +// * @param +// * The type of config the placement requires +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param featureConfig +// * The config for the feature +// * @param placement +// * How the feature will be placed +// * @param placementConfig +// * The config for the placement +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, +// NonNullSupplier> feature, FC featureConfig, NonNullSupplier> placement, PC placementConfig) +// { +// return addConfiguredFeature(stage, () -> +// feature.get().withConfiguration(featureConfig).withPlacement(placement.get().configure(placementConfig))); +// } +// +// /** +// * Add a pre-configured feature to this biome. +// * +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addConfiguredFeature(Decoration stage, NonNullSupplier> feature) { +// if (this.features.isEmpty()) { +// addFeatures(b -> this.features.forEach((d, f) -> b.addFeature(d, f.get()))); +// } +// this.features.put(stage, feature); +// return this; +// } +// +// /** +// * Add a callback that will be invoked after all {@link Feature Features} are registered, for the purpose of adding +// them to this biome. +// *

+// * Any {@link Feature} object can be safely referenced here and added to the biome via {@link +// Biome#addFeature(Decoration, ConfiguredFeature)} +// * +// * @param action +// * A {@link NonNullConsumer} which will be called to add features to this biome. +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeatures(NonNullConsumer action) { +// this.>onRegisterAfter(Feature.class, action); +// return this; +// } +// +// /** +// * Copy all {@link WorldCarver carvers} from another biome. Does not check for duplicates. +// * +// * @param biome +// * The biome to copy carvers from +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder copyCarvers(NonNullSupplier biome) { +// addCarvers(b -> Arrays.stream(Carving.values()) +// .forEach(s -> biome.get().getCarvers(s).stream() +// .forEach(c -> b.addCarver(s, c)))); +// return this; +// } +// +// /** +// * Add a carver to this biome, where the carver does not have a config. +// * +// * @param type +// * The type of carving to be done +// * @param carver +// * The carver to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver) { +// return addCarver(type, carver, ICarverConfig.field_214644_a); +// } +// +// /** +// * Add a carver to this biome. +// * +// * @param The type of config the carver requires +// * @param type +// * The type of carving to be done +// * @param carver +// * The carver to add +// * @param carverConfig +// * The config for the carver +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver, +// CC carverConfig) { +// return addConfiguredCarver(type, () -> Biome.createCarver(carver.get(), carverConfig)); +// } +// +// /** +// * Add a pre-configured carver to this biome. +// * +// * @param type +// * The type of carving to be done +// * @param carver +// * The carver to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addConfiguredCarver(Carving type, NonNullSupplier> carver) { +// if (this.features.isEmpty()) { +// addCarvers(b -> this.carvers.forEach((s, f) -> b.addCarver(s, f.get()))); +// } +// this.carvers.put(type, carver); +// return this; +// } +// +// /** +// * Add a callback that will be invoked after all {@link WorldCarver WorldCarvers} are registered, for the purpose of +// adding them to this biome. +// *

+// * Any {@link WorldCarver} object can be safely referenced here and added to the biome via {@link +// Biome#addCarver(Carving, ConfiguredCarver)} +// * +// * @param action +// * A {@link NonNullConsumer} which will be called to add carvers to this biome. +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addCarvers(NonNullConsumer action) { +// this.> onRegisterAfter(WorldCarver.class, action); +// return this; +// } +// +// /** +// * Copy all {@link SpawnListEntry spawns} from another biome. Does not check for duplicates. +// * +// * @param biome +// * The biome to copy spawns from +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder copySpawns(NonNullSupplier biome) { +// addSpawns(b -> Arrays.stream(EntityClassification.values()) +// .forEach(ec -> biome.get().getSpawns(ec).stream() +// .forEach(s -> b.getSpawns(ec).add(s)))); +// return this; +// } +// +// /** +// * Add an entity spawn to this biome. +// * +// * @param type +// * The classification of the spawn, which controls how and when the entity is spawned +// * @param entity +// * The entity to spawn +// * @param weight +// * The weight of the spawn, i.e. how likely it is compared to other spawn entries to be selected +// * @param minGroupSize +// * A minimum size of entities to spawn at once +// * @param maxGroupSize +// * A maximum size of entities to spawn at once +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier> entity, int +// weight, int minGroupSize, int maxGroupSize) { +// return addSpawn(type, () -> new SpawnListEntry(entity.get(), weight, minGroupSize, maxGroupSize)); +// } +// +// /** +// * Add an entity spawn to this biome. +// * +// * @param type +// * The classification of the spawn, which controls how and when the entity is spawned +// * @param spawn +// * The spawn entry to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier spawn) { +// if (this.spawns.isEmpty()) { +// this.addSpawns(b -> this.spawns.forEach((c, s) -> b.getSpawns(c).add(s.get()))); +// } +// this.spawns.put(type, spawn); +// return this; +// } +// +// /** +// * Add a callback that will be invoked after all {@link EntityType Entities} are registered, for the purpose of adding +// entity spawns to this biome. +// *

+// * Any {@link EntityType} object can be safely referenced here and added to the biome via {@link +// Biome#getSpawns(EntityClassification)}. +// * +// * @param action +// * A {@link NonNullConsumer} which will be called to add spawns to this biome. +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addSpawns(NonNullConsumer action) { +// this.> onRegisterAfter(EntityType.class, action); +// return this; +// } +// +// /** +// * Assign the default translation, as specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier)}. +// This is the default, so it is generally not necessary to call, unless for +// * undoing previous changes. +// * +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder defaultLang() { +// return lang(Biome::getTranslationKey); +// } +// +// /** +// * Set the translation for this biome. +// * +// * @param name +// * A localized English name +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder lang(String name) { +// return lang(Biome::getTranslationKey, name); +// } +// +// @Override +// protected @NonnullType T createEntry() { +// @Nonnull Biome.Builder properties = this.initialProperties.get(); +// properties = propertiesCallback.apply(properties); +// return factory.apply(properties); +// } +// } diff --git a/src/main/java/com/tterrag/registrate/builders/BlockBuilder.java b/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java similarity index 72% rename from src/main/java/com/tterrag/registrate/builders/BlockBuilder.java rename to src/main/java/com/modularmc/registrate/builders/BlockBuilder.java index e88e6ba..c58972c 100644 --- a/src/main/java/com/tterrag/registrate/builders/BlockBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java @@ -1,31 +1,24 @@ -package com.tterrag.registrate.builders; - -import java.util.function.Function; -import java.util.function.Supplier; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import com.google.common.base.Preconditions; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.builders.BlockEntityBuilder.BlockEntityFactory; -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.providers.GeneratorType; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.providers.RegistrateLangProvider; -import com.tterrag.registrate.providers.generators.RegistrateBlockModelGenerator; -import com.tterrag.registrate.providers.generators.RegistrateRecipeProvider; -import com.tterrag.registrate.providers.loot.RegistrateBlockLootTables; -import com.tterrag.registrate.providers.loot.RegistrateLootTableProvider.LootType; -import com.tterrag.registrate.util.OneTimeEventReceiver; -import com.tterrag.registrate.util.RegistrateDistExecutor; -import com.tterrag.registrate.util.entry.BlockEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; -import com.tterrag.registrate.util.nullness.NonNullBiConsumer; -import com.tterrag.registrate.util.nullness.NonNullBiFunction; -import com.tterrag.registrate.util.nullness.NonNullFunction; -import com.tterrag.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; +package com.modularmc.registrate.builders; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.builders.BlockEntityBuilder.BlockEntityFactory; +import com.modularmc.registrate.providers.DataGenContext; +import com.modularmc.registrate.providers.GeneratorType; +import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.RegistrateLangProvider; +import com.modularmc.registrate.providers.generators.RegistrateBlockModelGenerator; +import com.modularmc.registrate.providers.generators.RegistrateRecipeProvider; +import com.modularmc.registrate.providers.loot.RegistrateBlockLootTables; +import com.modularmc.registrate.providers.loot.RegistrateLootTableProvider.LootType; +import com.modularmc.registrate.util.OneTimeEventReceiver; +import com.modularmc.registrate.util.RegistrateDistExecutor; +import com.modularmc.registrate.util.entry.BlockEntry; +import com.modularmc.registrate.util.entry.RegistryEntry; +import com.modularmc.registrate.util.nullness.NonNullBiConsumer; +import com.modularmc.registrate.util.nullness.NonNullBiFunction; +import com.modularmc.registrate.util.nullness.NonNullFunction; +import com.modularmc.registrate.util.nullness.NonNullSupplier; +import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.renderer.ItemBlockRenderTypes; @@ -33,7 +26,7 @@ import net.minecraft.client.renderer.block.model.Variant; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.tags.TagKey; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -47,9 +40,16 @@ import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; import net.neoforged.neoforge.registries.DeferredHolder; +import java.util.function.Function; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + /** - * A builder for blocks, allows for customization of the {@link Block.Properties}, creation of block items, and configuration of data associated with blocks (loot tables, recipes, etc.). - * + * A builder for blocks, allows for customization of the {@link Block.Properties}, creation of block items, and + * configuration of data associated with blocks (loot tables, recipes, etc.). + * * @param * The type of block being built * @param

@@ -58,7 +58,8 @@ public class BlockBuilder extends AbstractBuilder> { /** - * Create a new {@link BlockBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link BlockBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that + * alternate initialization strategies can be done in subclasses. *

* The block will be assigned the following data: *

    @@ -67,21 +68,21 @@ public class BlockBuilder extends AbstractBuilderA self-dropping loot table (via {@link #defaultLoot()}) *
  • The default translation (via {@link #defaultLang()})
  • *
- * + * * @param - * The type of the builder + * The type of the builder * @param

- * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the block + * Factory to create the block * @return A new {@link BlockBuilder} with reasonable default data generators. */ public static BlockBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { @@ -90,7 +91,7 @@ public static BlockBuilder create(AbstractRegistrate< } private final NonNullFunction factory; - + private NonNullSupplier initialProperties; private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); @Nullable @@ -106,13 +107,14 @@ protected BlockBuilder(AbstractRegistrate owner, P parent, String name, Build } /** - * Modify the properties of the block. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform + * Modify the properties of the block. Modifications are done lazily, but the passed function is composed with the + * current one, and as such this method can be called multiple times to perform * different operations. *

* If a different properties instance is returned, it will replace the existing one entirely. - * + * * @param func - * The action to perform on the properties + * The action to perform on the properties * @return this {@link BlockBuilder} */ public BlockBuilder properties(NonNullUnaryOperator func) { @@ -121,10 +123,12 @@ public BlockBuilder properties(NonNullUnaryOperator initialProperties(NonNullSupplier block) { @@ -133,7 +137,8 @@ public BlockBuilder initialProperties(NonNullSupplier blo } /** - * @deprecated Set your render type in your model's JSON ({@link net.neoforged.neoforge.client.model.generators.template.ExtendedModelTemplateBuilder#renderType(ResourceLocation)}) + * @deprecated Set your render type in your model's JSON + * ({@link net.neoforged.neoforge.client.model.generators.template.ExtendedModelTemplateBuilder#renderType(Identifier)}) */ @Deprecated(forRemoval = true) public BlockBuilder addLayer(Supplier> layer) { @@ -159,7 +164,8 @@ protected void registerLayers(T entry) { } /** - * Create a standard {@link BlockItem} for this block, building it immediately, and not allowing for further configuration. + * Create a standard {@link BlockItem} for this block, building it immediately, and not allowing for further + * configuration. *

* The item will have no lang entry (since it would duplicate the block's) * @@ -171,10 +177,11 @@ public BlockBuilder simpleItem() { } /** - * Create a standard {@link BlockItem} for this block, and return the builder for it so that further customization can be done. + * Create a standard {@link BlockItem} for this block, and return the builder for it so that further customization + * can be done. *

* The item will have no lang entry (since it would duplicate the block's) - * + * * @return the {@link ItemBuilder} for the {@link BlockItem} */ public ItemBuilder> item() { @@ -182,19 +189,22 @@ public ItemBuilder> item() { } /** - * Create a {@link BlockItem} for this block, which is created by the given factory, and return the builder for it so that further customization can be done. + * Create a {@link BlockItem} for this block, which is created by the given factory, and return the builder for it + * so that further customization can be done. *

- * By default, the item will have no lang entry (since it would duplicate the block's) and a simple block item model. - * + * By default, the item will have no lang entry (since it would duplicate the block's) and a simple block item + * model. + * * @param - * The type of the item + * The type of the item * @param factory - * A factory for the item, which accepts the block object and properties and returns a new item + * A factory for the item, which accepts the block object and properties and returns a new item * @return the {@link ItemBuilder} for the {@link BlockItem} */ public ItemBuilder> item(NonNullBiFunction factory) { - return getOwner().> item(this, getName(), p -> factory.apply(getEntry(), p.useBlockDescriptionPrefix())) - .setData(ProviderType.LANG, NonNullBiConsumer.noop()) // FIXME Need a beetter API for "unsetting" providers + return getOwner().>item(this, getName(), p -> factory.apply(getEntry(), p.useBlockDescriptionPrefix())) + .setData(ProviderType.LANG, NonNullBiConsumer.noop()) // FIXME Need a beetter API for "unsetting" + // providers .model(() -> (ctx, prov) -> { getOwner().getDataProvider(ProviderType.BLOCKSTATE) .map(g -> g.seenBlockstates.get(getEntry())) @@ -211,12 +221,13 @@ public ItemBuilder> item(NonNullBiFunctio } /** - * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as its one and only valid block. - * + * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as + * its one and only valid block. + * * @param - * The type of the block entity + * The type of the block entity * @param factory - * A factory for the block entity + * A factory for the block entity * @return this {@link BlockBuilder} */ public BlockBuilder simpleBlockEntity(BlockEntityFactory factory) { @@ -224,25 +235,26 @@ public BlockBuilder simpleBlockEntity(BlockEntity } /** - * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as its one and only valid block. + * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as + * its one and only valid block. *

* The created {@link BlockEntityBuilder} is returned for further configuration. - * + * * @param - * The type of the block entity + * The type of the block entity * @param factory - * A factory for the block entity + * A factory for the block entity * @return the {@link BlockEntityBuilder} */ public BlockEntityBuilder> blockEntity(BlockEntityFactory factory) { return getOwner().>blockEntity(this, getName(), factory).validBlock(asSupplier()); } - + /** * Register a block color handler for this block. The {@link BlockColor} instance can be shared across many blocks. - * + * * @param colorHandler - * The color handler to register for this block + * The color handler to register for this block * @return this {@link BlockBuilder} */ // TODO it might be worthwhile to abstract this more and add the capability to automatically copy to the item @@ -253,7 +265,7 @@ public BlockBuilder color(NonNullSupplier> colorHandl this.colorHandler = colorHandler; return this; } - + protected void registerBlockColor() { OneTimeEventReceiver.addModListener(getOwner(), RegisterColorHandlersEvent.Block.class, e -> { NonNullSupplier> colorHandler = this.colorHandler; @@ -264,9 +276,11 @@ protected void registerBlockColor() { } /** - * Assign the default blockstate, which maps all states to a single model file (via {@link RegistrateBlockModelGenerator#createTrivialCube(Block)}). This is the default, so it is generally not necessary + * Assign the default blockstate, which maps all states to a single model file (via + * {@link RegistrateBlockModelGenerator#createTrivialCube(Block)}). This is the default, so it is generally not + * necessary * to call, unless for undoing previous changes. - * + * * @return this {@link BlockBuilder} */ public BlockBuilder defaultBlockstate() { @@ -275,9 +289,9 @@ public BlockBuilder defaultBlockstate() { /** * Configure the blockstate/models for this block. - * + * * @param cons - * The callback which will be invoked during data generation. + * The callback which will be invoked during data generation. * @return this {@link BlockBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -287,9 +301,11 @@ public BlockBuilder blockstate(NonNullSupplier defaultLang() { @@ -298,9 +314,9 @@ public BlockBuilder defaultLang() { /** * Set the translation for this block. - * + * * @param name - * A localized English name + * A localized English name * @return this {@link BlockBuilder} */ public BlockBuilder lang(String name) { @@ -308,9 +324,10 @@ public BlockBuilder lang(String name) { } /** - * Assign the default loot table, as specified by {@link RegistrateBlockLootTables#dropSelf(Block)}. This is the default, so it is generally not necessary to call, unless for + * Assign the default loot table, as specified by {@link RegistrateBlockLootTables#dropSelf(Block)}. This is the + * default, so it is generally not necessary to call, unless for * undoing previous changes. - * + * * @return this {@link BlockBuilder} */ public BlockBuilder defaultLoot() { @@ -318,13 +335,15 @@ public BlockBuilder defaultLoot() { } /** - * Configure the loot table for this block. This is different than most data gen callbacks as the callback does not accept a {@link DataGenContext}, but instead a + * Configure the loot table for this block. This is different than most data gen callbacks as the callback does not + * accept a {@link DataGenContext}, but instead a * {@link RegistrateBlockLootTables}, for creating specifically block loot tables. *

- * If the block does not have a loot table (i.e. {@link Block.Properties#noLootTable()} is called) this action will be skipped. - * + * If the block does not have a loot table (i.e. {@link Block.Properties#noLootTable()} is called) this action will + * be skipped. + * * @param cons - * The callback which will be invoked during block loot table creation. + * The callback which will be invoked during block loot table creation. * @return this {@link BlockBuilder} */ public BlockBuilder loot(NonNullBiConsumer cons) { @@ -337,9 +356,9 @@ public BlockBuilder loot(NonNullBiConsumer c /** * Configure the recipe(s) for this block. - * + * * @param cons - * The callback which will be invoked during data generation. + * The callback which will be invoked during data generation. * @return this {@link BlockBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -355,7 +374,7 @@ public BlockBuilder recipe(NonNullBiConsumer, Reg * The {@link IClientBlockExtensions} instance can be shared across many items. * * @param clientExtension - * The client extension to register for this block + * The client extension to register for this block * @return this {@link BlockBuilder} */ public BlockBuilder clientExtension(NonNullSupplier> clientExtension) { @@ -371,7 +390,7 @@ public BlockBuilder clientExtension(NonNullSupplier tag(TagKey... tags) { @Override protected T createEntry() { - @Nonnull BlockBehaviour.Properties properties = this.initialProperties.get(); - //TODO why do we need this? + @Nonnull + BlockBehaviour.Properties properties = this.initialProperties.get(); + // TODO why do we need this? // ObfuscationReflectionHelper.setPrivateValue(BlockBehaviour.Properties.class, properties, null, "drops"); properties = propertiesCallback.apply(properties); return factory.apply(properties.setId(getResourceKey())); diff --git a/src/main/java/com/tterrag/registrate/builders/BlockEntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java similarity index 78% rename from src/main/java/com/tterrag/registrate/builders/BlockEntityBuilder.java rename to src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java index 149530c..5451eb1 100644 --- a/src/main/java/com/tterrag/registrate/builders/BlockEntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java @@ -1,21 +1,12 @@ -package com.tterrag.registrate.builders; +package com.modularmc.registrate.builders; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; - -import javax.annotation.Nullable; - -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.util.OneTimeEventReceiver; -import com.tterrag.registrate.util.RegistrateDistExecutor; -import com.tterrag.registrate.util.entry.BlockEntityEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; -import com.tterrag.registrate.util.nullness.NonNullFunction; -import com.tterrag.registrate.util.nullness.NonNullSupplier; +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.util.OneTimeEventReceiver; +import com.modularmc.registrate.util.RegistrateDistExecutor; +import com.modularmc.registrate.util.entry.BlockEntityEntry; +import com.modularmc.registrate.util.entry.RegistryEntry; +import com.modularmc.registrate.util.nullness.NonNullFunction; +import com.modularmc.registrate.util.nullness.NonNullSupplier; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -31,9 +22,17 @@ import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.registries.DeferredHolder; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; + +import javax.annotation.Nullable; + /** * A builder for block entities, allows for customization of the valid blocks. - * + * * @param * The type of block entity being built * @param

@@ -44,28 +43,28 @@ public class BlockEntityBuilder extends AbstractBuilde public interface BlockEntityFactory { public T create(BlockEntityType type, BlockPos pos, BlockState state); - } /** - * Create a new {@link BlockEntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link BlockEntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, + * so that alternate initialization strategies can be done in subclasses. *

* The block entity will be assigned the following data: - * + * * @param - * The type of the builder + * The type of the builder * @param

- * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the block entity + * Factory to create the block entity * @return A new {@link BlockEntityBuilder} with reasonable default data generators. */ public static BlockEntityBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, BlockEntityFactory factory) { @@ -81,24 +80,24 @@ protected BlockEntityBuilder(AbstractRegistrate owner, P parent, String name, super(owner, parent, name, callback, Registries.BLOCK_ENTITY_TYPE); this.factory = factory; } - + /** * Add a valid block for this block entity. - * + * * @param block - * A supplier for the block to add at registration time + * A supplier for the block to add at registration time * @return this {@link BlockEntityBuilder} */ public BlockEntityBuilder validBlock(NonNullSupplier block) { validBlocks.add(block); return this; } - + /** * Add valid blocks for this block entity. - * + * * @param blocks - * An array of suppliers for the block to add at registration time + * An array of suppliers for the block to add at registration time * @return this {@link BlockEntityBuilder} */ @SafeVarargs @@ -106,15 +105,17 @@ public final BlockEntityBuilder validBlocks(NonNullSupplier - * - * @apiNote This requires the {@link Class} of the block entity object, which can only be gotten by inspecting an instance of it. Thus, the entity will be constructed to register the renderer. - * + * + * @apiNote This requires the {@link Class} of the block entity object, which can only be gotten by inspecting an + * instance of it. Thus, the entity will be constructed to register the renderer. + * * @param renderer - * A (server safe) supplier to an {@link Function} that will provide this block entity's renderer given the renderer dispatcher + * A (server safe) supplier to an {@link Function} that will provide this block entity's renderer + * given the renderer dispatcher * @return this {@link BlockEntityBuilder} */ public BlockEntityBuilder renderer(NonNullSupplier>> renderer) { @@ -124,7 +125,7 @@ public BlockEntityBuilder renderer(NonNullSupplier { var renderer = this.renderer; diff --git a/src/main/java/com/tterrag/registrate/builders/Builder.java b/src/main/java/com/modularmc/registrate/builders/Builder.java similarity index 67% rename from src/main/java/com/tterrag/registrate/builders/Builder.java rename to src/main/java/com/modularmc/registrate/builders/Builder.java index bfd7fdd..ecf1ad9 100644 --- a/src/main/java/com/tterrag/registrate/builders/Builder.java +++ b/src/main/java/com/modularmc/registrate/builders/Builder.java @@ -1,26 +1,36 @@ -package com.tterrag.registrate.builders; +package com.modularmc.registrate.builders; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.DataGenContext; +import com.modularmc.registrate.providers.GeneratorType; +import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.util.entry.RegistryEntry; +import com.modularmc.registrate.util.nullness.NonNullBiConsumer; +import com.modularmc.registrate.util.nullness.NonNullBiFunction; +import com.modularmc.registrate.util.nullness.NonNullConsumer; +import com.modularmc.registrate.util.nullness.NonNullFunction; +import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.providers.GeneratorType; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.util.entry.RegistryEntry; -import com.tterrag.registrate.util.nullness.*; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.neoforged.neoforge.registries.datamaps.DataMapType; +import com.tterrag.registrate.util.nullness.*; + import java.util.function.Function; /** - * A Builder creates registry entries. A Builder instance has a constant name which will be used for the resultant object, they cannot be reused for different names. It holds a parent object that will + * A Builder creates registry entries. A Builder instance has a constant name which will be used for the resultant + * object, they cannot be reused for different names. It holds a parent object that will * be returned from some final methods. *

- * When a builder is completed via {@link #register()} or {@link #build()}, the object will be lazily registered (through the owning {@link AbstractRegistrate} object). - * + * When a builder is completed via {@link #register()} or {@link #build()}, the object will be lazily registered + * (through the owning {@link AbstractRegistrate} object). + * * @param - * Type of the registry for the current object. This is the concrete base class that all registry entries must extend, and the type used for the forge registry itself. + * Type of the registry for the current object. This is the concrete base class that all registry entries + * must extend, and the type used for the forge registry itself. * @param * Actual type of the object being built. * @param

@@ -31,81 +41,86 @@ public interface Builder> extends NonNullSupplier> { /** - * Complete the current entry, and return the {@link RegistryEntry} that will supply the built entry once it is available. The builder can be used afterwards, and changes made will reflect the + * Complete the current entry, and return the {@link RegistryEntry} that will supply the built entry once it is + * available. The builder can be used afterwards, and changes made will reflect the * output, as long as it is before registration takes place (before forge registry events). - * + * * @return The {@link RegistryEntry} supplying the built entry. */ RegistryEntry register(); /** * The owning {@link AbstractRegistrate} that created this builder. - * + * * @return the owner {@link AbstractRegistrate} */ AbstractRegistrate getOwner(); /** * The parent object. - * + * * @return the parent object of this builder */ P getParent(); /** - * The name of the entry being created, and combined with the mod ID of the parent {@link AbstractRegistrate}, the registry name. - * + * The name of the entry being created, and combined with the mod ID of the parent {@link AbstractRegistrate}, the + * registry name. + * * @return the name of the current entry */ String getName(); - + ResourceKey> getRegistryKey(); /** - * Get the {@link RegistryEntry} representing the entry built by this builder. Cannot be called before the builder is built. - * + * Get the {@link RegistryEntry} representing the entry built by this builder. Cannot be called before the builder + * is built. + * * @return An {@link RegistryEntry} for this builder's entry * @throws IllegalArgumentException - * If this builder has not been built yet + * If this builder has not been built yet */ @Override default RegistryEntry get() { - return getOwner(). get(getName(), getRegistryKey()); + return getOwner().get(getName(), getRegistryKey()); } - + /** * Get the actual entry built by this builder. Cannot be called before registration. - * + * * @return This builder's entry * @throws IllegalArgumentException - * If this builder has not been built yet + * If this builder has not been built yet * @throws NullPointerException - * If the entry from this builder has not been registered yet + * If the entry from this builder has not been registered yet */ default T getEntry() { return get().get(); } - + /** - * Get a supplier for the entry created by this builder, which will not reference the builder after it has been resolved. - * + * Get a supplier for the entry created by this builder, which will not reference the builder after it has been + * resolved. + * * @return A supplier for the entry */ NonNullSupplier asSupplier(); /** - * Set the data provider callback for this entry for the given provider type, which will be invoked when the provider of the given type executes. + * Set the data provider callback for this entry for the given provider type, which will be invoked when the + * provider of the given type executes. *

* If called multiple times for the same type, the existing callback will be overwritten. *

* This is mostly unneeded, and instead helper methods for specific data types should be used when possible. - * + * * @param - * The type of provider + * The type of provider * @param type - * The {@link GeneratorType} for the desired provider + * The {@link GeneratorType} for the desired provider * @param cons - * The callback to execute when the provider is run + * The callback to execute when the provider is run * @return this builder */ @SuppressWarnings("unchecked") @@ -118,13 +133,13 @@ default S setData(GeneratorType type, NonNullBiConsumer * Calling this multiple times for the same type will not overwrite an existing callback. - * + * * @param - * The type of provider + * The type of provider * @param type - * The {@link GeneratorType} for the desired provider + * The {@link GeneratorType} for the desired provider * @param cons - * The callback to execute when the provider is run + * The callback to execute when the provider is run * @return this builder */ @SuppressWarnings("unchecked") @@ -168,13 +183,16 @@ default S dataMap(DataMapType type, NonNullBiFunction - * Builders which have had this method used on them (or another method which calls this one), must be registered, via - * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register time. - * + * Builders which have had this method used on them (or another method which calls this one), must + * be registered, via + * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register + * time. + * * @param callback - * the callback to invoke + * the callback to invoke * @return this {@link Builder} */ @SuppressWarnings("unchecked") @@ -184,17 +202,21 @@ default S onRegister(NonNullConsumer callback) { } /** - * Add a callback to be invoked when this entry is registered, but only after some other registry type has been registered as well. Can be called multiple times to add multiple callbacks. + * Add a callback to be invoked when this entry is registered, but only after some other registry type has been + * registered as well. Can be called multiple times to add multiple callbacks. *

- * Builders which have had this method used on them (or another method which calls this one), must be registered, via - * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register time. - * + * Builders which have had this method used on them (or another method which calls this one), must + * be registered, via + * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register + * time. + * * @param - * The dependency registry type + * The dependency registry type * @param dependencyType - * the base class for objects of the dependency registry. The callback will be invoked only after this registry has fired its registry events. + * the base class for objects of the dependency registry. The callback will be invoked only + * after this registry has fired its registry events. * @param callback - * the callback to invoke + * the callback to invoke * @return this {@link Builder} */ default S onRegisterAfter(ResourceKey> dependencyType, NonNullConsumer callback) { @@ -209,26 +231,27 @@ default S onRegisterAfter(ResourceKey> dependencyTyp /** * Apply a transformation to this {@link Builder}. Useful to apply helper methods within a fluent chain, e.g. - * + * *

      * {@code
+     *
      * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
      *         .block(MyBlock::new)
      *         .transform(Utils::defaultBlockProperties)
      *         .register();
      * }
      * 
- * + * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param - * Parent type + * Parent type * @param - * Self type + * Self type * @param func - * The {@link Function function} to apply + * The {@link Function function} to apply * @return the {@link Builder} returned by the given function */ @SuppressWarnings("unchecked") @@ -237,9 +260,10 @@ default > S2 transform } /** - * Register the entry and return the parent object. The {@link net.neoforged.neoforge.registries.DeferredHolder} will be created but not returned. It can be retrieved later with {@link AbstractRegistrate#get(ResourceKey)} or + * Register the entry and return the parent object. The {@link net.neoforged.neoforge.registries.DeferredHolder} + * will be created but not returned. It can be retrieved later with {@link AbstractRegistrate#get(ResourceKey)} or * {@link AbstractRegistrate#get(String, ResourceKey)}. - * + * * @return the parent object */ default P build() { diff --git a/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java b/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java new file mode 100644 index 0000000..842f63d --- /dev/null +++ b/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java @@ -0,0 +1,62 @@ +package com.modularmc.registrate.builders; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.util.entry.RegistryEntry; +import com.modularmc.registrate.util.nullness.NonNullFunction; +import com.modularmc.registrate.util.nullness.NonNullSupplier; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.neoforged.neoforge.registries.DeferredHolder; + +/** + * A callback passed to {@link Builder builders} from the owning {@link AbstractRegistrate} which will add a + * registration for the built entry that lazily creates and registers it. + */ +@FunctionalInterface +public interface BuilderCallback { + + /** + * Accept a built entry, to later be constructed and registered. + * + * @param + * The registry type to which the entry will be registered + * @param + * The type of the entry + * @param name + * The name of the entry + * @param type + * A {@link ResourceKey} representing the registry type + * @param builder + * The builder performing this callback + * @param factory + * A {@link NonNullSupplier} that will create the entry + * @param entryFactory + * A {@link NonNullFunction} which accepts the entry delegate and returns a + * {@link RegistryEntry} wrapper + * @return A {@link RegistryEntry} that will supply the registered entry + */ + RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier factory, NonNullFunction, ? extends RegistryEntry> entryFactory); + + /** + * Accept a built entry, to later be constructed and registered. Uses the default + * {@link RegistryEntry#RegistryEntry(AbstractRegistrate, DeferredHolder) RegistryEntry factory}. + * + * @param + * The registry type to which the entry will be registered + * @param + * The type of the entry + * @param name + * The name of the entry + * @param type + * A {@link Class} representing the registry type + * @param builder + * The builder performing this callback + * @param factory + * A {@link NonNullSupplier} that will create the entry + * @return A {@link RegistryEntry} that will supply the registered entry + */ + default RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier factory) { + return accept(name, type, builder, factory, delegate -> new RegistryEntry<>(builder.getOwner(), delegate)); + } +} diff --git a/src/main/java/com/tterrag/registrate/builders/EntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java similarity index 62% rename from src/main/java/com/tterrag/registrate/builders/EntityBuilder.java rename to src/main/java/com/modularmc/registrate/builders/EntityBuilder.java index 464af67..54e089f 100644 --- a/src/main/java/com/tterrag/registrate/builders/EntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java @@ -1,24 +1,23 @@ -package com.tterrag.registrate.builders; +package com.modularmc.registrate.builders; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.DataGenContext; +import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.RegistrateLangProvider; +import com.modularmc.registrate.providers.loot.RegistrateEntityLootTables; +import com.modularmc.registrate.providers.loot.RegistrateLootTableProvider.LootType; +import com.modularmc.registrate.util.OneTimeEventReceiver; +import com.modularmc.registrate.util.RegistrateDistExecutor; +import com.modularmc.registrate.util.entry.EntityEntry; +import com.modularmc.registrate.util.entry.RegistryEntry; +import com.modularmc.registrate.util.nullness.NonNullBiConsumer; +import com.modularmc.registrate.util.nullness.NonNullConsumer; +import com.modularmc.registrate.util.nullness.NonNullFunction; +import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.providers.RegistrateLangProvider; -import com.tterrag.registrate.providers.loot.RegistrateEntityLootTables; -import com.tterrag.registrate.providers.loot.RegistrateLootTableProvider.LootType; -import com.tterrag.registrate.util.OneTimeEventReceiver; -import com.tterrag.registrate.util.RegistrateDistExecutor; -import com.tterrag.registrate.util.entry.EntityEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; -import com.tterrag.registrate.util.nullness.NonNullBiConsumer; -import com.tterrag.registrate.util.nullness.NonNullConsumer; -import com.tterrag.registrate.util.nullness.NonNullFunction; -import com.tterrag.registrate.util.nullness.NonNullSupplier; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.*; import net.minecraft.world.entity.SpawnPlacements.SpawnPredicate; @@ -32,11 +31,13 @@ import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; import net.neoforged.neoforge.registries.DeferredHolder; -import javax.annotation.Nullable; import java.util.function.Supplier; +import javax.annotation.Nullable; + /** - * A builder for entities, allows for customization of the {@link EntityType.Builder}, easy creation of spawn egg items, and configuration of data associated with entities (loot tables, etc.). + * A builder for entities, allows for customization of the {@link EntityType.Builder}, easy creation of spawn egg items, + * and configuration of data associated with entities (loot tables, etc.). * * @param * The type of entity being built @@ -46,7 +47,8 @@ public class EntityBuilder extends AbstractBuilder, EntityType, P, EntityBuilder> { /** - * Create a new {@link EntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link EntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, so + * that alternate initialization strategies can be done in subclasses. *

* The entity will be assigned the following data: *

    @@ -54,25 +56,25 @@ public class EntityBuilder extends AbstractBuilder * * @param - * The type of the builder + * The type of the builder * @param

    - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the entity + * Factory to create the entity * @param classification - * The {@link MobCategory} of the entity + * The {@link MobCategory} of the entity * @return A new {@link EntityBuilder} with reasonable default data generators. */ public static EntityBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, EntityType.EntityFactory factory, - MobCategory classification) { + MobCategory classification) { return new EntityBuilder<>(owner, parent, name, callback, factory, classification) .defaultLang(); } @@ -92,11 +94,12 @@ protected EntityBuilder(AbstractRegistrate owner, P parent, String name, Buil } /** - * Modify the properties of the entity. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform + * Modify the properties of the entity. Modifications are done lazily, but the passed function is composed with the + * current one, and as such this method can be called multiple times to perform * different operations. * * @param cons - * The action to perform on the properties + * The action to perform on the properties * @return this {@link EntityBuilder} */ public EntityBuilder properties(NonNullConsumer> cons) { @@ -109,7 +112,8 @@ public EntityBuilder properties(NonNullConsumer> con *

    * * @param renderer - * A (server safe) supplier to an {@link EntityRendererProvider} that will provide this entity's renderer + * A (server safe) supplier to an {@link EntityRendererProvider} that will provide this entity's + * renderer * @return this {@link EntityBuilder} */ public EntityBuilder renderer(NonNullSupplier>> renderer) { @@ -140,10 +144,11 @@ protected void registerRenderer() { * Cannot be called more than once per builder. * * @param attributes - * A supplier to the attributes for this entity, usually of the form {@code EntityClass::createAttributes} + * A supplier to the attributes for this entity, usually of the form + * {@code EntityClass::createAttributes} * @return this {@link EntityBuilder} * @throws IllegalStateException - * When called more than once + * When called more than once */ @SuppressWarnings("unchecked") public EntityBuilder attributes(Supplier attributes) { @@ -156,19 +161,20 @@ public EntityBuilder attributes(Supplier attrib } /** - * Register a spawn placement for this entity. The entity must extend {@link Mob} and allow construction with a {@code null} {@link Level}. + * Register a spawn placement for this entity. The entity must extend {@link Mob} and allow construction with a + * {@code null} {@link Level}. *

    * Cannot be called more than once per builder. * * @param type - * The type of placement to use + * The type of placement to use * @param heightmap - * Which heightmap to use to choose placement locations + * Which heightmap to use to choose placement locations * @param predicate - * A predicate to check spawn locations for validity + * A predicate to check spawn locations for validity * @return this {@link EntityBuilder} * @throws IllegalStateException - * When called more than once + * When called more than once */ @SuppressWarnings("unchecked") public EntityBuilder spawnPlacement(SpawnPlacementType type, Heightmap.Types heightmap, SpawnPredicate predicate, RegisterSpawnPlacementsEvent.Operation operation) { @@ -177,15 +183,18 @@ public EntityBuilder spawnPlacement(SpawnPlacementType type, Heightmap.Typ } spawnConfigured = true; this.onRegister(t -> { - /* TODO is there any way to do this now? - try { - if (!(t.create(null) instanceof MobEntity)) { - throw new IllegalArgumentException("Cannot register spawn placement for entity " + t.getRegistryName() + " as it does not extend MobEntity"); - } - } catch (Exception e) { - throw new RuntimeException("Failed to type check entity " + t.getRegistryName() + " when registering spawn placement", e); - } - */ + /* + * TODO is there any way to do this now? + * try { + * if (!(t.create(null) instanceof MobEntity)) { + * throw new IllegalArgumentException("Cannot register spawn placement for entity " + t.getRegistryName() + + * " as it does not extend MobEntity"); + * } + * } catch (Exception e) { + * throw new RuntimeException("Failed to type check entity " + t.getRegistryName() + + * " when registering spawn placement", e); + * } + */ OneTimeEventReceiver.addModListener(getOwner(), RegisterSpawnPlacementsEvent.class, e -> { e.register(t, type, heightmap, predicate, operation); }); @@ -196,49 +205,60 @@ public EntityBuilder spawnPlacement(SpawnPlacementType type, Heightmap.Typ /** * Create a spawn egg item for this entity using the given colors, not allowing for any extra configuration. * - * @deprecated This does not work properly, see this issue. + * @deprecated This does not work properly, see + * this issue. *

    * As a temporary measure, uses a custom egg class that imperfectly emulates the functionality * * @param primaryColor - * The primary color of the egg + * The primary color of the egg * @param secondaryColor - * The secondary color of the egg + * The secondary color of the egg * @return this {@link EntityBuilder} */ - /* TODO <1.21.4> spawn egg - @Deprecated - public EntityBuilder defaultSpawnEgg(int primaryColor, int secondaryColor) { - return spawnEgg(primaryColor, secondaryColor).build(); - } - + /* + * TODO <1.21.4> spawn egg + * + * @Deprecated + * public EntityBuilder defaultSpawnEgg(int primaryColor, int secondaryColor) { + * return spawnEgg(primaryColor, secondaryColor).build(); + * } + * */ /** * Create a spawn egg item for this entity using the given colors, and return the builder for further configuration. * - * @deprecated This does not work properly, see this issue. + * @deprecated This does not work properly, see + * this issue. *

    * As a temporary measure, uses a custom egg class that imperfectly emulates the functionality * * @param primaryColor - * The primary color of the egg + * The primary color of the egg * @param secondaryColor - * The secondary color of the egg + * The secondary color of the egg * @return the {@link ItemBuilder} for the egg item */ - /* TODO <1.21.4> spawn egg - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Deprecated - public ItemBuilder> spawnEgg(int primaryColor, int secondaryColor) { - var sup = asSupplier(); - return getOwner().item(this, getName() + "_spawn_egg", p -> new DeferredSpawnEggItem((Supplier>) (Supplier) sup, primaryColor, secondaryColor, p)).tab(CreativeModeTabs.SPAWN_EGGS) - .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), ResourceLocation.withDefaultNamespace("item/template_spawn_egg"))); - } + /* + * TODO <1.21.4> spawn egg + * + * @SuppressWarnings({ "rawtypes", "unchecked" }) + * + * @Deprecated + * public ItemBuilder> spawnEgg(int primaryColor, int secondaryColor) { + * var sup = asSupplier(); + * return getOwner().item(this, getName() + "_spawn_egg", p -> new DeferredSpawnEggItem((Supplier>) (Supplier) sup, primaryColor, secondaryColor, p)).tab(CreativeModeTabs.SPAWN_EGGS) + * .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), + * Identifier.withDefaultNamespace("item/template_spawn_egg"))); + * } */ /** - * Assign the default translation, as specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, net.minecraft.resources.ResourceKey)}. This is the default, so it is generally + * Assign the default translation, as specified by + * {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, net.minecraft.resources.ResourceKey)}. This is + * the default, so it is generally * not necessary to call, unless for undoing previous changes. * * @return this {@link EntityBuilder} @@ -251,7 +271,7 @@ public EntityBuilder defaultLang() { * Set the translation for this entity. * * @param name - * A localized English name + * A localized English name * @return this {@link EntityBuilder} */ public EntityBuilder lang(String name) { @@ -259,11 +279,12 @@ public EntityBuilder lang(String name) { } /** - * Configure the loot table for this entity. This is different than most data gen callbacks as the callback does not accept a {@link DataGenContext}, but instead a + * Configure the loot table for this entity. This is different than most data gen callbacks as the callback does not + * accept a {@link DataGenContext}, but instead a * {@link RegistrateEntityLootTables}, for creating specifically entity loot tables. * * @param cons - * The callback which will be invoked during entity loot table creation. + * The callback which will be invoked during entity loot table creation. * @return this {@link EntityBuilder} */ public EntityBuilder loot(NonNullBiConsumer> cons) { @@ -274,7 +295,7 @@ public EntityBuilder loot(NonNullBiConsumer extends AbstractBuilder> { @FunctionalInterface public interface FluidTypeFactory { + FluidType create(FluidType.Properties properties); } @FunctionalInterface public interface FluidFactory { + T create(BaseFlowingFluid.Properties properties); } - @Nullable private NonNullSupplier> clientExtension; /** - * Register a client extension for this block. The {@link IClientBlockExtensions} instance can be shared across many items. + * Register a client extension for this block. The {@link IClientBlockExtensions} instance can be shared across many + * items. * * @param clientExtension - * The client extension to register for this block + * The client extension to register for this block * @return this {@link BlockBuilder} */ public FluidBuilder clientExtension(NonNullSupplier> clientExtension) { @@ -77,7 +86,7 @@ public FluidBuilder clientExtension(NonNullSupplier clientExtension(ResourceLocation stillTexture, ResourceLocation flowingTexture) { + public FluidBuilder clientExtension(Identifier stillTexture, Identifier flowingTexture) { return clientExtension(() -> () -> new DefaultFluidTypeExtension(stillTexture, flowingTexture)); } @@ -91,18 +100,19 @@ protected void registerClientExtension() { } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) and fluid class ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) + * and fluid class ({@link BaseFlowingFluid.Flowing}). * * @param

    - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @return A new {@link FluidBuilder} with reasonable default data generators. * @see #create(AbstractRegistrate, Object, String, BuilderCallback, FluidTypeFactory, FluidFactory) */ @@ -111,20 +121,21 @@ public static

    FluidBuilder create(AbstractRegis } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class + * ({@link BaseFlowingFluid.Flowing}). * * @param

    - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param typeFactory - * A factory that creates the fluid type + * A factory that creates the fluid type * @return A new {@link FluidBuilder} with reasonable default data generators. * @see #create(AbstractRegistrate, Object, String, BuilderCallback, FluidTypeFactory, FluidFactory) */ @@ -133,20 +144,21 @@ public static

    FluidBuilder create(AbstractRegis } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class + * ({@link BaseFlowingFluid.Flowing}). * * @param

    - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param fluidType - * An existing and registered fluid type. + * An existing and registered fluid type. * @return A new {@link FluidBuilder} with reasonable default data generators. * @see #create(AbstractRegistrate, Object, String, BuilderCallback, FluidTypeFactory, FluidFactory) */ @@ -155,96 +167,103 @@ public static

    FluidBuilder create(AbstractRegis } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) and fluid class ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) + * and fluid class ({@link BaseFlowingFluid.Flowing}). * * @param - * The type of the builder + * The type of the builder * @param

    - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param fluidFactory - * A factory that creates the flowing fluid + * A factory that creates the flowing fluid * @return A new {@link FluidBuilder} with reasonable default data generators. */ public static FluidBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, - FluidFactory fluidFactory) { + FluidFactory fluidFactory) { return create(owner, parent, name, callback, FluidType::new, fluidFactory); } /** - * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that + * alternate initialization strategies can be done in subclasses. *

    * The fluid will be assigned the following data: *

      *
    • The default translation (via {@link #defaultLang()})
    • *
    • A default {@link BaseFlowingFluid.Source source fluid} (via {@link #defaultSource})
    • - *
    • A default block for the fluid, with its own default blockstate and model that configure the particle texture (via {@link #defaultBlock()})
    • - *
    • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid (via {@link #defaultBucket()})
    • + *
    • A default block for the fluid, with its own default blockstate and model that configure the particle texture + * (via {@link #defaultBlock()})
    • + *
    • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid + * (via {@link #defaultBucket()})
    • *
    * * @param - * The type of the builder + * The type of the builder * @param

    - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param typeFactory - * A factory that creates the fluid type + * A factory that creates the fluid type * @param fluidFactory - * A factory that creates the flowing fluid + * A factory that creates the flowing fluid * @return A new {@link FluidBuilder} with reasonable default data generators. */ public static FluidBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, - FluidTypeFactory typeFactory, FluidFactory fluidFactory) { + FluidTypeFactory typeFactory, FluidFactory fluidFactory) { FluidBuilder ret = new FluidBuilder<>(owner, parent, name, callback, typeFactory, fluidFactory) .defaultLang().defaultSource().defaultBlock().defaultBucket(); return ret; } /** - * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that + * alternate initialization strategies can be done in subclasses. *

    * The fluid will be assigned the following data: *

      *
    • The default translation (via {@link #defaultLang()})
    • *
    • A default {@link BaseFlowingFluid.Source source fluid} (via {@link #defaultSource})
    • - *
    • A default block for the fluid, with its own default blockstate and model that configure the particle texture (via {@link #defaultBlock()})
    • - *
    • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid (via {@link #defaultBucket()})
    • + *
    • A default block for the fluid, with its own default blockstate and model that configure the particle texture + * (via {@link #defaultBlock()})
    • + *
    • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid + * (via {@link #defaultBucket()})
    • *
    * * @param - * The type of the builder + * The type of the builder * @param

    - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param fluidType - * An existing and registered fluid type + * An existing and registered fluid type * @param fluidFactory - * A factory that creates the flowing fluid + * A factory that creates the flowing fluid * @return A new {@link FluidBuilder} with reasonable default data generators. */ public static FluidBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, - NonNullSupplier fluidType, FluidFactory fluidFactory) { + NonNullSupplier fluidType, FluidFactory fluidFactory) { return new FluidBuilder<>(owner, parent, name, callback, fluidType, fluidFactory) .defaultLang().defaultSource().defaultBlock().defaultBucket(); } @@ -290,11 +309,12 @@ public FluidBuilder(AbstractRegistrate owner, P parent, String name, BuilderC } /** - * Modify the properties of the fluid type. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform + * Modify the properties of the fluid type. Modifications are done lazily, but the passed function is composed with + * the current one, and as such this method can be called multiple times to perform * different operations. * * @param cons - * The action to perform on the attributes + * The action to perform on the attributes * @return this {@link FluidBuilder} */ public FluidBuilder properties(NonNullConsumer cons) { @@ -303,11 +323,12 @@ public FluidBuilder properties(NonNullConsumer cons) } /** - * Modify the properties of the flowing fluid. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform + * Modify the properties of the flowing fluid. Modifications are done lazily, but the passed function is composed + * with the current one, and as such this method can be called multiple times to perform * different operations. * * @param cons - * The action to perform on the attributes + * The action to perform on the attributes * @return this {@link FluidBuilder} */ public FluidBuilder fluidProperties(NonNullConsumer cons) { @@ -316,7 +337,8 @@ public FluidBuilder fluidProperties(NonNullConsumer defaultLang() { * Set the translation for this fluid. * * @param name - * A localized English name + * A localized English name * @return this {@link FluidBuilder} */ public FluidBuilder lang(String name) { return lang(f -> f.getFluidType().getDescriptionId(), name); } - public FluidBuilder renderType(Supplier> layer) { if (this.layer == null) { onRegister(this::registerRenderType); @@ -358,12 +379,13 @@ protected void registerRenderType(T entry) { } /** - * Create a standard {@link BaseFlowingFluid.Source} for this fluid which will be built and registered along with this fluid. + * Create a standard {@link BaseFlowingFluid.Source} for this fluid which will be built and registered along with + * this fluid. * * @return this {@link FluidBuilder} * @see #source(NonNullFunction) * @throws IllegalStateException - * If {@link #source(NonNullFunction)} has been called before this method + * If {@link #source(NonNullFunction)} has been called before this method */ public FluidBuilder defaultSource() { if (this.defaultSource != null) { @@ -374,10 +396,11 @@ public FluidBuilder defaultSource() { } /** - * Create a {@link BaseFlowingFluid} for this fluid, which is created by the given factory, and which will be built and registered along with this fluid. + * Create a {@link BaseFlowingFluid} for this fluid, which is created by the given factory, and which will be built + * and registered along with this fluid. * * @param factory - * A factory for the fluid, which accepts the properties and returns a new fluid + * A factory for the fluid, which accepts the properties and returns a new fluid * @return this {@link FluidBuilder} */ public FluidBuilder source(NonNullFunction factory) { @@ -387,12 +410,14 @@ public FluidBuilder source(NonNullFunction defaultBlock() { if (this.defaultBlock != null) { @@ -403,7 +428,8 @@ public FluidBuilder defaultBlock() { } /** - * Create a standard {@link LiquidBlock} for this fluid, and return the builder for it so that further customization can be done. + * Create a standard {@link LiquidBlock} for this fluid, and return the builder for it so that further customization + * can be done. * * @return the {@link BlockBuilder} for the {@link LiquidBlock} */ @@ -412,12 +438,13 @@ public BlockBuilder> block() { } /** - * Create a {@link LiquidBlock} for this fluid, which is created by the given factory, and return the builder for it so that further customization can be done. + * Create a {@link LiquidBlock} for this fluid, which is created by the given factory, and return the builder for it + * so that further customization can be done. * * @param - * The type of the block + * The type of the block * @param factory - * A factory for the block, which accepts the block object and properties and returns a new block + * A factory for the block, which accepts the block object and properties and returns a new block * @return the {@link BlockBuilder} for the {@link LiquidBlock} */ public BlockBuilder> block(NonNullBiFunction factory) { @@ -428,9 +455,9 @@ public BlockBuilder> block(NonNull final NonNullSupplier supplier = asSupplier(); final var lightLevel = Lazy.of(() -> fluidType.get().getLightLevel()); final ToIntFunction lightLevelInt = $ -> lightLevel.get(); - final var ret = getOwner().>block(this, sourceName, p -> factory.apply(supplier.get(), p)) - .properties(p -> BlockBehaviour.Properties.ofFullCopy(Blocks.WATER).noLootTable()) - .properties(p -> p.lightLevel(lightLevelInt)) + final var ret = getOwner().>block(this, sourceName, p -> factory.apply(supplier.get(), p)) + .properties(p -> BlockBehaviour.Properties.ofFullCopy(Blocks.WATER).noLootTable()) + .properties(p -> p.lightLevel(lightLevelInt)) .blockstate(() -> (ctx, prov) -> prov.createNonTemplateModelBlock(ctx.get())); this.fluidProperties(p -> p.block(ret.asSupplier())); return ret; @@ -446,12 +473,14 @@ public FluidBuilder noBlock() { } /** - * Create a standard {@link BucketItem} for this fluid, building it immediately, and not allowing for further configuration. + * Create a standard {@link BucketItem} for this fluid, building it immediately, and not allowing for further + * configuration. * * @return this {@link FluidBuilder} * @see #bucket() * @throws IllegalStateException - * If {@link #bucket()} or {@link #bucket(NonNullBiFunction)} has been called before this method + * If {@link #bucket()} or {@link #bucket(NonNullBiFunction)} has been called before + * this method */ public FluidBuilder defaultBucket() { if (this.defaultBucket != null) { @@ -462,7 +491,8 @@ public FluidBuilder defaultBucket() { } /** - * Create a standard {@link BucketItem} for this fluid, and return the builder for it so that further customization can be done. + * Create a standard {@link BucketItem} for this fluid, and return the builder for it so that further customization + * can be done. * * @return the {@link ItemBuilder} for the {@link BucketItem} */ @@ -471,12 +501,14 @@ public ItemBuilder> bucket() { } /** - * Create a {@link BucketItem} for this fluid, which is created by the given factory, and return the builder for it so that further customization can be done. + * Create a {@link BucketItem} for this fluid, which is created by the given factory, and return the builder for it + * so that further customization can be done. * * @param - * The type of the bucket item + * The type of the bucket item * @param factory - * A factory for the bucket item, which accepts the fluid object supplier and properties and returns a new item + * A factory for the bucket item, which accepts the fluid object supplier and properties and returns + * a new item * @return the {@link ItemBuilder} for the {@link BucketItem} */ public ItemBuilder> bucket(NonNullBiFunction factory) { @@ -490,7 +522,7 @@ public ItemBuilder> bucket(NonNullB throw new IllegalStateException("Cannot create a bucket before creating a source block"); } final var ret = getOwner().>item(this, bucketName, p -> factory.apply(source.get(), p)) - .properties(p -> p.craftRemainder(Items.BUCKET).stacksTo(1)) + .properties(p -> p.craftRemainder(Items.BUCKET).stacksTo(1)) .model(() -> (ctx, prov) -> prov.generateFlatItem(ctx.get(), ModelTemplates.FLAT_ITEM)); this.fluidProperties(p -> p.bucket(ret.asSupplier())); return ret; @@ -509,7 +541,7 @@ public FluidBuilder noBucket() { * Assign {@link TagKey}{@code s} to this fluid and its source fluid. Multiple calls will add additional tags. * * @param tags - * The tags to assign + * The tags to assign * @return this {@link FluidBuilder} */ @SafeVarargs @@ -517,7 +549,7 @@ public final FluidBuilder tag(TagKey... tags) { FluidBuilder ret = this.tag(ProviderType.FLUID_TAGS, tags); if (this.tags.isEmpty()) { ret.getOwner()., Fluid>setDataGenerator(ret.sourceName, getRegistryKey(), ProviderType.FLUID_TAGS, - prov -> this.tags.stream().map(prov::tag).forEach(p -> p.add(getSource()))); + prov -> this.tags.stream().map(prov::tag).forEach(p -> p.add(getSource()))); } this.tags.addAll(Arrays.asList(tags)); return ret; @@ -527,7 +559,7 @@ public final FluidBuilder tag(TagKey... tags) { * Remove {@link TagKey}{@code s} from this fluid and its source fluid. Multiple calls will remove additional tags. * * @param tags - * The tags to remove + * The tags to remove * @return this {@link FluidBuilder} */ @SafeVarargs @@ -563,7 +595,7 @@ private FluidType.Properties makeTypeProperties() { properties.descriptionId(block.get().get().getDescriptionId()); setData(ProviderType.LANG, NonNullBiConsumer.noop()); } else { - properties.descriptionId(Util.makeDescriptionId("fluid", ResourceLocation.fromNamespaceAndPath(getOwner().getModid(), sourceName))); + properties.descriptionId(Util.makeDescriptionId("fluid", Identifier.fromNamespaceAndPath(getOwner().getModid(), sourceName))); } return properties; @@ -617,25 +649,23 @@ protected RegistryEntry createEntryWrapper(DeferredHolder de return new FluidEntry<>(getOwner(), delegate); } - public static class DefaultFluidTypeExtension implements IClientFluidTypeExtensions { - - private final ResourceLocation stillTexture,flowingTexture; + public static class DefaultFluidTypeExtension implements IClientFluidTypeExtensions { - public DefaultFluidTypeExtension(ResourceLocation stillTexture, ResourceLocation flowingTexture) { - this.stillTexture = stillTexture; - this.flowingTexture = flowingTexture; - } + private final Identifier stillTexture, flowingTexture; - @Override - public ResourceLocation getStillTexture() { - return stillTexture; - } - - @Override - public ResourceLocation getFlowingTexture() { - return flowingTexture; - } + public DefaultFluidTypeExtension(Identifier stillTexture, Identifier flowingTexture) { + this.stillTexture = stillTexture; + this.flowingTexture = flowingTexture; + } - } + @Override + public Identifier getStillTexture() { + return stillTexture; + } + @Override + public Identifier getFlowingTexture() { + return flowingTexture; + } + } } diff --git a/src/main/java/com/tterrag/registrate/builders/ItemBuilder.java b/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java similarity index 73% rename from src/main/java/com/tterrag/registrate/builders/ItemBuilder.java rename to src/main/java/com/modularmc/registrate/builders/ItemBuilder.java index 9a637f0..a29c9fe 100644 --- a/src/main/java/com/tterrag/registrate/builders/ItemBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java @@ -1,22 +1,22 @@ -package com.tterrag.registrate.builders; +package com.modularmc.registrate.builders; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.DataGenContext; +import com.modularmc.registrate.providers.GeneratorType; +import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.RegistrateLangProvider; +import com.modularmc.registrate.providers.generators.RegistrateItemModelGenerator; +import com.modularmc.registrate.providers.generators.RegistrateRecipeProvider; +import com.modularmc.registrate.util.CreativeModeTabModifier; +import com.modularmc.registrate.util.OneTimeEventReceiver; +import com.modularmc.registrate.util.RegistrateDistExecutor; +import com.modularmc.registrate.util.entry.ItemEntry; +import com.modularmc.registrate.util.entry.RegistryEntry; +import com.modularmc.registrate.util.nullness.NonNullBiConsumer; +import com.modularmc.registrate.util.nullness.NonNullFunction; +import com.modularmc.registrate.util.nullness.NonNullSupplier; +import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; -import com.google.common.collect.Maps; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.providers.GeneratorType; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.providers.RegistrateLangProvider; -import com.tterrag.registrate.providers.generators.RegistrateItemModelGenerator; -import com.tterrag.registrate.providers.generators.RegistrateRecipeProvider; -import com.tterrag.registrate.util.CreativeModeTabModifier; -import com.tterrag.registrate.util.OneTimeEventReceiver; -import com.tterrag.registrate.util.RegistrateDistExecutor; -import com.tterrag.registrate.util.entry.ItemEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; -import com.tterrag.registrate.util.nullness.NonNullBiConsumer; -import com.tterrag.registrate.util.nullness.NonNullFunction; -import com.tterrag.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; import net.minecraft.client.data.models.model.ModelTemplates; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; @@ -31,14 +31,18 @@ import net.neoforged.neoforge.registries.datamaps.builtin.FurnaceFuel; import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps; -import javax.annotation.Nullable; +import com.google.common.collect.Maps; + import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; +import javax.annotation.Nullable; + /** - * A builder for items, allows for customization of the {@link Item.Properties} and configuration of data associated with items (models, recipes, etc.). + * A builder for items, allows for customization of the {@link Item.Properties} and configuration of data associated + * with items (models, recipes, etc.). * * @param * The type of item being built @@ -48,7 +52,8 @@ public class ItemBuilder extends AbstractBuilder> { /** - * Create a new {@link ItemBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link ItemBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that + * alternate initialization strategies can be done in subclasses. *

    * The item will be assigned the following data: *

      @@ -57,19 +62,19 @@ public class ItemBuilder extends AbstractBuilder * * @param - * The type of the builder + * The type of the builder * @param

      - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the item + * Factory to create the item * @return A new {@link ItemBuilder} with reasonable default data generators. */ public static ItemBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { @@ -95,13 +100,14 @@ protected ItemBuilder(AbstractRegistrate owner, P parent, String name, Builde } /** - * Modify the properties of the item. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform + * Modify the properties of the item. Modifications are done lazily, but the passed function is composed with the + * current one, and as such this method can be called multiple times to perform * different operations. *

      * If a different properties instance is returned, it will replace the existing one entirely. * * @param func - * The action to perform on the properties + * The action to perform on the properties * @return this {@link ItemBuilder} */ public ItemBuilder properties(NonNullUnaryOperator func) { @@ -110,10 +116,11 @@ public ItemBuilder properties(NonNullUnaryOperator func) } /** - * Replace the initial state of the item properties, without replacing or removing any modifications done via {@link #properties(NonNullUnaryOperator)}. + * Replace the initial state of the item properties, without replacing or removing any modifications done via + * {@link #properties(NonNullUnaryOperator)}. * * @param properties - * A supplier to to create the initial properties + * A supplier to to create the initial properties * @return this {@link ItemBuilder} */ public ItemBuilder initialProperties(NonNullSupplier properties) { @@ -122,17 +129,21 @@ public ItemBuilder initialProperties(NonNullSupplier prop } /** - * Sets a tab modifier for the given tab which can be used to define custom logic for how the item stack is created and/or added to the tab. + * Sets a tab modifier for the given tab which can be used to define custom logic for how the item stack is created + * and/or added to the tab. * *

      - * CreativeModeTab registration is delegated off until the item has been finalized and registered to the {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
      - * This means you can call this method as many times as you like during the build process with no added side effects. + * CreativeModeTab registration is delegated off until the item has been finalized and registered to the + * {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
      + * This means you can call this method as many times as you like during the build process with no added side + * effects. *

      * Calling this method with different {@link ResourceKey tab keys} will add the modifier to all the specified tabs. *

      - * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier for that tab. + * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier + * for that tab. * - * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for + * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for * @param modifier A {@link Consumer consumer} accepting a {@link CreativeModeTabModifier} used to update the tab * @return This builder * @deprecated Use {@link #tab(ResourceKey, NonNullBiConsumer)} which provides access to the registered item. @@ -143,30 +154,39 @@ public ItemBuilder tab(ResourceKey tab, Consumer - * CreativeModeTab registration is delegated off until the item has been finalized and registered to the {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
      - * This means you can call this method as many times as you like during the build process with no added side effects. + * CreativeModeTab registration is delegated off until the item has been finalized and registered to the + * {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
      + * This means you can call this method as many times as you like during the build process with no added side + * effects. *

      * Calling this method with different {@link ResourceKey tab keys} will add the modifier to all the specified tabs. *

      - * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier for that tab. + * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier + * for that tab. * - * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for - * @param modifier A {@link NonNullBiConsumer consumer} accepting a context object and {@link CreativeModeTabModifier} used to update the tab + * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for + * @param modifier A {@link NonNullBiConsumer consumer} accepting a context object and + * {@link CreativeModeTabModifier} used to update the tab * @return This builder */ public ItemBuilder tab(ResourceKey tab, NonNullBiConsumer, CreativeModeTabModifier> modifier) { - creativeModeTabs.put(tab, modifier); // Should we get the current value in the map [if one exists] and .andThen() the 2 together? right now we replace any consumer that currently exists + creativeModeTabs.put(tab, modifier); // Should we get the current value in the map [if one exists] and + // .andThen() the 2 together? right now we replace any consumer that + // currently exists return this; } /** * Adds the item built from this builder into the given CreativeModeTab using the default ItemStack instance. *

      - * CreativeModeTab registration is delegated off until the item has been finalized and registered to the {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
      - * This means you can call this method as many times as you like during the build process with no added side effects. + * CreativeModeTab registration is delegated off until the item has been finalized and registered to the + * {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
      + * This means you can call this method as many times as you like during the build process with no added side + * effects. *

      * Calling this method with different {@link ResourceKey tab keys} will add the item to all the specified tabs. *

      @@ -206,7 +226,7 @@ public ItemBuilder defaultModel() { * Configure the model for this item. * * @param cons - * The callback which will be invoked during data creation + * The callback which will be invoked during data creation * @return this {@link ItemBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -216,7 +236,9 @@ public ItemBuilder model(NonNullSupplier defaultLang() { * Set the translation for this item. * * @param name - * A localized English name + * A localized English name * @return this {@link ItemBuilder} */ public ItemBuilder lang(String name) { @@ -240,7 +262,7 @@ public ItemBuilder lang(String name) { * Configure the recipe(s) for this item. * * @param cons - * The callback which will be invoked during data generation. + * The callback which will be invoked during data generation. * @return this {@link ItemBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -250,6 +272,7 @@ public ItemBuilder recipe(NonNullBiConsumer, Regis /** * Add burn time for the item + * * @param tick time in ticks for this item to burn in furnace. */ public ItemBuilder burnTime(int tick) { @@ -258,6 +281,7 @@ public ItemBuilder burnTime(int tick) { /** * Add compost chance for the item + * * @param chance chance for composter to increase one level when composting this item. */ public ItemBuilder compostable(float chance) { @@ -268,10 +292,11 @@ public ItemBuilder compostable(float chance) { private Function>> clientExtensionFunc; /** - * Register a client extension for this item. The {@link IClientItemExtensions} instance can be shared across many items. + * Register a client extension for this item. The {@link IClientItemExtensions} instance can be shared across many + * items. * * @param clientExtension - * The client extension to register for this item + * The client extension to register for this item * @return this {@link ItemBuilder} */ public ItemBuilder clientExtension(NonNullSupplier> clientExtension) { @@ -304,7 +329,7 @@ protected void registerClientExtension() { * Assign {@link TagKey}{@code s} to this item. Multiple calls will add additional tags. * * @param tags - * The tag to assign + * The tag to assign * @return this {@link ItemBuilder} */ @SafeVarargs diff --git a/src/main/java/com/tterrag/registrate/builders/MenuBuilder.java b/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java similarity index 82% rename from src/main/java/com/tterrag/registrate/builders/MenuBuilder.java rename to src/main/java/com/modularmc/registrate/builders/MenuBuilder.java index 5fcbe60..6997bbe 100644 --- a/src/main/java/com/tterrag/registrate/builders/MenuBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java @@ -1,19 +1,16 @@ -package com.tterrag.registrate.builders; +package com.modularmc.registrate.builders; -import javax.annotation.Nullable; - -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.util.OneTimeEventReceiver; -import com.tterrag.registrate.util.RegistrateDistExecutor; -import com.tterrag.registrate.util.entry.MenuEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; -import com.tterrag.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.util.nullness.NonnullType; +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.util.OneTimeEventReceiver; +import com.modularmc.registrate.util.RegistrateDistExecutor; +import com.modularmc.registrate.util.entry.MenuEntry; +import com.modularmc.registrate.util.entry.RegistryEntry; +import com.modularmc.registrate.util.nullness.NonNullSupplier; +import com.modularmc.registrate.util.nullness.NonnullType; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.MenuAccess; import net.minecraft.core.registries.Registries; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; @@ -24,10 +21,12 @@ import net.neoforged.neoforge.common.extensions.IMenuTypeExtension; import net.neoforged.neoforge.registries.DeferredHolder; -public class MenuBuilder, P> extends AbstractBuilder, MenuType, P, MenuBuilder> { - +import javax.annotation.Nullable; + +public class MenuBuilder, P> extends AbstractBuilder, MenuType, P, MenuBuilder> { + public interface MenuFactory { - + T create(MenuType type, int windowId, Inventory inv); } @@ -35,12 +34,12 @@ public interface ForgeMenuFactory { T create(MenuType type, int windowId, Inventory inv, @Nullable RegistryFriendlyByteBuf buffer); } - + public interface ScreenFactory> { - + T create(M menu, Inventory inv, Component displayName); } - + private final ForgeMenuFactory factory; private final NonNullSupplier> screenFactory; diff --git a/src/main/java/com/tterrag/registrate/builders/NoConfigBuilder.java b/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java similarity index 73% rename from src/main/java/com/tterrag/registrate/builders/NoConfigBuilder.java rename to src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java index 02275d7..1df7c4a 100644 --- a/src/main/java/com/tterrag/registrate/builders/NoConfigBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java @@ -1,14 +1,14 @@ -package com.tterrag.registrate.builders; +package com.modularmc.registrate.builders; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.util.nullness.NonnullType; +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.util.nullness.NonNullSupplier; +import com.modularmc.registrate.util.nullness.NonnullType; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; public class NoConfigBuilder extends AbstractBuilder> { - + private final NonNullSupplier factory; public NoConfigBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, ResourceKey> registryType, NonNullSupplier factory) { diff --git a/src/main/java/com/modularmc/registrate/builders/package-info.java b/src/main/java/com/modularmc/registrate/builders/package-info.java new file mode 100644 index 0000000..21c061b --- /dev/null +++ b/src/main/java/com/modularmc/registrate/builders/package-info.java @@ -0,0 +1,8 @@ +@javax.annotation.ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.modularmc.registrate.builders; + +import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; + +import com.mojang.logging.annotations.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/modularmc/registrate/package-info.java b/src/main/java/com/modularmc/registrate/package-info.java new file mode 100644 index 0000000..0bce9dd --- /dev/null +++ b/src/main/java/com/modularmc/registrate/package-info.java @@ -0,0 +1,10 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.modularmc.registrate; + +import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; + +import com.mojang.logging.annotations.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/tterrag/registrate/providers/DataGenContext.java b/src/main/java/com/modularmc/registrate/providers/DataGenContext.java similarity index 70% rename from src/main/java/com/tterrag/registrate/providers/DataGenContext.java rename to src/main/java/com/modularmc/registrate/providers/DataGenContext.java index 0381c00..6d496d5 100644 --- a/src/main/java/com/tterrag/registrate/providers/DataGenContext.java +++ b/src/main/java/com/modularmc/registrate/providers/DataGenContext.java @@ -1,19 +1,21 @@ -package com.tterrag.registrate.providers; +package com.modularmc.registrate.providers; -import com.tterrag.registrate.builders.Builder; -import com.tterrag.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.util.nullness.NonnullType; +import com.modularmc.registrate.builders.Builder; +import com.modularmc.registrate.util.nullness.NonNullSupplier; +import com.modularmc.registrate.util.nullness.NonnullType; + +import net.minecraft.core.Registry; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; import lombok.AccessLevel; import lombok.Getter; import lombok.Value; import lombok.experimental.Delegate; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; /** - * A context bean passed to data generator callbacks. Contains the entry that data is being created for, and some metadata about the entry. + * A context bean passed to data generator callbacks. Contains the entry that data is being created for, and some + * metadata about the entry. * * @param * Type of the registry to which the entry belongs @@ -27,7 +29,7 @@ public class DataGenContext implements NonNullSupplier { @Delegate NonNullSupplier entry; String name; - ResourceLocation id; + Identifier id; @SuppressWarnings("null") public @NonnullType E getEntry() { @@ -38,9 +40,9 @@ public class DataGenContext implements NonNullSupplier { public static DataGenContext from(Builder builder, ResourceKey> type) { return from(builder); } - + public static DataGenContext from(Builder builder) { return new DataGenContext<>(NonNullSupplier.of(builder.getOwner().get(builder.getName(), builder.getRegistryKey())), builder.getName(), - ResourceLocation.fromNamespaceAndPath(builder.getOwner().getModid(), builder.getName())); + Identifier.fromNamespaceAndPath(builder.getOwner().getModid(), builder.getName())); } } diff --git a/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java b/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java new file mode 100644 index 0000000..ef6c7d0 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java @@ -0,0 +1,57 @@ +package com.modularmc.registrate.providers; + +import net.minecraft.core.Registry; +import net.minecraft.core.RegistrySetBuilder; +import net.minecraft.resources.ResourceKey; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.Nullable; + +public class DataProviderInitializer { + + private final RegistrySetBuilder datapackEntryProvider = new RegistrySetBuilder(); + + private final Map, ProviderType> providerDependencies = new ConcurrentHashMap<>(); + + public DataProviderInitializer() { + addDependency(ProviderType.ITEM_TAGS, ProviderType.BLOCK_TAGS); + } + + protected RegistrySetBuilder getDatapackRegistryProviders() { + return datapackEntryProvider; + } + + protected List getSortedProviders() { + List ans = new ArrayList<>(); + Set> added = new HashSet<>(); + List>> remain = new ArrayList<>(RegistrateDataProvider.TYPES.entrySet()); + while (!remain.isEmpty()) { + if (!remain.removeIf(e -> { + ProviderType type = e.getValue(); + var parent = providerDependencies.get(type); + if (parent == null || added.contains(parent)) { + ans.add(new Sorted(e.getKey(), type, parent)); + added.add(type); + return true; + } + return false; + })) throw new IllegalStateException("Looping dependency detected: " + remain); + } + return ans; + } + + public void add(ResourceKey> registry, RegistrySetBuilder.RegistryBootstrap provider) { + datapackEntryProvider.add(registry, provider); + } + + public void addDependency(ProviderType dependent, ProviderType parent) { + var old = providerDependencies.put(dependent, parent); + if (old != null) throw new IllegalStateException("Providers can have only 1 prerequisite"); + } + + public record Sorted( + String id, ProviderType type, + @Nullable ProviderType parent) {} +} diff --git a/src/main/java/com/modularmc/registrate/providers/GeneratorType.java b/src/main/java/com/modularmc/registrate/providers/GeneratorType.java new file mode 100644 index 0000000..f75a249 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/GeneratorType.java @@ -0,0 +1,3 @@ +package com.modularmc.registrate.providers; + +public interface GeneratorType {} diff --git a/src/main/java/com/tterrag/registrate/providers/ProviderType.java b/src/main/java/com/modularmc/registrate/providers/ProviderType.java similarity index 88% rename from src/main/java/com/tterrag/registrate/providers/ProviderType.java rename to src/main/java/com/modularmc/registrate/providers/ProviderType.java index 94fe903..1f1b908 100644 --- a/src/main/java/com/tterrag/registrate/providers/ProviderType.java +++ b/src/main/java/com/modularmc/registrate/providers/ProviderType.java @@ -1,10 +1,15 @@ -package com.tterrag.registrate.providers; +package com.modularmc.registrate.providers; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.generators.RegistrateBlockModelGenerator; +import com.modularmc.registrate.providers.generators.RegistrateItemModelGenerator; +import com.modularmc.registrate.providers.generators.RegistrateModelProvider; +import com.modularmc.registrate.providers.generators.RegistrateRecipeProvider; +import com.modularmc.registrate.providers.generators.RegistrateRecipeRunner; +import com.modularmc.registrate.providers.loot.RegistrateLootTableProvider; +import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; +import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.generators.*; -import com.tterrag.registrate.providers.loot.RegistrateLootTableProvider; -import com.tterrag.registrate.util.nullness.FieldsAreNonnullByDefault; -import com.tterrag.registrate.util.nullness.NonNullSupplier; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; @@ -18,19 +23,22 @@ import net.neoforged.neoforge.data.event.GatherDataEvent; import net.neoforged.neoforge.data.loading.DatagenModLoader; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; +import com.tterrag.registrate.providers.generators.*; + import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.function.Function; +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + /** * Represents a type of data that can be generated, and specifies a factory for the provider. *

      * Used as a key for data generator callbacks. *

      - * This file also defines the built-in provider types, but third-party types can be created with {@link #registerProvider(String, ProviderType)}. + * This file also defines the built-in provider types, but third-party types can be created with + * {@link #registerProvider(String, ProviderType)}. * * @param The type of the provider */ @@ -51,7 +59,7 @@ public interface ProviderType extends GeneratorTyp ProviderType ITEM_TAGS = registerTag("tags/item", Registries.ITEM, c -> new RegistrateItemTagsProvider(c.parent(), c.type(), "items", c.output(), c.provider(), c.get(BLOCK_TAGS).contentsGetter())); ProviderType> FLUID_TAGS = registerIntrinsicTag("tags/fluid", "fluids", Registries.FLUID, fluid -> fluid.builtInRegistryHolder().key()); ProviderType>> ENTITY_TAGS = registerIntrinsicTag("tags/entity", "entity_types", Registries.ENTITY_TYPE, entityType -> entityType.builtInRegistryHolder().key()); - ProviderType GENERIC_SERVER = registerProvider("registrate_generic_server_provider", c -> new RegistrateGenericProvider(c.parent(), c.event(), LogicalSide.SERVER, c.type())); + ProviderType GENERIC_SERVER = registerProvider("registrate_generic_server_provider", c -> new RegistrateGenericProvider(c.parent(), c.event(), LogicalSide.SERVER, c.type())); // CLIENT DATA ProviderType MODEL = registerClientProvider("model", () -> c -> new RegistrateModelProvider(c.parent(), c.output())); @@ -71,14 +79,14 @@ record Context(ProviderType type, AbstractRegis public R get(ProviderType other) { return (R) existing().get(other); } - } T create(Context context); default GeneratorType createGenerator(String type) { return new GeneratorType<>() { - public String toString(){ + + public String toString() { return type; } }; @@ -96,7 +104,6 @@ default T create(Context context) { default ProviderType asProvider() { return this; } - } @Nonnull @@ -141,5 +148,4 @@ static ProviderType> registerDynamicTag(Strin static T create(ProviderType type, AbstractRegistrate parent, GatherDataEvent event, Map, RegistrateProvider> existing, CompletableFuture provider) { return type.create(new Context<>(type, parent, event, existing, event.getGenerator().getPackOutput(), provider)); } - } diff --git a/src/main/java/com/tterrag/registrate/providers/RegistrateAdvancementProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java similarity index 88% rename from src/main/java/com/tterrag/registrate/providers/RegistrateAdvancementProvider.java rename to src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java index b00b712..a161778 100644 --- a/src/main/java/com/tterrag/registrate/providers/RegistrateAdvancementProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java @@ -1,121 +1,123 @@ -package com.tterrag.registrate.providers; - -import com.google.common.collect.Lists; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.tterrag.registrate.AbstractRegistrate; -import lombok.Getter; -import lombok.extern.log4j.Log4j2; - -import net.minecraft.advancements.Advancement; -import net.minecraft.advancements.AdvancementHolder; -import net.minecraft.core.Holder; -import net.minecraft.core.HolderLookup; -import net.minecraft.data.CachedOutput; -import net.minecraft.data.DataProvider; -import net.minecraft.data.PackOutput; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.neoforged.fml.LogicalSide; -import net.neoforged.neoforge.common.conditions.ICondition; -import net.neoforged.neoforge.common.conditions.WithConditions; - -import javax.annotation.Nullable; -import java.nio.file.Path; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; - -@Log4j2 -public class RegistrateAdvancementProvider implements RegistrateProvider, Consumer { - - private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().create(); - - private final AbstractRegistrate owner; - private final PackOutput packOutput; - private final CompletableFuture registriesLookup; - private final List> advancementsToSave = Lists.newArrayList(); - @Getter - private HolderLookup.Provider provider; - - public RegistrateAdvancementProvider(AbstractRegistrate owner, PackOutput packOutputIn, CompletableFuture registriesLookupIn) { - this.owner = owner; - this.packOutput = packOutputIn; - this.registriesLookup = registriesLookupIn; - } - - public Holder resolve(ResourceKey key) { - return provider.lookupOrThrow(key.registryKey()).getOrThrow(key); - } - - @Override - public LogicalSide getSide() { - return LogicalSide.SERVER; - } - - public MutableComponent title(String category, String name, String title) { - return owner.addLang("advancements", ResourceLocation.fromNamespaceAndPath(category, name), "title", title); - } - - public MutableComponent desc(String category, String name, String desc) { - return owner.addLang("advancements", ResourceLocation.fromNamespaceAndPath(category, name), "description", desc); - } - - private @Nullable CachedOutput cache; - private Set seenAdvancements = new HashSet<>(); - - @Override - public CompletableFuture run(CachedOutput cache) { - return registriesLookup.thenCompose(lookup -> { - this.provider = lookup; - advancementsToSave.clear(); - - try { - this.cache = cache; - this.seenAdvancements.clear(); - owner.genData(ProviderType.ADVANCEMENT, this); - } finally { - this.cache = null; - } - - return CompletableFuture.allOf(advancementsToSave.toArray(CompletableFuture[]::new)); - }); - } - - @Override - public void accept(@Nullable AdvancementHolder holder) { - withConditions(holder, List.of()); - } - - public void withConditions(@Nullable AdvancementHolder holder, List conditions) { - this.registriesLookup.thenAccept(lookup -> { - CachedOutput cache = this.cache; - if (cache == null) { - throw new IllegalStateException("Cannot accept advancements outside of act"); - } - Objects.requireNonNull(holder, "Cannot accept a null advancement"); - Path path = getPath(this.packOutput.getOutputFolder(), holder); - if (!seenAdvancements.add(holder.id())) { - throw new IllegalStateException("Duplicate advancement " + holder.id()); - } else if (conditions.isEmpty()) { - advancementsToSave.add(DataProvider.saveStable(cache, lookup, Advancement.CODEC, holder.value(), path)); - } else { - advancementsToSave.add(DataProvider.saveStable(cache, lookup, Advancement.CONDITIONAL_CODEC, - Optional.of(new WithConditions<>(conditions, holder.value())), path)); - } - }); - } - - private static Path getPath(Path pathIn, AdvancementHolder advancementIn) { - return pathIn.resolve("data/" + advancementIn.id().getNamespace() + "/advancement/" + advancementIn.id().getPath() + ".json"); - } - - public String getName() { - return "Advancements"; - } -} +package com.modularmc.registrate.providers; + +import com.modularmc.registrate.AbstractRegistrate; + +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.neoforged.fml.LogicalSide; +import net.neoforged.neoforge.common.conditions.ICondition; +import net.neoforged.neoforge.common.conditions.WithConditions; + +import com.google.common.collect.Lists; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import lombok.Getter; +import lombok.extern.log4j.Log4j2; + +import java.nio.file.Path; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; + +import javax.annotation.Nullable; + +@Log4j2 +public class RegistrateAdvancementProvider implements RegistrateProvider, Consumer { + + private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().create(); + + private final AbstractRegistrate owner; + private final PackOutput packOutput; + private final CompletableFuture registriesLookup; + private final List> advancementsToSave = Lists.newArrayList(); + @Getter + private HolderLookup.Provider provider; + + public RegistrateAdvancementProvider(AbstractRegistrate owner, PackOutput packOutputIn, CompletableFuture registriesLookupIn) { + this.owner = owner; + this.packOutput = packOutputIn; + this.registriesLookup = registriesLookupIn; + } + + public Holder resolve(ResourceKey key) { + return provider.lookupOrThrow(key.registryKey()).getOrThrow(key); + } + + @Override + public LogicalSide getSide() { + return LogicalSide.SERVER; + } + + public MutableComponent title(String category, String name, String title) { + return owner.addLang("advancements", Identifier.fromNamespaceAndPath(category, name), "title", title); + } + + public MutableComponent desc(String category, String name, String desc) { + return owner.addLang("advancements", Identifier.fromNamespaceAndPath(category, name), "description", desc); + } + + private @Nullable CachedOutput cache; + private Set seenAdvancements = new HashSet<>(); + + @Override + public CompletableFuture run(CachedOutput cache) { + return registriesLookup.thenCompose(lookup -> { + this.provider = lookup; + advancementsToSave.clear(); + + try { + this.cache = cache; + this.seenAdvancements.clear(); + owner.genData(ProviderType.ADVANCEMENT, this); + } finally { + this.cache = null; + } + + return CompletableFuture.allOf(advancementsToSave.toArray(CompletableFuture[]::new)); + }); + } + + @Override + public void accept(@Nullable AdvancementHolder holder) { + withConditions(holder, List.of()); + } + + public void withConditions(@Nullable AdvancementHolder holder, List conditions) { + this.registriesLookup.thenAccept(lookup -> { + CachedOutput cache = this.cache; + if (cache == null) { + throw new IllegalStateException("Cannot accept advancements outside of act"); + } + Objects.requireNonNull(holder, "Cannot accept a null advancement"); + Path path = getPath(this.packOutput.getOutputFolder(), holder); + if (!seenAdvancements.add(holder.id())) { + throw new IllegalStateException("Duplicate advancement " + holder.id()); + } else if (conditions.isEmpty()) { + advancementsToSave.add(DataProvider.saveStable(cache, lookup, Advancement.CODEC, holder.value(), path)); + } else { + advancementsToSave.add(DataProvider.saveStable(cache, lookup, Advancement.CONDITIONAL_CODEC, + Optional.of(new WithConditions<>(conditions, holder.value())), path)); + } + }); + } + + private static Path getPath(Path pathIn, AdvancementHolder advancementIn) { + return pathIn.resolve("data/" + advancementIn.id().getNamespace() + "/advancement/" + advancementIn.id().getPath() + ".json"); + } + + public String getName() { + return "Advancements"; + } +} diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java new file mode 100644 index 0000000..d37e0e4 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java @@ -0,0 +1,47 @@ +package com.modularmc.registrate.providers; + +import com.modularmc.registrate.AbstractRegistrate; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.neoforged.fml.LogicalSide; +import net.neoforged.neoforge.common.data.DataMapProvider; + +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +public class RegistrateDataMapProvider extends DataMapProvider implements RegistrateProvider { + + private final AbstractRegistrate parent; + + @Nullable + private HolderLookup.Provider provider; + + protected RegistrateDataMapProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture pvd) { + super(output, pvd); + this.parent = parent; + } + + @Override + public LogicalSide getSide() { + return LogicalSide.SERVER; + } + + /** + * Generate data map entries. + * + * @param provider + */ + @Override + protected void gather(HolderLookup.Provider provider) { + this.provider = provider; + parent.genData(ProviderType.DATA_MAP, this); + this.provider = null; + } + + public HolderLookup.Provider getProvider() { + if (provider == null) throw new IllegalStateException("Holder Lookup Provider is not available now"); + return provider; + } +} diff --git a/src/main/java/com/tterrag/registrate/providers/RegistrateDataProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java similarity index 79% rename from src/main/java/com/tterrag/registrate/providers/RegistrateDataProvider.java rename to src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java index 2376bc2..727aca5 100644 --- a/src/main/java/com/tterrag/registrate/providers/RegistrateDataProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java @@ -1,12 +1,9 @@ -package com.tterrag.registrate.providers; +package com.modularmc.registrate.providers; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.util.DebugMarkers; +import com.modularmc.registrate.util.nullness.NonnullType; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import com.google.common.collect.Lists; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.util.DebugMarkers; -import com.tterrag.registrate.util.nullness.NonnullType; -import lombok.extern.log4j.Log4j2; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.data.CachedOutput; @@ -14,7 +11,11 @@ import net.minecraft.resources.ResourceKey; import net.neoforged.neoforge.data.event.GatherDataEvent; -import javax.annotation.Nullable; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.Lists; +import lombok.extern.log4j.Log4j2; + import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -23,6 +24,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import javax.annotation.Nullable; + @Log4j2 public class RegistrateDataProvider implements DataProvider { @@ -48,31 +51,31 @@ public RegistrateDataProvider(AbstractRegistrate parent, String modid, Gather // For now, generate everything together /* - EnumSet sides = EnumSet.noneOf(LogicalSide.class); - if (event.includeServer()) { - sides.add(LogicalSide.SERVER); - } - if (event.includeClient()) { - sides.add(LogicalSide.CLIENT); - } - */ - - //log.debug(DebugMarkers.DATA, "Gathering providers for sides: {}", sides); + * EnumSet sides = EnumSet.noneOf(LogicalSide.class); + * if (event.includeServer()) { + * sides.add(LogicalSide.SERVER); + * } + * if (event.includeClient()) { + * sides.add(LogicalSide.CLIENT); + * } + */ + + // log.debug(DebugMarkers.DATA, "Gathering providers for sides: {}", sides); log.debug(DebugMarkers.DATA, "Gathering providers"); Map, RegistrateProvider> known = new HashMap<>(); - for (DataProviderInitializer.Sorted sorted :parent.getDataGenInitializer().getSortedProviders()) { + for (DataProviderInitializer.Sorted sorted : parent.getDataGenInitializer().getSortedProviders()) { ProviderType type = sorted.type(); var lookup = registriesLookup; if (sorted.parent() != null) lookup = ((RegistrateLookupFillerProvider) known.get(sorted.parent())).getFilledProvider(); RegistrateProvider prov = ProviderType.create(type, parent, event, known, lookup); if (prov instanceof RegistrateTagsProvider tagsProvider && TAG_TYPES.get(tagsProvider.registry()) != type) { - throw new IllegalStateException("Tag providers must be registered through ProviderType::registerTag"); + throw new IllegalStateException("Tag providers must be registered through ProviderType::registerTag"); } known.put(type, prov); // if (sides.contains(prov.getSide())) { - log.debug(DebugMarkers.DATA, "Adding provider for type: {}", sorted.id()); - subProviders.put(type, prov); - //} + log.debug(DebugMarkers.DATA, "Adding provider for type: {}", sorted.id()); + subProviders.put(type, prov); + // } } } @@ -84,7 +87,7 @@ public CompletableFuture run(CachedOutput cache) { for (Map.Entry<@NonnullType ProviderType, RegistrateProvider> e : subProviders.entrySet()) { log.debug(DebugMarkers.DATA, "Generating data for type: {}", getTypeName(e.getKey())); list.add(e.getValue().run(cache)); - }; + } ; return CompletableFuture.allOf(list.toArray(CompletableFuture[]::new)); }); @@ -105,5 +108,4 @@ public

      Optional

      getSubProvider(GeneratorType

      type) { public void putSubProvider(GeneratorType type, T gen) { subGenerators.put(type, gen); } - } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java new file mode 100644 index 0000000..66953c9 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java @@ -0,0 +1,29 @@ +package com.modularmc.registrate.providers; + +import com.modularmc.registrate.AbstractRegistrate; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.registries.RegistryPatchGenerator; +import net.neoforged.fml.LogicalSide; +import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; + +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +public class RegistrateDatapackProvider extends DatapackBuiltinEntriesProvider implements RegistrateLookupFillerProvider { + + public RegistrateDatapackProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture provider) { + super(output, RegistryPatchGenerator.createLookup(provider, parent.getDataGenInitializer().getDatapackRegistryProviders()), Set.of(parent.getModid())); + } + + @Override + public CompletableFuture getFilledProvider() { + return getRegistryProvider(); + } + + @Override + public LogicalSide getSide() { + return LogicalSide.SERVER; + } +} diff --git a/src/main/java/com/tterrag/registrate/providers/RegistrateGenericProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java similarity index 79% rename from src/main/java/com/tterrag/registrate/providers/RegistrateGenericProvider.java rename to src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java index d884356..87e2721 100644 --- a/src/main/java/com/tterrag/registrate/providers/RegistrateGenericProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java @@ -1,12 +1,14 @@ -package com.tterrag.registrate.providers; +package com.modularmc.registrate.providers; + +import com.modularmc.registrate.AbstractRegistrate; -import com.tterrag.registrate.AbstractRegistrate; import net.minecraft.core.HolderLookup; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.data.event.GatherDataEvent; + import org.apache.commons.compress.utils.Lists; import org.jetbrains.annotations.ApiStatus; @@ -14,8 +16,8 @@ import java.util.Locale; import java.util.concurrent.CompletableFuture; -public final class RegistrateGenericProvider implements RegistrateProvider -{ +public final class RegistrateGenericProvider implements RegistrateProvider { + private final AbstractRegistrate registrate; private final PackOutput output; private final CompletableFuture registries; @@ -24,8 +26,7 @@ public final class RegistrateGenericProvider implements RegistrateProvider private final List generators = Lists.newArrayList(); @ApiStatus.Internal - RegistrateGenericProvider(AbstractRegistrate registrate, GatherDataEvent event, LogicalSide side, ProviderType providerType) - { + RegistrateGenericProvider(AbstractRegistrate registrate, GatherDataEvent event, LogicalSide side, ProviderType providerType) { this.registrate = registrate; this.side = side; this.providerType = providerType; @@ -34,21 +35,18 @@ public final class RegistrateGenericProvider implements RegistrateProvider registries = event.getLookupProvider(); } - public RegistrateGenericProvider add(Generator generator) - { + public RegistrateGenericProvider add(Generator generator) { generators.add(generator); return this; } @Override - public LogicalSide getSide() - { + public LogicalSide getSide() { return side; } @Override - public CompletableFuture run(CachedOutput cache) - { + public CompletableFuture run(CachedOutput cache) { generators.clear(); var data = new GeneratorData(output, registries); registrate.genData(providerType, this); @@ -56,22 +54,19 @@ public CompletableFuture run(CachedOutput cache) .stream() .map(generator -> generator.generate(data)) .map(provider -> provider.run(cache)) - .toArray(CompletableFuture[]::new) - ); + .toArray(CompletableFuture[]::new)); } @Override - public String getName() - { + public String getName() { return "generic_%s_provider".formatted(side.name().toLowerCase(Locale.ROOT)); } - public record GeneratorData(PackOutput output, CompletableFuture registries) { - } + public record GeneratorData(PackOutput output, CompletableFuture registries) {} @FunctionalInterface - public interface Generator - { + public interface Generator { + DataProvider generate(GeneratorData data); } } diff --git a/src/main/java/com/tterrag/registrate/providers/RegistrateItemTagsProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java similarity index 95% rename from src/main/java/com/tterrag/registrate/providers/RegistrateItemTagsProvider.java rename to src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java index 2d7fd6b..63bcdab 100644 --- a/src/main/java/com/tterrag/registrate/providers/RegistrateItemTagsProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java @@ -1,6 +1,7 @@ -package com.tterrag.registrate.providers; +package com.modularmc.registrate.providers; + +import com.modularmc.registrate.AbstractRegistrate; -import com.tterrag.registrate.AbstractRegistrate; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; diff --git a/src/main/java/com/tterrag/registrate/providers/RegistrateLangProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java similarity index 87% rename from src/main/java/com/tterrag/registrate/providers/RegistrateLangProvider.java rename to src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java index 1def8ba..4ad73c0 100644 --- a/src/main/java/com/tterrag/registrate/providers/RegistrateLangProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java @@ -1,8 +1,9 @@ -package com.tterrag.registrate.providers; +package com.modularmc.registrate.providers; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.util.nullness.NonNullSupplier; +import com.modularmc.registrate.util.nullness.NonnullType; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.util.nullness.NonnullType; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; @@ -17,15 +18,17 @@ import net.minecraft.world.level.block.Block; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.data.LanguageProvider; + import org.apache.commons.lang3.StringUtils; -import javax.annotation.Nullable; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; +import javax.annotation.Nullable; + public class RegistrateLangProvider extends LanguageProvider implements RegistrateProvider { private static class AccessibleLanguageProvider extends LanguageProvider { @@ -74,7 +77,7 @@ public static final String toEnglishName(String internalName) { .collect(Collectors.joining(" ")); } - @SuppressWarnings({"unchecked", "ConstantConditions"}) + @SuppressWarnings({ "unchecked", "ConstantConditions" }) public String getAutomaticName(NonNullSupplier sup, ResourceKey> registry) { return toEnglishName(((Registry>) BuiltInRegistries.REGISTRY).getValue(registry.location()).getKey(sup.get()).getPath()); } @@ -129,14 +132,14 @@ public void addEntityType(NonNullSupplier> entity) { private static final String NORMAL_CHARS = /* lowercase */ "abcdefghijklmn\u00F1opqrstuvwxyz" + - /* uppercase */ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + - /* numbers */ "0123456789" + - /* special */ "_,;.?!/\\'"; + /* uppercase */ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + /* numbers */ "0123456789" + + /* special */ "_,;.?!/\\'"; private static final String UPSIDE_DOWN_CHARS = /* lowercase */ "\u0250q\u0254p\u01DD\u025Fb\u0265\u0131\u0638\u029E\u05DF\u026Fuuodb\u0279s\u0287n\u028C\u028Dx\u028Ez" + - /* uppercase */ "\u2C6F\u15FA\u0186\u15E1\u018E\u2132\u2141HI\u017F\u029E\uA780WNO\u0500\u1F49\u1D1AS\u27D8\u2229\u039BMX\u028EZ" + - /* numbers */ "0\u0196\u1105\u0190\u3123\u03DB9\u312586" + - /* special */ "\u203E'\u061B\u02D9\u00BF\u00A1/\\,"; + /* uppercase */ "\u2C6F\u15FA\u0186\u15E1\u018E\u2132\u2141HI\u017F\u029E\uA780WNO\u0500\u1F49\u1D1AS\u27D8\u2229\u039BMX\u028EZ" + + /* numbers */ "0\u0196\u1105\u0190\u3123\u03DB9\u312586" + + /* special */ "\u203E'\u061B\u02D9\u00BF\u00A1/\\,"; static { if (NORMAL_CHARS.length() != UPSIDE_DOWN_CHARS.length()) { @@ -150,7 +153,8 @@ private String toUpsideDown(String normal) { char c = normal.charAt(i); if (c == '%') { String fmtArg = ""; - while (Character.isDigit(c) || c == '%' || c == '$' || c == 's' || c == 'd') { // TODO this is a bit lazy + while (Character.isDigit(c) || c == '%' || c == '$' || c == 's' || c == 'd') { // TODO this is a bit + // lazy fmtArg += c; i++; c = i == normal.length() ? 0 : normal.charAt(i); diff --git a/src/main/java/com/tterrag/registrate/providers/RegistrateLookupFillerProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java similarity index 84% rename from src/main/java/com/tterrag/registrate/providers/RegistrateLookupFillerProvider.java rename to src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java index a2bec75..b62835f 100644 --- a/src/main/java/com/tterrag/registrate/providers/RegistrateLookupFillerProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java @@ -1,4 +1,4 @@ -package com.tterrag.registrate.providers; +package com.modularmc.registrate.providers; import net.minecraft.core.HolderLookup; @@ -7,5 +7,4 @@ public interface RegistrateLookupFillerProvider extends RegistrateProvider { CompletableFuture getFilledProvider(); - } diff --git a/src/main/java/com/tterrag/registrate/providers/RegistrateProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java similarity index 78% rename from src/main/java/com/tterrag/registrate/providers/RegistrateProvider.java rename to src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java index f2b7ac8..8cb40e9 100644 --- a/src/main/java/com/tterrag/registrate/providers/RegistrateProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java @@ -1,9 +1,9 @@ -package com.tterrag.registrate.providers; +package com.modularmc.registrate.providers; import net.minecraft.data.DataProvider; import net.neoforged.fml.LogicalSide; public interface RegistrateProvider extends DataProvider { - + LogicalSide getSide(); } diff --git a/src/main/java/com/tterrag/registrate/providers/RegistrateProviderDelegate.java b/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java similarity index 54% rename from src/main/java/com/tterrag/registrate/providers/RegistrateProviderDelegate.java rename to src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java index 1f5f0de..e05284c 100644 --- a/src/main/java/com/tterrag/registrate/providers/RegistrateProviderDelegate.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java @@ -1,13 +1,13 @@ -package com.tterrag.registrate.providers; +package com.modularmc.registrate.providers; import net.minecraft.data.DataProvider; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public interface RegistrateProviderDelegate extends DataProvider { - + String getName(); - - ResourceLocation getId(); - + + Identifier getId(); + T getEntry(); -} \ No newline at end of file +} diff --git a/src/main/java/com/tterrag/registrate/providers/RegistrateTagsProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java similarity index 91% rename from src/main/java/com/tterrag/registrate/providers/RegistrateTagsProvider.java rename to src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java index c77f8bc..815dbbe 100644 --- a/src/main/java/com/tterrag/registrate/providers/RegistrateTagsProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java @@ -1,6 +1,7 @@ -package com.tterrag.registrate.providers; +package com.modularmc.registrate.providers; + +import com.modularmc.registrate.AbstractRegistrate; -import com.tterrag.registrate.AbstractRegistrate; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.data.PackOutput; @@ -20,19 +21,22 @@ public interface RegistrateTagsProvider extends RegistrateLookupFillerProvide CompletableFuture> contentsGetter(); - ResourceKey> registry(); + ResourceKey> registry(); TagBuilder rawBuilder(TagKey key); interface Key extends RegistrateTagsProvider { + TagAppender, T> tag(TagKey key); } interface Intrinsic extends RegistrateTagsProvider { + TagAppender tag(TagKey key); } class Impl extends KeyTagProvider implements RegistrateTagsProvider.Key { + private final AbstractRegistrate owner; private final ProviderType> type; private final String name; @@ -76,13 +80,13 @@ public CompletableFuture getFilledProvider() { } @Override - public ResourceKey> registry() { - return registryKey; - } - - } + public ResourceKey> registry() { + return registryKey; + } + } class IntrinsicImpl extends IntrinsicHolderTagsProvider implements RegistrateTagsProvider.Intrinsic { + private final AbstractRegistrate owner; private final ProviderType> type; private final String name; @@ -125,9 +129,9 @@ public CompletableFuture getFilledProvider() { return createContentsProvider(); } - @Override - public ResourceKey> registry() { - return registryKey; - } + @Override + public ResourceKey> registry() { + return registryKey; + } } } diff --git a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateBlockModelGenerator.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java similarity index 81% rename from src/main/java/com/tterrag/registrate/providers/generators/RegistrateBlockModelGenerator.java rename to src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java index 6ba9a07..bb35608 100644 --- a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateBlockModelGenerator.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java @@ -1,7 +1,8 @@ -package com.tterrag.registrate.providers.generators; +package com.modularmc.registrate.providers.generators; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.ProviderType; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.ProviderType; import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelOutput; import net.minecraft.client.data.models.MultiVariant; @@ -18,7 +19,7 @@ import net.minecraft.client.renderer.block.model.BlockModelDefinition; import net.minecraft.client.renderer.block.model.VariantMutator; import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.ButtonBlock; import net.minecraft.world.level.block.CeilingHangingSignBlock; @@ -53,7 +54,7 @@ public class RegistrateBlockModelGenerator extends BlockModelGenerators { private final AbstractRegistrate parent; public final Map seenBlockstates = new HashMap<>(); - public RegistrateBlockModelGenerator(AbstractRegistrate parent, Consumer known, ItemModelOutput item, BiConsumer model) { + public RegistrateBlockModelGenerator(AbstractRegistrate parent, Consumer known, ItemModelOutput item, BiConsumer model) { super(known, item, model); ObfuscationReflectionHelper.>setPrivateValue(BlockModelGenerators.class, this, g -> { this.seenBlockstates.put(g.block(), g.create()); @@ -67,17 +68,16 @@ public void run() { parent.genData(ProviderType.BLOCKSTATE, this); } - - public void create(Block block, ResourceLocation model) { + public void create(Block block, Identifier model) { this.blockStateOutput.accept(createSimpleBlock(block, plainVariant(model))); } - public ResourceLocation mcLoc(String id) { - return ResourceLocation.withDefaultNamespace(id); + public Identifier mcLoc(String id) { + return Identifier.withDefaultNamespace(id); } - public ResourceLocation modLoc(String id) { - return ResourceLocation.fromNamespaceAndPath(parent.getModid(), id); + public Identifier modLoc(String id) { + return Identifier.fromNamespaceAndPath(parent.getModid(), id); } public RegistrateLegacyBlockModelBuilder withBuilder(ExtendedModelTemplateBuilder template, TextureMapping texture) { @@ -104,22 +104,22 @@ public RegistrateLegacyBlockModelBuilder withParent(TexturedModel model) { return withBuilder(ExtendedModelTemplateBuilder.of(model.getTemplate()), model.getMapping()); } - private static ExtendedModelTemplate withRenderType(ModelTemplate template, ResourceLocation renderType) { + private static ExtendedModelTemplate withRenderType(ModelTemplate template, Identifier renderType) { return ExtendedModelTemplateBuilder.of(template).renderType(renderType).build(); } - private static TextureMapping sideBottomTopTextures(ResourceLocation side, ResourceLocation bottom, ResourceLocation top) { + private static TextureMapping sideBottomTopTextures(Identifier side, Identifier bottom, Identifier top) { return new TextureMapping() .put(TextureSlot.SIDE, side) .put(TextureSlot.BOTTOM, bottom) .put(TextureSlot.TOP, top); } - public ResourceLocation blockTexture(Block block) { + public Identifier blockTexture(Block block) { return TextureMapping.getBlockTexture(block); } - public ResourceLocation blockTexture(Block block, String suffix) { + public Identifier blockTexture(Block block, String suffix) { return TextureMapping.getBlockTexture(block, suffix); } @@ -136,46 +136,44 @@ public void generateAxisBlock(RotatedPillarBlock block) { } public void generateLogBlock(RotatedPillarBlock block) { - ResourceLocation texture = blockTexture(block); + Identifier texture = blockTexture(block); generateAxisBlock(block, blockTexture(block), texture.withSuffix("_top")); } - public void generateAxisBlock(RotatedPillarBlock block, ResourceLocation baseName) { + public void generateAxisBlock(RotatedPillarBlock block, Identifier baseName) { generateAxisBlock(block, baseName.withSuffix("_side"), baseName.withSuffix("_end")); } - public void generateAxisBlock(RotatedPillarBlock block, ResourceLocation side, ResourceLocation end) { + public void generateAxisBlock(RotatedPillarBlock block, Identifier side, Identifier end) { generateAxisBlockInternal(block, side, end, ModelTemplates.CUBE_COLUMN, ModelTemplates.CUBE_COLUMN_HORIZONTAL); } - public void generateAxisBlockWithRenderType(RotatedPillarBlock block, ResourceLocation renderType) { + public void generateAxisBlockWithRenderType(RotatedPillarBlock block, Identifier renderType) { generateAxisBlockWithRenderType(block, blockTexture(block), renderType); } - public void generateLogBlockWithRenderType(RotatedPillarBlock block, ResourceLocation renderType) { - ResourceLocation texture = blockTexture(block); + public void generateLogBlockWithRenderType(RotatedPillarBlock block, Identifier renderType) { + Identifier texture = blockTexture(block); generateAxisBlockWithRenderType(block, blockTexture(block), texture.withSuffix("_top"), renderType); } - public void generateAxisBlockWithRenderType(RotatedPillarBlock block, ResourceLocation baseName, ResourceLocation renderType) { + public void generateAxisBlockWithRenderType(RotatedPillarBlock block, Identifier baseName, Identifier renderType) { generateAxisBlockWithRenderType(block, baseName.withSuffix("_side"), baseName.withSuffix("_end"), renderType); } - public void generateAxisBlockWithRenderType(RotatedPillarBlock block, ResourceLocation side, ResourceLocation end, ResourceLocation renderType) { + public void generateAxisBlockWithRenderType(RotatedPillarBlock block, Identifier side, Identifier end, Identifier renderType) { generateAxisBlockInternal( block, side, end, withRenderType(ModelTemplates.CUBE_COLUMN, renderType), - withRenderType(ModelTemplates.CUBE_COLUMN_HORIZONTAL, renderType) - ); + withRenderType(ModelTemplates.CUBE_COLUMN_HORIZONTAL, renderType)); } - private void generateAxisBlockInternal(RotatedPillarBlock block, ResourceLocation side, ResourceLocation end, ModelTemplate cubeColumn, ModelTemplate cubeColumnHorizontal) { + private void generateAxisBlockInternal(RotatedPillarBlock block, Identifier side, Identifier end, ModelTemplate cubeColumn, ModelTemplate cubeColumnHorizontal) { generateAxisBlock(block, plainVariant(cubeColumn.create(block, TextureMapping.column(side, end), modelOutput)), - plainVariant(cubeColumnHorizontal.create(block, TextureMapping.column(side, end), modelOutput)) - ); + plainVariant(cubeColumnHorizontal.create(block, TextureMapping.column(side, end), modelOutput))); } public void generateAxisBlock(RotatedPillarBlock block, MultiVariant vertical, MultiVariant horizontal) { @@ -184,7 +182,7 @@ public void generateAxisBlock(RotatedPillarBlock block, MultiVariant vertical, M private static final int DEFAULT_ANGLE_OFFSET = 180; - public void generateHorizontalBlock(Block block, ResourceLocation side, ResourceLocation front, ResourceLocation top) { + public void generateHorizontalBlock(Block block, Identifier side, Identifier front, Identifier top) { TextureMapping mapping = new TextureMapping().put(TextureSlot.SIDE, side).put(TextureSlot.FRONT, front).put(TextureSlot.TOP, top); generateHorizontalBlock(block, plainVariant(ModelTemplates.CUBE_ORIENTABLE.create(block, mapping, modelOutput))); } @@ -252,58 +250,55 @@ public void generateDirectionalBlock(Block block, MultiVariant model, int angleO blockStateOutput.accept(MultiVariantGenerator.dispatch(block, model).with(rotationFacing(angleOffsetY))); } - public void generateStairsBlock(StairBlock block, ResourceLocation texture) { + public void generateStairsBlock(StairBlock block, Identifier texture) { generateStairsBlock(block, texture, texture, texture); } - public void generateStairsBlock(StairBlock block, String name, ResourceLocation texture) { + public void generateStairsBlock(StairBlock block, String name, Identifier texture) { generateStairsBlock(block, name, texture, texture, texture); } - public void generateStairsBlock(StairBlock block, ResourceLocation side, ResourceLocation bottom, ResourceLocation top) { + public void generateStairsBlock(StairBlock block, Identifier side, Identifier bottom, Identifier top) { TextureMapping textures = sideBottomTopTextures(side, bottom, top); blockStateOutput.accept(createStairs(block, plainVariant(ModelTemplates.STAIRS_INNER.create(block, textures, modelOutput)), plainVariant(ModelTemplates.STAIRS_STRAIGHT.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.STAIRS_OUTER.create(block, textures, modelOutput)) - )); + plainVariant(ModelTemplates.STAIRS_OUTER.create(block, textures, modelOutput)))); } - public void generateStairsBlock(StairBlock block, String name, ResourceLocation side, ResourceLocation bottom, ResourceLocation top) { + public void generateStairsBlock(StairBlock block, String name, Identifier side, Identifier bottom, Identifier top) { generateStairsBlockInternal(block, modLoc(name + "_stairs"), side, bottom, top, ModelTemplates.STAIRS_STRAIGHT, ModelTemplates.STAIRS_INNER, ModelTemplates.STAIRS_OUTER); } - public void generateStairsBlockWithRenderType(StairBlock block, ResourceLocation texture, ResourceLocation renderType) { + public void generateStairsBlockWithRenderType(StairBlock block, Identifier texture, Identifier renderType) { generateStairsBlockWithRenderType(block, texture, texture, texture, renderType); } - public void generateStairsBlockWithRenderType(StairBlock block, String name, ResourceLocation texture, ResourceLocation renderType) { + public void generateStairsBlockWithRenderType(StairBlock block, String name, Identifier texture, Identifier renderType) { generateStairsBlockWithRenderType(block, name, texture, texture, texture, renderType); } - public void generateStairsBlockWithRenderType(StairBlock block, ResourceLocation side, ResourceLocation bottom, ResourceLocation top, ResourceLocation renderType) { + public void generateStairsBlockWithRenderType(StairBlock block, Identifier side, Identifier bottom, Identifier top, Identifier renderType) { TextureMapping textures = sideBottomTopTextures(side, bottom, top); blockStateOutput.accept(createStairs(block, plainVariant(withRenderType(ModelTemplates.STAIRS_INNER, renderType).create(block, textures, modelOutput)), plainVariant(withRenderType(ModelTemplates.STAIRS_STRAIGHT, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(ModelTemplates.STAIRS_OUTER, renderType).create(block, textures, modelOutput)) - )); + plainVariant(withRenderType(ModelTemplates.STAIRS_OUTER, renderType).create(block, textures, modelOutput)))); } - public void generateStairsBlockWithRenderType(StairBlock block, String name, ResourceLocation side, ResourceLocation bottom, ResourceLocation top, ResourceLocation renderType) { + public void generateStairsBlockWithRenderType(StairBlock block, String name, Identifier side, Identifier bottom, Identifier top, Identifier renderType) { generateStairsBlockInternalWithRenderType(block, modLoc(name + "_stairs"), side, bottom, top, renderType); } - private void generateStairsBlockInternalWithRenderType(StairBlock block, ResourceLocation baseName, ResourceLocation side, ResourceLocation bottom, ResourceLocation top, ResourceLocation renderType) { + private void generateStairsBlockInternalWithRenderType(StairBlock block, Identifier baseName, Identifier side, Identifier bottom, Identifier top, Identifier renderType) { generateStairsBlockInternal(block, baseName, side, bottom, top, withRenderType(ModelTemplates.STAIRS_STRAIGHT, renderType), withRenderType(ModelTemplates.STAIRS_INNER, renderType), - withRenderType(ModelTemplates.STAIRS_OUTER, renderType) - ); + withRenderType(ModelTemplates.STAIRS_OUTER, renderType)); } - private void generateStairsBlockInternal(StairBlock block, ResourceLocation baseName, ResourceLocation side, ResourceLocation bottom, ResourceLocation top, ModelTemplate straightTemplate, ModelTemplate innerTemplate, ModelTemplate outerTemplate) { - ResourceLocation modelLocation = baseName.withPrefix("block/"); + private void generateStairsBlockInternal(StairBlock block, Identifier baseName, Identifier side, Identifier bottom, Identifier top, ModelTemplate straightTemplate, ModelTemplate innerTemplate, ModelTemplate outerTemplate) { + Identifier modelLocation = baseName.withPrefix("block/"); TextureMapping textures = sideBottomTopTextures(side, bottom, top); MultiVariant straightVariant = plainVariant(straightTemplate.create(modelLocation, textures, modelOutput)); MultiVariant innerVariant = plainVariant(innerTemplate.create(modelLocation.withSuffix("_inner"), textures, modelOutput)); @@ -315,11 +310,11 @@ public void generateStairsBlock(StairBlock block, MultiVariant stairs, MultiVari blockStateOutput.accept(createStairs(block, stairsInner, stairs, stairsOuter)); } - public void generateSlabBlock(SlabBlock block, MultiVariant doubleSlab, ResourceLocation texture) { + public void generateSlabBlock(SlabBlock block, MultiVariant doubleSlab, Identifier texture) { generateSlabBlock(block, doubleSlab, texture, texture, texture); } - public void generateSlabBlock(SlabBlock block, MultiVariant doubleSlab, ResourceLocation side, ResourceLocation bottom, ResourceLocation top) { + public void generateSlabBlock(SlabBlock block, MultiVariant doubleSlab, Identifier side, Identifier bottom, Identifier top) { TextureMapping textures = sideBottomTopTextures(side, bottom, top); MultiVariant slabTop = plainVariant(ModelTemplates.SLAB_TOP.create(block, textures, modelOutput)); MultiVariant slabBottom = plainVariant(ModelTemplates.SLAB_BOTTOM.create(block, textures, modelOutput)); @@ -330,7 +325,7 @@ public void generateSlabBlock(SlabBlock block, MultiVariant bottom, MultiVariant blockStateOutput.accept(createSlab(block, bottom, top, doubleslab)); } - public void generateButtonBlock(ButtonBlock block, ResourceLocation texture) { + public void generateButtonBlock(ButtonBlock block, Identifier texture) { TextureMapping textures = TextureMapping.defaultTexture(texture); MultiVariant button = plainVariant(ModelTemplates.BUTTON.create(block, textures, modelOutput)); MultiVariant buttonPressed = plainVariant(ModelTemplates.BUTTON_PRESSED.create(block, textures, modelOutput)); @@ -341,7 +336,7 @@ public void generateButtonBlock(ButtonBlock block, MultiVariant button, MultiVar blockStateOutput.accept(createButton(block, button, buttonPressed)); } - public void generatePressurePlateBlock(PressurePlateBlock block, ResourceLocation texture) { + public void generatePressurePlateBlock(PressurePlateBlock block, Identifier texture) { TextureMapping textures = TextureMapping.defaultTexture(texture); MultiVariant pressurePlate = plainVariant(ModelTemplates.PRESSURE_PLATE_UP.create(block, textures, modelOutput)); MultiVariant pressurePlateDown = plainVariant(ModelTemplates.PRESSURE_PLATE_DOWN.create(block, textures, modelOutput)); @@ -352,7 +347,7 @@ public void generatePressurePlateBlock(PressurePlateBlock block, MultiVariant pr blockStateOutput.accept(createPressurePlate(block, pressurePlate, pressurePlateDown)); } - public void generateSignBlock(StandingSignBlock signBlock, WallSignBlock wallSignBlock, ResourceLocation texture) { + public void generateSignBlock(StandingSignBlock signBlock, WallSignBlock wallSignBlock, Identifier texture) { MultiVariant sign = plainVariant(ModelTemplates.PARTICLE_ONLY.create(signBlock, TextureMapping.particle(texture), modelOutput)); generateSignBlock(signBlock, wallSignBlock, sign); } @@ -362,7 +357,7 @@ public void generateSignBlock(StandingSignBlock signBlock, WallSignBlock wallSig blockStateOutput.accept(createSimpleBlock(wallSignBlock, sign)); } - public void generateHangingSignBlock(CeilingHangingSignBlock hangingSignBlock, WallHangingSignBlock wallHangingSignBlock, ResourceLocation texture) { + public void generateHangingSignBlock(CeilingHangingSignBlock hangingSignBlock, WallHangingSignBlock wallHangingSignBlock, Identifier texture) { MultiVariant hangingSign = plainVariant(ModelTemplates.PARTICLE_ONLY.create(hangingSignBlock, TextureMapping.particle(texture), modelOutput)); generateHangingSignBlock(hangingSignBlock, wallHangingSignBlock, hangingSign); } @@ -393,73 +388,68 @@ public void generateFourWayMultipart(MultiPartGenerator builder, MultiVariant si blockStateOutput.accept(builder); } - public void generateFenceBlock(FenceBlock block, ResourceLocation texture) { + public void generateFenceBlock(FenceBlock block, Identifier texture) { generateFenceBlockInternal(block, texture, ModelTemplates.FENCE_POST, ModelTemplates.FENCE_SIDE); } - public void generateFenceBlock(FenceBlock block, String name, ResourceLocation texture) { + public void generateFenceBlock(FenceBlock block, String name, Identifier texture) { generateFenceBlockInternal(block, name, texture, ModelTemplates.FENCE_POST, ModelTemplates.FENCE_SIDE); } - public void generateFenceBlockWithRenderType(FenceBlock block, ResourceLocation texture, ResourceLocation renderType) { + public void generateFenceBlockWithRenderType(FenceBlock block, Identifier texture, Identifier renderType) { generateFenceBlockInternal(block, texture, withRenderType(ModelTemplates.FENCE_POST, renderType), withRenderType(ModelTemplates.FENCE_SIDE, renderType)); } - public void generateFenceBlockWithRenderType(FenceBlock block, String name, ResourceLocation texture, ResourceLocation renderType) { + public void generateFenceBlockWithRenderType(FenceBlock block, String name, Identifier texture, Identifier renderType) { generateFenceBlockInternal(block, name, texture, withRenderType(ModelTemplates.FENCE_POST, renderType), withRenderType(ModelTemplates.FENCE_SIDE, renderType)); } - private void generateFenceBlockInternal(FenceBlock block, ResourceLocation texture, ModelTemplate fencePostTemplate, ModelTemplate fenceSideTemplate) { + private void generateFenceBlockInternal(FenceBlock block, Identifier texture, ModelTemplate fencePostTemplate, ModelTemplate fenceSideTemplate) { TextureMapping textures = TextureMapping.defaultTexture(texture); generateFourWayBlock(block, plainVariant(fencePostTemplate.create(block, textures, modelOutput)), - plainVariant(fenceSideTemplate.create(block, textures, modelOutput)) - ); + plainVariant(fenceSideTemplate.create(block, textures, modelOutput))); } - private void generateFenceBlockInternal(FenceBlock block, String name, ResourceLocation texture, ModelTemplate fencePostTemplate, ModelTemplate fenceSideTemplate) { + private void generateFenceBlockInternal(FenceBlock block, String name, Identifier texture, ModelTemplate fencePostTemplate, ModelTemplate fenceSideTemplate) { TextureMapping textures = TextureMapping.defaultTexture(texture); generateFourWayBlock(block, plainVariant(fencePostTemplate.create(modLoc("block/" + name + "_fence_post"), textures, modelOutput)), - plainVariant(fenceSideTemplate.create(modLoc("block/" + name + "_fence_side"), textures, modelOutput)) - ); + plainVariant(fenceSideTemplate.create(modLoc("block/" + name + "_fence_side"), textures, modelOutput))); } - public void generateFenceGateBlock(FenceGateBlock block, ResourceLocation texture) { + public void generateFenceGateBlock(FenceGateBlock block, Identifier texture) { TextureMapping textures = TextureMapping.defaultTexture(texture); generateFenceGateBlock(block, plainVariant(ModelTemplates.FENCE_GATE_CLOSED.create(block, textures, modelOutput)), plainVariant(ModelTemplates.FENCE_GATE_OPEN.create(block, textures, modelOutput)), plainVariant(ModelTemplates.FENCE_GATE_WALL_CLOSED.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.FENCE_GATE_WALL_OPEN.create(block, textures, modelOutput)) - ); + plainVariant(ModelTemplates.FENCE_GATE_WALL_OPEN.create(block, textures, modelOutput))); } - public void generateFenceGateBlock(FenceGateBlock block, String name, ResourceLocation texture) { + public void generateFenceGateBlock(FenceGateBlock block, String name, Identifier texture) { generateFenceGateBlockInternal(block, modLoc(name + "_fence_gate"), texture, ModelTemplates.FENCE_GATE_CLOSED, ModelTemplates.FENCE_GATE_OPEN, ModelTemplates.FENCE_GATE_WALL_CLOSED, ModelTemplates.FENCE_GATE_WALL_OPEN); } - public void generateFenceGateBlockWithRenderType(FenceGateBlock block, ResourceLocation texture, ResourceLocation renderType) { + public void generateFenceGateBlockWithRenderType(FenceGateBlock block, Identifier texture, Identifier renderType) { TextureMapping textureMapping = TextureMapping.defaultTexture(texture); generateFenceGateBlock(block, plainVariant(withRenderType(ModelTemplates.FENCE_GATE_CLOSED, renderType).create(block, textureMapping, modelOutput)), plainVariant(withRenderType(ModelTemplates.FENCE_GATE_OPEN, renderType).create(block, textureMapping, modelOutput)), plainVariant(withRenderType(ModelTemplates.FENCE_GATE_WALL_CLOSED, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.FENCE_GATE_WALL_OPEN, renderType).create(block, textureMapping, modelOutput)) - ); + plainVariant(withRenderType(ModelTemplates.FENCE_GATE_WALL_OPEN, renderType).create(block, textureMapping, modelOutput))); } - public void generateFenceGateBlockWithRenderType(FenceGateBlock block, String name, ResourceLocation texture, ResourceLocation renderType) { + public void generateFenceGateBlockWithRenderType(FenceGateBlock block, String name, Identifier texture, Identifier renderType) { generateFenceGateBlockInternal(block, modLoc(name + "_fence_gate"), texture, withRenderType(ModelTemplates.FENCE_GATE_CLOSED, renderType), withRenderType(ModelTemplates.FENCE_GATE_OPEN, renderType), withRenderType(ModelTemplates.FENCE_GATE_WALL_CLOSED, renderType), - withRenderType(ModelTemplates.FENCE_GATE_WALL_OPEN, renderType) - ); + withRenderType(ModelTemplates.FENCE_GATE_WALL_OPEN, renderType)); } - private void generateFenceGateBlockInternal(FenceGateBlock block, ResourceLocation baseName, ResourceLocation texture, ModelTemplate closedTemplate, ModelTemplate openTemplate, ModelTemplate wallClosedTemplate, ModelTemplate wallOpenTemplate) { - ResourceLocation baseModel = baseName.withPrefix("block/"); + private void generateFenceGateBlockInternal(FenceGateBlock block, Identifier baseName, Identifier texture, ModelTemplate closedTemplate, ModelTemplate openTemplate, ModelTemplate wallClosedTemplate, ModelTemplate wallOpenTemplate) { + Identifier baseModel = baseName.withPrefix("block/"); TextureMapping textures = TextureMapping.defaultTexture(texture); MultiVariant gate = plainVariant(closedTemplate.create(baseModel, textures, modelOutput)); MultiVariant gateOpen = plainVariant(openTemplate.create(baseModel.withSuffix("_open"), textures, modelOutput)); @@ -472,100 +462,92 @@ public void generateFenceGateBlock(FenceGateBlock block, MultiVariant gate, Mult blockStateOutput.accept(createFenceGate(block, gateOpen, gate, gateWallOpen, gateWall, true)); } - public void generateWallBlock(WallBlock block, ResourceLocation texture) { + public void generateWallBlock(WallBlock block, Identifier texture) { TextureMapping textures = TextureMapping.singleSlot(TextureSlot.WALL, texture); blockStateOutput.accept(createWall(block, plainVariant(ModelTemplates.WALL_POST.create(block, textures, modelOutput)), plainVariant(ModelTemplates.WALL_LOW_SIDE.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.WALL_TALL_SIDE.create(block, textures, modelOutput)) - )); + plainVariant(ModelTemplates.WALL_TALL_SIDE.create(block, textures, modelOutput)))); } - public void generateWallBlock(WallBlock block, String name, ResourceLocation texture) { - ResourceLocation baseName = modLoc(name + "_wall"); + public void generateWallBlock(WallBlock block, String name, Identifier texture) { + Identifier baseName = modLoc(name + "_wall"); generateWallBlockInternal(block, baseName, texture, ModelTemplates.WALL_POST, ModelTemplates.WALL_LOW_SIDE, ModelTemplates.WALL_TALL_SIDE); } - public void generateWallBlockWithRenderType(WallBlock block, ResourceLocation texture, ResourceLocation renderType) { + public void generateWallBlockWithRenderType(WallBlock block, Identifier texture, Identifier renderType) { TextureMapping textureMapping = TextureMapping.singleSlot(TextureSlot.WALL, texture); generateWallBlock(block, plainVariant(withRenderType(ModelTemplates.WALL_POST, renderType).create(block, textureMapping, modelOutput)), plainVariant(withRenderType(ModelTemplates.WALL_LOW_SIDE, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.WALL_TALL_SIDE, renderType).create(block, textureMapping, modelOutput)) - ); + plainVariant(withRenderType(ModelTemplates.WALL_TALL_SIDE, renderType).create(block, textureMapping, modelOutput))); } - public void generateWallBlockWithRenderType(WallBlock block, String name, ResourceLocation texture, ResourceLocation renderType) { - ResourceLocation baseName = modLoc(name + "_wall"); + public void generateWallBlockWithRenderType(WallBlock block, String name, Identifier texture, Identifier renderType) { + Identifier baseName = modLoc(name + "_wall"); generateWallBlockInternal(block, baseName, texture, withRenderType(ModelTemplates.WALL_POST, renderType), withRenderType(ModelTemplates.WALL_LOW_SIDE, renderType), - withRenderType(ModelTemplates.WALL_TALL_SIDE, renderType) - ); + withRenderType(ModelTemplates.WALL_TALL_SIDE, renderType)); } - private void generateWallBlockInternal(WallBlock block, ResourceLocation baseName, ResourceLocation texture, ModelTemplate postTemplate, ModelTemplate sideTemplate, ModelTemplate tallSideTemplate) { + private void generateWallBlockInternal(WallBlock block, Identifier baseName, Identifier texture, ModelTemplate postTemplate, ModelTemplate sideTemplate, ModelTemplate tallSideTemplate) { TextureMapping textures = TextureMapping.singleSlot(TextureSlot.WALL, texture); - ResourceLocation baseModel = baseName.withPrefix("block/"); + Identifier baseModel = baseName.withPrefix("block/"); generateWallBlock(block, plainVariant(postTemplate.create(baseModel.withSuffix("_post"), textures, modelOutput)), plainVariant(sideTemplate.create(baseModel.withSuffix("_side"), textures, modelOutput)), - plainVariant(tallSideTemplate.create(baseModel.withSuffix("_side_tall"), textures, modelOutput)) - ); + plainVariant(tallSideTemplate.create(baseModel.withSuffix("_side_tall"), textures, modelOutput))); } public void generateWallBlock(WallBlock block, MultiVariant post, MultiVariant side, MultiVariant sideTall) { blockStateOutput.accept(createWall(block, post, side, sideTall)); } - public void generatePaneBlock(IronBarsBlock block, ResourceLocation pane, ResourceLocation edge) { + public void generatePaneBlock(IronBarsBlock block, Identifier pane, Identifier edge) { TextureMapping textures = new TextureMapping().put(TextureSlot.PANE, pane).put(TextureSlot.EDGE, edge); generatePaneBlock(block, plainVariant(ModelTemplates.STAINED_GLASS_PANE_POST.create(block, textures, modelOutput)), plainVariant(ModelTemplates.STAINED_GLASS_PANE_SIDE.create(block, textures, modelOutput)), plainVariant(ModelTemplates.STAINED_GLASS_PANE_SIDE_ALT.create(block, textures, modelOutput)), plainVariant(ModelTemplates.STAINED_GLASS_PANE_NOSIDE.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT.create(block, textures, modelOutput)) - ); + plainVariant(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT.create(block, textures, modelOutput))); } - public void generatePaneBlock(IronBarsBlock block, String name, ResourceLocation pane, ResourceLocation edge) { - ResourceLocation baseName = modLoc(name + "_pane"); + public void generatePaneBlock(IronBarsBlock block, String name, Identifier pane, Identifier edge) { + Identifier baseName = modLoc(name + "_pane"); generatePaneBlockInternal(block, baseName, pane, edge, ModelTemplates.STAINED_GLASS_PANE_POST, ModelTemplates.STAINED_GLASS_PANE_SIDE, ModelTemplates.STAINED_GLASS_PANE_SIDE_ALT, ModelTemplates.STAINED_GLASS_PANE_NOSIDE, ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT); } - public void generatePaneBlockWithRenderType(IronBarsBlock block, ResourceLocation pane, ResourceLocation edge, ResourceLocation renderType) { + public void generatePaneBlockWithRenderType(IronBarsBlock block, Identifier pane, Identifier edge, Identifier renderType) { TextureMapping textureMapping = new TextureMapping().put(TextureSlot.PANE, pane).put(TextureSlot.EDGE, edge); generatePaneBlock(block, plainVariant(withRenderType(ModelTemplates.STAINED_GLASS_PANE_POST, renderType).create(block, textureMapping, modelOutput)), plainVariant(withRenderType(ModelTemplates.STAINED_GLASS_PANE_SIDE, renderType).create(block, textureMapping, modelOutput)), plainVariant(withRenderType(ModelTemplates.STAINED_GLASS_PANE_SIDE_ALT, renderType).create(block, textureMapping, modelOutput)), plainVariant(withRenderType(ModelTemplates.STAINED_GLASS_PANE_NOSIDE, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT, renderType).create(block, textureMapping, modelOutput)) - ); + plainVariant(withRenderType(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT, renderType).create(block, textureMapping, modelOutput))); } - public void generatePaneBlockWithRenderType(IronBarsBlock block, String name, ResourceLocation pane, ResourceLocation edge, ResourceLocation renderType) { - ResourceLocation baseName = modLoc(name + "_pane"); + public void generatePaneBlockWithRenderType(IronBarsBlock block, String name, Identifier pane, Identifier edge, Identifier renderType) { + Identifier baseName = modLoc(name + "_pane"); generatePaneBlockInternal(block, baseName, pane, edge, withRenderType(ModelTemplates.STAINED_GLASS_PANE_POST, renderType), withRenderType(ModelTemplates.STAINED_GLASS_PANE_SIDE, renderType), withRenderType(ModelTemplates.STAINED_GLASS_PANE_SIDE_ALT, renderType), withRenderType(ModelTemplates.STAINED_GLASS_PANE_NOSIDE, renderType), - withRenderType(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT, renderType) - ); + withRenderType(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT, renderType)); } - private void generatePaneBlockInternal(IronBarsBlock block, ResourceLocation baseName, ResourceLocation pane, ResourceLocation edge, ModelTemplate postTemplate, ModelTemplate sideTemplate, ModelTemplate sideAltTemplate, ModelTemplate noSideTemplate, ModelTemplate noSideAltTemplate) { - ResourceLocation baseModel = baseName.withPrefix("block/"); + private void generatePaneBlockInternal(IronBarsBlock block, Identifier baseName, Identifier pane, Identifier edge, ModelTemplate postTemplate, ModelTemplate sideTemplate, ModelTemplate sideAltTemplate, ModelTemplate noSideTemplate, ModelTemplate noSideAltTemplate) { + Identifier baseModel = baseName.withPrefix("block/"); TextureMapping textures = new TextureMapping().put(TextureSlot.PANE, pane).put(TextureSlot.EDGE, edge); generatePaneBlock(block, plainVariant(postTemplate.create(baseModel.withSuffix("_post"), textures, modelOutput)), plainVariant(sideTemplate.create(baseModel.withSuffix("_side"), textures, modelOutput)), plainVariant(sideAltTemplate.create(baseModel.withSuffix("_side_alt"), textures, modelOutput)), plainVariant(noSideTemplate.create(baseModel.withSuffix("_noside"), textures, modelOutput)), - plainVariant(noSideAltTemplate.create(baseModel.withSuffix("_noside_alt"), textures, modelOutput)) - ); + plainVariant(noSideAltTemplate.create(baseModel.withSuffix("_noside_alt"), textures, modelOutput))); } public void generatePaneBlock(IronBarsBlock block, MultiVariant post, MultiVariant side, MultiVariant sideAlt, MultiVariant noSide, MultiVariant noSideAlt) { @@ -578,11 +560,10 @@ public void generatePaneBlock(IronBarsBlock block, MultiVariant post, MultiVaria .with(condition().term(BlockStateProperties.NORTH, false), noSide) .with(condition().term(BlockStateProperties.EAST, false), noSideAlt) .with(condition().term(BlockStateProperties.SOUTH, false), noSideAlt.with(Y_ROT_90)) - .with(condition().term(BlockStateProperties.WEST, false), noSide.with(Y_ROT_270)) - ); + .with(condition().term(BlockStateProperties.WEST, false), noSide.with(Y_ROT_270))); } - public void generateDoorBlock(DoorBlock block, ResourceLocation bottom, ResourceLocation top) { + public void generateDoorBlock(DoorBlock block, Identifier bottom, Identifier top) { TextureMapping textures = TextureMapping.door(top, bottom); generateDoorBlock(block, plainVariant(ModelTemplates.DOOR_BOTTOM_LEFT.create(block, textures, modelOutput)), @@ -592,15 +573,14 @@ public void generateDoorBlock(DoorBlock block, ResourceLocation bottom, Resource plainVariant(ModelTemplates.DOOR_TOP_LEFT.create(block, textures, modelOutput)), plainVariant(ModelTemplates.DOOR_TOP_LEFT_OPEN.create(block, textures, modelOutput)), plainVariant(ModelTemplates.DOOR_TOP_RIGHT.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.DOOR_TOP_RIGHT_OPEN.create(block, textures, modelOutput)) - ); + plainVariant(ModelTemplates.DOOR_TOP_RIGHT_OPEN.create(block, textures, modelOutput))); } - public void generateDoorBlock(DoorBlock block, String name, ResourceLocation bottom, ResourceLocation top) { + public void generateDoorBlock(DoorBlock block, String name, Identifier bottom, Identifier top) { generateDoorBlockInternal(block, modLoc(name + "_door"), bottom, top); } - public void generateDoorBlockWithRenderType(DoorBlock block, ResourceLocation bottom, ResourceLocation top, ResourceLocation renderType) { + public void generateDoorBlockWithRenderType(DoorBlock block, Identifier bottom, Identifier top, Identifier renderType) { TextureMapping textures = TextureMapping.door(top, bottom); generateDoorBlock(block, plainVariant(withRenderType(ModelTemplates.DOOR_BOTTOM_LEFT, renderType).create(block, textures, modelOutput)), @@ -610,19 +590,18 @@ public void generateDoorBlockWithRenderType(DoorBlock block, ResourceLocation bo plainVariant(withRenderType(ModelTemplates.DOOR_TOP_LEFT, renderType).create(block, textures, modelOutput)), plainVariant(withRenderType(ModelTemplates.DOOR_TOP_LEFT_OPEN, renderType).create(block, textures, modelOutput)), plainVariant(withRenderType(ModelTemplates.DOOR_TOP_RIGHT, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(ModelTemplates.DOOR_TOP_RIGHT_OPEN, renderType).create(block, textures, modelOutput)) - ); + plainVariant(withRenderType(ModelTemplates.DOOR_TOP_RIGHT_OPEN, renderType).create(block, textures, modelOutput))); } - public void generateDoorBlockWithRenderType(DoorBlock block, String name, ResourceLocation bottom, ResourceLocation top, ResourceLocation renderType) { + public void generateDoorBlockWithRenderType(DoorBlock block, String name, Identifier bottom, Identifier top, Identifier renderType) { generateDoorBlockInternalWithRenderType(block, modLoc(name + "_door"), bottom, top, renderType); } - private void generateDoorBlockInternal(DoorBlock block, ResourceLocation baseName, ResourceLocation bottom, ResourceLocation top) { + private void generateDoorBlockInternal(DoorBlock block, Identifier baseName, Identifier bottom, Identifier top) { generateDoorBlockInternal(block, baseName, bottom, top, ModelTemplates.DOOR_BOTTOM_LEFT, ModelTemplates.DOOR_BOTTOM_LEFT_OPEN, ModelTemplates.DOOR_BOTTOM_RIGHT, ModelTemplates.DOOR_BOTTOM_RIGHT_OPEN, ModelTemplates.DOOR_TOP_LEFT, ModelTemplates.DOOR_TOP_LEFT_OPEN, ModelTemplates.DOOR_TOP_RIGHT, ModelTemplates.DOOR_TOP_RIGHT_OPEN); } - private void generateDoorBlockInternalWithRenderType(DoorBlock block, ResourceLocation baseName, ResourceLocation bottom, ResourceLocation top, ResourceLocation renderType) { + private void generateDoorBlockInternalWithRenderType(DoorBlock block, Identifier baseName, Identifier bottom, Identifier top, Identifier renderType) { generateDoorBlockInternal(block, baseName, bottom, top, withRenderType(ModelTemplates.DOOR_BOTTOM_LEFT, renderType), withRenderType(ModelTemplates.DOOR_BOTTOM_LEFT_OPEN, renderType), @@ -631,12 +610,11 @@ private void generateDoorBlockInternalWithRenderType(DoorBlock block, ResourceLo withRenderType(ModelTemplates.DOOR_TOP_LEFT, renderType), withRenderType(ModelTemplates.DOOR_TOP_LEFT_OPEN, renderType), withRenderType(ModelTemplates.DOOR_TOP_RIGHT, renderType), - withRenderType(ModelTemplates.DOOR_TOP_RIGHT_OPEN, renderType) - ); + withRenderType(ModelTemplates.DOOR_TOP_RIGHT_OPEN, renderType)); } - private void generateDoorBlockInternal(DoorBlock block, ResourceLocation baseName, ResourceLocation bottom, ResourceLocation top, ModelTemplate bottomLeftTemplate, ModelTemplate bottomLeftOpenTemplate, ModelTemplate bottomRightTemplate, ModelTemplate bottomRightOpenTemplate, ModelTemplate topLeftTemplate, ModelTemplate topLeftOpenTemplate, ModelTemplate topRightTemplate, ModelTemplate topRightOpenTemplate) { - ResourceLocation baseModel = baseName.withPrefix("block/"); + private void generateDoorBlockInternal(DoorBlock block, Identifier baseName, Identifier bottom, Identifier top, ModelTemplate bottomLeftTemplate, ModelTemplate bottomLeftOpenTemplate, ModelTemplate bottomRightTemplate, ModelTemplate bottomRightOpenTemplate, ModelTemplate topLeftTemplate, ModelTemplate topLeftOpenTemplate, ModelTemplate topRightTemplate, ModelTemplate topRightOpenTemplate) { + Identifier baseModel = baseName.withPrefix("block/"); TextureMapping textures = TextureMapping.door(top, bottom); MultiVariant bottomLeft = plainVariant(bottomLeftTemplate.create(baseModel.withSuffix("_bottom_left"), textures, modelOutput)); MultiVariant bottomLeftOpen = plainVariant(bottomLeftOpenTemplate.create(baseModel.withSuffix("_bottom_left_open"), textures, modelOutput)); @@ -653,52 +631,48 @@ public void generateDoorBlock(DoorBlock block, MultiVariant bottomLeft, MultiVar blockStateOutput.accept(createDoor(block, bottomLeft, bottomLeftOpen, bottomRight, bottomRightOpen, topLeft, topLeftOpen, topRight, topRightOpen)); } - public void generateTrapdoorBlock(TrapDoorBlock block, ResourceLocation texture, boolean orientable) { + public void generateTrapdoorBlock(TrapDoorBlock block, Identifier texture, boolean orientable) { TextureMapping textures = TextureMapping.defaultTexture(texture); generateTrapdoorBlock(block, plainVariant((orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM : ModelTemplates.TRAPDOOR_BOTTOM).create(block, textures, modelOutput)), plainVariant((orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_TOP : ModelTemplates.TRAPDOOR_TOP).create(block, textures, modelOutput)), plainVariant((orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN).create(block, textures, modelOutput)), - orientable - ); + orientable); } - public void generateTrapdoorBlock(TrapDoorBlock block, String name, ResourceLocation texture, boolean orientable) { + public void generateTrapdoorBlock(TrapDoorBlock block, String name, Identifier texture, boolean orientable) { generateTrapdoorBlockInternal(block, modLoc(name + "_trapdoor"), texture, orientable); } - public void generateTrapdoorBlockWithRenderType(TrapDoorBlock block, ResourceLocation texture, boolean orientable, ResourceLocation renderType) { + public void generateTrapdoorBlockWithRenderType(TrapDoorBlock block, Identifier texture, boolean orientable, Identifier renderType) { TextureMapping textures = TextureMapping.defaultTexture(texture); generateTrapdoorBlock(block, plainVariant(withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM : ModelTemplates.TRAPDOOR_BOTTOM, renderType).create(block, textures, modelOutput)), plainVariant(withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_TOP : ModelTemplates.TRAPDOOR_TOP, renderType).create(block, textures, modelOutput)), plainVariant(withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN, renderType).create(block, textures, modelOutput)), - orientable - ); + orientable); } - public void generateTrapdoorBlockWithRenderType(TrapDoorBlock block, String name, ResourceLocation texture, boolean orientable, ResourceLocation renderType) { + public void generateTrapdoorBlockWithRenderType(TrapDoorBlock block, String name, Identifier texture, boolean orientable, Identifier renderType) { generateTrapdoorBlockInternalWithRenderType(block, modLoc(name + "_trapdoor"), texture, orientable, renderType); } - private void generateTrapdoorBlockInternal(TrapDoorBlock block, ResourceLocation baseName, ResourceLocation texture, boolean orientable) { + private void generateTrapdoorBlockInternal(TrapDoorBlock block, Identifier baseName, Identifier texture, boolean orientable) { generateTrapdoorBlockInternal(block, baseName, texture, orientable, orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM : ModelTemplates.TRAPDOOR_BOTTOM, orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_TOP : ModelTemplates.TRAPDOOR_TOP, - orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN - ); + orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN); } - private void generateTrapdoorBlockInternalWithRenderType(TrapDoorBlock block, ResourceLocation baseName, ResourceLocation texture, boolean orientable, ResourceLocation renderType) { + private void generateTrapdoorBlockInternalWithRenderType(TrapDoorBlock block, Identifier baseName, Identifier texture, boolean orientable, Identifier renderType) { generateTrapdoorBlockInternal(block, baseName, texture, orientable, withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM : ModelTemplates.TRAPDOOR_BOTTOM, renderType), withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_TOP : ModelTemplates.TRAPDOOR_TOP, renderType), - withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN, renderType) - ); + withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN, renderType)); } - private void generateTrapdoorBlockInternal(TrapDoorBlock block, ResourceLocation baseName, ResourceLocation texture, boolean orientable, ModelTemplate bottomTemplate, ModelTemplate topTemplate, ModelTemplate openTemplate) { - ResourceLocation baseModel = baseName.withPrefix("block/"); + private void generateTrapdoorBlockInternal(TrapDoorBlock block, Identifier baseName, Identifier texture, boolean orientable, ModelTemplate bottomTemplate, ModelTemplate topTemplate, ModelTemplate openTemplate) { + Identifier baseModel = baseName.withPrefix("block/"); TextureMapping textures = TextureMapping.defaultTexture(texture); MultiVariant bottom = plainVariant(bottomTemplate.create(baseModel.withSuffix("_bottom"), textures, modelOutput)); MultiVariant top = plainVariant(topTemplate.create(baseModel.withSuffix("_top"), textures, modelOutput)); diff --git a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateItemModelGenerator.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java similarity index 73% rename from src/main/java/com/tterrag/registrate/providers/generators/RegistrateItemModelGenerator.java rename to src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java index 2d81e22..06c3874 100644 --- a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateItemModelGenerator.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java @@ -1,9 +1,10 @@ -package com.tterrag.registrate.providers.generators; +package com.modularmc.registrate.providers.generators; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.util.nullness.NonNullSupplier; +import com.modularmc.registrate.util.nullness.NonnullType; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.util.nullness.NonnullType; import net.minecraft.client.color.item.ItemTintSource; import net.minecraft.client.data.models.ItemModelGenerators; import net.minecraft.client.data.models.ItemModelOutput; @@ -14,7 +15,7 @@ import net.minecraft.client.data.models.model.ModelTemplates; import net.minecraft.client.data.models.model.TextureMapping; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; @@ -26,7 +27,7 @@ public class RegistrateItemModelGenerator extends ItemModelGenerators { private final AbstractRegistrate parent; - public RegistrateItemModelGenerator(AbstractRegistrate parent, ItemModelOutput output, BiConsumer model) { + public RegistrateItemModelGenerator(AbstractRegistrate parent, ItemModelOutput output, BiConsumer model) { super(output, model); this.parent = parent; } @@ -34,11 +35,10 @@ public RegistrateItemModelGenerator(AbstractRegistrate parent, ItemModelOutpu @Override public void run() { parent.genData(ProviderType.ITEM_MODEL, this); - //TODO check if an item actually has a valid model + // TODO check if an item actually has a valid model } - - public void createWithExistingModel(Item item, ResourceLocation id) { + public void createWithExistingModel(Item item, Identifier id) { itemModelOutput.accept(item, ItemModelUtils.plainModel(id)); } @@ -46,11 +46,11 @@ public void generateWithTemplate(Item item, ModelTemplate template, TextureMappi itemModelOutput.accept(item, ItemModelUtils.plainModel(template.create(item, textures, modelOutput))); } - public void generateFlatItem(Item item, ResourceLocation layer0) { + public void generateFlatItem(Item item, Identifier layer0) { generateFlatItem(item, ModelTemplates.FLAT_ITEM, layer0); } - public void generateFlatItem(Item item, ModelTemplate template, ResourceLocation layer0) { + public void generateFlatItem(Item item, ModelTemplate template, Identifier layer0) { itemModelOutput.accept(item, ItemModelUtils.plainModel(template.create(item, TextureMapping.layer0(layer0), modelOutput))); } @@ -62,7 +62,7 @@ public void generateFlatBlockItem(BlockItem item, String suffix) { generateFlatItem(item, TextureMapping.getBlockTexture(item.getBlock(), suffix)); } - public void generateBlockItem(BlockItem item, UnaryOperator modelMapper) { + public void generateBlockItem(BlockItem item, UnaryOperator modelMapper) { itemModelOutput.accept(item, ItemModelUtils.plainModel(modelMapper.apply(ModelLocationUtils.getModelLocation(item.getBlock())))); } @@ -70,12 +70,12 @@ public void generateBlockItem(BlockItem item, String suffix) { generateBlockItem(item, model -> model.withSuffix(suffix)); } - public ResourceLocation mcLoc(String id) { - return ResourceLocation.withDefaultNamespace(id); + public Identifier mcLoc(String id) { + return Identifier.withDefaultNamespace(id); } - public ResourceLocation modLoc(String id) { - return ResourceLocation.fromNamespaceAndPath(parent.getModid(), id); + public Identifier modLoc(String id) { + return Identifier.fromNamespaceAndPath(parent.getModid(), id); } public String modid(NonNullSupplier item) { @@ -86,7 +86,7 @@ public String name(NonNullSupplier item) { return BuiltInRegistries.ITEM.getKey(item.get().asItem()).getPath(); } - public void generateTintedModel(@NonnullType Item entry, ResourceLocation model, ItemTintSource tint) { + public void generateTintedModel(@NonnullType Item entry, Identifier model, ItemTintSource tint) { this.itemModelOutput.accept(entry, ItemModelUtils.tintedModel(model, tint)); } } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java new file mode 100644 index 0000000..230fc87 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java @@ -0,0 +1,152 @@ +package com.modularmc.registrate.providers.generators; + +import net.minecraft.client.data.models.model.ModelInstance; +import net.minecraft.client.data.models.model.TextureMapping; +import net.minecraft.client.data.models.model.TextureSlot; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.resources.Identifier; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.level.block.Block; +import net.neoforged.neoforge.client.event.RegisterNamedRenderTypesEvent; +import net.neoforged.neoforge.client.model.generators.template.CustomLoaderBuilder; +import net.neoforged.neoforge.client.model.generators.template.ExtendedModelTemplateBuilder; +import net.neoforged.neoforge.client.model.generators.template.RootTransformsBuilder; +import net.neoforged.neoforge.client.model.generators.template.TransformVecBuilder; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class RegistrateLegacyBlockModelBuilder { + + private final ExtendedModelTemplateBuilder template; + private final TextureMapping texture; + private final BiConsumer output; + + RegistrateLegacyBlockModelBuilder(BiConsumer output, ExtendedModelTemplateBuilder template, TextureMapping texture) { + this.output = output; + this.template = template; + this.texture = texture.copy(); + } + + public RegistrateLegacyBlockModelBuilder texture(TextureSlot slot, Identifier texture) { + this.template.requiredTextureSlot(slot); + this.texture.put(slot, texture); + return this; + } + + public RegistrateLegacyBlockModelBuilder transformTemplate(Consumer action) { + action.accept(template); + return this; + } + + public RegistrateLegacyBlockModelBuilder transformTexture(Consumer action) { + action.accept(texture); + return this; + } + + public Identifier build(Block block) { + return template.build().create(block, texture, output); + } + + public Identifier build(Identifier loc) { + return template.build().create(loc, texture, output); + } + + // Delegated methods from Template Builder + + /** + * Parent model which this template will inherit its properties from. + */ + public RegistrateLegacyBlockModelBuilder parent(Identifier parent) { + template.parent(parent); + return this; + } + + /** + * Suffix appended onto the models file path. + */ + public RegistrateLegacyBlockModelBuilder suffix(String suffix) { + template.suffix(suffix); + return this; + } + + /** + * Set the render type for this model. + * + * @param renderType the render type. Must be registered via + * {@link RegisterNamedRenderTypesEvent} + * @return this builder + * @throws NullPointerException if {@code renderType} is {@code null} + */ + public RegistrateLegacyBlockModelBuilder renderType(String renderType) { + template.renderType(renderType); + return this; + } + + /** + * Set the render type for this model. + * + * @param renderType the render type. Must be registered via + * {@link RegisterNamedRenderTypesEvent} + * @return this builder + * @throws NullPointerException if {@code renderType} is {@code null} + */ + public RegistrateLegacyBlockModelBuilder renderType(Identifier renderType) { + template.renderType(renderType); + return this; + } + + /** + * Begin building a new transform for the given perspective. + * + * @param type the perspective to create or return the builder for + * @return the builder for the given perspective + * @throws NullPointerException if {@code type} is {@code null} + */ + public RegistrateLegacyBlockModelBuilder transform(ItemDisplayContext type, Consumer action) { + template.transform(type, action); + return this; + } + + /** + * Sets whether or not this model should apply ambient occlusion. + */ + public RegistrateLegacyBlockModelBuilder ambientOcclusion(boolean ambientOcclusion) { + template.ambientOcclusion(ambientOcclusion); + return this; + } + + /** + * Sets the gui light style for this model. + * + *

        + *
      • {@link UnbakedModel.GuiLight#FRONT} for head on light, commonly used for items.
      • + *
      • {@link UnbakedModel.GuiLight#SIDE} for the model to be side lit, commonly used for blocks.
      • + *
      + */ + public RegistrateLegacyBlockModelBuilder guiLight(UnbakedModel.GuiLight light) { + template.guiLight(light); + return this; + } + + /** + * Use a custom loader instead of the vanilla elements. + * + * @param customLoaderFactory function that returns the custom loader to set, given this + * @return the custom loader builder + */ + public RegistrateLegacyBlockModelBuilder customLoader(Supplier customLoaderFactory, Consumer action) { + template.customLoader(customLoaderFactory, action); + return this; + } + + /** + * Modifies the transformation applied right before item display transformations and rotations specified in block + * states. + */ + public RegistrateLegacyBlockModelBuilder rootTransforms(Consumer action) { + template.rootTransforms(action); + return this; + } +} diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java new file mode 100644 index 0000000..2f03e9f --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java @@ -0,0 +1,31 @@ +package com.modularmc.registrate.providers.generators; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.RegistrateProvider; + +import net.minecraft.client.data.models.BlockModelGenerators; +import net.minecraft.client.data.models.ItemModelGenerators; +import net.minecraft.client.data.models.ModelProvider; +import net.minecraft.data.PackOutput; +import net.neoforged.fml.LogicalSide; + +public class RegistrateModelProvider extends ModelProvider implements RegistrateProvider { + + private final AbstractRegistrate parent; + + public RegistrateModelProvider(AbstractRegistrate parent, PackOutput p_388260_) { + super(p_388260_, parent.getModid()); + this.parent = parent; + } + + @Override + protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels) { + new RegistrateBlockModelGenerator(parent, blockModels.blockStateOutput, blockModels.itemModelOutput, blockModels.modelOutput).run(); + new RegistrateItemModelGenerator(parent, itemModels.itemModelOutput, itemModels.modelOutput).run(); + } + + @Override + public LogicalSide getSide() { + return LogicalSide.CLIENT; + } +} diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java new file mode 100644 index 0000000..1e548c0 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java @@ -0,0 +1,701 @@ +package com.modularmc.registrate.providers.generators; + +import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.util.DataIngredient; +import com.modularmc.registrate.util.nullness.NonNullSupplier; + +import net.minecraft.advancements.Criterion; +import net.minecraft.advancements.critereon.EnterBlockTrigger; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.ItemPredicate; +import net.minecraft.advancements.critereon.MinMaxBounds; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.BlockFamily; +import net.minecraft.data.recipes.*; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.flag.FeatureFlagSet; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.*; +import net.minecraft.world.item.equipment.trim.TrimPattern; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SuspiciousEffectHolder; +import net.neoforged.neoforge.common.Tags; + +import com.google.common.collect.ImmutableMap; +import lombok.experimental.Delegate; + +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.CheckReturnValue; +import javax.annotation.Generated; +import javax.annotation.Nullable; + +public class RegistrateRecipeProvider extends RecipeProvider implements RecipeOutput { + + private final RegistrateRecipeRunner runner; + + @Delegate + private final RecipeOutput outputDelegated; + + private final HolderLookup itemLookup; + private final HolderLookup blockLookup; + private final HolderLookup> entityLookup; + + public RegistrateRecipeProvider(RegistrateRecipeRunner runner, HolderLookup.Provider registries, RecipeOutput output) { + super(registries, output); + this.runner = runner; + this.outputDelegated = output; + itemLookup = registries.lookupOrThrow(Registries.ITEM); + blockLookup = registries.lookupOrThrow(Registries.BLOCK); + entityLookup = registries.lookupOrThrow(Registries.ENTITY_TYPE); + } + + @Override + public void buildRecipes() { + runner.provider = this; + runner.owner.genData(ProviderType.RECIPE, this); + runner.provider = null; + } + + public HolderLookup.Provider registries() { + return registries; + } + + public HolderLookup itemLookup() { + return itemLookup; + } + + public HolderLookup blockLookup() { + return blockLookup; + } + + public HolderLookup> entityLookup() { + return entityLookup; + } + + public Holder resolve(ResourceKey key) { + return registries.lookupOrThrow(key.registryKey()).getOrThrow(key); + } + + public Identifier safeId(Identifier id) { + return Identifier.fromNamespaceAndPath(runner.owner.getModid(), safeName(id)); + } + + public Identifier safeId(DataIngredient source) { + return safeId(source.getId()); + } + + public Identifier safeId(ItemLike registryEntry) { + return safeId(BuiltInRegistries.ITEM.getKey(registryEntry.asItem())); + } + + public ResourceKey> safeKey(Identifier id) { + return ResourceKey.create(Registries.RECIPE, Identifier.fromNamespaceAndPath(runner.owner.getModid(), safeName(id))); + } + + public ResourceKey> safeKey(DataIngredient source) { + return safeKey(source.getId()); + } + + public ResourceKey> safeKey(ItemLike registryEntry) { + return safeKey(BuiltInRegistries.ITEM.getKey(registryEntry.asItem())); + } + + public String safeName(Identifier id) { + return id.getPath().replace('/', '_'); + } + + public String safeName(DataIngredient source) { + return safeName(source.getId()); + } + + public String safeName(ItemLike registryEntry) { + return safeName(BuiltInRegistries.ITEM.getKey(registryEntry.asItem())); + } + + public static final int DEFAULT_SMELT_TIME = 200; + public static final int DEFAULT_BLAST_TIME = DEFAULT_SMELT_TIME / 2; + public static final int DEFAULT_SMOKE_TIME = DEFAULT_BLAST_TIME; + public static final int DEFAULT_CAMPFIRE_TIME = DEFAULT_SMELT_TIME * 3; + + private static final ImmutableMap, String> COOKING_TYPE_NAMES = ImmutableMap., String>builder() + .put(RecipeSerializer.SMELTING_RECIPE, "smelting") + .put(RecipeSerializer.BLASTING_RECIPE, "blasting") + .put(RecipeSerializer.SMOKING_RECIPE, "smoking") + .put(RecipeSerializer.CAMPFIRE_COOKING_RECIPE, "campfire") + .build(); + + public void cooking(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime, RecipeSerializer serializer, AbstractCookingRecipe.Factory factory) { + cooking(source, category, result, experience, cookingTime, COOKING_TYPE_NAMES.get(serializer), serializer, factory); + } + + public void cooking(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime, String typeName, RecipeSerializer serializer, AbstractCookingRecipe.Factory factory) { + SimpleCookingRecipeBuilder.generic(source.toVanilla(), category, result.get(), experience, cookingTime, serializer, factory) + .unlockedBy("has_" + safeName(source), source.getCriterion(this)) + .save(this, safeId(result.get()) + "_from_" + safeName(source) + "_" + typeName); + } + + public void smelting(DataIngredient source, RecipeCategory category, Supplier result, float experience) { + smelting(source, category, result, experience, DEFAULT_SMELT_TIME); + } + + public void smelting(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { + cooking(source, category, result, experience, cookingTime, RecipeSerializer.SMELTING_RECIPE, SmeltingRecipe::new); + } + + public void blasting(DataIngredient source, RecipeCategory category, Supplier result, float experience) { + blasting(source, category, result, experience, DEFAULT_BLAST_TIME); + } + + public void blasting(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { + cooking(source, category, result, experience, cookingTime, RecipeSerializer.BLASTING_RECIPE, BlastingRecipe::new); + } + + public void smoking(DataIngredient source, RecipeCategory category, Supplier result, float experience) { + smoking(source, category, result, experience, DEFAULT_SMOKE_TIME); + } + + public void smoking(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { + cooking(source, category, result, experience, cookingTime, RecipeSerializer.SMOKING_RECIPE, SmokingRecipe::new); + } + + public void campfire(DataIngredient source, RecipeCategory category, Supplier result, float experience) { + campfire(source, category, result, experience, DEFAULT_CAMPFIRE_TIME); + } + + public void campfire(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { + cooking(source, category, result, experience, cookingTime, RecipeSerializer.CAMPFIRE_COOKING_RECIPE, CampfireCookingRecipe::new); + } + + public void stonecutting(DataIngredient source, RecipeCategory category, Supplier result) { + stonecutting(source, category, result, 1); + } + + public void stonecutting(DataIngredient source, RecipeCategory category, Supplier result, int resultAmount) { + SingleItemRecipeBuilder.stonecutting(source.toVanilla(), category, result.get(), resultAmount) + .unlockedBy("has_" + safeName(source), source.getCriterion(this)) + .save(this, safeId(result.get()) + "_from_" + safeName(source) + "_stonecutting"); + } + + public void smeltingAndBlasting(DataIngredient source, RecipeCategory category, Supplier result, float xp) { + smelting(source, category, result, xp); + blasting(source, category, result, xp); + } + + public void food(DataIngredient source, RecipeCategory category, Supplier result, float xp) { + smelting(source, category, result, xp); + smoking(source, category, result, xp); + campfire(source, category, result, xp); + } + + public void square(DataIngredient source, RecipeCategory category, Supplier output, boolean small) { + ShapedRecipeBuilder builder = shaped(category, output.get()) + .define('X', source.toVanilla()); + if (small) { + builder.pattern("XX").pattern("XX"); + } else { + builder.pattern("XXX").pattern("XXX").pattern("XXX"); + } + builder.unlockedBy("has_" + safeName(source), source.getCriterion(this)) + .save(this, safeKey(output.get())); + } + + /** + * @param + * @param source + * @param output + * @deprecated Broken, use {@link #storage(NonNullSupplier, RecipeCategory, NonNullSupplier)} or + * {@link #storage(DataIngredient, RecipeCategory, NonNullSupplier, DataIngredient, NonNullSupplier)}. + */ + @Deprecated + public void storage(DataIngredient source, RecipeCategory category, NonNullSupplier output) { + square(source, category, output, false); + // This is backwards, but leaving in for binary compat + singleItemUnfinished(source, category, output, 1, 9) + .save(this, safeId(source) + "_from_" + safeName(output.get())); + } + + public void storage(NonNullSupplier source, RecipeCategory category, NonNullSupplier output) { + storage(DataIngredient.items(source), category, source, DataIngredient.items(output), output); + } + + public void storage(DataIngredient sourceIngredient, RecipeCategory category, NonNullSupplier source, DataIngredient outputIngredient, NonNullSupplier output) { + square(sourceIngredient, category, output, false); + singleItemUnfinished(outputIngredient, category, source, 1, 9) + .save(this, safeId(sourceIngredient) + "_from_" + safeName(output.get())); + } + + @CheckReturnValue + public ShapelessRecipeBuilder singleItemUnfinished(DataIngredient source, RecipeCategory category, Supplier result, int required, int amount) { + return shapeless(category, result.get(), amount) + .requires(source.toVanilla(), required) + .unlockedBy("has_" + safeName(source), source.getCriterion(this)); + } + + public void singleItem(DataIngredient source, RecipeCategory category, Supplier result, int required, int amount) { + singleItemUnfinished(source, category, result, required, amount).save(this, safeKey(result.get())); + } + + public void planks(DataIngredient source, RecipeCategory category, Supplier result) { + singleItemUnfinished(source, category, result, 1, 4) + .group("planks") + .save(this, safeKey(result.get())); + } + + public void stairs(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group, boolean stone) { + shaped(category, result.get(), 4) + .pattern("X ").pattern("XX ").pattern("XXX") + .define('X', source.toVanilla()) + .group(group) + .unlockedBy("has_" + safeName(source), source.getCriterion(this)) + .save(this, safeKey(result.get())); + if (stone) { + stonecutting(source, category, result); + } + } + + public void slab(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group, boolean stone) { + shaped(category, result.get(), 6) + .pattern("XXX") + .define('X', source.toVanilla()) + .group(group) + .unlockedBy("has_" + safeName(source), source.getCriterion(this)) + .save(this, safeKey(result.get())); + if (stone) { + stonecutting(source, category, result, 2); + } + } + + public void fence(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group) { + shaped(category, result.get(), 3) + .pattern("W#W").pattern("W#W") + .define('W', source.toVanilla()) + .define('#', Tags.Items.RODS_WOODEN) + .group(group) + .unlockedBy("has_" + safeName(source), source.getCriterion(this)) + .save(this, safeKey(result.get())); + } + + public void fenceGate(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group) { + shaped(category, result.get()) + .pattern("#W#").pattern("#W#") + .define('W', source.toVanilla()) + .define('#', Tags.Items.RODS_WOODEN) + .group(group) + .unlockedBy("has_" + safeName(source), source.getCriterion(this)) + .save(this, safeKey(result.get())); + } + + public void wall(DataIngredient source, RecipeCategory category, Supplier result) { + shaped(category, result.get(), 6) + .pattern("XXX").pattern("XXX") + .define('X', source.toVanilla()) + .unlockedBy("has_" + safeName(source), source.getCriterion(this)) + .save(this, safeKey(result.get())); + stonecutting(source, category, result); + } + + public void door(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group) { + shaped(category, result.get(), 3) + .pattern("XX").pattern("XX").pattern("XX") + .define('X', source.toVanilla()) + .group(group) + .unlockedBy("has_" + safeName(source), source.getCriterion(this)) + .save(this, safeKey(result.get())); + } + + public void trapDoor(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group) { + shaped(category, result.get(), 2) + .pattern("XXX").pattern("XXX") + .define('X', source.toVanilla()) + .group(group) + .unlockedBy("has_" + safeName(source), source.getCriterion(this)) + .save(this, safeKey(result.get())); + } + + // @formatter:off + // GENERATED START - DO NOT EDIT BELOW THIS LINE + + /** Generated override to expose protected method: {@link RecipeProvider#generateForEnabledBlockFamilies} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void generateForEnabledBlockFamilies(FeatureFlagSet enabledFeatures) { super.generateForEnabledBlockFamilies(enabledFeatures); } + + /** Generated override to expose protected method: {@link RecipeProvider#oreSmelting} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void oreSmelting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { super.oreSmelting(ingredients, category, result, experience, cookingTime, group); } + + /** Generated override to expose protected method: {@link RecipeProvider#oreBlasting} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void oreBlasting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { super.oreBlasting(ingredients, category, result, experience, cookingTime, group); } + + /** Generated override to expose protected method: {@link RecipeProvider#netheriteSmithing} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void netheriteSmithing(Item ingredientItem, RecipeCategory category, Item resultItem) { super.netheriteSmithing(ingredientItem, category, resultItem); } + + /** Generated override to expose protected method: {@link RecipeProvider#trimSmithing} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void trimSmithing(Item template, ResourceKey pattern, ResourceKey> recipe) { super.trimSmithing(template, pattern, recipe); } + + /** Generated override to expose protected method: {@link RecipeProvider#twoByTwoPacker} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void twoByTwoPacker(RecipeCategory category, ItemLike packed, ItemLike unpacked) { super.twoByTwoPacker(category, packed, unpacked); } + + /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void threeByThreePacker(RecipeCategory category, ItemLike packed, ItemLike unpacked, String criterionName) { super.threeByThreePacker(category, packed, unpacked, criterionName); } + + /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void threeByThreePacker(RecipeCategory category, ItemLike packed, ItemLike unpacked) { super.threeByThreePacker(category, packed, unpacked); } + + /** Generated override to expose protected method: {@link RecipeProvider#planksFromLog} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void planksFromLog(ItemLike planks, TagKey logs, int resultCount) { super.planksFromLog(planks, logs, resultCount); } + + /** Generated override to expose protected method: {@link RecipeProvider#planksFromLogs} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void planksFromLogs(ItemLike planks, TagKey logs, int result) { super.planksFromLogs(planks, logs, result); } + + /** Generated override to expose protected method: {@link RecipeProvider#woodFromLogs} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void woodFromLogs(ItemLike wood, ItemLike log) { super.woodFromLogs(wood, log); } + + /** Generated override to expose protected method: {@link RecipeProvider#woodenBoat} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void woodenBoat(ItemLike boat, ItemLike material) { super.woodenBoat(boat, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#chestBoat} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void chestBoat(ItemLike boat, ItemLike material) { super.chestBoat(boat, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#buttonBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public RecipeBuilder buttonBuilder(ItemLike button, Ingredient material) { return super.buttonBuilder(button, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#doorBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public RecipeBuilder doorBuilder(ItemLike door, Ingredient material) { return super.doorBuilder(door, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#fenceBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public RecipeBuilder fenceBuilder(ItemLike fence, Ingredient material) { return super.fenceBuilder(fence, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#fenceGateBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public RecipeBuilder fenceGateBuilder(ItemLike fenceGate, Ingredient material) { return super.fenceGateBuilder(fenceGate, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#pressurePlate} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void pressurePlate(ItemLike pressurePlate, ItemLike material) { super.pressurePlate(pressurePlate, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#pressurePlateBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public RecipeBuilder pressurePlateBuilder(RecipeCategory category, ItemLike pressurePlate, Ingredient material) { return super.pressurePlateBuilder(category, pressurePlate, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#slab} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void slab(RecipeCategory category, ItemLike slab, ItemLike material) { super.slab(category, slab, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#slabBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public RecipeBuilder slabBuilder(RecipeCategory category, ItemLike slab, Ingredient material) { return super.slabBuilder(category, slab, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#stairBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public RecipeBuilder stairBuilder(ItemLike stairs, Ingredient material) { return super.stairBuilder(stairs, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#trapdoorBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public RecipeBuilder trapdoorBuilder(ItemLike trapdoor, Ingredient material) { return super.trapdoorBuilder(trapdoor, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#signBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public RecipeBuilder signBuilder(ItemLike sign, Ingredient material) { return super.signBuilder(sign, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#hangingSign} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void hangingSign(ItemLike sign, ItemLike material) { super.hangingSign(sign, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#colorItemWithDye} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void colorItemWithDye(List dyeItems, List dyeableItems, String group, RecipeCategory category) { super.colorItemWithDye(dyeItems, dyeableItems, group, category); } + + /** Generated override to expose protected method: {@link RecipeProvider#carpet} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void carpet(ItemLike carpet, ItemLike material) { super.carpet(carpet, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#bedFromPlanksAndWool} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void bedFromPlanksAndWool(ItemLike bed, ItemLike wool) { super.bedFromPlanksAndWool(bed, wool); } + + /** Generated override to expose protected method: {@link RecipeProvider#banner} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void banner(ItemLike banner, ItemLike material) { super.banner(banner, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassFromGlassAndDye} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void stainedGlassFromGlassAndDye(ItemLike stainedGlass, ItemLike dye) { super.stainedGlassFromGlassAndDye(stainedGlass, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#dryGhast} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void dryGhast(ItemLike dryGhast) { super.dryGhast(dryGhast); } + + /** Generated override to expose protected method: {@link RecipeProvider#harness} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void harness(ItemLike harness, ItemLike wool) { super.harness(harness, wool); } + + /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromStainedGlass} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void stainedGlassPaneFromStainedGlass(ItemLike stainedGlassPane, ItemLike stainedGlass) { super.stainedGlassPaneFromStainedGlass(stainedGlassPane, stainedGlass); } + + /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromGlassPaneAndDye} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void stainedGlassPaneFromGlassPaneAndDye(ItemLike stainedGlassPane, ItemLike dye) { super.stainedGlassPaneFromGlassPaneAndDye(stainedGlassPane, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#coloredTerracottaFromTerracottaAndDye} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void coloredTerracottaFromTerracottaAndDye(ItemLike terracotta, ItemLike dye) { super.coloredTerracottaFromTerracottaAndDye(terracotta, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#concretePowder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void concretePowder(ItemLike concretePowder, ItemLike dye) { super.concretePowder(concretePowder, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#candle} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void candle(ItemLike candle, ItemLike dye) { super.candle(candle, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#wall} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void wall(RecipeCategory category, ItemLike wall, ItemLike material) { super.wall(category, wall, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#wallBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public RecipeBuilder wallBuilder(RecipeCategory category, ItemLike wall, Ingredient material) { return super.wallBuilder(category, wall, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#polished} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void polished(RecipeCategory category, ItemLike result, ItemLike material) { super.polished(category, result, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#polishedBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public RecipeBuilder polishedBuilder(RecipeCategory category, ItemLike result, Ingredient material) { return super.polishedBuilder(category, result, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#cut} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void cut(RecipeCategory category, ItemLike cutResult, ItemLike material) { super.cut(category, cutResult, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#cutBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public ShapedRecipeBuilder cutBuilder(RecipeCategory category, ItemLike cutResult, Ingredient material) { return super.cutBuilder(category, cutResult, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#chiseled} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void chiseled(RecipeCategory category, ItemLike chiseledResult, ItemLike material) { super.chiseled(category, chiseledResult, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#mosaicBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void mosaicBuilder(RecipeCategory category, ItemLike result, ItemLike material) { super.mosaicBuilder(category, result, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#chiseledBuilder} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public ShapedRecipeBuilder chiseledBuilder(RecipeCategory category, ItemLike chiseledResult, Ingredient material) { return super.chiseledBuilder(category, chiseledResult, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike material) { super.stonecutterResultFromBase(category, result, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike material, int resultCount) { super.stonecutterResultFromBase(category, result, material, resultCount); } + + /** Generated override to expose protected method: {@link RecipeProvider#smeltingResultFromBase} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void smeltingResultFromBase(ItemLike result, ItemLike ingredient) { super.smeltingResultFromBase(result, ingredient); } + + /** Generated override to expose protected method: {@link RecipeProvider#nineBlockStorageRecipes} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void nineBlockStorageRecipes(RecipeCategory unpackedCategory, ItemLike unpacked, RecipeCategory packedCategory, ItemLike packed) { super.nineBlockStorageRecipes(unpackedCategory, unpacked, packedCategory, packed); } + + /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void copySmithingTemplate(ItemLike template, ItemLike baseItem) { super.copySmithingTemplate(template, baseItem); } + + /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void copySmithingTemplate(ItemLike template, Ingredient baseItem) { super.copySmithingTemplate(template, baseItem); } + + /** Generated override to expose protected method: {@link RecipeProvider#waxRecipes} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void waxRecipes(FeatureFlagSet requiredFeatures) { super.waxRecipes(requiredFeatures); } + + /** Generated override to expose protected method: {@link RecipeProvider#grate} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void grate(Block grateBlock, Block material) { super.grate(grateBlock, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#copperBulb} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void copperBulb(Block bulbBlock, Block material) { super.copperBulb(bulbBlock, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#suspiciousStew} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void suspiciousStew(Item flowerItem, SuspiciousEffectHolder effect) { super.suspiciousStew(flowerItem, effect); } + + /** Generated override to expose protected method: {@link RecipeProvider#generateRecipes} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public void generateRecipes(BlockFamily blockFamily, FeatureFlagSet requiredFeatures) { super.generateRecipes(blockFamily, requiredFeatures); } + + /** Generated override to expose protected method: {@link RecipeProvider#getBaseBlock} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public Block getBaseBlock(BlockFamily family, BlockFamily.Variant variant) { return super.getBaseBlock(family, variant); } + + /** Generated override to expose protected method: {@link RecipeProvider#insideOf} */ + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public static Criterion insideOf(Block block) { return RecipeProvider.insideOf(block); } + + /** Generated override to expose protected method: {@link RecipeProvider#has} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public Criterion has(MinMaxBounds.Ints count, ItemLike item) { return super.has(count, item); } + + /** Generated override to expose protected method: {@link RecipeProvider#has} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public Criterion has(ItemLike itemLike) { return super.has(itemLike); } + + /** Generated override to expose protected method: {@link RecipeProvider#has} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public Criterion has(TagKey tag) { return super.has(tag); } + + /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public static Criterion inventoryTrigger(ItemPredicate.Builder... items) { return RecipeProvider.inventoryTrigger(items); } + + /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public static Criterion inventoryTrigger(ItemPredicate... predicates) { return RecipeProvider.inventoryTrigger(predicates); } + + /** Generated override to expose protected method: {@link RecipeProvider#getHasName} */ + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public static String getHasName(ItemLike itemLike) { return RecipeProvider.getHasName(itemLike); } + + /** Generated override to expose protected method: {@link RecipeProvider#getItemName} */ + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public static String getItemName(ItemLike itemLike) { return RecipeProvider.getItemName(itemLike); } + + /** Generated override to expose protected method: {@link RecipeProvider#getSimpleRecipeName} */ + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public static String getSimpleRecipeName(ItemLike itemLike) { return RecipeProvider.getSimpleRecipeName(itemLike); } + + /** Generated override to expose protected method: {@link RecipeProvider#getConversionRecipeName} */ + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public static String getConversionRecipeName(ItemLike result, ItemLike ingredient) { return RecipeProvider.getConversionRecipeName(result, ingredient); } + + /** Generated override to expose protected method: {@link RecipeProvider#getSmeltingRecipeName} */ + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public static String getSmeltingRecipeName(ItemLike itemLike) { return RecipeProvider.getSmeltingRecipeName(itemLike); } + + /** Generated override to expose protected method: {@link RecipeProvider#getBlastingRecipeName} */ + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public static String getBlastingRecipeName(ItemLike itemLike) { return RecipeProvider.getBlastingRecipeName(itemLike); } + + /** Generated override to expose protected method: {@link RecipeProvider#tag} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public Ingredient tag(TagKey tag) { return super.tag(tag); } + + /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike result) { return super.shaped(category, result); } + + /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike result, int count) { return super.shaped(category, result, count); } + + /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemStack result) { return super.shapeless(category, result); } + + /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike result) { return super.shapeless(category, result); } + + /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") + public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike result, int count) { return super.shapeless(category, result, count); } + + // GENERATED END + +} diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java new file mode 100644 index 0000000..5f7f173 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java @@ -0,0 +1,45 @@ +package com.modularmc.registrate.providers.generators; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.RegistrateProvider; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.RecipeProvider; +import net.neoforged.fml.LogicalSide; + +import java.util.concurrent.CompletableFuture; + +public class RegistrateRecipeRunner extends RecipeProvider.Runner implements RegistrateProvider { + + final AbstractRegistrate owner; + + @org.jetbrains.annotations.Nullable + RegistrateRecipeProvider provider; + + public RegistrateRecipeRunner(AbstractRegistrate owner, PackOutput p_365369_, CompletableFuture p_361563_) { + super(p_365369_, p_361563_); + this.owner = owner; + } + + @Override + protected RecipeProvider createRecipeProvider(HolderLookup.Provider p_362946_, RecipeOutput p_365274_) { + return new RegistrateRecipeProvider(this, p_362946_, p_365274_); + } + + @Override + public String getName() { + return ""; + } + + @Override + public LogicalSide getSide() { + return LogicalSide.SERVER; + } + + public RegistrateRecipeProvider getRecipeProvider() { + if (provider == null) throw new IllegalStateException("Recipe Provider is not available now"); + return provider; + } +} diff --git a/src/main/java/com/modularmc/registrate/providers/generators/package-info.java b/src/main/java/com/modularmc/registrate/providers/generators/package-info.java new file mode 100644 index 0000000..2c81361 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/generators/package-info.java @@ -0,0 +1,6 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.modularmc.registrate.providers.generators; + +import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java new file mode 100644 index 0000000..544c37a --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java @@ -0,0 +1,294 @@ +package com.modularmc.registrate.providers.loot; + +import com.modularmc.registrate.AbstractRegistrate; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.loot.BlockLootSubProvider; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootPoolEntryContainer; +import net.minecraft.world.level.storage.loot.functions.FunctionUserBuilder; +import net.minecraft.world.level.storage.loot.predicates.ConditionUserBuilder; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; + +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import javax.annotation.Generated; + +public class RegistrateBlockLootTables extends BlockLootSubProvider implements RegistrateLootTables { + + private final AbstractRegistrate parent; + private final Consumer callback; + + private final HolderLookup itemLookup; + private final HolderLookup blockLookup; + private final HolderLookup> entityLookup; + + public RegistrateBlockLootTables(HolderLookup.Provider provider, AbstractRegistrate parent, Consumer callback) { + super(Set.of(), FeatureFlags.REGISTRY.allFlags(), provider); + this.parent = parent; + this.callback = callback; + itemLookup = registries.lookupOrThrow(Registries.ITEM); + blockLookup = registries.lookupOrThrow(Registries.BLOCK); + entityLookup = registries.lookupOrThrow(Registries.ENTITY_TYPE); + } + + @Override + protected void generate() { + callback.accept(this); + } + + @Override + protected Iterable getKnownBlocks() { + return parent.getAll(Registries.BLOCK).stream().map(Supplier::get).collect(Collectors.toList()); + } + + public HolderLookup.Provider getRegistries() { + return this.registries; + } + + public HolderLookup itemLookup() { + return itemLookup; + } + + public HolderLookup blockLookup() { + return blockLookup; + } + + public HolderLookup> entityLookup() { + return entityLookup; + } + + // @formatter:off + // GENERATED START - DO NOT EDIT BELOW THIS LINE + + /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionDecay} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public > T applyExplosionDecay(ItemLike item, FunctionUserBuilder functionBuilder) { return super.applyExplosionDecay(item, functionBuilder); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionCondition} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public > T applyExplosionCondition(ItemLike item, ConditionUserBuilder conditionBuilder) { return super.applyExplosionCondition(item, conditionBuilder); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchDispatchTable} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createSilkTouchDispatchTable(Block block, LootPoolEntryContainer.Builder builder) { return super.createSilkTouchDispatchTable(block, builder); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsDispatchTable} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createShearsDispatchTable(Block block, LootPoolEntryContainer.Builder builder) { return super.createShearsDispatchTable(block, builder); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOrShearsDispatchTable} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createSilkTouchOrShearsDispatchTable(Block block, LootPoolEntryContainer.Builder builder) { return super.createSilkTouchOrShearsDispatchTable(block, builder); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createSingleItemTableWithSilkTouch(Block block, ItemLike item) { return super.createSingleItemTableWithSilkTouch(block, item); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTable} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createSingleItemTable(ItemLike item, NumberProvider count) { return super.createSingleItemTable(item, count); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createSingleItemTableWithSilkTouch(Block block, ItemLike item, NumberProvider count) { return super.createSingleItemTableWithSilkTouch(block, item, count); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOnlyTable} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createSilkTouchOnlyTable(ItemLike item) { return super.createSilkTouchOnlyTable(item); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createPotFlowerItemTable} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createPotFlowerItemTable(ItemLike item) { return super.createPotFlowerItemTable(item); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSlabItemTable} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createSlabItemTable(Block block) { return super.createSlabItemTable(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createNameableBlockEntityTable} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createNameableBlockEntityTable(Block block) { return super.createNameableBlockEntityTable(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShulkerBoxDrop} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createShulkerBoxDrop(Block block) { return super.createShulkerBoxDrop(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCopperOreDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createCopperOreDrops(Block block) { return super.createCopperOreDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createLapisOreDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createLapisOreDrops(Block block) { return super.createLapisOreDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createRedstoneOreDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createRedstoneOreDrops(Block block) { return super.createRedstoneOreDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createBannerDrop} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createBannerDrop(Block block) { return super.createBannerDrop(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeNestDrop} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createBeeNestDrop(Block block) { return super.createBeeNestDrop(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeHiveDrop} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createBeeHiveDrop(Block block) { return super.createBeeHiveDrop(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCaveVinesDrop} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createCaveVinesDrop(Block block) { return super.createCaveVinesDrop(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createOreDrop} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createOreDrop(Block block, Item item) { return super.createOreDrop(block, item); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMushroomBlockDrop} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createMushroomBlockDrop(Block block, ItemLike item) { return super.createMushroomBlockDrop(block, item); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createGrassDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createGrassDrops(Block block) { return super.createGrassDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOnlyDrop} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createShearsOnlyDrop(ItemLike item) { return super.createShearsOnlyDrop(item); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOrSilkTouchOnlyDrop} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createShearsOrSilkTouchOnlyDrop(ItemLike item) { return super.createShearsOrSilkTouchOnlyDrop(item); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createMultifaceBlockDrops(Block block, LootItemCondition.Builder builder) { return super.createMultifaceBlockDrops(block, builder); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createMultifaceBlockDrops(Block block) { return super.createMultifaceBlockDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMossyCarpetBlockDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createMossyCarpetBlockDrops(Block block) { return super.createMossyCarpetBlockDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createLeavesDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createLeavesDrops(Block leavesBlock, Block saplingBlock, float... chances) { return super.createLeavesDrops(leavesBlock, saplingBlock, chances); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createOakLeavesDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createOakLeavesDrops(Block oakLeavesBlock, Block saplingBlock, float... chances) { return super.createOakLeavesDrops(oakLeavesBlock, saplingBlock, chances); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMangroveLeavesDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createMangroveLeavesDrops(Block block) { return super.createMangroveLeavesDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCropDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createCropDrops(Block cropBlock, Item grownCropItem, Item seedsItem, LootItemCondition.Builder dropGrownCropCondition) { return super.createCropDrops(cropBlock, grownCropItem, seedsItem, dropGrownCropCondition); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantShearsDrop} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createDoublePlantShearsDrop(Block sheared) { return super.createDoublePlantShearsDrop(sheared); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantWithSeedDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createDoublePlantWithSeedDrops(Block block, Block sheared) { return super.createDoublePlantWithSeedDrops(block, sheared); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleDrops} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createCandleDrops(Block candleBlock) { return super.createCandleDrops(candleBlock); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleCakeDrops} */ + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public static LootTable.Builder createCandleCakeDrops(Block candleCakeBlock) { return BlockLootSubProvider.createCandleCakeDrops(candleCakeBlock); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#addNetherVinesDropTable} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public void addNetherVinesDropTable(Block vines, Block plant) { super.addNetherVinesDropTable(vines, plant); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoorTable} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public LootTable.Builder createDoorTable(Block doorBlock) { return super.createDoorTable(doorBlock); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropPottedContents} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public void dropPottedContents(Block flowerPot) { super.dropPottedContents(flowerPot); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#otherWhenSilkTouch} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public void otherWhenSilkTouch(Block block, Block other) { super.otherWhenSilkTouch(block, other); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropOther} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public void dropOther(Block block, ItemLike item) { super.dropOther(block, item); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropWhenSilkTouch} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public void dropWhenSilkTouch(Block block) { super.dropWhenSilkTouch(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropSelf} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public void dropSelf(Block block) { super.dropSelf(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#add} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") + public void add(Block block, LootTable.Builder builder) { super.add(block, builder); } + + // GENERATED END +} diff --git a/src/main/java/com/tterrag/registrate/providers/loot/RegistrateEntityLootTables.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateEntityLootTables.java similarity index 62% rename from src/main/java/com/tterrag/registrate/providers/loot/RegistrateEntityLootTables.java rename to src/main/java/com/modularmc/registrate/providers/loot/RegistrateEntityLootTables.java index ae47b3f..28f050c 100644 --- a/src/main/java/com/tterrag/registrate/providers/loot/RegistrateEntityLootTables.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateEntityLootTables.java @@ -1,6 +1,7 @@ -package com.tterrag.registrate.providers.loot; +package com.modularmc.registrate.providers.loot; + +import com.modularmc.registrate.AbstractRegistrate; -import com.tterrag.registrate.AbstractRegistrate; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; @@ -13,11 +14,12 @@ import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import javax.annotation.Generated; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Stream; +import javax.annotation.Generated; + public class RegistrateEntityLootTables extends EntityLootSubProvider implements RegistrateLootTables { private final AbstractRegistrate parent; @@ -63,22 +65,22 @@ public HolderLookup> entityLookup() { } // @formatter:off - // GENERATED START - DO NOT EDIT BELOW THIS LINE + // GENERATED START - DO NOT EDIT BELOW THIS LINE - /** Generated override to expose protected method: {@link EntityLootSubProvider#killedByFrog} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 20 Jul 2025 07:02:04 GMT") - public LootItemCondition.Builder killedByFrog(HolderGetter> entityTypeRegistry) { return super.killedByFrog(entityTypeRegistry); } + /** Generated override to expose protected method: {@link EntityLootSubProvider#killedByFrog} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 20 Jul 2025 07:02:04 GMT") + public LootItemCondition.Builder killedByFrog(HolderGetter> entityTypeRegistry) { return super.killedByFrog(entityTypeRegistry); } - /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 20 Jul 2025 07:02:04 GMT") - public void add(EntityType entityType, LootTable.Builder builder) { super.add(entityType, builder); } + /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 20 Jul 2025 07:02:04 GMT") + public void add(EntityType entityType, LootTable.Builder builder) { super.add(entityType, builder); } - /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 20 Jul 2025 07:02:04 GMT") - public void add(EntityType entityType, ResourceKey defaultLootTable, LootTable.Builder builder) { super.add(entityType, defaultLootTable, builder); } + /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ + @Override + @Generated(value = "com.tterrag.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 20 Jul 2025 07:02:04 GMT") + public void add(EntityType entityType, ResourceKey defaultLootTable, LootTable.Builder builder) { super.add(entityType, defaultLootTable, builder); } - // GENERATED END + // GENERATED END } diff --git a/src/main/java/com/tterrag/registrate/providers/loot/RegistrateLootTableProvider.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java similarity index 88% rename from src/main/java/com/tterrag/registrate/providers/loot/RegistrateLootTableProvider.java rename to src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java index fa2b68c..460c877 100644 --- a/src/main/java/com/tterrag/registrate/providers/loot/RegistrateLootTableProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java @@ -1,13 +1,10 @@ -package com.tterrag.registrate.providers.loot; +package com.modularmc.registrate.providers.loot; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.RegistrateProvider; +import com.modularmc.registrate.util.nullness.NonNullConsumer; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Multimap; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.providers.RegistrateProvider; -import com.tterrag.registrate.util.nullness.NonNullConsumer; import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.core.WritableRegistry; @@ -15,8 +12,8 @@ import net.minecraft.data.loot.LootTableProvider; import net.minecraft.data.loot.LootTableSubProvider; import net.minecraft.data.loot.packs.VanillaLootTableProvider; +import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.util.ProblemReporter; import net.minecraft.util.context.ContextKeySet; import net.minecraft.world.level.storage.loot.LootTable; @@ -24,6 +21,11 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.neoforged.fml.LogicalSide; import net.neoforged.fml.util.ObfuscationReflectionHelper; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Multimap; import org.apache.commons.lang3.function.TriFunction; import java.util.*; @@ -44,6 +46,7 @@ public interface LootType { static LootType register(String name, ContextKeySet set, TriFunction, Consumer, T> factory) { LootType type = new LootType() { + @Override public T getLootCreator(HolderLookup.Provider provider, AbstractRegistrate parent, Consumer callback) { return factory.apply(provider, parent, callback); @@ -75,7 +78,7 @@ public RegistrateLootTableProvider(AbstractRegistrate parent, PackOutput pack this.provider = provider; } - public HolderLookup.Provider getProvider(){ + public HolderLookup.Provider getProvider() { return provider.getNow(null); } @@ -102,13 +105,13 @@ public void addLootAction(ContextKeySet set, Consumer parent, LootType type) { + private LootTableSubProvider getLootCreator(HolderLookup.Provider provider, AbstractRegistrate parent, LootType type) { RegistrateLootTables creator = type.getLootCreator(provider, parent, cons -> specialLootActions.get(type).forEach(c -> c.accept(cons))); currentLootCreators.add(creator); return creator; } - private static final BiMap SET_REGISTRY = ObfuscationReflectionHelper.getPrivateValue(LootContextParamSets.class, null, "REGISTRY"); + private static final BiMap SET_REGISTRY = ObfuscationReflectionHelper.getPrivateValue(LootContextParamSets.class, null, "REGISTRY"); @Override public List getTables() { diff --git a/src/main/java/com/tterrag/registrate/providers/loot/RegistrateLootTables.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTables.java similarity index 77% rename from src/main/java/com/tterrag/registrate/providers/loot/RegistrateLootTables.java rename to src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTables.java index 474c5af..a326de9 100644 --- a/src/main/java/com/tterrag/registrate/providers/loot/RegistrateLootTables.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTables.java @@ -1,13 +1,11 @@ -package com.tterrag.registrate.providers.loot; +package com.modularmc.registrate.providers.loot; import net.minecraft.core.WritableRegistry; import net.minecraft.data.loot.LootTableSubProvider; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.ValidationContext; -import java.util.Map; - public interface RegistrateLootTables extends LootTableSubProvider { + default void validate(WritableRegistry writableRegistry, ValidationContext validationContext) {} } diff --git a/src/main/java/com/modularmc/registrate/providers/loot/package-info.java b/src/main/java/com/modularmc/registrate/providers/loot/package-info.java new file mode 100644 index 0000000..e5e260c --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/loot/package-info.java @@ -0,0 +1,6 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.modularmc.registrate.providers.loot; + +import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/main/java/com/modularmc/registrate/providers/package-info.java b/src/main/java/com/modularmc/registrate/providers/package-info.java new file mode 100644 index 0000000..99ed714 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/package-info.java @@ -0,0 +1,6 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.modularmc.registrate.providers; + +import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/main/java/com/tterrag/registrate/util/CreativeModeTabModifier.java b/src/main/java/com/modularmc/registrate/util/CreativeModeTabModifier.java similarity index 95% rename from src/main/java/com/tterrag/registrate/util/CreativeModeTabModifier.java rename to src/main/java/com/modularmc/registrate/util/CreativeModeTabModifier.java index 653e28d..58cb1cb 100644 --- a/src/main/java/com/tterrag/registrate/util/CreativeModeTabModifier.java +++ b/src/main/java/com/modularmc/registrate/util/CreativeModeTabModifier.java @@ -1,17 +1,18 @@ -package com.tterrag.registrate.util; - -import org.jetbrains.annotations.ApiStatus; +package com.modularmc.registrate.util; import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; +import org.jetbrains.annotations.ApiStatus; + import java.util.function.BiConsumer; import java.util.function.BooleanSupplier; import java.util.function.Supplier; public final class CreativeModeTabModifier implements CreativeModeTab.Output { + private final Supplier flags; private final BooleanSupplier hasPermissions; private final BiConsumer acceptFunc; @@ -22,14 +23,14 @@ public CreativeModeTabModifier(Supplier flags, BooleanSupplier h this.flags = flags; this.hasPermissions = hasPermissions; this.acceptFunc = acceptFunc; - this.parameters = parameters; - } + this.parameters = parameters; + } public FeatureFlagSet getFlags() { return flags.get(); } - public CreativeModeTab.ItemDisplayParameters getParameters(){ + public CreativeModeTab.ItemDisplayParameters getParameters() { return parameters.get(); } diff --git a/src/main/java/com/tterrag/registrate/util/DataIngredient.java b/src/main/java/com/modularmc/registrate/util/DataIngredient.java similarity index 79% rename from src/main/java/com/tterrag/registrate/util/DataIngredient.java rename to src/main/java/com/modularmc/registrate/util/DataIngredient.java index c8d9759..c89c915 100644 --- a/src/main/java/com/tterrag/registrate/util/DataIngredient.java +++ b/src/main/java/com/modularmc/registrate/util/DataIngredient.java @@ -1,20 +1,22 @@ -package com.tterrag.registrate.util; +package com.modularmc.registrate.util; + +import com.modularmc.registrate.providers.generators.RegistrateRecipeProvider; +import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.google.common.collect.ObjectArrays; -import com.tterrag.registrate.providers.generators.RegistrateRecipeProvider; -import com.tterrag.registrate.util.nullness.NonNullSupplier; -import lombok.Getter; import net.minecraft.advancements.Criterion; import net.minecraft.advancements.critereon.InventoryChangeTrigger; import net.minecraft.advancements.critereon.ItemPredicate; import net.minecraft.core.HolderSet; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; +import com.google.common.collect.ObjectArrays; +import lombok.Getter; + import java.util.Arrays; import java.util.function.Function; import java.util.function.Supplier; @@ -23,16 +25,18 @@ * A helper for data generation when using ingredients as input(s) to recipes.
      * It remembers the name of the primary ingredient for use in creating recipe names/criteria. *

      - * Create an instance of this class with the various factory methods such as {@link #items(ItemLike, ItemLike...)} and {@link #tag(HolderSet.Named)} )}. + * Create an instance of this class with the various factory methods such as {@link #items(ItemLike, ItemLike...)} and + * {@link #tag(HolderSet.Named)} )}. *

      - * This class should not be used for any purpose other than data generation, it will throw an exception if it is serialized to a packet buffer. + * This class should not be used for any purpose other than data generation, it will throw an exception + * if it is serialized to a packet buffer. */ public final class DataIngredient { - //TODO <1.21.4> removed delegate. Is there a need to add it back? + // TODO <1.21.4> removed delegate. Is there a need to add it back? private final Ingredient parent; @Getter - private final ResourceLocation id; + private final Identifier id; private final Function> criteriaFactory; private DataIngredient(Ingredient parent, ItemLike item) { @@ -40,14 +44,14 @@ private DataIngredient(Ingredient parent, ItemLike item) { this.id = BuiltInRegistries.ITEM.getKey(item.asItem()); this.criteriaFactory = prov -> prov.has(item); } - + private DataIngredient(Ingredient parent, TagKey tag) { this.parent = parent; this.id = tag.location(); this.criteriaFactory = prov -> prov.has(tag); } - - private DataIngredient(Ingredient parent, ResourceLocation id, ItemPredicate... predicates) { + + private DataIngredient(Ingredient parent, Identifier id, ItemPredicate... predicates) { this.parent = parent; this.id = id; this.criteriaFactory = prov -> RegistrateRecipeProvider.inventoryTrigger(predicates); @@ -56,7 +60,7 @@ private DataIngredient(Ingredient parent, ResourceLocation id, ItemPredicate... public Criterion getCriterion(RegistrateRecipeProvider prov) { return criteriaFactory.apply(prov); } - + @SuppressWarnings("unchecked") @SafeVarargs public static DataIngredient items(NonNullSupplier first, NonNullSupplier... others) { @@ -71,16 +75,16 @@ public static DataIngredient items(T first, T... others) { public static DataIngredient tag(HolderSet.Named tag) { return ingredient(Ingredient.of(tag), tag.key()); } - + public static DataIngredient ingredient(Ingredient parent, ItemLike required) { return new DataIngredient(parent, required); } - + public static DataIngredient ingredient(Ingredient parent, TagKey required) { return new DataIngredient(parent, required); } - - public static DataIngredient ingredient(Ingredient parent, ResourceLocation id, ItemPredicate... criteria) { + + public static DataIngredient ingredient(Ingredient parent, Identifier id, ItemPredicate... criteria) { return new DataIngredient(parent, id, criteria); } diff --git a/src/main/java/com/tterrag/registrate/util/DebugMarkers.java b/src/main/java/com/modularmc/registrate/util/DebugMarkers.java similarity index 89% rename from src/main/java/com/tterrag/registrate/util/DebugMarkers.java rename to src/main/java/com/modularmc/registrate/util/DebugMarkers.java index c97a582..17685cc 100644 --- a/src/main/java/com/tterrag/registrate/util/DebugMarkers.java +++ b/src/main/java/com/modularmc/registrate/util/DebugMarkers.java @@ -1,17 +1,17 @@ -package com.tterrag.registrate.util; +package com.modularmc.registrate.util; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; @SuppressWarnings("null") public class DebugMarkers { - + private static final String PREFIX = "REGISTRATE."; - + private static final Marker marker(String name) { return MarkerManager.getMarker(PREFIX + name); } - + public static final Marker REGISTER = marker("REGISTER"); public static final Marker DATA = marker("DATA"); -} \ No newline at end of file +} diff --git a/src/main/java/com/tterrag/registrate/util/OneTimeEventReceiver.java b/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java similarity index 95% rename from src/main/java/com/tterrag/registrate/util/OneTimeEventReceiver.java rename to src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java index ab6fbb0..a9892b2 100644 --- a/src/main/java/com/tterrag/registrate/util/OneTimeEventReceiver.java +++ b/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java @@ -1,17 +1,19 @@ -package com.tterrag.registrate.util; +package com.modularmc.registrate.util; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.util.nullness.NonnullType; -import com.google.common.collect.HashBasedTable; -import com.google.common.collect.Table; -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.util.nullness.NonnullType; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; import net.neoforged.bus.api.Event; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.event.IModBusEvent; import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; import net.neoforged.neoforge.common.NeoForge; + +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; @@ -24,11 +26,10 @@ @Log4j2 public class OneTimeEventReceiver implements Consumer<@NonnullType T> { - public static void addModListener(AbstractRegistrate owner, Class evtClass, Consumer listener) { OneTimeEventReceiver.addModListener(owner, EventPriority.NORMAL, evtClass, listener); } - + public static void addModListener(AbstractRegistrate owner, EventPriority priority, Class evtClass, Consumer listener) { if (owner.getModEventBus() == null) { if (!waitingModListeners.contains(owner, evtClass)) { @@ -41,7 +42,7 @@ public static void addModListener(AbstractRegis seenModBus = true; for (var waitingListener : waitingModListeners.row(owner).entrySet()) { for (var pair : waitingListener.getValue()) { - //noinspection unchecked + // noinspection unchecked OneTimeEventReceiver.addListener(owner.getModEventBus(), pair.getKey(), (Class) waitingListener.getKey(), (Consumer) pair.getValue()); } } @@ -49,20 +50,20 @@ public static void addModListener(AbstractRegis } OneTimeEventReceiver.addListener(owner.getModEventBus(), priority, evtClass, listener); } - + public static void addForgeListener(Class evtClass, Consumer listener) { OneTimeEventReceiver.addForgeListener(EventPriority.NORMAL, evtClass, listener); } - + public static void addForgeListener(EventPriority priority, Class evtClass, Consumer listener) { OneTimeEventReceiver.addListener(NeoForge.EVENT_BUS, priority, evtClass, listener); } - + @Deprecated public static void addListener(IEventBus bus, Class evtClass, Consumer listener) { OneTimeEventReceiver.addListener(bus, EventPriority.NORMAL, evtClass, listener); } - + @SuppressWarnings("unchecked") @Deprecated public static void addListener(IEventBus bus, EventPriority priority, Class evtClass, Consumer listener) { diff --git a/src/main/java/com/tterrag/registrate/util/RegistrateDistExecutor.java b/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java similarity index 89% rename from src/main/java/com/tterrag/registrate/util/RegistrateDistExecutor.java rename to src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java index 167a0d1..9e5e703 100644 --- a/src/main/java/com/tterrag/registrate/util/RegistrateDistExecutor.java +++ b/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java @@ -1,4 +1,4 @@ -package com.tterrag.registrate.util; +package com.modularmc.registrate.util; import net.neoforged.api.distmarker.Dist; import net.neoforged.fml.loading.FMLEnvironment; @@ -6,6 +6,7 @@ import java.util.function.Supplier; public class RegistrateDistExecutor { + public static void unsafeRunWhenOn(Dist dist, Supplier toRun) { if (dist == FMLEnvironment.dist) { toRun.get().run(); diff --git a/src/main/java/com/tterrag/registrate/util/Sequence.java b/src/main/java/com/modularmc/registrate/util/Sequence.java similarity index 71% rename from src/main/java/com/tterrag/registrate/util/Sequence.java rename to src/main/java/com/modularmc/registrate/util/Sequence.java index 241f3ac..d06aa81 100644 --- a/src/main/java/com/tterrag/registrate/util/Sequence.java +++ b/src/main/java/com/modularmc/registrate/util/Sequence.java @@ -1,21 +1,23 @@ -package com.tterrag.registrate.util; +package com.modularmc.registrate.util; import java.util.function.Supplier; public class Sequence { - - public static Sequence create() { return new Sequence<>(); } - + + public static Sequence create() { + return new Sequence<>(); + } + public Sequence run(Runnable toRun) { toRun.run(); return this; } - + public Sequence next(Supplier val) { val.get(); return this; } - + public Sequence next(T val) { return this; } diff --git a/src/main/java/com/tterrag/registrate/util/entry/BlockEntityEntry.java b/src/main/java/com/modularmc/registrate/util/entry/BlockEntityEntry.java similarity index 81% rename from src/main/java/com/tterrag/registrate/util/entry/BlockEntityEntry.java rename to src/main/java/com/modularmc/registrate/util/entry/BlockEntityEntry.java index 088d426..030af6f 100644 --- a/src/main/java/com/tterrag/registrate/util/entry/BlockEntityEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/BlockEntityEntry.java @@ -1,10 +1,6 @@ -package com.tterrag.registrate.util.entry; +package com.modularmc.registrate.util.entry; -import java.util.Optional; - -import javax.annotation.Nullable; - -import com.tterrag.registrate.AbstractRegistrate; +import com.modularmc.registrate.AbstractRegistrate; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; @@ -13,6 +9,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.registries.DeferredHolder; +import java.util.Optional; + +import javax.annotation.Nullable; + public class BlockEntityEntry extends RegistryEntry, BlockEntityType> { public BlockEntityEntry(AbstractRegistrate owner, DeferredHolder, BlockEntityType> delegate) { @@ -21,7 +21,7 @@ public BlockEntityEntry(AbstractRegistrate owner, DeferredHolder get(BlockGetter world, BlockPos pos) { return Optional.ofNullable(getNullable(world, pos)); @@ -54,11 +55,11 @@ public Optional get(BlockGetter world, BlockPos pos) { /** * Get an instance of this {@link BlockEntity} from the world. - * + * * @param world - * The world to look for the instance in + * The world to look for the instance in * @param pos - * The position of the instance + * The position of the instance * @return The instance, if it exists and matches this type. Otherwise, {@code null}. */ @SuppressWarnings("unchecked") diff --git a/src/main/java/com/tterrag/registrate/util/entry/BlockEntry.java b/src/main/java/com/modularmc/registrate/util/entry/BlockEntry.java similarity index 87% rename from src/main/java/com/tterrag/registrate/util/entry/BlockEntry.java rename to src/main/java/com/modularmc/registrate/util/entry/BlockEntry.java index e21c27e..14623e3 100644 --- a/src/main/java/com/tterrag/registrate/util/entry/BlockEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/BlockEntry.java @@ -1,6 +1,6 @@ -package com.tterrag.registrate.util.entry; +package com.modularmc.registrate.util.entry; -import com.tterrag.registrate.AbstractRegistrate; +import com.modularmc.registrate.AbstractRegistrate; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; @@ -19,7 +19,7 @@ public BlockState getDefaultState() { public boolean has(BlockState state) { return is(state.getBlock()); } - + public static BlockEntry cast(RegistryEntry entry) { return RegistryEntry.cast(BlockEntry.class, entry); } diff --git a/src/main/java/com/tterrag/registrate/util/entry/EntityEntry.java b/src/main/java/com/modularmc/registrate/util/entry/EntityEntry.java similarity index 90% rename from src/main/java/com/tterrag/registrate/util/entry/EntityEntry.java rename to src/main/java/com/modularmc/registrate/util/entry/EntityEntry.java index 3ee3ace..03f5fe6 100644 --- a/src/main/java/com/tterrag/registrate/util/entry/EntityEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/EntityEntry.java @@ -1,6 +1,7 @@ -package com.tterrag.registrate.util.entry; +package com.modularmc.registrate.util.entry; + +import com.modularmc.registrate.AbstractRegistrate; -import com.tterrag.registrate.AbstractRegistrate; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySpawnReason; import net.minecraft.world.entity.EntityType; diff --git a/src/main/java/com/tterrag/registrate/util/entry/FluidEntry.java b/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java similarity index 92% rename from src/main/java/com/tterrag/registrate/util/entry/FluidEntry.java rename to src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java index 92bdb2d..e49fd04 100644 --- a/src/main/java/com/tterrag/registrate/util/entry/FluidEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java @@ -1,13 +1,8 @@ -package com.tterrag.registrate.util.entry; +package com.modularmc.registrate.util.entry; -import java.util.Optional; - -import javax.annotation.Nullable; - -import com.tterrag.registrate.AbstractRegistrate; +import com.modularmc.registrate.AbstractRegistrate; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.material.Fluid; @@ -15,6 +10,10 @@ import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.registries.DeferredHolder; +import java.util.Optional; + +import javax.annotation.Nullable; + public class FluidEntry extends RegistryEntry { private final @Nullable BlockEntry block; diff --git a/src/main/java/com/tterrag/registrate/util/entry/ItemEntry.java b/src/main/java/com/modularmc/registrate/util/entry/ItemEntry.java similarity index 82% rename from src/main/java/com/tterrag/registrate/util/entry/ItemEntry.java rename to src/main/java/com/modularmc/registrate/util/entry/ItemEntry.java index e0407f1..6aa577e 100644 --- a/src/main/java/com/tterrag/registrate/util/entry/ItemEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/ItemEntry.java @@ -1,6 +1,6 @@ -package com.tterrag.registrate.util.entry; +package com.modularmc.registrate.util.entry; -import com.tterrag.registrate.AbstractRegistrate; +import com.modularmc.registrate.AbstractRegistrate; import net.minecraft.world.item.Item; import net.neoforged.neoforge.registries.DeferredHolder; @@ -10,7 +10,7 @@ public class ItemEntry extends ItemProviderEntry { public ItemEntry(AbstractRegistrate owner, DeferredHolder delegate) { super(owner, delegate); } - + public static ItemEntry cast(RegistryEntry entry) { return RegistryEntry.cast(ItemEntry.class, entry); } diff --git a/src/main/java/com/tterrag/registrate/util/entry/ItemProviderEntry.java b/src/main/java/com/modularmc/registrate/util/entry/ItemProviderEntry.java similarity index 89% rename from src/main/java/com/tterrag/registrate/util/entry/ItemProviderEntry.java rename to src/main/java/com/modularmc/registrate/util/entry/ItemProviderEntry.java index e62b2bf..c30816b 100644 --- a/src/main/java/com/tterrag/registrate/util/entry/ItemProviderEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/ItemProviderEntry.java @@ -1,6 +1,6 @@ -package com.tterrag.registrate.util.entry; +package com.modularmc.registrate.util.entry; -import com.tterrag.registrate.AbstractRegistrate; +import com.modularmc.registrate.AbstractRegistrate; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/tterrag/registrate/util/entry/LazyRegistryEntry.java b/src/main/java/com/modularmc/registrate/util/entry/LazyRegistryEntry.java similarity index 85% rename from src/main/java/com/tterrag/registrate/util/entry/LazyRegistryEntry.java rename to src/main/java/com/modularmc/registrate/util/entry/LazyRegistryEntry.java index fcb6116..c45b9e5 100644 --- a/src/main/java/com/tterrag/registrate/util/entry/LazyRegistryEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/LazyRegistryEntry.java @@ -1,11 +1,11 @@ -package com.tterrag.registrate.util.entry; +package com.modularmc.registrate.util.entry; -import javax.annotation.Nullable; +import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.tterrag.registrate.util.nullness.NonNullSupplier; +import javax.annotation.Nullable; public class LazyRegistryEntry implements NonNullSupplier { - + @Nullable private NonNullSupplier> supplier; @Nullable @@ -14,7 +14,7 @@ public class LazyRegistryEntry implements NonNullSupplier { public LazyRegistryEntry(NonNullSupplier> supplier) { this.supplier = supplier; } - + @Override public T get() { NonNullSupplier> supplier = this.supplier; diff --git a/src/main/java/com/tterrag/registrate/util/entry/MenuEntry.java b/src/main/java/com/modularmc/registrate/util/entry/MenuEntry.java similarity index 90% rename from src/main/java/com/tterrag/registrate/util/entry/MenuEntry.java rename to src/main/java/com/modularmc/registrate/util/entry/MenuEntry.java index c2a3ead..de3ec28 100644 --- a/src/main/java/com/tterrag/registrate/util/entry/MenuEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/MenuEntry.java @@ -1,13 +1,9 @@ -package com.tterrag.registrate.util.entry; +package com.modularmc.registrate.util.entry; -import java.util.function.Consumer; - -import com.tterrag.registrate.AbstractRegistrate; +import com.modularmc.registrate.AbstractRegistrate; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.entity.player.Inventory; @@ -16,6 +12,8 @@ import net.minecraft.world.inventory.MenuType; import net.neoforged.neoforge.registries.DeferredHolder; +import java.util.function.Consumer; + public class MenuEntry extends RegistryEntry, MenuType> { public MenuEntry(AbstractRegistrate owner, DeferredHolder, MenuType> delegate) { diff --git a/src/main/java/com/tterrag/registrate/util/entry/RegistryEntry.java b/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java similarity index 70% rename from src/main/java/com/tterrag/registrate/util/entry/RegistryEntry.java rename to src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java index 57d52ab..faf19d9 100644 --- a/src/main/java/com/tterrag/registrate/util/entry/RegistryEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java @@ -1,23 +1,25 @@ -package com.tterrag.registrate.util.entry; +package com.modularmc.registrate.util.entry; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Predicate; - -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.util.nullness.NonNullSupplier; +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.util.nullness.NonNullSupplier; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.neoforged.neoforge.registries.DeferredHolder; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; + /** - * Wraps a {@link net.neoforged.neoforge.registries.DeferredHolder}, providing a cleaner API with null-safe access, and registrate-specific extensions such as {@link #getSibling(ResourceKey)}. + * Wraps a {@link net.neoforged.neoforge.registries.DeferredHolder}, providing a cleaner API with null-safe access, and + * registrate-specific extensions such as {@link #getSibling(ResourceKey)}. * * @param * The type of the entry */ public class RegistryEntry extends DeferredHolder implements NonNullSupplier { + private final AbstractRegistrate owner; @SuppressWarnings("unused") @@ -33,18 +35,20 @@ public RegistryEntry getSibling(ResourceKey RegistryEntry getSibling(Registry registry) { + public RegistryEntry getSibling(Registry registry) { return getSibling(registry.key()); } /** - * If an entry is present, and the entry matches the given predicate, return an {@link Optional} describing the value, otherwise return an empty {@link Optional}. + * If an entry is present, and the entry matches the given predicate, return an {@link Optional} + * describing the value, otherwise return an empty {@link Optional}. * * @param predicate - * a {@link Predicate predicate} to apply to the entry, if present - * @return an {@link RegistryEntry} describing the value of this {@link RegistryEntry} if the entry is present and matches the given predicate, otherwise an empty {@link RegistryEntry} + * a {@link Predicate predicate} to apply to the entry, if present + * @return an {@link RegistryEntry} describing the value of this {@link RegistryEntry} if the entry is present and + * matches the given predicate, otherwise an empty {@link RegistryEntry} * @throws NullPointerException - * if the predicate is null + * if the predicate is null */ public Optional> filter(Predicate predicate) { Objects.requireNonNull(predicate); diff --git a/src/main/java/com/modularmc/registrate/util/entry/package-info.java b/src/main/java/com/modularmc/registrate/util/entry/package-info.java new file mode 100644 index 0000000..e5711a6 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/util/entry/package-info.java @@ -0,0 +1,6 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.modularmc.registrate.util.entry; + +import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/main/java/com/tterrag/registrate/util/nullness/FieldsAreNonnullByDefault.java b/src/main/java/com/modularmc/registrate/util/nullness/FieldsAreNonnullByDefault.java similarity index 72% rename from src/main/java/com/tterrag/registrate/util/nullness/FieldsAreNonnullByDefault.java rename to src/main/java/com/modularmc/registrate/util/nullness/FieldsAreNonnullByDefault.java index 58c648a..cb23b90 100644 --- a/src/main/java/com/tterrag/registrate/util/nullness/FieldsAreNonnullByDefault.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/FieldsAreNonnullByDefault.java @@ -1,4 +1,4 @@ -package com.tterrag.registrate.util.nullness; +package com.modularmc.registrate.util.nullness; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; @@ -10,7 +10,8 @@ import javax.annotation.meta.TypeQualifierDefault; /** - * This annotation can be applied to a package or class to indicate that the fields in that element are nonnull by default unless there is: + * This annotation can be applied to a package or class to indicate that the fields in that element are nonnull by + * default unless there is: *

        *
      • An explicit nullness annotation *
      • there is a default parameter annotation applied to a more tightly nested element. @@ -20,6 +21,5 @@ @Nonnull @TypeQualifierDefault(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.PACKAGE, ElementType.TYPE}) -public @interface FieldsAreNonnullByDefault { -} +@Target({ ElementType.PACKAGE, ElementType.TYPE }) +public @interface FieldsAreNonnullByDefault {} diff --git a/src/main/java/com/tterrag/registrate/util/nullness/NonNullBiConsumer.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiConsumer.java similarity index 84% rename from src/main/java/com/tterrag/registrate/util/nullness/NonNullBiConsumer.java rename to src/main/java/com/modularmc/registrate/util/nullness/NonNullBiConsumer.java index a93213e..db7880a 100644 --- a/src/main/java/com/tterrag/registrate/util/nullness/NonNullBiConsumer.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiConsumer.java @@ -1,10 +1,10 @@ -package com.tterrag.registrate.util.nullness; +package com.modularmc.registrate.util.nullness; import java.util.function.BiConsumer; @FunctionalInterface public interface NonNullBiConsumer<@NonnullType T, @NonnullType U> extends BiConsumer { - + @Override void accept(T t, U u); diff --git a/src/main/java/com/tterrag/registrate/util/nullness/NonNullBiFunction.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiFunction.java similarity index 80% rename from src/main/java/com/tterrag/registrate/util/nullness/NonNullBiFunction.java rename to src/main/java/com/modularmc/registrate/util/nullness/NonNullBiFunction.java index f82fa43..e64b345 100644 --- a/src/main/java/com/tterrag/registrate/util/nullness/NonNullBiFunction.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiFunction.java @@ -1,10 +1,10 @@ -package com.tterrag.registrate.util.nullness; +package com.modularmc.registrate.util.nullness; import java.util.function.BiFunction; @FunctionalInterface public interface NonNullBiFunction<@NonnullType T, @NonnullType U, @NonnullType R> extends BiFunction { - + @Override R apply(T t, U u); } diff --git a/src/main/java/com/tterrag/registrate/util/nullness/NonNullConsumer.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullConsumer.java similarity index 73% rename from src/main/java/com/tterrag/registrate/util/nullness/NonNullConsumer.java rename to src/main/java/com/modularmc/registrate/util/nullness/NonNullConsumer.java index b3422b2..f9ef790 100644 --- a/src/main/java/com/tterrag/registrate/util/nullness/NonNullConsumer.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullConsumer.java @@ -1,19 +1,22 @@ -package com.tterrag.registrate.util.nullness; +package com.modularmc.registrate.util.nullness; import java.util.Objects; import java.util.function.Consumer; @FunctionalInterface public interface NonNullConsumer<@NonnullType T> extends Consumer { - + @Override void accept(T t); - + default NonNullConsumer andThen(NonNullConsumer after) { Objects.requireNonNull(after); - return (T t) -> { accept(t); after.accept(t); }; + return (T t) -> { + accept(t); + after.accept(t); + }; } - + static NonNullConsumer noop() { return t -> {}; } diff --git a/src/main/java/com/tterrag/registrate/util/nullness/NonNullFunction.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullFunction.java similarity index 89% rename from src/main/java/com/tterrag/registrate/util/nullness/NonNullFunction.java rename to src/main/java/com/modularmc/registrate/util/nullness/NonNullFunction.java index 6d952be..5d229b6 100644 --- a/src/main/java/com/tterrag/registrate/util/nullness/NonNullFunction.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullFunction.java @@ -1,4 +1,4 @@ -package com.tterrag.registrate.util.nullness; +package com.modularmc.registrate.util.nullness; import java.util.Objects; import java.util.function.Function; diff --git a/src/main/java/com/tterrag/registrate/util/nullness/NonNullSupplier.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullSupplier.java similarity index 93% rename from src/main/java/com/tterrag/registrate/util/nullness/NonNullSupplier.java rename to src/main/java/com/modularmc/registrate/util/nullness/NonNullSupplier.java index b4e4ac3..87df48e 100644 --- a/src/main/java/com/tterrag/registrate/util/nullness/NonNullSupplier.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullSupplier.java @@ -1,4 +1,4 @@ -package com.tterrag.registrate.util.nullness; +package com.modularmc.registrate.util.nullness; import net.neoforged.neoforge.common.util.Lazy; @@ -7,14 +7,14 @@ @FunctionalInterface public interface NonNullSupplier<@NonnullType T> extends Supplier { - + @Override T get(); static NonNullSupplier of(Supplier<@NullableType T> sup) { return of(sup, () -> "Unexpected null value from supplier"); } - + static NonNullSupplier of(Supplier<@NullableType T> sup, NonNullSupplier errorMsg) { return () -> { T res = sup.get(); diff --git a/src/main/java/com/tterrag/registrate/util/nullness/NonNullUnaryOperator.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullUnaryOperator.java similarity index 88% rename from src/main/java/com/tterrag/registrate/util/nullness/NonNullUnaryOperator.java rename to src/main/java/com/modularmc/registrate/util/nullness/NonNullUnaryOperator.java index 794c375..b8cb544 100644 --- a/src/main/java/com/tterrag/registrate/util/nullness/NonNullUnaryOperator.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullUnaryOperator.java @@ -1,4 +1,4 @@ -package com.tterrag.registrate.util.nullness; +package com.modularmc.registrate.util.nullness; import java.util.Objects; diff --git a/src/main/java/com/tterrag/registrate/util/nullness/NonnullType.java b/src/main/java/com/modularmc/registrate/util/nullness/NonnullType.java similarity index 66% rename from src/main/java/com/tterrag/registrate/util/nullness/NonnullType.java rename to src/main/java/com/modularmc/registrate/util/nullness/NonnullType.java index e3f88ec..a592b2c 100644 --- a/src/main/java/com/tterrag/registrate/util/nullness/NonnullType.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonnullType.java @@ -1,4 +1,4 @@ -package com.tterrag.registrate.util.nullness; +package com.modularmc.registrate.util.nullness; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; @@ -11,9 +11,8 @@ /** * An alternative to {@link javax.annotation.Nonnull} which works on type parameters (J8 feature). */ -@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) +@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE_PARAMETER, ElementType.TYPE_USE }) @Retention(RetentionPolicy.RUNTIME) @Documented @Nonnull -public @interface NonnullType { -} \ No newline at end of file +public @interface NonnullType {} diff --git a/src/main/java/com/tterrag/registrate/util/nullness/NullableSupplier.java b/src/main/java/com/modularmc/registrate/util/nullness/NullableSupplier.java similarity index 90% rename from src/main/java/com/tterrag/registrate/util/nullness/NullableSupplier.java rename to src/main/java/com/modularmc/registrate/util/nullness/NullableSupplier.java index 6be520e..5400b10 100644 --- a/src/main/java/com/tterrag/registrate/util/nullness/NullableSupplier.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NullableSupplier.java @@ -1,28 +1,28 @@ -package com.tterrag.registrate.util.nullness; +package com.modularmc.registrate.util.nullness; import java.util.Objects; import java.util.function.Supplier; @Deprecated public interface NullableSupplier<@NullableType T> extends Supplier { - + @Override T get(); default T getNonNull() { return getNonNull(() -> "Unexpected null value from supplier"); } - + default T getNonNull(NonNullSupplier errorMsg) { T res = get(); Objects.requireNonNull(res, errorMsg); return res; } - + default NonNullSupplier asNonNull() { return () -> getNonNull(); } - + default NonNullSupplier asNonNull(NonNullSupplier errorMsg) { return () -> getNonNull(errorMsg); } diff --git a/src/main/java/com/tterrag/registrate/util/nullness/NullableType.java b/src/main/java/com/modularmc/registrate/util/nullness/NullableType.java similarity index 66% rename from src/main/java/com/tterrag/registrate/util/nullness/NullableType.java rename to src/main/java/com/modularmc/registrate/util/nullness/NullableType.java index 5ddd53f..e01dfa7 100644 --- a/src/main/java/com/tterrag/registrate/util/nullness/NullableType.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NullableType.java @@ -1,4 +1,4 @@ -package com.tterrag.registrate.util.nullness; +package com.modularmc.registrate.util.nullness; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; @@ -11,9 +11,8 @@ /** * An alternative to {@link javax.annotation.Nullable} which works on type parameters (J8 feature). */ -@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) +@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE_PARAMETER, ElementType.TYPE_USE }) @Retention(RetentionPolicy.RUNTIME) @Documented @Nullable -public @interface NullableType { -} \ No newline at end of file +public @interface NullableType {} diff --git a/src/main/java/com/modularmc/registrate/util/nullness/package-info.java b/src/main/java/com/modularmc/registrate/util/nullness/package-info.java new file mode 100644 index 0000000..e692918 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/util/nullness/package-info.java @@ -0,0 +1,4 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.modularmc.registrate.util.nullness; diff --git a/src/main/java/com/modularmc/registrate/util/package-info.java b/src/main/java/com/modularmc/registrate/util/package-info.java new file mode 100644 index 0000000..e1e0c2d --- /dev/null +++ b/src/main/java/com/modularmc/registrate/util/package-info.java @@ -0,0 +1,6 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.modularmc.registrate.util; + +import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/main/java/com/tterrag/registrate/builders/BiomeBuilder.java b/src/main/java/com/tterrag/registrate/builders/BiomeBuilder.java deleted file mode 100644 index 6d2bd61..0000000 --- a/src/main/java/com/tterrag/registrate/builders/BiomeBuilder.java +++ /dev/null @@ -1,450 +0,0 @@ -//package com.tterrag.registrate.builders; -// -//import java.util.Arrays; -//import java.util.EnumSet; -// -//import javax.annotation.Nonnull; -// -//import com.google.common.collect.HashMultimap; -//import com.google.common.collect.Multimap; -//import com.tterrag.registrate.AbstractRegistrate; -//import com.tterrag.registrate.providers.RegistrateLangProvider; -//import com.tterrag.registrate.util.nullness.NonNullConsumer; -//import com.tterrag.registrate.util.nullness.NonNullFunction; -//import com.tterrag.registrate.util.nullness.NonNullSupplier; -//import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; -//import com.tterrag.registrate.util.nullness.NonnullType; -// -//import net.minecraft.entity.EntityClassification; -//import net.minecraft.entity.EntityType; -//import net.minecraft.world.biome.Biome; -//import net.minecraft.world.biome.Biome.SpawnListEntry; -//import net.minecraft.world.gen.GenerationStage.Carving; -//import net.minecraft.world.gen.GenerationStage.Decoration; -//import net.minecraft.world.gen.carver.ConfiguredCarver; -//import net.minecraft.world.gen.carver.EmptyCarverConfig; -//import net.minecraft.world.gen.carver.ICarverConfig; -//import net.minecraft.world.gen.carver.WorldCarver; -//import net.minecraft.world.gen.feature.ConfiguredFeature; -//import net.minecraft.world.gen.feature.Feature; -//import net.minecraft.world.gen.feature.IFeatureConfig; -//import net.minecraft.world.gen.feature.NoFeatureConfig; -//import net.minecraft.world.gen.placement.IPlacementConfig; -//import net.minecraft.world.gen.placement.NoPlacementConfig; -//import net.minecraft.world.gen.placement.Placement; -//import net.minecraftforge.common.BiomeDictionary; -//import net.minecraftforge.common.BiomeManager; -// -///** -// * A builder for biomes, allows for customization of the {@link Biome.Builder biome properties}, and configuration of data associated with biomes (lang). -// * -// * @param -// * The type of biome being built -// * @param

        -// * Parent object type -// */ -//public class BiomeBuilder extends AbstractBuilder> { -// -// /** -// * Create a new {@link BiomeBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. -// *

        -// * The biome will be assigned the following data: -// *

          -// *
        • The default translation (via {@link #defaultLang()})
        • -// *
        -// * -// * @param -// * The type of the builder -// * @param

        -// * Parent object type -// * @param owner -// * The owning {@link AbstractRegistrate} object -// * @param parent -// * The parent object -// * @param name -// * Name of the entry being built -// * @param callback -// * A callback used to actually register the built entry -// * @param factory -// * Factory to create the biome -// * @return A new {@link BiomeBuilder} with reasonable default data generators. -// */ -// public static BiomeBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { -// return new BiomeBuilder<>(owner, parent, name, callback, factory) -// .defaultLang(); -// } -// -// private final NonNullFunction factory; -// -// private NonNullSupplier initialProperties = Biome.Builder::new; -// private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); -// -// private final Multimap>> features = HashMultimap.create(); -// private final Multimap>> carvers = HashMultimap.create(); -// private final Multimap> spawns = HashMultimap.create(); -// -// @SuppressWarnings("null") -// private final EnumSet configuredTypes = EnumSet.noneOf(BiomeManager.BiomeType.class); -// -// protected BiomeBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { -// super(owner, parent, name, callback, Biome.class); -// this.factory = factory; -// } -// -// /** -// * Modify the properties of the biome. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform -// * different operations. -// *

        -// * If a different properties instance is returned, it will replace the existing one entirely. -// * -// * @param func -// * The action to perform on the properties -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder properties(NonNullUnaryOperator func) { -// propertiesCallback = propertiesCallback.andThen(func); -// return this; -// } -// -// /** -// * Replace the initial state of the biome properties, without replacing or removing any modifications done via {@link #properties(NonNullUnaryOperator)}. -// * -// * @param properties -// * A supplier to to create the initial properties -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder initialProperties(NonNullSupplier properties) { -// initialProperties = properties; -// return this; -// } -// -// /** -// * Set the weight for this biome to generate in the overworld in regions matching the given type. This can only be called once per type. -// * -// * @param type -// * The type that controls which climates the biome will spawn in -// * @param weight -// * The weight, or how common this biome should be in that climate -// * @return this {@link BiomeBuilder} -// * @see BiomeManager -// * @throws IllegalArgumentException -// * if this type has already had its weight set -// */ -// public BiomeBuilder typeWeight(BiomeManager.BiomeType type, int weight) { -// if (!configuredTypes.add(type)) { -// throw new IllegalArgumentException("Cannot set a type weight more than once."); -// } -// this.onRegister(b -> BiomeManager.addBiome(type, new BiomeManager.BiomeEntry(b, weight))); -// return this; -// } -// -// /** -// * Add types to the {@link BiomeDictionary} for this biome. Can be called multiple times to add more types. -// * -// * @param types -// * The types to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addDictionaryTypes(BiomeDictionary.Type... types) { -// this.onRegister(b -> BiomeDictionary.addTypes(b, types)); -// return this; -// } -// -// /** -// * Manually add what would have been the "best guess" types from the {@link BiomeDictionary} for this biome. This has no effect if no types are added via -// * {@link #addDictionaryTypes(net.minecraftforge.common.BiomeDictionary.Type...)}. -// * -// * @return this {@link BiomeBuilder} -// * @see BiomeDictionary#makeBestGuess(Biome) -// */ -// public BiomeBuilder forceAutomaticDictionaryTypes() { -// this.onRegister(BiomeDictionary::makeBestGuess); -// return this; -// } -// -// /** -// * Copy all {@link Feature features} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy features from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copyFeatures(NonNullSupplier biome) { -// addFeatures(b -> Arrays.stream(Decoration.values()) -// .forEach(d -> biome.get().getFeatures(d).stream() -// .forEach(f -> b.addFeature(d, f)))); -// return this; -// } -// -// /** -// * Add a feature to this biome, where neither the feature nor the placement have a config. -// * -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param placement -// * How the feature will be placed -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, NonNullSupplier> placement) { -// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement); -// } -// -// /** -// * Add a feature to this biome, where the placement does not have a config. -// * -// * @param -// * The type of config the feature requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param featureConfig -// * The config for the feature -// * @param placement -// * How the feature will be placed -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, FC featureConfig, NonNullSupplier> placement) { -// return addFeature(stage, feature, featureConfig, placement, IPlacementConfig.NO_PLACEMENT_CONFIG); -// } -// -// /** -// * Add a feature to this biome, where the feature does not have a config. -// * @param -// * The type of config the placement requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param placement -// * How the feature will be placed -// * @param placementConfig -// * The config for the placement -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, NonNullSupplier> placement, PC placementConfig) { -// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement, placementConfig); -// } -// -// /** -// * Add a feature to this biome. -// * -// * @param -// * The type of config the feature requires -// * @param -// * The type of config the placement requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param featureConfig -// * The config for the feature -// * @param placement -// * How the feature will be placed -// * @param placementConfig -// * The config for the placement -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, FC featureConfig, NonNullSupplier> placement, PC placementConfig) { -// return addConfiguredFeature(stage, () -> feature.get().withConfiguration(featureConfig).withPlacement(placement.get().configure(placementConfig))); -// } -// -// /** -// * Add a pre-configured feature to this biome. -// * -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addConfiguredFeature(Decoration stage, NonNullSupplier> feature) { -// if (this.features.isEmpty()) { -// addFeatures(b -> this.features.forEach((d, f) -> b.addFeature(d, f.get()))); -// } -// this.features.put(stage, feature); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link Feature Features} are registered, for the purpose of adding them to this biome. -// *

        -// * Any {@link Feature} object can be safely referenced here and added to the biome via {@link Biome#addFeature(Decoration, ConfiguredFeature)} -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add features to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeatures(NonNullConsumer action) { -// this.>onRegisterAfter(Feature.class, action); -// return this; -// } -// -// /** -// * Copy all {@link WorldCarver carvers} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy carvers from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copyCarvers(NonNullSupplier biome) { -// addCarvers(b -> Arrays.stream(Carving.values()) -// .forEach(s -> biome.get().getCarvers(s).stream() -// .forEach(c -> b.addCarver(s, c)))); -// return this; -// } -// -// /** -// * Add a carver to this biome, where the carver does not have a config. -// * -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver) { -// return addCarver(type, carver, ICarverConfig.field_214644_a); -// } -// -// /** -// * Add a carver to this biome. -// * -// * @param The type of config the carver requires -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @param carverConfig -// * The config for the carver -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver, CC carverConfig) { -// return addConfiguredCarver(type, () -> Biome.createCarver(carver.get(), carverConfig)); -// } -// -// /** -// * Add a pre-configured carver to this biome. -// * -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addConfiguredCarver(Carving type, NonNullSupplier> carver) { -// if (this.features.isEmpty()) { -// addCarvers(b -> this.carvers.forEach((s, f) -> b.addCarver(s, f.get()))); -// } -// this.carvers.put(type, carver); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link WorldCarver WorldCarvers} are registered, for the purpose of adding them to this biome. -// *

        -// * Any {@link WorldCarver} object can be safely referenced here and added to the biome via {@link Biome#addCarver(Carving, ConfiguredCarver)} -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add carvers to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarvers(NonNullConsumer action) { -// this.> onRegisterAfter(WorldCarver.class, action); -// return this; -// } -// -// /** -// * Copy all {@link SpawnListEntry spawns} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy spawns from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copySpawns(NonNullSupplier biome) { -// addSpawns(b -> Arrays.stream(EntityClassification.values()) -// .forEach(ec -> biome.get().getSpawns(ec).stream() -// .forEach(s -> b.getSpawns(ec).add(s)))); -// return this; -// } -// -// /** -// * Add an entity spawn to this biome. -// * -// * @param type -// * The classification of the spawn, which controls how and when the entity is spawned -// * @param entity -// * The entity to spawn -// * @param weight -// * The weight of the spawn, i.e. how likely it is compared to other spawn entries to be selected -// * @param minGroupSize -// * A minimum size of entities to spawn at once -// * @param maxGroupSize -// * A maximum size of entities to spawn at once -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier> entity, int weight, int minGroupSize, int maxGroupSize) { -// return addSpawn(type, () -> new SpawnListEntry(entity.get(), weight, minGroupSize, maxGroupSize)); -// } -// -// /** -// * Add an entity spawn to this biome. -// * -// * @param type -// * The classification of the spawn, which controls how and when the entity is spawned -// * @param spawn -// * The spawn entry to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier spawn) { -// if (this.spawns.isEmpty()) { -// this.addSpawns(b -> this.spawns.forEach((c, s) -> b.getSpawns(c).add(s.get()))); -// } -// this.spawns.put(type, spawn); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link EntityType Entities} are registered, for the purpose of adding entity spawns to this biome. -// *

        -// * Any {@link EntityType} object can be safely referenced here and added to the biome via {@link Biome#getSpawns(EntityClassification)}. -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add spawns to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawns(NonNullConsumer action) { -// this.> onRegisterAfter(EntityType.class, action); -// return this; -// } -// -// /** -// * Assign the default translation, as specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier)}. This is the default, so it is generally not necessary to call, unless for -// * undoing previous changes. -// * -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder defaultLang() { -// return lang(Biome::getTranslationKey); -// } -// -// /** -// * Set the translation for this biome. -// * -// * @param name -// * A localized English name -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder lang(String name) { -// return lang(Biome::getTranslationKey, name); -// } -// -// @Override -// protected @NonnullType T createEntry() { -// @Nonnull Biome.Builder properties = this.initialProperties.get(); -// properties = propertiesCallback.apply(properties); -// return factory.apply(properties); -// } -//} diff --git a/src/main/java/com/tterrag/registrate/builders/BuilderCallback.java b/src/main/java/com/tterrag/registrate/builders/BuilderCallback.java deleted file mode 100644 index ab1d006..0000000 --- a/src/main/java/com/tterrag/registrate/builders/BuilderCallback.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.tterrag.registrate.builders; - -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.util.entry.RegistryEntry; -import com.tterrag.registrate.util.nullness.NonNullFunction; -import com.tterrag.registrate.util.nullness.NonNullSupplier; - -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceKey; -import net.neoforged.neoforge.registries.DeferredHolder; - -/** - * A callback passed to {@link Builder builders} from the owning {@link AbstractRegistrate} which will add a registration for the built entry that lazily creates and registers it. - */ -@FunctionalInterface -public interface BuilderCallback { - - /** - * Accept a built entry, to later be constructed and registered. - * - * @param - * The registry type to which the entry will be registered - * @param - * The type of the entry - * @param name - * The name of the entry - * @param type - * A {@link ResourceKey} representing the registry type - * @param builder - * The builder performing this callback - * @param factory - * A {@link NonNullSupplier} that will create the entry - * @param entryFactory - * A {@link NonNullFunction} which accepts the entry delegate and returns a {@link RegistryEntry} wrapper - * @return A {@link RegistryEntry} that will supply the registered entry - */ - RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier factory, NonNullFunction, ? extends RegistryEntry> entryFactory); - - /** - * Accept a built entry, to later be constructed and registered. Uses the default {@link RegistryEntry#RegistryEntry(AbstractRegistrate, DeferredHolder) RegistryEntry factory}. - * - * @param - * The registry type to which the entry will be registered - * @param - * The type of the entry - * @param name - * The name of the entry - * @param type - * A {@link Class} representing the registry type - * @param builder - * The builder performing this callback - * @param factory - * A {@link NonNullSupplier} that will create the entry - * @return A {@link RegistryEntry} that will supply the registered entry - */ - default RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier factory) { - return accept(name, type, builder, factory, delegate -> new RegistryEntry<>(builder.getOwner(), delegate)); - } -} diff --git a/src/main/java/com/tterrag/registrate/builders/package-info.java b/src/main/java/com/tterrag/registrate/builders/package-info.java deleted file mode 100644 index 3ff00b6..0000000 --- a/src/main/java/com/tterrag/registrate/builders/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@com.tterrag.registrate.util.nullness.FieldsAreNonnullByDefault -package com.tterrag.registrate.builders; \ No newline at end of file diff --git a/src/main/java/com/tterrag/registrate/package-info.java b/src/main/java/com/tterrag/registrate/package-info.java deleted file mode 100644 index 7184eae..0000000 --- a/src/main/java/com/tterrag/registrate/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@com.tterrag.registrate.util.nullness.FieldsAreNonnullByDefault -package com.tterrag.registrate; \ No newline at end of file diff --git a/src/main/java/com/tterrag/registrate/providers/DataProviderInitializer.java b/src/main/java/com/tterrag/registrate/providers/DataProviderInitializer.java deleted file mode 100644 index 630a8aa..0000000 --- a/src/main/java/com/tterrag/registrate/providers/DataProviderInitializer.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.tterrag.registrate.providers; - -import com.mojang.datafixers.util.Pair; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistrySetBuilder; -import net.minecraft.resources.ResourceKey; - -import javax.annotation.Nullable; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -public class DataProviderInitializer { - - private final RegistrySetBuilder datapackEntryProvider = new RegistrySetBuilder(); - - private final Map, ProviderType> providerDependencies = new ConcurrentHashMap<>(); - - public DataProviderInitializer() { - addDependency(ProviderType.ITEM_TAGS, ProviderType.BLOCK_TAGS); - } - - protected RegistrySetBuilder getDatapackRegistryProviders() { - return datapackEntryProvider; - } - - protected List getSortedProviders() { - List ans = new ArrayList<>(); - Set> added = new HashSet<>(); - List>> remain = new ArrayList<>(RegistrateDataProvider.TYPES.entrySet()); - while (!remain.isEmpty()) { - if (!remain.removeIf(e -> { - ProviderType type = e.getValue(); - var parent = providerDependencies.get(type); - if (parent == null || added.contains(parent)) { - ans.add(new Sorted(e.getKey(), type, parent)); - added.add(type); - return true; - } - return false; - })) throw new IllegalStateException("Looping dependency detected: " + remain); - } - return ans; - } - - public void add(ResourceKey> registry, RegistrySetBuilder.RegistryBootstrap provider) { - datapackEntryProvider.add(registry, provider); - } - - public void addDependency(ProviderType dependent, ProviderType parent) { - var old = providerDependencies.put(dependent, parent); - if (old != null) throw new IllegalStateException("Providers can have only 1 prerequisite"); - } - - public record Sorted( - String id, ProviderType type, - @Nullable ProviderType parent - ) { - } - -} diff --git a/src/main/java/com/tterrag/registrate/providers/GeneratorType.java b/src/main/java/com/tterrag/registrate/providers/GeneratorType.java deleted file mode 100644 index 48d4b31..0000000 --- a/src/main/java/com/tterrag/registrate/providers/GeneratorType.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.tterrag.registrate.providers; - -public interface GeneratorType { -} diff --git a/src/main/java/com/tterrag/registrate/providers/RegistrateDataMapProvider.java b/src/main/java/com/tterrag/registrate/providers/RegistrateDataMapProvider.java deleted file mode 100644 index ad84f00..0000000 --- a/src/main/java/com/tterrag/registrate/providers/RegistrateDataMapProvider.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.tterrag.registrate.providers; - -import com.tterrag.registrate.AbstractRegistrate; -import net.minecraft.core.HolderLookup; -import net.minecraft.data.PackOutput; -import net.neoforged.fml.LogicalSide; -import net.neoforged.neoforge.common.data.DataMapProvider; -import org.jetbrains.annotations.Nullable; - -import java.util.concurrent.CompletableFuture; - -public class RegistrateDataMapProvider extends DataMapProvider implements RegistrateProvider { - - private final AbstractRegistrate parent; - - @Nullable - private HolderLookup.Provider provider; - - protected RegistrateDataMapProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture pvd) { - super(output, pvd); - this.parent = parent; - } - - @Override - public LogicalSide getSide() { - return LogicalSide.SERVER; - } - - /** - * Generate data map entries. - * - * @param provider - */ - @Override - protected void gather(HolderLookup.Provider provider) { - this.provider = provider; - parent.genData(ProviderType.DATA_MAP, this); - this.provider = null; - } - - public HolderLookup.Provider getProvider() { - if (provider == null) throw new IllegalStateException("Holder Lookup Provider is not available now"); - return provider; - } - -} diff --git a/src/main/java/com/tterrag/registrate/providers/RegistrateDatapackProvider.java b/src/main/java/com/tterrag/registrate/providers/RegistrateDatapackProvider.java deleted file mode 100644 index c21cef7..0000000 --- a/src/main/java/com/tterrag/registrate/providers/RegistrateDatapackProvider.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tterrag.registrate.providers; - -import com.tterrag.registrate.AbstractRegistrate; -import net.minecraft.core.HolderLookup; -import net.minecraft.data.PackOutput; -import net.minecraft.data.registries.RegistryPatchGenerator; -import net.neoforged.fml.LogicalSide; -import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; - -import java.util.Set; -import java.util.concurrent.CompletableFuture; - -public class RegistrateDatapackProvider extends DatapackBuiltinEntriesProvider implements RegistrateLookupFillerProvider { - - public RegistrateDatapackProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture provider) { - super(output, RegistryPatchGenerator.createLookup(provider, parent.getDataGenInitializer().getDatapackRegistryProviders()), Set.of(parent.getModid())); - } - - @Override - public CompletableFuture getFilledProvider() { - return getRegistryProvider(); - } - - @Override - public LogicalSide getSide() { - return LogicalSide.SERVER; - } - -} diff --git a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java b/src/main/java/com/tterrag/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java deleted file mode 100644 index 58b932f..0000000 --- a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.tterrag.registrate.providers.generators; - -import net.minecraft.client.data.models.model.ModelInstance; -import net.minecraft.client.data.models.model.TextureMapping; -import net.minecraft.client.data.models.model.TextureSlot; -import net.minecraft.client.resources.model.UnbakedModel; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.level.block.Block; -import net.neoforged.neoforge.client.event.RegisterNamedRenderTypesEvent; -import net.neoforged.neoforge.client.model.generators.template.CustomLoaderBuilder; -import net.neoforged.neoforge.client.model.generators.template.ExtendedModelTemplateBuilder; -import net.neoforged.neoforge.client.model.generators.template.RootTransformsBuilder; -import net.neoforged.neoforge.client.model.generators.template.TransformVecBuilder; - -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class RegistrateLegacyBlockModelBuilder { - - private final ExtendedModelTemplateBuilder template; - private final TextureMapping texture; - private final BiConsumer output; - - RegistrateLegacyBlockModelBuilder(BiConsumer output, ExtendedModelTemplateBuilder template, TextureMapping texture) { - this.output = output; - this.template = template; - this.texture = texture.copy(); - } - - public RegistrateLegacyBlockModelBuilder texture(TextureSlot slot, ResourceLocation texture) { - this.template.requiredTextureSlot(slot); - this.texture.put(slot, texture); - return this; - } - - public RegistrateLegacyBlockModelBuilder transformTemplate(Consumer action) { - action.accept(template); - return this; - } - - public RegistrateLegacyBlockModelBuilder transformTexture(Consumer action) { - action.accept(texture); - return this; - } - - public ResourceLocation build(Block block) { - return template.build().create(block, texture, output); - } - - public ResourceLocation build(ResourceLocation loc) { - return template.build().create(loc, texture, output); - } - - // Delegated methods from Template Builder - - /** - * Parent model which this template will inherit its properties from. - */ - public RegistrateLegacyBlockModelBuilder parent(ResourceLocation parent) { - template.parent(parent); - return this; - } - - /** - * Suffix appended onto the models file path. - */ - public RegistrateLegacyBlockModelBuilder suffix(String suffix) { - template.suffix(suffix); - return this; - } - - /** - * Set the render type for this model. - * - * @param renderType the render type. Must be registered via - * {@link RegisterNamedRenderTypesEvent} - * @return this builder - * @throws NullPointerException if {@code renderType} is {@code null} - */ - public RegistrateLegacyBlockModelBuilder renderType(String renderType) { - template.renderType(renderType); - return this; - } - - /** - * Set the render type for this model. - * - * @param renderType the render type. Must be registered via - * {@link RegisterNamedRenderTypesEvent} - * @return this builder - * @throws NullPointerException if {@code renderType} is {@code null} - */ - public RegistrateLegacyBlockModelBuilder renderType(ResourceLocation renderType) { - template.renderType(renderType); - return this; - } - - /** - * Begin building a new transform for the given perspective. - * - * @param type the perspective to create or return the builder for - * @return the builder for the given perspective - * @throws NullPointerException if {@code type} is {@code null} - */ - public RegistrateLegacyBlockModelBuilder transform(ItemDisplayContext type, Consumer action) { - template.transform(type, action); - return this; - } - - /** - * Sets whether or not this model should apply ambient occlusion. - */ - public RegistrateLegacyBlockModelBuilder ambientOcclusion(boolean ambientOcclusion) { - template.ambientOcclusion(ambientOcclusion); - return this; - } - - /** - * Sets the gui light style for this model. - * - *

          - *
        • {@link UnbakedModel.GuiLight#FRONT} for head on light, commonly used for items.
        • - *
        • {@link UnbakedModel.GuiLight#SIDE} for the model to be side lit, commonly used for blocks.
        • - *
        - */ - public RegistrateLegacyBlockModelBuilder guiLight(UnbakedModel.GuiLight light) { - template.guiLight(light); - return this; - } - - /** - * Use a custom loader instead of the vanilla elements. - * - * @param customLoaderFactory function that returns the custom loader to set, given this - * @return the custom loader builder - */ - public RegistrateLegacyBlockModelBuilder customLoader(Supplier customLoaderFactory, Consumer action) { - template.customLoader(customLoaderFactory, action); - return this; - } - - /** - * Modifies the transformation applied right before item display transformations and rotations specified in block states. - */ - public RegistrateLegacyBlockModelBuilder rootTransforms(Consumer action) { - template.rootTransforms(action); - return this; - } - -} diff --git a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateModelProvider.java b/src/main/java/com/tterrag/registrate/providers/generators/RegistrateModelProvider.java deleted file mode 100644 index 9ea8ddd..0000000 --- a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateModelProvider.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tterrag.registrate.providers.generators; - -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.RegistrateProvider; -import net.minecraft.client.data.models.BlockModelGenerators; -import net.minecraft.client.data.models.ItemModelGenerators; -import net.minecraft.client.data.models.ModelProvider; -import net.minecraft.data.PackOutput; -import net.neoforged.fml.LogicalSide; - -public class RegistrateModelProvider extends ModelProvider implements RegistrateProvider { - - private final AbstractRegistrate parent; - - public RegistrateModelProvider(AbstractRegistrate parent, PackOutput p_388260_) { - super(p_388260_, parent.getModid()); - this.parent = parent; - } - - @Override - protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels) { - new RegistrateBlockModelGenerator(parent, blockModels.blockStateOutput, blockModels.itemModelOutput, blockModels.modelOutput).run(); - new RegistrateItemModelGenerator(parent, itemModels.itemModelOutput, itemModels.modelOutput).run(); - } - - @Override - public LogicalSide getSide() { - return LogicalSide.CLIENT; - } - -} diff --git a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateRecipeProvider.java b/src/main/java/com/tterrag/registrate/providers/generators/RegistrateRecipeProvider.java deleted file mode 100644 index b0f67fe..0000000 --- a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateRecipeProvider.java +++ /dev/null @@ -1,697 +0,0 @@ -package com.tterrag.registrate.providers.generators; - -import com.google.common.collect.ImmutableMap; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.util.DataIngredient; -import com.tterrag.registrate.util.nullness.NonNullSupplier; -import lombok.experimental.Delegate; -import net.minecraft.advancements.Criterion; -import net.minecraft.advancements.critereon.EnterBlockTrigger; -import net.minecraft.advancements.critereon.InventoryChangeTrigger; -import net.minecraft.advancements.critereon.ItemPredicate; -import net.minecraft.advancements.critereon.MinMaxBounds; -import net.minecraft.core.Holder; -import net.minecraft.core.HolderLookup; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.BlockFamily; -import net.minecraft.data.recipes.*; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.flag.FeatureFlagSet; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.*; -import net.minecraft.world.item.equipment.trim.TrimPattern; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.SuspiciousEffectHolder; -import net.neoforged.neoforge.common.Tags; - -import javax.annotation.CheckReturnValue; -import javax.annotation.Generated; -import javax.annotation.Nullable; -import java.util.List; -import java.util.function.Supplier; - -public class RegistrateRecipeProvider extends RecipeProvider implements RecipeOutput { - - private final RegistrateRecipeRunner runner; - - @Delegate - private final RecipeOutput outputDelegated; - - private final HolderLookup itemLookup; - private final HolderLookup blockLookup; - private final HolderLookup> entityLookup; - - public RegistrateRecipeProvider(RegistrateRecipeRunner runner, HolderLookup.Provider registries, RecipeOutput output) { - super(registries, output); - this.runner = runner; - this.outputDelegated = output; - itemLookup = registries.lookupOrThrow(Registries.ITEM); - blockLookup = registries.lookupOrThrow(Registries.BLOCK); - entityLookup = registries.lookupOrThrow(Registries.ENTITY_TYPE); - } - - @Override - public void buildRecipes() { - runner.provider = this; - runner.owner.genData(ProviderType.RECIPE, this); - runner.provider = null; - } - - public HolderLookup.Provider registries() { - return registries; - } - - public HolderLookup itemLookup() { - return itemLookup; - } - - public HolderLookup blockLookup() { - return blockLookup; - } - - public HolderLookup> entityLookup() { - return entityLookup; - } - - public Holder resolve(ResourceKey key) { - return registries.lookupOrThrow(key.registryKey()).getOrThrow(key); - } - - public ResourceLocation safeId(ResourceLocation id) { - return ResourceLocation.fromNamespaceAndPath(runner.owner.getModid(), safeName(id)); - } - - public ResourceLocation safeId(DataIngredient source) { - return safeId(source.getId()); - } - - public ResourceLocation safeId(ItemLike registryEntry) { - return safeId(BuiltInRegistries.ITEM.getKey(registryEntry.asItem())); - } - - public ResourceKey> safeKey(ResourceLocation id) { - return ResourceKey.create(Registries.RECIPE, ResourceLocation.fromNamespaceAndPath(runner.owner.getModid(), safeName(id))); - } - - public ResourceKey> safeKey(DataIngredient source) { - return safeKey(source.getId()); - } - - public ResourceKey> safeKey(ItemLike registryEntry) { - return safeKey(BuiltInRegistries.ITEM.getKey(registryEntry.asItem())); - } - - public String safeName(ResourceLocation id) { - return id.getPath().replace('/', '_'); - } - - public String safeName(DataIngredient source) { - return safeName(source.getId()); - } - - public String safeName(ItemLike registryEntry) { - return safeName(BuiltInRegistries.ITEM.getKey(registryEntry.asItem())); - } - - public static final int DEFAULT_SMELT_TIME = 200; - public static final int DEFAULT_BLAST_TIME = DEFAULT_SMELT_TIME / 2; - public static final int DEFAULT_SMOKE_TIME = DEFAULT_BLAST_TIME; - public static final int DEFAULT_CAMPFIRE_TIME = DEFAULT_SMELT_TIME * 3; - - private static final ImmutableMap, String> COOKING_TYPE_NAMES = ImmutableMap., String>builder() - .put(RecipeSerializer.SMELTING_RECIPE, "smelting") - .put(RecipeSerializer.BLASTING_RECIPE, "blasting") - .put(RecipeSerializer.SMOKING_RECIPE, "smoking") - .put(RecipeSerializer.CAMPFIRE_COOKING_RECIPE, "campfire") - .build(); - - public void cooking(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime, RecipeSerializer serializer, AbstractCookingRecipe.Factory factory) { - cooking(source, category, result, experience, cookingTime, COOKING_TYPE_NAMES.get(serializer), serializer, factory); - } - - public void cooking(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime, String typeName, RecipeSerializer serializer, AbstractCookingRecipe.Factory factory) { - SimpleCookingRecipeBuilder.generic(source.toVanilla(), category, result.get(), experience, cookingTime, serializer, factory) - .unlockedBy("has_" + safeName(source), source.getCriterion(this)) - .save(this, safeId(result.get()) + "_from_" + safeName(source) + "_" + typeName); - } - - public void smelting(DataIngredient source, RecipeCategory category, Supplier result, float experience) { - smelting(source, category, result, experience, DEFAULT_SMELT_TIME); - } - - public void smelting(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { - cooking(source, category, result, experience, cookingTime, RecipeSerializer.SMELTING_RECIPE, SmeltingRecipe::new); - } - - public void blasting(DataIngredient source, RecipeCategory category, Supplier result, float experience) { - blasting(source, category, result, experience, DEFAULT_BLAST_TIME); - } - - public void blasting(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { - cooking(source, category, result, experience, cookingTime, RecipeSerializer.BLASTING_RECIPE, BlastingRecipe::new); - } - - public void smoking(DataIngredient source, RecipeCategory category, Supplier result, float experience) { - smoking(source, category, result, experience, DEFAULT_SMOKE_TIME); - } - - public void smoking(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { - cooking(source, category, result, experience, cookingTime, RecipeSerializer.SMOKING_RECIPE, SmokingRecipe::new); - } - - public void campfire(DataIngredient source, RecipeCategory category, Supplier result, float experience) { - campfire(source, category, result, experience, DEFAULT_CAMPFIRE_TIME); - } - - public void campfire(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { - cooking(source, category, result, experience, cookingTime, RecipeSerializer.CAMPFIRE_COOKING_RECIPE, CampfireCookingRecipe::new); - } - - public void stonecutting(DataIngredient source, RecipeCategory category, Supplier result) { - stonecutting(source, category, result, 1); - } - - public void stonecutting(DataIngredient source, RecipeCategory category, Supplier result, int resultAmount) { - SingleItemRecipeBuilder.stonecutting(source.toVanilla(), category, result.get(), resultAmount) - .unlockedBy("has_" + safeName(source), source.getCriterion(this)) - .save(this, safeId(result.get()) + "_from_" + safeName(source) + "_stonecutting"); - } - - public void smeltingAndBlasting(DataIngredient source, RecipeCategory category, Supplier result, float xp) { - smelting(source, category, result, xp); - blasting(source, category, result, xp); - } - - public void food(DataIngredient source, RecipeCategory category, Supplier result, float xp) { - smelting(source, category, result, xp); - smoking(source, category, result, xp); - campfire(source, category, result, xp); - } - - public void square(DataIngredient source, RecipeCategory category, Supplier output, boolean small) { - ShapedRecipeBuilder builder = shaped(category, output.get()) - .define('X', source.toVanilla()); - if (small) { - builder.pattern("XX").pattern("XX"); - } else { - builder.pattern("XXX").pattern("XXX").pattern("XXX"); - } - builder.unlockedBy("has_" + safeName(source), source.getCriterion(this)) - .save(this, safeKey(output.get())); - } - - /** - * @param - * @param source - * @param output - * @deprecated Broken, use {@link #storage(NonNullSupplier, RecipeCategory, NonNullSupplier)} or {@link #storage(DataIngredient, RecipeCategory, NonNullSupplier, DataIngredient, NonNullSupplier)}. - */ - @Deprecated - public void storage(DataIngredient source, RecipeCategory category, NonNullSupplier output) { - square(source, category, output, false); - // This is backwards, but leaving in for binary compat - singleItemUnfinished(source, category, output, 1, 9) - .save(this, safeId(source) + "_from_" + safeName(output.get())); - } - - public void storage(NonNullSupplier source, RecipeCategory category, NonNullSupplier output) { - storage(DataIngredient.items(source), category, source, DataIngredient.items(output), output); - } - - public void storage(DataIngredient sourceIngredient, RecipeCategory category, NonNullSupplier source, DataIngredient outputIngredient, NonNullSupplier output) { - square(sourceIngredient, category, output, false); - singleItemUnfinished(outputIngredient, category, source, 1, 9) - .save(this, safeId(sourceIngredient) + "_from_" + safeName(output.get())); - } - - @CheckReturnValue - public ShapelessRecipeBuilder singleItemUnfinished(DataIngredient source, RecipeCategory category, Supplier result, int required, int amount) { - return shapeless(category, result.get(), amount) - .requires(source.toVanilla(), required) - .unlockedBy("has_" + safeName(source), source.getCriterion(this)); - } - - public void singleItem(DataIngredient source, RecipeCategory category, Supplier result, int required, int amount) { - singleItemUnfinished(source, category, result, required, amount).save(this, safeKey(result.get())); - } - - public void planks(DataIngredient source, RecipeCategory category, Supplier result) { - singleItemUnfinished(source, category, result, 1, 4) - .group("planks") - .save(this, safeKey(result.get())); - } - - public void stairs(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group, boolean stone) { - shaped(category, result.get(), 4) - .pattern("X ").pattern("XX ").pattern("XXX") - .define('X', source.toVanilla()) - .group(group) - .unlockedBy("has_" + safeName(source), source.getCriterion(this)) - .save(this, safeKey(result.get())); - if (stone) { - stonecutting(source, category, result); - } - } - - public void slab(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group, boolean stone) { - shaped(category, result.get(), 6) - .pattern("XXX") - .define('X', source.toVanilla()) - .group(group) - .unlockedBy("has_" + safeName(source), source.getCriterion(this)) - .save(this, safeKey(result.get())); - if (stone) { - stonecutting(source, category, result, 2); - } - } - - public void fence(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group) { - shaped(category, result.get(), 3) - .pattern("W#W").pattern("W#W") - .define('W', source.toVanilla()) - .define('#', Tags.Items.RODS_WOODEN) - .group(group) - .unlockedBy("has_" + safeName(source), source.getCriterion(this)) - .save(this, safeKey(result.get())); - } - - public void fenceGate(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group) { - shaped(category, result.get()) - .pattern("#W#").pattern("#W#") - .define('W', source.toVanilla()) - .define('#', Tags.Items.RODS_WOODEN) - .group(group) - .unlockedBy("has_" + safeName(source), source.getCriterion(this)) - .save(this, safeKey(result.get())); - } - - public void wall(DataIngredient source, RecipeCategory category, Supplier result) { - shaped(category, result.get(), 6) - .pattern("XXX").pattern("XXX") - .define('X', source.toVanilla()) - .unlockedBy("has_" + safeName(source), source.getCriterion(this)) - .save(this, safeKey(result.get())); - stonecutting(source, category, result); - } - - public void door(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group) { - shaped(category, result.get(), 3) - .pattern("XX").pattern("XX").pattern("XX") - .define('X', source.toVanilla()) - .group(group) - .unlockedBy("has_" + safeName(source), source.getCriterion(this)) - .save(this, safeKey(result.get())); - } - - public void trapDoor(DataIngredient source, RecipeCategory category, Supplier result, @Nullable String group) { - shaped(category, result.get(), 2) - .pattern("XXX").pattern("XXX") - .define('X', source.toVanilla()) - .group(group) - .unlockedBy("has_" + safeName(source), source.getCriterion(this)) - .save(this, safeKey(result.get())); - } - - // @formatter:off - // GENERATED START - DO NOT EDIT BELOW THIS LINE - - /** Generated override to expose protected method: {@link RecipeProvider#generateForEnabledBlockFamilies} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void generateForEnabledBlockFamilies(FeatureFlagSet enabledFeatures) { super.generateForEnabledBlockFamilies(enabledFeatures); } - - /** Generated override to expose protected method: {@link RecipeProvider#oreSmelting} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void oreSmelting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { super.oreSmelting(ingredients, category, result, experience, cookingTime, group); } - - /** Generated override to expose protected method: {@link RecipeProvider#oreBlasting} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void oreBlasting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { super.oreBlasting(ingredients, category, result, experience, cookingTime, group); } - - /** Generated override to expose protected method: {@link RecipeProvider#netheriteSmithing} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void netheriteSmithing(Item ingredientItem, RecipeCategory category, Item resultItem) { super.netheriteSmithing(ingredientItem, category, resultItem); } - - /** Generated override to expose protected method: {@link RecipeProvider#trimSmithing} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void trimSmithing(Item template, ResourceKey pattern, ResourceKey> recipe) { super.trimSmithing(template, pattern, recipe); } - - /** Generated override to expose protected method: {@link RecipeProvider#twoByTwoPacker} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void twoByTwoPacker(RecipeCategory category, ItemLike packed, ItemLike unpacked) { super.twoByTwoPacker(category, packed, unpacked); } - - /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void threeByThreePacker(RecipeCategory category, ItemLike packed, ItemLike unpacked, String criterionName) { super.threeByThreePacker(category, packed, unpacked, criterionName); } - - /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void threeByThreePacker(RecipeCategory category, ItemLike packed, ItemLike unpacked) { super.threeByThreePacker(category, packed, unpacked); } - - /** Generated override to expose protected method: {@link RecipeProvider#planksFromLog} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void planksFromLog(ItemLike planks, TagKey logs, int resultCount) { super.planksFromLog(planks, logs, resultCount); } - - /** Generated override to expose protected method: {@link RecipeProvider#planksFromLogs} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void planksFromLogs(ItemLike planks, TagKey logs, int result) { super.planksFromLogs(planks, logs, result); } - - /** Generated override to expose protected method: {@link RecipeProvider#woodFromLogs} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void woodFromLogs(ItemLike wood, ItemLike log) { super.woodFromLogs(wood, log); } - - /** Generated override to expose protected method: {@link RecipeProvider#woodenBoat} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void woodenBoat(ItemLike boat, ItemLike material) { super.woodenBoat(boat, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#chestBoat} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void chestBoat(ItemLike boat, ItemLike material) { super.chestBoat(boat, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#buttonBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder buttonBuilder(ItemLike button, Ingredient material) { return super.buttonBuilder(button, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#doorBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder doorBuilder(ItemLike door, Ingredient material) { return super.doorBuilder(door, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#fenceBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder fenceBuilder(ItemLike fence, Ingredient material) { return super.fenceBuilder(fence, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#fenceGateBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder fenceGateBuilder(ItemLike fenceGate, Ingredient material) { return super.fenceGateBuilder(fenceGate, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#pressurePlate} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void pressurePlate(ItemLike pressurePlate, ItemLike material) { super.pressurePlate(pressurePlate, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#pressurePlateBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder pressurePlateBuilder(RecipeCategory category, ItemLike pressurePlate, Ingredient material) { return super.pressurePlateBuilder(category, pressurePlate, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#slab} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void slab(RecipeCategory category, ItemLike slab, ItemLike material) { super.slab(category, slab, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#slabBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder slabBuilder(RecipeCategory category, ItemLike slab, Ingredient material) { return super.slabBuilder(category, slab, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#stairBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder stairBuilder(ItemLike stairs, Ingredient material) { return super.stairBuilder(stairs, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#trapdoorBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder trapdoorBuilder(ItemLike trapdoor, Ingredient material) { return super.trapdoorBuilder(trapdoor, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#signBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder signBuilder(ItemLike sign, Ingredient material) { return super.signBuilder(sign, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#hangingSign} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void hangingSign(ItemLike sign, ItemLike material) { super.hangingSign(sign, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#colorItemWithDye} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void colorItemWithDye(List dyeItems, List dyeableItems, String group, RecipeCategory category) { super.colorItemWithDye(dyeItems, dyeableItems, group, category); } - - /** Generated override to expose protected method: {@link RecipeProvider#carpet} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void carpet(ItemLike carpet, ItemLike material) { super.carpet(carpet, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#bedFromPlanksAndWool} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void bedFromPlanksAndWool(ItemLike bed, ItemLike wool) { super.bedFromPlanksAndWool(bed, wool); } - - /** Generated override to expose protected method: {@link RecipeProvider#banner} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void banner(ItemLike banner, ItemLike material) { super.banner(banner, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassFromGlassAndDye} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void stainedGlassFromGlassAndDye(ItemLike stainedGlass, ItemLike dye) { super.stainedGlassFromGlassAndDye(stainedGlass, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#dryGhast} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void dryGhast(ItemLike dryGhast) { super.dryGhast(dryGhast); } - - /** Generated override to expose protected method: {@link RecipeProvider#harness} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void harness(ItemLike harness, ItemLike wool) { super.harness(harness, wool); } - - /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromStainedGlass} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void stainedGlassPaneFromStainedGlass(ItemLike stainedGlassPane, ItemLike stainedGlass) { super.stainedGlassPaneFromStainedGlass(stainedGlassPane, stainedGlass); } - - /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromGlassPaneAndDye} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void stainedGlassPaneFromGlassPaneAndDye(ItemLike stainedGlassPane, ItemLike dye) { super.stainedGlassPaneFromGlassPaneAndDye(stainedGlassPane, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#coloredTerracottaFromTerracottaAndDye} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void coloredTerracottaFromTerracottaAndDye(ItemLike terracotta, ItemLike dye) { super.coloredTerracottaFromTerracottaAndDye(terracotta, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#concretePowder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void concretePowder(ItemLike concretePowder, ItemLike dye) { super.concretePowder(concretePowder, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#candle} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void candle(ItemLike candle, ItemLike dye) { super.candle(candle, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#wall} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void wall(RecipeCategory category, ItemLike wall, ItemLike material) { super.wall(category, wall, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#wallBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder wallBuilder(RecipeCategory category, ItemLike wall, Ingredient material) { return super.wallBuilder(category, wall, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#polished} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void polished(RecipeCategory category, ItemLike result, ItemLike material) { super.polished(category, result, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#polishedBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder polishedBuilder(RecipeCategory category, ItemLike result, Ingredient material) { return super.polishedBuilder(category, result, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#cut} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void cut(RecipeCategory category, ItemLike cutResult, ItemLike material) { super.cut(category, cutResult, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#cutBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapedRecipeBuilder cutBuilder(RecipeCategory category, ItemLike cutResult, Ingredient material) { return super.cutBuilder(category, cutResult, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#chiseled} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void chiseled(RecipeCategory category, ItemLike chiseledResult, ItemLike material) { super.chiseled(category, chiseledResult, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#mosaicBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void mosaicBuilder(RecipeCategory category, ItemLike result, ItemLike material) { super.mosaicBuilder(category, result, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#chiseledBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapedRecipeBuilder chiseledBuilder(RecipeCategory category, ItemLike chiseledResult, Ingredient material) { return super.chiseledBuilder(category, chiseledResult, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike material) { super.stonecutterResultFromBase(category, result, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike material, int resultCount) { super.stonecutterResultFromBase(category, result, material, resultCount); } - - /** Generated override to expose protected method: {@link RecipeProvider#smeltingResultFromBase} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void smeltingResultFromBase(ItemLike result, ItemLike ingredient) { super.smeltingResultFromBase(result, ingredient); } - - /** Generated override to expose protected method: {@link RecipeProvider#nineBlockStorageRecipes} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void nineBlockStorageRecipes(RecipeCategory unpackedCategory, ItemLike unpacked, RecipeCategory packedCategory, ItemLike packed) { super.nineBlockStorageRecipes(unpackedCategory, unpacked, packedCategory, packed); } - - /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void copySmithingTemplate(ItemLike template, ItemLike baseItem) { super.copySmithingTemplate(template, baseItem); } - - /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void copySmithingTemplate(ItemLike template, Ingredient baseItem) { super.copySmithingTemplate(template, baseItem); } - - /** Generated override to expose protected method: {@link RecipeProvider#waxRecipes} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void waxRecipes(FeatureFlagSet requiredFeatures) { super.waxRecipes(requiredFeatures); } - - /** Generated override to expose protected method: {@link RecipeProvider#grate} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void grate(Block grateBlock, Block material) { super.grate(grateBlock, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#copperBulb} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void copperBulb(Block bulbBlock, Block material) { super.copperBulb(bulbBlock, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#suspiciousStew} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void suspiciousStew(Item flowerItem, SuspiciousEffectHolder effect) { super.suspiciousStew(flowerItem, effect); } - - /** Generated override to expose protected method: {@link RecipeProvider#generateRecipes} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void generateRecipes(BlockFamily blockFamily, FeatureFlagSet requiredFeatures) { super.generateRecipes(blockFamily, requiredFeatures); } - - /** Generated override to expose protected method: {@link RecipeProvider#getBaseBlock} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public Block getBaseBlock(BlockFamily family, BlockFamily.Variant variant) { return super.getBaseBlock(family, variant); } - - /** Generated override to expose protected method: {@link RecipeProvider#insideOf} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static Criterion insideOf(Block block) { return RecipeProvider.insideOf(block); } - - /** Generated override to expose protected method: {@link RecipeProvider#has} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public Criterion has(MinMaxBounds.Ints count, ItemLike item) { return super.has(count, item); } - - /** Generated override to expose protected method: {@link RecipeProvider#has} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public Criterion has(ItemLike itemLike) { return super.has(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#has} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public Criterion has(TagKey tag) { return super.has(tag); } - - /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static Criterion inventoryTrigger(ItemPredicate.Builder... items) { return RecipeProvider.inventoryTrigger(items); } - - /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static Criterion inventoryTrigger(ItemPredicate... predicates) { return RecipeProvider.inventoryTrigger(predicates); } - - /** Generated override to expose protected method: {@link RecipeProvider#getHasName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getHasName(ItemLike itemLike) { return RecipeProvider.getHasName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#getItemName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getItemName(ItemLike itemLike) { return RecipeProvider.getItemName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#getSimpleRecipeName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getSimpleRecipeName(ItemLike itemLike) { return RecipeProvider.getSimpleRecipeName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#getConversionRecipeName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getConversionRecipeName(ItemLike result, ItemLike ingredient) { return RecipeProvider.getConversionRecipeName(result, ingredient); } - - /** Generated override to expose protected method: {@link RecipeProvider#getSmeltingRecipeName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getSmeltingRecipeName(ItemLike itemLike) { return RecipeProvider.getSmeltingRecipeName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#getBlastingRecipeName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getBlastingRecipeName(ItemLike itemLike) { return RecipeProvider.getBlastingRecipeName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#tag} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public Ingredient tag(TagKey tag) { return super.tag(tag); } - - /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike result) { return super.shaped(category, result); } - - /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike result, int count) { return super.shaped(category, result, count); } - - /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemStack result) { return super.shapeless(category, result); } - - /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike result) { return super.shapeless(category, result); } - - /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike result, int count) { return super.shapeless(category, result, count); } - - // GENERATED END - -} diff --git a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateRecipeRunner.java b/src/main/java/com/tterrag/registrate/providers/generators/RegistrateRecipeRunner.java deleted file mode 100644 index 193cbd2..0000000 --- a/src/main/java/com/tterrag/registrate/providers/generators/RegistrateRecipeRunner.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.tterrag.registrate.providers.generators; - -import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.providers.RegistrateProvider; -import net.minecraft.core.HolderLookup; -import net.minecraft.data.PackOutput; -import net.minecraft.data.recipes.RecipeOutput; -import net.minecraft.data.recipes.RecipeProvider; -import net.neoforged.fml.LogicalSide; - -import java.util.concurrent.CompletableFuture; - -public class RegistrateRecipeRunner extends RecipeProvider.Runner implements RegistrateProvider { - - final AbstractRegistrate owner; - - @org.jetbrains.annotations.Nullable - RegistrateRecipeProvider provider; - - public RegistrateRecipeRunner(AbstractRegistrate owner, PackOutput p_365369_, CompletableFuture p_361563_) { - super(p_365369_, p_361563_); - this.owner = owner; - } - - @Override - protected RecipeProvider createRecipeProvider(HolderLookup.Provider p_362946_, RecipeOutput p_365274_) { - return new RegistrateRecipeProvider(this, p_362946_, p_365274_); - } - - @Override - public String getName() { - return ""; - } - - @Override - public LogicalSide getSide() { - return LogicalSide.SERVER; - } - - public RegistrateRecipeProvider getRecipeProvider() { - if (provider == null) throw new IllegalStateException("Recipe Provider is not available now"); - return provider; - } - -} diff --git a/src/main/java/com/tterrag/registrate/providers/generators/package-info.java b/src/main/java/com/tterrag/registrate/providers/generators/package-info.java deleted file mode 100644 index ba4bef6..0000000 --- a/src/main/java/com/tterrag/registrate/providers/generators/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@com.tterrag.registrate.util.nullness.FieldsAreNonnullByDefault -package com.tterrag.registrate.providers.generators; \ No newline at end of file diff --git a/src/main/java/com/tterrag/registrate/providers/loot/RegistrateBlockLootTables.java b/src/main/java/com/tterrag/registrate/providers/loot/RegistrateBlockLootTables.java deleted file mode 100644 index c7863e3..0000000 --- a/src/main/java/com/tterrag/registrate/providers/loot/RegistrateBlockLootTables.java +++ /dev/null @@ -1,291 +0,0 @@ -package com.tterrag.registrate.providers.loot; - -import com.tterrag.registrate.AbstractRegistrate; -import net.minecraft.core.HolderLookup; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.loot.BlockLootSubProvider; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.flag.FeatureFlags; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.entries.LootPoolEntryContainer; -import net.minecraft.world.level.storage.loot.functions.FunctionUserBuilder; -import net.minecraft.world.level.storage.loot.predicates.ConditionUserBuilder; -import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; - -import javax.annotation.Generated; -import java.util.Set; -import java.util.function.Consumer; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -public class RegistrateBlockLootTables extends BlockLootSubProvider implements RegistrateLootTables { - private final AbstractRegistrate parent; - private final Consumer callback; - - private final HolderLookup itemLookup; - private final HolderLookup blockLookup; - private final HolderLookup> entityLookup; - - public RegistrateBlockLootTables(HolderLookup.Provider provider, AbstractRegistrate parent, Consumer callback) { - super(Set.of(), FeatureFlags.REGISTRY.allFlags(), provider); - this.parent = parent; - this.callback = callback; - itemLookup = registries.lookupOrThrow(Registries.ITEM); - blockLookup = registries.lookupOrThrow(Registries.BLOCK); - entityLookup = registries.lookupOrThrow(Registries.ENTITY_TYPE); - } - - @Override - protected void generate() { - callback.accept(this); - } - - @Override - protected Iterable getKnownBlocks() { - return parent.getAll(Registries.BLOCK).stream().map(Supplier::get).collect(Collectors.toList()); - } - - public HolderLookup.Provider getRegistries() { - return this.registries; - } - - public HolderLookup itemLookup() { - return itemLookup; - } - - public HolderLookup blockLookup() { - return blockLookup; - } - - public HolderLookup> entityLookup() { - return entityLookup; - } - - // @formatter:off - // GENERATED START - DO NOT EDIT BELOW THIS LINE - - /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionDecay} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public > T applyExplosionDecay(ItemLike item, FunctionUserBuilder functionBuilder) { return super.applyExplosionDecay(item, functionBuilder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionCondition} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public > T applyExplosionCondition(ItemLike item, ConditionUserBuilder conditionBuilder) { return super.applyExplosionCondition(item, conditionBuilder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchDispatchTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSilkTouchDispatchTable(Block block, LootPoolEntryContainer.Builder builder) { return super.createSilkTouchDispatchTable(block, builder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsDispatchTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createShearsDispatchTable(Block block, LootPoolEntryContainer.Builder builder) { return super.createShearsDispatchTable(block, builder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOrShearsDispatchTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSilkTouchOrShearsDispatchTable(Block block, LootPoolEntryContainer.Builder builder) { return super.createSilkTouchOrShearsDispatchTable(block, builder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSingleItemTableWithSilkTouch(Block block, ItemLike item) { return super.createSingleItemTableWithSilkTouch(block, item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSingleItemTable(ItemLike item, NumberProvider count) { return super.createSingleItemTable(item, count); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSingleItemTableWithSilkTouch(Block block, ItemLike item, NumberProvider count) { return super.createSingleItemTableWithSilkTouch(block, item, count); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOnlyTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSilkTouchOnlyTable(ItemLike item) { return super.createSilkTouchOnlyTable(item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createPotFlowerItemTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createPotFlowerItemTable(ItemLike item) { return super.createPotFlowerItemTable(item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSlabItemTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSlabItemTable(Block block) { return super.createSlabItemTable(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createNameableBlockEntityTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createNameableBlockEntityTable(Block block) { return super.createNameableBlockEntityTable(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShulkerBoxDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createShulkerBoxDrop(Block block) { return super.createShulkerBoxDrop(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCopperOreDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createCopperOreDrops(Block block) { return super.createCopperOreDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createLapisOreDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createLapisOreDrops(Block block) { return super.createLapisOreDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createRedstoneOreDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createRedstoneOreDrops(Block block) { return super.createRedstoneOreDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createBannerDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createBannerDrop(Block block) { return super.createBannerDrop(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeNestDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createBeeNestDrop(Block block) { return super.createBeeNestDrop(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeHiveDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createBeeHiveDrop(Block block) { return super.createBeeHiveDrop(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCaveVinesDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createCaveVinesDrop(Block block) { return super.createCaveVinesDrop(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createOreDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createOreDrop(Block block, Item item) { return super.createOreDrop(block, item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMushroomBlockDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createMushroomBlockDrop(Block block, ItemLike item) { return super.createMushroomBlockDrop(block, item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createGrassDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createGrassDrops(Block block) { return super.createGrassDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOnlyDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createShearsOnlyDrop(ItemLike item) { return super.createShearsOnlyDrop(item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOrSilkTouchOnlyDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createShearsOrSilkTouchOnlyDrop(ItemLike item) { return super.createShearsOrSilkTouchOnlyDrop(item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createMultifaceBlockDrops(Block block, LootItemCondition.Builder builder) { return super.createMultifaceBlockDrops(block, builder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createMultifaceBlockDrops(Block block) { return super.createMultifaceBlockDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMossyCarpetBlockDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createMossyCarpetBlockDrops(Block block) { return super.createMossyCarpetBlockDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createLeavesDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createLeavesDrops(Block leavesBlock, Block saplingBlock, float... chances) { return super.createLeavesDrops(leavesBlock, saplingBlock, chances); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createOakLeavesDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createOakLeavesDrops(Block oakLeavesBlock, Block saplingBlock, float... chances) { return super.createOakLeavesDrops(oakLeavesBlock, saplingBlock, chances); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMangroveLeavesDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createMangroveLeavesDrops(Block block) { return super.createMangroveLeavesDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCropDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createCropDrops(Block cropBlock, Item grownCropItem, Item seedsItem, LootItemCondition.Builder dropGrownCropCondition) { return super.createCropDrops(cropBlock, grownCropItem, seedsItem, dropGrownCropCondition); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantShearsDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createDoublePlantShearsDrop(Block sheared) { return super.createDoublePlantShearsDrop(sheared); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantWithSeedDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createDoublePlantWithSeedDrops(Block block, Block sheared) { return super.createDoublePlantWithSeedDrops(block, sheared); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createCandleDrops(Block candleBlock) { return super.createCandleDrops(candleBlock); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleCakeDrops} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public static LootTable.Builder createCandleCakeDrops(Block candleCakeBlock) { return BlockLootSubProvider.createCandleCakeDrops(candleCakeBlock); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#addNetherVinesDropTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void addNetherVinesDropTable(Block vines, Block plant) { super.addNetherVinesDropTable(vines, plant); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoorTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createDoorTable(Block doorBlock) { return super.createDoorTable(doorBlock); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropPottedContents} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void dropPottedContents(Block flowerPot) { super.dropPottedContents(flowerPot); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#otherWhenSilkTouch} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void otherWhenSilkTouch(Block block, Block other) { super.otherWhenSilkTouch(block, other); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropOther} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void dropOther(Block block, ItemLike item) { super.dropOther(block, item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropWhenSilkTouch} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void dropWhenSilkTouch(Block block) { super.dropWhenSilkTouch(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropSelf} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void dropSelf(Block block) { super.dropSelf(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#add} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void add(Block block, LootTable.Builder builder) { super.add(block, builder); } - - // GENERATED END -} diff --git a/src/main/java/com/tterrag/registrate/providers/loot/package-info.java b/src/main/java/com/tterrag/registrate/providers/loot/package-info.java deleted file mode 100644 index 3d7c17b..0000000 --- a/src/main/java/com/tterrag/registrate/providers/loot/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@com.tterrag.registrate.util.nullness.FieldsAreNonnullByDefault -package com.tterrag.registrate.providers.loot; \ No newline at end of file diff --git a/src/main/java/com/tterrag/registrate/providers/package-info.java b/src/main/java/com/tterrag/registrate/providers/package-info.java deleted file mode 100644 index e0a91a3..0000000 --- a/src/main/java/com/tterrag/registrate/providers/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@com.tterrag.registrate.util.nullness.FieldsAreNonnullByDefault -package com.tterrag.registrate.providers; \ No newline at end of file diff --git a/src/main/java/com/tterrag/registrate/util/entry/package-info.java b/src/main/java/com/tterrag/registrate/util/entry/package-info.java deleted file mode 100644 index f5e2cc5..0000000 --- a/src/main/java/com/tterrag/registrate/util/entry/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@com.tterrag.registrate.util.nullness.FieldsAreNonnullByDefault -package com.tterrag.registrate.util.entry; \ No newline at end of file diff --git a/src/main/java/com/tterrag/registrate/util/nullness/package-info.java b/src/main/java/com/tterrag/registrate/util/nullness/package-info.java deleted file mode 100644 index 2e534a0..0000000 --- a/src/main/java/com/tterrag/registrate/util/nullness/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@com.tterrag.registrate.util.nullness.FieldsAreNonnullByDefault -package com.tterrag.registrate.util.nullness; \ No newline at end of file diff --git a/src/main/java/com/tterrag/registrate/util/package-info.java b/src/main/java/com/tterrag/registrate/util/package-info.java deleted file mode 100644 index e7af391..0000000 --- a/src/main/java/com/tterrag/registrate/util/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@com.tterrag.registrate.util.nullness.FieldsAreNonnullByDefault -package com.tterrag.registrate.util; \ No newline at end of file diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/META-INF/enum_extensions.json b/src/main/resources/META-INF/enum_extensions.json new file mode 100644 index 0000000..14aa6f5 --- /dev/null +++ b/src/main/resources/META-INF/enum_extensions.json @@ -0,0 +1,3 @@ +{ + "entries": [] +} diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..cdbb66c --- /dev/null +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -0,0 +1,35 @@ +modLoader = "javafml" +loaderVersion = "[${loader_version},)" +issueTrackerURL = "${mod_issue_tracker}" +license = "${mod_license}" + +[[mods]] +modId = "${mod_id}" +version = "${version}" +displayName = "${mod_name}" +authors = "QiuYe" +description = "${mod_description}" +#logoFile = "icon.png" +displayURL = "${mod_url}" +credits = "" + +#enumExtensions = "META-INF/enum_extensions.json" + +#[[mixins]] +# config = "${mod_id}.mixins.json" +[[accessTransformers]] + file = "META-INF/accesstransformer.cfg" + + +[[dependencies.${mod_id}]] + modId = "neoforge" + type = "required" + versionRange = "[${neo_version},)" + ordering = "NONE" + side = "BOTH" +[[dependencies.${mod_id}]] + modId = "minecraft" + type = "required" + versionRange = "${minecraft_version}" + ordering = "NONE" + side = "BOTH" diff --git a/src/test/java/com/tterrag/registrate/test/meta/MethodGenerator.java b/src/test/java/com/modularmc/registrate/test/meta/MethodGenerator.java similarity index 95% rename from src/test/java/com/tterrag/registrate/test/meta/MethodGenerator.java rename to src/test/java/com/modularmc/registrate/test/meta/MethodGenerator.java index 7982a9e..1b4e174 100644 --- a/src/test/java/com/tterrag/registrate/test/meta/MethodGenerator.java +++ b/src/test/java/com/modularmc/registrate/test/meta/MethodGenerator.java @@ -1,4 +1,12 @@ -package com.tterrag.registrate.test.meta; +package com.modularmc.registrate.test.meta; + +import com.modularmc.registrate.test.meta.ProtectedMethodScraper.Header; + +import com.google.common.base.Charsets; +import com.google.common.collect.ImmutableList; +import lombok.RequiredArgsConstructor; +import lombok.Value; +import org.apache.commons.lang3.tuple.Pair; import java.io.File; import java.io.IOException; @@ -11,24 +19,15 @@ import java.util.ListIterator; import java.util.Set; -import org.apache.commons.lang3.tuple.Pair; - -import com.google.common.base.Charsets; -import com.google.common.collect.ImmutableList; -import com.tterrag.registrate.test.meta.ProtectedMethodScraper.Header; - -import lombok.RequiredArgsConstructor; -import lombok.Value; - @RequiredArgsConstructor public class MethodGenerator { - + @Value private class Exclusion { String name; String[] params; - + public boolean matches(Header header) { if (!header.getName().equals(this.name)) { return false; @@ -36,24 +35,24 @@ public boolean matches(Header header) { return this.params == null ? true : Arrays.equals(header.getParamTypes(), this.params); } } - + private static final String START_KEY = "// GENERATED START"; private static final String END_KEY = "// GENERATED END"; - + private final List> typeReplacements; private final Set excludes = new HashSet<>(); - + private final Class mainClass; - + public MethodGenerator(Class mainClass) { this(ImmutableList.of(), mainClass); } - + public MethodGenerator exclude(String name) { excludes.add(new Exclusion(name, null)); return this; } - + public MethodGenerator exclude(String name, String... paramTypes) { excludes.add(new Exclusion(name, paramTypes)); return this; diff --git a/src/test/java/com/tterrag/registrate/test/meta/ProtectedMethodScraper.java b/src/test/java/com/modularmc/registrate/test/meta/ProtectedMethodScraper.java similarity index 91% rename from src/test/java/com/tterrag/registrate/test/meta/ProtectedMethodScraper.java rename to src/test/java/com/modularmc/registrate/test/meta/ProtectedMethodScraper.java index 758f0ab..739833a 100644 --- a/src/test/java/com/tterrag/registrate/test/meta/ProtectedMethodScraper.java +++ b/src/test/java/com/modularmc/registrate/test/meta/ProtectedMethodScraper.java @@ -1,4 +1,9 @@ -package com.tterrag.registrate.test.meta; +package com.modularmc.registrate.test.meta; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.Value; +import org.apache.commons.lang3.tuple.Pair; import java.time.Instant; import java.time.ZoneOffset; @@ -12,14 +17,9 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import org.apache.commons.lang3.tuple.Pair; - -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; -import lombok.Value; - /** - * Scrapes all protected methods from pasted source, and emits them as public super-calling stubs. Used to create the bouncer classes such as BuilderModelProvider. + * Scrapes all protected methods from pasted source, and emits them as public super-calling stubs. Used to create the + * bouncer classes such as BuilderModelProvider. */ public class ProtectedMethodScraper { @@ -34,7 +34,7 @@ public static class Header { String name; String[] paramTypes; String[] paramNames; - + public Header applyTypeReplacement(Pair repl) { String[] newParamTypes = Arrays.copyOf(paramTypes, paramTypes.length); for (int i = 0; i < newParamTypes.length; i++) { @@ -53,7 +53,7 @@ public String printStubMethod(Class source) { base.append("@Override\n"); } base.append("@Generated(value = \"").append(source.getName()).append("\", date = \"") - .append(DateTimeFormatter.RFC_1123_DATE_TIME.format(Instant.now().atZone(ZoneOffset.UTC))).append("\")\n"); + .append(DateTimeFormatter.RFC_1123_DATE_TIME.format(Instant.now().atZone(ZoneOffset.UTC))).append("\")\n"); base.append("public ").append(isStatic ? "static " : ""); if (generics != null) { base.append(generics).append(" "); @@ -75,7 +75,7 @@ public String printStubMethod(Class source) { return base.toString(); } - // Match generics up to three levels deep -- java does not support recursive patterns + // Match generics up to three levels deep -- java does not support recursive patterns private static final Pattern HEADER_PATTERN = Pattern.compile("^\\s*protected\\s+(?:(static)\\s)?\\s*(<[^<>]+(?:<[^<>]+(?:<[^<>]+>[^<>]*)*>[^<>]*)*>)?\\s*(\\S+)\\s+(\\S+)\\((.+)\\)\\s\\{$"); private static final Pattern PARAM_PATTERN = Pattern.compile("([a-zA-Z_][\\w.$]+(?:<.+>)?)\\s+(\\S+)"); diff --git a/src/test/java/com/tterrag/registrate/test/meta/UpdateBlockLootTables.java b/src/test/java/com/modularmc/registrate/test/meta/UpdateBlockLootTables.java similarity index 53% rename from src/test/java/com/tterrag/registrate/test/meta/UpdateBlockLootTables.java rename to src/test/java/com/modularmc/registrate/test/meta/UpdateBlockLootTables.java index 30922f9..83e9cdf 100644 --- a/src/test/java/com/tterrag/registrate/test/meta/UpdateBlockLootTables.java +++ b/src/test/java/com/modularmc/registrate/test/meta/UpdateBlockLootTables.java @@ -1,12 +1,12 @@ -package com.tterrag.registrate.test.meta; +package com.modularmc.registrate.test.meta; import java.io.IOException; import java.nio.file.Paths; public class UpdateBlockLootTables { - + public static void main(String[] args) throws IOException { new MethodGenerator(UpdateBlockLootTables.class) - .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateBlockLootTables.java")); + .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateBlockLootTables.java")); } } diff --git a/src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java b/src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java new file mode 100644 index 0000000..b441f03 --- /dev/null +++ b/src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java @@ -0,0 +1,13 @@ +package com.modularmc.registrate.test.meta; + +import java.io.IOException; +import java.nio.file.Paths; + +public class UpdateEntityLootTables { + + public static void main(String[] args) throws IOException { + new MethodGenerator(UpdateEntityLootTables.class) + .exclude("isNonLiving").exclude("getKnownEntities") + .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateEntityLootTables.java")); + } +} diff --git a/src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java b/src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java new file mode 100644 index 0000000..105799f --- /dev/null +++ b/src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java @@ -0,0 +1,13 @@ +package com.modularmc.registrate.test.meta; + +import java.io.IOException; +import java.nio.file.Paths; + +public class UpdateRecipeProvider { + + public static void main(String[] args) throws IOException { + new MethodGenerator(UpdateRecipeProvider.class) + .exclude("buildCraftingRecipes") + .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "generators", "RegistrateRecipeProvider.java")); + } +} diff --git a/src/test/java/com/modularmc/registrate/test/meta/package-info.java b/src/test/java/com/modularmc/registrate/test/meta/package-info.java new file mode 100644 index 0000000..de66794 --- /dev/null +++ b/src/test/java/com/modularmc/registrate/test/meta/package-info.java @@ -0,0 +1,6 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.modularmc.registrate.test.meta; + +import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/test/java/com/tterrag/registrate/test/mod/TestMod.java b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java similarity index 71% rename from src/test/java/com/tterrag/registrate/test/mod/TestMod.java rename to src/test/java/com/modularmc/registrate/test/mod/TestMod.java index bf5de30..4556c87 100644 --- a/src/test/java/com/tterrag/registrate/test/mod/TestMod.java +++ b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java @@ -1,17 +1,22 @@ -package com.tterrag.registrate.test.mod; +package com.modularmc.registrate.test.mod; + +import com.modularmc.registrate.Registrate; +import com.modularmc.registrate.builders.BlockBuilder; +import com.modularmc.registrate.providers.DataGenContext; +import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.generators.RegistrateItemModelGenerator; +import com.modularmc.registrate.util.DataIngredient; +import com.modularmc.registrate.util.entry.BlockEntityEntry; +import com.modularmc.registrate.util.entry.BlockEntry; +import com.modularmc.registrate.util.entry.EntityEntry; +import com.modularmc.registrate.util.entry.FluidEntry; +import com.modularmc.registrate.util.entry.ItemEntry; +import com.modularmc.registrate.util.entry.MenuEntry; +import com.modularmc.registrate.util.entry.RegistryEntry; +import com.modularmc.registrate.util.nullness.NonnullType; -import com.mojang.blaze3d.vertex.PoseStack; -import com.tterrag.registrate.Registrate; -import com.tterrag.registrate.builders.BlockBuilder; -import com.tterrag.registrate.providers.DataGenContext; -import com.tterrag.registrate.providers.ProviderType; -import com.tterrag.registrate.providers.generators.RegistrateItemModelGenerator; -import com.tterrag.registrate.util.DataIngredient; -import com.tterrag.registrate.util.entry.*; -import com.tterrag.registrate.util.nullness.NonnullType; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementType; -import net.minecraft.advancements.critereon.InventoryChangeTrigger; import net.minecraft.client.Minecraft; import net.minecraft.client.color.item.Constant; import net.minecraft.client.gui.screens.inventory.ContainerScreen; @@ -27,7 +32,6 @@ import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.tags.EntityTypeTags; import net.minecraft.tags.ItemTags; @@ -83,12 +87,15 @@ import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.registries.RegistryBuilder; -import javax.annotation.Nullable; +import com.mojang.blaze3d.vertex.PoseStack; + import java.util.Optional; import java.util.OptionalLong; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; +import javax.annotation.Nullable; + @Mod("testmod") public class TestMod { @@ -140,8 +147,7 @@ public TestBlockEntity(BlockEntityType type, BlockPos private static class TestBlockEntityRenderer implements BlockEntityRenderer { - public TestBlockEntityRenderer(BlockEntityRendererProvider.Context ctx) { - } + public TestBlockEntityRenderer(BlockEntityRendererProvider.Context ctx) {} @Override public void render(TestBlockEntity blockEntityIn, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int combinedLightIn, int combinedOverlayIn, Vec3 cam) { @@ -178,12 +184,12 @@ private static class TestCustomRegistryEntry {} private final ItemEntry testitem = registrate.object("testitem") .item(Item::new) - .onRegister(item -> sawCallback.set(true)) - .properties(p -> p.food(new FoodProperties.Builder().nutrition(1).saturationModifier(0.2f).build())) - .tag(ItemTags.BEDS) + .onRegister(item -> sawCallback.set(true)) + .properties(p -> p.food(new FoodProperties.Builder().nutrition(1).saturationModifier(0.2f).build())) + .tag(ItemTags.BEDS) .model(() -> (ctx, prov) -> prov.createWithExistingModel(ctx.getEntry(), prov.mcLoc("block/stone"))) - .tab(testcreativetab.getKey(), (ctx, modifier) -> modifier.accept(ctx)) - .register(); + .tab(testcreativetab.getKey(), (ctx, modifier) -> modifier.accept(ctx)) + .register(); private final EntityEntry testduplicatename = registrate.object("testitem") .entity(TestEntity::new, MobCategory.CREATURE) @@ -194,41 +200,39 @@ private static class TestCustomRegistryEntry {} private final BlockEntry testblock = registrate.object("testblock") .block(TestBlock::new) - .properties(p -> p.noOcclusion()) + .properties(p -> p.noOcclusion()) .blockstate(() -> (ctx, prov) -> prov.create(ctx.getEntry(), prov.getBuilder().transformTemplate(template -> template .parent(prov.mcLoc("block/glass")) - .renderType(prov.mcLoc("cutout"))).build(ctx.getEntry()) - )) - .transform(TestMod::applyDiamondDrop) - .recipe((ctx, prov) -> { - prov.shaped(RecipeCategory.MISC, ctx.getEntry()) - .pattern("DDD").pattern("DED").pattern("DDD") - .define('D', Items.DIAMOND) - .define('E', Items.EGG) - .unlockedBy("has_egg", prov.has(Items.EGG)) - .save(prov); - - prov.food(DataIngredient.items(ctx), RecipeCategory.MISC, () -> Blocks.DIAMOND_BLOCK, 1f); - }) - .tag(BlockTags.BAMBOO_PLANTABLE_ON, BlockTags.DRAGON_IMMUNE) - .tag(BlockTags.WITHER_IMMUNE) - .color(() -> () -> (state, world, pos, index) -> 0xFFFF0000) - .item() + .renderType(prov.mcLoc("cutout"))).build(ctx.getEntry()))) + .transform(TestMod::applyDiamondDrop) + .recipe((ctx, prov) -> { + prov.shaped(RecipeCategory.MISC, ctx.getEntry()) + .pattern("DDD").pattern("DED").pattern("DDD") + .define('D', Items.DIAMOND) + .define('E', Items.EGG) + .unlockedBy("has_egg", prov.has(Items.EGG)) + .save(prov); + + prov.food(DataIngredient.items(ctx), RecipeCategory.MISC, () -> Blocks.DIAMOND_BLOCK, 1f); + }) + .tag(BlockTags.BAMBOO_PLANTABLE_ON, BlockTags.DRAGON_IMMUNE) + .tag(BlockTags.WITHER_IMMUNE) + .color(() -> () -> (state, world, pos, index) -> 0xFFFF0000) + .item() .model(() -> Client::testBlockModel) - .build() - .blockEntity(TestBlockEntity::new) - .renderer(() -> TestBlockEntityRenderer::new) - .build() - .register(); + .build() + .blockEntity(TestBlockEntity::new) + .renderer(() -> TestBlockEntityRenderer::new) + .build() + .register(); private final BlockEntry magicItemModelTest = registrate.object("magic_item_model") .block(Block::new) - .blockstate(() -> (ctx, prov) -> - prov.create(ctx.getEntry(), prov.getBuilder() - .transformTemplate(t -> t - .parent(prov.mcLoc("block/gold_block")) - ).build(prov.modLoc("block/subfolder/" + ctx.getName())))) + .blockstate(() -> (ctx, prov) -> prov.create(ctx.getEntry(), prov.getBuilder() + .transformTemplate(t -> t + .parent(prov.mcLoc("block/gold_block"))) + .build(prov.modLoc("block/subfolder/" + ctx.getName())))) .simpleItem() .register(); @@ -241,7 +245,7 @@ private static class TestCustomRegistryEntry {} .attributes(Pig::createAttributes) .renderer(() -> PigRenderer::new) .spawnPlacement(SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR) - //TODO <1.21.4> .defaultSpawnEgg(0xFF0000, 0x00FF00) + // TODO <1.21.4> .defaultSpawnEgg(0xFF0000, 0x00FF00) .loot((prov, type) -> prov.add(type, LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1)) @@ -253,99 +257,102 @@ private static class TestCustomRegistryEntry {} private final BlockEntityEntry testblockentity = registrate.object("testblockentity") .blockEntity(TestDummyBlockEntity::new) - .validBlock(() -> Blocks.DIRT)//TODO <1.21.4> now empty valid block is not allowed + .validBlock(() -> Blocks.DIRT)// TODO <1.21.4> now empty valid block is not allowed .register(); private final FluidEntry testfluid = registrate.object("testfluid") .fluid( ResourceLocation.withDefaultNamespace("block/water_flow"), ResourceLocation.withDefaultNamespace("block/lava_still"), - FluidType::new) + FluidType::new) .properties(p -> p.lightLevel(15).canConvertToSource(true)) .renderType(() -> () -> ChunkSectionLayer.TRANSLUCENT) .noBucket() -// .bucket() -// .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), prov.mcLoc("item/water_bucket"))) -// .build() + // .bucket() + // .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), prov.mcLoc("item/water_bucket"))) + // .build() .register(); private final MenuEntry testmenu = registrate.object("testmenu") .menu((type, windowId, inv) -> new ChestMenu(type, windowId, inv, new SimpleContainer(9 * 9), 9), () -> ContainerScreen::new) .register(); - -// private final RegistryEntry testbiome = registrate.object("testbiome") -// .biome(TestBiome::new) -// .properties(b -> b.category(Category.PLAINS) -// .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.getDefaultState(), Blocks.COBBLESTONE.getDefaultState(), Blocks.CLAY.getDefaultState())) -// .precipitation(RainType.RAIN) -// .depth(1) -// .scale(1) -// .temperature(1) -// .downfall(1) -// .waterColor(0x3f76e4) -// .waterFogColor(0x050533)) -// .typeWeight(BiomeType.WARM, 1000) -// .addDictionaryTypes(BiomeDictionary.Type.LUSH) -// .forceAutomaticDictionaryTypes() -// .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.BAMBOO, new ProbabilityConfig(0), () -> Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(20)) -// .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.ICE_SPIKE, () -> Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(100)) -// .addFeatures(DefaultBiomeFeatures::addVeryDenseGrass) -// .addCarver(Carving.AIR, () -> WorldCarver.CAVE, new ProbabilityConfig(0.1F)) -// .addSpawn(EntityClassification.CREATURE, () -> EntityType.IRON_GOLEM, 1, 2, 3) -// .addSpawn(EntityClassification.CREATURE, testentity, 1, 4, 8) -// .register(); -// -// private final RegistryEntry testbiome2 = registrate.object("testbiome2") -// .biome(TestBiome::new) -// .properties(b -> b.category(Category.DESERT) -// .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.SAND.getDefaultState(), Blocks.RED_SANDSTONE.getDefaultState(), Blocks.GRAVEL.getDefaultState())) -// .precipitation(RainType.NONE) -// .depth(1) -// .scale(1) -// .temperature(1) -// .downfall(1) -// .waterColor(0x3f76e4) -// .waterFogColor(0x050533)) -// .typeWeight(BiomeType.DESERT, 1000) -// .addDictionaryTypes(BiomeDictionary.Type.DRY) -// .forceAutomaticDictionaryTypes() -// .copyFeatures(() -> Biomes.DESERT) -// .copyCarvers(() -> Biomes.DESERT) -// .copySpawns(() -> Biomes.DESERT) -// .register(); -// -// private @Nullable DimensionType testdimensiontype; -// private final RegistryEntry testdimension = registrate.object("testdimension") -// .dimension(OverworldDimension::new) -// .hasSkyLight(false) -// .keepLoaded(false) -// .dimensionTypeCallback(t -> testdimensiontype = t) -// .register(); + + // private final RegistryEntry testbiome = registrate.object("testbiome") + // .biome(TestBiome::new) + // .properties(b -> b.category(Category.PLAINS) + // .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.getDefaultState(), + // Blocks.COBBLESTONE.getDefaultState(), Blocks.CLAY.getDefaultState())) + // .precipitation(RainType.RAIN) + // .depth(1) + // .scale(1) + // .temperature(1) + // .downfall(1) + // .waterColor(0x3f76e4) + // .waterFogColor(0x050533)) + // .typeWeight(BiomeType.WARM, 1000) + // .addDictionaryTypes(BiomeDictionary.Type.LUSH) + // .forceAutomaticDictionaryTypes() + // .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.BAMBOO, new ProbabilityConfig(0), () -> + // Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(20)) + // .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.ICE_SPIKE, () -> Placement.COUNT_HEIGHTMAP_DOUBLE, new + // FrequencyConfig(100)) + // .addFeatures(DefaultBiomeFeatures::addVeryDenseGrass) + // .addCarver(Carving.AIR, () -> WorldCarver.CAVE, new ProbabilityConfig(0.1F)) + // .addSpawn(EntityClassification.CREATURE, () -> EntityType.IRON_GOLEM, 1, 2, 3) + // .addSpawn(EntityClassification.CREATURE, testentity, 1, 4, 8) + // .register(); + // + // private final RegistryEntry testbiome2 = registrate.object("testbiome2") + // .biome(TestBiome::new) + // .properties(b -> b.category(Category.DESERT) + // .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.SAND.getDefaultState(), + // Blocks.RED_SANDSTONE.getDefaultState(), Blocks.GRAVEL.getDefaultState())) + // .precipitation(RainType.NONE) + // .depth(1) + // .scale(1) + // .temperature(1) + // .downfall(1) + // .waterColor(0x3f76e4) + // .waterFogColor(0x050533)) + // .typeWeight(BiomeType.DESERT, 1000) + // .addDictionaryTypes(BiomeDictionary.Type.DRY) + // .forceAutomaticDictionaryTypes() + // .copyFeatures(() -> Biomes.DESERT) + // .copyCarvers(() -> Biomes.DESERT) + // .copySpawns(() -> Biomes.DESERT) + // .register(); + // + // private @Nullable DimensionType testdimensiontype; + // private final RegistryEntry testdimension = registrate.object("testdimension") + // .dimension(OverworldDimension::new) + // .hasSkyLight(false) + // .keepLoaded(false) + // .dimensionTypeCallback(t -> testdimensiontype = t) + // .register(); private final ResourceKey> CUSTOM_REGISTRY = registrate.makeRegistry("custom", RegistryBuilder::new); private final RegistryEntry testcustom = registrate.object("testcustom") .simple(CUSTOM_REGISTRY, TestCustomRegistryEntry::new); -// private final BlockBuilder INVALID_TEST = registrate.object("invalid") -// .block(Block::new) -// .addLayer(() -> RenderType::getTranslucent); + // private final BlockBuilder INVALID_TEST = registrate.object("invalid") + // .block(Block::new) + // .addLayer(() -> RenderType::getTranslucent); private static @NonnullType BlockBuilder applyDiamondDrop(BlockBuilder builder) { return builder.loot((prov, block) -> prov.dropOther(block, Items.DIAMOND)); } public TestMod(IEventBus eventBus) { - registrate.addRawLang("testmod.custom.lang", "Test"); registrate.addLang("tooltip", testblock.getId(), "Egg."); registrate.addLang("item", testitem.getId(), "testextra", "Magic!"); registrate.addDataGenerator(ProviderType.ADVANCEMENT, adv -> { Advancement.Builder.advancement() - .addCriterion("has_egg", InventoryChangeTrigger.TriggerInstance.hasItems(Items.EGG)) - .display(Items.EGG, - adv.title(registrate.getModid(), "root", "Test Advancement"), adv.desc(registrate.getModid(), "root", "Get an egg."), - ResourceLocation.withDefaultNamespace("textures/gui/advancements/backgrounds/stone.png"), AdvancementType.TASK, true, true, false) - .save(adv, registrate.getModid() + ":root"); + .addCriterion("has_egg", InventoryChangeTrigger.TriggerInstance.hasItems(Items.EGG)) + .display(Items.EGG, + adv.title(registrate.getModid(), "root", "Test Advancement"), adv.desc(registrate.getModid(), "root", "Get an egg."), + ResourceLocation.withDefaultNamespace("textures/gui/advancements/backgrounds/stone.png"), AdvancementType.TASK, true, true, false) + .save(adv, registrate.getModid() + ":root"); }); registrate.addDataGenerator(ProviderType.GENERIC_SERVER, provider -> provider.add(data -> { // generic server side provider to generate custom dimension @@ -382,10 +389,7 @@ public TestMod(IEventBus eventBus) { /* piglinSafe */ false, /* hasRaids */ true, /* monsterSpawnLightTest */ UniformInt.of(0, 7), - /* monsterSpawnBlockLightLimit */ 0 - ) - ) - )) + /* monsterSpawnBlockLightLimit */ 0)))) // register custom dimension for the dimension type // simple single biome (plains) dimension .add(Registries.LEVEL_STEM, context -> { @@ -399,13 +403,9 @@ public TestMod(IEventBus eventBus) { testDimensionType, new NoiseBasedChunkGenerator( new FixedBiomeSource(plains), - overworldNoiseSettings - ) - ) - ); + overworldNoiseSettings))); }), - Set.of("testmod") - ); + Set.of("testmod")); })); eventBus.addListener(this::onCommonSetup); @@ -421,10 +421,13 @@ private void onCommonSetup(FMLCommonSetupEvent event) { testblockitem.is(Items.STONE); testblockbe.is(BlockEntityType.CHEST); // testbiome.is(Feature.BAMBOO); // should not compile - if (testfluid.get().getBucket() != Items.AIR) throw new IllegalStateException("Expected no bucket for test fluid"); // should not crash + if (testfluid.get().getBucket() != Items.AIR) throw new IllegalStateException("Expected no bucket for test fluid"); // should + // not + // crash } private static class Client { + private static void testBlockModel(DataGenContext ctx, RegistrateItemModelGenerator prov) { prov.generateTintedModel(ctx.get(), prov.mcLoc("item/egg"), new Constant(0xFFFF0000)); } diff --git a/src/test/java/com/modularmc/registrate/test/mod/package-info.java b/src/test/java/com/modularmc/registrate/test/mod/package-info.java new file mode 100644 index 0000000..b3484eb --- /dev/null +++ b/src/test/java/com/modularmc/registrate/test/mod/package-info.java @@ -0,0 +1,6 @@ +@javax.annotation.ParametersAreNonnullByDefault +@net.minecraft.MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package com.modularmc.registrate.test.mod; + +import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/test/java/com/tterrag/registrate/test/meta/UpdateEntityLootTables.java b/src/test/java/com/tterrag/registrate/test/meta/UpdateEntityLootTables.java deleted file mode 100644 index a88eeef..0000000 --- a/src/test/java/com/tterrag/registrate/test/meta/UpdateEntityLootTables.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tterrag.registrate.test.meta; - -import java.io.IOException; -import java.nio.file.Paths; - -public class UpdateEntityLootTables { - - public static void main(String[] args) throws IOException { - new MethodGenerator(UpdateEntityLootTables.class) - .exclude("isNonLiving").exclude("getKnownEntities") - .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateEntityLootTables.java")); - } -} diff --git a/src/test/java/com/tterrag/registrate/test/meta/UpdateRecipeProvider.java b/src/test/java/com/tterrag/registrate/test/meta/UpdateRecipeProvider.java deleted file mode 100644 index e0fe91f..0000000 --- a/src/test/java/com/tterrag/registrate/test/meta/UpdateRecipeProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tterrag.registrate.test.meta; - -import java.io.IOException; -import java.nio.file.Paths; - -public class UpdateRecipeProvider { - - public static void main(String[] args) throws IOException { - new MethodGenerator(UpdateRecipeProvider.class) - .exclude("buildCraftingRecipes") - .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "generators", "RegistrateRecipeProvider.java")); - } -} diff --git a/src/test/java/com/tterrag/registrate/test/meta/package-info.java b/src/test/java/com/tterrag/registrate/test/meta/package-info.java deleted file mode 100644 index 9146b75..0000000 --- a/src/test/java/com/tterrag/registrate/test/meta/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@com.tterrag.registrate.util.nullness.FieldsAreNonnullByDefault -package com.tterrag.registrate.test.meta; \ No newline at end of file diff --git a/src/test/java/com/tterrag/registrate/test/mod/package-info.java b/src/test/java/com/tterrag/registrate/test/mod/package-info.java deleted file mode 100644 index 1d832d3..0000000 --- a/src/test/java/com/tterrag/registrate/test/mod/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@com.tterrag.registrate.util.nullness.FieldsAreNonnullByDefault -package com.tterrag.registrate.test.mod; \ No newline at end of file diff --git a/src/test/resources/pack.mcmeta b/src/test/resources/pack.mcmeta index b0ac1e9..ca3a103 100644 --- a/src/test/resources/pack.mcmeta +++ b/src/test/resources/pack.mcmeta @@ -1,9 +1,9 @@ { - "pack": { - "description": "examplemod resources", - "pack_format": 12, - "forge:resource_pack_format": 12, - "forge:data_pack_format": 10, - "_comment": "A pack_format of 4 requires json lang files. Note: we require v4 pack meta for all mods." - } + "pack": { + "description": "examplemod resources", + "pack_format": 12, + "forge:resource_pack_format": 12, + "forge:data_pack_format": 10, + "_comment": "A pack_format of 4 requires json lang files. Note: we require v4 pack meta for all mods." + } } From e9a157e6a2797c44351a26f91c9fb98aa7859247 Mon Sep 17 00:00:00 2001 From: qiuye2024github Date: Wed, 29 Apr 2026 13:35:12 +0800 Subject: [PATCH 02/10] fix build --- .../registrate/AbstractRegistrate.java | 498 ++++------ .../com/modularmc/registrate/Registrate.java | 18 +- .../modularmc/registrate/RegistrateLib.java | 24 + .../registrate/builders/AbstractBuilder.java | 61 +- .../registrate/builders/BiomeBuilder.java | 917 +++++++++--------- .../registrate/builders/BlockBuilder.java | 216 ++--- .../builders/BlockEntityBuilder.java | 70 +- .../registrate/builders/Builder.java | 130 +-- .../registrate/builders/BuilderCallback.java | 37 +- .../registrate/builders/EntityBuilder.java | 142 ++- .../registrate/builders/FluidBuilder.java | 294 +++--- .../registrate/builders/ItemBuilder.java | 100 +- .../registrate/builders/MenuBuilder.java | 19 +- .../registrate/builders/NoConfigBuilder.java | 5 +- .../registrate/builders/package-info.java | 8 +- .../modularmc/registrate/package-info.java | 10 +- .../registrate/providers/DataGenContext.java | 15 +- .../providers/DataProviderInitializer.java | 93 +- .../registrate/providers/GeneratorType.java | 3 +- .../registrate/providers/ProviderType.java | 27 +- .../RegistrateAdvancementProvider.java | 18 +- .../providers/RegistrateDataMapProvider.java | 64 +- .../providers/RegistrateDataProvider.java | 49 +- .../providers/RegistrateDatapackProvider.java | 24 +- .../providers/RegistrateGenericProvider.java | 31 +- .../providers/RegistrateItemTagsProvider.java | 1 - .../providers/RegistrateLangProvider.java | 54 +- .../RegistrateLookupFillerProvider.java | 1 + .../providers/RegistrateProvider.java | 2 +- .../providers/RegistrateProviderDelegate.java | 6 +- .../providers/RegistrateTagsProvider.java | 24 +- .../RegistrateBlockModelGenerator.java | 306 ++---- .../RegistrateItemModelGenerator.java | 28 +- .../RegistrateLegacyBlockModelBuilder.java | 236 ++--- .../generators/RegistrateModelProvider.java | 30 +- .../generators/RegistrateRecipeProvider.java | 860 ++++++++-------- .../generators/RegistrateRecipeRunner.java | 48 +- .../providers/generators/package-info.java | 6 +- .../loot/RegistrateBlockLootTables.java | 458 ++++----- .../loot/RegistrateEntityLootTables.java | 32 +- .../loot/RegistrateLootTableProvider.java | 22 +- .../providers/loot/RegistrateLootTables.java | 7 +- .../providers/loot/package-info.java | 6 +- .../registrate/providers/package-info.java | 6 +- .../util/CreativeModeTabModifier.java | 11 +- .../registrate/util/DataIngredient.java | 30 +- .../registrate/util/DebugMarkers.java | 8 +- .../registrate/util/OneTimeEventReceiver.java | 26 +- .../util/RegistrateDistExecutor.java | 3 +- .../modularmc/registrate/util/Sequence.java | 12 +- .../util/entry/BlockEntityEntry.java | 29 +- .../registrate/util/entry/BlockEntry.java | 2 +- .../registrate/util/entry/EntityEntry.java | 3 +- .../registrate/util/entry/FluidEntry.java | 9 +- .../registrate/util/entry/ItemEntry.java | 2 +- .../util/entry/ItemProviderEntry.java | 9 + .../util/entry/LazyRegistryEntry.java | 12 +- .../registrate/util/entry/MenuEntry.java | 6 +- .../registrate/util/entry/RegistryEntry.java | 24 +- .../registrate/util/entry/package-info.java | 6 +- .../util/nullness/NonNullBiConsumer.java | 4 +- .../util/nullness/NonNullBiFunction.java | 4 +- .../util/nullness/NonNullConsumer.java | 13 +- .../util/nullness/NonNullFunction.java | 2 +- .../util/nullness/NonNullSupplier.java | 12 +- .../util/nullness/NullableSupplier.java | 14 +- .../util/nullness/package-info.java | 4 +- .../registrate/util/package-info.java | 6 +- .../test/gametests/CustomItemTests.java | 23 + .../registrate/test/meta/MethodGenerator.java | 36 +- .../test/meta/ProtectedMethodScraper.java | 20 +- .../test/meta/UpdateBlockLootTables.java | 4 +- .../test/meta/UpdateEntityLootTables.java | 6 +- .../test/meta/UpdateRecipeProvider.java | 6 +- .../registrate/test/meta/package-info.java | 6 +- .../registrate/test/mod/TestMod.java | 428 ++++---- .../registrate/test/mod/package-info.java | 6 +- 77 files changed, 2719 insertions(+), 3073 deletions(-) create mode 100644 src/main/java/com/modularmc/registrate/RegistrateLib.java create mode 100644 src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java diff --git a/src/main/java/com/modularmc/registrate/AbstractRegistrate.java b/src/main/java/com/modularmc/registrate/AbstractRegistrate.java index aa9b883..eab226f 100644 --- a/src/main/java/com/modularmc/registrate/AbstractRegistrate.java +++ b/src/main/java/com/modularmc/registrate/AbstractRegistrate.java @@ -1,35 +1,26 @@ package com.modularmc.registrate; -import com.modularmc.registrate.builders.BlockBuilder; -import com.modularmc.registrate.builders.BlockEntityBuilder; +import com.google.common.base.Preconditions; +import com.google.common.collect.*; +import com.mojang.serialization.Codec; +import com.modularmc.registrate.builders.*; import com.modularmc.registrate.builders.BlockEntityBuilder.BlockEntityFactory; -import com.modularmc.registrate.builders.Builder; -import com.modularmc.registrate.builders.BuilderCallback; -import com.modularmc.registrate.builders.EntityBuilder; -import com.modularmc.registrate.builders.FluidBuilder; -import com.modularmc.registrate.builders.ItemBuilder; -import com.modularmc.registrate.builders.MenuBuilder; import com.modularmc.registrate.builders.MenuBuilder.ForgeMenuFactory; import com.modularmc.registrate.builders.MenuBuilder.MenuFactory; import com.modularmc.registrate.builders.MenuBuilder.ScreenFactory; -import com.modularmc.registrate.builders.NoConfigBuilder; -import com.modularmc.registrate.providers.DataProviderInitializer; -import com.modularmc.registrate.providers.GeneratorType; -import com.modularmc.registrate.providers.ProviderType; -import com.modularmc.registrate.providers.RegistrateDataProvider; -import com.modularmc.registrate.providers.RegistrateLangProvider; +import com.modularmc.registrate.providers.*; import com.modularmc.registrate.util.CreativeModeTabModifier; import com.modularmc.registrate.util.DebugMarkers; import com.modularmc.registrate.util.OneTimeEventReceiver; import com.modularmc.registrate.util.entry.ItemEntry; import com.modularmc.registrate.util.entry.RegistryEntry; -import com.modularmc.registrate.util.nullness.NonNullBiFunction; -import com.modularmc.registrate.util.nullness.NonNullConsumer; -import com.modularmc.registrate.util.nullness.NonNullFunction; -import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; -import com.modularmc.registrate.util.nullness.NonnullType; - +import com.modularmc.registrate.util.nullness.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; +import lombok.Value; +import lombok.experimental.Accessors; +import lombok.extern.log4j.Log4j2; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.MenuAccess; import net.minecraft.client.multiplayer.ClientPacketListener; @@ -51,27 +42,18 @@ import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; -import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.data.event.GatherDataEvent; import net.neoforged.neoforge.data.loading.DatagenModLoader; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import net.neoforged.neoforge.fluids.BaseFlowingFluid; import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.registries.*; - -import com.google.common.base.Preconditions; -import com.google.common.collect.*; -import com.mojang.serialization.Codec; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; -import lombok.Value; -import lombok.experimental.Accessors; -import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.message.Message; +import org.jspecify.annotations.Nullable; import java.util.*; import java.util.Map.Entry; import java.util.function.Consumer; @@ -79,24 +61,18 @@ import java.util.function.UnaryOperator; import java.util.stream.Collectors; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - /** * Manages all registrations and data generators for a mod. *

        - * Generally not thread-safe, as it holds the current name of the object being built statefully, and uses - * non-concurrent collections. + * Generally not thread-safe, as it holds the current name of the object being built statefully, and uses non-concurrent collections. *

        - * Begin a new object via {@link #object(String)}. This name will be used for all future entries until the next - * invocation of {@link #object(String)}. Alternatively, the methods that accept a name + * Begin a new object via {@link #object(String)}. This name will be used for all future entries until the next invocation of {@link #object(String)}. Alternatively, the methods that accept a name * parameter (such as {@link #block(String, NonNullFunction)}) can be used. These do not affect the current name state. *

        * A simple use may look like: * *

          * {@code
        - *
          * public static final Registrate REGISTRATE = Registrate.create("mymod");
          *
          * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
        @@ -113,7 +89,6 @@ public abstract class AbstractRegistrate> {
         
             @Value
             private class Registration {
        -
                 Identifier name;
                 ResourceKey> type;
                 NonNullSupplier creator;
        @@ -125,7 +100,7 @@ private class Registration {
                 Registration(Identifier name, ResourceKey> type, NonNullSupplier creator, NonNullFunction, ? extends RegistryEntry> entryFactory) {
                     this.name = name;
                     this.type = type;
        -            this.creator = creator.lazy();
        +            this.creator =  creator.lazy();
                     this.delegate = entryFactory.apply(DeferredHolder.create(type, name));
                 }
         
        @@ -145,24 +120,21 @@ void addRegisterCallback(NonNullConsumer callback) {
             /**
              * Checks if Minecraft is running from a dev environment. Enables certain debug logging.
              *
        -     * @return {@code true} when in a dev environment (specifically, {@link FMLLoader#isProduction()} == false)
        +     * @return {@code true} when in a dev environment (specifically, {@link FMLEnvironment#isProduction()} == false)
              */
             public static boolean isDevEnvironment() {
        -        return !FMLLoader.isProduction();
        +        return !FMLEnvironment.isProduction();
             }
         
             private final Table>, String, Registration> registrations = HashBasedTable.create();
        -    /**
        -     * Expected to be emptied by the time registration occurs, is emptied by
        -     * {@link #accept(String, ResourceKey, Builder, NonNullSupplier, NonNullFunction)}
        -     */
        +    /** Expected to be emptied by the time registration occurs, is emptied by {@link #accept(String, ResourceKey, Builder, NonNullSupplier, NonNullFunction)} */
             private final Multimap>>, NonNullConsumer> registerCallbacks = HashMultimap.create();
             /** Entry-less callbacks that are invoked after the registry type has completely finished */
             private final Multimap>, Runnable> afterRegisterCallbacks = HashMultimap.create();
             private final Set>> completedRegistrations = new HashSet<>();
         
             private final Table>>, GeneratorType, Consumer> datagensByEntry = HashBasedTable.create();
        -    private final ListMultimap, @NonnullType NonNullConsumer> datagens = ArrayListMultimap.create();
        +    private final ListMultimap, NonNullConsumer> datagens = ArrayListMultimap.create();
             private final Multimap, Consumer> creativeModeTabModifiers = ArrayListMultimap.create();
             private ResourceKey defaultCreativeModeTab = CreativeModeTabs.SEARCH;
         
        @@ -177,23 +149,19 @@ public static boolean isDevEnvironment() {
             private final String modid;
         
             /**
        -     * Get the mod event bus that event listeners will be registered to. Useful when Registrate is used in mods that use
        -     * alternative language loaders, such as forgelin.
        +     * Get the mod event bus that event listeners will be registered to. Useful when Registrate is used in mods that use alternative language loaders, such as forgelin.
              */
        -    @Getter
        -    @Setter
        -    @Nullable
        -    private IEventBus modEventBus;
        +    @Getter @Setter
        +    private @Nullable IEventBus modEventBus;
         
        -    @Nullable
        -    private String currentName;
        +    private @Nullable String currentName;
             private boolean skipErrors;
         
             /**
              * Construct a new Registrate for the given mod ID.
              *
              * @param modid
        -     *              The mod ID for which objects will be registered
        +     *            The mod ID for which objects will be registered
              */
             protected AbstractRegistrate(String modid) {
                 this.modid = modid;
        @@ -210,8 +178,7 @@ protected final S self() {
             }
         
             /**
        -     * Called during {@link Registrate#create(String) creation} to initialize event listeners. Custom implementations
        -     * may add their own event listeners by overriding this.
        +     * Called during {@link Registrate#create(String) creation} to initialize event listeners. Custom implementations may add their own event listeners by overriding this.
              * 

        * Always call {@code super} in your override unless you know what you are doing! * @@ -228,9 +195,8 @@ public S registerEventListeners(IEventBus bus) { Consumer onRegisterLate = this::onRegisterLate; bus.addListener(onRegister); bus.addListener(EventPriority.LOWEST, onRegisterLate); - bus.addListener(this::onBuildCreativeModeTabContents); // Fired multiple times when ever tabs need contents - // rebuilt (changing op tab perms for example) - + bus.addListener(this::onBuildCreativeModeTabContents); // Fired multiple times when ever tabs need contents rebuilt (changing op tab perms for example) + // Register events fire multiple times, so clean them up on common setup OneTimeEventReceiver.addModListener(this, FMLCommonSetupEvent.class, $ -> { OneTimeEventReceiver.unregister(this, onRegister, RegisterEvent.class); @@ -245,22 +211,20 @@ public S registerEventListeners(IEventBus bus) { } /** - * Called once per registry to gather collected registrations and add entries to the registry. May be overriden in - * custom implementations to perform additional actions upon entry registration, but + * Called once per registry to gather collected registrations and add entries to the registry. May be overriden in custom implementations to perform additional actions upon entry registration, but * must call {@code super}. - * + * * @param event - * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the - * registry type + * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the registry type */ protected void onRegister(RegisterEvent event) { ResourceKey> type = event.getRegistryKey(); if (type == null) { - log.debug(DebugMarkers.REGISTER, "Skipping invalid registry with no supertype: " + event.getRegistryKey().location()); + log.debug(DebugMarkers.REGISTER, "Skipping invalid registry with no supertype: " + event.getRegistryKey().identifier()); return; } if (!registerCallbacks.isEmpty()) { - registerCallbacks.asMap().forEach((k, v) -> log.warn("Found {} unused register callback(s) for entry {} [{}]. Was the entry ever registered?", v.size(), k.getLeft(), k.getRight().location())); + registerCallbacks.asMap().forEach((k, v) -> log.warn("Found {} unused register callback(s) for entry {} [{}]. Was the entry ever registered?", v.size(), k.getLeft(), k.getRight().identifier())); registerCallbacks.clear(); if (isDevEnvironment()) { throw new IllegalStateException("Found unused register callbacks, see logs"); @@ -268,13 +232,13 @@ protected void onRegister(RegisterEvent event) { } Map> registrationsForType = registrations.row(type); if (registrationsForType.size() > 0) { - log.trace(DebugMarkers.REGISTER, "({}) Registering {} known objects of type {}", getModid(), registrationsForType.size(), type.location()); + log.trace(DebugMarkers.REGISTER, "({}) Registering {} known objects of type {}", getModid(), registrationsForType.size(), type.identifier()); for (Entry> e : registrationsForType.entrySet()) { try { e.getValue().register(event); - log.trace(DebugMarkers.REGISTER, "Registered {} to registry {}", e.getValue().getName(), event.getRegistryKey().location()); + log.trace(DebugMarkers.REGISTER, "Registered {} to registry {}", e.getValue().getName(), event.getRegistryKey().identifier()); } catch (Exception ex) { - String err = "Unexpected error while registering entry " + e.getValue().getName() + " to registry " + event.getRegistryKey().location(); + String err = "Unexpected error while registering entry " + e.getValue().getName() + " to registry " + event.getRegistryKey().identifier(); if (skipErrors) { log.error(DebugMarkers.REGISTER, err); } else { @@ -286,14 +250,11 @@ protected void onRegister(RegisterEvent event) { } /** - * Called once per registry at the {@link EventPriority#LOWEST lowest priority} to perform any actions that must - * happen after all other entries have been registered, including from other mods. May - * be overriden in custom implementations to perform additional actions upon entry registration, but must - * call {@code super}. - * + * Called once per registry at the {@link EventPriority#LOWEST lowest priority} to perform any actions that must happen after all other entries have been registered, including from other mods. May + * be overriden in custom implementations to perform additional actions upon entry registration, but must call {@code super}. + * * @param event - * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the - * registry type + * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the registry type */ protected void onRegisterLate(RegisterEvent event) { ResourceKey> type = event.getRegistryKey(); @@ -304,28 +265,26 @@ protected void onRegisterLate(RegisterEvent event) { } /** - * Called when a {@link CreativeModeTab} is being populated to fill in any entries that belong there. Can be - * overriden in custom implementations. - * + * Called when a {@link CreativeModeTab} is being populated to fill in any entries that belong there. Can be overriden in custom implementations. + * * @param event - * The event + * The event */ protected void onBuildCreativeModeTabContents(BuildCreativeModeTabContentsEvent event) { var modifier = new CreativeModeTabModifier(event::getFlags, event::hasPermissions, event::accept, event::getParameters); creativeModeTabModifiers.forEach((key, value) -> { - if (event.getTabKey().equals(key)) value.accept(modifier); + if(event.getTabKey().equals(key)) value.accept(modifier); }); } - @Nullable - private RegistrateDataProvider provider; + private @Nullable RegistrateDataProvider provider; /** * Called when datagen begins to add our provider to the generator. Can be overriden in custom implementations. - * + * * @param event - * The event + * The event */ protected void onData(GatherDataEvent event) { event.getGenerator().addProvider(true, provider = new RegistrateDataProvider(this, modid, event)); @@ -336,7 +295,7 @@ protected void onData(GatherDataEvent event) { * * @return The current entry name * @throws NullPointerException - * if {@link #currentName} is null + * if {@link #currentName} is null */ protected String currentName() { String name = currentName; @@ -345,41 +304,38 @@ protected String currentName() { } /** - * Allows retrieval of a previously created entry, of the current name (from the last invocation of - * {@link #object(String)}. Useful to retrieve a different entry than the final state of your + * Allows retrieval of a previously created entry, of the current name (from the last invocation of {@link #object(String)}. Useful to retrieve a different entry than the final state of your * chain may produce, e.g. * *

              * {@code
        -     *
              * public static final RegistryObject MY_BLOCK_ITEM = REGISTRATE.object("my_block")
              *         .block(MyBlock::new)
        -     *         .defaultItem()
        -     *         .lang("My Special Block")
        -     *         .build()
        +     *             .defaultItem()
        +     *             .lang("My Special Block")
        +     *             .build()
              *         .get(Item.class);
              * }
              * 
        * * @param - * The type of the registry for which to retrieve the entry + * The type of the registry for which to retrieve the entry * @param - * The type of the entry to return + * The type of the entry to return * @param type - * A {@link ResourceKey} for the registry + * A {@link ResourceKey} for the registry * @return A {@link RegistryEntry} which will supply the requested entry, if it exists * @throws IllegalArgumentException - * if no such registration has been done + * if no such registration has been done * @throws NullPointerException - * if current name has not been set via {@link #object(String)} + * if current name has not been set via {@link #object(String)} */ public RegistryEntry get(ResourceKey> type) { return this.get(currentName(), type); } /** - * Allows retrieval of a previously created entry. Useful to retrieve arbitrary entries that may have been created - * as side-effects of earlier registrations. + * Allows retrieval of a previously created entry. Useful to retrieve arbitrary entries that may have been created as side-effects of earlier registrations. * *
              * {@code
        @@ -395,33 +351,32 @@ public  RegistryEntry get(ResourceKey
              *
              * @param 
        -     *             The type of the registry for which to retrieve the entry
        +     *            The type of the registry for which to retrieve the entry
              * @param 
        -     *             The type of the entry to return
        +     *            The type of the entry to return
              * @param name
        -     *             The name of the registry entry to request
        +     *            The name of the registry entry to request
              * @param type
        -     *             A {@link ResourceKey} for the registry
        +     *            A {@link ResourceKey} for the registry
              * @return A {@link RegistryEntry} which will supply the requested entry, if it exists
              * @throws IllegalArgumentException
        -     *                                  if no such registration has been done
        +     *             if no such registration has been done
              */
             public  RegistryEntry get(String name, ResourceKey> type) {
                 return this.getRegistration(name, type).getDelegate();
             }
         
             /**
        -     * Allows retrieval of a previously created entry that may or may not exist. Possibly useful in some very specific
        -     * scenarios, internally used during fluid registration.
        +     * Allows retrieval of a previously created entry that may or may not exist. Possibly useful in some very specific scenarios, internally used during fluid registration.
              *
              * @param 
        -     *             The type of the registry for which to retrieve the entry
        +     *            The type of the registry for which to retrieve the entry
              * @param 
        -     *             The type of the entry to return
        +     *            The type of the entry to return
              * @param name
        -     *             The name of the registry entry to request
        +     *            The name of the registry entry to request
              * @param type
        -     *             A class representing the registry type
        +     *            A class representing the registry type
              * @return A {@link RegistryEntry} which will supply the requested entry, if it exists
              */
             public  Optional> getOptional(String name, ResourceKey> type) {
        @@ -430,8 +385,7 @@ public  Optional> getOptional(String name, R
             }
         
             @SuppressWarnings("unchecked")
        -    @Nullable
        -    private  Registration getRegistrationUnchecked(String name, ResourceKey> type) {
        +    private  @Nullable Registration getRegistrationUnchecked(String name, ResourceKey> type) {
                 return (Registration) registrations.get(type, name);
             }
         
        @@ -440,21 +394,19 @@ private  Registration getRegistration(String name, Resourc
                 if (reg != null) {
                     return reg;
                 }
        -        throw new IllegalArgumentException("Unknown registration " + name + " for type " + type.location());
        +        throw new IllegalArgumentException("Unknown registration " + name + " for type " + type.identifier());
             }
         
             /**
              * Gather a collection of all entries registered for a certain registry
              * 

        - * Note that this can be called before registration is complete, but the {@link RegistryEntry entries} will be empty - * at that time. - * + * Note that this can be called before registration is complete, but the {@link RegistryEntry entries} will be empty at that time. + * * @param - * Registry type + * Registry type * @param type - * A {@link ResourceKey} for the registry in question - * @return A collection of {@link RegistryEntry} objects representing all entries in the given registry which are - * known to this {@link AbstractRegistrate} object. + * A {@link ResourceKey} for the registry in question + * @return A collection of {@link RegistryEntry} objects representing all entries in the given registry which are known to this {@link AbstractRegistrate} object. */ @SuppressWarnings({ "null", "unchecked" }) public Collection> getAll(ResourceKey> type) { @@ -462,20 +414,18 @@ public Collection> getAll(ResourceKeyimmediately - * following registration, before further entries are registered. - * + * Add a callback to be invoked when a certain entry has been registered. This will be invoked immediately following registration, before further entries are registered. + * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param name - * The name of the entry to watch (implicitly within the {@link #getModid() modid} of this - * instance + * The name of the entry to watch (implicitly within the {@link #getModid() modid} of this instance * @param registryType - * A {@link ResourceKey} for the registry in question + * A {@link ResourceKey} for the registry in question * @param callback - * The callback to invoke, which will be passed the created entry object + * The callback to invoke, which will be passed the created entry object * @return This {@link AbstractRegistrate} instance */ public S addRegisterCallback(String name, ResourceKey> registryType, NonNullConsumer callback) { @@ -489,15 +439,14 @@ public S addRegisterCallback(String name, ResourceKey - * The registry type + * The registry type * @param registryType - * A {@link ResourceKey} for the registry in question + * A {@link ResourceKey} for the registry in question * @param callback - * The callback to invoke + * The callback to invoke * @return This {@link AbstractRegistrate} instance */ public S addRegisterCallback(ResourceKey> registryType, Runnable callback) { @@ -507,11 +456,11 @@ public S addRegisterCallback(ResourceKey> registryType /** * Check if a certain registry has completed registration. - * + * * @param - * The registry type + * The registry type * @param registryType - * A {@link ResourceKey} for the registry in question + * A {@link ResourceKey} for the registry in question * @return {@code true} iff the given registry has finished the registration step */ public boolean isRegistered(ResourceKey> registryType) { @@ -519,17 +468,15 @@ public boolean isRegistered(ResourceKey> registryType) } /** - * Get the data provider instance for a given {@link GeneratorType}. Only works within datagen context, not during - * registration or init. + * Get the data provider instance for a given {@link GeneratorType}. Only works within datagen context, not during registration or init. * * @param

        - * The type of the provider + * The type of the provider * @param type - * A {@link GeneratorType} representing the desired provider - * @return An {@link Optional} holding the provider, or empty if this provider was not registered. This can happen - * if datagen is run only for client or server providers. + * A {@link GeneratorType} representing the desired provider + * @return An {@link Optional} holding the provider, or empty if this provider was not registered. This can happen if datagen is run only for client or server providers. * @throws IllegalStateException - * if datagen has not started yet + * if datagen has not started yet */ public

        Optional

        getDataProvider(GeneratorType

        type) { RegistrateDataProvider provider = this.provider; @@ -540,19 +487,18 @@ public

        Optional

        getDataProvider(GeneratorType

        type) { } /** - * Mostly internal, sets the data generator for a certain entry/type combination. This will replace an existing data - * gen callback if it exists. + * Mostly internal, sets the data generator for a certain entry/type combination. This will replace an existing data gen callback if it exists. * * @param

        - * The type of provider + * The type of provider * @param - * The registry type + * The registry type * @param builder - * The builder for the entry + * The builder for the entry * @param type - * The {@link GeneratorType} to generate data for + * The {@link GeneratorType} to generate data for * @param cons - * A callback to be invoked during data generation + * A callback to be invoked during data generation * @return this {@link AbstractRegistrate} */ public S setDataGenerator(Builder builder, GeneratorType type, NonNullConsumer cons) { @@ -560,21 +506,20 @@ public S setDataGenerator(Builder builder, GeneratorType - * The type of provider + * The type of provider * @param - * The registry type + * The registry type * @param entry - * The name of the entry which the provider is for + * The name of the entry which the provider is for * @param registryType - * A {@link Class} representing the registry type of the entry + * A {@link Class} representing the registry type of the entry * @param type - * The {@link GeneratorType} to generate data for + * The {@link GeneratorType} to generate data for * @param cons - * A callback to be invoked during data generation + * A callback to be invoked during data generation * @return this {@link AbstractRegistrate} */ public S setDataGenerator(String entry, ResourceKey> registryType, GeneratorType type, NonNullConsumer cons) { @@ -588,17 +533,16 @@ public S setDataGenerator(String entry, ResourceKey } /** - * Add a data generator callback that is not associated with any entry, which can never replace an existing data - * generator. + * Add a data generator callback that is not associated with any entry, which can never replace an existing data generator. *

        * This is useful to add data generator callbacks for miscellaneous data not strictly associated with an entry. * * @param - * The type of provider + * The type of provider * @param type - * The {@link GeneratorType} to generate data for + * The {@link GeneratorType} to generate data for * @param cons - * A callback to be invoked during data generation + * A callback to be invoked during data generation * @return this {@link AbstractRegistrate} */ public S addDataGenerator(GeneratorType type, NonNullConsumer cons) { @@ -609,8 +553,7 @@ public S addDataGenerator(GeneratorType type, NonNullConsumer "block.mymod.myblock"}) + * Type of the object, this is used as a prefix (e.g. {@code ["block", "mymod:myblock"] -> "block.mymod.myblock"}) * @param id - * ID of the object, which will be converted to a lang key via - * {@link Util#makeDescriptionId(String, Identifier)} + * ID of the object, which will be converted to a lang key via {@link Util#makeDescriptionId(String, Identifier)} * @param localizedName - * (English) translation value + * (English) translation value * @return A {@link MutableComponent} representing the translated text */ public MutableComponent addLang(String type, Identifier id, String localizedName) { @@ -646,19 +587,16 @@ public MutableComponent addLang(String type, Identifier id, String localizedName } /** - * Add a custom translation mapping using the vanilla style of Identifier -> translation key conversion. Also - * appends a suffix to the key. + * Add a custom translation mapping using the vanilla style of Identifier -> translation key conversion. Also appends a suffix to the key. * * @param type - * Type of the object, this is used as a prefix (e.g. - * {@code ["block", "mymod:myblock"] -> "block.mymod.myblock"}) + * Type of the object, this is used as a prefix (e.g. {@code ["block", "mymod:myblock"] -> "block.mymod.myblock"}) * @param id - * ID of the object, which will be converted to a lang key via - * {@link Util#makeDescriptionId(String, Identifier)} + * ID of the object, which will be converted to a lang key via {@link Util#makeDescriptionId(String, Identifier)} * @param suffix - * A suffix which will be appended to the generated key (separated by a dot) + * A suffix which will be appended to the generated key (separated by a dot) * @param localizedName - * (English) translation value + * (English) translation value * @return A {@link MutableComponent} representing the translated text */ public MutableComponent addLang(String type, Identifier id, String suffix, String localizedName) { @@ -669,9 +607,9 @@ public MutableComponent addLang(String type, Identifier id, String suffix, Strin * Add a custom translation mapping directly to the lang provider. * * @param key - * The translation key + * The translation key * @param value - * The (English) translation value + * The (English) translation value * @return A {@link MutableComponent} representing the translated text */ public MutableComponent addRawLang(String key, String value) { @@ -695,11 +633,11 @@ private Optional>>> getEntryForGe * For internal use, calls upon registered data generators to actually create their data. * * @param - * The type of the provider + * The type of the provider * @param type - * The type of provider to run + * The type of provider to run * @param gen - * The provider + * The provider */ @SuppressWarnings("unchecked") public void genData(GeneratorType type, T gen) { @@ -712,7 +650,7 @@ public void genData(GeneratorType type, T gen) { if (log.isEnabled(Level.DEBUG, DebugMarkers.DATA)) { entry = getEntryForGenerator(type, cons); if (entry.isPresent()) { - log.debug(DebugMarkers.DATA, "Generating data of type {} for entry {} [{}]", RegistrateDataProvider.getTypeName(type), entry.get().getLeft(), entry.get().getRight().location()); + log.debug(DebugMarkers.DATA, "Generating data of type {} for entry {} [{}]", RegistrateDataProvider.getTypeName(type), entry.get().getLeft(), entry.get().getRight().identifier()); } else { log.debug(DebugMarkers.DATA, "Generating unassociated data of type {} ({})", RegistrateDataProvider.getTypeName(type), type); } @@ -725,7 +663,7 @@ public void genData(GeneratorType type, T gen) { } Message err; if (entry.isPresent()) { - err = log.getMessageFactory().newMessage("Unexpected error while running data generator of type {} for entry {} [{}]", RegistrateDataProvider.getTypeName(type), entry.get().getLeft(), entry.get().getRight().location()); + err = log.getMessageFactory().newMessage("Unexpected error while running data generator of type {} for entry {} [{}]", RegistrateDataProvider.getTypeName(type), entry.get().getLeft(), entry.get().getRight().identifier()); } else { err = log.getMessageFactory().newMessage("Unexpected error while running unassociated data generator of type {} ({})", RegistrateDataProvider.getTypeName(type), type); } @@ -741,11 +679,10 @@ public void genData(GeneratorType type, T gen) { /** * Enable skipping of registry entries and data generators that error during registration/generation. *

        - * Should only be used for debugging! {@code skipErrors(true)} will do nothing outside of a dev - * environment. + * Should only be used for debugging! {@code skipErrors(true)} will do nothing outside of a dev environment. * * @param skipErrors - * {@code true} to skip errors during registration/generation + * {@code true} to skip errors during registration/generation * @return this {@link AbstractRegistrate} */ public S skipErrors(boolean skipErrors) { @@ -758,12 +695,11 @@ public S skipErrors(boolean skipErrors) { } /** - * Begin a new object, this is typically used at the beginning of a builder chain. The given name will be used until - * this method is called again. This makes it simple to create multiple entries + * Begin a new object, this is typically used at the beginning of a builder chain. The given name will be used until this method is called again. This makes it simple to create multiple entries * with the same name, as is often the case with blocks/items, items/entities, and blocks/TEs. * * @param name - * The name to use for future entries + * The name to use for future entries * @return this {@link AbstractRegistrate} */ public S object(String name) { @@ -774,11 +710,10 @@ public S object(String name) { /** * Set the default CreativeModeTab to be passed onto future builders. *

        - * This special case method should be used if your creative tab instance was not created by Registrate, otherwise - * use {@link #defaultCreativeTab()}. - * + * This special case method should be used if your creative tab instance was not created by Registrate, otherwise use {@link #defaultCreativeTab()}. + * * @param creativeModeTab - * The new default CreativeModeTab type + * The new default CreativeModeTab type * @return This {@link AbstractRegistrate} instance */ public S defaultCreativeTab(ResourceKey creativeModeTab) { @@ -796,7 +731,7 @@ public S defaultCreativeTab(ResourceKey creativeModeTab) { * Calling this method multiple times will add additional callbacks. * * @param creativeModeTab The {@link CreativeModeTab} to register this callback for - * @param modifier The modifier callback to be registered + * @param modifier The modifier callback to be registered * @return This {@link AbstractRegistrate} instance */ public S modifyCreativeModeTab(ResourceKey creativeModeTab, Consumer modifier) { @@ -805,12 +740,10 @@ public S modifyCreativeModeTab(ResourceKey creativeModeTab, Con } /** - * Apply a transformation to this {@link AbstractRegistrate}. Useful to apply helper methods within a fluent chain, - * e.g. + * Apply a transformation to this {@link AbstractRegistrate}. Useful to apply helper methods within a fluent chain, e.g. * *

              * {@code
        -     *
              * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
              *         .transform(Utils::createMyBlock)
              *         .get(Block.class);
        @@ -818,7 +751,7 @@ public S modifyCreativeModeTab(ResourceKey creativeModeTab, Con
              * 
        * * @param func - * The {@link UnaryOperator function} to apply + * The {@link UnaryOperator function} to apply * @return this {@link AbstractRegistrate} */ public S transform(NonNullUnaryOperator func) { @@ -826,13 +759,11 @@ public S transform(NonNullUnaryOperator func) { } /** - * Apply a transformation to this {@link AbstractRegistrate}. Similar to {@link #transform(NonNullUnaryOperator)}, - * but for actions that return a builder in-progress. Useful to apply helper methods + * Apply a transformation to this {@link AbstractRegistrate}. Similar to {@link #transform(NonNullUnaryOperator)}, but for actions that return a builder in-progress. Useful to apply helper methods * within a fluent chain, e.g. * *
              * {@code
        -     *
              * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
              *         .transform(Utils::createMyBlock)
              *         .lang("My Block") // Can modify the builder afterwards
        @@ -841,15 +772,15 @@ public S transform(NonNullUnaryOperator func) {
              * 
        * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param

        - * Parent type + * Parent type * @param - * Self type + * Self type * @param func - * The {@link Function function} to apply + * The {@link Function function} to apply * @return the resultant {@link Builder} */ public > S2 transform(NonNullFunction func) { @@ -857,22 +788,20 @@ public > S2 transform(NonNull } /** - * Create a builder for a new entry. This is typically not needed, unless you are implementing a - * custom builder type. + * Create a builder for a new entry. This is typically not needed, unless you are implementing a custom builder type. *

        - * Uses the currently set name (via {@link #object(String)}) as the name for the new entry, and passes it to the - * factory as the first parameter. + * Uses the currently set name (via {@link #object(String)}) as the name for the new entry, and passes it to the factory as the first parameter. * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param

        - * Parent type + * Parent type * @param - * Self type + * Self type * @param factory - * The factory to create the builder + * The factory to create the builder * @return The {@link Builder} instance */ public > S2 entry(NonNullBiFunction factory) { @@ -880,21 +809,20 @@ public > S2 entry(NonNullBiFu } /** - * Create a builder for a new entry. This is typically not needed, unless you are implementing a - * custom builder type. + * Create a builder for a new entry. This is typically not needed, unless you are implementing a custom builder type. * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param

        - * Parent type + * Parent type * @param - * Self type + * Self type * @param name - * The name to use for the entry + * The name to use for the entry * @param factory - * The factory to create the builder + * The factory to create the builder * @return The {@link Builder} instance */ public > S2 entry(String name, NonNullFunction factory) { @@ -904,32 +832,29 @@ public > S2 entry(String name /** * Factory method to accept a completed builder and add it to the registration queue. *

        - * Satisfies the functional interface {@link BuilderCallback}, which is typically given to new builder instances - * when they are constructed. - * + * Satisfies the functional interface {@link BuilderCallback}, which is typically given to new builder instances when they are constructed. + * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param name - * Thename of the entry being created + * Thename of the entry being created * @param type - * The registry to add the entry to + * The registry to add the entry to * @param builder - * The builder instance that was used to create this entry. Not used by default implementation, - * but custom extensions may use it for some purpose + * The builder instance that was used to create this entry. Not used by default implementation, but custom extensions may use it for some purpose * @param creator - * Constructor for the new entry object + * Constructor for the new entry object * @param entryFactory - * Optional custom factory to create special {@link RegistryEntry} types + * Optional custom factory to create special {@link RegistryEntry} types * @return A {@link RegistryEntry} that will hold the created entry after registration is complete */ protected RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier creator, NonNullFunction, ? extends RegistryEntry> entryFactory) { Registration reg = new Registration<>(Identifier.fromNamespaceAndPath(modid, name), type, creator, entryFactory); - log.trace(DebugMarkers.REGISTER, "Captured registration for entry {}:{} of type {}", getModid(), name, type.location()); + log.trace(DebugMarkers.REGISTER, "Captured registration for entry {}:{} of type {}", getModid(), name, type.identifier()); registerCallbacks.removeAll(Pair.of(name, type)).forEach(callback -> { @SuppressWarnings({ "unchecked", "null" }) - @Nonnull NonNullConsumer unsafeCallback = (NonNullConsumer) callback; reg.addRegisterCallback(unsafeCallback); }); @@ -938,22 +863,19 @@ protected RegistryEntry accept(String name, ResourceKey * Alternatively, a custom {@link Builder builder} can be created. *

        - * This method will automatically subscribe to the {@link NewRegistryEvent} and create the registry at the proper - * time. Thus, the new registry will not exist immediately after this is called. - * + * This method will automatically subscribe to the {@link NewRegistryEvent} and create the registry at the proper time. Thus, the new registry will not exist immediately after this is called. + * * @param - * The type of object the new registry will contain + * The type of object the new registry will contain * @param name - * The ID of this registry + * The ID of this registry * @param builder - * A function to create the {@link RegistryBuilder} that defines the other properties/behaviors of - * the created registry + * A function to create the {@link RegistryBuilder} that defines the other properties/behaviors of the created registry * @return A {@link ResourceKey resource key} referencing the to-be-created registry. */ public ResourceKey> makeRegistry(String name, Function>, RegistryBuilder> builder) { @@ -967,10 +889,9 @@ public ResourceKey> makeRegistry(String name, Function - * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the - * namespace of the registry key. + * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the namespace of the registry key. * - * @param name The ID of this registry + * @param name The ID of this registry * @param codec The codec to be used for loading data from datapacks on servers * @see #makeDatapackRegistry(String, Codec, Codec) */ @@ -982,20 +903,17 @@ public ResourceKey> makeDatapackRegistry(String name, Codec c * Registers the registry key as a datapack registry, which will cause data to be loaded from * a datapack folder based on the registry's name. *

        - * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the - * namespace of the registry key. + * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the namespace of the registry key. * - * @param name The ID of this registry - * @param codec The codec to be used for loading data from datapacks on servers + * @param name The ID of this registry + * @param codec The codec to be used for loading data from datapacks on servers * @param networkCodec The codec to be used for syncing loaded data to clients. - * If {@code networkCodec} is null, data will not be synced, and clients are not required to - * have this - * datapack registry to join a server. - *

        - * If {@code networkCodec} is not null, clients must have this datapack registry/mod - * when joining a server that has this datapack registry/mod. - * The data will be synced using the network codec and accessible via - * {@link ClientPacketListener#registryAccess()}. + * If {@code networkCodec} is null, data will not be synced, and clients are not required to have this + * datapack registry to join a server. + *

        + * If {@code networkCodec} is not null, clients must have this datapack registry/mod + * when joining a server that has this datapack registry/mod. + * The data will be synced using the network codec and accessible via {@link ClientPacketListener#registryAccess()}. * @see #makeDatapackRegistry(String, Codec) */ public ResourceKey> makeDatapackRegistry(String name, Codec codec, @Nullable Codec networkCodec) { @@ -1145,12 +1063,12 @@ public FluidBuilder fluid(Identifier stillTex } public FluidBuilder fluid(Identifier stillTexture, Identifier flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), stillTexture, flowingTexture, typeFactory, fluidFactory); } public FluidBuilder fluid(Identifier stillTexture, Identifier flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), stillTexture, flowingTexture, fluidType, fluidFactory); } @@ -1184,12 +1102,12 @@ public FluidBuilder fluid(String name, Identi } public FluidBuilder fluid(String name, Identifier stillTexture, Identifier flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), name, stillTexture, flowingTexture, typeFactory, fluidFactory); } public FluidBuilder fluid(String name, Identifier stillTexture, Identifier flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), name, stillTexture, flowingTexture, fluidType, fluidFactory); } @@ -1223,52 +1141,60 @@ public FluidBuilder fluid(P parent, Identi } public FluidBuilder fluid(P parent, Identifier stillTexture, Identifier flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { return fluid(parent, currentName(), stillTexture, flowingTexture, typeFactory, fluidFactory); } public FluidBuilder fluid(P parent, Identifier stillTexture, Identifier flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { return fluid(parent, currentName(), stillTexture, flowingTexture, fluidType, fluidFactory); } public

        FluidBuilder fluid(P parent, String name) { - return fluid(parent, name, Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_still"), Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_flow")); + return fluid(parent, name, defaultStillTexture(), defaultFlowingTexture()); } public

        FluidBuilder fluid(P parent, String name, FluidBuilder.FluidTypeFactory typeFactory) { - return fluid(parent, name, Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_still"), Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_flow"), typeFactory); + return fluid(parent, name, defaultStillTexture(), defaultFlowingTexture(), typeFactory); } public

        FluidBuilder fluid(P parent, String name, NonNullSupplier fluidType) { - return fluid(parent, name, Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_still"), Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_flow"), fluidType); + return fluid(parent, name, defaultStillTexture(), defaultFlowingTexture(), fluidType); + } + + private Identifier defaultStillTexture() { + return Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_still"); + } + + private Identifier defaultFlowingTexture() { + return Identifier.fromNamespaceAndPath(getModid(), "block/" + currentName() + "_flow"); } public

        FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture) { - return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, FluidType::new)).clientExtension(stillTexture, flowingTexture); + return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, FluidType::new)).model(stillTexture, flowingTexture); } public

        FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, FluidBuilder.FluidTypeFactory typeFactory) { - return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, typeFactory)).clientExtension(stillTexture, flowingTexture); + return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, typeFactory)).model(stillTexture, flowingTexture); } public

        FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, NonNullSupplier fluidType) { - return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, fluidType)).clientExtension(stillTexture, flowingTexture); + return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, fluidType)).model(stillTexture, flowingTexture); } public FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, FluidBuilder.FluidFactory fluidFactory) { - return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, fluidFactory)).clientExtension(stillTexture, flowingTexture); + return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, fluidFactory)).model(stillTexture, flowingTexture); } public FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { - return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, typeFactory, fluidFactory)).clientExtension(stillTexture, flowingTexture); + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, typeFactory, fluidFactory)).model(stillTexture, flowingTexture); } public FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { - return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, fluidType, fluidFactory)).clientExtension(stillTexture, flowingTexture); + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, fluidType, fluidFactory)).model(stillTexture, flowingTexture); } // Menu @@ -1340,7 +1266,7 @@ public

        NoConfigBuilder defaultCreativeT return this.generic(parent, name, Registries.CREATIVE_MODE_TAB, () -> { var builder = CreativeModeTab.builder() .icon(() -> getAll(Registries.ITEM).stream().findFirst().map(ItemEntry::cast).map(ItemEntry::asStack).orElse(new ItemStack(Items.AIR))) - .title(this.addLang("itemGroup", this.defaultCreativeModeTab.location(), RegistrateLangProvider.toEnglishName(name))); + .title(this.addLang("itemGroup", this.defaultCreativeModeTab.identifier(), RegistrateLangProvider.toEnglishName(name))); config.accept(builder); return builder.build(); }); diff --git a/src/main/java/com/modularmc/registrate/Registrate.java b/src/main/java/com/modularmc/registrate/Registrate.java index 5cf0a30..f87bf8b 100644 --- a/src/main/java/com/modularmc/registrate/Registrate.java +++ b/src/main/java/com/modularmc/registrate/Registrate.java @@ -1,23 +1,20 @@ package com.modularmc.registrate; +import lombok.extern.log4j.Log4j2; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; -import lombok.extern.log4j.Log4j2; - import java.util.Optional; @Log4j2 public class Registrate extends AbstractRegistrate { - /** - * Create a new {@link Registrate} and register event listeners for registration and data generation. Used in lieu - * of adding side-effects to constructor, so that alternate initialization + * Create a new {@link Registrate} and register event listeners for registration and data generation. Used in lieu of adding side-effects to constructor, so that alternate initialization * strategies can be done in subclasses. - * + * * @param modid - * The mod ID for which objects will be registered + * The mod ID for which objects will be registered * @return The {@link Registrate} instance */ public static Registrate create(String modid) { @@ -25,12 +22,13 @@ public static Registrate create(String modid) { Optional modEventBus = ModList.get().getModContainerById(modid) .map(ModContainer::getEventBus); - + modEventBus.ifPresentOrElse(ret::registerEventListeners, () -> { String message = "# [Registrate] Failed to register eventListeners for mod " + modid + ", This should be reported to this mod's dev #"; - StringBuilder hashtags = new StringBuilder().repeat("#", message.length()); - + + StringBuilder hashtags = new StringBuilder().append("#".repeat(message.length())); + log.fatal(hashtags.toString()); log.fatal(message); log.fatal(hashtags.toString()); diff --git a/src/main/java/com/modularmc/registrate/RegistrateLib.java b/src/main/java/com/modularmc/registrate/RegistrateLib.java new file mode 100644 index 0000000..e1bbb50 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/RegistrateLib.java @@ -0,0 +1,24 @@ +package com.modularmc.registrate; + +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Random; + +@Mod(RegistrateLib.MOD_ID) +public class RegistrateLib { + + public static final String MOD_ID = "registrate"; + public static final String MOD_NAME = "RegistrateLib"; + + public static final Logger LOGGER = LogManager.getLogger(MOD_ID); + + public static final Random RANDOM = new Random(); + + public RegistrateLib(IEventBus bus) { + + } +} diff --git a/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java b/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java index ffc6003..c4d9683 100644 --- a/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java @@ -1,5 +1,7 @@ package com.modularmc.registrate.builders; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.providers.RegistrateLangProvider; @@ -9,22 +11,18 @@ import com.modularmc.registrate.util.nullness.NonNullBiFunction; import com.modularmc.registrate.util.nullness.NonNullFunction; import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.modularmc.registrate.util.nullness.NonnullType; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; import net.minecraft.core.Registry; import net.minecraft.data.tags.TagsProvider; -import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.Identifier; import net.minecraft.tags.TagEntry; import net.minecraft.tags.TagKey; import net.neoforged.neoforge.registries.DeferredHolder; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - import java.util.Arrays; /** @@ -33,8 +31,7 @@ * Provides the most basic functionality, and some utility methods that remove the need to pass the registry class. * * @param - * Type of the registry for the current object. This is the concrete base class that all registry entries - * must extend, and the type used for the forge registry itself. + * Type of the registry for the current object. This is the concrete base class that all registry entries must extend, and the type used for the forge registry itself. * @param * Actual type of the object being built. * @param

        @@ -46,15 +43,15 @@ @RequiredArgsConstructor public abstract class AbstractBuilder> implements Builder { - @Getter(onMethod_ = { @Override }) + @Getter(onMethod_ = {@Override}) private final AbstractRegistrate owner; - @Getter(onMethod_ = { @Override }) + @Getter(onMethod_ = {@Override}) private final P parent; - @Getter(onMethod_ = { @Override }) + @Getter(onMethod_ = {@Override}) private final String name; @Getter(AccessLevel.PROTECTED) private final BuilderCallback callback; - @Getter(onMethod_ = { @Override }) + @Getter(onMethod_ = {@Override}) private final ResourceKey> registryKey; private final Multimap>, TagKey> tagsByType = HashMultimap.create(); @@ -66,13 +63,12 @@ public abstract class AbstractBuilder register() { @@ -92,9 +88,9 @@ public NonNullSupplier asSupplier() { * Tag this entry with a tag (or tags) of the correct type. Multiple calls will add additional tags. * * @param type - * The provider type (which must be a tag provider) + * The provider type (which must be a tag provider) * @param tags - * The tags to add + * The tags to add * @return this {@link Builder} */ @SuppressWarnings("unchecked") @@ -112,9 +108,9 @@ public final & RegistrateTagsProvider> S tag(Prov /** * Mark this entry as optional when generating tags - */ + * */ @SuppressWarnings("unchecked") - public S asOptional() { + public S asOptional(){ isOptional = true; return (S) this; } @@ -126,13 +122,12 @@ protected TagEntry asTag() { } /** - * Remove a tag (or tags) from this entry of a given type. Useful to remove default tags on fluids, for example. - * Multiple calls will remove additional tags. + * Remove a tag (or tags) from this entry of a given type. Useful to remove default tags on fluids, for example. Multiple calls will remove additional tags. * * @param type - * The provider type (which must be a tag provider) + * The provider type (which must be a tag provider) * @param tags - * The tags to remove + * The tags to remove * @return this {@link Builder} */ @SuppressWarnings("unchecked") @@ -147,13 +142,11 @@ public final & RegistrateTagsProvider> S removeTa } /** - * Set the lang key for this entry to the default value (specified by - * {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, ResourceKey)}). Generally, specific helpers from - * concrete + * Set the lang key for this entry to the default value (specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, ResourceKey)}). Generally, specific helpers from concrete * builders should be used instead. * * @param langKeyProvider - * A function to get the translation key from the entry + * A function to get the translation key from the entry * @return this {@link Builder} */ public S lang(NonNullFunction langKeyProvider) { @@ -161,13 +154,12 @@ public S lang(NonNullFunction langKeyProvider) { } /** - * Set the lang key for this entry to the specified name. Generally, specific helpers from concrete builders should - * be used instead. + * Set the lang key for this entry to the specified name. Generally, specific helpers from concrete builders should be used instead. * * @param langKeyProvider - * A function to get the translation key from the entry + * A function to get the translation key from the entry * @param name - * The name to use + * The name to use * @return this {@link Builder} */ public S lang(NonNullFunction langKeyProvider, String name) { @@ -178,7 +170,8 @@ private S lang(NonNullFunction langKeyProvider, NonNullBiFunction prov.add(langKeyProvider.apply(ctx.getEntry()), localizedNameProvider.apply(prov, ctx::getEntry))); } - public ResourceKey getResourceKey() { + public ResourceKey getResourceKey(){ return ResourceKey.create(getRegistryKey(), Identifier.fromNamespaceAndPath(getOwner().getModid(), getName())); } + } diff --git a/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java b/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java index ecc45c6..fb6a5af 100644 --- a/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java @@ -1,473 +1,450 @@ -// package com.tterrag.registrate.builders; -// -// import java.util.Arrays; -// import java.util.EnumSet; -// -// import javax.annotation.Nonnull; -// -// import com.google.common.collect.HashMultimap; -// import com.google.common.collect.Multimap; -// import com.tterrag.registrate.AbstractRegistrate; -// import com.tterrag.registrate.providers.RegistrateLangProvider; -// import com.tterrag.registrate.util.nullness.NonNullConsumer; -// import com.tterrag.registrate.util.nullness.NonNullFunction; -// import com.tterrag.registrate.util.nullness.NonNullSupplier; -// import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; -// import com.tterrag.registrate.util.nullness.NonnullType; -// -// import net.minecraft.entity.EntityClassification; -// import net.minecraft.entity.EntityType; -// import net.minecraft.world.biome.Biome; -// import net.minecraft.world.biome.Biome.SpawnListEntry; -// import net.minecraft.world.gen.GenerationStage.Carving; -// import net.minecraft.world.gen.GenerationStage.Decoration; -// import net.minecraft.world.gen.carver.ConfiguredCarver; -// import net.minecraft.world.gen.carver.EmptyCarverConfig; -// import net.minecraft.world.gen.carver.ICarverConfig; -// import net.minecraft.world.gen.carver.WorldCarver; -// import net.minecraft.world.gen.feature.ConfiguredFeature; -// import net.minecraft.world.gen.feature.Feature; -// import net.minecraft.world.gen.feature.IFeatureConfig; -// import net.minecraft.world.gen.feature.NoFeatureConfig; -// import net.minecraft.world.gen.placement.IPlacementConfig; -// import net.minecraft.world.gen.placement.NoPlacementConfig; -// import net.minecraft.world.gen.placement.Placement; -// import net.minecraftforge.common.BiomeDictionary; -// import net.minecraftforge.common.BiomeManager; -// -/// ** -// * A builder for biomes, allows for customization of the {@link Biome.Builder biome properties}, and configuration of -// data associated with biomes (lang). -// * -// * @param -// * The type of biome being built -// * @param

        -// * Parent object type -// */ -// public class BiomeBuilder extends AbstractBuilder> { -// -// /** -// * Create a new {@link BiomeBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that -// alternate initialization strategies can be done in subclasses. -// *

        -// * The biome will be assigned the following data: -// *

          -// *
        • The default translation (via {@link #defaultLang()})
        • -// *
        -// * +//package com.modularmc.registrate.builders; +// +//import java.util.Arrays; +//import java.util.EnumSet; +// +//import javax.annotation.Nonnull; +// +//import com.google.common.collect.HashMultimap; +//import com.google.common.collect.Multimap; +//import com.modularmc.registrate.AbstractRegistrate; +//import com.modularmc.registrate.providers.RegistrateLangProvider; +//import com.modularmc.registrate.util.nullness.NonNullConsumer; +//import com.modularmc.registrate.util.nullness.NonNullFunction; +//import com.modularmc.registrate.util.nullness.NonNullSupplier; +//import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; +//import com.modularmc.registrate.util.nullness.NonnullType; +// +//import net.minecraft.entity.EntityClassification; +//import net.minecraft.entity.EntityType; +//import net.minecraft.world.biome.Biome; +//import net.minecraft.world.biome.Biome.SpawnListEntry; +//import net.minecraft.world.gen.GenerationStage.Carving; +//import net.minecraft.world.gen.GenerationStage.Decoration; +//import net.minecraft.world.gen.carver.ConfiguredCarver; +//import net.minecraft.world.gen.carver.EmptyCarverConfig; +//import net.minecraft.world.gen.carver.ICarverConfig; +//import net.minecraft.world.gen.carver.WorldCarver; +//import net.minecraft.world.gen.feature.ConfiguredFeature; +//import net.minecraft.world.gen.feature.Feature; +//import net.minecraft.world.gen.feature.IFeatureConfig; +//import net.minecraft.world.gen.feature.NoFeatureConfig; +//import net.minecraft.world.gen.placement.IPlacementConfig; +//import net.minecraft.world.gen.placement.NoPlacementConfig; +//import net.minecraft.world.gen.placement.Placement; +//import net.minecraftforge.common.BiomeDictionary; +//import net.minecraftforge.common.BiomeManager; +// +///** +// * A builder for biomes, allows for customization of the {@link Biome.Builder biome properties}, and configuration of data associated with biomes (lang). +// * // * @param -// * The type of the builder +// * The type of biome being built // * @param

        -// * Parent object type -// * @param owner -// * The owning {@link AbstractRegistrate} object -// * @param parent -// * The parent object -// * @param name -// * Name of the entry being built -// * @param callback -// * A callback used to actually register the built entry -// * @param factory -// * Factory to create the biome -// * @return A new {@link BiomeBuilder} with reasonable default data generators. -// */ -// public static BiomeBuilder create(AbstractRegistrate owner, P parent, String name, -// BuilderCallback callback, NonNullFunction factory) { -// return new BiomeBuilder<>(owner, parent, name, callback, factory) -// .defaultLang(); -// } -// -// private final NonNullFunction factory; -// -// private NonNullSupplier initialProperties = Biome.Builder::new; -// private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); -// -// private final Multimap>> features = HashMultimap.create(); -// private final Multimap>> carvers = HashMultimap.create(); -// private final Multimap> spawns = HashMultimap.create(); -// -// @SuppressWarnings("null") -// private final EnumSet configuredTypes = EnumSet.noneOf(BiomeManager.BiomeType.class); -// -// protected BiomeBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, -// NonNullFunction factory) { -// super(owner, parent, name, callback, Biome.class); -// this.factory = factory; -// } -// -// /** -// * Modify the properties of the biome. Modifications are done lazily, but the passed function is composed with the -// current one, and as such this method can be called multiple times to perform -// * different operations. -// *

        -// * If a different properties instance is returned, it will replace the existing one entirely. -// * -// * @param func -// * The action to perform on the properties -// * @return this {@link BiomeBuilder} +// * Parent object type // */ -// public BiomeBuilder properties(NonNullUnaryOperator func) { -// propertiesCallback = propertiesCallback.andThen(func); -// return this; -// } -// -// /** -// * Replace the initial state of the biome properties, without replacing or removing any modifications done via {@link -// #properties(NonNullUnaryOperator)}. -// * -// * @param properties -// * A supplier to to create the initial properties -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder initialProperties(NonNullSupplier properties) { -// initialProperties = properties; -// return this; -// } -// -// /** -// * Set the weight for this biome to generate in the overworld in regions matching the given type. This can only be -// called once per type. -// * -// * @param type -// * The type that controls which climates the biome will spawn in -// * @param weight -// * The weight, or how common this biome should be in that climate -// * @return this {@link BiomeBuilder} -// * @see BiomeManager -// * @throws IllegalArgumentException -// * if this type has already had its weight set -// */ -// public BiomeBuilder typeWeight(BiomeManager.BiomeType type, int weight) { -// if (!configuredTypes.add(type)) { -// throw new IllegalArgumentException("Cannot set a type weight more than once."); -// } -// this.onRegister(b -> BiomeManager.addBiome(type, new BiomeManager.BiomeEntry(b, weight))); -// return this; -// } -// -// /** -// * Add types to the {@link BiomeDictionary} for this biome. Can be called multiple times to add more types. -// * -// * @param types -// * The types to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addDictionaryTypes(BiomeDictionary.Type... types) { -// this.onRegister(b -> BiomeDictionary.addTypes(b, types)); -// return this; -// } -// -// /** -// * Manually add what would have been the "best guess" types from the {@link BiomeDictionary} for this biome. This has -// no effect if no types are added via -// * {@link #addDictionaryTypes(net.minecraftforge.common.BiomeDictionary.Type...)}. -// * -// * @return this {@link BiomeBuilder} -// * @see BiomeDictionary#makeBestGuess(Biome) -// */ -// public BiomeBuilder forceAutomaticDictionaryTypes() { -// this.onRegister(BiomeDictionary::makeBestGuess); -// return this; -// } -// -// /** -// * Copy all {@link Feature features} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy features from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copyFeatures(NonNullSupplier biome) { -// addFeatures(b -> Arrays.stream(Decoration.values()) -// .forEach(d -> biome.get().getFeatures(d).stream() -// .forEach(f -> b.addFeature(d, f)))); -// return this; -// } -// -// /** -// * Add a feature to this biome, where neither the feature nor the placement have a config. -// * -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param placement -// * How the feature will be placed -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, -// NonNullSupplier> placement) { -// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement); -// } -// -// /** -// * Add a feature to this biome, where the placement does not have a config. -// * -// * @param -// * The type of config the feature requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param featureConfig -// * The config for the feature -// * @param placement -// * How the feature will be placed -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> -// feature, FC featureConfig, NonNullSupplier> placement) { -// return addFeature(stage, feature, featureConfig, placement, IPlacementConfig.NO_PLACEMENT_CONFIG); -// } -// -// /** -// * Add a feature to this biome, where the feature does not have a config. -// * @param -// * The type of config the placement requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param placement -// * How the feature will be placed -// * @param placementConfig -// * The config for the placement -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, -// NonNullSupplier> feature, NonNullSupplier> placement, PC placementConfig) { -// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement, placementConfig); -// } -// -// /** -// * Add a feature to this biome. -// * -// * @param -// * The type of config the feature requires -// * @param -// * The type of config the placement requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param featureConfig -// * The config for the feature -// * @param placement -// * How the feature will be placed -// * @param placementConfig -// * The config for the placement -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, -// NonNullSupplier> feature, FC featureConfig, NonNullSupplier> placement, PC placementConfig) -// { -// return addConfiguredFeature(stage, () -> -// feature.get().withConfiguration(featureConfig).withPlacement(placement.get().configure(placementConfig))); -// } -// -// /** -// * Add a pre-configured feature to this biome. -// * -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addConfiguredFeature(Decoration stage, NonNullSupplier> feature) { -// if (this.features.isEmpty()) { -// addFeatures(b -> this.features.forEach((d, f) -> b.addFeature(d, f.get()))); -// } -// this.features.put(stage, feature); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link Feature Features} are registered, for the purpose of adding -// them to this biome. -// *

        -// * Any {@link Feature} object can be safely referenced here and added to the biome via {@link -// Biome#addFeature(Decoration, ConfiguredFeature)} -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add features to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeatures(NonNullConsumer action) { -// this.>onRegisterAfter(Feature.class, action); -// return this; -// } -// -// /** -// * Copy all {@link WorldCarver carvers} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy carvers from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copyCarvers(NonNullSupplier biome) { -// addCarvers(b -> Arrays.stream(Carving.values()) -// .forEach(s -> biome.get().getCarvers(s).stream() -// .forEach(c -> b.addCarver(s, c)))); -// return this; -// } -// -// /** -// * Add a carver to this biome, where the carver does not have a config. -// * -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver) { -// return addCarver(type, carver, ICarverConfig.field_214644_a); -// } -// -// /** -// * Add a carver to this biome. -// * -// * @param The type of config the carver requires -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @param carverConfig -// * The config for the carver -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver, -// CC carverConfig) { -// return addConfiguredCarver(type, () -> Biome.createCarver(carver.get(), carverConfig)); -// } -// -// /** -// * Add a pre-configured carver to this biome. -// * -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addConfiguredCarver(Carving type, NonNullSupplier> carver) { -// if (this.features.isEmpty()) { -// addCarvers(b -> this.carvers.forEach((s, f) -> b.addCarver(s, f.get()))); -// } -// this.carvers.put(type, carver); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link WorldCarver WorldCarvers} are registered, for the purpose of -// adding them to this biome. -// *

        -// * Any {@link WorldCarver} object can be safely referenced here and added to the biome via {@link -// Biome#addCarver(Carving, ConfiguredCarver)} -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add carvers to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarvers(NonNullConsumer action) { -// this.> onRegisterAfter(WorldCarver.class, action); -// return this; -// } -// -// /** -// * Copy all {@link SpawnListEntry spawns} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy spawns from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copySpawns(NonNullSupplier biome) { -// addSpawns(b -> Arrays.stream(EntityClassification.values()) -// .forEach(ec -> biome.get().getSpawns(ec).stream() -// .forEach(s -> b.getSpawns(ec).add(s)))); -// return this; -// } -// -// /** -// * Add an entity spawn to this biome. -// * -// * @param type -// * The classification of the spawn, which controls how and when the entity is spawned -// * @param entity -// * The entity to spawn -// * @param weight -// * The weight of the spawn, i.e. how likely it is compared to other spawn entries to be selected -// * @param minGroupSize -// * A minimum size of entities to spawn at once -// * @param maxGroupSize -// * A maximum size of entities to spawn at once -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier> entity, int -// weight, int minGroupSize, int maxGroupSize) { -// return addSpawn(type, () -> new SpawnListEntry(entity.get(), weight, minGroupSize, maxGroupSize)); -// } -// -// /** -// * Add an entity spawn to this biome. -// * -// * @param type -// * The classification of the spawn, which controls how and when the entity is spawned -// * @param spawn -// * The spawn entry to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier spawn) { -// if (this.spawns.isEmpty()) { -// this.addSpawns(b -> this.spawns.forEach((c, s) -> b.getSpawns(c).add(s.get()))); -// } -// this.spawns.put(type, spawn); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link EntityType Entities} are registered, for the purpose of adding -// entity spawns to this biome. -// *

        -// * Any {@link EntityType} object can be safely referenced here and added to the biome via {@link -// Biome#getSpawns(EntityClassification)}. -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add spawns to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawns(NonNullConsumer action) { -// this.> onRegisterAfter(EntityType.class, action); -// return this; -// } -// -// /** -// * Assign the default translation, as specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier)}. -// This is the default, so it is generally not necessary to call, unless for -// * undoing previous changes. -// * -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder defaultLang() { -// return lang(Biome::getTranslationKey); -// } -// -// /** -// * Set the translation for this biome. -// * -// * @param name -// * A localized English name -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder lang(String name) { -// return lang(Biome::getTranslationKey, name); -// } -// -// @Override -// protected @NonnullType T createEntry() { -// @Nonnull Biome.Builder properties = this.initialProperties.get(); -// properties = propertiesCallback.apply(properties); -// return factory.apply(properties); -// } -// } +//public class BiomeBuilder extends AbstractBuilder> { +// +// /** +// * Create a new {@link BiomeBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. +// *

        +// * The biome will be assigned the following data: +// *

          +// *
        • The default translation (via {@link #defaultLang()})
        • +// *
        +// * +// * @param +// * The type of the builder +// * @param

        +// * Parent object type +// * @param owner +// * The owning {@link AbstractRegistrate} object +// * @param parent +// * The parent object +// * @param name +// * Name of the entry being built +// * @param callback +// * A callback used to actually register the built entry +// * @param factory +// * Factory to create the biome +// * @return A new {@link BiomeBuilder} with reasonable default data generators. +// */ +// public static BiomeBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { +// return new BiomeBuilder<>(owner, parent, name, callback, factory) +// .defaultLang(); +// } +// +// private final NonNullFunction factory; +// +// private NonNullSupplier initialProperties = Biome.Builder::new; +// private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); +// +// private final Multimap>> features = HashMultimap.create(); +// private final Multimap>> carvers = HashMultimap.create(); +// private final Multimap> spawns = HashMultimap.create(); +// +// @SuppressWarnings("null") +// private final EnumSet configuredTypes = EnumSet.noneOf(BiomeManager.BiomeType.class); +// +// protected BiomeBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { +// super(owner, parent, name, callback, Biome.class); +// this.factory = factory; +// } +// +// /** +// * Modify the properties of the biome. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform +// * different operations. +// *

        +// * If a different properties instance is returned, it will replace the existing one entirely. +// * +// * @param func +// * The action to perform on the properties +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder properties(NonNullUnaryOperator func) { +// propertiesCallback = propertiesCallback.andThen(func); +// return this; +// } +// +// /** +// * Replace the initial state of the biome properties, without replacing or removing any modifications done via {@link #properties(NonNullUnaryOperator)}. +// * +// * @param properties +// * A supplier to to create the initial properties +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder initialProperties(NonNullSupplier properties) { +// initialProperties = properties; +// return this; +// } +// +// /** +// * Set the weight for this biome to generate in the overworld in regions matching the given type. This can only be called once per type. +// * +// * @param type +// * The type that controls which climates the biome will spawn in +// * @param weight +// * The weight, or how common this biome should be in that climate +// * @return this {@link BiomeBuilder} +// * @see BiomeManager +// * @throws IllegalArgumentException +// * if this type has already had its weight set +// */ +// public BiomeBuilder typeWeight(BiomeManager.BiomeType type, int weight) { +// if (!configuredTypes.add(type)) { +// throw new IllegalArgumentException("Cannot set a type weight more than once."); +// } +// this.onRegister(b -> BiomeManager.addBiome(type, new BiomeManager.BiomeEntry(b, weight))); +// return this; +// } +// +// /** +// * Add types to the {@link BiomeDictionary} for this biome. Can be called multiple times to add more types. +// * +// * @param types +// * The types to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addDictionaryTypes(BiomeDictionary.Type... types) { +// this.onRegister(b -> BiomeDictionary.addTypes(b, types)); +// return this; +// } +// +// /** +// * Manually add what would have been the "best guess" types from the {@link BiomeDictionary} for this biome. This has no effect if no types are added via +// * {@link #addDictionaryTypes(net.minecraftforge.common.BiomeDictionary.Type...)}. +// * +// * @return this {@link BiomeBuilder} +// * @see BiomeDictionary#makeBestGuess(Biome) +// */ +// public BiomeBuilder forceAutomaticDictionaryTypes() { +// this.onRegister(BiomeDictionary::makeBestGuess); +// return this; +// } +// +// /** +// * Copy all {@link Feature features} from another biome. Does not check for duplicates. +// * +// * @param biome +// * The biome to copy features from +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder copyFeatures(NonNullSupplier biome) { +// addFeatures(b -> Arrays.stream(Decoration.values()) +// .forEach(d -> biome.get().getFeatures(d).stream() +// .forEach(f -> b.addFeature(d, f)))); +// return this; +// } +// +// /** +// * Add a feature to this biome, where neither the feature nor the placement have a config. +// * +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param placement +// * How the feature will be placed +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, NonNullSupplier> placement) { +// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement); +// } +// +// /** +// * Add a feature to this biome, where the placement does not have a config. +// * +// * @param +// * The type of config the feature requires +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param featureConfig +// * The config for the feature +// * @param placement +// * How the feature will be placed +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, FC featureConfig, NonNullSupplier> placement) { +// return addFeature(stage, feature, featureConfig, placement, IPlacementConfig.NO_PLACEMENT_CONFIG); +// } +// +// /** +// * Add a feature to this biome, where the feature does not have a config. +// * @param +// * The type of config the placement requires +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param placement +// * How the feature will be placed +// * @param placementConfig +// * The config for the placement +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, NonNullSupplier> placement, PC placementConfig) { +// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement, placementConfig); +// } +// +// /** +// * Add a feature to this biome. +// * +// * @param +// * The type of config the feature requires +// * @param +// * The type of config the placement requires +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param featureConfig +// * The config for the feature +// * @param placement +// * How the feature will be placed +// * @param placementConfig +// * The config for the placement +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, FC featureConfig, NonNullSupplier> placement, PC placementConfig) { +// return addConfiguredFeature(stage, () -> feature.get().withConfiguration(featureConfig).withPlacement(placement.get().configure(placementConfig))); +// } +// +// /** +// * Add a pre-configured feature to this biome. +// * +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addConfiguredFeature(Decoration stage, NonNullSupplier> feature) { +// if (this.features.isEmpty()) { +// addFeatures(b -> this.features.forEach((d, f) -> b.addFeature(d, f.get()))); +// } +// this.features.put(stage, feature); +// return this; +// } +// +// /** +// * Add a callback that will be invoked after all {@link Feature Features} are registered, for the purpose of adding them to this biome. +// *

        +// * Any {@link Feature} object can be safely referenced here and added to the biome via {@link Biome#addFeature(Decoration, ConfiguredFeature)} +// * +// * @param action +// * A {@link NonNullConsumer} which will be called to add features to this biome. +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeatures(NonNullConsumer action) { +// this.>onRegisterAfter(Feature.class, action); +// return this; +// } +// +// /** +// * Copy all {@link WorldCarver carvers} from another biome. Does not check for duplicates. +// * +// * @param biome +// * The biome to copy carvers from +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder copyCarvers(NonNullSupplier biome) { +// addCarvers(b -> Arrays.stream(Carving.values()) +// .forEach(s -> biome.get().getCarvers(s).stream() +// .forEach(c -> b.addCarver(s, c)))); +// return this; +// } +// +// /** +// * Add a carver to this biome, where the carver does not have a config. +// * +// * @param type +// * The type of carving to be done +// * @param carver +// * The carver to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver) { +// return addCarver(type, carver, ICarverConfig.field_214644_a); +// } +// +// /** +// * Add a carver to this biome. +// * +// * @param The type of config the carver requires +// * @param type +// * The type of carving to be done +// * @param carver +// * The carver to add +// * @param carverConfig +// * The config for the carver +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver, CC carverConfig) { +// return addConfiguredCarver(type, () -> Biome.createCarver(carver.get(), carverConfig)); +// } +// +// /** +// * Add a pre-configured carver to this biome. +// * +// * @param type +// * The type of carving to be done +// * @param carver +// * The carver to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addConfiguredCarver(Carving type, NonNullSupplier> carver) { +// if (this.features.isEmpty()) { +// addCarvers(b -> this.carvers.forEach((s, f) -> b.addCarver(s, f.get()))); +// } +// this.carvers.put(type, carver); +// return this; +// } +// +// /** +// * Add a callback that will be invoked after all {@link WorldCarver WorldCarvers} are registered, for the purpose of adding them to this biome. +// *

        +// * Any {@link WorldCarver} object can be safely referenced here and added to the biome via {@link Biome#addCarver(Carving, ConfiguredCarver)} +// * +// * @param action +// * A {@link NonNullConsumer} which will be called to add carvers to this biome. +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addCarvers(NonNullConsumer action) { +// this.> onRegisterAfter(WorldCarver.class, action); +// return this; +// } +// +// /** +// * Copy all {@link SpawnListEntry spawns} from another biome. Does not check for duplicates. +// * +// * @param biome +// * The biome to copy spawns from +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder copySpawns(NonNullSupplier biome) { +// addSpawns(b -> Arrays.stream(EntityClassification.values()) +// .forEach(ec -> biome.get().getSpawns(ec).stream() +// .forEach(s -> b.getSpawns(ec).add(s)))); +// return this; +// } +// +// /** +// * Add an entity spawn to this biome. +// * +// * @param type +// * The classification of the spawn, which controls how and when the entity is spawned +// * @param entity +// * The entity to spawn +// * @param weight +// * The weight of the spawn, i.e. how likely it is compared to other spawn entries to be selected +// * @param minGroupSize +// * A minimum size of entities to spawn at once +// * @param maxGroupSize +// * A maximum size of entities to spawn at once +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier> entity, int weight, int minGroupSize, int maxGroupSize) { +// return addSpawn(type, () -> new SpawnListEntry(entity.get(), weight, minGroupSize, maxGroupSize)); +// } +// +// /** +// * Add an entity spawn to this biome. +// * +// * @param type +// * The classification of the spawn, which controls how and when the entity is spawned +// * @param spawn +// * The spawn entry to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier spawn) { +// if (this.spawns.isEmpty()) { +// this.addSpawns(b -> this.spawns.forEach((c, s) -> b.getSpawns(c).add(s.get()))); +// } +// this.spawns.put(type, spawn); +// return this; +// } +// +// /** +// * Add a callback that will be invoked after all {@link EntityType Entities} are registered, for the purpose of adding entity spawns to this biome. +// *

        +// * Any {@link EntityType} object can be safely referenced here and added to the biome via {@link Biome#getSpawns(EntityClassification)}. +// * +// * @param action +// * A {@link NonNullConsumer} which will be called to add spawns to this biome. +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addSpawns(NonNullConsumer action) { +// this.> onRegisterAfter(EntityType.class, action); +// return this; +// } +// +// /** +// * Assign the default translation, as specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier)}. This is the default, so it is generally not necessary to call, unless for +// * undoing previous changes. +// * +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder defaultLang() { +// return lang(Biome::getTranslationKey); +// } +// +// /** +// * Set the translation for this biome. +// * +// * @param name +// * A localized English name +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder lang(String name) { +// return lang(Biome::getTranslationKey, name); +// } +// +// @Override +// protected @NonnullType T createEntry() { +// @Nonnull Biome.Builder properties = this.initialProperties.get(); +// properties = propertiesCallback.apply(properties); +// return factory.apply(properties); +// } +//} diff --git a/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java b/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java index c58972c..dc23fc6 100644 --- a/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java @@ -1,5 +1,12 @@ package com.modularmc.registrate.builders; +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; +import org.jspecify.annotations.Nullable; + import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.builders.BlockEntityBuilder.BlockEntityFactory; import com.modularmc.registrate.providers.DataGenContext; @@ -20,10 +27,9 @@ import com.modularmc.registrate.util.nullness.NonNullSupplier; import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; -import net.minecraft.client.color.block.BlockColor; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.block.model.SingleVariant; -import net.minecraft.client.renderer.block.model.Variant; +import net.minecraft.client.color.block.BlockTintSource; +import net.minecraft.client.renderer.block.dispatch.SingleVariant; +import net.minecraft.client.renderer.block.dispatch.Variant; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.registries.Registries; import net.minecraft.resources.Identifier; @@ -40,16 +46,9 @@ import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; import net.neoforged.neoforge.registries.DeferredHolder; -import java.util.function.Function; -import java.util.function.Supplier; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - /** - * A builder for blocks, allows for customization of the {@link Block.Properties}, creation of block items, and - * configuration of data associated with blocks (loot tables, recipes, etc.). - * + * A builder for blocks, allows for customization of the {@link Block.Properties}, creation of block items, and configuration of data associated with blocks (loot tables, recipes, etc.). + * * @param * The type of block being built * @param

        @@ -58,8 +57,7 @@ public class BlockBuilder extends AbstractBuilder> { /** - * Create a new {@link BlockBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that - * alternate initialization strategies can be done in subclasses. + * Create a new {@link BlockBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. *

        * The block will be assigned the following data: *

          @@ -68,21 +66,21 @@ public class BlockBuilder extends AbstractBuilderA self-dropping loot table (via {@link #defaultLoot()}) *
        • The default translation (via {@link #defaultLang()})
        • *
        - * + * * @param - * The type of the builder + * The type of the builder * @param

        - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the block + * Factory to create the block * @return A new {@link BlockBuilder} with reasonable default data generators. */ public static BlockBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { @@ -91,14 +89,11 @@ public static BlockBuilder create(AbstractRegistrate< } private final NonNullFunction factory; - + private NonNullSupplier initialProperties; private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); - @Nullable - private Supplier> renderLayer; - @Nullable - private NonNullSupplier> colorHandler; + private @Nullable NonNullSupplier>> tintSources; protected BlockBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory, NonNullSupplier initialProperties) { super(owner, parent, name, callback, Registries.BLOCK); @@ -107,14 +102,13 @@ protected BlockBuilder(AbstractRegistrate owner, P parent, String name, Build } /** - * Modify the properties of the block. Modifications are done lazily, but the passed function is composed with the - * current one, and as such this method can be called multiple times to perform + * Modify the properties of the block. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform * different operations. *

        * If a different properties instance is returned, it will replace the existing one entirely. - * + * * @param func - * The action to perform on the properties + * The action to perform on the properties * @return this {@link BlockBuilder} */ public BlockBuilder properties(NonNullUnaryOperator func) { @@ -123,12 +117,10 @@ public BlockBuilder properties(NonNullUnaryOperator initialProperties(NonNullSupplier block) { @@ -137,35 +129,7 @@ public BlockBuilder initialProperties(NonNullSupplier blo } /** - * @deprecated Set your render type in your model's JSON - * ({@link net.neoforged.neoforge.client.model.generators.template.ExtendedModelTemplateBuilder#renderType(Identifier)}) - */ - @Deprecated(forRemoval = true) - public BlockBuilder addLayer(Supplier> layer) { - if (this.renderLayer == null) { - onRegister(this::registerLayers); - this.renderLayer = layer; - } else { - throw new IllegalStateException("Only a single layer can be registered for a block"); - } - return this; - } - - @SuppressWarnings("deprecation") - protected void registerLayers(T entry) { - RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - OneTimeEventReceiver.addModListener(getOwner(), FMLClientSetupEvent.class, $ -> { - if (renderLayer != null) { - ChunkSectionLayer layer = renderLayer.get().get(); - ItemBlockRenderTypes.setRenderLayer(entry, layer); - } - }); - }); - } - - /** - * Create a standard {@link BlockItem} for this block, building it immediately, and not allowing for further - * configuration. + * Create a standard {@link BlockItem} for this block, building it immediately, and not allowing for further configuration. *

        * The item will have no lang entry (since it would duplicate the block's) * @@ -177,11 +141,10 @@ public BlockBuilder simpleItem() { } /** - * Create a standard {@link BlockItem} for this block, and return the builder for it so that further customization - * can be done. + * Create a standard {@link BlockItem} for this block, and return the builder for it so that further customization can be done. *

        * The item will have no lang entry (since it would duplicate the block's) - * + * * @return the {@link ItemBuilder} for the {@link BlockItem} */ public ItemBuilder> item() { @@ -189,22 +152,19 @@ public ItemBuilder> item() { } /** - * Create a {@link BlockItem} for this block, which is created by the given factory, and return the builder for it - * so that further customization can be done. + * Create a {@link BlockItem} for this block, which is created by the given factory, and return the builder for it so that further customization can be done. *

        - * By default, the item will have no lang entry (since it would duplicate the block's) and a simple block item - * model. - * + * By default, the item will have no lang entry (since it would duplicate the block's) and a simple block item model. + * * @param - * The type of the item + * The type of the item * @param factory - * A factory for the item, which accepts the block object and properties and returns a new item + * A factory for the item, which accepts the block object and properties and returns a new item * @return the {@link ItemBuilder} for the {@link BlockItem} */ public ItemBuilder> item(NonNullBiFunction factory) { - return getOwner().>item(this, getName(), p -> factory.apply(getEntry(), p.useBlockDescriptionPrefix())) - .setData(ProviderType.LANG, NonNullBiConsumer.noop()) // FIXME Need a beetter API for "unsetting" - // providers + return getOwner().> item(this, getName(), p -> factory.apply(getEntry(), p.useBlockDescriptionPrefix())) + .setData(ProviderType.LANG, NonNullBiConsumer.noop()) // FIXME Need a beetter API for "unsetting" providers .model(() -> (ctx, prov) -> { getOwner().getDataProvider(ProviderType.BLOCKSTATE) .map(g -> g.seenBlockstates.get(getEntry())) @@ -221,13 +181,12 @@ public ItemBuilder> item(NonNullBiFunctio } /** - * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as - * its one and only valid block. - * + * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as its one and only valid block. + * * @param - * The type of the block entity + * The type of the block entity * @param factory - * A factory for the block entity + * A factory for the block entity * @return this {@link BlockBuilder} */ public BlockBuilder simpleBlockEntity(BlockEntityFactory factory) { @@ -235,52 +194,48 @@ public BlockBuilder simpleBlockEntity(BlockEntity } /** - * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as - * its one and only valid block. + * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as its one and only valid block. *

        * The created {@link BlockEntityBuilder} is returned for further configuration. - * + * * @param - * The type of the block entity + * The type of the block entity * @param factory - * A factory for the block entity + * A factory for the block entity * @return the {@link BlockEntityBuilder} */ public BlockEntityBuilder> blockEntity(BlockEntityFactory factory) { return getOwner().>blockEntity(this, getName(), factory).validBlock(asSupplier()); } - + /** - * Register a block color handler for this block. The {@link BlockColor} instance can be shared across many blocks. - * - * @param colorHandler - * The color handler to register for this block + * Register a set of block tint sources for this block. The {@link BlockTintSource} instances can be shared across many blocks. + * + * @param tintSources The tint sources to register for this block, indexed by tint index * @return this {@link BlockBuilder} */ // TODO it might be worthwhile to abstract this more and add the capability to automatically copy to the item - public BlockBuilder color(NonNullSupplier> colorHandler) { - if (this.colorHandler == null) { + public BlockBuilder color(NonNullSupplier>> tintSources) { + if (this.tintSources == null) { RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::registerBlockColor); } - this.colorHandler = colorHandler; + this.tintSources = tintSources; return this; } - + protected void registerBlockColor() { - OneTimeEventReceiver.addModListener(getOwner(), RegisterColorHandlersEvent.Block.class, e -> { - NonNullSupplier> colorHandler = this.colorHandler; - if (colorHandler != null) { - e.register(colorHandler.get().get(), getEntry()); + OneTimeEventReceiver.addModListener(getOwner(), RegisterColorHandlersEvent.BlockTintSources.class, e -> { + NonNullSupplier>> tintSources = this.tintSources; + if (tintSources != null) { + e.register(tintSources.get().get(), getEntry()); } }); } /** - * Assign the default blockstate, which maps all states to a single model file (via - * {@link RegistrateBlockModelGenerator#createTrivialCube(Block)}). This is the default, so it is generally not - * necessary + * Assign the default blockstate, which maps all states to a single model file (via {@link RegistrateBlockModelGenerator#createTrivialCube(Block)}). This is the default, so it is generally not necessary * to call, unless for undoing previous changes. - * + * * @return this {@link BlockBuilder} */ public BlockBuilder defaultBlockstate() { @@ -289,9 +244,9 @@ public BlockBuilder defaultBlockstate() { /** * Configure the blockstate/models for this block. - * + * * @param cons - * The callback which will be invoked during data generation. + * The callback which will be invoked during data generation. * @return this {@link BlockBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -301,11 +256,9 @@ public BlockBuilder blockstate(NonNullSupplier defaultLang() { @@ -314,9 +267,9 @@ public BlockBuilder defaultLang() { /** * Set the translation for this block. - * + * * @param name - * A localized English name + * A localized English name * @return this {@link BlockBuilder} */ public BlockBuilder lang(String name) { @@ -324,10 +277,9 @@ public BlockBuilder lang(String name) { } /** - * Assign the default loot table, as specified by {@link RegistrateBlockLootTables#dropSelf(Block)}. This is the - * default, so it is generally not necessary to call, unless for + * Assign the default loot table, as specified by {@link RegistrateBlockLootTables#dropSelf(Block)}. This is the default, so it is generally not necessary to call, unless for * undoing previous changes. - * + * * @return this {@link BlockBuilder} */ public BlockBuilder defaultLoot() { @@ -335,15 +287,13 @@ public BlockBuilder defaultLoot() { } /** - * Configure the loot table for this block. This is different than most data gen callbacks as the callback does not - * accept a {@link DataGenContext}, but instead a + * Configure the loot table for this block. This is different than most data gen callbacks as the callback does not accept a {@link DataGenContext}, but instead a * {@link RegistrateBlockLootTables}, for creating specifically block loot tables. *

        - * If the block does not have a loot table (i.e. {@link Block.Properties#noLootTable()} is called) this action will - * be skipped. - * + * If the block does not have a loot table (i.e. {@link Block.Properties#noLootTable()} is called) this action will be skipped. + * * @param cons - * The callback which will be invoked during block loot table creation. + * The callback which will be invoked during block loot table creation. * @return this {@link BlockBuilder} */ public BlockBuilder loot(NonNullBiConsumer cons) { @@ -356,9 +306,9 @@ public BlockBuilder loot(NonNullBiConsumer c /** * Configure the recipe(s) for this block. - * + * * @param cons - * The callback which will be invoked during data generation. + * The callback which will be invoked during data generation. * @return this {@link BlockBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -366,15 +316,14 @@ public BlockBuilder recipe(NonNullBiConsumer, Reg return setData(ProviderType.RECIPE, cons); } - @Nullable - private Function>> clientExtensionFunc; + private @Nullable Function>> clientExtensionFunc; /** * Register a client extension for this block. * The {@link IClientBlockExtensions} instance can be shared across many items. * * @param clientExtension - * The client extension to register for this block + * The client extension to register for this block * @return this {@link BlockBuilder} */ public BlockBuilder clientExtension(NonNullSupplier> clientExtension) { @@ -390,7 +339,7 @@ public BlockBuilder clientExtension(NonNullSupplier tag(TagKey... tags) { @Override protected T createEntry() { - @Nonnull - BlockBehaviour.Properties properties = this.initialProperties.get(); - // TODO why do we need this? + @Nonnull BlockBehaviour.Properties properties = this.initialProperties.get(); + //TODO why do we need this? // ObfuscationReflectionHelper.setPrivateValue(BlockBehaviour.Properties.class, properties, null, "drops"); properties = propertiesCallback.apply(properties); return factory.apply(properties.setId(getResourceKey())); diff --git a/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java index 5451eb1..5cd5076 100644 --- a/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java @@ -1,5 +1,14 @@ package com.modularmc.registrate.builders; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import org.jspecify.annotations.Nullable; + import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.OneTimeEventReceiver; import com.modularmc.registrate.util.RegistrateDistExecutor; @@ -22,17 +31,9 @@ import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.registries.DeferredHolder; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Consumer; -import java.util.function.Function; - -import javax.annotation.Nullable; - /** * A builder for block entities, allows for customization of the valid blocks. - * + * * @param * The type of block entity being built * @param

        @@ -43,28 +44,28 @@ public class BlockEntityBuilder extends AbstractBuilde public interface BlockEntityFactory { public T create(BlockEntityType type, BlockPos pos, BlockState state); + } /** - * Create a new {@link BlockEntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, - * so that alternate initialization strategies can be done in subclasses. + * Create a new {@link BlockEntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. *

        * The block entity will be assigned the following data: - * + * * @param - * The type of the builder + * The type of the builder * @param

        - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the block entity + * Factory to create the block entity * @return A new {@link BlockEntityBuilder} with reasonable default data generators. */ public static BlockEntityBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, BlockEntityFactory factory) { @@ -73,31 +74,30 @@ public static BlockEntityBuilder create(Abstrac private final BlockEntityFactory factory; private final Set> validBlocks = new HashSet<>(); - @Nullable - private NonNullSupplier>> renderer; + private @Nullable NonNullSupplier>> renderer; protected BlockEntityBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, BlockEntityFactory factory) { super(owner, parent, name, callback, Registries.BLOCK_ENTITY_TYPE); this.factory = factory; } - + /** * Add a valid block for this block entity. - * + * * @param block - * A supplier for the block to add at registration time + * A supplier for the block to add at registration time * @return this {@link BlockEntityBuilder} */ public BlockEntityBuilder validBlock(NonNullSupplier block) { validBlocks.add(block); return this; } - + /** * Add valid blocks for this block entity. - * + * * @param blocks - * An array of suppliers for the block to add at registration time + * An array of suppliers for the block to add at registration time * @return this {@link BlockEntityBuilder} */ @SafeVarargs @@ -105,27 +105,25 @@ public final BlockEntityBuilder validBlocks(NonNullSupplier - * - * @apiNote This requires the {@link Class} of the block entity object, which can only be gotten by inspecting an - * instance of it. Thus, the entity will be constructed to register the renderer. - * + * + * @apiNote This requires the {@link Class} of the block entity object, which can only be gotten by inspecting an instance of it. Thus, the entity will be constructed to register the renderer. + * * @param renderer - * A (server safe) supplier to an {@link Function} that will provide this block entity's renderer - * given the renderer dispatcher + * A (server safe) supplier to an {@link Function} that will provide this block entity's renderer given the renderer dispatcher * @return this {@link BlockEntityBuilder} */ - public BlockEntityBuilder renderer(NonNullSupplier>> renderer) { + public BlockEntityBuilder renderer(NonNullSupplier>> renderer) { if (this.renderer == null) { // First call only RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::registerRenderer); } this.renderer = renderer; return this; } - + protected void registerRenderer() { OneTimeEventReceiver.addModListener(getOwner(), FMLClientSetupEvent.class, $ -> { var renderer = this.renderer; diff --git a/src/main/java/com/modularmc/registrate/builders/Builder.java b/src/main/java/com/modularmc/registrate/builders/Builder.java index ecf1ad9..46d9e4b 100644 --- a/src/main/java/com/modularmc/registrate/builders/Builder.java +++ b/src/main/java/com/modularmc/registrate/builders/Builder.java @@ -5,32 +5,22 @@ import com.modularmc.registrate.providers.GeneratorType; import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.util.entry.RegistryEntry; -import com.modularmc.registrate.util.nullness.NonNullBiConsumer; -import com.modularmc.registrate.util.nullness.NonNullBiFunction; -import com.modularmc.registrate.util.nullness.NonNullConsumer; -import com.modularmc.registrate.util.nullness.NonNullFunction; -import com.modularmc.registrate.util.nullness.NonNullSupplier; - +import com.modularmc.registrate.util.nullness.*; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.neoforged.neoforge.registries.datamaps.DataMapType; -import com.tterrag.registrate.util.nullness.*; - import java.util.function.Function; /** - * A Builder creates registry entries. A Builder instance has a constant name which will be used for the resultant - * object, they cannot be reused for different names. It holds a parent object that will + * A Builder creates registry entries. A Builder instance has a constant name which will be used for the resultant object, they cannot be reused for different names. It holds a parent object that will * be returned from some final methods. *

        - * When a builder is completed via {@link #register()} or {@link #build()}, the object will be lazily registered - * (through the owning {@link AbstractRegistrate} object). - * + * When a builder is completed via {@link #register()} or {@link #build()}, the object will be lazily registered (through the owning {@link AbstractRegistrate} object). + * * @param - * Type of the registry for the current object. This is the concrete base class that all registry entries - * must extend, and the type used for the forge registry itself. + * Type of the registry for the current object. This is the concrete base class that all registry entries must extend, and the type used for the forge registry itself. * @param * Actual type of the object being built. * @param

        @@ -41,86 +31,81 @@ public interface Builder> extends NonNullSupplier> { /** - * Complete the current entry, and return the {@link RegistryEntry} that will supply the built entry once it is - * available. The builder can be used afterwards, and changes made will reflect the + * Complete the current entry, and return the {@link RegistryEntry} that will supply the built entry once it is available. The builder can be used afterwards, and changes made will reflect the * output, as long as it is before registration takes place (before forge registry events). - * + * * @return The {@link RegistryEntry} supplying the built entry. */ RegistryEntry register(); /** * The owning {@link AbstractRegistrate} that created this builder. - * + * * @return the owner {@link AbstractRegistrate} */ AbstractRegistrate getOwner(); /** * The parent object. - * + * * @return the parent object of this builder */ P getParent(); /** - * The name of the entry being created, and combined with the mod ID of the parent {@link AbstractRegistrate}, the - * registry name. - * + * The name of the entry being created, and combined with the mod ID of the parent {@link AbstractRegistrate}, the registry name. + * * @return the name of the current entry */ String getName(); - + ResourceKey> getRegistryKey(); /** - * Get the {@link RegistryEntry} representing the entry built by this builder. Cannot be called before the builder - * is built. - * + * Get the {@link RegistryEntry} representing the entry built by this builder. Cannot be called before the builder is built. + * * @return An {@link RegistryEntry} for this builder's entry * @throws IllegalArgumentException - * If this builder has not been built yet + * If this builder has not been built yet */ @Override default RegistryEntry get() { - return getOwner().get(getName(), getRegistryKey()); + return getOwner(). get(getName(), getRegistryKey()); } - + /** * Get the actual entry built by this builder. Cannot be called before registration. - * + * * @return This builder's entry * @throws IllegalArgumentException - * If this builder has not been built yet + * If this builder has not been built yet * @throws NullPointerException - * If the entry from this builder has not been registered yet + * If the entry from this builder has not been registered yet */ default T getEntry() { return get().get(); } - + /** - * Get a supplier for the entry created by this builder, which will not reference the builder after it has been - * resolved. - * + * Get a supplier for the entry created by this builder, which will not reference the builder after it has been resolved. + * * @return A supplier for the entry */ NonNullSupplier asSupplier(); /** - * Set the data provider callback for this entry for the given provider type, which will be invoked when the - * provider of the given type executes. + * Set the data provider callback for this entry for the given provider type, which will be invoked when the provider of the given type executes. *

        * If called multiple times for the same type, the existing callback will be overwritten. *

        * This is mostly unneeded, and instead helper methods for specific data types should be used when possible. - * + * * @param - * The type of provider + * The type of provider * @param type - * The {@link GeneratorType} for the desired provider + * The {@link GeneratorType} for the desired provider * @param cons - * The callback to execute when the provider is run + * The callback to execute when the provider is run * @return this builder */ @SuppressWarnings("unchecked") @@ -133,13 +118,13 @@ default S setData(GeneratorType type, NonNullBiConsumer * Calling this multiple times for the same type will not overwrite an existing callback. - * + * * @param - * The type of provider + * The type of provider * @param type - * The {@link GeneratorType} for the desired provider + * The {@link GeneratorType} for the desired provider * @param cons - * The callback to execute when the provider is run + * The callback to execute when the provider is run * @return this builder */ @SuppressWarnings("unchecked") @@ -183,16 +168,13 @@ default S dataMap(DataMapType type, NonNullBiFunction - * Builders which have had this method used on them (or another method which calls this one), must - * be registered, via - * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register - * time. - * + * Builders which have had this method used on them (or another method which calls this one), must be registered, via + * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register time. + * * @param callback - * the callback to invoke + * the callback to invoke * @return this {@link Builder} */ @SuppressWarnings("unchecked") @@ -202,21 +184,17 @@ default S onRegister(NonNullConsumer callback) { } /** - * Add a callback to be invoked when this entry is registered, but only after some other registry type has been - * registered as well. Can be called multiple times to add multiple callbacks. + * Add a callback to be invoked when this entry is registered, but only after some other registry type has been registered as well. Can be called multiple times to add multiple callbacks. *

        - * Builders which have had this method used on them (or another method which calls this one), must - * be registered, via - * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register - * time. - * + * Builders which have had this method used on them (or another method which calls this one), must be registered, via + * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register time. + * * @param - * The dependency registry type + * The dependency registry type * @param dependencyType - * the base class for objects of the dependency registry. The callback will be invoked only - * after this registry has fired its registry events. + * the base class for objects of the dependency registry. The callback will be invoked only after this registry has fired its registry events. * @param callback - * the callback to invoke + * the callback to invoke * @return this {@link Builder} */ default S onRegisterAfter(ResourceKey> dependencyType, NonNullConsumer callback) { @@ -231,27 +209,26 @@ default S onRegisterAfter(ResourceKey> dependencyTyp /** * Apply a transformation to this {@link Builder}. Useful to apply helper methods within a fluent chain, e.g. - * + * *

              * {@code
        -     *
              * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
              *         .block(MyBlock::new)
              *         .transform(Utils::defaultBlockProperties)
              *         .register();
              * }
              * 
        - * + * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param - * Parent type + * Parent type * @param - * Self type + * Self type * @param func - * The {@link Function function} to apply + * The {@link Function function} to apply * @return the {@link Builder} returned by the given function */ @SuppressWarnings("unchecked") @@ -260,10 +237,9 @@ default > S2 transform } /** - * Register the entry and return the parent object. The {@link net.neoforged.neoforge.registries.DeferredHolder} - * will be created but not returned. It can be retrieved later with {@link AbstractRegistrate#get(ResourceKey)} or + * Register the entry and return the parent object. The {@link net.neoforged.neoforge.registries.DeferredHolder} will be created but not returned. It can be retrieved later with {@link AbstractRegistrate#get(ResourceKey)} or * {@link AbstractRegistrate#get(String, ResourceKey)}. - * + * * @return the parent object */ default P build() { diff --git a/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java b/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java index 842f63d..454201d 100644 --- a/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java +++ b/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java @@ -10,50 +10,47 @@ import net.neoforged.neoforge.registries.DeferredHolder; /** - * A callback passed to {@link Builder builders} from the owning {@link AbstractRegistrate} which will add a - * registration for the built entry that lazily creates and registers it. + * A callback passed to {@link Builder builders} from the owning {@link AbstractRegistrate} which will add a registration for the built entry that lazily creates and registers it. */ @FunctionalInterface public interface BuilderCallback { /** * Accept a built entry, to later be constructed and registered. - * + * * @param - * The registry type to which the entry will be registered + * The registry type to which the entry will be registered * @param - * The type of the entry + * The type of the entry * @param name - * The name of the entry + * The name of the entry * @param type - * A {@link ResourceKey} representing the registry type + * A {@link ResourceKey} representing the registry type * @param builder - * The builder performing this callback + * The builder performing this callback * @param factory - * A {@link NonNullSupplier} that will create the entry + * A {@link NonNullSupplier} that will create the entry * @param entryFactory - * A {@link NonNullFunction} which accepts the entry delegate and returns a - * {@link RegistryEntry} wrapper + * A {@link NonNullFunction} which accepts the entry delegate and returns a {@link RegistryEntry} wrapper * @return A {@link RegistryEntry} that will supply the registered entry */ RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier factory, NonNullFunction, ? extends RegistryEntry> entryFactory); /** - * Accept a built entry, to later be constructed and registered. Uses the default - * {@link RegistryEntry#RegistryEntry(AbstractRegistrate, DeferredHolder) RegistryEntry factory}. - * + * Accept a built entry, to later be constructed and registered. Uses the default {@link RegistryEntry#RegistryEntry(AbstractRegistrate, DeferredHolder) RegistryEntry factory}. + * * @param - * The registry type to which the entry will be registered + * The registry type to which the entry will be registered * @param - * The type of the entry + * The type of the entry * @param name - * The name of the entry + * The name of the entry * @param type - * A {@link Class} representing the registry type + * A {@link Class} representing the registry type * @param builder - * The builder performing this callback + * The builder performing this callback * @param factory - * A {@link NonNullSupplier} that will create the entry + * A {@link NonNullSupplier} that will create the entry * @return A {@link RegistryEntry} that will supply the registered entry */ default RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier factory) { diff --git a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java index 54e089f..e5e1618 100644 --- a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java @@ -14,10 +14,11 @@ import com.modularmc.registrate.util.nullness.NonNullConsumer; import com.modularmc.registrate.util.nullness.NonNullFunction; import com.modularmc.registrate.util.nullness.NonNullSupplier; - import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.Identifier; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.*; import net.minecraft.world.entity.SpawnPlacements.SpawnPredicate; @@ -31,13 +32,11 @@ import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; import net.neoforged.neoforge.registries.DeferredHolder; +import org.jspecify.annotations.Nullable; import java.util.function.Supplier; -import javax.annotation.Nullable; - /** - * A builder for entities, allows for customization of the {@link EntityType.Builder}, easy creation of spawn egg items, - * and configuration of data associated with entities (loot tables, etc.). + * A builder for entities, allows for customization of the {@link EntityType.Builder}, easy creation of spawn egg items, and configuration of data associated with entities (loot tables, etc.). * * @param * The type of entity being built @@ -47,8 +46,7 @@ public class EntityBuilder extends AbstractBuilder, EntityType, P, EntityBuilder> { /** - * Create a new {@link EntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, so - * that alternate initialization strategies can be done in subclasses. + * Create a new {@link EntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. *

        * The entity will be assigned the following data: *

          @@ -56,25 +54,25 @@ public class EntityBuilder extends AbstractBuilder * * @param - * The type of the builder + * The type of the builder * @param

          - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the entity + * Factory to create the entity * @param classification - * The {@link MobCategory} of the entity + * The {@link MobCategory} of the entity * @return A new {@link EntityBuilder} with reasonable default data generators. */ public static EntityBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, EntityType.EntityFactory factory, - MobCategory classification) { + MobCategory classification) { return new EntityBuilder<>(owner, parent, name, callback, factory, classification) .defaultLang(); } @@ -83,8 +81,7 @@ public static EntityBuilder create(AbstractRegistrat private NonNullConsumer> builderCallback = $ -> {}; - @Nullable - private NonNullSupplier>> renderer; + private @Nullable NonNullSupplier>> renderer; private boolean attributesConfigured, spawnConfigured; // TODO make this more reuse friendly @@ -94,12 +91,11 @@ protected EntityBuilder(AbstractRegistrate owner, P parent, String name, Buil } /** - * Modify the properties of the entity. Modifications are done lazily, but the passed function is composed with the - * current one, and as such this method can be called multiple times to perform + * Modify the properties of the entity. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform * different operations. * * @param cons - * The action to perform on the properties + * The action to perform on the properties * @return this {@link EntityBuilder} */ public EntityBuilder properties(NonNullConsumer> cons) { @@ -112,12 +108,11 @@ public EntityBuilder properties(NonNullConsumer> con *

          * * @param renderer - * A (server safe) supplier to an {@link EntityRendererProvider} that will provide this entity's - * renderer + * A (server safe) supplier to an {@link EntityRendererProvider} that will provide this entity's renderer * @return this {@link EntityBuilder} */ public EntityBuilder renderer(NonNullSupplier>> renderer) { - if (this.renderer == null && FMLEnvironment.dist.isClient()) { // First call only + if (this.renderer == null && FMLEnvironment.getDist().isClient()) { // First call only RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::registerRenderer); } this.renderer = renderer; @@ -144,11 +139,10 @@ protected void registerRenderer() { * Cannot be called more than once per builder. * * @param attributes - * A supplier to the attributes for this entity, usually of the form - * {@code EntityClass::createAttributes} + * A supplier to the attributes for this entity, usually of the form {@code EntityClass::createAttributes} * @return this {@link EntityBuilder} * @throws IllegalStateException - * When called more than once + * When called more than once */ @SuppressWarnings("unchecked") public EntityBuilder attributes(Supplier attributes) { @@ -161,20 +155,19 @@ public EntityBuilder attributes(Supplier attrib } /** - * Register a spawn placement for this entity. The entity must extend {@link Mob} and allow construction with a - * {@code null} {@link Level}. + * Register a spawn placement for this entity. The entity must extend {@link Mob} and allow construction with a {@code null} {@link Level}. *

          * Cannot be called more than once per builder. * * @param type - * The type of placement to use + * The type of placement to use * @param heightmap - * Which heightmap to use to choose placement locations + * Which heightmap to use to choose placement locations * @param predicate - * A predicate to check spawn locations for validity + * A predicate to check spawn locations for validity * @return this {@link EntityBuilder} * @throws IllegalStateException - * When called more than once + * When called more than once */ @SuppressWarnings("unchecked") public EntityBuilder spawnPlacement(SpawnPlacementType type, Heightmap.Types heightmap, SpawnPredicate predicate, RegisterSpawnPlacementsEvent.Operation operation) { @@ -183,18 +176,15 @@ public EntityBuilder spawnPlacement(SpawnPlacementType type, Heightmap.Typ } spawnConfigured = true; this.onRegister(t -> { - /* - * TODO is there any way to do this now? - * try { - * if (!(t.create(null) instanceof MobEntity)) { - * throw new IllegalArgumentException("Cannot register spawn placement for entity " + t.getRegistryName() + - * " as it does not extend MobEntity"); - * } - * } catch (Exception e) { - * throw new RuntimeException("Failed to type check entity " + t.getRegistryName() + - * " when registering spawn placement", e); - * } - */ + /* TODO is there any way to do this now? + try { + if (!(t.create(null) instanceof MobEntity)) { + throw new IllegalArgumentException("Cannot register spawn placement for entity " + t.getRegistryName() + " as it does not extend MobEntity"); + } + } catch (Exception e) { + throw new RuntimeException("Failed to type check entity " + t.getRegistryName() + " when registering spawn placement", e); + } + */ OneTimeEventReceiver.addModListener(getOwner(), RegisterSpawnPlacementsEvent.class, e -> { e.register(t, type, heightmap, predicate, operation); }); @@ -205,60 +195,49 @@ public EntityBuilder spawnPlacement(SpawnPlacementType type, Heightmap.Typ /** * Create a spawn egg item for this entity using the given colors, not allowing for any extra configuration. * - * @deprecated This does not work properly, see - * this issue. + * Deprecated note: This does not work properly, see this issue. *

          * As a temporary measure, uses a custom egg class that imperfectly emulates the functionality * * @param primaryColor - * The primary color of the egg + * The primary color of the egg * @param secondaryColor - * The secondary color of the egg + * The secondary color of the egg * @return this {@link EntityBuilder} */ - /* - * TODO <1.21.4> spawn egg - * - * @Deprecated - * public EntityBuilder defaultSpawnEgg(int primaryColor, int secondaryColor) { - * return spawnEgg(primaryColor, secondaryColor).build(); - * } - * + /* TODO <1.21.4> spawn egg + @Deprecated + public EntityBuilder defaultSpawnEgg(int primaryColor, int secondaryColor) { + return spawnEgg(primaryColor, secondaryColor).build(); + } + */ /** * Create a spawn egg item for this entity using the given colors, and return the builder for further configuration. * - * @deprecated This does not work properly, see - * this issue. + * Deprecated note: This does not work properly, see this issue. *

          * As a temporary measure, uses a custom egg class that imperfectly emulates the functionality * * @param primaryColor - * The primary color of the egg + * The primary color of the egg * @param secondaryColor - * The secondary color of the egg + * The secondary color of the egg * @return the {@link ItemBuilder} for the egg item */ - /* - * TODO <1.21.4> spawn egg - * - * @SuppressWarnings({ "rawtypes", "unchecked" }) - * - * @Deprecated - * public ItemBuilder> spawnEgg(int primaryColor, int secondaryColor) { - * var sup = asSupplier(); - * return getOwner().item(this, getName() + "_spawn_egg", p -> new DeferredSpawnEggItem((Supplier>) (Supplier) sup, primaryColor, secondaryColor, p)).tab(CreativeModeTabs.SPAWN_EGGS) - * .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), - * Identifier.withDefaultNamespace("item/template_spawn_egg"))); - * } + /* TODO <1.21.4> spawn egg + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Deprecated + public ItemBuilder> spawnEgg(int primaryColor, int secondaryColor) { + var sup = asSupplier(); + return getOwner().item(this, getName() + "_spawn_egg", p -> new DeferredSpawnEggItem((Supplier>) (Supplier) sup, primaryColor, secondaryColor, p)).tab(CreativeModeTabs.SPAWN_EGGS) + .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), Identifier.withDefaultNamespace("item/template_spawn_egg"))); + } */ /** - * Assign the default translation, as specified by - * {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, net.minecraft.resources.ResourceKey)}. This is - * the default, so it is generally + * Assign the default translation, as specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, net.minecraft.resources.ResourceKey)}. This is the default, so it is generally * not necessary to call, unless for undoing previous changes. * * @return this {@link EntityBuilder} @@ -271,7 +250,7 @@ public EntityBuilder defaultLang() { * Set the translation for this entity. * * @param name - * A localized English name + * A localized English name * @return this {@link EntityBuilder} */ public EntityBuilder lang(String name) { @@ -279,12 +258,11 @@ public EntityBuilder lang(String name) { } /** - * Configure the loot table for this entity. This is different than most data gen callbacks as the callback does not - * accept a {@link DataGenContext}, but instead a + * Configure the loot table for this entity. This is different than most data gen callbacks as the callback does not accept a {@link DataGenContext}, but instead a * {@link RegistrateEntityLootTables}, for creating specifically entity loot tables. * * @param cons - * The callback which will be invoked during entity loot table creation. + * The callback which will be invoked during entity loot table creation. * @return this {@link EntityBuilder} */ public EntityBuilder loot(NonNullBiConsumer> cons) { @@ -295,7 +273,7 @@ public EntityBuilder loot(NonNullBiConsumer extends AbstractBuilder> { @FunctionalInterface public interface FluidTypeFactory { - FluidType create(FluidType.Properties properties); } @FunctionalInterface public interface FluidFactory { - T create(BaseFlowingFluid.Properties properties); } - @Nullable - private NonNullSupplier> clientExtension; + + private @Nullable NonNullSupplier> model; + + private @Nullable NonNullSupplier> clientExtension; /** - * Register a client extension for this block. The {@link IClientBlockExtensions} instance can be shared across many - * items. + * Register a client extension for this block. The {@link IClientBlockExtensions} instance can be shared across many items. * * @param clientExtension - * The client extension to register for this block + * The client extension to register for this block * @return this {@link BlockBuilder} */ public FluidBuilder clientExtension(NonNullSupplier> clientExtension) { @@ -86,8 +78,25 @@ public FluidBuilder clientExtension(NonNullSupplier clientExtension(Identifier stillTexture, Identifier flowingTexture) { - return clientExtension(() -> () -> new DefaultFluidTypeExtension(stillTexture, flowingTexture)); + public FluidBuilder model(Identifier stillTexture, Identifier flowingTexture) { + return model(() -> () -> new FluidModel.Unbaked(new Material(stillTexture), new Material(flowingTexture), null, null)); + } + + public FluidBuilder model(NonNullSupplier> model) { + if (this.model == null) { + RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::registerModel); + } + this.model = model; + return this; + } + + protected void registerModel() { + OneTimeEventReceiver.addModListener(getOwner(), RegisterFluidModelsEvent.class, e -> { + NonNullSupplier> model = this.model; + if (model != null) { + e.register(model.get().get(), getEntry()); + } + }); } protected void registerClientExtension() { @@ -100,19 +109,18 @@ protected void registerClientExtension() { } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) - * and fluid class ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) and fluid class ({@link BaseFlowingFluid.Flowing}). * * @param

          - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @return A new {@link FluidBuilder} with reasonable default data generators. * @see #create(AbstractRegistrate, Object, String, BuilderCallback, FluidTypeFactory, FluidFactory) */ @@ -121,21 +129,20 @@ public static

          FluidBuilder create(AbstractRegis } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class - * ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class ({@link BaseFlowingFluid.Flowing}). * * @param

          - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param typeFactory - * A factory that creates the fluid type + * A factory that creates the fluid type * @return A new {@link FluidBuilder} with reasonable default data generators. * @see #create(AbstractRegistrate, Object, String, BuilderCallback, FluidTypeFactory, FluidFactory) */ @@ -144,21 +151,20 @@ public static

          FluidBuilder create(AbstractRegis } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class - * ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class ({@link BaseFlowingFluid.Flowing}). * * @param

          - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param fluidType - * An existing and registered fluid type. + * An existing and registered fluid type. * @return A new {@link FluidBuilder} with reasonable default data generators. * @see #create(AbstractRegistrate, Object, String, BuilderCallback, FluidTypeFactory, FluidFactory) */ @@ -167,103 +173,96 @@ public static

          FluidBuilder create(AbstractRegis } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) - * and fluid class ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) and fluid class ({@link BaseFlowingFluid.Flowing}). * * @param - * The type of the builder + * The type of the builder * @param

          - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param fluidFactory - * A factory that creates the flowing fluid + * A factory that creates the flowing fluid * @return A new {@link FluidBuilder} with reasonable default data generators. */ public static FluidBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, - FluidFactory fluidFactory) { + FluidFactory fluidFactory) { return create(owner, parent, name, callback, FluidType::new, fluidFactory); } /** - * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that - * alternate initialization strategies can be done in subclasses. + * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. *

          * The fluid will be assigned the following data: *

            *
          • The default translation (via {@link #defaultLang()})
          • *
          • A default {@link BaseFlowingFluid.Source source fluid} (via {@link #defaultSource})
          • - *
          • A default block for the fluid, with its own default blockstate and model that configure the particle texture - * (via {@link #defaultBlock()})
          • - *
          • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid - * (via {@link #defaultBucket()})
          • + *
          • A default block for the fluid, with its own default blockstate and model that configure the particle texture (via {@link #defaultBlock()})
          • + *
          • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid (via {@link #defaultBucket()})
          • *
          * * @param - * The type of the builder + * The type of the builder * @param

          - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param typeFactory - * A factory that creates the fluid type + * A factory that creates the fluid type * @param fluidFactory - * A factory that creates the flowing fluid + * A factory that creates the flowing fluid * @return A new {@link FluidBuilder} with reasonable default data generators. */ public static FluidBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, - FluidTypeFactory typeFactory, FluidFactory fluidFactory) { + FluidTypeFactory typeFactory, FluidFactory fluidFactory) { FluidBuilder ret = new FluidBuilder<>(owner, parent, name, callback, typeFactory, fluidFactory) .defaultLang().defaultSource().defaultBlock().defaultBucket(); return ret; } /** - * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that - * alternate initialization strategies can be done in subclasses. + * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. *

          * The fluid will be assigned the following data: *

            *
          • The default translation (via {@link #defaultLang()})
          • *
          • A default {@link BaseFlowingFluid.Source source fluid} (via {@link #defaultSource})
          • - *
          • A default block for the fluid, with its own default blockstate and model that configure the particle texture - * (via {@link #defaultBlock()})
          • - *
          • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid - * (via {@link #defaultBucket()})
          • + *
          • A default block for the fluid, with its own default blockstate and model that configure the particle texture (via {@link #defaultBlock()})
          • + *
          • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid (via {@link #defaultBucket()})
          • *
          * * @param - * The type of the builder + * The type of the builder * @param

          - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param fluidType - * An existing and registered fluid type + * An existing and registered fluid type * @param fluidFactory - * A factory that creates the flowing fluid + * A factory that creates the flowing fluid * @return A new {@link FluidBuilder} with reasonable default data generators. */ public static FluidBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, - NonNullSupplier fluidType, FluidFactory fluidFactory) { + NonNullSupplier fluidType, FluidFactory fluidFactory) { return new FluidBuilder<>(owner, parent, name, callback, fluidType, fluidFactory) .defaultLang().defaultSource().defaultBlock().defaultBucket(); } @@ -272,22 +271,17 @@ public static FluidBuilder create(Abstract private final FluidFactory fluidFactory; - @Nullable - private final NonNullSupplier fluidType; + private @Nullable final NonNullSupplier fluidType; - @Nullable - private Boolean defaultSource, defaultBlock, defaultBucket; + private @Nullable Boolean defaultSource, defaultBlock, defaultBucket; private NonNullConsumer typeProperties = $ -> {}; private NonNullConsumer fluidProperties = $ -> {}; - private @Nullable Supplier> layer = null; - private boolean registerType; - @Nullable - private NonNullSupplier source; + private @Nullable NonNullSupplier source; private final List> tags = new ArrayList<>(); public FluidBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, FluidTypeFactory typeFactory, FluidFactory fluidFactory) { @@ -309,12 +303,11 @@ public FluidBuilder(AbstractRegistrate owner, P parent, String name, BuilderC } /** - * Modify the properties of the fluid type. Modifications are done lazily, but the passed function is composed with - * the current one, and as such this method can be called multiple times to perform + * Modify the properties of the fluid type. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform * different operations. * * @param cons - * The action to perform on the attributes + * The action to perform on the attributes * @return this {@link FluidBuilder} */ public FluidBuilder properties(NonNullConsumer cons) { @@ -323,12 +316,11 @@ public FluidBuilder properties(NonNullConsumer cons) } /** - * Modify the properties of the flowing fluid. Modifications are done lazily, but the passed function is composed - * with the current one, and as such this method can be called multiple times to perform + * Modify the properties of the flowing fluid. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform * different operations. * * @param cons - * The action to perform on the attributes + * The action to perform on the attributes * @return this {@link FluidBuilder} */ public FluidBuilder fluidProperties(NonNullConsumer cons) { @@ -337,8 +329,7 @@ public FluidBuilder fluidProperties(NonNullConsumer defaultLang() { * Set the translation for this fluid. * * @param name - * A localized English name + * A localized English name * @return this {@link FluidBuilder} */ public FluidBuilder lang(String name) { return lang(f -> f.getFluidType().getDescriptionId(), name); } - public FluidBuilder renderType(Supplier> layer) { - if (this.layer == null) { - onRegister(this::registerRenderType); - } - this.layer = layer; - return this; - } - - protected void registerRenderType(T entry) { - RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - OneTimeEventReceiver.addModListener(getOwner(), FMLClientSetupEvent.class, $ -> { - if (this.layer != null) { - ChunkSectionLayer layer = this.layer.get().get(); - ItemBlockRenderTypes.setRenderLayer(entry, layer); - ItemBlockRenderTypes.setRenderLayer(getSource(), layer); - } - }); - }); - } - /** - * Create a standard {@link BaseFlowingFluid.Source} for this fluid which will be built and registered along with - * this fluid. + * Create a standard {@link BaseFlowingFluid.Source} for this fluid which will be built and registered along with this fluid. * * @return this {@link FluidBuilder} * @see #source(NonNullFunction) * @throws IllegalStateException - * If {@link #source(NonNullFunction)} has been called before this method + * If {@link #source(NonNullFunction)} has been called before this method */ public FluidBuilder defaultSource() { if (this.defaultSource != null) { @@ -396,11 +366,10 @@ public FluidBuilder defaultSource() { } /** - * Create a {@link BaseFlowingFluid} for this fluid, which is created by the given factory, and which will be built - * and registered along with this fluid. + * Create a {@link BaseFlowingFluid} for this fluid, which is created by the given factory, and which will be built and registered along with this fluid. * * @param factory - * A factory for the fluid, which accepts the properties and returns a new fluid + * A factory for the fluid, which accepts the properties and returns a new fluid * @return this {@link FluidBuilder} */ public FluidBuilder source(NonNullFunction factory) { @@ -410,14 +379,12 @@ public FluidBuilder source(NonNullFunction defaultBlock() { if (this.defaultBlock != null) { @@ -428,8 +395,7 @@ public FluidBuilder defaultBlock() { } /** - * Create a standard {@link LiquidBlock} for this fluid, and return the builder for it so that further customization - * can be done. + * Create a standard {@link LiquidBlock} for this fluid, and return the builder for it so that further customization can be done. * * @return the {@link BlockBuilder} for the {@link LiquidBlock} */ @@ -438,13 +404,12 @@ public BlockBuilder> block() { } /** - * Create a {@link LiquidBlock} for this fluid, which is created by the given factory, and return the builder for it - * so that further customization can be done. + * Create a {@link LiquidBlock} for this fluid, which is created by the given factory, and return the builder for it so that further customization can be done. * * @param - * The type of the block + * The type of the block * @param factory - * A factory for the block, which accepts the block object and properties and returns a new block + * A factory for the block, which accepts the block object and properties and returns a new block * @return the {@link BlockBuilder} for the {@link LiquidBlock} */ public BlockBuilder> block(NonNullBiFunction factory) { @@ -455,9 +420,9 @@ public BlockBuilder> block(NonNull final NonNullSupplier supplier = asSupplier(); final var lightLevel = Lazy.of(() -> fluidType.get().getLightLevel()); final ToIntFunction lightLevelInt = $ -> lightLevel.get(); - final var ret = getOwner().>block(this, sourceName, p -> factory.apply(supplier.get(), p)) - .properties(p -> BlockBehaviour.Properties.ofFullCopy(Blocks.WATER).noLootTable()) - .properties(p -> p.lightLevel(lightLevelInt)) + final var ret = getOwner().>block(this, sourceName, p -> factory.apply(supplier.get(), p)) + .properties(p -> BlockBehaviour.Properties.ofFullCopy(Blocks.WATER).noLootTable()) + .properties(p -> p.lightLevel(lightLevelInt)) .blockstate(() -> (ctx, prov) -> prov.createNonTemplateModelBlock(ctx.get())); this.fluidProperties(p -> p.block(ret.asSupplier())); return ret; @@ -473,14 +438,12 @@ public FluidBuilder noBlock() { } /** - * Create a standard {@link BucketItem} for this fluid, building it immediately, and not allowing for further - * configuration. + * Create a standard {@link BucketItem} for this fluid, building it immediately, and not allowing for further configuration. * * @return this {@link FluidBuilder} * @see #bucket() * @throws IllegalStateException - * If {@link #bucket()} or {@link #bucket(NonNullBiFunction)} has been called before - * this method + * If {@link #bucket()} or {@link #bucket(NonNullBiFunction)} has been called before this method */ public FluidBuilder defaultBucket() { if (this.defaultBucket != null) { @@ -491,8 +454,7 @@ public FluidBuilder defaultBucket() { } /** - * Create a standard {@link BucketItem} for this fluid, and return the builder for it so that further customization - * can be done. + * Create a standard {@link BucketItem} for this fluid, and return the builder for it so that further customization can be done. * * @return the {@link ItemBuilder} for the {@link BucketItem} */ @@ -501,14 +463,12 @@ public ItemBuilder> bucket() { } /** - * Create a {@link BucketItem} for this fluid, which is created by the given factory, and return the builder for it - * so that further customization can be done. + * Create a {@link BucketItem} for this fluid, which is created by the given factory, and return the builder for it so that further customization can be done. * * @param - * The type of the bucket item + * The type of the bucket item * @param factory - * A factory for the bucket item, which accepts the fluid object supplier and properties and returns - * a new item + * A factory for the bucket item, which accepts the fluid object supplier and properties and returns a new item * @return the {@link ItemBuilder} for the {@link BucketItem} */ public ItemBuilder> bucket(NonNullBiFunction factory) { @@ -522,7 +482,7 @@ public ItemBuilder> bucket(NonNullB throw new IllegalStateException("Cannot create a bucket before creating a source block"); } final var ret = getOwner().>item(this, bucketName, p -> factory.apply(source.get(), p)) - .properties(p -> p.craftRemainder(Items.BUCKET).stacksTo(1)) + .properties(p -> p.craftRemainder(Items.BUCKET).stacksTo(1)) .model(() -> (ctx, prov) -> prov.generateFlatItem(ctx.get(), ModelTemplates.FLAT_ITEM)); this.fluidProperties(p -> p.bucket(ret.asSupplier())); return ret; @@ -541,7 +501,7 @@ public FluidBuilder noBucket() { * Assign {@link TagKey}{@code s} to this fluid and its source fluid. Multiple calls will add additional tags. * * @param tags - * The tags to assign + * The tags to assign * @return this {@link FluidBuilder} */ @SafeVarargs @@ -549,7 +509,7 @@ public final FluidBuilder tag(TagKey... tags) { FluidBuilder ret = this.tag(ProviderType.FLUID_TAGS, tags); if (this.tags.isEmpty()) { ret.getOwner()., Fluid>setDataGenerator(ret.sourceName, getRegistryKey(), ProviderType.FLUID_TAGS, - prov -> this.tags.stream().map(prov::tag).forEach(p -> p.add(getSource()))); + prov -> this.tags.stream().map(prov::tag).forEach(p -> p.add(getSource()))); } this.tags.addAll(Arrays.asList(tags)); return ret; @@ -559,7 +519,7 @@ public final FluidBuilder tag(TagKey... tags) { * Remove {@link TagKey}{@code s} from this fluid and its source fluid. Multiple calls will remove additional tags. * * @param tags - * The tags to remove + * The tags to remove * @return this {@link FluidBuilder} */ @SafeVarargs @@ -648,24 +608,4 @@ public FluidEntry register() { protected RegistryEntry createEntryWrapper(DeferredHolder delegate) { return new FluidEntry<>(getOwner(), delegate); } - - public static class DefaultFluidTypeExtension implements IClientFluidTypeExtensions { - - private final Identifier stillTexture, flowingTexture; - - public DefaultFluidTypeExtension(Identifier stillTexture, Identifier flowingTexture) { - this.stillTexture = stillTexture; - this.flowingTexture = flowingTexture; - } - - @Override - public Identifier getStillTexture() { - return stillTexture; - } - - @Override - public Identifier getFlowingTexture() { - return flowingTexture; - } - } } diff --git a/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java b/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java index a29c9fe..279a489 100644 --- a/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java @@ -1,5 +1,6 @@ package com.modularmc.registrate.builders; +import com.google.common.collect.Maps; import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.DataGenContext; import com.modularmc.registrate.providers.GeneratorType; @@ -16,7 +17,6 @@ import com.modularmc.registrate.util.nullness.NonNullFunction; import com.modularmc.registrate.util.nullness.NonNullSupplier; import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; - import net.minecraft.client.data.models.model.ModelTemplates; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; @@ -31,18 +31,14 @@ import net.neoforged.neoforge.registries.datamaps.builtin.FurnaceFuel; import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps; -import com.google.common.collect.Maps; - +import org.jspecify.annotations.Nullable; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; -import javax.annotation.Nullable; - /** - * A builder for items, allows for customization of the {@link Item.Properties} and configuration of data associated - * with items (models, recipes, etc.). + * A builder for items, allows for customization of the {@link Item.Properties} and configuration of data associated with items (models, recipes, etc.). * * @param * The type of item being built @@ -52,8 +48,7 @@ public class ItemBuilder extends AbstractBuilder> { /** - * Create a new {@link ItemBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that - * alternate initialization strategies can be done in subclasses. + * Create a new {@link ItemBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. *

          * The item will be assigned the following data: *

            @@ -62,19 +57,19 @@ public class ItemBuilder extends AbstractBuilder * * @param - * The type of the builder + * The type of the builder * @param

            - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the item + * Factory to create the item * @return A new {@link ItemBuilder} with reasonable default data generators. */ public static ItemBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { @@ -100,14 +95,13 @@ protected ItemBuilder(AbstractRegistrate owner, P parent, String name, Builde } /** - * Modify the properties of the item. Modifications are done lazily, but the passed function is composed with the - * current one, and as such this method can be called multiple times to perform + * Modify the properties of the item. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform * different operations. *

            * If a different properties instance is returned, it will replace the existing one entirely. * * @param func - * The action to perform on the properties + * The action to perform on the properties * @return this {@link ItemBuilder} */ public ItemBuilder properties(NonNullUnaryOperator func) { @@ -116,11 +110,10 @@ public ItemBuilder properties(NonNullUnaryOperator func) } /** - * Replace the initial state of the item properties, without replacing or removing any modifications done via - * {@link #properties(NonNullUnaryOperator)}. + * Replace the initial state of the item properties, without replacing or removing any modifications done via {@link #properties(NonNullUnaryOperator)}. * * @param properties - * A supplier to to create the initial properties + * A supplier to to create the initial properties * @return this {@link ItemBuilder} */ public ItemBuilder initialProperties(NonNullSupplier properties) { @@ -129,21 +122,17 @@ public ItemBuilder initialProperties(NonNullSupplier prop } /** - * Sets a tab modifier for the given tab which can be used to define custom logic for how the item stack is created - * and/or added to the tab. + * Sets a tab modifier for the given tab which can be used to define custom logic for how the item stack is created and/or added to the tab. * *

            - * CreativeModeTab registration is delegated off until the item has been finalized and registered to the - * {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
            - * This means you can call this method as many times as you like during the build process with no added side - * effects. + * CreativeModeTab registration is delegated off until the item has been finalized and registered to the {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
            + * This means you can call this method as many times as you like during the build process with no added side effects. *

            * Calling this method with different {@link ResourceKey tab keys} will add the modifier to all the specified tabs. *

            - * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier - * for that tab. + * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier for that tab. * - * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for + * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for * @param modifier A {@link Consumer consumer} accepting a {@link CreativeModeTabModifier} used to update the tab * @return This builder * @deprecated Use {@link #tab(ResourceKey, NonNullBiConsumer)} which provides access to the registered item. @@ -154,39 +143,30 @@ public ItemBuilder tab(ResourceKey tab, Consumer - * CreativeModeTab registration is delegated off until the item has been finalized and registered to the - * {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
            - * This means you can call this method as many times as you like during the build process with no added side - * effects. + * CreativeModeTab registration is delegated off until the item has been finalized and registered to the {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
            + * This means you can call this method as many times as you like during the build process with no added side effects. *

            * Calling this method with different {@link ResourceKey tab keys} will add the modifier to all the specified tabs. *

            - * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier - * for that tab. + * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier for that tab. * - * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for - * @param modifier A {@link NonNullBiConsumer consumer} accepting a context object and - * {@link CreativeModeTabModifier} used to update the tab + * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for + * @param modifier A {@link NonNullBiConsumer consumer} accepting a context object and {@link CreativeModeTabModifier} used to update the tab * @return This builder */ public ItemBuilder tab(ResourceKey tab, NonNullBiConsumer, CreativeModeTabModifier> modifier) { - creativeModeTabs.put(tab, modifier); // Should we get the current value in the map [if one exists] and - // .andThen() the 2 together? right now we replace any consumer that - // currently exists + creativeModeTabs.put(tab, modifier); // Should we get the current value in the map [if one exists] and .andThen() the 2 together? right now we replace any consumer that currently exists return this; } /** * Adds the item built from this builder into the given CreativeModeTab using the default ItemStack instance. *

            - * CreativeModeTab registration is delegated off until the item has been finalized and registered to the - * {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
            - * This means you can call this method as many times as you like during the build process with no added side - * effects. + * CreativeModeTab registration is delegated off until the item has been finalized and registered to the {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
            + * This means you can call this method as many times as you like during the build process with no added side effects. *

            * Calling this method with different {@link ResourceKey tab keys} will add the item to all the specified tabs. *

            @@ -226,7 +206,7 @@ public ItemBuilder defaultModel() { * Configure the model for this item. * * @param cons - * The callback which will be invoked during data creation + * The callback which will be invoked during data creation * @return this {@link ItemBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -236,9 +216,7 @@ public ItemBuilder model(NonNullSupplier defaultLang() { * Set the translation for this item. * * @param name - * A localized English name + * A localized English name * @return this {@link ItemBuilder} */ public ItemBuilder lang(String name) { @@ -262,7 +240,7 @@ public ItemBuilder lang(String name) { * Configure the recipe(s) for this item. * * @param cons - * The callback which will be invoked during data generation. + * The callback which will be invoked during data generation. * @return this {@link ItemBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -272,7 +250,6 @@ public ItemBuilder recipe(NonNullBiConsumer, Regis /** * Add burn time for the item - * * @param tick time in ticks for this item to burn in furnace. */ public ItemBuilder burnTime(int tick) { @@ -281,22 +258,19 @@ public ItemBuilder burnTime(int tick) { /** * Add compost chance for the item - * * @param chance chance for composter to increase one level when composting this item. */ public ItemBuilder compostable(float chance) { return dataMap(NeoForgeDataMaps.COMPOSTABLES, new Compostable(chance)); } - @Nullable - private Function>> clientExtensionFunc; + private @Nullable Function>> clientExtensionFunc; /** - * Register a client extension for this item. The {@link IClientItemExtensions} instance can be shared across many - * items. + * Register a client extension for this item. The {@link IClientItemExtensions} instance can be shared across many items. * * @param clientExtension - * The client extension to register for this item + * The client extension to register for this item * @return this {@link ItemBuilder} */ public ItemBuilder clientExtension(NonNullSupplier> clientExtension) { @@ -329,7 +303,7 @@ protected void registerClientExtension() { * Assign {@link TagKey}{@code s} to this item. Multiple calls will add additional tags. * * @param tags - * The tag to assign + * The tag to assign * @return this {@link ItemBuilder} */ @SafeVarargs diff --git a/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java b/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java index 6997bbe..ddf7bd2 100644 --- a/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java @@ -1,12 +1,13 @@ package com.modularmc.registrate.builders; +import org.jspecify.annotations.Nullable; + import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.OneTimeEventReceiver; import com.modularmc.registrate.util.RegistrateDistExecutor; import com.modularmc.registrate.util.entry.MenuEntry; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.modularmc.registrate.util.nullness.NonnullType; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.MenuAccess; @@ -21,12 +22,10 @@ import net.neoforged.neoforge.common.extensions.IMenuTypeExtension; import net.neoforged.neoforge.registries.DeferredHolder; -import javax.annotation.Nullable; - -public class MenuBuilder, P> extends AbstractBuilder, MenuType, P, MenuBuilder> { - +public class MenuBuilder, P> extends AbstractBuilder, MenuType, P, MenuBuilder> { + public interface MenuFactory { - + T create(MenuType type, int windowId, Inventory inv); } @@ -34,12 +33,12 @@ public interface ForgeMenuFactory { T create(MenuType type, int windowId, Inventory inv, @Nullable RegistryFriendlyByteBuf buffer); } - + public interface ScreenFactory> { - + T create(M menu, Inventory inv, Component displayName); } - + private final ForgeMenuFactory factory; private final NonNullSupplier> screenFactory; @@ -54,7 +53,7 @@ public MenuBuilder(AbstractRegistrate owner, P parent, String name, BuilderCa } @Override - protected @NonnullType MenuType createEntry() { + protected MenuType createEntry() { ForgeMenuFactory factory = this.factory; final var supplier = this.asSupplier(); MenuType ret = IMenuTypeExtension.create((windowId, inv, buf) -> factory.create(supplier.get(), windowId, inv, buf)); diff --git a/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java b/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java index 1df7c4a..61542f5 100644 --- a/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java @@ -2,13 +2,12 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.modularmc.registrate.util.nullness.NonnullType; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; public class NoConfigBuilder extends AbstractBuilder> { - + private final NonNullSupplier factory; public NoConfigBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, ResourceKey> registryType, NonNullSupplier factory) { @@ -17,7 +16,7 @@ public NoConfigBuilder(AbstractRegistrate owner, P parent, String name, Build } @Override - protected @NonnullType T createEntry() { + protected T createEntry() { return factory.get(); } } diff --git a/src/main/java/com/modularmc/registrate/builders/package-info.java b/src/main/java/com/modularmc/registrate/builders/package-info.java index 21c061b..cb0fbe7 100644 --- a/src/main/java/com/modularmc/registrate/builders/package-info.java +++ b/src/main/java/com/modularmc/registrate/builders/package-info.java @@ -1,8 +1,2 @@ -@javax.annotation.ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault +@org.jspecify.annotations.NullMarked package com.modularmc.registrate.builders; - -import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; - -import com.mojang.logging.annotations.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/modularmc/registrate/package-info.java b/src/main/java/com/modularmc/registrate/package-info.java index 0bce9dd..9e2ce6c 100644 --- a/src/main/java/com/modularmc/registrate/package-info.java +++ b/src/main/java/com/modularmc/registrate/package-info.java @@ -1,10 +1,2 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault +@org.jspecify.annotations.NullMarked package com.modularmc.registrate; - -import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; - -import com.mojang.logging.annotations.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/com/modularmc/registrate/providers/DataGenContext.java b/src/main/java/com/modularmc/registrate/providers/DataGenContext.java index 6d496d5..78ca599 100644 --- a/src/main/java/com/modularmc/registrate/providers/DataGenContext.java +++ b/src/main/java/com/modularmc/registrate/providers/DataGenContext.java @@ -2,20 +2,17 @@ import com.modularmc.registrate.builders.Builder; import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.modularmc.registrate.util.nullness.NonnullType; - -import net.minecraft.core.Registry; -import net.minecraft.resources.Identifier; -import net.minecraft.resources.ResourceKey; import lombok.AccessLevel; import lombok.Getter; import lombok.Value; import lombok.experimental.Delegate; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.Identifier; /** - * A context bean passed to data generator callbacks. Contains the entry that data is being created for, and some - * metadata about the entry. + * A context bean passed to data generator callbacks. Contains the entry that data is being created for, and some metadata about the entry. * * @param * Type of the registry to which the entry belongs @@ -32,7 +29,7 @@ public class DataGenContext implements NonNullSupplier { Identifier id; @SuppressWarnings("null") - public @NonnullType E getEntry() { + public E getEntry() { return entry.get(); } @@ -40,7 +37,7 @@ public class DataGenContext implements NonNullSupplier { public static DataGenContext from(Builder builder, ResourceKey> type) { return from(builder); } - + public static DataGenContext from(Builder builder) { return new DataGenContext<>(NonNullSupplier.of(builder.getOwner().get(builder.getName(), builder.getRegistryKey())), builder.getName(), Identifier.fromNamespaceAndPath(builder.getOwner().getModid(), builder.getName())); diff --git a/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java b/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java index ef6c7d0..e93a1b1 100644 --- a/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java +++ b/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java @@ -1,57 +1,60 @@ package com.modularmc.registrate.providers; +import com.mojang.datafixers.util.Pair; import net.minecraft.core.Registry; import net.minecraft.core.RegistrySetBuilder; import net.minecraft.resources.ResourceKey; +import org.jspecify.annotations.Nullable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import javax.annotation.Nullable; - public class DataProviderInitializer { - private final RegistrySetBuilder datapackEntryProvider = new RegistrySetBuilder(); - - private final Map, ProviderType> providerDependencies = new ConcurrentHashMap<>(); - - public DataProviderInitializer() { - addDependency(ProviderType.ITEM_TAGS, ProviderType.BLOCK_TAGS); - } - - protected RegistrySetBuilder getDatapackRegistryProviders() { - return datapackEntryProvider; - } - - protected List getSortedProviders() { - List ans = new ArrayList<>(); - Set> added = new HashSet<>(); - List>> remain = new ArrayList<>(RegistrateDataProvider.TYPES.entrySet()); - while (!remain.isEmpty()) { - if (!remain.removeIf(e -> { - ProviderType type = e.getValue(); - var parent = providerDependencies.get(type); - if (parent == null || added.contains(parent)) { - ans.add(new Sorted(e.getKey(), type, parent)); - added.add(type); - return true; - } - return false; - })) throw new IllegalStateException("Looping dependency detected: " + remain); - } - return ans; - } - - public void add(ResourceKey> registry, RegistrySetBuilder.RegistryBootstrap provider) { - datapackEntryProvider.add(registry, provider); - } - - public void addDependency(ProviderType dependent, ProviderType parent) { - var old = providerDependencies.put(dependent, parent); - if (old != null) throw new IllegalStateException("Providers can have only 1 prerequisite"); - } - - public record Sorted( - String id, ProviderType type, - @Nullable ProviderType parent) {} + private final RegistrySetBuilder datapackEntryProvider = new RegistrySetBuilder(); + + private final Map, ProviderType> providerDependencies = new ConcurrentHashMap<>(); + + public DataProviderInitializer() { + addDependency(ProviderType.ITEM_TAGS, ProviderType.BLOCK_TAGS); + } + + protected RegistrySetBuilder getDatapackRegistryProviders() { + return datapackEntryProvider; + } + + protected List getSortedProviders() { + List ans = new ArrayList<>(); + Set> added = new HashSet<>(); + List>> remain = new ArrayList<>(RegistrateDataProvider.TYPES.entrySet()); + while (!remain.isEmpty()) { + if (!remain.removeIf(e -> { + ProviderType type = e.getValue(); + var parent = providerDependencies.get(type); + if (parent == null || added.contains(parent)) { + ans.add(new Sorted(e.getKey(), type, parent)); + added.add(type); + return true; + } + return false; + })) throw new IllegalStateException("Looping dependency detected: " + remain); + } + return ans; + } + + public void add(ResourceKey> registry, RegistrySetBuilder.RegistryBootstrap provider) { + datapackEntryProvider.add(registry, provider); + } + + public void addDependency(ProviderType dependent, ProviderType parent) { + var old = providerDependencies.put(dependent, parent); + if (old != null) throw new IllegalStateException("Providers can have only 1 prerequisite"); + } + + public record Sorted( + String id, ProviderType type, + @Nullable ProviderType parent + ) { + } + } diff --git a/src/main/java/com/modularmc/registrate/providers/GeneratorType.java b/src/main/java/com/modularmc/registrate/providers/GeneratorType.java index f75a249..be32e2b 100644 --- a/src/main/java/com/modularmc/registrate/providers/GeneratorType.java +++ b/src/main/java/com/modularmc/registrate/providers/GeneratorType.java @@ -1,3 +1,4 @@ package com.modularmc.registrate.providers; -public interface GeneratorType {} +public interface GeneratorType { +} diff --git a/src/main/java/com/modularmc/registrate/providers/ProviderType.java b/src/main/java/com/modularmc/registrate/providers/ProviderType.java index 1f1b908..5db399b 100644 --- a/src/main/java/com/modularmc/registrate/providers/ProviderType.java +++ b/src/main/java/com/modularmc/registrate/providers/ProviderType.java @@ -1,15 +1,9 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.providers.generators.RegistrateBlockModelGenerator; -import com.modularmc.registrate.providers.generators.RegistrateItemModelGenerator; -import com.modularmc.registrate.providers.generators.RegistrateModelProvider; -import com.modularmc.registrate.providers.generators.RegistrateRecipeProvider; -import com.modularmc.registrate.providers.generators.RegistrateRecipeRunner; +import com.modularmc.registrate.providers.generators.*; import com.modularmc.registrate.providers.loot.RegistrateLootTableProvider; -import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; import com.modularmc.registrate.util.nullness.NonNullSupplier; - import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; @@ -23,28 +17,23 @@ import net.neoforged.neoforge.data.event.GatherDataEvent; import net.neoforged.neoforge.data.loading.DatagenModLoader; -import com.tterrag.registrate.providers.generators.*; - +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.function.Function; -import javax.annotation.Nonnull; -import javax.annotation.ParametersAreNonnullByDefault; - /** * Represents a type of data that can be generated, and specifies a factory for the provider. *

            * Used as a key for data generator callbacks. *

            - * This file also defines the built-in provider types, but third-party types can be created with - * {@link #registerProvider(String, ProviderType)}. + * This file also defines the built-in provider types, but third-party types can be created with {@link #registerProvider(String, ProviderType)}. * * @param The type of the provider */ @FunctionalInterface @SuppressWarnings("deprecation") -@FieldsAreNonnullByDefault @ParametersAreNonnullByDefault public interface ProviderType extends GeneratorType { @@ -59,7 +48,7 @@ public interface ProviderType extends GeneratorTyp ProviderType ITEM_TAGS = registerTag("tags/item", Registries.ITEM, c -> new RegistrateItemTagsProvider(c.parent(), c.type(), "items", c.output(), c.provider(), c.get(BLOCK_TAGS).contentsGetter())); ProviderType> FLUID_TAGS = registerIntrinsicTag("tags/fluid", "fluids", Registries.FLUID, fluid -> fluid.builtInRegistryHolder().key()); ProviderType>> ENTITY_TAGS = registerIntrinsicTag("tags/entity", "entity_types", Registries.ENTITY_TYPE, entityType -> entityType.builtInRegistryHolder().key()); - ProviderType GENERIC_SERVER = registerProvider("registrate_generic_server_provider", c -> new RegistrateGenericProvider(c.parent(), c.event(), LogicalSide.SERVER, c.type())); + ProviderType GENERIC_SERVER = registerProvider("registrate_generic_server_provider", c -> new RegistrateGenericProvider(c.parent(), c.event(), LogicalSide.SERVER, c.type())); // CLIENT DATA ProviderType MODEL = registerClientProvider("model", () -> c -> new RegistrateModelProvider(c.parent(), c.output())); @@ -79,14 +68,14 @@ record Context(ProviderType type, AbstractRegis public R get(ProviderType other) { return (R) existing().get(other); } + } T create(Context context); default GeneratorType createGenerator(String type) { return new GeneratorType<>() { - - public String toString() { + public String toString(){ return type; } }; @@ -104,6 +93,7 @@ default T create(Context context) { default ProviderType asProvider() { return this; } + } @Nonnull @@ -148,4 +138,5 @@ static ProviderType> registerDynamicTag(Strin static T create(ProviderType type, AbstractRegistrate parent, GatherDataEvent event, Map, RegistrateProvider> existing, CompletableFuture provider) { return type.create(new Context<>(type, parent, event, existing, event.getGenerator().getPackOutput(), provider)); } + } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java index a161778..6bd9b3d 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java @@ -1,6 +1,11 @@ package com.modularmc.registrate.providers; +import com.google.common.collect.Lists; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.modularmc.registrate.AbstractRegistrate; +import lombok.Getter; +import lombok.extern.log4j.Log4j2; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; @@ -10,29 +15,22 @@ import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.Identifier; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.conditions.ICondition; import net.neoforged.neoforge.common.conditions.WithConditions; -import com.google.common.collect.Lists; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import lombok.Getter; -import lombok.extern.log4j.Log4j2; - +import org.jspecify.annotations.Nullable; import java.nio.file.Path; import java.util.HashSet; import java.util.List; import java.util.Objects; -import java.util.Optional; import java.util.Set; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; -import javax.annotation.Nullable; - @Log4j2 public class RegistrateAdvancementProvider implements RegistrateProvider, Consumer { diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java index d37e0e4..3cb2524 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java @@ -1,47 +1,45 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; - import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.data.DataMapProvider; - import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; public class RegistrateDataMapProvider extends DataMapProvider implements RegistrateProvider { - private final AbstractRegistrate parent; - - @Nullable - private HolderLookup.Provider provider; - - protected RegistrateDataMapProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture pvd) { - super(output, pvd); - this.parent = parent; - } - - @Override - public LogicalSide getSide() { - return LogicalSide.SERVER; - } - - /** - * Generate data map entries. - * - * @param provider - */ - @Override - protected void gather(HolderLookup.Provider provider) { - this.provider = provider; - parent.genData(ProviderType.DATA_MAP, this); - this.provider = null; - } - - public HolderLookup.Provider getProvider() { - if (provider == null) throw new IllegalStateException("Holder Lookup Provider is not available now"); - return provider; - } + private final AbstractRegistrate parent; + + private HolderLookup.@Nullable Provider provider; + + protected RegistrateDataMapProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture pvd) { + super(output, pvd); + this.parent = parent; + } + + @Override + public LogicalSide getSide() { + return LogicalSide.SERVER; + } + + /** + * Generate data map entries. + * + * @param provider + */ + @Override + protected void gather(HolderLookup.Provider provider) { + this.provider = provider; + parent.genData(ProviderType.DATA_MAP, this); + this.provider = null; + } + + public HolderLookup.Provider getProvider() { + if (provider == null) throw new IllegalStateException("Holder Lookup Provider is not available now"); + return provider; + } + } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java index 727aca5..a3f3d54 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java @@ -1,9 +1,11 @@ package com.modularmc.registrate.providers; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.Lists; import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.DebugMarkers; -import com.modularmc.registrate.util.nullness.NonnullType; - +import lombok.extern.log4j.Log4j2; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.data.CachedOutput; @@ -11,11 +13,7 @@ import net.minecraft.resources.ResourceKey; import net.neoforged.neoforge.data.event.GatherDataEvent; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import com.google.common.collect.Lists; -import lombok.extern.log4j.Log4j2; - +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -24,8 +22,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -import javax.annotation.Nullable; - @Log4j2 public class RegistrateDataProvider implements DataProvider { @@ -51,31 +47,31 @@ public RegistrateDataProvider(AbstractRegistrate parent, String modid, Gather // For now, generate everything together /* - * EnumSet sides = EnumSet.noneOf(LogicalSide.class); - * if (event.includeServer()) { - * sides.add(LogicalSide.SERVER); - * } - * if (event.includeClient()) { - * sides.add(LogicalSide.CLIENT); - * } - */ - - // log.debug(DebugMarkers.DATA, "Gathering providers for sides: {}", sides); + EnumSet sides = EnumSet.noneOf(LogicalSide.class); + if (event.includeServer()) { + sides.add(LogicalSide.SERVER); + } + if (event.includeClient()) { + sides.add(LogicalSide.CLIENT); + } + */ + + //log.debug(DebugMarkers.DATA, "Gathering providers for sides: {}", sides); log.debug(DebugMarkers.DATA, "Gathering providers"); Map, RegistrateProvider> known = new HashMap<>(); - for (DataProviderInitializer.Sorted sorted : parent.getDataGenInitializer().getSortedProviders()) { + for (DataProviderInitializer.Sorted sorted :parent.getDataGenInitializer().getSortedProviders()) { ProviderType type = sorted.type(); var lookup = registriesLookup; if (sorted.parent() != null) lookup = ((RegistrateLookupFillerProvider) known.get(sorted.parent())).getFilledProvider(); RegistrateProvider prov = ProviderType.create(type, parent, event, known, lookup); if (prov instanceof RegistrateTagsProvider tagsProvider && TAG_TYPES.get(tagsProvider.registry()) != type) { - throw new IllegalStateException("Tag providers must be registered through ProviderType::registerTag"); + throw new IllegalStateException("Tag providers must be registered through ProviderType::registerTag"); } known.put(type, prov); // if (sides.contains(prov.getSide())) { - log.debug(DebugMarkers.DATA, "Adding provider for type: {}", sorted.id()); - subProviders.put(type, prov); - // } + log.debug(DebugMarkers.DATA, "Adding provider for type: {}", sorted.id()); + subProviders.put(type, prov); + //} } } @@ -84,10 +80,10 @@ public CompletableFuture run(CachedOutput cache) { return registriesLookup.thenCompose(provider -> { var list = Lists.>newArrayList(); - for (Map.Entry<@NonnullType ProviderType, RegistrateProvider> e : subProviders.entrySet()) { + for (Map.Entry, RegistrateProvider> e : subProviders.entrySet()) { log.debug(DebugMarkers.DATA, "Generating data for type: {}", getTypeName(e.getKey())); list.add(e.getValue().run(cache)); - } ; + }; return CompletableFuture.allOf(list.toArray(CompletableFuture[]::new)); }); @@ -108,4 +104,5 @@ public

            Optional

            getSubProvider(GeneratorType

            type) { public void putSubProvider(GeneratorType type, T gen) { subGenerators.put(type, gen); } + } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java index 66953c9..455b047 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java @@ -1,7 +1,6 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; - import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.data.registries.RegistryPatchGenerator; @@ -13,17 +12,18 @@ public class RegistrateDatapackProvider extends DatapackBuiltinEntriesProvider implements RegistrateLookupFillerProvider { - public RegistrateDatapackProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture provider) { - super(output, RegistryPatchGenerator.createLookup(provider, parent.getDataGenInitializer().getDatapackRegistryProviders()), Set.of(parent.getModid())); - } + public RegistrateDatapackProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture provider) { + super(output, RegistryPatchGenerator.createLookup(provider, parent.getDataGenInitializer().getDatapackRegistryProviders()), Set.of(parent.getModid())); + } + + @Override + public CompletableFuture getFilledProvider() { + return getRegistryProvider(); + } - @Override - public CompletableFuture getFilledProvider() { - return getRegistryProvider(); - } + @Override + public LogicalSide getSide() { + return LogicalSide.SERVER; + } - @Override - public LogicalSide getSide() { - return LogicalSide.SERVER; - } } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java index 87e2721..ecc7044 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java @@ -1,14 +1,12 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; - import net.minecraft.core.HolderLookup; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.data.event.GatherDataEvent; - import org.apache.commons.compress.utils.Lists; import org.jetbrains.annotations.ApiStatus; @@ -16,8 +14,8 @@ import java.util.Locale; import java.util.concurrent.CompletableFuture; -public final class RegistrateGenericProvider implements RegistrateProvider { - +public final class RegistrateGenericProvider implements RegistrateProvider +{ private final AbstractRegistrate registrate; private final PackOutput output; private final CompletableFuture registries; @@ -26,7 +24,8 @@ public final class RegistrateGenericProvider implements RegistrateProvider { private final List generators = Lists.newArrayList(); @ApiStatus.Internal - RegistrateGenericProvider(AbstractRegistrate registrate, GatherDataEvent event, LogicalSide side, ProviderType providerType) { + RegistrateGenericProvider(AbstractRegistrate registrate, GatherDataEvent event, LogicalSide side, ProviderType providerType) + { this.registrate = registrate; this.side = side; this.providerType = providerType; @@ -35,18 +34,21 @@ public final class RegistrateGenericProvider implements RegistrateProvider { registries = event.getLookupProvider(); } - public RegistrateGenericProvider add(Generator generator) { + public RegistrateGenericProvider add(Generator generator) + { generators.add(generator); return this; } @Override - public LogicalSide getSide() { + public LogicalSide getSide() + { return side; } @Override - public CompletableFuture run(CachedOutput cache) { + public CompletableFuture run(CachedOutput cache) + { generators.clear(); var data = new GeneratorData(output, registries); registrate.genData(providerType, this); @@ -54,19 +56,22 @@ public CompletableFuture run(CachedOutput cache) { .stream() .map(generator -> generator.generate(data)) .map(provider -> provider.run(cache)) - .toArray(CompletableFuture[]::new)); + .toArray(CompletableFuture[]::new) + ); } @Override - public String getName() { + public String getName() + { return "generic_%s_provider".formatted(side.name().toLowerCase(Locale.ROOT)); } - public record GeneratorData(PackOutput output, CompletableFuture registries) {} + public record GeneratorData(PackOutput output, CompletableFuture registries) { + } @FunctionalInterface - public interface Generator { - + public interface Generator + { DataProvider generate(GeneratorData data); } } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java index 63bcdab..a2ebff1 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java @@ -1,7 +1,6 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; - import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java index 4ad73c0..0d5e5cf 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java @@ -2,8 +2,6 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.modularmc.registrate.util.nullness.NonnullType; - import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; @@ -18,17 +16,16 @@ import net.minecraft.world.level.block.Block; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.data.LanguageProvider; - import org.apache.commons.lang3.StringUtils; +import org.jspecify.annotations.Nullable; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; -import javax.annotation.Nullable; - public class RegistrateLangProvider extends LanguageProvider implements RegistrateProvider { private static class AccessibleLanguageProvider extends LanguageProvider { @@ -77,9 +74,9 @@ public static final String toEnglishName(String internalName) { .collect(Collectors.joining(" ")); } - @SuppressWarnings({ "unchecked", "ConstantConditions" }) + @SuppressWarnings({"unchecked", "ConstantConditions"}) public String getAutomaticName(NonNullSupplier sup, ResourceKey> registry) { - return toEnglishName(((Registry>) BuiltInRegistries.REGISTRY).getValue(registry.location()).getKey(sup.get()).getPath()); + return toEnglishName(((Registry>) BuiltInRegistries.REGISTRY).getValue(registry.identifier()).getKey(sup.get()).getPath()); } public void addBlock(NonNullSupplier block) { @@ -100,7 +97,7 @@ public void addItem(NonNullSupplier item) { addItem(item, getAutomaticName(item, Registries.ITEM)); } - public void addItemWithTooltip(NonNullSupplier block, String name, List<@NonnullType String> tooltip) { + public void addItemWithTooltip(NonNullSupplier block, String name, List tooltip) { addItem(block, name); addTooltip(block, tooltip); } @@ -109,7 +106,7 @@ public void addTooltip(NonNullSupplier item, String tooltip) add(item.get().asItem().getDescriptionId() + ".desc", tooltip); } - public void addTooltip(NonNullSupplier item, List<@NonnullType String> tooltip) { + public void addTooltip(NonNullSupplier item, List tooltip) { for (int i = 0; i < tooltip.size(); i++) { add(item.get().asItem().getDescriptionId() + ".desc." + i, tooltip.get(i)); } @@ -132,14 +129,14 @@ public void addEntityType(NonNullSupplier> entity) { private static final String NORMAL_CHARS = /* lowercase */ "abcdefghijklmn\u00F1opqrstuvwxyz" + - /* uppercase */ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + - /* numbers */ "0123456789" + - /* special */ "_,;.?!/\\'"; + /* uppercase */ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + /* numbers */ "0123456789" + + /* special */ "()[]{}<>\u25C1\u25B7_,;.?!/\\'"; private static final String UPSIDE_DOWN_CHARS = /* lowercase */ "\u0250q\u0254p\u01DD\u025Fb\u0265\u0131\u0638\u029E\u05DF\u026Fuuodb\u0279s\u0287n\u028C\u028Dx\u028Ez" + - /* uppercase */ "\u2C6F\u15FA\u0186\u15E1\u018E\u2132\u2141HI\u017F\u029E\uA780WNO\u0500\u1F49\u1D1AS\u27D8\u2229\u039BMX\u028EZ" + - /* numbers */ "0\u0196\u1105\u0190\u3123\u03DB9\u312586" + - /* special */ "\u203E'\u061B\u02D9\u00BF\u00A1/\\,"; + /* uppercase */ "\u2C6F\u15FA\u0186\u15E1\u018E\u2132\u2141HI\u017F\u029E\uA780WNO\u0500\u1F49\u1D1AS\u27D8\u2229\u039BMX\u028EZ" + + /* numbers */ "0\u0196\u1105\u0190\u3123\u03DB9\u312586" + + /* special */ ")(][}{><\u25B7\u25C1\u203E'\u061B\u02D9\u00BF\u00A1\\/,"; static { if (NORMAL_CHARS.length() != UPSIDE_DOWN_CHARS.length()) { @@ -148,20 +145,29 @@ public void addEntityType(NonNullSupplier> entity) { } private String toUpsideDown(String normal) { - char[] ud = new char[normal.length()]; + int formatIndex = 1; + ArrayList ud = new ArrayList<>(); for (int i = 0; i < normal.length(); i++) { char c = normal.charAt(i); if (c == '%') { String fmtArg = ""; - while (Character.isDigit(c) || c == '%' || c == '$' || c == 's' || c == 'd') { // TODO this is a bit - // lazy + while (Character.isDigit(c) || c == '%' || c == '$' || c == 's' || c == 'd') { // TODO this is a bit lazy + if (fmtArg.equals("%") && c == 's') { + fmtArg = "%" + formatIndex + "$s"; + formatIndex++; + i++; + break; + } + else if (c == '$') { + formatIndex++; + } fmtArg += c; i++; c = i == normal.length() ? 0 : normal.charAt(i); } i--; - for (int j = 0; j < fmtArg.length(); j++) { - ud[normal.length() - 1 - i + j] = fmtArg.charAt(j); + for (int j = fmtArg.length() - 1; j >= 0; j--) { + ud.addFirst(fmtArg.charAt(j)); } continue; } @@ -169,9 +175,13 @@ private String toUpsideDown(String normal) { if (lookup >= 0) { c = UPSIDE_DOWN_CHARS.charAt(lookup); } - ud[normal.length() - 1 - i] = c; + ud.addFirst(c); + } + StringBuilder builder = new StringBuilder(ud.size()); + for (Character ch : ud) { + builder.append(ch); } - return new String(ud); + return builder.toString(); } @Override diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java index b62835f..70850c2 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java @@ -7,4 +7,5 @@ public interface RegistrateLookupFillerProvider extends RegistrateProvider { CompletableFuture getFilledProvider(); + } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java index 8cb40e9..967a3dc 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java @@ -4,6 +4,6 @@ import net.neoforged.fml.LogicalSide; public interface RegistrateProvider extends DataProvider { - + LogicalSide getSide(); } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java b/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java index e05284c..048d97a 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java @@ -4,10 +4,10 @@ import net.minecraft.resources.Identifier; public interface RegistrateProviderDelegate extends DataProvider { - + String getName(); - + Identifier getId(); - + T getEntry(); } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java index 815dbbe..2d2362c 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java @@ -1,7 +1,6 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; - import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.data.PackOutput; @@ -21,22 +20,19 @@ public interface RegistrateTagsProvider extends RegistrateLookupFillerProvide CompletableFuture> contentsGetter(); - ResourceKey> registry(); + ResourceKey> registry(); TagBuilder rawBuilder(TagKey key); interface Key extends RegistrateTagsProvider { - TagAppender, T> tag(TagKey key); } interface Intrinsic extends RegistrateTagsProvider { - TagAppender tag(TagKey key); } class Impl extends KeyTagProvider implements RegistrateTagsProvider.Key { - private final AbstractRegistrate owner; private final ProviderType> type; private final String name; @@ -80,13 +76,13 @@ public CompletableFuture getFilledProvider() { } @Override - public ResourceKey> registry() { - return registryKey; - } - } + public ResourceKey> registry() { + return registryKey; + } - class IntrinsicImpl extends IntrinsicHolderTagsProvider implements RegistrateTagsProvider.Intrinsic { + } + class IntrinsicImpl extends IntrinsicHolderTagsProvider implements RegistrateTagsProvider.Intrinsic { private final AbstractRegistrate owner; private final ProviderType> type; private final String name; @@ -129,9 +125,9 @@ public CompletableFuture getFilledProvider() { return createContentsProvider(); } - @Override - public ResourceKey> registry() { - return registryKey; - } + @Override + public ResourceKey> registry() { + return registryKey; + } } } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java index bb35608..4511022 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java @@ -2,7 +2,6 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.ProviderType; - import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelOutput; import net.minecraft.client.data.models.MultiVariant; @@ -16,8 +15,10 @@ import net.minecraft.client.data.models.model.TextureMapping; import net.minecraft.client.data.models.model.TextureSlot; import net.minecraft.client.data.models.model.TexturedModel; -import net.minecraft.client.renderer.block.model.BlockModelDefinition; -import net.minecraft.client.renderer.block.model.VariantMutator; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.renderer.block.dispatch.BlockStateModelDispatcher; +import net.minecraft.client.renderer.block.dispatch.VariantMutator; +import net.minecraft.client.resources.model.sprite.Material; import net.minecraft.core.Direction; import net.minecraft.resources.Identifier; import net.minecraft.world.level.block.Block; @@ -41,7 +42,6 @@ import net.minecraft.world.level.block.state.properties.AttachFace; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.neoforged.fml.util.ObfuscationReflectionHelper; -import net.neoforged.neoforge.client.model.generators.template.ExtendedModelTemplate; import net.neoforged.neoforge.client.model.generators.template.ExtendedModelTemplateBuilder; import java.util.HashMap; @@ -52,7 +52,7 @@ public class RegistrateBlockModelGenerator extends BlockModelGenerators { private final AbstractRegistrate parent; - public final Map seenBlockstates = new HashMap<>(); + public final Map seenBlockstates = new HashMap<>(); public RegistrateBlockModelGenerator(AbstractRegistrate parent, Consumer known, ItemModelOutput item, BiConsumer model) { super(known, item, model); @@ -68,6 +68,7 @@ public void run() { parent.genData(ProviderType.BLOCKSTATE, this); } + public void create(Block block, Identifier model) { this.blockStateOutput.accept(createSimpleBlock(block, plainVariant(model))); } @@ -80,6 +81,14 @@ public Identifier modLoc(String id) { return Identifier.fromNamespaceAndPath(parent.getModid(), id); } + public Material mcBlockTexture(String path) { + return new Material(mcLoc("block/" + path)); + } + + public Material modBlockTexture(String path) { + return new Material(modLoc("block/" + path)); + } + public RegistrateLegacyBlockModelBuilder withBuilder(ExtendedModelTemplateBuilder template, TextureMapping texture) { return new RegistrateLegacyBlockModelBuilder(modelOutput, template, texture); } @@ -104,22 +113,18 @@ public RegistrateLegacyBlockModelBuilder withParent(TexturedModel model) { return withBuilder(ExtendedModelTemplateBuilder.of(model.getTemplate()), model.getMapping()); } - private static ExtendedModelTemplate withRenderType(ModelTemplate template, Identifier renderType) { - return ExtendedModelTemplateBuilder.of(template).renderType(renderType).build(); - } - - private static TextureMapping sideBottomTopTextures(Identifier side, Identifier bottom, Identifier top) { + private static TextureMapping sideBottomTopTextures(Material side, Material bottom, Material top) { return new TextureMapping() .put(TextureSlot.SIDE, side) .put(TextureSlot.BOTTOM, bottom) .put(TextureSlot.TOP, top); } - public Identifier blockTexture(Block block) { + public Material blockTexture(Block block) { return TextureMapping.getBlockTexture(block); } - public Identifier blockTexture(Block block, String suffix) { + public Material blockTexture(Block block, String suffix) { return TextureMapping.getBlockTexture(block, suffix); } @@ -132,48 +137,22 @@ public void generate(Block block, TexturedModel.Provider texture) { } public void generateAxisBlock(RotatedPillarBlock block) { - generateAxisBlock(block, blockTexture(block)); + generateAxisBlock(block, blockTexture(block, "_side"), blockTexture(block, "_end")); } public void generateLogBlock(RotatedPillarBlock block) { - Identifier texture = blockTexture(block); - generateAxisBlock(block, blockTexture(block), texture.withSuffix("_top")); + generateAxisBlock(block, blockTexture(block), blockTexture(block, "_top")); } - public void generateAxisBlock(RotatedPillarBlock block, Identifier baseName) { - generateAxisBlock(block, baseName.withSuffix("_side"), baseName.withSuffix("_end")); - } - - public void generateAxisBlock(RotatedPillarBlock block, Identifier side, Identifier end) { + public void generateAxisBlock(RotatedPillarBlock block, Material side, Material end) { generateAxisBlockInternal(block, side, end, ModelTemplates.CUBE_COLUMN, ModelTemplates.CUBE_COLUMN_HORIZONTAL); } - public void generateAxisBlockWithRenderType(RotatedPillarBlock block, Identifier renderType) { - generateAxisBlockWithRenderType(block, blockTexture(block), renderType); - } - - public void generateLogBlockWithRenderType(RotatedPillarBlock block, Identifier renderType) { - Identifier texture = blockTexture(block); - generateAxisBlockWithRenderType(block, blockTexture(block), texture.withSuffix("_top"), renderType); - } - - public void generateAxisBlockWithRenderType(RotatedPillarBlock block, Identifier baseName, Identifier renderType) { - generateAxisBlockWithRenderType(block, baseName.withSuffix("_side"), baseName.withSuffix("_end"), renderType); - } - - public void generateAxisBlockWithRenderType(RotatedPillarBlock block, Identifier side, Identifier end, Identifier renderType) { - generateAxisBlockInternal( - block, - side, - end, - withRenderType(ModelTemplates.CUBE_COLUMN, renderType), - withRenderType(ModelTemplates.CUBE_COLUMN_HORIZONTAL, renderType)); - } - - private void generateAxisBlockInternal(RotatedPillarBlock block, Identifier side, Identifier end, ModelTemplate cubeColumn, ModelTemplate cubeColumnHorizontal) { + private void generateAxisBlockInternal(RotatedPillarBlock block, Material side, Material end, ModelTemplate cubeColumn, ModelTemplate cubeColumnHorizontal) { generateAxisBlock(block, plainVariant(cubeColumn.create(block, TextureMapping.column(side, end), modelOutput)), - plainVariant(cubeColumnHorizontal.create(block, TextureMapping.column(side, end), modelOutput))); + plainVariant(cubeColumnHorizontal.create(block, TextureMapping.column(side, end), modelOutput)) + ); } public void generateAxisBlock(RotatedPillarBlock block, MultiVariant vertical, MultiVariant horizontal) { @@ -182,7 +161,7 @@ public void generateAxisBlock(RotatedPillarBlock block, MultiVariant vertical, M private static final int DEFAULT_ANGLE_OFFSET = 180; - public void generateHorizontalBlock(Block block, Identifier side, Identifier front, Identifier top) { + public void generateHorizontalBlock(Block block, Material side, Material front, Material top) { TextureMapping mapping = new TextureMapping().put(TextureSlot.SIDE, side).put(TextureSlot.FRONT, front).put(TextureSlot.TOP, top); generateHorizontalBlock(block, plainVariant(ModelTemplates.CUBE_ORIENTABLE.create(block, mapping, modelOutput))); } @@ -250,54 +229,28 @@ public void generateDirectionalBlock(Block block, MultiVariant model, int angleO blockStateOutput.accept(MultiVariantGenerator.dispatch(block, model).with(rotationFacing(angleOffsetY))); } - public void generateStairsBlock(StairBlock block, Identifier texture) { + public void generateStairsBlock(StairBlock block, Material texture) { generateStairsBlock(block, texture, texture, texture); } - public void generateStairsBlock(StairBlock block, String name, Identifier texture) { + public void generateStairsBlock(StairBlock block, String name, Material texture) { generateStairsBlock(block, name, texture, texture, texture); } - public void generateStairsBlock(StairBlock block, Identifier side, Identifier bottom, Identifier top) { + public void generateStairsBlock(StairBlock block, Material side, Material bottom, Material top) { TextureMapping textures = sideBottomTopTextures(side, bottom, top); blockStateOutput.accept(createStairs(block, plainVariant(ModelTemplates.STAIRS_INNER.create(block, textures, modelOutput)), plainVariant(ModelTemplates.STAIRS_STRAIGHT.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.STAIRS_OUTER.create(block, textures, modelOutput)))); + plainVariant(ModelTemplates.STAIRS_OUTER.create(block, textures, modelOutput)) + )); } - public void generateStairsBlock(StairBlock block, String name, Identifier side, Identifier bottom, Identifier top) { + public void generateStairsBlock(StairBlock block, String name, Material side, Material bottom, Material top) { generateStairsBlockInternal(block, modLoc(name + "_stairs"), side, bottom, top, ModelTemplates.STAIRS_STRAIGHT, ModelTemplates.STAIRS_INNER, ModelTemplates.STAIRS_OUTER); } - public void generateStairsBlockWithRenderType(StairBlock block, Identifier texture, Identifier renderType) { - generateStairsBlockWithRenderType(block, texture, texture, texture, renderType); - } - - public void generateStairsBlockWithRenderType(StairBlock block, String name, Identifier texture, Identifier renderType) { - generateStairsBlockWithRenderType(block, name, texture, texture, texture, renderType); - } - - public void generateStairsBlockWithRenderType(StairBlock block, Identifier side, Identifier bottom, Identifier top, Identifier renderType) { - TextureMapping textures = sideBottomTopTextures(side, bottom, top); - blockStateOutput.accept(createStairs(block, - plainVariant(withRenderType(ModelTemplates.STAIRS_INNER, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(ModelTemplates.STAIRS_STRAIGHT, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(ModelTemplates.STAIRS_OUTER, renderType).create(block, textures, modelOutput)))); - } - - public void generateStairsBlockWithRenderType(StairBlock block, String name, Identifier side, Identifier bottom, Identifier top, Identifier renderType) { - generateStairsBlockInternalWithRenderType(block, modLoc(name + "_stairs"), side, bottom, top, renderType); - } - - private void generateStairsBlockInternalWithRenderType(StairBlock block, Identifier baseName, Identifier side, Identifier bottom, Identifier top, Identifier renderType) { - generateStairsBlockInternal(block, baseName, side, bottom, top, - withRenderType(ModelTemplates.STAIRS_STRAIGHT, renderType), - withRenderType(ModelTemplates.STAIRS_INNER, renderType), - withRenderType(ModelTemplates.STAIRS_OUTER, renderType)); - } - - private void generateStairsBlockInternal(StairBlock block, Identifier baseName, Identifier side, Identifier bottom, Identifier top, ModelTemplate straightTemplate, ModelTemplate innerTemplate, ModelTemplate outerTemplate) { + private void generateStairsBlockInternal(StairBlock block, Identifier baseName, Material side, Material bottom, Material top, ModelTemplate straightTemplate, ModelTemplate innerTemplate, ModelTemplate outerTemplate) { Identifier modelLocation = baseName.withPrefix("block/"); TextureMapping textures = sideBottomTopTextures(side, bottom, top); MultiVariant straightVariant = plainVariant(straightTemplate.create(modelLocation, textures, modelOutput)); @@ -310,11 +263,11 @@ public void generateStairsBlock(StairBlock block, MultiVariant stairs, MultiVari blockStateOutput.accept(createStairs(block, stairsInner, stairs, stairsOuter)); } - public void generateSlabBlock(SlabBlock block, MultiVariant doubleSlab, Identifier texture) { + public void generateSlabBlock(SlabBlock block, MultiVariant doubleSlab, Material texture) { generateSlabBlock(block, doubleSlab, texture, texture, texture); } - public void generateSlabBlock(SlabBlock block, MultiVariant doubleSlab, Identifier side, Identifier bottom, Identifier top) { + public void generateSlabBlock(SlabBlock block, MultiVariant doubleSlab, Material side, Material bottom, Material top) { TextureMapping textures = sideBottomTopTextures(side, bottom, top); MultiVariant slabTop = plainVariant(ModelTemplates.SLAB_TOP.create(block, textures, modelOutput)); MultiVariant slabBottom = plainVariant(ModelTemplates.SLAB_BOTTOM.create(block, textures, modelOutput)); @@ -325,7 +278,7 @@ public void generateSlabBlock(SlabBlock block, MultiVariant bottom, MultiVariant blockStateOutput.accept(createSlab(block, bottom, top, doubleslab)); } - public void generateButtonBlock(ButtonBlock block, Identifier texture) { + public void generateButtonBlock(ButtonBlock block, Material texture) { TextureMapping textures = TextureMapping.defaultTexture(texture); MultiVariant button = plainVariant(ModelTemplates.BUTTON.create(block, textures, modelOutput)); MultiVariant buttonPressed = plainVariant(ModelTemplates.BUTTON_PRESSED.create(block, textures, modelOutput)); @@ -336,7 +289,7 @@ public void generateButtonBlock(ButtonBlock block, MultiVariant button, MultiVar blockStateOutput.accept(createButton(block, button, buttonPressed)); } - public void generatePressurePlateBlock(PressurePlateBlock block, Identifier texture) { + public void generatePressurePlateBlock(PressurePlateBlock block, Material texture) { TextureMapping textures = TextureMapping.defaultTexture(texture); MultiVariant pressurePlate = plainVariant(ModelTemplates.PRESSURE_PLATE_UP.create(block, textures, modelOutput)); MultiVariant pressurePlateDown = plainVariant(ModelTemplates.PRESSURE_PLATE_DOWN.create(block, textures, modelOutput)); @@ -347,7 +300,7 @@ public void generatePressurePlateBlock(PressurePlateBlock block, MultiVariant pr blockStateOutput.accept(createPressurePlate(block, pressurePlate, pressurePlateDown)); } - public void generateSignBlock(StandingSignBlock signBlock, WallSignBlock wallSignBlock, Identifier texture) { + public void generateSignBlock(StandingSignBlock signBlock, WallSignBlock wallSignBlock, Material texture) { MultiVariant sign = plainVariant(ModelTemplates.PARTICLE_ONLY.create(signBlock, TextureMapping.particle(texture), modelOutput)); generateSignBlock(signBlock, wallSignBlock, sign); } @@ -357,7 +310,7 @@ public void generateSignBlock(StandingSignBlock signBlock, WallSignBlock wallSig blockStateOutput.accept(createSimpleBlock(wallSignBlock, sign)); } - public void generateHangingSignBlock(CeilingHangingSignBlock hangingSignBlock, WallHangingSignBlock wallHangingSignBlock, Identifier texture) { + public void generateHangingSignBlock(CeilingHangingSignBlock hangingSignBlock, WallHangingSignBlock wallHangingSignBlock, Material texture) { MultiVariant hangingSign = plainVariant(ModelTemplates.PARTICLE_ONLY.create(hangingSignBlock, TextureMapping.particle(texture), modelOutput)); generateHangingSignBlock(hangingSignBlock, wallHangingSignBlock, hangingSign); } @@ -388,67 +341,45 @@ public void generateFourWayMultipart(MultiPartGenerator builder, MultiVariant si blockStateOutput.accept(builder); } - public void generateFenceBlock(FenceBlock block, Identifier texture) { + public void generateFenceBlock(FenceBlock block, Material texture) { generateFenceBlockInternal(block, texture, ModelTemplates.FENCE_POST, ModelTemplates.FENCE_SIDE); } - public void generateFenceBlock(FenceBlock block, String name, Identifier texture) { + public void generateFenceBlock(FenceBlock block, String name, Material texture) { generateFenceBlockInternal(block, name, texture, ModelTemplates.FENCE_POST, ModelTemplates.FENCE_SIDE); } - public void generateFenceBlockWithRenderType(FenceBlock block, Identifier texture, Identifier renderType) { - generateFenceBlockInternal(block, texture, withRenderType(ModelTemplates.FENCE_POST, renderType), withRenderType(ModelTemplates.FENCE_SIDE, renderType)); - } - - public void generateFenceBlockWithRenderType(FenceBlock block, String name, Identifier texture, Identifier renderType) { - generateFenceBlockInternal(block, name, texture, withRenderType(ModelTemplates.FENCE_POST, renderType), withRenderType(ModelTemplates.FENCE_SIDE, renderType)); - } - - private void generateFenceBlockInternal(FenceBlock block, Identifier texture, ModelTemplate fencePostTemplate, ModelTemplate fenceSideTemplate) { + private void generateFenceBlockInternal(FenceBlock block, Material texture, ModelTemplate fencePostTemplate, ModelTemplate fenceSideTemplate) { TextureMapping textures = TextureMapping.defaultTexture(texture); generateFourWayBlock(block, plainVariant(fencePostTemplate.create(block, textures, modelOutput)), - plainVariant(fenceSideTemplate.create(block, textures, modelOutput))); + plainVariant(fenceSideTemplate.create(block, textures, modelOutput)) + ); } - private void generateFenceBlockInternal(FenceBlock block, String name, Identifier texture, ModelTemplate fencePostTemplate, ModelTemplate fenceSideTemplate) { + private void generateFenceBlockInternal(FenceBlock block, String name, Material texture, ModelTemplate fencePostTemplate, ModelTemplate fenceSideTemplate) { TextureMapping textures = TextureMapping.defaultTexture(texture); generateFourWayBlock(block, plainVariant(fencePostTemplate.create(modLoc("block/" + name + "_fence_post"), textures, modelOutput)), - plainVariant(fenceSideTemplate.create(modLoc("block/" + name + "_fence_side"), textures, modelOutput))); + plainVariant(fenceSideTemplate.create(modLoc("block/" + name + "_fence_side"), textures, modelOutput)) + ); } - public void generateFenceGateBlock(FenceGateBlock block, Identifier texture) { + public void generateFenceGateBlock(FenceGateBlock block, Material texture) { TextureMapping textures = TextureMapping.defaultTexture(texture); generateFenceGateBlock(block, plainVariant(ModelTemplates.FENCE_GATE_CLOSED.create(block, textures, modelOutput)), plainVariant(ModelTemplates.FENCE_GATE_OPEN.create(block, textures, modelOutput)), plainVariant(ModelTemplates.FENCE_GATE_WALL_CLOSED.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.FENCE_GATE_WALL_OPEN.create(block, textures, modelOutput))); + plainVariant(ModelTemplates.FENCE_GATE_WALL_OPEN.create(block, textures, modelOutput)) + ); } - public void generateFenceGateBlock(FenceGateBlock block, String name, Identifier texture) { + public void generateFenceGateBlock(FenceGateBlock block, String name, Material texture) { generateFenceGateBlockInternal(block, modLoc(name + "_fence_gate"), texture, ModelTemplates.FENCE_GATE_CLOSED, ModelTemplates.FENCE_GATE_OPEN, ModelTemplates.FENCE_GATE_WALL_CLOSED, ModelTemplates.FENCE_GATE_WALL_OPEN); } - public void generateFenceGateBlockWithRenderType(FenceGateBlock block, Identifier texture, Identifier renderType) { - TextureMapping textureMapping = TextureMapping.defaultTexture(texture); - generateFenceGateBlock(block, - plainVariant(withRenderType(ModelTemplates.FENCE_GATE_CLOSED, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.FENCE_GATE_OPEN, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.FENCE_GATE_WALL_CLOSED, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.FENCE_GATE_WALL_OPEN, renderType).create(block, textureMapping, modelOutput))); - } - - public void generateFenceGateBlockWithRenderType(FenceGateBlock block, String name, Identifier texture, Identifier renderType) { - generateFenceGateBlockInternal(block, modLoc(name + "_fence_gate"), texture, - withRenderType(ModelTemplates.FENCE_GATE_CLOSED, renderType), - withRenderType(ModelTemplates.FENCE_GATE_OPEN, renderType), - withRenderType(ModelTemplates.FENCE_GATE_WALL_CLOSED, renderType), - withRenderType(ModelTemplates.FENCE_GATE_WALL_OPEN, renderType)); - } - - private void generateFenceGateBlockInternal(FenceGateBlock block, Identifier baseName, Identifier texture, ModelTemplate closedTemplate, ModelTemplate openTemplate, ModelTemplate wallClosedTemplate, ModelTemplate wallOpenTemplate) { + private void generateFenceGateBlockInternal(FenceGateBlock block, Identifier baseName, Material texture, ModelTemplate closedTemplate, ModelTemplate openTemplate, ModelTemplate wallClosedTemplate, ModelTemplate wallOpenTemplate) { Identifier baseModel = baseName.withPrefix("block/"); TextureMapping textures = TextureMapping.defaultTexture(texture); MultiVariant gate = plainVariant(closedTemplate.create(baseModel, textures, modelOutput)); @@ -462,84 +393,51 @@ public void generateFenceGateBlock(FenceGateBlock block, MultiVariant gate, Mult blockStateOutput.accept(createFenceGate(block, gateOpen, gate, gateWallOpen, gateWall, true)); } - public void generateWallBlock(WallBlock block, Identifier texture) { + public void generateWallBlock(WallBlock block, Material texture) { TextureMapping textures = TextureMapping.singleSlot(TextureSlot.WALL, texture); blockStateOutput.accept(createWall(block, plainVariant(ModelTemplates.WALL_POST.create(block, textures, modelOutput)), plainVariant(ModelTemplates.WALL_LOW_SIDE.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.WALL_TALL_SIDE.create(block, textures, modelOutput)))); + plainVariant(ModelTemplates.WALL_TALL_SIDE.create(block, textures, modelOutput)) + )); } - public void generateWallBlock(WallBlock block, String name, Identifier texture) { + public void generateWallBlock(WallBlock block, String name, Material texture) { Identifier baseName = modLoc(name + "_wall"); generateWallBlockInternal(block, baseName, texture, ModelTemplates.WALL_POST, ModelTemplates.WALL_LOW_SIDE, ModelTemplates.WALL_TALL_SIDE); } - public void generateWallBlockWithRenderType(WallBlock block, Identifier texture, Identifier renderType) { - TextureMapping textureMapping = TextureMapping.singleSlot(TextureSlot.WALL, texture); - generateWallBlock(block, - plainVariant(withRenderType(ModelTemplates.WALL_POST, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.WALL_LOW_SIDE, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.WALL_TALL_SIDE, renderType).create(block, textureMapping, modelOutput))); - } - - public void generateWallBlockWithRenderType(WallBlock block, String name, Identifier texture, Identifier renderType) { - Identifier baseName = modLoc(name + "_wall"); - generateWallBlockInternal(block, baseName, texture, - withRenderType(ModelTemplates.WALL_POST, renderType), - withRenderType(ModelTemplates.WALL_LOW_SIDE, renderType), - withRenderType(ModelTemplates.WALL_TALL_SIDE, renderType)); - } - - private void generateWallBlockInternal(WallBlock block, Identifier baseName, Identifier texture, ModelTemplate postTemplate, ModelTemplate sideTemplate, ModelTemplate tallSideTemplate) { + private void generateWallBlockInternal(WallBlock block, Identifier baseName, Material texture, ModelTemplate postTemplate, ModelTemplate sideTemplate, ModelTemplate tallSideTemplate) { TextureMapping textures = TextureMapping.singleSlot(TextureSlot.WALL, texture); Identifier baseModel = baseName.withPrefix("block/"); generateWallBlock(block, plainVariant(postTemplate.create(baseModel.withSuffix("_post"), textures, modelOutput)), plainVariant(sideTemplate.create(baseModel.withSuffix("_side"), textures, modelOutput)), - plainVariant(tallSideTemplate.create(baseModel.withSuffix("_side_tall"), textures, modelOutput))); + plainVariant(tallSideTemplate.create(baseModel.withSuffix("_side_tall"), textures, modelOutput)) + ); } public void generateWallBlock(WallBlock block, MultiVariant post, MultiVariant side, MultiVariant sideTall) { blockStateOutput.accept(createWall(block, post, side, sideTall)); } - public void generatePaneBlock(IronBarsBlock block, Identifier pane, Identifier edge) { + public void generatePaneBlock(IronBarsBlock block, Material pane, Material edge) { TextureMapping textures = new TextureMapping().put(TextureSlot.PANE, pane).put(TextureSlot.EDGE, edge); generatePaneBlock(block, plainVariant(ModelTemplates.STAINED_GLASS_PANE_POST.create(block, textures, modelOutput)), plainVariant(ModelTemplates.STAINED_GLASS_PANE_SIDE.create(block, textures, modelOutput)), plainVariant(ModelTemplates.STAINED_GLASS_PANE_SIDE_ALT.create(block, textures, modelOutput)), plainVariant(ModelTemplates.STAINED_GLASS_PANE_NOSIDE.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT.create(block, textures, modelOutput))); + plainVariant(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT.create(block, textures, modelOutput)) + ); } - public void generatePaneBlock(IronBarsBlock block, String name, Identifier pane, Identifier edge) { + public void generatePaneBlock(IronBarsBlock block, String name, Material pane, Material edge) { Identifier baseName = modLoc(name + "_pane"); generatePaneBlockInternal(block, baseName, pane, edge, ModelTemplates.STAINED_GLASS_PANE_POST, ModelTemplates.STAINED_GLASS_PANE_SIDE, ModelTemplates.STAINED_GLASS_PANE_SIDE_ALT, ModelTemplates.STAINED_GLASS_PANE_NOSIDE, ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT); } - public void generatePaneBlockWithRenderType(IronBarsBlock block, Identifier pane, Identifier edge, Identifier renderType) { - TextureMapping textureMapping = new TextureMapping().put(TextureSlot.PANE, pane).put(TextureSlot.EDGE, edge); - generatePaneBlock(block, - plainVariant(withRenderType(ModelTemplates.STAINED_GLASS_PANE_POST, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.STAINED_GLASS_PANE_SIDE, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.STAINED_GLASS_PANE_SIDE_ALT, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.STAINED_GLASS_PANE_NOSIDE, renderType).create(block, textureMapping, modelOutput)), - plainVariant(withRenderType(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT, renderType).create(block, textureMapping, modelOutput))); - } - - public void generatePaneBlockWithRenderType(IronBarsBlock block, String name, Identifier pane, Identifier edge, Identifier renderType) { - Identifier baseName = modLoc(name + "_pane"); - generatePaneBlockInternal(block, baseName, pane, edge, - withRenderType(ModelTemplates.STAINED_GLASS_PANE_POST, renderType), - withRenderType(ModelTemplates.STAINED_GLASS_PANE_SIDE, renderType), - withRenderType(ModelTemplates.STAINED_GLASS_PANE_SIDE_ALT, renderType), - withRenderType(ModelTemplates.STAINED_GLASS_PANE_NOSIDE, renderType), - withRenderType(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT, renderType)); - } - - private void generatePaneBlockInternal(IronBarsBlock block, Identifier baseName, Identifier pane, Identifier edge, ModelTemplate postTemplate, ModelTemplate sideTemplate, ModelTemplate sideAltTemplate, ModelTemplate noSideTemplate, ModelTemplate noSideAltTemplate) { + private void generatePaneBlockInternal(IronBarsBlock block, Identifier baseName, Material pane, Material edge, ModelTemplate postTemplate, ModelTemplate sideTemplate, ModelTemplate sideAltTemplate, ModelTemplate noSideTemplate, ModelTemplate noSideAltTemplate) { Identifier baseModel = baseName.withPrefix("block/"); TextureMapping textures = new TextureMapping().put(TextureSlot.PANE, pane).put(TextureSlot.EDGE, edge); generatePaneBlock(block, @@ -547,7 +445,8 @@ private void generatePaneBlockInternal(IronBarsBlock block, Identifier baseName, plainVariant(sideTemplate.create(baseModel.withSuffix("_side"), textures, modelOutput)), plainVariant(sideAltTemplate.create(baseModel.withSuffix("_side_alt"), textures, modelOutput)), plainVariant(noSideTemplate.create(baseModel.withSuffix("_noside"), textures, modelOutput)), - plainVariant(noSideAltTemplate.create(baseModel.withSuffix("_noside_alt"), textures, modelOutput))); + plainVariant(noSideAltTemplate.create(baseModel.withSuffix("_noside_alt"), textures, modelOutput)) + ); } public void generatePaneBlock(IronBarsBlock block, MultiVariant post, MultiVariant side, MultiVariant sideAlt, MultiVariant noSide, MultiVariant noSideAlt) { @@ -560,10 +459,11 @@ public void generatePaneBlock(IronBarsBlock block, MultiVariant post, MultiVaria .with(condition().term(BlockStateProperties.NORTH, false), noSide) .with(condition().term(BlockStateProperties.EAST, false), noSideAlt) .with(condition().term(BlockStateProperties.SOUTH, false), noSideAlt.with(Y_ROT_90)) - .with(condition().term(BlockStateProperties.WEST, false), noSide.with(Y_ROT_270))); + .with(condition().term(BlockStateProperties.WEST, false), noSide.with(Y_ROT_270)) + ); } - public void generateDoorBlock(DoorBlock block, Identifier bottom, Identifier top) { + public void generateDoorBlock(DoorBlock block, Material bottom, Material top) { TextureMapping textures = TextureMapping.door(top, bottom); generateDoorBlock(block, plainVariant(ModelTemplates.DOOR_BOTTOM_LEFT.create(block, textures, modelOutput)), @@ -573,47 +473,19 @@ public void generateDoorBlock(DoorBlock block, Identifier bottom, Identifier top plainVariant(ModelTemplates.DOOR_TOP_LEFT.create(block, textures, modelOutput)), plainVariant(ModelTemplates.DOOR_TOP_LEFT_OPEN.create(block, textures, modelOutput)), plainVariant(ModelTemplates.DOOR_TOP_RIGHT.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.DOOR_TOP_RIGHT_OPEN.create(block, textures, modelOutput))); + plainVariant(ModelTemplates.DOOR_TOP_RIGHT_OPEN.create(block, textures, modelOutput)) + ); } - public void generateDoorBlock(DoorBlock block, String name, Identifier bottom, Identifier top) { + public void generateDoorBlock(DoorBlock block, String name, Material bottom, Material top) { generateDoorBlockInternal(block, modLoc(name + "_door"), bottom, top); } - public void generateDoorBlockWithRenderType(DoorBlock block, Identifier bottom, Identifier top, Identifier renderType) { - TextureMapping textures = TextureMapping.door(top, bottom); - generateDoorBlock(block, - plainVariant(withRenderType(ModelTemplates.DOOR_BOTTOM_LEFT, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(ModelTemplates.DOOR_BOTTOM_LEFT_OPEN, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(ModelTemplates.DOOR_BOTTOM_RIGHT, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(ModelTemplates.DOOR_BOTTOM_RIGHT_OPEN, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(ModelTemplates.DOOR_TOP_LEFT, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(ModelTemplates.DOOR_TOP_LEFT_OPEN, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(ModelTemplates.DOOR_TOP_RIGHT, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(ModelTemplates.DOOR_TOP_RIGHT_OPEN, renderType).create(block, textures, modelOutput))); - } - - public void generateDoorBlockWithRenderType(DoorBlock block, String name, Identifier bottom, Identifier top, Identifier renderType) { - generateDoorBlockInternalWithRenderType(block, modLoc(name + "_door"), bottom, top, renderType); - } - - private void generateDoorBlockInternal(DoorBlock block, Identifier baseName, Identifier bottom, Identifier top) { + private void generateDoorBlockInternal(DoorBlock block, Identifier baseName, Material bottom, Material top) { generateDoorBlockInternal(block, baseName, bottom, top, ModelTemplates.DOOR_BOTTOM_LEFT, ModelTemplates.DOOR_BOTTOM_LEFT_OPEN, ModelTemplates.DOOR_BOTTOM_RIGHT, ModelTemplates.DOOR_BOTTOM_RIGHT_OPEN, ModelTemplates.DOOR_TOP_LEFT, ModelTemplates.DOOR_TOP_LEFT_OPEN, ModelTemplates.DOOR_TOP_RIGHT, ModelTemplates.DOOR_TOP_RIGHT_OPEN); } - private void generateDoorBlockInternalWithRenderType(DoorBlock block, Identifier baseName, Identifier bottom, Identifier top, Identifier renderType) { - generateDoorBlockInternal(block, baseName, bottom, top, - withRenderType(ModelTemplates.DOOR_BOTTOM_LEFT, renderType), - withRenderType(ModelTemplates.DOOR_BOTTOM_LEFT_OPEN, renderType), - withRenderType(ModelTemplates.DOOR_BOTTOM_RIGHT, renderType), - withRenderType(ModelTemplates.DOOR_BOTTOM_RIGHT_OPEN, renderType), - withRenderType(ModelTemplates.DOOR_TOP_LEFT, renderType), - withRenderType(ModelTemplates.DOOR_TOP_LEFT_OPEN, renderType), - withRenderType(ModelTemplates.DOOR_TOP_RIGHT, renderType), - withRenderType(ModelTemplates.DOOR_TOP_RIGHT_OPEN, renderType)); - } - - private void generateDoorBlockInternal(DoorBlock block, Identifier baseName, Identifier bottom, Identifier top, ModelTemplate bottomLeftTemplate, ModelTemplate bottomLeftOpenTemplate, ModelTemplate bottomRightTemplate, ModelTemplate bottomRightOpenTemplate, ModelTemplate topLeftTemplate, ModelTemplate topLeftOpenTemplate, ModelTemplate topRightTemplate, ModelTemplate topRightOpenTemplate) { + private void generateDoorBlockInternal(DoorBlock block, Identifier baseName, Material bottom, Material top, ModelTemplate bottomLeftTemplate, ModelTemplate bottomLeftOpenTemplate, ModelTemplate bottomRightTemplate, ModelTemplate bottomRightOpenTemplate, ModelTemplate topLeftTemplate, ModelTemplate topLeftOpenTemplate, ModelTemplate topRightTemplate, ModelTemplate topRightOpenTemplate) { Identifier baseModel = baseName.withPrefix("block/"); TextureMapping textures = TextureMapping.door(top, bottom); MultiVariant bottomLeft = plainVariant(bottomLeftTemplate.create(baseModel.withSuffix("_bottom_left"), textures, modelOutput)); @@ -631,47 +503,29 @@ public void generateDoorBlock(DoorBlock block, MultiVariant bottomLeft, MultiVar blockStateOutput.accept(createDoor(block, bottomLeft, bottomLeftOpen, bottomRight, bottomRightOpen, topLeft, topLeftOpen, topRight, topRightOpen)); } - public void generateTrapdoorBlock(TrapDoorBlock block, Identifier texture, boolean orientable) { + public void generateTrapdoorBlock(TrapDoorBlock block, Material texture, boolean orientable) { TextureMapping textures = TextureMapping.defaultTexture(texture); generateTrapdoorBlock(block, plainVariant((orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM : ModelTemplates.TRAPDOOR_BOTTOM).create(block, textures, modelOutput)), plainVariant((orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_TOP : ModelTemplates.TRAPDOOR_TOP).create(block, textures, modelOutput)), plainVariant((orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN).create(block, textures, modelOutput)), - orientable); + orientable + ); } - public void generateTrapdoorBlock(TrapDoorBlock block, String name, Identifier texture, boolean orientable) { + public void generateTrapdoorBlock(TrapDoorBlock block, String name, Material texture, boolean orientable) { generateTrapdoorBlockInternal(block, modLoc(name + "_trapdoor"), texture, orientable); } - public void generateTrapdoorBlockWithRenderType(TrapDoorBlock block, Identifier texture, boolean orientable, Identifier renderType) { - TextureMapping textures = TextureMapping.defaultTexture(texture); - generateTrapdoorBlock(block, - plainVariant(withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM : ModelTemplates.TRAPDOOR_BOTTOM, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_TOP : ModelTemplates.TRAPDOOR_TOP, renderType).create(block, textures, modelOutput)), - plainVariant(withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN, renderType).create(block, textures, modelOutput)), - orientable); - } - - public void generateTrapdoorBlockWithRenderType(TrapDoorBlock block, String name, Identifier texture, boolean orientable, Identifier renderType) { - generateTrapdoorBlockInternalWithRenderType(block, modLoc(name + "_trapdoor"), texture, orientable, renderType); - } - - private void generateTrapdoorBlockInternal(TrapDoorBlock block, Identifier baseName, Identifier texture, boolean orientable) { + private void generateTrapdoorBlockInternal(TrapDoorBlock block, Identifier baseName, Material texture, boolean orientable) { generateTrapdoorBlockInternal(block, baseName, texture, orientable, orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM : ModelTemplates.TRAPDOOR_BOTTOM, orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_TOP : ModelTemplates.TRAPDOOR_TOP, - orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN); - } - - private void generateTrapdoorBlockInternalWithRenderType(TrapDoorBlock block, Identifier baseName, Identifier texture, boolean orientable, Identifier renderType) { - generateTrapdoorBlockInternal(block, baseName, texture, orientable, - withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM : ModelTemplates.TRAPDOOR_BOTTOM, renderType), - withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_TOP : ModelTemplates.TRAPDOOR_TOP, renderType), - withRenderType(orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN, renderType)); + orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN + ); } - private void generateTrapdoorBlockInternal(TrapDoorBlock block, Identifier baseName, Identifier texture, boolean orientable, ModelTemplate bottomTemplate, ModelTemplate topTemplate, ModelTemplate openTemplate) { + private void generateTrapdoorBlockInternal(TrapDoorBlock block, Identifier baseName, Material texture, boolean orientable, ModelTemplate bottomTemplate, ModelTemplate topTemplate, ModelTemplate openTemplate) { Identifier baseModel = baseName.withPrefix("block/"); TextureMapping textures = TextureMapping.defaultTexture(texture); MultiVariant bottom = plainVariant(bottomTemplate.create(baseModel.withSuffix("_bottom"), textures, modelOutput)); diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java index 06c3874..39050bd 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java @@ -3,8 +3,6 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.util.nullness.NonNullSupplier; -import com.modularmc.registrate.util.nullness.NonnullType; - import net.minecraft.client.color.item.ItemTintSource; import net.minecraft.client.data.models.ItemModelGenerators; import net.minecraft.client.data.models.ItemModelOutput; @@ -14,6 +12,7 @@ import net.minecraft.client.data.models.model.ModelTemplate; import net.minecraft.client.data.models.model.ModelTemplates; import net.minecraft.client.data.models.model.TextureMapping; +import net.minecraft.client.resources.model.sprite.Material; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.Identifier; import net.minecraft.world.item.BlockItem; @@ -35,9 +34,10 @@ public RegistrateItemModelGenerator(AbstractRegistrate parent, ItemModelOutpu @Override public void run() { parent.genData(ProviderType.ITEM_MODEL, this); - // TODO check if an item actually has a valid model + //TODO check if an item actually has a valid model } + public void createWithExistingModel(Item item, Identifier id) { itemModelOutput.accept(item, ItemModelUtils.plainModel(id)); } @@ -46,11 +46,11 @@ public void generateWithTemplate(Item item, ModelTemplate template, TextureMappi itemModelOutput.accept(item, ItemModelUtils.plainModel(template.create(item, textures, modelOutput))); } - public void generateFlatItem(Item item, Identifier layer0) { + public void generateFlatItem(Item item, Material layer0) { generateFlatItem(item, ModelTemplates.FLAT_ITEM, layer0); } - public void generateFlatItem(Item item, ModelTemplate template, Identifier layer0) { + public void generateFlatItem(Item item, ModelTemplate template, Material layer0) { itemModelOutput.accept(item, ItemModelUtils.plainModel(template.create(item, TextureMapping.layer0(layer0), modelOutput))); } @@ -78,6 +78,22 @@ public Identifier modLoc(String id) { return Identifier.fromNamespaceAndPath(parent.getModid(), id); } + public Material mcBlockTexture(String path) { + return new Material(mcLoc("block/" + path)); + } + + public Material modBlockTexture(String path) { + return new Material(modLoc("block/" + path)); + } + + public Material mcItemTexture(String path) { + return new Material(mcLoc("item/" + path)); + } + + public Material modItemTexture(String path) { + return new Material(modLoc("item/" + path)); + } + public String modid(NonNullSupplier item) { return BuiltInRegistries.ITEM.getKey(item.get().asItem()).getNamespace(); } @@ -86,7 +102,7 @@ public String name(NonNullSupplier item) { return BuiltInRegistries.ITEM.getKey(item.get().asItem()).getPath(); } - public void generateTintedModel(@NonnullType Item entry, Identifier model, ItemTintSource tint) { + public void generateTintedModel(Item entry, Identifier model, ItemTintSource tint) { this.itemModelOutput.accept(entry, ItemModelUtils.tintedModel(model, tint)); } } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java index 230fc87..5807d67 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java @@ -4,10 +4,10 @@ import net.minecraft.client.data.models.model.TextureMapping; import net.minecraft.client.data.models.model.TextureSlot; import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.client.resources.model.sprite.Material; import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.level.block.Block; -import net.neoforged.neoforge.client.event.RegisterNamedRenderTypesEvent; import net.neoforged.neoforge.client.model.generators.template.CustomLoaderBuilder; import net.neoforged.neoforge.client.model.generators.template.ExtendedModelTemplateBuilder; import net.neoforged.neoforge.client.model.generators.template.RootTransformsBuilder; @@ -19,134 +19,108 @@ public class RegistrateLegacyBlockModelBuilder { - private final ExtendedModelTemplateBuilder template; - private final TextureMapping texture; - private final BiConsumer output; - - RegistrateLegacyBlockModelBuilder(BiConsumer output, ExtendedModelTemplateBuilder template, TextureMapping texture) { - this.output = output; - this.template = template; - this.texture = texture.copy(); - } - - public RegistrateLegacyBlockModelBuilder texture(TextureSlot slot, Identifier texture) { - this.template.requiredTextureSlot(slot); - this.texture.put(slot, texture); - return this; - } - - public RegistrateLegacyBlockModelBuilder transformTemplate(Consumer action) { - action.accept(template); - return this; - } - - public RegistrateLegacyBlockModelBuilder transformTexture(Consumer action) { - action.accept(texture); - return this; - } - - public Identifier build(Block block) { - return template.build().create(block, texture, output); - } - - public Identifier build(Identifier loc) { - return template.build().create(loc, texture, output); - } - - // Delegated methods from Template Builder - - /** - * Parent model which this template will inherit its properties from. - */ - public RegistrateLegacyBlockModelBuilder parent(Identifier parent) { - template.parent(parent); - return this; - } - - /** - * Suffix appended onto the models file path. - */ - public RegistrateLegacyBlockModelBuilder suffix(String suffix) { - template.suffix(suffix); - return this; - } - - /** - * Set the render type for this model. - * - * @param renderType the render type. Must be registered via - * {@link RegisterNamedRenderTypesEvent} - * @return this builder - * @throws NullPointerException if {@code renderType} is {@code null} - */ - public RegistrateLegacyBlockModelBuilder renderType(String renderType) { - template.renderType(renderType); - return this; - } - - /** - * Set the render type for this model. - * - * @param renderType the render type. Must be registered via - * {@link RegisterNamedRenderTypesEvent} - * @return this builder - * @throws NullPointerException if {@code renderType} is {@code null} - */ - public RegistrateLegacyBlockModelBuilder renderType(Identifier renderType) { - template.renderType(renderType); - return this; - } - - /** - * Begin building a new transform for the given perspective. - * - * @param type the perspective to create or return the builder for - * @return the builder for the given perspective - * @throws NullPointerException if {@code type} is {@code null} - */ - public RegistrateLegacyBlockModelBuilder transform(ItemDisplayContext type, Consumer action) { - template.transform(type, action); - return this; - } - - /** - * Sets whether or not this model should apply ambient occlusion. - */ - public RegistrateLegacyBlockModelBuilder ambientOcclusion(boolean ambientOcclusion) { - template.ambientOcclusion(ambientOcclusion); - return this; - } - - /** - * Sets the gui light style for this model. - * - *

              - *
            • {@link UnbakedModel.GuiLight#FRONT} for head on light, commonly used for items.
            • - *
            • {@link UnbakedModel.GuiLight#SIDE} for the model to be side lit, commonly used for blocks.
            • - *
            - */ - public RegistrateLegacyBlockModelBuilder guiLight(UnbakedModel.GuiLight light) { - template.guiLight(light); - return this; - } - - /** - * Use a custom loader instead of the vanilla elements. - * - * @param customLoaderFactory function that returns the custom loader to set, given this - * @return the custom loader builder - */ - public RegistrateLegacyBlockModelBuilder customLoader(Supplier customLoaderFactory, Consumer action) { - template.customLoader(customLoaderFactory, action); - return this; - } - - /** - * Modifies the transformation applied right before item display transformations and rotations specified in block - * states. - */ - public RegistrateLegacyBlockModelBuilder rootTransforms(Consumer action) { - template.rootTransforms(action); - return this; - } + private final ExtendedModelTemplateBuilder template; + private final TextureMapping texture; + private final BiConsumer output; + + RegistrateLegacyBlockModelBuilder(BiConsumer output, ExtendedModelTemplateBuilder template, TextureMapping texture) { + this.output = output; + this.template = template; + this.texture = texture.copy(); + } + + public RegistrateLegacyBlockModelBuilder texture(TextureSlot slot, Material texture) { + this.template.requiredTextureSlot(slot); + this.texture.put(slot, texture); + return this; + } + + public RegistrateLegacyBlockModelBuilder transformTemplate(Consumer action) { + action.accept(template); + return this; + } + + public RegistrateLegacyBlockModelBuilder transformTexture(Consumer action) { + action.accept(texture); + return this; + } + + public Identifier build(Block block) { + return template.build().create(block, texture, output); + } + + public Identifier build(Identifier loc) { + return template.build().create(loc, texture, output); + } + + // Delegated methods from Template Builder + + /** + * Parent model which this template will inherit its properties from. + */ + public RegistrateLegacyBlockModelBuilder parent(Identifier parent) { + template.parent(parent); + return this; + } + + /** + * Suffix appended onto the models file path. + */ + public RegistrateLegacyBlockModelBuilder suffix(String suffix) { + template.suffix(suffix); + return this; + } + + /** + * Begin building a new transform for the given perspective. + * + * @param type the perspective to create or return the builder for + * @return the builder for the given perspective + * @throws NullPointerException if {@code type} is {@code null} + */ + public RegistrateLegacyBlockModelBuilder transform(ItemDisplayContext type, Consumer action) { + template.transform(type, action); + return this; + } + + /** + * Sets whether or not this model should apply ambient occlusion. + */ + public RegistrateLegacyBlockModelBuilder ambientOcclusion(boolean ambientOcclusion) { + template.ambientOcclusion(ambientOcclusion); + return this; + } + + /** + * Sets the gui light style for this model. + * + *
              + *
            • {@link UnbakedModel.GuiLight#FRONT} for head on light, commonly used for items.
            • + *
            • {@link UnbakedModel.GuiLight#SIDE} for the model to be side lit, commonly used for blocks.
            • + *
            + */ + public RegistrateLegacyBlockModelBuilder guiLight(UnbakedModel.GuiLight light) { + template.guiLight(light); + return this; + } + + /** + * Use a custom loader instead of the vanilla elements. + * + * @param customLoaderFactory function that returns the custom loader to set, given this + * @return the custom loader builder + */ + public RegistrateLegacyBlockModelBuilder customLoader(Supplier customLoaderFactory, Consumer action) { + template.customLoader(customLoaderFactory, action); + return this; + } + + /** + * Modifies the transformation applied right before item display transformations and rotations specified in block states. + */ + public RegistrateLegacyBlockModelBuilder rootTransforms(Consumer action) { + template.rootTransforms(action); + return this; + } + } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java index 2f03e9f..f01f258 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java @@ -2,7 +2,6 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.RegistrateProvider; - import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelGenerators; import net.minecraft.client.data.models.ModelProvider; @@ -11,21 +10,22 @@ public class RegistrateModelProvider extends ModelProvider implements RegistrateProvider { - private final AbstractRegistrate parent; + private final AbstractRegistrate parent; + + public RegistrateModelProvider(AbstractRegistrate parent, PackOutput p_388260_) { + super(p_388260_, parent.getModid()); + this.parent = parent; + } - public RegistrateModelProvider(AbstractRegistrate parent, PackOutput p_388260_) { - super(p_388260_, parent.getModid()); - this.parent = parent; - } + @Override + protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels) { + new RegistrateBlockModelGenerator(parent, blockModels.blockStateOutput, blockModels.itemModelOutput, blockModels.modelOutput).run(); + new RegistrateItemModelGenerator(parent, itemModels.itemModelOutput, itemModels.modelOutput).run(); + } - @Override - protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels) { - new RegistrateBlockModelGenerator(parent, blockModels.blockStateOutput, blockModels.itemModelOutput, blockModels.modelOutput).run(); - new RegistrateItemModelGenerator(parent, itemModels.itemModelOutput, itemModels.modelOutput).run(); - } + @Override + public LogicalSide getSide() { + return LogicalSide.CLIENT; + } - @Override - public LogicalSide getSide() { - return LogicalSide.CLIENT; - } } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java index 1e548c0..6aad359 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java @@ -3,25 +3,26 @@ import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.util.DataIngredient; import com.modularmc.registrate.util.nullness.NonNullSupplier; - +import lombok.experimental.Delegate; import net.minecraft.advancements.Criterion; -import net.minecraft.advancements.critereon.EnterBlockTrigger; -import net.minecraft.advancements.critereon.InventoryChangeTrigger; -import net.minecraft.advancements.critereon.ItemPredicate; -import net.minecraft.advancements.critereon.MinMaxBounds; +import net.minecraft.advancements.criterion.EnterBlockTrigger; +import net.minecraft.advancements.criterion.InventoryChangeTrigger; +import net.minecraft.advancements.criterion.ItemPredicate; +import net.minecraft.advancements.criterion.MinMaxBounds; import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.data.BlockFamily; import net.minecraft.data.recipes.*; -import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.Identifier; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.EntityType; import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemStackTemplate; import net.minecraft.world.item.crafting.*; import net.minecraft.world.item.equipment.trim.TrimPattern; import net.minecraft.world.level.ItemLike; @@ -29,16 +30,12 @@ import net.minecraft.world.level.block.SuspiciousEffectHolder; import net.neoforged.neoforge.common.Tags; -import com.google.common.collect.ImmutableMap; -import lombok.experimental.Delegate; - +import javax.annotation.CheckReturnValue; +import javax.annotation.processing.Generated; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.function.Supplier; -import javax.annotation.CheckReturnValue; -import javax.annotation.Generated; -import javax.annotation.Nullable; - public class RegistrateRecipeProvider extends RecipeProvider implements RecipeOutput { private final RegistrateRecipeRunner runner; @@ -127,53 +124,42 @@ public String safeName(ItemLike registryEntry) { public static final int DEFAULT_SMOKE_TIME = DEFAULT_BLAST_TIME; public static final int DEFAULT_CAMPFIRE_TIME = DEFAULT_SMELT_TIME * 3; - private static final ImmutableMap, String> COOKING_TYPE_NAMES = ImmutableMap., String>builder() - .put(RecipeSerializer.SMELTING_RECIPE, "smelting") - .put(RecipeSerializer.BLASTING_RECIPE, "blasting") - .put(RecipeSerializer.SMOKING_RECIPE, "smoking") - .put(RecipeSerializer.CAMPFIRE_COOKING_RECIPE, "campfire") - .build(); - - public void cooking(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime, RecipeSerializer serializer, AbstractCookingRecipe.Factory factory) { - cooking(source, category, result, experience, cookingTime, COOKING_TYPE_NAMES.get(serializer), serializer, factory); - } - - public void cooking(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime, String typeName, RecipeSerializer serializer, AbstractCookingRecipe.Factory factory) { - SimpleCookingRecipeBuilder.generic(source.toVanilla(), category, result.get(), experience, cookingTime, serializer, factory) + public void cooking(DataIngredient source, RecipeCategory craftingCategory, CookingBookCategory cookingCategory, Supplier result, float experience, int cookingTime, String typeName, AbstractCookingRecipe.Factory factory) { + SimpleCookingRecipeBuilder.generic(source.toVanilla(), craftingCategory, cookingCategory, result.get(), experience, cookingTime, factory) .unlockedBy("has_" + safeName(source), source.getCriterion(this)) .save(this, safeId(result.get()) + "_from_" + safeName(source) + "_" + typeName); } - public void smelting(DataIngredient source, RecipeCategory category, Supplier result, float experience) { - smelting(source, category, result, experience, DEFAULT_SMELT_TIME); + public void smelting(DataIngredient source, RecipeCategory category, CookingBookCategory cookingCategory, Supplier result, float experience) { + smelting(source, category, cookingCategory, result, experience, DEFAULT_SMELT_TIME); } - public void smelting(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { - cooking(source, category, result, experience, cookingTime, RecipeSerializer.SMELTING_RECIPE, SmeltingRecipe::new); + public void smelting(DataIngredient source, RecipeCategory category, CookingBookCategory cookingCategory, Supplier result, float experience, int cookingTime) { + cooking(source, category, cookingCategory, result, experience, cookingTime, "smelting", SmeltingRecipe::new); } - public void blasting(DataIngredient source, RecipeCategory category, Supplier result, float experience) { - blasting(source, category, result, experience, DEFAULT_BLAST_TIME); + public void blasting(DataIngredient source, RecipeCategory category, CookingBookCategory cookingCategory, Supplier result, float experience) { + blasting(source, category, cookingCategory, result, experience, DEFAULT_BLAST_TIME); } - public void blasting(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { - cooking(source, category, result, experience, cookingTime, RecipeSerializer.BLASTING_RECIPE, BlastingRecipe::new); + public void blasting(DataIngredient source, RecipeCategory category, CookingBookCategory cookingCategory, Supplier result, float experience, int cookingTime) { + cooking(source, category, cookingCategory, result, experience, cookingTime, "blasting", BlastingRecipe::new); } - public void smoking(DataIngredient source, RecipeCategory category, Supplier result, float experience) { - smoking(source, category, result, experience, DEFAULT_SMOKE_TIME); + public void smoking(DataIngredient source, RecipeCategory category, CookingBookCategory cookingCategory, Supplier result, float experience) { + smoking(source, category, cookingCategory, result, experience, DEFAULT_SMOKE_TIME); } - public void smoking(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { - cooking(source, category, result, experience, cookingTime, RecipeSerializer.SMOKING_RECIPE, SmokingRecipe::new); + public void smoking(DataIngredient source, RecipeCategory category, CookingBookCategory cookingCategory, Supplier result, float experience, int cookingTime) { + cooking(source, category, cookingCategory, result, experience, cookingTime, "smoking", SmokingRecipe::new); } - public void campfire(DataIngredient source, RecipeCategory category, Supplier result, float experience) { - campfire(source, category, result, experience, DEFAULT_CAMPFIRE_TIME); + public void campfire(DataIngredient source, RecipeCategory category, CookingBookCategory cookingCategory, Supplier result, float experience) { + campfire(source, category, cookingCategory, result, experience, DEFAULT_CAMPFIRE_TIME); } - public void campfire(DataIngredient source, RecipeCategory category, Supplier result, float experience, int cookingTime) { - cooking(source, category, result, experience, cookingTime, RecipeSerializer.CAMPFIRE_COOKING_RECIPE, CampfireCookingRecipe::new); + public void campfire(DataIngredient source, RecipeCategory category, CookingBookCategory cookingCategory, Supplier result, float experience, int cookingTime) { + cooking(source, category, cookingCategory, result, experience, cookingTime, "campfire", CampfireCookingRecipe::new); } public void stonecutting(DataIngredient source, RecipeCategory category, Supplier result) { @@ -186,15 +172,15 @@ public void stonecutting(DataIngredient source, RecipeCateg .save(this, safeId(result.get()) + "_from_" + safeName(source) + "_stonecutting"); } - public void smeltingAndBlasting(DataIngredient source, RecipeCategory category, Supplier result, float xp) { - smelting(source, category, result, xp); - blasting(source, category, result, xp); + public void smeltingAndBlasting(DataIngredient source, RecipeCategory category, CookingBookCategory cookingCategory, Supplier result, float xp) { + smelting(source, category, cookingCategory, result, xp); + blasting(source, category, cookingCategory, result, xp); } - public void food(DataIngredient source, RecipeCategory category, Supplier result, float xp) { - smelting(source, category, result, xp); - smoking(source, category, result, xp); - campfire(source, category, result, xp); + public void food(DataIngredient source, RecipeCategory category, CookingBookCategory cookingCategory, Supplier result, float xp) { + smelting(source, category, cookingCategory, result, xp); + smoking(source, category, cookingCategory, result, xp); + campfire(source, category, cookingCategory, result, xp); } public void square(DataIngredient source, RecipeCategory category, Supplier output, boolean small) { @@ -213,8 +199,7 @@ public void square(DataIngredient source, RecipeCategory ca * @param * @param source * @param output - * @deprecated Broken, use {@link #storage(NonNullSupplier, RecipeCategory, NonNullSupplier)} or - * {@link #storage(DataIngredient, RecipeCategory, NonNullSupplier, DataIngredient, NonNullSupplier)}. + * @deprecated Broken, use {@link #storage(NonNullSupplier, RecipeCategory, NonNullSupplier)} or {@link #storage(DataIngredient, RecipeCategory, NonNullSupplier, DataIngredient, NonNullSupplier)}. */ @Deprecated public void storage(DataIngredient source, RecipeCategory category, NonNullSupplier output) { @@ -323,379 +308,404 @@ public void trapDoor(DataIngredient source, RecipeCategory } // @formatter:off - // GENERATED START - DO NOT EDIT BELOW THIS LINE - - /** Generated override to expose protected method: {@link RecipeProvider#generateForEnabledBlockFamilies} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void generateForEnabledBlockFamilies(FeatureFlagSet enabledFeatures) { super.generateForEnabledBlockFamilies(enabledFeatures); } - - /** Generated override to expose protected method: {@link RecipeProvider#oreSmelting} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void oreSmelting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { super.oreSmelting(ingredients, category, result, experience, cookingTime, group); } - - /** Generated override to expose protected method: {@link RecipeProvider#oreBlasting} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void oreBlasting(List ingredients, RecipeCategory category, ItemLike result, float experience, int cookingTime, String group) { super.oreBlasting(ingredients, category, result, experience, cookingTime, group); } - - /** Generated override to expose protected method: {@link RecipeProvider#netheriteSmithing} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void netheriteSmithing(Item ingredientItem, RecipeCategory category, Item resultItem) { super.netheriteSmithing(ingredientItem, category, resultItem); } - - /** Generated override to expose protected method: {@link RecipeProvider#trimSmithing} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void trimSmithing(Item template, ResourceKey pattern, ResourceKey> recipe) { super.trimSmithing(template, pattern, recipe); } - - /** Generated override to expose protected method: {@link RecipeProvider#twoByTwoPacker} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void twoByTwoPacker(RecipeCategory category, ItemLike packed, ItemLike unpacked) { super.twoByTwoPacker(category, packed, unpacked); } - - /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void threeByThreePacker(RecipeCategory category, ItemLike packed, ItemLike unpacked, String criterionName) { super.threeByThreePacker(category, packed, unpacked, criterionName); } - - /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void threeByThreePacker(RecipeCategory category, ItemLike packed, ItemLike unpacked) { super.threeByThreePacker(category, packed, unpacked); } - - /** Generated override to expose protected method: {@link RecipeProvider#planksFromLog} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void planksFromLog(ItemLike planks, TagKey logs, int resultCount) { super.planksFromLog(planks, logs, resultCount); } - - /** Generated override to expose protected method: {@link RecipeProvider#planksFromLogs} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void planksFromLogs(ItemLike planks, TagKey logs, int result) { super.planksFromLogs(planks, logs, result); } - - /** Generated override to expose protected method: {@link RecipeProvider#woodFromLogs} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void woodFromLogs(ItemLike wood, ItemLike log) { super.woodFromLogs(wood, log); } - - /** Generated override to expose protected method: {@link RecipeProvider#woodenBoat} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void woodenBoat(ItemLike boat, ItemLike material) { super.woodenBoat(boat, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#chestBoat} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void chestBoat(ItemLike boat, ItemLike material) { super.chestBoat(boat, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#buttonBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder buttonBuilder(ItemLike button, Ingredient material) { return super.buttonBuilder(button, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#doorBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder doorBuilder(ItemLike door, Ingredient material) { return super.doorBuilder(door, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#fenceBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder fenceBuilder(ItemLike fence, Ingredient material) { return super.fenceBuilder(fence, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#fenceGateBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder fenceGateBuilder(ItemLike fenceGate, Ingredient material) { return super.fenceGateBuilder(fenceGate, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#pressurePlate} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void pressurePlate(ItemLike pressurePlate, ItemLike material) { super.pressurePlate(pressurePlate, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#pressurePlateBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder pressurePlateBuilder(RecipeCategory category, ItemLike pressurePlate, Ingredient material) { return super.pressurePlateBuilder(category, pressurePlate, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#slab} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void slab(RecipeCategory category, ItemLike slab, ItemLike material) { super.slab(category, slab, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#slabBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder slabBuilder(RecipeCategory category, ItemLike slab, Ingredient material) { return super.slabBuilder(category, slab, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#stairBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder stairBuilder(ItemLike stairs, Ingredient material) { return super.stairBuilder(stairs, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#trapdoorBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder trapdoorBuilder(ItemLike trapdoor, Ingredient material) { return super.trapdoorBuilder(trapdoor, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#signBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder signBuilder(ItemLike sign, Ingredient material) { return super.signBuilder(sign, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#hangingSign} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void hangingSign(ItemLike sign, ItemLike material) { super.hangingSign(sign, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#colorItemWithDye} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void colorItemWithDye(List dyeItems, List dyeableItems, String group, RecipeCategory category) { super.colorItemWithDye(dyeItems, dyeableItems, group, category); } - - /** Generated override to expose protected method: {@link RecipeProvider#carpet} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void carpet(ItemLike carpet, ItemLike material) { super.carpet(carpet, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#bedFromPlanksAndWool} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void bedFromPlanksAndWool(ItemLike bed, ItemLike wool) { super.bedFromPlanksAndWool(bed, wool); } - - /** Generated override to expose protected method: {@link RecipeProvider#banner} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void banner(ItemLike banner, ItemLike material) { super.banner(banner, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassFromGlassAndDye} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void stainedGlassFromGlassAndDye(ItemLike stainedGlass, ItemLike dye) { super.stainedGlassFromGlassAndDye(stainedGlass, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#dryGhast} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void dryGhast(ItemLike dryGhast) { super.dryGhast(dryGhast); } - - /** Generated override to expose protected method: {@link RecipeProvider#harness} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void harness(ItemLike harness, ItemLike wool) { super.harness(harness, wool); } - - /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromStainedGlass} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void stainedGlassPaneFromStainedGlass(ItemLike stainedGlassPane, ItemLike stainedGlass) { super.stainedGlassPaneFromStainedGlass(stainedGlassPane, stainedGlass); } - - /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromGlassPaneAndDye} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void stainedGlassPaneFromGlassPaneAndDye(ItemLike stainedGlassPane, ItemLike dye) { super.stainedGlassPaneFromGlassPaneAndDye(stainedGlassPane, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#coloredTerracottaFromTerracottaAndDye} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void coloredTerracottaFromTerracottaAndDye(ItemLike terracotta, ItemLike dye) { super.coloredTerracottaFromTerracottaAndDye(terracotta, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#concretePowder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void concretePowder(ItemLike concretePowder, ItemLike dye) { super.concretePowder(concretePowder, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#candle} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void candle(ItemLike candle, ItemLike dye) { super.candle(candle, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#wall} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void wall(RecipeCategory category, ItemLike wall, ItemLike material) { super.wall(category, wall, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#wallBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder wallBuilder(RecipeCategory category, ItemLike wall, Ingredient material) { return super.wallBuilder(category, wall, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#polished} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void polished(RecipeCategory category, ItemLike result, ItemLike material) { super.polished(category, result, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#polishedBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public RecipeBuilder polishedBuilder(RecipeCategory category, ItemLike result, Ingredient material) { return super.polishedBuilder(category, result, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#cut} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void cut(RecipeCategory category, ItemLike cutResult, ItemLike material) { super.cut(category, cutResult, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#cutBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapedRecipeBuilder cutBuilder(RecipeCategory category, ItemLike cutResult, Ingredient material) { return super.cutBuilder(category, cutResult, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#chiseled} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void chiseled(RecipeCategory category, ItemLike chiseledResult, ItemLike material) { super.chiseled(category, chiseledResult, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#mosaicBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void mosaicBuilder(RecipeCategory category, ItemLike result, ItemLike material) { super.mosaicBuilder(category, result, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#chiseledBuilder} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapedRecipeBuilder chiseledBuilder(RecipeCategory category, ItemLike chiseledResult, Ingredient material) { return super.chiseledBuilder(category, chiseledResult, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike material) { super.stonecutterResultFromBase(category, result, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike material, int resultCount) { super.stonecutterResultFromBase(category, result, material, resultCount); } - - /** Generated override to expose protected method: {@link RecipeProvider#smeltingResultFromBase} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void smeltingResultFromBase(ItemLike result, ItemLike ingredient) { super.smeltingResultFromBase(result, ingredient); } - - /** Generated override to expose protected method: {@link RecipeProvider#nineBlockStorageRecipes} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void nineBlockStorageRecipes(RecipeCategory unpackedCategory, ItemLike unpacked, RecipeCategory packedCategory, ItemLike packed) { super.nineBlockStorageRecipes(unpackedCategory, unpacked, packedCategory, packed); } - - /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void copySmithingTemplate(ItemLike template, ItemLike baseItem) { super.copySmithingTemplate(template, baseItem); } - - /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void copySmithingTemplate(ItemLike template, Ingredient baseItem) { super.copySmithingTemplate(template, baseItem); } - - /** Generated override to expose protected method: {@link RecipeProvider#waxRecipes} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void waxRecipes(FeatureFlagSet requiredFeatures) { super.waxRecipes(requiredFeatures); } - - /** Generated override to expose protected method: {@link RecipeProvider#grate} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void grate(Block grateBlock, Block material) { super.grate(grateBlock, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#copperBulb} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void copperBulb(Block bulbBlock, Block material) { super.copperBulb(bulbBlock, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#suspiciousStew} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void suspiciousStew(Item flowerItem, SuspiciousEffectHolder effect) { super.suspiciousStew(flowerItem, effect); } - - /** Generated override to expose protected method: {@link RecipeProvider#generateRecipes} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public void generateRecipes(BlockFamily blockFamily, FeatureFlagSet requiredFeatures) { super.generateRecipes(blockFamily, requiredFeatures); } - - /** Generated override to expose protected method: {@link RecipeProvider#getBaseBlock} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public Block getBaseBlock(BlockFamily family, BlockFamily.Variant variant) { return super.getBaseBlock(family, variant); } - - /** Generated override to expose protected method: {@link RecipeProvider#insideOf} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static Criterion insideOf(Block block) { return RecipeProvider.insideOf(block); } - - /** Generated override to expose protected method: {@link RecipeProvider#has} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public Criterion has(MinMaxBounds.Ints count, ItemLike item) { return super.has(count, item); } - - /** Generated override to expose protected method: {@link RecipeProvider#has} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public Criterion has(ItemLike itemLike) { return super.has(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#has} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public Criterion has(TagKey tag) { return super.has(tag); } - - /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static Criterion inventoryTrigger(ItemPredicate.Builder... items) { return RecipeProvider.inventoryTrigger(items); } - - /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static Criterion inventoryTrigger(ItemPredicate... predicates) { return RecipeProvider.inventoryTrigger(predicates); } - - /** Generated override to expose protected method: {@link RecipeProvider#getHasName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getHasName(ItemLike itemLike) { return RecipeProvider.getHasName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#getItemName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getItemName(ItemLike itemLike) { return RecipeProvider.getItemName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#getSimpleRecipeName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getSimpleRecipeName(ItemLike itemLike) { return RecipeProvider.getSimpleRecipeName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#getConversionRecipeName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getConversionRecipeName(ItemLike result, ItemLike ingredient) { return RecipeProvider.getConversionRecipeName(result, ingredient); } - - /** Generated override to expose protected method: {@link RecipeProvider#getSmeltingRecipeName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getSmeltingRecipeName(ItemLike itemLike) { return RecipeProvider.getSmeltingRecipeName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#getBlastingRecipeName} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public static String getBlastingRecipeName(ItemLike itemLike) { return RecipeProvider.getBlastingRecipeName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#tag} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public Ingredient tag(TagKey tag) { return super.tag(tag); } - - /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike result) { return super.shaped(category, result); } - - /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike result, int count) { return super.shaped(category, result, count); } - - /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemStack result) { return super.shapeless(category, result); } - - /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike result) { return super.shapeless(category, result); } - - /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 20 Jul 2025 06:59:06 GMT") - public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike result, int count) { return super.shapeless(category, result, count); } - - // GENERATED END + // GENERATED START - DO NOT EDIT BELOW THIS LINE + + /** Generated override to expose protected method: {@link RecipeProvider#generateForEnabledBlockFamilies} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void generateForEnabledBlockFamilies(FeatureFlagSet flagSet) { super.generateForEnabledBlockFamilies(flagSet); } + + /** Generated override to expose protected method: {@link RecipeProvider#netheriteSmithing} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void netheriteSmithing(Item base, RecipeCategory category, Item result) { super.netheriteSmithing(base, category, result); } + + /** Generated override to expose protected method: {@link RecipeProvider#trimSmithing} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void trimSmithing(Item trimTemplate, ResourceKey patternId, ResourceKey> id) { super.trimSmithing(trimTemplate, patternId, id); } + + /** Generated override to expose protected method: {@link RecipeProvider#twoByTwoPacker} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void twoByTwoPacker(RecipeCategory category, ItemLike result, ItemLike ingredient) { super.twoByTwoPacker(category, result, ingredient); } + + /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void threeByThreePacker(RecipeCategory category, ItemLike result, ItemLike ingredient, String unlockedBy) { super.threeByThreePacker(category, result, ingredient, unlockedBy); } + + /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void threeByThreePacker(RecipeCategory category, ItemLike result, ItemLike ingredient) { super.threeByThreePacker(category, result, ingredient); } + + /** Generated override to expose protected method: {@link RecipeProvider#planksFromLog} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void planksFromLog(ItemLike result, TagKey logs, int count) { super.planksFromLog(result, logs, count); } + + /** Generated override to expose protected method: {@link RecipeProvider#planksFromLogs} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void planksFromLogs(ItemLike result, TagKey logs, int count) { super.planksFromLogs(result, logs, count); } + + /** Generated override to expose protected method: {@link RecipeProvider#woodFromLogs} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void woodFromLogs(ItemLike result, ItemLike log) { super.woodFromLogs(result, log); } + + /** Generated override to expose protected method: {@link RecipeProvider#woodenBoat} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void woodenBoat(ItemLike result, ItemLike planks) { super.woodenBoat(result, planks); } + + /** Generated override to expose protected method: {@link RecipeProvider#chestBoat} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void chestBoat(ItemLike chestBoat, ItemLike boat) { super.chestBoat(chestBoat, boat); } + + /** Generated override to expose protected method: {@link RecipeProvider#buttonBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder buttonBuilder(ItemLike result, Ingredient base) { return super.buttonBuilder(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#doorBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder doorBuilder(ItemLike result, Ingredient base) { return super.doorBuilder(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#fenceBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder fenceBuilder(ItemLike result, Ingredient base) { return super.fenceBuilder(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#fenceGateBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder fenceGateBuilder(ItemLike result, Ingredient planks) { return super.fenceGateBuilder(result, planks); } + + /** Generated override to expose protected method: {@link RecipeProvider#pressurePlate} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void pressurePlate(ItemLike result, ItemLike base) { super.pressurePlate(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#pressurePlateBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder pressurePlateBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.pressurePlateBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#slab} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void slab(RecipeCategory category, ItemLike result, ItemLike base) { super.slab(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#shelf} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void shelf(ItemLike result, ItemLike strippedLogs) { super.shelf(result, strippedLogs); } + + /** Generated override to expose protected method: {@link RecipeProvider#slabBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder slabBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.slabBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#stairBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder stairBuilder(ItemLike result, Ingredient base) { return super.stairBuilder(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#trapdoorBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder trapdoorBuilder(ItemLike result, Ingredient base) { return super.trapdoorBuilder(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#signBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder signBuilder(ItemLike result, Ingredient planks) { return super.signBuilder(result, planks); } + + /** Generated override to expose protected method: {@link RecipeProvider#hangingSign} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void hangingSign(ItemLike result, ItemLike ingredient) { super.hangingSign(result, ingredient); } + + /** Generated override to expose protected method: {@link RecipeProvider#colorItemWithDye} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void colorItemWithDye(List dyes, List items, String groupName, RecipeCategory category) { super.colorItemWithDye(dyes, items, groupName, category); } + + /** Generated override to expose protected method: {@link RecipeProvider#carpet} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void carpet(ItemLike result, ItemLike sourceItem) { super.carpet(result, sourceItem); } + + /** Generated override to expose protected method: {@link RecipeProvider#bedFromPlanksAndWool} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void bedFromPlanksAndWool(ItemLike result, ItemLike wool) { super.bedFromPlanksAndWool(result, wool); } + + /** Generated override to expose protected method: {@link RecipeProvider#banner} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void banner(ItemLike result, ItemLike wool) { super.banner(result, wool); } + + /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassFromGlassAndDye} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void stainedGlassFromGlassAndDye(ItemLike result, ItemLike dye) { super.stainedGlassFromGlassAndDye(result, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#dryGhast} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void dryGhast(ItemLike result) { super.dryGhast(result); } + + /** Generated override to expose protected method: {@link RecipeProvider#harness} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void harness(ItemLike result, ItemLike wool) { super.harness(result, wool); } + + /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromStainedGlass} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void stainedGlassPaneFromStainedGlass(ItemLike result, ItemLike stainedGlass) { super.stainedGlassPaneFromStainedGlass(result, stainedGlass); } + + /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromGlassPaneAndDye} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void stainedGlassPaneFromGlassPaneAndDye(ItemLike result, ItemLike dye) { super.stainedGlassPaneFromGlassPaneAndDye(result, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#coloredTerracottaFromTerracottaAndDye} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void coloredTerracottaFromTerracottaAndDye(ItemLike result, ItemLike dye) { super.coloredTerracottaFromTerracottaAndDye(result, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#concretePowder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void concretePowder(ItemLike result, ItemLike dye) { super.concretePowder(result, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#candle} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void candle(ItemLike result, ItemLike dye) { super.candle(result, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#wall} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void wall(RecipeCategory category, ItemLike result, ItemLike base) { super.wall(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#wallBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder wallBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.wallBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#polished} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void polished(RecipeCategory category, ItemLike result, ItemLike base) { super.polished(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#polishedBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder polishedBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.polishedBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#cut} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void cut(RecipeCategory category, ItemLike result, ItemLike base) { super.cut(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#cutBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapedRecipeBuilder cutBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.cutBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#chiseled} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void chiseled(RecipeCategory category, ItemLike result, ItemLike base) { super.chiseled(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#mosaicBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void mosaicBuilder(RecipeCategory category, ItemLike result, ItemLike base) { super.mosaicBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#chiseledBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapedRecipeBuilder chiseledBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.chiseledBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike base) { super.stonecutterResultFromBase(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike base, int count) { super.stonecutterResultFromBase(category, result, base, count); } + + /** Generated override to expose protected method: {@link RecipeProvider#smeltingResultFromBase} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void smeltingResultFromBase(ItemLike result, ItemLike base) { super.smeltingResultFromBase(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#nineBlockStorageRecipes} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void nineBlockStorageRecipes(RecipeCategory unpackedFormCategory, ItemLike unpackedForm, RecipeCategory packedFormCategory, ItemLike packedForm) { super.nineBlockStorageRecipes(unpackedFormCategory, unpackedForm, packedFormCategory, packedForm); } + + /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void copySmithingTemplate(ItemLike smithingTemplate, ItemLike baseMaterial) { super.copySmithingTemplate(smithingTemplate, baseMaterial); } + + /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void copySmithingTemplate(ItemLike smithingTemplate, Ingredient baseMaterials) { super.copySmithingTemplate(smithingTemplate, baseMaterials); } + + /** Generated override to expose protected method: {@link RecipeProvider#cookRecipes} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void cookRecipes(String source, AbstractCookingRecipe.Factory factory, int cookingTime) { super.cookRecipes(source, factory, cookingTime); } + + /** Generated override to expose protected method: {@link RecipeProvider#waxRecipes} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void waxRecipes(FeatureFlagSet flagSet) { super.waxRecipes(flagSet); } + + /** Generated override to expose protected method: {@link RecipeProvider#grate} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void grate(Block grateBlock, Block material) { super.grate(grateBlock, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#copperBulb} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void copperBulb(Block copperBulb, Block copperMaterial) { super.copperBulb(copperBulb, copperMaterial); } + + /** Generated override to expose protected method: {@link RecipeProvider#waxedChiseled} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void waxedChiseled(Block result, Block material) { super.waxedChiseled(result, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#suspiciousStew} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void suspiciousStew(Item item, SuspiciousEffectHolder effectHolder) { super.suspiciousStew(item, effectHolder); } + + /** Generated override to expose protected method: {@link RecipeProvider#dyedItem} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void dyedItem(Item target, String group) { super.dyedItem(target, group); } + + /** Generated override to expose protected method: {@link RecipeProvider#dyedShulkerBoxRecipe} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void dyedShulkerBoxRecipe(Item dye, Item dyedResult) { super.dyedShulkerBoxRecipe(dye, dyedResult); } + + /** Generated override to expose protected method: {@link RecipeProvider#dyedBundleRecipe} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void dyedBundleRecipe(Item dye, Item dyedResult) { super.dyedBundleRecipe(dye, dyedResult); } + + /** Generated override to expose protected method: {@link RecipeProvider#generateRecipes} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void generateRecipes(BlockFamily family, FeatureFlagSet flagSet) { super.generateRecipes(family, flagSet); } + + /** Generated override to expose protected method: {@link RecipeProvider#getBaseBlockForCrafting} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public Block getBaseBlockForCrafting(BlockFamily family, BlockFamily.Variant variant) { return super.getBaseBlockForCrafting(family, variant); } + + /** Generated override to expose protected method: {@link RecipeProvider#insideOf} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static Criterion insideOf(Block block) { return RecipeProvider.insideOf(block); } + + /** Generated override to expose protected method: {@link RecipeProvider#has} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public Criterion has(MinMaxBounds.Ints count, ItemLike item) { return super.has(count, item); } + + /** Generated override to expose protected method: {@link RecipeProvider#has} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public Criterion has(ItemLike item) { return super.has(item); } + + /** Generated override to expose protected method: {@link RecipeProvider#has} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public Criterion has(TagKey tag) { return super.has(tag); } + + /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static Criterion inventoryTrigger(ItemPredicate.Builder... predicates) { return RecipeProvider.inventoryTrigger(predicates); } + + /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static Criterion inventoryTrigger(ItemPredicate... predicates) { return RecipeProvider.inventoryTrigger(predicates); } + + /** Generated override to expose protected method: {@link RecipeProvider#getHasName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getHasName(ItemLike baseBlock) { return RecipeProvider.getHasName(baseBlock); } + + /** Generated override to expose protected method: {@link RecipeProvider#getItemName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getItemName(ItemLike itemLike) { return RecipeProvider.getItemName(itemLike); } + + /** Generated override to expose protected method: {@link RecipeProvider#getSimpleRecipeName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getSimpleRecipeName(ItemLike itemLike) { return RecipeProvider.getSimpleRecipeName(itemLike); } + + /** Generated override to expose protected method: {@link RecipeProvider#getConversionRecipeName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getConversionRecipeName(ItemLike product, ItemLike material) { return RecipeProvider.getConversionRecipeName(product, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#getSmeltingRecipeName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getSmeltingRecipeName(ItemLike product) { return RecipeProvider.getSmeltingRecipeName(product); } + + /** Generated override to expose protected method: {@link RecipeProvider#getBlastingRecipeName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getBlastingRecipeName(ItemLike product) { return RecipeProvider.getBlastingRecipeName(product); } + + /** Generated override to expose protected method: {@link RecipeProvider#tag} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public Ingredient tag(TagKey id) { return super.tag(id); } + + /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapedRecipeBuilder shaped(RecipeCategory category, ItemStackTemplate stack) { return super.shaped(category, stack); } + + /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike item) { return super.shaped(category, item); } + + /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike item, int count) { return super.shaped(category, item, count); } + + /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemStackTemplate result) { return super.shapeless(category, result); } + + /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike item) { return super.shapeless(category, item); } + + /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike item, int count) { return super.shapeless(category, item, count); } + + // GENERATED END } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java index 5f7f173..ae53c5a 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java @@ -2,7 +2,6 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.RegistrateProvider; - import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.data.recipes.RecipeOutput; @@ -13,33 +12,34 @@ public class RegistrateRecipeRunner extends RecipeProvider.Runner implements RegistrateProvider { - final AbstractRegistrate owner; + final AbstractRegistrate owner; + + @org.jetbrains.annotations.Nullable + RegistrateRecipeProvider provider; - @org.jetbrains.annotations.Nullable - RegistrateRecipeProvider provider; + public RegistrateRecipeRunner(AbstractRegistrate owner, PackOutput p_365369_, CompletableFuture p_361563_) { + super(p_365369_, p_361563_); + this.owner = owner; + } - public RegistrateRecipeRunner(AbstractRegistrate owner, PackOutput p_365369_, CompletableFuture p_361563_) { - super(p_365369_, p_361563_); - this.owner = owner; - } + @Override + protected RecipeProvider createRecipeProvider(HolderLookup.Provider p_362946_, RecipeOutput p_365274_) { + return new RegistrateRecipeProvider(this, p_362946_, p_365274_); + } - @Override - protected RecipeProvider createRecipeProvider(HolderLookup.Provider p_362946_, RecipeOutput p_365274_) { - return new RegistrateRecipeProvider(this, p_362946_, p_365274_); - } + @Override + public String getName() { + return ""; + } - @Override - public String getName() { - return ""; - } + @Override + public LogicalSide getSide() { + return LogicalSide.SERVER; + } - @Override - public LogicalSide getSide() { - return LogicalSide.SERVER; - } + public RegistrateRecipeProvider getRecipeProvider() { + if (provider == null) throw new IllegalStateException("Recipe Provider is not available now"); + return provider; + } - public RegistrateRecipeProvider getRecipeProvider() { - if (provider == null) throw new IllegalStateException("Recipe Provider is not available now"); - return provider; - } } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/package-info.java b/src/main/java/com/modularmc/registrate/providers/generators/package-info.java index 2c81361..3f8c4a9 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/package-info.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/package-info.java @@ -1,6 +1,2 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault +@org.jspecify.annotations.NullMarked package com.modularmc.registrate.providers.generators; - -import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java index 544c37a..d79d8a2 100644 --- a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java @@ -1,7 +1,6 @@ package com.modularmc.registrate.providers.loot; import com.modularmc.registrate.AbstractRegistrate; - import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.data.loot.BlockLootSubProvider; @@ -17,15 +16,13 @@ import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; +import javax.annotation.processing.Generated; import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; -import javax.annotation.Generated; - public class RegistrateBlockLootTables extends BlockLootSubProvider implements RegistrateLootTables { - private final AbstractRegistrate parent; private final Consumer callback; @@ -69,226 +66,235 @@ public HolderLookup> entityLookup() { } // @formatter:off - // GENERATED START - DO NOT EDIT BELOW THIS LINE - - /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionDecay} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public > T applyExplosionDecay(ItemLike item, FunctionUserBuilder functionBuilder) { return super.applyExplosionDecay(item, functionBuilder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionCondition} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public > T applyExplosionCondition(ItemLike item, ConditionUserBuilder conditionBuilder) { return super.applyExplosionCondition(item, conditionBuilder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchDispatchTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSilkTouchDispatchTable(Block block, LootPoolEntryContainer.Builder builder) { return super.createSilkTouchDispatchTable(block, builder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsDispatchTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createShearsDispatchTable(Block block, LootPoolEntryContainer.Builder builder) { return super.createShearsDispatchTable(block, builder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOrShearsDispatchTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSilkTouchOrShearsDispatchTable(Block block, LootPoolEntryContainer.Builder builder) { return super.createSilkTouchOrShearsDispatchTable(block, builder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSingleItemTableWithSilkTouch(Block block, ItemLike item) { return super.createSingleItemTableWithSilkTouch(block, item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSingleItemTable(ItemLike item, NumberProvider count) { return super.createSingleItemTable(item, count); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSingleItemTableWithSilkTouch(Block block, ItemLike item, NumberProvider count) { return super.createSingleItemTableWithSilkTouch(block, item, count); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOnlyTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSilkTouchOnlyTable(ItemLike item) { return super.createSilkTouchOnlyTable(item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createPotFlowerItemTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createPotFlowerItemTable(ItemLike item) { return super.createPotFlowerItemTable(item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSlabItemTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createSlabItemTable(Block block) { return super.createSlabItemTable(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createNameableBlockEntityTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createNameableBlockEntityTable(Block block) { return super.createNameableBlockEntityTable(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShulkerBoxDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createShulkerBoxDrop(Block block) { return super.createShulkerBoxDrop(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCopperOreDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createCopperOreDrops(Block block) { return super.createCopperOreDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createLapisOreDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createLapisOreDrops(Block block) { return super.createLapisOreDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createRedstoneOreDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createRedstoneOreDrops(Block block) { return super.createRedstoneOreDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createBannerDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createBannerDrop(Block block) { return super.createBannerDrop(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeNestDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createBeeNestDrop(Block block) { return super.createBeeNestDrop(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeHiveDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createBeeHiveDrop(Block block) { return super.createBeeHiveDrop(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCaveVinesDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createCaveVinesDrop(Block block) { return super.createCaveVinesDrop(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createOreDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createOreDrop(Block block, Item item) { return super.createOreDrop(block, item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMushroomBlockDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createMushroomBlockDrop(Block block, ItemLike item) { return super.createMushroomBlockDrop(block, item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createGrassDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createGrassDrops(Block block) { return super.createGrassDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOnlyDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createShearsOnlyDrop(ItemLike item) { return super.createShearsOnlyDrop(item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOrSilkTouchOnlyDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createShearsOrSilkTouchOnlyDrop(ItemLike item) { return super.createShearsOrSilkTouchOnlyDrop(item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createMultifaceBlockDrops(Block block, LootItemCondition.Builder builder) { return super.createMultifaceBlockDrops(block, builder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createMultifaceBlockDrops(Block block) { return super.createMultifaceBlockDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMossyCarpetBlockDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createMossyCarpetBlockDrops(Block block) { return super.createMossyCarpetBlockDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createLeavesDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createLeavesDrops(Block leavesBlock, Block saplingBlock, float... chances) { return super.createLeavesDrops(leavesBlock, saplingBlock, chances); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createOakLeavesDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createOakLeavesDrops(Block oakLeavesBlock, Block saplingBlock, float... chances) { return super.createOakLeavesDrops(oakLeavesBlock, saplingBlock, chances); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMangroveLeavesDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createMangroveLeavesDrops(Block block) { return super.createMangroveLeavesDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCropDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createCropDrops(Block cropBlock, Item grownCropItem, Item seedsItem, LootItemCondition.Builder dropGrownCropCondition) { return super.createCropDrops(cropBlock, grownCropItem, seedsItem, dropGrownCropCondition); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantShearsDrop} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createDoublePlantShearsDrop(Block sheared) { return super.createDoublePlantShearsDrop(sheared); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantWithSeedDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createDoublePlantWithSeedDrops(Block block, Block sheared) { return super.createDoublePlantWithSeedDrops(block, sheared); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleDrops} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createCandleDrops(Block candleBlock) { return super.createCandleDrops(candleBlock); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleCakeDrops} */ - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public static LootTable.Builder createCandleCakeDrops(Block candleCakeBlock) { return BlockLootSubProvider.createCandleCakeDrops(candleCakeBlock); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#addNetherVinesDropTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void addNetherVinesDropTable(Block vines, Block plant) { super.addNetherVinesDropTable(vines, plant); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoorTable} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public LootTable.Builder createDoorTable(Block doorBlock) { return super.createDoorTable(doorBlock); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropPottedContents} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void dropPottedContents(Block flowerPot) { super.dropPottedContents(flowerPot); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#otherWhenSilkTouch} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void otherWhenSilkTouch(Block block, Block other) { super.otherWhenSilkTouch(block, other); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropOther} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void dropOther(Block block, ItemLike item) { super.dropOther(block, item); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropWhenSilkTouch} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void dropWhenSilkTouch(Block block) { super.dropWhenSilkTouch(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropSelf} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void dropSelf(Block block) { super.dropSelf(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#add} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 20 Jul 2025 07:02:21 GMT") - public void add(Block block, LootTable.Builder builder) { super.add(block, builder); } - - // GENERATED END + // GENERATED START - DO NOT EDIT BELOW THIS LINE + + /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionDecay} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public > T applyExplosionDecay(ItemLike type, FunctionUserBuilder builder) { return super.applyExplosionDecay(type, builder); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionCondition} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public > T applyExplosionCondition(ItemLike type, ConditionUserBuilder builder) { return super.applyExplosionCondition(type, builder); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSelfDropDispatchTable} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public static LootTable.Builder createSelfDropDispatchTable(Block original, LootItemCondition.Builder condition, LootPoolEntryContainer.Builder entry) { return BlockLootSubProvider.createSelfDropDispatchTable(original, condition, entry); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchDispatchTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSilkTouchDispatchTable(Block original, LootPoolEntryContainer.Builder entry) { return super.createSilkTouchDispatchTable(original, entry); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsDispatchTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createShearsDispatchTable(Block original, LootPoolEntryContainer.Builder entry) { return super.createShearsDispatchTable(original, entry); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOrShearsDispatchTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSilkTouchOrShearsDispatchTable(Block original, LootPoolEntryContainer.Builder entry) { return super.createSilkTouchOrShearsDispatchTable(original, entry); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSingleItemTableWithSilkTouch(Block original, ItemLike drop) { return super.createSingleItemTableWithSilkTouch(original, drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSingleItemTable(ItemLike drop, NumberProvider count) { return super.createSingleItemTable(drop, count); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSingleItemTableWithSilkTouch(Block original, ItemLike drop, NumberProvider count) { return super.createSingleItemTableWithSilkTouch(original, drop, count); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOnlyTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSilkTouchOnlyTable(ItemLike drop) { return super.createSilkTouchOnlyTable(drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createPotFlowerItemTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createPotFlowerItemTable(ItemLike flower) { return super.createPotFlowerItemTable(flower); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSlabItemTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSlabItemTable(Block slab) { return super.createSlabItemTable(slab); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createNameableBlockEntityTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createNameableBlockEntityTable(Block drop) { return super.createNameableBlockEntityTable(drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShulkerBoxDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createShulkerBoxDrop(Block shulkerBox) { return super.createShulkerBoxDrop(shulkerBox); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCopperOreDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createCopperOreDrops(Block block) { return super.createCopperOreDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createLapisOreDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createLapisOreDrops(Block block) { return super.createLapisOreDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createRedstoneOreDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createRedstoneOreDrops(Block block) { return super.createRedstoneOreDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createBannerDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createBannerDrop(Block original) { return super.createBannerDrop(original); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeNestDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createBeeNestDrop(Block original) { return super.createBeeNestDrop(original); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeHiveDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createBeeHiveDrop(Block original) { return super.createBeeHiveDrop(original); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCaveVinesDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createCaveVinesDrop(Block original) { return super.createCaveVinesDrop(original); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCopperGolemStatueBlock} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createCopperGolemStatueBlock(Block block) { return super.createCopperGolemStatueBlock(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createOreDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createOreDrop(Block original, Item drop) { return super.createOreDrop(original, drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMushroomBlockDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createMushroomBlockDrop(Block original, ItemLike drop) { return super.createMushroomBlockDrop(original, drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createGrassDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createGrassDrops(Block original) { return super.createGrassDrops(original); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOnlyDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createShearsOnlyDrop(ItemLike drop) { return super.createShearsOnlyDrop(drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOrSilkTouchOnlyDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createShearsOrSilkTouchOnlyDrop(ItemLike drop) { return super.createShearsOrSilkTouchOnlyDrop(drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createMultifaceBlockDrops(Block block, LootItemCondition.Builder condition) { return super.createMultifaceBlockDrops(block, condition); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createMultifaceBlockDrops(Block block) { return super.createMultifaceBlockDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMossyCarpetBlockDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createMossyCarpetBlockDrops(Block block) { return super.createMossyCarpetBlockDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createLeavesDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createLeavesDrops(Block original, Block sapling, float... saplingChances) { return super.createLeavesDrops(original, sapling, saplingChances); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createOakLeavesDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createOakLeavesDrops(Block original, Block sapling, float... saplingChances) { return super.createOakLeavesDrops(original, sapling, saplingChances); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMangroveLeavesDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createMangroveLeavesDrops(Block block) { return super.createMangroveLeavesDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCropDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createCropDrops(Block original, Item cropDrop, Item seedDrop, LootItemCondition.Builder isMaxAge) { return super.createCropDrops(original, cropDrop, seedDrop, isMaxAge); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantShearsDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createDoublePlantShearsDrop(Block block) { return super.createDoublePlantShearsDrop(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantWithSeedDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createDoublePlantWithSeedDrops(Block block, Block drop) { return super.createDoublePlantWithSeedDrops(block, drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createCandleDrops(Block block) { return super.createCandleDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleCakeDrops} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public static LootTable.Builder createCandleCakeDrops(Block candle) { return BlockLootSubProvider.createCandleCakeDrops(candle); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#addNetherVinesDropTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void addNetherVinesDropTable(Block vineBlock, Block plantBlock) { super.addNetherVinesDropTable(vineBlock, plantBlock); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoorTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createDoorTable(Block block) { return super.createDoorTable(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropPottedContents} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void dropPottedContents(Block potted) { super.dropPottedContents(potted); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#otherWhenSilkTouch} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void otherWhenSilkTouch(Block block, Block other) { super.otherWhenSilkTouch(block, other); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropOther} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void dropOther(Block block, ItemLike drop) { super.dropOther(block, drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropWhenSilkTouch} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void dropWhenSilkTouch(Block block) { super.dropWhenSilkTouch(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropSelf} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void dropSelf(Block block) { super.dropSelf(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#add} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void add(Block block, LootTable.Builder builder) { super.add(block, builder); } + + // GENERATED END } diff --git a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateEntityLootTables.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateEntityLootTables.java index 28f050c..7723e12 100644 --- a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateEntityLootTables.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateEntityLootTables.java @@ -1,7 +1,6 @@ package com.modularmc.registrate.providers.loot; import com.modularmc.registrate.AbstractRegistrate; - import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; @@ -14,12 +13,11 @@ import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import javax.annotation.processing.Generated; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Stream; -import javax.annotation.Generated; - public class RegistrateEntityLootTables extends EntityLootSubProvider implements RegistrateLootTables { private final AbstractRegistrate parent; @@ -65,22 +63,22 @@ public HolderLookup> entityLookup() { } // @formatter:off - // GENERATED START - DO NOT EDIT BELOW THIS LINE + // GENERATED START - DO NOT EDIT BELOW THIS LINE - /** Generated override to expose protected method: {@link EntityLootSubProvider#killedByFrog} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 20 Jul 2025 07:02:04 GMT") - public LootItemCondition.Builder killedByFrog(HolderGetter> entityTypeRegistry) { return super.killedByFrog(entityTypeRegistry); } + /** Generated override to expose protected method: {@link EntityLootSubProvider#killedByFrog} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 19 Apr 2026 10:15:16 GMT") + public LootItemCondition.Builder killedByFrog(HolderGetter> entityTypes) { return super.killedByFrog(entityTypes); } - /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 20 Jul 2025 07:02:04 GMT") - public void add(EntityType entityType, LootTable.Builder builder) { super.add(entityType, builder); } + /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 19 Apr 2026 10:15:16 GMT") + public void add(EntityType type, LootTable.Builder builder) { super.add(type, builder); } - /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ - @Override - @Generated(value = "com.tterrag.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 20 Jul 2025 07:02:04 GMT") - public void add(EntityType entityType, ResourceKey defaultLootTable, LootTable.Builder builder) { super.add(entityType, defaultLootTable, builder); } + /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 19 Apr 2026 10:15:16 GMT") + public void add(EntityType type, ResourceKey lootTable, LootTable.Builder builder) { super.add(type, lootTable, builder); } - // GENERATED END + // GENERATED END } diff --git a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java index 460c877..d74644f 100644 --- a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java @@ -1,10 +1,13 @@ package com.modularmc.registrate.providers.loot; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Multimap; import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.providers.RegistrateProvider; import com.modularmc.registrate.util.nullness.NonNullConsumer; - import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.core.WritableRegistry; @@ -12,20 +15,16 @@ import net.minecraft.data.loot.LootTableProvider; import net.minecraft.data.loot.LootTableSubProvider; import net.minecraft.data.loot.packs.VanillaLootTableProvider; -import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.Identifier; import net.minecraft.util.ProblemReporter; import net.minecraft.util.context.ContextKeySet; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.ValidationContext; +import net.minecraft.world.level.storage.loot.ValidationContextSource; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.neoforged.fml.LogicalSide; import net.neoforged.fml.util.ObfuscationReflectionHelper; - -import com.google.common.collect.BiMap; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Multimap; import org.apache.commons.lang3.function.TriFunction; import java.util.*; @@ -46,7 +45,6 @@ public interface LootType { static LootType register(String name, ContextKeySet set, TriFunction, Consumer, T> factory) { LootType type = new LootType() { - @Override public T getLootCreator(HolderLookup.Provider provider, AbstractRegistrate parent, Consumer callback) { return factory.apply(provider, parent, callback); @@ -78,7 +76,7 @@ public RegistrateLootTableProvider(AbstractRegistrate parent, PackOutput pack this.provider = provider; } - public HolderLookup.Provider getProvider() { + public HolderLookup.Provider getProvider(){ return provider.getNow(null); } @@ -92,8 +90,8 @@ public LogicalSide getSide() { } @Override - protected void validate(WritableRegistry writableregistry, ValidationContext validationcontext, ProblemReporter.Collector problemreporter$collector) { - currentLootCreators.forEach(c -> c.validate(writableregistry, validationcontext)); + protected void validate(WritableRegistry tables, ValidationContextSource validationContext, ProblemReporter.Collector problems) { + currentLootCreators.forEach(c -> c.validate(tables, validationContext)); } @SuppressWarnings("unchecked") @@ -105,7 +103,7 @@ public void addLootAction(ContextKeySet set, Consumer parent, LootType type) { + private LootTableSubProvider getLootCreator(HolderLookup. Provider provider, AbstractRegistrate parent, LootType type) { RegistrateLootTables creator = type.getLootCreator(provider, parent, cons -> specialLootActions.get(type).forEach(c -> c.accept(cons))); currentLootCreators.add(creator); return creator; diff --git a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTables.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTables.java index a326de9..9b348ec 100644 --- a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTables.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTables.java @@ -2,10 +2,13 @@ import net.minecraft.core.WritableRegistry; import net.minecraft.data.loot.LootTableSubProvider; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.ValidationContext; +import net.minecraft.world.level.storage.loot.ValidationContextSource; -public interface RegistrateLootTables extends LootTableSubProvider { +import java.util.Map; - default void validate(WritableRegistry writableRegistry, ValidationContext validationContext) {} +public interface RegistrateLootTables extends LootTableSubProvider { + default void validate(WritableRegistry tables, ValidationContextSource validationContext) {} } diff --git a/src/main/java/com/modularmc/registrate/providers/loot/package-info.java b/src/main/java/com/modularmc/registrate/providers/loot/package-info.java index e5e260c..1b744c3 100644 --- a/src/main/java/com/modularmc/registrate/providers/loot/package-info.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/package-info.java @@ -1,6 +1,2 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault +@org.jspecify.annotations.NullMarked package com.modularmc.registrate.providers.loot; - -import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/main/java/com/modularmc/registrate/providers/package-info.java b/src/main/java/com/modularmc/registrate/providers/package-info.java index 99ed714..ed93514 100644 --- a/src/main/java/com/modularmc/registrate/providers/package-info.java +++ b/src/main/java/com/modularmc/registrate/providers/package-info.java @@ -1,6 +1,2 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault +@org.jspecify.annotations.NullMarked package com.modularmc.registrate.providers; - -import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/main/java/com/modularmc/registrate/util/CreativeModeTabModifier.java b/src/main/java/com/modularmc/registrate/util/CreativeModeTabModifier.java index 58cb1cb..9e9acc0 100644 --- a/src/main/java/com/modularmc/registrate/util/CreativeModeTabModifier.java +++ b/src/main/java/com/modularmc/registrate/util/CreativeModeTabModifier.java @@ -1,18 +1,17 @@ package com.modularmc.registrate.util; +import org.jetbrains.annotations.ApiStatus; + import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; -import org.jetbrains.annotations.ApiStatus; - import java.util.function.BiConsumer; import java.util.function.BooleanSupplier; import java.util.function.Supplier; public final class CreativeModeTabModifier implements CreativeModeTab.Output { - private final Supplier flags; private final BooleanSupplier hasPermissions; private final BiConsumer acceptFunc; @@ -23,14 +22,14 @@ public CreativeModeTabModifier(Supplier flags, BooleanSupplier h this.flags = flags; this.hasPermissions = hasPermissions; this.acceptFunc = acceptFunc; - this.parameters = parameters; - } + this.parameters = parameters; + } public FeatureFlagSet getFlags() { return flags.get(); } - public CreativeModeTab.ItemDisplayParameters getParameters() { + public CreativeModeTab.ItemDisplayParameters getParameters(){ return parameters.get(); } diff --git a/src/main/java/com/modularmc/registrate/util/DataIngredient.java b/src/main/java/com/modularmc/registrate/util/DataIngredient.java index c89c915..483d737 100644 --- a/src/main/java/com/modularmc/registrate/util/DataIngredient.java +++ b/src/main/java/com/modularmc/registrate/util/DataIngredient.java @@ -1,11 +1,12 @@ package com.modularmc.registrate.util; +import com.google.common.collect.ObjectArrays; import com.modularmc.registrate.providers.generators.RegistrateRecipeProvider; import com.modularmc.registrate.util.nullness.NonNullSupplier; - +import lombok.Getter; import net.minecraft.advancements.Criterion; -import net.minecraft.advancements.critereon.InventoryChangeTrigger; -import net.minecraft.advancements.critereon.ItemPredicate; +import net.minecraft.advancements.criterion.InventoryChangeTrigger; +import net.minecraft.advancements.criterion.ItemPredicate; import net.minecraft.core.HolderSet; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.Identifier; @@ -14,9 +15,6 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; -import com.google.common.collect.ObjectArrays; -import lombok.Getter; - import java.util.Arrays; import java.util.function.Function; import java.util.function.Supplier; @@ -25,15 +23,13 @@ * A helper for data generation when using ingredients as input(s) to recipes.
            * It remembers the name of the primary ingredient for use in creating recipe names/criteria. *

            - * Create an instance of this class with the various factory methods such as {@link #items(ItemLike, ItemLike...)} and - * {@link #tag(HolderSet.Named)} )}. + * Create an instance of this class with the various factory methods such as {@link #items(ItemLike, ItemLike...)} and {@link #tag(HolderSet.Named)} )}. *

            - * This class should not be used for any purpose other than data generation, it will throw an exception - * if it is serialized to a packet buffer. + * This class should not be used for any purpose other than data generation, it will throw an exception if it is serialized to a packet buffer. */ public final class DataIngredient { - // TODO <1.21.4> removed delegate. Is there a need to add it back? + //TODO <1.21.4> removed delegate. Is there a need to add it back? private final Ingredient parent; @Getter private final Identifier id; @@ -44,13 +40,13 @@ private DataIngredient(Ingredient parent, ItemLike item) { this.id = BuiltInRegistries.ITEM.getKey(item.asItem()); this.criteriaFactory = prov -> prov.has(item); } - + private DataIngredient(Ingredient parent, TagKey tag) { this.parent = parent; this.id = tag.location(); this.criteriaFactory = prov -> prov.has(tag); } - + private DataIngredient(Ingredient parent, Identifier id, ItemPredicate... predicates) { this.parent = parent; this.id = id; @@ -60,7 +56,7 @@ private DataIngredient(Ingredient parent, Identifier id, ItemPredicate... predic public Criterion getCriterion(RegistrateRecipeProvider prov) { return criteriaFactory.apply(prov); } - + @SuppressWarnings("unchecked") @SafeVarargs public static DataIngredient items(NonNullSupplier first, NonNullSupplier... others) { @@ -75,15 +71,15 @@ public static DataIngredient items(T first, T... others) { public static DataIngredient tag(HolderSet.Named tag) { return ingredient(Ingredient.of(tag), tag.key()); } - + public static DataIngredient ingredient(Ingredient parent, ItemLike required) { return new DataIngredient(parent, required); } - + public static DataIngredient ingredient(Ingredient parent, TagKey required) { return new DataIngredient(parent, required); } - + public static DataIngredient ingredient(Ingredient parent, Identifier id, ItemPredicate... criteria) { return new DataIngredient(parent, id, criteria); } diff --git a/src/main/java/com/modularmc/registrate/util/DebugMarkers.java b/src/main/java/com/modularmc/registrate/util/DebugMarkers.java index 17685cc..a51aa0d 100644 --- a/src/main/java/com/modularmc/registrate/util/DebugMarkers.java +++ b/src/main/java/com/modularmc/registrate/util/DebugMarkers.java @@ -5,13 +5,13 @@ @SuppressWarnings("null") public class DebugMarkers { - + private static final String PREFIX = "REGISTRATE."; - + private static final Marker marker(String name) { return MarkerManager.getMarker(PREFIX + name); } - + public static final Marker REGISTER = marker("REGISTER"); public static final Marker DATA = marker("DATA"); -} +} \ No newline at end of file diff --git a/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java b/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java index a9892b2..6922f52 100644 --- a/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java +++ b/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java @@ -1,19 +1,16 @@ package com.modularmc.registrate.util; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.util.nullness.NonnullType; - +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; import net.neoforged.bus.api.Event; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.event.IModBusEvent; import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; import net.neoforged.neoforge.common.NeoForge; - -import com.google.common.collect.HashBasedTable; -import com.google.common.collect.Table; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; @@ -24,12 +21,13 @@ @RequiredArgsConstructor @Log4j2 -public class OneTimeEventReceiver implements Consumer<@NonnullType T> { +public class OneTimeEventReceiver implements Consumer { + public static void addModListener(AbstractRegistrate owner, Class evtClass, Consumer listener) { OneTimeEventReceiver.addModListener(owner, EventPriority.NORMAL, evtClass, listener); } - + public static void addModListener(AbstractRegistrate owner, EventPriority priority, Class evtClass, Consumer listener) { if (owner.getModEventBus() == null) { if (!waitingModListeners.contains(owner, evtClass)) { @@ -42,7 +40,7 @@ public static void addModListener(AbstractRegis seenModBus = true; for (var waitingListener : waitingModListeners.row(owner).entrySet()) { for (var pair : waitingListener.getValue()) { - // noinspection unchecked + //noinspection unchecked OneTimeEventReceiver.addListener(owner.getModEventBus(), pair.getKey(), (Class) waitingListener.getKey(), (Consumer) pair.getValue()); } } @@ -50,20 +48,20 @@ public static void addModListener(AbstractRegis } OneTimeEventReceiver.addListener(owner.getModEventBus(), priority, evtClass, listener); } - + public static void addForgeListener(Class evtClass, Consumer listener) { OneTimeEventReceiver.addForgeListener(EventPriority.NORMAL, evtClass, listener); } - + public static void addForgeListener(EventPriority priority, Class evtClass, Consumer listener) { OneTimeEventReceiver.addListener(NeoForge.EVENT_BUS, priority, evtClass, listener); } - + @Deprecated public static void addListener(IEventBus bus, Class evtClass, Consumer listener) { OneTimeEventReceiver.addListener(bus, EventPriority.NORMAL, evtClass, listener); } - + @SuppressWarnings("unchecked") @Deprecated public static void addListener(IEventBus bus, EventPriority priority, Class evtClass, Consumer listener) { diff --git a/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java b/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java index 9e5e703..02fdad1 100644 --- a/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java +++ b/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java @@ -6,9 +6,8 @@ import java.util.function.Supplier; public class RegistrateDistExecutor { - public static void unsafeRunWhenOn(Dist dist, Supplier toRun) { - if (dist == FMLEnvironment.dist) { + if (dist == FMLEnvironment.getDist()) { toRun.get().run(); } } diff --git a/src/main/java/com/modularmc/registrate/util/Sequence.java b/src/main/java/com/modularmc/registrate/util/Sequence.java index d06aa81..36e02b8 100644 --- a/src/main/java/com/modularmc/registrate/util/Sequence.java +++ b/src/main/java/com/modularmc/registrate/util/Sequence.java @@ -3,21 +3,19 @@ import java.util.function.Supplier; public class Sequence { - - public static Sequence create() { - return new Sequence<>(); - } - + + public static Sequence create() { return new Sequence<>(); } + public Sequence run(Runnable toRun) { toRun.run(); return this; } - + public Sequence next(Supplier val) { val.get(); return this; } - + public Sequence next(T val) { return this; } diff --git a/src/main/java/com/modularmc/registrate/util/entry/BlockEntityEntry.java b/src/main/java/com/modularmc/registrate/util/entry/BlockEntityEntry.java index 030af6f..b3df910 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/BlockEntityEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/BlockEntityEntry.java @@ -1,5 +1,9 @@ package com.modularmc.registrate.util.entry; +import java.util.Optional; + +import org.jspecify.annotations.Nullable; + import com.modularmc.registrate.AbstractRegistrate; import net.minecraft.core.BlockPos; @@ -9,10 +13,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.registries.DeferredHolder; -import java.util.Optional; - -import javax.annotation.Nullable; - public class BlockEntityEntry extends RegistryEntry, BlockEntityType> { public BlockEntityEntry(AbstractRegistrate owner, DeferredHolder, BlockEntityType> delegate) { @@ -21,7 +21,7 @@ public BlockEntityEntry(AbstractRegistrate owner, DeferredHolder get(BlockGetter world, BlockPos pos) { return Optional.ofNullable(getNullable(world, pos)); @@ -55,11 +54,11 @@ public Optional get(BlockGetter world, BlockPos pos) { /** * Get an instance of this {@link BlockEntity} from the world. - * + * * @param world - * The world to look for the instance in + * The world to look for the instance in * @param pos - * The position of the instance + * The position of the instance * @return The instance, if it exists and matches this type. Otherwise, {@code null}. */ @SuppressWarnings("unchecked") diff --git a/src/main/java/com/modularmc/registrate/util/entry/BlockEntry.java b/src/main/java/com/modularmc/registrate/util/entry/BlockEntry.java index 14623e3..93fa36d 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/BlockEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/BlockEntry.java @@ -19,7 +19,7 @@ public BlockState getDefaultState() { public boolean has(BlockState state) { return is(state.getBlock()); } - + public static BlockEntry cast(RegistryEntry entry) { return RegistryEntry.cast(BlockEntry.class, entry); } diff --git a/src/main/java/com/modularmc/registrate/util/entry/EntityEntry.java b/src/main/java/com/modularmc/registrate/util/entry/EntityEntry.java index 03f5fe6..03bfc9e 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/EntityEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/EntityEntry.java @@ -1,14 +1,13 @@ package com.modularmc.registrate.util.entry; import com.modularmc.registrate.AbstractRegistrate; - import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySpawnReason; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.neoforged.neoforge.registries.DeferredHolder; -import javax.annotation.Nullable; +import org.jspecify.annotations.Nullable; public class EntityEntry extends RegistryEntry, EntityType> { diff --git a/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java b/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java index e49fd04..bfe9d54 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java @@ -1,8 +1,13 @@ package com.modularmc.registrate.util.entry; +import java.util.Optional; + +import org.jspecify.annotations.Nullable; + import com.modularmc.registrate.AbstractRegistrate; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.material.Fluid; @@ -10,10 +15,6 @@ import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.registries.DeferredHolder; -import java.util.Optional; - -import javax.annotation.Nullable; - public class FluidEntry extends RegistryEntry { private final @Nullable BlockEntry block; diff --git a/src/main/java/com/modularmc/registrate/util/entry/ItemEntry.java b/src/main/java/com/modularmc/registrate/util/entry/ItemEntry.java index 6aa577e..7d62366 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/ItemEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/ItemEntry.java @@ -10,7 +10,7 @@ public class ItemEntry extends ItemProviderEntry { public ItemEntry(AbstractRegistrate owner, DeferredHolder delegate) { super(owner, delegate); } - + public static ItemEntry cast(RegistryEntry entry) { return RegistryEntry.cast(ItemEntry.class, entry); } diff --git a/src/main/java/com/modularmc/registrate/util/entry/ItemProviderEntry.java b/src/main/java/com/modularmc/registrate/util/entry/ItemProviderEntry.java index c30816b..8aab3b4 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/ItemProviderEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/ItemProviderEntry.java @@ -4,6 +4,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemStackTemplate; import net.minecraft.world.level.ItemLike; import net.neoforged.neoforge.registries.DeferredHolder; @@ -21,6 +22,14 @@ public ItemStack asStack(int count) { return new ItemStack(this, count); } + public ItemStackTemplate asStackTemplate() { + return new ItemStackTemplate(asItem(), 1); + } + + public ItemStackTemplate asStackTemplate(int count) { + return new ItemStackTemplate(asItem(), count); + } + public boolean isIn(ItemStack stack) { return is(stack.getItem()); } diff --git a/src/main/java/com/modularmc/registrate/util/entry/LazyRegistryEntry.java b/src/main/java/com/modularmc/registrate/util/entry/LazyRegistryEntry.java index c45b9e5..03fb6fb 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/LazyRegistryEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/LazyRegistryEntry.java @@ -1,20 +1,18 @@ package com.modularmc.registrate.util.entry; -import com.modularmc.registrate.util.nullness.NonNullSupplier; +import org.jspecify.annotations.Nullable; -import javax.annotation.Nullable; +import com.modularmc.registrate.util.nullness.NonNullSupplier; public class LazyRegistryEntry implements NonNullSupplier { - @Nullable - private NonNullSupplier> supplier; - @Nullable - private RegistryEntry value; + private @Nullable NonNullSupplier> supplier; + private @Nullable RegistryEntry value; public LazyRegistryEntry(NonNullSupplier> supplier) { this.supplier = supplier; } - + @Override public T get() { NonNullSupplier> supplier = this.supplier; diff --git a/src/main/java/com/modularmc/registrate/util/entry/MenuEntry.java b/src/main/java/com/modularmc/registrate/util/entry/MenuEntry.java index de3ec28..86576bc 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/MenuEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/MenuEntry.java @@ -1,9 +1,13 @@ package com.modularmc.registrate.util.entry; +import java.util.function.Consumer; + import com.modularmc.registrate.AbstractRegistrate; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.entity.player.Inventory; @@ -12,8 +16,6 @@ import net.minecraft.world.inventory.MenuType; import net.neoforged.neoforge.registries.DeferredHolder; -import java.util.function.Consumer; - public class MenuEntry extends RegistryEntry, MenuType> { public MenuEntry(AbstractRegistrate owner, DeferredHolder, MenuType> delegate) { diff --git a/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java b/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java index faf19d9..fa494a1 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java @@ -1,5 +1,9 @@ package com.modularmc.registrate.util.entry; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; + import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.nullness.NonNullSupplier; @@ -7,19 +11,13 @@ import net.minecraft.resources.ResourceKey; import net.neoforged.neoforge.registries.DeferredHolder; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Predicate; - /** - * Wraps a {@link net.neoforged.neoforge.registries.DeferredHolder}, providing a cleaner API with null-safe access, and - * registrate-specific extensions such as {@link #getSibling(ResourceKey)}. + * Wraps a {@link net.neoforged.neoforge.registries.DeferredHolder}, providing a cleaner API with null-safe access, and registrate-specific extensions such as {@link #getSibling(ResourceKey)}. * * @param * The type of the entry */ public class RegistryEntry extends DeferredHolder implements NonNullSupplier { - private final AbstractRegistrate owner; @SuppressWarnings("unused") @@ -35,20 +33,18 @@ public RegistryEntry getSibling(ResourceKey RegistryEntry getSibling(Registry registry) { + public RegistryEntry getSibling(Registry registry) { return getSibling(registry.key()); } /** - * If an entry is present, and the entry matches the given predicate, return an {@link Optional} - * describing the value, otherwise return an empty {@link Optional}. + * If an entry is present, and the entry matches the given predicate, return an {@link Optional} describing the value, otherwise return an empty {@link Optional}. * * @param predicate - * a {@link Predicate predicate} to apply to the entry, if present - * @return an {@link RegistryEntry} describing the value of this {@link RegistryEntry} if the entry is present and - * matches the given predicate, otherwise an empty {@link RegistryEntry} + * a {@link Predicate predicate} to apply to the entry, if present + * @return an {@link RegistryEntry} describing the value of this {@link RegistryEntry} if the entry is present and matches the given predicate, otherwise an empty {@link RegistryEntry} * @throws NullPointerException - * if the predicate is null + * if the predicate is null */ public Optional> filter(Predicate predicate) { Objects.requireNonNull(predicate); diff --git a/src/main/java/com/modularmc/registrate/util/entry/package-info.java b/src/main/java/com/modularmc/registrate/util/entry/package-info.java index e5711a6..cf367f4 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/package-info.java +++ b/src/main/java/com/modularmc/registrate/util/entry/package-info.java @@ -1,6 +1,2 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault +@org.jspecify.annotations.NullMarked package com.modularmc.registrate.util.entry; - -import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiConsumer.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiConsumer.java index db7880a..ce4842e 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiConsumer.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiConsumer.java @@ -3,8 +3,8 @@ import java.util.function.BiConsumer; @FunctionalInterface -public interface NonNullBiConsumer<@NonnullType T, @NonnullType U> extends BiConsumer { - +public interface NonNullBiConsumer extends BiConsumer { + @Override void accept(T t, U u); diff --git a/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiFunction.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiFunction.java index e64b345..e087efe 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiFunction.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiFunction.java @@ -3,8 +3,8 @@ import java.util.function.BiFunction; @FunctionalInterface -public interface NonNullBiFunction<@NonnullType T, @NonnullType U, @NonnullType R> extends BiFunction { - +public interface NonNullBiFunction extends BiFunction { + @Override R apply(T t, U u); } diff --git a/src/main/java/com/modularmc/registrate/util/nullness/NonNullConsumer.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullConsumer.java index f9ef790..1e72035 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/NonNullConsumer.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullConsumer.java @@ -4,19 +4,16 @@ import java.util.function.Consumer; @FunctionalInterface -public interface NonNullConsumer<@NonnullType T> extends Consumer { - +public interface NonNullConsumer extends Consumer { + @Override void accept(T t); - + default NonNullConsumer andThen(NonNullConsumer after) { Objects.requireNonNull(after); - return (T t) -> { - accept(t); - after.accept(t); - }; + return (T t) -> { accept(t); after.accept(t); }; } - + static NonNullConsumer noop() { return t -> {}; } diff --git a/src/main/java/com/modularmc/registrate/util/nullness/NonNullFunction.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullFunction.java index 5d229b6..bfbcbe2 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/NonNullFunction.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullFunction.java @@ -4,7 +4,7 @@ import java.util.function.Function; @FunctionalInterface -public interface NonNullFunction<@NonnullType T, @NonnullType R> extends Function { +public interface NonNullFunction extends Function { @Override R apply(T t); diff --git a/src/main/java/com/modularmc/registrate/util/nullness/NonNullSupplier.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullSupplier.java index 87df48e..576a711 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/NonNullSupplier.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullSupplier.java @@ -6,16 +6,16 @@ import java.util.function.Supplier; @FunctionalInterface -public interface NonNullSupplier<@NonnullType T> extends Supplier { - +public interface NonNullSupplier extends Supplier { + @Override T get(); - static NonNullSupplier of(Supplier<@NullableType T> sup) { + static NonNullSupplier of(Supplier sup) { return of(sup, () -> "Unexpected null value from supplier"); } - - static NonNullSupplier of(Supplier<@NullableType T> sup, NonNullSupplier errorMsg) { + + static NonNullSupplier of(Supplier sup, NonNullSupplier errorMsg) { return () -> { T res = sup.get(); Objects.requireNonNull(res, errorMsg); @@ -27,7 +27,7 @@ default NonNullSupplier lazy() { return lazy(this); } - static NonNullSupplier lazy(Supplier<@NonnullType T> sup) { + static NonNullSupplier lazy(Supplier sup) { return Lazy.of(sup)::get; } } diff --git a/src/main/java/com/modularmc/registrate/util/nullness/NullableSupplier.java b/src/main/java/com/modularmc/registrate/util/nullness/NullableSupplier.java index 5400b10..bfa8f12 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/NullableSupplier.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NullableSupplier.java @@ -1,28 +1,30 @@ package com.modularmc.registrate.util.nullness; +import org.jspecify.annotations.Nullable; + import java.util.Objects; import java.util.function.Supplier; @Deprecated -public interface NullableSupplier<@NullableType T> extends Supplier { - +public interface NullableSupplier extends Supplier<@Nullable T> { + @Override - T get(); + @Nullable T get(); default T getNonNull() { return getNonNull(() -> "Unexpected null value from supplier"); } - + default T getNonNull(NonNullSupplier errorMsg) { T res = get(); Objects.requireNonNull(res, errorMsg); return res; } - + default NonNullSupplier asNonNull() { return () -> getNonNull(); } - + default NonNullSupplier asNonNull(NonNullSupplier errorMsg) { return () -> getNonNull(errorMsg); } diff --git a/src/main/java/com/modularmc/registrate/util/nullness/package-info.java b/src/main/java/com/modularmc/registrate/util/nullness/package-info.java index e692918..090602b 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/package-info.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/package-info.java @@ -1,4 +1,2 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault +@org.jspecify.annotations.NullMarked package com.modularmc.registrate.util.nullness; diff --git a/src/main/java/com/modularmc/registrate/util/package-info.java b/src/main/java/com/modularmc/registrate/util/package-info.java index e1e0c2d..8dc3559 100644 --- a/src/main/java/com/modularmc/registrate/util/package-info.java +++ b/src/main/java/com/modularmc/registrate/util/package-info.java @@ -1,6 +1,2 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault +@org.jspecify.annotations.NullMarked package com.modularmc.registrate.util; - -import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java b/src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java new file mode 100644 index 0000000..5c6c073 --- /dev/null +++ b/src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java @@ -0,0 +1,23 @@ +package com.modularmc.registrate.test.gametests; + +import com.modularmc.registrate.test.mod.TestMod; +import net.neoforged.testframework.DynamicTest; +import net.neoforged.testframework.annotation.ForEachTest; +import net.neoforged.testframework.annotation.TestHolder; +import net.neoforged.testframework.gametest.EmptyTemplate; +import net.neoforged.testframework.gametest.GameTest; + +@ForEachTest(groups = "custom-item") +public class CustomItemTests { + + @GameTest + @EmptyTemplate(floor = true) + @TestHolder(description = "Ensure custom item is registered and has the expected properties") + public static void ensureItemContent(final DynamicTest test) { + test.onGameTest(helper -> helper.startSequence(() -> TestMod.instance().testitem.asStack()) + .thenMap(stack -> stack.getHoverName().getString()) + .thenExecute(name -> helper.assertValueEqual(name, "Testitem", "Test Item localized name")) + .thenSucceed() + ); + } +} diff --git a/src/test/java/com/modularmc/registrate/test/meta/MethodGenerator.java b/src/test/java/com/modularmc/registrate/test/meta/MethodGenerator.java index 1b4e174..9fa63ea 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/MethodGenerator.java +++ b/src/test/java/com/modularmc/registrate/test/meta/MethodGenerator.java @@ -1,15 +1,8 @@ package com.modularmc.registrate.test.meta; -import com.modularmc.registrate.test.meta.ProtectedMethodScraper.Header; - -import com.google.common.base.Charsets; -import com.google.common.collect.ImmutableList; -import lombok.RequiredArgsConstructor; -import lombok.Value; -import org.apache.commons.lang3.tuple.Pair; - import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -19,15 +12,24 @@ import java.util.ListIterator; import java.util.Set; +import org.apache.commons.lang3.tuple.Pair; + +import com.google.common.base.Charsets; +import com.google.common.collect.ImmutableList; +import com.modularmc.registrate.test.meta.ProtectedMethodScraper.Header; + +import lombok.RequiredArgsConstructor; +import lombok.Value; + @RequiredArgsConstructor public class MethodGenerator { - + @Value private class Exclusion { String name; String[] params; - + public boolean matches(Header header) { if (!header.getName().equals(this.name)) { return false; @@ -35,31 +37,31 @@ public boolean matches(Header header) { return this.params == null ? true : Arrays.equals(header.getParamTypes(), this.params); } } - + private static final String START_KEY = "// GENERATED START"; private static final String END_KEY = "// GENERATED END"; - + private final List> typeReplacements; private final Set excludes = new HashSet<>(); - + private final Class mainClass; - + public MethodGenerator(Class mainClass) { this(ImmutableList.of(), mainClass); } - + public MethodGenerator exclude(String name) { excludes.add(new Exclusion(name, null)); return this; } - + public MethodGenerator exclude(String name, String... paramTypes) { excludes.add(new Exclusion(name, paramTypes)); return this; } public void generate(Path output) throws IOException { - List currentSource = Files.readAllLines(output, Charsets.UTF_8); + List currentSource = Files.readAllLines(output, StandardCharsets.UTF_8); List

            newHeaders = ProtectedMethodScraper.scrapeInput(); ListIterator
            headerItr = newHeaders.listIterator(); while (headerItr.hasNext()) { diff --git a/src/test/java/com/modularmc/registrate/test/meta/ProtectedMethodScraper.java b/src/test/java/com/modularmc/registrate/test/meta/ProtectedMethodScraper.java index 739833a..e84ad40 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/ProtectedMethodScraper.java +++ b/src/test/java/com/modularmc/registrate/test/meta/ProtectedMethodScraper.java @@ -1,10 +1,5 @@ package com.modularmc.registrate.test.meta; -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; -import lombok.Value; -import org.apache.commons.lang3.tuple.Pair; - import java.time.Instant; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; @@ -17,9 +12,14 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.apache.commons.lang3.tuple.Pair; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.Value; + /** - * Scrapes all protected methods from pasted source, and emits them as public super-calling stubs. Used to create the - * bouncer classes such as BuilderModelProvider. + * Scrapes all protected methods from pasted source, and emits them as public super-calling stubs. Used to create the bouncer classes such as BuilderModelProvider. */ public class ProtectedMethodScraper { @@ -34,7 +34,7 @@ public static class Header { String name; String[] paramTypes; String[] paramNames; - + public Header applyTypeReplacement(Pair repl) { String[] newParamTypes = Arrays.copyOf(paramTypes, paramTypes.length); for (int i = 0; i < newParamTypes.length; i++) { @@ -53,7 +53,7 @@ public String printStubMethod(Class source) { base.append("@Override\n"); } base.append("@Generated(value = \"").append(source.getName()).append("\", date = \"") - .append(DateTimeFormatter.RFC_1123_DATE_TIME.format(Instant.now().atZone(ZoneOffset.UTC))).append("\")\n"); + .append(DateTimeFormatter.RFC_1123_DATE_TIME.format(Instant.now().atZone(ZoneOffset.UTC))).append("\")\n"); base.append("public ").append(isStatic ? "static " : ""); if (generics != null) { base.append(generics).append(" "); @@ -75,7 +75,7 @@ public String printStubMethod(Class source) { return base.toString(); } - // Match generics up to three levels deep -- java does not support recursive patterns + // Match generics up to three levels deep -- java does not support recursive patterns private static final Pattern HEADER_PATTERN = Pattern.compile("^\\s*protected\\s+(?:(static)\\s)?\\s*(<[^<>]+(?:<[^<>]+(?:<[^<>]+>[^<>]*)*>[^<>]*)*>)?\\s*(\\S+)\\s+(\\S+)\\((.+)\\)\\s\\{$"); private static final Pattern PARAM_PATTERN = Pattern.compile("([a-zA-Z_][\\w.$]+(?:<.+>)?)\\s+(\\S+)"); diff --git a/src/test/java/com/modularmc/registrate/test/meta/UpdateBlockLootTables.java b/src/test/java/com/modularmc/registrate/test/meta/UpdateBlockLootTables.java index 83e9cdf..73ace91 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/UpdateBlockLootTables.java +++ b/src/test/java/com/modularmc/registrate/test/meta/UpdateBlockLootTables.java @@ -4,9 +4,9 @@ import java.nio.file.Paths; public class UpdateBlockLootTables { - + public static void main(String[] args) throws IOException { new MethodGenerator(UpdateBlockLootTables.class) - .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateBlockLootTables.java")); + .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateBlockLootTables.java")); } } diff --git a/src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java b/src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java index b441f03..cc51649 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java +++ b/src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java @@ -4,10 +4,10 @@ import java.nio.file.Paths; public class UpdateEntityLootTables { - + public static void main(String[] args) throws IOException { new MethodGenerator(UpdateEntityLootTables.class) - .exclude("isNonLiving").exclude("getKnownEntities") - .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateEntityLootTables.java")); + .exclude("isNonLiving").exclude("getKnownEntities") + .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateEntityLootTables.java")); } } diff --git a/src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java b/src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java index 105799f..d3f1644 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java +++ b/src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java @@ -4,10 +4,10 @@ import java.nio.file.Paths; public class UpdateRecipeProvider { - + public static void main(String[] args) throws IOException { new MethodGenerator(UpdateRecipeProvider.class) - .exclude("buildCraftingRecipes") - .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "generators", "RegistrateRecipeProvider.java")); + .exclude("buildCraftingRecipes") + .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "generators", "RegistrateRecipeProvider.java")); } } diff --git a/src/test/java/com/modularmc/registrate/test/meta/package-info.java b/src/test/java/com/modularmc/registrate/test/meta/package-info.java index de66794..236adc4 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/package-info.java +++ b/src/test/java/com/modularmc/registrate/test/meta/package-info.java @@ -1,6 +1,2 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault +@org.jspecify.annotations.NullMarked package com.modularmc.registrate.test.meta; - -import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; diff --git a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java index 4556c87..20c1cfd 100644 --- a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java +++ b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java @@ -1,49 +1,59 @@ package com.modularmc.registrate.test.mod; +import com.google.common.annotations.VisibleForTesting; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.modularmc.registrate.Registrate; import com.modularmc.registrate.builders.BlockBuilder; import com.modularmc.registrate.providers.DataGenContext; import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.providers.generators.RegistrateItemModelGenerator; import com.modularmc.registrate.util.DataIngredient; -import com.modularmc.registrate.util.entry.BlockEntityEntry; -import com.modularmc.registrate.util.entry.BlockEntry; -import com.modularmc.registrate.util.entry.EntityEntry; -import com.modularmc.registrate.util.entry.FluidEntry; -import com.modularmc.registrate.util.entry.ItemEntry; -import com.modularmc.registrate.util.entry.MenuEntry; -import com.modularmc.registrate.util.entry.RegistryEntry; -import com.modularmc.registrate.util.nullness.NonnullType; - +import com.modularmc.registrate.util.entry.*; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementType; -import net.minecraft.client.Minecraft; +import net.minecraft.advancements.criterion.InventoryChangeTrigger; +import net.minecraft.client.color.block.BlockTintSources; import net.minecraft.client.color.item.Constant; import net.minecraft.client.gui.screens.inventory.ContainerScreen; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState; import net.minecraft.client.renderer.entity.PigRenderer; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.client.renderer.feature.ModelFeatureRenderer; +import net.minecraft.client.renderer.item.ItemModelResolver; +import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.core.RegistrySetBuilder; import net.minecraft.core.registries.Registries; import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.worldgen.biome.OverworldBiomes; import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; import net.minecraft.tags.BlockTags; import net.minecraft.tags.EntityTypeTags; import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TimelineTags; +import net.minecraft.util.ARGB; import net.minecraft.util.valueproviders.UniformInt; import net.minecraft.world.InteractionResult; import net.minecraft.world.MenuProvider; import net.minecraft.world.SimpleContainer; +import net.minecraft.world.attribute.*; +import net.minecraft.world.clock.WorldClocks; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.SpawnPlacementTypes; import net.minecraft.world.entity.animal.Animal; -import net.minecraft.world.entity.animal.Pig; +import net.minecraft.world.entity.animal.pig.Pig; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.food.FoodProperties; @@ -51,6 +61,8 @@ import net.minecraft.world.inventory.ChestMenu; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.*; +import net.minecraft.world.item.crafting.CookingBookCategory; +import net.minecraft.world.level.CardinalLighting; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.biome.FixedBiomeSource; @@ -63,7 +75,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.dimension.BuiltinDimensionTypes; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.levelgen.Heightmap; @@ -79,26 +90,34 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; +import net.neoforged.neoforge.event.RegisterCommandsEvent; import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; import net.neoforged.neoforge.fluids.BaseFlowingFluid; import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.registries.RegistryBuilder; +import net.neoforged.testframework.conf.ClientConfiguration; +import net.neoforged.testframework.conf.Feature; +import net.neoforged.testframework.conf.FrameworkConfiguration; +import net.neoforged.testframework.impl.MutableTestFramework; +import org.lwjgl.glfw.GLFW; -import com.mojang.blaze3d.vertex.PoseStack; - +import javax.annotation.Nullable; +import java.util.List; +import java.util.Objects; import java.util.Optional; -import java.util.OptionalLong; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; -import javax.annotation.Nullable; - -@Mod("testmod") +@Mod(TestMod.MOD_ID) public class TestMod { + public static final String MOD_ID = "testmod"; + private class TestBlock extends Block implements EntityBlock { public TestBlock(Properties properties) { @@ -113,12 +132,11 @@ protected void createBlockStateDefinition(Builder builder) { @Override protected InteractionResult useWithoutItem(BlockState state, Level worldIn, BlockPos pos, Player player, BlockHitResult hit) { - if (!worldIn.isClientSide) { + if (!worldIn.isClientSide()) { player.openMenu(new MenuProvider() { @Override - @Nullable - public AbstractContainerMenu createMenu(int windowId, Inventory inv, Player player) { + public @Nullable AbstractContainerMenu createMenu(int windowId, Inventory inv, Player player) { return new ChestMenu(MenuType.GENERIC_9x3, windowId, inv, testblockbe.get(worldIn, pos).orElseThrow(IllegalStateException::new), 3); } @@ -132,8 +150,7 @@ public Component getDisplayName() { } @Override - @Nullable - public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return testblockbe.create(pos, state); } } @@ -145,16 +162,34 @@ public TestBlockEntity(BlockEntityType type, BlockPos } } - private static class TestBlockEntityRenderer implements BlockEntityRenderer { + private static class TestBlockEntityRenderer implements BlockEntityRenderer { + private final ItemModelResolver itemModelResolver; + + public TestBlockEntityRenderer(BlockEntityRendererProvider.Context ctx) { + itemModelResolver = ctx.itemModelResolver(); + } - public TestBlockEntityRenderer(BlockEntityRendererProvider.Context ctx) {} + @Override + public RenderState createRenderState() { + return new RenderState(); + } + + @Override + public void extractRenderState(TestBlockEntity blockEntity, RenderState state, float partialTicks, Vec3 cameraPosition, @Nullable ModelFeatureRenderer.CrumblingOverlay breakProgress) { + BlockEntityRenderer.super.extractRenderState(blockEntity, state, partialTicks, cameraPosition, breakProgress); + itemModelResolver.updateForTopItem(state.item, new ItemStack(Items.DIAMOND), ItemDisplayContext.GROUND, blockEntity.getLevel(), null, 0); + } @Override - public void render(TestBlockEntity blockEntityIn, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int combinedLightIn, int combinedOverlayIn, Vec3 cam) { - matrixStackIn.pushPose(); - matrixStackIn.translate(0.5, 0.5, 0.5); - Minecraft.getInstance().getItemRenderer().renderStatic(new ItemStack(Items.DIAMOND), ItemDisplayContext.GROUND, combinedLightIn, combinedOverlayIn, matrixStackIn, bufferIn, blockEntityIn.getLevel(), 0); - matrixStackIn.popPose(); + public void submit(RenderState state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) { + poseStack.pushPose(); + poseStack.translate(0.5, 0.5, 0.5); + state.item.submit(poseStack, submitNodeCollector, state.lightCoords, OverlayTexture.NO_OVERLAY, EntityRenderState.NO_OUTLINE); + poseStack.popPose(); + } + + private static class RenderState extends BlockEntityRenderState { + private final ItemStackRenderState item = new ItemStackRenderState(); } } @@ -176,76 +211,86 @@ private static class TestCustomRegistryEntry {} private final Registrate registrate = Registrate.create("testmod"); - private final RegistryEntry testcreativetab = registrate.object("test_creative_mode_tab") + @VisibleForTesting + public final RegistryEntry testcreativetab = registrate.object("test_creative_mode_tab") .defaultCreativeTab(tab -> tab.withLabelColor(0xFF00AA00)) .register(); private final AtomicBoolean sawCallback = new AtomicBoolean(); - private final ItemEntry testitem = registrate.object("testitem") + @VisibleForTesting + public final ItemEntry testitem = registrate.object("testitem") .item(Item::new) - .onRegister(item -> sawCallback.set(true)) - .properties(p -> p.food(new FoodProperties.Builder().nutrition(1).saturationModifier(0.2f).build())) - .tag(ItemTags.BEDS) + .onRegister(item -> sawCallback.set(true)) + .properties(p -> p.food(new FoodProperties.Builder().nutrition(1).saturationModifier(0.2f).build())) + .tag(ItemTags.BEDS) .model(() -> (ctx, prov) -> prov.createWithExistingModel(ctx.getEntry(), prov.mcLoc("block/stone"))) - .tab(testcreativetab.getKey(), (ctx, modifier) -> modifier.accept(ctx)) - .register(); + .tab(testcreativetab.getKey(), (ctx, modifier) -> modifier.accept(ctx)) + .register(); - private final EntityEntry testduplicatename = registrate.object("testitem") + @VisibleForTesting + public final EntityEntry testduplicatename = registrate.object("testitem") .entity(TestEntity::new, MobCategory.CREATURE) .attributes(Pig::createAttributes) .loot((tb, e) -> tb.add(e, LootTable.lootTable())) .renderer(() -> PigRenderer::new) .register(); - private final BlockEntry testblock = registrate.object("testblock") + @VisibleForTesting + public final BlockEntry testblock = registrate.object("testblock") .block(TestBlock::new) - .properties(p -> p.noOcclusion()) + .properties(p -> p.noOcclusion()) .blockstate(() -> (ctx, prov) -> prov.create(ctx.getEntry(), prov.getBuilder().transformTemplate(template -> template .parent(prov.mcLoc("block/glass")) - .renderType(prov.mcLoc("cutout"))).build(ctx.getEntry()))) - .transform(TestMod::applyDiamondDrop) - .recipe((ctx, prov) -> { - prov.shaped(RecipeCategory.MISC, ctx.getEntry()) - .pattern("DDD").pattern("DED").pattern("DDD") - .define('D', Items.DIAMOND) - .define('E', Items.EGG) - .unlockedBy("has_egg", prov.has(Items.EGG)) - .save(prov); - - prov.food(DataIngredient.items(ctx), RecipeCategory.MISC, () -> Blocks.DIAMOND_BLOCK, 1f); - }) - .tag(BlockTags.BAMBOO_PLANTABLE_ON, BlockTags.DRAGON_IMMUNE) - .tag(BlockTags.WITHER_IMMUNE) - .color(() -> () -> (state, world, pos, index) -> 0xFFFF0000) - .item() + ).build(ctx.getEntry()) + )) + .transform(TestMod::applyDiamondDrop) + .recipe((ctx, prov) -> { + prov.shaped(RecipeCategory.MISC, ctx.getEntry()) + .pattern("DDD").pattern("DED").pattern("DDD") + .define('D', Items.DIAMOND) + .define('E', Items.EGG) + .unlockedBy("has_egg", prov.has(Items.EGG)) + .save(prov); + + prov.food(DataIngredient.items(ctx), RecipeCategory.MISC, CookingBookCategory.MISC, () -> Blocks.DIAMOND_BLOCK, 1f); + }) + .tag(BlockTags.SUPPORTS_BAMBOO, BlockTags.DRAGON_IMMUNE) + .tag(BlockTags.WITHER_IMMUNE) + .color(() -> () -> List.of(BlockTintSources.constant(0xFFFF0000))) + .item() .model(() -> Client::testBlockModel) - .build() - .blockEntity(TestBlockEntity::new) - .renderer(() -> TestBlockEntityRenderer::new) - .build() - .register(); - - private final BlockEntry magicItemModelTest = registrate.object("magic_item_model") + .build() + .blockEntity(TestBlockEntity::new) + .renderer(() -> TestBlockEntityRenderer::new) + .build() + .register(); + + @VisibleForTesting + public final BlockEntry magicItemModelTest = registrate.object("magic_item_model") .block(Block::new) - .blockstate(() -> (ctx, prov) -> prov.create(ctx.getEntry(), prov.getBuilder() - .transformTemplate(t -> t - .parent(prov.mcLoc("block/gold_block"))) - .build(prov.modLoc("block/subfolder/" + ctx.getName())))) + .blockstate(() -> (ctx, prov) -> + prov.create(ctx.getEntry(), prov.getBuilder() + .transformTemplate(t -> t + .parent(prov.mcLoc("block/gold_block")) + ).build(prov.modLoc("block/subfolder/" + ctx.getName())))) .simpleItem() .register(); - private final ItemEntry testblockitem = (ItemEntry) testblock.getSibling(Registries.ITEM); - private final BlockEntityEntry testblockbe = BlockEntityEntry.cast(testblock.getSibling(Registries.BLOCK_ENTITY_TYPE)); + @VisibleForTesting + public final ItemEntry testblockitem = (ItemEntry) testblock.getSibling(Registries.ITEM); + @VisibleForTesting + public final BlockEntityEntry testblockbe = BlockEntityEntry.cast(testblock.getSibling(Registries.BLOCK_ENTITY_TYPE)); @SuppressWarnings("deprecation") - private final EntityEntry testentity = registrate.object("testentity") + @VisibleForTesting + public final EntityEntry testentity = registrate.object("testentity") .entity(TestEntity::new, MobCategory.CREATURE) .attributes(Pig::createAttributes) .renderer(() -> PigRenderer::new) .spawnPlacement(SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR) - // TODO <1.21.4> .defaultSpawnEgg(0xFF0000, 0x00FF00) + //TODO <1.21.4> .defaultSpawnEgg(0xFF0000, 0x00FF00) .loot((prov, type) -> prov.add(type, LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1)) @@ -255,104 +300,112 @@ private static class TestCustomRegistryEntry {} .tag(EntityTypeTags.RAIDERS) .register(); - private final BlockEntityEntry testblockentity = registrate.object("testblockentity") + @VisibleForTesting + public final BlockEntityEntry testblockentity = registrate.object("testblockentity") .blockEntity(TestDummyBlockEntity::new) - .validBlock(() -> Blocks.DIRT)// TODO <1.21.4> now empty valid block is not allowed + .validBlock(() -> Blocks.DIRT)//TODO <1.21.4> now empty valid block is not allowed .register(); - private final FluidEntry testfluid = registrate.object("testfluid") + @VisibleForTesting + public final FluidEntry testfluid = registrate.object("testfluid") .fluid( - ResourceLocation.withDefaultNamespace("block/water_flow"), - ResourceLocation.withDefaultNamespace("block/lava_still"), - FluidType::new) + Identifier.withDefaultNamespace("block/water_flow"), + Identifier.withDefaultNamespace("block/lava_still"), + FluidType::new) .properties(p -> p.lightLevel(15).canConvertToSource(true)) - .renderType(() -> () -> ChunkSectionLayer.TRANSLUCENT) .noBucket() - // .bucket() - // .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), prov.mcLoc("item/water_bucket"))) - // .build() +// .bucket() +// .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), prov.mcLoc("item/water_bucket"))) +// .build() .register(); - private final MenuEntry testmenu = registrate.object("testmenu") + @VisibleForTesting + public final MenuEntry testmenu = registrate.object("testmenu") .menu((type, windowId, inv) -> new ChestMenu(type, windowId, inv, new SimpleContainer(9 * 9), 9), () -> ContainerScreen::new) .register(); - - // private final RegistryEntry testbiome = registrate.object("testbiome") - // .biome(TestBiome::new) - // .properties(b -> b.category(Category.PLAINS) - // .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.getDefaultState(), - // Blocks.COBBLESTONE.getDefaultState(), Blocks.CLAY.getDefaultState())) - // .precipitation(RainType.RAIN) - // .depth(1) - // .scale(1) - // .temperature(1) - // .downfall(1) - // .waterColor(0x3f76e4) - // .waterFogColor(0x050533)) - // .typeWeight(BiomeType.WARM, 1000) - // .addDictionaryTypes(BiomeDictionary.Type.LUSH) - // .forceAutomaticDictionaryTypes() - // .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.BAMBOO, new ProbabilityConfig(0), () -> - // Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(20)) - // .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.ICE_SPIKE, () -> Placement.COUNT_HEIGHTMAP_DOUBLE, new - // FrequencyConfig(100)) - // .addFeatures(DefaultBiomeFeatures::addVeryDenseGrass) - // .addCarver(Carving.AIR, () -> WorldCarver.CAVE, new ProbabilityConfig(0.1F)) - // .addSpawn(EntityClassification.CREATURE, () -> EntityType.IRON_GOLEM, 1, 2, 3) - // .addSpawn(EntityClassification.CREATURE, testentity, 1, 4, 8) - // .register(); - // - // private final RegistryEntry testbiome2 = registrate.object("testbiome2") - // .biome(TestBiome::new) - // .properties(b -> b.category(Category.DESERT) - // .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.SAND.getDefaultState(), - // Blocks.RED_SANDSTONE.getDefaultState(), Blocks.GRAVEL.getDefaultState())) - // .precipitation(RainType.NONE) - // .depth(1) - // .scale(1) - // .temperature(1) - // .downfall(1) - // .waterColor(0x3f76e4) - // .waterFogColor(0x050533)) - // .typeWeight(BiomeType.DESERT, 1000) - // .addDictionaryTypes(BiomeDictionary.Type.DRY) - // .forceAutomaticDictionaryTypes() - // .copyFeatures(() -> Biomes.DESERT) - // .copyCarvers(() -> Biomes.DESERT) - // .copySpawns(() -> Biomes.DESERT) - // .register(); - // - // private @Nullable DimensionType testdimensiontype; - // private final RegistryEntry testdimension = registrate.object("testdimension") - // .dimension(OverworldDimension::new) - // .hasSkyLight(false) - // .keepLoaded(false) - // .dimensionTypeCallback(t -> testdimensiontype = t) - // .register(); - - private final ResourceKey> CUSTOM_REGISTRY = registrate.makeRegistry("custom", RegistryBuilder::new); - private final RegistryEntry testcustom = registrate.object("testcustom") + +// private final RegistryEntry testbiome = registrate.object("testbiome") +// .biome(TestBiome::new) +// .properties(b -> b.category(Category.PLAINS) +// .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.getDefaultState(), Blocks.COBBLESTONE.getDefaultState(), Blocks.CLAY.getDefaultState())) +// .precipitation(RainType.RAIN) +// .depth(1) +// .scale(1) +// .temperature(1) +// .downfall(1) +// .waterColor(0x3f76e4) +// .waterFogColor(0x050533)) +// .typeWeight(BiomeType.WARM, 1000) +// .addDictionaryTypes(BiomeDictionary.Type.LUSH) +// .forceAutomaticDictionaryTypes() +// .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.BAMBOO, new ProbabilityConfig(0), () -> Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(20)) +// .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.ICE_SPIKE, () -> Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(100)) +// .addFeatures(DefaultBiomeFeatures::addVeryDenseGrass) +// .addCarver(Carving.AIR, () -> WorldCarver.CAVE, new ProbabilityConfig(0.1F)) +// .addSpawn(EntityClassification.CREATURE, () -> EntityType.IRON_GOLEM, 1, 2, 3) +// .addSpawn(EntityClassification.CREATURE, testentity, 1, 4, 8) +// .register(); +// +// private final RegistryEntry testbiome2 = registrate.object("testbiome2") +// .biome(TestBiome::new) +// .properties(b -> b.category(Category.DESERT) +// .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.SAND.getDefaultState(), Blocks.RED_SANDSTONE.getDefaultState(), Blocks.GRAVEL.getDefaultState())) +// .precipitation(RainType.NONE) +// .depth(1) +// .scale(1) +// .temperature(1) +// .downfall(1) +// .waterColor(0x3f76e4) +// .waterFogColor(0x050533)) +// .typeWeight(BiomeType.DESERT, 1000) +// .addDictionaryTypes(BiomeDictionary.Type.DRY) +// .forceAutomaticDictionaryTypes() +// .copyFeatures(() -> Biomes.DESERT) +// .copyCarvers(() -> Biomes.DESERT) +// .copySpawns(() -> Biomes.DESERT) +// .register(); +// +// private @Nullable DimensionType testdimensiontype; +// private final RegistryEntry testdimension = registrate.object("testdimension") +// .dimension(OverworldDimension::new) +// .hasSkyLight(false) +// .keepLoaded(false) +// .dimensionTypeCallback(t -> testdimensiontype = t) +// .register(); + + @VisibleForTesting + public final ResourceKey> CUSTOM_REGISTRY = registrate.makeRegistry("custom", RegistryBuilder::new); + @VisibleForTesting + public final RegistryEntry testcustom = registrate.object("testcustom") .simple(CUSTOM_REGISTRY, TestCustomRegistryEntry::new); - // private final BlockBuilder INVALID_TEST = registrate.object("invalid") - // .block(Block::new) - // .addLayer(() -> RenderType::getTranslucent); +// private final BlockBuilder INVALID_TEST = registrate.object("invalid") +// .block(Block::new) +// .addLayer(() -> RenderType::getTranslucent); - private static @NonnullType BlockBuilder applyDiamondDrop(BlockBuilder builder) { + private static BlockBuilder applyDiamondDrop(BlockBuilder builder) { return builder.loot((prov, block) -> prov.dropOther(block, Items.DIAMOND)); } - public TestMod(IEventBus eventBus) { + private static @Nullable TestMod INSTANCE = null; + + public TestMod(IEventBus eventBus, ModContainer container) { + INSTANCE = this; + registrate.addRawLang("testmod.custom.lang", "Test"); + registrate.addRawLang("testmod.custom.lang.with_placeholders1", "Placeholder 1 %s Placeholder 2 %s"); + registrate.addRawLang("testmod.custom.lang.with_placeholders2", "Placeholder 1 %s Placeholder 2 %2$s Placeholder 3 %s"); + registrate.addRawLang("testmod.custom.lang.brackets", "(Bracket 1) [Bracket 2] {Bracket 3} ◁Bracket 5▷"); + registrate.addRawLang("testmod.custom.lang.slashes", "/commmands look good and here is a backslash \\"); registrate.addLang("tooltip", testblock.getId(), "Egg."); registrate.addLang("item", testitem.getId(), "testextra", "Magic!"); registrate.addDataGenerator(ProviderType.ADVANCEMENT, adv -> { Advancement.Builder.advancement() - .addCriterion("has_egg", InventoryChangeTrigger.TriggerInstance.hasItems(Items.EGG)) - .display(Items.EGG, - adv.title(registrate.getModid(), "root", "Test Advancement"), adv.desc(registrate.getModid(), "root", "Get an egg."), - ResourceLocation.withDefaultNamespace("textures/gui/advancements/backgrounds/stone.png"), AdvancementType.TASK, true, true, false) - .save(adv, registrate.getModid() + ":root"); + .addCriterion("has_egg", InventoryChangeTrigger.TriggerInstance.hasItems(Items.EGG)) + .display(Items.EGG, + adv.title(registrate.getModid(), "root", "Test Advancement"), adv.desc(registrate.getModid(), "root", "Get an egg."), + Identifier.withDefaultNamespace("textures/gui/advancements/backgrounds/stone.png"), AdvancementType.TASK, true, true, false) + .save(adv, registrate.getModid() + ":root"); }); registrate.addDataGenerator(ProviderType.GENERIC_SERVER, provider -> provider.add(data -> { // generic server side provider to generate custom dimension @@ -360,7 +413,7 @@ public TestMod(IEventBus eventBus) { // /execute as @s in testmod:test_dimension run tp @s 0 64 0 // you can validate you are in this dimension by checking the debug screen // right underneath the `Chunks[C]` and `Chunk[S]` should be the dimension name - var testDimensionTypeKey = ResourceKey.create(Registries.DIMENSION_TYPE, ResourceLocation.fromNamespaceAndPath("testmod", "test_dimension_type")); + var testDimensionTypeKey = ResourceKey.create(Registries.DIMENSION_TYPE, Identifier.fromNamespaceAndPath("testmod", "test_dimension_type")); return new DatapackBuiltinEntriesProvider( data.output(), @@ -370,26 +423,38 @@ public TestMod(IEventBus eventBus) { .add(Registries.DIMENSION_TYPE, context -> context.register( testDimensionTypeKey, new DimensionType( - /* fixedTime */ OptionalLong.empty(), + /* hasFixedTime */ false, /* hasSky */ true, /* hasCeiling */ false, - /* ultraWarm */ false, - /* natural */ true, + /* hasEnderDragonFight */ false, /* coordinateScale */ 1D, - /* bedWords */ true, - /* respawnAnchorWorks */ false, /* minY */ -64, /* height */ 384, /* localHeight */ 384, /* infiniBurn */ BlockTags.INFINIBURN_OVERWORLD, - /* effectsLocation */ BuiltinDimensionTypes.OVERWORLD_EFFECTS, /* ambientLight */ 0F, - /* cloudHeight */ Optional.of(192), new DimensionType.MonsterSettings( - /* piglinSafe */ false, - /* hasRaids */ true, /* monsterSpawnLightTest */ UniformInt.of(0, 7), - /* monsterSpawnBlockLightLimit */ 0)))) + /* monsterSpawnBlockLightLimit */ 0 + ), + DimensionType.Skybox.OVERWORLD, + CardinalLighting.Type.DEFAULT, + EnvironmentAttributeMap.builder() + .set(EnvironmentAttributes.FOG_COLOR, 0xffc0d8ff) + .set(EnvironmentAttributes.SKY_COLOR, OverworldBiomes.calculateSkyColor(0.8F)) + .set(EnvironmentAttributes.AMBIENT_LIGHT_COLOR, 0xff0a0a0a) + .set(EnvironmentAttributes.CLOUD_COLOR, ARGB.white(0.8F)) + .set(EnvironmentAttributes.CLOUD_HEIGHT, 192.33f) + .set(EnvironmentAttributes.BACKGROUND_MUSIC, BackgroundMusic.OVERWORLD) + .set(EnvironmentAttributes.BED_RULE, BedRule.CAN_SLEEP_WHEN_DARK) + .set(EnvironmentAttributes.RESPAWN_ANCHOR_WORKS, false) + .set(EnvironmentAttributes.NETHER_PORTAL_SPAWNS_PIGLINS, true) + .set(EnvironmentAttributes.AMBIENT_SOUNDS, AmbientSounds.LEGACY_CAVE_SETTINGS) + .build(), + context.lookup(Registries.TIMELINE).getOrThrow(TimelineTags.IN_OVERWORLD), + Optional.of(context.lookup(Registries.WORLD_CLOCK).getOrThrow(WorldClocks.OVERWORLD)) + ) + )) // register custom dimension for the dimension type // simple single biome (plains) dimension .add(Registries.LEVEL_STEM, context -> { @@ -398,17 +463,40 @@ public TestMod(IEventBus eventBus) { var overworldNoiseSettings = context.lookup(Registries.NOISE_SETTINGS).getOrThrow(NoiseGeneratorSettings.OVERWORLD); context.register( - ResourceKey.create(Registries.LEVEL_STEM, ResourceLocation.fromNamespaceAndPath("testmod", "test_dimension")), + ResourceKey.create(Registries.LEVEL_STEM, Identifier.fromNamespaceAndPath("testmod", "test_dimension")), new LevelStem( testDimensionType, new NoiseBasedChunkGenerator( new FixedBiomeSource(plains), - overworldNoiseSettings))); + overworldNoiseSettings + ) + ) + ); }), - Set.of("testmod")); + Set.of("testmod") + ); })); eventBus.addListener(this::onCommonSetup); + + // Setup gametests for normal run config + final MutableTestFramework framework = FrameworkConfiguration + .builder(Identifier.fromNamespaceAndPath(MOD_ID, "tests")) + .clientConfiguration(() -> ClientConfiguration.builder() + .toggleOverlayKey(GLFW.GLFW_KEY_O) + .openManagerKey(GLFW.GLFW_KEY_M) + .build()) + .enable(Feature.CLIENT_SYNC, Feature.TEST_STORE) + .build() + .create(); + + framework.init(eventBus, container); + + NeoForge.EVENT_BUS.addListener((final RegisterCommandsEvent event) -> { + final LiteralArgumentBuilder node = Commands.literal("tests"); + framework.registerCommands(node); + event.getDispatcher().register(node); + }); } private void onCommonSetup(FMLCommonSetupEvent event) { @@ -416,20 +504,22 @@ private void onCommonSetup(FMLCommonSetupEvent event) { throw new IllegalStateException("Register callback not fired!"); } - testblock.asStack(); + testblock.asStackTemplate(); testitem.is(Items.SNOWBALL); testblockitem.is(Items.STONE); testblockbe.is(BlockEntityType.CHEST); // testbiome.is(Feature.BAMBOO); // should not compile - if (testfluid.get().getBucket() != Items.AIR) throw new IllegalStateException("Expected no bucket for test fluid"); // should - // not - // crash + if (testfluid.get().getBucket() != Items.AIR) throw new IllegalStateException("Expected no bucket for test fluid"); // should not crash } private static class Client { - private static void testBlockModel(DataGenContext ctx, RegistrateItemModelGenerator prov) { prov.generateTintedModel(ctx.get(), prov.mcLoc("item/egg"), new Constant(0xFFFF0000)); } } + + public static TestMod instance() { + Objects.requireNonNull(INSTANCE, "Attempting to get mod instance before mod construction"); + return INSTANCE; + } } diff --git a/src/test/java/com/modularmc/registrate/test/mod/package-info.java b/src/test/java/com/modularmc/registrate/test/mod/package-info.java index b3484eb..daff0b1 100644 --- a/src/test/java/com/modularmc/registrate/test/mod/package-info.java +++ b/src/test/java/com/modularmc/registrate/test/mod/package-info.java @@ -1,6 +1,2 @@ -@javax.annotation.ParametersAreNonnullByDefault -@net.minecraft.MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault +@org.jspecify.annotations.NullMarked package com.modularmc.registrate.test.mod; - -import com.modularmc.registrate.util.nullness.FieldsAreNonnullByDefault; From b11781d813094f908e0cf0d58ec8066ea085717a Mon Sep 17 00:00:00 2001 From: qiuye2024github Date: Wed, 29 Apr 2026 13:43:42 +0800 Subject: [PATCH 03/10] spotless --- CONTRIBUTING.md | 34 + README.md | 26 + docs/architecture.md | 53 + .../registrate/AbstractRegistrate.java | 403 ++++---- .../com/modularmc/registrate/Registrate.java | 16 +- .../modularmc/registrate/RegistrateLib.java | 18 +- .../registrate/builders/AbstractBuilder.java | 58 +- .../registrate/builders/BiomeBuilder.java | 917 +++++++++--------- .../registrate/builders/BlockBuilder.java | 163 ++-- .../builders/BlockEntityBuilder.java | 65 +- .../registrate/builders/Builder.java | 122 ++- .../registrate/builders/BuilderCallback.java | 37 +- .../registrate/builders/EntityBuilder.java | 142 +-- .../registrate/builders/FluidBuilder.java | 202 ++-- .../registrate/builders/ItemBuilder.java | 94 +- .../registrate/builders/MenuBuilder.java | 16 +- .../registrate/builders/NoConfigBuilder.java | 2 +- .../registrate/builders/package-info.java | 8 + .../modularmc/registrate/package-info.java | 8 + .../registrate/providers/DataGenContext.java | 12 +- .../providers/DataProviderInitializer.java | 91 +- .../registrate/providers/GeneratorType.java | 3 +- .../registrate/providers/ProviderType.java | 17 +- .../RegistrateAdvancementProvider.java | 15 +- .../providers/RegistrateDataMapProvider.java | 63 +- .../providers/RegistrateDataProvider.java | 43 +- .../providers/RegistrateDatapackProvider.java | 24 +- .../providers/RegistrateGenericProvider.java | 31 +- .../providers/RegistrateItemTagsProvider.java | 1 + .../providers/RegistrateLangProvider.java | 22 +- .../RegistrateLookupFillerProvider.java | 1 - .../providers/RegistrateProvider.java | 2 +- .../providers/RegistrateProviderDelegate.java | 6 +- .../providers/RegistrateTagsProvider.java | 24 +- .../RegistrateBlockModelGenerator.java | 42 +- .../RegistrateItemModelGenerator.java | 4 +- .../RegistrateLegacyBlockModelBuilder.java | 208 ++-- .../generators/RegistrateModelProvider.java | 30 +- .../generators/RegistrateRecipeProvider.java | 813 ++++++++-------- .../generators/RegistrateRecipeRunner.java | 48 +- .../providers/generators/package-info.java | 7 + .../loot/RegistrateBlockLootTables.java | 467 ++++----- .../loot/RegistrateEntityLootTables.java | 32 +- .../loot/RegistrateLootTableProvider.java | 18 +- .../providers/loot/RegistrateLootTables.java | 5 +- .../providers/loot/package-info.java | 7 + .../registrate/providers/package-info.java | 7 + .../util/CreativeModeTabModifier.java | 11 +- .../registrate/util/DataIngredient.java | 26 +- .../registrate/util/DebugMarkers.java | 8 +- .../registrate/util/OneTimeEventReceiver.java | 23 +- .../util/RegistrateDistExecutor.java | 1 + .../modularmc/registrate/util/Sequence.java | 12 +- .../util/entry/BlockEntityEntry.java | 29 +- .../registrate/util/entry/BlockEntry.java | 2 +- .../registrate/util/entry/EntityEntry.java | 1 + .../registrate/util/entry/FluidEntry.java | 9 +- .../registrate/util/entry/ItemEntry.java | 2 +- .../util/entry/LazyRegistryEntry.java | 6 +- .../registrate/util/entry/MenuEntry.java | 6 +- .../registrate/util/entry/RegistryEntry.java | 24 +- .../registrate/util/entry/package-info.java | 7 + .../util/nullness/NonNullBiConsumer.java | 2 +- .../util/nullness/NonNullBiFunction.java | 2 +- .../util/nullness/NonNullConsumer.java | 11 +- .../util/nullness/NonNullSupplier.java | 4 +- .../util/nullness/NullableSupplier.java | 11 +- .../util/nullness/package-info.java | 7 + .../registrate/util/package-info.java | 7 + .../test/gametests/CustomItemTests.java | 4 +- .../test/gametests/package-info.java | 5 + .../registrate/test/meta/MethodGenerator.java | 32 +- .../test/meta/ProtectedMethodScraper.java | 20 +- .../test/meta/UpdateBlockLootTables.java | 4 +- .../test/meta/UpdateEntityLootTables.java | 6 +- .../test/meta/UpdateRecipeProvider.java | 6 +- .../registrate/test/meta/package-info.java | 6 + .../registrate/test/mod/TestMod.java | 228 ++--- .../registrate/test/mod/package-info.java | 3 + 79 files changed, 2677 insertions(+), 2275 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 docs/architecture.md create mode 100644 src/test/java/com/modularmc/registrate/test/gametests/package-info.java diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..7a6647d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,34 @@ +# Contributing + +## Development Baseline + +- Java: `25` +- Build tool: Gradle wrapper +- Recommended IDE: IntelliJ IDEA with the generated run configurations +- Line endings: `LF` via `.gitattributes` and `.editorconfig` + +## Local Workflow + +1. Sync the Gradle project with a Java 25 runtime. +2. Make changes inside the package layer that owns the behavior you are touching. +3. Validate with `./gradlew build` or `gradlew.bat build`. +4. Use the IDEA run configurations for interactive verification: + - `Client` + - `Server` + - `Data Generation` + - `Game Tests` + - `Game Tests (Client)` + +## Package Boundaries + +- Put fluent registration APIs in `com.modularmc.registrate.builders`. +- Put data generation wiring in `com.modularmc.registrate.providers`. +- Put generic runtime support code in `com.modularmc.registrate.util`. +- Keep typed registry wrappers in `com.modularmc.registrate.util.entry`. +- Avoid adding new public API surface to `util` when the concept belongs in a builder or provider. + +## Maintenance Notes + +- `RegistrateLib` is a fork metadata/constants holder, not a NeoForge mod entrypoint. +- `src/test/java/com/modularmc/registrate/test/meta` contains maintenance helpers for generated bridge methods. +- When upstream Registrate changes, update implementation classes first and then re-verify package ownership against `docs/architecture.md`. diff --git a/README.md b/README.md index 6c115f7..496acdd 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,32 @@ A powerful wrapper for creating and registering objects in your mod. +## Fork Status + +This repository is the `com.modularmc.registrate` fork maintained for the ModularMCLib ecosystem. It tracks the upstream Registrate design while targeting the modern NeoForge + Minecraft `26.1` toolchain and preserving a package namespace that can be safely embedded in downstream projects. + +## Modern Development + +- Use `Java 25` for local builds and IDE sync. +- Prefer the bundled IDEA run configurations: `Client`, `Server`, `Data Generation`, `Game Tests`, and `Game Tests (Client)`. +- Keep fluent registration APIs in `builders`, data generation orchestration in `providers`, and shared runtime helpers in `util`. +- Treat [`docs/architecture.md`](docs/architecture.md) as the source of truth for package responsibilities and extension points. +- See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the day-to-day development workflow. + +## Code Classification + +- `com.modularmc.registrate`: public API roots, fork metadata, and the central registration coordinator. +- `com.modularmc.registrate.builders`: the fluent DSL used by downstream mods to register content. +- `com.modularmc.registrate.providers`: data generation orchestration and provider lifecycle management. +- `com.modularmc.registrate.providers.generators`: blockstate, model, and recipe generator adapters. +- `com.modularmc.registrate.providers.loot`: loot-table focused provider wrappers. +- `com.modularmc.registrate.util`: runtime helpers that support event wiring, dist handling, and shared utility behavior. +- `com.modularmc.registrate.util.entry`: strongly-typed registry handles returned by builders. +- `com.modularmc.registrate.util.nullness`: null-safe functional helpers and package defaults. +- `com.modularmc.registrate.test.mod`: an integration-style sample mod that exercises the public API. +- `com.modularmc.registrate.test.gametests`: executable validation scenarios for runtime behavior. +- `com.modularmc.registrate.test.meta`: maintenance utilities that keep generated bridge methods aligned with upstream APIs. + ## Why Registrate? - Allows you to organize your mod content however you like, rather than having pieces of each object defined in scattered places diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..70252fa --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,53 @@ +# Architecture + +## Overview + +`RegistrateLib` is a maintained fork of Registrate for the `com.modularmc.registrate` namespace. The project exposes a fluent registration API to downstream mods while keeping the implementation separated into registration, generation, runtime support, and test-maintenance layers. + +## Package Map + +- `com.modularmc.registrate` + - Public entrypoints. + - `AbstractRegistrate` is the orchestration core. + - `Registrate` is the default public implementation. + - `RegistrateLib` is a fork metadata/constants holder used by this repository. +- `com.modularmc.registrate.builders` + - Public-facing fluent registration DSL. + - Owns object construction rules and builder chaining behavior. +- `com.modularmc.registrate.providers` + - Data generation lifecycle, provider registration, and provider dispatch. +- `com.modularmc.registrate.providers.generators` + - Specialized adapters for recipes, models, and blockstates. +- `com.modularmc.registrate.providers.loot` + - Loot-specific provider wrappers and compatibility helpers. +- `com.modularmc.registrate.util` + - Shared runtime helpers for one-time events, distribution checks, sequencing, and misc support code. +- `com.modularmc.registrate.util.entry` + - Strongly-typed handles returned from registrations. +- `com.modularmc.registrate.util.nullness` + - Functional interfaces and package-level nullness conventions. +- `com.modularmc.registrate.test.mod` + - Sample mod used as an integration harness. +- `com.modularmc.registrate.test.gametests` + - Executable runtime checks. +- `com.modularmc.registrate.test.meta` + - Maintenance tooling for generated bridge methods and protected API snapshots. + +## Public API Boundary + +Treat the root package plus `builders` and `util.entry` as the main downstream-facing API surface. Provider and utility packages are reusable, but most of them exist to support the API rather than to be primary extension points. + +## Placement Guide + +- New registration DSL behavior belongs in `builders`. +- New datagen orchestration belongs in `providers`. +- Generator-specific helpers belong in `providers.generators` or `providers.loot`. +- Cross-cutting runtime support belongs in `util` only when it is not builder- or provider-specific. +- Test-only scaffolding belongs under `src/test/java` even if it mirrors production APIs. + +## Modernization Principles + +- Prefer explicit package ownership over convenience placement. +- Keep public entrypoints small and push complexity into focused layers. +- Document extension points where downstream mods are expected to integrate. +- Preserve upstream compatibility where possible, but keep fork-specific behavior clearly identified. diff --git a/src/main/java/com/modularmc/registrate/AbstractRegistrate.java b/src/main/java/com/modularmc/registrate/AbstractRegistrate.java index eab226f..ece27bf 100644 --- a/src/main/java/com/modularmc/registrate/AbstractRegistrate.java +++ b/src/main/java/com/modularmc/registrate/AbstractRegistrate.java @@ -1,8 +1,5 @@ package com.modularmc.registrate; -import com.google.common.base.Preconditions; -import com.google.common.collect.*; -import com.mojang.serialization.Codec; import com.modularmc.registrate.builders.*; import com.modularmc.registrate.builders.BlockEntityBuilder.BlockEntityFactory; import com.modularmc.registrate.builders.MenuBuilder.ForgeMenuFactory; @@ -15,12 +12,7 @@ import com.modularmc.registrate.util.entry.ItemEntry; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.*; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; -import lombok.Value; -import lombok.experimental.Accessors; -import lombok.extern.log4j.Log4j2; + import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.MenuAccess; import net.minecraft.client.multiplayer.ClientPacketListener; @@ -49,11 +41,21 @@ import net.neoforged.neoforge.fluids.BaseFlowingFluid; import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.registries.*; + +import com.google.common.base.Preconditions; +import com.google.common.collect.*; +import com.mojang.serialization.Codec; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; +import lombok.Value; +import lombok.experimental.Accessors; +import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.message.Message; - import org.jspecify.annotations.Nullable; + import java.util.*; import java.util.Map.Entry; import java.util.function.Consumer; @@ -64,15 +66,18 @@ /** * Manages all registrations and data generators for a mod. *

            - * Generally not thread-safe, as it holds the current name of the object being built statefully, and uses non-concurrent collections. + * Generally not thread-safe, as it holds the current name of the object being built statefully, and uses + * non-concurrent collections. *

            - * Begin a new object via {@link #object(String)}. This name will be used for all future entries until the next invocation of {@link #object(String)}. Alternatively, the methods that accept a name + * Begin a new object via {@link #object(String)}. This name will be used for all future entries until the next + * invocation of {@link #object(String)}. Alternatively, the methods that accept a name * parameter (such as {@link #block(String, NonNullFunction)}) can be used. These do not affect the current name state. *

            * A simple use may look like: * *

              * {@code
            + *
              * public static final Registrate REGISTRATE = Registrate.create("mymod");
              *
              * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
            @@ -89,6 +94,7 @@ public abstract class AbstractRegistrate> {
             
                 @Value
                 private class Registration {
            +
                     Identifier name;
                     ResourceKey> type;
                     NonNullSupplier creator;
            @@ -100,7 +106,7 @@ private class Registration {
                     Registration(Identifier name, ResourceKey> type, NonNullSupplier creator, NonNullFunction, ? extends RegistryEntry> entryFactory) {
                         this.name = name;
                         this.type = type;
            -            this.creator =  creator.lazy();
            +            this.creator = creator.lazy();
                         this.delegate = entryFactory.apply(DeferredHolder.create(type, name));
                     }
             
            @@ -127,7 +133,10 @@ public static boolean isDevEnvironment() {
                 }
             
                 private final Table>, String, Registration> registrations = HashBasedTable.create();
            -    /** Expected to be emptied by the time registration occurs, is emptied by {@link #accept(String, ResourceKey, Builder, NonNullSupplier, NonNullFunction)} */
            +    /**
            +     * Expected to be emptied by the time registration occurs, is emptied by
            +     * {@link #accept(String, ResourceKey, Builder, NonNullSupplier, NonNullFunction)}
            +     */
                 private final Multimap>>, NonNullConsumer> registerCallbacks = HashMultimap.create();
                 /** Entry-less callbacks that are invoked after the registry type has completely finished */
                 private final Multimap>, Runnable> afterRegisterCallbacks = HashMultimap.create();
            @@ -149,9 +158,11 @@ public static boolean isDevEnvironment() {
                 private final String modid;
             
                 /**
            -     * Get the mod event bus that event listeners will be registered to. Useful when Registrate is used in mods that use alternative language loaders, such as forgelin.
            +     * Get the mod event bus that event listeners will be registered to. Useful when Registrate is used in mods that use
            +     * alternative language loaders, such as forgelin.
                  */
            -    @Getter @Setter
            +    @Getter
            +    @Setter
                 private @Nullable IEventBus modEventBus;
             
                 private @Nullable String currentName;
            @@ -161,7 +172,7 @@ public static boolean isDevEnvironment() {
                  * Construct a new Registrate for the given mod ID.
                  *
                  * @param modid
            -     *            The mod ID for which objects will be registered
            +     *              The mod ID for which objects will be registered
                  */
                 protected AbstractRegistrate(String modid) {
                     this.modid = modid;
            @@ -178,7 +189,8 @@ protected final S self() {
                 }
             
                 /**
            -     * Called during {@link Registrate#create(String) creation} to initialize event listeners. Custom implementations may add their own event listeners by overriding this.
            +     * Called during {@link Registrate#create(String) creation} to initialize event listeners. Custom implementations
            +     * may add their own event listeners by overriding this.
                  * 

            * Always call {@code super} in your override unless you know what you are doing! * @@ -195,8 +207,9 @@ public S registerEventListeners(IEventBus bus) { Consumer onRegisterLate = this::onRegisterLate; bus.addListener(onRegister); bus.addListener(EventPriority.LOWEST, onRegisterLate); - bus.addListener(this::onBuildCreativeModeTabContents); // Fired multiple times when ever tabs need contents rebuilt (changing op tab perms for example) - + bus.addListener(this::onBuildCreativeModeTabContents); // Fired multiple times when ever tabs need contents + // rebuilt (changing op tab perms for example) + // Register events fire multiple times, so clean them up on common setup OneTimeEventReceiver.addModListener(this, FMLCommonSetupEvent.class, $ -> { OneTimeEventReceiver.unregister(this, onRegister, RegisterEvent.class); @@ -211,11 +224,13 @@ public S registerEventListeners(IEventBus bus) { } /** - * Called once per registry to gather collected registrations and add entries to the registry. May be overriden in custom implementations to perform additional actions upon entry registration, but + * Called once per registry to gather collected registrations and add entries to the registry. May be overriden in + * custom implementations to perform additional actions upon entry registration, but * must call {@code super}. - * + * * @param event - * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the registry type + * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the + * registry type */ protected void onRegister(RegisterEvent event) { ResourceKey> type = event.getRegistryKey(); @@ -250,11 +265,14 @@ protected void onRegister(RegisterEvent event) { } /** - * Called once per registry at the {@link EventPriority#LOWEST lowest priority} to perform any actions that must happen after all other entries have been registered, including from other mods. May - * be overriden in custom implementations to perform additional actions upon entry registration, but must call {@code super}. - * + * Called once per registry at the {@link EventPriority#LOWEST lowest priority} to perform any actions that must + * happen after all other entries have been registered, including from other mods. May + * be overriden in custom implementations to perform additional actions upon entry registration, but must + * call {@code super}. + * * @param event - * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the registry type + * The {@link RegisterEvent} being fired, use {@link RegisterEvent#getRegistryKey()} to query the + * registry type */ protected void onRegisterLate(RegisterEvent event) { ResourceKey> type = event.getRegistryKey(); @@ -265,16 +283,17 @@ protected void onRegisterLate(RegisterEvent event) { } /** - * Called when a {@link CreativeModeTab} is being populated to fill in any entries that belong there. Can be overriden in custom implementations. - * + * Called when a {@link CreativeModeTab} is being populated to fill in any entries that belong there. Can be + * overriden in custom implementations. + * * @param event - * The event + * The event */ protected void onBuildCreativeModeTabContents(BuildCreativeModeTabContentsEvent event) { var modifier = new CreativeModeTabModifier(event::getFlags, event::hasPermissions, event::accept, event::getParameters); creativeModeTabModifiers.forEach((key, value) -> { - if(event.getTabKey().equals(key)) value.accept(modifier); + if (event.getTabKey().equals(key)) value.accept(modifier); }); } @@ -282,9 +301,9 @@ protected void onBuildCreativeModeTabContents(BuildCreativeModeTabContentsEvent /** * Called when datagen begins to add our provider to the generator. Can be overriden in custom implementations. - * + * * @param event - * The event + * The event */ protected void onData(GatherDataEvent event) { event.getGenerator().addProvider(true, provider = new RegistrateDataProvider(this, modid, event)); @@ -295,7 +314,7 @@ protected void onData(GatherDataEvent event) { * * @return The current entry name * @throws NullPointerException - * if {@link #currentName} is null + * if {@link #currentName} is null */ protected String currentName() { String name = currentName; @@ -304,38 +323,41 @@ protected String currentName() { } /** - * Allows retrieval of a previously created entry, of the current name (from the last invocation of {@link #object(String)}. Useful to retrieve a different entry than the final state of your + * Allows retrieval of a previously created entry, of the current name (from the last invocation of + * {@link #object(String)}. Useful to retrieve a different entry than the final state of your * chain may produce, e.g. * *

                  * {@code
            +     *
                  * public static final RegistryObject MY_BLOCK_ITEM = REGISTRATE.object("my_block")
                  *         .block(MyBlock::new)
            -     *             .defaultItem()
            -     *             .lang("My Special Block")
            -     *             .build()
            +     *         .defaultItem()
            +     *         .lang("My Special Block")
            +     *         .build()
                  *         .get(Item.class);
                  * }
                  * 
            * * @param - * The type of the registry for which to retrieve the entry + * The type of the registry for which to retrieve the entry * @param - * The type of the entry to return + * The type of the entry to return * @param type - * A {@link ResourceKey} for the registry + * A {@link ResourceKey} for the registry * @return A {@link RegistryEntry} which will supply the requested entry, if it exists * @throws IllegalArgumentException - * if no such registration has been done + * if no such registration has been done * @throws NullPointerException - * if current name has not been set via {@link #object(String)} + * if current name has not been set via {@link #object(String)} */ public RegistryEntry get(ResourceKey> type) { return this.get(currentName(), type); } /** - * Allows retrieval of a previously created entry. Useful to retrieve arbitrary entries that may have been created as side-effects of earlier registrations. + * Allows retrieval of a previously created entry. Useful to retrieve arbitrary entries that may have been created + * as side-effects of earlier registrations. * *
                  * {@code
            @@ -351,32 +373,33 @@ public  RegistryEntry get(ResourceKey
                  *
                  * @param 
            -     *            The type of the registry for which to retrieve the entry
            +     *             The type of the registry for which to retrieve the entry
                  * @param 
            -     *            The type of the entry to return
            +     *             The type of the entry to return
                  * @param name
            -     *            The name of the registry entry to request
            +     *             The name of the registry entry to request
                  * @param type
            -     *            A {@link ResourceKey} for the registry
            +     *             A {@link ResourceKey} for the registry
                  * @return A {@link RegistryEntry} which will supply the requested entry, if it exists
                  * @throws IllegalArgumentException
            -     *             if no such registration has been done
            +     *                                  if no such registration has been done
                  */
                 public  RegistryEntry get(String name, ResourceKey> type) {
                     return this.getRegistration(name, type).getDelegate();
                 }
             
                 /**
            -     * Allows retrieval of a previously created entry that may or may not exist. Possibly useful in some very specific scenarios, internally used during fluid registration.
            +     * Allows retrieval of a previously created entry that may or may not exist. Possibly useful in some very specific
            +     * scenarios, internally used during fluid registration.
                  *
                  * @param 
            -     *            The type of the registry for which to retrieve the entry
            +     *             The type of the registry for which to retrieve the entry
                  * @param 
            -     *            The type of the entry to return
            +     *             The type of the entry to return
                  * @param name
            -     *            The name of the registry entry to request
            +     *             The name of the registry entry to request
                  * @param type
            -     *            A class representing the registry type
            +     *             A class representing the registry type
                  * @return A {@link RegistryEntry} which will supply the requested entry, if it exists
                  */
                 public  Optional> getOptional(String name, ResourceKey> type) {
            @@ -400,13 +423,15 @@ private  Registration getRegistration(String name, Resourc
                 /**
                  * Gather a collection of all entries registered for a certain registry
                  * 

            - * Note that this can be called before registration is complete, but the {@link RegistryEntry entries} will be empty at that time. - * + * Note that this can be called before registration is complete, but the {@link RegistryEntry entries} will be empty + * at that time. + * * @param - * Registry type + * Registry type * @param type - * A {@link ResourceKey} for the registry in question - * @return A collection of {@link RegistryEntry} objects representing all entries in the given registry which are known to this {@link AbstractRegistrate} object. + * A {@link ResourceKey} for the registry in question + * @return A collection of {@link RegistryEntry} objects representing all entries in the given registry which are + * known to this {@link AbstractRegistrate} object. */ @SuppressWarnings({ "null", "unchecked" }) public Collection> getAll(ResourceKey> type) { @@ -414,18 +439,20 @@ public Collection> getAll(ResourceKeyimmediately following registration, before further entries are registered. - * + * Add a callback to be invoked when a certain entry has been registered. This will be invoked immediately + * following registration, before further entries are registered. + * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param name - * The name of the entry to watch (implicitly within the {@link #getModid() modid} of this instance + * The name of the entry to watch (implicitly within the {@link #getModid() modid} of this + * instance * @param registryType - * A {@link ResourceKey} for the registry in question + * A {@link ResourceKey} for the registry in question * @param callback - * The callback to invoke, which will be passed the created entry object + * The callback to invoke, which will be passed the created entry object * @return This {@link AbstractRegistrate} instance */ public S addRegisterCallback(String name, ResourceKey> registryType, NonNullConsumer callback) { @@ -439,14 +466,15 @@ public S addRegisterCallback(String name, ResourceKey - * The registry type + * The registry type * @param registryType - * A {@link ResourceKey} for the registry in question + * A {@link ResourceKey} for the registry in question * @param callback - * The callback to invoke + * The callback to invoke * @return This {@link AbstractRegistrate} instance */ public S addRegisterCallback(ResourceKey> registryType, Runnable callback) { @@ -456,11 +484,11 @@ public S addRegisterCallback(ResourceKey> registryType /** * Check if a certain registry has completed registration. - * + * * @param - * The registry type + * The registry type * @param registryType - * A {@link ResourceKey} for the registry in question + * A {@link ResourceKey} for the registry in question * @return {@code true} iff the given registry has finished the registration step */ public boolean isRegistered(ResourceKey> registryType) { @@ -468,15 +496,17 @@ public boolean isRegistered(ResourceKey> registryType) } /** - * Get the data provider instance for a given {@link GeneratorType}. Only works within datagen context, not during registration or init. + * Get the data provider instance for a given {@link GeneratorType}. Only works within datagen context, not during + * registration or init. * * @param

            - * The type of the provider + * The type of the provider * @param type - * A {@link GeneratorType} representing the desired provider - * @return An {@link Optional} holding the provider, or empty if this provider was not registered. This can happen if datagen is run only for client or server providers. + * A {@link GeneratorType} representing the desired provider + * @return An {@link Optional} holding the provider, or empty if this provider was not registered. This can happen + * if datagen is run only for client or server providers. * @throws IllegalStateException - * if datagen has not started yet + * if datagen has not started yet */ public

            Optional

            getDataProvider(GeneratorType

            type) { RegistrateDataProvider provider = this.provider; @@ -487,18 +517,19 @@ public

            Optional

            getDataProvider(GeneratorType

            type) { } /** - * Mostly internal, sets the data generator for a certain entry/type combination. This will replace an existing data gen callback if it exists. + * Mostly internal, sets the data generator for a certain entry/type combination. This will replace an existing data + * gen callback if it exists. * * @param

            - * The type of provider + * The type of provider * @param - * The registry type + * The registry type * @param builder - * The builder for the entry + * The builder for the entry * @param type - * The {@link GeneratorType} to generate data for + * The {@link GeneratorType} to generate data for * @param cons - * A callback to be invoked during data generation + * A callback to be invoked during data generation * @return this {@link AbstractRegistrate} */ public S setDataGenerator(Builder builder, GeneratorType type, NonNullConsumer cons) { @@ -506,20 +537,21 @@ public S setDataGenerator(Builder builder, GeneratorType - * The type of provider + * The type of provider * @param - * The registry type + * The registry type * @param entry - * The name of the entry which the provider is for + * The name of the entry which the provider is for * @param registryType - * A {@link Class} representing the registry type of the entry + * A {@link Class} representing the registry type of the entry * @param type - * The {@link GeneratorType} to generate data for + * The {@link GeneratorType} to generate data for * @param cons - * A callback to be invoked during data generation + * A callback to be invoked during data generation * @return this {@link AbstractRegistrate} */ public S setDataGenerator(String entry, ResourceKey> registryType, GeneratorType type, NonNullConsumer cons) { @@ -533,16 +565,17 @@ public S setDataGenerator(String entry, ResourceKey } /** - * Add a data generator callback that is not associated with any entry, which can never replace an existing data generator. + * Add a data generator callback that is not associated with any entry, which can never replace an existing data + * generator. *

            * This is useful to add data generator callbacks for miscellaneous data not strictly associated with an entry. * * @param - * The type of provider + * The type of provider * @param type - * The {@link GeneratorType} to generate data for + * The {@link GeneratorType} to generate data for * @param cons - * A callback to be invoked during data generation + * A callback to be invoked during data generation * @return this {@link AbstractRegistrate} */ public S addDataGenerator(GeneratorType type, NonNullConsumer cons) { @@ -575,11 +608,13 @@ public DataProviderInitializer getDataGenInitializer() { * Add a custom translation mapping using the vanilla style of Identifier -> translation key conversion. * * @param type - * Type of the object, this is used as a prefix (e.g. {@code ["block", "mymod:myblock"] -> "block.mymod.myblock"}) + * Type of the object, this is used as a prefix (e.g. + * {@code ["block", "mymod:myblock"] -> "block.mymod.myblock"}) * @param id - * ID of the object, which will be converted to a lang key via {@link Util#makeDescriptionId(String, Identifier)} + * ID of the object, which will be converted to a lang key via + * {@link Util#makeDescriptionId(String, Identifier)} * @param localizedName - * (English) translation value + * (English) translation value * @return A {@link MutableComponent} representing the translated text */ public MutableComponent addLang(String type, Identifier id, String localizedName) { @@ -587,16 +622,19 @@ public MutableComponent addLang(String type, Identifier id, String localizedName } /** - * Add a custom translation mapping using the vanilla style of Identifier -> translation key conversion. Also appends a suffix to the key. + * Add a custom translation mapping using the vanilla style of Identifier -> translation key conversion. Also + * appends a suffix to the key. * * @param type - * Type of the object, this is used as a prefix (e.g. {@code ["block", "mymod:myblock"] -> "block.mymod.myblock"}) + * Type of the object, this is used as a prefix (e.g. + * {@code ["block", "mymod:myblock"] -> "block.mymod.myblock"}) * @param id - * ID of the object, which will be converted to a lang key via {@link Util#makeDescriptionId(String, Identifier)} + * ID of the object, which will be converted to a lang key via + * {@link Util#makeDescriptionId(String, Identifier)} * @param suffix - * A suffix which will be appended to the generated key (separated by a dot) + * A suffix which will be appended to the generated key (separated by a dot) * @param localizedName - * (English) translation value + * (English) translation value * @return A {@link MutableComponent} representing the translated text */ public MutableComponent addLang(String type, Identifier id, String suffix, String localizedName) { @@ -607,9 +645,9 @@ public MutableComponent addLang(String type, Identifier id, String suffix, Strin * Add a custom translation mapping directly to the lang provider. * * @param key - * The translation key + * The translation key * @param value - * The (English) translation value + * The (English) translation value * @return A {@link MutableComponent} representing the translated text */ public MutableComponent addRawLang(String key, String value) { @@ -633,11 +671,11 @@ private Optional>>> getEntryForGe * For internal use, calls upon registered data generators to actually create their data. * * @param - * The type of the provider + * The type of the provider * @param type - * The type of provider to run + * The type of provider to run * @param gen - * The provider + * The provider */ @SuppressWarnings("unchecked") public void genData(GeneratorType type, T gen) { @@ -679,10 +717,11 @@ public void genData(GeneratorType type, T gen) { /** * Enable skipping of registry entries and data generators that error during registration/generation. *

            - * Should only be used for debugging! {@code skipErrors(true)} will do nothing outside of a dev environment. + * Should only be used for debugging! {@code skipErrors(true)} will do nothing outside of a dev + * environment. * * @param skipErrors - * {@code true} to skip errors during registration/generation + * {@code true} to skip errors during registration/generation * @return this {@link AbstractRegistrate} */ public S skipErrors(boolean skipErrors) { @@ -695,11 +734,12 @@ public S skipErrors(boolean skipErrors) { } /** - * Begin a new object, this is typically used at the beginning of a builder chain. The given name will be used until this method is called again. This makes it simple to create multiple entries + * Begin a new object, this is typically used at the beginning of a builder chain. The given name will be used until + * this method is called again. This makes it simple to create multiple entries * with the same name, as is often the case with blocks/items, items/entities, and blocks/TEs. * * @param name - * The name to use for future entries + * The name to use for future entries * @return this {@link AbstractRegistrate} */ public S object(String name) { @@ -710,10 +750,11 @@ public S object(String name) { /** * Set the default CreativeModeTab to be passed onto future builders. *

            - * This special case method should be used if your creative tab instance was not created by Registrate, otherwise use {@link #defaultCreativeTab()}. - * + * This special case method should be used if your creative tab instance was not created by Registrate, otherwise + * use {@link #defaultCreativeTab()}. + * * @param creativeModeTab - * The new default CreativeModeTab type + * The new default CreativeModeTab type * @return This {@link AbstractRegistrate} instance */ public S defaultCreativeTab(ResourceKey creativeModeTab) { @@ -731,7 +772,7 @@ public S defaultCreativeTab(ResourceKey creativeModeTab) { * Calling this method multiple times will add additional callbacks. * * @param creativeModeTab The {@link CreativeModeTab} to register this callback for - * @param modifier The modifier callback to be registered + * @param modifier The modifier callback to be registered * @return This {@link AbstractRegistrate} instance */ public S modifyCreativeModeTab(ResourceKey creativeModeTab, Consumer modifier) { @@ -740,10 +781,12 @@ public S modifyCreativeModeTab(ResourceKey creativeModeTab, Con } /** - * Apply a transformation to this {@link AbstractRegistrate}. Useful to apply helper methods within a fluent chain, e.g. + * Apply a transformation to this {@link AbstractRegistrate}. Useful to apply helper methods within a fluent chain, + * e.g. * *

                  * {@code
            +     *
                  * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
                  *         .transform(Utils::createMyBlock)
                  *         .get(Block.class);
            @@ -751,7 +794,7 @@ public S modifyCreativeModeTab(ResourceKey creativeModeTab, Con
                  * 
            * * @param func - * The {@link UnaryOperator function} to apply + * The {@link UnaryOperator function} to apply * @return this {@link AbstractRegistrate} */ public S transform(NonNullUnaryOperator func) { @@ -759,11 +802,13 @@ public S transform(NonNullUnaryOperator func) { } /** - * Apply a transformation to this {@link AbstractRegistrate}. Similar to {@link #transform(NonNullUnaryOperator)}, but for actions that return a builder in-progress. Useful to apply helper methods + * Apply a transformation to this {@link AbstractRegistrate}. Similar to {@link #transform(NonNullUnaryOperator)}, + * but for actions that return a builder in-progress. Useful to apply helper methods * within a fluent chain, e.g. * *
                  * {@code
            +     *
                  * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
                  *         .transform(Utils::createMyBlock)
                  *         .lang("My Block") // Can modify the builder afterwards
            @@ -772,15 +817,15 @@ public S transform(NonNullUnaryOperator func) {
                  * 
            * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param

            - * Parent type + * Parent type * @param - * Self type + * Self type * @param func - * The {@link Function function} to apply + * The {@link Function function} to apply * @return the resultant {@link Builder} */ public > S2 transform(NonNullFunction func) { @@ -788,20 +833,22 @@ public > S2 transform(NonNull } /** - * Create a builder for a new entry. This is typically not needed, unless you are implementing a custom builder type. + * Create a builder for a new entry. This is typically not needed, unless you are implementing a + * custom builder type. *

            - * Uses the currently set name (via {@link #object(String)}) as the name for the new entry, and passes it to the factory as the first parameter. + * Uses the currently set name (via {@link #object(String)}) as the name for the new entry, and passes it to the + * factory as the first parameter. * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param

            - * Parent type + * Parent type * @param - * Self type + * Self type * @param factory - * The factory to create the builder + * The factory to create the builder * @return The {@link Builder} instance */ public > S2 entry(NonNullBiFunction factory) { @@ -809,20 +856,21 @@ public > S2 entry(NonNullBiFu } /** - * Create a builder for a new entry. This is typically not needed, unless you are implementing a custom builder type. + * Create a builder for a new entry. This is typically not needed, unless you are implementing a + * custom builder type. * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param

            - * Parent type + * Parent type * @param - * Self type + * Self type * @param name - * The name to use for the entry + * The name to use for the entry * @param factory - * The factory to create the builder + * The factory to create the builder * @return The {@link Builder} instance */ public > S2 entry(String name, NonNullFunction factory) { @@ -832,22 +880,24 @@ public > S2 entry(String name /** * Factory method to accept a completed builder and add it to the registration queue. *

            - * Satisfies the functional interface {@link BuilderCallback}, which is typically given to new builder instances when they are constructed. - * + * Satisfies the functional interface {@link BuilderCallback}, which is typically given to new builder instances + * when they are constructed. + * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param name - * Thename of the entry being created + * Thename of the entry being created * @param type - * The registry to add the entry to + * The registry to add the entry to * @param builder - * The builder instance that was used to create this entry. Not used by default implementation, but custom extensions may use it for some purpose + * The builder instance that was used to create this entry. Not used by default implementation, + * but custom extensions may use it for some purpose * @param creator - * Constructor for the new entry object + * Constructor for the new entry object * @param entryFactory - * Optional custom factory to create special {@link RegistryEntry} types + * Optional custom factory to create special {@link RegistryEntry} types * @return A {@link RegistryEntry} that will hold the created entry after registration is complete */ protected RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier creator, NonNullFunction, ? extends RegistryEntry> entryFactory) { @@ -863,19 +913,22 @@ protected RegistryEntry accept(String name, ResourceKey * Alternatively, a custom {@link Builder builder} can be created. *

            - * This method will automatically subscribe to the {@link NewRegistryEvent} and create the registry at the proper time. Thus, the new registry will not exist immediately after this is called. - * + * This method will automatically subscribe to the {@link NewRegistryEvent} and create the registry at the proper + * time. Thus, the new registry will not exist immediately after this is called. + * * @param - * The type of object the new registry will contain + * The type of object the new registry will contain * @param name - * The ID of this registry + * The ID of this registry * @param builder - * A function to create the {@link RegistryBuilder} that defines the other properties/behaviors of the created registry + * A function to create the {@link RegistryBuilder} that defines the other properties/behaviors of + * the created registry * @return A {@link ResourceKey resource key} referencing the to-be-created registry. */ public ResourceKey> makeRegistry(String name, Function>, RegistryBuilder> builder) { @@ -889,9 +942,10 @@ public ResourceKey> makeRegistry(String name, Function - * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the namespace of the registry key. + * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the + * namespace of the registry key. * - * @param name The ID of this registry + * @param name The ID of this registry * @param codec The codec to be used for loading data from datapacks on servers * @see #makeDatapackRegistry(String, Codec, Codec) */ @@ -903,17 +957,20 @@ public ResourceKey> makeDatapackRegistry(String name, Codec c * Registers the registry key as a datapack registry, which will cause data to be loaded from * a datapack folder based on the registry's name. *

            - * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the namespace of the registry key. + * Data JSONs will be loaded from {@code data//modid/registryname/}, where {@code modid} is the + * namespace of the registry key. * - * @param name The ID of this registry - * @param codec The codec to be used for loading data from datapacks on servers + * @param name The ID of this registry + * @param codec The codec to be used for loading data from datapacks on servers * @param networkCodec The codec to be used for syncing loaded data to clients. - * If {@code networkCodec} is null, data will not be synced, and clients are not required to have this - * datapack registry to join a server. - *

            - * If {@code networkCodec} is not null, clients must have this datapack registry/mod - * when joining a server that has this datapack registry/mod. - * The data will be synced using the network codec and accessible via {@link ClientPacketListener#registryAccess()}. + * If {@code networkCodec} is null, data will not be synced, and clients are not required to + * have this + * datapack registry to join a server. + *

            + * If {@code networkCodec} is not null, clients must have this datapack registry/mod + * when joining a server that has this datapack registry/mod. + * The data will be synced using the network codec and accessible via + * {@link ClientPacketListener#registryAccess()}. * @see #makeDatapackRegistry(String, Codec) */ public ResourceKey> makeDatapackRegistry(String name, Codec codec, @Nullable Codec networkCodec) { @@ -1063,12 +1120,12 @@ public FluidBuilder fluid(Identifier stillTex } public FluidBuilder fluid(Identifier stillTexture, Identifier flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), stillTexture, flowingTexture, typeFactory, fluidFactory); } public FluidBuilder fluid(Identifier stillTexture, Identifier flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), stillTexture, flowingTexture, fluidType, fluidFactory); } @@ -1102,12 +1159,12 @@ public FluidBuilder fluid(String name, Identi } public FluidBuilder fluid(String name, Identifier stillTexture, Identifier flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), name, stillTexture, flowingTexture, typeFactory, fluidFactory); } public FluidBuilder fluid(String name, Identifier stillTexture, Identifier flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { return fluid(self(), name, stillTexture, flowingTexture, fluidType, fluidFactory); } @@ -1141,12 +1198,12 @@ public FluidBuilder fluid(P parent, Identi } public FluidBuilder fluid(P parent, Identifier stillTexture, Identifier flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { return fluid(parent, currentName(), stillTexture, flowingTexture, typeFactory, fluidFactory); } public FluidBuilder fluid(P parent, Identifier stillTexture, Identifier flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { return fluid(parent, currentName(), stillTexture, flowingTexture, fluidType, fluidFactory); } @@ -1188,12 +1245,12 @@ public FluidBuilder fluid(P parent, String } public FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, - FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { + FluidBuilder.FluidTypeFactory typeFactory, FluidBuilder.FluidFactory fluidFactory) { return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, typeFactory, fluidFactory)).model(stillTexture, flowingTexture); } public FluidBuilder fluid(P parent, String name, Identifier stillTexture, Identifier flowingTexture, - NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { + NonNullSupplier fluidType, FluidBuilder.FluidFactory fluidFactory) { return entry(name, callback -> FluidBuilder.create(this, parent, name, callback, fluidType, fluidFactory)).model(stillTexture, flowingTexture); } diff --git a/src/main/java/com/modularmc/registrate/Registrate.java b/src/main/java/com/modularmc/registrate/Registrate.java index f87bf8b..dec91f2 100644 --- a/src/main/java/com/modularmc/registrate/Registrate.java +++ b/src/main/java/com/modularmc/registrate/Registrate.java @@ -1,20 +1,23 @@ package com.modularmc.registrate; -import lombok.extern.log4j.Log4j2; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; +import lombok.extern.log4j.Log4j2; + import java.util.Optional; @Log4j2 public class Registrate extends AbstractRegistrate { + /** - * Create a new {@link Registrate} and register event listeners for registration and data generation. Used in lieu of adding side-effects to constructor, so that alternate initialization + * Create a new {@link Registrate} and register event listeners for registration and data generation. Used in lieu + * of adding side-effects to constructor, so that alternate initialization * strategies can be done in subclasses. - * + * * @param modid - * The mod ID for which objects will be registered + * The mod ID for which objects will be registered * @return The {@link Registrate} instance */ public static Registrate create(String modid) { @@ -22,13 +25,12 @@ public static Registrate create(String modid) { Optional modEventBus = ModList.get().getModContainerById(modid) .map(ModContainer::getEventBus); - + modEventBus.ifPresentOrElse(ret::registerEventListeners, () -> { String message = "# [Registrate] Failed to register eventListeners for mod " + modid + ", This should be reported to this mod's dev #"; - StringBuilder hashtags = new StringBuilder().append("#".repeat(message.length())); - + log.fatal(hashtags.toString()); log.fatal(message); log.fatal(hashtags.toString()); diff --git a/src/main/java/com/modularmc/registrate/RegistrateLib.java b/src/main/java/com/modularmc/registrate/RegistrateLib.java index e1bbb50..8d912b2 100644 --- a/src/main/java/com/modularmc/registrate/RegistrateLib.java +++ b/src/main/java/com/modularmc/registrate/RegistrateLib.java @@ -1,15 +1,19 @@ package com.modularmc.registrate; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.fml.common.Mod; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Random; -@Mod(RegistrateLib.MOD_ID) -public class RegistrateLib { +/** + * Fork metadata and shared development constants for the ModularMCLib variant + * of Registrate. + * + *

            + * This class is intentionally not a NeoForge mod entrypoint. + * Runtime test entrypoints live under the dedicated {@code testmod} sources. + */ +public final class RegistrateLib { public static final String MOD_ID = "registrate"; public static final String MOD_NAME = "RegistrateLib"; @@ -18,7 +22,5 @@ public class RegistrateLib { public static final Random RANDOM = new Random(); - public RegistrateLib(IEventBus bus) { - - } + private RegistrateLib() {} } diff --git a/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java b/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java index c4d9683..e0e7d0b 100644 --- a/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java @@ -1,7 +1,5 @@ package com.modularmc.registrate.builders; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.providers.RegistrateLangProvider; @@ -11,18 +9,21 @@ import com.modularmc.registrate.util.nullness.NonNullBiFunction; import com.modularmc.registrate.util.nullness.NonNullFunction; import com.modularmc.registrate.util.nullness.NonNullSupplier; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import net.minecraft.core.Registry; import net.minecraft.data.tags.TagsProvider; -import net.minecraft.resources.ResourceKey; import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagEntry; import net.minecraft.tags.TagKey; import net.neoforged.neoforge.registries.DeferredHolder; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + import java.util.Arrays; /** @@ -31,7 +32,8 @@ * Provides the most basic functionality, and some utility methods that remove the need to pass the registry class. * * @param - * Type of the registry for the current object. This is the concrete base class that all registry entries must extend, and the type used for the forge registry itself. + * Type of the registry for the current object. This is the concrete base class that all registry entries + * must extend, and the type used for the forge registry itself. * @param * Actual type of the object being built. * @param

            @@ -43,15 +45,15 @@ @RequiredArgsConstructor public abstract class AbstractBuilder> implements Builder { - @Getter(onMethod_ = {@Override}) + @Getter(onMethod_ = { @Override }) private final AbstractRegistrate owner; - @Getter(onMethod_ = {@Override}) + @Getter(onMethod_ = { @Override }) private final P parent; - @Getter(onMethod_ = {@Override}) + @Getter(onMethod_ = { @Override }) private final String name; @Getter(AccessLevel.PROTECTED) private final BuilderCallback callback; - @Getter(onMethod_ = {@Override}) + @Getter(onMethod_ = { @Override }) private final ResourceKey> registryKey; private final Multimap>, TagKey> tagsByType = HashMultimap.create(); @@ -63,7 +65,8 @@ public abstract class AbstractBuilder asSupplier() { * Tag this entry with a tag (or tags) of the correct type. Multiple calls will add additional tags. * * @param type - * The provider type (which must be a tag provider) + * The provider type (which must be a tag provider) * @param tags - * The tags to add + * The tags to add * @return this {@link Builder} */ @SuppressWarnings("unchecked") @@ -108,9 +111,9 @@ public final & RegistrateTagsProvider> S tag(Prov /** * Mark this entry as optional when generating tags - * */ + */ @SuppressWarnings("unchecked") - public S asOptional(){ + public S asOptional() { isOptional = true; return (S) this; } @@ -122,12 +125,13 @@ protected TagEntry asTag() { } /** - * Remove a tag (or tags) from this entry of a given type. Useful to remove default tags on fluids, for example. Multiple calls will remove additional tags. + * Remove a tag (or tags) from this entry of a given type. Useful to remove default tags on fluids, for example. + * Multiple calls will remove additional tags. * * @param type - * The provider type (which must be a tag provider) + * The provider type (which must be a tag provider) * @param tags - * The tags to remove + * The tags to remove * @return this {@link Builder} */ @SuppressWarnings("unchecked") @@ -142,11 +146,13 @@ public final & RegistrateTagsProvider> S removeTa } /** - * Set the lang key for this entry to the default value (specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, ResourceKey)}). Generally, specific helpers from concrete + * Set the lang key for this entry to the default value (specified by + * {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, ResourceKey)}). Generally, specific helpers from + * concrete * builders should be used instead. * * @param langKeyProvider - * A function to get the translation key from the entry + * A function to get the translation key from the entry * @return this {@link Builder} */ public S lang(NonNullFunction langKeyProvider) { @@ -154,12 +160,13 @@ public S lang(NonNullFunction langKeyProvider) { } /** - * Set the lang key for this entry to the specified name. Generally, specific helpers from concrete builders should be used instead. + * Set the lang key for this entry to the specified name. Generally, specific helpers from concrete builders should + * be used instead. * * @param langKeyProvider - * A function to get the translation key from the entry + * A function to get the translation key from the entry * @param name - * The name to use + * The name to use * @return this {@link Builder} */ public S lang(NonNullFunction langKeyProvider, String name) { @@ -170,8 +177,7 @@ private S lang(NonNullFunction langKeyProvider, NonNullBiFunction prov.add(langKeyProvider.apply(ctx.getEntry()), localizedNameProvider.apply(prov, ctx::getEntry))); } - public ResourceKey getResourceKey(){ + public ResourceKey getResourceKey() { return ResourceKey.create(getRegistryKey(), Identifier.fromNamespaceAndPath(getOwner().getModid(), getName())); } - } diff --git a/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java b/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java index fb6a5af..a4aa8b8 100644 --- a/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java @@ -1,450 +1,473 @@ -//package com.modularmc.registrate.builders; -// -//import java.util.Arrays; -//import java.util.EnumSet; -// -//import javax.annotation.Nonnull; -// -//import com.google.common.collect.HashMultimap; -//import com.google.common.collect.Multimap; -//import com.modularmc.registrate.AbstractRegistrate; -//import com.modularmc.registrate.providers.RegistrateLangProvider; -//import com.modularmc.registrate.util.nullness.NonNullConsumer; -//import com.modularmc.registrate.util.nullness.NonNullFunction; -//import com.modularmc.registrate.util.nullness.NonNullSupplier; -//import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; -//import com.modularmc.registrate.util.nullness.NonnullType; -// -//import net.minecraft.entity.EntityClassification; -//import net.minecraft.entity.EntityType; -//import net.minecraft.world.biome.Biome; -//import net.minecraft.world.biome.Biome.SpawnListEntry; -//import net.minecraft.world.gen.GenerationStage.Carving; -//import net.minecraft.world.gen.GenerationStage.Decoration; -//import net.minecraft.world.gen.carver.ConfiguredCarver; -//import net.minecraft.world.gen.carver.EmptyCarverConfig; -//import net.minecraft.world.gen.carver.ICarverConfig; -//import net.minecraft.world.gen.carver.WorldCarver; -//import net.minecraft.world.gen.feature.ConfiguredFeature; -//import net.minecraft.world.gen.feature.Feature; -//import net.minecraft.world.gen.feature.IFeatureConfig; -//import net.minecraft.world.gen.feature.NoFeatureConfig; -//import net.minecraft.world.gen.placement.IPlacementConfig; -//import net.minecraft.world.gen.placement.NoPlacementConfig; -//import net.minecraft.world.gen.placement.Placement; -//import net.minecraftforge.common.BiomeDictionary; -//import net.minecraftforge.common.BiomeManager; -// -///** -// * A builder for biomes, allows for customization of the {@link Biome.Builder biome properties}, and configuration of data associated with biomes (lang). -// * +// package com.modularmc.registrate.builders; +// +// import java.util.Arrays; +// import java.util.EnumSet; +// +// import javax.annotation.Nonnull; +// +// import com.google.common.collect.HashMultimap; +// import com.google.common.collect.Multimap; +// import com.modularmc.registrate.AbstractRegistrate; +// import com.modularmc.registrate.providers.RegistrateLangProvider; +// import com.modularmc.registrate.util.nullness.NonNullConsumer; +// import com.modularmc.registrate.util.nullness.NonNullFunction; +// import com.modularmc.registrate.util.nullness.NonNullSupplier; +// import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; +// import com.modularmc.registrate.util.nullness.NonnullType; +// +// import net.minecraft.entity.EntityClassification; +// import net.minecraft.entity.EntityType; +// import net.minecraft.world.biome.Biome; +// import net.minecraft.world.biome.Biome.SpawnListEntry; +// import net.minecraft.world.gen.GenerationStage.Carving; +// import net.minecraft.world.gen.GenerationStage.Decoration; +// import net.minecraft.world.gen.carver.ConfiguredCarver; +// import net.minecraft.world.gen.carver.EmptyCarverConfig; +// import net.minecraft.world.gen.carver.ICarverConfig; +// import net.minecraft.world.gen.carver.WorldCarver; +// import net.minecraft.world.gen.feature.ConfiguredFeature; +// import net.minecraft.world.gen.feature.Feature; +// import net.minecraft.world.gen.feature.IFeatureConfig; +// import net.minecraft.world.gen.feature.NoFeatureConfig; +// import net.minecraft.world.gen.placement.IPlacementConfig; +// import net.minecraft.world.gen.placement.NoPlacementConfig; +// import net.minecraft.world.gen.placement.Placement; +// import net.minecraftforge.common.BiomeDictionary; +// import net.minecraftforge.common.BiomeManager; +// +/// ** +// * A builder for biomes, allows for customization of the {@link Biome.Builder biome properties}, and configuration of +// data associated with biomes (lang). +// * +// * @param +// * The type of biome being built +// * @param

            +// * Parent object type +// */ +// public class BiomeBuilder extends AbstractBuilder> { +// +// /** +// * Create a new {@link BiomeBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that +// alternate initialization strategies can be done in subclasses. +// *

            +// * The biome will be assigned the following data: +// *

              +// *
            • The default translation (via {@link #defaultLang()})
            • +// *
            +// * // * @param -// * The type of biome being built +// * The type of the builder // * @param

            -// * Parent object type +// * Parent object type +// * @param owner +// * The owning {@link AbstractRegistrate} object +// * @param parent +// * The parent object +// * @param name +// * Name of the entry being built +// * @param callback +// * A callback used to actually register the built entry +// * @param factory +// * Factory to create the biome +// * @return A new {@link BiomeBuilder} with reasonable default data generators. +// */ +// public static BiomeBuilder create(AbstractRegistrate owner, P parent, String name, +// BuilderCallback callback, NonNullFunction factory) { +// return new BiomeBuilder<>(owner, parent, name, callback, factory) +// .defaultLang(); +// } +// +// private final NonNullFunction factory; +// +// private NonNullSupplier initialProperties = Biome.Builder::new; +// private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); +// +// private final Multimap>> features = HashMultimap.create(); +// private final Multimap>> carvers = HashMultimap.create(); +// private final Multimap> spawns = HashMultimap.create(); +// +// @SuppressWarnings("null") +// private final EnumSet configuredTypes = EnumSet.noneOf(BiomeManager.BiomeType.class); +// +// protected BiomeBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, +// NonNullFunction factory) { +// super(owner, parent, name, callback, Biome.class); +// this.factory = factory; +// } +// +// /** +// * Modify the properties of the biome. Modifications are done lazily, but the passed function is composed with the +// current one, and as such this method can be called multiple times to perform +// * different operations. +// *

            +// * If a different properties instance is returned, it will replace the existing one entirely. +// * +// * @param func +// * The action to perform on the properties +// * @return this {@link BiomeBuilder} // */ -//public class BiomeBuilder extends AbstractBuilder> { -// -// /** -// * Create a new {@link BiomeBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. -// *

            -// * The biome will be assigned the following data: -// *

              -// *
            • The default translation (via {@link #defaultLang()})
            • -// *
            -// * -// * @param -// * The type of the builder -// * @param

            -// * Parent object type -// * @param owner -// * The owning {@link AbstractRegistrate} object -// * @param parent -// * The parent object -// * @param name -// * Name of the entry being built -// * @param callback -// * A callback used to actually register the built entry -// * @param factory -// * Factory to create the biome -// * @return A new {@link BiomeBuilder} with reasonable default data generators. -// */ -// public static BiomeBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { -// return new BiomeBuilder<>(owner, parent, name, callback, factory) -// .defaultLang(); -// } -// -// private final NonNullFunction factory; -// -// private NonNullSupplier initialProperties = Biome.Builder::new; -// private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); -// -// private final Multimap>> features = HashMultimap.create(); -// private final Multimap>> carvers = HashMultimap.create(); -// private final Multimap> spawns = HashMultimap.create(); -// -// @SuppressWarnings("null") -// private final EnumSet configuredTypes = EnumSet.noneOf(BiomeManager.BiomeType.class); -// -// protected BiomeBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { -// super(owner, parent, name, callback, Biome.class); -// this.factory = factory; -// } -// -// /** -// * Modify the properties of the biome. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform -// * different operations. -// *

            -// * If a different properties instance is returned, it will replace the existing one entirely. -// * -// * @param func -// * The action to perform on the properties -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder properties(NonNullUnaryOperator func) { -// propertiesCallback = propertiesCallback.andThen(func); -// return this; -// } -// -// /** -// * Replace the initial state of the biome properties, without replacing or removing any modifications done via {@link #properties(NonNullUnaryOperator)}. -// * -// * @param properties -// * A supplier to to create the initial properties -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder initialProperties(NonNullSupplier properties) { -// initialProperties = properties; -// return this; -// } -// -// /** -// * Set the weight for this biome to generate in the overworld in regions matching the given type. This can only be called once per type. -// * -// * @param type -// * The type that controls which climates the biome will spawn in -// * @param weight -// * The weight, or how common this biome should be in that climate -// * @return this {@link BiomeBuilder} -// * @see BiomeManager -// * @throws IllegalArgumentException -// * if this type has already had its weight set -// */ -// public BiomeBuilder typeWeight(BiomeManager.BiomeType type, int weight) { -// if (!configuredTypes.add(type)) { -// throw new IllegalArgumentException("Cannot set a type weight more than once."); -// } -// this.onRegister(b -> BiomeManager.addBiome(type, new BiomeManager.BiomeEntry(b, weight))); -// return this; -// } -// -// /** -// * Add types to the {@link BiomeDictionary} for this biome. Can be called multiple times to add more types. -// * -// * @param types -// * The types to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addDictionaryTypes(BiomeDictionary.Type... types) { -// this.onRegister(b -> BiomeDictionary.addTypes(b, types)); -// return this; -// } -// -// /** -// * Manually add what would have been the "best guess" types from the {@link BiomeDictionary} for this biome. This has no effect if no types are added via -// * {@link #addDictionaryTypes(net.minecraftforge.common.BiomeDictionary.Type...)}. -// * -// * @return this {@link BiomeBuilder} -// * @see BiomeDictionary#makeBestGuess(Biome) -// */ -// public BiomeBuilder forceAutomaticDictionaryTypes() { -// this.onRegister(BiomeDictionary::makeBestGuess); -// return this; -// } -// -// /** -// * Copy all {@link Feature features} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy features from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copyFeatures(NonNullSupplier biome) { -// addFeatures(b -> Arrays.stream(Decoration.values()) -// .forEach(d -> biome.get().getFeatures(d).stream() -// .forEach(f -> b.addFeature(d, f)))); -// return this; -// } -// -// /** -// * Add a feature to this biome, where neither the feature nor the placement have a config. -// * -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param placement -// * How the feature will be placed -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, NonNullSupplier> placement) { -// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement); -// } -// -// /** -// * Add a feature to this biome, where the placement does not have a config. -// * -// * @param -// * The type of config the feature requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param featureConfig -// * The config for the feature -// * @param placement -// * How the feature will be placed -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, FC featureConfig, NonNullSupplier> placement) { -// return addFeature(stage, feature, featureConfig, placement, IPlacementConfig.NO_PLACEMENT_CONFIG); -// } -// -// /** -// * Add a feature to this biome, where the feature does not have a config. -// * @param -// * The type of config the placement requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param placement -// * How the feature will be placed -// * @param placementConfig -// * The config for the placement -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, NonNullSupplier> placement, PC placementConfig) { -// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement, placementConfig); -// } -// -// /** -// * Add a feature to this biome. -// * -// * @param -// * The type of config the feature requires -// * @param -// * The type of config the placement requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param featureConfig -// * The config for the feature -// * @param placement -// * How the feature will be placed -// * @param placementConfig -// * The config for the placement -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, FC featureConfig, NonNullSupplier> placement, PC placementConfig) { -// return addConfiguredFeature(stage, () -> feature.get().withConfiguration(featureConfig).withPlacement(placement.get().configure(placementConfig))); -// } -// -// /** -// * Add a pre-configured feature to this biome. -// * -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addConfiguredFeature(Decoration stage, NonNullSupplier> feature) { -// if (this.features.isEmpty()) { -// addFeatures(b -> this.features.forEach((d, f) -> b.addFeature(d, f.get()))); -// } -// this.features.put(stage, feature); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link Feature Features} are registered, for the purpose of adding them to this biome. -// *

            -// * Any {@link Feature} object can be safely referenced here and added to the biome via {@link Biome#addFeature(Decoration, ConfiguredFeature)} -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add features to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeatures(NonNullConsumer action) { -// this.>onRegisterAfter(Feature.class, action); -// return this; -// } -// -// /** -// * Copy all {@link WorldCarver carvers} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy carvers from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copyCarvers(NonNullSupplier biome) { -// addCarvers(b -> Arrays.stream(Carving.values()) -// .forEach(s -> biome.get().getCarvers(s).stream() -// .forEach(c -> b.addCarver(s, c)))); -// return this; -// } -// -// /** -// * Add a carver to this biome, where the carver does not have a config. -// * -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver) { -// return addCarver(type, carver, ICarverConfig.field_214644_a); -// } -// -// /** -// * Add a carver to this biome. -// * -// * @param The type of config the carver requires -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @param carverConfig -// * The config for the carver -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver, CC carverConfig) { -// return addConfiguredCarver(type, () -> Biome.createCarver(carver.get(), carverConfig)); -// } -// -// /** -// * Add a pre-configured carver to this biome. -// * -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addConfiguredCarver(Carving type, NonNullSupplier> carver) { -// if (this.features.isEmpty()) { -// addCarvers(b -> this.carvers.forEach((s, f) -> b.addCarver(s, f.get()))); -// } -// this.carvers.put(type, carver); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link WorldCarver WorldCarvers} are registered, for the purpose of adding them to this biome. -// *

            -// * Any {@link WorldCarver} object can be safely referenced here and added to the biome via {@link Biome#addCarver(Carving, ConfiguredCarver)} -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add carvers to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarvers(NonNullConsumer action) { -// this.> onRegisterAfter(WorldCarver.class, action); -// return this; -// } -// -// /** -// * Copy all {@link SpawnListEntry spawns} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy spawns from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copySpawns(NonNullSupplier biome) { -// addSpawns(b -> Arrays.stream(EntityClassification.values()) -// .forEach(ec -> biome.get().getSpawns(ec).stream() -// .forEach(s -> b.getSpawns(ec).add(s)))); -// return this; -// } -// -// /** -// * Add an entity spawn to this biome. -// * -// * @param type -// * The classification of the spawn, which controls how and when the entity is spawned -// * @param entity -// * The entity to spawn -// * @param weight -// * The weight of the spawn, i.e. how likely it is compared to other spawn entries to be selected -// * @param minGroupSize -// * A minimum size of entities to spawn at once -// * @param maxGroupSize -// * A maximum size of entities to spawn at once -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier> entity, int weight, int minGroupSize, int maxGroupSize) { -// return addSpawn(type, () -> new SpawnListEntry(entity.get(), weight, minGroupSize, maxGroupSize)); -// } -// -// /** -// * Add an entity spawn to this biome. -// * -// * @param type -// * The classification of the spawn, which controls how and when the entity is spawned -// * @param spawn -// * The spawn entry to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier spawn) { -// if (this.spawns.isEmpty()) { -// this.addSpawns(b -> this.spawns.forEach((c, s) -> b.getSpawns(c).add(s.get()))); -// } -// this.spawns.put(type, spawn); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link EntityType Entities} are registered, for the purpose of adding entity spawns to this biome. -// *

            -// * Any {@link EntityType} object can be safely referenced here and added to the biome via {@link Biome#getSpawns(EntityClassification)}. -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add spawns to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawns(NonNullConsumer action) { -// this.> onRegisterAfter(EntityType.class, action); -// return this; -// } -// -// /** -// * Assign the default translation, as specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier)}. This is the default, so it is generally not necessary to call, unless for -// * undoing previous changes. -// * -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder defaultLang() { -// return lang(Biome::getTranslationKey); -// } -// -// /** -// * Set the translation for this biome. -// * -// * @param name -// * A localized English name -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder lang(String name) { -// return lang(Biome::getTranslationKey, name); -// } -// -// @Override -// protected @NonnullType T createEntry() { -// @Nonnull Biome.Builder properties = this.initialProperties.get(); -// properties = propertiesCallback.apply(properties); -// return factory.apply(properties); -// } -//} +// public BiomeBuilder properties(NonNullUnaryOperator func) { +// propertiesCallback = propertiesCallback.andThen(func); +// return this; +// } +// +// /** +// * Replace the initial state of the biome properties, without replacing or removing any modifications done via {@link +// #properties(NonNullUnaryOperator)}. +// * +// * @param properties +// * A supplier to to create the initial properties +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder initialProperties(NonNullSupplier properties) { +// initialProperties = properties; +// return this; +// } +// +// /** +// * Set the weight for this biome to generate in the overworld in regions matching the given type. This can only be +// called once per type. +// * +// * @param type +// * The type that controls which climates the biome will spawn in +// * @param weight +// * The weight, or how common this biome should be in that climate +// * @return this {@link BiomeBuilder} +// * @see BiomeManager +// * @throws IllegalArgumentException +// * if this type has already had its weight set +// */ +// public BiomeBuilder typeWeight(BiomeManager.BiomeType type, int weight) { +// if (!configuredTypes.add(type)) { +// throw new IllegalArgumentException("Cannot set a type weight more than once."); +// } +// this.onRegister(b -> BiomeManager.addBiome(type, new BiomeManager.BiomeEntry(b, weight))); +// return this; +// } +// +// /** +// * Add types to the {@link BiomeDictionary} for this biome. Can be called multiple times to add more types. +// * +// * @param types +// * The types to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addDictionaryTypes(BiomeDictionary.Type... types) { +// this.onRegister(b -> BiomeDictionary.addTypes(b, types)); +// return this; +// } +// +// /** +// * Manually add what would have been the "best guess" types from the {@link BiomeDictionary} for this biome. This has +// no effect if no types are added via +// * {@link #addDictionaryTypes(net.minecraftforge.common.BiomeDictionary.Type...)}. +// * +// * @return this {@link BiomeBuilder} +// * @see BiomeDictionary#makeBestGuess(Biome) +// */ +// public BiomeBuilder forceAutomaticDictionaryTypes() { +// this.onRegister(BiomeDictionary::makeBestGuess); +// return this; +// } +// +// /** +// * Copy all {@link Feature features} from another biome. Does not check for duplicates. +// * +// * @param biome +// * The biome to copy features from +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder copyFeatures(NonNullSupplier biome) { +// addFeatures(b -> Arrays.stream(Decoration.values()) +// .forEach(d -> biome.get().getFeatures(d).stream() +// .forEach(f -> b.addFeature(d, f)))); +// return this; +// } +// +// /** +// * Add a feature to this biome, where neither the feature nor the placement have a config. +// * +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param placement +// * How the feature will be placed +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, +// NonNullSupplier> placement) { +// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement); +// } +// +// /** +// * Add a feature to this biome, where the placement does not have a config. +// * +// * @param +// * The type of config the feature requires +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param featureConfig +// * The config for the feature +// * @param placement +// * How the feature will be placed +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> +// feature, FC featureConfig, NonNullSupplier> placement) { +// return addFeature(stage, feature, featureConfig, placement, IPlacementConfig.NO_PLACEMENT_CONFIG); +// } +// +// /** +// * Add a feature to this biome, where the feature does not have a config. +// * @param +// * The type of config the placement requires +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param placement +// * How the feature will be placed +// * @param placementConfig +// * The config for the placement +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, +// NonNullSupplier> feature, NonNullSupplier> placement, PC placementConfig) { +// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement, placementConfig); +// } +// +// /** +// * Add a feature to this biome. +// * +// * @param +// * The type of config the feature requires +// * @param +// * The type of config the placement requires +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @param featureConfig +// * The config for the feature +// * @param placement +// * How the feature will be placed +// * @param placementConfig +// * The config for the placement +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeature(Decoration stage, +// NonNullSupplier> feature, FC featureConfig, NonNullSupplier> placement, PC placementConfig) +// { +// return addConfiguredFeature(stage, () -> +// feature.get().withConfiguration(featureConfig).withPlacement(placement.get().configure(placementConfig))); +// } +// +// /** +// * Add a pre-configured feature to this biome. +// * +// * @param stage +// * The stage which the feature will generate in +// * @param feature +// * The feature to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addConfiguredFeature(Decoration stage, NonNullSupplier> feature) { +// if (this.features.isEmpty()) { +// addFeatures(b -> this.features.forEach((d, f) -> b.addFeature(d, f.get()))); +// } +// this.features.put(stage, feature); +// return this; +// } +// +// /** +// * Add a callback that will be invoked after all {@link Feature Features} are registered, for the purpose of adding +// them to this biome. +// *

            +// * Any {@link Feature} object can be safely referenced here and added to the biome via {@link +// Biome#addFeature(Decoration, ConfiguredFeature)} +// * +// * @param action +// * A {@link NonNullConsumer} which will be called to add features to this biome. +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addFeatures(NonNullConsumer action) { +// this.>onRegisterAfter(Feature.class, action); +// return this; +// } +// +// /** +// * Copy all {@link WorldCarver carvers} from another biome. Does not check for duplicates. +// * +// * @param biome +// * The biome to copy carvers from +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder copyCarvers(NonNullSupplier biome) { +// addCarvers(b -> Arrays.stream(Carving.values()) +// .forEach(s -> biome.get().getCarvers(s).stream() +// .forEach(c -> b.addCarver(s, c)))); +// return this; +// } +// +// /** +// * Add a carver to this biome, where the carver does not have a config. +// * +// * @param type +// * The type of carving to be done +// * @param carver +// * The carver to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver) { +// return addCarver(type, carver, ICarverConfig.field_214644_a); +// } +// +// /** +// * Add a carver to this biome. +// * +// * @param The type of config the carver requires +// * @param type +// * The type of carving to be done +// * @param carver +// * The carver to add +// * @param carverConfig +// * The config for the carver +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver, +// CC carverConfig) { +// return addConfiguredCarver(type, () -> Biome.createCarver(carver.get(), carverConfig)); +// } +// +// /** +// * Add a pre-configured carver to this biome. +// * +// * @param type +// * The type of carving to be done +// * @param carver +// * The carver to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addConfiguredCarver(Carving type, NonNullSupplier> carver) { +// if (this.features.isEmpty()) { +// addCarvers(b -> this.carvers.forEach((s, f) -> b.addCarver(s, f.get()))); +// } +// this.carvers.put(type, carver); +// return this; +// } +// +// /** +// * Add a callback that will be invoked after all {@link WorldCarver WorldCarvers} are registered, for the purpose of +// adding them to this biome. +// *

            +// * Any {@link WorldCarver} object can be safely referenced here and added to the biome via {@link +// Biome#addCarver(Carving, ConfiguredCarver)} +// * +// * @param action +// * A {@link NonNullConsumer} which will be called to add carvers to this biome. +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addCarvers(NonNullConsumer action) { +// this.> onRegisterAfter(WorldCarver.class, action); +// return this; +// } +// +// /** +// * Copy all {@link SpawnListEntry spawns} from another biome. Does not check for duplicates. +// * +// * @param biome +// * The biome to copy spawns from +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder copySpawns(NonNullSupplier biome) { +// addSpawns(b -> Arrays.stream(EntityClassification.values()) +// .forEach(ec -> biome.get().getSpawns(ec).stream() +// .forEach(s -> b.getSpawns(ec).add(s)))); +// return this; +// } +// +// /** +// * Add an entity spawn to this biome. +// * +// * @param type +// * The classification of the spawn, which controls how and when the entity is spawned +// * @param entity +// * The entity to spawn +// * @param weight +// * The weight of the spawn, i.e. how likely it is compared to other spawn entries to be selected +// * @param minGroupSize +// * A minimum size of entities to spawn at once +// * @param maxGroupSize +// * A maximum size of entities to spawn at once +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier> entity, int +// weight, int minGroupSize, int maxGroupSize) { +// return addSpawn(type, () -> new SpawnListEntry(entity.get(), weight, minGroupSize, maxGroupSize)); +// } +// +// /** +// * Add an entity spawn to this biome. +// * +// * @param type +// * The classification of the spawn, which controls how and when the entity is spawned +// * @param spawn +// * The spawn entry to add +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier spawn) { +// if (this.spawns.isEmpty()) { +// this.addSpawns(b -> this.spawns.forEach((c, s) -> b.getSpawns(c).add(s.get()))); +// } +// this.spawns.put(type, spawn); +// return this; +// } +// +// /** +// * Add a callback that will be invoked after all {@link EntityType Entities} are registered, for the purpose of adding +// entity spawns to this biome. +// *

            +// * Any {@link EntityType} object can be safely referenced here and added to the biome via {@link +// Biome#getSpawns(EntityClassification)}. +// * +// * @param action +// * A {@link NonNullConsumer} which will be called to add spawns to this biome. +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder addSpawns(NonNullConsumer action) { +// this.> onRegisterAfter(EntityType.class, action); +// return this; +// } +// +// /** +// * Assign the default translation, as specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier)}. +// This is the default, so it is generally not necessary to call, unless for +// * undoing previous changes. +// * +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder defaultLang() { +// return lang(Biome::getTranslationKey); +// } +// +// /** +// * Set the translation for this biome. +// * +// * @param name +// * A localized English name +// * @return this {@link BiomeBuilder} +// */ +// public BiomeBuilder lang(String name) { +// return lang(Biome::getTranslationKey, name); +// } +// +// @Override +// protected @NonnullType T createEntry() { +// @Nonnull Biome.Builder properties = this.initialProperties.get(); +// properties = propertiesCallback.apply(properties); +// return factory.apply(properties); +// } +// } diff --git a/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java b/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java index dc23fc6..1d9028b 100644 --- a/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java @@ -1,12 +1,5 @@ package com.modularmc.registrate.builders; -import java.util.List; -import java.util.function.Function; -import java.util.function.Supplier; - -import javax.annotation.Nonnull; -import org.jspecify.annotations.Nullable; - import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.builders.BlockEntityBuilder.BlockEntityFactory; import com.modularmc.registrate.providers.DataGenContext; @@ -30,9 +23,7 @@ import net.minecraft.client.color.block.BlockTintSource; import net.minecraft.client.renderer.block.dispatch.SingleVariant; import net.minecraft.client.renderer.block.dispatch.Variant; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.registries.Registries; -import net.minecraft.resources.Identifier; import net.minecraft.tags.TagKey; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -40,15 +31,23 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockBehaviour; import net.neoforged.api.distmarker.Dist; -import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; import net.neoforged.neoforge.client.extensions.common.IClientBlockExtensions; import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; import net.neoforged.neoforge.registries.DeferredHolder; +import org.jspecify.annotations.Nullable; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + /** - * A builder for blocks, allows for customization of the {@link Block.Properties}, creation of block items, and configuration of data associated with blocks (loot tables, recipes, etc.). - * + * A builder for blocks, allows for customization of the {@link Block.Properties}, creation of block items, and + * configuration of data associated with blocks (loot tables, recipes, etc.). + * * @param * The type of block being built * @param

            @@ -57,7 +56,8 @@ public class BlockBuilder extends AbstractBuilder> { /** - * Create a new {@link BlockBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link BlockBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that + * alternate initialization strategies can be done in subclasses. *

            * The block will be assigned the following data: *

              @@ -66,21 +66,21 @@ public class BlockBuilder extends AbstractBuilderA self-dropping loot table (via {@link #defaultLoot()}) *
            • The default translation (via {@link #defaultLang()})
            • *
            - * + * * @param - * The type of the builder + * The type of the builder * @param

            - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the block + * Factory to create the block * @return A new {@link BlockBuilder} with reasonable default data generators. */ public static BlockBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { @@ -89,7 +89,7 @@ public static BlockBuilder create(AbstractRegistrate< } private final NonNullFunction factory; - + private NonNullSupplier initialProperties; private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); @@ -102,13 +102,14 @@ protected BlockBuilder(AbstractRegistrate owner, P parent, String name, Build } /** - * Modify the properties of the block. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform + * Modify the properties of the block. Modifications are done lazily, but the passed function is composed with the + * current one, and as such this method can be called multiple times to perform * different operations. *

            * If a different properties instance is returned, it will replace the existing one entirely. - * + * * @param func - * The action to perform on the properties + * The action to perform on the properties * @return this {@link BlockBuilder} */ public BlockBuilder properties(NonNullUnaryOperator func) { @@ -117,10 +118,12 @@ public BlockBuilder properties(NonNullUnaryOperator initialProperties(NonNullSupplier block) { @@ -129,7 +132,8 @@ public BlockBuilder initialProperties(NonNullSupplier blo } /** - * Create a standard {@link BlockItem} for this block, building it immediately, and not allowing for further configuration. + * Create a standard {@link BlockItem} for this block, building it immediately, and not allowing for further + * configuration. *

            * The item will have no lang entry (since it would duplicate the block's) * @@ -141,10 +145,11 @@ public BlockBuilder simpleItem() { } /** - * Create a standard {@link BlockItem} for this block, and return the builder for it so that further customization can be done. + * Create a standard {@link BlockItem} for this block, and return the builder for it so that further customization + * can be done. *

            * The item will have no lang entry (since it would duplicate the block's) - * + * * @return the {@link ItemBuilder} for the {@link BlockItem} */ public ItemBuilder> item() { @@ -152,19 +157,22 @@ public ItemBuilder> item() { } /** - * Create a {@link BlockItem} for this block, which is created by the given factory, and return the builder for it so that further customization can be done. + * Create a {@link BlockItem} for this block, which is created by the given factory, and return the builder for it + * so that further customization can be done. *

            - * By default, the item will have no lang entry (since it would duplicate the block's) and a simple block item model. - * + * By default, the item will have no lang entry (since it would duplicate the block's) and a simple block item + * model. + * * @param - * The type of the item + * The type of the item * @param factory - * A factory for the item, which accepts the block object and properties and returns a new item + * A factory for the item, which accepts the block object and properties and returns a new item * @return the {@link ItemBuilder} for the {@link BlockItem} */ public ItemBuilder> item(NonNullBiFunction factory) { - return getOwner().> item(this, getName(), p -> factory.apply(getEntry(), p.useBlockDescriptionPrefix())) - .setData(ProviderType.LANG, NonNullBiConsumer.noop()) // FIXME Need a beetter API for "unsetting" providers + return getOwner().>item(this, getName(), p -> factory.apply(getEntry(), p.useBlockDescriptionPrefix())) + .setData(ProviderType.LANG, NonNullBiConsumer.noop()) // FIXME Need a beetter API for "unsetting" + // providers .model(() -> (ctx, prov) -> { getOwner().getDataProvider(ProviderType.BLOCKSTATE) .map(g -> g.seenBlockstates.get(getEntry())) @@ -181,12 +189,13 @@ public ItemBuilder> item(NonNullBiFunctio } /** - * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as its one and only valid block. - * + * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as + * its one and only valid block. + * * @param - * The type of the block entity + * The type of the block entity * @param factory - * A factory for the block entity + * A factory for the block entity * @return this {@link BlockBuilder} */ public BlockBuilder simpleBlockEntity(BlockEntityFactory factory) { @@ -194,23 +203,25 @@ public BlockBuilder simpleBlockEntity(BlockEntity } /** - * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as its one and only valid block. + * Create a {@link BlockEntity} for this block, which is created by the given factory, and assigned this block as + * its one and only valid block. *

            * The created {@link BlockEntityBuilder} is returned for further configuration. - * + * * @param - * The type of the block entity + * The type of the block entity * @param factory - * A factory for the block entity + * A factory for the block entity * @return the {@link BlockEntityBuilder} */ public BlockEntityBuilder> blockEntity(BlockEntityFactory factory) { return getOwner().>blockEntity(this, getName(), factory).validBlock(asSupplier()); } - + /** - * Register a set of block tint sources for this block. The {@link BlockTintSource} instances can be shared across many blocks. - * + * Register a set of block tint sources for this block. The {@link BlockTintSource} instances can be shared across + * many blocks. + * * @param tintSources The tint sources to register for this block, indexed by tint index * @return this {@link BlockBuilder} */ @@ -222,7 +233,7 @@ public BlockBuilder color(NonNullSupplier>> this.tintSources = tintSources; return this; } - + protected void registerBlockColor() { OneTimeEventReceiver.addModListener(getOwner(), RegisterColorHandlersEvent.BlockTintSources.class, e -> { NonNullSupplier>> tintSources = this.tintSources; @@ -233,9 +244,11 @@ protected void registerBlockColor() { } /** - * Assign the default blockstate, which maps all states to a single model file (via {@link RegistrateBlockModelGenerator#createTrivialCube(Block)}). This is the default, so it is generally not necessary + * Assign the default blockstate, which maps all states to a single model file (via + * {@link RegistrateBlockModelGenerator#createTrivialCube(Block)}). This is the default, so it is generally not + * necessary * to call, unless for undoing previous changes. - * + * * @return this {@link BlockBuilder} */ public BlockBuilder defaultBlockstate() { @@ -244,9 +257,9 @@ public BlockBuilder defaultBlockstate() { /** * Configure the blockstate/models for this block. - * + * * @param cons - * The callback which will be invoked during data generation. + * The callback which will be invoked during data generation. * @return this {@link BlockBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -256,9 +269,11 @@ public BlockBuilder blockstate(NonNullSupplier defaultLang() { @@ -267,9 +282,9 @@ public BlockBuilder defaultLang() { /** * Set the translation for this block. - * + * * @param name - * A localized English name + * A localized English name * @return this {@link BlockBuilder} */ public BlockBuilder lang(String name) { @@ -277,9 +292,10 @@ public BlockBuilder lang(String name) { } /** - * Assign the default loot table, as specified by {@link RegistrateBlockLootTables#dropSelf(Block)}. This is the default, so it is generally not necessary to call, unless for + * Assign the default loot table, as specified by {@link RegistrateBlockLootTables#dropSelf(Block)}. This is the + * default, so it is generally not necessary to call, unless for * undoing previous changes. - * + * * @return this {@link BlockBuilder} */ public BlockBuilder defaultLoot() { @@ -287,13 +303,15 @@ public BlockBuilder defaultLoot() { } /** - * Configure the loot table for this block. This is different than most data gen callbacks as the callback does not accept a {@link DataGenContext}, but instead a + * Configure the loot table for this block. This is different than most data gen callbacks as the callback does not + * accept a {@link DataGenContext}, but instead a * {@link RegistrateBlockLootTables}, for creating specifically block loot tables. *

            - * If the block does not have a loot table (i.e. {@link Block.Properties#noLootTable()} is called) this action will be skipped. - * + * If the block does not have a loot table (i.e. {@link Block.Properties#noLootTable()} is called) this action will + * be skipped. + * * @param cons - * The callback which will be invoked during block loot table creation. + * The callback which will be invoked during block loot table creation. * @return this {@link BlockBuilder} */ public BlockBuilder loot(NonNullBiConsumer cons) { @@ -306,9 +324,9 @@ public BlockBuilder loot(NonNullBiConsumer c /** * Configure the recipe(s) for this block. - * + * * @param cons - * The callback which will be invoked during data generation. + * The callback which will be invoked during data generation. * @return this {@link BlockBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -323,7 +341,7 @@ public BlockBuilder recipe(NonNullBiConsumer, Reg * The {@link IClientBlockExtensions} instance can be shared across many items. * * @param clientExtension - * The client extension to register for this block + * The client extension to register for this block * @return this {@link BlockBuilder} */ public BlockBuilder clientExtension(NonNullSupplier> clientExtension) { @@ -339,7 +357,7 @@ public BlockBuilder clientExtension(NonNullSupplier tag(TagKey... tags) { @Override protected T createEntry() { - @Nonnull BlockBehaviour.Properties properties = this.initialProperties.get(); - //TODO why do we need this? + @Nonnull + BlockBehaviour.Properties properties = this.initialProperties.get(); + // TODO why do we need this? // ObfuscationReflectionHelper.setPrivateValue(BlockBehaviour.Properties.class, properties, null, "drops"); properties = propertiesCallback.apply(properties); return factory.apply(properties.setId(getResourceKey())); diff --git a/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java index 5cd5076..701a5e6 100644 --- a/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java @@ -1,14 +1,5 @@ package com.modularmc.registrate.builders; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; - -import org.jspecify.annotations.Nullable; - import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.OneTimeEventReceiver; import com.modularmc.registrate.util.RegistrateDistExecutor; @@ -31,9 +22,17 @@ import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.registries.DeferredHolder; +import org.jspecify.annotations.Nullable; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; + /** * A builder for block entities, allows for customization of the valid blocks. - * + * * @param * The type of block entity being built * @param

            @@ -44,28 +43,28 @@ public class BlockEntityBuilder extends AbstractBuilde public interface BlockEntityFactory { public T create(BlockEntityType type, BlockPos pos, BlockState state); - } /** - * Create a new {@link BlockEntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link BlockEntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, + * so that alternate initialization strategies can be done in subclasses. *

            * The block entity will be assigned the following data: - * + * * @param - * The type of the builder + * The type of the builder * @param

            - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the block entity + * Factory to create the block entity * @return A new {@link BlockEntityBuilder} with reasonable default data generators. */ public static BlockEntityBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, BlockEntityFactory factory) { @@ -80,24 +79,24 @@ protected BlockEntityBuilder(AbstractRegistrate owner, P parent, String name, super(owner, parent, name, callback, Registries.BLOCK_ENTITY_TYPE); this.factory = factory; } - + /** * Add a valid block for this block entity. - * + * * @param block - * A supplier for the block to add at registration time + * A supplier for the block to add at registration time * @return this {@link BlockEntityBuilder} */ public BlockEntityBuilder validBlock(NonNullSupplier block) { validBlocks.add(block); return this; } - + /** * Add valid blocks for this block entity. - * + * * @param blocks - * An array of suppliers for the block to add at registration time + * An array of suppliers for the block to add at registration time * @return this {@link BlockEntityBuilder} */ @SafeVarargs @@ -105,15 +104,17 @@ public final BlockEntityBuilder validBlocks(NonNullSupplier - * - * @apiNote This requires the {@link Class} of the block entity object, which can only be gotten by inspecting an instance of it. Thus, the entity will be constructed to register the renderer. - * + * + * @apiNote This requires the {@link Class} of the block entity object, which can only be gotten by inspecting an + * instance of it. Thus, the entity will be constructed to register the renderer. + * * @param renderer - * A (server safe) supplier to an {@link Function} that will provide this block entity's renderer given the renderer dispatcher + * A (server safe) supplier to an {@link Function} that will provide this block entity's renderer + * given the renderer dispatcher * @return this {@link BlockEntityBuilder} */ public BlockEntityBuilder renderer(NonNullSupplier>> renderer) { @@ -123,7 +124,7 @@ public BlockEntityBuilder renderer(NonNullSupplier { var renderer = this.renderer; diff --git a/src/main/java/com/modularmc/registrate/builders/Builder.java b/src/main/java/com/modularmc/registrate/builders/Builder.java index 46d9e4b..c1a4193 100644 --- a/src/main/java/com/modularmc/registrate/builders/Builder.java +++ b/src/main/java/com/modularmc/registrate/builders/Builder.java @@ -6,6 +6,7 @@ import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.*; + import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; @@ -14,13 +15,16 @@ import java.util.function.Function; /** - * A Builder creates registry entries. A Builder instance has a constant name which will be used for the resultant object, they cannot be reused for different names. It holds a parent object that will + * A Builder creates registry entries. A Builder instance has a constant name which will be used for the resultant + * object, they cannot be reused for different names. It holds a parent object that will * be returned from some final methods. *

            - * When a builder is completed via {@link #register()} or {@link #build()}, the object will be lazily registered (through the owning {@link AbstractRegistrate} object). - * + * When a builder is completed via {@link #register()} or {@link #build()}, the object will be lazily registered + * (through the owning {@link AbstractRegistrate} object). + * * @param - * Type of the registry for the current object. This is the concrete base class that all registry entries must extend, and the type used for the forge registry itself. + * Type of the registry for the current object. This is the concrete base class that all registry entries + * must extend, and the type used for the forge registry itself. * @param * Actual type of the object being built. * @param

            @@ -31,81 +35,86 @@ public interface Builder> extends NonNullSupplier> { /** - * Complete the current entry, and return the {@link RegistryEntry} that will supply the built entry once it is available. The builder can be used afterwards, and changes made will reflect the + * Complete the current entry, and return the {@link RegistryEntry} that will supply the built entry once it is + * available. The builder can be used afterwards, and changes made will reflect the * output, as long as it is before registration takes place (before forge registry events). - * + * * @return The {@link RegistryEntry} supplying the built entry. */ RegistryEntry register(); /** * The owning {@link AbstractRegistrate} that created this builder. - * + * * @return the owner {@link AbstractRegistrate} */ AbstractRegistrate getOwner(); /** * The parent object. - * + * * @return the parent object of this builder */ P getParent(); /** - * The name of the entry being created, and combined with the mod ID of the parent {@link AbstractRegistrate}, the registry name. - * + * The name of the entry being created, and combined with the mod ID of the parent {@link AbstractRegistrate}, the + * registry name. + * * @return the name of the current entry */ String getName(); - + ResourceKey> getRegistryKey(); /** - * Get the {@link RegistryEntry} representing the entry built by this builder. Cannot be called before the builder is built. - * + * Get the {@link RegistryEntry} representing the entry built by this builder. Cannot be called before the builder + * is built. + * * @return An {@link RegistryEntry} for this builder's entry * @throws IllegalArgumentException - * If this builder has not been built yet + * If this builder has not been built yet */ @Override default RegistryEntry get() { - return getOwner(). get(getName(), getRegistryKey()); + return getOwner().get(getName(), getRegistryKey()); } - + /** * Get the actual entry built by this builder. Cannot be called before registration. - * + * * @return This builder's entry * @throws IllegalArgumentException - * If this builder has not been built yet + * If this builder has not been built yet * @throws NullPointerException - * If the entry from this builder has not been registered yet + * If the entry from this builder has not been registered yet */ default T getEntry() { return get().get(); } - + /** - * Get a supplier for the entry created by this builder, which will not reference the builder after it has been resolved. - * + * Get a supplier for the entry created by this builder, which will not reference the builder after it has been + * resolved. + * * @return A supplier for the entry */ NonNullSupplier asSupplier(); /** - * Set the data provider callback for this entry for the given provider type, which will be invoked when the provider of the given type executes. + * Set the data provider callback for this entry for the given provider type, which will be invoked when the + * provider of the given type executes. *

            * If called multiple times for the same type, the existing callback will be overwritten. *

            * This is mostly unneeded, and instead helper methods for specific data types should be used when possible. - * + * * @param - * The type of provider + * The type of provider * @param type - * The {@link GeneratorType} for the desired provider + * The {@link GeneratorType} for the desired provider * @param cons - * The callback to execute when the provider is run + * The callback to execute when the provider is run * @return this builder */ @SuppressWarnings("unchecked") @@ -118,13 +127,13 @@ default S setData(GeneratorType type, NonNullBiConsumer * Calling this multiple times for the same type will not overwrite an existing callback. - * + * * @param - * The type of provider + * The type of provider * @param type - * The {@link GeneratorType} for the desired provider + * The {@link GeneratorType} for the desired provider * @param cons - * The callback to execute when the provider is run + * The callback to execute when the provider is run * @return this builder */ @SuppressWarnings("unchecked") @@ -168,13 +177,16 @@ default S dataMap(DataMapType type, NonNullBiFunction - * Builders which have had this method used on them (or another method which calls this one), must be registered, via - * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register time. - * + * Builders which have had this method used on them (or another method which calls this one), must + * be registered, via + * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register + * time. + * * @param callback - * the callback to invoke + * the callback to invoke * @return this {@link Builder} */ @SuppressWarnings("unchecked") @@ -184,17 +196,21 @@ default S onRegister(NonNullConsumer callback) { } /** - * Add a callback to be invoked when this entry is registered, but only after some other registry type has been registered as well. Can be called multiple times to add multiple callbacks. + * Add a callback to be invoked when this entry is registered, but only after some other registry type has been + * registered as well. Can be called multiple times to add multiple callbacks. *

            - * Builders which have had this method used on them (or another method which calls this one), must be registered, via - * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register time. - * + * Builders which have had this method used on them (or another method which calls this one), must + * be registered, via + * {@link #register()}, or errors will be thrown when these "dangling" register callbacks are discovered at register + * time. + * * @param - * The dependency registry type + * The dependency registry type * @param dependencyType - * the base class for objects of the dependency registry. The callback will be invoked only after this registry has fired its registry events. + * the base class for objects of the dependency registry. The callback will be invoked only + * after this registry has fired its registry events. * @param callback - * the callback to invoke + * the callback to invoke * @return this {@link Builder} */ default S onRegisterAfter(ResourceKey> dependencyType, NonNullConsumer callback) { @@ -209,26 +225,27 @@ default S onRegisterAfter(ResourceKey> dependencyTyp /** * Apply a transformation to this {@link Builder}. Useful to apply helper methods within a fluent chain, e.g. - * + * *

                  * {@code
            +     *
                  * public static final RegistryObject MY_BLOCK = REGISTRATE.object("my_block")
                  *         .block(MyBlock::new)
                  *         .transform(Utils::defaultBlockProperties)
                  *         .register();
                  * }
                  * 
            - * + * * @param - * Registry type + * Registry type * @param - * Entry type + * Entry type * @param - * Parent type + * Parent type * @param - * Self type + * Self type * @param func - * The {@link Function function} to apply + * The {@link Function function} to apply * @return the {@link Builder} returned by the given function */ @SuppressWarnings("unchecked") @@ -237,9 +254,10 @@ default > S2 transform } /** - * Register the entry and return the parent object. The {@link net.neoforged.neoforge.registries.DeferredHolder} will be created but not returned. It can be retrieved later with {@link AbstractRegistrate#get(ResourceKey)} or + * Register the entry and return the parent object. The {@link net.neoforged.neoforge.registries.DeferredHolder} + * will be created but not returned. It can be retrieved later with {@link AbstractRegistrate#get(ResourceKey)} or * {@link AbstractRegistrate#get(String, ResourceKey)}. - * + * * @return the parent object */ default P build() { diff --git a/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java b/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java index 454201d..842f63d 100644 --- a/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java +++ b/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java @@ -10,47 +10,50 @@ import net.neoforged.neoforge.registries.DeferredHolder; /** - * A callback passed to {@link Builder builders} from the owning {@link AbstractRegistrate} which will add a registration for the built entry that lazily creates and registers it. + * A callback passed to {@link Builder builders} from the owning {@link AbstractRegistrate} which will add a + * registration for the built entry that lazily creates and registers it. */ @FunctionalInterface public interface BuilderCallback { /** * Accept a built entry, to later be constructed and registered. - * + * * @param - * The registry type to which the entry will be registered + * The registry type to which the entry will be registered * @param - * The type of the entry + * The type of the entry * @param name - * The name of the entry + * The name of the entry * @param type - * A {@link ResourceKey} representing the registry type + * A {@link ResourceKey} representing the registry type * @param builder - * The builder performing this callback + * The builder performing this callback * @param factory - * A {@link NonNullSupplier} that will create the entry + * A {@link NonNullSupplier} that will create the entry * @param entryFactory - * A {@link NonNullFunction} which accepts the entry delegate and returns a {@link RegistryEntry} wrapper + * A {@link NonNullFunction} which accepts the entry delegate and returns a + * {@link RegistryEntry} wrapper * @return A {@link RegistryEntry} that will supply the registered entry */ RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier factory, NonNullFunction, ? extends RegistryEntry> entryFactory); /** - * Accept a built entry, to later be constructed and registered. Uses the default {@link RegistryEntry#RegistryEntry(AbstractRegistrate, DeferredHolder) RegistryEntry factory}. - * + * Accept a built entry, to later be constructed and registered. Uses the default + * {@link RegistryEntry#RegistryEntry(AbstractRegistrate, DeferredHolder) RegistryEntry factory}. + * * @param - * The registry type to which the entry will be registered + * The registry type to which the entry will be registered * @param - * The type of the entry + * The type of the entry * @param name - * The name of the entry + * The name of the entry * @param type - * A {@link Class} representing the registry type + * A {@link Class} representing the registry type * @param builder - * The builder performing this callback + * The builder performing this callback * @param factory - * A {@link NonNullSupplier} that will create the entry + * A {@link NonNullSupplier} that will create the entry * @return A {@link RegistryEntry} that will supply the registered entry */ default RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier factory) { diff --git a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java index e5e1618..a6c6c0b 100644 --- a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java @@ -14,11 +14,11 @@ import com.modularmc.registrate.util.nullness.NonNullConsumer; import com.modularmc.registrate.util.nullness.NonNullFunction; import com.modularmc.registrate.util.nullness.NonNullSupplier; + import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.Identifier; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.*; import net.minecraft.world.entity.SpawnPlacements.SpawnPredicate; @@ -33,10 +33,12 @@ import net.neoforged.neoforge.registries.DeferredHolder; import org.jspecify.annotations.Nullable; + import java.util.function.Supplier; /** - * A builder for entities, allows for customization of the {@link EntityType.Builder}, easy creation of spawn egg items, and configuration of data associated with entities (loot tables, etc.). + * A builder for entities, allows for customization of the {@link EntityType.Builder}, easy creation of spawn egg items, + * and configuration of data associated with entities (loot tables, etc.). * * @param * The type of entity being built @@ -46,7 +48,8 @@ public class EntityBuilder extends AbstractBuilder, EntityType, P, EntityBuilder> { /** - * Create a new {@link EntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link EntityBuilder} and configure data. Used in lieu of adding side-effects to constructor, so + * that alternate initialization strategies can be done in subclasses. *

            * The entity will be assigned the following data: *

              @@ -54,25 +57,25 @@ public class EntityBuilder extends AbstractBuilder * * @param - * The type of the builder + * The type of the builder * @param

              - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the entity + * Factory to create the entity * @param classification - * The {@link MobCategory} of the entity + * The {@link MobCategory} of the entity * @return A new {@link EntityBuilder} with reasonable default data generators. */ public static EntityBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, EntityType.EntityFactory factory, - MobCategory classification) { + MobCategory classification) { return new EntityBuilder<>(owner, parent, name, callback, factory, classification) .defaultLang(); } @@ -91,11 +94,12 @@ protected EntityBuilder(AbstractRegistrate owner, P parent, String name, Buil } /** - * Modify the properties of the entity. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform + * Modify the properties of the entity. Modifications are done lazily, but the passed function is composed with the + * current one, and as such this method can be called multiple times to perform * different operations. * * @param cons - * The action to perform on the properties + * The action to perform on the properties * @return this {@link EntityBuilder} */ public EntityBuilder properties(NonNullConsumer> cons) { @@ -108,7 +112,8 @@ public EntityBuilder properties(NonNullConsumer> con *

              * * @param renderer - * A (server safe) supplier to an {@link EntityRendererProvider} that will provide this entity's renderer + * A (server safe) supplier to an {@link EntityRendererProvider} that will provide this entity's + * renderer * @return this {@link EntityBuilder} */ public EntityBuilder renderer(NonNullSupplier>> renderer) { @@ -139,10 +144,11 @@ protected void registerRenderer() { * Cannot be called more than once per builder. * * @param attributes - * A supplier to the attributes for this entity, usually of the form {@code EntityClass::createAttributes} + * A supplier to the attributes for this entity, usually of the form + * {@code EntityClass::createAttributes} * @return this {@link EntityBuilder} * @throws IllegalStateException - * When called more than once + * When called more than once */ @SuppressWarnings("unchecked") public EntityBuilder attributes(Supplier attributes) { @@ -155,19 +161,20 @@ public EntityBuilder attributes(Supplier attrib } /** - * Register a spawn placement for this entity. The entity must extend {@link Mob} and allow construction with a {@code null} {@link Level}. + * Register a spawn placement for this entity. The entity must extend {@link Mob} and allow construction with a + * {@code null} {@link Level}. *

              * Cannot be called more than once per builder. * * @param type - * The type of placement to use + * The type of placement to use * @param heightmap - * Which heightmap to use to choose placement locations + * Which heightmap to use to choose placement locations * @param predicate - * A predicate to check spawn locations for validity + * A predicate to check spawn locations for validity * @return this {@link EntityBuilder} * @throws IllegalStateException - * When called more than once + * When called more than once */ @SuppressWarnings("unchecked") public EntityBuilder spawnPlacement(SpawnPlacementType type, Heightmap.Types heightmap, SpawnPredicate predicate, RegisterSpawnPlacementsEvent.Operation operation) { @@ -176,15 +183,18 @@ public EntityBuilder spawnPlacement(SpawnPlacementType type, Heightmap.Typ } spawnConfigured = true; this.onRegister(t -> { - /* TODO is there any way to do this now? - try { - if (!(t.create(null) instanceof MobEntity)) { - throw new IllegalArgumentException("Cannot register spawn placement for entity " + t.getRegistryName() + " as it does not extend MobEntity"); - } - } catch (Exception e) { - throw new RuntimeException("Failed to type check entity " + t.getRegistryName() + " when registering spawn placement", e); - } - */ + /* + * TODO is there any way to do this now? + * try { + * if (!(t.create(null) instanceof MobEntity)) { + * throw new IllegalArgumentException("Cannot register spawn placement for entity " + t.getRegistryName() + + * " as it does not extend MobEntity"); + * } + * } catch (Exception e) { + * throw new RuntimeException("Failed to type check entity " + t.getRegistryName() + + * " when registering spawn placement", e); + * } + */ OneTimeEventReceiver.addModListener(getOwner(), RegisterSpawnPlacementsEvent.class, e -> { e.register(t, type, heightmap, predicate, operation); }); @@ -195,49 +205,60 @@ public EntityBuilder spawnPlacement(SpawnPlacementType type, Heightmap.Typ /** * Create a spawn egg item for this entity using the given colors, not allowing for any extra configuration. * - * Deprecated note: This does not work properly, see this issue. - *

              - * As a temporary measure, uses a custom egg class that imperfectly emulates the functionality + * Deprecated note: This does not work properly, see + * this issue. + *

              + * As a temporary measure, uses a custom egg class that imperfectly emulates the functionality * * @param primaryColor - * The primary color of the egg + * The primary color of the egg * @param secondaryColor - * The secondary color of the egg + * The secondary color of the egg * @return this {@link EntityBuilder} */ - /* TODO <1.21.4> spawn egg - @Deprecated - public EntityBuilder defaultSpawnEgg(int primaryColor, int secondaryColor) { - return spawnEgg(primaryColor, secondaryColor).build(); - } - + /* + * TODO <1.21.4> spawn egg + * + * @Deprecated + * public EntityBuilder defaultSpawnEgg(int primaryColor, int secondaryColor) { + * return spawnEgg(primaryColor, secondaryColor).build(); + * } + * */ /** * Create a spawn egg item for this entity using the given colors, and return the builder for further configuration. * - * Deprecated note: This does not work properly, see this issue. - *

              - * As a temporary measure, uses a custom egg class that imperfectly emulates the functionality + * Deprecated note: This does not work properly, see + * this issue. + *

              + * As a temporary measure, uses a custom egg class that imperfectly emulates the functionality * * @param primaryColor - * The primary color of the egg + * The primary color of the egg * @param secondaryColor - * The secondary color of the egg + * The secondary color of the egg * @return the {@link ItemBuilder} for the egg item */ - /* TODO <1.21.4> spawn egg - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Deprecated - public ItemBuilder> spawnEgg(int primaryColor, int secondaryColor) { - var sup = asSupplier(); - return getOwner().item(this, getName() + "_spawn_egg", p -> new DeferredSpawnEggItem((Supplier>) (Supplier) sup, primaryColor, secondaryColor, p)).tab(CreativeModeTabs.SPAWN_EGGS) - .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), Identifier.withDefaultNamespace("item/template_spawn_egg"))); - } + /* + * TODO <1.21.4> spawn egg + * + * @SuppressWarnings({ "rawtypes", "unchecked" }) + * + * @Deprecated + * public ItemBuilder> spawnEgg(int primaryColor, int secondaryColor) { + * var sup = asSupplier(); + * return getOwner().item(this, getName() + "_spawn_egg", p -> new DeferredSpawnEggItem((Supplier>) (Supplier) sup, primaryColor, secondaryColor, p)).tab(CreativeModeTabs.SPAWN_EGGS) + * .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), + * Identifier.withDefaultNamespace("item/template_spawn_egg"))); + * } */ /** - * Assign the default translation, as specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, net.minecraft.resources.ResourceKey)}. This is the default, so it is generally + * Assign the default translation, as specified by + * {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier, net.minecraft.resources.ResourceKey)}. This is + * the default, so it is generally * not necessary to call, unless for undoing previous changes. * * @return this {@link EntityBuilder} @@ -250,7 +271,7 @@ public EntityBuilder defaultLang() { * Set the translation for this entity. * * @param name - * A localized English name + * A localized English name * @return this {@link EntityBuilder} */ public EntityBuilder lang(String name) { @@ -258,11 +279,12 @@ public EntityBuilder lang(String name) { } /** - * Configure the loot table for this entity. This is different than most data gen callbacks as the callback does not accept a {@link DataGenContext}, but instead a + * Configure the loot table for this entity. This is different than most data gen callbacks as the callback does not + * accept a {@link DataGenContext}, but instead a * {@link RegistrateEntityLootTables}, for creating specifically entity loot tables. * * @param cons - * The callback which will be invoked during entity loot table creation. + * The callback which will be invoked during entity loot table creation. * @return this {@link EntityBuilder} */ public EntityBuilder loot(NonNullBiConsumer> cons) { @@ -273,7 +295,7 @@ public EntityBuilder loot(NonNullBiConsumer extends AbstractBuilder @FunctionalInterface public interface FluidTypeFactory { + FluidType create(FluidType.Properties properties); } @FunctionalInterface public interface FluidFactory { + T create(BaseFlowingFluid.Properties properties); } - private @Nullable NonNullSupplier> model; private @Nullable NonNullSupplier> clientExtension; /** - * Register a client extension for this block. The {@link IClientBlockExtensions} instance can be shared across many items. + * Register a client extension for this block. The {@link IClientBlockExtensions} instance can be shared across many + * items. * * @param clientExtension - * The client extension to register for this block + * The client extension to register for this block * @return this {@link BlockBuilder} */ public FluidBuilder clientExtension(NonNullSupplier> clientExtension) { @@ -109,18 +113,19 @@ protected void registerClientExtension() { } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) and fluid class ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) + * and fluid class ({@link BaseFlowingFluid.Flowing}). * * @param

              - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @return A new {@link FluidBuilder} with reasonable default data generators. * @see #create(AbstractRegistrate, Object, String, BuilderCallback, FluidTypeFactory, FluidFactory) */ @@ -129,20 +134,21 @@ public static

              FluidBuilder create(AbstractRegis } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class + * ({@link BaseFlowingFluid.Flowing}). * * @param

              - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param typeFactory - * A factory that creates the fluid type + * A factory that creates the fluid type * @return A new {@link FluidBuilder} with reasonable default data generators. * @see #create(AbstractRegistrate, Object, String, BuilderCallback, FluidTypeFactory, FluidFactory) */ @@ -151,20 +157,21 @@ public static

              FluidBuilder create(AbstractRegis } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default fluid class + * ({@link BaseFlowingFluid.Flowing}). * * @param

              - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param fluidType - * An existing and registered fluid type. + * An existing and registered fluid type. * @return A new {@link FluidBuilder} with reasonable default data generators. * @see #create(AbstractRegistrate, Object, String, BuilderCallback, FluidTypeFactory, FluidFactory) */ @@ -173,96 +180,103 @@ public static

              FluidBuilder create(AbstractRegis } /** - * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) and fluid class ({@link BaseFlowingFluid.Flowing}). + * Create a new {@link FluidBuilder} and configure data. The created builder will use a default ({@link FluidType}) + * and fluid class ({@link BaseFlowingFluid.Flowing}). * * @param - * The type of the builder + * The type of the builder * @param

              - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param fluidFactory - * A factory that creates the flowing fluid + * A factory that creates the flowing fluid * @return A new {@link FluidBuilder} with reasonable default data generators. */ public static FluidBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, - FluidFactory fluidFactory) { + FluidFactory fluidFactory) { return create(owner, parent, name, callback, FluidType::new, fluidFactory); } /** - * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that + * alternate initialization strategies can be done in subclasses. *

              * The fluid will be assigned the following data: *

                *
              • The default translation (via {@link #defaultLang()})
              • *
              • A default {@link BaseFlowingFluid.Source source fluid} (via {@link #defaultSource})
              • - *
              • A default block for the fluid, with its own default blockstate and model that configure the particle texture (via {@link #defaultBlock()})
              • - *
              • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid (via {@link #defaultBucket()})
              • + *
              • A default block for the fluid, with its own default blockstate and model that configure the particle texture + * (via {@link #defaultBlock()})
              • + *
              • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid + * (via {@link #defaultBucket()})
              • *
              * * @param - * The type of the builder + * The type of the builder * @param

              - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param typeFactory - * A factory that creates the fluid type + * A factory that creates the fluid type * @param fluidFactory - * A factory that creates the flowing fluid + * A factory that creates the flowing fluid * @return A new {@link FluidBuilder} with reasonable default data generators. */ public static FluidBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, - FluidTypeFactory typeFactory, FluidFactory fluidFactory) { + FluidTypeFactory typeFactory, FluidFactory fluidFactory) { FluidBuilder ret = new FluidBuilder<>(owner, parent, name, callback, typeFactory, fluidFactory) .defaultLang().defaultSource().defaultBlock().defaultBucket(); return ret; } /** - * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link FluidBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that + * alternate initialization strategies can be done in subclasses. *

              * The fluid will be assigned the following data: *

                *
              • The default translation (via {@link #defaultLang()})
              • *
              • A default {@link BaseFlowingFluid.Source source fluid} (via {@link #defaultSource})
              • - *
              • A default block for the fluid, with its own default blockstate and model that configure the particle texture (via {@link #defaultBlock()})
              • - *
              • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid (via {@link #defaultBucket()})
              • + *
              • A default block for the fluid, with its own default blockstate and model that configure the particle texture + * (via {@link #defaultBlock()})
              • + *
              • A default bucket item, that uses a simple generated item model with a texture of the same name as this fluid + * (via {@link #defaultBucket()})
              • *
              * * @param - * The type of the builder + * The type of the builder * @param

              - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param fluidType - * An existing and registered fluid type + * An existing and registered fluid type * @param fluidFactory - * A factory that creates the flowing fluid + * A factory that creates the flowing fluid * @return A new {@link FluidBuilder} with reasonable default data generators. */ public static FluidBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, - NonNullSupplier fluidType, FluidFactory fluidFactory) { + NonNullSupplier fluidType, FluidFactory fluidFactory) { return new FluidBuilder<>(owner, parent, name, callback, fluidType, fluidFactory) .defaultLang().defaultSource().defaultBlock().defaultBucket(); } @@ -303,11 +317,12 @@ public FluidBuilder(AbstractRegistrate owner, P parent, String name, BuilderC } /** - * Modify the properties of the fluid type. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform + * Modify the properties of the fluid type. Modifications are done lazily, but the passed function is composed with + * the current one, and as such this method can be called multiple times to perform * different operations. * * @param cons - * The action to perform on the attributes + * The action to perform on the attributes * @return this {@link FluidBuilder} */ public FluidBuilder properties(NonNullConsumer cons) { @@ -316,11 +331,12 @@ public FluidBuilder properties(NonNullConsumer cons) } /** - * Modify the properties of the flowing fluid. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform + * Modify the properties of the flowing fluid. Modifications are done lazily, but the passed function is composed + * with the current one, and as such this method can be called multiple times to perform * different operations. * * @param cons - * The action to perform on the attributes + * The action to perform on the attributes * @return this {@link FluidBuilder} */ public FluidBuilder fluidProperties(NonNullConsumer cons) { @@ -329,7 +345,8 @@ public FluidBuilder fluidProperties(NonNullConsumer defaultLang() { * Set the translation for this fluid. * * @param name - * A localized English name + * A localized English name * @return this {@link FluidBuilder} */ public FluidBuilder lang(String name) { @@ -350,12 +367,13 @@ public FluidBuilder lang(String name) { } /** - * Create a standard {@link BaseFlowingFluid.Source} for this fluid which will be built and registered along with this fluid. + * Create a standard {@link BaseFlowingFluid.Source} for this fluid which will be built and registered along with + * this fluid. * * @return this {@link FluidBuilder} * @see #source(NonNullFunction) * @throws IllegalStateException - * If {@link #source(NonNullFunction)} has been called before this method + * If {@link #source(NonNullFunction)} has been called before this method */ public FluidBuilder defaultSource() { if (this.defaultSource != null) { @@ -366,10 +384,11 @@ public FluidBuilder defaultSource() { } /** - * Create a {@link BaseFlowingFluid} for this fluid, which is created by the given factory, and which will be built and registered along with this fluid. + * Create a {@link BaseFlowingFluid} for this fluid, which is created by the given factory, and which will be built + * and registered along with this fluid. * * @param factory - * A factory for the fluid, which accepts the properties and returns a new fluid + * A factory for the fluid, which accepts the properties and returns a new fluid * @return this {@link FluidBuilder} */ public FluidBuilder source(NonNullFunction factory) { @@ -379,12 +398,14 @@ public FluidBuilder source(NonNullFunction defaultBlock() { if (this.defaultBlock != null) { @@ -395,7 +416,8 @@ public FluidBuilder defaultBlock() { } /** - * Create a standard {@link LiquidBlock} for this fluid, and return the builder for it so that further customization can be done. + * Create a standard {@link LiquidBlock} for this fluid, and return the builder for it so that further customization + * can be done. * * @return the {@link BlockBuilder} for the {@link LiquidBlock} */ @@ -404,12 +426,13 @@ public BlockBuilder> block() { } /** - * Create a {@link LiquidBlock} for this fluid, which is created by the given factory, and return the builder for it so that further customization can be done. + * Create a {@link LiquidBlock} for this fluid, which is created by the given factory, and return the builder for it + * so that further customization can be done. * * @param - * The type of the block + * The type of the block * @param factory - * A factory for the block, which accepts the block object and properties and returns a new block + * A factory for the block, which accepts the block object and properties and returns a new block * @return the {@link BlockBuilder} for the {@link LiquidBlock} */ public BlockBuilder> block(NonNullBiFunction factory) { @@ -420,9 +443,9 @@ public BlockBuilder> block(NonNull final NonNullSupplier supplier = asSupplier(); final var lightLevel = Lazy.of(() -> fluidType.get().getLightLevel()); final ToIntFunction lightLevelInt = $ -> lightLevel.get(); - final var ret = getOwner().>block(this, sourceName, p -> factory.apply(supplier.get(), p)) - .properties(p -> BlockBehaviour.Properties.ofFullCopy(Blocks.WATER).noLootTable()) - .properties(p -> p.lightLevel(lightLevelInt)) + final var ret = getOwner().>block(this, sourceName, p -> factory.apply(supplier.get(), p)) + .properties(p -> BlockBehaviour.Properties.ofFullCopy(Blocks.WATER).noLootTable()) + .properties(p -> p.lightLevel(lightLevelInt)) .blockstate(() -> (ctx, prov) -> prov.createNonTemplateModelBlock(ctx.get())); this.fluidProperties(p -> p.block(ret.asSupplier())); return ret; @@ -438,12 +461,14 @@ public FluidBuilder noBlock() { } /** - * Create a standard {@link BucketItem} for this fluid, building it immediately, and not allowing for further configuration. + * Create a standard {@link BucketItem} for this fluid, building it immediately, and not allowing for further + * configuration. * * @return this {@link FluidBuilder} * @see #bucket() * @throws IllegalStateException - * If {@link #bucket()} or {@link #bucket(NonNullBiFunction)} has been called before this method + * If {@link #bucket()} or {@link #bucket(NonNullBiFunction)} has been called before + * this method */ public FluidBuilder defaultBucket() { if (this.defaultBucket != null) { @@ -454,7 +479,8 @@ public FluidBuilder defaultBucket() { } /** - * Create a standard {@link BucketItem} for this fluid, and return the builder for it so that further customization can be done. + * Create a standard {@link BucketItem} for this fluid, and return the builder for it so that further customization + * can be done. * * @return the {@link ItemBuilder} for the {@link BucketItem} */ @@ -463,12 +489,14 @@ public ItemBuilder> bucket() { } /** - * Create a {@link BucketItem} for this fluid, which is created by the given factory, and return the builder for it so that further customization can be done. + * Create a {@link BucketItem} for this fluid, which is created by the given factory, and return the builder for it + * so that further customization can be done. * * @param - * The type of the bucket item + * The type of the bucket item * @param factory - * A factory for the bucket item, which accepts the fluid object supplier and properties and returns a new item + * A factory for the bucket item, which accepts the fluid object supplier and properties and returns + * a new item * @return the {@link ItemBuilder} for the {@link BucketItem} */ public ItemBuilder> bucket(NonNullBiFunction factory) { @@ -482,7 +510,7 @@ public ItemBuilder> bucket(NonNullB throw new IllegalStateException("Cannot create a bucket before creating a source block"); } final var ret = getOwner().>item(this, bucketName, p -> factory.apply(source.get(), p)) - .properties(p -> p.craftRemainder(Items.BUCKET).stacksTo(1)) + .properties(p -> p.craftRemainder(Items.BUCKET).stacksTo(1)) .model(() -> (ctx, prov) -> prov.generateFlatItem(ctx.get(), ModelTemplates.FLAT_ITEM)); this.fluidProperties(p -> p.bucket(ret.asSupplier())); return ret; @@ -501,7 +529,7 @@ public FluidBuilder noBucket() { * Assign {@link TagKey}{@code s} to this fluid and its source fluid. Multiple calls will add additional tags. * * @param tags - * The tags to assign + * The tags to assign * @return this {@link FluidBuilder} */ @SafeVarargs @@ -509,7 +537,7 @@ public final FluidBuilder tag(TagKey... tags) { FluidBuilder ret = this.tag(ProviderType.FLUID_TAGS, tags); if (this.tags.isEmpty()) { ret.getOwner()., Fluid>setDataGenerator(ret.sourceName, getRegistryKey(), ProviderType.FLUID_TAGS, - prov -> this.tags.stream().map(prov::tag).forEach(p -> p.add(getSource()))); + prov -> this.tags.stream().map(prov::tag).forEach(p -> p.add(getSource()))); } this.tags.addAll(Arrays.asList(tags)); return ret; @@ -519,7 +547,7 @@ public final FluidBuilder tag(TagKey... tags) { * Remove {@link TagKey}{@code s} from this fluid and its source fluid. Multiple calls will remove additional tags. * * @param tags - * The tags to remove + * The tags to remove * @return this {@link FluidBuilder} */ @SafeVarargs diff --git a/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java b/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java index 279a489..935323c 100644 --- a/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java @@ -1,6 +1,5 @@ package com.modularmc.registrate.builders; -import com.google.common.collect.Maps; import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.DataGenContext; import com.modularmc.registrate.providers.GeneratorType; @@ -17,6 +16,7 @@ import com.modularmc.registrate.util.nullness.NonNullFunction; import com.modularmc.registrate.util.nullness.NonNullSupplier; import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; + import net.minecraft.client.data.models.model.ModelTemplates; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; @@ -31,14 +31,17 @@ import net.neoforged.neoforge.registries.datamaps.builtin.FurnaceFuel; import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps; +import com.google.common.collect.Maps; import org.jspecify.annotations.Nullable; + import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; /** - * A builder for items, allows for customization of the {@link Item.Properties} and configuration of data associated with items (models, recipes, etc.). + * A builder for items, allows for customization of the {@link Item.Properties} and configuration of data associated + * with items (models, recipes, etc.). * * @param * The type of item being built @@ -48,7 +51,8 @@ public class ItemBuilder extends AbstractBuilder> { /** - * Create a new {@link ItemBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that alternate initialization strategies can be done in subclasses. + * Create a new {@link ItemBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that + * alternate initialization strategies can be done in subclasses. *

              * The item will be assigned the following data: *

                @@ -57,19 +61,19 @@ public class ItemBuilder extends AbstractBuilder * * @param - * The type of the builder + * The type of the builder * @param

                - * Parent object type + * Parent object type * @param owner - * The owning {@link AbstractRegistrate} object + * The owning {@link AbstractRegistrate} object * @param parent - * The parent object + * The parent object * @param name - * Name of the entry being built + * Name of the entry being built * @param callback - * A callback used to actually register the built entry + * A callback used to actually register the built entry * @param factory - * Factory to create the item + * Factory to create the item * @return A new {@link ItemBuilder} with reasonable default data generators. */ public static ItemBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction factory) { @@ -95,13 +99,14 @@ protected ItemBuilder(AbstractRegistrate owner, P parent, String name, Builde } /** - * Modify the properties of the item. Modifications are done lazily, but the passed function is composed with the current one, and as such this method can be called multiple times to perform + * Modify the properties of the item. Modifications are done lazily, but the passed function is composed with the + * current one, and as such this method can be called multiple times to perform * different operations. *

                * If a different properties instance is returned, it will replace the existing one entirely. * * @param func - * The action to perform on the properties + * The action to perform on the properties * @return this {@link ItemBuilder} */ public ItemBuilder properties(NonNullUnaryOperator func) { @@ -110,10 +115,11 @@ public ItemBuilder properties(NonNullUnaryOperator func) } /** - * Replace the initial state of the item properties, without replacing or removing any modifications done via {@link #properties(NonNullUnaryOperator)}. + * Replace the initial state of the item properties, without replacing or removing any modifications done via + * {@link #properties(NonNullUnaryOperator)}. * * @param properties - * A supplier to to create the initial properties + * A supplier to to create the initial properties * @return this {@link ItemBuilder} */ public ItemBuilder initialProperties(NonNullSupplier properties) { @@ -122,17 +128,21 @@ public ItemBuilder initialProperties(NonNullSupplier prop } /** - * Sets a tab modifier for the given tab which can be used to define custom logic for how the item stack is created and/or added to the tab. + * Sets a tab modifier for the given tab which can be used to define custom logic for how the item stack is created + * and/or added to the tab. * *

                - * CreativeModeTab registration is delegated off until the item has been finalized and registered to the {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
                - * This means you can call this method as many times as you like during the build process with no added side effects. + * CreativeModeTab registration is delegated off until the item has been finalized and registered to the + * {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
                + * This means you can call this method as many times as you like during the build process with no added side + * effects. *

                * Calling this method with different {@link ResourceKey tab keys} will add the modifier to all the specified tabs. *

                - * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier for that tab. + * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier + * for that tab. * - * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for + * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for * @param modifier A {@link Consumer consumer} accepting a {@link CreativeModeTabModifier} used to update the tab * @return This builder * @deprecated Use {@link #tab(ResourceKey, NonNullBiConsumer)} which provides access to the registered item. @@ -143,30 +153,39 @@ public ItemBuilder tab(ResourceKey tab, Consumer - * CreativeModeTab registration is delegated off until the item has been finalized and registered to the {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
                - * This means you can call this method as many times as you like during the build process with no added side effects. + * CreativeModeTab registration is delegated off until the item has been finalized and registered to the + * {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
                + * This means you can call this method as many times as you like during the build process with no added side + * effects. *

                * Calling this method with different {@link ResourceKey tab keys} will add the modifier to all the specified tabs. *

                - * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier for that tab. + * Calling this method multiple times with the same {@link ResourceKey tab key} will replace any existing modifier + * for that tab. * - * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for - * @param modifier A {@link NonNullBiConsumer consumer} accepting a context object and {@link CreativeModeTabModifier} used to update the tab + * @param tab A {@link ResourceKey} representing the {@link CreativeModeTab} to use the modifier for + * @param modifier A {@link NonNullBiConsumer consumer} accepting a context object and + * {@link CreativeModeTabModifier} used to update the tab * @return This builder */ public ItemBuilder tab(ResourceKey tab, NonNullBiConsumer, CreativeModeTabModifier> modifier) { - creativeModeTabs.put(tab, modifier); // Should we get the current value in the map [if one exists] and .andThen() the 2 together? right now we replace any consumer that currently exists + creativeModeTabs.put(tab, modifier); // Should we get the current value in the map [if one exists] and + // .andThen() the 2 together? right now we replace any consumer that + // currently exists return this; } /** * Adds the item built from this builder into the given CreativeModeTab using the default ItemStack instance. *

                - * CreativeModeTab registration is delegated off until the item has been finalized and registered to the {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
                - * This means you can call this method as many times as you like during the build process with no added side effects. + * CreativeModeTab registration is delegated off until the item has been finalized and registered to the + * {@link net.minecraft.core.registries.BuiltInRegistries#ITEM Item registry}.
                + * This means you can call this method as many times as you like during the build process with no added side + * effects. *

                * Calling this method with different {@link ResourceKey tab keys} will add the item to all the specified tabs. *

                @@ -206,7 +225,7 @@ public ItemBuilder defaultModel() { * Configure the model for this item. * * @param cons - * The callback which will be invoked during data creation + * The callback which will be invoked during data creation * @return this {@link ItemBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -216,7 +235,9 @@ public ItemBuilder model(NonNullSupplier defaultLang() { * Set the translation for this item. * * @param name - * A localized English name + * A localized English name * @return this {@link ItemBuilder} */ public ItemBuilder lang(String name) { @@ -240,7 +261,7 @@ public ItemBuilder lang(String name) { * Configure the recipe(s) for this item. * * @param cons - * The callback which will be invoked during data generation. + * The callback which will be invoked during data generation. * @return this {@link ItemBuilder} * @see #setData(GeneratorType, NonNullBiConsumer) */ @@ -250,6 +271,7 @@ public ItemBuilder recipe(NonNullBiConsumer, Regis /** * Add burn time for the item + * * @param tick time in ticks for this item to burn in furnace. */ public ItemBuilder burnTime(int tick) { @@ -258,6 +280,7 @@ public ItemBuilder burnTime(int tick) { /** * Add compost chance for the item + * * @param chance chance for composter to increase one level when composting this item. */ public ItemBuilder compostable(float chance) { @@ -267,10 +290,11 @@ public ItemBuilder compostable(float chance) { private @Nullable Function>> clientExtensionFunc; /** - * Register a client extension for this item. The {@link IClientItemExtensions} instance can be shared across many items. + * Register a client extension for this item. The {@link IClientItemExtensions} instance can be shared across many + * items. * * @param clientExtension - * The client extension to register for this item + * The client extension to register for this item * @return this {@link ItemBuilder} */ public ItemBuilder clientExtension(NonNullSupplier> clientExtension) { @@ -303,7 +327,7 @@ protected void registerClientExtension() { * Assign {@link TagKey}{@code s} to this item. Multiple calls will add additional tags. * * @param tags - * The tag to assign + * The tag to assign * @return this {@link ItemBuilder} */ @SafeVarargs diff --git a/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java b/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java index ddf7bd2..d76914e 100644 --- a/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java @@ -1,7 +1,5 @@ package com.modularmc.registrate.builders; -import org.jspecify.annotations.Nullable; - import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.OneTimeEventReceiver; import com.modularmc.registrate.util.RegistrateDistExecutor; @@ -22,10 +20,12 @@ import net.neoforged.neoforge.common.extensions.IMenuTypeExtension; import net.neoforged.neoforge.registries.DeferredHolder; -public class MenuBuilder, P> extends AbstractBuilder, MenuType, P, MenuBuilder> { - +import org.jspecify.annotations.Nullable; + +public class MenuBuilder, P> extends AbstractBuilder, MenuType, P, MenuBuilder> { + public interface MenuFactory { - + T create(MenuType type, int windowId, Inventory inv); } @@ -33,12 +33,12 @@ public interface ForgeMenuFactory { T create(MenuType type, int windowId, Inventory inv, @Nullable RegistryFriendlyByteBuf buffer); } - + public interface ScreenFactory> { - + T create(M menu, Inventory inv, Component displayName); } - + private final ForgeMenuFactory factory; private final NonNullSupplier> screenFactory; diff --git a/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java b/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java index 61542f5..9008a96 100644 --- a/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java @@ -7,7 +7,7 @@ import net.minecraft.resources.ResourceKey; public class NoConfigBuilder extends AbstractBuilder> { - + private final NonNullSupplier factory; public NoConfigBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, ResourceKey> registryType, NonNullSupplier factory) { diff --git a/src/main/java/com/modularmc/registrate/builders/package-info.java b/src/main/java/com/modularmc/registrate/builders/package-info.java index cb0fbe7..a624196 100644 --- a/src/main/java/com/modularmc/registrate/builders/package-info.java +++ b/src/main/java/com/modularmc/registrate/builders/package-info.java @@ -1,2 +1,10 @@ +/** + * Fluent builder APIs for registering content. + * + *

                + * These classes form the primary downstream-facing DSL and should own + * registration-time customization behavior rather than leaking that logic into + * unrelated utility packages. + */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.builders; diff --git a/src/main/java/com/modularmc/registrate/package-info.java b/src/main/java/com/modularmc/registrate/package-info.java index 9e2ce6c..85271a3 100644 --- a/src/main/java/com/modularmc/registrate/package-info.java +++ b/src/main/java/com/modularmc/registrate/package-info.java @@ -1,2 +1,10 @@ +/** + * Root package for the public Registrate entrypoints. + * + *

                + * This layer contains the main orchestration types used by downstream mods: + * the abstract registration coordinator, the default {@code Registrate} + * implementation, and fork-level metadata/constants. + */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate; diff --git a/src/main/java/com/modularmc/registrate/providers/DataGenContext.java b/src/main/java/com/modularmc/registrate/providers/DataGenContext.java index 78ca599..b160c70 100644 --- a/src/main/java/com/modularmc/registrate/providers/DataGenContext.java +++ b/src/main/java/com/modularmc/registrate/providers/DataGenContext.java @@ -3,16 +3,18 @@ import com.modularmc.registrate.builders.Builder; import com.modularmc.registrate.util.nullness.NonNullSupplier; +import net.minecraft.core.Registry; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; + import lombok.AccessLevel; import lombok.Getter; import lombok.Value; import lombok.experimental.Delegate; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.Identifier; /** - * A context bean passed to data generator callbacks. Contains the entry that data is being created for, and some metadata about the entry. + * A context bean passed to data generator callbacks. Contains the entry that data is being created for, and some + * metadata about the entry. * * @param * Type of the registry to which the entry belongs @@ -37,7 +39,7 @@ public E getEntry() { public static DataGenContext from(Builder builder, ResourceKey> type) { return from(builder); } - + public static DataGenContext from(Builder builder) { return new DataGenContext<>(NonNullSupplier.of(builder.getOwner().get(builder.getName(), builder.getRegistryKey())), builder.getName(), Identifier.fromNamespaceAndPath(builder.getOwner().getModid(), builder.getName())); diff --git a/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java b/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java index e93a1b1..e8ab16b 100644 --- a/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java +++ b/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java @@ -1,60 +1,57 @@ package com.modularmc.registrate.providers; -import com.mojang.datafixers.util.Pair; import net.minecraft.core.Registry; import net.minecraft.core.RegistrySetBuilder; import net.minecraft.resources.ResourceKey; import org.jspecify.annotations.Nullable; + import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class DataProviderInitializer { - private final RegistrySetBuilder datapackEntryProvider = new RegistrySetBuilder(); - - private final Map, ProviderType> providerDependencies = new ConcurrentHashMap<>(); - - public DataProviderInitializer() { - addDependency(ProviderType.ITEM_TAGS, ProviderType.BLOCK_TAGS); - } - - protected RegistrySetBuilder getDatapackRegistryProviders() { - return datapackEntryProvider; - } - - protected List getSortedProviders() { - List ans = new ArrayList<>(); - Set> added = new HashSet<>(); - List>> remain = new ArrayList<>(RegistrateDataProvider.TYPES.entrySet()); - while (!remain.isEmpty()) { - if (!remain.removeIf(e -> { - ProviderType type = e.getValue(); - var parent = providerDependencies.get(type); - if (parent == null || added.contains(parent)) { - ans.add(new Sorted(e.getKey(), type, parent)); - added.add(type); - return true; - } - return false; - })) throw new IllegalStateException("Looping dependency detected: " + remain); - } - return ans; - } - - public void add(ResourceKey> registry, RegistrySetBuilder.RegistryBootstrap provider) { - datapackEntryProvider.add(registry, provider); - } - - public void addDependency(ProviderType dependent, ProviderType parent) { - var old = providerDependencies.put(dependent, parent); - if (old != null) throw new IllegalStateException("Providers can have only 1 prerequisite"); - } - - public record Sorted( - String id, ProviderType type, - @Nullable ProviderType parent - ) { - } - + private final RegistrySetBuilder datapackEntryProvider = new RegistrySetBuilder(); + + private final Map, ProviderType> providerDependencies = new ConcurrentHashMap<>(); + + public DataProviderInitializer() { + addDependency(ProviderType.ITEM_TAGS, ProviderType.BLOCK_TAGS); + } + + protected RegistrySetBuilder getDatapackRegistryProviders() { + return datapackEntryProvider; + } + + protected List getSortedProviders() { + List ans = new ArrayList<>(); + Set> added = new HashSet<>(); + List>> remain = new ArrayList<>(RegistrateDataProvider.TYPES.entrySet()); + while (!remain.isEmpty()) { + if (!remain.removeIf(e -> { + ProviderType type = e.getValue(); + var parent = providerDependencies.get(type); + if (parent == null || added.contains(parent)) { + ans.add(new Sorted(e.getKey(), type, parent)); + added.add(type); + return true; + } + return false; + })) throw new IllegalStateException("Looping dependency detected: " + remain); + } + return ans; + } + + public void add(ResourceKey> registry, RegistrySetBuilder.RegistryBootstrap provider) { + datapackEntryProvider.add(registry, provider); + } + + public void addDependency(ProviderType dependent, ProviderType parent) { + var old = providerDependencies.put(dependent, parent); + if (old != null) throw new IllegalStateException("Providers can have only 1 prerequisite"); + } + + public record Sorted( + String id, ProviderType type, + @Nullable ProviderType parent) {} } diff --git a/src/main/java/com/modularmc/registrate/providers/GeneratorType.java b/src/main/java/com/modularmc/registrate/providers/GeneratorType.java index be32e2b..f75a249 100644 --- a/src/main/java/com/modularmc/registrate/providers/GeneratorType.java +++ b/src/main/java/com/modularmc/registrate/providers/GeneratorType.java @@ -1,4 +1,3 @@ package com.modularmc.registrate.providers; -public interface GeneratorType { -} +public interface GeneratorType {} diff --git a/src/main/java/com/modularmc/registrate/providers/ProviderType.java b/src/main/java/com/modularmc/registrate/providers/ProviderType.java index 5db399b..0295696 100644 --- a/src/main/java/com/modularmc/registrate/providers/ProviderType.java +++ b/src/main/java/com/modularmc/registrate/providers/ProviderType.java @@ -4,6 +4,7 @@ import com.modularmc.registrate.providers.generators.*; import com.modularmc.registrate.providers.loot.RegistrateLootTableProvider; import com.modularmc.registrate.util.nullness.NonNullSupplier; + import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; @@ -17,18 +18,20 @@ import net.neoforged.neoforge.data.event.GatherDataEvent; import net.neoforged.neoforge.data.loading.DatagenModLoader; -import javax.annotation.Nonnull; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.function.Function; +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + /** * Represents a type of data that can be generated, and specifies a factory for the provider. *

                * Used as a key for data generator callbacks. *

                - * This file also defines the built-in provider types, but third-party types can be created with {@link #registerProvider(String, ProviderType)}. + * This file also defines the built-in provider types, but third-party types can be created with + * {@link #registerProvider(String, ProviderType)}. * * @param The type of the provider */ @@ -48,7 +51,7 @@ public interface ProviderType extends GeneratorTyp ProviderType ITEM_TAGS = registerTag("tags/item", Registries.ITEM, c -> new RegistrateItemTagsProvider(c.parent(), c.type(), "items", c.output(), c.provider(), c.get(BLOCK_TAGS).contentsGetter())); ProviderType> FLUID_TAGS = registerIntrinsicTag("tags/fluid", "fluids", Registries.FLUID, fluid -> fluid.builtInRegistryHolder().key()); ProviderType>> ENTITY_TAGS = registerIntrinsicTag("tags/entity", "entity_types", Registries.ENTITY_TYPE, entityType -> entityType.builtInRegistryHolder().key()); - ProviderType GENERIC_SERVER = registerProvider("registrate_generic_server_provider", c -> new RegistrateGenericProvider(c.parent(), c.event(), LogicalSide.SERVER, c.type())); + ProviderType GENERIC_SERVER = registerProvider("registrate_generic_server_provider", c -> new RegistrateGenericProvider(c.parent(), c.event(), LogicalSide.SERVER, c.type())); // CLIENT DATA ProviderType MODEL = registerClientProvider("model", () -> c -> new RegistrateModelProvider(c.parent(), c.output())); @@ -68,14 +71,14 @@ record Context(ProviderType type, AbstractRegis public R get(ProviderType other) { return (R) existing().get(other); } - } T create(Context context); default GeneratorType createGenerator(String type) { return new GeneratorType<>() { - public String toString(){ + + public String toString() { return type; } }; @@ -93,7 +96,6 @@ default T create(Context context) { default ProviderType asProvider() { return this; } - } @Nonnull @@ -138,5 +140,4 @@ static ProviderType> registerDynamicTag(Strin static T create(ProviderType type, AbstractRegistrate parent, GatherDataEvent event, Map, RegistrateProvider> existing, CompletableFuture provider) { return type.create(new Context<>(type, parent, event, existing, event.getGenerator().getPackOutput(), provider)); } - } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java index 6bd9b3d..b7b11c6 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java @@ -1,11 +1,6 @@ package com.modularmc.registrate.providers; -import com.google.common.collect.Lists; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.modularmc.registrate.AbstractRegistrate; -import lombok.Getter; -import lombok.extern.log4j.Log4j2; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; @@ -15,19 +10,25 @@ import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceKey; import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.conditions.ICondition; import net.neoforged.neoforge.common.conditions.WithConditions; +import com.google.common.collect.Lists; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import lombok.Getter; +import lombok.extern.log4j.Log4j2; import org.jspecify.annotations.Nullable; + import java.nio.file.Path; import java.util.HashSet; import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.Optional; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java index 3cb2524..2095b48 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java @@ -1,45 +1,46 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; + import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.data.DataMapProvider; + import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; public class RegistrateDataMapProvider extends DataMapProvider implements RegistrateProvider { - private final AbstractRegistrate parent; - - private HolderLookup.@Nullable Provider provider; - - protected RegistrateDataMapProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture pvd) { - super(output, pvd); - this.parent = parent; - } - - @Override - public LogicalSide getSide() { - return LogicalSide.SERVER; - } - - /** - * Generate data map entries. - * - * @param provider - */ - @Override - protected void gather(HolderLookup.Provider provider) { - this.provider = provider; - parent.genData(ProviderType.DATA_MAP, this); - this.provider = null; - } - - public HolderLookup.Provider getProvider() { - if (provider == null) throw new IllegalStateException("Holder Lookup Provider is not available now"); - return provider; - } - + private final AbstractRegistrate parent; + + private HolderLookup.@Nullable Provider provider; + + protected RegistrateDataMapProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture pvd) { + super(output, pvd); + this.parent = parent; + } + + @Override + public LogicalSide getSide() { + return LogicalSide.SERVER; + } + + /** + * Generate data map entries. + * + * @param provider + */ + @Override + protected void gather(HolderLookup.Provider provider) { + this.provider = provider; + parent.genData(ProviderType.DATA_MAP, this); + this.provider = null; + } + + public HolderLookup.Provider getProvider() { + if (provider == null) throw new IllegalStateException("Holder Lookup Provider is not available now"); + return provider; + } } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java index a3f3d54..c40e219 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java @@ -1,11 +1,8 @@ package com.modularmc.registrate.providers; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import com.google.common.collect.Lists; import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.DebugMarkers; -import lombok.extern.log4j.Log4j2; + import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.data.CachedOutput; @@ -13,7 +10,12 @@ import net.minecraft.resources.ResourceKey; import net.neoforged.neoforge.data.event.GatherDataEvent; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.Lists; +import lombok.extern.log4j.Log4j2; import org.jspecify.annotations.Nullable; + import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -47,31 +49,31 @@ public RegistrateDataProvider(AbstractRegistrate parent, String modid, Gather // For now, generate everything together /* - EnumSet sides = EnumSet.noneOf(LogicalSide.class); - if (event.includeServer()) { - sides.add(LogicalSide.SERVER); - } - if (event.includeClient()) { - sides.add(LogicalSide.CLIENT); - } - */ - - //log.debug(DebugMarkers.DATA, "Gathering providers for sides: {}", sides); + * EnumSet sides = EnumSet.noneOf(LogicalSide.class); + * if (event.includeServer()) { + * sides.add(LogicalSide.SERVER); + * } + * if (event.includeClient()) { + * sides.add(LogicalSide.CLIENT); + * } + */ + + // log.debug(DebugMarkers.DATA, "Gathering providers for sides: {}", sides); log.debug(DebugMarkers.DATA, "Gathering providers"); Map, RegistrateProvider> known = new HashMap<>(); - for (DataProviderInitializer.Sorted sorted :parent.getDataGenInitializer().getSortedProviders()) { + for (DataProviderInitializer.Sorted sorted : parent.getDataGenInitializer().getSortedProviders()) { ProviderType type = sorted.type(); var lookup = registriesLookup; if (sorted.parent() != null) lookup = ((RegistrateLookupFillerProvider) known.get(sorted.parent())).getFilledProvider(); RegistrateProvider prov = ProviderType.create(type, parent, event, known, lookup); if (prov instanceof RegistrateTagsProvider tagsProvider && TAG_TYPES.get(tagsProvider.registry()) != type) { - throw new IllegalStateException("Tag providers must be registered through ProviderType::registerTag"); + throw new IllegalStateException("Tag providers must be registered through ProviderType::registerTag"); } known.put(type, prov); // if (sides.contains(prov.getSide())) { - log.debug(DebugMarkers.DATA, "Adding provider for type: {}", sorted.id()); - subProviders.put(type, prov); - //} + log.debug(DebugMarkers.DATA, "Adding provider for type: {}", sorted.id()); + subProviders.put(type, prov); + // } } } @@ -83,7 +85,7 @@ public CompletableFuture run(CachedOutput cache) { for (Map.Entry, RegistrateProvider> e : subProviders.entrySet()) { log.debug(DebugMarkers.DATA, "Generating data for type: {}", getTypeName(e.getKey())); list.add(e.getValue().run(cache)); - }; + } ; return CompletableFuture.allOf(list.toArray(CompletableFuture[]::new)); }); @@ -104,5 +106,4 @@ public

                Optional

                getSubProvider(GeneratorType

                type) { public void putSubProvider(GeneratorType type, T gen) { subGenerators.put(type, gen); } - } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java index 455b047..66953c9 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java @@ -1,6 +1,7 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; + import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.data.registries.RegistryPatchGenerator; @@ -12,18 +13,17 @@ public class RegistrateDatapackProvider extends DatapackBuiltinEntriesProvider implements RegistrateLookupFillerProvider { - public RegistrateDatapackProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture provider) { - super(output, RegistryPatchGenerator.createLookup(provider, parent.getDataGenInitializer().getDatapackRegistryProviders()), Set.of(parent.getModid())); - } - - @Override - public CompletableFuture getFilledProvider() { - return getRegistryProvider(); - } + public RegistrateDatapackProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture provider) { + super(output, RegistryPatchGenerator.createLookup(provider, parent.getDataGenInitializer().getDatapackRegistryProviders()), Set.of(parent.getModid())); + } - @Override - public LogicalSide getSide() { - return LogicalSide.SERVER; - } + @Override + public CompletableFuture getFilledProvider() { + return getRegistryProvider(); + } + @Override + public LogicalSide getSide() { + return LogicalSide.SERVER; + } } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java index ecc7044..87e2721 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java @@ -1,12 +1,14 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; + import net.minecraft.core.HolderLookup; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.data.event.GatherDataEvent; + import org.apache.commons.compress.utils.Lists; import org.jetbrains.annotations.ApiStatus; @@ -14,8 +16,8 @@ import java.util.Locale; import java.util.concurrent.CompletableFuture; -public final class RegistrateGenericProvider implements RegistrateProvider -{ +public final class RegistrateGenericProvider implements RegistrateProvider { + private final AbstractRegistrate registrate; private final PackOutput output; private final CompletableFuture registries; @@ -24,8 +26,7 @@ public final class RegistrateGenericProvider implements RegistrateProvider private final List generators = Lists.newArrayList(); @ApiStatus.Internal - RegistrateGenericProvider(AbstractRegistrate registrate, GatherDataEvent event, LogicalSide side, ProviderType providerType) - { + RegistrateGenericProvider(AbstractRegistrate registrate, GatherDataEvent event, LogicalSide side, ProviderType providerType) { this.registrate = registrate; this.side = side; this.providerType = providerType; @@ -34,21 +35,18 @@ public final class RegistrateGenericProvider implements RegistrateProvider registries = event.getLookupProvider(); } - public RegistrateGenericProvider add(Generator generator) - { + public RegistrateGenericProvider add(Generator generator) { generators.add(generator); return this; } @Override - public LogicalSide getSide() - { + public LogicalSide getSide() { return side; } @Override - public CompletableFuture run(CachedOutput cache) - { + public CompletableFuture run(CachedOutput cache) { generators.clear(); var data = new GeneratorData(output, registries); registrate.genData(providerType, this); @@ -56,22 +54,19 @@ public CompletableFuture run(CachedOutput cache) .stream() .map(generator -> generator.generate(data)) .map(provider -> provider.run(cache)) - .toArray(CompletableFuture[]::new) - ); + .toArray(CompletableFuture[]::new)); } @Override - public String getName() - { + public String getName() { return "generic_%s_provider".formatted(side.name().toLowerCase(Locale.ROOT)); } - public record GeneratorData(PackOutput output, CompletableFuture registries) { - } + public record GeneratorData(PackOutput output, CompletableFuture registries) {} @FunctionalInterface - public interface Generator - { + public interface Generator { + DataProvider generate(GeneratorData data); } } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java index a2ebff1..63bcdab 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java @@ -1,6 +1,7 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; + import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java index 0d5e5cf..c9c8cbd 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java @@ -2,6 +2,7 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.nullness.NonNullSupplier; + import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; @@ -16,6 +17,7 @@ import net.minecraft.world.level.block.Block; import net.neoforged.fml.LogicalSide; import net.neoforged.neoforge.common.data.LanguageProvider; + import org.apache.commons.lang3.StringUtils; import org.jspecify.annotations.Nullable; @@ -74,7 +76,7 @@ public static final String toEnglishName(String internalName) { .collect(Collectors.joining(" ")); } - @SuppressWarnings({"unchecked", "ConstantConditions"}) + @SuppressWarnings({ "unchecked", "ConstantConditions" }) public String getAutomaticName(NonNullSupplier sup, ResourceKey> registry) { return toEnglishName(((Registry>) BuiltInRegistries.REGISTRY).getValue(registry.identifier()).getKey(sup.get()).getPath()); } @@ -129,14 +131,14 @@ public void addEntityType(NonNullSupplier> entity) { private static final String NORMAL_CHARS = /* lowercase */ "abcdefghijklmn\u00F1opqrstuvwxyz" + - /* uppercase */ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + - /* numbers */ "0123456789" + - /* special */ "()[]{}<>\u25C1\u25B7_,;.?!/\\'"; + /* uppercase */ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + /* numbers */ "0123456789" + + /* special */ "()[]{}<>\u25C1\u25B7_,;.?!/\\'"; private static final String UPSIDE_DOWN_CHARS = /* lowercase */ "\u0250q\u0254p\u01DD\u025Fb\u0265\u0131\u0638\u029E\u05DF\u026Fuuodb\u0279s\u0287n\u028C\u028Dx\u028Ez" + - /* uppercase */ "\u2C6F\u15FA\u0186\u15E1\u018E\u2132\u2141HI\u017F\u029E\uA780WNO\u0500\u1F49\u1D1AS\u27D8\u2229\u039BMX\u028EZ" + - /* numbers */ "0\u0196\u1105\u0190\u3123\u03DB9\u312586" + - /* special */ ")(][}{><\u25B7\u25C1\u203E'\u061B\u02D9\u00BF\u00A1\\/,"; + /* uppercase */ "\u2C6F\u15FA\u0186\u15E1\u018E\u2132\u2141HI\u017F\u029E\uA780WNO\u0500\u1F49\u1D1AS\u27D8\u2229\u039BMX\u028EZ" + + /* numbers */ "0\u0196\u1105\u0190\u3123\u03DB9\u312586" + + /* special */ ")(][}{><\u25B7\u25C1\u203E'\u061B\u02D9\u00BF\u00A1\\/,"; static { if (NORMAL_CHARS.length() != UPSIDE_DOWN_CHARS.length()) { @@ -151,14 +153,14 @@ private String toUpsideDown(String normal) { char c = normal.charAt(i); if (c == '%') { String fmtArg = ""; - while (Character.isDigit(c) || c == '%' || c == '$' || c == 's' || c == 'd') { // TODO this is a bit lazy + while (Character.isDigit(c) || c == '%' || c == '$' || c == 's' || c == 'd') { // TODO this is a bit + // lazy if (fmtArg.equals("%") && c == 's') { fmtArg = "%" + formatIndex + "$s"; formatIndex++; i++; break; - } - else if (c == '$') { + } else if (c == '$') { formatIndex++; } fmtArg += c; diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java index 70850c2..b62835f 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java @@ -7,5 +7,4 @@ public interface RegistrateLookupFillerProvider extends RegistrateProvider { CompletableFuture getFilledProvider(); - } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java index 967a3dc..8cb40e9 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java @@ -4,6 +4,6 @@ import net.neoforged.fml.LogicalSide; public interface RegistrateProvider extends DataProvider { - + LogicalSide getSide(); } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java b/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java index 048d97a..e05284c 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java @@ -4,10 +4,10 @@ import net.minecraft.resources.Identifier; public interface RegistrateProviderDelegate extends DataProvider { - + String getName(); - + Identifier getId(); - + T getEntry(); } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java index 2d2362c..815dbbe 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java @@ -1,6 +1,7 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; + import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; import net.minecraft.data.PackOutput; @@ -20,19 +21,22 @@ public interface RegistrateTagsProvider extends RegistrateLookupFillerProvide CompletableFuture> contentsGetter(); - ResourceKey> registry(); + ResourceKey> registry(); TagBuilder rawBuilder(TagKey key); interface Key extends RegistrateTagsProvider { + TagAppender, T> tag(TagKey key); } interface Intrinsic extends RegistrateTagsProvider { + TagAppender tag(TagKey key); } class Impl extends KeyTagProvider implements RegistrateTagsProvider.Key { + private final AbstractRegistrate owner; private final ProviderType> type; private final String name; @@ -76,13 +80,13 @@ public CompletableFuture getFilledProvider() { } @Override - public ResourceKey> registry() { - return registryKey; - } - - } + public ResourceKey> registry() { + return registryKey; + } + } class IntrinsicImpl extends IntrinsicHolderTagsProvider implements RegistrateTagsProvider.Intrinsic { + private final AbstractRegistrate owner; private final ProviderType> type; private final String name; @@ -125,9 +129,9 @@ public CompletableFuture getFilledProvider() { return createContentsProvider(); } - @Override - public ResourceKey> registry() { - return registryKey; - } + @Override + public ResourceKey> registry() { + return registryKey; + } } } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java index 4511022..8e2e4d3 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java @@ -2,6 +2,7 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.ProviderType; + import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelOutput; import net.minecraft.client.data.models.MultiVariant; @@ -15,7 +16,6 @@ import net.minecraft.client.data.models.model.TextureMapping; import net.minecraft.client.data.models.model.TextureSlot; import net.minecraft.client.data.models.model.TexturedModel; -import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.block.dispatch.BlockStateModelDispatcher; import net.minecraft.client.renderer.block.dispatch.VariantMutator; import net.minecraft.client.resources.model.sprite.Material; @@ -68,7 +68,6 @@ public void run() { parent.genData(ProviderType.BLOCKSTATE, this); } - public void create(Block block, Identifier model) { this.blockStateOutput.accept(createSimpleBlock(block, plainVariant(model))); } @@ -151,8 +150,7 @@ public void generateAxisBlock(RotatedPillarBlock block, Material side, Material private void generateAxisBlockInternal(RotatedPillarBlock block, Material side, Material end, ModelTemplate cubeColumn, ModelTemplate cubeColumnHorizontal) { generateAxisBlock(block, plainVariant(cubeColumn.create(block, TextureMapping.column(side, end), modelOutput)), - plainVariant(cubeColumnHorizontal.create(block, TextureMapping.column(side, end), modelOutput)) - ); + plainVariant(cubeColumnHorizontal.create(block, TextureMapping.column(side, end), modelOutput))); } public void generateAxisBlock(RotatedPillarBlock block, MultiVariant vertical, MultiVariant horizontal) { @@ -242,8 +240,7 @@ public void generateStairsBlock(StairBlock block, Material side, Material bottom blockStateOutput.accept(createStairs(block, plainVariant(ModelTemplates.STAIRS_INNER.create(block, textures, modelOutput)), plainVariant(ModelTemplates.STAIRS_STRAIGHT.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.STAIRS_OUTER.create(block, textures, modelOutput)) - )); + plainVariant(ModelTemplates.STAIRS_OUTER.create(block, textures, modelOutput)))); } public void generateStairsBlock(StairBlock block, String name, Material side, Material bottom, Material top) { @@ -353,16 +350,14 @@ private void generateFenceBlockInternal(FenceBlock block, Material texture, Mode TextureMapping textures = TextureMapping.defaultTexture(texture); generateFourWayBlock(block, plainVariant(fencePostTemplate.create(block, textures, modelOutput)), - plainVariant(fenceSideTemplate.create(block, textures, modelOutput)) - ); + plainVariant(fenceSideTemplate.create(block, textures, modelOutput))); } private void generateFenceBlockInternal(FenceBlock block, String name, Material texture, ModelTemplate fencePostTemplate, ModelTemplate fenceSideTemplate) { TextureMapping textures = TextureMapping.defaultTexture(texture); generateFourWayBlock(block, plainVariant(fencePostTemplate.create(modLoc("block/" + name + "_fence_post"), textures, modelOutput)), - plainVariant(fenceSideTemplate.create(modLoc("block/" + name + "_fence_side"), textures, modelOutput)) - ); + plainVariant(fenceSideTemplate.create(modLoc("block/" + name + "_fence_side"), textures, modelOutput))); } public void generateFenceGateBlock(FenceGateBlock block, Material texture) { @@ -371,8 +366,7 @@ public void generateFenceGateBlock(FenceGateBlock block, Material texture) { plainVariant(ModelTemplates.FENCE_GATE_CLOSED.create(block, textures, modelOutput)), plainVariant(ModelTemplates.FENCE_GATE_OPEN.create(block, textures, modelOutput)), plainVariant(ModelTemplates.FENCE_GATE_WALL_CLOSED.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.FENCE_GATE_WALL_OPEN.create(block, textures, modelOutput)) - ); + plainVariant(ModelTemplates.FENCE_GATE_WALL_OPEN.create(block, textures, modelOutput))); } public void generateFenceGateBlock(FenceGateBlock block, String name, Material texture) { @@ -398,8 +392,7 @@ public void generateWallBlock(WallBlock block, Material texture) { blockStateOutput.accept(createWall(block, plainVariant(ModelTemplates.WALL_POST.create(block, textures, modelOutput)), plainVariant(ModelTemplates.WALL_LOW_SIDE.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.WALL_TALL_SIDE.create(block, textures, modelOutput)) - )); + plainVariant(ModelTemplates.WALL_TALL_SIDE.create(block, textures, modelOutput)))); } public void generateWallBlock(WallBlock block, String name, Material texture) { @@ -413,8 +406,7 @@ private void generateWallBlockInternal(WallBlock block, Identifier baseName, Mat generateWallBlock(block, plainVariant(postTemplate.create(baseModel.withSuffix("_post"), textures, modelOutput)), plainVariant(sideTemplate.create(baseModel.withSuffix("_side"), textures, modelOutput)), - plainVariant(tallSideTemplate.create(baseModel.withSuffix("_side_tall"), textures, modelOutput)) - ); + plainVariant(tallSideTemplate.create(baseModel.withSuffix("_side_tall"), textures, modelOutput))); } public void generateWallBlock(WallBlock block, MultiVariant post, MultiVariant side, MultiVariant sideTall) { @@ -428,8 +420,7 @@ public void generatePaneBlock(IronBarsBlock block, Material pane, Material edge) plainVariant(ModelTemplates.STAINED_GLASS_PANE_SIDE.create(block, textures, modelOutput)), plainVariant(ModelTemplates.STAINED_GLASS_PANE_SIDE_ALT.create(block, textures, modelOutput)), plainVariant(ModelTemplates.STAINED_GLASS_PANE_NOSIDE.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT.create(block, textures, modelOutput)) - ); + plainVariant(ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT.create(block, textures, modelOutput))); } public void generatePaneBlock(IronBarsBlock block, String name, Material pane, Material edge) { @@ -445,8 +436,7 @@ private void generatePaneBlockInternal(IronBarsBlock block, Identifier baseName, plainVariant(sideTemplate.create(baseModel.withSuffix("_side"), textures, modelOutput)), plainVariant(sideAltTemplate.create(baseModel.withSuffix("_side_alt"), textures, modelOutput)), plainVariant(noSideTemplate.create(baseModel.withSuffix("_noside"), textures, modelOutput)), - plainVariant(noSideAltTemplate.create(baseModel.withSuffix("_noside_alt"), textures, modelOutput)) - ); + plainVariant(noSideAltTemplate.create(baseModel.withSuffix("_noside_alt"), textures, modelOutput))); } public void generatePaneBlock(IronBarsBlock block, MultiVariant post, MultiVariant side, MultiVariant sideAlt, MultiVariant noSide, MultiVariant noSideAlt) { @@ -459,8 +449,7 @@ public void generatePaneBlock(IronBarsBlock block, MultiVariant post, MultiVaria .with(condition().term(BlockStateProperties.NORTH, false), noSide) .with(condition().term(BlockStateProperties.EAST, false), noSideAlt) .with(condition().term(BlockStateProperties.SOUTH, false), noSideAlt.with(Y_ROT_90)) - .with(condition().term(BlockStateProperties.WEST, false), noSide.with(Y_ROT_270)) - ); + .with(condition().term(BlockStateProperties.WEST, false), noSide.with(Y_ROT_270))); } public void generateDoorBlock(DoorBlock block, Material bottom, Material top) { @@ -473,8 +462,7 @@ public void generateDoorBlock(DoorBlock block, Material bottom, Material top) { plainVariant(ModelTemplates.DOOR_TOP_LEFT.create(block, textures, modelOutput)), plainVariant(ModelTemplates.DOOR_TOP_LEFT_OPEN.create(block, textures, modelOutput)), plainVariant(ModelTemplates.DOOR_TOP_RIGHT.create(block, textures, modelOutput)), - plainVariant(ModelTemplates.DOOR_TOP_RIGHT_OPEN.create(block, textures, modelOutput)) - ); + plainVariant(ModelTemplates.DOOR_TOP_RIGHT_OPEN.create(block, textures, modelOutput))); } public void generateDoorBlock(DoorBlock block, String name, Material bottom, Material top) { @@ -509,8 +497,7 @@ public void generateTrapdoorBlock(TrapDoorBlock block, Material texture, boolean plainVariant((orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM : ModelTemplates.TRAPDOOR_BOTTOM).create(block, textures, modelOutput)), plainVariant((orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_TOP : ModelTemplates.TRAPDOOR_TOP).create(block, textures, modelOutput)), plainVariant((orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN).create(block, textures, modelOutput)), - orientable - ); + orientable); } public void generateTrapdoorBlock(TrapDoorBlock block, String name, Material texture, boolean orientable) { @@ -521,8 +508,7 @@ private void generateTrapdoorBlockInternal(TrapDoorBlock block, Identifier baseN generateTrapdoorBlockInternal(block, baseName, texture, orientable, orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM : ModelTemplates.TRAPDOOR_BOTTOM, orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_TOP : ModelTemplates.TRAPDOOR_TOP, - orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN - ); + orientable ? ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN : ModelTemplates.TRAPDOOR_OPEN); } private void generateTrapdoorBlockInternal(TrapDoorBlock block, Identifier baseName, Material texture, boolean orientable, ModelTemplate bottomTemplate, ModelTemplate topTemplate, ModelTemplate openTemplate) { diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java index 39050bd..8284747 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java @@ -3,6 +3,7 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.util.nullness.NonNullSupplier; + import net.minecraft.client.color.item.ItemTintSource; import net.minecraft.client.data.models.ItemModelGenerators; import net.minecraft.client.data.models.ItemModelOutput; @@ -34,10 +35,9 @@ public RegistrateItemModelGenerator(AbstractRegistrate parent, ItemModelOutpu @Override public void run() { parent.genData(ProviderType.ITEM_MODEL, this); - //TODO check if an item actually has a valid model + // TODO check if an item actually has a valid model } - public void createWithExistingModel(Item item, Identifier id) { itemModelOutput.accept(item, ItemModelUtils.plainModel(id)); } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java index 5807d67..8e85469 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateLegacyBlockModelBuilder.java @@ -19,108 +19,108 @@ public class RegistrateLegacyBlockModelBuilder { - private final ExtendedModelTemplateBuilder template; - private final TextureMapping texture; - private final BiConsumer output; - - RegistrateLegacyBlockModelBuilder(BiConsumer output, ExtendedModelTemplateBuilder template, TextureMapping texture) { - this.output = output; - this.template = template; - this.texture = texture.copy(); - } - - public RegistrateLegacyBlockModelBuilder texture(TextureSlot slot, Material texture) { - this.template.requiredTextureSlot(slot); - this.texture.put(slot, texture); - return this; - } - - public RegistrateLegacyBlockModelBuilder transformTemplate(Consumer action) { - action.accept(template); - return this; - } - - public RegistrateLegacyBlockModelBuilder transformTexture(Consumer action) { - action.accept(texture); - return this; - } - - public Identifier build(Block block) { - return template.build().create(block, texture, output); - } - - public Identifier build(Identifier loc) { - return template.build().create(loc, texture, output); - } - - // Delegated methods from Template Builder - - /** - * Parent model which this template will inherit its properties from. - */ - public RegistrateLegacyBlockModelBuilder parent(Identifier parent) { - template.parent(parent); - return this; - } - - /** - * Suffix appended onto the models file path. - */ - public RegistrateLegacyBlockModelBuilder suffix(String suffix) { - template.suffix(suffix); - return this; - } - - /** - * Begin building a new transform for the given perspective. - * - * @param type the perspective to create or return the builder for - * @return the builder for the given perspective - * @throws NullPointerException if {@code type} is {@code null} - */ - public RegistrateLegacyBlockModelBuilder transform(ItemDisplayContext type, Consumer action) { - template.transform(type, action); - return this; - } - - /** - * Sets whether or not this model should apply ambient occlusion. - */ - public RegistrateLegacyBlockModelBuilder ambientOcclusion(boolean ambientOcclusion) { - template.ambientOcclusion(ambientOcclusion); - return this; - } - - /** - * Sets the gui light style for this model. - * - *

                  - *
                • {@link UnbakedModel.GuiLight#FRONT} for head on light, commonly used for items.
                • - *
                • {@link UnbakedModel.GuiLight#SIDE} for the model to be side lit, commonly used for blocks.
                • - *
                - */ - public RegistrateLegacyBlockModelBuilder guiLight(UnbakedModel.GuiLight light) { - template.guiLight(light); - return this; - } - - /** - * Use a custom loader instead of the vanilla elements. - * - * @param customLoaderFactory function that returns the custom loader to set, given this - * @return the custom loader builder - */ - public RegistrateLegacyBlockModelBuilder customLoader(Supplier customLoaderFactory, Consumer action) { - template.customLoader(customLoaderFactory, action); - return this; - } - - /** - * Modifies the transformation applied right before item display transformations and rotations specified in block states. - */ - public RegistrateLegacyBlockModelBuilder rootTransforms(Consumer action) { - template.rootTransforms(action); - return this; - } - + private final ExtendedModelTemplateBuilder template; + private final TextureMapping texture; + private final BiConsumer output; + + RegistrateLegacyBlockModelBuilder(BiConsumer output, ExtendedModelTemplateBuilder template, TextureMapping texture) { + this.output = output; + this.template = template; + this.texture = texture.copy(); + } + + public RegistrateLegacyBlockModelBuilder texture(TextureSlot slot, Material texture) { + this.template.requiredTextureSlot(slot); + this.texture.put(slot, texture); + return this; + } + + public RegistrateLegacyBlockModelBuilder transformTemplate(Consumer action) { + action.accept(template); + return this; + } + + public RegistrateLegacyBlockModelBuilder transformTexture(Consumer action) { + action.accept(texture); + return this; + } + + public Identifier build(Block block) { + return template.build().create(block, texture, output); + } + + public Identifier build(Identifier loc) { + return template.build().create(loc, texture, output); + } + + // Delegated methods from Template Builder + + /** + * Parent model which this template will inherit its properties from. + */ + public RegistrateLegacyBlockModelBuilder parent(Identifier parent) { + template.parent(parent); + return this; + } + + /** + * Suffix appended onto the models file path. + */ + public RegistrateLegacyBlockModelBuilder suffix(String suffix) { + template.suffix(suffix); + return this; + } + + /** + * Begin building a new transform for the given perspective. + * + * @param type the perspective to create or return the builder for + * @return the builder for the given perspective + * @throws NullPointerException if {@code type} is {@code null} + */ + public RegistrateLegacyBlockModelBuilder transform(ItemDisplayContext type, Consumer action) { + template.transform(type, action); + return this; + } + + /** + * Sets whether or not this model should apply ambient occlusion. + */ + public RegistrateLegacyBlockModelBuilder ambientOcclusion(boolean ambientOcclusion) { + template.ambientOcclusion(ambientOcclusion); + return this; + } + + /** + * Sets the gui light style for this model. + * + *
                  + *
                • {@link UnbakedModel.GuiLight#FRONT} for head on light, commonly used for items.
                • + *
                • {@link UnbakedModel.GuiLight#SIDE} for the model to be side lit, commonly used for blocks.
                • + *
                + */ + public RegistrateLegacyBlockModelBuilder guiLight(UnbakedModel.GuiLight light) { + template.guiLight(light); + return this; + } + + /** + * Use a custom loader instead of the vanilla elements. + * + * @param customLoaderFactory function that returns the custom loader to set, given this + * @return the custom loader builder + */ + public RegistrateLegacyBlockModelBuilder customLoader(Supplier customLoaderFactory, Consumer action) { + template.customLoader(customLoaderFactory, action); + return this; + } + + /** + * Modifies the transformation applied right before item display transformations and rotations specified in block + * states. + */ + public RegistrateLegacyBlockModelBuilder rootTransforms(Consumer action) { + template.rootTransforms(action); + return this; + } } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java index f01f258..2f03e9f 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java @@ -2,6 +2,7 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.RegistrateProvider; + import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelGenerators; import net.minecraft.client.data.models.ModelProvider; @@ -10,22 +11,21 @@ public class RegistrateModelProvider extends ModelProvider implements RegistrateProvider { - private final AbstractRegistrate parent; - - public RegistrateModelProvider(AbstractRegistrate parent, PackOutput p_388260_) { - super(p_388260_, parent.getModid()); - this.parent = parent; - } + private final AbstractRegistrate parent; - @Override - protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels) { - new RegistrateBlockModelGenerator(parent, blockModels.blockStateOutput, blockModels.itemModelOutput, blockModels.modelOutput).run(); - new RegistrateItemModelGenerator(parent, itemModels.itemModelOutput, itemModels.modelOutput).run(); - } + public RegistrateModelProvider(AbstractRegistrate parent, PackOutput p_388260_) { + super(p_388260_, parent.getModid()); + this.parent = parent; + } - @Override - public LogicalSide getSide() { - return LogicalSide.CLIENT; - } + @Override + protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels) { + new RegistrateBlockModelGenerator(parent, blockModels.blockStateOutput, blockModels.itemModelOutput, blockModels.modelOutput).run(); + new RegistrateItemModelGenerator(parent, itemModels.itemModelOutput, itemModels.modelOutput).run(); + } + @Override + public LogicalSide getSide() { + return LogicalSide.CLIENT; + } } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java index 6aad359..28113c0 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java @@ -3,7 +3,7 @@ import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.util.DataIngredient; import com.modularmc.registrate.util.nullness.NonNullSupplier; -import lombok.experimental.Delegate; + import net.minecraft.advancements.Criterion; import net.minecraft.advancements.criterion.EnterBlockTrigger; import net.minecraft.advancements.criterion.InventoryChangeTrigger; @@ -15,13 +15,12 @@ import net.minecraft.core.registries.Registries; import net.minecraft.data.BlockFamily; import net.minecraft.data.recipes.*; -import net.minecraft.resources.ResourceKey; import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.EntityType; import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStackTemplate; import net.minecraft.world.item.crafting.*; import net.minecraft.world.item.equipment.trim.TrimPattern; @@ -30,12 +29,15 @@ import net.minecraft.world.level.block.SuspiciousEffectHolder; import net.neoforged.neoforge.common.Tags; -import javax.annotation.CheckReturnValue; -import javax.annotation.processing.Generated; +import lombok.experimental.Delegate; import org.jspecify.annotations.Nullable; + import java.util.List; import java.util.function.Supplier; +import javax.annotation.CheckReturnValue; +import javax.annotation.processing.Generated; + public class RegistrateRecipeProvider extends RecipeProvider implements RecipeOutput { private final RegistrateRecipeRunner runner; @@ -199,7 +201,8 @@ public void square(DataIngredient source, RecipeCategory ca * @param * @param source * @param output - * @deprecated Broken, use {@link #storage(NonNullSupplier, RecipeCategory, NonNullSupplier)} or {@link #storage(DataIngredient, RecipeCategory, NonNullSupplier, DataIngredient, NonNullSupplier)}. + * @deprecated Broken, use {@link #storage(NonNullSupplier, RecipeCategory, NonNullSupplier)} or + * {@link #storage(DataIngredient, RecipeCategory, NonNullSupplier, DataIngredient, NonNullSupplier)}. */ @Deprecated public void storage(DataIngredient source, RecipeCategory category, NonNullSupplier output) { @@ -308,404 +311,404 @@ public void trapDoor(DataIngredient source, RecipeCategory } // @formatter:off - // GENERATED START - DO NOT EDIT BELOW THIS LINE - - /** Generated override to expose protected method: {@link RecipeProvider#generateForEnabledBlockFamilies} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void generateForEnabledBlockFamilies(FeatureFlagSet flagSet) { super.generateForEnabledBlockFamilies(flagSet); } - - /** Generated override to expose protected method: {@link RecipeProvider#netheriteSmithing} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void netheriteSmithing(Item base, RecipeCategory category, Item result) { super.netheriteSmithing(base, category, result); } - - /** Generated override to expose protected method: {@link RecipeProvider#trimSmithing} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void trimSmithing(Item trimTemplate, ResourceKey patternId, ResourceKey> id) { super.trimSmithing(trimTemplate, patternId, id); } - - /** Generated override to expose protected method: {@link RecipeProvider#twoByTwoPacker} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void twoByTwoPacker(RecipeCategory category, ItemLike result, ItemLike ingredient) { super.twoByTwoPacker(category, result, ingredient); } - - /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void threeByThreePacker(RecipeCategory category, ItemLike result, ItemLike ingredient, String unlockedBy) { super.threeByThreePacker(category, result, ingredient, unlockedBy); } - - /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void threeByThreePacker(RecipeCategory category, ItemLike result, ItemLike ingredient) { super.threeByThreePacker(category, result, ingredient); } - - /** Generated override to expose protected method: {@link RecipeProvider#planksFromLog} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void planksFromLog(ItemLike result, TagKey logs, int count) { super.planksFromLog(result, logs, count); } - - /** Generated override to expose protected method: {@link RecipeProvider#planksFromLogs} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void planksFromLogs(ItemLike result, TagKey logs, int count) { super.planksFromLogs(result, logs, count); } - - /** Generated override to expose protected method: {@link RecipeProvider#woodFromLogs} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void woodFromLogs(ItemLike result, ItemLike log) { super.woodFromLogs(result, log); } - - /** Generated override to expose protected method: {@link RecipeProvider#woodenBoat} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void woodenBoat(ItemLike result, ItemLike planks) { super.woodenBoat(result, planks); } - - /** Generated override to expose protected method: {@link RecipeProvider#chestBoat} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void chestBoat(ItemLike chestBoat, ItemLike boat) { super.chestBoat(chestBoat, boat); } - - /** Generated override to expose protected method: {@link RecipeProvider#buttonBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public RecipeBuilder buttonBuilder(ItemLike result, Ingredient base) { return super.buttonBuilder(result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#doorBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public RecipeBuilder doorBuilder(ItemLike result, Ingredient base) { return super.doorBuilder(result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#fenceBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public RecipeBuilder fenceBuilder(ItemLike result, Ingredient base) { return super.fenceBuilder(result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#fenceGateBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public RecipeBuilder fenceGateBuilder(ItemLike result, Ingredient planks) { return super.fenceGateBuilder(result, planks); } - - /** Generated override to expose protected method: {@link RecipeProvider#pressurePlate} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void pressurePlate(ItemLike result, ItemLike base) { super.pressurePlate(result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#pressurePlateBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public RecipeBuilder pressurePlateBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.pressurePlateBuilder(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#slab} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void slab(RecipeCategory category, ItemLike result, ItemLike base) { super.slab(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#shelf} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void shelf(ItemLike result, ItemLike strippedLogs) { super.shelf(result, strippedLogs); } - - /** Generated override to expose protected method: {@link RecipeProvider#slabBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public RecipeBuilder slabBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.slabBuilder(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#stairBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public RecipeBuilder stairBuilder(ItemLike result, Ingredient base) { return super.stairBuilder(result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#trapdoorBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public RecipeBuilder trapdoorBuilder(ItemLike result, Ingredient base) { return super.trapdoorBuilder(result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#signBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public RecipeBuilder signBuilder(ItemLike result, Ingredient planks) { return super.signBuilder(result, planks); } - - /** Generated override to expose protected method: {@link RecipeProvider#hangingSign} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void hangingSign(ItemLike result, ItemLike ingredient) { super.hangingSign(result, ingredient); } - - /** Generated override to expose protected method: {@link RecipeProvider#colorItemWithDye} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void colorItemWithDye(List dyes, List items, String groupName, RecipeCategory category) { super.colorItemWithDye(dyes, items, groupName, category); } - - /** Generated override to expose protected method: {@link RecipeProvider#carpet} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void carpet(ItemLike result, ItemLike sourceItem) { super.carpet(result, sourceItem); } - - /** Generated override to expose protected method: {@link RecipeProvider#bedFromPlanksAndWool} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void bedFromPlanksAndWool(ItemLike result, ItemLike wool) { super.bedFromPlanksAndWool(result, wool); } - - /** Generated override to expose protected method: {@link RecipeProvider#banner} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void banner(ItemLike result, ItemLike wool) { super.banner(result, wool); } - - /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassFromGlassAndDye} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void stainedGlassFromGlassAndDye(ItemLike result, ItemLike dye) { super.stainedGlassFromGlassAndDye(result, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#dryGhast} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void dryGhast(ItemLike result) { super.dryGhast(result); } - - /** Generated override to expose protected method: {@link RecipeProvider#harness} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void harness(ItemLike result, ItemLike wool) { super.harness(result, wool); } - - /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromStainedGlass} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void stainedGlassPaneFromStainedGlass(ItemLike result, ItemLike stainedGlass) { super.stainedGlassPaneFromStainedGlass(result, stainedGlass); } - - /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromGlassPaneAndDye} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void stainedGlassPaneFromGlassPaneAndDye(ItemLike result, ItemLike dye) { super.stainedGlassPaneFromGlassPaneAndDye(result, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#coloredTerracottaFromTerracottaAndDye} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void coloredTerracottaFromTerracottaAndDye(ItemLike result, ItemLike dye) { super.coloredTerracottaFromTerracottaAndDye(result, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#concretePowder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void concretePowder(ItemLike result, ItemLike dye) { super.concretePowder(result, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#candle} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void candle(ItemLike result, ItemLike dye) { super.candle(result, dye); } - - /** Generated override to expose protected method: {@link RecipeProvider#wall} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void wall(RecipeCategory category, ItemLike result, ItemLike base) { super.wall(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#wallBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public RecipeBuilder wallBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.wallBuilder(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#polished} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void polished(RecipeCategory category, ItemLike result, ItemLike base) { super.polished(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#polishedBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public RecipeBuilder polishedBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.polishedBuilder(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#cut} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void cut(RecipeCategory category, ItemLike result, ItemLike base) { super.cut(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#cutBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public ShapedRecipeBuilder cutBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.cutBuilder(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#chiseled} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void chiseled(RecipeCategory category, ItemLike result, ItemLike base) { super.chiseled(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#mosaicBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void mosaicBuilder(RecipeCategory category, ItemLike result, ItemLike base) { super.mosaicBuilder(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#chiseledBuilder} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public ShapedRecipeBuilder chiseledBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.chiseledBuilder(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike base) { super.stonecutterResultFromBase(category, result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike base, int count) { super.stonecutterResultFromBase(category, result, base, count); } - - /** Generated override to expose protected method: {@link RecipeProvider#smeltingResultFromBase} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void smeltingResultFromBase(ItemLike result, ItemLike base) { super.smeltingResultFromBase(result, base); } - - /** Generated override to expose protected method: {@link RecipeProvider#nineBlockStorageRecipes} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void nineBlockStorageRecipes(RecipeCategory unpackedFormCategory, ItemLike unpackedForm, RecipeCategory packedFormCategory, ItemLike packedForm) { super.nineBlockStorageRecipes(unpackedFormCategory, unpackedForm, packedFormCategory, packedForm); } - - /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void copySmithingTemplate(ItemLike smithingTemplate, ItemLike baseMaterial) { super.copySmithingTemplate(smithingTemplate, baseMaterial); } - - /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void copySmithingTemplate(ItemLike smithingTemplate, Ingredient baseMaterials) { super.copySmithingTemplate(smithingTemplate, baseMaterials); } - - /** Generated override to expose protected method: {@link RecipeProvider#cookRecipes} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void cookRecipes(String source, AbstractCookingRecipe.Factory factory, int cookingTime) { super.cookRecipes(source, factory, cookingTime); } - - /** Generated override to expose protected method: {@link RecipeProvider#waxRecipes} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void waxRecipes(FeatureFlagSet flagSet) { super.waxRecipes(flagSet); } - - /** Generated override to expose protected method: {@link RecipeProvider#grate} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void grate(Block grateBlock, Block material) { super.grate(grateBlock, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#copperBulb} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void copperBulb(Block copperBulb, Block copperMaterial) { super.copperBulb(copperBulb, copperMaterial); } - - /** Generated override to expose protected method: {@link RecipeProvider#waxedChiseled} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void waxedChiseled(Block result, Block material) { super.waxedChiseled(result, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#suspiciousStew} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void suspiciousStew(Item item, SuspiciousEffectHolder effectHolder) { super.suspiciousStew(item, effectHolder); } - - /** Generated override to expose protected method: {@link RecipeProvider#dyedItem} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void dyedItem(Item target, String group) { super.dyedItem(target, group); } - - /** Generated override to expose protected method: {@link RecipeProvider#dyedShulkerBoxRecipe} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void dyedShulkerBoxRecipe(Item dye, Item dyedResult) { super.dyedShulkerBoxRecipe(dye, dyedResult); } - - /** Generated override to expose protected method: {@link RecipeProvider#dyedBundleRecipe} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void dyedBundleRecipe(Item dye, Item dyedResult) { super.dyedBundleRecipe(dye, dyedResult); } - - /** Generated override to expose protected method: {@link RecipeProvider#generateRecipes} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public void generateRecipes(BlockFamily family, FeatureFlagSet flagSet) { super.generateRecipes(family, flagSet); } - - /** Generated override to expose protected method: {@link RecipeProvider#getBaseBlockForCrafting} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public Block getBaseBlockForCrafting(BlockFamily family, BlockFamily.Variant variant) { return super.getBaseBlockForCrafting(family, variant); } - - /** Generated override to expose protected method: {@link RecipeProvider#insideOf} */ - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public static Criterion insideOf(Block block) { return RecipeProvider.insideOf(block); } - - /** Generated override to expose protected method: {@link RecipeProvider#has} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public Criterion has(MinMaxBounds.Ints count, ItemLike item) { return super.has(count, item); } - - /** Generated override to expose protected method: {@link RecipeProvider#has} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public Criterion has(ItemLike item) { return super.has(item); } - - /** Generated override to expose protected method: {@link RecipeProvider#has} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public Criterion has(TagKey tag) { return super.has(tag); } - - /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public static Criterion inventoryTrigger(ItemPredicate.Builder... predicates) { return RecipeProvider.inventoryTrigger(predicates); } - - /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public static Criterion inventoryTrigger(ItemPredicate... predicates) { return RecipeProvider.inventoryTrigger(predicates); } - - /** Generated override to expose protected method: {@link RecipeProvider#getHasName} */ - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public static String getHasName(ItemLike baseBlock) { return RecipeProvider.getHasName(baseBlock); } - - /** Generated override to expose protected method: {@link RecipeProvider#getItemName} */ - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public static String getItemName(ItemLike itemLike) { return RecipeProvider.getItemName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#getSimpleRecipeName} */ - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public static String getSimpleRecipeName(ItemLike itemLike) { return RecipeProvider.getSimpleRecipeName(itemLike); } - - /** Generated override to expose protected method: {@link RecipeProvider#getConversionRecipeName} */ - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public static String getConversionRecipeName(ItemLike product, ItemLike material) { return RecipeProvider.getConversionRecipeName(product, material); } - - /** Generated override to expose protected method: {@link RecipeProvider#getSmeltingRecipeName} */ - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public static String getSmeltingRecipeName(ItemLike product) { return RecipeProvider.getSmeltingRecipeName(product); } - - /** Generated override to expose protected method: {@link RecipeProvider#getBlastingRecipeName} */ - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public static String getBlastingRecipeName(ItemLike product) { return RecipeProvider.getBlastingRecipeName(product); } - - /** Generated override to expose protected method: {@link RecipeProvider#tag} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public Ingredient tag(TagKey id) { return super.tag(id); } - - /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public ShapedRecipeBuilder shaped(RecipeCategory category, ItemStackTemplate stack) { return super.shaped(category, stack); } - - /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike item) { return super.shaped(category, item); } - - /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike item, int count) { return super.shaped(category, item, count); } - - /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemStackTemplate result) { return super.shapeless(category, result); } - - /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike item) { return super.shapeless(category, item); } - - /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") - public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike item, int count) { return super.shapeless(category, item, count); } - - // GENERATED END + // GENERATED START - DO NOT EDIT BELOW THIS LINE + + /** Generated override to expose protected method: {@link RecipeProvider#generateForEnabledBlockFamilies} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void generateForEnabledBlockFamilies(FeatureFlagSet flagSet) { super.generateForEnabledBlockFamilies(flagSet); } + + /** Generated override to expose protected method: {@link RecipeProvider#netheriteSmithing} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void netheriteSmithing(Item base, RecipeCategory category, Item result) { super.netheriteSmithing(base, category, result); } + + /** Generated override to expose protected method: {@link RecipeProvider#trimSmithing} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void trimSmithing(Item trimTemplate, ResourceKey patternId, ResourceKey> id) { super.trimSmithing(trimTemplate, patternId, id); } + + /** Generated override to expose protected method: {@link RecipeProvider#twoByTwoPacker} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void twoByTwoPacker(RecipeCategory category, ItemLike result, ItemLike ingredient) { super.twoByTwoPacker(category, result, ingredient); } + + /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void threeByThreePacker(RecipeCategory category, ItemLike result, ItemLike ingredient, String unlockedBy) { super.threeByThreePacker(category, result, ingredient, unlockedBy); } + + /** Generated override to expose protected method: {@link RecipeProvider#threeByThreePacker} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void threeByThreePacker(RecipeCategory category, ItemLike result, ItemLike ingredient) { super.threeByThreePacker(category, result, ingredient); } + + /** Generated override to expose protected method: {@link RecipeProvider#planksFromLog} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void planksFromLog(ItemLike result, TagKey logs, int count) { super.planksFromLog(result, logs, count); } + + /** Generated override to expose protected method: {@link RecipeProvider#planksFromLogs} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void planksFromLogs(ItemLike result, TagKey logs, int count) { super.planksFromLogs(result, logs, count); } + + /** Generated override to expose protected method: {@link RecipeProvider#woodFromLogs} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void woodFromLogs(ItemLike result, ItemLike log) { super.woodFromLogs(result, log); } + + /** Generated override to expose protected method: {@link RecipeProvider#woodenBoat} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void woodenBoat(ItemLike result, ItemLike planks) { super.woodenBoat(result, planks); } + + /** Generated override to expose protected method: {@link RecipeProvider#chestBoat} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void chestBoat(ItemLike chestBoat, ItemLike boat) { super.chestBoat(chestBoat, boat); } + + /** Generated override to expose protected method: {@link RecipeProvider#buttonBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder buttonBuilder(ItemLike result, Ingredient base) { return super.buttonBuilder(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#doorBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder doorBuilder(ItemLike result, Ingredient base) { return super.doorBuilder(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#fenceBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder fenceBuilder(ItemLike result, Ingredient base) { return super.fenceBuilder(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#fenceGateBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder fenceGateBuilder(ItemLike result, Ingredient planks) { return super.fenceGateBuilder(result, planks); } + + /** Generated override to expose protected method: {@link RecipeProvider#pressurePlate} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void pressurePlate(ItemLike result, ItemLike base) { super.pressurePlate(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#pressurePlateBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder pressurePlateBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.pressurePlateBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#slab} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void slab(RecipeCategory category, ItemLike result, ItemLike base) { super.slab(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#shelf} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void shelf(ItemLike result, ItemLike strippedLogs) { super.shelf(result, strippedLogs); } + + /** Generated override to expose protected method: {@link RecipeProvider#slabBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder slabBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.slabBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#stairBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder stairBuilder(ItemLike result, Ingredient base) { return super.stairBuilder(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#trapdoorBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder trapdoorBuilder(ItemLike result, Ingredient base) { return super.trapdoorBuilder(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#signBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder signBuilder(ItemLike result, Ingredient planks) { return super.signBuilder(result, planks); } + + /** Generated override to expose protected method: {@link RecipeProvider#hangingSign} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void hangingSign(ItemLike result, ItemLike ingredient) { super.hangingSign(result, ingredient); } + + /** Generated override to expose protected method: {@link RecipeProvider#colorItemWithDye} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void colorItemWithDye(List dyes, List items, String groupName, RecipeCategory category) { super.colorItemWithDye(dyes, items, groupName, category); } + + /** Generated override to expose protected method: {@link RecipeProvider#carpet} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void carpet(ItemLike result, ItemLike sourceItem) { super.carpet(result, sourceItem); } + + /** Generated override to expose protected method: {@link RecipeProvider#bedFromPlanksAndWool} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void bedFromPlanksAndWool(ItemLike result, ItemLike wool) { super.bedFromPlanksAndWool(result, wool); } + + /** Generated override to expose protected method: {@link RecipeProvider#banner} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void banner(ItemLike result, ItemLike wool) { super.banner(result, wool); } + + /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassFromGlassAndDye} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void stainedGlassFromGlassAndDye(ItemLike result, ItemLike dye) { super.stainedGlassFromGlassAndDye(result, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#dryGhast} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void dryGhast(ItemLike result) { super.dryGhast(result); } + + /** Generated override to expose protected method: {@link RecipeProvider#harness} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void harness(ItemLike result, ItemLike wool) { super.harness(result, wool); } + + /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromStainedGlass} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void stainedGlassPaneFromStainedGlass(ItemLike result, ItemLike stainedGlass) { super.stainedGlassPaneFromStainedGlass(result, stainedGlass); } + + /** Generated override to expose protected method: {@link RecipeProvider#stainedGlassPaneFromGlassPaneAndDye} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void stainedGlassPaneFromGlassPaneAndDye(ItemLike result, ItemLike dye) { super.stainedGlassPaneFromGlassPaneAndDye(result, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#coloredTerracottaFromTerracottaAndDye} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void coloredTerracottaFromTerracottaAndDye(ItemLike result, ItemLike dye) { super.coloredTerracottaFromTerracottaAndDye(result, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#concretePowder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void concretePowder(ItemLike result, ItemLike dye) { super.concretePowder(result, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#candle} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void candle(ItemLike result, ItemLike dye) { super.candle(result, dye); } + + /** Generated override to expose protected method: {@link RecipeProvider#wall} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void wall(RecipeCategory category, ItemLike result, ItemLike base) { super.wall(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#wallBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder wallBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.wallBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#polished} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void polished(RecipeCategory category, ItemLike result, ItemLike base) { super.polished(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#polishedBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public RecipeBuilder polishedBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.polishedBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#cut} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void cut(RecipeCategory category, ItemLike result, ItemLike base) { super.cut(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#cutBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapedRecipeBuilder cutBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.cutBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#chiseled} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void chiseled(RecipeCategory category, ItemLike result, ItemLike base) { super.chiseled(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#mosaicBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void mosaicBuilder(RecipeCategory category, ItemLike result, ItemLike base) { super.mosaicBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#chiseledBuilder} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapedRecipeBuilder chiseledBuilder(RecipeCategory category, ItemLike result, Ingredient base) { return super.chiseledBuilder(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike base) { super.stonecutterResultFromBase(category, result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#stonecutterResultFromBase} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void stonecutterResultFromBase(RecipeCategory category, ItemLike result, ItemLike base, int count) { super.stonecutterResultFromBase(category, result, base, count); } + + /** Generated override to expose protected method: {@link RecipeProvider#smeltingResultFromBase} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void smeltingResultFromBase(ItemLike result, ItemLike base) { super.smeltingResultFromBase(result, base); } + + /** Generated override to expose protected method: {@link RecipeProvider#nineBlockStorageRecipes} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void nineBlockStorageRecipes(RecipeCategory unpackedFormCategory, ItemLike unpackedForm, RecipeCategory packedFormCategory, ItemLike packedForm) { super.nineBlockStorageRecipes(unpackedFormCategory, unpackedForm, packedFormCategory, packedForm); } + + /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void copySmithingTemplate(ItemLike smithingTemplate, ItemLike baseMaterial) { super.copySmithingTemplate(smithingTemplate, baseMaterial); } + + /** Generated override to expose protected method: {@link RecipeProvider#copySmithingTemplate} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void copySmithingTemplate(ItemLike smithingTemplate, Ingredient baseMaterials) { super.copySmithingTemplate(smithingTemplate, baseMaterials); } + + /** Generated override to expose protected method: {@link RecipeProvider#cookRecipes} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void cookRecipes(String source, AbstractCookingRecipe.Factory factory, int cookingTime) { super.cookRecipes(source, factory, cookingTime); } + + /** Generated override to expose protected method: {@link RecipeProvider#waxRecipes} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void waxRecipes(FeatureFlagSet flagSet) { super.waxRecipes(flagSet); } + + /** Generated override to expose protected method: {@link RecipeProvider#grate} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void grate(Block grateBlock, Block material) { super.grate(grateBlock, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#copperBulb} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void copperBulb(Block copperBulb, Block copperMaterial) { super.copperBulb(copperBulb, copperMaterial); } + + /** Generated override to expose protected method: {@link RecipeProvider#waxedChiseled} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void waxedChiseled(Block result, Block material) { super.waxedChiseled(result, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#suspiciousStew} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void suspiciousStew(Item item, SuspiciousEffectHolder effectHolder) { super.suspiciousStew(item, effectHolder); } + + /** Generated override to expose protected method: {@link RecipeProvider#dyedItem} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void dyedItem(Item target, String group) { super.dyedItem(target, group); } + + /** Generated override to expose protected method: {@link RecipeProvider#dyedShulkerBoxRecipe} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void dyedShulkerBoxRecipe(Item dye, Item dyedResult) { super.dyedShulkerBoxRecipe(dye, dyedResult); } + + /** Generated override to expose protected method: {@link RecipeProvider#dyedBundleRecipe} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void dyedBundleRecipe(Item dye, Item dyedResult) { super.dyedBundleRecipe(dye, dyedResult); } + + /** Generated override to expose protected method: {@link RecipeProvider#generateRecipes} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public void generateRecipes(BlockFamily family, FeatureFlagSet flagSet) { super.generateRecipes(family, flagSet); } + + /** Generated override to expose protected method: {@link RecipeProvider#getBaseBlockForCrafting} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public Block getBaseBlockForCrafting(BlockFamily family, BlockFamily.Variant variant) { return super.getBaseBlockForCrafting(family, variant); } + + /** Generated override to expose protected method: {@link RecipeProvider#insideOf} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static Criterion insideOf(Block block) { return RecipeProvider.insideOf(block); } + + /** Generated override to expose protected method: {@link RecipeProvider#has} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public Criterion has(MinMaxBounds.Ints count, ItemLike item) { return super.has(count, item); } + + /** Generated override to expose protected method: {@link RecipeProvider#has} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public Criterion has(ItemLike item) { return super.has(item); } + + /** Generated override to expose protected method: {@link RecipeProvider#has} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public Criterion has(TagKey tag) { return super.has(tag); } + + /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static Criterion inventoryTrigger(ItemPredicate.Builder... predicates) { return RecipeProvider.inventoryTrigger(predicates); } + + /** Generated override to expose protected method: {@link RecipeProvider#inventoryTrigger} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static Criterion inventoryTrigger(ItemPredicate... predicates) { return RecipeProvider.inventoryTrigger(predicates); } + + /** Generated override to expose protected method: {@link RecipeProvider#getHasName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getHasName(ItemLike baseBlock) { return RecipeProvider.getHasName(baseBlock); } + + /** Generated override to expose protected method: {@link RecipeProvider#getItemName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getItemName(ItemLike itemLike) { return RecipeProvider.getItemName(itemLike); } + + /** Generated override to expose protected method: {@link RecipeProvider#getSimpleRecipeName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getSimpleRecipeName(ItemLike itemLike) { return RecipeProvider.getSimpleRecipeName(itemLike); } + + /** Generated override to expose protected method: {@link RecipeProvider#getConversionRecipeName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getConversionRecipeName(ItemLike product, ItemLike material) { return RecipeProvider.getConversionRecipeName(product, material); } + + /** Generated override to expose protected method: {@link RecipeProvider#getSmeltingRecipeName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getSmeltingRecipeName(ItemLike product) { return RecipeProvider.getSmeltingRecipeName(product); } + + /** Generated override to expose protected method: {@link RecipeProvider#getBlastingRecipeName} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public static String getBlastingRecipeName(ItemLike product) { return RecipeProvider.getBlastingRecipeName(product); } + + /** Generated override to expose protected method: {@link RecipeProvider#tag} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public Ingredient tag(TagKey id) { return super.tag(id); } + + /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapedRecipeBuilder shaped(RecipeCategory category, ItemStackTemplate stack) { return super.shaped(category, stack); } + + /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike item) { return super.shaped(category, item); } + + /** Generated override to expose protected method: {@link RecipeProvider#shaped} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapedRecipeBuilder shaped(RecipeCategory category, ItemLike item, int count) { return super.shaped(category, item, count); } + + /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemStackTemplate result) { return super.shapeless(category, result); } + + /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike item) { return super.shapeless(category, item); } + + /** Generated override to expose protected method: {@link RecipeProvider#shapeless} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateRecipeProvider", date = "Sun, 19 Apr 2026 10:13:58 GMT") + public ShapelessRecipeBuilder shapeless(RecipeCategory category, ItemLike item, int count) { return super.shapeless(category, item, count); } + + // GENERATED END } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java index ae53c5a..5f7f173 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java @@ -2,6 +2,7 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.RegistrateProvider; + import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.data.recipes.RecipeOutput; @@ -12,34 +13,33 @@ public class RegistrateRecipeRunner extends RecipeProvider.Runner implements RegistrateProvider { - final AbstractRegistrate owner; - - @org.jetbrains.annotations.Nullable - RegistrateRecipeProvider provider; + final AbstractRegistrate owner; - public RegistrateRecipeRunner(AbstractRegistrate owner, PackOutput p_365369_, CompletableFuture p_361563_) { - super(p_365369_, p_361563_); - this.owner = owner; - } + @org.jetbrains.annotations.Nullable + RegistrateRecipeProvider provider; - @Override - protected RecipeProvider createRecipeProvider(HolderLookup.Provider p_362946_, RecipeOutput p_365274_) { - return new RegistrateRecipeProvider(this, p_362946_, p_365274_); - } + public RegistrateRecipeRunner(AbstractRegistrate owner, PackOutput p_365369_, CompletableFuture p_361563_) { + super(p_365369_, p_361563_); + this.owner = owner; + } - @Override - public String getName() { - return ""; - } + @Override + protected RecipeProvider createRecipeProvider(HolderLookup.Provider p_362946_, RecipeOutput p_365274_) { + return new RegistrateRecipeProvider(this, p_362946_, p_365274_); + } - @Override - public LogicalSide getSide() { - return LogicalSide.SERVER; - } + @Override + public String getName() { + return ""; + } - public RegistrateRecipeProvider getRecipeProvider() { - if (provider == null) throw new IllegalStateException("Recipe Provider is not available now"); - return provider; - } + @Override + public LogicalSide getSide() { + return LogicalSide.SERVER; + } + public RegistrateRecipeProvider getRecipeProvider() { + if (provider == null) throw new IllegalStateException("Recipe Provider is not available now"); + return provider; + } } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/package-info.java b/src/main/java/com/modularmc/registrate/providers/generators/package-info.java index 3f8c4a9..868b078 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/package-info.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/package-info.java @@ -1,2 +1,9 @@ +/** + * Specialized generator adapters for models, recipes, and blockstates. + * + *

                + * These classes sit beneath the higher-level provider layer and expose the + * concrete helpers used by builder datagen callbacks. + */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.providers.generators; diff --git a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java index d79d8a2..1a2ee60 100644 --- a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateBlockLootTables.java @@ -1,6 +1,7 @@ package com.modularmc.registrate.providers.loot; import com.modularmc.registrate.AbstractRegistrate; + import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.data.loot.BlockLootSubProvider; @@ -16,13 +17,15 @@ import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; -import javax.annotation.processing.Generated; import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; +import javax.annotation.processing.Generated; + public class RegistrateBlockLootTables extends BlockLootSubProvider implements RegistrateLootTables { + private final AbstractRegistrate parent; private final Consumer callback; @@ -66,235 +69,235 @@ public HolderLookup> entityLookup() { } // @formatter:off - // GENERATED START - DO NOT EDIT BELOW THIS LINE - - /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionDecay} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public > T applyExplosionDecay(ItemLike type, FunctionUserBuilder builder) { return super.applyExplosionDecay(type, builder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionCondition} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public > T applyExplosionCondition(ItemLike type, ConditionUserBuilder builder) { return super.applyExplosionCondition(type, builder); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSelfDropDispatchTable} */ - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public static LootTable.Builder createSelfDropDispatchTable(Block original, LootItemCondition.Builder condition, LootPoolEntryContainer.Builder entry) { return BlockLootSubProvider.createSelfDropDispatchTable(original, condition, entry); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchDispatchTable} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createSilkTouchDispatchTable(Block original, LootPoolEntryContainer.Builder entry) { return super.createSilkTouchDispatchTable(original, entry); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsDispatchTable} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createShearsDispatchTable(Block original, LootPoolEntryContainer.Builder entry) { return super.createShearsDispatchTable(original, entry); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOrShearsDispatchTable} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createSilkTouchOrShearsDispatchTable(Block original, LootPoolEntryContainer.Builder entry) { return super.createSilkTouchOrShearsDispatchTable(original, entry); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createSingleItemTableWithSilkTouch(Block original, ItemLike drop) { return super.createSingleItemTableWithSilkTouch(original, drop); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTable} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createSingleItemTable(ItemLike drop, NumberProvider count) { return super.createSingleItemTable(drop, count); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createSingleItemTableWithSilkTouch(Block original, ItemLike drop, NumberProvider count) { return super.createSingleItemTableWithSilkTouch(original, drop, count); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOnlyTable} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createSilkTouchOnlyTable(ItemLike drop) { return super.createSilkTouchOnlyTable(drop); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createPotFlowerItemTable} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createPotFlowerItemTable(ItemLike flower) { return super.createPotFlowerItemTable(flower); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createSlabItemTable} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createSlabItemTable(Block slab) { return super.createSlabItemTable(slab); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createNameableBlockEntityTable} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createNameableBlockEntityTable(Block drop) { return super.createNameableBlockEntityTable(drop); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShulkerBoxDrop} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createShulkerBoxDrop(Block shulkerBox) { return super.createShulkerBoxDrop(shulkerBox); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCopperOreDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createCopperOreDrops(Block block) { return super.createCopperOreDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createLapisOreDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createLapisOreDrops(Block block) { return super.createLapisOreDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createRedstoneOreDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createRedstoneOreDrops(Block block) { return super.createRedstoneOreDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createBannerDrop} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createBannerDrop(Block original) { return super.createBannerDrop(original); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeNestDrop} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createBeeNestDrop(Block original) { return super.createBeeNestDrop(original); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeHiveDrop} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createBeeHiveDrop(Block original) { return super.createBeeHiveDrop(original); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCaveVinesDrop} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createCaveVinesDrop(Block original) { return super.createCaveVinesDrop(original); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCopperGolemStatueBlock} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createCopperGolemStatueBlock(Block block) { return super.createCopperGolemStatueBlock(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createOreDrop} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createOreDrop(Block original, Item drop) { return super.createOreDrop(original, drop); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMushroomBlockDrop} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createMushroomBlockDrop(Block original, ItemLike drop) { return super.createMushroomBlockDrop(original, drop); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createGrassDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createGrassDrops(Block original) { return super.createGrassDrops(original); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOnlyDrop} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createShearsOnlyDrop(ItemLike drop) { return super.createShearsOnlyDrop(drop); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOrSilkTouchOnlyDrop} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createShearsOrSilkTouchOnlyDrop(ItemLike drop) { return super.createShearsOrSilkTouchOnlyDrop(drop); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createMultifaceBlockDrops(Block block, LootItemCondition.Builder condition) { return super.createMultifaceBlockDrops(block, condition); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createMultifaceBlockDrops(Block block) { return super.createMultifaceBlockDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMossyCarpetBlockDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createMossyCarpetBlockDrops(Block block) { return super.createMossyCarpetBlockDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createLeavesDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createLeavesDrops(Block original, Block sapling, float... saplingChances) { return super.createLeavesDrops(original, sapling, saplingChances); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createOakLeavesDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createOakLeavesDrops(Block original, Block sapling, float... saplingChances) { return super.createOakLeavesDrops(original, sapling, saplingChances); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createMangroveLeavesDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createMangroveLeavesDrops(Block block) { return super.createMangroveLeavesDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCropDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createCropDrops(Block original, Item cropDrop, Item seedDrop, LootItemCondition.Builder isMaxAge) { return super.createCropDrops(original, cropDrop, seedDrop, isMaxAge); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantShearsDrop} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createDoublePlantShearsDrop(Block block) { return super.createDoublePlantShearsDrop(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantWithSeedDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createDoublePlantWithSeedDrops(Block block, Block drop) { return super.createDoublePlantWithSeedDrops(block, drop); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleDrops} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createCandleDrops(Block block) { return super.createCandleDrops(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleCakeDrops} */ - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public static LootTable.Builder createCandleCakeDrops(Block candle) { return BlockLootSubProvider.createCandleCakeDrops(candle); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#addNetherVinesDropTable} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public void addNetherVinesDropTable(Block vineBlock, Block plantBlock) { super.addNetherVinesDropTable(vineBlock, plantBlock); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoorTable} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public LootTable.Builder createDoorTable(Block block) { return super.createDoorTable(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropPottedContents} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public void dropPottedContents(Block potted) { super.dropPottedContents(potted); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#otherWhenSilkTouch} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public void otherWhenSilkTouch(Block block, Block other) { super.otherWhenSilkTouch(block, other); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropOther} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public void dropOther(Block block, ItemLike drop) { super.dropOther(block, drop); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropWhenSilkTouch} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public void dropWhenSilkTouch(Block block) { super.dropWhenSilkTouch(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#dropSelf} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public void dropSelf(Block block) { super.dropSelf(block); } - - /** Generated override to expose protected method: {@link BlockLootSubProvider#add} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") - public void add(Block block, LootTable.Builder builder) { super.add(block, builder); } - - // GENERATED END + // GENERATED START - DO NOT EDIT BELOW THIS LINE + + /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionDecay} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public > T applyExplosionDecay(ItemLike type, FunctionUserBuilder builder) { return super.applyExplosionDecay(type, builder); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#applyExplosionCondition} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public > T applyExplosionCondition(ItemLike type, ConditionUserBuilder builder) { return super.applyExplosionCondition(type, builder); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSelfDropDispatchTable} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public static LootTable.Builder createSelfDropDispatchTable(Block original, LootItemCondition.Builder condition, LootPoolEntryContainer.Builder entry) { return BlockLootSubProvider.createSelfDropDispatchTable(original, condition, entry); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchDispatchTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSilkTouchDispatchTable(Block original, LootPoolEntryContainer.Builder entry) { return super.createSilkTouchDispatchTable(original, entry); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsDispatchTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createShearsDispatchTable(Block original, LootPoolEntryContainer.Builder entry) { return super.createShearsDispatchTable(original, entry); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOrShearsDispatchTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSilkTouchOrShearsDispatchTable(Block original, LootPoolEntryContainer.Builder entry) { return super.createSilkTouchOrShearsDispatchTable(original, entry); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSingleItemTableWithSilkTouch(Block original, ItemLike drop) { return super.createSingleItemTableWithSilkTouch(original, drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSingleItemTable(ItemLike drop, NumberProvider count) { return super.createSingleItemTable(drop, count); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSingleItemTableWithSilkTouch} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSingleItemTableWithSilkTouch(Block original, ItemLike drop, NumberProvider count) { return super.createSingleItemTableWithSilkTouch(original, drop, count); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSilkTouchOnlyTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSilkTouchOnlyTable(ItemLike drop) { return super.createSilkTouchOnlyTable(drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createPotFlowerItemTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createPotFlowerItemTable(ItemLike flower) { return super.createPotFlowerItemTable(flower); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createSlabItemTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createSlabItemTable(Block slab) { return super.createSlabItemTable(slab); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createNameableBlockEntityTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createNameableBlockEntityTable(Block drop) { return super.createNameableBlockEntityTable(drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShulkerBoxDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createShulkerBoxDrop(Block shulkerBox) { return super.createShulkerBoxDrop(shulkerBox); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCopperOreDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createCopperOreDrops(Block block) { return super.createCopperOreDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createLapisOreDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createLapisOreDrops(Block block) { return super.createLapisOreDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createRedstoneOreDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createRedstoneOreDrops(Block block) { return super.createRedstoneOreDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createBannerDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createBannerDrop(Block original) { return super.createBannerDrop(original); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeNestDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createBeeNestDrop(Block original) { return super.createBeeNestDrop(original); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createBeeHiveDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createBeeHiveDrop(Block original) { return super.createBeeHiveDrop(original); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCaveVinesDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createCaveVinesDrop(Block original) { return super.createCaveVinesDrop(original); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCopperGolemStatueBlock} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createCopperGolemStatueBlock(Block block) { return super.createCopperGolemStatueBlock(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createOreDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createOreDrop(Block original, Item drop) { return super.createOreDrop(original, drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMushroomBlockDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createMushroomBlockDrop(Block original, ItemLike drop) { return super.createMushroomBlockDrop(original, drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createGrassDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createGrassDrops(Block original) { return super.createGrassDrops(original); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOnlyDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createShearsOnlyDrop(ItemLike drop) { return super.createShearsOnlyDrop(drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createShearsOrSilkTouchOnlyDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createShearsOrSilkTouchOnlyDrop(ItemLike drop) { return super.createShearsOrSilkTouchOnlyDrop(drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createMultifaceBlockDrops(Block block, LootItemCondition.Builder condition) { return super.createMultifaceBlockDrops(block, condition); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMultifaceBlockDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createMultifaceBlockDrops(Block block) { return super.createMultifaceBlockDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMossyCarpetBlockDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createMossyCarpetBlockDrops(Block block) { return super.createMossyCarpetBlockDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createLeavesDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createLeavesDrops(Block original, Block sapling, float... saplingChances) { return super.createLeavesDrops(original, sapling, saplingChances); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createOakLeavesDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createOakLeavesDrops(Block original, Block sapling, float... saplingChances) { return super.createOakLeavesDrops(original, sapling, saplingChances); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createMangroveLeavesDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createMangroveLeavesDrops(Block block) { return super.createMangroveLeavesDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCropDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createCropDrops(Block original, Item cropDrop, Item seedDrop, LootItemCondition.Builder isMaxAge) { return super.createCropDrops(original, cropDrop, seedDrop, isMaxAge); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantShearsDrop} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createDoublePlantShearsDrop(Block block) { return super.createDoublePlantShearsDrop(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoublePlantWithSeedDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createDoublePlantWithSeedDrops(Block block, Block drop) { return super.createDoublePlantWithSeedDrops(block, drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleDrops} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createCandleDrops(Block block) { return super.createCandleDrops(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createCandleCakeDrops} */ + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public static LootTable.Builder createCandleCakeDrops(Block candle) { return BlockLootSubProvider.createCandleCakeDrops(candle); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#addNetherVinesDropTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void addNetherVinesDropTable(Block vineBlock, Block plantBlock) { super.addNetherVinesDropTable(vineBlock, plantBlock); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#createDoorTable} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public LootTable.Builder createDoorTable(Block block) { return super.createDoorTable(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropPottedContents} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void dropPottedContents(Block potted) { super.dropPottedContents(potted); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#otherWhenSilkTouch} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void otherWhenSilkTouch(Block block, Block other) { super.otherWhenSilkTouch(block, other); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropOther} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void dropOther(Block block, ItemLike drop) { super.dropOther(block, drop); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropWhenSilkTouch} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void dropWhenSilkTouch(Block block) { super.dropWhenSilkTouch(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#dropSelf} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void dropSelf(Block block) { super.dropSelf(block); } + + /** Generated override to expose protected method: {@link BlockLootSubProvider#add} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateBlockLootTables", date = "Sun, 19 Apr 2026 10:15:02 GMT") + public void add(Block block, LootTable.Builder builder) { super.add(block, builder); } + + // GENERATED END } diff --git a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateEntityLootTables.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateEntityLootTables.java index 7723e12..2c64de1 100644 --- a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateEntityLootTables.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateEntityLootTables.java @@ -1,6 +1,7 @@ package com.modularmc.registrate.providers.loot; import com.modularmc.registrate.AbstractRegistrate; + import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; @@ -13,11 +14,12 @@ import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; -import javax.annotation.processing.Generated; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Stream; +import javax.annotation.processing.Generated; + public class RegistrateEntityLootTables extends EntityLootSubProvider implements RegistrateLootTables { private final AbstractRegistrate parent; @@ -63,22 +65,22 @@ public HolderLookup> entityLookup() { } // @formatter:off - // GENERATED START - DO NOT EDIT BELOW THIS LINE + // GENERATED START - DO NOT EDIT BELOW THIS LINE - /** Generated override to expose protected method: {@link EntityLootSubProvider#killedByFrog} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 19 Apr 2026 10:15:16 GMT") - public LootItemCondition.Builder killedByFrog(HolderGetter> entityTypes) { return super.killedByFrog(entityTypes); } + /** Generated override to expose protected method: {@link EntityLootSubProvider#killedByFrog} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 19 Apr 2026 10:15:16 GMT") + public LootItemCondition.Builder killedByFrog(HolderGetter> entityTypes) { return super.killedByFrog(entityTypes); } - /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 19 Apr 2026 10:15:16 GMT") - public void add(EntityType type, LootTable.Builder builder) { super.add(type, builder); } + /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 19 Apr 2026 10:15:16 GMT") + public void add(EntityType type, LootTable.Builder builder) { super.add(type, builder); } - /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ - @Override - @Generated(value = "com.modularmc.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 19 Apr 2026 10:15:16 GMT") - public void add(EntityType type, ResourceKey lootTable, LootTable.Builder builder) { super.add(type, lootTable, builder); } + /** Generated override to expose protected method: {@link EntityLootSubProvider#add} */ + @Override + @Generated(value = "com.modularmc.registrate.test.meta.UpdateEntityLootTables", date = "Sun, 19 Apr 2026 10:15:16 GMT") + public void add(EntityType type, ResourceKey lootTable, LootTable.Builder builder) { super.add(type, lootTable, builder); } - // GENERATED END + // GENERATED END } diff --git a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java index d74644f..5ffa881 100644 --- a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java @@ -1,13 +1,10 @@ package com.modularmc.registrate.providers.loot; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Multimap; import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.providers.RegistrateProvider; import com.modularmc.registrate.util.nullness.NonNullConsumer; + import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.core.WritableRegistry; @@ -15,16 +12,20 @@ import net.minecraft.data.loot.LootTableProvider; import net.minecraft.data.loot.LootTableSubProvider; import net.minecraft.data.loot.packs.VanillaLootTableProvider; -import net.minecraft.resources.ResourceKey; import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; import net.minecraft.util.ProblemReporter; import net.minecraft.util.context.ContextKeySet; import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.ValidationContext; import net.minecraft.world.level.storage.loot.ValidationContextSource; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.neoforged.fml.LogicalSide; import net.neoforged.fml.util.ObfuscationReflectionHelper; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Multimap; import org.apache.commons.lang3.function.TriFunction; import java.util.*; @@ -45,6 +46,7 @@ public interface LootType { static LootType register(String name, ContextKeySet set, TriFunction, Consumer, T> factory) { LootType type = new LootType() { + @Override public T getLootCreator(HolderLookup.Provider provider, AbstractRegistrate parent, Consumer callback) { return factory.apply(provider, parent, callback); @@ -76,7 +78,7 @@ public RegistrateLootTableProvider(AbstractRegistrate parent, PackOutput pack this.provider = provider; } - public HolderLookup.Provider getProvider(){ + public HolderLookup.Provider getProvider() { return provider.getNow(null); } @@ -103,7 +105,7 @@ public void addLootAction(ContextKeySet set, Consumer parent, LootType type) { + private LootTableSubProvider getLootCreator(HolderLookup.Provider provider, AbstractRegistrate parent, LootType type) { RegistrateLootTables creator = type.getLootCreator(provider, parent, cons -> specialLootActions.get(type).forEach(c -> c.accept(cons))); currentLootCreators.add(creator); return creator; diff --git a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTables.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTables.java index 9b348ec..dee7c21 100644 --- a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTables.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTables.java @@ -2,13 +2,10 @@ import net.minecraft.core.WritableRegistry; import net.minecraft.data.loot.LootTableSubProvider; -import net.minecraft.resources.Identifier; import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.ValidationContext; import net.minecraft.world.level.storage.loot.ValidationContextSource; -import java.util.Map; - public interface RegistrateLootTables extends LootTableSubProvider { + default void validate(WritableRegistry tables, ValidationContextSource validationContext) {} } diff --git a/src/main/java/com/modularmc/registrate/providers/loot/package-info.java b/src/main/java/com/modularmc/registrate/providers/loot/package-info.java index 1b744c3..5620fe2 100644 --- a/src/main/java/com/modularmc/registrate/providers/loot/package-info.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/package-info.java @@ -1,2 +1,9 @@ +/** + * Loot-table focused provider wrappers. + * + *

                + * This layer isolates loot-specific generation concerns from the rest of the + * provider stack so block and entity loot behavior can evolve independently. + */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.providers.loot; diff --git a/src/main/java/com/modularmc/registrate/providers/package-info.java b/src/main/java/com/modularmc/registrate/providers/package-info.java index ed93514..5b5b490 100644 --- a/src/main/java/com/modularmc/registrate/providers/package-info.java +++ b/src/main/java/com/modularmc/registrate/providers/package-info.java @@ -1,2 +1,9 @@ +/** + * Data generation orchestration and provider lifecycle types. + * + *

                + * This package coordinates provider registration, dispatch, and shared data + * generation state used by builder callbacks. + */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.providers; diff --git a/src/main/java/com/modularmc/registrate/util/CreativeModeTabModifier.java b/src/main/java/com/modularmc/registrate/util/CreativeModeTabModifier.java index 9e9acc0..58cb1cb 100644 --- a/src/main/java/com/modularmc/registrate/util/CreativeModeTabModifier.java +++ b/src/main/java/com/modularmc/registrate/util/CreativeModeTabModifier.java @@ -1,17 +1,18 @@ package com.modularmc.registrate.util; -import org.jetbrains.annotations.ApiStatus; - import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; +import org.jetbrains.annotations.ApiStatus; + import java.util.function.BiConsumer; import java.util.function.BooleanSupplier; import java.util.function.Supplier; public final class CreativeModeTabModifier implements CreativeModeTab.Output { + private final Supplier flags; private final BooleanSupplier hasPermissions; private final BiConsumer acceptFunc; @@ -22,14 +23,14 @@ public CreativeModeTabModifier(Supplier flags, BooleanSupplier h this.flags = flags; this.hasPermissions = hasPermissions; this.acceptFunc = acceptFunc; - this.parameters = parameters; - } + this.parameters = parameters; + } public FeatureFlagSet getFlags() { return flags.get(); } - public CreativeModeTab.ItemDisplayParameters getParameters(){ + public CreativeModeTab.ItemDisplayParameters getParameters() { return parameters.get(); } diff --git a/src/main/java/com/modularmc/registrate/util/DataIngredient.java b/src/main/java/com/modularmc/registrate/util/DataIngredient.java index 483d737..7d57240 100644 --- a/src/main/java/com/modularmc/registrate/util/DataIngredient.java +++ b/src/main/java/com/modularmc/registrate/util/DataIngredient.java @@ -1,9 +1,8 @@ package com.modularmc.registrate.util; -import com.google.common.collect.ObjectArrays; import com.modularmc.registrate.providers.generators.RegistrateRecipeProvider; import com.modularmc.registrate.util.nullness.NonNullSupplier; -import lombok.Getter; + import net.minecraft.advancements.Criterion; import net.minecraft.advancements.criterion.InventoryChangeTrigger; import net.minecraft.advancements.criterion.ItemPredicate; @@ -15,6 +14,9 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; +import com.google.common.collect.ObjectArrays; +import lombok.Getter; + import java.util.Arrays; import java.util.function.Function; import java.util.function.Supplier; @@ -23,13 +25,15 @@ * A helper for data generation when using ingredients as input(s) to recipes.
                * It remembers the name of the primary ingredient for use in creating recipe names/criteria. *

                - * Create an instance of this class with the various factory methods such as {@link #items(ItemLike, ItemLike...)} and {@link #tag(HolderSet.Named)} )}. + * Create an instance of this class with the various factory methods such as {@link #items(ItemLike, ItemLike...)} and + * {@link #tag(HolderSet.Named)} )}. *

                - * This class should not be used for any purpose other than data generation, it will throw an exception if it is serialized to a packet buffer. + * This class should not be used for any purpose other than data generation, it will throw an exception + * if it is serialized to a packet buffer. */ public final class DataIngredient { - //TODO <1.21.4> removed delegate. Is there a need to add it back? + // TODO <1.21.4> removed delegate. Is there a need to add it back? private final Ingredient parent; @Getter private final Identifier id; @@ -40,13 +44,13 @@ private DataIngredient(Ingredient parent, ItemLike item) { this.id = BuiltInRegistries.ITEM.getKey(item.asItem()); this.criteriaFactory = prov -> prov.has(item); } - + private DataIngredient(Ingredient parent, TagKey tag) { this.parent = parent; this.id = tag.location(); this.criteriaFactory = prov -> prov.has(tag); } - + private DataIngredient(Ingredient parent, Identifier id, ItemPredicate... predicates) { this.parent = parent; this.id = id; @@ -56,7 +60,7 @@ private DataIngredient(Ingredient parent, Identifier id, ItemPredicate... predic public Criterion getCriterion(RegistrateRecipeProvider prov) { return criteriaFactory.apply(prov); } - + @SuppressWarnings("unchecked") @SafeVarargs public static DataIngredient items(NonNullSupplier first, NonNullSupplier... others) { @@ -71,15 +75,15 @@ public static DataIngredient items(T first, T... others) { public static DataIngredient tag(HolderSet.Named tag) { return ingredient(Ingredient.of(tag), tag.key()); } - + public static DataIngredient ingredient(Ingredient parent, ItemLike required) { return new DataIngredient(parent, required); } - + public static DataIngredient ingredient(Ingredient parent, TagKey required) { return new DataIngredient(parent, required); } - + public static DataIngredient ingredient(Ingredient parent, Identifier id, ItemPredicate... criteria) { return new DataIngredient(parent, id, criteria); } diff --git a/src/main/java/com/modularmc/registrate/util/DebugMarkers.java b/src/main/java/com/modularmc/registrate/util/DebugMarkers.java index a51aa0d..17685cc 100644 --- a/src/main/java/com/modularmc/registrate/util/DebugMarkers.java +++ b/src/main/java/com/modularmc/registrate/util/DebugMarkers.java @@ -5,13 +5,13 @@ @SuppressWarnings("null") public class DebugMarkers { - + private static final String PREFIX = "REGISTRATE."; - + private static final Marker marker(String name) { return MarkerManager.getMarker(PREFIX + name); } - + public static final Marker REGISTER = marker("REGISTER"); public static final Marker DATA = marker("DATA"); -} \ No newline at end of file +} diff --git a/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java b/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java index 6922f52..17ba16d 100644 --- a/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java +++ b/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java @@ -1,16 +1,18 @@ package com.modularmc.registrate.util; -import com.google.common.collect.HashBasedTable; -import com.google.common.collect.Table; import com.modularmc.registrate.AbstractRegistrate; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; + import net.neoforged.bus.api.Event; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.event.IModBusEvent; import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; import net.neoforged.neoforge.common.NeoForge; + +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; @@ -23,11 +25,10 @@ @Log4j2 public class OneTimeEventReceiver implements Consumer { - public static void addModListener(AbstractRegistrate owner, Class evtClass, Consumer listener) { OneTimeEventReceiver.addModListener(owner, EventPriority.NORMAL, evtClass, listener); } - + public static void addModListener(AbstractRegistrate owner, EventPriority priority, Class evtClass, Consumer listener) { if (owner.getModEventBus() == null) { if (!waitingModListeners.contains(owner, evtClass)) { @@ -40,7 +41,7 @@ public static void addModListener(AbstractRegis seenModBus = true; for (var waitingListener : waitingModListeners.row(owner).entrySet()) { for (var pair : waitingListener.getValue()) { - //noinspection unchecked + // noinspection unchecked OneTimeEventReceiver.addListener(owner.getModEventBus(), pair.getKey(), (Class) waitingListener.getKey(), (Consumer) pair.getValue()); } } @@ -48,20 +49,20 @@ public static void addModListener(AbstractRegis } OneTimeEventReceiver.addListener(owner.getModEventBus(), priority, evtClass, listener); } - + public static void addForgeListener(Class evtClass, Consumer listener) { OneTimeEventReceiver.addForgeListener(EventPriority.NORMAL, evtClass, listener); } - + public static void addForgeListener(EventPriority priority, Class evtClass, Consumer listener) { OneTimeEventReceiver.addListener(NeoForge.EVENT_BUS, priority, evtClass, listener); } - + @Deprecated public static void addListener(IEventBus bus, Class evtClass, Consumer listener) { OneTimeEventReceiver.addListener(bus, EventPriority.NORMAL, evtClass, listener); } - + @SuppressWarnings("unchecked") @Deprecated public static void addListener(IEventBus bus, EventPriority priority, Class evtClass, Consumer listener) { diff --git a/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java b/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java index 02fdad1..9df76e1 100644 --- a/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java +++ b/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java @@ -6,6 +6,7 @@ import java.util.function.Supplier; public class RegistrateDistExecutor { + public static void unsafeRunWhenOn(Dist dist, Supplier toRun) { if (dist == FMLEnvironment.getDist()) { toRun.get().run(); diff --git a/src/main/java/com/modularmc/registrate/util/Sequence.java b/src/main/java/com/modularmc/registrate/util/Sequence.java index 36e02b8..d06aa81 100644 --- a/src/main/java/com/modularmc/registrate/util/Sequence.java +++ b/src/main/java/com/modularmc/registrate/util/Sequence.java @@ -3,19 +3,21 @@ import java.util.function.Supplier; public class Sequence { - - public static Sequence create() { return new Sequence<>(); } - + + public static Sequence create() { + return new Sequence<>(); + } + public Sequence run(Runnable toRun) { toRun.run(); return this; } - + public Sequence next(Supplier val) { val.get(); return this; } - + public Sequence next(T val) { return this; } diff --git a/src/main/java/com/modularmc/registrate/util/entry/BlockEntityEntry.java b/src/main/java/com/modularmc/registrate/util/entry/BlockEntityEntry.java index b3df910..269c64b 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/BlockEntityEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/BlockEntityEntry.java @@ -1,9 +1,5 @@ package com.modularmc.registrate.util.entry; -import java.util.Optional; - -import org.jspecify.annotations.Nullable; - import com.modularmc.registrate.AbstractRegistrate; import net.minecraft.core.BlockPos; @@ -13,6 +9,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.registries.DeferredHolder; +import org.jspecify.annotations.Nullable; + +import java.util.Optional; + public class BlockEntityEntry extends RegistryEntry, BlockEntityType> { public BlockEntityEntry(AbstractRegistrate owner, DeferredHolder, BlockEntityType> delegate) { @@ -21,7 +21,7 @@ public BlockEntityEntry(AbstractRegistrate owner, DeferredHolder get(BlockGetter world, BlockPos pos) { return Optional.ofNullable(getNullable(world, pos)); @@ -54,11 +55,11 @@ public Optional get(BlockGetter world, BlockPos pos) { /** * Get an instance of this {@link BlockEntity} from the world. - * + * * @param world - * The world to look for the instance in + * The world to look for the instance in * @param pos - * The position of the instance + * The position of the instance * @return The instance, if it exists and matches this type. Otherwise, {@code null}. */ @SuppressWarnings("unchecked") diff --git a/src/main/java/com/modularmc/registrate/util/entry/BlockEntry.java b/src/main/java/com/modularmc/registrate/util/entry/BlockEntry.java index 93fa36d..14623e3 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/BlockEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/BlockEntry.java @@ -19,7 +19,7 @@ public BlockState getDefaultState() { public boolean has(BlockState state) { return is(state.getBlock()); } - + public static BlockEntry cast(RegistryEntry entry) { return RegistryEntry.cast(BlockEntry.class, entry); } diff --git a/src/main/java/com/modularmc/registrate/util/entry/EntityEntry.java b/src/main/java/com/modularmc/registrate/util/entry/EntityEntry.java index 03bfc9e..cab5ebd 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/EntityEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/EntityEntry.java @@ -1,6 +1,7 @@ package com.modularmc.registrate.util.entry; import com.modularmc.registrate.AbstractRegistrate; + import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySpawnReason; import net.minecraft.world.entity.EntityType; diff --git a/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java b/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java index bfe9d54..21bb5c0 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java @@ -1,13 +1,8 @@ package com.modularmc.registrate.util.entry; -import java.util.Optional; - -import org.jspecify.annotations.Nullable; - import com.modularmc.registrate.AbstractRegistrate; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.material.Fluid; @@ -15,6 +10,10 @@ import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.registries.DeferredHolder; +import org.jspecify.annotations.Nullable; + +import java.util.Optional; + public class FluidEntry extends RegistryEntry { private final @Nullable BlockEntry block; diff --git a/src/main/java/com/modularmc/registrate/util/entry/ItemEntry.java b/src/main/java/com/modularmc/registrate/util/entry/ItemEntry.java index 7d62366..6aa577e 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/ItemEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/ItemEntry.java @@ -10,7 +10,7 @@ public class ItemEntry extends ItemProviderEntry { public ItemEntry(AbstractRegistrate owner, DeferredHolder delegate) { super(owner, delegate); } - + public static ItemEntry cast(RegistryEntry entry) { return RegistryEntry.cast(ItemEntry.class, entry); } diff --git a/src/main/java/com/modularmc/registrate/util/entry/LazyRegistryEntry.java b/src/main/java/com/modularmc/registrate/util/entry/LazyRegistryEntry.java index 03fb6fb..afce5e8 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/LazyRegistryEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/LazyRegistryEntry.java @@ -1,9 +1,9 @@ package com.modularmc.registrate.util.entry; -import org.jspecify.annotations.Nullable; - import com.modularmc.registrate.util.nullness.NonNullSupplier; +import org.jspecify.annotations.Nullable; + public class LazyRegistryEntry implements NonNullSupplier { private @Nullable NonNullSupplier> supplier; @@ -12,7 +12,7 @@ public class LazyRegistryEntry implements NonNullSupplier { public LazyRegistryEntry(NonNullSupplier> supplier) { this.supplier = supplier; } - + @Override public T get() { NonNullSupplier> supplier = this.supplier; diff --git a/src/main/java/com/modularmc/registrate/util/entry/MenuEntry.java b/src/main/java/com/modularmc/registrate/util/entry/MenuEntry.java index 86576bc..de3ec28 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/MenuEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/MenuEntry.java @@ -1,13 +1,9 @@ package com.modularmc.registrate.util.entry; -import java.util.function.Consumer; - import com.modularmc.registrate.AbstractRegistrate; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.entity.player.Inventory; @@ -16,6 +12,8 @@ import net.minecraft.world.inventory.MenuType; import net.neoforged.neoforge.registries.DeferredHolder; +import java.util.function.Consumer; + public class MenuEntry extends RegistryEntry, MenuType> { public MenuEntry(AbstractRegistrate owner, DeferredHolder, MenuType> delegate) { diff --git a/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java b/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java index fa494a1..faf19d9 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java @@ -1,9 +1,5 @@ package com.modularmc.registrate.util.entry; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Predicate; - import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.nullness.NonNullSupplier; @@ -11,13 +7,19 @@ import net.minecraft.resources.ResourceKey; import net.neoforged.neoforge.registries.DeferredHolder; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Predicate; + /** - * Wraps a {@link net.neoforged.neoforge.registries.DeferredHolder}, providing a cleaner API with null-safe access, and registrate-specific extensions such as {@link #getSibling(ResourceKey)}. + * Wraps a {@link net.neoforged.neoforge.registries.DeferredHolder}, providing a cleaner API with null-safe access, and + * registrate-specific extensions such as {@link #getSibling(ResourceKey)}. * * @param * The type of the entry */ public class RegistryEntry extends DeferredHolder implements NonNullSupplier { + private final AbstractRegistrate owner; @SuppressWarnings("unused") @@ -33,18 +35,20 @@ public RegistryEntry getSibling(ResourceKey RegistryEntry getSibling(Registry registry) { + public RegistryEntry getSibling(Registry registry) { return getSibling(registry.key()); } /** - * If an entry is present, and the entry matches the given predicate, return an {@link Optional} describing the value, otherwise return an empty {@link Optional}. + * If an entry is present, and the entry matches the given predicate, return an {@link Optional} + * describing the value, otherwise return an empty {@link Optional}. * * @param predicate - * a {@link Predicate predicate} to apply to the entry, if present - * @return an {@link RegistryEntry} describing the value of this {@link RegistryEntry} if the entry is present and matches the given predicate, otherwise an empty {@link RegistryEntry} + * a {@link Predicate predicate} to apply to the entry, if present + * @return an {@link RegistryEntry} describing the value of this {@link RegistryEntry} if the entry is present and + * matches the given predicate, otherwise an empty {@link RegistryEntry} * @throws NullPointerException - * if the predicate is null + * if the predicate is null */ public Optional> filter(Predicate predicate) { Objects.requireNonNull(predicate); diff --git a/src/main/java/com/modularmc/registrate/util/entry/package-info.java b/src/main/java/com/modularmc/registrate/util/entry/package-info.java index cf367f4..ae489b8 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/package-info.java +++ b/src/main/java/com/modularmc/registrate/util/entry/package-info.java @@ -1,2 +1,9 @@ +/** + * Strongly-typed registry entry handles. + * + *

                + * These wrappers are the stable objects returned to downstream code after + * registration is declared through the builder layer. + */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.util.entry; diff --git a/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiConsumer.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiConsumer.java index ce4842e..033697e 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiConsumer.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiConsumer.java @@ -4,7 +4,7 @@ @FunctionalInterface public interface NonNullBiConsumer extends BiConsumer { - + @Override void accept(T t, U u); diff --git a/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiFunction.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiFunction.java index e087efe..eabc7d6 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiFunction.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullBiFunction.java @@ -4,7 +4,7 @@ @FunctionalInterface public interface NonNullBiFunction extends BiFunction { - + @Override R apply(T t, U u); } diff --git a/src/main/java/com/modularmc/registrate/util/nullness/NonNullConsumer.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullConsumer.java index 1e72035..8e23abf 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/NonNullConsumer.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullConsumer.java @@ -5,15 +5,18 @@ @FunctionalInterface public interface NonNullConsumer extends Consumer { - + @Override void accept(T t); - + default NonNullConsumer andThen(NonNullConsumer after) { Objects.requireNonNull(after); - return (T t) -> { accept(t); after.accept(t); }; + return (T t) -> { + accept(t); + after.accept(t); + }; } - + static NonNullConsumer noop() { return t -> {}; } diff --git a/src/main/java/com/modularmc/registrate/util/nullness/NonNullSupplier.java b/src/main/java/com/modularmc/registrate/util/nullness/NonNullSupplier.java index 576a711..b6cad27 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/NonNullSupplier.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NonNullSupplier.java @@ -7,14 +7,14 @@ @FunctionalInterface public interface NonNullSupplier extends Supplier { - + @Override T get(); static NonNullSupplier of(Supplier sup) { return of(sup, () -> "Unexpected null value from supplier"); } - + static NonNullSupplier of(Supplier sup, NonNullSupplier errorMsg) { return () -> { T res = sup.get(); diff --git a/src/main/java/com/modularmc/registrate/util/nullness/NullableSupplier.java b/src/main/java/com/modularmc/registrate/util/nullness/NullableSupplier.java index bfa8f12..351c051 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/NullableSupplier.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/NullableSupplier.java @@ -7,24 +7,25 @@ @Deprecated public interface NullableSupplier extends Supplier<@Nullable T> { - + @Override - @Nullable T get(); + @Nullable + T get(); default T getNonNull() { return getNonNull(() -> "Unexpected null value from supplier"); } - + default T getNonNull(NonNullSupplier errorMsg) { T res = get(); Objects.requireNonNull(res, errorMsg); return res; } - + default NonNullSupplier asNonNull() { return () -> getNonNull(); } - + default NonNullSupplier asNonNull(NonNullSupplier errorMsg) { return () -> getNonNull(errorMsg); } diff --git a/src/main/java/com/modularmc/registrate/util/nullness/package-info.java b/src/main/java/com/modularmc/registrate/util/nullness/package-info.java index 090602b..dda48a4 100644 --- a/src/main/java/com/modularmc/registrate/util/nullness/package-info.java +++ b/src/main/java/com/modularmc/registrate/util/nullness/package-info.java @@ -1,2 +1,9 @@ +/** + * Nullness-oriented functional helpers and package conventions. + * + *

                + * This package centralizes the functional interfaces and annotations used to + * keep the fluent API ergonomic while remaining explicit about null contracts. + */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.util.nullness; diff --git a/src/main/java/com/modularmc/registrate/util/package-info.java b/src/main/java/com/modularmc/registrate/util/package-info.java index 8dc3559..c63534a 100644 --- a/src/main/java/com/modularmc/registrate/util/package-info.java +++ b/src/main/java/com/modularmc/registrate/util/package-info.java @@ -1,2 +1,9 @@ +/** + * Shared runtime support utilities. + * + *

                + * Only cross-cutting helpers that are not clearly builder- or + * provider-specific should live here. + */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.util; diff --git a/src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java b/src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java index 5c6c073..7bed07c 100644 --- a/src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java +++ b/src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java @@ -1,6 +1,7 @@ package com.modularmc.registrate.test.gametests; import com.modularmc.registrate.test.mod.TestMod; + import net.neoforged.testframework.DynamicTest; import net.neoforged.testframework.annotation.ForEachTest; import net.neoforged.testframework.annotation.TestHolder; @@ -17,7 +18,6 @@ public static void ensureItemContent(final DynamicTest test) { test.onGameTest(helper -> helper.startSequence(() -> TestMod.instance().testitem.asStack()) .thenMap(stack -> stack.getHoverName().getString()) .thenExecute(name -> helper.assertValueEqual(name, "Testitem", "Test Item localized name")) - .thenSucceed() - ); + .thenSucceed()); } } diff --git a/src/test/java/com/modularmc/registrate/test/gametests/package-info.java b/src/test/java/com/modularmc/registrate/test/gametests/package-info.java new file mode 100644 index 0000000..7ab2d70 --- /dev/null +++ b/src/test/java/com/modularmc/registrate/test/gametests/package-info.java @@ -0,0 +1,5 @@ +/** + * Executable game tests that validate runtime behavior for the sample mod. + */ +@org.jspecify.annotations.NullMarked +package com.modularmc.registrate.test.gametests; diff --git a/src/test/java/com/modularmc/registrate/test/meta/MethodGenerator.java b/src/test/java/com/modularmc/registrate/test/meta/MethodGenerator.java index 9fa63ea..8d73b9b 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/MethodGenerator.java +++ b/src/test/java/com/modularmc/registrate/test/meta/MethodGenerator.java @@ -1,5 +1,12 @@ package com.modularmc.registrate.test.meta; +import com.modularmc.registrate.test.meta.ProtectedMethodScraper.Header; + +import com.google.common.collect.ImmutableList; +import lombok.RequiredArgsConstructor; +import lombok.Value; +import org.apache.commons.lang3.tuple.Pair; + import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -12,24 +19,15 @@ import java.util.ListIterator; import java.util.Set; -import org.apache.commons.lang3.tuple.Pair; - -import com.google.common.base.Charsets; -import com.google.common.collect.ImmutableList; -import com.modularmc.registrate.test.meta.ProtectedMethodScraper.Header; - -import lombok.RequiredArgsConstructor; -import lombok.Value; - @RequiredArgsConstructor public class MethodGenerator { - + @Value private class Exclusion { String name; String[] params; - + public boolean matches(Header header) { if (!header.getName().equals(this.name)) { return false; @@ -37,24 +35,24 @@ public boolean matches(Header header) { return this.params == null ? true : Arrays.equals(header.getParamTypes(), this.params); } } - + private static final String START_KEY = "// GENERATED START"; private static final String END_KEY = "// GENERATED END"; - + private final List> typeReplacements; private final Set excludes = new HashSet<>(); - + private final Class mainClass; - + public MethodGenerator(Class mainClass) { this(ImmutableList.of(), mainClass); } - + public MethodGenerator exclude(String name) { excludes.add(new Exclusion(name, null)); return this; } - + public MethodGenerator exclude(String name, String... paramTypes) { excludes.add(new Exclusion(name, paramTypes)); return this; diff --git a/src/test/java/com/modularmc/registrate/test/meta/ProtectedMethodScraper.java b/src/test/java/com/modularmc/registrate/test/meta/ProtectedMethodScraper.java index e84ad40..739833a 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/ProtectedMethodScraper.java +++ b/src/test/java/com/modularmc/registrate/test/meta/ProtectedMethodScraper.java @@ -1,5 +1,10 @@ package com.modularmc.registrate.test.meta; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.Value; +import org.apache.commons.lang3.tuple.Pair; + import java.time.Instant; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; @@ -12,14 +17,9 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import org.apache.commons.lang3.tuple.Pair; - -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; -import lombok.Value; - /** - * Scrapes all protected methods from pasted source, and emits them as public super-calling stubs. Used to create the bouncer classes such as BuilderModelProvider. + * Scrapes all protected methods from pasted source, and emits them as public super-calling stubs. Used to create the + * bouncer classes such as BuilderModelProvider. */ public class ProtectedMethodScraper { @@ -34,7 +34,7 @@ public static class Header { String name; String[] paramTypes; String[] paramNames; - + public Header applyTypeReplacement(Pair repl) { String[] newParamTypes = Arrays.copyOf(paramTypes, paramTypes.length); for (int i = 0; i < newParamTypes.length; i++) { @@ -53,7 +53,7 @@ public String printStubMethod(Class source) { base.append("@Override\n"); } base.append("@Generated(value = \"").append(source.getName()).append("\", date = \"") - .append(DateTimeFormatter.RFC_1123_DATE_TIME.format(Instant.now().atZone(ZoneOffset.UTC))).append("\")\n"); + .append(DateTimeFormatter.RFC_1123_DATE_TIME.format(Instant.now().atZone(ZoneOffset.UTC))).append("\")\n"); base.append("public ").append(isStatic ? "static " : ""); if (generics != null) { base.append(generics).append(" "); @@ -75,7 +75,7 @@ public String printStubMethod(Class source) { return base.toString(); } - // Match generics up to three levels deep -- java does not support recursive patterns + // Match generics up to three levels deep -- java does not support recursive patterns private static final Pattern HEADER_PATTERN = Pattern.compile("^\\s*protected\\s+(?:(static)\\s)?\\s*(<[^<>]+(?:<[^<>]+(?:<[^<>]+>[^<>]*)*>[^<>]*)*>)?\\s*(\\S+)\\s+(\\S+)\\((.+)\\)\\s\\{$"); private static final Pattern PARAM_PATTERN = Pattern.compile("([a-zA-Z_][\\w.$]+(?:<.+>)?)\\s+(\\S+)"); diff --git a/src/test/java/com/modularmc/registrate/test/meta/UpdateBlockLootTables.java b/src/test/java/com/modularmc/registrate/test/meta/UpdateBlockLootTables.java index 73ace91..83e9cdf 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/UpdateBlockLootTables.java +++ b/src/test/java/com/modularmc/registrate/test/meta/UpdateBlockLootTables.java @@ -4,9 +4,9 @@ import java.nio.file.Paths; public class UpdateBlockLootTables { - + public static void main(String[] args) throws IOException { new MethodGenerator(UpdateBlockLootTables.class) - .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateBlockLootTables.java")); + .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateBlockLootTables.java")); } } diff --git a/src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java b/src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java index cc51649..b441f03 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java +++ b/src/test/java/com/modularmc/registrate/test/meta/UpdateEntityLootTables.java @@ -4,10 +4,10 @@ import java.nio.file.Paths; public class UpdateEntityLootTables { - + public static void main(String[] args) throws IOException { new MethodGenerator(UpdateEntityLootTables.class) - .exclude("isNonLiving").exclude("getKnownEntities") - .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateEntityLootTables.java")); + .exclude("isNonLiving").exclude("getKnownEntities") + .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "loot", "RegistrateEntityLootTables.java")); } } diff --git a/src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java b/src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java index d3f1644..105799f 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java +++ b/src/test/java/com/modularmc/registrate/test/meta/UpdateRecipeProvider.java @@ -4,10 +4,10 @@ import java.nio.file.Paths; public class UpdateRecipeProvider { - + public static void main(String[] args) throws IOException { new MethodGenerator(UpdateRecipeProvider.class) - .exclude("buildCraftingRecipes") - .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "generators", "RegistrateRecipeProvider.java")); + .exclude("buildCraftingRecipes") + .generate(Paths.get("src", "main", "java", "com", "tterrag", "registrate", "providers", "generators", "RegistrateRecipeProvider.java")); } } diff --git a/src/test/java/com/modularmc/registrate/test/meta/package-info.java b/src/test/java/com/modularmc/registrate/test/meta/package-info.java index 236adc4..150891c 100644 --- a/src/test/java/com/modularmc/registrate/test/meta/package-info.java +++ b/src/test/java/com/modularmc/registrate/test/meta/package-info.java @@ -1,2 +1,8 @@ +/** + * Maintenance helpers for generated bridge methods and protected API snapshots. + * + *

                + * These tests support source upkeep rather than runtime game behavior. + */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.test.meta; diff --git a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java index 20c1cfd..f0d3500 100644 --- a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java +++ b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java @@ -1,8 +1,5 @@ package com.modularmc.registrate.test.mod; -import com.google.common.annotations.VisibleForTesting; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.modularmc.registrate.Registrate; import com.modularmc.registrate.builders.BlockBuilder; import com.modularmc.registrate.providers.DataGenContext; @@ -10,6 +7,7 @@ import com.modularmc.registrate.providers.generators.RegistrateItemModelGenerator; import com.modularmc.registrate.util.DataIngredient; import com.modularmc.registrate.util.entry.*; + import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementType; import net.minecraft.advancements.criterion.InventoryChangeTrigger; @@ -104,15 +102,20 @@ import net.neoforged.testframework.conf.Feature; import net.neoforged.testframework.conf.FrameworkConfiguration; import net.neoforged.testframework.impl.MutableTestFramework; + +import com.google.common.annotations.VisibleForTesting; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; import org.lwjgl.glfw.GLFW; -import javax.annotation.Nullable; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; +import javax.annotation.Nullable; + @Mod(TestMod.MOD_ID) public class TestMod { @@ -163,6 +166,7 @@ public TestBlockEntity(BlockEntityType type, BlockPos } private static class TestBlockEntityRenderer implements BlockEntityRenderer { + private final ItemModelResolver itemModelResolver; public TestBlockEntityRenderer(BlockEntityRendererProvider.Context ctx) { @@ -189,6 +193,7 @@ public void submit(RenderState state, PoseStack poseStack, SubmitNodeCollector s } private static class RenderState extends BlockEntityRenderState { + private final ItemStackRenderState item = new ItemStackRenderState(); } } @@ -221,12 +226,12 @@ private static class TestCustomRegistryEntry {} @VisibleForTesting public final ItemEntry testitem = registrate.object("testitem") .item(Item::new) - .onRegister(item -> sawCallback.set(true)) - .properties(p -> p.food(new FoodProperties.Builder().nutrition(1).saturationModifier(0.2f).build())) - .tag(ItemTags.BEDS) + .onRegister(item -> sawCallback.set(true)) + .properties(p -> p.food(new FoodProperties.Builder().nutrition(1).saturationModifier(0.2f).build())) + .tag(ItemTags.BEDS) .model(() -> (ctx, prov) -> prov.createWithExistingModel(ctx.getEntry(), prov.mcLoc("block/stone"))) - .tab(testcreativetab.getKey(), (ctx, modifier) -> modifier.accept(ctx)) - .register(); + .tab(testcreativetab.getKey(), (ctx, modifier) -> modifier.accept(ctx)) + .register(); @VisibleForTesting public final EntityEntry testduplicatename = registrate.object("testitem") @@ -239,42 +244,39 @@ private static class TestCustomRegistryEntry {} @VisibleForTesting public final BlockEntry testblock = registrate.object("testblock") .block(TestBlock::new) - .properties(p -> p.noOcclusion()) + .properties(p -> p.noOcclusion()) .blockstate(() -> (ctx, prov) -> prov.create(ctx.getEntry(), prov.getBuilder().transformTemplate(template -> template - .parent(prov.mcLoc("block/glass")) - ).build(ctx.getEntry()) - )) - .transform(TestMod::applyDiamondDrop) - .recipe((ctx, prov) -> { - prov.shaped(RecipeCategory.MISC, ctx.getEntry()) - .pattern("DDD").pattern("DED").pattern("DDD") - .define('D', Items.DIAMOND) - .define('E', Items.EGG) - .unlockedBy("has_egg", prov.has(Items.EGG)) - .save(prov); - - prov.food(DataIngredient.items(ctx), RecipeCategory.MISC, CookingBookCategory.MISC, () -> Blocks.DIAMOND_BLOCK, 1f); - }) - .tag(BlockTags.SUPPORTS_BAMBOO, BlockTags.DRAGON_IMMUNE) - .tag(BlockTags.WITHER_IMMUNE) - .color(() -> () -> List.of(BlockTintSources.constant(0xFFFF0000))) - .item() + .parent(prov.mcLoc("block/glass"))).build(ctx.getEntry()))) + .transform(TestMod::applyDiamondDrop) + .recipe((ctx, prov) -> { + prov.shaped(RecipeCategory.MISC, ctx.getEntry()) + .pattern("DDD").pattern("DED").pattern("DDD") + .define('D', Items.DIAMOND) + .define('E', Items.EGG) + .unlockedBy("has_egg", prov.has(Items.EGG)) + .save(prov); + + prov.food(DataIngredient.items(ctx), RecipeCategory.MISC, CookingBookCategory.MISC, () -> Blocks.DIAMOND_BLOCK, 1f); + }) + .tag(BlockTags.SUPPORTS_BAMBOO, BlockTags.DRAGON_IMMUNE) + .tag(BlockTags.WITHER_IMMUNE) + .color(() -> () -> List.of(BlockTintSources.constant(0xFFFF0000))) + .item() .model(() -> Client::testBlockModel) - .build() - .blockEntity(TestBlockEntity::new) - .renderer(() -> TestBlockEntityRenderer::new) - .build() - .register(); + .build() + .blockEntity(TestBlockEntity::new) + .renderer(() -> TestBlockEntityRenderer::new) + .build() + .register(); @VisibleForTesting public final BlockEntry magicItemModelTest = registrate.object("magic_item_model") .block(Block::new) - .blockstate(() -> (ctx, prov) -> - prov.create(ctx.getEntry(), prov.getBuilder() - .transformTemplate(t -> t - .parent(prov.mcLoc("block/gold_block")) - ).build(prov.modLoc("block/subfolder/" + ctx.getName())))) + .blockstate(() -> (ctx, prov) -> prov.create(ctx.getEntry(), prov.getBuilder() + .transformTemplate(t -> t + .parent(prov.mcLoc("block/gold_block"))) + .build(prov.modLoc("block/subfolder/" + ctx.getName())))) .simpleItem() .register(); @@ -290,7 +292,7 @@ private static class TestCustomRegistryEntry {} .attributes(Pig::createAttributes) .renderer(() -> PigRenderer::new) .spawnPlacement(SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR) - //TODO <1.21.4> .defaultSpawnEgg(0xFF0000, 0x00FF00) + // TODO <1.21.4> .defaultSpawnEgg(0xFF0000, 0x00FF00) .loot((prov, type) -> prov.add(type, LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1)) @@ -303,7 +305,7 @@ private static class TestCustomRegistryEntry {} @VisibleForTesting public final BlockEntityEntry testblockentity = registrate.object("testblockentity") .blockEntity(TestDummyBlockEntity::new) - .validBlock(() -> Blocks.DIRT)//TODO <1.21.4> now empty valid block is not allowed + .validBlock(() -> Blocks.DIRT)// TODO <1.21.4> now empty valid block is not allowed .register(); @VisibleForTesting @@ -311,67 +313,71 @@ private static class TestCustomRegistryEntry {} .fluid( Identifier.withDefaultNamespace("block/water_flow"), Identifier.withDefaultNamespace("block/lava_still"), - FluidType::new) + FluidType::new) .properties(p -> p.lightLevel(15).canConvertToSource(true)) .noBucket() -// .bucket() -// .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), prov.mcLoc("item/water_bucket"))) -// .build() + // .bucket() + // .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), prov.mcLoc("item/water_bucket"))) + // .build() .register(); @VisibleForTesting public final MenuEntry testmenu = registrate.object("testmenu") .menu((type, windowId, inv) -> new ChestMenu(type, windowId, inv, new SimpleContainer(9 * 9), 9), () -> ContainerScreen::new) .register(); - -// private final RegistryEntry testbiome = registrate.object("testbiome") -// .biome(TestBiome::new) -// .properties(b -> b.category(Category.PLAINS) -// .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.getDefaultState(), Blocks.COBBLESTONE.getDefaultState(), Blocks.CLAY.getDefaultState())) -// .precipitation(RainType.RAIN) -// .depth(1) -// .scale(1) -// .temperature(1) -// .downfall(1) -// .waterColor(0x3f76e4) -// .waterFogColor(0x050533)) -// .typeWeight(BiomeType.WARM, 1000) -// .addDictionaryTypes(BiomeDictionary.Type.LUSH) -// .forceAutomaticDictionaryTypes() -// .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.BAMBOO, new ProbabilityConfig(0), () -> Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(20)) -// .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.ICE_SPIKE, () -> Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(100)) -// .addFeatures(DefaultBiomeFeatures::addVeryDenseGrass) -// .addCarver(Carving.AIR, () -> WorldCarver.CAVE, new ProbabilityConfig(0.1F)) -// .addSpawn(EntityClassification.CREATURE, () -> EntityType.IRON_GOLEM, 1, 2, 3) -// .addSpawn(EntityClassification.CREATURE, testentity, 1, 4, 8) -// .register(); -// -// private final RegistryEntry testbiome2 = registrate.object("testbiome2") -// .biome(TestBiome::new) -// .properties(b -> b.category(Category.DESERT) -// .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.SAND.getDefaultState(), Blocks.RED_SANDSTONE.getDefaultState(), Blocks.GRAVEL.getDefaultState())) -// .precipitation(RainType.NONE) -// .depth(1) -// .scale(1) -// .temperature(1) -// .downfall(1) -// .waterColor(0x3f76e4) -// .waterFogColor(0x050533)) -// .typeWeight(BiomeType.DESERT, 1000) -// .addDictionaryTypes(BiomeDictionary.Type.DRY) -// .forceAutomaticDictionaryTypes() -// .copyFeatures(() -> Biomes.DESERT) -// .copyCarvers(() -> Biomes.DESERT) -// .copySpawns(() -> Biomes.DESERT) -// .register(); -// -// private @Nullable DimensionType testdimensiontype; -// private final RegistryEntry testdimension = registrate.object("testdimension") -// .dimension(OverworldDimension::new) -// .hasSkyLight(false) -// .keepLoaded(false) -// .dimensionTypeCallback(t -> testdimensiontype = t) -// .register(); + + // private final RegistryEntry testbiome = registrate.object("testbiome") + // .biome(TestBiome::new) + // .properties(b -> b.category(Category.PLAINS) + // .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.getDefaultState(), + // Blocks.COBBLESTONE.getDefaultState(), Blocks.CLAY.getDefaultState())) + // .precipitation(RainType.RAIN) + // .depth(1) + // .scale(1) + // .temperature(1) + // .downfall(1) + // .waterColor(0x3f76e4) + // .waterFogColor(0x050533)) + // .typeWeight(BiomeType.WARM, 1000) + // .addDictionaryTypes(BiomeDictionary.Type.LUSH) + // .forceAutomaticDictionaryTypes() + // .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.BAMBOO, new ProbabilityConfig(0), () -> + // Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(20)) + // .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.ICE_SPIKE, () -> Placement.COUNT_HEIGHTMAP_DOUBLE, new + // FrequencyConfig(100)) + // .addFeatures(DefaultBiomeFeatures::addVeryDenseGrass) + // .addCarver(Carving.AIR, () -> WorldCarver.CAVE, new ProbabilityConfig(0.1F)) + // .addSpawn(EntityClassification.CREATURE, () -> EntityType.IRON_GOLEM, 1, 2, 3) + // .addSpawn(EntityClassification.CREATURE, testentity, 1, 4, 8) + // .register(); + // + // private final RegistryEntry testbiome2 = registrate.object("testbiome2") + // .biome(TestBiome::new) + // .properties(b -> b.category(Category.DESERT) + // .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.SAND.getDefaultState(), + // Blocks.RED_SANDSTONE.getDefaultState(), Blocks.GRAVEL.getDefaultState())) + // .precipitation(RainType.NONE) + // .depth(1) + // .scale(1) + // .temperature(1) + // .downfall(1) + // .waterColor(0x3f76e4) + // .waterFogColor(0x050533)) + // .typeWeight(BiomeType.DESERT, 1000) + // .addDictionaryTypes(BiomeDictionary.Type.DRY) + // .forceAutomaticDictionaryTypes() + // .copyFeatures(() -> Biomes.DESERT) + // .copyCarvers(() -> Biomes.DESERT) + // .copySpawns(() -> Biomes.DESERT) + // .register(); + // + // private @Nullable DimensionType testdimensiontype; + // private final RegistryEntry testdimension = registrate.object("testdimension") + // .dimension(OverworldDimension::new) + // .hasSkyLight(false) + // .keepLoaded(false) + // .dimensionTypeCallback(t -> testdimensiontype = t) + // .register(); @VisibleForTesting public final ResourceKey> CUSTOM_REGISTRY = registrate.makeRegistry("custom", RegistryBuilder::new); @@ -379,9 +385,9 @@ private static class TestCustomRegistryEntry {} public final RegistryEntry testcustom = registrate.object("testcustom") .simple(CUSTOM_REGISTRY, TestCustomRegistryEntry::new); -// private final BlockBuilder INVALID_TEST = registrate.object("invalid") -// .block(Block::new) -// .addLayer(() -> RenderType::getTranslucent); + // private final BlockBuilder INVALID_TEST = registrate.object("invalid") + // .block(Block::new) + // .addLayer(() -> RenderType::getTranslucent); private static BlockBuilder applyDiamondDrop(BlockBuilder builder) { return builder.loot((prov, block) -> prov.dropOther(block, Items.DIAMOND)); @@ -401,11 +407,11 @@ public TestMod(IEventBus eventBus, ModContainer container) { registrate.addLang("item", testitem.getId(), "testextra", "Magic!"); registrate.addDataGenerator(ProviderType.ADVANCEMENT, adv -> { Advancement.Builder.advancement() - .addCriterion("has_egg", InventoryChangeTrigger.TriggerInstance.hasItems(Items.EGG)) - .display(Items.EGG, - adv.title(registrate.getModid(), "root", "Test Advancement"), adv.desc(registrate.getModid(), "root", "Get an egg."), - Identifier.withDefaultNamespace("textures/gui/advancements/backgrounds/stone.png"), AdvancementType.TASK, true, true, false) - .save(adv, registrate.getModid() + ":root"); + .addCriterion("has_egg", InventoryChangeTrigger.TriggerInstance.hasItems(Items.EGG)) + .display(Items.EGG, + adv.title(registrate.getModid(), "root", "Test Advancement"), adv.desc(registrate.getModid(), "root", "Get an egg."), + Identifier.withDefaultNamespace("textures/gui/advancements/backgrounds/stone.png"), AdvancementType.TASK, true, true, false) + .save(adv, registrate.getModid() + ":root"); }); registrate.addDataGenerator(ProviderType.GENERIC_SERVER, provider -> provider.add(data -> { // generic server side provider to generate custom dimension @@ -435,8 +441,7 @@ public TestMod(IEventBus eventBus, ModContainer container) { /* ambientLight */ 0F, new DimensionType.MonsterSettings( /* monsterSpawnLightTest */ UniformInt.of(0, 7), - /* monsterSpawnBlockLightLimit */ 0 - ), + /* monsterSpawnBlockLightLimit */ 0), DimensionType.Skybox.OVERWORLD, CardinalLighting.Type.DEFAULT, EnvironmentAttributeMap.builder() @@ -452,9 +457,7 @@ public TestMod(IEventBus eventBus, ModContainer container) { .set(EnvironmentAttributes.AMBIENT_SOUNDS, AmbientSounds.LEGACY_CAVE_SETTINGS) .build(), context.lookup(Registries.TIMELINE).getOrThrow(TimelineTags.IN_OVERWORLD), - Optional.of(context.lookup(Registries.WORLD_CLOCK).getOrThrow(WorldClocks.OVERWORLD)) - ) - )) + Optional.of(context.lookup(Registries.WORLD_CLOCK).getOrThrow(WorldClocks.OVERWORLD))))) // register custom dimension for the dimension type // simple single biome (plains) dimension .add(Registries.LEVEL_STEM, context -> { @@ -468,13 +471,9 @@ public TestMod(IEventBus eventBus, ModContainer container) { testDimensionType, new NoiseBasedChunkGenerator( new FixedBiomeSource(plains), - overworldNoiseSettings - ) - ) - ); + overworldNoiseSettings))); }), - Set.of("testmod") - ); + Set.of("testmod")); })); eventBus.addListener(this::onCommonSetup); @@ -509,10 +508,13 @@ private void onCommonSetup(FMLCommonSetupEvent event) { testblockitem.is(Items.STONE); testblockbe.is(BlockEntityType.CHEST); // testbiome.is(Feature.BAMBOO); // should not compile - if (testfluid.get().getBucket() != Items.AIR) throw new IllegalStateException("Expected no bucket for test fluid"); // should not crash + if (testfluid.get().getBucket() != Items.AIR) throw new IllegalStateException("Expected no bucket for test fluid"); // should + // not + // crash } private static class Client { + private static void testBlockModel(DataGenContext ctx, RegistrateItemModelGenerator prov) { prov.generateTintedModel(ctx.get(), prov.mcLoc("item/egg"), new Constant(0xFFFF0000)); } diff --git a/src/test/java/com/modularmc/registrate/test/mod/package-info.java b/src/test/java/com/modularmc/registrate/test/mod/package-info.java index daff0b1..c111488 100644 --- a/src/test/java/com/modularmc/registrate/test/mod/package-info.java +++ b/src/test/java/com/modularmc/registrate/test/mod/package-info.java @@ -1,2 +1,5 @@ +/** + * Sample mod sources used as an integration harness for the public API. + */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.test.mod; From a6434430bb970cab0654a42c32552eeac345748a Mon Sep 17 00:00:00 2001 From: qiuye2024github Date: Wed, 29 Apr 2026 16:25:53 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=EF=BC=8C=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 2 +- README.md | 79 ++---- build.gradle | 11 +- docs/architecture.md | 16 +- gradle/scripts/moddevgradle.gradle | 16 +- .../6dd307acdcaf85ca0b575df3e45c623e9cdab759 | 31 --- .../testmod/blockstates/magic_item_model.json | 7 - .../assets/testmod/blockstates/testblock.json | 7 - .../assets/testmod/blockstates/testfluid.json | 7 - .../testmod/items/magic_item_model.json | 6 - .../assets/testmod/items/testblock.json | 12 - .../assets/testmod/items/testitem.json | 6 - .../resources/assets/testmod/lang/en_ud.json | 15 -- .../resources/assets/testmod/lang/en_us.json | 15 -- .../block/subfolder/magic_item_model.json | 3 - .../testmod/models/block/testblock.json | 4 - .../tags/block/bamboo_plantable_on.json | 5 - .../minecraft/tags/block/dragon_immune.json | 5 - .../minecraft/tags/block/wither_immune.json | 5 - .../minecraft/tags/entity_type/raiders.json | 5 - .../data/minecraft/tags/item/beds.json | 5 - ...diamond_block_from_testblock_campfire.json | 32 --- ...diamond_block_from_testblock_smelting.json | 32 --- .../diamond_block_from_testblock_smoking.json | 32 --- .../advancement/recipes/misc/testblock.json | 32 --- .../data/testmod/advancement/root.json | 33 --- .../testmod/dimension/test_dimension.json | 11 - .../dimension_type/test_dimension_type.json | 24 -- .../loot_table/blocks/magic_item_model.json | 21 -- .../testmod/loot_table/blocks/testblock.json | 21 -- .../loot_table/entities/testentity.json | 36 --- .../testmod/loot_table/entities/testitem.json | 4 - ...diamond_block_from_testblock_campfire.json | 11 - ...diamond_block_from_testblock_smelting.json | 11 - .../diamond_block_from_testblock_smoking.json | 11 - .../data/testmod/recipe/testblock.json | 17 -- .../registrate/AbstractRegistrate.java | 235 ++++++++---------- .../modularmc/registrate/RegistrateLib.java | 14 +- .../registrate/builders/BlockBuilder.java | 41 +-- .../builders/BlockEntityBuilder.java | 6 +- .../registrate/builders/EntityBuilder.java | 8 +- .../registrate/builders/FluidBuilder.java | 11 +- .../registrate/builders/ItemBuilder.java | 30 +-- .../registrate/builders/MenuBuilder.java | 6 +- .../builders/{ => base}/AbstractBuilder.java | 4 +- .../builders/{ => base}/Builder.java | 21 +- .../builders/{ => base}/BuilderCallback.java | 2 +- .../builders/{ => base}/NoConfigBuilder.java | 2 +- .../builders/base/package-info.java | 5 + .../registrate/builders/package-info.java | 8 +- .../internal/RegistrationTracker.java | 228 +++++++++++++++++ .../event}/OneTimeEventReceiver.java | 76 +++--- .../internal/event/package-info.java | 6 + .../lifecycle/RegistrateLifecycle.java | 74 ++++++ .../internal/lifecycle/package-info.java | 6 + .../registrate/internal/package-info.java | 9 + .../{ => internal}/util/DebugMarkers.java | 14 +- .../util/RegistrateDistExecutor.java | 6 +- .../internal/util/package-info.java | 5 + .../modularmc/registrate/package-info.java | 2 +- .../registrate/providers/DataGenContext.java | 2 +- .../registrate/providers/GeneratorType.java | 3 - .../RegistrateAdvancementProvider.java | 2 + .../providers/RegistrateDataMapProvider.java | 4 +- .../providers/RegistrateDatapackProvider.java | 1 + .../providers/RegistrateGenericProvider.java | 10 +- .../providers/RegistrateItemTagsProvider.java | 26 +- .../providers/RegistrateLangProvider.java | 2 + .../providers/RegistrateTagsProvider.java | 2 + .../{ => core}/DataProviderInitializer.java | 4 +- .../providers/core/GeneratorType.java | 3 + .../providers/{ => core}/ProviderType.java | 66 ++--- .../{ => core}/RegistrateDataProvider.java | 7 +- .../RegistrateLookupFillerProvider.java | 2 +- .../{ => core}/RegistrateProvider.java | 2 +- .../RegistrateProviderDelegate.java | 2 +- .../providers/core/package-info.java | 6 + .../RegistrateBlockModelGenerator.java | 2 +- .../RegistrateItemModelGenerator.java | 2 +- .../generators/RegistrateModelProvider.java | 2 +- .../generators/RegistrateRecipeProvider.java | 2 +- .../generators/RegistrateRecipeRunner.java | 2 +- .../loot/RegistrateLootTableProvider.java | 4 +- .../registrate/providers/package-info.java | 7 +- .../registrate/util/DataIngredient.java | 2 +- .../modularmc/registrate/util/Sequence.java | 24 -- .../registrate/util/entry/FluidEntry.java | 12 +- .../registrate/util/entry/RegistryEntry.java | 11 +- .../registrate/util/package-info.java | 8 +- .../test/gametests/CustomItemTests.java | 5 +- .../gametests/RegistrationRuntimeTests.java | 43 ++++ .../registrate/test/mod/TestMod.java | 102 ++------ .../resources/META-INF/neoforge.mods.toml | 7 + 93 files changed, 810 insertions(+), 978 deletions(-) delete mode 100644 src/generated/resources/.cache/6dd307acdcaf85ca0b575df3e45c623e9cdab759 delete mode 100644 src/generated/resources/assets/testmod/blockstates/magic_item_model.json delete mode 100644 src/generated/resources/assets/testmod/blockstates/testblock.json delete mode 100644 src/generated/resources/assets/testmod/blockstates/testfluid.json delete mode 100644 src/generated/resources/assets/testmod/items/magic_item_model.json delete mode 100644 src/generated/resources/assets/testmod/items/testblock.json delete mode 100644 src/generated/resources/assets/testmod/items/testitem.json delete mode 100644 src/generated/resources/assets/testmod/lang/en_ud.json delete mode 100644 src/generated/resources/assets/testmod/lang/en_us.json delete mode 100644 src/generated/resources/assets/testmod/models/block/subfolder/magic_item_model.json delete mode 100644 src/generated/resources/assets/testmod/models/block/testblock.json delete mode 100644 src/generated/resources/data/minecraft/tags/block/bamboo_plantable_on.json delete mode 100644 src/generated/resources/data/minecraft/tags/block/dragon_immune.json delete mode 100644 src/generated/resources/data/minecraft/tags/block/wither_immune.json delete mode 100644 src/generated/resources/data/minecraft/tags/entity_type/raiders.json delete mode 100644 src/generated/resources/data/minecraft/tags/item/beds.json delete mode 100644 src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_campfire.json delete mode 100644 src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smelting.json delete mode 100644 src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smoking.json delete mode 100644 src/generated/resources/data/testmod/advancement/recipes/misc/testblock.json delete mode 100644 src/generated/resources/data/testmod/advancement/root.json delete mode 100644 src/generated/resources/data/testmod/dimension/test_dimension.json delete mode 100644 src/generated/resources/data/testmod/dimension_type/test_dimension_type.json delete mode 100644 src/generated/resources/data/testmod/loot_table/blocks/magic_item_model.json delete mode 100644 src/generated/resources/data/testmod/loot_table/blocks/testblock.json delete mode 100644 src/generated/resources/data/testmod/loot_table/entities/testentity.json delete mode 100644 src/generated/resources/data/testmod/loot_table/entities/testitem.json delete mode 100644 src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_campfire.json delete mode 100644 src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smelting.json delete mode 100644 src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smoking.json delete mode 100644 src/generated/resources/data/testmod/recipe/testblock.json rename src/main/java/com/modularmc/registrate/builders/{ => base}/AbstractBuilder.java (98%) rename src/main/java/com/modularmc/registrate/builders/{ => base}/Builder.java (93%) rename src/main/java/com/modularmc/registrate/builders/{ => base}/BuilderCallback.java (98%) rename src/main/java/com/modularmc/registrate/builders/{ => base}/NoConfigBuilder.java (93%) create mode 100644 src/main/java/com/modularmc/registrate/builders/base/package-info.java create mode 100644 src/main/java/com/modularmc/registrate/internal/RegistrationTracker.java rename src/main/java/com/modularmc/registrate/{util => internal/event}/OneTimeEventReceiver.java (56%) create mode 100644 src/main/java/com/modularmc/registrate/internal/event/package-info.java create mode 100644 src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java create mode 100644 src/main/java/com/modularmc/registrate/internal/lifecycle/package-info.java create mode 100644 src/main/java/com/modularmc/registrate/internal/package-info.java rename src/main/java/com/modularmc/registrate/{ => internal}/util/DebugMarkers.java (68%) rename src/main/java/com/modularmc/registrate/{ => internal}/util/RegistrateDistExecutor.java (69%) create mode 100644 src/main/java/com/modularmc/registrate/internal/util/package-info.java delete mode 100644 src/main/java/com/modularmc/registrate/providers/GeneratorType.java rename src/main/java/com/modularmc/registrate/providers/{ => core}/DataProviderInitializer.java (95%) create mode 100644 src/main/java/com/modularmc/registrate/providers/core/GeneratorType.java rename src/main/java/com/modularmc/registrate/providers/{ => core}/ProviderType.java (71%) rename src/main/java/com/modularmc/registrate/providers/{ => core}/RegistrateDataProvider.java (94%) rename src/main/java/com/modularmc/registrate/providers/{ => core}/RegistrateLookupFillerProvider.java (82%) rename src/main/java/com/modularmc/registrate/providers/{ => core}/RegistrateProvider.java (77%) rename src/main/java/com/modularmc/registrate/providers/{ => core}/RegistrateProviderDelegate.java (82%) create mode 100644 src/main/java/com/modularmc/registrate/providers/core/package-info.java delete mode 100644 src/main/java/com/modularmc/registrate/util/Sequence.java create mode 100644 src/test/java/com/modularmc/registrate/test/gametests/RegistrationRuntimeTests.java diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a6647d..03c6997 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,6 +29,6 @@ ## Maintenance Notes -- `RegistrateLib` is a fork metadata/constants holder, not a NeoForge mod entrypoint. +- `RegistrateLib` is the library mod entrypoint for the fork and also holds shared metadata/constants. - `src/test/java/com/modularmc/registrate/test/meta` contains maintenance helpers for generated bridge methods. - When upstream Registrate changes, update implementation classes first and then re-verify package ownership against `docs/architecture.md`. diff --git a/README.md b/README.md index 496acdd..693928a 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ This repository is the `com.modularmc.registrate` fork maintained for the Modula - Use `Java 25` for local builds and IDE sync. - Prefer the bundled IDEA run configurations: `Client`, `Server`, `Data Generation`, `Game Tests`, and `Game Tests (Client)`. -- Keep fluent registration APIs in `builders`, data generation orchestration in `providers`, and shared runtime helpers in `util`. +- Keep fluent registration APIs in `builders`, data generation orchestration in `providers`, public reusable helpers in `util`, and implementation plumbing in `internal`. - Treat [`docs/architecture.md`](docs/architecture.md) as the source of truth for package responsibilities and extension points. - See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the day-to-day development workflow. @@ -21,9 +21,13 @@ This repository is the `com.modularmc.registrate` fork maintained for the Modula - `com.modularmc.registrate.providers`: data generation orchestration and provider lifecycle management. - `com.modularmc.registrate.providers.generators`: blockstate, model, and recipe generator adapters. - `com.modularmc.registrate.providers.loot`: loot-table focused provider wrappers. -- `com.modularmc.registrate.util`: runtime helpers that support event wiring, dist handling, and shared utility behavior. +- `com.modularmc.registrate.util`: public shared helpers that remain part of the reusable library surface. - `com.modularmc.registrate.util.entry`: strongly-typed registry handles returned by builders. - `com.modularmc.registrate.util.nullness`: null-safe functional helpers and package defaults. +- `com.modularmc.registrate.internal`: non-API implementation details extracted from the core runtime. +- `com.modularmc.registrate.internal.event`: one-shot event wiring used by builders and registration lifecycle hooks. +- `com.modularmc.registrate.internal.lifecycle`: per-instance lifecycle bridges that keep NeoForge event hookups centralized without collapsing multiple mods into one shared runtime. +- `com.modularmc.registrate.internal.util`: dist-gated execution and internal logging helpers. - `com.modularmc.registrate.test.mod`: an integration-style sample mod that exercises the public API. - `com.modularmc.registrate.test.gametests`: executable validation scenarios for runtime behavior. - `com.modularmc.registrate.test.meta`: maintenance utilities that keep generated bridge methods aligned with upstream APIs. @@ -34,7 +38,7 @@ This repository is the `com.modularmc.registrate` fork maintained for the Modula - Simple fluent API - Open to extension, build and register custom objects and data - Automatic data generation with sane defaults -- Shadeable, contains no mod, only code +- Usable as a standalone NeoForge library mod and as a declared dependency for downstream mods ## How to Use @@ -91,70 +95,25 @@ To get an overview of the different APIs and methods, check out the [Javadocs](h ## Project Setup -Registrate can be installed in the mods folder as a typical dependency, but since it does not have a mod, it can also be pre-packaged into your mod. You can do this by making use of Forges Jar-in-Jar system. +For this `26.1` fork, the preferred integration model is to depend on Registrate as a normal NeoForge library mod and declare it as a required dependency in your own metadata. Bundling remains possible for tightly controlled distributions, but standalone dependency loading is the default posture for this branch. -[See here for more info on Forges Jar-in-Jar system](https://forge.gemwire.uk/wiki/Jar-in-jar). - -To get started you **MUST** enable the Jar-in-Jar system, you can do this by adding the following code anywhere in your build script: - -```gradle -jarJar.enable() -``` - -Then, make sure the jarJar artifact is reobfuscated. - -```groovy -reobf { - jarJar { } -} - -tasks.jarJar.finalizedBy('reobfJarJar') -``` - -Finally, the dependency itself must be added. First add my maven repository, - -```groovy -repositories { - maven { // Registrate - url "https://maven.tterrag.com/" - } - mavenLocal() -} -``` - -and then the Registrate dependency to the implementation and jarJar configurations. +Add the library to your Gradle dependencies: ```groovy dependencies { - minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" // This should alread - - // MC- - implementation fg.deobf("com.tterrag.registrate:Registrate:MC1.19.3-1.1.6") - // [MC,MC) - jarJar(group: 'com.tterrag.registrate', name: 'Registrate', version: "[MC1.19.3,MC1.20)") + implementation "com.modularmc.registrate:registrate:${registrate_version}" } ``` -

                - -Additional JarJar Note -By default the jar containing your mod & registrate will have a `-all` suffix and the normal jar file will not contain registrate. -You would want to share around this `-all` jar, as that contains registrate and any other libs you have pre-packaged. +Then declare `registrate` as a required dependency in your `neoforge.mods.toml`: -You can change this though with the following code, this changes the `-all` jar to no longer have a suffix, and the default main jar to be given a `-slim` suffix. -Essentially swapping the 2 jars [_you now would want to share the jar with no suffix appended_]. - -```groovy -tasks.jarJar.configure { - // remove '-all' from jarJar jar file - classifier '' -} - -jar { - // this now conflicts with jarJar as filenames are the same - // append a `-slim` to this jar, as this jar contains no pre-packaged libs - classifier 'slim' -} +```toml +[[dependencies.yourmodid]] +modId="registrate" +type="required" +versionRange="[2.0.0,)" +ordering="AFTER" +side="BOTH" ``` -
                +If you intentionally embed the library instead of loading it as a separate mod, keep your packaging and metadata strategy explicit so downstream debugging still has a clear ownership boundary. diff --git a/build.gradle b/build.gradle index cd19a67..9d87c46 100644 --- a/build.gradle +++ b/build.gradle @@ -78,7 +78,10 @@ apply from: "$rootDir/gradle/scripts/spotless.gradle" tasks.withType(JavaCompile).configureEach { options.encoding = "UTF-8" options.compilerArgs << "-Xlint:-removal" - options.compilerArgs << "-Aquiet=true" // Suppress mixin notes +} + +tasks.named('test') { + failOnNoDiscoveredTests = false } lombok { @@ -89,6 +92,10 @@ jacoco { applyTo runGameTestServer } +tasks.named('runGameTestServer') { + jacoco.excludes = ['com.mojang.*', 'net.minecraft.*', 'net.neoforged.*'] +} + jacocoTestReport { doFirst { try { @@ -114,4 +121,4 @@ jacocoTestReport { fileTree(dir: it, exclude: '**/mixins/**') })) } -} \ No newline at end of file +} diff --git a/docs/architecture.md b/docs/architecture.md index 70252fa..795436c 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -10,7 +10,7 @@ - Public entrypoints. - `AbstractRegistrate` is the orchestration core. - `Registrate` is the default public implementation. - - `RegistrateLib` is a fork metadata/constants holder used by this repository. + - `RegistrateLib` is the NeoForge library entrypoint for this fork and also exposes shared metadata/constants. - `com.modularmc.registrate.builders` - Public-facing fluent registration DSL. - Owns object construction rules and builder chaining behavior. @@ -21,11 +21,19 @@ - `com.modularmc.registrate.providers.loot` - Loot-specific provider wrappers and compatibility helpers. - `com.modularmc.registrate.util` - - Shared runtime helpers for one-time events, distribution checks, sequencing, and misc support code. + - Shared downstream-facing runtime and data helpers that remain part of the reusable library surface. - `com.modularmc.registrate.util.entry` - Strongly-typed handles returned from registrations. - `com.modularmc.registrate.util.nullness` - Functional interfaces and package-level nullness conventions. +- `com.modularmc.registrate.internal` + - Non-public state trackers and implementation support types extracted from the central core. +- `com.modularmc.registrate.internal.event` + - One-shot mod event wiring used to bridge builder callbacks onto the NeoForge mod bus. +- `com.modularmc.registrate.internal.lifecycle` + - Per-instance lifecycle bridges that centralize `RegisterEvent`, creative-tab, and datagen bus wiring without introducing a shared global core. +- `com.modularmc.registrate.internal.util` + - Dist-gated execution and internal debug logging helpers. - `com.modularmc.registrate.test.mod` - Sample mod used as an integration harness. - `com.modularmc.registrate.test.gametests` @@ -43,6 +51,8 @@ Treat the root package plus `builders` and `util.entry` as the main downstream-f - New datagen orchestration belongs in `providers`. - Generator-specific helpers belong in `providers.generators` or `providers.loot`. - Cross-cutting runtime support belongs in `util` only when it is not builder- or provider-specific. +- Event-bus plumbing and other implementation-only helpers belong under `internal`. +- Instance-scoped NeoForge lifecycle orchestration belongs in `internal.lifecycle`. - Test-only scaffolding belongs under `src/test/java` even if it mirrors production APIs. ## Modernization Principles @@ -50,4 +60,4 @@ Treat the root package plus `builders` and `util.entry` as the main downstream-f - Prefer explicit package ownership over convenience placement. - Keep public entrypoints small and push complexity into focused layers. - Document extension points where downstream mods are expected to integrate. -- Preserve upstream compatibility where possible, but keep fork-specific behavior clearly identified. +- Favor 26.1-native structure over preserving legacy compatibility on this dev branch. diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle index 02735d0..cd01e86 100644 --- a/gradle/scripts/moddevgradle.gradle +++ b/gradle/scripts/moddevgradle.gradle @@ -4,6 +4,8 @@ static def isJetBrainsRuntime() { return System.getProperty('java.vm.vendor').contains('JetBrains') } +def devTestModId = 'testmod' + neoForge { version = libs.versions.neoForge.get() @@ -30,10 +32,12 @@ neoForge { "${mod_id}" { sourceSet(sourceSets.main) sourceSet(sourceSets.client) - sourceSet(sourceSets.test) sourceSet(sourceSets.extra) sourceSet(sourceSets.clientExtra) } + "${devTestModId}" { + sourceSet(sourceSets.test) + } } runs { @@ -44,7 +48,7 @@ neoForge { gameDirectory.set(file('run/client')) - systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) + systemProperty('neoforge.enabledGameTestNamespaces', devTestModId) } server { @@ -54,7 +58,7 @@ neoForge { gameDirectory.set(file('run/server')) programArguments.addAll('--nogui', '--world', 'world-extra') - systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) + systemProperty('neoforge.enabledGameTestNamespaces', devTestModId) } // This run config launches GameTestServer and runs all registered gametests, then exits. @@ -66,7 +70,7 @@ neoForge { ideName = "Game Tests" gameDirectory.set(file('run/gametest/server')) - systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) + systemProperty('neoforge.enabledGameTestNamespaces', devTestModId) environment('TEST', 'true') } @@ -76,14 +80,14 @@ neoForge { ideName = "Game Tests (Client)" gameDirectory.set(file('run/gametest/client')) - systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) + systemProperty('neoforge.enabledGameTestNamespaces', devTestModId) environment('TEST', 'true') } data { clientData() serverData() - sourceSet = sourceSets.main + sourceSet = sourceSets.test ideName = "Data Generation" gameDirectory.set(file('run/data')) diff --git a/src/generated/resources/.cache/6dd307acdcaf85ca0b575df3e45c623e9cdab759 b/src/generated/resources/.cache/6dd307acdcaf85ca0b575df3e45c623e9cdab759 deleted file mode 100644 index 97e77e8..0000000 --- a/src/generated/resources/.cache/6dd307acdcaf85ca0b575df3e45c623e9cdab759 +++ /dev/null @@ -1,31 +0,0 @@ -// 1.21.8 2025-07-20T09:09:50.09422877 Registrate Provider for testmod [Registries, Data Maps, , Advancements, Loot Tables, Tags (blocks), Tags (enchantments), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Model Definitions - testmod, Lang (en_us/en_ud), generic_client_provider] -353e0134b90278ff49840165bed05cb48e7fff1b assets/testmod/blockstates/magic_item_model.json -bc6ecd9ef8452b21567c005ab9c626c54a1beeaa assets/testmod/blockstates/testblock.json -069fa0cc9495cbad97a129b3e39bd0bdf0599b28 assets/testmod/blockstates/testfluid.json -f89300065873b3d7b9ce32afdc50aa054bf394c9 assets/testmod/items/magic_item_model.json -9a69e68a4d502233127cbf455882bfccf73db0f7 assets/testmod/items/testblock.json -1e6a2105bb914bd0e1433b408fde3c456245968a assets/testmod/items/testitem.json -5499519c3582b4dd1d88f0b713926b60d52ffed0 assets/testmod/lang/en_ud.json -ecccfddb2cc9cdf08dbfbc93f0c9bbe2440d1fa9 assets/testmod/lang/en_us.json -b3c7ac87f735c9813d09ee46f1d26c844c06353c assets/testmod/models/block/subfolder/magic_item_model.json -226ecfcb53fb775aa96f550dcc41bc44c026127f assets/testmod/models/block/testblock.json -6cde7304ac9429b0ea7e01078b4846b1cac6a0c8 data/minecraft/tags/block/bamboo_plantable_on.json -6cde7304ac9429b0ea7e01078b4846b1cac6a0c8 data/minecraft/tags/block/dragon_immune.json -6cde7304ac9429b0ea7e01078b4846b1cac6a0c8 data/minecraft/tags/block/wither_immune.json -ed4dc1c2e1c580f129c041ffd8fcfae1424366a2 data/minecraft/tags/entity_type/raiders.json -e9cec2088093803c7eb2f88bd11693cd261a8e41 data/minecraft/tags/item/beds.json -23c099bc7a19249c4e3c653b0e2a5090dd78d617 data/testmod/advancement/recipes/misc/diamond_block_from_testblock_campfire.json -de60acb72ee4d5ae78269c08778cc1261b4bf7a5 data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smelting.json -680c921a5c8f490f55bd2b2164d7044d452cec94 data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smoking.json -3b6b7ae16a271d643be2ae05627864c6d25eab6a data/testmod/advancement/recipes/misc/testblock.json -4669bf929a45d650a4f519adc826e8a942f1aaa7 data/testmod/advancement/root.json -d1031daf0999a74446a7fc78f202681ba1e0e5e3 data/testmod/dimension/test_dimension.json -dc1c2f11ffaf60cde9e564118738945b3b967d7d data/testmod/dimension_type/test_dimension_type.json -ee89292168589e280e0ebaa8cb184635f91d0751 data/testmod/loot_table/blocks/magic_item_model.json -fbce6908b10760b8883cd088752816f73cb3c6d2 data/testmod/loot_table/blocks/testblock.json -95c566cb5ec0e92933483b2efd54057bb20ca2e2 data/testmod/loot_table/entities/testentity.json -0e7acafac1d515be8f28a317bc805c9316b84885 data/testmod/loot_table/entities/testitem.json -ba7aae9b2d1f1f0db23b0a5fbeb7cbf17393637a data/testmod/recipe/diamond_block_from_testblock_campfire.json -44c7940ed2c86b9ae6dceeaa5238517234152acf data/testmod/recipe/diamond_block_from_testblock_smelting.json -ae2c31b1bfb26c30f22e719233d8803d7c379f5b data/testmod/recipe/diamond_block_from_testblock_smoking.json -930cf260794fb6190e614a0a47f12c0e82df3ce6 data/testmod/recipe/testblock.json diff --git a/src/generated/resources/assets/testmod/blockstates/magic_item_model.json b/src/generated/resources/assets/testmod/blockstates/magic_item_model.json deleted file mode 100644 index 0ad4a59..0000000 --- a/src/generated/resources/assets/testmod/blockstates/magic_item_model.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "testmod:block/subfolder/magic_item_model" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/testmod/blockstates/testblock.json b/src/generated/resources/assets/testmod/blockstates/testblock.json deleted file mode 100644 index 1b893f3..0000000 --- a/src/generated/resources/assets/testmod/blockstates/testblock.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "testmod:block/testblock" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/testmod/blockstates/testfluid.json b/src/generated/resources/assets/testmod/blockstates/testfluid.json deleted file mode 100644 index 791eb00..0000000 --- a/src/generated/resources/assets/testmod/blockstates/testfluid.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "testmod:block/testfluid" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/testmod/items/magic_item_model.json b/src/generated/resources/assets/testmod/items/magic_item_model.json deleted file mode 100644 index 8f0f7e8..0000000 --- a/src/generated/resources/assets/testmod/items/magic_item_model.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "testmod:block/subfolder/magic_item_model" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/testmod/items/testblock.json b/src/generated/resources/assets/testmod/items/testblock.json deleted file mode 100644 index 0f2f576..0000000 --- a/src/generated/resources/assets/testmod/items/testblock.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "minecraft:item/egg", - "tints": [ - { - "type": "minecraft:constant", - "value": -65536 - } - ] - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/testmod/items/testitem.json b/src/generated/resources/assets/testmod/items/testitem.json deleted file mode 100644 index f5c9f2a..0000000 --- a/src/generated/resources/assets/testmod/items/testitem.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "minecraft:block/stone" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/testmod/lang/en_ud.json b/src/generated/resources/assets/testmod/lang/en_ud.json deleted file mode 100644 index 8766a5a..0000000 --- a/src/generated/resources/assets/testmod/lang/en_ud.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "advancements.testmod.root.description": "˙bbǝ uɐ ʇǝ⅁", - "advancements.testmod.root.title": "ʇuǝɯǝɔuɐʌpⱯ ʇsǝ⟘", - "block.testmod.magic_item_model": "ןǝpoW ɯǝʇI ɔıbɐW", - "block.testmod.testblock": "ʞɔoןqʇsǝ⟘", - "block.testmod.testfluid": "pınןɟʇsǝ⟘", - "entity.testmod.testentity": "ʎʇıʇuǝʇsǝ⟘", - "entity.testmod.testitem": "ɯǝʇıʇsǝ⟘", - "fluid.testmod.testfluid": "pınןɟʇsǝ⟘", - "item.testmod.testitem": "ɯǝʇıʇsǝ⟘", - "item.testmod.testitem.testextra": "¡ɔıbɐW", - "itemGroup.testmod.test_creative_mode_tab": "qɐ⟘ ǝpoW ǝʌıʇɐǝɹƆ ʇsǝ⟘", - "testmod.custom.lang": "ʇsǝ⟘", - "tooltip.testmod.testblock": "˙bbƎ" -} \ No newline at end of file diff --git a/src/generated/resources/assets/testmod/lang/en_us.json b/src/generated/resources/assets/testmod/lang/en_us.json deleted file mode 100644 index 1ee6645..0000000 --- a/src/generated/resources/assets/testmod/lang/en_us.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "advancements.testmod.root.description": "Get an egg.", - "advancements.testmod.root.title": "Test Advancement", - "block.testmod.magic_item_model": "Magic Item Model", - "block.testmod.testblock": "Testblock", - "block.testmod.testfluid": "Testfluid", - "entity.testmod.testentity": "Testentity", - "entity.testmod.testitem": "Testitem", - "fluid.testmod.testfluid": "Testfluid", - "item.testmod.testitem": "Testitem", - "item.testmod.testitem.testextra": "Magic!", - "itemGroup.testmod.test_creative_mode_tab": "Test Creative Mode Tab", - "testmod.custom.lang": "Test", - "tooltip.testmod.testblock": "Egg." -} \ No newline at end of file diff --git a/src/generated/resources/assets/testmod/models/block/subfolder/magic_item_model.json b/src/generated/resources/assets/testmod/models/block/subfolder/magic_item_model.json deleted file mode 100644 index f9cefd0..0000000 --- a/src/generated/resources/assets/testmod/models/block/subfolder/magic_item_model.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "minecraft:block/gold_block" -} \ No newline at end of file diff --git a/src/generated/resources/assets/testmod/models/block/testblock.json b/src/generated/resources/assets/testmod/models/block/testblock.json deleted file mode 100644 index 1e48d2b..0000000 --- a/src/generated/resources/assets/testmod/models/block/testblock.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parent": "minecraft:block/glass", - "render_type": "minecraft:cutout" -} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/bamboo_plantable_on.json b/src/generated/resources/data/minecraft/tags/block/bamboo_plantable_on.json deleted file mode 100644 index 185287b..0000000 --- a/src/generated/resources/data/minecraft/tags/block/bamboo_plantable_on.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "testmod:testblock" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/dragon_immune.json b/src/generated/resources/data/minecraft/tags/block/dragon_immune.json deleted file mode 100644 index 185287b..0000000 --- a/src/generated/resources/data/minecraft/tags/block/dragon_immune.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "testmod:testblock" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/wither_immune.json b/src/generated/resources/data/minecraft/tags/block/wither_immune.json deleted file mode 100644 index 185287b..0000000 --- a/src/generated/resources/data/minecraft/tags/block/wither_immune.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "testmod:testblock" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/entity_type/raiders.json b/src/generated/resources/data/minecraft/tags/entity_type/raiders.json deleted file mode 100644 index c064704..0000000 --- a/src/generated/resources/data/minecraft/tags/entity_type/raiders.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "testmod:testentity" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/item/beds.json b/src/generated/resources/data/minecraft/tags/item/beds.json deleted file mode 100644 index 8f30064..0000000 --- a/src/generated/resources/data/minecraft/tags/item/beds.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "testmod:testitem" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_campfire.json b/src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_campfire.json deleted file mode 100644 index 7c8f4ee..0000000 --- a/src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_campfire.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_testblock": { - "conditions": { - "items": [ - { - "items": "testmod:testblock" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "testmod:diamond_block_from_testblock_campfire" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_testblock" - ] - ], - "rewards": { - "recipes": [ - "testmod:diamond_block_from_testblock_campfire" - ] - } -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smelting.json b/src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smelting.json deleted file mode 100644 index bbbad68..0000000 --- a/src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smelting.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_testblock": { - "conditions": { - "items": [ - { - "items": "testmod:testblock" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "testmod:diamond_block_from_testblock_smelting" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_testblock" - ] - ], - "rewards": { - "recipes": [ - "testmod:diamond_block_from_testblock_smelting" - ] - } -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smoking.json b/src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smoking.json deleted file mode 100644 index 0cd3a34..0000000 --- a/src/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smoking.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_testblock": { - "conditions": { - "items": [ - { - "items": "testmod:testblock" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "testmod:diamond_block_from_testblock_smoking" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_testblock" - ] - ], - "rewards": { - "recipes": [ - "testmod:diamond_block_from_testblock_smoking" - ] - } -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/advancement/recipes/misc/testblock.json b/src/generated/resources/data/testmod/advancement/recipes/misc/testblock.json deleted file mode 100644 index 950b7cc..0000000 --- a/src/generated/resources/data/testmod/advancement/recipes/misc/testblock.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_egg": { - "conditions": { - "items": [ - { - "items": "minecraft:egg" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "testmod:testblock" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_egg" - ] - ], - "rewards": { - "recipes": [ - "testmod:testblock" - ] - } -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/advancement/root.json b/src/generated/resources/data/testmod/advancement/root.json deleted file mode 100644 index dbfcf07..0000000 --- a/src/generated/resources/data/testmod/advancement/root.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "criteria": { - "has_egg": { - "conditions": { - "items": [ - { - "items": "minecraft:egg" - } - ] - }, - "trigger": "minecraft:inventory_changed" - } - }, - "display": { - "background": "minecraft:textures/gui/advancements/backgrounds/stone.png", - "description": { - "translate": "advancements.testmod.root.description" - }, - "icon": { - "count": 1, - "id": "minecraft:egg" - }, - "title": { - "translate": "advancements.testmod.root.title" - } - }, - "requirements": [ - [ - "has_egg" - ] - ], - "sends_telemetry_event": true -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/dimension/test_dimension.json b/src/generated/resources/data/testmod/dimension/test_dimension.json deleted file mode 100644 index 06f6aa9..0000000 --- a/src/generated/resources/data/testmod/dimension/test_dimension.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "testmod:test_dimension_type", - "generator": { - "type": "minecraft:noise", - "biome_source": { - "type": "minecraft:fixed", - "biome": "minecraft:plains" - }, - "settings": "minecraft:overworld" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/dimension_type/test_dimension_type.json b/src/generated/resources/data/testmod/dimension_type/test_dimension_type.json deleted file mode 100644 index e1734d7..0000000 --- a/src/generated/resources/data/testmod/dimension_type/test_dimension_type.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "ambient_light": 0.0, - "bed_works": true, - "cloud_height": 192, - "coordinate_scale": 1.0, - "effects": "minecraft:overworld", - "has_ceiling": false, - "has_raids": true, - "has_skylight": true, - "height": 384, - "infiniburn": "#minecraft:infiniburn_overworld", - "logical_height": 384, - "min_y": -64, - "monster_spawn_block_light_limit": 0, - "monster_spawn_light_level": { - "type": "minecraft:uniform", - "max_inclusive": 7, - "min_inclusive": 0 - }, - "natural": true, - "piglin_safe": false, - "respawn_anchor_works": false, - "ultrawarm": false -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/loot_table/blocks/magic_item_model.json b/src/generated/resources/data/testmod/loot_table/blocks/magic_item_model.json deleted file mode 100644 index e94ddd4..0000000 --- a/src/generated/resources/data/testmod/loot_table/blocks/magic_item_model.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "testmod:magic_item_model" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "testmod:blocks/magic_item_model" -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/loot_table/blocks/testblock.json b/src/generated/resources/data/testmod/loot_table/blocks/testblock.json deleted file mode 100644 index ef4f7fc..0000000 --- a/src/generated/resources/data/testmod/loot_table/blocks/testblock.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:diamond" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "testmod:blocks/testblock" -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/loot_table/entities/testentity.json b/src/generated/resources/data/testmod/loot_table/entities/testentity.json deleted file mode 100644 index 3e34c66..0000000 --- a/src/generated/resources/data/testmod/loot_table/entities/testentity.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "type": "minecraft:entity", - "pools": [ - { - "bonus_rolls": 0.0, - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "add": false, - "count": { - "type": "minecraft:uniform", - "max": 3.0, - "min": 1.0 - }, - "function": "minecraft:set_count" - }, - { - "count": { - "type": "minecraft:uniform", - "max": 2.0, - "min": 0.0 - }, - "enchantment": "minecraft:looting", - "function": "minecraft:enchanted_count_increase" - } - ], - "name": "minecraft:diamond" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "testmod:entities/testentity" -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/loot_table/entities/testitem.json b/src/generated/resources/data/testmod/loot_table/entities/testitem.json deleted file mode 100644 index 058a463..0000000 --- a/src/generated/resources/data/testmod/loot_table/entities/testitem.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "minecraft:entity", - "random_sequence": "testmod:entities/testitem" -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_campfire.json b/src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_campfire.json deleted file mode 100644 index 834c308..0000000 --- a/src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_campfire.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "minecraft:campfire_cooking", - "category": "food", - "cookingtime": 600, - "experience": 1.0, - "ingredient": "testmod:testblock", - "result": { - "count": 1, - "id": "minecraft:diamond_block" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smelting.json b/src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smelting.json deleted file mode 100644 index 3776e89..0000000 --- a/src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smelting.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "minecraft:smelting", - "category": "blocks", - "cookingtime": 200, - "experience": 1.0, - "ingredient": "testmod:testblock", - "result": { - "count": 1, - "id": "minecraft:diamond_block" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smoking.json b/src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smoking.json deleted file mode 100644 index adfc2e2..0000000 --- a/src/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smoking.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "minecraft:smoking", - "category": "food", - "cookingtime": 100, - "experience": 1.0, - "ingredient": "testmod:testblock", - "result": { - "count": 1, - "id": "minecraft:diamond_block" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/testmod/recipe/testblock.json b/src/generated/resources/data/testmod/recipe/testblock.json deleted file mode 100644 index 93b250d..0000000 --- a/src/generated/resources/data/testmod/recipe/testblock.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "misc", - "key": { - "D": "minecraft:diamond", - "E": "minecraft:egg" - }, - "pattern": [ - "DDD", - "DED", - "DDD" - ], - "result": { - "count": 1, - "id": "testmod:testblock" - } -} \ No newline at end of file diff --git a/src/main/java/com/modularmc/registrate/AbstractRegistrate.java b/src/main/java/com/modularmc/registrate/AbstractRegistrate.java index ece27bf..4d921da 100644 --- a/src/main/java/com/modularmc/registrate/AbstractRegistrate.java +++ b/src/main/java/com/modularmc/registrate/AbstractRegistrate.java @@ -5,10 +5,14 @@ import com.modularmc.registrate.builders.MenuBuilder.ForgeMenuFactory; import com.modularmc.registrate.builders.MenuBuilder.MenuFactory; import com.modularmc.registrate.builders.MenuBuilder.ScreenFactory; +import com.modularmc.registrate.builders.base.*; +import com.modularmc.registrate.internal.RegistrationTracker; +import com.modularmc.registrate.internal.event.OneTimeEventReceiver; +import com.modularmc.registrate.internal.lifecycle.RegistrateLifecycle; +import com.modularmc.registrate.internal.util.DebugMarkers; import com.modularmc.registrate.providers.*; +import com.modularmc.registrate.providers.core.*; import com.modularmc.registrate.util.CreativeModeTabModifier; -import com.modularmc.registrate.util.DebugMarkers; -import com.modularmc.registrate.util.OneTimeEventReceiver; import com.modularmc.registrate.util.entry.ItemEntry; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.*; @@ -31,9 +35,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockBehaviour; -import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.IEventBus; -import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.data.event.GatherDataEvent; import net.neoforged.neoforge.data.loading.DatagenModLoader; @@ -42,13 +44,10 @@ import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.registries.*; -import com.google.common.base.Preconditions; import com.google.common.collect.*; import com.mojang.serialization.Codec; -import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; -import lombok.Value; import lombok.experimental.Accessors; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.tuple.Pair; @@ -61,7 +60,6 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.UnaryOperator; -import java.util.stream.Collectors; /** * Manages all registrations and data generators for a mod. @@ -92,55 +90,55 @@ @Log4j2 public abstract class AbstractRegistrate> { - @Value - private class Registration { + /** + * Checks if Minecraft is running from a dev environment. Enables certain debug logging. + * + * @return {@code true} when in a dev environment (specifically, {@link FMLEnvironment#isProduction()} == false) + */ + public static boolean isDevEnvironment() { + return !FMLEnvironment.isProduction(); + } - Identifier name; - ResourceKey> type; - NonNullSupplier creator; - RegistryEntry delegate; + private final class LifecycleHooks implements RegistrateLifecycle.Hooks { - @Getter(value = AccessLevel.NONE) - List> callbacks = new ArrayList<>(); + @Override + public @Nullable IEventBus modEventBus() { + return modEventBus; + } - Registration(Identifier name, ResourceKey> type, NonNullSupplier creator, NonNullFunction, ? extends RegistryEntry> entryFactory) { - this.name = name; - this.type = type; - this.creator = creator.lazy(); - this.delegate = entryFactory.apply(DeferredHolder.create(type, name)); + @Override + public void setModEventBus(IEventBus bus) { + modEventBus = bus; } - void register(RegisterEvent event) { - T entry = creator.get(); - event.register(type, rh -> rh.register(name, entry)); - callbacks.forEach(c -> c.accept(entry)); - callbacks.clear(); + @Override + public boolean doDatagen() { + return doDatagen.get(); } - void addRegisterCallback(NonNullConsumer callback) { - Preconditions.checkNotNull(callback, "Callback must not be null"); - callbacks.add(callback); + @Override + public void onRegister(RegisterEvent event) { + AbstractRegistrate.this.onRegister(event); } - } - /** - * Checks if Minecraft is running from a dev environment. Enables certain debug logging. - * - * @return {@code true} when in a dev environment (specifically, {@link FMLEnvironment#isProduction()} == false) - */ - public static boolean isDevEnvironment() { - return !FMLEnvironment.isProduction(); + @Override + public void onRegisterLate(RegisterEvent event) { + AbstractRegistrate.this.onRegisterLate(event); + } + + @Override + public void onBuildCreativeModeTabContents(BuildCreativeModeTabContentsEvent event) { + AbstractRegistrate.this.onBuildCreativeModeTabContents(event); + } + + @Override + public void onData(GatherDataEvent event) { + AbstractRegistrate.this.onData(event); + } } - private final Table>, String, Registration> registrations = HashBasedTable.create(); - /** - * Expected to be emptied by the time registration occurs, is emptied by - * {@link #accept(String, ResourceKey, Builder, NonNullSupplier, NonNullFunction)} - */ - private final Multimap>>, NonNullConsumer> registerCallbacks = HashMultimap.create(); - /** Entry-less callbacks that are invoked after the registry type has completely finished */ - private final Multimap>, Runnable> afterRegisterCallbacks = HashMultimap.create(); - private final Set>> completedRegistrations = new HashSet<>(); + private final RegistrationTracker registrationTracker; + private final RegistrateLifecycle lifecycle; private final Table>>, GeneratorType, Consumer> datagensByEntry = HashBasedTable.create(); private final ListMultimap, NonNullConsumer> datagens = ArrayListMultimap.create(); @@ -176,6 +174,8 @@ public static boolean isDevEnvironment() { */ protected AbstractRegistrate(String modid) { this.modid = modid; + this.registrationTracker = new RegistrationTracker(modid, log); + this.lifecycle = new RegistrateLifecycle(this, new LifecycleHooks()); } /** @@ -199,27 +199,7 @@ protected final S self() { * @return This {@link AbstractRegistrate} object */ public S registerEventListeners(IEventBus bus) { - if (this.modEventBus == null) { - this.modEventBus = bus; - } - - Consumer onRegister = this::onRegister; - Consumer onRegisterLate = this::onRegisterLate; - bus.addListener(onRegister); - bus.addListener(EventPriority.LOWEST, onRegisterLate); - bus.addListener(this::onBuildCreativeModeTabContents); // Fired multiple times when ever tabs need contents - // rebuilt (changing op tab perms for example) - - // Register events fire multiple times, so clean them up on common setup - OneTimeEventReceiver.addModListener(this, FMLCommonSetupEvent.class, $ -> { - OneTimeEventReceiver.unregister(this, onRegister, RegisterEvent.class); - OneTimeEventReceiver.unregister(this, onRegisterLate, RegisterEvent.class); - }); - - if (doDatagen.get()) { - OneTimeEventReceiver.addModListener(this, GatherDataEvent.Client.class, this::onData); - } - + lifecycle.register(bus); return self(); } @@ -233,35 +213,7 @@ public S registerEventListeners(IEventBus bus) { * registry type */ protected void onRegister(RegisterEvent event) { - ResourceKey> type = event.getRegistryKey(); - if (type == null) { - log.debug(DebugMarkers.REGISTER, "Skipping invalid registry with no supertype: " + event.getRegistryKey().identifier()); - return; - } - if (!registerCallbacks.isEmpty()) { - registerCallbacks.asMap().forEach((k, v) -> log.warn("Found {} unused register callback(s) for entry {} [{}]. Was the entry ever registered?", v.size(), k.getLeft(), k.getRight().identifier())); - registerCallbacks.clear(); - if (isDevEnvironment()) { - throw new IllegalStateException("Found unused register callbacks, see logs"); - } - } - Map> registrationsForType = registrations.row(type); - if (registrationsForType.size() > 0) { - log.trace(DebugMarkers.REGISTER, "({}) Registering {} known objects of type {}", getModid(), registrationsForType.size(), type.identifier()); - for (Entry> e : registrationsForType.entrySet()) { - try { - e.getValue().register(event); - log.trace(DebugMarkers.REGISTER, "Registered {} to registry {}", e.getValue().getName(), event.getRegistryKey().identifier()); - } catch (Exception ex) { - String err = "Unexpected error while registering entry " + e.getValue().getName() + " to registry " + event.getRegistryKey().identifier(); - if (skipErrors) { - log.error(DebugMarkers.REGISTER, err); - } else { - throw new RuntimeException(err, ex); - } - } - } - } + registrationTracker.onRegister(event, skipErrors, isDevEnvironment()); } /** @@ -275,11 +227,7 @@ protected void onRegister(RegisterEvent event) { * registry type */ protected void onRegisterLate(RegisterEvent event) { - ResourceKey> type = event.getRegistryKey(); - Collection callbacks = afterRegisterCallbacks.get(type); - callbacks.forEach(Runnable::run); - callbacks.clear(); - completedRegistrations.add(type); + registrationTracker.onRegisterLate(event); } /** @@ -385,7 +333,7 @@ public RegistryEntry get(ResourceKey RegistryEntry get(String name, ResourceKey> type) { - return this.getRegistration(name, type).getDelegate(); + return registrationTracker.get(name, type); } /** @@ -403,21 +351,7 @@ public RegistryEntry get(String name, ResourceKey Optional> getOptional(String name, ResourceKey> type) { - Registration reg = this.getRegistrationUnchecked(name, type); - return reg == null ? Optional.empty() : Optional.of(reg.getDelegate()); - } - - @SuppressWarnings("unchecked") - private @Nullable Registration getRegistrationUnchecked(String name, ResourceKey> type) { - return (Registration) registrations.get(type, name); - } - - private Registration getRegistration(String name, ResourceKey> type) { - Registration reg = this.getRegistrationUnchecked(name, type); - if (reg != null) { - return reg; - } - throw new IllegalArgumentException("Unknown registration " + name + " for type " + type.identifier()); + return registrationTracker.getOptional(name, type); } /** @@ -435,7 +369,7 @@ private Registration getRegistration(String name, Resourc */ @SuppressWarnings({ "null", "unchecked" }) public Collection> getAll(ResourceKey> type) { - return registrations.row(type).values().stream().map(r -> (RegistryEntry) r.getDelegate()).collect(Collectors.toList()); + return registrationTracker.getAll(type); } /** @@ -456,12 +390,7 @@ public Collection> getAll(ResourceKey S addRegisterCallback(String name, ResourceKey> registryType, NonNullConsumer callback) { - Registration reg = this.getRegistrationUnchecked(name, registryType); - if (reg == null) { - registerCallbacks.put(Pair.of(name, registryType), (NonNullConsumer) callback); - } else { - reg.addRegisterCallback(callback); - } + registrationTracker.addRegisterCallback(name, registryType, callback); return self(); } @@ -478,7 +407,7 @@ public S addRegisterCallback(String name, ResourceKey S addRegisterCallback(ResourceKey> registryType, Runnable callback) { - afterRegisterCallbacks.put((ResourceKey>) registryType, callback); + registrationTracker.addAfterRegisterCallback(registryType, callback); return self(); } @@ -492,7 +421,7 @@ public S addRegisterCallback(ResourceKey> registryType * @return {@code true} iff the given registry has finished the registration step */ public boolean isRegistered(ResourceKey> registryType) { - return completedRegistrations.contains(registryType); + return registrationTracker.isRegistered(registryType); } /** @@ -536,6 +465,24 @@ public S setDataGenerator(Builder builder, GeneratorType + * The type of provider + * @param + * The registry type + * @param builder + * The builder for the entry + * @param type + * The {@link GeneratorType} to stop generating data for + * @return this {@link AbstractRegistrate} + */ + public S removeDataGenerator(Builder builder, GeneratorType type) { + return this.removeDataGenerator(builder.getName(), builder.getRegistryKey(), type); + } + /** * Mostly internal, sets the data generator for a certain entry/type combination. This will replace an existing data * gen callback if it exists. @@ -564,6 +511,32 @@ public S setDataGenerator(String entry, ResourceKey return addDataGenerator(type, cons); } + /** + * Mostly internal, removes the data generator for a certain entry/type combination if one was previously + * registered. + * + * @param

                + * The type of provider + * @param + * The registry type + * @param entry + * The name of the entry which the provider is for + * @param registryType + * The registry type of the entry + * @param type + * The {@link GeneratorType} to stop generating data for + * @return this {@link AbstractRegistrate} + */ + public S removeDataGenerator(String entry, ResourceKey> registryType, GeneratorType type) { + if (!doDatagen.get()) return self(); + @SuppressWarnings("null") + Consumer existing = datagensByEntry.remove(Pair.of(entry, registryType), type); + if (existing != null) { + datagens.remove(type, existing); + } + return self(); + } + /** * Add a data generator callback that is not associated with any entry, which can never replace an existing data * generator. @@ -901,15 +874,7 @@ public > S2 entry(String name * @return A {@link RegistryEntry} that will hold the created entry after registration is complete */ protected RegistryEntry accept(String name, ResourceKey> type, Builder builder, NonNullSupplier creator, NonNullFunction, ? extends RegistryEntry> entryFactory) { - Registration reg = new Registration<>(Identifier.fromNamespaceAndPath(modid, name), type, creator, entryFactory); - log.trace(DebugMarkers.REGISTER, "Captured registration for entry {}:{} of type {}", getModid(), name, type.identifier()); - registerCallbacks.removeAll(Pair.of(name, type)).forEach(callback -> { - @SuppressWarnings({ "unchecked", "null" }) - NonNullConsumer unsafeCallback = (NonNullConsumer) callback; - reg.addRegisterCallback(unsafeCallback); - }); - registrations.put(type, name, reg); - return reg.getDelegate(); + return registrationTracker.track(name, type, creator, entryFactory); } /** diff --git a/src/main/java/com/modularmc/registrate/RegistrateLib.java b/src/main/java/com/modularmc/registrate/RegistrateLib.java index 8d912b2..d411a40 100644 --- a/src/main/java/com/modularmc/registrate/RegistrateLib.java +++ b/src/main/java/com/modularmc/registrate/RegistrateLib.java @@ -1,18 +1,22 @@ package com.modularmc.registrate; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Random; /** - * Fork metadata and shared development constants for the ModularMCLib variant - * of Registrate. + * Runtime entrypoint and shared metadata for the ModularMCLib variant of + * Registrate. * *

                - * This class is intentionally not a NeoForge mod entrypoint. - * Runtime test entrypoints live under the dedicated {@code testmod} sources. + * This library is intended to load as its own NeoForge mod so downstream + * mods can depend on it as a prerequisite during development. */ +@Mod(RegistrateLib.MOD_ID) public final class RegistrateLib { public static final String MOD_ID = "registrate"; @@ -22,5 +26,5 @@ public final class RegistrateLib { public static final Random RANDOM = new Random(); - private RegistrateLib() {} + public RegistrateLib(IEventBus modEventBus) {} } diff --git a/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java b/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java index 1d9028b..01d0e6e 100644 --- a/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java @@ -2,16 +2,18 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.builders.BlockEntityBuilder.BlockEntityFactory; +import com.modularmc.registrate.builders.base.AbstractBuilder; +import com.modularmc.registrate.builders.base.BuilderCallback; +import com.modularmc.registrate.internal.event.OneTimeEventReceiver; +import com.modularmc.registrate.internal.util.RegistrateDistExecutor; import com.modularmc.registrate.providers.DataGenContext; -import com.modularmc.registrate.providers.GeneratorType; -import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.providers.RegistrateLangProvider; +import com.modularmc.registrate.providers.core.GeneratorType; +import com.modularmc.registrate.providers.core.ProviderType; import com.modularmc.registrate.providers.generators.RegistrateBlockModelGenerator; import com.modularmc.registrate.providers.generators.RegistrateRecipeProvider; import com.modularmc.registrate.providers.loot.RegistrateBlockLootTables; import com.modularmc.registrate.providers.loot.RegistrateLootTableProvider.LootType; -import com.modularmc.registrate.util.OneTimeEventReceiver; -import com.modularmc.registrate.util.RegistrateDistExecutor; import com.modularmc.registrate.util.entry.BlockEntry; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.NonNullBiConsumer; @@ -39,7 +41,6 @@ import org.jspecify.annotations.Nullable; import java.util.List; -import java.util.function.Function; import java.util.function.Supplier; import javax.annotation.Nonnull; @@ -171,8 +172,7 @@ public ItemBuilder> item() { */ public ItemBuilder> item(NonNullBiFunction factory) { return getOwner().>item(this, getName(), p -> factory.apply(getEntry(), p.useBlockDescriptionPrefix())) - .setData(ProviderType.LANG, NonNullBiConsumer.noop()) // FIXME Need a beetter API for "unsetting" - // providers + .removeData(ProviderType.LANG) .model(() -> (ctx, prov) -> { getOwner().getDataProvider(ProviderType.BLOCKSTATE) .map(g -> g.seenBlockstates.get(getEntry())) @@ -334,7 +334,7 @@ public BlockBuilder recipe(NonNullBiConsumer, Reg return setData(ProviderType.RECIPE, cons); } - private @Nullable Function>> clientExtensionFunc; + private @Nullable NonNullSupplier> clientExtension; /** * Register a client extension for this block. @@ -345,34 +345,17 @@ public BlockBuilder recipe(NonNullBiConsumer, Reg * @return this {@link BlockBuilder} */ public BlockBuilder clientExtension(NonNullSupplier> clientExtension) { - if (this.clientExtensionFunc == null) { + if (this.clientExtension == null) { RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::registerClientExtension); } - this.clientExtensionFunc = block -> clientExtension; - return this; - } - - /** - * Register a client extension for this block. - * The {@link IClientBlockExtensions} instance can be shared across many items. - * - * @param clientExtension - * The client extension to register for this block - * @return this {@link BlockBuilder} - */ - @Deprecated(forRemoval = true) - public BlockBuilder clientExtension(Function>> clientExtension) { - if (this.clientExtensionFunc == null) { - RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::registerClientExtension); - } - this.clientExtensionFunc = clientExtension; + this.clientExtension = clientExtension; return this; } protected void registerClientExtension() { OneTimeEventReceiver.addModListener(getOwner(), RegisterClientExtensionsEvent.class, e -> { - if (this.clientExtensionFunc != null) { - NonNullSupplier> clientExtension = this.clientExtensionFunc.apply(getEntry()); + NonNullSupplier> clientExtension = this.clientExtension; + if (clientExtension != null) { e.registerBlock(clientExtension.get().get(), getEntry()); } }); diff --git a/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java index 701a5e6..11635d5 100644 --- a/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/BlockEntityBuilder.java @@ -1,8 +1,10 @@ package com.modularmc.registrate.builders; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.util.OneTimeEventReceiver; -import com.modularmc.registrate.util.RegistrateDistExecutor; +import com.modularmc.registrate.builders.base.AbstractBuilder; +import com.modularmc.registrate.builders.base.BuilderCallback; +import com.modularmc.registrate.internal.event.OneTimeEventReceiver; +import com.modularmc.registrate.internal.util.RegistrateDistExecutor; import com.modularmc.registrate.util.entry.BlockEntityEntry; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.NonNullFunction; diff --git a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java index a6c6c0b..4dc11ad 100644 --- a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java @@ -1,13 +1,15 @@ package com.modularmc.registrate.builders; import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.builders.base.AbstractBuilder; +import com.modularmc.registrate.builders.base.BuilderCallback; +import com.modularmc.registrate.internal.event.OneTimeEventReceiver; +import com.modularmc.registrate.internal.util.RegistrateDistExecutor; import com.modularmc.registrate.providers.DataGenContext; -import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.providers.RegistrateLangProvider; +import com.modularmc.registrate.providers.core.ProviderType; import com.modularmc.registrate.providers.loot.RegistrateEntityLootTables; import com.modularmc.registrate.providers.loot.RegistrateLootTableProvider.LootType; -import com.modularmc.registrate.util.OneTimeEventReceiver; -import com.modularmc.registrate.util.RegistrateDistExecutor; import com.modularmc.registrate.util.entry.EntityEntry; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.NonNullBiConsumer; diff --git a/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java b/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java index 14d57f5..35a47c7 100644 --- a/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java @@ -1,11 +1,13 @@ package com.modularmc.registrate.builders; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.builders.base.AbstractBuilder; +import com.modularmc.registrate.builders.base.BuilderCallback; +import com.modularmc.registrate.internal.event.OneTimeEventReceiver; +import com.modularmc.registrate.internal.util.RegistrateDistExecutor; import com.modularmc.registrate.providers.RegistrateLangProvider; import com.modularmc.registrate.providers.RegistrateTagsProvider; -import com.modularmc.registrate.util.OneTimeEventReceiver; -import com.modularmc.registrate.util.RegistrateDistExecutor; +import com.modularmc.registrate.providers.core.ProviderType; import com.modularmc.registrate.util.entry.FluidEntry; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.*; @@ -578,10 +580,9 @@ private FluidType.Properties makeTypeProperties() { // This is done because we need to remove the lang data generator if using the block key, // and if it was possible to undo this change, it might result in the user translation getting // silently lost, as there's no good way to check whether the translation key was changed. - // TODO improve this? if (block.isPresent() && block.get().isBound()) { properties.descriptionId(block.get().get().getDescriptionId()); - setData(ProviderType.LANG, NonNullBiConsumer.noop()); + removeData(ProviderType.LANG); } else { properties.descriptionId(Util.makeDescriptionId("fluid", Identifier.fromNamespaceAndPath(getOwner().getModid(), sourceName))); } diff --git a/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java b/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java index 935323c..5a3b441 100644 --- a/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java @@ -1,15 +1,17 @@ package com.modularmc.registrate.builders; import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.builders.base.AbstractBuilder; +import com.modularmc.registrate.builders.base.BuilderCallback; +import com.modularmc.registrate.internal.event.OneTimeEventReceiver; +import com.modularmc.registrate.internal.util.RegistrateDistExecutor; import com.modularmc.registrate.providers.DataGenContext; -import com.modularmc.registrate.providers.GeneratorType; -import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.providers.RegistrateLangProvider; +import com.modularmc.registrate.providers.core.GeneratorType; +import com.modularmc.registrate.providers.core.ProviderType; import com.modularmc.registrate.providers.generators.RegistrateItemModelGenerator; import com.modularmc.registrate.providers.generators.RegistrateRecipeProvider; import com.modularmc.registrate.util.CreativeModeTabModifier; -import com.modularmc.registrate.util.OneTimeEventReceiver; -import com.modularmc.registrate.util.RegistrateDistExecutor; import com.modularmc.registrate.util.entry.ItemEntry; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.NonNullBiConsumer; @@ -36,7 +38,6 @@ import java.util.Map; import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Supplier; /** @@ -287,7 +288,7 @@ public ItemBuilder compostable(float chance) { return dataMap(NeoForgeDataMaps.COMPOSTABLES, new Compostable(chance)); } - private @Nullable Function>> clientExtensionFunc; + private @Nullable NonNullSupplier> clientExtension; /** * Register a client extension for this item. The {@link IClientItemExtensions} instance can be shared across many @@ -298,26 +299,17 @@ public ItemBuilder compostable(float chance) { * @return this {@link ItemBuilder} */ public ItemBuilder clientExtension(NonNullSupplier> clientExtension) { - if (this.clientExtensionFunc == null) { + if (this.clientExtension == null) { RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::registerClientExtension); } - this.clientExtensionFunc = item -> clientExtension; - return this; - } - - @Deprecated(forRemoval = true) - public ItemBuilder clientExtension(Function>> clientExtension) { - if (this.clientExtensionFunc == null) { - RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::registerClientExtension); - } - this.clientExtensionFunc = clientExtension; + this.clientExtension = clientExtension; return this; } protected void registerClientExtension() { OneTimeEventReceiver.addModListener(getOwner(), RegisterClientExtensionsEvent.class, e -> { - if (this.clientExtensionFunc != null) { - NonNullSupplier> clientExtension = this.clientExtensionFunc.apply(getEntry()); + NonNullSupplier> clientExtension = this.clientExtension; + if (clientExtension != null) { e.registerItem(clientExtension.get().get(), getEntry()); } }); diff --git a/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java b/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java index d76914e..9b0b6d1 100644 --- a/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/MenuBuilder.java @@ -1,8 +1,10 @@ package com.modularmc.registrate.builders; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.util.OneTimeEventReceiver; -import com.modularmc.registrate.util.RegistrateDistExecutor; +import com.modularmc.registrate.builders.base.AbstractBuilder; +import com.modularmc.registrate.builders.base.BuilderCallback; +import com.modularmc.registrate.internal.event.OneTimeEventReceiver; +import com.modularmc.registrate.internal.util.RegistrateDistExecutor; import com.modularmc.registrate.util.entry.MenuEntry; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.NonNullSupplier; diff --git a/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java b/src/main/java/com/modularmc/registrate/builders/base/AbstractBuilder.java similarity index 98% rename from src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java rename to src/main/java/com/modularmc/registrate/builders/base/AbstractBuilder.java index e0e7d0b..d67442b 100644 --- a/src/main/java/com/modularmc/registrate/builders/AbstractBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/base/AbstractBuilder.java @@ -1,9 +1,9 @@ -package com.modularmc.registrate.builders; +package com.modularmc.registrate.builders.base; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.providers.ProviderType; import com.modularmc.registrate.providers.RegistrateLangProvider; import com.modularmc.registrate.providers.RegistrateTagsProvider; +import com.modularmc.registrate.providers.core.ProviderType; import com.modularmc.registrate.util.entry.LazyRegistryEntry; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.NonNullBiFunction; diff --git a/src/main/java/com/modularmc/registrate/builders/Builder.java b/src/main/java/com/modularmc/registrate/builders/base/Builder.java similarity index 93% rename from src/main/java/com/modularmc/registrate/builders/Builder.java rename to src/main/java/com/modularmc/registrate/builders/base/Builder.java index c1a4193..2d79248 100644 --- a/src/main/java/com/modularmc/registrate/builders/Builder.java +++ b/src/main/java/com/modularmc/registrate/builders/base/Builder.java @@ -1,9 +1,9 @@ -package com.modularmc.registrate.builders; +package com.modularmc.registrate.builders.base; import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.DataGenContext; -import com.modularmc.registrate.providers.GeneratorType; -import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.core.GeneratorType; +import com.modularmc.registrate.providers.core.ProviderType; import com.modularmc.registrate.util.entry.RegistryEntry; import com.modularmc.registrate.util.nullness.*; @@ -123,6 +123,21 @@ default S setData(GeneratorType type, NonNullBiConsumer + * The type of provider + * @param type + * The {@link GeneratorType} for the desired provider + * @return this builder + */ + @SuppressWarnings("unchecked") + default S removeData(GeneratorType type) { + getOwner().removeDataGenerator(this, type); + return (S) this; + } + /** * Add a data provider callback which will be invoked when the provider of the given type executes. *

                diff --git a/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java b/src/main/java/com/modularmc/registrate/builders/base/BuilderCallback.java similarity index 98% rename from src/main/java/com/modularmc/registrate/builders/BuilderCallback.java rename to src/main/java/com/modularmc/registrate/builders/base/BuilderCallback.java index 842f63d..ff40121 100644 --- a/src/main/java/com/modularmc/registrate/builders/BuilderCallback.java +++ b/src/main/java/com/modularmc/registrate/builders/base/BuilderCallback.java @@ -1,4 +1,4 @@ -package com.modularmc.registrate.builders; +package com.modularmc.registrate.builders.base; import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.entry.RegistryEntry; diff --git a/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java b/src/main/java/com/modularmc/registrate/builders/base/NoConfigBuilder.java similarity index 93% rename from src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java rename to src/main/java/com/modularmc/registrate/builders/base/NoConfigBuilder.java index 9008a96..7645feb 100644 --- a/src/main/java/com/modularmc/registrate/builders/NoConfigBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/base/NoConfigBuilder.java @@ -1,4 +1,4 @@ -package com.modularmc.registrate.builders; +package com.modularmc.registrate.builders.base; import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.util.nullness.NonNullSupplier; diff --git a/src/main/java/com/modularmc/registrate/builders/base/package-info.java b/src/main/java/com/modularmc/registrate/builders/base/package-info.java new file mode 100644 index 0000000..3240767 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/builders/base/package-info.java @@ -0,0 +1,5 @@ +/** + * Base builder contracts and shared builder implementation scaffolding. + */ +@org.jspecify.annotations.NullMarked +package com.modularmc.registrate.builders.base; diff --git a/src/main/java/com/modularmc/registrate/builders/package-info.java b/src/main/java/com/modularmc/registrate/builders/package-info.java index a624196..fde0603 100644 --- a/src/main/java/com/modularmc/registrate/builders/package-info.java +++ b/src/main/java/com/modularmc/registrate/builders/package-info.java @@ -1,10 +1,10 @@ /** - * Fluent builder APIs for registering content. + * Fluent concrete builder APIs for registering content. * *

                - * These classes form the primary downstream-facing DSL and should own - * registration-time customization behavior rather than leaking that logic into - * unrelated utility packages. + * These classes form the primary downstream-facing DSL. Shared builder + * contracts and scaffolding live in {@code com.modularmc.registrate.builders.base}, + * while this package focuses on content-specific registration behavior. */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.builders; diff --git a/src/main/java/com/modularmc/registrate/internal/RegistrationTracker.java b/src/main/java/com/modularmc/registrate/internal/RegistrationTracker.java new file mode 100644 index 0000000..f680f5f --- /dev/null +++ b/src/main/java/com/modularmc/registrate/internal/RegistrationTracker.java @@ -0,0 +1,228 @@ +package com.modularmc.registrate.internal; + +import com.modularmc.registrate.internal.util.DebugMarkers; +import com.modularmc.registrate.util.entry.RegistryEntry; +import com.modularmc.registrate.util.nullness.NonNullConsumer; +import com.modularmc.registrate.util.nullness.NonNullFunction; +import com.modularmc.registrate.util.nullness.NonNullSupplier; + +import net.minecraft.core.Registry; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.RegisterEvent; + +import com.google.common.base.Preconditions; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Table; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.logging.log4j.Logger; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +public final class RegistrationTracker { + + private static final class Registration { + + private final Identifier identifier; + private final ResourceKey> registryKey; + private final NonNullSupplier creator; + private final RegistryEntry delegate; + private final List> callbacks = new ArrayList<>(); + + private Registration( + Identifier identifier, + ResourceKey> registryKey, + NonNullSupplier creator, + NonNullFunction, ? extends RegistryEntry> entryFactory) { + this.identifier = identifier; + this.registryKey = registryKey; + this.creator = creator.lazy(); + this.delegate = entryFactory.apply(DeferredHolder.create(registryKey, identifier)); + } + + private Identifier getIdentifier() { + return identifier; + } + + private RegistryEntry getDelegate() { + return delegate; + } + + private void register(RegisterEvent event) { + T entry = creator.get(); + event.register(registryKey, helper -> helper.register(identifier, entry)); + callbacks.forEach(callback -> callback.accept(entry)); + callbacks.clear(); + } + + private void addRegisterCallback(NonNullConsumer callback) { + Preconditions.checkNotNull(callback, "Callback must not be null"); + callbacks.add(callback); + } + } + + private final String modId; + private final Logger logger; + private final Table>, String, Registration> registrations = HashBasedTable.create(); + private final Multimap>>, NonNullConsumer> pendingEntryCallbacks = HashMultimap.create(); + private final Multimap>, Runnable> afterRegisterCallbacks = HashMultimap.create(); + private final Set>> completedRegistrations = new HashSet<>(); + + public RegistrationTracker(String modId, Logger logger) { + this.modId = modId; + this.logger = logger; + } + + public void onRegister(RegisterEvent event, boolean skipErrors, boolean devEnvironment) { + ResourceKey> registryKey = event.getRegistryKey(); + if (registryKey == null) { + logger.debug(DebugMarkers.REGISTER, "Skipping invalid registry registration event with no key"); + return; + } + + if (!pendingEntryCallbacks.isEmpty()) { + pendingEntryCallbacks.asMap().forEach((entryKey, callbacks) -> logger.warn( + "Found {} unused register callback(s) for entry {} [{}]. Was the entry ever registered?", + callbacks.size(), + entryKey.getLeft(), + entryKey.getRight().identifier())); + pendingEntryCallbacks.clear(); + if (devEnvironment) { + throw new IllegalStateException("Found unused register callbacks, see logs"); + } + } + + Map> registrationsForType = registrations.row(registryKey); + if (registrationsForType.isEmpty()) { + return; + } + + logger.trace(DebugMarkers.REGISTER, + "({}) Registering {} known objects of type {}", + modId, + registrationsForType.size(), + registryKey.identifier()); + for (var entry : registrationsForType.entrySet()) { + Registration registration = entry.getValue(); + try { + registration.register(event); + logger.trace( + DebugMarkers.REGISTER, + "Registered {} to registry {}", + registration.getIdentifier(), + registryKey.identifier()); + } catch (Exception exception) { + String error = "Unexpected error while registering entry " + registration.getIdentifier() + " to registry " + registryKey.identifier(); + if (skipErrors) { + logger.error(DebugMarkers.REGISTER, error); + } else { + throw new RuntimeException(error, exception); + } + } + } + } + + public void onRegisterLate(RegisterEvent event) { + ResourceKey> registryKey = event.getRegistryKey(); + if (registryKey == null) { + return; + } + + Collection callbacks = afterRegisterCallbacks.get(registryKey); + callbacks.forEach(Runnable::run); + callbacks.clear(); + completedRegistrations.add(registryKey); + } + + public RegistryEntry track( + String name, + ResourceKey> registryKey, + NonNullSupplier creator, + NonNullFunction, ? extends RegistryEntry> entryFactory) { + Registration registration = new Registration<>( + Identifier.fromNamespaceAndPath(modId, name), + registryKey, + creator, + entryFactory); + logger.trace( + DebugMarkers.REGISTER, + "Captured registration for entry {}:{} of type {}", + modId, + name, + registryKey.identifier()); + pendingEntryCallbacks.removeAll(Pair.of(name, registryKey)).forEach(callback -> { + @SuppressWarnings("unchecked") + NonNullConsumer unsafeCallback = (NonNullConsumer) callback; + registration.addRegisterCallback(unsafeCallback); + }); + registrations.put(registryKey, name, registration); + return registration.getDelegate(); + } + + public void addRegisterCallback( + String name, + ResourceKey> registryKey, + NonNullConsumer callback) { + Registration registration = getRegistrationUnchecked(name, registryKey); + if (registration == null) { + pendingEntryCallbacks.put(Pair.of(name, registryKey), callback); + return; + } + registration.addRegisterCallback(callback); + } + + public void addAfterRegisterCallback(ResourceKey> registryKey, Runnable callback) { + afterRegisterCallbacks.put((ResourceKey>) registryKey, callback); + } + + public boolean isRegistered(ResourceKey> registryKey) { + return completedRegistrations.contains(registryKey); + } + + @SuppressWarnings("unchecked") + public RegistryEntry get(String name, ResourceKey> registryKey) { + return (RegistryEntry) getRegistration(name, registryKey).getDelegate(); + } + + public Optional> getOptional( + String name, + ResourceKey> registryKey) { + Registration registration = getRegistrationUnchecked(name, registryKey); + return registration == null ? Optional.empty() : Optional.of(registration.getDelegate()); + } + + @SuppressWarnings("unchecked") + public Collection> getAll(ResourceKey> registryKey) { + return registrations.row(registryKey) + .values() + .stream() + .map(registration -> (RegistryEntry) registration.getDelegate()) + .collect(Collectors.toList()); + } + + @SuppressWarnings("unchecked") + private Registration getRegistration(String name, ResourceKey> registryKey) { + Registration registration = (Registration) registrations.get(registryKey, name); + if (registration != null) { + return registration; + } + throw new IllegalArgumentException("Unknown registration " + name + " for type " + registryKey.identifier()); + } + + @SuppressWarnings("unchecked") + private Registration getRegistrationUnchecked( + String name, + ResourceKey> registryKey) { + return (Registration) registrations.get(registryKey, name); + } +} diff --git a/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java b/src/main/java/com/modularmc/registrate/internal/event/OneTimeEventReceiver.java similarity index 56% rename from src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java rename to src/main/java/com/modularmc/registrate/internal/event/OneTimeEventReceiver.java index 17ba16d..9c3d1b0 100644 --- a/src/main/java/com/modularmc/registrate/util/OneTimeEventReceiver.java +++ b/src/main/java/com/modularmc/registrate/internal/event/OneTimeEventReceiver.java @@ -1,4 +1,4 @@ -package com.modularmc.registrate.util; +package com.modularmc.registrate.internal.event; import com.modularmc.registrate.AbstractRegistrate; @@ -7,29 +7,36 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.event.IModBusEvent; import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.neoforged.neoforge.common.NeoForge; import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; import java.util.ArrayList; +import java.util.Collections; +import java.util.IdentityHashMap; import java.util.List; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; @RequiredArgsConstructor -@Log4j2 -public class OneTimeEventReceiver implements Consumer { +public final class OneTimeEventReceiver implements Consumer { - public static void addModListener(AbstractRegistrate owner, Class evtClass, Consumer listener) { - OneTimeEventReceiver.addModListener(owner, EventPriority.NORMAL, evtClass, listener); + public static void addModListener( + AbstractRegistrate owner, + Class evtClass, + Consumer listener) { + addModListener(owner, EventPriority.NORMAL, evtClass, listener); } - public static void addModListener(AbstractRegistrate owner, EventPriority priority, Class evtClass, Consumer listener) { + public static void addModListener( + AbstractRegistrate owner, + EventPriority priority, + Class evtClass, + Consumer listener) { if (owner.getModEventBus() == null) { if (!waitingModListeners.contains(owner, evtClass)) { waitingModListeners.put(owner, evtClass, new ArrayList<>()); @@ -37,39 +44,16 @@ public static void addModListener(AbstractRegis waitingModListeners.get(owner, evtClass).add(Pair.of(priority, listener)); return; } - if (!seenModBus) { - seenModBus = true; - for (var waitingListener : waitingModListeners.row(owner).entrySet()) { - for (var pair : waitingListener.getValue()) { - // noinspection unchecked - OneTimeEventReceiver.addListener(owner.getModEventBus(), pair.getKey(), (Class) waitingListener.getKey(), (Consumer) pair.getValue()); - } - } + + if (initializedOwners.add(owner)) { + flushWaitingModListeners(owner); addModListener(owner, FMLLoadCompleteEvent.class, OneTimeEventReceiver::onLoadComplete); } - OneTimeEventReceiver.addListener(owner.getModEventBus(), priority, evtClass, listener); - } - - public static void addForgeListener(Class evtClass, Consumer listener) { - OneTimeEventReceiver.addForgeListener(EventPriority.NORMAL, evtClass, listener); - } - public static void addForgeListener(EventPriority priority, Class evtClass, Consumer listener) { - OneTimeEventReceiver.addListener(NeoForge.EVENT_BUS, priority, evtClass, listener); + addListener(owner.getModEventBus(), priority, evtClass, listener); } - @Deprecated - public static void addListener(IEventBus bus, Class evtClass, Consumer listener) { - OneTimeEventReceiver.addListener(bus, EventPriority.NORMAL, evtClass, listener); - } - - @SuppressWarnings("unchecked") - @Deprecated - public static void addListener(IEventBus bus, EventPriority priority, Class evtClass, Consumer listener) { - bus.addListener(priority, false, (Class) evtClass, new OneTimeEventReceiver<>(bus, listener)); - } - - private static boolean seenModBus = false; + private static final Set> initializedOwners = Collections.newSetFromMap(new IdentityHashMap<>()); private static final Table, Class, List>>> waitingModListeners = HashBasedTable.create(); private final IEventBus bus; @@ -104,4 +88,24 @@ private static void onLoadComplete(FMLLoadCompleteEvent event) { toUnregister.clear(); }); } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static void flushWaitingModListeners(AbstractRegistrate owner) { + var waitingListeners = new ArrayList<>(waitingModListeners.row(owner).entrySet()); + waitingModListeners.row(owner).clear(); + for (var waitingListener : waitingListeners) { + for (var pair : waitingListener.getValue()) { + addListener(owner.getModEventBus(), pair.getKey(), (Class) waitingListener.getKey(), (Consumer) pair.getValue()); + } + } + } + + @SuppressWarnings("unchecked") + private static void addListener( + IEventBus bus, + EventPriority priority, + Class evtClass, + Consumer listener) { + bus.addListener(priority, false, (Class) evtClass, new OneTimeEventReceiver<>(bus, listener)); + } } diff --git a/src/main/java/com/modularmc/registrate/internal/event/package-info.java b/src/main/java/com/modularmc/registrate/internal/event/package-info.java new file mode 100644 index 0000000..be778bf --- /dev/null +++ b/src/main/java/com/modularmc/registrate/internal/event/package-info.java @@ -0,0 +1,6 @@ +/** + * Event-bus plumbing that supports one-shot registration hooks for the public + * Registrate DSL. + */ +@org.jspecify.annotations.NullMarked +package com.modularmc.registrate.internal.event; diff --git a/src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java b/src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java new file mode 100644 index 0000000..22c3fba --- /dev/null +++ b/src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java @@ -0,0 +1,74 @@ +package com.modularmc.registrate.internal.lifecycle; + +import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.internal.event.OneTimeEventReceiver; + +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.neoforge.data.event.GatherDataEvent; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.neoforged.neoforge.registries.RegisterEvent; + +import org.jspecify.annotations.Nullable; + +import java.util.function.Consumer; + +/** + * Centralizes the per-instance NeoForge lifecycle wiring for a Registrate + * owner. + * + *

                + * This keeps lifecycle listener registration easy to discover without + * collapsing multiple mod instances into a shared global runtime. + */ +public final class RegistrateLifecycle { + + public interface Hooks { + + @Nullable + IEventBus modEventBus(); + + void setModEventBus(IEventBus bus); + + boolean doDatagen(); + + void onRegister(RegisterEvent event); + + void onRegisterLate(RegisterEvent event); + + void onBuildCreativeModeTabContents(BuildCreativeModeTabContentsEvent event); + + void onData(GatherDataEvent event); + } + + private final AbstractRegistrate owner; + private final Hooks hooks; + + public RegistrateLifecycle(AbstractRegistrate owner, Hooks hooks) { + this.owner = owner; + this.hooks = hooks; + } + + public void register(IEventBus bus) { + if (hooks.modEventBus() == null) { + hooks.setModEventBus(bus); + } + + Consumer onRegister = hooks::onRegister; + Consumer onRegisterLate = hooks::onRegisterLate; + bus.addListener(onRegister); + bus.addListener(EventPriority.LOWEST, onRegisterLate); + bus.addListener(hooks::onBuildCreativeModeTabContents); + + // Register events fire multiple times, so clean them up on common setup. + OneTimeEventReceiver.addModListener(owner, FMLCommonSetupEvent.class, $ -> { + OneTimeEventReceiver.unregister(owner, onRegister, RegisterEvent.class); + OneTimeEventReceiver.unregister(owner, onRegisterLate, RegisterEvent.class); + }); + + if (hooks.doDatagen()) { + OneTimeEventReceiver.addModListener(owner, GatherDataEvent.Client.class, hooks::onData); + } + } +} diff --git a/src/main/java/com/modularmc/registrate/internal/lifecycle/package-info.java b/src/main/java/com/modularmc/registrate/internal/lifecycle/package-info.java new file mode 100644 index 0000000..6a752dd --- /dev/null +++ b/src/main/java/com/modularmc/registrate/internal/lifecycle/package-info.java @@ -0,0 +1,6 @@ +/** + * Per-instance lifecycle bridges that attach Registrate owners to the NeoForge + * mod bus. + */ +@org.jspecify.annotations.NullMarked +package com.modularmc.registrate.internal.lifecycle; diff --git a/src/main/java/com/modularmc/registrate/internal/package-info.java b/src/main/java/com/modularmc/registrate/internal/package-info.java new file mode 100644 index 0000000..97ad00b --- /dev/null +++ b/src/main/java/com/modularmc/registrate/internal/package-info.java @@ -0,0 +1,9 @@ +/** + * Internal implementation details that back the public Registrate API. + * + *

                + * Types in this package are free to change during development and should not + * be treated as stable extension points for downstream mods. + */ +@org.jspecify.annotations.NullMarked +package com.modularmc.registrate.internal; diff --git a/src/main/java/com/modularmc/registrate/util/DebugMarkers.java b/src/main/java/com/modularmc/registrate/internal/util/DebugMarkers.java similarity index 68% rename from src/main/java/com/modularmc/registrate/util/DebugMarkers.java rename to src/main/java/com/modularmc/registrate/internal/util/DebugMarkers.java index 17685cc..f02d9f6 100644 --- a/src/main/java/com/modularmc/registrate/util/DebugMarkers.java +++ b/src/main/java/com/modularmc/registrate/internal/util/DebugMarkers.java @@ -1,17 +1,19 @@ -package com.modularmc.registrate.util; +package com.modularmc.registrate.internal.util; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; @SuppressWarnings("null") -public class DebugMarkers { +public final class DebugMarkers { private static final String PREFIX = "REGISTRATE."; - private static final Marker marker(String name) { - return MarkerManager.getMarker(PREFIX + name); - } - public static final Marker REGISTER = marker("REGISTER"); public static final Marker DATA = marker("DATA"); + + private DebugMarkers() {} + + private static Marker marker(String name) { + return MarkerManager.getMarker(PREFIX + name); + } } diff --git a/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java b/src/main/java/com/modularmc/registrate/internal/util/RegistrateDistExecutor.java similarity index 69% rename from src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java rename to src/main/java/com/modularmc/registrate/internal/util/RegistrateDistExecutor.java index 9df76e1..e9c46d1 100644 --- a/src/main/java/com/modularmc/registrate/util/RegistrateDistExecutor.java +++ b/src/main/java/com/modularmc/registrate/internal/util/RegistrateDistExecutor.java @@ -1,11 +1,13 @@ -package com.modularmc.registrate.util; +package com.modularmc.registrate.internal.util; import net.neoforged.api.distmarker.Dist; import net.neoforged.fml.loading.FMLEnvironment; import java.util.function.Supplier; -public class RegistrateDistExecutor { +public final class RegistrateDistExecutor { + + private RegistrateDistExecutor() {} public static void unsafeRunWhenOn(Dist dist, Supplier toRun) { if (dist == FMLEnvironment.getDist()) { diff --git a/src/main/java/com/modularmc/registrate/internal/util/package-info.java b/src/main/java/com/modularmc/registrate/internal/util/package-info.java new file mode 100644 index 0000000..9def3cb --- /dev/null +++ b/src/main/java/com/modularmc/registrate/internal/util/package-info.java @@ -0,0 +1,5 @@ +/** + * Small implementation-only helpers used by runtime internals. + */ +@org.jspecify.annotations.NullMarked +package com.modularmc.registrate.internal.util; diff --git a/src/main/java/com/modularmc/registrate/package-info.java b/src/main/java/com/modularmc/registrate/package-info.java index 85271a3..d75e1cf 100644 --- a/src/main/java/com/modularmc/registrate/package-info.java +++ b/src/main/java/com/modularmc/registrate/package-info.java @@ -4,7 +4,7 @@ *

                * This layer contains the main orchestration types used by downstream mods: * the abstract registration coordinator, the default {@code Registrate} - * implementation, and fork-level metadata/constants. + * implementation, and the NeoForge library entrypoint used by this fork. */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate; diff --git a/src/main/java/com/modularmc/registrate/providers/DataGenContext.java b/src/main/java/com/modularmc/registrate/providers/DataGenContext.java index b160c70..a3733e4 100644 --- a/src/main/java/com/modularmc/registrate/providers/DataGenContext.java +++ b/src/main/java/com/modularmc/registrate/providers/DataGenContext.java @@ -1,6 +1,6 @@ package com.modularmc.registrate.providers; -import com.modularmc.registrate.builders.Builder; +import com.modularmc.registrate.builders.base.Builder; import com.modularmc.registrate.util.nullness.NonNullSupplier; import net.minecraft.core.Registry; diff --git a/src/main/java/com/modularmc/registrate/providers/GeneratorType.java b/src/main/java/com/modularmc/registrate/providers/GeneratorType.java deleted file mode 100644 index f75a249..0000000 --- a/src/main/java/com/modularmc/registrate/providers/GeneratorType.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.modularmc.registrate.providers; - -public interface GeneratorType {} diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java index b7b11c6..830ed32 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateAdvancementProvider.java @@ -1,6 +1,8 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.core.ProviderType; +import com.modularmc.registrate.providers.core.RegistrateProvider; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java index 2095b48..27d66bf 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateDataMapProvider.java @@ -1,6 +1,8 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.core.ProviderType; +import com.modularmc.registrate.providers.core.RegistrateProvider; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; @@ -17,7 +19,7 @@ public class RegistrateDataMapProvider extends DataMapProvider implements Regist private HolderLookup.@Nullable Provider provider; - protected RegistrateDataMapProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture pvd) { + public RegistrateDataMapProvider(AbstractRegistrate parent, PackOutput output, CompletableFuture pvd) { super(output, pvd); this.parent = parent; } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java index 66953c9..a385011 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateDatapackProvider.java @@ -1,6 +1,7 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.core.RegistrateLookupFillerProvider; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java index 87e2721..cfb49a5 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateGenericProvider.java @@ -1,13 +1,14 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.core.ProviderType; +import com.modularmc.registrate.providers.core.RegistrateProvider; import net.minecraft.core.HolderLookup; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.neoforged.fml.LogicalSide; -import net.neoforged.neoforge.data.event.GatherDataEvent; import org.apache.commons.compress.utils.Lists; import org.jetbrains.annotations.ApiStatus; @@ -26,13 +27,12 @@ public final class RegistrateGenericProvider implements RegistrateProvider { private final List generators = Lists.newArrayList(); @ApiStatus.Internal - RegistrateGenericProvider(AbstractRegistrate registrate, GatherDataEvent event, LogicalSide side, ProviderType providerType) { + public RegistrateGenericProvider(AbstractRegistrate registrate, PackOutput output, CompletableFuture registries, LogicalSide side, ProviderType providerType) { this.registrate = registrate; + this.output = output; + this.registries = registries; this.side = side; this.providerType = providerType; - - output = event.getGenerator().getPackOutput(); - registries = event.getLookupProvider(); } public RegistrateGenericProvider add(Generator generator) { diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java index 63bcdab..1b77d6e 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateItemTagsProvider.java @@ -1,8 +1,10 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.core.ProviderType; import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; import net.minecraft.data.tags.TagsProvider; @@ -22,25 +24,27 @@ public class RegistrateItemTagsProvider extends RegistrateTagsProvider.Intrinsic private final Map, TagKey> tagsToCopy = new HashMap<>(); public RegistrateItemTagsProvider(AbstractRegistrate owner, ProviderType type, String name, PackOutput output, CompletableFuture registriesLookup, CompletableFuture> blockTags) { - super(owner, type, name, output, Registries.ITEM, registriesLookup, item -> item.builtInRegistryHolder().key()); + super(owner, type, name, output, Registries.ITEM, registriesLookup, item -> BuiltInRegistries.ITEM.getResourceKey(item) + .orElseThrow(() -> new IllegalStateException("Cannot generate tags for unregistered item: " + item))); this.blockTags = blockTags; } - public void copy(TagKey p_206422_, TagKey p_206423_) { - this.tagsToCopy.put(p_206422_, p_206423_); + public void copy(TagKey sourceTag, TagKey targetTag) { + tagsToCopy.put(sourceTag, targetTag); } @Override protected CompletableFuture createContentsProvider() { - return super.createContentsProvider().thenCombineAsync(this.blockTags, (p_274766_, p_274767_) -> { - this.tagsToCopy.forEach((p_274763_, p_274764_) -> { - TagBuilder tagbuilder = this.getOrCreateRawBuilder(p_274764_); - Optional optional = p_274767_.apply(p_274763_); - optional.orElseThrow(() -> { - return new IllegalStateException("Missing block tag " + p_274764_.location()); - }).build().forEach(tagbuilder::add); + return super.createContentsProvider().thenCombineAsync(blockTags, (lookupProvider, blockTagLookup) -> { + tagsToCopy.forEach((sourceTag, targetTag) -> { + TagBuilder tagBuilder = getOrCreateRawBuilder(targetTag); + Optional sourceBuilder = blockTagLookup.apply(sourceTag); + sourceBuilder + .orElseThrow(() -> new IllegalStateException("Missing block tag " + sourceTag.location())) + .build() + .forEach(tagBuilder::add); }); - return p_274766_; + return lookupProvider; }); } } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java index c9c8cbd..e5f5d35 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java @@ -1,6 +1,8 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.core.ProviderType; +import com.modularmc.registrate.providers.core.RegistrateProvider; import com.modularmc.registrate.util.nullness.NonNullSupplier; import net.minecraft.core.Registry; diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java index 815dbbe..cd3b8f0 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateTagsProvider.java @@ -1,6 +1,8 @@ package com.modularmc.registrate.providers; import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.core.ProviderType; +import com.modularmc.registrate.providers.core.RegistrateLookupFillerProvider; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; diff --git a/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java b/src/main/java/com/modularmc/registrate/providers/core/DataProviderInitializer.java similarity index 95% rename from src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java rename to src/main/java/com/modularmc/registrate/providers/core/DataProviderInitializer.java index e8ab16b..2113cbd 100644 --- a/src/main/java/com/modularmc/registrate/providers/DataProviderInitializer.java +++ b/src/main/java/com/modularmc/registrate/providers/core/DataProviderInitializer.java @@ -1,4 +1,4 @@ -package com.modularmc.registrate.providers; +package com.modularmc.registrate.providers.core; import net.minecraft.core.Registry; import net.minecraft.core.RegistrySetBuilder; @@ -19,7 +19,7 @@ public DataProviderInitializer() { addDependency(ProviderType.ITEM_TAGS, ProviderType.BLOCK_TAGS); } - protected RegistrySetBuilder getDatapackRegistryProviders() { + public RegistrySetBuilder getDatapackRegistryProviders() { return datapackEntryProvider; } diff --git a/src/main/java/com/modularmc/registrate/providers/core/GeneratorType.java b/src/main/java/com/modularmc/registrate/providers/core/GeneratorType.java new file mode 100644 index 0000000..9c156c0 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/core/GeneratorType.java @@ -0,0 +1,3 @@ +package com.modularmc.registrate.providers.core; + +public interface GeneratorType {} diff --git a/src/main/java/com/modularmc/registrate/providers/ProviderType.java b/src/main/java/com/modularmc/registrate/providers/core/ProviderType.java similarity index 71% rename from src/main/java/com/modularmc/registrate/providers/ProviderType.java rename to src/main/java/com/modularmc/registrate/providers/core/ProviderType.java index 0295696..c6ae126 100644 --- a/src/main/java/com/modularmc/registrate/providers/ProviderType.java +++ b/src/main/java/com/modularmc/registrate/providers/core/ProviderType.java @@ -1,12 +1,20 @@ -package com.modularmc.registrate.providers; +package com.modularmc.registrate.providers.core; import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.providers.RegistrateAdvancementProvider; +import com.modularmc.registrate.providers.RegistrateDataMapProvider; +import com.modularmc.registrate.providers.RegistrateDatapackProvider; +import com.modularmc.registrate.providers.RegistrateGenericProvider; +import com.modularmc.registrate.providers.RegistrateItemTagsProvider; +import com.modularmc.registrate.providers.RegistrateLangProvider; +import com.modularmc.registrate.providers.RegistrateTagsProvider; import com.modularmc.registrate.providers.generators.*; import com.modularmc.registrate.providers.loot.RegistrateLootTableProvider; import com.modularmc.registrate.util.nullness.NonNullSupplier; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceKey; @@ -15,16 +23,13 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.material.Fluid; import net.neoforged.fml.LogicalSide; -import net.neoforged.neoforge.data.event.GatherDataEvent; import net.neoforged.neoforge.data.loading.DatagenModLoader; import java.util.Map; +import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.function.Function; -import javax.annotation.Nonnull; -import javax.annotation.ParametersAreNonnullByDefault; - /** * Represents a type of data that can be generated, and specifies a factory for the provider. *

                @@ -36,8 +41,6 @@ * @param The type of the provider */ @FunctionalInterface -@SuppressWarnings("deprecation") -@ParametersAreNonnullByDefault public interface ProviderType extends GeneratorType { // SERVER DATA @@ -46,35 +49,41 @@ public interface ProviderType extends GeneratorTyp ProviderType RECIPE_RUNNER = registerServerData("recipe_runner", RegistrateRecipeRunner::new); ProviderType ADVANCEMENT = registerServerData("advancement", RegistrateAdvancementProvider::new); ProviderType LOOT = registerServerData("loot", RegistrateLootTableProvider::new); - ProviderType> BLOCK_TAGS = registerIntrinsicTag("tags/block", "blocks", Registries.BLOCK, block -> block.builtInRegistryHolder().key()); + ProviderType> BLOCK_TAGS = registerIntrinsicTag("tags/block", "blocks", Registries.BLOCK, BuiltInRegistries.BLOCK); ProviderType> ENCHANTMENT_TAGS = registerDynamicTag("tags/enchantment", "enchantments", Registries.ENCHANTMENT); - ProviderType ITEM_TAGS = registerTag("tags/item", Registries.ITEM, c -> new RegistrateItemTagsProvider(c.parent(), c.type(), "items", c.output(), c.provider(), c.get(BLOCK_TAGS).contentsGetter())); - ProviderType> FLUID_TAGS = registerIntrinsicTag("tags/fluid", "fluids", Registries.FLUID, fluid -> fluid.builtInRegistryHolder().key()); - ProviderType>> ENTITY_TAGS = registerIntrinsicTag("tags/entity", "entity_types", Registries.ENTITY_TYPE, entityType -> entityType.builtInRegistryHolder().key()); - ProviderType GENERIC_SERVER = registerProvider("registrate_generic_server_provider", c -> new RegistrateGenericProvider(c.parent(), c.event(), LogicalSide.SERVER, c.type())); + ProviderType ITEM_TAGS = registerTag("tags/item", Registries.ITEM, c -> new RegistrateItemTagsProvider(c.parent(), c.type(), "items", c.output(), c.provider(), c.require(BLOCK_TAGS).contentsGetter())); + ProviderType> FLUID_TAGS = registerIntrinsicTag("tags/fluid", "fluids", Registries.FLUID, BuiltInRegistries.FLUID); + ProviderType>> ENTITY_TAGS = registerIntrinsicTag("tags/entity", "entity_types", Registries.ENTITY_TYPE, BuiltInRegistries.ENTITY_TYPE); + ProviderType GENERIC_SERVER = registerProvider("registrate_generic_server_provider", c -> new RegistrateGenericProvider(c.parent(), c.output(), c.provider(), LogicalSide.SERVER, c.type())); // CLIENT DATA ProviderType MODEL = registerClientProvider("model", () -> c -> new RegistrateModelProvider(c.parent(), c.output())); ProviderType LANG = registerClientProvider("lang", () -> c -> new RegistrateLangProvider(c.parent(), c.output())); - ProviderType GENERIC_CLIENT = registerClientProvider("registrate_generic_client_provider", () -> c -> new RegistrateGenericProvider(c.parent(), c.event(), LogicalSide.CLIENT, c.type())); + ProviderType GENERIC_CLIENT = registerClientProvider("registrate_generic_client_provider", () -> c -> new RegistrateGenericProvider(c.parent(), c.output(), c.provider(), LogicalSide.CLIENT, c.type())); GeneratorType RECIPE = RECIPE_RUNNER.createGenerator("recipe"); GeneratorType BLOCKSTATE = MODEL.createGenerator("blockstate"); GeneratorType ITEM_MODEL = MODEL.createGenerator("item_model"); record Context(ProviderType type, AbstractRegistrate parent, - @Deprecated GatherDataEvent event, Map, RegistrateProvider> existing, PackOutput output, CompletableFuture provider) { - public R get(ProviderType other) { - return (R) existing().get(other); + public R require(ProviderType other) { + return other.cast(Objects.requireNonNull( + existing().get(other), + () -> "Missing provider dependency for " + RegistrateDataProvider.getTypeName(other))); } } T create(Context context); + @SuppressWarnings("unchecked") + default T cast(RegistrateProvider provider) { + return (T) provider; + } + default GeneratorType createGenerator(String type) { return new GeneratorType<>() { @@ -98,26 +107,24 @@ default ProviderType asProvider() { } } - @Nonnull static ProviderType registerServerData(String name, SimpleServerDataFactory factory) { return registerProvider(name, factory.asProvider()); } - @Nonnull static ProviderType registerProvider(String name, ProviderType type) { RegistrateDataProvider.TYPES.put(name, type); return type; } - @Nonnull static ProviderType registerClientProvider(String name, NonNullSupplier> supplier) { - if (!DatagenModLoader.isRunningDataGen()) return context -> null; - var type = supplier.get(); + ProviderType type = DatagenModLoader.isRunningDataGen() ? supplier.get() : context -> { + throw new IllegalStateException("Client datagen provider '" + name + "' is unavailable outside datagen"); + }; RegistrateDataProvider.TYPES.put(name, type); return type; } - @Nonnull + @SuppressWarnings("unchecked") static > ProviderType registerTag(String name, ResourceKey> key, ProviderType type) { if (RegistrateDataProvider.TAG_TYPES.containsKey(key)) { return (ProviderType) RegistrateDataProvider.TAG_TYPES.get(key); @@ -127,17 +134,20 @@ static > ProviderType registerTag(Stri return type; } - @Nonnull - static ProviderType> registerIntrinsicTag(String providerName, String typeName, ResourceKey> registry, Function> keyExtractor) { - return registerTag(providerName, registry, c -> new RegistrateTagsProvider.IntrinsicImpl<>(c.parent(), c.type(), typeName, c.output(), registry, c.provider(), keyExtractor)); + static ProviderType> registerIntrinsicTag(String providerName, String typeName, ResourceKey> registryKey, Registry registry) { + return registerTag(providerName, registryKey, c -> new RegistrateTagsProvider.IntrinsicImpl<>(c.parent(), c.type(), typeName, c.output(), registryKey, c.provider(), keyExtractor(registry, typeName))); } - @Nonnull static ProviderType> registerDynamicTag(String providerName, String typeName, ResourceKey> registry) { return registerTag(providerName, registry, c -> new RegistrateTagsProvider.Impl<>(c.parent(), c.type(), typeName, c.output(), registry, c.provider())); } - static T create(ProviderType type, AbstractRegistrate parent, GatherDataEvent event, Map, RegistrateProvider> existing, CompletableFuture provider) { - return type.create(new Context<>(type, parent, event, existing, event.getGenerator().getPackOutput(), provider)); + static T create(ProviderType type, AbstractRegistrate parent, Map, RegistrateProvider> existing, PackOutput output, CompletableFuture provider) { + return type.create(new Context<>(type, parent, existing, output, provider)); + } + + private static Function> keyExtractor(Registry registry, String typeName) { + return value -> registry.getResourceKey(value) + .orElseThrow(() -> new IllegalStateException("Cannot generate tags for unregistered " + typeName + " entry: " + value)); } } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java b/src/main/java/com/modularmc/registrate/providers/core/RegistrateDataProvider.java similarity index 94% rename from src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java rename to src/main/java/com/modularmc/registrate/providers/core/RegistrateDataProvider.java index c40e219..b346fae 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateDataProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/core/RegistrateDataProvider.java @@ -1,7 +1,8 @@ -package com.modularmc.registrate.providers; +package com.modularmc.registrate.providers.core; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.util.DebugMarkers; +import com.modularmc.registrate.internal.util.DebugMarkers; +import com.modularmc.registrate.providers.RegistrateTagsProvider; import net.minecraft.core.HolderLookup; import net.minecraft.core.Registry; @@ -65,7 +66,7 @@ public RegistrateDataProvider(AbstractRegistrate parent, String modid, Gather ProviderType type = sorted.type(); var lookup = registriesLookup; if (sorted.parent() != null) lookup = ((RegistrateLookupFillerProvider) known.get(sorted.parent())).getFilledProvider(); - RegistrateProvider prov = ProviderType.create(type, parent, event, known, lookup); + RegistrateProvider prov = ProviderType.create(type, parent, known, event.getGenerator().getPackOutput(), lookup); if (prov instanceof RegistrateTagsProvider tagsProvider && TAG_TYPES.get(tagsProvider.registry()) != type) { throw new IllegalStateException("Tag providers must be registered through ProviderType::registerTag"); } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java b/src/main/java/com/modularmc/registrate/providers/core/RegistrateLookupFillerProvider.java similarity index 82% rename from src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java rename to src/main/java/com/modularmc/registrate/providers/core/RegistrateLookupFillerProvider.java index b62835f..84a7a40 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateLookupFillerProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/core/RegistrateLookupFillerProvider.java @@ -1,4 +1,4 @@ -package com.modularmc.registrate.providers; +package com.modularmc.registrate.providers.core; import net.minecraft.core.HolderLookup; diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java b/src/main/java/com/modularmc/registrate/providers/core/RegistrateProvider.java similarity index 77% rename from src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java rename to src/main/java/com/modularmc/registrate/providers/core/RegistrateProvider.java index 8cb40e9..46c9d06 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/core/RegistrateProvider.java @@ -1,4 +1,4 @@ -package com.modularmc.registrate.providers; +package com.modularmc.registrate.providers.core; import net.minecraft.data.DataProvider; import net.neoforged.fml.LogicalSide; diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java b/src/main/java/com/modularmc/registrate/providers/core/RegistrateProviderDelegate.java similarity index 82% rename from src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java rename to src/main/java/com/modularmc/registrate/providers/core/RegistrateProviderDelegate.java index e05284c..0a939b5 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateProviderDelegate.java +++ b/src/main/java/com/modularmc/registrate/providers/core/RegistrateProviderDelegate.java @@ -1,4 +1,4 @@ -package com.modularmc.registrate.providers; +package com.modularmc.registrate.providers.core; import net.minecraft.data.DataProvider; import net.minecraft.resources.Identifier; diff --git a/src/main/java/com/modularmc/registrate/providers/core/package-info.java b/src/main/java/com/modularmc/registrate/providers/core/package-info.java new file mode 100644 index 0000000..922e156 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/providers/core/package-info.java @@ -0,0 +1,6 @@ +/** + * Core provider contracts, registries, and orchestration infrastructure used + * by built-in data generators. + */ +@org.jspecify.annotations.NullMarked +package com.modularmc.registrate.providers.core; diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java index 8e2e4d3..5101007 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateBlockModelGenerator.java @@ -1,7 +1,7 @@ package com.modularmc.registrate.providers.generators; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.core.ProviderType; import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelOutput; diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java index 8284747..f2f141c 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java @@ -1,7 +1,7 @@ package com.modularmc.registrate.providers.generators; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.core.ProviderType; import com.modularmc.registrate.util.nullness.NonNullSupplier; import net.minecraft.client.color.item.ItemTintSource; diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java index 2f03e9f..762fcbd 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java @@ -1,7 +1,7 @@ package com.modularmc.registrate.providers.generators; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.providers.RegistrateProvider; +import com.modularmc.registrate.providers.core.RegistrateProvider; import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelGenerators; diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java index 28113c0..6dcada7 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeProvider.java @@ -1,6 +1,6 @@ package com.modularmc.registrate.providers.generators; -import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.core.ProviderType; import com.modularmc.registrate.util.DataIngredient; import com.modularmc.registrate.util.nullness.NonNullSupplier; diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java index 5f7f173..3f68dfb 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateRecipeRunner.java @@ -1,7 +1,7 @@ package com.modularmc.registrate.providers.generators; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.providers.RegistrateProvider; +import com.modularmc.registrate.providers.core.RegistrateProvider; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; diff --git a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java index 5ffa881..a966df8 100644 --- a/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/loot/RegistrateLootTableProvider.java @@ -1,8 +1,8 @@ package com.modularmc.registrate.providers.loot; import com.modularmc.registrate.AbstractRegistrate; -import com.modularmc.registrate.providers.ProviderType; -import com.modularmc.registrate.providers.RegistrateProvider; +import com.modularmc.registrate.providers.core.ProviderType; +import com.modularmc.registrate.providers.core.RegistrateProvider; import com.modularmc.registrate.util.nullness.NonNullConsumer; import net.minecraft.core.Holder; diff --git a/src/main/java/com/modularmc/registrate/providers/package-info.java b/src/main/java/com/modularmc/registrate/providers/package-info.java index 5b5b490..4919a51 100644 --- a/src/main/java/com/modularmc/registrate/providers/package-info.java +++ b/src/main/java/com/modularmc/registrate/providers/package-info.java @@ -1,9 +1,10 @@ /** - * Data generation orchestration and provider lifecycle types. + * Built-in data provider implementations and data generation callback context. * *

                - * This package coordinates provider registration, dispatch, and shared data - * generation state used by builder callbacks. + * Shared provider contracts, type registries, and orchestration infrastructure + * live in {@code com.modularmc.registrate.providers.core}. This package keeps + * the concrete provider implementations closer to the data they generate. */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.providers; diff --git a/src/main/java/com/modularmc/registrate/util/DataIngredient.java b/src/main/java/com/modularmc/registrate/util/DataIngredient.java index 7d57240..db7f0be 100644 --- a/src/main/java/com/modularmc/registrate/util/DataIngredient.java +++ b/src/main/java/com/modularmc/registrate/util/DataIngredient.java @@ -54,7 +54,7 @@ private DataIngredient(Ingredient parent, TagKey tag) { private DataIngredient(Ingredient parent, Identifier id, ItemPredicate... predicates) { this.parent = parent; this.id = id; - this.criteriaFactory = prov -> RegistrateRecipeProvider.inventoryTrigger(predicates); + this.criteriaFactory = ignored -> RegistrateRecipeProvider.inventoryTrigger(predicates); } public Criterion getCriterion(RegistrateRecipeProvider prov) { diff --git a/src/main/java/com/modularmc/registrate/util/Sequence.java b/src/main/java/com/modularmc/registrate/util/Sequence.java deleted file mode 100644 index d06aa81..0000000 --- a/src/main/java/com/modularmc/registrate/util/Sequence.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.modularmc.registrate.util; - -import java.util.function.Supplier; - -public class Sequence { - - public static Sequence create() { - return new Sequence<>(); - } - - public Sequence run(Runnable toRun) { - toRun.run(); - return this; - } - - public Sequence next(Supplier val) { - val.get(); - return this; - } - - public Sequence next(T val) { - return this; - } -} diff --git a/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java b/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java index 21bb5c0..88111f7 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/FluidEntry.java @@ -4,6 +4,7 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.material.Fluid; import net.neoforged.neoforge.fluids.BaseFlowingFluid; @@ -20,11 +21,9 @@ public class FluidEntry extends RegistryEntry owner, DeferredHolder delegate) { super(owner, delegate); - BlockEntry block = null; - try { - block = BlockEntry.cast(getSibling(BuiltInRegistries.BLOCK)); - } catch (IllegalArgumentException e) {} // TODO add way to get entry optionally - this.block = block; + this.block = getSiblingOptional(BuiltInRegistries.BLOCK) + .map(BlockEntry::cast) + .orElse(null); } @Override @@ -48,6 +47,7 @@ public Optional getBlock() { @SuppressWarnings({ "unchecked", "null" }) public Optional getBucket() { - return Optional.ofNullable((I) get().getBucket()); + return Optional.of((I) get().getBucket()) + .filter(item -> item != Items.AIR); } } diff --git a/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java b/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java index faf19d9..f9f44f3 100644 --- a/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java +++ b/src/main/java/com/modularmc/registrate/util/entry/RegistryEntry.java @@ -13,7 +13,8 @@ /** * Wraps a {@link net.neoforged.neoforge.registries.DeferredHolder}, providing a cleaner API with null-safe access, and - * registrate-specific extensions such as {@link #getSibling(ResourceKey)}. + * registrate-specific extensions such as {@link #getSibling(ResourceKey)} and + * {@link #getSiblingOptional(ResourceKey)}. * * @param * The type of the entry @@ -35,10 +36,18 @@ public RegistryEntry getSibling(ResourceKey Optional> getSiblingOptional(ResourceKey> registryType) { + return owner.getOptional(getId().getPath(), registryType); + } + public RegistryEntry getSibling(Registry registry) { return getSibling(registry.key()); } + public Optional> getSiblingOptional(Registry registry) { + return getSiblingOptional(registry.key()); + } + /** * If an entry is present, and the entry matches the given predicate, return an {@link Optional} * describing the value, otherwise return an empty {@link Optional}. diff --git a/src/main/java/com/modularmc/registrate/util/package-info.java b/src/main/java/com/modularmc/registrate/util/package-info.java index c63534a..8e1e3ce 100644 --- a/src/main/java/com/modularmc/registrate/util/package-info.java +++ b/src/main/java/com/modularmc/registrate/util/package-info.java @@ -1,9 +1,11 @@ /** - * Shared runtime support utilities. + * Shared downstream-facing support utilities. * *

                - * Only cross-cutting helpers that are not clearly builder- or - * provider-specific should live here. + * Only helpers that are intentionally part of the reusable library surface and + * are not clearly builder- or provider-specific should live here. Internal + * event plumbing, dist-gated execution helpers, and debug markers belong under + * {@code com.modularmc.registrate.internal}. */ @org.jspecify.annotations.NullMarked package com.modularmc.registrate.util; diff --git a/src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java b/src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java index 7bed07c..9e7e6b4 100644 --- a/src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java +++ b/src/test/java/com/modularmc/registrate/test/gametests/CustomItemTests.java @@ -9,6 +9,7 @@ import net.neoforged.testframework.gametest.GameTest; @ForEachTest(groups = "custom-item") +@SuppressWarnings("unused") public class CustomItemTests { @GameTest @@ -16,8 +17,8 @@ public class CustomItemTests { @TestHolder(description = "Ensure custom item is registered and has the expected properties") public static void ensureItemContent(final DynamicTest test) { test.onGameTest(helper -> helper.startSequence(() -> TestMod.instance().testitem.asStack()) - .thenMap(stack -> stack.getHoverName().getString()) - .thenExecute(name -> helper.assertValueEqual(name, "Testitem", "Test Item localized name")) + .thenMap(stack -> stack.getItem().getDescriptionId()) + .thenExecute(descriptionId -> helper.assertValueEqual("item.testmod.testitem", descriptionId, "Test Item translation key")) .thenSucceed()); } } diff --git a/src/test/java/com/modularmc/registrate/test/gametests/RegistrationRuntimeTests.java b/src/test/java/com/modularmc/registrate/test/gametests/RegistrationRuntimeTests.java new file mode 100644 index 0000000..9c25537 --- /dev/null +++ b/src/test/java/com/modularmc/registrate/test/gametests/RegistrationRuntimeTests.java @@ -0,0 +1,43 @@ +package com.modularmc.registrate.test.gametests; + +import com.modularmc.registrate.test.mod.TestMod; + +import net.neoforged.testframework.DynamicTest; +import net.neoforged.testframework.annotation.ForEachTest; +import net.neoforged.testframework.annotation.TestHolder; +import net.neoforged.testframework.gametest.EmptyTemplate; +import net.neoforged.testframework.gametest.GameTest; + +@ForEachTest(groups = "registrate-runtime") +@SuppressWarnings("unused") +public class RegistrationRuntimeTests { + + @GameTest + @EmptyTemplate(floor = true) + @TestHolder(description = "Ensure block item lang reuse and fluid optional helpers behave as expected") + public static void ensureItemAndFluidHelpers(final DynamicTest test) { + test.onGameTest(helper -> helper.startSequence(() -> TestMod.instance().testblockitem.asStack().getItem().getDescriptionId()) + .thenExecute(blockItemDescriptionId -> { + helper.assertValueEqual(TestMod.instance().testblock.get().getDescriptionId(), blockItemDescriptionId, "Block item should reuse the block description key"); + helper.assertValueEqual(true, TestMod.instance().testfluid.getBlock().isEmpty(), "Fluid entry should return an empty block optional when no sibling exists"); + helper.assertValueEqual(true, TestMod.instance().testfluid.getBucket().isEmpty(), "Fluid entry should hide buckets when noBucket() is used"); + }) + .thenSucceed()); + } + + @GameTest + @EmptyTemplate(floor = true) + @TestHolder(description = "Ensure auxiliary registrations remain available at runtime") + public static void ensureAuxiliaryRegistrations(final DynamicTest test) { + test.onGameTest(helper -> helper.startSequence(() -> TestMod.instance().testmenu.getId().getPath()) + .thenExecute(menuId -> { + helper.assertValueEqual("testmenu", menuId, "Menu registration path"); + helper.assertValueEqual("entity.testmod.testentity", TestMod.instance().testentity.get().getDescriptionId(), "Entity translation key"); + helper.assertValueEqual("testitem", TestMod.instance().testduplicatename.getId().getPath(), "Duplicate-name entity registration path"); + helper.assertValueEqual("testblockentity", TestMod.instance().testblockentity.getId().getPath(), "Standalone block entity registration path"); + helper.assertValueEqual("testcustom", TestMod.instance().testcustom.getId().getPath(), "Custom registry entry path"); + helper.assertValueEqual("block.testmod.magic_item_model", TestMod.instance().magicItemModelTest.asStack().getItem().getDescriptionId(), "Magic item-model block description key"); + }) + .thenSucceed()); + } +} diff --git a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java index f0d3500..c61db7f 100644 --- a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java +++ b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java @@ -3,7 +3,7 @@ import com.modularmc.registrate.Registrate; import com.modularmc.registrate.builders.BlockBuilder; import com.modularmc.registrate.providers.DataGenContext; -import com.modularmc.registrate.providers.ProviderType; +import com.modularmc.registrate.providers.core.ProviderType; import com.modularmc.registrate.providers.generators.RegistrateItemModelGenerator; import com.modularmc.registrate.util.DataIngredient; import com.modularmc.registrate.util.entry.*; @@ -70,6 +70,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -121,7 +122,7 @@ public class TestMod { public static final String MOD_ID = "testmod"; - private class TestBlock extends Block implements EntityBlock { + public static final class TestBlock extends Block implements EntityBlock { public TestBlock(Properties properties) { super(properties); @@ -139,8 +140,8 @@ protected InteractionResult useWithoutItem(BlockState state, Level worldIn, Bloc player.openMenu(new MenuProvider() { @Override - public @Nullable AbstractContainerMenu createMenu(int windowId, Inventory inv, Player player) { - return new ChestMenu(MenuType.GENERIC_9x3, windowId, inv, testblockbe.get(worldIn, pos).orElseThrow(IllegalStateException::new), 3); + public AbstractContainerMenu createMenu(int windowId, Inventory inv, Player player) { + return new ChestMenu(MenuType.GENERIC_9x3, windowId, inv, TestMod.instance().testblockbe.get(worldIn, pos).orElseThrow(IllegalStateException::new), 3); } @Override @@ -153,8 +154,8 @@ public Component getDisplayName() { } @Override - public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return testblockbe.create(pos, state); + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return TestMod.instance().testblockbe.create(pos, state); } } @@ -198,21 +199,21 @@ private static class RenderState extends BlockEntityRenderState { } } - private class TestDummyBlockEntity extends BlockEntity { + public static final class TestDummyBlockEntity extends BlockEntity { public TestDummyBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); } } - private static class TestEntity extends Pig { + public static final class TestEntity extends Pig { public TestEntity(EntityType p_i50250_1_, Level p_i50250_2_) { super(p_i50250_1_, p_i50250_2_); } } - private static class TestCustomRegistryEntry {} + public static final class TestCustomRegistryEntry {} private final Registrate registrate = Registrate.create("testmod"); @@ -226,7 +227,7 @@ private static class TestCustomRegistryEntry {} @VisibleForTesting public final ItemEntry testitem = registrate.object("testitem") .item(Item::new) - .onRegister(item -> sawCallback.set(true)) + .onRegister(ignored -> sawCallback.set(true)) .properties(p -> p.food(new FoodProperties.Builder().nutrition(1).saturationModifier(0.2f).build())) .tag(ItemTags.BEDS) .model(() -> (ctx, prov) -> prov.createWithExistingModel(ctx.getEntry(), prov.mcLoc("block/stone"))) @@ -244,7 +245,7 @@ private static class TestCustomRegistryEntry {} @VisibleForTesting public final BlockEntry testblock = registrate.object("testblock") .block(TestBlock::new) - .properties(p -> p.noOcclusion()) + .properties(BlockBehaviour.Properties::noOcclusion) .blockstate(() -> (ctx, prov) -> prov.create(ctx.getEntry(), prov.getBuilder().transformTemplate(template -> template .parent(prov.mcLoc("block/glass"))).build(ctx.getEntry()))) @@ -285,7 +286,6 @@ private static class TestCustomRegistryEntry {} @VisibleForTesting public final BlockEntityEntry testblockbe = BlockEntityEntry.cast(testblock.getSibling(Registries.BLOCK_ENTITY_TYPE)); - @SuppressWarnings("deprecation") @VisibleForTesting public final EntityEntry testentity = registrate.object("testentity") .entity(TestEntity::new, MobCategory.CREATURE) @@ -326,69 +326,12 @@ private static class TestCustomRegistryEntry {} .menu((type, windowId, inv) -> new ChestMenu(type, windowId, inv, new SimpleContainer(9 * 9), 9), () -> ContainerScreen::new) .register(); - // private final RegistryEntry testbiome = registrate.object("testbiome") - // .biome(TestBiome::new) - // .properties(b -> b.category(Category.PLAINS) - // .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.getDefaultState(), - // Blocks.COBBLESTONE.getDefaultState(), Blocks.CLAY.getDefaultState())) - // .precipitation(RainType.RAIN) - // .depth(1) - // .scale(1) - // .temperature(1) - // .downfall(1) - // .waterColor(0x3f76e4) - // .waterFogColor(0x050533)) - // .typeWeight(BiomeType.WARM, 1000) - // .addDictionaryTypes(BiomeDictionary.Type.LUSH) - // .forceAutomaticDictionaryTypes() - // .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.BAMBOO, new ProbabilityConfig(0), () -> - // Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(20)) - // .addFeature(Decoration.SURFACE_STRUCTURES, () -> Feature.ICE_SPIKE, () -> Placement.COUNT_HEIGHTMAP_DOUBLE, new - // FrequencyConfig(100)) - // .addFeatures(DefaultBiomeFeatures::addVeryDenseGrass) - // .addCarver(Carving.AIR, () -> WorldCarver.CAVE, new ProbabilityConfig(0.1F)) - // .addSpawn(EntityClassification.CREATURE, () -> EntityType.IRON_GOLEM, 1, 2, 3) - // .addSpawn(EntityClassification.CREATURE, testentity, 1, 4, 8) - // .register(); - // - // private final RegistryEntry testbiome2 = registrate.object("testbiome2") - // .biome(TestBiome::new) - // .properties(b -> b.category(Category.DESERT) - // .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.SAND.getDefaultState(), - // Blocks.RED_SANDSTONE.getDefaultState(), Blocks.GRAVEL.getDefaultState())) - // .precipitation(RainType.NONE) - // .depth(1) - // .scale(1) - // .temperature(1) - // .downfall(1) - // .waterColor(0x3f76e4) - // .waterFogColor(0x050533)) - // .typeWeight(BiomeType.DESERT, 1000) - // .addDictionaryTypes(BiomeDictionary.Type.DRY) - // .forceAutomaticDictionaryTypes() - // .copyFeatures(() -> Biomes.DESERT) - // .copyCarvers(() -> Biomes.DESERT) - // .copySpawns(() -> Biomes.DESERT) - // .register(); - // - // private @Nullable DimensionType testdimensiontype; - // private final RegistryEntry testdimension = registrate.object("testdimension") - // .dimension(OverworldDimension::new) - // .hasSkyLight(false) - // .keepLoaded(false) - // .dimensionTypeCallback(t -> testdimensiontype = t) - // .register(); - @VisibleForTesting public final ResourceKey> CUSTOM_REGISTRY = registrate.makeRegistry("custom", RegistryBuilder::new); @VisibleForTesting public final RegistryEntry testcustom = registrate.object("testcustom") .simple(CUSTOM_REGISTRY, TestCustomRegistryEntry::new); - // private final BlockBuilder INVALID_TEST = registrate.object("invalid") - // .block(Block::new) - // .addLayer(() -> RenderType::getTranslucent); - private static BlockBuilder applyDiamondDrop(BlockBuilder builder) { return builder.loot((prov, block) -> prov.dropOther(block, Items.DIAMOND)); } @@ -405,14 +348,12 @@ public TestMod(IEventBus eventBus, ModContainer container) { registrate.addRawLang("testmod.custom.lang.slashes", "/commmands look good and here is a backslash \\"); registrate.addLang("tooltip", testblock.getId(), "Egg."); registrate.addLang("item", testitem.getId(), "testextra", "Magic!"); - registrate.addDataGenerator(ProviderType.ADVANCEMENT, adv -> { - Advancement.Builder.advancement() - .addCriterion("has_egg", InventoryChangeTrigger.TriggerInstance.hasItems(Items.EGG)) - .display(Items.EGG, - adv.title(registrate.getModid(), "root", "Test Advancement"), adv.desc(registrate.getModid(), "root", "Get an egg."), - Identifier.withDefaultNamespace("textures/gui/advancements/backgrounds/stone.png"), AdvancementType.TASK, true, true, false) - .save(adv, registrate.getModid() + ":root"); - }); + registrate.addDataGenerator(ProviderType.ADVANCEMENT, adv -> Advancement.Builder.advancement() + .addCriterion("has_egg", InventoryChangeTrigger.TriggerInstance.hasItems(Items.EGG)) + .display(Items.EGG, + adv.title(registrate.getModid(), "root", "Test Advancement"), adv.desc(registrate.getModid(), "root", "Get an egg."), + Identifier.withDefaultNamespace("textures/gui/advancements/backgrounds/stone.png"), AdvancementType.TASK, true, true, false) + .save(adv, registrate.getModid() + ":root")); registrate.addDataGenerator(ProviderType.GENERIC_SERVER, provider -> provider.add(data -> { // generic server side provider to generate custom dimension // to teleport to this dimension use the following command @@ -508,9 +449,10 @@ private void onCommonSetup(FMLCommonSetupEvent event) { testblockitem.is(Items.STONE); testblockbe.is(BlockEntityType.CHEST); // testbiome.is(Feature.BAMBOO); // should not compile - if (testfluid.get().getBucket() != Items.AIR) throw new IllegalStateException("Expected no bucket for test fluid"); // should - // not - // crash + if (testfluid.getBucket().isPresent()) throw new IllegalStateException("Expected no bucket entry for test fluid"); + if (testfluid.getSiblingOptional(Registries.ITEM).isPresent()) throw new IllegalStateException("Expected no item sibling for test fluid"); + if (testfluid.getBlock().isPresent()) throw new IllegalStateException("Expected no block sibling for test fluid"); + if (testfluid.getSource().getSource() != testfluid.getSource()) throw new IllegalStateException("Expected canonical fluid source"); } private static class Client { diff --git a/src/test/resources/META-INF/neoforge.mods.toml b/src/test/resources/META-INF/neoforge.mods.toml index 4fdf7c4..456e663 100644 --- a/src/test/resources/META-INF/neoforge.mods.toml +++ b/src/test/resources/META-INF/neoforge.mods.toml @@ -36,3 +36,10 @@ Have some lorem ipsum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mollis lacinia magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed sagittis luctus odio eu tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque volutpat ligula eget lacus auctor sagittis. In hac habitasse platea dictumst. Nunc gravida elit vitae sem vehicula efficitur. Donec mattis ipsum et arcu lobortis, eleifend sagittis sem rutrum. Cras pharetra quam eget posuere fermentum. Sed id tincidunt justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. ''' + +[[dependencies.testmod]] +modId="registrate" +type="required" +versionRange="[2.0.0,)" +ordering="AFTER" +side="BOTH" From 6309fd952205fc5d9c9294d7d329b9ac89ac24f1 Mon Sep 17 00:00:00 2001 From: qiuye2024github Date: Wed, 29 Apr 2026 16:30:38 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../registrate/builders/BiomeBuilder.java | 473 ------------------ 1 file changed, 473 deletions(-) delete mode 100644 src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java diff --git a/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java b/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java deleted file mode 100644 index a4aa8b8..0000000 --- a/src/main/java/com/modularmc/registrate/builders/BiomeBuilder.java +++ /dev/null @@ -1,473 +0,0 @@ -// package com.modularmc.registrate.builders; -// -// import java.util.Arrays; -// import java.util.EnumSet; -// -// import javax.annotation.Nonnull; -// -// import com.google.common.collect.HashMultimap; -// import com.google.common.collect.Multimap; -// import com.modularmc.registrate.AbstractRegistrate; -// import com.modularmc.registrate.providers.RegistrateLangProvider; -// import com.modularmc.registrate.util.nullness.NonNullConsumer; -// import com.modularmc.registrate.util.nullness.NonNullFunction; -// import com.modularmc.registrate.util.nullness.NonNullSupplier; -// import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; -// import com.modularmc.registrate.util.nullness.NonnullType; -// -// import net.minecraft.entity.EntityClassification; -// import net.minecraft.entity.EntityType; -// import net.minecraft.world.biome.Biome; -// import net.minecraft.world.biome.Biome.SpawnListEntry; -// import net.minecraft.world.gen.GenerationStage.Carving; -// import net.minecraft.world.gen.GenerationStage.Decoration; -// import net.minecraft.world.gen.carver.ConfiguredCarver; -// import net.minecraft.world.gen.carver.EmptyCarverConfig; -// import net.minecraft.world.gen.carver.ICarverConfig; -// import net.minecraft.world.gen.carver.WorldCarver; -// import net.minecraft.world.gen.feature.ConfiguredFeature; -// import net.minecraft.world.gen.feature.Feature; -// import net.minecraft.world.gen.feature.IFeatureConfig; -// import net.minecraft.world.gen.feature.NoFeatureConfig; -// import net.minecraft.world.gen.placement.IPlacementConfig; -// import net.minecraft.world.gen.placement.NoPlacementConfig; -// import net.minecraft.world.gen.placement.Placement; -// import net.minecraftforge.common.BiomeDictionary; -// import net.minecraftforge.common.BiomeManager; -// -/// ** -// * A builder for biomes, allows for customization of the {@link Biome.Builder biome properties}, and configuration of -// data associated with biomes (lang). -// * -// * @param -// * The type of biome being built -// * @param

                -// * Parent object type -// */ -// public class BiomeBuilder extends AbstractBuilder> { -// -// /** -// * Create a new {@link BiomeBuilder} and configure data. Used in lieu of adding side-effects to constructor, so that -// alternate initialization strategies can be done in subclasses. -// *

                -// * The biome will be assigned the following data: -// *

                  -// *
                • The default translation (via {@link #defaultLang()})
                • -// *
                -// * -// * @param -// * The type of the builder -// * @param

                -// * Parent object type -// * @param owner -// * The owning {@link AbstractRegistrate} object -// * @param parent -// * The parent object -// * @param name -// * Name of the entry being built -// * @param callback -// * A callback used to actually register the built entry -// * @param factory -// * Factory to create the biome -// * @return A new {@link BiomeBuilder} with reasonable default data generators. -// */ -// public static BiomeBuilder create(AbstractRegistrate owner, P parent, String name, -// BuilderCallback callback, NonNullFunction factory) { -// return new BiomeBuilder<>(owner, parent, name, callback, factory) -// .defaultLang(); -// } -// -// private final NonNullFunction factory; -// -// private NonNullSupplier initialProperties = Biome.Builder::new; -// private NonNullFunction propertiesCallback = NonNullUnaryOperator.identity(); -// -// private final Multimap>> features = HashMultimap.create(); -// private final Multimap>> carvers = HashMultimap.create(); -// private final Multimap> spawns = HashMultimap.create(); -// -// @SuppressWarnings("null") -// private final EnumSet configuredTypes = EnumSet.noneOf(BiomeManager.BiomeType.class); -// -// protected BiomeBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, -// NonNullFunction factory) { -// super(owner, parent, name, callback, Biome.class); -// this.factory = factory; -// } -// -// /** -// * Modify the properties of the biome. Modifications are done lazily, but the passed function is composed with the -// current one, and as such this method can be called multiple times to perform -// * different operations. -// *

                -// * If a different properties instance is returned, it will replace the existing one entirely. -// * -// * @param func -// * The action to perform on the properties -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder properties(NonNullUnaryOperator func) { -// propertiesCallback = propertiesCallback.andThen(func); -// return this; -// } -// -// /** -// * Replace the initial state of the biome properties, without replacing or removing any modifications done via {@link -// #properties(NonNullUnaryOperator)}. -// * -// * @param properties -// * A supplier to to create the initial properties -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder initialProperties(NonNullSupplier properties) { -// initialProperties = properties; -// return this; -// } -// -// /** -// * Set the weight for this biome to generate in the overworld in regions matching the given type. This can only be -// called once per type. -// * -// * @param type -// * The type that controls which climates the biome will spawn in -// * @param weight -// * The weight, or how common this biome should be in that climate -// * @return this {@link BiomeBuilder} -// * @see BiomeManager -// * @throws IllegalArgumentException -// * if this type has already had its weight set -// */ -// public BiomeBuilder typeWeight(BiomeManager.BiomeType type, int weight) { -// if (!configuredTypes.add(type)) { -// throw new IllegalArgumentException("Cannot set a type weight more than once."); -// } -// this.onRegister(b -> BiomeManager.addBiome(type, new BiomeManager.BiomeEntry(b, weight))); -// return this; -// } -// -// /** -// * Add types to the {@link BiomeDictionary} for this biome. Can be called multiple times to add more types. -// * -// * @param types -// * The types to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addDictionaryTypes(BiomeDictionary.Type... types) { -// this.onRegister(b -> BiomeDictionary.addTypes(b, types)); -// return this; -// } -// -// /** -// * Manually add what would have been the "best guess" types from the {@link BiomeDictionary} for this biome. This has -// no effect if no types are added via -// * {@link #addDictionaryTypes(net.minecraftforge.common.BiomeDictionary.Type...)}. -// * -// * @return this {@link BiomeBuilder} -// * @see BiomeDictionary#makeBestGuess(Biome) -// */ -// public BiomeBuilder forceAutomaticDictionaryTypes() { -// this.onRegister(BiomeDictionary::makeBestGuess); -// return this; -// } -// -// /** -// * Copy all {@link Feature features} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy features from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copyFeatures(NonNullSupplier biome) { -// addFeatures(b -> Arrays.stream(Decoration.values()) -// .forEach(d -> biome.get().getFeatures(d).stream() -// .forEach(f -> b.addFeature(d, f)))); -// return this; -// } -// -// /** -// * Add a feature to this biome, where neither the feature nor the placement have a config. -// * -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param placement -// * How the feature will be placed -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> feature, -// NonNullSupplier> placement) { -// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement); -// } -// -// /** -// * Add a feature to this biome, where the placement does not have a config. -// * -// * @param -// * The type of config the feature requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param featureConfig -// * The config for the feature -// * @param placement -// * How the feature will be placed -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, NonNullSupplier> -// feature, FC featureConfig, NonNullSupplier> placement) { -// return addFeature(stage, feature, featureConfig, placement, IPlacementConfig.NO_PLACEMENT_CONFIG); -// } -// -// /** -// * Add a feature to this biome, where the feature does not have a config. -// * @param -// * The type of config the placement requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param placement -// * How the feature will be placed -// * @param placementConfig -// * The config for the placement -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, -// NonNullSupplier> feature, NonNullSupplier> placement, PC placementConfig) { -// return addFeature(stage, feature, IFeatureConfig.NO_FEATURE_CONFIG, placement, placementConfig); -// } -// -// /** -// * Add a feature to this biome. -// * -// * @param -// * The type of config the feature requires -// * @param -// * The type of config the placement requires -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @param featureConfig -// * The config for the feature -// * @param placement -// * How the feature will be placed -// * @param placementConfig -// * The config for the placement -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeature(Decoration stage, -// NonNullSupplier> feature, FC featureConfig, NonNullSupplier> placement, PC placementConfig) -// { -// return addConfiguredFeature(stage, () -> -// feature.get().withConfiguration(featureConfig).withPlacement(placement.get().configure(placementConfig))); -// } -// -// /** -// * Add a pre-configured feature to this biome. -// * -// * @param stage -// * The stage which the feature will generate in -// * @param feature -// * The feature to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addConfiguredFeature(Decoration stage, NonNullSupplier> feature) { -// if (this.features.isEmpty()) { -// addFeatures(b -> this.features.forEach((d, f) -> b.addFeature(d, f.get()))); -// } -// this.features.put(stage, feature); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link Feature Features} are registered, for the purpose of adding -// them to this biome. -// *

                -// * Any {@link Feature} object can be safely referenced here and added to the biome via {@link -// Biome#addFeature(Decoration, ConfiguredFeature)} -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add features to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addFeatures(NonNullConsumer action) { -// this.>onRegisterAfter(Feature.class, action); -// return this; -// } -// -// /** -// * Copy all {@link WorldCarver carvers} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy carvers from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copyCarvers(NonNullSupplier biome) { -// addCarvers(b -> Arrays.stream(Carving.values()) -// .forEach(s -> biome.get().getCarvers(s).stream() -// .forEach(c -> b.addCarver(s, c)))); -// return this; -// } -// -// /** -// * Add a carver to this biome, where the carver does not have a config. -// * -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver) { -// return addCarver(type, carver, ICarverConfig.field_214644_a); -// } -// -// /** -// * Add a carver to this biome. -// * -// * @param The type of config the carver requires -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @param carverConfig -// * The config for the carver -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarver(Carving type, NonNullSupplier> carver, -// CC carverConfig) { -// return addConfiguredCarver(type, () -> Biome.createCarver(carver.get(), carverConfig)); -// } -// -// /** -// * Add a pre-configured carver to this biome. -// * -// * @param type -// * The type of carving to be done -// * @param carver -// * The carver to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addConfiguredCarver(Carving type, NonNullSupplier> carver) { -// if (this.features.isEmpty()) { -// addCarvers(b -> this.carvers.forEach((s, f) -> b.addCarver(s, f.get()))); -// } -// this.carvers.put(type, carver); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link WorldCarver WorldCarvers} are registered, for the purpose of -// adding them to this biome. -// *

                -// * Any {@link WorldCarver} object can be safely referenced here and added to the biome via {@link -// Biome#addCarver(Carving, ConfiguredCarver)} -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add carvers to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addCarvers(NonNullConsumer action) { -// this.> onRegisterAfter(WorldCarver.class, action); -// return this; -// } -// -// /** -// * Copy all {@link SpawnListEntry spawns} from another biome. Does not check for duplicates. -// * -// * @param biome -// * The biome to copy spawns from -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder copySpawns(NonNullSupplier biome) { -// addSpawns(b -> Arrays.stream(EntityClassification.values()) -// .forEach(ec -> biome.get().getSpawns(ec).stream() -// .forEach(s -> b.getSpawns(ec).add(s)))); -// return this; -// } -// -// /** -// * Add an entity spawn to this biome. -// * -// * @param type -// * The classification of the spawn, which controls how and when the entity is spawned -// * @param entity -// * The entity to spawn -// * @param weight -// * The weight of the spawn, i.e. how likely it is compared to other spawn entries to be selected -// * @param minGroupSize -// * A minimum size of entities to spawn at once -// * @param maxGroupSize -// * A maximum size of entities to spawn at once -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier> entity, int -// weight, int minGroupSize, int maxGroupSize) { -// return addSpawn(type, () -> new SpawnListEntry(entity.get(), weight, minGroupSize, maxGroupSize)); -// } -// -// /** -// * Add an entity spawn to this biome. -// * -// * @param type -// * The classification of the spawn, which controls how and when the entity is spawned -// * @param spawn -// * The spawn entry to add -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawn(EntityClassification type, NonNullSupplier spawn) { -// if (this.spawns.isEmpty()) { -// this.addSpawns(b -> this.spawns.forEach((c, s) -> b.getSpawns(c).add(s.get()))); -// } -// this.spawns.put(type, spawn); -// return this; -// } -// -// /** -// * Add a callback that will be invoked after all {@link EntityType Entities} are registered, for the purpose of adding -// entity spawns to this biome. -// *

                -// * Any {@link EntityType} object can be safely referenced here and added to the biome via {@link -// Biome#getSpawns(EntityClassification)}. -// * -// * @param action -// * A {@link NonNullConsumer} which will be called to add spawns to this biome. -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder addSpawns(NonNullConsumer action) { -// this.> onRegisterAfter(EntityType.class, action); -// return this; -// } -// -// /** -// * Assign the default translation, as specified by {@link RegistrateLangProvider#getAutomaticName(NonNullSupplier)}. -// This is the default, so it is generally not necessary to call, unless for -// * undoing previous changes. -// * -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder defaultLang() { -// return lang(Biome::getTranslationKey); -// } -// -// /** -// * Set the translation for this biome. -// * -// * @param name -// * A localized English name -// * @return this {@link BiomeBuilder} -// */ -// public BiomeBuilder lang(String name) { -// return lang(Biome::getTranslationKey, name); -// } -// -// @Override -// protected @NonnullType T createEntry() { -// @Nonnull Biome.Builder properties = this.initialProperties.get(); -// properties = propertiesCallback.apply(properties); -// return factory.apply(properties); -// } -// } From 983bcbec6b2837579d46ddd56288d0f3381fa2ff Mon Sep 17 00:00:00 2001 From: qiuye2024github Date: Wed, 29 Apr 2026 17:33:01 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E9=83=A8?= =?UTF-8?q?=E5=88=86datagen=EF=BC=8C=E7=BC=BA=E5=A4=B1=E7=BA=B9=E7=90=86?= =?UTF-8?q?=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- CHANGELOG.md | 6 +- build.gradle | 3 + gradle/scripts/moddevgradle.gradle | 16 +++- .../registrate/AbstractRegistrate.java | 13 ++- .../registrate/builders/BlockBuilder.java | 3 - .../registrate/builders/EntityBuilder.java | 80 +++++-------------- .../registrate/builders/FluidBuilder.java | 1 - .../registrate/builders/ItemBuilder.java | 17 +++- .../datagen/RegistrateDatagenBootstrap.java | 22 +++++ .../lifecycle/RegistrateLifecycle.java | 4 +- .../providers/RegistrateLangProvider.java | 7 +- .../core/RegistrateDataProvider.java | 2 + .../RegistrateItemModelGenerator.java | 6 +- .../registrate/util/DataIngredient.java | 1 - .../minecraft/tags/block/dragon_immune.json | 5 ++ .../minecraft/tags/block/supports_bamboo.json | 5 ++ .../minecraft/tags/block/wither_immune.json | 5 ++ .../minecraft/tags/entity_type/raiders.json | 5 ++ .../data/minecraft/tags/item/beds.json | 5 ++ ...diamond_block_from_testblock_campfire.json | 32 ++++++++ ...diamond_block_from_testblock_smelting.json | 32 ++++++++ .../diamond_block_from_testblock_smoking.json | 32 ++++++++ .../advancement/recipes/misc/testblock.json | 32 ++++++++ .../data/testmod/advancement/root.json | 32 ++++++++ .../testmod/dimension/test_dimension.json | 11 +++ .../dimension_type/test_dimension_type.json | 55 +++++++++++++ .../loot_table/blocks/magic_item_model.json | 21 +++++ .../testmod/loot_table/blocks/testblock.json | 21 +++++ .../loot_table/entities/testentity.json | 36 +++++++++ .../testmod/loot_table/entities/testitem.json | 4 + ...diamond_block_from_testblock_campfire.json | 10 +++ ...diamond_block_from_testblock_smelting.json | 10 +++ .../diamond_block_from_testblock_smoking.json | 10 +++ .../data/testmod/recipe/testblock.json | 16 ++++ .../gametests/RegistrationRuntimeTests.java | 2 + .../registrate/test/mod/TestMod.java | 25 +++--- 37 files changed, 497 insertions(+), 93 deletions(-) create mode 100644 src/main/java/com/modularmc/registrate/internal/datagen/RegistrateDatagenBootstrap.java create mode 100644 src/test/generated/resources/data/minecraft/tags/block/dragon_immune.json create mode 100644 src/test/generated/resources/data/minecraft/tags/block/supports_bamboo.json create mode 100644 src/test/generated/resources/data/minecraft/tags/block/wither_immune.json create mode 100644 src/test/generated/resources/data/minecraft/tags/entity_type/raiders.json create mode 100644 src/test/generated/resources/data/minecraft/tags/item/beds.json create mode 100644 src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_campfire.json create mode 100644 src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smelting.json create mode 100644 src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smoking.json create mode 100644 src/test/generated/resources/data/testmod/advancement/recipes/misc/testblock.json create mode 100644 src/test/generated/resources/data/testmod/advancement/root.json create mode 100644 src/test/generated/resources/data/testmod/dimension/test_dimension.json create mode 100644 src/test/generated/resources/data/testmod/dimension_type/test_dimension_type.json create mode 100644 src/test/generated/resources/data/testmod/loot_table/blocks/magic_item_model.json create mode 100644 src/test/generated/resources/data/testmod/loot_table/blocks/testblock.json create mode 100644 src/test/generated/resources/data/testmod/loot_table/entities/testentity.json create mode 100644 src/test/generated/resources/data/testmod/loot_table/entities/testitem.json create mode 100644 src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_campfire.json create mode 100644 src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smelting.json create mode 100644 src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smoking.json create mode 100644 src/test/generated/resources/data/testmod/recipe/testblock.json diff --git a/.gitignore b/.gitignore index de69db8..bd0e214 100644 --- a/.gitignore +++ b/.gitignore @@ -20,8 +20,7 @@ classes/ .settings *.launch .architectury-transformer/debug.log -src/generated/resources/.cache/ +**/resources/.cache/ *.patch *.DS_Store - diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d87b2d..0289e0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1,5 @@ -# ChangeLog- no changes +# ChangeLog + + + +- no changes diff --git a/build.gradle b/build.gradle index 9d87c46..bda19ff 100644 --- a/build.gradle +++ b/build.gradle @@ -35,6 +35,9 @@ sourceSets { test { compileClasspath += main.output + main.compileClasspath runtimeClasspath += main.output + main.runtimeClasspath + resources { + srcDir 'src/test/generated/resources' + } } extra { diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle index cd01e86..c8e644e 100644 --- a/gradle/scripts/moddevgradle.gradle +++ b/gradle/scripts/moddevgradle.gradle @@ -87,7 +87,7 @@ neoForge { data { clientData() serverData() - sourceSet = sourceSets.test + sourceSet = sourceSets.main ideName = "Data Generation" gameDirectory.set(file('run/data')) @@ -98,6 +98,20 @@ neoForge { programArguments.addAll('--existing', file('src/main/resources/').getAbsolutePath()) } + Testdata { + clientData() + serverData() + sourceSet = sourceSets.test + ideName = "Test Data Generation" + + gameDirectory.set(file('run/data')) + // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. + programArguments.addAll('--mod', "${devTestModId}") + programArguments.addAll('--all') + programArguments.addAll('--output', file('src/test/generated/resources/').getAbsolutePath()) + programArguments.addAll('--existing', file('src/test/resources/').getAbsolutePath()) + } + // applies to all the run configs above configureEach { // Recommended logging data for a userdev environment diff --git a/src/main/java/com/modularmc/registrate/AbstractRegistrate.java b/src/main/java/com/modularmc/registrate/AbstractRegistrate.java index 4d921da..cfe8824 100644 --- a/src/main/java/com/modularmc/registrate/AbstractRegistrate.java +++ b/src/main/java/com/modularmc/registrate/AbstractRegistrate.java @@ -56,7 +56,6 @@ import org.jspecify.annotations.Nullable; import java.util.*; -import java.util.Map.Entry; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.UnaryOperator; @@ -300,7 +299,7 @@ protected String currentName() { * if current name has not been set via {@link #object(String)} */ public RegistryEntry get(ResourceKey> type) { - return this.get(currentName(), type); + return this.get(currentName(), type); } /** @@ -657,7 +656,7 @@ public void genData(GeneratorType type, T gen) { provider.putSubProvider(type, gen); } datagens.get(type).forEach(cons -> { - Optional>>> entry = null; + Optional>>> entry = Optional.empty(); if (log.isEnabled(Level.DEBUG, DebugMarkers.DATA)) { entry = getEntryForGenerator(type, cons); if (entry.isPresent()) { @@ -669,7 +668,7 @@ public void genData(GeneratorType type, T gen) { try { ((Consumer) cons).accept(gen); } catch (Exception e) { - if (entry == null) { + if (entry.isEmpty()) { entry = getEntryForGenerator(type, cons); } Message err; @@ -977,7 +976,7 @@ public NoConfigBuilder generic(P parent, ResourceKe } public NoConfigBuilder generic(P parent, String name, ResourceKey> registryType, NonNullSupplier factory) { - return entry(name, callback -> new NoConfigBuilder(this, parent, name, callback, registryType, factory)); + return entry(name, callback -> new NoConfigBuilder<>(this, parent, name, callback, registryType, factory)); } // Items @@ -1234,7 +1233,7 @@ public , P> M } public , P> MenuBuilder menu(P parent, String name, MenuFactory factory, NonNullSupplier> screenFactory) { - return entry(name, callback -> new MenuBuilder(this, parent, name, callback, factory, screenFactory)); + return entry(name, callback -> new MenuBuilder<>(this, parent, name, callback, factory, screenFactory)); } public > MenuBuilder menu(ForgeMenuFactory factory, NonNullSupplier> screenFactory) { @@ -1250,7 +1249,7 @@ public , P> M } public , P> MenuBuilder menu(P parent, String name, ForgeMenuFactory factory, NonNullSupplier> screenFactory) { - return entry(name, callback -> new MenuBuilder(this, parent, name, callback, factory, screenFactory)); + return entry(name, callback -> new MenuBuilder<>(this, parent, name, callback, factory, screenFactory)); } // Creative Tab diff --git a/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java b/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java index 01d0e6e..e325beb 100644 --- a/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/BlockBuilder.java @@ -225,7 +225,6 @@ public BlockEntityBuilder> block * @param tintSources The tint sources to register for this block, indexed by tint index * @return this {@link BlockBuilder} */ - // TODO it might be worthwhile to abstract this more and add the capability to automatically copy to the item public BlockBuilder color(NonNullSupplier>> tintSources) { if (this.tintSources == null) { RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::registerBlockColor); @@ -377,8 +376,6 @@ public final BlockBuilder tag(TagKey... tags) { protected T createEntry() { @Nonnull BlockBehaviour.Properties properties = this.initialProperties.get(); - // TODO why do we need this? - // ObfuscationReflectionHelper.setPrivateValue(BlockBehaviour.Properties.class, properties, null, "drops"); properties = propertiesCallback.apply(properties); return factory.apply(properties.setId(getResourceKey())); } diff --git a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java index 4dc11ad..0a2bb00 100644 --- a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java @@ -25,6 +25,8 @@ import net.minecraft.world.entity.*; import net.minecraft.world.entity.SpawnPlacements.SpawnPredicate; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.level.Level; import net.minecraft.world.level.levelgen.Heightmap; import net.neoforged.api.distmarker.Dist; @@ -88,7 +90,7 @@ public static EntityBuilder create(AbstractRegistrat private @Nullable NonNullSupplier>> renderer; - private boolean attributesConfigured, spawnConfigured; // TODO make this more reuse friendly + private boolean attributesConfigured, spawnConfigured; protected EntityBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, EntityType.EntityFactory factory, MobCategory classification) { super(owner, parent, name, callback, Registries.ENTITY_TYPE); @@ -185,18 +187,6 @@ public EntityBuilder spawnPlacement(SpawnPlacementType type, Heightmap.Typ } spawnConfigured = true; this.onRegister(t -> { - /* - * TODO is there any way to do this now? - * try { - * if (!(t.create(null) instanceof MobEntity)) { - * throw new IllegalArgumentException("Cannot register spawn placement for entity " + t.getRegistryName() + - * " as it does not extend MobEntity"); - * } - * } catch (Exception e) { - * throw new RuntimeException("Failed to type check entity " + t.getRegistryName() + - * " when registering spawn placement", e); - * } - */ OneTimeEventReceiver.addModListener(getOwner(), RegisterSpawnPlacementsEvent.class, e -> { e.register(t, type, heightmap, predicate, operation); }); @@ -205,57 +195,34 @@ public EntityBuilder spawnPlacement(SpawnPlacementType type, Heightmap.Typ } /** - * Create a spawn egg item for this entity using the given colors, not allowing for any extra configuration. + * Create a spawn egg item for this entity and build it immediately. * - * Deprecated note: This does not work properly, see - * this issue. - *

                - * As a temporary measure, uses a custom egg class that imperfectly emulates the functionality - * - * @param primaryColor - * The primary color of the egg - * @param secondaryColor - * The secondary color of the egg * @return this {@link EntityBuilder} */ - /* - * TODO <1.21.4> spawn egg - * - * @Deprecated - * public EntityBuilder defaultSpawnEgg(int primaryColor, int secondaryColor) { - * return spawnEgg(primaryColor, secondaryColor).build(); - * } - * - */ + public EntityBuilder spawnEgg() { + return spawnEgg($ -> {}); + } /** - * Create a spawn egg item for this entity using the given colors, and return the builder for further configuration. + * Create a spawn egg item for this entity and expose its builder for further customization. * - * Deprecated note: This does not work properly, see - * this issue. *

                - * As a temporary measure, uses a custom egg class that imperfectly emulates the functionality + * The created egg uses the modern {@link net.minecraft.world.item.Item.Properties#spawnEgg(EntityType)} API and is + * added to {@link CreativeModeTabs#SPAWN_EGGS} by default. * - * @param primaryColor - * The primary color of the egg - * @param secondaryColor - * The secondary color of the egg - * @return the {@link ItemBuilder} for the egg item - */ - /* - * TODO <1.21.4> spawn egg - * - * @SuppressWarnings({ "rawtypes", "unchecked" }) - * - * @Deprecated - * public ItemBuilder> spawnEgg(int primaryColor, int secondaryColor) { - * var sup = asSupplier(); - * return getOwner().item(this, getName() + "_spawn_egg", p -> new DeferredSpawnEggItem((Supplier>) (Supplier) sup, primaryColor, secondaryColor, p)).tab(CreativeModeTabs.SPAWN_EGGS) - * .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), - * Identifier.withDefaultNamespace("item/template_spawn_egg"))); - * } + * @param consumer + * A callback for customizing the nested egg {@link ItemBuilder} + * @return this {@link EntityBuilder} */ + public EntityBuilder spawnEgg(NonNullConsumer>> consumer) { + NonNullSupplier> entityType = asSupplier(); + ItemBuilder> eggBuilder = getOwner() + .item(this, getName() + "_spawn_egg", SpawnEggItem::new) + .properties(properties -> properties.spawnEgg(entityType.get())) + .tab(CreativeModeTabs.SPAWN_EGGS); + consumer.accept(eggBuilder); + return eggBuilder.build(); + } /** * Assign the default translation, as specified by @@ -312,9 +279,6 @@ protected EntityType createEntry() { return builder.build(getResourceKey()); } - @Deprecated - protected void injectSpawnEggType(EntityType entry) {} - @Override protected RegistryEntry, EntityType> createEntryWrapper(DeferredHolder, EntityType> delegate) { return new EntityEntry<>(getOwner(), delegate); diff --git a/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java b/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java index 35a47c7..2329000 100644 --- a/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java @@ -507,7 +507,6 @@ public ItemBuilder> bucket(NonNullB } this.defaultBucket = false; NonNullSupplier source = this.source; - // TODO: Can we find a way to circumvent this limitation? if (source == null) { throw new IllegalStateException("Cannot create a bucket before creating a source block"); } diff --git a/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java b/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java index 5a3b441..2462102 100644 --- a/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/ItemBuilder.java @@ -19,7 +19,9 @@ import com.modularmc.registrate.util.nullness.NonNullSupplier; import com.modularmc.registrate.util.nullness.NonNullUnaryOperator; +import net.minecraft.client.color.item.ItemTintSource; import net.minecraft.client.data.models.model.ModelTemplates; +import net.minecraft.client.data.models.model.TextureMapping; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; @@ -211,15 +213,24 @@ public ItemBuilder removeTab(ResourceKey tab) { return this; } - // TODO <1.21.4> alternate item coloring helper? - /** * Assign the default model to this item, which is simply a generated model with a single texture of the same name. * * @return this {@link ItemBuilder} */ public ItemBuilder defaultModel() { - return model(() -> (ctx, prov) -> prov.generateFlatItem(ctx.get(), ModelTemplates.FLAT_ITEM)); + return defaultModel(new ItemTintSource[0]); + } + + /** + * Assign the default generated model to this item and apply the supplied item tint sources to its layers. + * + * @param tints + * Tint sources to apply to the generated model layers + * @return this {@link ItemBuilder} + */ + public ItemBuilder defaultModel(ItemTintSource... tints) { + return model(() -> (ctx, prov) -> prov.generateFlatItem(ctx.get(), ModelTemplates.FLAT_ITEM, TextureMapping.layer0(ctx.get()), tints)); } /** diff --git a/src/main/java/com/modularmc/registrate/internal/datagen/RegistrateDatagenBootstrap.java b/src/main/java/com/modularmc/registrate/internal/datagen/RegistrateDatagenBootstrap.java new file mode 100644 index 0000000..a23ed28 --- /dev/null +++ b/src/main/java/com/modularmc/registrate/internal/datagen/RegistrateDatagenBootstrap.java @@ -0,0 +1,22 @@ +package com.modularmc.registrate.internal.datagen; + +import net.minecraft.client.ClientBootstrap; + +/** + * Bridges the gap between NeoForge's server-side datagen entrypoints and + * Minecraft's client-side model codec bootstrap. + * + *

                + * In 26.1, item model serialization depends on client bootstrap state even when + * data generation is launched through the server datagen path. Triggering the + * vanilla bootstrap here keeps Registrate's client-facing generators usable in + * headless datagen runs. + */ +public final class RegistrateDatagenBootstrap { + + private RegistrateDatagenBootstrap() {} + + public static void bootstrapClientCodecs() { + ClientBootstrap.bootstrap(); + } +} diff --git a/src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java b/src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java index 22c3fba..5c74fbc 100644 --- a/src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java +++ b/src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java @@ -68,7 +68,9 @@ public void register(IEventBus bus) { }); if (hooks.doDatagen()) { - OneTimeEventReceiver.addModListener(owner, GatherDataEvent.Client.class, hooks::onData); + // The current moddev datagen entrypoints use DataServer, which dispatches the + // server-side gather event even when `--all` is requested. + OneTimeEventReceiver.addModListener(owner, GatherDataEvent.Server.class, hooks::onData); } } } diff --git a/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java b/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java index e5f5d35..ac14ff5 100644 --- a/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/RegistrateLangProvider.java @@ -148,6 +148,10 @@ public void addEntityType(NonNullSupplier> entity) { } } + private static boolean isFormatTokenChar(char c) { + return Character.isDigit(c) || c == '%' || c == '$' || c == 's' || c == 'd'; + } + private String toUpsideDown(String normal) { int formatIndex = 1; ArrayList ud = new ArrayList<>(); @@ -155,8 +159,7 @@ private String toUpsideDown(String normal) { char c = normal.charAt(i); if (c == '%') { String fmtArg = ""; - while (Character.isDigit(c) || c == '%' || c == '$' || c == 's' || c == 'd') { // TODO this is a bit - // lazy + while (isFormatTokenChar(c)) { if (fmtArg.equals("%") && c == 's') { fmtArg = "%" + formatIndex + "$s"; formatIndex++; diff --git a/src/main/java/com/modularmc/registrate/providers/core/RegistrateDataProvider.java b/src/main/java/com/modularmc/registrate/providers/core/RegistrateDataProvider.java index b346fae..3e69333 100644 --- a/src/main/java/com/modularmc/registrate/providers/core/RegistrateDataProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/core/RegistrateDataProvider.java @@ -1,6 +1,7 @@ package com.modularmc.registrate.providers.core; import com.modularmc.registrate.AbstractRegistrate; +import com.modularmc.registrate.internal.datagen.RegistrateDatagenBootstrap; import com.modularmc.registrate.internal.util.DebugMarkers; import com.modularmc.registrate.providers.RegistrateTagsProvider; @@ -80,6 +81,7 @@ public RegistrateDataProvider(AbstractRegistrate parent, String modid, Gather @Override public CompletableFuture run(CachedOutput cache) { + RegistrateDatagenBootstrap.bootstrapClientCodecs(); return registriesLookup.thenCompose(provider -> { var list = Lists.>newArrayList(); diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java index f2f141c..89cdea6 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java @@ -35,7 +35,6 @@ public RegistrateItemModelGenerator(AbstractRegistrate parent, ItemModelOutpu @Override public void run() { parent.genData(ProviderType.ITEM_MODEL, this); - // TODO check if an item actually has a valid model } public void createWithExistingModel(Item item, Identifier id) { @@ -54,6 +53,11 @@ public void generateFlatItem(Item item, ModelTemplate template, Material layer0) itemModelOutput.accept(item, ItemModelUtils.plainModel(template.create(item, TextureMapping.layer0(layer0), modelOutput))); } + public void generateFlatItem(Item item, ModelTemplate template, TextureMapping textures, ItemTintSource... tints) { + Identifier model = template.create(item, textures, modelOutput); + itemModelOutput.accept(item, tints.length == 0 ? ItemModelUtils.plainModel(model) : ItemModelUtils.tintedModel(model, tints)); + } + public void generateFlatBlockItem(BlockItem item) { generateFlatItem(item, TextureMapping.getBlockTexture(item.getBlock())); } diff --git a/src/main/java/com/modularmc/registrate/util/DataIngredient.java b/src/main/java/com/modularmc/registrate/util/DataIngredient.java index db7f0be..0829219 100644 --- a/src/main/java/com/modularmc/registrate/util/DataIngredient.java +++ b/src/main/java/com/modularmc/registrate/util/DataIngredient.java @@ -33,7 +33,6 @@ */ public final class DataIngredient { - // TODO <1.21.4> removed delegate. Is there a need to add it back? private final Ingredient parent; @Getter private final Identifier id; diff --git a/src/test/generated/resources/data/minecraft/tags/block/dragon_immune.json b/src/test/generated/resources/data/minecraft/tags/block/dragon_immune.json new file mode 100644 index 0000000..185287b --- /dev/null +++ b/src/test/generated/resources/data/minecraft/tags/block/dragon_immune.json @@ -0,0 +1,5 @@ +{ + "values": [ + "testmod:testblock" + ] +} \ No newline at end of file diff --git a/src/test/generated/resources/data/minecraft/tags/block/supports_bamboo.json b/src/test/generated/resources/data/minecraft/tags/block/supports_bamboo.json new file mode 100644 index 0000000..185287b --- /dev/null +++ b/src/test/generated/resources/data/minecraft/tags/block/supports_bamboo.json @@ -0,0 +1,5 @@ +{ + "values": [ + "testmod:testblock" + ] +} \ No newline at end of file diff --git a/src/test/generated/resources/data/minecraft/tags/block/wither_immune.json b/src/test/generated/resources/data/minecraft/tags/block/wither_immune.json new file mode 100644 index 0000000..185287b --- /dev/null +++ b/src/test/generated/resources/data/minecraft/tags/block/wither_immune.json @@ -0,0 +1,5 @@ +{ + "values": [ + "testmod:testblock" + ] +} \ No newline at end of file diff --git a/src/test/generated/resources/data/minecraft/tags/entity_type/raiders.json b/src/test/generated/resources/data/minecraft/tags/entity_type/raiders.json new file mode 100644 index 0000000..c064704 --- /dev/null +++ b/src/test/generated/resources/data/minecraft/tags/entity_type/raiders.json @@ -0,0 +1,5 @@ +{ + "values": [ + "testmod:testentity" + ] +} \ No newline at end of file diff --git a/src/test/generated/resources/data/minecraft/tags/item/beds.json b/src/test/generated/resources/data/minecraft/tags/item/beds.json new file mode 100644 index 0000000..8f30064 --- /dev/null +++ b/src/test/generated/resources/data/minecraft/tags/item/beds.json @@ -0,0 +1,5 @@ +{ + "values": [ + "testmod:testitem" + ] +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_campfire.json b/src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_campfire.json new file mode 100644 index 0000000..7c8f4ee --- /dev/null +++ b/src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_campfire.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_testblock": { + "conditions": { + "items": [ + { + "items": "testmod:testblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "testmod:diamond_block_from_testblock_campfire" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_testblock" + ] + ], + "rewards": { + "recipes": [ + "testmod:diamond_block_from_testblock_campfire" + ] + } +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smelting.json b/src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smelting.json new file mode 100644 index 0000000..bbbad68 --- /dev/null +++ b/src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smelting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_testblock": { + "conditions": { + "items": [ + { + "items": "testmod:testblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "testmod:diamond_block_from_testblock_smelting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_testblock" + ] + ], + "rewards": { + "recipes": [ + "testmod:diamond_block_from_testblock_smelting" + ] + } +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smoking.json b/src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smoking.json new file mode 100644 index 0000000..0cd3a34 --- /dev/null +++ b/src/test/generated/resources/data/testmod/advancement/recipes/misc/diamond_block_from_testblock_smoking.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_testblock": { + "conditions": { + "items": [ + { + "items": "testmod:testblock" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "testmod:diamond_block_from_testblock_smoking" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_testblock" + ] + ], + "rewards": { + "recipes": [ + "testmod:diamond_block_from_testblock_smoking" + ] + } +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/advancement/recipes/misc/testblock.json b/src/test/generated/resources/data/testmod/advancement/recipes/misc/testblock.json new file mode 100644 index 0000000..950b7cc --- /dev/null +++ b/src/test/generated/resources/data/testmod/advancement/recipes/misc/testblock.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_egg": { + "conditions": { + "items": [ + { + "items": "minecraft:egg" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "testmod:testblock" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_egg" + ] + ], + "rewards": { + "recipes": [ + "testmod:testblock" + ] + } +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/advancement/root.json b/src/test/generated/resources/data/testmod/advancement/root.json new file mode 100644 index 0000000..28d1f62 --- /dev/null +++ b/src/test/generated/resources/data/testmod/advancement/root.json @@ -0,0 +1,32 @@ +{ + "criteria": { + "has_egg": { + "conditions": { + "items": [ + { + "items": "minecraft:egg" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "background": "minecraft:textures/gui/advancements/backgrounds/stone.png", + "description": { + "translate": "advancements.testmod.root.description" + }, + "icon": { + "id": "minecraft:egg" + }, + "title": { + "translate": "advancements.testmod.root.title" + } + }, + "requirements": [ + [ + "has_egg" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/dimension/test_dimension.json b/src/test/generated/resources/data/testmod/dimension/test_dimension.json new file mode 100644 index 0000000..06f6aa9 --- /dev/null +++ b/src/test/generated/resources/data/testmod/dimension/test_dimension.json @@ -0,0 +1,11 @@ +{ + "type": "testmod:test_dimension_type", + "generator": { + "type": "minecraft:noise", + "biome_source": { + "type": "minecraft:fixed", + "biome": "minecraft:plains" + }, + "settings": "minecraft:overworld" + } +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/dimension_type/test_dimension_type.json b/src/test/generated/resources/data/testmod/dimension_type/test_dimension_type.json new file mode 100644 index 0000000..ff1f490 --- /dev/null +++ b/src/test/generated/resources/data/testmod/dimension_type/test_dimension_type.json @@ -0,0 +1,55 @@ +{ + "ambient_light": 0.0, + "attributes": { + "minecraft:audio/ambient_sounds": { + "mood": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + } + }, + "minecraft:audio/background_music": { + "creative": { + "max_delay": 24000, + "min_delay": 12000, + "sound": "minecraft:music.creative" + }, + "default": { + "max_delay": 24000, + "min_delay": 12000, + "sound": "minecraft:music.game" + } + }, + "minecraft:gameplay/bed_rule": { + "can_set_spawn": "always", + "can_sleep": "when_dark", + "error_message": { + "translate": "block.minecraft.bed.no_sleep" + } + }, + "minecraft:gameplay/nether_portal_spawns_piglin": true, + "minecraft:gameplay/respawn_anchor_works": false, + "minecraft:visual/ambient_light_color": "#0a0a0a", + "minecraft:visual/cloud_color": "#ccffffff", + "minecraft:visual/cloud_height": 192.33, + "minecraft:visual/fog_color": "#c0d8ff", + "minecraft:visual/sky_color": "#78a7ff" + }, + "coordinate_scale": 1.0, + "default_clock": "minecraft:overworld", + "has_ceiling": false, + "has_ender_dragon_fight": false, + "has_skylight": true, + "height": 384, + "infiniburn": "#minecraft:infiniburn_overworld", + "logical_height": 384, + "min_y": -64, + "monster_spawn_block_light_limit": 0, + "monster_spawn_light_level": { + "type": "minecraft:uniform", + "max_inclusive": 7, + "min_inclusive": 0 + }, + "timelines": "#minecraft:in_overworld" +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/loot_table/blocks/magic_item_model.json b/src/test/generated/resources/data/testmod/loot_table/blocks/magic_item_model.json new file mode 100644 index 0000000..e94ddd4 --- /dev/null +++ b/src/test/generated/resources/data/testmod/loot_table/blocks/magic_item_model.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "testmod:magic_item_model" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "testmod:blocks/magic_item_model" +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/loot_table/blocks/testblock.json b/src/test/generated/resources/data/testmod/loot_table/blocks/testblock.json new file mode 100644 index 0000000..ef4f7fc --- /dev/null +++ b/src/test/generated/resources/data/testmod/loot_table/blocks/testblock.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:diamond" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "testmod:blocks/testblock" +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/loot_table/entities/testentity.json b/src/test/generated/resources/data/testmod/loot_table/entities/testentity.json new file mode 100644 index 0000000..3e34c66 --- /dev/null +++ b/src/test/generated/resources/data/testmod/loot_table/entities/testentity.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "enchantment": "minecraft:looting", + "function": "minecraft:enchanted_count_increase" + } + ], + "name": "minecraft:diamond" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "testmod:entities/testentity" +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/loot_table/entities/testitem.json b/src/test/generated/resources/data/testmod/loot_table/entities/testitem.json new file mode 100644 index 0000000..058a463 --- /dev/null +++ b/src/test/generated/resources/data/testmod/loot_table/entities/testitem.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:entity", + "random_sequence": "testmod:entities/testitem" +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_campfire.json b/src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_campfire.json new file mode 100644 index 0000000..66c260d --- /dev/null +++ b/src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_campfire.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:campfire_cooking", + "category": "misc", + "cookingtime": 600, + "experience": 1.0, + "ingredient": "testmod:testblock", + "result": { + "id": "minecraft:diamond_block" + } +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smelting.json b/src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smelting.json new file mode 100644 index 0000000..4b5e4df --- /dev/null +++ b/src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smelting.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smelting", + "category": "misc", + "cookingtime": 200, + "experience": 1.0, + "ingredient": "testmod:testblock", + "result": { + "id": "minecraft:diamond_block" + } +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smoking.json b/src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smoking.json new file mode 100644 index 0000000..69eed99 --- /dev/null +++ b/src/test/generated/resources/data/testmod/recipe/diamond_block_from_testblock_smoking.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smoking", + "category": "misc", + "cookingtime": 100, + "experience": 1.0, + "ingredient": "testmod:testblock", + "result": { + "id": "minecraft:diamond_block" + } +} \ No newline at end of file diff --git a/src/test/generated/resources/data/testmod/recipe/testblock.json b/src/test/generated/resources/data/testmod/recipe/testblock.json new file mode 100644 index 0000000..6e325d8 --- /dev/null +++ b/src/test/generated/resources/data/testmod/recipe/testblock.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "D": "minecraft:diamond", + "E": "minecraft:egg" + }, + "pattern": [ + "DDD", + "DED", + "DDD" + ], + "result": { + "id": "testmod:testblock" + } +} \ No newline at end of file diff --git a/src/test/java/com/modularmc/registrate/test/gametests/RegistrationRuntimeTests.java b/src/test/java/com/modularmc/registrate/test/gametests/RegistrationRuntimeTests.java index 9c25537..95e5eb3 100644 --- a/src/test/java/com/modularmc/registrate/test/gametests/RegistrationRuntimeTests.java +++ b/src/test/java/com/modularmc/registrate/test/gametests/RegistrationRuntimeTests.java @@ -2,6 +2,7 @@ import com.modularmc.registrate.test.mod.TestMod; +import net.minecraft.world.item.SpawnEggItem; import net.neoforged.testframework.DynamicTest; import net.neoforged.testframework.annotation.ForEachTest; import net.neoforged.testframework.annotation.TestHolder; @@ -33,6 +34,7 @@ public static void ensureAuxiliaryRegistrations(final DynamicTest test) { .thenExecute(menuId -> { helper.assertValueEqual("testmenu", menuId, "Menu registration path"); helper.assertValueEqual("entity.testmod.testentity", TestMod.instance().testentity.get().getDescriptionId(), "Entity translation key"); + helper.assertValueEqual(TestMod.instance().testentity.get(), SpawnEggItem.getType(TestMod.instance().testentitySpawnEgg.asStack()), "Spawn egg should resolve to the registered entity type"); helper.assertValueEqual("testitem", TestMod.instance().testduplicatename.getId().getPath(), "Duplicate-name entity registration path"); helper.assertValueEqual("testblockentity", TestMod.instance().testblockentity.getId().getPath(), "Standalone block entity registration path"); helper.assertValueEqual("testcustom", TestMod.instance().testcustom.getId().getPath(), "Custom registry entry path"); diff --git a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java index c61db7f..7518723 100644 --- a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java +++ b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java @@ -13,6 +13,8 @@ import net.minecraft.advancements.criterion.InventoryChangeTrigger; import net.minecraft.client.color.block.BlockTintSources; import net.minecraft.client.color.item.Constant; +import net.minecraft.client.data.models.model.ModelTemplates; +import net.minecraft.client.data.models.model.TextureMapping; import net.minecraft.client.gui.screens.inventory.ContainerScreen; import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; @@ -246,9 +248,7 @@ public static final class TestCustomRegistryEntry {} public final BlockEntry testblock = registrate.object("testblock") .block(TestBlock::new) .properties(BlockBehaviour.Properties::noOcclusion) - .blockstate(() -> (ctx, prov) -> prov.create(ctx.getEntry(), - prov.getBuilder().transformTemplate(template -> template - .parent(prov.mcLoc("block/glass"))).build(ctx.getEntry()))) + .blockstate(() -> (ctx, prov) -> prov.create(ctx.getEntry(), prov.mcLoc("block/glass"))) .transform(TestMod::applyDiamondDrop) .recipe((ctx, prov) -> { prov.shaped(RecipeCategory.MISC, ctx.getEntry()) @@ -274,10 +274,12 @@ public static final class TestCustomRegistryEntry {} @VisibleForTesting public final BlockEntry magicItemModelTest = registrate.object("magic_item_model") .block(Block::new) - .blockstate(() -> (ctx, prov) -> prov.create(ctx.getEntry(), prov.getBuilder() - .transformTemplate(t -> t - .parent(prov.mcLoc("block/gold_block"))) - .build(prov.modLoc("block/subfolder/" + ctx.getName())))) + .blockstate(() -> (ctx, prov) -> prov.create( + ctx.getEntry(), + ModelTemplates.CUBE_ALL.create( + prov.modLoc("block/subfolder/" + ctx.getName()), + TextureMapping.cube(prov.mcBlockTexture("gold_block")), + prov.modelOutput))) .simpleItem() .register(); @@ -292,7 +294,7 @@ public static final class TestCustomRegistryEntry {} .attributes(Pig::createAttributes) .renderer(() -> PigRenderer::new) .spawnPlacement(SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR) - // TODO <1.21.4> .defaultSpawnEgg(0xFF0000, 0x00FF00) + .spawnEgg() .loot((prov, type) -> prov.add(type, LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1)) @@ -301,11 +303,13 @@ public static final class TestCustomRegistryEntry {} .apply(EnchantedCountIncreaseFunction.lootingMultiplier(prov.getRegistries(), UniformGenerator.between(0, 2))))))) .tag(EntityTypeTags.RAIDERS) .register(); + @VisibleForTesting + public final ItemEntry testentitySpawnEgg = ItemEntry.cast(registrate.get("testentity_spawn_egg", Registries.ITEM)); @VisibleForTesting public final BlockEntityEntry testblockentity = registrate.object("testblockentity") .blockEntity(TestDummyBlockEntity::new) - .validBlock(() -> Blocks.DIRT)// TODO <1.21.4> now empty valid block is not allowed + .validBlock(() -> Blocks.DIRT) .register(); @VisibleForTesting @@ -316,9 +320,6 @@ public static final class TestCustomRegistryEntry {} FluidType::new) .properties(p -> p.lightLevel(15).canConvertToSource(true)) .noBucket() - // .bucket() - // .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), prov.mcLoc("item/water_bucket"))) - // .build() .register(); @VisibleForTesting From 796bc771d7b1613cc57e9fb835d59423fa0b56da Mon Sep 17 00:00:00 2001 From: qiuye2024github Date: Wed, 29 Apr 2026 18:20:16 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=9D=E5=A4=A7?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=95=B0=E6=8D=AE=E7=94=9F=E6=88=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +++- gradle/scripts/moddevgradle.gradle | 6 ++---- .../registrate/builders/EntityBuilder.java | 2 +- .../registrate/builders/FluidBuilder.java | 19 ++++++++++++++++-- .../lifecycle/RegistrateLifecycle.java | 18 +++++++++++++---- .../generators/RegistrateModelProvider.java | 15 +++++++++++++- .../testmod/blockstates/magic_item_model.json | 7 +++++++ .../assets/testmod/blockstates/testblock.json | 7 +++++++ .../assets/testmod/blockstates/testfluid.json | 7 +++++++ .../testmod/items/magic_item_model.json | 6 ++++++ .../assets/testmod/items/testblock.json | 12 +++++++++++ .../testmod/items/testentity_spawn_egg.json | 6 ++++++ .../assets/testmod/items/testitem.json | 6 ++++++ .../resources/assets/testmod/lang/en_ud.json | 20 +++++++++++++++++++ .../resources/assets/testmod/lang/en_us.json | 20 +++++++++++++++++++ .../block/subfolder/magic_item_model.json | 6 ++++++ .../testmod/models/block/testfluid.json | 5 +++++ 17 files changed, 153 insertions(+), 13 deletions(-) create mode 100644 src/test/generated/resources/assets/testmod/blockstates/magic_item_model.json create mode 100644 src/test/generated/resources/assets/testmod/blockstates/testblock.json create mode 100644 src/test/generated/resources/assets/testmod/blockstates/testfluid.json create mode 100644 src/test/generated/resources/assets/testmod/items/magic_item_model.json create mode 100644 src/test/generated/resources/assets/testmod/items/testblock.json create mode 100644 src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json create mode 100644 src/test/generated/resources/assets/testmod/items/testitem.json create mode 100644 src/test/generated/resources/assets/testmod/lang/en_ud.json create mode 100644 src/test/generated/resources/assets/testmod/lang/en_us.json create mode 100644 src/test/generated/resources/assets/testmod/models/block/subfolder/magic_item_model.json create mode 100644 src/test/generated/resources/assets/testmod/models/block/testfluid.json diff --git a/build.gradle b/build.gradle index bda19ff..80cd051 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,9 @@ sourceSets { clientExtra { compileClasspath += client.output + extra.compileClasspath - runtimeClasspath += client.output + client.runtimeClasspath + extra.runtimeClasspath + // The normal client run also mounts the test mod, so include the test source set + // here to keep generated test resources synchronized into build/resources/test. + runtimeClasspath += client.output + client.runtimeClasspath + extra.runtimeClasspath + test.output + test.runtimeClasspath } } diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle index c8e644e..43a47c4 100644 --- a/gradle/scripts/moddevgradle.gradle +++ b/gradle/scripts/moddevgradle.gradle @@ -85,8 +85,7 @@ neoForge { } data { - clientData() - serverData() + type = 'clientData' sourceSet = sourceSets.main ideName = "Data Generation" @@ -99,8 +98,7 @@ neoForge { } Testdata { - clientData() - serverData() + type = 'clientData' sourceSet = sourceSets.test ideName = "Test Data Generation" diff --git a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java index 0a2bb00..74d947c 100644 --- a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java @@ -20,7 +20,6 @@ import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.*; import net.minecraft.world.entity.SpawnPlacements.SpawnPredicate; @@ -219,6 +218,7 @@ public EntityBuilder spawnEgg(NonNullConsumer> eggBuilder = getOwner() .item(this, getName() + "_spawn_egg", SpawnEggItem::new) .properties(properties -> properties.spawnEgg(entityType.get())) + .model(() -> (ctx, prov) -> prov.createWithExistingModel(ctx.getEntry(), prov.mcLoc("item/template_spawn_egg"))) .tab(CreativeModeTabs.SPAWN_EGGS); consumer.accept(eggBuilder); return eggBuilder.build(); diff --git a/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java b/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java index 2329000..7ba1d8f 100644 --- a/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java @@ -13,6 +13,7 @@ import com.modularmc.registrate.util.nullness.*; import net.minecraft.client.data.models.model.ModelTemplates; +import net.minecraft.client.data.models.model.TextureMapping; import net.minecraft.client.renderer.block.FluidModel; import net.minecraft.client.resources.model.sprite.Material; import net.minecraft.core.registries.Registries; @@ -65,6 +66,7 @@ public interface FluidFactory { } private @Nullable NonNullSupplier> model; + private @Nullable Material blockParticleTexture; private @Nullable NonNullSupplier> clientExtension; @@ -85,6 +87,7 @@ public FluidBuilder clientExtension(NonNullSupplier model(Identifier stillTexture, Identifier flowingTexture) { + this.blockParticleTexture = new Material(stillTexture); return model(() -> () -> new FluidModel.Unbaked(new Material(stillTexture), new Material(flowingTexture), null, null)); } @@ -100,7 +103,12 @@ protected void registerModel() { OneTimeEventReceiver.addModListener(getOwner(), RegisterFluidModelsEvent.class, e -> { NonNullSupplier> model = this.model; if (model != null) { - e.register(model.get().get(), getEntry()); + NonNullSupplier source = this.source; + if (source != null) { + e.register(model.get().get(), source.get(), getEntry()); + } else { + e.register(model.get().get(), getEntry()); + } } }); } @@ -445,10 +453,17 @@ public BlockBuilder> block(NonNull final NonNullSupplier supplier = asSupplier(); final var lightLevel = Lazy.of(() -> fluidType.get().getLightLevel()); final ToIntFunction lightLevelInt = $ -> lightLevel.get(); + final Material particleTexture = this.blockParticleTexture; final var ret = getOwner().>block(this, sourceName, p -> factory.apply(supplier.get(), p)) .properties(p -> BlockBehaviour.Properties.ofFullCopy(Blocks.WATER).noLootTable()) .properties(p -> p.lightLevel(lightLevelInt)) - .blockstate(() -> (ctx, prov) -> prov.createNonTemplateModelBlock(ctx.get())); + .blockstate(() -> (ctx, prov) -> { + if (particleTexture != null) { + prov.generateWithTemplate(ctx.get(), ModelTemplates.PARTICLE_ONLY, TextureMapping.particle(particleTexture)); + } else { + prov.createNonTemplateModelBlock(ctx.get()); + } + }); this.fluidProperties(p -> p.block(ret.asSupplier())); return ret; } diff --git a/src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java b/src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java index 5c74fbc..7f175a6 100644 --- a/src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java +++ b/src/main/java/com/modularmc/registrate/internal/lifecycle/RegistrateLifecycle.java @@ -12,6 +12,7 @@ import org.jspecify.annotations.Nullable; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; /** @@ -62,15 +63,24 @@ public void register(IEventBus bus) { bus.addListener(hooks::onBuildCreativeModeTabContents); // Register events fire multiple times, so clean them up on common setup. - OneTimeEventReceiver.addModListener(owner, FMLCommonSetupEvent.class, $ -> { + OneTimeEventReceiver.addModListener(owner, FMLCommonSetupEvent.class, event -> { + event.getClass(); OneTimeEventReceiver.unregister(owner, onRegister, RegisterEvent.class); OneTimeEventReceiver.unregister(owner, onRegisterLate, RegisterEvent.class); }); if (hooks.doDatagen()) { - // The current moddev datagen entrypoints use DataServer, which dispatches the - // server-side gather event even when `--all` is requested. - OneTimeEventReceiver.addModListener(owner, GatherDataEvent.Server.class, hooks::onData); + AtomicBoolean dataHooked = new AtomicBoolean(); + Consumer onData = event -> { + if (dataHooked.compareAndSet(false, true)) { + hooks.onData(event); + } + }; + + // Different moddev run types dispatch different concrete gather events. + // Register both and guard the callback so data providers are only attached once. + OneTimeEventReceiver.addModListener(owner, GatherDataEvent.Client.class, onData); + OneTimeEventReceiver.addModListener(owner, GatherDataEvent.Server.class, onData); } } } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java index 762fcbd..73a099b 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java @@ -3,9 +3,12 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.core.RegistrateProvider; +import com.mojang.serialization.JsonOps; + import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelGenerators; import net.minecraft.client.data.models.ModelProvider; +import net.minecraft.client.renderer.block.dispatch.BlockStateModelDispatcher; import net.minecraft.data.PackOutput; import net.neoforged.fml.LogicalSide; @@ -20,10 +23,20 @@ public RegistrateModelProvider(AbstractRegistrate parent, PackOutput p_388260 @Override protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels) { - new RegistrateBlockModelGenerator(parent, blockModels.blockStateOutput, blockModels.itemModelOutput, blockModels.modelOutput).run(); + var registrateBlockModels = new RegistrateBlockModelGenerator(parent, blockModels.blockStateOutput, blockModels.itemModelOutput, blockModels.modelOutput); + registrateBlockModels.run(); + registrateBlockModels.seenBlockstates.forEach((block, dispatcher) -> validateBlockStateEncoding(block, dispatcher)); new RegistrateItemModelGenerator(parent, itemModels.itemModelOutput, itemModels.modelOutput).run(); } + private static void validateBlockStateEncoding(net.minecraft.world.level.block.Block block, BlockStateModelDispatcher dispatcher) { + try { + BlockStateModelDispatcher.CODEC.encodeStart(JsonOps.INSTANCE, dispatcher); + } catch (RuntimeException ex) { + throw new IllegalStateException("Failed to encode blockstate definition for " + block.builtInRegistryHolder().key().identifier(), ex); + } + } + @Override public LogicalSide getSide() { return LogicalSide.CLIENT; diff --git a/src/test/generated/resources/assets/testmod/blockstates/magic_item_model.json b/src/test/generated/resources/assets/testmod/blockstates/magic_item_model.json new file mode 100644 index 0000000..0ad4a59 --- /dev/null +++ b/src/test/generated/resources/assets/testmod/blockstates/magic_item_model.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "testmod:block/subfolder/magic_item_model" + } + } +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/blockstates/testblock.json b/src/test/generated/resources/assets/testmod/blockstates/testblock.json new file mode 100644 index 0000000..5f6ec4d --- /dev/null +++ b/src/test/generated/resources/assets/testmod/blockstates/testblock.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/glass" + } + } +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/blockstates/testfluid.json b/src/test/generated/resources/assets/testmod/blockstates/testfluid.json new file mode 100644 index 0000000..791eb00 --- /dev/null +++ b/src/test/generated/resources/assets/testmod/blockstates/testfluid.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "testmod:block/testfluid" + } + } +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/items/magic_item_model.json b/src/test/generated/resources/assets/testmod/items/magic_item_model.json new file mode 100644 index 0000000..8f0f7e8 --- /dev/null +++ b/src/test/generated/resources/assets/testmod/items/magic_item_model.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "testmod:block/subfolder/magic_item_model" + } +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/items/testblock.json b/src/test/generated/resources/assets/testmod/items/testblock.json new file mode 100644 index 0000000..0f2f576 --- /dev/null +++ b/src/test/generated/resources/assets/testmod/items/testblock.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -65536 + } + ] + } +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json b/src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json new file mode 100644 index 0000000..617de72 --- /dev/null +++ b/src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg" + } +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/items/testitem.json b/src/test/generated/resources/assets/testmod/items/testitem.json new file mode 100644 index 0000000..f5c9f2a --- /dev/null +++ b/src/test/generated/resources/assets/testmod/items/testitem.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone" + } +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/lang/en_ud.json b/src/test/generated/resources/assets/testmod/lang/en_ud.json new file mode 100644 index 0000000..a7c7766 --- /dev/null +++ b/src/test/generated/resources/assets/testmod/lang/en_ud.json @@ -0,0 +1,20 @@ +{ + "advancements.testmod.root.description": "˙bbǝ uɐ ʇǝ⅁", + "advancements.testmod.root.title": "ʇuǝɯǝɔuɐʌpⱯ ʇsǝ⟘", + "block.testmod.magic_item_model": "ןǝpoW ɯǝʇI ɔıbɐW", + "block.testmod.testblock": "ʞɔoןqʇsǝ⟘", + "block.testmod.testfluid": "pınןɟʇsǝ⟘", + "entity.testmod.testentity": "ʎʇıʇuǝʇsǝ⟘", + "entity.testmod.testitem": "ɯǝʇıʇsǝ⟘", + "fluid.testmod.testfluid": "pınןɟʇsǝ⟘", + "item.testmod.testentity_spawn_egg": "bbƎ uʍɐdS ʎʇıʇuǝʇsǝ⟘", + "item.testmod.testitem": "ɯǝʇıʇsǝ⟘", + "item.testmod.testitem.testextra": "¡ɔıbɐW", + "itemGroup.testmod.test_creative_mode_tab": "qɐ⟘ ǝpoW ǝʌıʇɐǝɹƆ ʇsǝ⟘", + "testmod.custom.lang": "ʇsǝ⟘", + "testmod.custom.lang.brackets": "◁ϛ ʇǝʞɔɐɹᗺ▷ <ㄣ ʇǝʞɔɐɹᗺ> {Ɛ ʇǝʞɔɐɹᗺ} [ᄅ ʇǝʞɔɐɹᗺ] (Ɩ ʇǝʞɔɐɹᗺ)", + "testmod.custom.lang.slashes": "/ ɥsɐןsʞɔɐq ɐ sı ǝɹǝɥ puɐ poob ʞooן spuɐɯɯɯoɔ\\", + "testmod.custom.lang.with_placeholders1": "%2$s ᄅ ɹǝpןoɥǝɔɐןԀ %1$s Ɩ ɹǝpןoɥǝɔɐןԀ", + "testmod.custom.lang.with_placeholders2": "%3$s Ɛ ɹǝpןoɥǝɔɐןԀ %2$s ᄅ ɹǝpןoɥǝɔɐןԀ %1$s Ɩ ɹǝpןoɥǝɔɐןԀ", + "tooltip.testmod.testblock": "˙bbƎ" +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/lang/en_us.json b/src/test/generated/resources/assets/testmod/lang/en_us.json new file mode 100644 index 0000000..40fbca6 --- /dev/null +++ b/src/test/generated/resources/assets/testmod/lang/en_us.json @@ -0,0 +1,20 @@ +{ + "advancements.testmod.root.description": "Get an egg.", + "advancements.testmod.root.title": "Test Advancement", + "block.testmod.magic_item_model": "Magic Item Model", + "block.testmod.testblock": "Testblock", + "block.testmod.testfluid": "Testfluid", + "entity.testmod.testentity": "Testentity", + "entity.testmod.testitem": "Testitem", + "fluid.testmod.testfluid": "Testfluid", + "item.testmod.testentity_spawn_egg": "Testentity Spawn Egg", + "item.testmod.testitem": "Testitem", + "item.testmod.testitem.testextra": "Magic!", + "itemGroup.testmod.test_creative_mode_tab": "Test Creative Mode Tab", + "testmod.custom.lang": "Test", + "testmod.custom.lang.brackets": "(Bracket 1) [Bracket 2] {Bracket 3} ◁Bracket 5▷", + "testmod.custom.lang.slashes": "/commmands look good and here is a backslash \\", + "testmod.custom.lang.with_placeholders1": "Placeholder 1 %s Placeholder 2 %s", + "testmod.custom.lang.with_placeholders2": "Placeholder 1 %s Placeholder 2 %2$s Placeholder 3 %s", + "tooltip.testmod.testblock": "Egg." +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/models/block/subfolder/magic_item_model.json b/src/test/generated/resources/assets/testmod/models/block/subfolder/magic_item_model.json new file mode 100644 index 0000000..e4cf5ec --- /dev/null +++ b/src/test/generated/resources/assets/testmod/models/block/subfolder/magic_item_model.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "minecraft:block/gold_block" + } +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/models/block/testfluid.json b/src/test/generated/resources/assets/testmod/models/block/testfluid.json new file mode 100644 index 0000000..467346c --- /dev/null +++ b/src/test/generated/resources/assets/testmod/models/block/testfluid.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/water_flow" + } +} \ No newline at end of file From 4413397a70252803487ecd45b68ab2736e738620 Mon Sep 17 00:00:00 2001 From: qiuye2024github Date: Wed, 29 Apr 2026 18:25:29 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modularmc/registrate/builders/EntityBuilder.java | 2 +- .../modularmc/registrate/builders/FluidBuilder.java | 2 +- .../assets/testmod/blockstates/testbucketfluid.json | 7 +++++++ .../assets/testmod/items/testbucketfluid_bucket.json | 6 ++++++ .../assets/testmod/items/testentity_spawn_egg.json | 2 +- .../generated/resources/assets/testmod/lang/en_ud.json | 3 +++ .../generated/resources/assets/testmod/lang/en_us.json | 3 +++ .../assets/testmod/models/block/testbucketfluid.json | 5 +++++ .../com/modularmc/registrate/test/mod/TestMod.java | 10 ++++++++++ 9 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/test/generated/resources/assets/testmod/blockstates/testbucketfluid.json create mode 100644 src/test/generated/resources/assets/testmod/items/testbucketfluid_bucket.json create mode 100644 src/test/generated/resources/assets/testmod/models/block/testbucketfluid.json diff --git a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java index 74d947c..9e0a3e3 100644 --- a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java @@ -218,7 +218,7 @@ public EntityBuilder spawnEgg(NonNullConsumer> eggBuilder = getOwner() .item(this, getName() + "_spawn_egg", SpawnEggItem::new) .properties(properties -> properties.spawnEgg(entityType.get())) - .model(() -> (ctx, prov) -> prov.createWithExistingModel(ctx.getEntry(), prov.mcLoc("item/template_spawn_egg"))) + .model(() -> (ctx, prov) -> prov.createWithExistingModel(ctx.getEntry(), prov.mcLoc("item/pig_spawn_egg"))) .tab(CreativeModeTabs.SPAWN_EGGS); consumer.accept(eggBuilder); return eggBuilder.build(); diff --git a/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java b/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java index 7ba1d8f..01afa87 100644 --- a/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java @@ -527,7 +527,7 @@ public ItemBuilder> bucket(NonNullB } final var ret = getOwner().>item(this, bucketName, p -> factory.apply(source.get(), p)) .properties(p -> p.craftRemainder(Items.BUCKET).stacksTo(1)) - .model(() -> (ctx, prov) -> prov.generateFlatItem(ctx.get(), ModelTemplates.FLAT_ITEM)); + .model(() -> (ctx, prov) -> prov.createWithExistingModel(ctx.getEntry(), prov.mcLoc("item/water_bucket"))); this.fluidProperties(p -> p.bucket(ret.asSupplier())); return ret; } diff --git a/src/test/generated/resources/assets/testmod/blockstates/testbucketfluid.json b/src/test/generated/resources/assets/testmod/blockstates/testbucketfluid.json new file mode 100644 index 0000000..d97bc1a --- /dev/null +++ b/src/test/generated/resources/assets/testmod/blockstates/testbucketfluid.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "testmod:block/testbucketfluid" + } + } +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/items/testbucketfluid_bucket.json b/src/test/generated/resources/assets/testmod/items/testbucketfluid_bucket.json new file mode 100644 index 0000000..0a61695 --- /dev/null +++ b/src/test/generated/resources/assets/testmod/items/testbucketfluid_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/water_bucket" + } +} \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json b/src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json index 617de72..a175703 100644 --- a/src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json +++ b/src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "minecraft:item/template_spawn_egg" + "model": "minecraft:item/pig_spawn_egg" } } \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/lang/en_ud.json b/src/test/generated/resources/assets/testmod/lang/en_ud.json index a7c7766..a236878 100644 --- a/src/test/generated/resources/assets/testmod/lang/en_ud.json +++ b/src/test/generated/resources/assets/testmod/lang/en_ud.json @@ -3,10 +3,13 @@ "advancements.testmod.root.title": "ʇuǝɯǝɔuɐʌpⱯ ʇsǝ⟘", "block.testmod.magic_item_model": "ןǝpoW ɯǝʇI ɔıbɐW", "block.testmod.testblock": "ʞɔoןqʇsǝ⟘", + "block.testmod.testbucketfluid": "pınןɟʇǝʞɔnqʇsǝ⟘", "block.testmod.testfluid": "pınןɟʇsǝ⟘", "entity.testmod.testentity": "ʎʇıʇuǝʇsǝ⟘", "entity.testmod.testitem": "ɯǝʇıʇsǝ⟘", + "fluid.testmod.testbucketfluid": "pınןɟʇǝʞɔnqʇsǝ⟘", "fluid.testmod.testfluid": "pınןɟʇsǝ⟘", + "item.testmod.testbucketfluid_bucket": "ʇǝʞɔnᗺ pınןɟʇǝʞɔnqʇsǝ⟘", "item.testmod.testentity_spawn_egg": "bbƎ uʍɐdS ʎʇıʇuǝʇsǝ⟘", "item.testmod.testitem": "ɯǝʇıʇsǝ⟘", "item.testmod.testitem.testextra": "¡ɔıbɐW", diff --git a/src/test/generated/resources/assets/testmod/lang/en_us.json b/src/test/generated/resources/assets/testmod/lang/en_us.json index 40fbca6..58f56c5 100644 --- a/src/test/generated/resources/assets/testmod/lang/en_us.json +++ b/src/test/generated/resources/assets/testmod/lang/en_us.json @@ -3,10 +3,13 @@ "advancements.testmod.root.title": "Test Advancement", "block.testmod.magic_item_model": "Magic Item Model", "block.testmod.testblock": "Testblock", + "block.testmod.testbucketfluid": "Testbucketfluid", "block.testmod.testfluid": "Testfluid", "entity.testmod.testentity": "Testentity", "entity.testmod.testitem": "Testitem", + "fluid.testmod.testbucketfluid": "Testbucketfluid", "fluid.testmod.testfluid": "Testfluid", + "item.testmod.testbucketfluid_bucket": "Testbucketfluid Bucket", "item.testmod.testentity_spawn_egg": "Testentity Spawn Egg", "item.testmod.testitem": "Testitem", "item.testmod.testitem.testextra": "Magic!", diff --git a/src/test/generated/resources/assets/testmod/models/block/testbucketfluid.json b/src/test/generated/resources/assets/testmod/models/block/testbucketfluid.json new file mode 100644 index 0000000..6703228 --- /dev/null +++ b/src/test/generated/resources/assets/testmod/models/block/testbucketfluid.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/water_still" + } +} \ No newline at end of file diff --git a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java index 7518723..f9a9569 100644 --- a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java +++ b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java @@ -322,6 +322,15 @@ public static final class TestCustomRegistryEntry {} .noBucket() .register(); + @VisibleForTesting + public final FluidEntry testbucketfluid = registrate.object("testbucketfluid") + .fluid( + Identifier.withDefaultNamespace("block/water_still"), + Identifier.withDefaultNamespace("block/water_flow"), + FluidType::new) + .properties(p -> p.lightLevel(7).canConvertToSource(true)) + .register(); + @VisibleForTesting public final MenuEntry testmenu = registrate.object("testmenu") .menu((type, windowId, inv) -> new ChestMenu(type, windowId, inv, new SimpleContainer(9 * 9), 9), () -> ContainerScreen::new) @@ -454,6 +463,7 @@ private void onCommonSetup(FMLCommonSetupEvent event) { if (testfluid.getSiblingOptional(Registries.ITEM).isPresent()) throw new IllegalStateException("Expected no item sibling for test fluid"); if (testfluid.getBlock().isPresent()) throw new IllegalStateException("Expected no block sibling for test fluid"); if (testfluid.getSource().getSource() != testfluid.getSource()) throw new IllegalStateException("Expected canonical fluid source"); + if (testbucketfluid.getBucket().isEmpty()) throw new IllegalStateException("Expected a generated bucket entry for test bucket fluid"); } private static class Client { From fabafef8f14cc688fb78fe84714c24dbd11d8b99 Mon Sep 17 00:00:00 2001 From: qiuye2024github Date: Wed, 29 Apr 2026 18:46:52 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E5=AE=8C=E5=85=A8=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- docs/architecture.md | 3 ++- .../modularmc/registrate/RegistrateLib.java | 17 ++++------------- .../registrate/builders/EntityBuilder.java | 5 ++++- .../registrate/builders/FluidBuilder.java | 12 +++++++++--- .../RegistrateItemModelGenerator.java | 16 ++++++++++++++++ .../testmod/items/testbucketfluid_bucket.json | 10 ++++++++-- .../testmod/items/testentity_spawn_egg.json | 2 +- .../models/item/testentity_spawn_egg.json | 6 ++++++ .../modularmc/registrate/test/mod/TestMod.java | 3 ++- .../textures/item/testentity_spawn_egg.png | Bin 0 -> 220 bytes 11 files changed, 54 insertions(+), 24 deletions(-) create mode 100644 src/test/generated/resources/assets/testmod/models/item/testentity_spawn_egg.json create mode 100644 src/test/resources/assets/testmod/textures/item/testentity_spawn_egg.png diff --git a/README.md b/README.md index 693928a..fd71cdd 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ This repository is the `com.modularmc.registrate` fork maintained for the Modula ## Code Classification -- `com.modularmc.registrate`: public API roots, fork metadata, and the central registration coordinator. +- `com.modularmc.registrate`: public API roots, minimal library bootstrap, and the central registration coordinator. - `com.modularmc.registrate.builders`: the fluent DSL used by downstream mods to register content. - `com.modularmc.registrate.providers`: data generation orchestration and provider lifecycle management. - `com.modularmc.registrate.providers.generators`: blockstate, model, and recipe generator adapters. @@ -28,7 +28,7 @@ This repository is the `com.modularmc.registrate` fork maintained for the Modula - `com.modularmc.registrate.internal.event`: one-shot event wiring used by builders and registration lifecycle hooks. - `com.modularmc.registrate.internal.lifecycle`: per-instance lifecycle bridges that keep NeoForge event hookups centralized without collapsing multiple mods into one shared runtime. - `com.modularmc.registrate.internal.util`: dist-gated execution and internal logging helpers. -- `com.modularmc.registrate.test.mod`: an integration-style sample mod that exercises the public API. +- `com.modularmc.registrate.test.mod`: the integration-style sample mod where non-library showcase behavior should live. - `com.modularmc.registrate.test.gametests`: executable validation scenarios for runtime behavior. - `com.modularmc.registrate.test.meta`: maintenance utilities that keep generated bridge methods aligned with upstream APIs. diff --git a/docs/architecture.md b/docs/architecture.md index 795436c..f81f407 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -10,7 +10,7 @@ - Public entrypoints. - `AbstractRegistrate` is the orchestration core. - `Registrate` is the default public implementation. - - `RegistrateLib` is the NeoForge library entrypoint for this fork and also exposes shared metadata/constants. + - `RegistrateLib` is the minimal NeoForge library entrypoint for this fork. - `com.modularmc.registrate.builders` - Public-facing fluent registration DSL. - Owns object construction rules and builder chaining behavior. @@ -54,6 +54,7 @@ Treat the root package plus `builders` and `util.entry` as the main downstream-f - Event-bus plumbing and other implementation-only helpers belong under `internal`. - Instance-scoped NeoForge lifecycle orchestration belongs in `internal.lifecycle`. - Test-only scaffolding belongs under `src/test/java` even if it mirrors production APIs. +- Sample visuals, showcase content, and anything that is not intrinsic to the reusable registration library should also stay under `src/test`. ## Modernization Principles diff --git a/src/main/java/com/modularmc/registrate/RegistrateLib.java b/src/main/java/com/modularmc/registrate/RegistrateLib.java index d411a40..6d98a63 100644 --- a/src/main/java/com/modularmc/registrate/RegistrateLib.java +++ b/src/main/java/com/modularmc/registrate/RegistrateLib.java @@ -3,28 +3,19 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.common.Mod; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.util.Random; - /** - * Runtime entrypoint and shared metadata for the ModularMCLib variant of - * Registrate. + * Runtime entrypoint for the ModularMCLib variant of Registrate. * *

                * This library is intended to load as its own NeoForge mod so downstream - * mods can depend on it as a prerequisite during development. + * mods can depend on it as a prerequisite during development. Integration + * scenarios, sample registrations, and visual validation belong in the test + * harness under {@code src/test}. */ @Mod(RegistrateLib.MOD_ID) public final class RegistrateLib { public static final String MOD_ID = "registrate"; - public static final String MOD_NAME = "RegistrateLib"; - - public static final Logger LOGGER = LogManager.getLogger(MOD_ID); - - public static final Random RANDOM = new Random(); public RegistrateLib(IEventBus modEventBus) {} } diff --git a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java index 9e0a3e3..86edccd 100644 --- a/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/EntityBuilder.java @@ -209,6 +209,10 @@ public EntityBuilder spawnEgg() { * The created egg uses the modern {@link net.minecraft.world.item.Item.Properties#spawnEgg(EntityType)} API and is * added to {@link CreativeModeTabs#SPAWN_EGGS} by default. * + *

                + * No default item model is generated. If a consumer wants spawn egg visuals, + * it should provide them explicitly via the nested {@link ItemBuilder}. + * * @param consumer * A callback for customizing the nested egg {@link ItemBuilder} * @return this {@link EntityBuilder} @@ -218,7 +222,6 @@ public EntityBuilder spawnEgg(NonNullConsumer> eggBuilder = getOwner() .item(this, getName() + "_spawn_egg", SpawnEggItem::new) .properties(properties -> properties.spawnEgg(entityType.get())) - .model(() -> (ctx, prov) -> prov.createWithExistingModel(ctx.getEntry(), prov.mcLoc("item/pig_spawn_egg"))) .tab(CreativeModeTabs.SPAWN_EGGS); consumer.accept(eggBuilder); return eggBuilder.build(); diff --git a/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java b/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java index 01afa87..3bee7af 100644 --- a/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java +++ b/src/main/java/com/modularmc/registrate/builders/FluidBuilder.java @@ -100,7 +100,8 @@ public FluidBuilder model(NonNullSupplier> mo } protected void registerModel() { - OneTimeEventReceiver.addModListener(getOwner(), RegisterFluidModelsEvent.class, e -> { + var modEventBus = getOwner().getModEventBus(); + java.util.function.Consumer listener = e -> { NonNullSupplier> model = this.model; if (model != null) { NonNullSupplier source = this.source; @@ -110,7 +111,12 @@ protected void registerModel() { e.register(model.get().get(), getEntry()); } } - }); + }; + if (modEventBus != null) { + modEventBus.addListener(listener); + } else { + OneTimeEventReceiver.addModListener(getOwner(), RegisterFluidModelsEvent.class, listener); + } } protected void registerClientExtension() { @@ -527,7 +533,7 @@ public ItemBuilder> bucket(NonNullB } final var ret = getOwner().>item(this, bucketName, p -> factory.apply(source.get(), p)) .properties(p -> p.craftRemainder(Items.BUCKET).stacksTo(1)) - .model(() -> (ctx, prov) -> prov.createWithExistingModel(ctx.getEntry(), prov.mcLoc("item/water_bucket"))); + .model(() -> (ctx, prov) -> prov.generateFluidBucket(ctx.getEntry(), source.get())); this.fluidProperties(p -> p.bucket(ret.asSupplier())); return ret; } diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java index 89cdea6..56eaa19 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateItemModelGenerator.java @@ -19,7 +19,10 @@ import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.material.Fluid; +import net.neoforged.neoforge.client.model.item.DynamicFluidContainerModel; +import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.UnaryOperator; @@ -109,4 +112,17 @@ public String name(NonNullSupplier item) { public void generateTintedModel(Item entry, Identifier model, ItemTintSource tint) { this.itemModelOutput.accept(entry, ItemModelUtils.tintedModel(model, tint)); } + + public void generateFluidBucket(Item item, Fluid fluid) { + itemModelOutput.accept(item, new DynamicFluidContainerModel.Unbaked( + new DynamicFluidContainerModel.Textures( + Optional.of(mcItemTexture("bucket")), + Optional.of(mcItemTexture("bucket")), + Optional.of(new Material(Identifier.fromNamespaceAndPath("neoforge", "item/mask/bucket_fluid"))), + Optional.empty()), + fluid, + true, + true, + true)); + } } diff --git a/src/test/generated/resources/assets/testmod/items/testbucketfluid_bucket.json b/src/test/generated/resources/assets/testmod/items/testbucketfluid_bucket.json index 0a61695..b48ce41 100644 --- a/src/test/generated/resources/assets/testmod/items/testbucketfluid_bucket.json +++ b/src/test/generated/resources/assets/testmod/items/testbucketfluid_bucket.json @@ -1,6 +1,12 @@ { "model": { - "type": "minecraft:model", - "model": "minecraft:item/water_bucket" + "type": "neoforge:fluid_container", + "flip_gas": true, + "fluid": "testmod:testbucketfluid", + "textures": { + "base": "minecraft:item/bucket", + "fluid": "neoforge:item/mask/bucket_fluid", + "particle": "minecraft:item/bucket" + } } } \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json b/src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json index a175703..ec7ccbb 100644 --- a/src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json +++ b/src/test/generated/resources/assets/testmod/items/testentity_spawn_egg.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "minecraft:item/pig_spawn_egg" + "model": "testmod:item/testentity_spawn_egg" } } \ No newline at end of file diff --git a/src/test/generated/resources/assets/testmod/models/item/testentity_spawn_egg.json b/src/test/generated/resources/assets/testmod/models/item/testentity_spawn_egg.json new file mode 100644 index 0000000..3730294 --- /dev/null +++ b/src/test/generated/resources/assets/testmod/models/item/testentity_spawn_egg.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "testmod:item/testentity_spawn_egg" + } +} \ No newline at end of file diff --git a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java index f9a9569..4c3c3fb 100644 --- a/src/test/java/com/modularmc/registrate/test/mod/TestMod.java +++ b/src/test/java/com/modularmc/registrate/test/mod/TestMod.java @@ -27,6 +27,7 @@ import net.minecraft.client.renderer.item.ItemStackRenderState; import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.resources.model.sprite.Material; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.core.BlockPos; @@ -294,7 +295,7 @@ public static final class TestCustomRegistryEntry {} .attributes(Pig::createAttributes) .renderer(() -> PigRenderer::new) .spawnPlacement(SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR) - .spawnEgg() + .spawnEgg(egg -> egg.model(() -> (ctx, prov) -> prov.generateFlatItem(ctx.getEntry(), new Material(Identifier.fromNamespaceAndPath(MOD_ID, "item/testentity_spawn_egg"))))) .loot((prov, type) -> prov.add(type, LootTable.lootTable() .withPool(LootPool.lootPool() .setRolls(ConstantValue.exactly(1)) diff --git a/src/test/resources/assets/testmod/textures/item/testentity_spawn_egg.png b/src/test/resources/assets/testmod/textures/item/testentity_spawn_egg.png new file mode 100644 index 0000000000000000000000000000000000000000..2831ddeb2f666f4a6249c40739ac8dc41114e6ec GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!9q_L#}Etut$i1H8x(k0XC4ofIm#bi;Lv`^ zBj}RMdQ+ELPx}X7`MiE=AKw{j|K_m7hV|aFH7BwwH{P8r8yCh@7IYxBRGpP8V8dMY z3EVQ@E;IRw2OK%-;kQq Date: Wed, 29 Apr 2026 18:51:11 +0800 Subject: [PATCH 10/10] spotless --- .gitignore | 1 + .../providers/generators/RegistrateModelProvider.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index bd0e214..01a89a8 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ libs/ classes/ .metadata .vscode +.eclipse .settings *.launch .architectury-transformer/debug.log diff --git a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java index 73a099b..4b19029 100644 --- a/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java +++ b/src/main/java/com/modularmc/registrate/providers/generators/RegistrateModelProvider.java @@ -3,8 +3,6 @@ import com.modularmc.registrate.AbstractRegistrate; import com.modularmc.registrate.providers.core.RegistrateProvider; -import com.mojang.serialization.JsonOps; - import net.minecraft.client.data.models.BlockModelGenerators; import net.minecraft.client.data.models.ItemModelGenerators; import net.minecraft.client.data.models.ModelProvider; @@ -12,6 +10,8 @@ import net.minecraft.data.PackOutput; import net.neoforged.fml.LogicalSide; +import com.mojang.serialization.JsonOps; + public class RegistrateModelProvider extends ModelProvider implements RegistrateProvider { private final AbstractRegistrate parent;