From d7777a8a4c6e17aa96f78924171d91f5ef03fb2b Mon Sep 17 00:00:00 2001 From: Gugle Date: Sat, 7 Sep 2024 00:00:50 +0800 Subject: [PATCH] remove fabric --- .gitignore | 2 - .idea/icon.svg | 5 - build.gradle | 230 +++++++++++------- common/build.gradle | 61 ----- .../resources/assets/anvillib/lang/en_us.json | 3 - .../resources/assets/anvillib/lang/zh_cn.json | 3 - fabric/build.gradle | 205 ---------------- .../fabric/ServerLifecycleEventListener.java | 15 -- .../anvilcraft/lib/fabric/AnvilLibFabric.java | 53 ---- .../anvilcraft/lib/fabric/AnvilLibImpl.java | 14 -- .../lib/mixin/fabric/GameTestServerMixin.java | 22 -- .../lib/network/fabric/NetworkImpl.java | 107 -------- .../fabric/BlockEntityBuilderImpl.java | 27 -- .../fabric/CreativeModeTabBuilderImpl.java | 21 -- .../builder/fabric/EntityBuilderImpl.java | 43 ---- .../builder/fabric/MenuBuilderImpl.java | 50 ---- .../registrator/fabric/RegistratorImpl.java | 40 --- .../fabric/ResourcePacksHelperImpl.java | 24 -- .../lib/util/fabric/ServerHooks.java | 12 - .../lib/util/fabric/SideExecutorImpl.java | 17 -- .../src/main/resources/anvillib.mixins.json | 14 -- fabric/src/main/resources/fabric.mod.json | 27 -- .../blockstates/test_block.json | 7 - .../assets/anvil-lib-test/lang/en_ud.json | 5 - .../assets/anvil-lib-test/lang/en_us.json | 5 - .../models/block/test_block.json | 6 - .../anvil-lib-test/models/item/test.json | 6 - .../models/item/test_block.json | 3 - .../advancements/recipes/misc/test.json | 35 --- .../loot_tables/blocks/test_block.json | 19 -- .../data/anvil-lib-test/recipes/test.json | 18 -- .../data/anvil-lib-test/tags/blocks/test.json | 9 - .../data/anvil-lib-test/tags/items/test.json | 9 - .../dev/anvilcraft/lib/test/AnvilLibTest.java | 15 -- .../lib/test/AnvilLibTestDataGenerator.java | 12 - .../anvilcraft/lib/test/TestRegisters.java | 65 ----- .../test/resources/anvil-lib-test.mixins.json | 14 -- fabric/src/test/resources/fabric.mod.json | 27 -- gradle.properties | 60 +++-- gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- gradlew.bat | 20 +- neoforge/build.gradle | 188 -------------- neoforge/gradle.properties | 2 - .../src/main/resources/META-INF/mods.toml | 28 --- .../src/main/resources/anvillib.mixins.json | 13 - neoforge/src/main/resources/pack.mcmeta | 7 - settings.gradle | 75 +----- .../java/dev/anvilcraft/lib/AnvilLib.java | 8 +- .../anvilcraft/lib/data/DataProviderType.java | 2 +- .../anvilcraft/lib/data/JsonSerializable.java | 0 .../dev/anvilcraft/lib/data/TagBuilder.java | 0 .../lib/data/file/BlockModelFile.java | 0 .../lib/data/file/BlockStateFile.java | 0 .../lib/data/file/BlockStateVariant.java | 0 .../lib/data/file/BlockStateVariantKey.java | 0 .../lib/data/file/ItemModelFile.java | 0 .../anvilcraft/lib/data/file/ModelFile.java | 0 .../lib/data/file/MultiPartModelFile.java | 0 .../lib/data/file/ResourceFile.java | 0 .../data/provider/AdvancementProvider.java | 0 .../provider/AnvilLibBlockModelProvider.java | 0 .../provider/AnvilLibBlockStateProvider.java | 0 .../provider/AnvilLibItemModelProvider.java | 1 - .../data/provider/BlockLootTableProvider.java | 0 .../lib/data/provider/LanguageProvider.java | 0 .../lib/data/provider/ModelProvider.java | 0 .../RegistratorLootTableProvider.java | 0 .../provider/RegistratorRecipeProvider.java | 0 .../provider/RegistratorTagsProvider.java | 0 .../data/provider/ResourceFileProvider.java | 0 .../provider/UpsideDownLanguageProvider.java | 0 .../dev/anvilcraft/lib/event/Cancelable.java | 0 .../anvilcraft/lib/event/EventListener.java | 0 .../anvilcraft/lib/event/EventManager.java | 1 - .../anvilcraft/lib/event/SubscribeEvent.java | 0 .../anvilcraft/lib/forge/AnvilLibForge.java | 0 .../anvilcraft/lib/forge/AnvilLibImpl.java | 0 .../lib/integration/AnvilLibIntegrations.java | 0 .../lib/integration/Integration.java | 0 .../mixin/BlockEntityRenderersAccessor.java | 0 .../lib/mixin/ItemPropertiesAccessor.java | 0 .../mixin/LootContextParamSetsAccessor.java | 0 .../lib/mixin/LootTableProviderAccessor.java | 0 .../lib/mixin/forge/package-info.java | 0 .../dev/anvilcraft/lib/network/Network.java | 13 +- .../dev/anvilcraft/lib/network/Packet.java | 8 +- .../lib/network/forge/NetworkImpl.java | 1 - .../lib/registrator/AbstractRegistrator.java | 3 +- .../lib/registrator/BuilderManager.java | 0 .../lib/registrator/Registrator.java | 5 +- .../lib/registrator/ResourcePacksHelper.java | 5 +- .../lib/registrator/builder/BlockBuilder.java | 0 .../builder/BlockEntityBuilder.java | 5 +- .../registrator/builder/BlockItemBuilder.java | 1 - .../builder/CreativeModeTabBuilder.java | 5 +- .../builder/EnchantmentBuilder.java | 0 .../registrator/builder/EntityBuilder.java | 6 +- .../lib/registrator/builder/EntryBuilder.java | 1 - .../lib/registrator/builder/ItemBuilder.java | 4 +- .../lib/registrator/builder/MenuBuilder.java | 8 +- .../builder/RegistratorItemBuilder.java | 0 .../builder/forge/BlockEntityBuilderImpl.java | 0 .../forge/CreativeModeTabBuilderImpl.java | 0 .../builder/forge/EntityBuilderImpl.java | 0 .../builder/forge/MenuBuilderImpl.java | 0 .../registrator/entry/BlockEntityEntry.java | 0 .../lib/registrator/entry/BlockEntry.java | 2 - .../registrator/entry/EnchantmentEntry.java | 0 .../lib/registrator/entry/EntityEntry.java | 0 .../lib/registrator/entry/ItemEntry.java | 0 .../lib/registrator/entry/RegistryEntry.java | 0 .../lib/registrator/entry/TagKeyEntry.java | 0 .../registrator/forge/RegistratorImpl.java | 2 - .../forge/ResourcePacksHelperImpl.java | 0 .../dev/anvilcraft/lib/util/Callback.java | 0 .../dev/anvilcraft/lib/util/Platform.java | 0 .../java/dev/anvilcraft/lib/util/Side.java | 0 .../dev/anvilcraft/lib/util/SideExecutor.java | 5 +- .../anvilcraft/lib/util/TripleConsumer.java | 0 .../anvilcraft/lib/util/TripleFunction.java | 0 .../lib/util/forge/SideExecutorImpl.java | 0 .../resources/META-INF/neoforge.mods.toml | 86 +++++++ .../main/resources/anvillib.accesswidener | 0 .../main/resources/anvillib.mixins.json | 3 +- {common/src => src}/main/resources/icon.png | Bin 127 files changed, 308 insertions(+), 1514 deletions(-) delete mode 100644 .idea/icon.svg delete mode 100644 common/build.gradle delete mode 100644 common/src/main/resources/assets/anvillib/lang/en_us.json delete mode 100644 common/src/main/resources/assets/anvillib/lang/zh_cn.json delete mode 100644 fabric/build.gradle delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/event/fabric/ServerLifecycleEventListener.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/fabric/AnvilLibFabric.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/fabric/AnvilLibImpl.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/mixin/fabric/GameTestServerMixin.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/network/fabric/NetworkImpl.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/BlockEntityBuilderImpl.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/CreativeModeTabBuilderImpl.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/EntityBuilderImpl.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/MenuBuilderImpl.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/registrator/fabric/RegistratorImpl.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/registrator/fabric/ResourcePacksHelperImpl.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/util/fabric/ServerHooks.java delete mode 100644 fabric/src/main/java/dev/anvilcraft/lib/util/fabric/SideExecutorImpl.java delete mode 100644 fabric/src/main/resources/anvillib.mixins.json delete mode 100644 fabric/src/main/resources/fabric.mod.json delete mode 100644 fabric/src/test/generated/resources/assets/anvil-lib-test/blockstates/test_block.json delete mode 100644 fabric/src/test/generated/resources/assets/anvil-lib-test/lang/en_ud.json delete mode 100644 fabric/src/test/generated/resources/assets/anvil-lib-test/lang/en_us.json delete mode 100644 fabric/src/test/generated/resources/assets/anvil-lib-test/models/block/test_block.json delete mode 100644 fabric/src/test/generated/resources/assets/anvil-lib-test/models/item/test.json delete mode 100644 fabric/src/test/generated/resources/assets/anvil-lib-test/models/item/test_block.json delete mode 100644 fabric/src/test/generated/resources/data/anvil-lib-test/advancements/recipes/misc/test.json delete mode 100644 fabric/src/test/generated/resources/data/anvil-lib-test/loot_tables/blocks/test_block.json delete mode 100644 fabric/src/test/generated/resources/data/anvil-lib-test/recipes/test.json delete mode 100644 fabric/src/test/generated/resources/data/anvil-lib-test/tags/blocks/test.json delete mode 100644 fabric/src/test/generated/resources/data/anvil-lib-test/tags/items/test.json delete mode 100644 fabric/src/test/java/dev/anvilcraft/lib/test/AnvilLibTest.java delete mode 100644 fabric/src/test/java/dev/anvilcraft/lib/test/AnvilLibTestDataGenerator.java delete mode 100644 fabric/src/test/java/dev/anvilcraft/lib/test/TestRegisters.java delete mode 100644 fabric/src/test/resources/anvil-lib-test.mixins.json delete mode 100644 fabric/src/test/resources/fabric.mod.json delete mode 100644 neoforge/build.gradle delete mode 100644 neoforge/gradle.properties delete mode 100644 neoforge/src/main/resources/META-INF/mods.toml delete mode 100644 neoforge/src/main/resources/anvillib.mixins.json delete mode 100644 neoforge/src/main/resources/pack.mcmeta rename {common/src => src}/main/java/dev/anvilcraft/lib/AnvilLib.java (73%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/DataProviderType.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/JsonSerializable.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/TagBuilder.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/file/BlockModelFile.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/file/BlockStateFile.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/file/BlockStateVariant.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/file/BlockStateVariantKey.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/file/ItemModelFile.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/file/ModelFile.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/file/MultiPartModelFile.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/file/ResourceFile.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/AdvancementProvider.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/AnvilLibBlockModelProvider.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/AnvilLibBlockStateProvider.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/AnvilLibItemModelProvider.java (97%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/BlockLootTableProvider.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/LanguageProvider.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/ModelProvider.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/RegistratorLootTableProvider.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/RegistratorRecipeProvider.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/RegistratorTagsProvider.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/ResourceFileProvider.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/data/provider/UpsideDownLanguageProvider.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/event/Cancelable.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/event/EventListener.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/event/EventManager.java (98%) rename {common/src => src}/main/java/dev/anvilcraft/lib/event/SubscribeEvent.java (100%) rename {neoforge/src => src}/main/java/dev/anvilcraft/lib/forge/AnvilLibForge.java (100%) rename {neoforge/src => src}/main/java/dev/anvilcraft/lib/forge/AnvilLibImpl.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/integration/AnvilLibIntegrations.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/integration/Integration.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/mixin/BlockEntityRenderersAccessor.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/mixin/ItemPropertiesAccessor.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/mixin/LootContextParamSetsAccessor.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/mixin/LootTableProviderAccessor.java (100%) rename {neoforge/src => src}/main/java/dev/anvilcraft/lib/mixin/forge/package-info.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/network/Network.java (94%) rename {common/src => src}/main/java/dev/anvilcraft/lib/network/Packet.java (87%) rename {neoforge/src => src}/main/java/dev/anvilcraft/lib/network/forge/NetworkImpl.java (98%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/AbstractRegistrator.java (99%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/BuilderManager.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/Registrator.java (72%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/ResourcePacksHelper.java (79%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/BlockBuilder.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/BlockEntityBuilder.java (95%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/BlockItemBuilder.java (96%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/CreativeModeTabBuilder.java (94%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/EnchantmentBuilder.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/EntityBuilder.java (93%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/EntryBuilder.java (97%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/ItemBuilder.java (98%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/MenuBuilder.java (92%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/RegistratorItemBuilder.java (100%) rename {neoforge/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/forge/BlockEntityBuilderImpl.java (100%) rename {neoforge/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/forge/CreativeModeTabBuilderImpl.java (100%) rename {neoforge/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/forge/EntityBuilderImpl.java (100%) rename {neoforge/src => src}/main/java/dev/anvilcraft/lib/registrator/builder/forge/MenuBuilderImpl.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntityEntry.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntry.java (94%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/entry/EnchantmentEntry.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/entry/EntityEntry.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/entry/ItemEntry.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/entry/RegistryEntry.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/registrator/entry/TagKeyEntry.java (100%) rename {neoforge/src => src}/main/java/dev/anvilcraft/lib/registrator/forge/RegistratorImpl.java (92%) rename {neoforge/src => src}/main/java/dev/anvilcraft/lib/registrator/forge/ResourcePacksHelperImpl.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/util/Callback.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/util/Platform.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/util/Side.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/util/SideExecutor.java (60%) rename {common/src => src}/main/java/dev/anvilcraft/lib/util/TripleConsumer.java (100%) rename {common/src => src}/main/java/dev/anvilcraft/lib/util/TripleFunction.java (100%) rename {neoforge/src => src}/main/java/dev/anvilcraft/lib/util/forge/SideExecutorImpl.java (100%) create mode 100644 src/main/resources/META-INF/neoforge.mods.toml rename {common/src => src}/main/resources/anvillib.accesswidener (100%) rename common/src/main/resources/anvillib-common.mixins.json => src/main/resources/anvillib.mixins.json (81%) rename {common/src => src}/main/resources/icon.png (100%) diff --git a/.gitignore b/.gitignore index d93ef85..3c37caf 100644 --- a/.gitignore +++ b/.gitignore @@ -110,11 +110,9 @@ gradle-app.setting .gradletasknamecache **/build/ -**/src/**/generated/resources/.cahce/ # Common working directory run/ # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) !gradle-wrapper.jar -/fabric/src/test/generated/resources/.cache diff --git a/.idea/icon.svg b/.idea/icon.svg deleted file mode 100644 index 438472e..0000000 --- a/.idea/icon.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/build.gradle b/build.gradle index 2afe225..8cfc345 100644 --- a/build.gradle +++ b/build.gradle @@ -1,121 +1,165 @@ -import net.fabricmc.loom.task.RemapJarTask - plugins { - id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false + id 'java-library' + id 'eclipse' + id 'idea' + id 'maven-publish' + id 'net.neoforged.moddev' version '2.0.27-beta' } -def is_root_project = project == rootProject +version = mod_version +group = mod_group_id + +repositories { + mavenLocal() +} -architectury { - minecraft = libs.versions.minecraft +base { + archivesName = mod_id } -subprojects { - apply plugin: "dev.architectury.loom" +java.toolchain.languageVersion = JavaLanguageVersion.of(21) + +neoForge { + // Specify the version of NeoForge to use. + version = project.neo_version - loom { - silentMojangMappingsLicense() + parchment { + mappingsVersion = project.parchment_mappings_version + minecraftVersion = project.parchment_minecraft_version } - repositories { - mavenLocal() - mavenCentral() - maven { url = "https://api.modrinth.com/maven" } // LazyDFU, Jade - maven { url = "https://maven.terraformersmc.com/releases/" } // Mod Menu, EMI - maven { url = "https://maven.shedaniel.me/" } // Cloth Config, REI - maven { - url "https://cursemaven.com" - content { - includeGroup "curse.maven" - } - } // Curse Forge File - maven { - name = "Jared's maven" - url = "https://maven.blamejared.com/" - } // JEI - maven { - // location of a maven mirror for JEI files, as a fallback - name = "ModMaven" - url = "https://modmaven.dev" - } // JEI mirror, AE2 - maven { url = "https://maven.parchmentmc.org" } // Parchment mappings - maven { url = "https://maven.quiltmc.org/repository/release" } // Quilt Mappings - maven { url = "https://maven.firstdarkdev.xyz/snapshots" } // LDLib - maven { // Flywheel - url = "https://maven.tterrag.com/" - content { - // need to be specific here due to version overlaps - includeGroup("com.jozufozu.flywheel") - includeGroup("com.simibubi.create") - } + // This line is optional. Access Transformers are automatically detected + // accessTransformers.add('src/main/resources/META-INF/accesstransformer.cfg') + + // Default run configurations. + // These can be tweaked, removed, or duplicated as needed. + runs { + client { + client() + + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } - maven { // TOP-Fabric - url "https://maven.wispforest.io" + + server { + server() + programArgument '--nogui' + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } - } - dependencies { - minecraft "com.mojang:minecraft:${libs.versions.minecraft.get()}" - // The following line declares the mojmap mappings, you may use other mappings as well - if (is_root_project) { - // layered mappings - Mojmap names, parchment and QM docs and parameters - mappings loom.layered { - it.mappings("org.quiltmc:quilt-mappings:${libs.versions.minecraft.get()}+build.${libs.versions.quiltMappings.get()}:intermediary-v2") - it.parchment("org.parchmentmc.data:parchment-1.21:${libs.versions.parchment.get()}@zip") - it.officialMojangMappings { nameSyntheticMembers = false } - } + // 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" + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } - // lombok - compileOnly 'org.projectlombok:lombok:1.18.24' - annotationProcessor 'org.projectlombok:lombok:1.18.24' + data { + data() - implementation 'com.google.code.findbugs:jsr305:3.0.2' + // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it + // gameDirectory = project.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, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--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' + + // 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.DEBUG + } } - tasks.register('remapSlimJar', RemapJarTask) { - dependsOn(jar) - inputFile.set(jar.archiveFile) - addNestedDependencies = false - archiveClassifier.set("slim") + mods { + // define mod <-> source bindings + // these are used to tell the game which sources are for which mod + // mostly optional in a single mod project + // but multi mod projects should define one per mod + "${mod_id}" { + sourceSet(sourceSets.main) + } } +} + +// Include resources generated by data generators. +sourceSets.main.resources { srcDir 'src/generated/resources' } + + +dependencies { + // Example mod dependency with JEI + // The JEI API is declared for compile time use, while the full JEI artifact is used at runtime + // compileOnly "mezz.jei:jei-${mc_version}-common-api:${jei_version}" + // compileOnly "mezz.jei:jei-${mc_version}-forge-api:${jei_version}" + // runtimeOnly "mezz.jei:jei-${mc_version}-forge:${jei_version}" + + // Example mod dependency using a mod jar from ./libs with a flat dir repository + // This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar + // The group id is ignored when searching -- in this case, it is "blank" + // implementation "blank:coolmod-${mc_version}:${coolmod_version}" + + // Example mod dependency using a file as dependency + // implementation files("libs/coolmod-${mc_version}-${coolmod_version}.jar") + + // Example project dependency using a sister or child project: + // implementation project(":myproject") - tasks.remapJar.dependsOn('remapSlimJar') + // For more info: + // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html + // http://www.gradle.org/docs/current/userguide/dependency_management.html } -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - - archivesBaseName = "${project.name}-${libs.versions.minecraft.get()}" - group = rootProject.maven_group - - // Formats the mod version to include the loader, Minecraft version, and build number (if present) - String buildType = 'build' - String buildNumber - if (System.getenv("CI_BUILD") == 'false') buildNumber = null - else { - if (System.getenv("PR_BUILD") != 'false') buildType = 'pr' - buildNumber = System.getenv("GITHUB_RUN_NUMBER") +// This block of code expands all declared replace properties in the specified resource targets. +// A missing property will result in an error. Properties are expanded using ${} Groovy notation. +// When "copyIdeResources" is enabled, this will also run before the game launches in IDE environments. +// See https://docs.gradle.org/current/dsl/org.gradle.language.jvm.tasks.ProcessResources.html +tasks.withType(ProcessResources).configureEach { + var replaceProperties = [minecraft_version : minecraft_version, + minecraft_version_range: minecraft_version_range, + neo_version : neo_version, + neo_version_range : neo_version_range, + loader_version_range : loader_version_range, + mod_id : mod_id, + mod_name : mod_name, + mod_license : mod_license, + mod_version : mod_version, + mod_authors : mod_authors, + mod_description : mod_description] + inputs.properties replaceProperties + + filesMatching(['META-INF/neoforge.mods.toml']) { + expand replaceProperties } - version = "${mod_version}" + (buildNumber != null ? "+${buildType}.${buildNumber}" : "") +} - repositories { - // Add repositories to retrieve artifacts from in here. - // You should only use this when depending on other mods because - // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. - // See https://docs.gradle.org/current/userguide/declaring_repositories.html - // for more information about repositories. +// Example configuration to allow publishing using the maven-publish plugin +publishing { + publications { + register('mavenJava', MavenPublication) { + from components.java + } } - - tasks.withType(JavaCompile) { - options.encoding = "UTF-8" - options.release.set(Integer.valueOf(java_version)) + repositories { + maven { + url "file://${project.projectDir}/repo" + } } +} - java { - withSourcesJar() +// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior. +idea { + module { + downloadSources = true + downloadJavadoc = true } } diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index 5a6ebda..0000000 --- a/common/build.gradle +++ /dev/null @@ -1,61 +0,0 @@ -architectury { - common(rootProject.enabled_platforms.split(",")) -} - -String getConfig(String key) { - return project.getParent().properties.get(key) -} - -def mod_id = getConfig("mod_id") - -repositories { - maven { url = "https://mvn.devos.one/snapshots/" } - // Create Fabric, Porting Lib, Forge Tags, Milk Lib, Registrate Fabric - //maven { url = "https://maven.cafeteria.dev/releases" } // Fake Player API - maven { url = "https://maven.jamieswhiteshirt.com/libs-release" } // Reach Entity Attributes - maven { url = "https://jitpack.io/" } // Mixin Extras, Fabric ASM - maven { - // saps.dev Maven (KubeJS and Rhino) - url = "https://maven.saps.dev/minecraft" - content { - includeGroup "dev.latvian.mods" - } - } - maven { // TOP - url "https://maven.k-4u.nl" - } -} - -dependencies { - // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies - // Do NOT use other classes from fabric loader - modImplementation(fabric.fabricLoader) - modCompileOnly(fabric.fabricApi) - - // Mixin Extras - implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:${fabric.versions.mixinextras.get()}")) -} - -publishing { - publications { - mavenCommon(MavenPublication) { - artifactId = archivesBaseName - 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. - def MAVEN_URL = System.getenv("MAVEN_URL") - if (MAVEN_URL != null) { - maven { - url MAVEN_URL - credentials { - username System.getenv("MAVEN_USERNAME") - password System.getenv("MAVEN_PASSWORD") - } - } - } - } -} diff --git a/common/src/main/resources/assets/anvillib/lang/en_us.json b/common/src/main/resources/assets/anvillib/lang/en_us.json deleted file mode 100644 index d72efe9..0000000 --- a/common/src/main/resources/assets/anvillib/lang/en_us.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "modmenu.nameTranslation.anvillib": "AnvilLib" -} \ No newline at end of file diff --git a/common/src/main/resources/assets/anvillib/lang/zh_cn.json b/common/src/main/resources/assets/anvillib/lang/zh_cn.json deleted file mode 100644 index 1eea163..0000000 --- a/common/src/main/resources/assets/anvillib/lang/zh_cn.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "modmenu.nameTranslation.anvillib": "铁砧库" -} \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle deleted file mode 100644 index f89f24a..0000000 --- a/fabric/build.gradle +++ /dev/null @@ -1,205 +0,0 @@ -plugins { - alias(libs.plugins.shadow) -} - -String getConfig(String key) { - return project.getParent().properties.get(key) -} - -def mod_id = getConfig("mod_id") -def common_project = project(":${mod_id}-common") -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") - -architectury { - platformSetupLoomIde() - fabric() -} - -sourceSets { - test { - compileClasspath += main.compileClasspath - compileClasspath += main.output - runtimeClasspath += main.runtimeClasspath - runtimeClasspath += main.output - resources { - srcDir("src/test/generated/resources") - exclude("src/test/generated/resources/.cache") - } - } -} - -loom { - accessWidenerPath = common_project.file("src/main/resources/${mod_id}.accesswidener") - - runs { - create("dataCommon") { - inherit client - name("Minecraft Data") - property("fabric-api.datagen") - property("fabric-api.datagen.modid", "${mod_id}") - property("fabric-api.datagen.output-dir", project.file("src/generated/resources").absolutePath) - property("fabric-api.datagen.strict-validation") - } - client { - programArgs("--username", "Player") - } - create("gameTestServer") { - server() - name("Minecraft Game Test") - source("main") - - property("fabric-api.gametest", "true") - property("fabric-api.gametest.command", "true") - } - - create("fabricTestClient") { - client() - name "Testmod Client" - source sourceSets.test - runDir "run/test" - } - create("fabricTestServer") { - server() - name "Testmod Server" - source sourceSets.test - runDir "run/test_server" - } - create("fabricTestDatagen") { - client() - name "Testmod Data Generation" - vmArg "-Dfabric-api.datagen" - vmArg "-Dfabric-api.datagen.output-dir=${file("src/test/generated/resources")}" - vmArg "-Dfabric-api.datagen.modid=anvil-lib-test" - vmArg "-Dporting_lib.datagen.existing_resources=${file("src/test/resources")}" - source sourceSets.test - } - } -} - -sourceSets { - main { - resources { - srcDir("src/generated/resources") - exclude("**/.cache") - } - } -} - -configurations { - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentFabric.extendsFrom common - - apiElements { - outgoing { - capability("net.fabricmc.fabric-api:fabric-api-${this.libs.versions.minecraft.get()}:${this.fabric.versions.fabricApi.get()}") - capability("io.github.llamalad7:mixinextras-fabric:${this.fabric.versions.mixinextras.get()}") - } - } -} - -repositories { - // mavens for Fabric-exclusives - maven { url = "https://mvn.devos.one/snapshots/" } - // Create Fabric, Porting Lib, Forge Tags, Milk Lib, Registrate Fabric - //maven { url = "https://maven.cafeteria.dev/releases" } // Fake Player API - maven { url = "https://maven.jamieswhiteshirt.com/libs-release" } // Reach Entity Attributes - maven { url = "https://jitpack.io/" } // Mixin Extras, Fabric ASM - maven { url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" } - maven { url = "https://maven.saps.dev/minecraft" } // saps.dev Maven (KubeJS and Rhino) -} - -dependencies { - modImplementation(fabric.fabricLoader) - modImplementation(fabric.fabricApi) - - common(project(path: ":${mod_id}-common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":${mod_id}-common", configuration: "transformProductionFabric")) { transitive false } - - // Development QOL - modRuntimeOnly(fabric.modmenu) - - // Mixin Extras - include(implementation(annotationProcessor("io.github.llamalad7:mixinextras-fabric:${fabric.versions.mixinextras.get()}"))) -} - - -processResources { - // set up properties for filling into metadata - Map properties = Map.of( - "version", version, - "mod_id", mod_id, - "fabric_loader_version", fabric.versions.fabricLoader.get(), - "fabric_api_version", fabric.versions.fabricApi.get(), - "minecraft_version", libs.versions.minecraft.get(), - "mod_license", mod_license, - "mod_name", mod_name, - "mod_description", mod_description, - "mod_url", mod_url - ) - properties.forEach((k, v) -> inputs.property(k, v)) - - filesMatching("fabric.mod.json") { - expand properties - } -} - -shadowJar { - exclude "architectury.common.json" - - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} - -remapJar { - injectAccessWidener = true - inputFile.set(shadowJar.archiveFile) - dependsOn shadowJar - archiveClassifier = null -} - -jar { - archiveClassifier.set("dev") -} - -sourcesJar { - def commonSources = common_project.sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -publishing { - publications { - mavenFabric(MavenPublication) { - artifactId = archivesBaseName - 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. - def MAVEN_URL = System.getenv("MAVEN_URL") - if (MAVEN_URL != null) { - maven { - url MAVEN_URL - credentials { - username System.getenv("MAVEN_USERNAME") - password System.getenv("MAVEN_PASSWORD") - } - } - } - } -} diff --git a/fabric/src/main/java/dev/anvilcraft/lib/event/fabric/ServerLifecycleEventListener.java b/fabric/src/main/java/dev/anvilcraft/lib/event/fabric/ServerLifecycleEventListener.java deleted file mode 100644 index 1aa13c4..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/event/fabric/ServerLifecycleEventListener.java +++ /dev/null @@ -1,15 +0,0 @@ -package dev.anvilcraft.lib.event.fabric; - -import dev.anvilcraft.lib.util.fabric.ServerHooks; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.minecraft.server.MinecraftServer; - -public class ServerLifecycleEventListener { - public static void init() { - ServerLifecycleEvents.SERVER_STARTED.register(ServerLifecycleEventListener::serverStarted); - } - - private static void serverStarted(MinecraftServer server) { - ServerHooks.setServer(server); - } -} diff --git a/fabric/src/main/java/dev/anvilcraft/lib/fabric/AnvilLibFabric.java b/fabric/src/main/java/dev/anvilcraft/lib/fabric/AnvilLibFabric.java deleted file mode 100644 index e25a0ff..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/fabric/AnvilLibFabric.java +++ /dev/null @@ -1,53 +0,0 @@ -package dev.anvilcraft.lib.fabric; - -import dev.anvilcraft.lib.AnvilLib; -import dev.anvilcraft.lib.event.fabric.ServerLifecycleEventListener; -import dev.anvilcraft.lib.integration.AnvilLibIntegrations; -import net.fabricmc.api.ModInitializer; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.ModContainer; -import net.fabricmc.loader.api.metadata.CustomValue; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -public class AnvilLibFabric implements ModInitializer { - @Override - public void onInitialize() { - AnvilLib.init(); - ServerLifecycleEventListener.init(); - - for (ModContainer mod : FabricLoader.getInstance().getAllMods()) { - CustomValue thisMod = mod.getMetadata().getCustomValue(AnvilLib.MOD_ID); - if (thisMod == null || thisMod.getType() != CustomValue.CvType.OBJECT) continue; - CustomValue.CvObject object = thisMod.getAsObject(); - if (object.containsKey("integrations")) { - CustomValue integrations = object.get("integrations"); - if (integrations.getType() == CustomValue.CvType.OBJECT) { - AnvilLibFabric.loadIntegrations(integrations.getAsObject()); - } - } - } - AnvilLibIntegrations.apply(); - } - - private static void loadIntegrations(@NotNull CustomValue.CvObject integrations) { - for (Map.Entry entry : integrations) { - String modid = entry.getKey(); - CustomValue value = entry.getValue(); - List classes = Collections.synchronizedList(new ArrayList<>()); - if (value.getType() == CustomValue.CvType.ARRAY) { - for (CustomValue listValue : value.getAsArray()) { - if (listValue.getType() != CustomValue.CvType.STRING) continue; - classes.add(listValue.getAsString()); - } - } else if (value.getType() == CustomValue.CvType.STRING) { - classes.add(value.getAsString()); - } - AnvilLibIntegrations.INTEGRATIONS.put(modid, classes); - } - } -} \ No newline at end of file diff --git a/fabric/src/main/java/dev/anvilcraft/lib/fabric/AnvilLibImpl.java b/fabric/src/main/java/dev/anvilcraft/lib/fabric/AnvilLibImpl.java deleted file mode 100644 index 010c55e..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/fabric/AnvilLibImpl.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.anvilcraft.lib.fabric; - -import dev.anvilcraft.lib.util.Platform; -import net.fabricmc.loader.api.FabricLoader; - -public class AnvilLibImpl { - public static Platform getPlatform() { - return Platform.FABRIC; - } - - public static boolean isLoaded(String modid) { - return FabricLoader.getInstance().isModLoaded(modid); - } -} diff --git a/fabric/src/main/java/dev/anvilcraft/lib/mixin/fabric/GameTestServerMixin.java b/fabric/src/main/java/dev/anvilcraft/lib/mixin/fabric/GameTestServerMixin.java deleted file mode 100644 index 661807c..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/mixin/fabric/GameTestServerMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package dev.anvilcraft.lib.mixin.fabric; - -import net.minecraft.gametest.framework.GameTestServer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.Collection; - -@Mixin(GameTestServer.class) -public class GameTestServerMixin { - @Redirect( - method = "create", - at = @At( - value = "INVOKE", - target = "Ljava/util/Collection;isEmpty()Z" - ) - ) - private static boolean create(Collection instance) { - return false; - } -} diff --git a/fabric/src/main/java/dev/anvilcraft/lib/network/fabric/NetworkImpl.java b/fabric/src/main/java/dev/anvilcraft/lib/network/fabric/NetworkImpl.java deleted file mode 100644 index bdc16c3..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/network/fabric/NetworkImpl.java +++ /dev/null @@ -1,107 +0,0 @@ -package dev.anvilcraft.lib.network.fabric; - -import dev.anvilcraft.lib.network.Network; -import dev.anvilcraft.lib.network.Packet; -import dev.anvilcraft.lib.util.fabric.ServerHooks; -import net.fabricmc.api.EnvType; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerChunkCache; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.chunk.LevelChunk; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Function; - -public abstract class NetworkImpl extends Network { - @Override - public void init(Class type) { - EnvType envType = FabricLoader.getInstance().getEnvironmentType(); - if (envType == EnvType.CLIENT) { - ClientPlayNetworking.registerGlobalReceiver(this.getType(), (client, handler, buf, sender) -> - this.handler(this.decode(buf))); - } - ServerPlayNetworking.registerGlobalReceiver(this.getType(), (server, player, handler, buf, sender) -> - this.handler(this.decode(buf), server, player)); - } - - @Override - public void send(T data) { - FriendlyByteBuf friendlyByteBuf = PacketByteBufs.create(); - this.encode(data, friendlyByteBuf); - ClientPlayNetworking.send(this.getType(), friendlyByteBuf); - } - - @Override - public void send(ServerPlayer player, T data) { - FriendlyByteBuf friendlyByteBuf = PacketByteBufs.create(); - this.encode(data, friendlyByteBuf); - ServerPlayNetworking.getSender(player).sendPacket(this.getType(), friendlyByteBuf); - } - - @Override - public void broadcastTrackingChunk(@NotNull LevelChunk chunk, T data) { - FriendlyByteBuf friendlyByteBuf = PacketByteBufs.create(); - this.encode(data, friendlyByteBuf); - for (ServerPlayer player : ((ServerChunkCache) chunk.getLevel().getChunkSource()) - .chunkMap.getPlayers(chunk.getPos(), false)) { - ServerPlayNetworking.getSender(player).sendPacket(this.getType(), friendlyByteBuf); - } - } - - @Override - public void broadcastAll(T data) { - FriendlyByteBuf friendlyByteBuf = PacketByteBufs.create(); - this.encode(data, friendlyByteBuf); - MinecraftServer server = ServerHooks.getServer(); - if (server == null) return; - for (ServerPlayer player : server.getPlayerList().getPlayers()) { - ServerPlayNetworking.getSender(player).sendPacket(this.getType(), friendlyByteBuf); - } - } - - /** - * 创建网络包类型 - * - * @param type 类型 - * @param clazz 类 - * @param decoder 解码器 - * @param 数据包 - * @return 网络包类型 - */ - public static @NotNull Network create( - ResourceLocation type, Class clazz, Function decoder - ) { - return new NetworkImpl<>() { - @Override - public ResourceLocation getType() { - return type; - } - - @Override - public void encode(@NotNull M data, @NotNull FriendlyByteBuf buf) { - data.encode(buf); - } - - @Override - public M decode(@NotNull FriendlyByteBuf buf) { - return decoder.apply(buf); - } - - @Override - public void handler(@NotNull M data) { - data.handler(); - } - - @Override - public void handler(@NotNull M data, MinecraftServer server, ServerPlayer player) { - data.handler(server, player); - } - }; - } -} diff --git a/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/BlockEntityBuilderImpl.java b/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/BlockEntityBuilderImpl.java deleted file mode 100644 index 607a657..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/BlockEntityBuilderImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package dev.anvilcraft.lib.registrator.builder.fabric; - -import dev.anvilcraft.lib.mixin.BlockEntityRenderersAccessor; -import dev.anvilcraft.lib.registrator.AbstractRegistrator; -import dev.anvilcraft.lib.registrator.builder.BlockEntityBuilder; -import dev.anvilcraft.lib.util.TripleFunction; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.NotNull; - - -public class BlockEntityBuilderImpl extends BlockEntityBuilder { - protected BlockEntityBuilderImpl(AbstractRegistrator registrator, String id, TripleFunction, BlockPos, BlockState, T> factory) { - super(registrator, id, factory); - } - - public static @NotNull BlockEntityBuilder create(AbstractRegistrator registrator, String id, TripleFunction, BlockPos, BlockState, T> factory) { - return new BlockEntityBuilderImpl<>(registrator, id, factory); - } - - @Override - protected void registerRenderer() { - this.onRegister(entry -> BlockEntityRenderersAccessor.invokeRegister(entry, renderer.get()::apply)); - } -} diff --git a/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/CreativeModeTabBuilderImpl.java b/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/CreativeModeTabBuilderImpl.java deleted file mode 100644 index db68d4a..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/CreativeModeTabBuilderImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package dev.anvilcraft.lib.registrator.builder.fabric; - -import dev.anvilcraft.lib.registrator.AbstractRegistrator; -import dev.anvilcraft.lib.registrator.builder.CreativeModeTabBuilder; -import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; -import net.minecraft.world.item.CreativeModeTab; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Consumer; - -public class CreativeModeTabBuilderImpl extends CreativeModeTabBuilder { - protected CreativeModeTabBuilderImpl(AbstractRegistrator registrator, String id) { - super(registrator, id, FabricItemGroup.builder()); - } - - public static @NotNull CreativeModeTabBuilder create(AbstractRegistrator registrator, String id, @NotNull Consumer consumer) { - CreativeModeTabBuilderImpl builder = new CreativeModeTabBuilderImpl(registrator, id); - consumer.accept(builder.builder); - return builder; - } -} diff --git a/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/EntityBuilderImpl.java b/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/EntityBuilderImpl.java deleted file mode 100644 index 88f0949..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/EntityBuilderImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package dev.anvilcraft.lib.registrator.builder.fabric; - -import dev.anvilcraft.lib.registrator.AbstractRegistrator; -import dev.anvilcraft.lib.registrator.builder.EntityBuilder; -import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; -import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.level.Level; -import org.jetbrains.annotations.NotNull; - -import java.util.function.BiFunction; - -public class EntityBuilderImpl extends EntityBuilder { - protected EntityBuilderImpl(AbstractRegistrator registrator, String id, BiFunction, Level, T> factory, MobCategory category) { - super(registrator, id, factory, category); - } - - @NotNull - public static EntityBuilder create(AbstractRegistrator registrator, String id, BiFunction, Level, T> factory, MobCategory category) { - return new EntityBuilderImpl<>(registrator, id, factory, category); - } - - @Override - protected void registerRenderer() { - this.onRegister(entry -> { - try { - EntityRendererRegistry.register(entry, renderer.get()::apply); - } catch (Exception e) { - throw new IllegalStateException("Failed to register renderer for Entity " + this.getId(), e); - } - }); - } - - @Override - public EntityType build() { - EntityType type = FabricEntityTypeBuilder.create(this.category, this.factory::apply).build(); - this.entry.set(type); - this.onRegister.accept(type); - return type; - } -} diff --git a/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/MenuBuilderImpl.java b/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/MenuBuilderImpl.java deleted file mode 100644 index 2e0a6e7..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/registrator/builder/fabric/MenuBuilderImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package dev.anvilcraft.lib.registrator.builder.fabric; - -import dev.anvilcraft.lib.registrator.AbstractRegistrator; -import dev.anvilcraft.lib.registrator.builder.MenuBuilder; -import dev.anvilcraft.lib.util.Side; -import dev.anvilcraft.lib.util.SideExecutor; -import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType; -import net.minecraft.client.gui.screens.MenuScreens; -import net.minecraft.world.flag.FeatureFlags; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.MenuType; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -public class MenuBuilderImpl extends MenuBuilder { - private MenuBuilderImpl(AbstractRegistrator registrator, String id, MenuFactory menuFactory, ScreenFactory screenFactory) { - super(registrator, id, menuFactory, screenFactory); - } - - private MenuBuilderImpl(AbstractRegistrator registrator, String id, ForgeMenuFactory menuFactory, ScreenFactory screenFactory) { - super(registrator, id, menuFactory, screenFactory); - } - - public static @NotNull MenuBuilder create(AbstractRegistrator registrator, String id, MenuFactory menuFactory, ScreenFactory screenFactory) { - return new MenuBuilderImpl<>(registrator, id, menuFactory, screenFactory); - } - - public static @NotNull MenuBuilder create(AbstractRegistrator registrator, String id, ForgeMenuFactory menuFactory, ScreenFactory screenFactory) { - return new MenuBuilderImpl<>(registrator, id, menuFactory, screenFactory); - } - - @Override - public MenuType build() { - MenuType ret; - if (this.menuFactory != null) { - ret = new MenuType<>((syncId, inventory) -> menuFactory.create(this.entry().get(), syncId, inventory), FeatureFlags.VANILLA_SET); - } else if (this.forgeMenuFactory != null) { - ret = new ExtendedScreenHandlerType<>((windowId, inv, buf) -> forgeMenuFactory.create(this.entry().get(), windowId, inv, buf)); - } else { - ret = null; - } - SideExecutor.execute(Side.CLIENT, () -> () -> { - if (ret != null) { - MenuScreens.register(ret, this.screenFactory::create); - } - }); - this.entry.set(ret); - return ret; - } -} diff --git a/fabric/src/main/java/dev/anvilcraft/lib/registrator/fabric/RegistratorImpl.java b/fabric/src/main/java/dev/anvilcraft/lib/registrator/fabric/RegistratorImpl.java deleted file mode 100644 index f4d97b6..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/registrator/fabric/RegistratorImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -package dev.anvilcraft.lib.registrator.fabric; - -import dev.anvilcraft.lib.AnvilLib; -import dev.anvilcraft.lib.registrator.Registrator; -import dev.anvilcraft.lib.registrator.builder.EntryBuilder; -import net.minecraft.core.Registry; -import org.jetbrains.annotations.NotNull; - -public class RegistratorImpl extends Registrator { - private RegistratorImpl(String modid) { - super(modid); - } - - @NotNull - public static Registrator create(String modid) { - return new RegistratorImpl(modid); - } - - @Override - public void init() { - for (Registry registry : this.manager) { - this.init(registry); - } - } - - private void init(Registry registry) { - for (EntryBuilder builder : this.getBuilders(registry)) { - this.register(registry, builder); - } - } - - private void register(Registry registry, EntryBuilder builder) { - try { - Registry.register(registry, builder.getId(), builder.build()); - } catch (Exception e) { - if (e instanceof ClassCastException) return; - AnvilLib.LOGGER.error(e.getMessage(), e); - } - } -} diff --git a/fabric/src/main/java/dev/anvilcraft/lib/registrator/fabric/ResourcePacksHelperImpl.java b/fabric/src/main/java/dev/anvilcraft/lib/registrator/fabric/ResourcePacksHelperImpl.java deleted file mode 100644 index 0140720..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/registrator/fabric/ResourcePacksHelperImpl.java +++ /dev/null @@ -1,24 +0,0 @@ -package dev.anvilcraft.lib.registrator.fabric; - -import dev.anvilcraft.lib.registrator.ResourcePacksHelper; -import net.fabricmc.fabric.api.resource.ResourceManagerHelper; -import net.fabricmc.fabric.api.resource.ResourcePackActivationType; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.ModContainer; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; - -public class ResourcePacksHelperImpl { - public static void registerBuiltinResourcePack(@NotNull ResourceLocation pack, ResourcePacksHelper.PackType type) { - String modid = pack.getNamespace(); - ModContainer modContainer = FabricLoader.getInstance() - .getModContainer(modid) - .orElseThrow(() -> new IllegalStateException("%s's ModContainer couldn't be found!".formatted(modid))); - ResourceManagerHelper.registerBuiltinResourcePack( - pack, modContainer, - Component.translatable("pack.%s.%s.description".formatted(pack.getNamespace(), pack.getPath())), - ResourcePackActivationType.NORMAL - ); - } -} diff --git a/fabric/src/main/java/dev/anvilcraft/lib/util/fabric/ServerHooks.java b/fabric/src/main/java/dev/anvilcraft/lib/util/fabric/ServerHooks.java deleted file mode 100644 index b6a1c40..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/util/fabric/ServerHooks.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.anvilcraft.lib.util.fabric; - -import lombok.Getter; -import lombok.Setter; -import net.minecraft.server.MinecraftServer; - -public class ServerHooks { - @Setter - @Getter - private static MinecraftServer server = null; -} - diff --git a/fabric/src/main/java/dev/anvilcraft/lib/util/fabric/SideExecutorImpl.java b/fabric/src/main/java/dev/anvilcraft/lib/util/fabric/SideExecutorImpl.java deleted file mode 100644 index 91891f1..0000000 --- a/fabric/src/main/java/dev/anvilcraft/lib/util/fabric/SideExecutorImpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.anvilcraft.lib.util.fabric; - -import dev.anvilcraft.lib.util.Side; -import net.fabricmc.api.EnvType; -import net.fabricmc.loader.api.FabricLoader; - -import java.util.function.Supplier; - -public class SideExecutorImpl { - public static void execute(Side side, Supplier runnable) { - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT && side.isClient()) { - runnable.get().run(); - } else if (FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER && side.isServer()) { - runnable.get().run(); - } - } -} diff --git a/fabric/src/main/resources/anvillib.mixins.json b/fabric/src/main/resources/anvillib.mixins.json deleted file mode 100644 index b934dda..0000000 --- a/fabric/src/main/resources/anvillib.mixins.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "dev.anvilcraft.lib.mixin.fabric", - "compatibilityLevel": "JAVA_17", - "mixins": [ - "GameTestServerMixin" - ], - "client": [ - ], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json deleted file mode 100644 index d716a81..0000000 --- a/fabric/src/main/resources/fabric.mod.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "schemaVersion": 1, - "id": "${mod_id}", - "version": "${version}", - "name": "${mod_name}", - "description": "${mod_description}", - "authors": ["Anvil Dev"], - "contact": {}, - "license": "${mod_license}", - "icon": "icon.png", - "environment": "*", - "entrypoints": { - "main": [ - "dev.anvilcraft.lib.fabric.AnvilLibFabric" - ], - "fabric-datagen": [] - }, - "mixins": [ - "anvillib.mixins.json", - "anvillib-common.mixins.json" - ], - "depends": { - "fabricloader": ">=${fabric_loader_version}", - "fabric-api": ">=${fabric_api_version}", - "minecraft": "${minecraft_version}" - } -} diff --git a/fabric/src/test/generated/resources/assets/anvil-lib-test/blockstates/test_block.json b/fabric/src/test/generated/resources/assets/anvil-lib-test/blockstates/test_block.json deleted file mode 100644 index 399de1b..0000000 --- a/fabric/src/test/generated/resources/assets/anvil-lib-test/blockstates/test_block.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "anvil-lib-test:block/test_block" - } - } -} \ No newline at end of file diff --git a/fabric/src/test/generated/resources/assets/anvil-lib-test/lang/en_ud.json b/fabric/src/test/generated/resources/assets/anvil-lib-test/lang/en_ud.json deleted file mode 100644 index bfde512..0000000 --- a/fabric/src/test/generated/resources/assets/anvil-lib-test/lang/en_ud.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "block.anvil-lib-test.test_block": "ʞɔoןᗺ ʇsǝ⟘", - "item.anvil-lib-test.test": "ʇsǝ⟘", - "itemGroup.anvil-lib-test.test": "ʇsǝ⟘" -} \ No newline at end of file diff --git a/fabric/src/test/generated/resources/assets/anvil-lib-test/lang/en_us.json b/fabric/src/test/generated/resources/assets/anvil-lib-test/lang/en_us.json deleted file mode 100644 index e78106a..0000000 --- a/fabric/src/test/generated/resources/assets/anvil-lib-test/lang/en_us.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "block.anvil-lib-test.test_block": "Test Block", - "item.anvil-lib-test.test": "Test", - "itemGroup.anvil-lib-test.test": "Test" -} \ No newline at end of file diff --git a/fabric/src/test/generated/resources/assets/anvil-lib-test/models/block/test_block.json b/fabric/src/test/generated/resources/assets/anvil-lib-test/models/block/test_block.json deleted file mode 100644 index f2ba4c2..0000000 --- a/fabric/src/test/generated/resources/assets/anvil-lib-test/models/block/test_block.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/cube_all", - "textures": { - "all": "anvil-lib-test:block/test_block" - } -} \ No newline at end of file diff --git a/fabric/src/test/generated/resources/assets/anvil-lib-test/models/item/test.json b/fabric/src/test/generated/resources/assets/anvil-lib-test/models/item/test.json deleted file mode 100644 index e8df764..0000000 --- a/fabric/src/test/generated/resources/assets/anvil-lib-test/models/item/test.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/handheld", - "textures": { - "layer0": "anvil-lib-test:item/test" - } -} \ No newline at end of file diff --git a/fabric/src/test/generated/resources/assets/anvil-lib-test/models/item/test_block.json b/fabric/src/test/generated/resources/assets/anvil-lib-test/models/item/test_block.json deleted file mode 100644 index a50db8b..0000000 --- a/fabric/src/test/generated/resources/assets/anvil-lib-test/models/item/test_block.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "anvil-lib-test:block/test_block" -} \ No newline at end of file diff --git a/fabric/src/test/generated/resources/data/anvil-lib-test/advancements/recipes/misc/test.json b/fabric/src/test/generated/resources/data/anvil-lib-test/advancements/recipes/misc/test.json deleted file mode 100644 index 48d4c43..0000000 --- a/fabric/src/test/generated/resources/data/anvil-lib-test/advancements/recipes/misc/test.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_apple": { - "conditions": { - "items": [ - { - "items": [ - "minecraft:apple" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "anvil-lib-test:test" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_apple", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "anvil-lib-test:test" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/fabric/src/test/generated/resources/data/anvil-lib-test/loot_tables/blocks/test_block.json b/fabric/src/test/generated/resources/data/anvil-lib-test/loot_tables/blocks/test_block.json deleted file mode 100644 index 38c2ed8..0000000 --- a/fabric/src/test/generated/resources/data/anvil-lib-test/loot_tables/blocks/test_block.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "anvil-lib-test:test_block" - } - ], - "rolls": 1.0 - } - ] -} \ No newline at end of file diff --git a/fabric/src/test/generated/resources/data/anvil-lib-test/recipes/test.json b/fabric/src/test/generated/resources/data/anvil-lib-test/recipes/test.json deleted file mode 100644 index d9aef35..0000000 --- a/fabric/src/test/generated/resources/data/anvil-lib-test/recipes/test.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "category": "misc", - "key": { - "x": { - "item": "minecraft:apple" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ], - "result": { - "item": "anvil-lib-test:test" - }, - "show_notification": true -} \ No newline at end of file diff --git a/fabric/src/test/generated/resources/data/anvil-lib-test/tags/blocks/test.json b/fabric/src/test/generated/resources/data/anvil-lib-test/tags/blocks/test.json deleted file mode 100644 index b07d9a3..0000000 --- a/fabric/src/test/generated/resources/data/anvil-lib-test/tags/blocks/test.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "replace": false, - "values": [ - { - "id": "anvil-lib-test:test_block", - "required": false - } - ] -} \ No newline at end of file diff --git a/fabric/src/test/generated/resources/data/anvil-lib-test/tags/items/test.json b/fabric/src/test/generated/resources/data/anvil-lib-test/tags/items/test.json deleted file mode 100644 index e21ced1..0000000 --- a/fabric/src/test/generated/resources/data/anvil-lib-test/tags/items/test.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "replace": false, - "values": [ - { - "id": "anvil-lib-test:test", - "required": false - } - ] -} \ No newline at end of file diff --git a/fabric/src/test/java/dev/anvilcraft/lib/test/AnvilLibTest.java b/fabric/src/test/java/dev/anvilcraft/lib/test/AnvilLibTest.java deleted file mode 100644 index be1ec43..0000000 --- a/fabric/src/test/java/dev/anvilcraft/lib/test/AnvilLibTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package dev.anvilcraft.lib.test; - -import dev.anvilcraft.lib.registrator.Registrator; -import net.fabricmc.api.ModInitializer; - -public class AnvilLibTest implements ModInitializer { - public static final String MOD_ID = "anvil-lib-test"; - public static final Registrator REGISTRATOR = Registrator.create(MOD_ID); - - @Override - public void onInitialize() { - TestRegisters.register(); - REGISTRATOR.init(); - } -} diff --git a/fabric/src/test/java/dev/anvilcraft/lib/test/AnvilLibTestDataGenerator.java b/fabric/src/test/java/dev/anvilcraft/lib/test/AnvilLibTestDataGenerator.java deleted file mode 100644 index 55ab76b..0000000 --- a/fabric/src/test/java/dev/anvilcraft/lib/test/AnvilLibTestDataGenerator.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.anvilcraft.lib.test; - -import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; -import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; -import org.jetbrains.annotations.NotNull; - -public class AnvilLibTestDataGenerator implements DataGeneratorEntrypoint { - @Override - public void onInitializeDataGenerator(@NotNull FabricDataGenerator fabricDataGenerator) { - AnvilLibTest.REGISTRATOR.initDatagen(fabricDataGenerator.createPack()); - } -} diff --git a/fabric/src/test/java/dev/anvilcraft/lib/test/TestRegisters.java b/fabric/src/test/java/dev/anvilcraft/lib/test/TestRegisters.java deleted file mode 100644 index 44215ae..0000000 --- a/fabric/src/test/java/dev/anvilcraft/lib/test/TestRegisters.java +++ /dev/null @@ -1,65 +0,0 @@ -package dev.anvilcraft.lib.test; - -import dev.anvilcraft.lib.registrator.entry.BlockEntry; -import dev.anvilcraft.lib.registrator.entry.ItemEntry; -import dev.anvilcraft.lib.registrator.entry.RegistryEntry; -import dev.anvilcraft.lib.registrator.entry.TagKeyEntry; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.RecipeProvider; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.Block; - -import static dev.anvilcraft.lib.test.AnvilLibTest.REGISTRATOR; - -public class TestRegisters { - public static final TagKeyEntry TEST_ITEM_TAG = REGISTRATOR.tag(Registries.ITEM, "test"); - public static final TagKeyEntry TEST_BLOCK_TAG = REGISTRATOR.tag(Registries.BLOCK, "test"); - - public static final ItemEntry TEST_ITEM = REGISTRATOR - .item("test", Item::new) - .tag(TEST_ITEM_TAG) - .initProperties(() -> Items.APPLE) - .model((entry, provider) -> provider.handheld(entry)) - .recipe((entry, provider) -> ShapedRecipeBuilder.shaped(RecipeCategory.MISC, entry) - .pattern("xxx") - .pattern("xxx") - .pattern("xxx") - .define('x', Items.APPLE) - .unlockedBy("has_apple", RecipeProvider.has(Items.APPLE)) - .save(provider)) - .register(); - - public static final BlockEntry TEST_BLOCK = REGISTRATOR - .block("test_block", Block::new) - .tag(TEST_BLOCK_TAG) - .recipe((e, p) -> { - ShapedRecipeBuilder.shaped(RecipeCategory.MISC, e) - .pattern("xxx") - .pattern("xxx") - .pattern("xxx") - .define('x', TEST_ITEM.asItem()) - .unlockedBy("has_apple", RecipeProvider.has(Items.APPLE)) - .save(p); - }) - .defaultItem() - .register(); - - public static final RegistryEntry TEST_TAB = REGISTRATOR.tab("test", builder -> builder - .title(Component.literal("Test Tab")) - .icon(() -> new ItemStack(Items.APPLE)) - .displayItems((parameters, output) -> { - output.accept(new ItemStack(TEST_ITEM)); - output.accept(new ItemStack(TEST_BLOCK)); - })) - .register(); - - public static void register() { - System.out.println("TEST_BLOCK.getBlockItem().builder() = " + TEST_BLOCK.getBlockItem().getItemBuilder()); - } -} diff --git a/fabric/src/test/resources/anvil-lib-test.mixins.json b/fabric/src/test/resources/anvil-lib-test.mixins.json deleted file mode 100644 index b934dda..0000000 --- a/fabric/src/test/resources/anvil-lib-test.mixins.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "dev.anvilcraft.lib.mixin.fabric", - "compatibilityLevel": "JAVA_17", - "mixins": [ - "GameTestServerMixin" - ], - "client": [ - ], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/fabric/src/test/resources/fabric.mod.json b/fabric/src/test/resources/fabric.mod.json deleted file mode 100644 index 7dbac28..0000000 --- a/fabric/src/test/resources/fabric.mod.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "schemaVersion": 1, - "id": "anvil-lib-test", - "version": "1.0.0", - "name": "AnvilLib Test", - "description": "AnvilLib Test", - "authors": ["Anvil Dev"], - "contact": {}, - "license": "MIT", - "environment": "*", - "entrypoints": { - "main": [ - "dev.anvilcraft.lib.test.AnvilLibTest" - ], - "fabric-datagen": [ - "dev.anvilcraft.lib.test.AnvilLibTestDataGenerator" - ] - }, - "mixins": [ - "anvil-lib-test.mixins.json" - ], - "depends": { - "fabricloader": ">=0.15.0", - "fabric-api": ">=0.92.0", - "minecraft": "1.20.1" - } -} diff --git a/gradle.properties b/gradle.properties index 04ac97c..807100f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,29 +1,41 @@ -# JVM Info +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. java_version=21 org.gradle.jvmargs=-Xmx6G -# Mod Info -maven_group=dev.anvilcraft.lib +org.gradle.daemon=true +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configuration-cache=true +## Environment Properties +# You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge +# The Minecraft version must agree with the Neo version to get a valid artifact +minecraft_version=1.21.0 +# The Minecraft version range can use any release version of Minecraft as bounds. +# Snapshots, pre-releases, and release candidates are not guaranteed to sort properly +# as they do not follow standard versioning conventions. +minecraft_version_range=[1.21.0,1.22) +# The Neo version must agree with the Minecraft version to get a valid artifact +neo_version=21.0.167 +# The Neo version range can use any version of Neo as bounds +neo_version_range=[21,) +# The loader version range can only use the major version of FML as bounds +loader_version_range=[4,) +parchment_minecraft_version=1.21 +parchment_mappings_version=2024.07.28 +## Mod Properties +# The unique mod identifier for the mod. Must be lowercase in English locale. Must fit the regex [a-z][a-z0-9_]{1,63} +# Must match the String constant located in the main mod class annotated with @Mod. mod_id=anvillib +# The human-readable display name for the mod. mod_name=AnvilLib -mod_description=Library mod developed by Anvil Dev -mod_license=LGPL-3.0 license +# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. +mod_license=GNU LGPL 3.0 +# The mod version. See https://semver.org/ mod_version=1.0.0 -mod_url=https://github.com/Anvil-Dev/AnvilLib -# Development Info -enabled_platforms=fabric,forge -# Dependencies Info -minecraft_version=1.21 -yarn_mappings=1.21+build.9 -fabric_loader_version=0.16.4 -fabric_api_version=0.102.0 -mod_menu_fabric_version=11.0.2 -## NeoForge -neoforge_version=1.21.0-21.0.167 -## Libs -quilt_mappings_version=18 -parchment_version=2024.07.28 -shadow_version=7.1.2 -architectury_plugin_version=3.4-SNAPSHOT -architectury_loom_version=1.6-SNAPSHOT -mixinextras_version=0.2.0 -configuration_version=3.0.0 +# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. +# This should match the base package used for the mod sources. +# See https://maven.apache.org/guides/mini/guide-naming-conventions.html +mod_group_id=dev.anvilcraft.lib +# The authors of the mod. This is a simple text string that is used for display purposes in the mod list. +mod_authors=Gugle +# The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. +mod_description=Library mod developed by Anvil Dev diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7f93135c49b765f8051ef9d0a6055ff8e46073d8..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b82aa23..a441313 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.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a4..b740cf1 100644 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/gradlew.bat b/gradlew.bat index 93e3f59..25da30d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/neoforge/build.gradle b/neoforge/build.gradle deleted file mode 100644 index 8d5265d..0000000 --- a/neoforge/build.gradle +++ /dev/null @@ -1,188 +0,0 @@ -plugins { - alias(libs.plugins.shadow) -} - -String getConfig(String key) { - return project.getParent().properties.get(key) -} - -def mod_id = getConfig("mod_id") -def common_project = project(":${mod_id}-common") -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") - -architectury { - platformSetupLoomIde() - forge() -} - -static def isJetBrainsRuntime() { - return System.getProperty('java.vm.vendor').contains('JetBrains') -} - -loom { - accessWidenerPath = common_project.file("src/main/resources/${mod_id}.accesswidener") - - forge { - mixinConfig( - "${mod_id}-common.mixins.json", - "${mod_id}.mixins.json", - ) - - convertAccessWideners = true - extraAccessWideners.add loom.accessWidenerPath.get().asFile.name - - dataGen { - mod(mod_id) - } - } - - runConfigs.named("data").configure { - programArg("--existing=" + common_project.file("src/main/resources").absolutePath) - } - if (isJetBrainsRuntime()) { - runs { - client { - vmArgs '-XX:+AllowEnhancedClassRedefinition' - vmArgs '-XX:HotswapAgent=fatjar' - } - } - } - runs { - create("gameTestServer") { - server() - name("Minecraft Game Test") - source("main") - - property("forge.enabledGameTestNamespaces", mod_id) - property("forge.gameTestServer", "true") - - mods { - create(mod_id) { - sourceSet("main") - } - } - } - } -} - - -configurations { - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentForge.extendsFrom common - - apiElements { - outgoing { - capability("net.neoforged:forge:${rootProject.neoforge_version}") - capability("io.github.llamalad7:mixinextras-forge:${this.forge.versions.mixinextras.get()}") - } - } -} - -repositories { - // mavens for Forge-exclusives - maven { url = "https://maven.theillusivec4.top/" } // Curios - maven { url = "https://maven.parchmentmc.org" } // Parchment mappings - maven { url = "https://maven.quiltmc.org/repository/release" } // Quilt Mappings - maven { // TOP - url "https://maven.k-4u.nl" - } - maven { - // saps.dev Maven (KubeJS and Rhino) - url = "https://maven.saps.dev/minecraft" - content { - includeGroup "dev.latvian.mods" - } - } - maven { url 'https://jitpack.io' } // Mixin Extras, Fabric ASM - maven { url "https://maven.neoforged.net/releases" } -} - -dependencies { - forge("net.neoforged:forge:${rootProject.neoforge_version}") - - common(project(path: ":${mod_id}-common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":${mod_id}-common", configuration: "transformProductionForge")) { transitive = false } - - // Mixin Extras - implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:${this.forge.versions.mixinextras.get()}")) - implementation(include("io.github.llamalad7:mixinextras-forge:${this.forge.versions.mixinextras.get()}")) -} - -processResources { - Map properties = Map.of( - "version", version, - "mod_id", mod_id, - "forge_version", rootProject.neoforge_version, // only specify major version of forge - "minecraft_version", libs.versions.minecraft.get(), - "mod_license", mod_license, - "mod_name", mod_name, - "mod_description", mod_description, - "mod_url", mod_url - ) - properties.forEach((k, v) -> inputs.property(k, v)) - - filesMatching("META-INF/mods.toml") { - expand properties - } -} - -shadowJar { - exclude "fabric.mod.json" - exclude "architectury.common.json" - - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} - -remapJar { - inputFile.set(shadowJar.archiveFile) - dependsOn shadowJar - archiveClassifier.set(null) -} - -jar { - archiveClassifier.set("dev") -} - -sourcesJar { - def commonSources = common_project.sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -publishing { - publications { - mavenForge(MavenPublication) { - artifactId = archivesBaseName - 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. - def MAVEN_URL = System.getenv("MAVEN_URL") - if (MAVEN_URL != null) { - maven { - url MAVEN_URL - credentials { - username System.getenv("MAVEN_USERNAME") - password System.getenv("MAVEN_PASSWORD") - } - } - } - } -} diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties deleted file mode 100644 index 4517f08..0000000 --- a/neoforge/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -loom.platform=forge -neo_version_range=[47.1,) \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/mods.toml b/neoforge/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 17cd4f9..0000000 --- a/neoforge/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,28 +0,0 @@ -modLoader = "javafml" -loaderVersion = "[${forge_version},)" -license = "${mod_license}" - -[[mods]] -modId = "${mod_id}" -version = "${version}" -displayName = "${mod_name}" -displayURL = "${mod_url}" -authors = ["Anvil Dev"] -description = "${mod_description}" -logoFile = "icon.png" #optional -#credits="Thanks for this example mod goes to Java" - -[[dependencies.${ mod_id }]] - -modId = "forge" -mandatory = true #mandatory -versionRange = "[${forge_version},)" #mandatory -ordering = "NONE" -side = "BOTH" - -[[dependencies.${ mod_id }]] -modId = "minecraft" -mandatory = true -versionRange = "${minecraft_version}" -ordering = "NONE" -side = "BOTH" diff --git a/neoforge/src/main/resources/anvillib.mixins.json b/neoforge/src/main/resources/anvillib.mixins.json deleted file mode 100644 index 46fffe8..0000000 --- a/neoforge/src/main/resources/anvillib.mixins.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "dev.anvilcraft.lib.mixin.forge", - "compatibilityLevel": "JAVA_17", - "mixins": [ - ], - "client": [ - ], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/neoforge/src/main/resources/pack.mcmeta b/neoforge/src/main/resources/pack.mcmeta deleted file mode 100644 index f79828d..0000000 --- a/neoforge/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,7 +0,0 @@ -{ - "pack": { - "description": "AnvilCraft resources", - "pack_format": 15, - "forge:server_data_pack_format": 12 - } -} diff --git a/settings.gradle b/settings.gradle index 7d086e7..ada876e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,78 +1,11 @@ pluginManagement { repositories { - maven { url "https://maven.fabricmc.net/" } - maven { url "https://maven.architectury.dev/" } - maven { url "https://maven.minecraftforge.net/" } + mavenLocal() gradlePluginPortal() + maven { url = 'https://maven.neoforged.net/releases' } } } -dependencyResolutionManagement { - repositories { - mavenCentral() - } - versionCatalogs { - // Minecraft Version - def minecraftVersion = "${minecraft_version}" - - // Fabric - def fabricLoaderVersion = "${fabric_loader_version}" // https://fabricmc.net/develop/ - def fabricApiVersion = "${fabric_api_version}" // https://fabricmc.net/develop/ - def modMenuFabricVersion = "${mod_menu_fabric_version}" - - // Libs - def quiltMappingsVersion = "${quilt_mappings_version}" // https://lambdaurora.dev/tools/import_quilt.html - def parchmentVersion = "${parchment_version}" // https://parchmentmc.org/docs/getting-started - def shadowVersion = "${shadow_version}" - def architecturyPluginVersion = "${architectury_plugin_version}" - def architecturyLoomVersion = "${architectury_loom_version}" - def mixinextrasVersion = "${mixinextras_version}" - - fabric { - def fabricLoader = version("fabricLoader", fabricLoaderVersion) - library("fabricLoader", "net.fabricmc", "fabric-loader").versionRef(fabricLoader) - - def fabricApi = version("fabricApi", "${fabricApiVersion}+${minecraftVersion}") - library("fabricApi", "net.fabricmc.fabric-api", "fabric-api").versionRef(fabricApi) - - def modMenu = version("modmenu", modMenuFabricVersion) - library("modmenu", "com.terraformersmc", "modmenu").versionRef(modMenu) - - def mixinextras = version("mixinextras", mixinextrasVersion) - library("mixinextras", "io.github.llamalad7", "mixinextras-fabric").versionRef(mixinextras) - library("mixinextras-common", "io.github.llamalad7", "mixinextras-common").versionRef(mixinextras) - } - - forge { - def mixinextras = version("mixinextras", mixinextrasVersion) - library("mixinextras-forge", "io.github.llamalad7", "mixinextras-forge").versionRef(mixinextras) - } - - libs { - version("quiltMappings", quiltMappingsVersion) - version("parchment", parchmentVersion) - - def minecraft = version("minecraft", minecraftVersion) - library("minecraft", "com.mojang", "minecraft").versionRef(minecraft) - - def shadow = version("shadow", shadowVersion) - plugin("shadow", "com.github.johnrengelman.shadow").versionRef(shadow) - - def architecturyPlugin = version("architectury", architecturyPluginVersion) - plugin("architectury", "architectury-plugin").versionRef(architecturyPlugin) - - def architecturyLoom = version("architectury-loom", architecturyLoomVersion) - plugin("architectury-loom", "dev.architectury.loom").versionRef(architecturyLoom) - } - } +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' } - -include("${mod_id}-common") -include("${mod_id}-fabric") -include("${mod_id}-neoforge") - -project(":${mod_id}-common").setProjectDir(new File("common")) -project(":${mod_id}-neoforge").setProjectDir(new File("neoforge")) -project(":${mod_id}-fabric").setProjectDir(new File("fabric")) - -rootProject.name = "${mod_name}" \ No newline at end of file diff --git a/common/src/main/java/dev/anvilcraft/lib/AnvilLib.java b/src/main/java/dev/anvilcraft/lib/AnvilLib.java similarity index 73% rename from common/src/main/java/dev/anvilcraft/lib/AnvilLib.java rename to src/main/java/dev/anvilcraft/lib/AnvilLib.java index 46f8044..85dd29b 100644 --- a/common/src/main/java/dev/anvilcraft/lib/AnvilLib.java +++ b/src/main/java/dev/anvilcraft/lib/AnvilLib.java @@ -1,8 +1,8 @@ package dev.anvilcraft.lib; +import dev.anvilcraft.lib.forge.AnvilLibImpl; import dev.anvilcraft.lib.util.Platform; -import dev.architectury.injectables.annotations.ExpectPlatform; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,13 +15,11 @@ public static void init() { } - @ExpectPlatform public static Platform getPlatform() { - throw new AssertionError(); + return AnvilLibImpl.getPlatform(); } - @ExpectPlatform public static boolean isLoaded(String modid) { - throw new AssertionError(); + return AnvilLibImpl.isLoaded(modid); } } diff --git a/common/src/main/java/dev/anvilcraft/lib/data/DataProviderType.java b/src/main/java/dev/anvilcraft/lib/data/DataProviderType.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/DataProviderType.java rename to src/main/java/dev/anvilcraft/lib/data/DataProviderType.java index a799051..9c389f8 100644 --- a/common/src/main/java/dev/anvilcraft/lib/data/DataProviderType.java +++ b/src/main/java/dev/anvilcraft/lib/data/DataProviderType.java @@ -4,8 +4,8 @@ import dev.anvilcraft.lib.data.provider.AnvilLibBlockModelProvider; import dev.anvilcraft.lib.data.provider.AnvilLibBlockStateProvider; import dev.anvilcraft.lib.data.provider.AnvilLibItemModelProvider; -import dev.anvilcraft.lib.data.provider.LanguageProvider; import dev.anvilcraft.lib.data.provider.BlockLootTableProvider; +import dev.anvilcraft.lib.data.provider.LanguageProvider; import dev.anvilcraft.lib.data.provider.RegistratorLootTableProvider; import dev.anvilcraft.lib.data.provider.RegistratorRecipeProvider; import dev.anvilcraft.lib.data.provider.RegistratorTagsProvider; diff --git a/common/src/main/java/dev/anvilcraft/lib/data/JsonSerializable.java b/src/main/java/dev/anvilcraft/lib/data/JsonSerializable.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/JsonSerializable.java rename to src/main/java/dev/anvilcraft/lib/data/JsonSerializable.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/TagBuilder.java b/src/main/java/dev/anvilcraft/lib/data/TagBuilder.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/TagBuilder.java rename to src/main/java/dev/anvilcraft/lib/data/TagBuilder.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/file/BlockModelFile.java b/src/main/java/dev/anvilcraft/lib/data/file/BlockModelFile.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/file/BlockModelFile.java rename to src/main/java/dev/anvilcraft/lib/data/file/BlockModelFile.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/file/BlockStateFile.java b/src/main/java/dev/anvilcraft/lib/data/file/BlockStateFile.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/file/BlockStateFile.java rename to src/main/java/dev/anvilcraft/lib/data/file/BlockStateFile.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/file/BlockStateVariant.java b/src/main/java/dev/anvilcraft/lib/data/file/BlockStateVariant.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/file/BlockStateVariant.java rename to src/main/java/dev/anvilcraft/lib/data/file/BlockStateVariant.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/file/BlockStateVariantKey.java b/src/main/java/dev/anvilcraft/lib/data/file/BlockStateVariantKey.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/file/BlockStateVariantKey.java rename to src/main/java/dev/anvilcraft/lib/data/file/BlockStateVariantKey.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/file/ItemModelFile.java b/src/main/java/dev/anvilcraft/lib/data/file/ItemModelFile.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/file/ItemModelFile.java rename to src/main/java/dev/anvilcraft/lib/data/file/ItemModelFile.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/file/ModelFile.java b/src/main/java/dev/anvilcraft/lib/data/file/ModelFile.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/file/ModelFile.java rename to src/main/java/dev/anvilcraft/lib/data/file/ModelFile.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/file/MultiPartModelFile.java b/src/main/java/dev/anvilcraft/lib/data/file/MultiPartModelFile.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/file/MultiPartModelFile.java rename to src/main/java/dev/anvilcraft/lib/data/file/MultiPartModelFile.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/file/ResourceFile.java b/src/main/java/dev/anvilcraft/lib/data/file/ResourceFile.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/file/ResourceFile.java rename to src/main/java/dev/anvilcraft/lib/data/file/ResourceFile.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/AdvancementProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/AdvancementProvider.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/AdvancementProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/AdvancementProvider.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibBlockModelProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibBlockModelProvider.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibBlockModelProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibBlockModelProvider.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibBlockStateProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibBlockStateProvider.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibBlockStateProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibBlockStateProvider.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibItemModelProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibItemModelProvider.java similarity index 97% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibItemModelProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibItemModelProvider.java index 9879cd3..39e0e05 100644 --- a/common/src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibItemModelProvider.java +++ b/src/main/java/dev/anvilcraft/lib/data/provider/AnvilLibItemModelProvider.java @@ -1,7 +1,6 @@ package dev.anvilcraft.lib.data.provider; import dev.anvilcraft.lib.data.file.ItemModelFile; -import dev.anvilcraft.lib.registrator.entry.ItemEntry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/BlockLootTableProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/BlockLootTableProvider.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/BlockLootTableProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/BlockLootTableProvider.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/LanguageProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/LanguageProvider.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/LanguageProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/LanguageProvider.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/ModelProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/ModelProvider.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/ModelProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/ModelProvider.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/RegistratorLootTableProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/RegistratorLootTableProvider.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/RegistratorLootTableProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/RegistratorLootTableProvider.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/RegistratorRecipeProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/RegistratorRecipeProvider.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/RegistratorRecipeProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/RegistratorRecipeProvider.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/RegistratorTagsProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/RegistratorTagsProvider.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/RegistratorTagsProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/RegistratorTagsProvider.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/ResourceFileProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/ResourceFileProvider.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/ResourceFileProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/ResourceFileProvider.java diff --git a/common/src/main/java/dev/anvilcraft/lib/data/provider/UpsideDownLanguageProvider.java b/src/main/java/dev/anvilcraft/lib/data/provider/UpsideDownLanguageProvider.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/data/provider/UpsideDownLanguageProvider.java rename to src/main/java/dev/anvilcraft/lib/data/provider/UpsideDownLanguageProvider.java diff --git a/common/src/main/java/dev/anvilcraft/lib/event/Cancelable.java b/src/main/java/dev/anvilcraft/lib/event/Cancelable.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/event/Cancelable.java rename to src/main/java/dev/anvilcraft/lib/event/Cancelable.java diff --git a/common/src/main/java/dev/anvilcraft/lib/event/EventListener.java b/src/main/java/dev/anvilcraft/lib/event/EventListener.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/event/EventListener.java rename to src/main/java/dev/anvilcraft/lib/event/EventListener.java diff --git a/common/src/main/java/dev/anvilcraft/lib/event/EventManager.java b/src/main/java/dev/anvilcraft/lib/event/EventManager.java similarity index 98% rename from common/src/main/java/dev/anvilcraft/lib/event/EventManager.java rename to src/main/java/dev/anvilcraft/lib/event/EventManager.java index 469cb5e..9c82bad 100644 --- a/common/src/main/java/dev/anvilcraft/lib/event/EventManager.java +++ b/src/main/java/dev/anvilcraft/lib/event/EventManager.java @@ -12,7 +12,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; @SuppressWarnings("unused") diff --git a/common/src/main/java/dev/anvilcraft/lib/event/SubscribeEvent.java b/src/main/java/dev/anvilcraft/lib/event/SubscribeEvent.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/event/SubscribeEvent.java rename to src/main/java/dev/anvilcraft/lib/event/SubscribeEvent.java diff --git a/neoforge/src/main/java/dev/anvilcraft/lib/forge/AnvilLibForge.java b/src/main/java/dev/anvilcraft/lib/forge/AnvilLibForge.java similarity index 100% rename from neoforge/src/main/java/dev/anvilcraft/lib/forge/AnvilLibForge.java rename to src/main/java/dev/anvilcraft/lib/forge/AnvilLibForge.java diff --git a/neoforge/src/main/java/dev/anvilcraft/lib/forge/AnvilLibImpl.java b/src/main/java/dev/anvilcraft/lib/forge/AnvilLibImpl.java similarity index 100% rename from neoforge/src/main/java/dev/anvilcraft/lib/forge/AnvilLibImpl.java rename to src/main/java/dev/anvilcraft/lib/forge/AnvilLibImpl.java diff --git a/common/src/main/java/dev/anvilcraft/lib/integration/AnvilLibIntegrations.java b/src/main/java/dev/anvilcraft/lib/integration/AnvilLibIntegrations.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/integration/AnvilLibIntegrations.java rename to src/main/java/dev/anvilcraft/lib/integration/AnvilLibIntegrations.java diff --git a/common/src/main/java/dev/anvilcraft/lib/integration/Integration.java b/src/main/java/dev/anvilcraft/lib/integration/Integration.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/integration/Integration.java rename to src/main/java/dev/anvilcraft/lib/integration/Integration.java diff --git a/common/src/main/java/dev/anvilcraft/lib/mixin/BlockEntityRenderersAccessor.java b/src/main/java/dev/anvilcraft/lib/mixin/BlockEntityRenderersAccessor.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/mixin/BlockEntityRenderersAccessor.java rename to src/main/java/dev/anvilcraft/lib/mixin/BlockEntityRenderersAccessor.java diff --git a/common/src/main/java/dev/anvilcraft/lib/mixin/ItemPropertiesAccessor.java b/src/main/java/dev/anvilcraft/lib/mixin/ItemPropertiesAccessor.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/mixin/ItemPropertiesAccessor.java rename to src/main/java/dev/anvilcraft/lib/mixin/ItemPropertiesAccessor.java diff --git a/common/src/main/java/dev/anvilcraft/lib/mixin/LootContextParamSetsAccessor.java b/src/main/java/dev/anvilcraft/lib/mixin/LootContextParamSetsAccessor.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/mixin/LootContextParamSetsAccessor.java rename to src/main/java/dev/anvilcraft/lib/mixin/LootContextParamSetsAccessor.java diff --git a/common/src/main/java/dev/anvilcraft/lib/mixin/LootTableProviderAccessor.java b/src/main/java/dev/anvilcraft/lib/mixin/LootTableProviderAccessor.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/mixin/LootTableProviderAccessor.java rename to src/main/java/dev/anvilcraft/lib/mixin/LootTableProviderAccessor.java diff --git a/neoforge/src/main/java/dev/anvilcraft/lib/mixin/forge/package-info.java b/src/main/java/dev/anvilcraft/lib/mixin/forge/package-info.java similarity index 100% rename from neoforge/src/main/java/dev/anvilcraft/lib/mixin/forge/package-info.java rename to src/main/java/dev/anvilcraft/lib/mixin/forge/package-info.java diff --git a/common/src/main/java/dev/anvilcraft/lib/network/Network.java b/src/main/java/dev/anvilcraft/lib/network/Network.java similarity index 94% rename from common/src/main/java/dev/anvilcraft/lib/network/Network.java rename to src/main/java/dev/anvilcraft/lib/network/Network.java index 6e933f8..13801f9 100644 --- a/common/src/main/java/dev/anvilcraft/lib/network/Network.java +++ b/src/main/java/dev/anvilcraft/lib/network/Network.java @@ -1,13 +1,13 @@ package dev.anvilcraft.lib.network; -import dev.architectury.injectables.annotations.ExpectPlatform; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; +import dev.anvilcraft.lib.network.forge.NetworkImpl; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.chunk.LevelChunk; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -41,7 +41,7 @@ public void handler(T data, MinecraftServer server, ServerPlayer player) { * * @param data 数据 */ - @Environment(EnvType.CLIENT) + @OnlyIn(Dist.CLIENT) public void handler(T data) { } @@ -83,7 +83,7 @@ public void send(ServerPlayer player, T data) { * * @param data 数据 */ - @Environment(EnvType.CLIENT) + @OnlyIn(Dist.CLIENT) public void send(T data) { throw new AssertionError(); } @@ -107,11 +107,10 @@ public void broadcastTrackingChunk(LevelChunk chunk, T data) { throw new AssertionError(); } - @ExpectPlatform public static @NotNull Network create( ResourceLocation type, Class clazz, Function decoder ) { - throw new AssertionError(); + return NetworkImpl.create(type,clazz,decoder); } /** diff --git a/common/src/main/java/dev/anvilcraft/lib/network/Packet.java b/src/main/java/dev/anvilcraft/lib/network/Packet.java similarity index 87% rename from common/src/main/java/dev/anvilcraft/lib/network/Packet.java rename to src/main/java/dev/anvilcraft/lib/network/Packet.java index af49726..ffc29f8 100644 --- a/common/src/main/java/dev/anvilcraft/lib/network/Packet.java +++ b/src/main/java/dev/anvilcraft/lib/network/Packet.java @@ -1,12 +1,12 @@ package dev.anvilcraft.lib.network; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.chunk.LevelChunk; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; /** @@ -21,7 +21,7 @@ public interface Packet { default void handler(@NotNull MinecraftServer server, ServerPlayer player) { } - @Environment(EnvType.CLIENT) + @OnlyIn(Dist.CLIENT) default void handler() { } @@ -29,7 +29,7 @@ default void send(ServerPlayer player) { Network.sendPacket(player, this); } - @Environment(EnvType.CLIENT) + @OnlyIn(Dist.CLIENT) default void send() { Network.sendPacket(this); } diff --git a/neoforge/src/main/java/dev/anvilcraft/lib/network/forge/NetworkImpl.java b/src/main/java/dev/anvilcraft/lib/network/forge/NetworkImpl.java similarity index 98% rename from neoforge/src/main/java/dev/anvilcraft/lib/network/forge/NetworkImpl.java rename to src/main/java/dev/anvilcraft/lib/network/forge/NetworkImpl.java index 40dd687..93ac6eb 100644 --- a/neoforge/src/main/java/dev/anvilcraft/lib/network/forge/NetworkImpl.java +++ b/src/main/java/dev/anvilcraft/lib/network/forge/NetworkImpl.java @@ -8,7 +8,6 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.PacketDistributor; diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/AbstractRegistrator.java b/src/main/java/dev/anvilcraft/lib/registrator/AbstractRegistrator.java similarity index 99% rename from common/src/main/java/dev/anvilcraft/lib/registrator/AbstractRegistrator.java rename to src/main/java/dev/anvilcraft/lib/registrator/AbstractRegistrator.java index e9fd3b9..ee29a9f 100644 --- a/common/src/main/java/dev/anvilcraft/lib/registrator/AbstractRegistrator.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/AbstractRegistrator.java @@ -1,13 +1,12 @@ package dev.anvilcraft.lib.registrator; import dev.anvilcraft.lib.data.DataProviderType; +import dev.anvilcraft.lib.registrator.builder.BlockBuilder; import dev.anvilcraft.lib.registrator.builder.BlockEntityBuilder; import dev.anvilcraft.lib.registrator.builder.CreativeModeTabBuilder; import dev.anvilcraft.lib.registrator.builder.EnchantmentBuilder; import dev.anvilcraft.lib.registrator.builder.EntityBuilder; import dev.anvilcraft.lib.registrator.builder.EntryBuilder; -import dev.anvilcraft.lib.registrator.builder.ItemBuilder; -import dev.anvilcraft.lib.registrator.builder.BlockBuilder; import dev.anvilcraft.lib.registrator.builder.MenuBuilder; import dev.anvilcraft.lib.registrator.builder.RegistratorItemBuilder; import dev.anvilcraft.lib.registrator.entry.TagKeyEntry; diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/BuilderManager.java b/src/main/java/dev/anvilcraft/lib/registrator/BuilderManager.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/registrator/BuilderManager.java rename to src/main/java/dev/anvilcraft/lib/registrator/BuilderManager.java diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/Registrator.java b/src/main/java/dev/anvilcraft/lib/registrator/Registrator.java similarity index 72% rename from common/src/main/java/dev/anvilcraft/lib/registrator/Registrator.java rename to src/main/java/dev/anvilcraft/lib/registrator/Registrator.java index 7c00d41..1b93d7a 100644 --- a/common/src/main/java/dev/anvilcraft/lib/registrator/Registrator.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/Registrator.java @@ -1,6 +1,6 @@ package dev.anvilcraft.lib.registrator; -import dev.architectury.injectables.annotations.ExpectPlatform; +import dev.anvilcraft.lib.registrator.forge.RegistratorImpl; import org.jetbrains.annotations.NotNull; @SuppressWarnings("unused") @@ -9,8 +9,7 @@ protected Registrator(String modid) { super(modid); } - @ExpectPlatform public static @NotNull Registrator create(String modid) { - throw new AssertionError(); + return RegistratorImpl.create(modid); } } diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/ResourcePacksHelper.java b/src/main/java/dev/anvilcraft/lib/registrator/ResourcePacksHelper.java similarity index 79% rename from common/src/main/java/dev/anvilcraft/lib/registrator/ResourcePacksHelper.java rename to src/main/java/dev/anvilcraft/lib/registrator/ResourcePacksHelper.java index e370a48..1e168db 100644 --- a/common/src/main/java/dev/anvilcraft/lib/registrator/ResourcePacksHelper.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/ResourcePacksHelper.java @@ -1,13 +1,12 @@ package dev.anvilcraft.lib.registrator; -import dev.architectury.injectables.annotations.ExpectPlatform; +import dev.anvilcraft.lib.registrator.forge.ResourcePacksHelperImpl; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; public class ResourcePacksHelper { - @ExpectPlatform public static void registerBuiltinResourcePack(@NotNull ResourceLocation pack, PackType type) { - throw new AssertionError(); + ResourcePacksHelperImpl.registerBuiltinResourcePack(pack,type); } public enum PackType { diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockBuilder.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockBuilder.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockBuilder.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/BlockBuilder.java diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockEntityBuilder.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockEntityBuilder.java similarity index 95% rename from common/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockEntityBuilder.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/BlockEntityBuilder.java index 521ed5a..fe214b0 100644 --- a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockEntityBuilder.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockEntityBuilder.java @@ -1,12 +1,12 @@ package dev.anvilcraft.lib.registrator.builder; import dev.anvilcraft.lib.registrator.AbstractRegistrator; +import dev.anvilcraft.lib.registrator.builder.forge.BlockEntityBuilderImpl; import dev.anvilcraft.lib.registrator.entry.BlockEntityEntry; import dev.anvilcraft.lib.registrator.entry.RegistryEntry; import dev.anvilcraft.lib.util.Side; import dev.anvilcraft.lib.util.SideExecutor; import dev.anvilcraft.lib.util.TripleFunction; -import dev.architectury.injectables.annotations.ExpectPlatform; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.core.BlockPos; @@ -35,9 +35,8 @@ protected BlockEntityBuilder(AbstractRegistrator registrator, String id, TripleF this.factory = factory; } - @ExpectPlatform public static BlockEntityBuilder create(AbstractRegistrator registrator, String id, TripleFunction, BlockPos, BlockState, T> factory) { - throw new AssertionError(); + return BlockEntityBuilderImpl.create(registrator, id, factory); } @SuppressWarnings("UnusedReturnValue") diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockItemBuilder.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockItemBuilder.java similarity index 96% rename from common/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockItemBuilder.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/BlockItemBuilder.java index d331bae..b797a8d 100644 --- a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockItemBuilder.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/builder/BlockItemBuilder.java @@ -1,7 +1,6 @@ package dev.anvilcraft.lib.registrator.builder; import dev.anvilcraft.lib.registrator.AbstractRegistrator; -import net.minecraft.tags.TagKey; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/CreativeModeTabBuilder.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/CreativeModeTabBuilder.java similarity index 94% rename from common/src/main/java/dev/anvilcraft/lib/registrator/builder/CreativeModeTabBuilder.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/CreativeModeTabBuilder.java index 7c687e1..42937c5 100644 --- a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/CreativeModeTabBuilder.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/builder/CreativeModeTabBuilder.java @@ -1,8 +1,8 @@ package dev.anvilcraft.lib.registrator.builder; import dev.anvilcraft.lib.registrator.AbstractRegistrator; +import dev.anvilcraft.lib.registrator.builder.forge.CreativeModeTabBuilderImpl; import dev.anvilcraft.lib.registrator.entry.RegistryEntry; -import dev.architectury.injectables.annotations.ExpectPlatform; import net.minecraft.Util; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; @@ -23,9 +23,8 @@ protected CreativeModeTabBuilder(AbstractRegistrator registrator, String id, Cre this.lang(toTitleCase(this.id)); } - @ExpectPlatform public static CreativeModeTabBuilder create(AbstractRegistrator registrator, String id, Consumer consumer) { - throw new AssertionError(); + return CreativeModeTabBuilderImpl.create(registrator, id, consumer); } @SuppressWarnings("UnusedReturnValue") diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/EnchantmentBuilder.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/EnchantmentBuilder.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/registrator/builder/EnchantmentBuilder.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/EnchantmentBuilder.java diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/EntityBuilder.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/EntityBuilder.java similarity index 93% rename from common/src/main/java/dev/anvilcraft/lib/registrator/builder/EntityBuilder.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/EntityBuilder.java index 03579bc..3a5adbc 100644 --- a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/EntityBuilder.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/builder/EntityBuilder.java @@ -1,12 +1,11 @@ package dev.anvilcraft.lib.registrator.builder; import dev.anvilcraft.lib.registrator.AbstractRegistrator; +import dev.anvilcraft.lib.registrator.builder.forge.EntityBuilderImpl; import dev.anvilcraft.lib.registrator.entry.EntityEntry; import dev.anvilcraft.lib.registrator.entry.RegistryEntry; import dev.anvilcraft.lib.util.Side; import dev.anvilcraft.lib.util.SideExecutor; -import dev.architectury.injectables.annotations.ExpectPlatform; -import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; import net.minecraft.Util; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -37,9 +36,8 @@ protected EntityBuilder(AbstractRegistrator registrator, String id, BiFunction @NotNull EntityBuilder create(AbstractRegistrator registrator, String id, BiFunction, Level, T> factory, MobCategory category) { - throw new AssertionError(); + return EntityBuilderImpl.create(registrator, id, factory, category); } @SuppressWarnings("UnusedReturnValue") diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/EntryBuilder.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/EntryBuilder.java similarity index 97% rename from common/src/main/java/dev/anvilcraft/lib/registrator/builder/EntryBuilder.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/EntryBuilder.java index d0fa461..564edad 100644 --- a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/EntryBuilder.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/builder/EntryBuilder.java @@ -2,7 +2,6 @@ import dev.anvilcraft.lib.registrator.AbstractRegistrator; import dev.anvilcraft.lib.registrator.entry.RegistryEntry; -import dev.anvilcraft.lib.util.Callback; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/ItemBuilder.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/ItemBuilder.java similarity index 98% rename from common/src/main/java/dev/anvilcraft/lib/registrator/builder/ItemBuilder.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/ItemBuilder.java index b5152a5..4a1526c 100644 --- a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/ItemBuilder.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/builder/ItemBuilder.java @@ -1,7 +1,7 @@ package dev.anvilcraft.lib.registrator.builder; -import dev.anvilcraft.lib.data.provider.AnvilLibItemModelProvider; import dev.anvilcraft.lib.data.DataProviderType; +import dev.anvilcraft.lib.data.provider.AnvilLibItemModelProvider; import dev.anvilcraft.lib.data.provider.RegistratorRecipeProvider; import dev.anvilcraft.lib.mixin.ItemPropertiesAccessor; import dev.anvilcraft.lib.registrator.AbstractRegistrator; @@ -13,8 +13,6 @@ import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockBehaviour; import org.jetbrains.annotations.NotNull; import java.util.function.BiConsumer; diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/MenuBuilder.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/MenuBuilder.java similarity index 92% rename from common/src/main/java/dev/anvilcraft/lib/registrator/builder/MenuBuilder.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/MenuBuilder.java index 15d874d..53984fa 100644 --- a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/MenuBuilder.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/builder/MenuBuilder.java @@ -1,8 +1,8 @@ package dev.anvilcraft.lib.registrator.builder; import dev.anvilcraft.lib.registrator.AbstractRegistrator; +import dev.anvilcraft.lib.registrator.builder.forge.MenuBuilderImpl; import dev.anvilcraft.lib.registrator.entry.RegistryEntry; -import dev.architectury.injectables.annotations.ExpectPlatform; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.FriendlyByteBuf; @@ -32,14 +32,12 @@ protected MenuBuilder(AbstractRegistrator registrator, String id, ForgeMenuFacto this.screenFactory = screenFactory; } - @ExpectPlatform public static MenuBuilder create(AbstractRegistrator registrator, String id, MenuFactory menuFactory, ScreenFactory screenFactory) { - throw new AssertionError(); + return MenuBuilderImpl.create(registrator, id, menuFactory, screenFactory); } - @ExpectPlatform public static MenuBuilder create(AbstractRegistrator registrator, String id, ForgeMenuFactory menuFactory, ScreenFactory screenFactory) { - throw new AssertionError(); + return MenuBuilderImpl.create(registrator, id, menuFactory, screenFactory); } @Override diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/builder/RegistratorItemBuilder.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/RegistratorItemBuilder.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/registrator/builder/RegistratorItemBuilder.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/RegistratorItemBuilder.java diff --git a/neoforge/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/BlockEntityBuilderImpl.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/BlockEntityBuilderImpl.java similarity index 100% rename from neoforge/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/BlockEntityBuilderImpl.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/forge/BlockEntityBuilderImpl.java diff --git a/neoforge/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/CreativeModeTabBuilderImpl.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/CreativeModeTabBuilderImpl.java similarity index 100% rename from neoforge/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/CreativeModeTabBuilderImpl.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/forge/CreativeModeTabBuilderImpl.java diff --git a/neoforge/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/EntityBuilderImpl.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/EntityBuilderImpl.java similarity index 100% rename from neoforge/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/EntityBuilderImpl.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/forge/EntityBuilderImpl.java diff --git a/neoforge/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/MenuBuilderImpl.java b/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/MenuBuilderImpl.java similarity index 100% rename from neoforge/src/main/java/dev/anvilcraft/lib/registrator/builder/forge/MenuBuilderImpl.java rename to src/main/java/dev/anvilcraft/lib/registrator/builder/forge/MenuBuilderImpl.java diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntityEntry.java b/src/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntityEntry.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntityEntry.java rename to src/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntityEntry.java diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntry.java b/src/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntry.java similarity index 94% rename from common/src/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntry.java rename to src/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntry.java index 48e9cab..c53a45d 100644 --- a/common/src/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntry.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/entry/BlockEntry.java @@ -1,13 +1,11 @@ package dev.anvilcraft.lib.registrator.entry; import dev.anvilcraft.lib.registrator.builder.BlockBuilder; -import dev.anvilcraft.lib.registrator.builder.ItemBuilder; import lombok.Getter; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/entry/EnchantmentEntry.java b/src/main/java/dev/anvilcraft/lib/registrator/entry/EnchantmentEntry.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/registrator/entry/EnchantmentEntry.java rename to src/main/java/dev/anvilcraft/lib/registrator/entry/EnchantmentEntry.java diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/entry/EntityEntry.java b/src/main/java/dev/anvilcraft/lib/registrator/entry/EntityEntry.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/registrator/entry/EntityEntry.java rename to src/main/java/dev/anvilcraft/lib/registrator/entry/EntityEntry.java diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/entry/ItemEntry.java b/src/main/java/dev/anvilcraft/lib/registrator/entry/ItemEntry.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/registrator/entry/ItemEntry.java rename to src/main/java/dev/anvilcraft/lib/registrator/entry/ItemEntry.java diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/entry/RegistryEntry.java b/src/main/java/dev/anvilcraft/lib/registrator/entry/RegistryEntry.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/registrator/entry/RegistryEntry.java rename to src/main/java/dev/anvilcraft/lib/registrator/entry/RegistryEntry.java diff --git a/common/src/main/java/dev/anvilcraft/lib/registrator/entry/TagKeyEntry.java b/src/main/java/dev/anvilcraft/lib/registrator/entry/TagKeyEntry.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/registrator/entry/TagKeyEntry.java rename to src/main/java/dev/anvilcraft/lib/registrator/entry/TagKeyEntry.java diff --git a/neoforge/src/main/java/dev/anvilcraft/lib/registrator/forge/RegistratorImpl.java b/src/main/java/dev/anvilcraft/lib/registrator/forge/RegistratorImpl.java similarity index 92% rename from neoforge/src/main/java/dev/anvilcraft/lib/registrator/forge/RegistratorImpl.java rename to src/main/java/dev/anvilcraft/lib/registrator/forge/RegistratorImpl.java index 05467de..a892a69 100644 --- a/neoforge/src/main/java/dev/anvilcraft/lib/registrator/forge/RegistratorImpl.java +++ b/src/main/java/dev/anvilcraft/lib/registrator/forge/RegistratorImpl.java @@ -4,8 +4,6 @@ import dev.anvilcraft.lib.registrator.Registrator; import dev.anvilcraft.lib.registrator.builder.EntryBuilder; import net.minecraft.core.Registry; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.RegisterEvent; import org.jetbrains.annotations.NotNull; diff --git a/neoforge/src/main/java/dev/anvilcraft/lib/registrator/forge/ResourcePacksHelperImpl.java b/src/main/java/dev/anvilcraft/lib/registrator/forge/ResourcePacksHelperImpl.java similarity index 100% rename from neoforge/src/main/java/dev/anvilcraft/lib/registrator/forge/ResourcePacksHelperImpl.java rename to src/main/java/dev/anvilcraft/lib/registrator/forge/ResourcePacksHelperImpl.java diff --git a/common/src/main/java/dev/anvilcraft/lib/util/Callback.java b/src/main/java/dev/anvilcraft/lib/util/Callback.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/util/Callback.java rename to src/main/java/dev/anvilcraft/lib/util/Callback.java diff --git a/common/src/main/java/dev/anvilcraft/lib/util/Platform.java b/src/main/java/dev/anvilcraft/lib/util/Platform.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/util/Platform.java rename to src/main/java/dev/anvilcraft/lib/util/Platform.java diff --git a/common/src/main/java/dev/anvilcraft/lib/util/Side.java b/src/main/java/dev/anvilcraft/lib/util/Side.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/util/Side.java rename to src/main/java/dev/anvilcraft/lib/util/Side.java diff --git a/common/src/main/java/dev/anvilcraft/lib/util/SideExecutor.java b/src/main/java/dev/anvilcraft/lib/util/SideExecutor.java similarity index 60% rename from common/src/main/java/dev/anvilcraft/lib/util/SideExecutor.java rename to src/main/java/dev/anvilcraft/lib/util/SideExecutor.java index b05979f..c3c373d 100644 --- a/common/src/main/java/dev/anvilcraft/lib/util/SideExecutor.java +++ b/src/main/java/dev/anvilcraft/lib/util/SideExecutor.java @@ -1,12 +1,11 @@ package dev.anvilcraft.lib.util; -import dev.architectury.injectables.annotations.ExpectPlatform; +import dev.anvilcraft.lib.util.forge.SideExecutorImpl; import java.util.function.Supplier; public class SideExecutor { - @ExpectPlatform public static void execute(Side side, Supplier runnable) { - throw new AssertionError(); + SideExecutorImpl.execute(side,runnable); } } diff --git a/common/src/main/java/dev/anvilcraft/lib/util/TripleConsumer.java b/src/main/java/dev/anvilcraft/lib/util/TripleConsumer.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/util/TripleConsumer.java rename to src/main/java/dev/anvilcraft/lib/util/TripleConsumer.java diff --git a/common/src/main/java/dev/anvilcraft/lib/util/TripleFunction.java b/src/main/java/dev/anvilcraft/lib/util/TripleFunction.java similarity index 100% rename from common/src/main/java/dev/anvilcraft/lib/util/TripleFunction.java rename to src/main/java/dev/anvilcraft/lib/util/TripleFunction.java diff --git a/neoforge/src/main/java/dev/anvilcraft/lib/util/forge/SideExecutorImpl.java b/src/main/java/dev/anvilcraft/lib/util/forge/SideExecutorImpl.java similarity index 100% rename from neoforge/src/main/java/dev/anvilcraft/lib/util/forge/SideExecutorImpl.java rename to src/main/java/dev/anvilcraft/lib/util/forge/SideExecutorImpl.java diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..c71fce1 --- /dev/null +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,86 @@ +# This is an example mods.toml file. It contains the data relating to the loading mods. +# There are several mandatory fields (#mandatory), and many more that are optional (#optional). +# The overall format is standard TOML format, v0.5.0. +# Note that there are a couple of TOML lists in this file. +# Find more information on toml format here: https://github.com/toml-lang/toml +# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml +modLoader = "javafml" #mandatory +# A version range to match for said mod loader - for regular FML @Mod it will be the the FML version. This is currently 47. +loaderVersion = "${loader_version_range}" #mandatory +# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. +# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. +license = "${mod_license}" +# A URL to refer people to when problems occur with this mod +#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional +# A list of mods - how many allowed here is determined by the individual mod loader +[[mods]] #mandatory +# The modid of the mod +modId = "${mod_id}" #mandatory +# The version number of the mod +version = "${mod_version}" #mandatory +# A display name for the mod +displayName = "${mod_name}" #mandatory +# A URL to query for updates for this mod. See the JSON update specification https://docs.neoforge.net/docs/misc/updatechecker/ +#updateJSONURL="https://change.me.example.invalid/updates.json" #optional +# A URL for the "homepage" for this mod, displayed in the mod UI +displayURL="https://github.com/Anvil-Dev/AnvilLib" +# A file name (in the root of the mod JAR) containing a logo for display +#logoFile="anvillib.png" #optional +# A text field displayed in the mod UI +#credits="" #optional +# A text field displayed in the mod UI +authors = "${mod_authors}" #optional +# Display Test controls the display for your mod in the server connection screen +# MATCH_VERSION means that your mod will cause a red X if the versions on client and server differ. This is the default behaviour and should be what you choose if you have server and client elements to your mod. +# IGNORE_SERVER_VERSION means that your mod will not cause a red X if it's present on the server but not on the client. This is what you should use if you're a server only mod. +# IGNORE_ALL_VERSION means that your mod will not cause a red X if it's present on the client or the server. This is a special case and should only be used if your mod has no server component. +# NONE means that no display test is set on your mod. You need to do this yourself, see IExtensionPoint.DisplayTest for more information. You can define any scheme you wish with this value. +# IMPORTANT NOTE: this is NOT an instruction as to which environments (CLIENT or DEDICATED SERVER) your mod loads on. Your mod should load (and maybe do nothing!) whereever it finds itself. +#displayTest="MATCH_VERSION" # MATCH_VERSION is the default if nothing is specified (#optional) + +# The description text for the mod (multi line!) (#mandatory) +description = '''${mod_description}''' + +# The [[mixins]] block allows you to declare your mixin config to FML so that it gets loaded. +[[mixins]] +config = "${mod_id}.mixins.json" + +# The [[accessTransformers]] block allows you to declare where your AT file is. +# If this block is omitted, a fallback attempt will be made to load an AT from META-INF/accesstransformer.cfg +#[[accessTransformers]] +#file="META-INF/accesstransformer.cfg" + +# The coremods config file path is not configurable and is always loaded from META-INF/coremods.json + +# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. +[[dependencies."${mod_id}"]] #optional +# the modid of the dependency +modId = "neoforge" #mandatory +# The type of the dependency. Can be one of "required", "optional", "incompatible" or "discouraged" (case insensitive). +# 'required' requires the mod to exist, 'optional' does not +# 'incompatible' will prevent the game from loading when the mod exists, and 'discouraged' will show a warning +type = "required" #mandatory +# Optional field describing why the dependency is required or why it is incompatible +# reason="..." +# The version range of the dependency +versionRange = "${neo_version_range}" #mandatory +# An ordering relationship for the dependency. +# BEFORE - This mod is loaded BEFORE the dependency +# AFTER - This mod is loaded AFTER the dependency +ordering = "NONE" +# Side this dependency is applied on - BOTH, CLIENT, or SERVER +side = "BOTH" +# Here's another dependency +[[dependencies."${mod_id}"]] +modId = "minecraft" +type = "required" +# This version range declares a minimum of the current minecraft version up to but not including the next major version +versionRange = "${minecraft_version_range}" +ordering = "NONE" +side = "BOTH" + +# Features are specific properties of the game environment, that you may want to declare you require. This example declares +# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't +# stop your mod loading on the server for example. +#[features."${mod_id}"] +#openGLVersion="[3.2,)" diff --git a/common/src/main/resources/anvillib.accesswidener b/src/main/resources/anvillib.accesswidener similarity index 100% rename from common/src/main/resources/anvillib.accesswidener rename to src/main/resources/anvillib.accesswidener diff --git a/common/src/main/resources/anvillib-common.mixins.json b/src/main/resources/anvillib.mixins.json similarity index 81% rename from common/src/main/resources/anvillib-common.mixins.json rename to src/main/resources/anvillib.mixins.json index 4b46e9c..dc25358 100644 --- a/common/src/main/resources/anvillib-common.mixins.json +++ b/src/main/resources/anvillib.mixins.json @@ -2,7 +2,8 @@ "required": true, "minVersion": "0.8", "package": "dev.anvilcraft.lib.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_8", + "refmap": "anvillib.refmap.json", "mixins": [ "ItemPropertiesAccessor", "LootContextParamSetsAccessor", diff --git a/common/src/main/resources/icon.png b/src/main/resources/icon.png similarity index 100% rename from common/src/main/resources/icon.png rename to src/main/resources/icon.png