diff --git a/build.gradle b/build.gradle index 265e8385..a155a8c7 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ base { } java.toolchain.languageVersion = JavaLanguageVersion.of(21) +java.toolchain.vendor = JvmVendorSpec.JETBRAINS java.withSourcesJar() neoForge { @@ -60,16 +61,6 @@ neoForge { // Include resources generated by data generators. sourceSets.main.resources { srcDir 'src/generated/resources' } -// Exclude KubeJS compat till they update todo remove when KubeJS updates -// If IntelliJ ignores this, you have to change Gradle settings to build projects using Gradle instead of IntelliJ -sourceSets { - main { - java { - exclude 'thedarkcolour/exdeorum/compat/kubejs/' - exclude 'thedarkcolour/exdeorum/compat/top/' - } - } -} repositories { mavenCentral() @@ -124,9 +115,9 @@ repositories { dependencies { // TOP OPTIONAL - //compileOnly("mcjty.theoneprobe:theoneprobe:${mc_version}_neo-${top_version}") { - // transitive = false - //} + compileOnly("mcjty.theoneprobe:theoneprobe:${mc_version}_neo-${top_version}") { + transitive = false + } // JADE OPTIONAL compileOnly("curse.maven:jade-324717:5109393") // JEI OPTIONAL @@ -139,10 +130,10 @@ dependencies { compileOnly("dev.emi:emi-neoforge:${emi_version}:api") compileOnly("dev.emi:emi-neoforge:${emi_version}") //implementation("curse.maven:reipc-521393:4837449") - // KubeJS OPTIONAL todo add when KubeJS updates - //implementation("dev.architectury:architectury-neoforge:${architectury_version}") - //implementation("dev.latvian.mods:rhino-neoforge:${rhino_version}") - //implementation("dev.latvian.mods:kubejs-neoforge:${kubejs_version}") + // KubeJS OPTIONAL + implementation("dev.architectury:architectury-neoforge:${architectury_version}") + implementation "curse.maven:rhino-416294:5554415" + implementation("dev.latvian.mods:kubejs-neoforge:${kubejs_version}") // ModKit DEV ONLY implementation('com.github.thedarkcolour:ModKit:81a0889b26') diff --git a/gradle.properties b/gradle.properties index 40228c2b..9da58f5c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,19 +4,19 @@ org.gradle.jvmargs=-Xmx3G org.gradle.parallel=true mc_version=1.21 -neo_version=21.0.66-beta +neo_version=21.0.147 neo_version_range=[21,) loader_version_range=[3,) -jei_version=19.2.0.21 +jei_version=19.5.3.67 rei_version=14.0.688 emi_version=1.1.7+1.21 cloth_config_version=15.0.127 -top_version=11.0.1-2 +top_version=12.0.3-5 -kubejs_version=2001.6.3-build.47 -rhino_version=2004.2.3-build.4 -architectury_version=11.1.17 +kubejs_version=2100.7.0-build.119 +#rhino_version=2004.2.3-build.4 +architectury_version=13.0.6 parchment_minecraft_version=1.20.6 parchment_mappings_version=2024.06.02 diff --git a/src/main/java/thedarkcolour/exdeorum/compat/ModIds.java b/src/main/java/thedarkcolour/exdeorum/compat/ModIds.java index 5f730328..d17be8e5 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/ModIds.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/ModIds.java @@ -50,4 +50,5 @@ public class ModIds { public static final String CYCLIC = "cyclic"; public static final String SKYBLOCK_BUILDER = "skyblockbuilder"; public static final String IMMERSIVE_ENGINEERING = "immersiveengineering"; + public static final String KUBEJS = "kubejs"; } diff --git a/src/main/java/thedarkcolour/exdeorum/compat/jade/SieveComponentProvider.java b/src/main/java/thedarkcolour/exdeorum/compat/jade/SieveComponentProvider.java index fc62b86d..955f963a 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/jade/SieveComponentProvider.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/jade/SieveComponentProvider.java @@ -18,12 +18,8 @@ package thedarkcolour.exdeorum.compat.jade; -import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.item.enchantment.ItemEnchantments; import net.minecraft.world.phys.Vec2; import snownee.jade.api.BlockAccessor; import snownee.jade.api.IBlockComponentProvider; diff --git a/src/main/java/thedarkcolour/exdeorum/compat/kubejs/ExDeorumKubeJsBindings.java b/src/main/java/thedarkcolour/exdeorum/compat/kubejs/ExDeorumKubeJsBindings.java index d6c6cde1..28b2a212 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/kubejs/ExDeorumKubeJsBindings.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/kubejs/ExDeorumKubeJsBindings.java @@ -18,37 +18,31 @@ package thedarkcolour.exdeorum.compat.kubejs; +import com.google.gson.JsonObject; +import com.mojang.serialization.JsonOps; import dev.latvian.mods.kubejs.bindings.event.ServerEvents; -import dev.latvian.mods.kubejs.recipe.RecipesEventJS; -import dev.latvian.mods.kubejs.recipe.ReplacementMatch; -import dev.latvian.mods.kubejs.recipe.filter.RecipeFilter; +import dev.latvian.mods.kubejs.recipe.RecipesKubeEvent; +import dev.latvian.mods.kubejs.recipe.filter.RecipeFilterParseEvent; +import dev.latvian.mods.kubejs.recipe.match.ReplacementMatchInfo; import dev.latvian.mods.kubejs.script.ScriptType; +import dev.latvian.mods.rhino.Context; import dev.latvian.mods.rhino.util.HideFromJS; import net.minecraft.advancements.critereon.StatePropertiesPredicate; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.Property; -import net.minecraftforge.registries.RegistryObject; +import net.neoforged.neoforge.registries.DeferredHolder; import thedarkcolour.exdeorum.ExDeorum; import thedarkcolour.exdeorum.recipe.BlockPredicate; import thedarkcolour.exdeorum.recipe.RecipeUtil; -import thedarkcolour.exdeorum.recipe.crucible.FinishedCrucibleHeatRecipe; +import thedarkcolour.exdeorum.recipe.crucible.CrucibleHeatRecipe; import thedarkcolour.exdeorum.registry.ERecipeTypes; import java.util.function.Consumer; @SuppressWarnings("unused") class ExDeorumKubeJsBindings { - static { - RecipeFilter.PARSE.register((ctx, filters, map) -> { - var sieveMesh = map.get("sieve_mesh"); - if (sieveMesh != null) { - filters.add(new SieveMeshFilter(ReplacementMatch.of(sieveMesh))); - } - }); - } - public void setCrucibleHeatValue(Block block, int value) { setCrucibleHeatValueForBlock(block, value); } @@ -62,7 +56,7 @@ class ExDeorumKubeJsBindings { for (Property prop : state.getProperties()) { bypassTypeChecking(properties, prop, state); } - event.custom(new FinishedCrucibleHeatRecipe(null, BlockPredicate.blockState(state.getBlock(), properties.build()), value).serializeRecipe()); + event.custom(null, (JsonObject) CrucibleHeatRecipe.CODEC.encoder().encodeStart(JsonOps.INSTANCE, new CrucibleHeatRecipe(BlockPredicate.blockState(state.getBlock(), properties.build().get()), value)).result().get()); }); } @@ -71,14 +65,13 @@ class ExDeorumKubeJsBindings { properties.hasProperty(prop, prop.getName(state.getValue(prop))); } - @SuppressWarnings("DataFlowIssue") public void setCrucibleHeatValueForBlock(Block block, int value) { onRecipesEvent(event -> { - event.custom(new FinishedCrucibleHeatRecipe(null, BlockPredicate.singleBlock(block), value).serializeRecipe()); + event.custom(null, (JsonObject) CrucibleHeatRecipe.CODEC.encoder().encodeStart(JsonOps.INSTANCE, new CrucibleHeatRecipe(BlockPredicate.singleBlock(block), value)).result().get()); }); } - public void removeDefaultSieveRecipes(RecipesEventJS recipesEvent) { + public void removeDefaultSieveRecipes(RecipesKubeEvent recipesEvent) { removeDefaultRecipes(recipesEvent, ERecipeTypes.SIEVE); } @@ -87,15 +80,26 @@ class ExDeorumKubeJsBindings { } @HideFromJS - private static void removeDefaultRecipes(RecipesEventJS event, RegistryObject> recipeType) { - event.remove(r -> r.kjs$getType().equals(recipeType.getId()) && r.kjs$getOrCreateId().getNamespace().equals(ExDeorum.ID)); + private static void removeDefaultRecipes(RecipesKubeEvent event, DeferredHolder, ? extends RecipeType> recipeType) { + event.remove(null, (ctx, r) -> r.kjs$getType().equals(recipeType.getId()) && r.kjs$getOrCreateId().getNamespace().equals(ExDeorum.ID)); } @HideFromJS - private static void onRecipesEvent(Consumer action) { + private static void onRecipesEvent(Consumer action) { ServerEvents.RECIPES.listenJava(ScriptType.SERVER, null, jsEvent -> { - action.accept((RecipesEventJS) jsEvent); + action.accept((RecipesKubeEvent) jsEvent); return null; }); } + + public static void onRecipeFilterParse(RecipeFilterParseEvent event) { + var sieveMesh = event.map.get("sieve_mesh"); + if (sieveMesh != null) { + ReplacementMatchInfo m = ReplacementMatchInfo.wrap(event.cx, sieveMesh, ReplacementMatchInfo.TYPE_INFO); + if (m == ReplacementMatchInfo.NONE) { + throw Context.reportRuntimeError("Unable to parse recipe output filter `" + sieveMesh + "`", event.cx); + } + event.filters.add(new SieveMeshFilter(m)); + } + } } diff --git a/src/main/java/thedarkcolour/exdeorum/compat/kubejs/ExDeorumKubeJsPlugin.java b/src/main/java/thedarkcolour/exdeorum/compat/kubejs/ExDeorumKubeJsPlugin.java index f326795f..20713b1e 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/kubejs/ExDeorumKubeJsPlugin.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/kubejs/ExDeorumKubeJsPlugin.java @@ -18,27 +18,25 @@ package thedarkcolour.exdeorum.compat.kubejs; -import dev.latvian.mods.kubejs.KubeJSPlugin; -import dev.latvian.mods.kubejs.recipe.schema.RegisterRecipeSchemasEvent; -import dev.latvian.mods.kubejs.script.BindingsEvent; -import dev.latvian.mods.kubejs.script.ScriptType; -import dev.latvian.mods.kubejs.util.ClassFilter; +import dev.latvian.mods.kubejs.plugin.KubeJSPlugin; +import dev.latvian.mods.kubejs.recipe.schema.RecipeSchemaRegistry; +import dev.latvian.mods.kubejs.script.BindingRegistry; +import net.neoforged.neoforge.common.NeoForge; import thedarkcolour.exdeorum.ExDeorum; -public class ExDeorumKubeJsPlugin extends KubeJSPlugin { - @Override - public void registerBindings(BindingsEvent event) { - event.add(ExDeorum.ID, new ExDeorumKubeJsBindings()); +public class ExDeorumKubeJsPlugin implements KubeJSPlugin { + static { + NeoForge.EVENT_BUS.addListener(ExDeorumKubeJsBindings::onRecipeFilterParse); } @Override - public void registerRecipeSchemas(RegisterRecipeSchemasEvent event) { - event.namespace("exdeorum") + public void registerBindings(BindingRegistry bindings) { + bindings.add(ExDeorum.ID, new ExDeorumKubeJsBindings()); + } + + @Override + public void registerRecipeSchemas(RecipeSchemaRegistry registry) { + registry.namespace(ExDeorum.ID) .register("sieve", SieveRecipeSchema.SCHEMA); } - - @Override - public void registerClasses(ScriptType type, ClassFilter filter) { - super.registerClasses(type, filter); - } } diff --git a/src/main/java/thedarkcolour/exdeorum/compat/kubejs/SieveMeshFilter.java b/src/main/java/thedarkcolour/exdeorum/compat/kubejs/SieveMeshFilter.java index 19036195..18458862 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/kubejs/SieveMeshFilter.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/kubejs/SieveMeshFilter.java @@ -18,16 +18,17 @@ package thedarkcolour.exdeorum.compat.kubejs; -import dev.latvian.mods.kubejs.core.RecipeKJS; -import dev.latvian.mods.kubejs.recipe.ItemMatch; -import dev.latvian.mods.kubejs.recipe.RecipeJS; -import dev.latvian.mods.kubejs.recipe.ReplacementMatch; +import dev.latvian.mods.kubejs.core.RecipeLikeKJS; +import dev.latvian.mods.kubejs.recipe.KubeRecipe; import dev.latvian.mods.kubejs.recipe.filter.RecipeFilter; +import dev.latvian.mods.kubejs.recipe.match.ItemMatch; +import dev.latvian.mods.kubejs.recipe.match.ReplacementMatchInfo; +import dev.latvian.mods.rhino.Context; import thedarkcolour.exdeorum.recipe.sieve.SieveRecipe; -public record SieveMeshFilter(ReplacementMatch match) implements RecipeFilter { +public record SieveMeshFilter(ReplacementMatchInfo info) implements RecipeFilter { @Override - public boolean test(RecipeKJS recipe) { - return this.match instanceof ItemMatch itemMatch && recipe instanceof RecipeJS recipeJs && recipeJs.getOriginalRecipe() instanceof SieveRecipe sieveRecipe && itemMatch.contains(sieveRecipe.mesh); + public boolean test(Context cx, RecipeLikeKJS r) { + return r instanceof KubeRecipe recipeJs && recipeJs.getOriginalRecipe() instanceof SieveRecipe sieveRecipe && this.info.match() instanceof ItemMatch match && match.matches(cx, sieveRecipe.mesh, false); } } diff --git a/src/main/java/thedarkcolour/exdeorum/compat/kubejs/SieveRecipeSchema.java b/src/main/java/thedarkcolour/exdeorum/compat/kubejs/SieveRecipeSchema.java index 1147396e..0efee55c 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/kubejs/SieveRecipeSchema.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/kubejs/SieveRecipeSchema.java @@ -18,75 +18,17 @@ package thedarkcolour.exdeorum.compat.kubejs; -import com.google.gson.JsonElement; -import com.google.gson.JsonPrimitive; -import dev.latvian.mods.kubejs.item.InputItem; -import dev.latvian.mods.kubejs.item.OutputItem; -import dev.latvian.mods.kubejs.recipe.ItemMatch; -import dev.latvian.mods.kubejs.recipe.RecipeJS; import dev.latvian.mods.kubejs.recipe.RecipeKey; -import dev.latvian.mods.kubejs.recipe.ReplacementMatch; import dev.latvian.mods.kubejs.recipe.component.ComponentRole; -import dev.latvian.mods.kubejs.recipe.component.ItemComponents; -import dev.latvian.mods.kubejs.recipe.component.RecipeComponent; +import dev.latvian.mods.kubejs.recipe.component.IngredientComponent; +import dev.latvian.mods.kubejs.recipe.component.ItemStackComponent; import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.registries.ForgeRegistries; +import net.minecraft.world.item.crafting.Ingredient; public interface SieveRecipeSchema { - RecipeComponent OUTPUT_ITEM_ONLY = new RecipeComponent<>() { - @Override - public String componentType() { - return "output_item_only"; - } + RecipeKey RESULT = ItemStackComponent.ITEM_STACK.key("result", ComponentRole.OUTPUT); + RecipeKey INGREDIENT = IngredientComponent.INGREDIENT.key("ingredient", ComponentRole.INPUT); - @Override - public ComponentRole role() { - return ComponentRole.OUTPUT; - } - - @Override - public Class componentClass() { - return OutputItem.class; - } - - @Override - public boolean hasPriority(RecipeJS recipe, Object from) { - return recipe.outputItemHasPriority(from); - } - - @Override - public JsonElement write(RecipeJS recipe, OutputItem value) { - return new JsonPrimitive(ForgeRegistries.ITEMS.getKey(value.item.getItem()).toString()); - } - - @Override - public OutputItem read(RecipeJS recipe, Object from) { - if (from instanceof JsonPrimitive primitive && primitive.isString()) { - return OutputItem.of(new ItemStack(ForgeRegistries.ITEMS.getValue(new ResourceLocation(primitive.getAsString())))); - } else { - return OutputItem.of(from); - } - } - - @Override - public boolean isOutput(RecipeJS recipe, OutputItem value, ReplacementMatch match) { - return match instanceof ItemMatch m && !value.isEmpty() && m.contains(value.item); - } - - @Override - public String checkEmpty(RecipeKey key, OutputItem value) { - if (value.isEmpty()) { - return "ItemStack '" + key.name + "' can't be empty"; - } - - return ""; - } - }; - - RecipeKey RESULT = OUTPUT_ITEM_ONLY.key("result"); - RecipeKey INGREDIENT = ItemComponents.INPUT.key("ingredient"); - - RecipeSchema SCHEMA = new RecipeSchema(RESULT, INGREDIENT).uniqueOutputId(RESULT); + RecipeSchema SCHEMA = new RecipeSchema(RESULT, INGREDIENT).uniqueId(RESULT); } diff --git a/src/main/java/thedarkcolour/exdeorum/compat/top/ExDeorumInfoProvider.java b/src/main/java/thedarkcolour/exdeorum/compat/top/ExDeorumInfoProvider.java index f8471a6a..9da1db33 100644 --- a/src/main/java/thedarkcolour/exdeorum/compat/top/ExDeorumInfoProvider.java +++ b/src/main/java/thedarkcolour/exdeorum/compat/top/ExDeorumInfoProvider.java @@ -18,13 +18,11 @@ package thedarkcolour.exdeorum.compat.top; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; import mcjty.theoneprobe.api.*; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import thedarkcolour.exdeorum.ExDeorum; @@ -32,13 +30,14 @@ import thedarkcolour.exdeorum.blockentity.AbstractCrucibleBlockEntity; import thedarkcolour.exdeorum.blockentity.BarrelBlockEntity; import thedarkcolour.exdeorum.blockentity.InfestedLeavesBlockEntity; import thedarkcolour.exdeorum.blockentity.SieveBlockEntity; +import thedarkcolour.exdeorum.compat.CompatUtil; import thedarkcolour.exdeorum.data.TranslationKeys; import thedarkcolour.exdeorum.registry.EBlocks; public class ExDeorumInfoProvider implements IProbeInfoProvider { @Override public ResourceLocation getID() { - return new ResourceLocation(ExDeorum.ID, "info_provider"); + return ResourceLocation.fromNamespaceAndPath(ExDeorum.ID, "info_provider"); } @Override @@ -90,13 +89,11 @@ public class ExDeorumInfoProvider implements IProbeInfoProvider { .item(mesh, info.defaultItemStyle().width(16).height(16)) .text(CompoundText.create().info(mesh.getDescriptionId())); if (mesh.isEnchanted()) { - var list = new ObjectArrayList(); var style = info.defaultTextStyle().height(10); - ItemStack.appendEnchantmentNames(list, mesh.getEnchantmentTags()); - for (var component : list) { + CompatUtil.addEnchantmentsTooltip(mesh, level, component -> { info.text(component, style); - } + }); } } }