Fix KubeJS plugin

This commit is contained in:
thedarkcolour 2024-07-31 22:43:28 -07:00
parent 2b6bf541c6
commit 8149c8c896
No known key found for this signature in database
GPG Key ID: 6599A8E0516C8F38
9 changed files with 73 additions and 143 deletions

View File

@ -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')

View File

@ -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

View File

@ -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";
}

View File

@ -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;

View File

@ -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<? extends RecipeType<?>> 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<?>, ? 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<RecipesEventJS> action) {
private static void onRecipesEvent(Consumer<RecipesKubeEvent> 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));
}
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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<OutputItem> OUTPUT_ITEM_ONLY = new RecipeComponent<>() {
@Override
public String componentType() {
return "output_item_only";
}
RecipeKey<ItemStack> RESULT = ItemStackComponent.ITEM_STACK.key("result", ComponentRole.OUTPUT);
RecipeKey<Ingredient> 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<OutputItem> key, OutputItem value) {
if (value.isEmpty()) {
return "ItemStack '" + key.name + "' can't be empty";
}
return "";
}
};
RecipeKey<OutputItem> RESULT = OUTPUT_ITEM_ONLY.key("result");
RecipeKey<InputItem> INGREDIENT = ItemComponents.INPUT.key("ingredient");
RecipeSchema SCHEMA = new RecipeSchema(RESULT, INGREDIENT).uniqueOutputId(RESULT);
RecipeSchema SCHEMA = new RecipeSchema(RESULT, INGREDIENT).uniqueId(RESULT);
}

View File

@ -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<Component>();
var style = info.defaultTextStyle().height(10);
ItemStack.appendEnchantmentNames(list, mesh.getEnchantmentTags());
for (var component : list) {
CompatUtil.addEnchantmentsTooltip(mesh, level, component -> {
info.text(component, style);
}
});
}
}
}