diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 21fb723..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -patreon: LatvianModder diff --git a/.github/workflows/build.yml b/.github/workflows/build_1902_fabric.yml similarity index 52% rename from .github/workflows/build.yml rename to .github/workflows/build_1902_fabric.yml index 3d7dbfe..2881c05 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build_1902_fabric.yml @@ -1,17 +1,23 @@ -name: Java CI +name: Java CI (1.19.2 Fabric) on: push: branches: - # main and dev versions for each mc ver here - - "1.19/main" - - "1.19/dev" + - '1902/fabric' workflow_dispatch: + branches: + - '1902/fabric' inputs: - norelease: - description: 'Do not publish' + release_type: + description: 'Release Type' required: true - default: 'false' + type: choice + default: 'release' + options: + - 'release' + - 'beta' + - 'alpha' + - 'none' jobs: build: @@ -19,30 +25,40 @@ jobs: if: | !contains(github.event.head_commit.message, '[ci skip]') steps: - - uses: actions/checkout@v2 + - name: Checkout + uses: actions/checkout@v3 with: - fetch-depth: 30 # Gets the last 30 commits so the changelog might work + fetch-depth: 30 + - name: Set up JDK 17 - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: distribution: 'temurin' java-version: '17' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Validate Gradle Wrapper uses: gradle/wrapper-validation-action@v1 + - name: Build and Publish with Gradle uses: gradle/gradle-build-action@v2 env: - FTB_MAVEN_TOKEN: ${{ secrets.FTB_MAVEN_TOKEN }} + MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }} SAPS_TOKEN: ${{ secrets.SAPS_TOKEN }} with: arguments: build publish --stacktrace --no-daemon + - name: Release to CurseForge uses: gradle/gradle-build-action@v2 - if: | - contains(github.ref, 'main') && !contains(github.event.head_commit.message, '[norelease]') && github.event.inputs.norelease != 'true' + if: ${{ github.event_name == 'workflow_dispatch' && inputs.release_type != 'none' }} env: GIT_COMMIT: ${{ github.event.after }} GIT_PREVIOUS_COMMIT: ${{ github.event.before }} CURSEFORGE_KEY: ${{ secrets.CURSEFORGE_KEY }} + MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} + RELEASE_TYPE: ${{ inputs.release_type }} with: - arguments: build curseforge --stacktrace --no-daemon + arguments: publishUnified --stacktrace --no-daemon \ No newline at end of file diff --git a/.github/workflows/build_2001_fabric.yml b/.github/workflows/build_2001_fabric.yml new file mode 100644 index 0000000..85c7c33 --- /dev/null +++ b/.github/workflows/build_2001_fabric.yml @@ -0,0 +1,64 @@ +name: Java CI (1.20.1 Fabric) + +on: + push: + branches: + - '2001/fabric' + workflow_dispatch: + branches: + - '2001/fabric' + inputs: + release_type: + description: 'Release Type' + required: true + type: choice + default: 'release' + options: + - 'release' + - 'beta' + - 'alpha' + - 'none' + +jobs: + build: + runs-on: ubuntu-latest + if: | + !contains(github.event.head_commit.message, '[ci skip]') + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 30 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v1 + + - name: Build and Publish with Gradle + uses: gradle/gradle-build-action@v2 + env: + MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }} + SAPS_TOKEN: ${{ secrets.SAPS_TOKEN }} + with: + arguments: build publish --stacktrace --no-daemon + + - name: Release to CurseForge + uses: gradle/gradle-build-action@v2 + if: ${{ github.event_name == 'workflow_dispatch' && inputs.release_type != 'none' }} + env: + GIT_COMMIT: ${{ github.event.after }} + GIT_PREVIOUS_COMMIT: ${{ github.event.before }} + CURSEFORGE_KEY: ${{ secrets.CURSEFORGE_KEY }} + MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} + RELEASE_TYPE: ${{ inputs.release_type }} + with: + arguments: publishUnified --stacktrace --no-daemon diff --git a/.gitignore b/.gitignore index b752589..4ac7367 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,4 @@ run .vscode # night config dependency override my beloved -!fabric/run/config/fabric_loader_dependencies.json \ No newline at end of file +!fabric/run/config/fabric_loader_dependencies.jsonlibs/ diff --git a/.kubejs/meta.json b/.kubejs/meta.json new file mode 100644 index 0000000..eb5c0b9 --- /dev/null +++ b/.kubejs/meta.json @@ -0,0 +1,16 @@ +{ + "minecraft": 1902, + "type": "fabric", + "version": { + "file": "gradle.properties", + "pattern": "^mod_version=([\\w.]+)$", + "group": 1, + "format": "{version}-build.{run_number}" + }, + "downloads": [ + { + "name": "Fabric", + "url": "https://maven.saps.dev/releases/dev/latvian/mods/kubejs-create-fabric/{version}/kubejs-create-fabric-{version}.jar" + } + ] +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index f96d598..8aee529 100644 --- a/build.gradle +++ b/build.gradle @@ -1,71 +1,190 @@ plugins { - id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "0.12.0-SNAPSHOT" apply false - id "io.github.juuxel.loom-quiltflower" version "1.7.2" apply false + id "dev.architectury.loom" version "1.9-SNAPSHOT" + id "maven-publish" + id "me.shedaniel.unified-publishing" version "0.1.+" } -architectury { - minecraft = rootProject.minecraft_version +// apply from: 'https://files.latmod.com/public/markdown-git-changelog.gradle' +// Commented out due to network issues - handle changelog manually + +sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '21' + +def ENV = System.getenv() +version = "${mod_version}-build.${ENV.GITHUB_RUN_NUMBER ?: '9999'}" +archivesBaseName = "${project.archives_base_name}-fabric" +group = project.maven_group + +loom { + silentMojangMappingsLicense() } -subprojects { - apply plugin: "dev.architectury.loom" - apply plugin: "io.github.juuxel.loom-quiltflower" +repositories { + // Local libs directory for mods with version string issues + flatDir { + dirs 'libs' + } + + maven { + url "https://maven.saps.dev/releases" + } + + // the maven for the devOS repo, for create fabric + // (and a bunch of libraries I'm assuming) + maven { url "https://mvn.devos.one/snapshots/" } + maven { url "https://mvn.devos.one/releases/" } + + maven { url = "https://maven.terraformersmc.com/releases/" } // Mod Menu + maven { url = "https://maven.jamieswhiteshirt.com/libs-release" } // Reach Entity Attributes + + maven { + url "https://maven.tterrag.com/" + content { + includeGroup "com.jozufozu.flywheel" + includeGroup "com.tterrag.registrate_fabric" + } + } - loom { - silentMojangMappingsLicense() + // jitpack?! why?! + maven { + url "https://jitpack.io/" + content { + includeGroup "com.github.LlamaLad7" + includeGroup "com.github.llamalad7.mixinextras" // two different versions of mixinextras on the classpath?? WHY?! + includeGroup "com.github.Chocohead" + includeGroup "com.github.Draylar.omega-config" + } } - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.layered() { - officialMojangMappings() - // parchment("org.parchmentmc.data:parchment-1.17.1:2021.10.10") + // "i play both sides, that way i always come out ahead" + maven { + url "https://api.modrinth.com/maven" + content { + includeGroup "maven.modrinth" + } + } + maven { + url "https://cursemaven.com" + content { + includeGroup "curse.maven" } } } -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - apply from: "https://files.latmod.com/public/markdown-git-changelog.gradle" +dependencies { + minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" + mappings loom.officialMojangMappings() + + modApi("net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}") + modApi("net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}") + + // Architectury API - cross-platform compatibility layer + modApi("dev.architectury:architectury-fabric:9.2.14") + + // Rhino - JavaScript engine used by KubeJS + modApi("dev.latvian.mods:rhino-fabric:2001.2.3-build.10") - def ENV = System.getenv() - version = "${mod_version}-build.${ENV.GITHUB_RUN_NUMBER ?: 9999}" - group = project.maven_group - archivesBaseName = project.archives_base_name + // KubeJS from maven.saps.dev + modApi("dev.latvian.mods:kubejs-fabric:${rootProject.kubejs_version}") + + // Porting-Lib modules (same as Create uses) - provides FluidStack and other forge-like APIs + modApi("io.github.fabricators_of_create.Porting-Lib:transfer:2.3.13+1.20.1") + modApi("io.github.fabricators_of_create.Porting-Lib:base:2.3.13+1.20.1") + + // Create from local libs directory (copied from WOWID3/mods for proper compilation) + modApi(name: "create-fabric-6.0.8.0+build.1734-mc1.20.1", ext: "jar") + + // Registrate - for ItemEntry support (compileOnly since Create includes it) + modCompileOnly("com.tterrag.registrate_fabric:Registrate:1.3.79-MC1.20.1") + + modLocalRuntime modCompileOnly("curse.maven:jei-238222:4494409") +} - sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '17' +processResources { + inputs.property "version", project.version - compileJava { - options.encoding = "UTF-8" + filesMatching("fabric.mod.json") { + expand "version": project.version } +} - repositories { - maven { - url "https://maven.architectury.dev/" +java { + withSourcesJar() +} + +jar { + archiveClassifier.set "dev" +} + +remapJar { + archiveBaseName.set "${rootProject.archives_base_name}-fabric" + archiveClassifier.set null +} + +publishing { + publications { + mavenFabric(MavenPublication) { + artifactId = rootProject.archivesBaseName + from components.java } + } - maven { - url "https://maven.saps.dev/minecraft" - content { - includeGroup "dev.latvian.mods" - includeGroup "dev.ftb.mods" + repositories { + if (ENV.SAPS_TOKEN) { + maven { + url "https://maven.saps.dev/minecraft" + credentials { + username = "latvian" + password = "${ENV.SAPS_TOKEN}" + } } } - maven { - url = "https://maven.parchmentmc.net/" - content { - includeGroup "org.parchmentmc.data" + if (ENV.MAVEN_TOKEN) { + maven { + url "https://maven.latvian.dev/releases" + credentials { + username = "lat" + password = "${ENV.MAVEN_TOKEN}" + } } } - - mavenLocal() } +} + + +unifiedPublishing { + project { + releaseType = "${ENV.RELEASE_TYPE ?: 'release'}" + gameVersions = [ + rootProject.minecraft_version + ] + gameLoaders = ["fabric"] + displayName = "$mod_name Fabric $project.version" + changelog = "See GitHub for full changelog" + mainPublication remapJar + + relations { + depends { + curseforge = modrinth = "kubejs" + } + depends { + curseforge = modrinth = "create-fabric" + } + } - java { - withSourcesJar() + if (ENV.CURSEFORGE_KEY) { + curseforge { + token = ENV.CURSEFORGE_KEY + id = project.curseforge_id + } + } + + if (ENV.MODRINTH_TOKEN) { + modrinth { + token = ENV.MODRINTH_TOKEN + id = project.modrinth_id + version = "$project.version+fabric" + } + } } } diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index 36038d2..0000000 --- a/common/build.gradle +++ /dev/null @@ -1,42 +0,0 @@ -repositories { - maven { - name "devOS (Create)" - url "https://mvn.devos.one/snapshots/" - content { - includeGroup "com.simibubi.create" - } - } - - maven { - url "https://maven.tterrag.com/" - content { - includeGroup "com.jozufozu.flywheel" - } - } -} - -dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - - modApi "dev.latvian.mods:kubejs:${rootProject.kubejs_version}" - - // create specifically from the devOS repo, to ensure it's the fabric version - // note we are trying to avoid using fabric-specific hooks here! - modApi("com.simibubi.create:create-fabric-${rootProject.minecraft_version}:${rootProject.create_version}") { - transitive = false - } -} - -def ENV = System.getenv() - -architectury { - common("fabric", "forge") -} - -configurations { - dev -} - -artifacts { - dev(jar) -} diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/ItemApplicationRecipeJS.java b/common/src/main/java/dev/latvian/mods/kubejs/create/ItemApplicationRecipeJS.java deleted file mode 100644 index 8fd1eb4..0000000 --- a/common/src/main/java/dev/latvian/mods/kubejs/create/ItemApplicationRecipeJS.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.latvian.mods.kubejs.create; - -public class ItemApplicationRecipeJS extends ProcessingRecipeJS { - public ItemApplicationRecipeJS keepHeldItem(boolean keep) { - json.addProperty("keepHeldItem", keep); - save(); - return this; - } - - public ItemApplicationRecipeJS keepHeldItem() { - return keepHeldItem(true); - } -} diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/KubeJSCreatePlugin.java b/common/src/main/java/dev/latvian/mods/kubejs/create/KubeJSCreatePlugin.java deleted file mode 100644 index e9332d0..0000000 --- a/common/src/main/java/dev/latvian/mods/kubejs/create/KubeJSCreatePlugin.java +++ /dev/null @@ -1,78 +0,0 @@ -package dev.latvian.mods.kubejs.create; - -import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.content.contraptions.processing.ProcessingRecipeSerializer; -import com.simibubi.create.foundation.fluid.FluidIngredient; -import dev.latvian.mods.kubejs.KubeJSPlugin; -import dev.latvian.mods.kubejs.RegistryObjectBuilderTypes; -import dev.latvian.mods.kubejs.create.events.BoilerHeaterHandlerEvent; -import dev.latvian.mods.kubejs.create.events.CreateEvents; -import dev.latvian.mods.kubejs.create.events.SpecialFluidHandlerEvent; -import dev.latvian.mods.kubejs.create.events.SpecialSpoutHandlerEvent; -import dev.latvian.mods.kubejs.create.platform.FluidIngredientHelper; -import dev.latvian.mods.kubejs.fluid.FluidStackJS; -import dev.latvian.mods.kubejs.recipe.RecipeJS; -import dev.latvian.mods.kubejs.recipe.RegisterRecipeTypesEvent; -import dev.latvian.mods.kubejs.script.ScriptType; -import dev.latvian.mods.kubejs.util.MapJS; -import dev.latvian.mods.rhino.Context; -import dev.latvian.mods.rhino.util.wrap.TypeWrappers; -import net.minecraft.resources.ResourceLocation; - -import java.util.Map; -import java.util.function.Supplier; - -/** - * @author LatvianModder - */ -public class KubeJSCreatePlugin extends KubeJSPlugin { - - private static final Map> recipeProviders = Map.of( - new ResourceLocation("create:deploying"), ItemApplicationRecipeJS::new, - new ResourceLocation("create:item_application"), ItemApplicationRecipeJS::new - ); - - @Override - public void init() { - RegistryObjectBuilderTypes.ITEM.addType("create:sequenced_assembly", SequencedAssemblyItemBuilder.class, SequencedAssemblyItemBuilder::new); - } - - @Override - public void registerEvents() { - CreateEvents.GROUP.register(); - } - - @Override - public void afterInit() { - CreateEvents.BOILER_HEATER.post(new BoilerHeaterHandlerEvent()); - CreateEvents.SPECIAL_FLUID.post(new SpecialFluidHandlerEvent()); - CreateEvents.SPECIAL_SPOUT.post(new SpecialSpoutHandlerEvent()); - } - - @Override - public void registerTypeWrappers(ScriptType type, TypeWrappers typeWrappers) { - typeWrappers.register(FluidIngredient.class, this::wrapFluidIngredient); - } - - private FluidIngredient wrapFluidIngredient(Context cx, Object o) { - if (o instanceof FluidStackJS fluidStackJS) { - return FluidIngredientHelper.toFluidIngredient(fluidStackJS); - } else if (o instanceof Map map && (map.containsKey("fluid") || map.containsKey("fluidTag"))) { - return FluidIngredient.deserialize(MapJS.json(map)); - } else { - return FluidIngredientHelper.toFluidIngredient(FluidStackJS.of(o)); - } - } - - @Override - public void registerRecipeTypes(RegisterRecipeTypesEvent event) { - event.register(new ResourceLocation("create:sequenced_assembly"), SequencedAssemblyRecipeJS::new); - event.registerShaped(new ResourceLocation("create:mechanical_crafting")); - - for (var createRecipeType : AllRecipeTypes.values()) { - if (createRecipeType.getSerializer() instanceof ProcessingRecipeSerializer) { - event.register(createRecipeType.getId(), recipeProviders.getOrDefault(createRecipeType.getId(), ProcessingRecipeJS::new)); - } - } - } -} \ No newline at end of file diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/ProcessingRecipeJS.java b/common/src/main/java/dev/latvian/mods/kubejs/create/ProcessingRecipeJS.java deleted file mode 100644 index 0b82abd..0000000 --- a/common/src/main/java/dev/latvian/mods/kubejs/create/ProcessingRecipeJS.java +++ /dev/null @@ -1,182 +0,0 @@ -package dev.latvian.mods.kubejs.create; - -import com.google.gson.JsonArray; -import com.simibubi.create.foundation.fluid.FluidIngredient; -import dev.latvian.mods.kubejs.create.platform.FluidIngredientHelper; -import dev.latvian.mods.kubejs.fluid.FluidStackJS; -import dev.latvian.mods.kubejs.recipe.IngredientMatch; -import dev.latvian.mods.kubejs.recipe.ItemInputTransformer; -import dev.latvian.mods.kubejs.recipe.ItemOutputTransformer; -import dev.latvian.mods.kubejs.recipe.RecipeArguments; -import dev.latvian.mods.kubejs.recipe.RecipeJS; -import dev.latvian.mods.kubejs.util.ListJS; -import dev.latvian.mods.kubejs.util.MapJS; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * @author LatvianModder - */ -public class ProcessingRecipeJS extends RecipeJS { - public final List inputFluids = new ArrayList<>(); - public final List outputFluids = new ArrayList<>(); - public final List outputItems = new ArrayList<>(); - public final List inputItems = new ArrayList<>(); - - @Override - public void create(RecipeArguments args) { - for (var result : ListJS.orSelf(args.get(0))) { - if (result instanceof FluidStackJS fluid) { - outputFluids.add(fluid); - } else { - outputItems.add(parseItemOutput(result)); - } - } - - for (var input : ListJS.orSelf(args.get(1))) { - if (input instanceof FluidStackJS fluid) { - inputFluids.add(FluidIngredientHelper.toFluidIngredient(fluid)); - } else if (input instanceof Map map && (map.containsKey("fluid") || map.containsKey("fluidTag"))) { - inputFluids.add(FluidIngredient.deserialize(MapJS.json(input))); - } else { - inputItems.add(parseItemInput(input)); - } - } - - json.addProperty("processingTime", 100); - } - - @Override - public void deserialize() { - for (var ingredient : json.get("ingredients").getAsJsonArray()) { - if (FluidIngredient.isFluidIngredient(ingredient)) { - inputFluids.add(FluidIngredient.deserialize(ingredient)); - } else { - inputItems.add(parseItemInput(ingredient)); - } - } - - for (var result : json.get("results").getAsJsonArray()) { - var resultJson = result.getAsJsonObject(); - - if (resultJson.has("fluid")) { - outputFluids.add(FluidStackJS.fromJson(resultJson)); - } else { - outputItems.add(parseItemOutput(result)); - } - } - } - - public ProcessingRecipeJS processingTime(int t) { - json.addProperty("processingTime", t); - save(); - return this; - } - - public ProcessingRecipeJS heatRequirement(String req) { - json.addProperty("heatRequirement", req); - save(); - return this; - } - - public ProcessingRecipeJS heated() { - return heatRequirement("heated"); - } - - public ProcessingRecipeJS superheated() { - return heatRequirement("superheated"); - } - - @Override - public void serialize() { - if (serializeInputs) { - var jsonIngredients = new JsonArray(); - - for (var inputStack : inputItems) { - jsonIngredients.add(inputStack.toJson()); - } - - for (var fluid : inputFluids) { - jsonIngredients.add(fluid.serialize()); - } - - json.add("ingredients", jsonIngredients); - } - - if (serializeOutputs) { - var jsonOutputs = new JsonArray(); - - for (var item : outputItems) { - jsonOutputs.add(itemToJson(item)); - } - - for (var fluid : outputFluids) { - jsonOutputs.add(fluid.toJson()); - } - - json.add("results", jsonOutputs); - } - } - - @Override - public boolean hasInput(IngredientMatch match) { - for (var in : inputItems) { - if (match.contains(in)) { - return true; - } - } - - return false; - } - - @Override - public boolean replaceInput(IngredientMatch match, Ingredient with, ItemInputTransformer transformer) { - boolean changed = false; - - if (hasInput(match)) { - for (int i = 0; i < inputItems.size(); i++) { - var ingredient = inputItems.get(i); - - if (match.contains(ingredient)) { - inputItems.set(i, transformer.transform(this, match, ingredient, with)); - changed = true; - } - } - } - - return changed; - } - - @Override - public boolean hasOutput(IngredientMatch match) { - for (var out : outputItems) { - if (match.contains(out)) { - return true; - } - } - - return false; - } - - @Override - public boolean replaceOutput(IngredientMatch match, ItemStack with, ItemOutputTransformer transformer) { - boolean changed = false; - - if (hasOutput(match)) { - for (int i = 0; i < outputItems.size(); i++) { - var outputItem = outputItems.get(i); - - if (match.contains(outputItem)) { - outputItems.set(i, transformer.transform(this, match, outputItem, with)); - changed = true; - } - } - } - - return changed; - } -} diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyRecipeJS.java b/common/src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyRecipeJS.java deleted file mode 100644 index a221910..0000000 --- a/common/src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyRecipeJS.java +++ /dev/null @@ -1,122 +0,0 @@ -package dev.latvian.mods.kubejs.create; - -import com.google.gson.JsonArray; -import com.simibubi.create.content.contraptions.itemAssembly.IAssemblyRecipe; -import com.simibubi.create.content.contraptions.itemAssembly.SequencedRecipe; -import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; -import dev.latvian.mods.kubejs.item.ItemStackJS; -import dev.latvian.mods.kubejs.recipe.IngredientMatch; -import dev.latvian.mods.kubejs.recipe.ItemInputTransformer; -import dev.latvian.mods.kubejs.recipe.ItemOutputTransformer; -import dev.latvian.mods.kubejs.recipe.RecipeArguments; -import dev.latvian.mods.kubejs.recipe.RecipeExceptionJS; -import dev.latvian.mods.kubejs.recipe.RecipeJS; -import dev.latvian.mods.kubejs.util.ListJS; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; - -import java.util.ArrayList; -import java.util.List; - -public class SequencedAssemblyRecipeJS extends RecipeJS { - - public final List outputItems = new ArrayList<>(); - public Ingredient ingredient; - - @Override - public void create(RecipeArguments args) { - outputItems.addAll(parseItemOutputList(args.get(0))); - ingredient = parseItemInput(args.get(1)); - json.add("transitionalItem", ItemStackJS.of("create:precision_mechanism").toJsonJS()); - json.addProperty("loops", 4); - - var sequence = new JsonArray(); - - for (var step : ListJS.orSelf(args.get(2))) { - if (step instanceof RecipeJS recipeJS) { - recipeJS.dontAdd(); - try { - var recipe = recipeJS.createRecipe(); - if (recipe instanceof IAssemblyRecipe ass && recipe instanceof ProcessingRecipe proc && ass.supportsAssembly()) { - sequence.add(new SequencedRecipe<>(proc).toJson()); - } else { - throw new RecipeExceptionJS("Sequence recipe must be an assembly recipe!"); - } - } catch (Throwable ex) { - throw new RecipeExceptionJS("Failed to create " + ex); - } - } else { - throw new RecipeExceptionJS("Object must be a recipe, instead got " + step + " / " + step.getClass().getName()); - } - } - - json.add("sequence", sequence); - } - - @Override - public void deserialize() { - outputItems.addAll(parseItemOutputList(json.get("results"))); - ingredient = parseItemInput(json.get("ingredient")); - } - - public SequencedAssemblyRecipeJS transitionalItem(ItemStack item) { - json.add("transitionalItem", item.toJsonJS()); - save(); - return this; - } - - public SequencedAssemblyRecipeJS loops(int loops) { - json.addProperty("loops", loops); - save(); - return this; - } - - @Override - public void serialize() { - if (serializeOutputs) { - var results = new JsonArray(); - - for (var out : outputItems) { - results.add(out.toJsonJS()); - } - - json.add("results", results); - } - - if (serializeInputs) { - json.add("ingredient", ingredient.toJson()); - } - } - - @Override - public boolean hasInput(IngredientMatch match) { - return match.contains(ingredient); - } - - @Override - public boolean replaceInput(IngredientMatch match, Ingredient with, ItemInputTransformer transformer) { - if (match.contains(ingredient)) { - ingredient = transformer.transform(this, match, ingredient, with); - return true; - } - return false; - } - - @Override - public boolean hasOutput(IngredientMatch match) { - return outputItems.stream().anyMatch(match::contains); - } - - @Override - public boolean replaceOutput(IngredientMatch match, ItemStack with, ItemOutputTransformer transformer) { - if (hasOutput(match)) { - for (int i = 0; i < outputItems.size(); i++) { - var outputItem = outputItems.get(i); - if (match.contains(outputItem)) { - outputItems.set(i, transformer.transform(this, match, outputItem, with)); - } - } - } - return false; - } -} diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialFluidHandlerEvent.java b/common/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialFluidHandlerEvent.java deleted file mode 100644 index 76d5fbf..0000000 --- a/common/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialFluidHandlerEvent.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.latvian.mods.kubejs.create.events; - -import com.simibubi.create.content.contraptions.fluids.OpenEndedPipe; -import com.simibubi.create.foundation.fluid.FluidIngredient; -import dev.latvian.mods.kubejs.create.platform.FluidIngredientHelper; -import dev.latvian.mods.kubejs.event.EventJS; -import dev.latvian.mods.kubejs.fluid.FluidStackJS; - -import java.util.function.BiConsumer; - -/** - * @author Prunoideae - */ -public class SpecialFluidHandlerEvent extends EventJS { - public void add(FluidIngredient fluidIngredient, BiConsumer handler) { - OpenEndedPipe.registerEffectHandler(FluidIngredientHelper.createEffectHandler(fluidIngredient, handler)); - } -} diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialSpoutHandlerEvent.java b/common/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialSpoutHandlerEvent.java deleted file mode 100644 index 77146cc..0000000 --- a/common/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialSpoutHandlerEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package dev.latvian.mods.kubejs.create.events; - -import com.simibubi.create.api.behaviour.BlockSpoutingBehaviour; -import dev.latvian.mods.kubejs.block.state.BlockStatePredicate; -import dev.latvian.mods.kubejs.create.platform.FluidIngredientHelper; -import dev.latvian.mods.kubejs.event.EventJS; -import dev.latvian.mods.kubejs.fluid.FluidStackJS; -import dev.latvian.mods.kubejs.level.BlockContainerJS; -import net.minecraft.resources.ResourceLocation; - -/** - * @author Prunoideae - */ -public class SpecialSpoutHandlerEvent extends EventJS { - @FunctionalInterface - public interface SpoutHandler { - long fillBlock(BlockContainerJS block, FluidStackJS fluid, boolean simulate); - } - - public void add(ResourceLocation path, BlockStatePredicate block, SpoutHandler handler) { - BlockSpoutingBehaviour.addCustomSpoutInteraction(path, FluidIngredientHelper.createSpoutingHandler(block, handler)); - } -} diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/platform/BoilerHeaterHelper.java b/common/src/main/java/dev/latvian/mods/kubejs/create/platform/BoilerHeaterHelper.java deleted file mode 100644 index 4d3de68..0000000 --- a/common/src/main/java/dev/latvian/mods/kubejs/create/platform/BoilerHeaterHelper.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.latvian.mods.kubejs.create.platform; - -import dev.architectury.injectables.annotations.ExpectPlatform; -import dev.latvian.mods.kubejs.create.events.BoilerHeaterHandlerEvent; -import net.minecraft.world.level.block.Block; - -public class BoilerHeaterHelper { - @ExpectPlatform - public static void registerHeaterPlatform(Block block, BoilerHeaterHandlerEvent.BoilerHeaterCallback onUpdate) { - throw new AssertionError("Not implemented"); - } -} diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/platform/FluidIngredientHelper.java b/common/src/main/java/dev/latvian/mods/kubejs/create/platform/FluidIngredientHelper.java deleted file mode 100644 index 9fd9f0f..0000000 --- a/common/src/main/java/dev/latvian/mods/kubejs/create/platform/FluidIngredientHelper.java +++ /dev/null @@ -1,31 +0,0 @@ -package dev.latvian.mods.kubejs.create.platform; - -import com.simibubi.create.api.behaviour.BlockSpoutingBehaviour; -import com.simibubi.create.content.contraptions.fluids.OpenEndedPipe; -import com.simibubi.create.foundation.fluid.FluidIngredient; -import dev.architectury.injectables.annotations.ExpectPlatform; -import dev.latvian.mods.kubejs.block.state.BlockStatePredicate; -import dev.latvian.mods.kubejs.fluid.FluidStackJS; - -import java.util.function.BiConsumer; - -import static dev.latvian.mods.kubejs.create.events.SpecialSpoutHandlerEvent.SpoutHandler; - -public class FluidIngredientHelper { - - @ExpectPlatform - public static FluidIngredient toFluidIngredient(FluidStackJS fluidStack) { - throw new AssertionError("Not implemented"); - } - - @ExpectPlatform - public static OpenEndedPipe.IEffectHandler createEffectHandler(FluidIngredient fluidIngredient, BiConsumer handler) { - throw new AssertionError("Not implemented"); - } - - @ExpectPlatform - - public static BlockSpoutingBehaviour createSpoutingHandler(BlockStatePredicate block, SpoutHandler handler) { - throw new AssertionError("Not implemented"); - } -} diff --git a/fabric/build.gradle b/fabric/build.gradle deleted file mode 100644 index 0206257..0000000 --- a/fabric/build.gradle +++ /dev/null @@ -1,167 +0,0 @@ -plugins { - id "com.github.johnrengelman.shadow" version "7.0.0" - id "com.matthewprenger.cursegradle" version "1.4.0" -} - -def ENV = System.getenv() - -architectury { - platformSetupLoomIde() - fabric() -} - -configurations { - common - shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentForge.extendsFrom common - dev -} - -artifacts { - dev(jar) -} - -repositories { - // the maven for the devOS repo, for create fabric - // (and a bunch of libraries I'm assuming) - maven { url "https://mvn.devos.one/snapshots/" } - maven { url "https://mvn.devos.one/releases/" } - - maven { - url "https://maven.tterrag.com/" - content { - includeGroup "com.jozufozu.flywheel" - } - } - - // incoming maven hell - maven { url "https://storage.googleapis.com/devan-maven/" } - maven { url "https://aperlambda.github.io/maven" } - maven { url "https://ladysnake.jfrog.io/artifactory/mods" } - maven { url "https://maven.kotlindiscord.com/repository/terraformers/" } - maven { url "https://maven.terraformersmc.com/" } - maven { url "https://maven.terraformersmc.com/releases/" } - maven { url "https://maven.cafeteria.dev/releases/" } - maven { url "https://maven.jamieswhiteshirt.com/libs-release" } - maven { url "https://maven.gegy.dev" } - - // jitpack?! why?! - maven { - url "https://jitpack.io/" - content { - includeGroup "com.github.LlamaLad7" - includeGroup "com.github.Chocohead" - includeGroup "com.github.Draylar.omega-config" - } - } - - // "i play both sides, that way i always come out ahead" - maven { - url "https://api.modrinth.com/maven" - content { - includeGroup "maven.modrinth" - } - } - maven { - url "https://cursemaven.com" - content { - includeGroup "curse.maven" - } - } -} - -dependencies { - modApi("net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}") - modApi("net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}") - - modApi "dev.latvian.mods:kubejs-fabric:${rootProject.kubejs_version}" - modApi "com.simibubi.create:create-fabric-${rootProject.minecraft_version}:${rootProject.create_version}" - - modLocalRuntime modCompileOnly("me.shedaniel:RoughlyEnoughItems-fabric:${rootProject.rei_version}") - - common(project(path: ":common", configuration: "dev")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } -} - -processResources { - inputs.property "version", project.version - - filesMatching("fabric.mod.json") { - expand "version": project.version - } -} - -shadowJar { - configurations = [project.configurations.shadowCommon] - classifier "dev-shadow" -} - -remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar - archiveBaseName.set "${rootProject.archives_base_name}-${project.name}" - archiveClassifier.set null -} - -jar { - classifier "dev" -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -if (ENV.CURSEFORGE_KEY) { - curseforge { - apiKey = ENV.CURSEFORGE_KEY - project { - id = project.curseforge_id - releaseType = project.curseforge_type - addGameVersion "Fabric" - addGameVersion "1.19.2" - mainArtifact(remapJar.archivePath) - relations { - requiredDependency 'kubejs' - requiredDependency 'create-fabric' - } - changelog = getGitChangelog - changelogType = 'markdown' - } - } -} - -publishing { - publications { - mavenFabric(MavenPublication) { - artifactId = "${rootProject.archives_base_name}-${project.name}" - from components.java - } - } - - repositories { - if (ENV.FTB_MAVEN_TOKEN) { - maven { - url "https://maven.ftb.dev/release" - credentials { - username = "latvian" - password = "${ENV.FTB_MAVEN_TOKEN}" - } - } - } - - if (ENV.SAPS_TOKEN) { - maven { - url "https://maven.saps.dev/minecraft" - credentials { - username = "latvian" - password = "${ENV.SAPS_TOKEN}" - } - } - } - } -} - diff --git a/fabric/run/config/fabric_loader_dependencies.json b/fabric/run/config/fabric_loader_dependencies.json deleted file mode 100644 index 5e90dcf..0000000 --- a/fabric/run/config/fabric_loader_dependencies.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": 1, - "overrides": { - "forgeconfigapiport": { - "-depends": { - "com_electronwill_night-config_core": "", - "com_electronwill_night-config_toml": "" - } - } - } -} \ No newline at end of file diff --git a/fabric/src/main/java/dev/latvian/mods/kubejs/create/platform/fabric/BoilerHeaterHelperImpl.java b/fabric/src/main/java/dev/latvian/mods/kubejs/create/platform/fabric/BoilerHeaterHelperImpl.java deleted file mode 100644 index e0c6113..0000000 --- a/fabric/src/main/java/dev/latvian/mods/kubejs/create/platform/fabric/BoilerHeaterHelperImpl.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.latvian.mods.kubejs.create.platform.fabric; - -import com.simibubi.create.content.contraptions.fluids.tank.BoilerHeaters; -import dev.latvian.mods.kubejs.create.events.BoilerHeaterHandlerEvent; -import dev.latvian.mods.kubejs.util.UtilsJS; -import net.minecraft.world.level.block.Block; - -public class BoilerHeaterHelperImpl { - public static void registerHeaterPlatform(Block block, BoilerHeaterHandlerEvent.BoilerHeaterCallback onUpdate) { - BoilerHeaters.registerHeater(block, (level, blockPos, blockState) -> onUpdate.updateHeat(level.kjs$getBlock(blockPos))); - } -} diff --git a/fabric/src/main/java/dev/latvian/mods/kubejs/create/platform/fabric/FluidIngredientHelperImpl.java b/fabric/src/main/java/dev/latvian/mods/kubejs/create/platform/fabric/FluidIngredientHelperImpl.java deleted file mode 100644 index 053a1aa..0000000 --- a/fabric/src/main/java/dev/latvian/mods/kubejs/create/platform/fabric/FluidIngredientHelperImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -package dev.latvian.mods.kubejs.create.platform.fabric; - -import com.simibubi.create.api.behaviour.BlockSpoutingBehaviour; -import com.simibubi.create.content.contraptions.fluids.OpenEndedPipe; -import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; -import com.simibubi.create.foundation.fluid.FluidIngredient; -import dev.architectury.hooks.fluid.fabric.FluidStackHooksFabric; -import dev.latvian.mods.kubejs.block.state.BlockStatePredicate; -import dev.latvian.mods.kubejs.create.events.SpecialSpoutHandlerEvent; -import dev.latvian.mods.kubejs.fluid.FluidStackJS; -import dev.latvian.mods.kubejs.level.BlockContainerJS; -import io.github.fabricators_of_create.porting_lib.util.FluidStack; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.Level; - -import java.util.function.BiConsumer; - -public class FluidIngredientHelperImpl { - public static FluidIngredient toFluidIngredient(FluidStackJS fluidStack) { - return FluidIngredient.fromFluidStack(new FluidStack(FluidStackHooksFabric.toFabric(fluidStack.getFluidStack()),fluidStack.getAmount())); - } - - public static OpenEndedPipe.IEffectHandler createEffectHandler(FluidIngredient fluidIngredient, BiConsumer handler) { - return new OpenEndedPipe.IEffectHandler() { - @Override - public boolean canApplyEffects(OpenEndedPipe pipe, FluidStack fluid) { - return fluidIngredient.test(fluid); - } - - @Override - public void applyEffects(OpenEndedPipe pipe, FluidStack fluid) { - handler.accept(pipe, FluidStackJS.of(fluid)); - } - }; - } - - public static BlockSpoutingBehaviour createSpoutingHandler(BlockStatePredicate block, SpecialSpoutHandlerEvent.SpoutHandler handler) { - return new BlockSpoutingBehaviour() { - @Override - public long fillBlock(Level world, BlockPos pos, SpoutTileEntity spout, FluidStack availableFluid, boolean simulate) { - if (!block.test(world.getBlockState(pos))) { - return 0; - } - return handler.fillBlock(new BlockContainerJS(world, pos), FluidStackJS.of(availableFluid.writeToNBT(new CompoundTag())), simulate); - } - }; - } -} diff --git a/forge/build.gradle b/forge/build.gradle deleted file mode 100644 index ec84d4e..0000000 --- a/forge/build.gradle +++ /dev/null @@ -1,153 +0,0 @@ -plugins { - id "com.github.johnrengelman.shadow" version "7.0.0" - id "com.matthewprenger.cursegradle" version "1.4.0" -} - -def ENV = System.getenv() - -architectury { - platformSetupLoomIde() - forge() -} - -configurations { - common - shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentForge.extendsFrom common - dev -} - -artifacts { - dev(jar) -} - -repositories { - maven { - url "https://maven.tterrag.com/" - content { - includeGroup "com.simibubi.create" - includeGroup "com.jozufozu.flywheel" - includeGroup "com.tterrag.registrate" - } - } - maven { - url "https://maven.theillusivec4.top/" - content { - includeGroup "top.theillusivec4.curios" - } - } - - maven { - url 'https://dvs1.progwml6.com/files/maven' - content { - includeGroup "mezz.jei" - } - } -} -dependencies { - forge "net.minecraftforge:forge:${project.minecraft_version}-${project.forge_version}" - - modApi "dev.latvian.mods:kubejs-forge:${rootProject.kubejs_version}" - modApi "com.simibubi.create:create-${rootProject.minecraft_version}:${rootProject.create_version}:slim" - modApi "com.jozufozu.flywheel:flywheel-forge-${rootProject.minecraft_version}:${rootProject.flywheel_forge_version}" - - modLocalRuntime modCompileOnly("me.shedaniel:RoughlyEnoughItems-forge:${rootProject.rei_version}") - - common(project(path: ":common", configuration: "dev")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive false } -} - -processResources { - inputs.property "version", project.version - - filesMatching("META-INF/mods.toml") { - expand "version": project.version - } -} -shadowJar { - exclude "fabric.mod.json" - - configurations = [project.configurations.shadowCommon] - classifier "dev-shadow" -} - -remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar - archiveBaseName.set "${rootProject.archives_base_name}-${project.name}" - archiveClassifier.set null -} - -jar { - manifest { - attributes([ - "Specification-Title" : project.mod_id, - "Specification-Vendor" : project.mod_author, - "Specification-Version" : "1", - "Implementation-Title" : project.name, - "Implementation-Version" : version, - "Implementation-Vendor" : project.mod_author, - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } - - classifier "dev" -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -if (ENV.CURSEFORGE_KEY) { - curseforge { - apiKey = ENV.CURSEFORGE_KEY - project { - id = project.curseforge_id - releaseType = project.curseforge_type - addGameVersion "Forge" - addGameVersion "1.19.2" - mainArtifact(remapJar.archivePath) - relations { - requiredDependency 'kubejs' - requiredDependency 'create' - } - changelog = getGitChangelog - changelogType = 'markdown' - } - } -} - -publishing { - publications { - mavenForge(MavenPublication) { - artifactId = "${rootProject.archives_base_name}-${project.name}" - from components.java - } - } - - repositories { - if (ENV.FTB_MAVEN_TOKEN) { - maven { - url "https://maven.ftb.dev/release" - credentials { - username = "latvian" - password = "${ENV.FTB_MAVEN_TOKEN}" - } - } - } - - if (ENV.SAPS_TOKEN) { - maven { - url "https://maven.saps.dev/minecraft" - credentials { - username = "latvian" - password = "${ENV.SAPS_TOKEN}" - } - } - } - } -} diff --git a/forge/gradle.properties b/forge/gradle.properties deleted file mode 100644 index 32f842a..0000000 --- a/forge/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform=forge \ No newline at end of file diff --git a/forge/src/main/java/dev/latvian/mods/kubejs/create/forge/KubeJSCreateForge.java b/forge/src/main/java/dev/latvian/mods/kubejs/create/forge/KubeJSCreateForge.java deleted file mode 100644 index 0441a8c..0000000 --- a/forge/src/main/java/dev/latvian/mods/kubejs/create/forge/KubeJSCreateForge.java +++ /dev/null @@ -1,11 +0,0 @@ -package dev.latvian.mods.kubejs.create.forge; - -import dev.latvian.mods.kubejs.create.KubeJSCreate; -import net.minecraftforge.fml.common.Mod; - -@Mod("kubejs_create") -public class KubeJSCreateForge { - public KubeJSCreateForge() { - KubeJSCreate.init(); - } -} \ No newline at end of file diff --git a/forge/src/main/java/dev/latvian/mods/kubejs/create/platform/forge/BoilerHeaterHelperImpl.java b/forge/src/main/java/dev/latvian/mods/kubejs/create/platform/forge/BoilerHeaterHelperImpl.java deleted file mode 100644 index 61aa7cb..0000000 --- a/forge/src/main/java/dev/latvian/mods/kubejs/create/platform/forge/BoilerHeaterHelperImpl.java +++ /dev/null @@ -1,11 +0,0 @@ -package dev.latvian.mods.kubejs.create.platform.forge; - -import com.simibubi.create.content.contraptions.fluids.tank.BoilerHeaters; -import dev.latvian.mods.kubejs.create.events.BoilerHeaterHandlerEvent; -import net.minecraft.world.level.block.Block; - -public class BoilerHeaterHelperImpl { - public static void registerHeaterPlatform(Block block, BoilerHeaterHandlerEvent.BoilerHeaterCallback onUpdate) { - BoilerHeaters.registerHeater(block, (level, blockPos, blockState) -> onUpdate.updateHeat(level.kjs$getBlock(blockPos))); - } -} diff --git a/forge/src/main/java/dev/latvian/mods/kubejs/create/platform/forge/FluidIngredientHelperImpl.java b/forge/src/main/java/dev/latvian/mods/kubejs/create/platform/forge/FluidIngredientHelperImpl.java deleted file mode 100644 index 4eb4124..0000000 --- a/forge/src/main/java/dev/latvian/mods/kubejs/create/platform/forge/FluidIngredientHelperImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package dev.latvian.mods.kubejs.create.platform.forge; - -import com.simibubi.create.api.behaviour.BlockSpoutingBehaviour; -import com.simibubi.create.content.contraptions.fluids.OpenEndedPipe; -import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; -import com.simibubi.create.foundation.fluid.FluidIngredient; -import dev.architectury.hooks.fluid.forge.FluidStackHooksForge; -import dev.latvian.mods.kubejs.block.state.BlockStatePredicate; -import dev.latvian.mods.kubejs.create.events.SpecialSpoutHandlerEvent; -import dev.latvian.mods.kubejs.fluid.FluidStackJS; -import dev.latvian.mods.kubejs.level.BlockContainerJS; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; -import net.minecraftforge.fluids.FluidStack; - -import java.util.function.BiConsumer; - -public class FluidIngredientHelperImpl { - public static FluidIngredient toFluidIngredient(FluidStackJS fluidStack) { - return FluidIngredient.fromFluidStack(FluidStackHooksForge.toForge(fluidStack.getFluidStack())); - } - - public static OpenEndedPipe.IEffectHandler createEffectHandler(FluidIngredient fluidIngredient, BiConsumer handler) { - return new OpenEndedPipe.IEffectHandler() { - @Override - public boolean canApplyEffects(OpenEndedPipe pipe, FluidStack fluid) { - return fluidIngredient.test(fluid); - } - - @Override - public void applyEffects(OpenEndedPipe pipe, FluidStack fluid) { - handler.accept(pipe, FluidStackJS.of(fluid)); - } - }; - } - - public static BlockSpoutingBehaviour createSpoutingHandler(BlockStatePredicate block, SpecialSpoutHandlerEvent.SpoutHandler handler) { - return new BlockSpoutingBehaviour() { - @Override - public int fillBlock(Level world, BlockPos pos, SpoutTileEntity spout, FluidStack availableFluid, boolean simulate) { - if (!block.test(world.getBlockState(pos))) - return 0; - return (int) handler.fillBlock(new BlockContainerJS(world, pos), FluidStackJS.of(FluidStackHooksForge.fromForge(availableFluid)), simulate); - } - }; - } -} diff --git a/forge/src/main/resources/META-INF/accesstransformer.cfg b/forge/src/main/resources/META-INF/accesstransformer.cfg deleted file mode 100644 index 73f12a9..0000000 --- a/forge/src/main/resources/META-INF/accesstransformer.cfg +++ /dev/null @@ -1 +0,0 @@ -public net.minecraft.client.renderer.ItemRenderer field_175057_n # textureManager - required for Create to work in dev env \ No newline at end of file diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 4569457..0000000 --- a/forge/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,28 +0,0 @@ -modLoader = "javafml" -loaderVersion = "[40,)" -issueTrackerURL = "https://github.com/KubeJS-Mods/KubeJS-Create/issues" -license = "GNU LGPLv3" - -[[mods]] -modId = "kubejs_create" -version = "${version}" -displayName = "KubeJS Create" -authors = "LatvianModder" -description = ''' -KubeJS Create integration -''' -license = "GNU LGPLv3" - -[[dependencies.kubejs_create]] -modId = "kubejs" -mandatory = true -versionRange = "[1902.6.0-build.142,)" -ordering = "AFTER" -side = "BOTH" - -[[dependencies.kubejs_create]] -modId = "create" -mandatory = true -versionRange = "*" -ordering = "AFTER" -side = "BOTH" \ No newline at end of file diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta deleted file mode 100644 index cba80a1..0000000 --- a/forge/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "KubeJS Create Resources", - "pack_format": 6 - } -} diff --git a/gradle.properties b/gradle.properties index fa3b424..acbd5eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,24 +2,20 @@ org.gradle.jvmargs=-Xmx4G org.gradle.daemon=false mod_id=kubejs_create +mod_name=KubeJS Create archives_base_name=kubejs-create -mod_version=1902.1.1 +mod_version=2001.3.0 maven_group=dev.latvian.mods mod_author=LatvianModder -minecraft_version=1.19.2 +minecraft_version=1.20.1 curseforge_id=429371 -curseforge_type=beta +modrinth_id=T38eAZQC -create_version=0.5.0.i+ -flywheel_forge_version=0.6.8-13 -rei_version=9.1.595 +create_version=6.0.8.0+build.1734-mc1.20.1 +fabric_loader_version=0.17.3 +fabric_api_version=0.92.2+1.20.1 -fabric_loader_version=0.14.17 -fabric_api_version=0.76.0+1.19.2 - -kubejs_version=1902.6.0-build.142 - -forge_version=43.2.4 +kubejs_version=2001.6.5-build.16 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e926089..7e00162 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip \ No newline at end of file +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip \ No newline at end of file diff --git a/libs/architectury-9.2.14-fabric.jar b/libs/architectury-9.2.14-fabric.jar new file mode 100644 index 0000000..8f3f3f9 Binary files /dev/null and b/libs/architectury-9.2.14-fabric.jar differ diff --git a/libs/create-fabric-6.0.8.0+build.1734-mc1.20.1.jar b/libs/create-fabric-6.0.8.0+build.1734-mc1.20.1.jar new file mode 100644 index 0000000..bac86ef Binary files /dev/null and b/libs/create-fabric-6.0.8.0+build.1734-mc1.20.1.jar differ diff --git a/libs/kubejs-fabric-2001.6.5-build.16.jar b/libs/kubejs-fabric-2001.6.5-build.16.jar new file mode 100644 index 0000000..9109aab Binary files /dev/null and b/libs/kubejs-fabric-2001.6.5-build.16.jar differ diff --git a/libs/rhino-fabric-2001.2.3-build.10.jar b/libs/rhino-fabric-2001.2.3-build.10.jar new file mode 100644 index 0000000..256b11b Binary files /dev/null and b/libs/rhino-fabric-2001.2.3-build.10.jar differ diff --git a/run/config/fabric_loader_dependencies.json b/run/config/fabric_loader_dependencies.json new file mode 100644 index 0000000..dcfcb72 --- /dev/null +++ b/run/config/fabric_loader_dependencies.json @@ -0,0 +1,11 @@ +{ + "version": 1, + "overrides": { + "forgeconfigapiport": { + "-depends": { + "com_electronwill_night-config_core": "IGNORED", + "com_electronwill_night-config_toml": "IGNORED" + } + } + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 22d0ebc..e30259c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,6 +6,4 @@ pluginManagement { } } -include "common", "fabric", "forge" - -rootProject.name = 'KubeJS-Create-1.19.2' \ No newline at end of file +rootProject.name = 'KubeJS-Create-1.19.2-Fabric' \ No newline at end of file diff --git a/src/main/java/dev/latvian/mods/kubejs/create/CreateInputFluid.java b/src/main/java/dev/latvian/mods/kubejs/create/CreateInputFluid.java new file mode 100644 index 0000000..b53088a --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/create/CreateInputFluid.java @@ -0,0 +1,36 @@ +package dev.latvian.mods.kubejs.create; + +import com.simibubi.create.foundation.fluid.FluidIngredient; +import dev.latvian.mods.kubejs.fluid.FluidLike; +import dev.latvian.mods.kubejs.fluid.FluidStackJS; +import dev.latvian.mods.kubejs.fluid.InputFluid; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; + +public record CreateInputFluid(FluidIngredient ingredient) implements InputFluid { + public static final CreateInputFluid EMPTY = new CreateInputFluid(FluidIngredient.EMPTY); + + @Override + public boolean kjs$isEmpty() { + return ingredient.equals(FluidIngredient.EMPTY) || ingredient.getMatchingFluidStacks().isEmpty(); + } + + @Override + public long kjs$getAmount() { + return ingredient.getRequiredAmount(); + } + + @Override + public FluidLike kjs$copy(long amount) { + if (ingredient instanceof FluidIngredient.FluidStackIngredient in) { + var fs = in.getMatchingFluidStacks().get(0); + return FluidStackJS.of(fs.getFluid(), amount, fs.getTag() == null ? null : fs.getTag().copy()); + } else if (ingredient instanceof FluidIngredient.FluidTagIngredient in && in.getRequiredAmount() != amount) { + var tag = TagKey.create(Registries.FLUID, new ResourceLocation(in.serialize().get("fluidTag").getAsString())); + return new CreateInputFluid(FluidIngredient.fromTag(tag, (int) amount)); + } + + return this; + } +} diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/KubeJSCreate.java b/src/main/java/dev/latvian/mods/kubejs/create/KubeJSCreate.java similarity index 100% rename from common/src/main/java/dev/latvian/mods/kubejs/create/KubeJSCreate.java rename to src/main/java/dev/latvian/mods/kubejs/create/KubeJSCreate.java diff --git a/src/main/java/dev/latvian/mods/kubejs/create/KubeJSCreatePlugin.java b/src/main/java/dev/latvian/mods/kubejs/create/KubeJSCreatePlugin.java new file mode 100644 index 0000000..bce62ce --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/create/KubeJSCreatePlugin.java @@ -0,0 +1,85 @@ +package dev.latvian.mods.kubejs.create; + +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.content.processing.recipe.ProcessingRecipeSerializer; +import com.simibubi.create.foundation.fluid.FluidIngredient; +import dev.latvian.mods.kubejs.KubeJSPlugin; +import dev.latvian.mods.kubejs.create.custom.SandpaperItemBuilder; +import dev.latvian.mods.kubejs.create.events.BoilerHeaterHandlerEvent; +import dev.latvian.mods.kubejs.create.events.CreateEvents; +import dev.latvian.mods.kubejs.create.events.SpecialFluidHandlerEvent; +import dev.latvian.mods.kubejs.create.events.SpecialSpoutHandlerEvent; +import dev.latvian.mods.kubejs.create.platform.FluidIngredientHelper; +import dev.latvian.mods.kubejs.fluid.FluidStackJS; +import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema; +import dev.latvian.mods.kubejs.recipe.schema.RegisterRecipeSchemasEvent; +import dev.latvian.mods.kubejs.recipe.schema.minecraft.ShapedRecipeSchema; +import dev.latvian.mods.kubejs.registry.RegistryInfo; +import dev.latvian.mods.kubejs.script.ScriptType; +import dev.latvian.mods.kubejs.util.MapJS; +import dev.latvian.mods.rhino.Context; +import dev.latvian.mods.rhino.util.wrap.TypeWrappers; + +import java.util.Map; + +/** + * @author LatvianModder + */ +public class KubeJSCreatePlugin extends KubeJSPlugin { + + private static final Map recipeSchemas = Map.of( + AllRecipeTypes.DEPLOYING, ProcessingRecipeSchema.ITEM_APPLICATION, + AllRecipeTypes.ITEM_APPLICATION, ProcessingRecipeSchema.ITEM_APPLICATION, + AllRecipeTypes.MIXING, ProcessingRecipeSchema.PROCESSING_UNWRAPPED, + AllRecipeTypes.COMPACTING, ProcessingRecipeSchema.PROCESSING_UNWRAPPED, + AllRecipeTypes.CRUSHING, ProcessingRecipeSchema.PROCESSING_WITH_TIME, + AllRecipeTypes.CUTTING, ProcessingRecipeSchema.PROCESSING_WITH_TIME, + AllRecipeTypes.MILLING, ProcessingRecipeSchema.PROCESSING_WITH_TIME + ); + + @Override + public void init() { + RegistryInfo.ITEM.addType("create:sequenced_assembly", SequencedAssemblyItemBuilder.class, SequencedAssemblyItemBuilder::new); + RegistryInfo.ITEM.addType("create:sandpaper", SandpaperItemBuilder.class, SandpaperItemBuilder::new); + } + + @Override + public void registerEvents() { + CreateEvents.GROUP.register(); + } + + @Override + public void afterInit() { + CreateEvents.BOILER_HEATER.post(ScriptType.STARTUP, new BoilerHeaterHandlerEvent()); + CreateEvents.SPECIAL_FLUID.post(ScriptType.STARTUP, new SpecialFluidHandlerEvent()); + CreateEvents.SPECIAL_SPOUT.post(ScriptType.STARTUP, new SpecialSpoutHandlerEvent()); + } + + @Override + public void registerTypeWrappers(ScriptType type, TypeWrappers typeWrappers) { + typeWrappers.register(FluidIngredient.class, this::wrapFluidIngredient); + } + + private FluidIngredient wrapFluidIngredient(Context cx, Object o) { + if (o instanceof FluidStackJS fluidStackJS) { + return FluidIngredientHelper.toFluidIngredient(fluidStackJS); + } else if (o instanceof Map map && (map.containsKey("fluid") || map.containsKey("fluidTag"))) { + return FluidIngredient.deserialize(MapJS.json(map)); + } else { + return FluidIngredientHelper.toFluidIngredient(FluidStackJS.of(o)); + } + } + + @Override + public void registerRecipeSchemas(RegisterRecipeSchemasEvent event) { + event.register(AllRecipeTypes.MECHANICAL_CRAFTING.getId(), ShapedRecipeSchema.SCHEMA); + event.register(AllRecipeTypes.SEQUENCED_ASSEMBLY.getId(), SequencedAssemblyRecipeSchema.SCHEMA); + + for (var createRecipeType : AllRecipeTypes.values()) { + if (createRecipeType.getSerializer() instanceof ProcessingRecipeSerializer) { + var schema = recipeSchemas.getOrDefault(createRecipeType, ProcessingRecipeSchema.PROCESSING_DEFAULT); + event.register(createRecipeType.getId(), schema); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/dev/latvian/mods/kubejs/create/ProcessingRecipeSchema.java b/src/main/java/dev/latvian/mods/kubejs/create/ProcessingRecipeSchema.java new file mode 100644 index 0000000..ac04d87 --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/create/ProcessingRecipeSchema.java @@ -0,0 +1,166 @@ +package dev.latvian.mods.kubejs.create; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.mojang.datafixers.util.Either; +import com.simibubi.create.content.processing.recipe.HeatCondition; +import com.simibubi.create.content.processing.recipe.ProcessingOutput; +import com.simibubi.create.foundation.fluid.FluidIngredient; +import com.simibubi.create.foundation.recipe.BlockTagIngredient; +import dev.latvian.mods.kubejs.create.platform.FluidIngredientHelper; +import dev.latvian.mods.kubejs.fluid.FluidStackJS; +import dev.latvian.mods.kubejs.fluid.InputFluid; +import dev.latvian.mods.kubejs.fluid.OutputFluid; +import dev.latvian.mods.kubejs.item.InputItem; +import dev.latvian.mods.kubejs.item.OutputItem; +import dev.latvian.mods.kubejs.item.ingredient.TagContext; +import dev.latvian.mods.kubejs.recipe.RecipeJS; +import dev.latvian.mods.kubejs.recipe.RecipeKey; +import dev.latvian.mods.kubejs.recipe.component.BooleanComponent; +import dev.latvian.mods.kubejs.recipe.component.FluidComponents; +import dev.latvian.mods.kubejs.recipe.component.ItemComponents; +import dev.latvian.mods.kubejs.recipe.component.RecipeComponent; +import dev.latvian.mods.kubejs.recipe.component.RecipeComponentWithParent; +import dev.latvian.mods.kubejs.recipe.component.StringComponent; +import dev.latvian.mods.kubejs.recipe.component.TimeComponent; +import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema; +import dev.latvian.mods.kubejs.util.MapJS; +import io.github.fabricators_of_create.porting_lib.fluids.FluidStack; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; + +/** + * @author LatvianModder + */ +public interface ProcessingRecipeSchema { + + RecipeKey[]> RESULTS = FluidComponents.OUTPUT_OR_ITEM_ARRAY.key("results"); + RecipeKey[]> INGREDIENTS = FluidComponents.INPUT_OR_ITEM_ARRAY.key("ingredients"); + + RecipeKey[]> INGREDIENTS_UNWRAPPED = new RecipeComponentWithParent[]>() { + @Override + public RecipeComponent[]> parentComponent() { + return INGREDIENTS.component; + } + + @Override + public JsonElement write(RecipeJS recipe, Either[] value) { + // during writing, unwrap all stacked input items + var json = new JsonArray(); + for (var either : value) { + either.ifLeft(fluid -> json.add(FluidComponents.INPUT.write(recipe, fluid))) + .ifRight(item -> { + for (var unwrapped : item.unwrap()) { + json.add(ItemComponents.INPUT.write(recipe, unwrapped)); + } + }); + } + return json; + } + }.key("ingredients"); + + RecipeKey PROCESSING_TIME = TimeComponent.TICKS.key("processingTime").optional(100L); + // specifically for crushing, cutting and milling + RecipeKey PROCESSING_TIME_REQUIRED = TimeComponent.TICKS.key("processingTime").optional(100L).alwaysWrite(); + + + + RecipeKey HEAT_REQUIREMENT = new StringComponent("not a valid heat condition!", s -> { + for (var h : HeatCondition.values()) { + if (h.name().equalsIgnoreCase(s)) { + return true; + } + } + return false; + }).key("heatRequirement").defaultOptional().allowEmpty(); + + // specifically used in item application + RecipeKey KEEP_HELD_ITEM = BooleanComponent.BOOLEAN.key("keepHeldItem").optional(false); + + class ProcessingRecipeJS extends RecipeJS { + @Override + public InputFluid readInputFluid(Object from) { + if (from instanceof CreateInputFluid fluid) { + return fluid; + } else if (from instanceof FluidIngredient fluid) { + return new CreateInputFluid(fluid); + } else if (from instanceof FluidStackJS fluid) { + return new CreateInputFluid(FluidIngredientHelper.toFluidIngredient(fluid)); + } else if (from instanceof FluidStack fluid) { + return new CreateInputFluid(FluidIngredient.fromFluidStack(fluid)); + } else { + var json = MapJS.json(from); + if (json != null) { + return new CreateInputFluid(FluidIngredient.deserialize(json)); + } + return CreateInputFluid.EMPTY; + } + } + + @Override + public JsonElement writeInputFluid(InputFluid value) { + if (value instanceof CreateInputFluid fluid) { + return fluid.ingredient().serialize(); + } else if (value instanceof FluidIngredient fluid) { + return fluid.serialize(); + } else if (value instanceof FluidStackJS fluid) { + return FluidIngredientHelper.toFluidIngredient(fluid).serialize(); + } else { + return FluidIngredient.EMPTY.serialize(); + } + } + + @Override + public boolean inputItemHasPriority(Object from) { + if (from instanceof InputItem || from instanceof Ingredient || from instanceof ItemStack) { + return true; + } + + var input = readInputItem(from); + // NOTE: BlockTagIngredient check removed - in Create 6.0.x BlockTagIngredient is no longer an Ingredient subclass + // This was just an optimization, falling back to isEmpty() check still works correctly + return !input.isEmpty(); + } + + @Override + public boolean inputFluidHasPriority(Object from) { + return from instanceof InputFluid || FluidIngredient.isFluidIngredient(MapJS.json(from)); + } + + @Override + public OutputItem readOutputItem(Object from) { + if (from instanceof ProcessingOutput output) { + return OutputItem.of(output.getStack(), output.getChance()); + } else { + var outputItem = super.readOutputItem(from); + if (from instanceof JsonObject j && j.has("chance")) { + return outputItem.withChance(j.get("chance").getAsFloat()); + } + return outputItem; + } + } + + public RecipeJS heated() { + return setValue(HEAT_REQUIREMENT, HeatCondition.HEATED.serialize()); + } + + public RecipeJS superheated() { + return setValue(HEAT_REQUIREMENT, HeatCondition.SUPERHEATED.serialize()); + } + } + + class ItemApplicationRecipeJS extends ProcessingRecipeJS { + public RecipeJS keepHeldItem() { + return setValue(KEEP_HELD_ITEM, true); + } + } + + RecipeSchema PROCESSING_DEFAULT = new RecipeSchema(ProcessingRecipeJS.class, ProcessingRecipeJS::new, RESULTS, INGREDIENTS, PROCESSING_TIME, HEAT_REQUIREMENT); + + RecipeSchema PROCESSING_WITH_TIME = new RecipeSchema(ProcessingRecipeJS.class, ProcessingRecipeJS::new, RESULTS, INGREDIENTS, PROCESSING_TIME_REQUIRED, HEAT_REQUIREMENT); + + RecipeSchema PROCESSING_UNWRAPPED = new RecipeSchema(ProcessingRecipeJS.class, ProcessingRecipeJS::new, RESULTS, INGREDIENTS_UNWRAPPED, PROCESSING_TIME, HEAT_REQUIREMENT); + + RecipeSchema ITEM_APPLICATION = new RecipeSchema(ItemApplicationRecipeJS.class, ItemApplicationRecipeJS::new, RESULTS, INGREDIENTS, PROCESSING_TIME, HEAT_REQUIREMENT, KEEP_HELD_ITEM); +} diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyItemBuilder.java b/src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyItemBuilder.java similarity index 83% rename from common/src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyItemBuilder.java rename to src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyItemBuilder.java index 21a0ad1..acfbb50 100644 --- a/common/src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyItemBuilder.java +++ b/src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyItemBuilder.java @@ -1,6 +1,6 @@ package dev.latvian.mods.kubejs.create; -import com.simibubi.create.content.contraptions.itemAssembly.SequencedAssemblyItem; +import com.simibubi.create.content.processing.sequenced.SequencedAssemblyItem; import dev.latvian.mods.kubejs.item.ItemBuilder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; diff --git a/src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyRecipeSchema.java b/src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyRecipeSchema.java new file mode 100644 index 0000000..5590dde --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/create/SequencedAssemblyRecipeSchema.java @@ -0,0 +1,37 @@ +package dev.latvian.mods.kubejs.create; + +import com.mojang.datafixers.TypeRewriteRule; +import com.simibubi.create.AllItems; +import dev.latvian.mods.kubejs.item.InputItem; +import dev.latvian.mods.kubejs.item.OutputItem; +import dev.latvian.mods.kubejs.recipe.RecipeJS; +import dev.latvian.mods.kubejs.recipe.RecipeKey; +import dev.latvian.mods.kubejs.recipe.component.ItemComponents; +import dev.latvian.mods.kubejs.recipe.component.NestedRecipeComponent; +import dev.latvian.mods.kubejs.recipe.component.NumberComponent; +import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema; +import net.minecraft.world.item.crafting.Recipe; +import org.jetbrains.annotations.Nullable; + +public interface SequencedAssemblyRecipeSchema { + RecipeKey RESULTS = ItemComponents.OUTPUT_ARRAY.key("results"); + RecipeKey INGREDIENT = ItemComponents.INPUT.key("ingredient"); + RecipeKey SEQUENCE = NestedRecipeComponent.RECIPE_ARRAY.key("sequence"); + RecipeKey TRANSITIONAL_ITEM = ItemComponents.OUTPUT.key("transitionalItem") + .optional((type) -> OutputItem.of(AllItems.INCOMPLETE_PRECISION_MECHANISM.get().getDefaultInstance(), 1)); + RecipeKey LOOPS = NumberComponent.INT.key("loops").optional(4); + + class SequencedAssemblyRecipeJS extends RecipeJS { + @Override + public void afterLoaded() { + super.afterLoaded(); + } + + @Override + public @Nullable Recipe createRecipe() { + return super.createRecipe(); + } + } + + RecipeSchema SCHEMA = new RecipeSchema(SequencedAssemblyRecipeJS.class, SequencedAssemblyRecipeJS::new, RESULTS, INGREDIENT, SEQUENCE, TRANSITIONAL_ITEM, LOOPS); +} diff --git a/src/main/java/dev/latvian/mods/kubejs/create/client/ClientHelper.java b/src/main/java/dev/latvian/mods/kubejs/create/client/ClientHelper.java new file mode 100644 index 0000000..4a48fc9 --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/create/client/ClientHelper.java @@ -0,0 +1,16 @@ +package dev.latvian.mods.kubejs.create.client; + +import com.simibubi.create.content.equipment.sandPaper.SandPaperItem; +import com.simibubi.create.content.equipment.sandPaper.SandPaperItemRenderer; +import com.simibubi.create.foundation.item.render.CustomRenderedItems; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry; + +@Environment(EnvType.CLIENT) +public class ClientHelper { + public static void sandpaperClientStuff(SandPaperItem item) { + BuiltinItemRendererRegistry.INSTANCE.register(item, new SandPaperItemRenderer()); + CustomRenderedItems.register(item); + } +} diff --git a/src/main/java/dev/latvian/mods/kubejs/create/custom/SandpaperItemBuilder.java b/src/main/java/dev/latvian/mods/kubejs/create/custom/SandpaperItemBuilder.java new file mode 100644 index 0000000..0d33bbd --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/create/custom/SandpaperItemBuilder.java @@ -0,0 +1,28 @@ +package dev.latvian.mods.kubejs.create.custom; + +import com.simibubi.create.Create; +import com.simibubi.create.content.equipment.sandPaper.SandPaperItem; +import com.simibubi.create.foundation.item.ItemDescription; +import dev.architectury.utils.Env; +import dev.architectury.utils.EnvExecutor; +import dev.latvian.mods.kubejs.create.client.ClientHelper; +import dev.latvian.mods.kubejs.item.ItemBuilder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; + +import static com.simibubi.create.AllItems.SAND_PAPER; + +public class SandpaperItemBuilder extends ItemBuilder { + public SandpaperItemBuilder(ResourceLocation i) { + super(i); + tag(Create.asResource("sandpaper")); + } + + @Override + public Item createObject() { + var item = new SandPaperItem(createItemProperties()); + EnvExecutor.runInEnv(Env.CLIENT, () -> () -> ClientHelper.sandpaperClientStuff(item)); + ItemDescription.referKey(item, SAND_PAPER); + return item; + } +} diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/events/BoilerHeaterHandlerEvent.java b/src/main/java/dev/latvian/mods/kubejs/create/events/BoilerHeaterHandlerEvent.java similarity index 61% rename from common/src/main/java/dev/latvian/mods/kubejs/create/events/BoilerHeaterHandlerEvent.java rename to src/main/java/dev/latvian/mods/kubejs/create/events/BoilerHeaterHandlerEvent.java index 5b73308..f4cc91f 100644 --- a/common/src/main/java/dev/latvian/mods/kubejs/create/events/BoilerHeaterHandlerEvent.java +++ b/src/main/java/dev/latvian/mods/kubejs/create/events/BoilerHeaterHandlerEvent.java @@ -1,6 +1,6 @@ package dev.latvian.mods.kubejs.create.events; -import com.simibubi.create.content.contraptions.fluids.tank.BoilerHeaters; +import com.simibubi.create.api.boiler.BoilerHeater; import dev.latvian.mods.kubejs.block.state.BlockStatePredicate; import dev.latvian.mods.kubejs.create.platform.BoilerHeaterHelper; import dev.latvian.mods.kubejs.event.EventJS; @@ -18,6 +18,15 @@ public void add(Block block, BoilerHeaterCallback onUpdate) { } public void addAdvanced(BlockStatePredicate block, BoilerHeaterCallback onUpdate) { - BoilerHeaters.registerHeaterProvider(((level, blockPos, blockState) -> block.test(blockState) ? (l, b, bs) -> onUpdate.updateHeat(l.kjs$getBlock(b)) : null)); + BoilerHeater.REGISTRY.registerProvider(key -> { + // Check if any blockstate of this block matches our predicate + for (var state : key.getStateDefinition().getPossibleStates()) { + if (block.test(state)) { + // Return a BoilerHeater that calls our callback + return (level, pos, blockState) -> onUpdate.updateHeat(level.kjs$getBlock(pos)); + } + } + return null; + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/latvian/mods/kubejs/create/events/CreateEvents.java b/src/main/java/dev/latvian/mods/kubejs/create/events/CreateEvents.java similarity index 100% rename from common/src/main/java/dev/latvian/mods/kubejs/create/events/CreateEvents.java rename to src/main/java/dev/latvian/mods/kubejs/create/events/CreateEvents.java diff --git a/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialFluidHandlerEvent.java b/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialFluidHandlerEvent.java new file mode 100644 index 0000000..219831e --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialFluidHandlerEvent.java @@ -0,0 +1,22 @@ +package dev.latvian.mods.kubejs.create.events; + +import com.simibubi.create.api.effect.OpenPipeEffectHandler; +import com.simibubi.create.foundation.fluid.FluidIngredient; +import dev.latvian.mods.kubejs.create.platform.FluidIngredientHelper; +import dev.latvian.mods.kubejs.event.EventJS; +import dev.latvian.mods.kubejs.fluid.FluidStackJS; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; + +/** + * @author Prunoideae + */ +public class SpecialFluidHandlerEvent extends EventJS { + public interface PipeHandler { + void apply(Level level, AABB aabb, FluidStackJS fluid); + } + + public void add(FluidIngredient fluidIngredient, PipeHandler handler) { + OpenPipeEffectHandler.REGISTRY.registerProvider(FluidIngredientHelper.createEffectHandler(fluidIngredient, handler)); + } +} diff --git a/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialSpoutHandlerEvent.java b/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialSpoutHandlerEvent.java new file mode 100644 index 0000000..87a5b69 --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/create/events/SpecialSpoutHandlerEvent.java @@ -0,0 +1,35 @@ +package dev.latvian.mods.kubejs.create.events; + +import com.simibubi.create.api.behaviour.spouting.BlockSpoutingBehaviour; +import com.simibubi.create.api.registry.SimpleRegistry; +import dev.latvian.mods.kubejs.block.state.BlockStatePredicate; +import dev.latvian.mods.kubejs.create.platform.FluidIngredientHelper; +import dev.latvian.mods.kubejs.event.EventJS; +import dev.latvian.mods.kubejs.fluid.FluidStackJS; +import dev.latvian.mods.kubejs.level.BlockContainerJS; +import net.minecraft.world.level.block.state.BlockState; + +/** + * @author Prunoideae + */ +public class SpecialSpoutHandlerEvent extends EventJS { + @FunctionalInterface + public interface SpoutHandler { + long fillBlock(BlockContainerJS block, FluidStackJS fluid, boolean simulate); + } + + public void add(BlockStatePredicate block, SpoutHandler handler) { + BlockSpoutingBehaviour.BY_BLOCK.registerProvider(new SimpleRegistry.Provider<>() { + @Override + public BlockSpoutingBehaviour get(net.minecraft.world.level.block.Block key) { + // Check if any block state of this block matches the predicate + for (BlockState state : key.getStateDefinition().getPossibleStates()) { + if (block.test(state)) { + return FluidIngredientHelper.createSpoutingHandler(block, handler); + } + } + return null; + } + }); + } +} diff --git a/src/main/java/dev/latvian/mods/kubejs/create/platform/BoilerHeaterHelper.java b/src/main/java/dev/latvian/mods/kubejs/create/platform/BoilerHeaterHelper.java new file mode 100644 index 0000000..f52b01b --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/create/platform/BoilerHeaterHelper.java @@ -0,0 +1,11 @@ +package dev.latvian.mods.kubejs.create.platform; + +import com.simibubi.create.api.boiler.BoilerHeater; +import dev.latvian.mods.kubejs.create.events.BoilerHeaterHandlerEvent; +import net.minecraft.world.level.block.Block; + +public class BoilerHeaterHelper { + public static void registerHeaterPlatform(Block block, BoilerHeaterHandlerEvent.BoilerHeaterCallback onUpdate) { + BoilerHeater.REGISTRY.register(block, (level, blockPos, blockState) -> onUpdate.updateHeat(level.kjs$getBlock(blockPos))); + } +} diff --git a/src/main/java/dev/latvian/mods/kubejs/create/platform/FluidIngredientHelper.java b/src/main/java/dev/latvian/mods/kubejs/create/platform/FluidIngredientHelper.java new file mode 100644 index 0000000..d2bede6 --- /dev/null +++ b/src/main/java/dev/latvian/mods/kubejs/create/platform/FluidIngredientHelper.java @@ -0,0 +1,80 @@ +package dev.latvian.mods.kubejs.create.platform; + +import com.simibubi.create.api.behaviour.spouting.BlockSpoutingBehaviour; +import com.simibubi.create.api.effect.OpenPipeEffectHandler; +import com.simibubi.create.api.registry.SimpleRegistry; +import com.simibubi.create.content.fluids.spout.SpoutBlockEntity; +import com.simibubi.create.foundation.fluid.FluidIngredient; +import dev.architectury.hooks.fluid.fabric.FluidStackHooksFabric; +import dev.latvian.mods.kubejs.block.state.BlockStatePredicate; +import dev.latvian.mods.kubejs.create.events.SpecialFluidHandlerEvent; +import dev.latvian.mods.kubejs.create.events.SpecialSpoutHandlerEvent; +import dev.latvian.mods.kubejs.fluid.FluidStackJS; +import dev.latvian.mods.kubejs.level.BlockContainerJS; +import io.github.fabricators_of_create.porting_lib.fluids.FluidStack; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.material.Fluid; +import org.jetbrains.annotations.Nullable; + +import java.util.HashSet; +import java.util.Set; + +public class FluidIngredientHelper { + public static FluidIngredient toFluidIngredient(FluidStackJS fluidStack) { + return FluidIngredient.fromFluidStack(new FluidStack(FluidStackHooksFabric.toFabric(fluidStack.getFluidStack()),fluidStack.kjs$getAmount())); + } + + public static SimpleRegistry.Provider createEffectHandler(FluidIngredient fluidIngredient, SpecialFluidHandlerEvent.PipeHandler handler) { + return new SimpleRegistry.Provider<>() { + final FluidIngredient filter = fluidIngredient; + Set validFluids = null; + + final OpenPipeEffectHandler internalHandler = (level, aabb, fluid) -> { + if (filter.test(fluid)) { + handler.apply(level, aabb, FluidStackJS.of(fluid)); + } + }; + + @Override + public @Nullable OpenPipeEffectHandler get(Fluid fluidIn) { + if (getValidFluids().contains(fluidIn)) { + return internalHandler; + } else { + return null; + } + } + + private Set getValidFluids() { + if (validFluids == null) { + Set set = new HashSet<>(); + for (FluidStack fluidStack : fluidIngredient.getMatchingFluidStacks()) { + Fluid fluid = fluidStack.getFluid(); + set.add(fluid); + } + validFluids = set; + } + return validFluids; + } + + @Override + public void onRegister(Runnable invalidate) { + // Fabric: Tag update handling could be added here if needed + // For now, the cache will be built once and remain valid + } + }; + } + + public static BlockSpoutingBehaviour createSpoutingHandler(BlockStatePredicate block, SpecialSpoutHandlerEvent.SpoutHandler handler) { + return new BlockSpoutingBehaviour() { + @Override + public long fillBlock(Level world, BlockPos pos, SpoutBlockEntity spout, FluidStack availableFluid, boolean simulate) { + if (!block.test(world.getBlockState(pos))) { + return 0; + } + return handler.fillBlock(new BlockContainerJS(world, pos), FluidStackJS.of(availableFluid.writeToNBT(new CompoundTag())), simulate); + } + }; + } +} diff --git a/fabric/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json similarity index 70% rename from fabric/src/main/resources/fabric.mod.json rename to src/main/resources/fabric.mod.json index c99e549..1118217 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -10,7 +10,7 @@ ], "contact": { "sources": "https://github.com/KubeJS-Mods/KubeJS-Create", - "issues": "https://github.com/KubeJS-Mods/KubeJS-Create/issues" + "issues": "https://kubejs.com/support?source=kubejs_create&mc=2001&loader=fabric" }, "license": "GNU LGPLv3", "entrypoints": { @@ -19,8 +19,8 @@ ] }, "depends": { - "minecraft": ">=1.19.2", - "kubejs": ">=1902.6.0-build.142", - "create": "*" + "minecraft": ">=1.20.1 <1.21", + "kubejs": ">=2001.6.5-build.16", + "create": ">=6.0.8" } } diff --git a/common/src/main/resources/kubejs.classfilter.txt b/src/main/resources/kubejs.classfilter.txt similarity index 100% rename from common/src/main/resources/kubejs.classfilter.txt rename to src/main/resources/kubejs.classfilter.txt diff --git a/common/src/main/resources/kubejs.plugins.txt b/src/main/resources/kubejs.plugins.txt similarity index 100% rename from common/src/main/resources/kubejs.plugins.txt rename to src/main/resources/kubejs.plugins.txt