From 69c879a74c096f516b5d55b6361f88ca3095c3e4 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Tue, 26 Mar 2024 17:32:31 +0100 Subject: [PATCH 01/17] basic recipes --- build.gradle.kts | 7 +- .../common/event/machine/IEventHandler.java | 19 + .../common/event/machine/MachineEvent.java | 4 +- .../mmce/common/event/recipe/RecipeEvent.java | 4 +- .../groovyscript/GroovyMachine.java | 26 + .../groovyscript/GroovyRecipe.java | 843 ++++++++++++++++++ .../integration/groovyscript/Plugin.java | 217 +++++ .../modularmachinery/common/base/Mods.java | 1 + .../common/crafting/MachineRecipe.java | 2 +- .../common/crafting/PreparedRecipe.java | 2 +- .../common/crafting/RecipeRegistry.java | 9 +- .../adapter/AdapterMinecraftFurnace.java | 2 +- .../adapter/DynamicMachineRecipeAdapter.java | 2 +- .../crafting/adapter/RecipeAdapter.java | 2 +- .../adapter/RecipeAdapterAccessor.java | 2 +- .../adapter/RecipeAdapterRegistry.java | 2 +- .../adapter/ic2/AdapterIC2Compressor.java | 7 +- .../adapter/ic2/AdapterIC2Macerator.java | 2 +- .../adapter/nco/AdapterNCOAlloyFurnace.java | 2 +- .../nco/AdapterNCOChemicalReactor.java | 2 +- .../adapter/nco/AdapterNCOInfuser.java | 2 +- .../adapter/nco/AdapterNCOMelter.java | 2 +- .../adapter/tc6/AdapterTC6InfusionMatrix.java | 6 +- .../AdapterSmelteryAlloyRecipe.java | 2 +- .../AdapterSmelteryMeltingRecipe.java | 2 +- .../crafttweaker/MachineBuilder.java | 14 +- .../crafttweaker/RecipePrimer.java | 42 +- .../crafttweaker/event/MMEvents.java | 12 +- .../common/machine/DynamicMachine.java | 2 +- 29 files changed, 1171 insertions(+), 70 deletions(-) create mode 100644 src/main/java/github/kasuminova/mmce/common/event/machine/IEventHandler.java create mode 100644 src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java create mode 100644 src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java create mode 100644 src/main/java/github/kasuminova/mmce/common/integration/groovyscript/Plugin.java diff --git a/build.gradle.kts b/build.gradle.kts index 6e330e0f..0a8ca5c8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -149,6 +149,7 @@ repositories { url = uri("http://jenkins.usrv.eu:8081/nexus/content/groups/public/") isAllowInsecureProtocol = true } + mavenLocal() } dependencies { @@ -177,6 +178,10 @@ dependencies { isTransitive = false } + compileOnlyApi("org.jetbrains:annotations:24.1.0") + annotationProcessor("org.jetbrains:annotations:24.1.0") + + api("com.cleanroommc:groovyscript:1.0.0-SNAPSHOT-d") { isTransitive = false } implementation("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.+") implementation(rfg.deobf("curse.maven:had-enough-items-557549:4810661")) implementation(rfg.deobf("curse.maven:zenutil-401178:5056679")) @@ -195,7 +200,7 @@ dependencies { implementation(rfg.deobf("curse.maven:applied-energistics-2-223794:2747063")) // implementation(rfg.deobf("curse.maven:ae2-extended-life-570458:4961400")) // compileOnly(rfg.deobf("curse.maven:gregtech-293327:3266351")) - implementation(rfg.deobf("curse.maven:gregtech-ce-unofficial-557242:4799055")) + compileOnly(rfg.deobf("curse.maven:gregtech-ce-unofficial-557242:4799055")) // GeckoLib implementation(rfg.deobf("software.bernie.geckolib:geckolib-forge-1.12.2:3.0.31")) diff --git a/src/main/java/github/kasuminova/mmce/common/event/machine/IEventHandler.java b/src/main/java/github/kasuminova/mmce/common/event/machine/IEventHandler.java new file mode 100644 index 00000000..1f9c7d0f --- /dev/null +++ b/src/main/java/github/kasuminova/mmce/common/event/machine/IEventHandler.java @@ -0,0 +1,19 @@ +package github.kasuminova.mmce.common.event.machine; + +import groovy.lang.Closure; +import net.minecraftforge.fml.common.Optional; + +public interface IEventHandler { + + void invoke(T event); + + @Optional.Method(modid = "groovyscript") + static IEventHandler of(Closure listener) { + return listener::call; + } + + @Optional.Method(modid = "crafttweaker") + static IEventHandler of(crafttweaker.util.IEventHandler eventHandler) { + return eventHandler::handle; + } +} diff --git a/src/main/java/github/kasuminova/mmce/common/event/machine/MachineEvent.java b/src/main/java/github/kasuminova/mmce/common/event/machine/MachineEvent.java index cd6631e6..71167ad6 100644 --- a/src/main/java/github/kasuminova/mmce/common/event/machine/MachineEvent.java +++ b/src/main/java/github/kasuminova/mmce/common/event/machine/MachineEvent.java @@ -1,13 +1,11 @@ package github.kasuminova.mmce.common.event.machine; import crafttweaker.annotations.ZenRegister; -import crafttweaker.util.IEventHandler; import github.kasuminova.mmce.common.handler.UpgradeMachineEventHandler; import github.kasuminova.mmce.common.helper.IMachineController; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; import hellfirepvp.modularmachinery.common.tiles.base.TileMultiblockMachineController; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.Event; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenGetter; @@ -56,7 +54,7 @@ public void postCrTEvent() { } for (IEventHandler handler : handlers) { - handler.handle(this); + handler.invoke(this); if (isCanceled()) { break; } diff --git a/src/main/java/github/kasuminova/mmce/common/event/recipe/RecipeEvent.java b/src/main/java/github/kasuminova/mmce/common/event/recipe/RecipeEvent.java index 951a80b0..cefaeffd 100644 --- a/src/main/java/github/kasuminova/mmce/common/event/recipe/RecipeEvent.java +++ b/src/main/java/github/kasuminova/mmce/common/event/recipe/RecipeEvent.java @@ -1,7 +1,7 @@ package github.kasuminova.mmce.common.event.recipe; import crafttweaker.annotations.ZenRegister; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.machine.MachineEvent; import hellfirepvp.modularmachinery.common.crafting.ActiveMachineRecipe; import hellfirepvp.modularmachinery.common.crafting.helper.RecipeCraftingContext; @@ -54,7 +54,7 @@ public void postCrTEvent() { return; } for (IEventHandler handler : handlers) { - handler.handle(this); + handler.invoke(this); if (isCanceled()) { break; } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java new file mode 100644 index 00000000..64366172 --- /dev/null +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java @@ -0,0 +1,26 @@ +package github.kasuminova.mmce.common.integration.groovyscript; + +import com.cleanroommc.groovyscript.api.IScriptReloadable; +import com.cleanroommc.groovyscript.registry.NamedRegistry; +import net.minecraft.util.ResourceLocation; + +public class GroovyMachine extends NamedRegistry implements IScriptReloadable { + + private final ResourceLocation name; + + public GroovyMachine(ResourceLocation name) { + this.name = name; + } + + @Override + public void onReload() { + } + + @Override + public void afterScriptLoad() { + } + + public GroovyRecipe recipeBuilder(String name) { + return new GroovyRecipe(this.name); + } +} diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java new file mode 100644 index 00000000..bb0962fa --- /dev/null +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java @@ -0,0 +1,843 @@ +package github.kasuminova.mmce.common.integration.groovyscript; + +import com.cleanroommc.groovyscript.api.GroovyLog; +import com.cleanroommc.groovyscript.api.IIngredient; +import com.cleanroommc.groovyscript.helper.ingredient.IngredientHelper; +import com.cleanroommc.groovyscript.helper.ingredient.OreDictIngredient; +import com.cleanroommc.groovyscript.helper.recipe.RecipeName; +import com.cleanroommc.groovyscript.sandbox.ClosureHelper; +import github.kasuminova.mmce.common.event.Phase; +import github.kasuminova.mmce.common.event.machine.IEventHandler; +import github.kasuminova.mmce.common.event.recipe.*; +import github.kasuminova.mmce.common.util.concurrent.Action; +import groovy.lang.Closure; +import hellfirepvp.modularmachinery.ModularMachinery; +import hellfirepvp.modularmachinery.common.base.Mods; +import hellfirepvp.modularmachinery.common.crafting.PreparedRecipe; +import hellfirepvp.modularmachinery.common.crafting.RecipeRegistry; +import hellfirepvp.modularmachinery.common.crafting.helper.ComponentRequirement; +import hellfirepvp.modularmachinery.common.crafting.helper.ComponentSelectorTag; +import hellfirepvp.modularmachinery.common.crafting.requirement.*; +import hellfirepvp.modularmachinery.common.data.Config; +import hellfirepvp.modularmachinery.common.integration.crafttweaker.IngredientArrayPrimer; +import hellfirepvp.modularmachinery.common.lib.RequirementTypesMM; +import hellfirepvp.modularmachinery.common.machine.DynamicMachine; +import hellfirepvp.modularmachinery.common.machine.IOType; +import hellfirepvp.modularmachinery.common.machine.MachineRegistry; +import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; +import hellfirepvp.modularmachinery.common.util.SmartInterfaceType; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import mekanism.api.gas.GasStack; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.Optional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class GroovyRecipe implements PreparedRecipe { + + protected String name; + protected final ResourceLocation machineName; + private int tickTime = 100, priority = 0; + private boolean doesVoidPerTick = false; + + private final List> components = new ArrayList<>(); + private final List needAfterInitActions = new ArrayList<>(); + private final List toolTipList = new ArrayList<>(); + private final Map, List>> recipeEventHandlers = new Object2ObjectOpenHashMap<>(); + + private boolean parallelized = Config.recipeParallelizeEnabledByDefault; + private int maxThreads = -1; + private String threadName = ""; + private ComponentRequirement lastComponent = null; + + public GroovyRecipe(ResourceLocation owningMachine) { + this.machineName = owningMachine; + } + + public GroovyRecipe name(String name) { + this.name = name; + return this; + } + + public GroovyRecipe time(int time) { + this.tickTime = time; + return this; + } + + public GroovyRecipe priority(int priority) { + this.priority = priority; + return this; + } + + public GroovyRecipe cancelIfPerTickFails(boolean b) { + this.doesVoidPerTick = b; + return this; + } + + public GroovyRecipe parallelizeUnaffected(boolean unaffected) { + if (lastComponent instanceof ComponentRequirement.Parallelizable parallelizable) { + parallelizable.setParallelizeUnaffected(unaffected); + } else { + GroovyLog.get().warn("Target " + lastComponent.getClass() + " cannot be parallelized!"); + } + return this; + } + + public GroovyRecipe parallelized(boolean isParallelized) { + this.parallelized = isParallelized; + return this; + } + + public GroovyRecipe chance(float chance) { + if (lastComponent != null) { + if (lastComponent instanceof ComponentRequirement.ChancedRequirement chancedReq) { + chancedReq.setChance(chance); + } else { + GroovyLog.get().warn("Cannot set chance for not-chance-based Component: " + lastComponent.getClass()); + } + } + return this; + } + + + public GroovyRecipe tag(String selectorTag) { + if (lastComponent != null) { + lastComponent.setTag(new ComponentSelectorTag(selectorTag)); + } + return this; + } + + + public GroovyRecipe preViewNBT(NBTTagCompound nbt) { + if (lastComponent != null) { + if (lastComponent instanceof RequirementItem reqItem) { + reqItem.previewDisplayTag = nbt; + } else { + GroovyLog.get().warn("setPreViewNBT(IData nbt) only can be applied to `Item`!"); + } + } else { + GroovyLog.get().warn("setPreViewNBT(IData nbt) only can be applied to `Item`!"); + } + return this; + } + + + public GroovyRecipe nbtChecker(Closure checker) { + if (lastComponent != null) { + if (lastComponent instanceof RequirementItem reqItem) { + reqItem.setItemChecker((controller, stack) -> ClosureHelper.call(true, checker, controller, stack)); + } else { + GroovyLog.get().warn("setNBTChecker(AdvancedItemNBTChecker checker) only can be applied to `Item`!"); + } + } else { + GroovyLog.get().warn("setNBTChecker(AdvancedItemNBTChecker checker) only can be applied to `Item`!"); + } + return this; + } + + + public GroovyRecipe itemModifier(Closure modifier) { + if (lastComponent != null) { + if (lastComponent instanceof RequirementItem reqItem) { + reqItem.addItemModifier((controller, stack) -> ClosureHelper.call(stack, modifier, controller, stack)); + } else { + GroovyLog.get().warn("addItemModifier(AdvancedItemModifier checker) only can be applied to `Item`!"); + } + } else { + GroovyLog.get().warn("addItemModifier(AdvancedItemModifier checker) only can be applied to `Item`!"); + } + return this; + } + + + public GroovyRecipe amount(int min, int max) { + if (lastComponent != null) { + if (lastComponent instanceof RequirementItem reqItem) { + if (min < max) { + reqItem.minAmount = min; + reqItem.maxAmount = max; + } else { + GroovyLog.get().warn("`min` cannot larger than `max`!"); + } + } else { + GroovyLog.get().warn("setMinMaxOutputAmount(int min, int max) only can be applied to `Item`!"); + } + } else { + GroovyLog.get().warn("setMinMaxOutputAmount(int min, int max) only can be applied to `Item`!"); + } + return this; + } + + /** + *

为某个输入或输出设置特定触发时间。

+ *

注意:如果设置了触发时间,则配方在其他时间不会触发任何消耗或产出动作。

+ * + * @param tickTime 触发的配方时间,实际触发时间受到配方修改器影响 + */ + + public GroovyRecipe triggerTime(int tickTime) { + if (lastComponent != null) { + lastComponent.setTriggerTime(tickTime); + } + return this; + } + + /** + * 使触发时间可以被重复触发。 + * + * @param repeatable true 为可重复,默认 false。 + */ + + public GroovyRecipe triggerRepeatable(boolean repeatable) { + if (lastComponent != null) { + lastComponent.setTriggerRepeatable(repeatable); + } + return this; + } + + /** + *

使一个物品/流体等需求忽略输出检测,对一些大量输出不同种类物品等需求非常有用。

+ *

警告:如果忽略输出则有时可能会导致输出吞物品行为。

+ * + * @param ignoreOutputCheck true 为忽略,默认为 false 不忽略。 + */ + + public GroovyRecipe ignoreOutputCheck(boolean ignoreOutputCheck) { + if (lastComponent != null) { + lastComponent.setIgnoreOutputCheck(ignoreOutputCheck); + } + return this; + } + + + public GroovyRecipe recipeTooltip(String... tooltips) { + toolTipList.addAll(Arrays.asList(tooltips)); + return this; + } + + + public GroovyRecipe smartInterfaceDataInput(String typeStr, float minValue, float maxValue) { + needAfterInitActions.add(() -> { + DynamicMachine machine = MachineRegistry.getRegistry().getMachine(machineName); + if (machine == null) { + GroovyLog.get().error("Could not find machine `" + machineName.toString() + "`!"); + return; + } + SmartInterfaceType type = machine.getSmartInterfaceType(typeStr); + if (type == null) { + GroovyLog.get().error("SmartInterfaceType " + typeStr + " Not Found!"); + return; + } + appendComponent(new RequirementInterfaceNumInput(type, minValue, maxValue)); + }); + return this; + } + + + public GroovyRecipe smartInterfaceDataInput(String typeStr, float value) { + return smartInterfaceDataInput(typeStr, value, value); + } + + /** + * 设置此配方在工厂中同时运行的数量是否不超过指定数值。 + */ + + public GroovyRecipe maxThreads(int maxThreads) { + this.maxThreads = maxThreads; + return this; + } + + /** + * 设置此配方只能被指定的核心线程执行。 + * + * @param name 线程名 + */ + public GroovyRecipe threadName(String name) { + this.threadName = name == null ? "" : name; + return this; + } + + //---------------------------------------------------------------------------------------------- + // EventHandlers + //---------------------------------------------------------------------------------------------- + + public GroovyRecipe preCheckHandler(Closure handler) { + addRecipeEventHandler(RecipeCheckEvent.class, event -> { + if (event.phase != Phase.START) return; + ClosureHelper.call(handler, event); + }); + return this; + } + + + public GroovyRecipe postCheckHandler(Closure handler) { + addRecipeEventHandler(RecipeCheckEvent.class, event -> { + if (event.phase != Phase.END) return; + ClosureHelper.call(handler, event); + }); + return this; + } + + public GroovyRecipe startHandler(Closure handler) { + addRecipeEventHandler(RecipeStartEvent.class, IEventHandler.of(handler)); + return this; + } + + public GroovyRecipe preTickHandler(Closure handler) { + addRecipeEventHandler(RecipeTickEvent.class, event -> { + if (event.phase != Phase.START) return; + ClosureHelper.call(handler, event); + }); + return this; + } + + public GroovyRecipe postTickHandler(Closure handler) { + addRecipeEventHandler(RecipeTickEvent.class, event -> { + if (event.phase != Phase.END) return; + ClosureHelper.call(handler, event); + }); + return this; + } + + public GroovyRecipe failureHandler(Closure handler) { + addRecipeEventHandler(RecipeFailureEvent.class, IEventHandler.of(handler)); + return this; + } + + public GroovyRecipe finishHandler(Closure handler) { + addRecipeEventHandler(RecipeFinishEvent.class, IEventHandler.of(handler)); + return this; + } + + public GroovyRecipe factoryStartHandler(Closure handler) { + addRecipeEventHandler(FactoryRecipeStartEvent.class, IEventHandler.of(handler)); + return this; + } + + public GroovyRecipe factoryPreTickHandler(Closure handler) { + addRecipeEventHandler(FactoryRecipeTickEvent.class, event -> { + if (event.phase != Phase.START) { + return; + } + ClosureHelper.call(handler, event); + }); + return this; + } + + public GroovyRecipe factoryPostTickHandler(Closure handler) { + addRecipeEventHandler(FactoryRecipeTickEvent.class, event -> { + if (event.phase != Phase.END) { + return; + } + ClosureHelper.call(handler, event); + }); + return this; + } + + + public GroovyRecipe factoryFailureHandler(Closure handler) { + return eventHandler(FactoryRecipeFailureEvent.class, handler); + } + + public GroovyRecipe factoryFinishHandler(Closure handler) { + return eventHandler(FactoryRecipeFinishEvent.class, handler); + } + + public GroovyRecipe eventHandler(Closure handler) { + if (handler.getParameterTypes().length > 0 && RecipeEvent.class.isAssignableFrom(handler.getParameterTypes()[0])) { + Class eventClass = (Class) handler.getParameterTypes()[0]; + addRecipeEventHandler(eventClass, IEventHandler.of(handler)); + } else { + GroovyLog.get().error("The parameter type must be explicitly declared when using `eventHandler({})`"); + } + return this; + } + + public GroovyRecipe eventHandler(Class clazz, Closure handler) { + addRecipeEventHandler(clazz, IEventHandler.of(handler)); + return this; + } + + @SuppressWarnings("unchecked") + private void addRecipeEventHandler(Class hClass, IEventHandler handler) { + recipeEventHandlers.putIfAbsent(hClass, new ArrayList<>()); + recipeEventHandlers.get(hClass).add((IEventHandler) handler); + } + + //---------------------------------------------------------------------------------------------- + // General Input & Output + //---------------------------------------------------------------------------------------------- + + public GroovyRecipe input(IIngredient input) { + if (IngredientHelper.isItem(input) || input instanceof OreDictIngredient) { + itemInput(input); + } else if (input instanceof FluidStack liquidStack) { + fluidInput(liquidStack); + } else if (Mods.MEKANISM.isPresent() && input instanceof GasStack gasStack) { + gasInput(gasStack); + } else { + GroovyLog.get().error(String.format("Invalid input type %s(%s)! Ignored.", input, input.getClass())); + } + return this; + } + + public GroovyRecipe input(IIngredient... inputs) { + for (IIngredient input : inputs) { + input(input); + } + return this; + } + + public GroovyRecipe input(Iterable inputs) { + for (IIngredient input : inputs) { + input(input); + } + return this; + } + + public GroovyRecipe output(IIngredient output) { + if (IngredientHelper.isItem(output) || output instanceof OreDictIngredient) { + itemOutput(output); + } else if (output instanceof FluidStack liquidStack) { + fluidOutput(liquidStack); + } else if (Mods.MEKANISM.isPresent() && output instanceof GasStack gasStack) { + gasOutput(gasStack); + } else { + GroovyLog.get().error(String.format("Invalid output type %s(%s)! Ignored.", output, output.getClass())); + } + return this; + } + + public GroovyRecipe output(IIngredient... outputs) { + for (IIngredient output : outputs) { + output(output); + } + return this; + } + + public GroovyRecipe output(Iterable outputs) { + for (IIngredient output : outputs) { + output(output); + } + return this; + } + + //---------------------------------------------------------------------------------------------- + // Energy input & output + //---------------------------------------------------------------------------------------------- + + public GroovyRecipe energyInput(long perTick) { + requireEnergy(IOType.INPUT, perTick); + return this; + } + + + public GroovyRecipe energyOutput(long perTick) { + requireEnergy(IOType.OUTPUT, perTick); + return this; + } + + //---------------------------------------------------------------------------------------------- + // FLUID input & output + //---------------------------------------------------------------------------------------------- + + public GroovyRecipe fluidInput(FluidStack fluid, boolean perTick) { + requireFluid(IOType.INPUT, fluid, perTick); + return this; + } + + public GroovyRecipe fluidInput(FluidStack fluid) { + return fluidInput(fluid, false); + } + + public GroovyRecipe fluidInput(FluidStack... fluids) { + for (FluidStack fluid : fluids) { + fluidInput(fluid); + } + return this; + } + + public GroovyRecipe fluidInput(Iterable fluids, boolean perTick) { + for (FluidStack fluid : fluids) { + fluidInput(fluid, perTick); + } + return this; + } + + public GroovyRecipe fluidInput(Iterable fluids) { + return fluidInput(fluids, false); + } + + public GroovyRecipe fluidOutput(FluidStack fluid) { + return fluidOutput(fluid, false); + } + + public GroovyRecipe fluidOutput(FluidStack fluid, boolean perTick) { + requireFluid(IOType.OUTPUT, fluid, perTick); + return this; + } + + + public GroovyRecipe fluidOutputs(FluidStack... fluids) { + for (FluidStack fluid : fluids) { + fluidOutput(fluid); + } + return this; + } + + public GroovyRecipe fluidOutputs(Iterable fluids, boolean perTick) { + for (FluidStack fluid : fluids) { + fluidOutput(fluid, perTick); + } + return this; + } + + public GroovyRecipe fluidOutputs(Iterable fluids) { + return fluidOutputs(fluids, false); + } + + //---------------------------------------------------------------------------------------------- + // GAS input & output + //---------------------------------------------------------------------------------------------- + + @Optional.Method(modid = "mekanism") + public GroovyRecipe gasInput(GasStack gasStack) { + requireGas(IOType.INPUT, gasStack); + return this; + } + + + @Optional.Method(modid = "mekanism") + public GroovyRecipe gasOutput(GasStack gasStack) { + requireGas(IOType.OUTPUT, gasStack); + return this; + } + + + @Optional.Method(modid = "mekanism") + public GroovyRecipe gasInput(GasStack... gasStacks) { + for (final GasStack gasStack : gasStacks) { + requireGas(IOType.INPUT, gasStack); + } + return this; + } + + @Optional.Method(modid = "mekanism") + public GroovyRecipe gasInput(Iterable gasStacks) { + for (final GasStack gasStack : gasStacks) { + requireGas(IOType.INPUT, gasStack); + } + return this; + } + + + @Optional.Method(modid = "mekanism") + public GroovyRecipe gasOutput(GasStack... gasStacks) { + for (final GasStack gasStack : gasStacks) { + requireGas(IOType.OUTPUT, gasStack); + } + return this; + } + + @Optional.Method(modid = "mekanism") + public GroovyRecipe gasOutput(Iterable gasStacks) { + for (final GasStack gasStack : gasStacks) { + requireGas(IOType.OUTPUT, gasStack); + } + return this; + } + + //---------------------------------------------------------------------------------------------- + // ITEM input + //---------------------------------------------------------------------------------------------- + + public GroovyRecipe itemInput(IIngredient input) { + if (IngredientHelper.isItem(input)) { + requireFuel(IOType.INPUT, IngredientHelper.toItemStack(input)); + } else if (input instanceof OreDictIngredient oreDictIngredient) { + requireFuel(IOType.INPUT, oreDictIngredient.getOreDict(), oreDictIngredient.getAmount()); + } else { + GroovyLog.get().error(String.format("Invalid input type %s(%s)! Ignored.", input, input.getClass())); + } + + return this; + } + + public GroovyRecipe itemInputs(IIngredient... inputs) { + for (IIngredient input : inputs) { + itemInput(input); + } + return this; + } + + public GroovyRecipe itemInputs(Iterable inputs) { + for (IIngredient input : inputs) { + itemInput(input); + } + return this; + } + + public GroovyRecipe fuelBurnTime(int requiredTotalBurnTime) { + requireFuel(requiredTotalBurnTime); + return this; + } + + // TODO + public GroovyRecipe addIngredientArrayInput(IngredientArrayPrimer ingredientArrayPrimer) { + appendComponent(new RequirementIngredientArray(ingredientArrayPrimer.getIngredientStackList())); + return this; + } + + /** + *

随机选择给定的一组物品中的其中一个输出。

+ *

虽然都使用 IngredientArrayPrimer 作为参数,但是输出的工作机制要稍有不同

+ *

每个 Ingredient 的 chance 代表整个物品列表的随机选择权重,权重越高,输出概率越大。

+ *

同样,setMinMaxAmount() 也能够起作用。

+ */ + // TODO + public GroovyRecipe addRandomItemOutput(IngredientArrayPrimer ingredientArrayPrimer) { + appendComponent(new RequirementIngredientArray(ingredientArrayPrimer.getIngredientStackList(), IOType.OUTPUT)); + return this; + } + + //---------------------------------------------------------------------------------------------- + // ITEM output + //---------------------------------------------------------------------------------------------- + + public GroovyRecipe itemOutput(IIngredient output) { + if (IngredientHelper.isItem(output)) { + requireFuel(IOType.OUTPUT, IngredientHelper.toItemStack(output)); + } else if (output instanceof OreDictIngredient oreDictIngredient) { + requireFuel(IOType.OUTPUT, oreDictIngredient.getOreDict(), oreDictIngredient.getAmount()); + } else { + GroovyLog.get().error(String.format("Invalid output type %s(%s)! Ignored.", output, output.getClass())); + } + + return this; + } + + public GroovyRecipe itemOutputs(IIngredient... inputs) { + for (IIngredient input : inputs) { + itemOutput(input); + } + return this; + } + + //---------------------------------------------------------------------------------------------- + // Catalyst + //---------------------------------------------------------------------------------------------- + + public GroovyRecipe catalyst(IIngredient input, Iterable tooltips, Iterable modifiers) { + if (IngredientHelper.isItem(input)) { + requireCatalyst(IngredientHelper.toItemStack(input), tooltips, modifiers); + } else if (input instanceof OreDictIngredient oreDictIngredient) { + requireCatalyst(oreDictIngredient.getOreDict(), oreDictIngredient.getAmount(), tooltips, modifiers); + } else { + GroovyLog.get().error(String.format("Invalid input type %s(%s)! Ignored.", input, input.getClass())); + } + + return this; + } + + + // TODO + public GroovyRecipe addCatalystInput(IngredientArrayPrimer input, Iterable tooltips, Iterable modifiers) { + requireCatalyst(input, tooltips, modifiers); + return this; + } + + //---------------------------------------------------------------------------------------------- + // Internals + //---------------------------------------------------------------------------------------------- + private void requireEnergy(IOType ioType, long perTick) { + appendComponent(new RequirementEnergy(ioType, perTick)); + } + + private void requireFluid(IOType ioType, FluidStack stack, boolean isPerTick) { + if (stack == null) { + GroovyLog.get().error("FluidStack not found/unknown fluid"); + return; + } + + if (isPerTick) { + appendComponent(new RequirementFluidPerTick(ioType, stack)); + } else { + appendComponent(new RequirementFluid(ioType, stack)); + } + } + + @Optional.Method(modid = "mekanism") + private void requireGas(IOType ioType, GasStack gasStack) { + appendComponent(RequirementFluid.createMekanismGasRequirement(RequirementTypesMM.REQUIREMENT_GAS, ioType, gasStack)); + } + + private void requireFuel(int requiredTotalBurnTime) { + appendComponent(new RequirementItem(IOType.INPUT, requiredTotalBurnTime)); + } + + private void requireFuel(IOType ioType, ItemStack stack) { + if (stack.isEmpty()) { + GroovyLog.get().error("ItemStack not found/unknown item: " + stack); + return; + } + RequirementItem ri = new RequirementItem(ioType, stack); + if (stack.hasTagCompound()) { + ri.tag = stack.getTagCompound(); + ri.previewDisplayTag = stack.getTagCompound(); + } + appendComponent(ri); + } + + private void requireFuel(IOType ioType, String oreDictName, int amount) { + appendComponent(new RequirementItem(ioType, oreDictName, amount)); + } + + private void requireCatalyst(String oreDictName, int amount, Iterable tooltips, Iterable modifiers) { + RequirementCatalyst catalyst = new RequirementCatalyst(oreDictName, amount); + for (String tooltip : tooltips) { + catalyst.addTooltip(tooltip); + } + for (RecipeModifier modifier : modifiers) { + if (modifier != null) { + catalyst.addModifier(modifier); + } + } + appendComponent(catalyst); + } + + private void requireCatalyst(ItemStack stack, Iterable tooltips, Iterable modifiers) { + if (stack.isEmpty()) { + GroovyLog.get().error("ItemStack not found/unknown item: " + stack); + return; + } + RequirementCatalyst catalyst = new RequirementCatalyst(stack); + for (String tooltip : tooltips) { + catalyst.addTooltip(tooltip); + } + for (RecipeModifier modifier : modifiers) { + if (modifier != null) { + catalyst.addModifier(modifier); + } + } + appendComponent(catalyst); + } + + private void requireCatalyst(IngredientArrayPrimer ingredientArrayPrimer, Iterable tooltips, Iterable modifiers) { + RequirementCatalyst catalyst = new RequirementCatalyst(ingredientArrayPrimer.getIngredientStackList()); + for (String tooltip : tooltips) { + catalyst.addTooltip(tooltip); + } + for (RecipeModifier modifier : modifiers) { + if (modifier != null) { + catalyst.addModifier(modifier); + } + } + appendComponent(catalyst); + } + + public void appendComponent(ComponentRequirement component) { + this.components.add(component); + this.lastComponent = component; + } + + //---------------------------------------------------------------------------------------------- + // build + //---------------------------------------------------------------------------------------------- + + private boolean validate() { + GroovyLog.Msg msg = GroovyLog.msg("Error adding {} recipe", this.name).error(); + if (this.name == null) this.name = RecipeName.generate(); + if (this.tickTime <= 0) this.tickTime = 100; + + return !msg.postIfNotEmpty(); + } + + public void register() { + if (validate()) { + RecipeRegistry.getRegistry().registerRecipeEarly(this); + } + } + + //---------------------------------------------------------------------------------------------- + // lingering stats + //---------------------------------------------------------------------------------------------- + + @Override + public String getFilePath() { + return ""; + } + + @Override + public ResourceLocation getRecipeRegistryName() { + return new ResourceLocation(ModularMachinery.MODID, this.name); + } + + @Override + public ResourceLocation getAssociatedMachineName() { + return machineName; + } + + @Override + public ResourceLocation getParentMachineName() { + return machineName; + } + + @Override + public int getTotalProcessingTickTime() { + return tickTime; + } + + @Override + public int getPriority() { + return priority; + } + + @Override + public boolean voidPerTickFailure() { + return doesVoidPerTick; + } + + @Override + public List> getComponents() { + return components; + } + + @Override + public Map, List>> getRecipeEventHandlers() { + return recipeEventHandlers; + } + + @Override + public List getTooltipList() { + return toolTipList; + } + + @Override + public boolean isParallelized() { + return parallelized; + } + + @Override + public int getMaxThreads() { + return maxThreads; + } + + @Override + public String getThreadName() { + return threadName; + } + + @Override + public void loadNeedAfterInitActions() { + for (Action needAfterInitAction : needAfterInitActions) { + needAfterInitAction.doAction(); + } + } +} + diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/Plugin.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/Plugin.java new file mode 100644 index 00000000..363c2189 --- /dev/null +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/Plugin.java @@ -0,0 +1,217 @@ +package github.kasuminova.mmce.common.integration.groovyscript; + +import com.cleanroommc.groovyscript.api.GroovyPlugin; +import com.cleanroommc.groovyscript.api.INamed; +import com.cleanroommc.groovyscript.compat.mods.GroovyContainer; +import com.cleanroommc.groovyscript.compat.mods.ModPropertyContainer; +import github.kasuminova.mmce.client.model.DynamicMachineModelRegistry; +import github.kasuminova.mmce.client.resource.GeoModelExternalLoader; +import github.kasuminova.mmce.common.concurrent.RecipeCraftingContextPool; +import github.kasuminova.mmce.common.upgrade.registry.RegistryUpgrade; +import github.kasuminova.mmce.common.util.concurrent.Action; +import hellfirepvp.modularmachinery.ModularMachinery; +import hellfirepvp.modularmachinery.client.ClientProxy; +import hellfirepvp.modularmachinery.common.base.Mods; +import hellfirepvp.modularmachinery.common.crafting.RecipeRegistry; +import hellfirepvp.modularmachinery.common.crafting.adapter.RecipeAdapter; +import hellfirepvp.modularmachinery.common.integration.ModIntegrationJEI; +import hellfirepvp.modularmachinery.common.integration.crafttweaker.MachineBuilder; +import hellfirepvp.modularmachinery.common.integration.crafttweaker.MachineModifier; +import hellfirepvp.modularmachinery.common.integration.crafttweaker.event.MMEvents; +import hellfirepvp.modularmachinery.common.lib.RegistriesMM; +import hellfirepvp.modularmachinery.common.machine.DynamicMachine; +import hellfirepvp.modularmachinery.common.machine.MachineRegistry; +import hellfirepvp.modularmachinery.common.machine.factory.FactoryRecipeThread; +import hellfirepvp.modularmachinery.common.util.BlockArrayCache; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.command.ICommandSender; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.Optional; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import youyihj.zenutils.api.reload.ScriptReloadEvent; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +public class Plugin implements GroovyPlugin { + + private static GroovyContainer container; + + public static GroovyContainer getContainer() { + return container; + } + + @Override + public @NotNull String getModId() { + return ModularMachinery.MODID; + } + + @Override + public @NotNull String getContainerName() { + return ModularMachinery.NAME; + } + + @Override + public @Nullable ModPropertyContainer createModPropertyContainer() { + return new Container(); + } + + @Override + public void onCompatLoaded(GroovyContainer container) { + Plugin.container = container; + } + + private static void onReload() { + MachineBuilder.WAIT_FOR_LOAD.clear(); + + RegistryUpgrade.clearAll(); + RecipeRegistry.getRegistry().clearAllRecipes(); + // Reset RecipeAdapterIncId + RegistriesMM.ADAPTER_REGISTRY.getValuesCollection().forEach(RecipeAdapter::resetIncId); + + if (FMLCommonHandler.instance().getSide().isClient() && Mods.GECKOLIB.isPresent()) { + DynamicMachineModelRegistry.INSTANCE.onReload(); + } + + for (DynamicMachine loadedMachine : MachineRegistry.getLoadedMachines()) { + loadedMachine.getMachineEventHandlers().clear(); + loadedMachine.getSmartInterfaceTypes().clear(); + loadedMachine.getCoreThreadPreset().clear(); + loadedMachine.getModifiers().clear(); + loadedMachine.getMultiBlockModifiers().clear(); + } + // Reload JSON Machine + MachineRegistry.preloadMachines(); + // Reload All Machine + MachineRegistry.reloadMachine(MachineRegistry.loadMachines(null)); + } + + private static void afterScriptRun() { + MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); + boolean isServer = server != null && server.isDedicatedServer(); + + MachineRegistry.reloadMachine(MachineBuilder.WAIT_FOR_LOAD); + + if (FMLCommonHandler.instance().getSide().isClient() && Mods.GECKOLIB.isPresent()) { + ClientProxy.clientScheduler.addRunnable(GeoModelExternalLoader.INSTANCE::onReload, 0); + } + + CompletableFuture future = CompletableFuture.runAsync(() -> BlockArrayCache.buildCache(MachineRegistry.getLoadedMachines())); + + MachineModifier.loadAll(); + MMEvents.registryAll(); + + RecipeCraftingContextPool.onReload(); + RecipeRegistry.getRegistry().loadRecipeRegistry(null, true); + // TODO + /*for (Action action : FactoryRecipeThread.WAIT_FOR_ADD) { + action.doAction(); + } + FactoryRecipeThread.WAIT_FOR_ADD.clear();*/ + + if (!isServer) { + ModIntegrationJEI.reloadRecipeWrappers(); + } + + future.join(); + + // Flush the context to preview the changed structure. + if (!isServer) { + ModIntegrationJEI.reloadPreviewWrappers(); + } + } + + private static class Container extends ModPropertyContainer { + + private final GroovyMachine dummy = new DummyMachine(); + private final Map machines = new Object2ObjectOpenHashMap<>(); + private final Map properties = new Object2ObjectOpenHashMap<>(); + + public GroovyMachine machine(ResourceLocation rl) { + GroovyMachine machine = this.machines.get(rl); + if (machine == null) { + DynamicMachine dynamicMachine = MachineRegistry.getRegistry().getMachine(rl); + if (dynamicMachine != null) { + machine = new GroovyMachine(rl); + this.machines.put(rl, machine); + this.properties.put(rl.getPath(), machine); + } + } + return machine; + } + + public GroovyMachine machine(String mod, String name) { + return machine(new ResourceLocation(mod, name)); + } + + public GroovyMachine machine(String name) { + String mod; + int i = name.indexOf(":"); + if (i > 0) { + mod = name.substring(0, i); + name = name.substring(i + 1); + } else if (i == 0) { + mod = ModularMachinery.MODID; + name = name.substring(1); + } else { + mod = ModularMachinery.MODID; + } + return machine(new ResourceLocation(mod, name)); + } + + @Override + public @Nullable Object getProperty(String name) { + return machine(new ResourceLocation(ModularMachinery.MODID, name)); + } + + @Override + public Map getProperties() { + for (DynamicMachine machine : MachineRegistry.getLoadedMachines()) { + if (!this.machines.containsKey(machine.getRegistryName())) { + GroovyMachine groovyMachine = new GroovyMachine(machine.getRegistryName()); + this.machines.put(machine.getRegistryName(), groovyMachine); + this.properties.put(machine.getRegistryName().getPath(), groovyMachine); + } + } + return Collections.unmodifiableMap(this.properties); + } + + public Object getAt(String name) { + return machine(name); + } + + @Override + public Collection getRegistries() { + return Collections.singleton(this.dummy); + } + } + + private static class DummyMachine extends GroovyMachine { + + public DummyMachine() { + super(new ResourceLocation(ModularMachinery.MODID, "machine_name")); + } + + @Override + public void onReload() { + Plugin.onReload(); + } + + @Override + public void afterScriptLoad() { + Plugin.afterScriptRun(); + } + + @Override + public GroovyRecipe recipeBuilder(String name) { + throw new UnsupportedOperationException(); + } + } + } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/base/Mods.java b/src/main/java/hellfirepvp/modularmachinery/common/base/Mods.java index 78e83c18..0072f368 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/base/Mods.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/base/Mods.java @@ -18,6 +18,7 @@ * Date: 02.03.2019 / 17:42 */ public enum Mods { + GROOVYSCRIPT("groovyscript"), CRAFTTWEAKER("crafttweaker"), JEI("jei"), GREGTECH("gregtech"), diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/MachineRecipe.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/MachineRecipe.java index 49943829..ff5e8bba 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/MachineRecipe.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/MachineRecipe.java @@ -11,7 +11,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.gson.*; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.common.crafting.command.RecipeCommandContainer; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/PreparedRecipe.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/PreparedRecipe.java index 61e85c88..6c87de1f 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/PreparedRecipe.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/PreparedRecipe.java @@ -8,7 +8,7 @@ package hellfirepvp.modularmachinery.common.crafting; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.common.crafting.helper.ComponentRequirement; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/RecipeRegistry.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/RecipeRegistry.java index 7da5788a..bf67efb5 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/RecipeRegistry.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/RecipeRegistry.java @@ -16,6 +16,7 @@ import hellfirepvp.modularmachinery.common.data.DataLoadProfiler; import hellfirepvp.modularmachinery.common.integration.crafttweaker.RecipeAdapterBuilder; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.command.ICommandSender; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Tuple; @@ -37,11 +38,11 @@ public class RecipeRegistry { private static final RecipeRegistry INSTANCE = new RecipeRegistry(); - private static final Map>> REGISTRY_RECIPE_BY_MACHINE = new HashMap<>(); - private static final Map RECIPE_REGISTRY = new HashMap<>(); + private static final Map>> REGISTRY_RECIPE_BY_MACHINE = new Object2ObjectOpenHashMap<>(); + private static final Map RECIPE_REGISTRY = new Object2ObjectOpenHashMap<>(); - private final List earlyRecipes = new LinkedList<>(); - private final List earlyRecipeAdapters = new LinkedList<>(); + private final List earlyRecipes = new ArrayList<>(); + private final List earlyRecipeAdapters = new ArrayList<>(); private RecipeRegistry() { } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/AdapterMinecraftFurnace.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/AdapterMinecraftFurnace.java index 84b7552b..3b642781 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/AdapterMinecraftFurnace.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/AdapterMinecraftFurnace.java @@ -8,8 +8,8 @@ package hellfirepvp.modularmachinery.common.crafting.adapter; -import crafttweaker.util.IEventHandler; import github.kasuminova.mmce.common.event.Phase; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeCheckEvent; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/DynamicMachineRecipeAdapter.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/DynamicMachineRecipeAdapter.java index d268026d..4b64a5c5 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/DynamicMachineRecipeAdapter.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/DynamicMachineRecipeAdapter.java @@ -8,7 +8,7 @@ package hellfirepvp.modularmachinery.common.crafting.adapter; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapter.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapter.java index 8c400eef..7961f9b7 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapter.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapter.java @@ -8,7 +8,7 @@ package hellfirepvp.modularmachinery.common.crafting.adapter; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; import hellfirepvp.modularmachinery.common.crafting.helper.ComponentRequirement; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterAccessor.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterAccessor.java index 6495c765..2cbf149f 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterAccessor.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterAccessor.java @@ -10,7 +10,7 @@ import com.google.common.collect.ImmutableList; import com.google.gson.*; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterRegistry.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterRegistry.java index 80684c12..6c113801 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterRegistry.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterRegistry.java @@ -8,7 +8,7 @@ package hellfirepvp.modularmachinery.common.crafting.adapter; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; import hellfirepvp.modularmachinery.common.crafting.helper.ComponentRequirement; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/ic2/AdapterIC2Compressor.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/ic2/AdapterIC2Compressor.java index 2d73ac97..d45a0a2a 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/ic2/AdapterIC2Compressor.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/ic2/AdapterIC2Compressor.java @@ -1,15 +1,10 @@ package hellfirepvp.modularmachinery.common.crafting.adapter.ic2; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; import hellfirepvp.modularmachinery.common.crafting.helper.ComponentRequirement; -import hellfirepvp.modularmachinery.common.crafting.requirement.RequirementEnergy; -import hellfirepvp.modularmachinery.common.crafting.requirement.RequirementItem; -import hellfirepvp.modularmachinery.common.lib.RequirementTypesMM; -import hellfirepvp.modularmachinery.common.machine.IOType; import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; -import hellfirepvp.modularmachinery.common.util.ItemUtils; import ic2.api.recipe.IRecipeInput; import ic2.api.recipe.Recipes; import net.minecraft.item.ItemStack; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/ic2/AdapterIC2Macerator.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/ic2/AdapterIC2Macerator.java index c057e528..306a9b59 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/ic2/AdapterIC2Macerator.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/ic2/AdapterIC2Macerator.java @@ -1,6 +1,6 @@ package hellfirepvp.modularmachinery.common.crafting.adapter.ic2; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; import hellfirepvp.modularmachinery.common.crafting.helper.ComponentRequirement; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOAlloyFurnace.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOAlloyFurnace.java index eb2565e7..9087c527 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOAlloyFurnace.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOAlloyFurnace.java @@ -1,6 +1,6 @@ package hellfirepvp.modularmachinery.common.crafting.adapter.nco; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import github.kasuminova.mmce.common.itemtype.ChancedIngredientStack; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOChemicalReactor.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOChemicalReactor.java index 1c8c4f56..f4b58053 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOChemicalReactor.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOChemicalReactor.java @@ -1,6 +1,6 @@ package hellfirepvp.modularmachinery.common.crafting.adapter.nco; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; import hellfirepvp.modularmachinery.common.crafting.helper.ComponentRequirement; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOInfuser.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOInfuser.java index 16f8c6f6..2c88bd5d 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOInfuser.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOInfuser.java @@ -1,6 +1,6 @@ package hellfirepvp.modularmachinery.common.crafting.adapter.nco; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import github.kasuminova.mmce.common.itemtype.ChancedIngredientStack; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOMelter.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOMelter.java index 991a1d49..34f95691 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOMelter.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/nco/AdapterNCOMelter.java @@ -1,6 +1,6 @@ package hellfirepvp.modularmachinery.common.crafting.adapter.nco; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import github.kasuminova.mmce.common.itemtype.ChancedIngredientStack; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tc6/AdapterTC6InfusionMatrix.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tc6/AdapterTC6InfusionMatrix.java index 3a243e7e..953917dd 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tc6/AdapterTC6InfusionMatrix.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tc6/AdapterTC6InfusionMatrix.java @@ -1,6 +1,6 @@ package hellfirepvp.modularmachinery.common.crafting.adapter.tc6; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import github.kasuminova.mmce.common.itemtype.ChancedIngredientStack; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; @@ -14,13 +14,9 @@ import hellfirepvp.modularmachinery.common.util.ItemUtils; import kport.modularmagic.common.crafting.requirement.RequirementAspect; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; import net.minecraft.nbt.NBTBase; import net.minecraft.util.ResourceLocation; import thaumcraft.api.ThaumcraftApi; -import thaumcraft.api.aspects.Aspect; -import thaumcraft.api.aspects.AspectList; -import thaumcraft.api.crafting.IThaumcraftRecipe; import thaumcraft.api.crafting.InfusionRecipe; import javax.annotation.Nonnull; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tconstruct/AdapterSmelteryAlloyRecipe.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tconstruct/AdapterSmelteryAlloyRecipe.java index cc03c4e4..d5efcab0 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tconstruct/AdapterSmelteryAlloyRecipe.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tconstruct/AdapterSmelteryAlloyRecipe.java @@ -1,6 +1,6 @@ package hellfirepvp.modularmachinery.common.crafting.adapter.tconstruct; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; import hellfirepvp.modularmachinery.common.crafting.adapter.RecipeAdapter; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tconstruct/AdapterSmelteryMeltingRecipe.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tconstruct/AdapterSmelteryMeltingRecipe.java index 4d7d7399..503a61f5 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tconstruct/AdapterSmelteryMeltingRecipe.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/tconstruct/AdapterSmelteryMeltingRecipe.java @@ -1,7 +1,7 @@ package hellfirepvp.modularmachinery.common.crafting.adapter.tconstruct; -import crafttweaker.util.IEventHandler; import github.kasuminova.mmce.common.event.Phase; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeCheckEvent; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import github.kasuminova.mmce.common.itemtype.ChancedIngredientStack; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineBuilder.java index 9c8c79cc..935323a8 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineBuilder.java @@ -346,7 +346,7 @@ public MachineBuilder addSmartInterfaceType(SmartInterfaceType type) { */ @ZenMethod public MachineBuilder addStructureFormedHandler(IEventHandler function) { - machine.addMachineEventHandler(MachineStructureFormedEvent.class, function); + machine.addMachineEventHandler(MachineStructureFormedEvent.class, function::handle); return this; } @@ -355,7 +355,7 @@ public MachineBuilder addStructureFormedHandler(IEventHandler function) { - machine.addMachineEventHandler(MachineStructureUpdateEvent.class, function); + machine.addMachineEventHandler(MachineStructureUpdateEvent.class, function::handle); return this; } @@ -364,7 +364,7 @@ public MachineBuilder addStructureUpdateHandler(IEventHandler function) { - machine.addMachineEventHandler(MachineTickEvent.class, function); + machine.addMachineEventHandler(MachineTickEvent.class, function::handle); return this; } @@ -376,7 +376,7 @@ public MachineBuilder addGUIRenderHandler(IEventHandler function) { - machine.addMachineEventHandler(SmartInterfaceUpdateEvent.class, function); + machine.addMachineEventHandler(SmartInterfaceUpdateEvent.class, function::handle); return this; } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipePrimer.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipePrimer.java index 4b0e55b6..72b1f28f 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipePrimer.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipePrimer.java @@ -17,8 +17,8 @@ import crafttweaker.api.liquid.ILiquidStack; import crafttweaker.api.minecraft.CraftTweakerMC; import crafttweaker.api.oredict.IOreDictEntry; -import crafttweaker.util.IEventHandler; import github.kasuminova.mmce.common.event.Phase; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.*; import github.kasuminova.mmce.common.util.concurrent.Action; import hellfirepvp.modularmachinery.common.base.Mods; @@ -273,7 +273,7 @@ public RecipePrimer setThreadName(String name) { //---------------------------------------------------------------------------------------------- @ZenMethod - public RecipePrimer addPreCheckHandler(IEventHandler handler) { + public RecipePrimer addPreCheckHandler(crafttweaker.util.IEventHandler handler) { addRecipeEventHandler(RecipeCheckEvent.class, event -> { if (event.phase != Phase.START) return; handler.handle(event); @@ -282,7 +282,7 @@ public RecipePrimer addPreCheckHandler(IEventHandler handler) } @ZenMethod - public RecipePrimer addPostCheckHandler(IEventHandler handler) { + public RecipePrimer addPostCheckHandler(crafttweaker.util.IEventHandler handler) { addRecipeEventHandler(RecipeCheckEvent.class, event -> { if (event.phase != Phase.END) return; handler.handle(event); @@ -292,20 +292,20 @@ public RecipePrimer addPostCheckHandler(IEventHandler handler) @ZenMethod @Deprecated - public RecipePrimer addCheckHandler(IEventHandler handler) { + public RecipePrimer addCheckHandler(crafttweaker.util.IEventHandler handler) { CraftTweakerAPI.logWarning("[ModularMachinery] Deprecated method addCheckHandler()! Consider using addPostCheckHandler()"); - addRecipeEventHandler(RecipeCheckEvent.class, handler); + addRecipeEventHandler(RecipeCheckEvent.class, handler::handle); return this; } @ZenMethod - public RecipePrimer addStartHandler(IEventHandler handler) { - addRecipeEventHandler(RecipeStartEvent.class, handler); + public RecipePrimer addStartHandler(crafttweaker.util.IEventHandler handler) { + addRecipeEventHandler(RecipeStartEvent.class, handler::handle); return this; } @ZenMethod - public RecipePrimer addPreTickHandler(IEventHandler handler) { + public RecipePrimer addPreTickHandler(crafttweaker.util.IEventHandler handler) { addRecipeEventHandler(RecipeTickEvent.class, event -> { if (event.phase != Phase.START) return; handler.handle(event); @@ -314,7 +314,7 @@ public RecipePrimer addPreTickHandler(IEventHandler handler) { } @ZenMethod - public RecipePrimer addPostTickHandler(IEventHandler handler) { + public RecipePrimer addPostTickHandler(crafttweaker.util.IEventHandler handler) { addRecipeEventHandler(RecipeTickEvent.class, event -> { if (event.phase != Phase.END) return; handler.handle(event); @@ -323,25 +323,25 @@ public RecipePrimer addPostTickHandler(IEventHandler handler) { } @ZenMethod - public RecipePrimer addFailureHandler(IEventHandler handler) { - addRecipeEventHandler(RecipeFailureEvent.class, handler); + public RecipePrimer addFailureHandler(crafttweaker.util.IEventHandler handler) { + addRecipeEventHandler(RecipeFailureEvent.class, handler::handle); return this; } @ZenMethod - public RecipePrimer addFinishHandler(IEventHandler handler) { - addRecipeEventHandler(RecipeFinishEvent.class, handler); + public RecipePrimer addFinishHandler(crafttweaker.util.IEventHandler handler) { + addRecipeEventHandler(RecipeFinishEvent.class, handler::handle); return this; } @ZenMethod - public RecipePrimer addFactoryStartHandler(IEventHandler handler) { - addRecipeEventHandler(FactoryRecipeStartEvent.class, handler); + public RecipePrimer addFactoryStartHandler(crafttweaker.util.IEventHandler handler) { + addRecipeEventHandler(FactoryRecipeStartEvent.class, handler::handle); return this; } @ZenMethod - public RecipePrimer addFactoryPreTickHandler(IEventHandler handler) { + public RecipePrimer addFactoryPreTickHandler(crafttweaker.util.IEventHandler handler) { addRecipeEventHandler(FactoryRecipeTickEvent.class, event -> { if (event.phase != Phase.START) { return; @@ -352,7 +352,7 @@ public RecipePrimer addFactoryPreTickHandler(IEventHandler handler) { + public RecipePrimer addFactoryPostTickHandler(crafttweaker.util.IEventHandler handler) { addRecipeEventHandler(FactoryRecipeTickEvent.class, event -> { if (event.phase != Phase.END) { return; @@ -363,14 +363,14 @@ public RecipePrimer addFactoryPostTickHandler(IEventHandler handler) { - addRecipeEventHandler(FactoryRecipeFailureEvent.class, handler); + public RecipePrimer addFactoryFailureHandler(crafttweaker.util.IEventHandler handler) { + addRecipeEventHandler(FactoryRecipeFailureEvent.class, handler::handle); return this; } @ZenMethod - public RecipePrimer addFactoryFinishHandler(IEventHandler handler) { - addRecipeEventHandler(FactoryRecipeFinishEvent.class, handler); + public RecipePrimer addFactoryFinishHandler(crafttweaker.util.IEventHandler handler) { + addRecipeEventHandler(FactoryRecipeFinishEvent.class, handler::handle); return this; } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/event/MMEvents.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/event/MMEvents.java index 4ed13413..81adde0c 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/event/MMEvents.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/event/MMEvents.java @@ -32,7 +32,7 @@ public static void onStructureFormed(String machineRegistryName, IEventHandler { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineRegistryName)); if (machine != null) { - machine.addMachineEventHandler(MachineStructureFormedEvent.class, function); + machine.addMachineEventHandler(MachineStructureFormedEvent.class, function::handle); } else { CraftTweakerAPI.logError("Could not find machine `" + machineRegistryName + "`!"); } @@ -44,7 +44,7 @@ public static void onStructureUpdate(String machineRegistryName, IEventHandler { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineRegistryName)); if (machine != null) { - machine.addMachineEventHandler(MachineStructureUpdateEvent.class, function); + machine.addMachineEventHandler(MachineStructureUpdateEvent.class, function::handle); } else { CraftTweakerAPI.logError("Could not find machine `" + machineRegistryName + "`!"); } @@ -100,7 +100,7 @@ public static void onControllerGUIRender(String machineRegistryName, IEventHandl WAIT_FOR_MODIFY.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineRegistryName)); if (machine != null) { - machine.addMachineEventHandler(ControllerGUIRenderEvent.class, function); + machine.addMachineEventHandler(ControllerGUIRenderEvent.class, function::handle); } else { CraftTweakerAPI.logError("Could not find machine `" + machineRegistryName + "`!"); } @@ -116,7 +116,7 @@ public static void onControllerModelAnimation(String machineRegistryName, IEvent WAIT_FOR_MODIFY.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineRegistryName)); if (machine != null) { - machine.addMachineEventHandler(ControllerModelAnimationEvent.class, function); + machine.addMachineEventHandler(ControllerModelAnimationEvent.class, function::handle); } else { CraftTweakerAPI.logError("Could not find machine `" + machineRegistryName + "`!"); } @@ -132,7 +132,7 @@ public static void onControllerModelGet(String machineRegistryName, IEventHandle WAIT_FOR_MODIFY.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineRegistryName)); if (machine != null) { - machine.addMachineEventHandler(ControllerModelGetEvent.class, function); + machine.addMachineEventHandler(ControllerModelGetEvent.class, function::handle); } else { CraftTweakerAPI.logError("Could not find machine `" + machineRegistryName + "`!"); } @@ -144,7 +144,7 @@ public static void onSmartInterfaceUpdate(String machineRegistryName, IEventHand WAIT_FOR_MODIFY.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineRegistryName)); if (machine != null) { - machine.addMachineEventHandler(SmartInterfaceUpdateEvent.class, function); + machine.addMachineEventHandler(SmartInterfaceUpdateEvent.class, function::handle); } else { CraftTweakerAPI.logError("Could not find machine `" + machineRegistryName + "`!"); } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/machine/DynamicMachine.java b/src/main/java/hellfirepvp/modularmachinery/common/machine/DynamicMachine.java index c43a758e..24c22dc2 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/machine/DynamicMachine.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/machine/DynamicMachine.java @@ -10,8 +10,8 @@ import com.google.common.collect.Lists; import com.google.gson.*; -import crafttweaker.util.IEventHandler; import github.kasuminova.mmce.common.concurrent.RecipeCraftingContextPool; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.machine.MachineEvent; import github.kasuminova.mmce.common.util.DynamicPattern; import hellfirepvp.modularmachinery.common.crafting.ActiveMachineRecipe; From ba33ca4b366274bc122076f7438c08566420c516 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Tue, 26 Mar 2024 17:56:17 +0100 Subject: [PATCH 02/17] remove ct hard dep --- .../java/hellfirepvp/modularmachinery/ModularMachinery.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/hellfirepvp/modularmachinery/ModularMachinery.java b/src/main/java/hellfirepvp/modularmachinery/ModularMachinery.java index b4a06408..f99e1af4 100644 --- a/src/main/java/hellfirepvp/modularmachinery/ModularMachinery.java +++ b/src/main/java/hellfirepvp/modularmachinery/ModularMachinery.java @@ -42,7 +42,8 @@ */ @Mod(modid = ModularMachinery.MODID, name = ModularMachinery.NAME, version = ModularMachinery.VERSION, dependencies = "required-after:forge@[14.21.0.2371,);" + - "required-after:crafttweaker@[4.0.4,);" + + "after:crafttweaker@[4.0.4,);" + + //"after:groovyscript@[1.0.0,);" + // TODO wait for grs 1.0.1 "after:zenutils@[1.12.8,);" + "after:jei@[4.13.1.222,);" + "after:gregtech@[2.7.4-beta,);" + From c7bff5f6cc28589edb61a71c8a097d21ed9b32f5 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Tue, 26 Mar 2024 19:49:14 +0100 Subject: [PATCH 03/17] rename plugin class & machine event helper --- .../{Plugin.java => GroovyScriptPlugin.java} | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) rename src/main/java/github/kasuminova/mmce/common/integration/groovyscript/{Plugin.java => GroovyScriptPlugin.java} (85%) diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/Plugin.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java similarity index 85% rename from src/main/java/github/kasuminova/mmce/common/integration/groovyscript/Plugin.java rename to src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java index 363c2189..69e1ddab 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/Plugin.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java @@ -1,14 +1,19 @@ package github.kasuminova.mmce.common.integration.groovyscript; +import com.cleanroommc.groovyscript.api.GroovyLog; import com.cleanroommc.groovyscript.api.GroovyPlugin; import com.cleanroommc.groovyscript.api.INamed; import com.cleanroommc.groovyscript.compat.mods.GroovyContainer; import com.cleanroommc.groovyscript.compat.mods.ModPropertyContainer; +import com.cleanroommc.groovyscript.event.EventBusType; +import com.cleanroommc.groovyscript.event.GroovyEventManager; import github.kasuminova.mmce.client.model.DynamicMachineModelRegistry; import github.kasuminova.mmce.client.resource.GeoModelExternalLoader; import github.kasuminova.mmce.common.concurrent.RecipeCraftingContextPool; +import github.kasuminova.mmce.common.event.machine.IEventHandler; +import github.kasuminova.mmce.common.event.machine.MachineEvent; import github.kasuminova.mmce.common.upgrade.registry.RegistryUpgrade; -import github.kasuminova.mmce.common.util.concurrent.Action; +import groovy.lang.Closure; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.client.ClientProxy; import hellfirepvp.modularmachinery.common.base.Mods; @@ -21,26 +26,21 @@ import hellfirepvp.modularmachinery.common.lib.RegistriesMM; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; import hellfirepvp.modularmachinery.common.machine.MachineRegistry; -import hellfirepvp.modularmachinery.common.machine.factory.FactoryRecipeThread; import hellfirepvp.modularmachinery.common.util.BlockArrayCache; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.command.ICommandSender; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.Optional; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.eventhandler.EventPriority; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import youyihj.zenutils.api.reload.ScriptReloadEvent; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.concurrent.CompletableFuture; -public class Plugin implements GroovyPlugin { +public class GroovyScriptPlugin implements GroovyPlugin { private static GroovyContainer container; @@ -65,7 +65,7 @@ public static GroovyContainer getContainer() { @Override public void onCompatLoaded(GroovyContainer container) { - Plugin.container = container; + GroovyScriptPlugin.container = container; } private static void onReload() { @@ -191,6 +191,17 @@ public Object getAt(String name) { public Collection getRegistries() { return Collections.singleton(this.dummy); } + + public void machineEvent(String machineRegistryName, Class clazz, Closure listener) { + GroovyEventManager.INSTANCE.listen(EventPriority.NORMAL, EventBusType.MAIN, clazz, event -> { + DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineRegistryName)); + if (machine != null) { + machine.addMachineEventHandler(clazz, IEventHandler.of(listener)); + } else { + GroovyLog.get().error("Could not find machine `" + machineRegistryName + "`!"); + } + }); + } } private static class DummyMachine extends GroovyMachine { @@ -201,12 +212,12 @@ public DummyMachine() { @Override public void onReload() { - Plugin.onReload(); + GroovyScriptPlugin.onReload(); } @Override public void afterScriptLoad() { - Plugin.afterScriptRun(); + GroovyScriptPlugin.afterScriptRun(); } @Override @@ -214,4 +225,4 @@ public GroovyRecipe recipeBuilder(String name) { throw new UnsupportedOperationException(); } } - } +} From 71de42e368b072b3d6af3c5b731848cf851becc9 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Wed, 27 Mar 2024 16:10:44 +0100 Subject: [PATCH 04/17] add magic methods to recipe builder --- .../groovyscript/GroovyRecipe.java | 211 ++++++++++++++++++ 1 file changed, 211 insertions(+) diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java index bb0962fa..6c90fc09 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java @@ -1,16 +1,22 @@ package github.kasuminova.mmce.common.integration.groovyscript; +import WayofTime.bloodmagic.soul.EnumDemonWillType; import com.cleanroommc.groovyscript.api.GroovyLog; import com.cleanroommc.groovyscript.api.IIngredient; +import com.cleanroommc.groovyscript.helper.EnumHelper; import com.cleanroommc.groovyscript.helper.ingredient.IngredientHelper; import com.cleanroommc.groovyscript.helper.ingredient.OreDictIngredient; import com.cleanroommc.groovyscript.helper.recipe.RecipeName; import com.cleanroommc.groovyscript.sandbox.ClosureHelper; +import de.ellpeck.naturesaura.api.NaturesAuraAPI; +import de.ellpeck.naturesaura.api.aura.type.IAuraType; import github.kasuminova.mmce.common.event.Phase; import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.*; import github.kasuminova.mmce.common.util.concurrent.Action; import groovy.lang.Closure; +import hellfirepvp.astralsorcery.common.constellation.ConstellationRegistry; +import hellfirepvp.astralsorcery.common.constellation.IConstellation; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.common.base.Mods; import hellfirepvp.modularmachinery.common.crafting.PreparedRecipe; @@ -20,6 +26,7 @@ import hellfirepvp.modularmachinery.common.crafting.requirement.*; import hellfirepvp.modularmachinery.common.data.Config; import hellfirepvp.modularmachinery.common.integration.crafttweaker.IngredientArrayPrimer; +import hellfirepvp.modularmachinery.common.integration.crafttweaker.RecipePrimer; import hellfirepvp.modularmachinery.common.lib.RequirementTypesMM; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; import hellfirepvp.modularmachinery.common.machine.IOType; @@ -27,12 +34,15 @@ import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; import hellfirepvp.modularmachinery.common.util.SmartInterfaceType; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import kport.modularmagic.common.crafting.requirement.*; +import kport.modularmagic.common.integration.jei.ingredient.Aura; import mekanism.api.gas.GasStack; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.Optional; +import thaumcraft.api.aspects.Aspect; import java.util.ArrayList; import java.util.Arrays; @@ -746,6 +756,207 @@ public void appendComponent(ComponentRequirement component) { this.lastComponent = component; } + //---------------------------------------------------------------------------------------------- + // magic + //---------------------------------------------------------------------------------------------- + + public GroovyRecipe aspectInput(String aspectString, int amount) { + Aspect aspect = Aspect.getAspect(aspectString); + if (aspect != null) + appendComponent(new RequirementAspect(IOType.INPUT, amount, aspect)); + else + GroovyLog.get().error("Invalid aspect name : " + aspectString); + + return this; + } + + public GroovyRecipe aspectOutput(String aspectString, int amount) { + Aspect aspect = Aspect.getAspect(aspectString); + if (aspect != null) + appendComponent(new RequirementAspect(IOType.OUTPUT, amount, aspect)); + else + GroovyLog.get().error("Invalid aspect name : " + aspectString); + + return this; + } + + public GroovyRecipe auraInput(String auraType, int amount) { + IAuraType aura = NaturesAuraAPI.AURA_TYPES.get(new ResourceLocation("naturesaura", auraType)); + if (aura != null) + appendComponent(new RequirementAura(IOType.INPUT, new Aura(amount, aura), Integer.MAX_VALUE, Integer.MIN_VALUE)); + else + GroovyLog.get().error("Invalid aura name : " + auraType); + + return this; + } + + public GroovyRecipe auraOutput(String auraType, int amount) { + IAuraType aura = NaturesAuraAPI.AURA_TYPES.get(new ResourceLocation("naturesaura", auraType)); + if (aura != null) + appendComponent(new RequirementAura(IOType.OUTPUT, new Aura(amount, aura), Integer.MAX_VALUE, Integer.MIN_VALUE)); + else + GroovyLog.get().error("Invalid aura name : " + auraType); + + return this; + } + + public GroovyRecipe auraInput(String auraType, int amount, int max, int min) { + IAuraType aura = NaturesAuraAPI.AURA_TYPES.get(new ResourceLocation("naturesaura", auraType)); + if (aura != null) + appendComponent(new RequirementAura(IOType.INPUT, new Aura(amount, aura), max, min)); + else + GroovyLog.get().error("Invalid aura name : " + auraType); + + return this; + } + + public GroovyRecipe auraOutput(String auraType, int amount, int max, int min) { + IAuraType aura = NaturesAuraAPI.AURA_TYPES.get(new ResourceLocation("naturesaura", auraType)); + if (aura != null) + appendComponent(new RequirementAura(IOType.OUTPUT, new Aura(amount, aura), max, min)); + else + GroovyLog.get().error("Invalid aura name : " + auraType); + + return this; + } + + public GroovyRecipe constellationInput(String constellationString) { + IConstellation constellation = ConstellationRegistry.getConstellationByName("astralsorcery.constellation." + constellationString); + if (constellation != null) + appendComponent(new RequirementConstellation(IOType.INPUT, constellation)); + else + GroovyLog.get().error("Invalid constellation : " + constellationString); + + return this; + } + + public GroovyRecipe gridPowerInput(int amount) { + if (amount > 0) + appendComponent(new RequirementGrid(IOType.INPUT, amount)); + else + GroovyLog.get().error("Invalid Grid Power amount : " + amount + " (need to be positive and not null)"); + + return this; + } + + public GroovyRecipe gridPowerOutput(int amount) { + if (amount > 0) + appendComponent(new RequirementGrid(IOType.OUTPUT, amount)); + else + GroovyLog.get().error("Invalid Grid Power amount : " + amount + " (need to be positive and not null)"); + + return this; + } + + public GroovyRecipe rainbowInput(RecipePrimer primer) { + appendComponent(new RequirementRainbow()); + return this; + } + + public GroovyRecipe lifeEssenceInput(int amount, boolean perTick) { + if (amount > 0) + appendComponent(new RequirementLifeEssence(IOType.INPUT, amount, perTick)); + else + GroovyLog.get().error("Invalid Life Essence amount : " + amount + " (need to be positive and not null)"); + + return this; + } + + public GroovyRecipe lifeEssenceOutput(int amount, boolean perTick) { + if (amount > 0) + appendComponent(new RequirementLifeEssence(IOType.OUTPUT, amount, perTick)); + else + GroovyLog.get().error("Invalid Life Essence amount : " + amount + " (need to be positive and not null)"); + + return this; + } + + public GroovyRecipe starlightInput(float amount) { + if (amount > 0) + appendComponent(new RequirementStarlight(IOType.INPUT, amount)); + else + GroovyLog.get().error("Invalid Starlight amount : " + amount + " (need to be positive and not null)"); + + return this; + } + + public GroovyRecipe starlightOutput(float amount) { + if (amount > 0) + appendComponent(new RequirementStarlight(IOType.OUTPUT, amount)); + else + GroovyLog.get().error("Invalid Starlight amount : " + amount + " (need to be positive and not null)"); + + return this; + } + + public GroovyRecipe willInput(String willTypeString, int amount) { + EnumDemonWillType willType = EnumHelper.valueOfNullable(EnumDemonWillType.class, willTypeString, false); + if (willType != null) + appendComponent(new RequirementWill(IOType.INPUT, amount, willType, Integer.MIN_VALUE, Integer.MAX_VALUE)); + else + GroovyLog.get().error("Invalid demon will type : " + willTypeString); + + return this; + } + + public GroovyRecipe willOutput(String willTypeString, int amount) { + EnumDemonWillType willType = EnumHelper.valueOfNullable(EnumDemonWillType.class, willTypeString, false); + if (willType != null) + appendComponent(new RequirementWill(IOType.OUTPUT, amount, willType, Integer.MIN_VALUE, Integer.MAX_VALUE)); + else + GroovyLog.get().error("Invalid demon will type : " + willTypeString); + + return this; + } + + public GroovyRecipe willInput(String willTypeString, int amount, int min, int max) { + EnumDemonWillType willType = EnumHelper.valueOfNullable(EnumDemonWillType.class, willTypeString, false); + if (willType != null) + appendComponent(new RequirementWill(IOType.INPUT, amount, willType, min, max)); + else + GroovyLog.get().error("Invalid demon will type : " + willTypeString); + + return this; + } + + public GroovyRecipe willOutput(String willTypeString, int amount, int min, int max) { + EnumDemonWillType willType = EnumHelper.valueOfNullable(EnumDemonWillType.class, willTypeString, false); + if (willType != null) + appendComponent(new RequirementWill(IOType.OUTPUT, amount, willType, min, max)); + else + GroovyLog.get().error("Invalid demon will type : " + willTypeString); + + return this; + } + + public GroovyRecipe manaInput(int amount, boolean perTick) { + if (amount > 0) + appendComponent(new RequirementMana(IOType.INPUT, amount, perTick)); + else + GroovyLog.get().error("Invalid Mana amount : " + amount + " (need to be positive and not null)"); + + return this; + } + + public GroovyRecipe manaOutput(int amount, boolean perTick) { + if (amount > 0) + appendComponent(new RequirementMana(IOType.OUTPUT, amount, perTick)); + else + GroovyLog.get().error("Invalid Mana amount : " + amount + " (need to be positive and not null)"); + + return this; + } + + public GroovyRecipe impetusInput(int amount) { + appendComponent(new RequirementImpetus(IOType.INPUT, amount)); + return this; + } + + public GroovyRecipe impetusOutput(int amount) { + appendComponent(new RequirementImpetus(IOType.OUTPUT, amount)); + return this; + } + //---------------------------------------------------------------------------------------------- // build //---------------------------------------------------------------------------------------------- From 5166a8c1c6000a898d7c640b6f8a393078f6c6c7 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Wed, 27 Mar 2024 16:11:39 +0100 Subject: [PATCH 05/17] custom multiblock via groovy --- .../groovyscript/BlockArrayBuilder.java | 271 +++++++++++++++ .../groovyscript/GroovyMachineBuilder.java | 322 ++++++++++++++++++ .../groovyscript/GroovyScriptPlugin.java | 10 + .../crafttweaker/BlockArrayBuilder.java | 2 + .../crafttweaker/MachineBuilder.java | 2 + .../crafttweaker/RecipeBuilder.java | 2 + .../crafttweaker/RecipePrimer.java | 2 + .../common/machine/AbstractMachine.java | 7 +- .../common/registry/RegistryBlocks.java | 28 +- 9 files changed, 634 insertions(+), 12 deletions(-) create mode 100644 src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java create mode 100644 src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java new file mode 100644 index 00000000..b26e6b51 --- /dev/null +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java @@ -0,0 +1,271 @@ +package github.kasuminova.mmce.common.integration.groovyscript; + +import com.cleanroommc.groovyscript.api.GroovyBlacklist; +import com.cleanroommc.groovyscript.api.GroovyLog; +import com.cleanroommc.groovyscript.helper.ingredient.NbtHelper; +import com.cleanroommc.groovyscript.sandbox.ClosureHelper; +import groovy.lang.Closure; +import hellfirepvp.modularmachinery.common.crafting.helper.ComponentSelectorTag; +import hellfirepvp.modularmachinery.common.machine.TaggedPositionBlockArray; +import hellfirepvp.modularmachinery.common.util.BlockArray; +import hellfirepvp.modularmachinery.common.util.IBlockStateDescriptor; +import it.unimi.dsi.fastutil.chars.Char2ObjectMap; +import it.unimi.dsi.fastutil.chars.Char2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.chars.CharArraySet; +import it.unimi.dsi.fastutil.chars.CharSet; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.math.BlockPos; + +import javax.annotation.Nullable; +import java.util.*; + +public class BlockArrayBuilder { + + protected TaggedPositionBlockArray blockArray; + private final List> tensor = new ArrayList<>(); + private final Char2ObjectMap charMap = new Char2ObjectOpenHashMap<>(); + private final Char2ObjectMap selectorTagMap = new Char2ObjectOpenHashMap<>(); + protected BlockArray.BlockInformation lastInformation = null; + protected char lastChar = Character.MIN_VALUE; + private char controllerChar = Character.MIN_VALUE; + + private static final BlockArray.BlockInformation CONTROLLER = new BlockArray.BlockInformation(Collections.emptyList()); + + public BlockArrayBuilder() { + this.charMap.put(' ', null); + } + + public static BlockArrayBuilder builder() { + return new BlockArrayBuilder(); + } + + public BlockArrayBuilder layer(String... row) { + this.tensor.add(Arrays.asList(row)); + return this; + } + + public BlockArrayBuilder layer(List row) { + this.tensor.add(row); + return this; + } + + @GroovyBlacklist + public BlockArrayBuilder where(String c, Runnable func) { + // groovy doesn't have char literals + if (c.length() != 1) { + throw new IllegalArgumentException("Argument in `where()` must have exactly one character!"); + } + func.run(); + return this; + } + + public BlockArrayBuilder whereAny(String c) { + return where(c, () -> { + this.lastInformation = null; + this.lastChar = c.charAt(0); + this.charMap.put(this.lastChar, null); + }); + } + + public BlockArrayBuilder whereAir(String c) { + return where(c, Blocks.AIR.getDefaultState()); + } + + public BlockArrayBuilder whereController(String c) { + if (this.controllerChar != Character.MIN_VALUE) { + GroovyLog.get().exception(new IllegalStateException("Controller is already assigned!")); + return this; + } + return where(c, () -> { + this.lastInformation = CONTROLLER; + this.lastChar = c.charAt(0); + this.controllerChar = this.lastChar; + this.charMap.put(this.lastChar, CONTROLLER); + }); + } + + public BlockArrayBuilder where(String c, IBlockState blockStates) { + return where(c, blockStates, null, null, null); + } + + public BlockArrayBuilder where(String c, IBlockState blockStates, @Nullable Map nbt) { + return where(c, blockStates, nbt, nbt, null); + } + + public BlockArrayBuilder where(String c, IBlockState blockStates, @Nullable Map nbt, + @Nullable Map previewNBT) { + return where(c, blockStates, nbt, previewNBT, null); + } + + public BlockArrayBuilder where(String c, IBlockState blockStates, @Nullable Map nbt, + Closure checker) { + return where(c, blockStates, nbt, nbt, checker); + } + + public BlockArrayBuilder where(String c, IBlockState blockStates, @Nullable Map nbt, + @Nullable Map previewNBT, Closure checker) { + return where(c, Collections.singletonList(blockStates), nbt, previewNBT, checker); + } + + public BlockArrayBuilder where(String c, Iterable blockStates) { + return where(c, blockStates, null, null, null); + } + + public BlockArrayBuilder where(String c, Iterable blockStates, @Nullable Map nbt) { + return where(c, blockStates, nbt, nbt, null); + } + + public BlockArrayBuilder where(String c, Iterable blockStates, @Nullable Map nbt, + @Nullable Map previewNBT) { + return where(c, blockStates, nbt, previewNBT, null); + } + + public BlockArrayBuilder where(String c, Iterable blockStates, @Nullable Map nbt, + Closure checker) { + return where(c, blockStates, nbt, nbt, checker); + } + + public BlockArrayBuilder where(String c, Iterable blockStates, @Nullable Map nbt, + @Nullable Map previewNBT, Closure checker) { + return where(c, () -> { + List stateDescriptorList = new ArrayList<>(); + for (IBlockState blockState : blockStates) { + stateDescriptorList.add(new IBlockStateDescriptor(blockState)); + } + this.lastInformation = new BlockArray.BlockInformation(stateDescriptorList); + this.lastChar = c.charAt(0); + this.charMap.put(this.lastChar, this.lastInformation); + if (nbt != null) nbt(nbt); + if (previewNBT != null) previewNbt(previewNBT); + if (checker != null) blockChecker(checker); + }); + } + + public BlockArrayBuilder nbt(Map tag) { + return nbt(NbtHelper.ofMap(tag)); + } + + public BlockArrayBuilder nbt(NBTTagCompound tag) { + if (lastInformation != null) { + lastInformation.setMatchingTag(tag); + if (lastInformation.getPreviewTag() == null) { + lastInformation.setPreviewTag(tag); + } + } + return this; + } + + public BlockArrayBuilder previewNbt(Map data) { + return previewNbt(NbtHelper.ofMap(data)); + } + + public BlockArrayBuilder previewNbt(NBTTagCompound data) { + if (lastInformation != null) { + lastInformation.setPreviewTag(data); + } + return this; + } + + public BlockArrayBuilder blockChecker(Closure checker) { + if (lastInformation != null) { + lastInformation.nbtChecker = (world, pos, blockState, nbt) -> + ClosureHelper.call(true, checker, world, pos, blockState, nbt); + } + return this; + } + + public BlockArrayBuilder tag(String tag) { + if (lastInformation != null && this.lastChar != Character.MIN_VALUE) { + this.selectorTagMap.put(this.lastChar, new ComponentSelectorTag(tag)); + } + return this; + } + + private BlockPos validate() { + if (this.controllerChar == Character.MIN_VALUE) { + GroovyLog.get().exception(new IllegalStateException("Controller location must be defined!")); + return null; + } + GroovyLog.Msg msg = GroovyLog.msg("Error creating BlockArray").error(); + if (this.tensor.isEmpty()) { + msg.add("no block matrix defined").post(); + return null; + } + CharSet checkedChars = new CharArraySet(); + int foundController = 0; + int cx = 0, cy = 0, cz = 0; + int layerSize = this.tensor.get(0).size(); + for (int x = 0; x < this.tensor.size(); x++) { + List xLayer = this.tensor.get(x); + if (xLayer.isEmpty()) { + msg.add("Layer {} is empty. This is not right", x + 1); + } else if (xLayer.size() != layerSize) { + msg.add("Invalid x-layer size. Expected {}, but got {} at layer {}", layerSize, xLayer.size(), x + 1); + } + int rowSize = xLayer.get(0).length(); + for (int y = 0; y < xLayer.size(); y++) { + String yRow = xLayer.get(y); + if (yRow.isEmpty()) { + msg.add("Row {} in layer {} is empty. This is not right", y + 1, x + 1); + } else if (yRow.length() != rowSize) { + msg.add("Invalid x-layer size. Expected {}, but got {} at row {} in layer {}", layerSize, xLayer.size(), y + 1, x + 1); + } + for (int z = 0; z < yRow.length(); z++) { + char zChar = yRow.charAt(z); + if (!checkedChars.contains(zChar)) { + if (!this.charMap.containsKey(zChar)) { + msg.add("Found char '{}' at char {} in row {} in layer {}, but character was not found in map!", zChar, z + 1, y + 1, x + 1); + } + checkedChars.add(zChar); + } + if (zChar == this.controllerChar) { + cx = x; + cy = y; + cz = z; + foundController++; + } + } + } + } + if (foundController == 0) { + msg.add("No controller was found, but exactly 1 is required"); + } else if (foundController > 1) { + msg.add("{} controller were found, but exactly 1 is required"); + } + if (msg.postIfNotEmpty()) { + return null; + } + return new BlockPos(cx, cy, cz); + } + + public Object build() { + BlockPos controller = validate(); + if (controller == null) return null; + TaggedPositionBlockArray blockArray = this.blockArray != null ? this.blockArray : new TaggedPositionBlockArray(); + + for (int x = 0; x < this.tensor.size(); x++) { + List xLayer = this.tensor.get(x); + for (int y = 0; y < xLayer.size(); y++) { + String yRow = xLayer.get(y); + for (int z = 0; z < yRow.length(); z++) { + char zChar = yRow.charAt(z); + BlockArray.BlockInformation info = this.charMap.get(zChar); + if (info == null) continue; // null -> any allowed -> don't need to check + ComponentSelectorTag tag = this.selectorTagMap.get(zChar); + BlockPos pos = new BlockPos(x - controller.getX(), y - controller.getY(), z - controller.getZ()); + blockArray.addBlock(pos, info); + if (tag != null) { + blockArray.setTag(pos, tag); + } + onAddBlock(zChar, pos, info); + } + } + } + return blockArray; + } + + protected void onAddBlock(char c, BlockPos pos, BlockArray.BlockInformation info) { + } +} diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java new file mode 100644 index 00000000..b29376fa --- /dev/null +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java @@ -0,0 +1,322 @@ +package github.kasuminova.mmce.common.integration.groovyscript; + +import com.cleanroommc.groovyscript.GroovyScript; +import com.cleanroommc.groovyscript.api.GroovyLog; +import github.kasuminova.mmce.common.event.client.ControllerGUIRenderEvent; +import github.kasuminova.mmce.common.event.client.ControllerModelAnimationEvent; +import github.kasuminova.mmce.common.event.client.ControllerModelGetEvent; +import github.kasuminova.mmce.common.event.machine.*; +import groovy.lang.Closure; +import hellfirepvp.modularmachinery.ModularMachinery; +import hellfirepvp.modularmachinery.common.machine.DynamicMachine; +import hellfirepvp.modularmachinery.common.machine.RecipeFailureActions; +import hellfirepvp.modularmachinery.common.machine.TaggedPositionBlockArray; +import hellfirepvp.modularmachinery.common.machine.factory.FactoryRecipeThread; +import hellfirepvp.modularmachinery.common.modifier.MultiBlockModifierReplacement; +import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; +import hellfirepvp.modularmachinery.common.modifier.SingleBlockModifierReplacement; +import hellfirepvp.modularmachinery.common.util.BlockArray; +import hellfirepvp.modularmachinery.common.util.IBlockStateDescriptor; +import hellfirepvp.modularmachinery.common.util.SmartInterfaceType; +import it.unimi.dsi.fastutil.chars.Char2ObjectMap; +import it.unimi.dsi.fastutil.chars.Char2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.Optional; + +import java.util.*; + +public class GroovyMachineBuilder extends BlockArrayBuilder { + + public static final Map PRE_LOAD_MACHINES = new Object2ObjectOpenHashMap<>(); + + private final DynamicMachine machine; + private final Map> blockModifierMap = new Object2ObjectOpenHashMap<>(); + private final Char2ObjectMap> blockModifierCharMap = new Char2ObjectOpenHashMap<>(); + + public GroovyMachineBuilder(String registryName) { + this.machine = new DynamicMachine(registryName); + this.blockArray = this.machine.getPattern(); + color(0xFFFFFF); // config is read after grs preInit + } + + public static GroovyMachineBuilder builder(String registryName) { + return new GroovyMachineBuilder(registryName); + } + + /** + * 获取机械结构组成。 + */ + public TaggedPositionBlockArray getBlockArray() { + return blockArray; + } + + /** + * 设置此机械是否受并行控制器影响。 + */ + public GroovyMachineBuilder parallelizable(boolean isParallelizable) { + machine.setParallelizable(isParallelizable); + return this; + } + + /** + * 设置此机械的最大并行数。 + * + * @param maxParallelism 并行数 + */ + public GroovyMachineBuilder maxParallelism(int maxParallelism) { + machine.setMaxParallelism(maxParallelism); + return this; + } + + /** + * 设置此机械的内置并行数。 + * + * @param parallelism 内置并行数 + */ + public GroovyMachineBuilder internalParallelism(int parallelism) { + machine.setInternalParallelism(parallelism); + return this; + } + + public GroovyMachineBuilder blockModifier(int x, int y, int z, IBlockState blockStates, String description, RecipeModifier... modifiers) { + return blockModifier(x, y, z, Collections.singletonList(blockStates), description, modifiers); + } + + /** + * 添加单方块配方修改器。 + * + * @param x X + * @param y Y + * @param z Z + * @param blockStates BlockState + * @param description 描述 + * @param modifiers 修改器列表 + */ + public GroovyMachineBuilder blockModifier(int x, int y, int z, Iterable blockStates, String description, RecipeModifier... modifiers) { + List stateDescriptorList = new ArrayList<>(); + for (IBlockState blockState : blockStates) { + stateDescriptorList.add(new IBlockStateDescriptor(blockState)); + } + singleBlockModifier(new BlockPos(x, y, z), new BlockArray.BlockInformation(stateDescriptorList), description, modifiers); + return this; + } + + public GroovyMachineBuilder whereBlockModifier(String c, IBlockState blockStates, String description, RecipeModifier... modifiers) { + return whereBlockModifier(c, Collections.singletonList(blockStates), description, modifiers); + } + + public GroovyMachineBuilder whereBlockModifier(String c, Iterable blockStates, String description, RecipeModifier... modifiers) { + where(c, () -> { + List stateDescriptorList = new ArrayList<>(); + for (IBlockState blockState : blockStates) { + stateDescriptorList.add(new IBlockStateDescriptor(blockState)); + } + singleBlockModifier(c.charAt(0), new BlockArray.BlockInformation(stateDescriptorList), description, modifiers); + }); + return this; + } + + /** + * 添加多方块升级配方修改器。 + */ + public GroovyMachineBuilder multiBlockModifier(MultiBlockModifierReplacement multiBlockModifier) { + if (multiBlockModifier != null) { + machine.getMultiBlockModifiers().add(multiBlockModifier); + } + return this; + } + + /** + * 添加智能数据接口类型。 + * + * @param type 类型 + */ + public GroovyMachineBuilder smartInterfaceType(SmartInterfaceType type) { + if (!machine.hasSmartInterfaceType(type.getType())) { + machine.addSmartInterfaceType(type); + } else { + GroovyLog.get().warn("DynamicMachine `" + machine.getRegistryName() + "` is already has SmartInterfaceType `" + type.getType() + "`!"); + } + return this; + } + + /** + * 添加结构形成事件监听器。 + */ + public GroovyMachineBuilder structureFormedHandler(Closure function) { + machine.addMachineEventHandler(MachineStructureFormedEvent.class, IEventHandler.of(function)); + return this; + } + + /** + * 添加结构更新事件监听器。 + */ + public GroovyMachineBuilder structureUpdateHandler(Closure function) { + machine.addMachineEventHandler(MachineStructureUpdateEvent.class, IEventHandler.of(function)); + return this; + } + + /** + * 添加机器事件监听器。 + */ + public GroovyMachineBuilder tickHandler(Closure function) { + machine.addMachineEventHandler(MachineTickEvent.class, IEventHandler.of(function)); + return this; + } + + /** + * 添加控制器 GUI 渲染事件监听器。 + */ + public GroovyMachineBuilder guiRenderHandler(Closure function) { + if (FMLCommonHandler.instance().getSide().isServer()) { + return this; + } + machine.addMachineEventHandler(ControllerGUIRenderEvent.class, IEventHandler.of(function)); + return this; + } + + /** + * 添加控制器 GeckoLib 模型动画事件监听器。 + */ + @Optional.Method(modid = "geckolib3") + public GroovyMachineBuilder controllerModelAnimationHandler(Closure function) { + if (FMLCommonHandler.instance().getSide().isServer()) { + return this; + } + machine.addMachineEventHandler(ControllerModelAnimationEvent.class, IEventHandler.of(function)); + return this; + } + + /** + * 添加控制器 GeckoLib 模型获取事件监听器。 + */ + @Optional.Method(modid = "geckolib3") + public GroovyMachineBuilder controllerModelGetHandler(Closure function) { + if (FMLCommonHandler.instance().getSide().isServer()) { + return this; + } + machine.addMachineEventHandler(ControllerModelGetEvent.class, IEventHandler.of(function)); + return this; + } + + /** + * 添加智能数据接口更新事件监听器 + */ + public GroovyMachineBuilder smartInterfaceUpdateHandler(Closure function) { + machine.addMachineEventHandler(SmartInterfaceUpdateEvent.class, IEventHandler.of(function)); + return this; + } + + /** + * 控制器是否需要蓝图 + */ + public GroovyMachineBuilder requiresBlueprint(boolean requiresBlueprint) { + this.machine.setRequiresBlueprint(requiresBlueprint); + return this; + } + + /** + * 设置当此机器配方运行失败时的操作 + * + * @param failureAction Action 可以通过 RecipeFailureActions.getFailureAction(String key) 获得 + */ + public GroovyMachineBuilder failureAction(RecipeFailureActions failureAction) { + this.machine.setFailureAction(failureAction); + return this; + } + + /** + * 设置机械颜色,该结构内的其他组件也将会变为此颜色。 + * + * @param color 颜色,例如:0xFFFFFF + */ + public GroovyMachineBuilder color(int color) { + this.machine.setDefinedColor(color); + return this; + } + + /** + * 设置此机械是否有工厂形式的控制器。 + * + * @param hasFactory true 即为注册,false 即为不注册 + */ + public GroovyMachineBuilder hasFactory(boolean hasFactory) { + this.machine.setHasFactory(hasFactory); + return this; + } + + /** + * 设置此机械是否仅有工厂形式的控制器。 + * + * @param factoryOnly true 即为仅工厂,false 即为普通机械和工厂 + */ + public GroovyMachineBuilder factoryOnly(boolean factoryOnly) { + this.machine.setFactoryOnly(factoryOnly); + return this; + } + + /** + * 设置此机械的工厂最大线程数。 + * + * @param maxThreads 最大线程数 + */ + public GroovyMachineBuilder maxThreads(int maxThreads) { + this.machine.setMaxThreads(maxThreads); + return this; + } + + public GroovyMachineBuilder coreThread(FactoryRecipeThread thread) { + this.machine.addCoreThread(thread); + return this; + } + + /** + * 注册此机械。 + */ + public Object build() { + if(PRE_LOAD_MACHINES.containsKey(this.machine.getRegistryName())) { + throw new IllegalStateException("Machine with name " + this.machine.getRegistryName().getPath() + " already exists!"); + } + super.build(); + hellfirepvp.modularmachinery.common.integration.crafttweaker.MachineBuilder.WAIT_FOR_LOAD.add(this.machine); + PRE_LOAD_MACHINES.put(this.machine.getRegistryName(), this.machine); + return machine; + } + + @Override + protected void onAddBlock(char c, BlockPos pos, BlockArray.BlockInformation info) { + super.onAddBlock(c, pos, info); + List modifiers = this.blockModifierMap.get(pos); + if (modifiers != null) { + modifiers.forEach(modifier -> modifier.setPos(pos)); + this.machine.getModifiers().computeIfAbsent(pos, k -> new ArrayList<>()).addAll(modifiers); + } + modifiers = this.blockModifierCharMap.get(c); + if (modifiers != null) { + modifiers.forEach(modifier -> modifier.setPos(pos)); + this.machine.getModifiers().computeIfAbsent(pos, k -> new ArrayList<>()).addAll(modifiers); + } + } + + private void singleBlockModifier(BlockPos pos, BlockArray.BlockInformation information, String description, RecipeModifier... modifiers) { + this.lastInformation = information; + this.lastChar = Character.MIN_VALUE; + this.blockModifierMap.computeIfAbsent(pos, k -> new ArrayList<>()) + .add(new SingleBlockModifierReplacement(information, Arrays.asList(modifiers), description)); + } + + private void singleBlockModifier(char c, BlockArray.BlockInformation information, String description, RecipeModifier... modifiers) { + this.lastInformation = information; + this.lastChar = c; + this.blockModifierCharMap.computeIfAbsent(c, k -> new ArrayList<>()) + .add(new SingleBlockModifierReplacement(information, Arrays.asList(modifiers), description)); + } + + public DynamicMachine getMachine() { + return machine; + } +} diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java index 69e1ddab..a7375730 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java @@ -35,6 +35,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Map; @@ -68,6 +69,11 @@ public void onCompatLoaded(GroovyContainer container) { GroovyScriptPlugin.container = container; } + @Override + public @NotNull Collection getAliases() { + return Arrays.asList("modmach", "modular_machinery"); + } + private static void onReload() { MachineBuilder.WAIT_FOR_LOAD.clear(); @@ -202,6 +208,10 @@ public void machineEvent(String machineRegistryName, Class T prepareRegisterWithCustomName(T block) { return block; } - public static void writeAllCustomControllerModels() throws IOException { + public static void writeAllCustomControllerModels(String basePath) throws IOException { IResourceManager resourceManager = Minecraft.getMinecraft().getResourceManager(); for (BlockController controller : BlockController.MACHINE_CONTROLLERS.values()) { - writeMachineControllerModelInternal(resourceManager, controller); + writeMachineControllerModelInternal(basePath, resourceManager, controller); } for (BlockFactoryController controller : BlockFactoryController.FACTORY_CONTROLLERS.values()) { - writeFactoryControllerModelInternal(resourceManager, controller); + writeFactoryControllerModelInternal(basePath, resourceManager, controller); } } - private static void writeMachineControllerModelInternal(IResourceManager resourceManager, BlockController controller) throws IOException { + private static void writeMachineControllerModelInternal(String basePath, IResourceManager resourceManager, BlockController controller) throws IOException { IResource blockStateResource = resourceManager.getResource( new ResourceLocation(ModularMachinery.MODID, "blockstates/block_machine_controller.json")); - File blockStateFile = new File("resources/modularmachinery/blockstates/" + controller.getRegistryName().getPath() + ".json"); + File blockStateFile = new File(basePath, "modularmachinery/blockstates/" + controller.getRegistryName().getPath() + ".json"); if (blockStateFile.exists()) { return; } @@ -407,11 +417,11 @@ private static void writeMachineControllerModelInternal(IResourceManager resourc fileOutputStream.close(); } - private static void writeFactoryControllerModelInternal(IResourceManager resourceManager, BlockFactoryController controller) throws IOException { + private static void writeFactoryControllerModelInternal(String basePath, IResourceManager resourceManager, BlockFactoryController controller) throws IOException { IResource blockStateResource = resourceManager.getResource( new ResourceLocation(ModularMachinery.MODID, "blockstates/block_factory_controller.json")); - File blockStateFile = new File("resources/modularmachinery/blockstates/" + controller.getRegistryName().getPath() + ".json"); + File blockStateFile = new File(basePath, "modularmachinery/blockstates/" + controller.getRegistryName().getPath() + ".json"); if (blockStateFile.exists()) { return; } From 3eb334072a98cbe7b3e6a9a567c49261fc4ee4d0 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Wed, 27 Mar 2024 18:01:03 +0100 Subject: [PATCH 06/17] fixes & machine builder event --- .../groovyscript/BlockArrayBuilder.java | 86 +++++++++-- .../groovyscript/GroovyMachineBuilder.java | 119 ++++----------- .../groovyscript/GroovyScriptPlugin.java | 4 +- .../groovyscript/MachineBuilderEvent.java | 138 ++++++++++++++++++ .../modularmachinery/common/CommonProxy.java | 9 ++ 5 files changed, 251 insertions(+), 105 deletions(-) create mode 100644 src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderEvent.java diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java index b26e6b51..2cf08af7 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java @@ -6,13 +6,17 @@ import com.cleanroommc.groovyscript.sandbox.ClosureHelper; import groovy.lang.Closure; import hellfirepvp.modularmachinery.common.crafting.helper.ComponentSelectorTag; +import hellfirepvp.modularmachinery.common.machine.DynamicMachine; import hellfirepvp.modularmachinery.common.machine.TaggedPositionBlockArray; +import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; +import hellfirepvp.modularmachinery.common.modifier.SingleBlockModifierReplacement; import hellfirepvp.modularmachinery.common.util.BlockArray; import hellfirepvp.modularmachinery.common.util.IBlockStateDescriptor; import it.unimi.dsi.fastutil.chars.Char2ObjectMap; import it.unimi.dsi.fastutil.chars.Char2ObjectOpenHashMap; import it.unimi.dsi.fastutil.chars.CharArraySet; import it.unimi.dsi.fastutil.chars.CharSet; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; @@ -23,24 +27,25 @@ public class BlockArrayBuilder { - protected TaggedPositionBlockArray blockArray; + private final DynamicMachine machine; + private final TaggedPositionBlockArray blockArray; private final List> tensor = new ArrayList<>(); private final Char2ObjectMap charMap = new Char2ObjectOpenHashMap<>(); private final Char2ObjectMap selectorTagMap = new Char2ObjectOpenHashMap<>(); + private final Map> blockModifierMap = new Object2ObjectOpenHashMap<>(); + private final Char2ObjectMap> blockModifierCharMap = new Char2ObjectOpenHashMap<>(); protected BlockArray.BlockInformation lastInformation = null; protected char lastChar = Character.MIN_VALUE; private char controllerChar = Character.MIN_VALUE; private static final BlockArray.BlockInformation CONTROLLER = new BlockArray.BlockInformation(Collections.emptyList()); - public BlockArrayBuilder() { + public BlockArrayBuilder(DynamicMachine machine) { + this.machine = machine; + this.blockArray = machine.getPattern(); this.charMap.put(' ', null); } - public static BlockArrayBuilder builder() { - return new BlockArrayBuilder(); - } - public BlockArrayBuilder layer(String... row) { this.tensor.add(Arrays.asList(row)); return this; @@ -143,6 +148,58 @@ public BlockArrayBuilder where(String c, Iterable blockStates, @Nul }); } + public BlockArrayBuilder blockModifier(int x, int y, int z, IBlockState blockStates, String description, RecipeModifier... modifiers) { + return blockModifier(x, y, z, Collections.singletonList(blockStates), description, modifiers); + } + + /** + * 添加单方块配方修改器。 + * + * @param x X + * @param y Y + * @param z Z + * @param blockStates BlockState + * @param description 描述 + * @param modifiers 修改器列表 + */ + public BlockArrayBuilder blockModifier(int x, int y, int z, Iterable blockStates, String description, RecipeModifier... modifiers) { + List stateDescriptorList = new ArrayList<>(); + for (IBlockState blockState : blockStates) { + stateDescriptorList.add(new IBlockStateDescriptor(blockState)); + } + singleBlockModifier(new BlockPos(x, y, z), new BlockArray.BlockInformation(stateDescriptorList), description, modifiers); + return this; + } + + public BlockArrayBuilder whereBlockModifier(String c, IBlockState blockStates, String description, RecipeModifier... modifiers) { + return whereBlockModifier(c, Collections.singletonList(blockStates), description, modifiers); + } + + public BlockArrayBuilder whereBlockModifier(String c, Iterable blockStates, String description, RecipeModifier... modifiers) { + where(c, () -> { + List stateDescriptorList = new ArrayList<>(); + for (IBlockState blockState : blockStates) { + stateDescriptorList.add(new IBlockStateDescriptor(blockState)); + } + singleBlockModifier(c.charAt(0), new BlockArray.BlockInformation(stateDescriptorList), description, modifiers); + }); + return this; + } + + private void singleBlockModifier(BlockPos pos, BlockArray.BlockInformation information, String description, RecipeModifier... modifiers) { + this.lastInformation = information; + this.lastChar = Character.MIN_VALUE; + this.blockModifierMap.computeIfAbsent(pos, k -> new ArrayList<>()) + .add(new SingleBlockModifierReplacement(information, Arrays.asList(modifiers), description)); + } + + private void singleBlockModifier(char c, BlockArray.BlockInformation information, String description, RecipeModifier... modifiers) { + this.lastInformation = information; + this.lastChar = c; + this.blockModifierCharMap.computeIfAbsent(c, k -> new ArrayList<>()) + .add(new SingleBlockModifierReplacement(information, Arrays.asList(modifiers), description)); + } + public BlockArrayBuilder nbt(Map tag) { return nbt(NbtHelper.ofMap(tag)); } @@ -240,10 +297,9 @@ private BlockPos validate() { return new BlockPos(cx, cy, cz); } - public Object build() { + public TaggedPositionBlockArray build() { BlockPos controller = validate(); if (controller == null) return null; - TaggedPositionBlockArray blockArray = this.blockArray != null ? this.blockArray : new TaggedPositionBlockArray(); for (int x = 0; x < this.tensor.size(); x++) { List xLayer = this.tensor.get(x); @@ -259,13 +315,19 @@ public Object build() { if (tag != null) { blockArray.setTag(pos, tag); } - onAddBlock(zChar, pos, info); + List modifiers = this.blockModifierMap.get(pos); + if (modifiers != null) { + modifiers.forEach(modifier -> modifier.setPos(pos)); + this.machine.getModifiers().computeIfAbsent(pos, k -> new ArrayList<>()).addAll(modifiers); + } + modifiers = this.blockModifierCharMap.get(zChar); + if (modifiers != null) { + modifiers.forEach(modifier -> modifier.setPos(pos)); + this.machine.getModifiers().computeIfAbsent(pos, k -> new ArrayList<>()).addAll(modifiers); + } } } } return blockArray; } - - protected void onAddBlock(char c, BlockPos pos, BlockArray.BlockInformation info) { - } } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java index b29376fa..391977b2 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java @@ -1,45 +1,47 @@ package github.kasuminova.mmce.common.integration.groovyscript; -import com.cleanroommc.groovyscript.GroovyScript; +import com.cleanroommc.groovyscript.api.GroovyBlacklist; import com.cleanroommc.groovyscript.api.GroovyLog; +import com.cleanroommc.groovyscript.sandbox.ClosureHelper; import github.kasuminova.mmce.common.event.client.ControllerGUIRenderEvent; import github.kasuminova.mmce.common.event.client.ControllerModelAnimationEvent; import github.kasuminova.mmce.common.event.client.ControllerModelGetEvent; import github.kasuminova.mmce.common.event.machine.*; import groovy.lang.Closure; -import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; import hellfirepvp.modularmachinery.common.machine.RecipeFailureActions; -import hellfirepvp.modularmachinery.common.machine.TaggedPositionBlockArray; import hellfirepvp.modularmachinery.common.machine.factory.FactoryRecipeThread; import hellfirepvp.modularmachinery.common.modifier.MultiBlockModifierReplacement; -import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; -import hellfirepvp.modularmachinery.common.modifier.SingleBlockModifierReplacement; -import hellfirepvp.modularmachinery.common.util.BlockArray; -import hellfirepvp.modularmachinery.common.util.IBlockStateDescriptor; import hellfirepvp.modularmachinery.common.util.SmartInterfaceType; -import it.unimi.dsi.fastutil.chars.Char2ObjectMap; -import it.unimi.dsi.fastutil.chars.Char2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.block.state.IBlockState; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.Optional; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; -public class GroovyMachineBuilder extends BlockArrayBuilder { +public class GroovyMachineBuilder { public static final Map PRE_LOAD_MACHINES = new Object2ObjectOpenHashMap<>(); + private static final List PATTERNS = new ArrayList<>(); + + @GroovyBlacklist + public static void initPatterns() { + PATTERNS.forEach(builder -> { + BlockArrayBuilder blockArrayBuilder = new BlockArrayBuilder(builder.machine); + ClosureHelper.call(builder.pattern, blockArrayBuilder); + blockArrayBuilder.build(); + }); + PATTERNS.clear(); + } private final DynamicMachine machine; - private final Map> blockModifierMap = new Object2ObjectOpenHashMap<>(); - private final Char2ObjectMap> blockModifierCharMap = new Char2ObjectOpenHashMap<>(); + private Closure pattern; public GroovyMachineBuilder(String registryName) { this.machine = new DynamicMachine(registryName); - this.blockArray = this.machine.getPattern(); color(0xFFFFFF); // config is read after grs preInit } @@ -47,12 +49,6 @@ public static GroovyMachineBuilder builder(String registryName) { return new GroovyMachineBuilder(registryName); } - /** - * 获取机械结构组成。 - */ - public TaggedPositionBlockArray getBlockArray() { - return blockArray; - } /** * 设置此机械是否受并行控制器影响。 @@ -82,44 +78,6 @@ public GroovyMachineBuilder internalParallelism(int parallelism) { return this; } - public GroovyMachineBuilder blockModifier(int x, int y, int z, IBlockState blockStates, String description, RecipeModifier... modifiers) { - return blockModifier(x, y, z, Collections.singletonList(blockStates), description, modifiers); - } - - /** - * 添加单方块配方修改器。 - * - * @param x X - * @param y Y - * @param z Z - * @param blockStates BlockState - * @param description 描述 - * @param modifiers 修改器列表 - */ - public GroovyMachineBuilder blockModifier(int x, int y, int z, Iterable blockStates, String description, RecipeModifier... modifiers) { - List stateDescriptorList = new ArrayList<>(); - for (IBlockState blockState : blockStates) { - stateDescriptorList.add(new IBlockStateDescriptor(blockState)); - } - singleBlockModifier(new BlockPos(x, y, z), new BlockArray.BlockInformation(stateDescriptorList), description, modifiers); - return this; - } - - public GroovyMachineBuilder whereBlockModifier(String c, IBlockState blockStates, String description, RecipeModifier... modifiers) { - return whereBlockModifier(c, Collections.singletonList(blockStates), description, modifiers); - } - - public GroovyMachineBuilder whereBlockModifier(String c, Iterable blockStates, String description, RecipeModifier... modifiers) { - where(c, () -> { - List stateDescriptorList = new ArrayList<>(); - for (IBlockState blockState : blockStates) { - stateDescriptorList.add(new IBlockStateDescriptor(blockState)); - } - singleBlockModifier(c.charAt(0), new BlockArray.BlockInformation(stateDescriptorList), description, modifiers); - }); - return this; - } - /** * 添加多方块升级配方修改器。 */ @@ -274,48 +232,27 @@ public GroovyMachineBuilder coreThread(FactoryRecipeThread thread) { return this; } + public GroovyMachineBuilder pattern(Closure patternBuilder) { + this.pattern = patternBuilder; + return this; + } + /** * 注册此机械。 */ public Object build() { - if(PRE_LOAD_MACHINES.containsKey(this.machine.getRegistryName())) { + if (PRE_LOAD_MACHINES.containsKey(this.machine.getRegistryName())) { throw new IllegalStateException("Machine with name " + this.machine.getRegistryName().getPath() + " already exists!"); } - super.build(); + if (this.pattern == null) { + throw new IllegalStateException("Pattern is not defined!"); + } hellfirepvp.modularmachinery.common.integration.crafttweaker.MachineBuilder.WAIT_FOR_LOAD.add(this.machine); PRE_LOAD_MACHINES.put(this.machine.getRegistryName(), this.machine); + PATTERNS.add(this); return machine; } - @Override - protected void onAddBlock(char c, BlockPos pos, BlockArray.BlockInformation info) { - super.onAddBlock(c, pos, info); - List modifiers = this.blockModifierMap.get(pos); - if (modifiers != null) { - modifiers.forEach(modifier -> modifier.setPos(pos)); - this.machine.getModifiers().computeIfAbsent(pos, k -> new ArrayList<>()).addAll(modifiers); - } - modifiers = this.blockModifierCharMap.get(c); - if (modifiers != null) { - modifiers.forEach(modifier -> modifier.setPos(pos)); - this.machine.getModifiers().computeIfAbsent(pos, k -> new ArrayList<>()).addAll(modifiers); - } - } - - private void singleBlockModifier(BlockPos pos, BlockArray.BlockInformation information, String description, RecipeModifier... modifiers) { - this.lastInformation = information; - this.lastChar = Character.MIN_VALUE; - this.blockModifierMap.computeIfAbsent(pos, k -> new ArrayList<>()) - .add(new SingleBlockModifierReplacement(information, Arrays.asList(modifiers), description)); - } - - private void singleBlockModifier(char c, BlockArray.BlockInformation information, String description, RecipeModifier... modifiers) { - this.lastInformation = information; - this.lastChar = c; - this.blockModifierCharMap.computeIfAbsent(c, k -> new ArrayList<>()) - .add(new SingleBlockModifierReplacement(information, Arrays.asList(modifiers), description)); - } - public DynamicMachine getMachine() { return machine; } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java index a7375730..758eecb4 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java @@ -209,8 +209,8 @@ public void machineEvent(String machineRegistryName, Class listener) { + GroovyEventManager.INSTANCE.listen(MachineBuilderEvent.class, listener); } } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderEvent.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderEvent.java new file mode 100644 index 00000000..34dccf1f --- /dev/null +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderEvent.java @@ -0,0 +1,138 @@ +package github.kasuminova.mmce.common.integration.groovyscript; + +import com.cleanroommc.groovyscript.api.GroovyLog; +import com.cleanroommc.groovyscript.helper.EnumHelper; +import hellfirepvp.modularmachinery.common.block.BlockCasing; +import hellfirepvp.modularmachinery.common.block.prop.EnergyHatchData; +import hellfirepvp.modularmachinery.common.block.prop.FluidHatchSize; +import hellfirepvp.modularmachinery.common.block.prop.ItemBusSize; +import hellfirepvp.modularmachinery.common.lib.BlocksMM; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; +import net.minecraftforge.fml.common.eventhandler.Event; + +import javax.annotation.Nullable; + +public class MachineBuilderEvent extends Event { + + public GroovyMachineBuilder machineBuilder(String registryName) { + return new GroovyMachineBuilder(registryName); + } + + private IBlockState[] getBlockStates(Block block, int min, int max, @Nullable Block additional) { + int s = max - min; + if (additional != null) s++; + IBlockState[] states = new IBlockState[s]; + for (int i = min; i <= max; i++) { + states[i - min] = block.getStateFromMeta(i); + } + if (additional != null) states[s - 1] = additional.getDefaultState(); + return states; + } + + public IBlockState[] itemInputs(int min, int max, boolean allowME) { + return getBlockStates(BlocksMM.itemInputBus, min, max, allowME ? BlocksMM.meItemInputBus : null); + } + + public IBlockState[] itemInputs(boolean allowME) { + return itemInputs(0, ItemBusSize.values().length - 1, allowME); + } + + public IBlockState[] itemInputs() { + return itemInputs(true); + } + + public IBlockState[] itemInputs(int min, int max) { + return itemInputs(min, max, true); + } + + public IBlockState[] itemOutputs(int min, int max, boolean allowME) { + return getBlockStates(BlocksMM.itemOutputBus, min, max, allowME ? BlocksMM.meItemOutputBus : null); + } + + public IBlockState[] itemOutputs(boolean allowME) { + return itemOutputs(0, ItemBusSize.values().length - 1, allowME); + } + + public IBlockState[] itemOutputs() { + return itemOutputs(true); + } + + public IBlockState[] itemOutputs(int min, int max) { + return itemOutputs(min, max, true); + } + + public IBlockState[] fluidInputs(int min, int max, boolean allowME) { + return getBlockStates(BlocksMM.fluidInputHatch, min, max, allowME ? BlocksMM.meFluidInputBus : null); + } + + public IBlockState[] fluidInputs(boolean allowME) { + return fluidInputs(0, FluidHatchSize.values().length - 1, allowME); + } + + public IBlockState[] fluidInputs() { + return fluidInputs(true); + } + + public IBlockState[] fluidInputs(int min, int max) { + return fluidInputs(min, max, true); + } + + public IBlockState[] fluidOutputs(int min, int max, boolean allowME) { + return getBlockStates(BlocksMM.fluidOutputHatch, min, max, allowME ? BlocksMM.meFluidOutputBus : null); + } + + public IBlockState[] fluidOutputs(boolean allowME) { + return fluidOutputs(0, FluidHatchSize.values().length - 1, allowME); + } + + public IBlockState[] fluidOutputs() { + return fluidOutputs(true); + } + + public IBlockState[] fluidOutputs(int min, int max) { + return fluidOutputs(min, max, true); + } + + public IBlockState[] energyInputs(int min, int max) { + return getBlockStates(BlocksMM.energyInputHatch, min, max, null); + } + + public IBlockState[] energyInputs() { + return energyInputs(0, EnergyHatchData.values().length - 1); + } + + public IBlockState[] energyOutputs(int min, int max) { + return getBlockStates(BlocksMM.energyOutputHatch, min, max, null); + } + + public IBlockState[] energyOutputs() { + return energyOutputs(0, EnergyHatchData.values().length - 1); + } + + public IBlockState casing(String type) { + BlockCasing.CasingType casingType = EnumHelper.valueOfNullable(BlockCasing.CasingType.class, type, false); + if (casingType == null) { + GroovyLog.get().error("CasingType fot {} not found!", type); + return Blocks.BEDROCK.getDefaultState(); + } + return BlocksMM.blockCasing.getStateFromMeta(casingType.ordinal()); + } + + public IBlockState casing() { + return BlocksMM.blockCasing.getStateFromMeta(0); + } + + public IBlockState smartInterface() { + return BlocksMM.smartInterface.getDefaultState(); + } + + public IBlockState parallelController() { + return BlocksMM.smartInterface.getDefaultState(); + } + + public IBlockState upgradeBus() { + return BlocksMM.smartInterface.getDefaultState(); + } +} diff --git a/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java b/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java index 28687084..3ec3e38b 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java @@ -18,6 +18,8 @@ import github.kasuminova.mmce.common.handler.UpgradeEventHandler; import github.kasuminova.mmce.common.integration.ModIntegrationAE2; import github.kasuminova.mmce.common.integration.gregtech.ModIntegrationGTCEU; +import github.kasuminova.mmce.common.integration.groovyscript.GroovyMachineBuilder; +import github.kasuminova.mmce.common.integration.groovyscript.MachineBuilderEvent; import github.kasuminova.mmce.common.tile.MEFluidInputBus; import github.kasuminova.mmce.common.tile.MEFluidOutputBus; import github.kasuminova.mmce.common.tile.MEItemInputBus; @@ -126,6 +128,9 @@ public ItemStack createIcon() { } MachineRegistry.preloadMachines(); + if (Mods.GROOVYSCRIPT.isPresent()) { + MinecraftForge.EVENT_BUS.post(new MachineBuilderEvent()); + } CapabilityUpgrade.register(); @@ -153,6 +158,10 @@ public void init() { IntegrationTypeHelper.filterModIdComponents(); IntegrationTypeHelper.filterModIdRequirementTypes(); + if (Mods.GROOVYSCRIPT.isPresent()) { + // the patter requires all mod block to be loaded + GroovyMachineBuilder.initPatterns(); + } if (Mods.TOP.isPresent()) { ModIntegrationTOP.registerProvider(); ModularMachinery.log.info("[ModularMachinery-CE] TheOneProbe integration is enabled! Stop looking at the dark controller gui!"); From 86efd4165632a22945cb89e3b5f99e25ddc157c9 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Fri, 29 Mar 2024 13:00:28 +0100 Subject: [PATCH 07/17] update grs --- build.gradle.kts | 6 +- .../groovyscript/BlockArrayBuilder.java | 7 +-- .../groovyscript/GroovyMachine.java | 55 +++++++++++++++---- .../groovyscript/GroovyMachineBuilder.java | 52 ++---------------- .../groovyscript/GroovyMachineRecipes.java | 26 +++++++++ .../groovyscript/GroovyScriptPlugin.java | 39 ++++++++----- ...erEvent.java => MachineBuilderHelper.java} | 13 +++-- .../modularmachinery/common/CommonProxy.java | 8 +-- .../common/registry/RegistryBlocks.java | 8 +-- 9 files changed, 120 insertions(+), 94 deletions(-) create mode 100644 src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java rename src/main/java/github/kasuminova/mmce/common/integration/groovyscript/{MachineBuilderEvent.java => MachineBuilderHelper.java} (94%) diff --git a/build.gradle.kts b/build.gradle.kts index 0a8ca5c8..26080509 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -181,10 +181,10 @@ dependencies { compileOnlyApi("org.jetbrains:annotations:24.1.0") annotationProcessor("org.jetbrains:annotations:24.1.0") - api("com.cleanroommc:groovyscript:1.0.0-SNAPSHOT-d") { isTransitive = false } - implementation("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.+") + api("com.cleanroommc:groovyscript:1.0.1") { isTransitive = false } + compileOnly("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.+") implementation(rfg.deobf("curse.maven:had-enough-items-557549:4810661")) - implementation(rfg.deobf("curse.maven:zenutil-401178:5056679")) + compileOnly(rfg.deobf("curse.maven:zenutil-401178:5056679")) implementation(rfg.deobf("curse.maven:RedstoneFlux-270789:2920436")) implementation(rfg.deobf("curse.maven:CodeChickenLib-242818:2779848")) implementation(rfg.deobf("curse.maven:brandonscore-231382:3051539")) diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java index 2cf08af7..234d43f0 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java @@ -27,7 +27,7 @@ public class BlockArrayBuilder { - private final DynamicMachine machine; + protected final DynamicMachine machine; private final TaggedPositionBlockArray blockArray; private final List> tensor = new ArrayList<>(); private final Char2ObjectMap charMap = new Char2ObjectOpenHashMap<>(); @@ -297,9 +297,9 @@ private BlockPos validate() { return new BlockPos(cx, cy, cz); } - public TaggedPositionBlockArray build() { + public void build() { BlockPos controller = validate(); - if (controller == null) return null; + if (controller == null) return; for (int x = 0; x < this.tensor.size(); x++) { List xLayer = this.tensor.get(x); @@ -328,6 +328,5 @@ public TaggedPositionBlockArray build() { } } } - return blockArray; } } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java index 64366172..94f12cd7 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java @@ -1,26 +1,57 @@ package github.kasuminova.mmce.common.integration.groovyscript; -import com.cleanroommc.groovyscript.api.IScriptReloadable; -import com.cleanroommc.groovyscript.registry.NamedRegistry; +import com.cleanroommc.groovyscript.api.GroovyBlacklist; +import com.cleanroommc.groovyscript.api.GroovyLog; +import com.cleanroommc.groovyscript.sandbox.ClosureHelper; +import groovy.lang.Closure; +import hellfirepvp.modularmachinery.common.machine.DynamicMachine; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.util.ResourceLocation; -public class GroovyMachine extends NamedRegistry implements IScriptReloadable { +import java.util.ArrayList; +import java.util.List; +import java.util.Map; - private final ResourceLocation name; +@GroovyBlacklist +public class GroovyMachine { - public GroovyMachine(ResourceLocation name) { - this.name = name; + public static final Map PRE_LOAD_MACHINES = new Object2ObjectOpenHashMap<>(); + private static final List MACHINES = new ArrayList<>(); + + public static void init() { + MACHINES.forEach(GroovyMachine::build); } - @Override - public void onReload() { + public static void setMachineBuilder(String registryName, Closure buildFunction) { + for (GroovyMachine machine : MACHINES) { + if (machine.dynamicMachine.getRegistryName().getPath().equals(registryName)) { + machine.buildFunction = buildFunction; + break; + } + } } - @Override - public void afterScriptLoad() { + private final DynamicMachine dynamicMachine; + private Closure buildFunction; + + @GroovyBlacklist + public GroovyMachine(DynamicMachine dynamicMachine, Closure buildFunction) { + this.dynamicMachine = dynamicMachine; + this.buildFunction = buildFunction; + MACHINES.add(this); + PRE_LOAD_MACHINES.put(dynamicMachine.getRegistryName(), dynamicMachine); } - public GroovyRecipe recipeBuilder(String name) { - return new GroovyRecipe(this.name); + public void build() { + if (this.buildFunction == null) { + GroovyLog.get().error("Machine {} has no builder function!", this.dynamicMachine.getRegistryName().getPath()); + MACHINES.remove(this); + PRE_LOAD_MACHINES.remove(this.dynamicMachine.getRegistryName()); + return; + } + GroovyMachineBuilder builder = new GroovyMachineBuilder(this.dynamicMachine); + ClosureHelper.withEnvironment(this.buildFunction, new MachineBuilderHelper(builder), true); + ClosureHelper.call(this.buildFunction); + builder.build(); } } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java index 391977b2..96295234 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java @@ -2,7 +2,6 @@ import com.cleanroommc.groovyscript.api.GroovyBlacklist; import com.cleanroommc.groovyscript.api.GroovyLog; -import com.cleanroommc.groovyscript.sandbox.ClosureHelper; import github.kasuminova.mmce.common.event.client.ControllerGUIRenderEvent; import github.kasuminova.mmce.common.event.client.ControllerModelAnimationEvent; import github.kasuminova.mmce.common.event.client.ControllerModelGetEvent; @@ -13,43 +12,16 @@ import hellfirepvp.modularmachinery.common.machine.factory.FactoryRecipeThread; import hellfirepvp.modularmachinery.common.modifier.MultiBlockModifierReplacement; import hellfirepvp.modularmachinery.common.util.SmartInterfaceType; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.Optional; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +public class GroovyMachineBuilder extends BlockArrayBuilder { -public class GroovyMachineBuilder { - - public static final Map PRE_LOAD_MACHINES = new Object2ObjectOpenHashMap<>(); - private static final List PATTERNS = new ArrayList<>(); - - @GroovyBlacklist - public static void initPatterns() { - PATTERNS.forEach(builder -> { - BlockArrayBuilder blockArrayBuilder = new BlockArrayBuilder(builder.machine); - ClosureHelper.call(builder.pattern, blockArrayBuilder); - blockArrayBuilder.build(); - }); - PATTERNS.clear(); - } - - private final DynamicMachine machine; - private Closure pattern; - - public GroovyMachineBuilder(String registryName) { - this.machine = new DynamicMachine(registryName); + public GroovyMachineBuilder(DynamicMachine machine) { + super(machine); color(0xFFFFFF); // config is read after grs preInit } - public static GroovyMachineBuilder builder(String registryName) { - return new GroovyMachineBuilder(registryName); - } - - /** * 设置此机械是否受并行控制器影响。 */ @@ -232,25 +204,13 @@ public GroovyMachineBuilder coreThread(FactoryRecipeThread thread) { return this; } - public GroovyMachineBuilder pattern(Closure patternBuilder) { - this.pattern = patternBuilder; - return this; - } - /** * 注册此机械。 */ - public Object build() { - if (PRE_LOAD_MACHINES.containsKey(this.machine.getRegistryName())) { - throw new IllegalStateException("Machine with name " + this.machine.getRegistryName().getPath() + " already exists!"); - } - if (this.pattern == null) { - throw new IllegalStateException("Pattern is not defined!"); - } + @GroovyBlacklist + public void build() { + super.build(); hellfirepvp.modularmachinery.common.integration.crafttweaker.MachineBuilder.WAIT_FOR_LOAD.add(this.machine); - PRE_LOAD_MACHINES.put(this.machine.getRegistryName(), this.machine); - PATTERNS.add(this); - return machine; } public DynamicMachine getMachine() { diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java new file mode 100644 index 00000000..9a586452 --- /dev/null +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java @@ -0,0 +1,26 @@ +package github.kasuminova.mmce.common.integration.groovyscript; + +import com.cleanroommc.groovyscript.api.IScriptReloadable; +import com.cleanroommc.groovyscript.registry.NamedRegistry; +import net.minecraft.util.ResourceLocation; + +public class GroovyMachineRecipes extends NamedRegistry implements IScriptReloadable { + + private final ResourceLocation name; + + public GroovyMachineRecipes(ResourceLocation name) { + this.name = name; + } + + @Override + public void onReload() { + } + + @Override + public void afterScriptLoad() { + } + + public GroovyRecipe recipeBuilder(String name) { + return new GroovyRecipe(this.name); + } +} diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java index 758eecb4..7602f543 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java @@ -14,6 +14,7 @@ import github.kasuminova.mmce.common.event.machine.MachineEvent; import github.kasuminova.mmce.common.upgrade.registry.RegistryUpgrade; import groovy.lang.Closure; +import groovy.lang.DelegatesTo; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.client.ClientProxy; import hellfirepvp.modularmachinery.common.base.Mods; @@ -136,16 +137,16 @@ private static void afterScriptRun() { private static class Container extends ModPropertyContainer { - private final GroovyMachine dummy = new DummyMachine(); - private final Map machines = new Object2ObjectOpenHashMap<>(); - private final Map properties = new Object2ObjectOpenHashMap<>(); + private final GroovyMachineRecipes dummy = new DummyMachineRecipes(); + private final Map machines = new Object2ObjectOpenHashMap<>(); + private final Map properties = new Object2ObjectOpenHashMap<>(); - public GroovyMachine machine(ResourceLocation rl) { - GroovyMachine machine = this.machines.get(rl); + public GroovyMachineRecipes machine(ResourceLocation rl) { + GroovyMachineRecipes machine = this.machines.get(rl); if (machine == null) { DynamicMachine dynamicMachine = MachineRegistry.getRegistry().getMachine(rl); if (dynamicMachine != null) { - machine = new GroovyMachine(rl); + machine = new GroovyMachineRecipes(rl); this.machines.put(rl, machine); this.properties.put(rl.getPath(), machine); } @@ -153,11 +154,11 @@ public GroovyMachine machine(ResourceLocation rl) { return machine; } - public GroovyMachine machine(String mod, String name) { + public GroovyMachineRecipes machine(String mod, String name) { return machine(new ResourceLocation(mod, name)); } - public GroovyMachine machine(String name) { + public GroovyMachineRecipes machine(String name) { String mod; int i = name.indexOf(":"); if (i > 0) { @@ -181,7 +182,7 @@ public GroovyMachine machine(String name) { public Map getProperties() { for (DynamicMachine machine : MachineRegistry.getLoadedMachines()) { if (!this.machines.containsKey(machine.getRegistryName())) { - GroovyMachine groovyMachine = new GroovyMachine(machine.getRegistryName()); + GroovyMachineRecipes groovyMachine = new GroovyMachineRecipes(machine.getRegistryName()); this.machines.put(machine.getRegistryName(), groovyMachine); this.properties.put(machine.getRegistryName().getPath(), groovyMachine); } @@ -198,6 +199,18 @@ public Collection getRegistries() { return Collections.singleton(this.dummy); } + /*public void registerMachine(String registryName) { + registerMachine(registryName, null); + }*/ + + public void registerMachine(String registryName, @DelegatesTo(MachineBuilderHelper.class) Closure buildFunction) { + ResourceLocation rl = new ResourceLocation(ModularMachinery.MODID, registryName); + if (GroovyMachine.PRE_LOAD_MACHINES.containsKey(rl)) { + throw new IllegalStateException("Machine with name '" + registryName + "' already exists!"); + } + new GroovyMachine(new DynamicMachine(registryName), buildFunction); + } + public void machineEvent(String machineRegistryName, Class clazz, Closure listener) { GroovyEventManager.INSTANCE.listen(EventPriority.NORMAL, EventBusType.MAIN, clazz, event -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineRegistryName)); @@ -208,15 +221,11 @@ public void machineEvent(String machineRegistryName, Class listener) { - GroovyEventManager.INSTANCE.listen(MachineBuilderEvent.class, listener); - } } - private static class DummyMachine extends GroovyMachine { + private static class DummyMachineRecipes extends GroovyMachineRecipes { - public DummyMachine() { + public DummyMachineRecipes() { super(new ResourceLocation(ModularMachinery.MODID, "machine_name")); } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderEvent.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderHelper.java similarity index 94% rename from src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderEvent.java rename to src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderHelper.java index 34dccf1f..dcaf0a33 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderEvent.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderHelper.java @@ -10,14 +10,19 @@ import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; -import net.minecraftforge.fml.common.eventhandler.Event; import javax.annotation.Nullable; -public class MachineBuilderEvent extends Event { +public class MachineBuilderHelper { - public GroovyMachineBuilder machineBuilder(String registryName) { - return new GroovyMachineBuilder(registryName); + private final GroovyMachineBuilder builder; + + public MachineBuilderHelper(GroovyMachineBuilder builder) { + this.builder = builder; + } + + public GroovyMachineBuilder getBuilder() { + return builder; } private IBlockState[] getBlockStates(Block block, int min, int max, @Nullable Block additional) { diff --git a/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java b/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java index 3ec3e38b..3b471110 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java @@ -18,8 +18,7 @@ import github.kasuminova.mmce.common.handler.UpgradeEventHandler; import github.kasuminova.mmce.common.integration.ModIntegrationAE2; import github.kasuminova.mmce.common.integration.gregtech.ModIntegrationGTCEU; -import github.kasuminova.mmce.common.integration.groovyscript.GroovyMachineBuilder; -import github.kasuminova.mmce.common.integration.groovyscript.MachineBuilderEvent; +import github.kasuminova.mmce.common.integration.groovyscript.GroovyMachine; import github.kasuminova.mmce.common.tile.MEFluidInputBus; import github.kasuminova.mmce.common.tile.MEFluidOutputBus; import github.kasuminova.mmce.common.tile.MEItemInputBus; @@ -128,9 +127,6 @@ public ItemStack createIcon() { } MachineRegistry.preloadMachines(); - if (Mods.GROOVYSCRIPT.isPresent()) { - MinecraftForge.EVENT_BUS.post(new MachineBuilderEvent()); - } CapabilityUpgrade.register(); @@ -160,7 +156,7 @@ public void init() { if (Mods.GROOVYSCRIPT.isPresent()) { // the patter requires all mod block to be loaded - GroovyMachineBuilder.initPatterns(); + GroovyMachine.init(); } if (Mods.TOP.isPresent()) { ModIntegrationTOP.registerProvider(); diff --git a/src/main/java/hellfirepvp/modularmachinery/common/registry/RegistryBlocks.java b/src/main/java/hellfirepvp/modularmachinery/common/registry/RegistryBlocks.java index b697aeb0..a3fe0f95 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/registry/RegistryBlocks.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/registry/RegistryBlocks.java @@ -9,7 +9,7 @@ package hellfirepvp.modularmachinery.common.registry; import github.kasuminova.mmce.common.block.appeng.*; -import github.kasuminova.mmce.common.integration.groovyscript.GroovyMachineBuilder; +import github.kasuminova.mmce.common.integration.groovyscript.GroovyMachine; import github.kasuminova.mmce.common.tile.MEFluidInputBus; import github.kasuminova.mmce.common.tile.MEFluidOutputBus; import github.kasuminova.mmce.common.tile.MEItemInputBus; @@ -255,7 +255,7 @@ private static void registerTiles() { private static void registerExampleStatedMachineComponent() { registerStatedMachineComponent((BlockStatedMachineComponent) - new BlockStatedMachineComponent().setRegistryName("crushing_wheels")); + new BlockStatedMachineComponent().setRegistryName("crushing_wheels")); } private static void registerCustomStatedMachineComponent() { @@ -289,8 +289,8 @@ private static void registerCustomControllers() { waitForLoadMachines.add(builder.getMachine()); } MachineBuilder.PRE_LOAD_MACHINES.clear(); - waitForLoadMachines.addAll(GroovyMachineBuilder.PRE_LOAD_MACHINES.values()); - GroovyMachineBuilder.PRE_LOAD_MACHINES.clear(); + waitForLoadMachines.addAll(GroovyMachine.PRE_LOAD_MACHINES.values()); + GroovyMachine.PRE_LOAD_MACHINES.clear(); if (Config.mocCompatibleMode) { for (DynamicMachine machine : waitForLoadMachines) { From 8b116a5abad6b73191989a50065c6c8348986d6e Mon Sep 17 00:00:00 2001 From: brachy84 Date: Tue, 2 Jul 2024 21:41:07 +0200 Subject: [PATCH 08/17] update grs & fixes & improvements --- build.gradle.kts | 2 +- .../groovyscript/GroovyMachine.java | 9 +- .../groovyscript/GroovyMachineBuilder.java | 19 +-- .../groovyscript/GroovyMachineRecipes.java | 3 + .../groovyscript/GroovyScriptPlugin.java | 122 +++++++++--------- .../groovyscript/MachineBuilderHelper.java | 30 ++++- .../modularmachinery/common/CommonProxy.java | 4 + 7 files changed, 106 insertions(+), 83 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a52b2358..adf0c706 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -184,7 +184,7 @@ dependencies { compileOnlyApi("org.jetbrains:annotations:24.1.0") annotationProcessor("org.jetbrains:annotations:24.1.0") - api("com.cleanroommc:groovyscript:1.0.1") { isTransitive = false } + api("com.cleanroommc:groovyscript:1.1.0-hotfix1") { isTransitive = false } compileOnly("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.+") implementation(rfg.deobf("curse.maven:had-enough-items-557549:4810661")) compileOnly(rfg.deobf("curse.maven:zenutil-401178:5056679")) diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java index 94f12cd7..c5b3cc9c 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java @@ -4,6 +4,7 @@ import com.cleanroommc.groovyscript.api.GroovyLog; import com.cleanroommc.groovyscript.sandbox.ClosureHelper; import groovy.lang.Closure; +import hellfirepvp.modularmachinery.common.integration.crafttweaker.MachineBuilder; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.util.ResourceLocation; @@ -49,9 +50,11 @@ public void build() { PRE_LOAD_MACHINES.remove(this.dynamicMachine.getRegistryName()); return; } - GroovyMachineBuilder builder = new GroovyMachineBuilder(this.dynamicMachine); - ClosureHelper.withEnvironment(this.buildFunction, new MachineBuilderHelper(builder), true); + BlockArrayBuilder pattern = new BlockArrayBuilder(this.dynamicMachine); + GroovyMachineBuilder settings = new GroovyMachineBuilder(this.dynamicMachine); + ClosureHelper.withEnvironment(this.buildFunction, new MachineBuilderHelper(pattern, settings), true); ClosureHelper.call(this.buildFunction); - builder.build(); + pattern.build(); + MachineBuilder.WAIT_FOR_LOAD.add(this.dynamicMachine); } } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java index 96295234..fd256ef5 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java @@ -15,10 +15,12 @@ import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.Optional; -public class GroovyMachineBuilder extends BlockArrayBuilder { +public class GroovyMachineBuilder { + + protected final DynamicMachine machine; public GroovyMachineBuilder(DynamicMachine machine) { - super(machine); + this.machine = machine; color(0xFFFFFF); // config is read after grs preInit } @@ -190,9 +192,9 @@ public GroovyMachineBuilder factoryOnly(boolean factoryOnly) { } /** - * 设置此机械的工厂最大线程数。 + * 设置此机械的工厂最大线程数。 / Sets the maximum number of threads for this machine. * - * @param maxThreads 最大线程数 + * @param maxThreads 最大线程数 / Maximum number of threads */ public GroovyMachineBuilder maxThreads(int maxThreads) { this.machine.setMaxThreads(maxThreads); @@ -204,15 +206,6 @@ public GroovyMachineBuilder coreThread(FactoryRecipeThread thread) { return this; } - /** - * 注册此机械。 - */ - @GroovyBlacklist - public void build() { - super.build(); - hellfirepvp.modularmachinery.common.integration.crafttweaker.MachineBuilder.WAIT_FOR_LOAD.add(this.machine); - } - public DynamicMachine getMachine() { return machine; } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java index 9a586452..601a0ddb 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java @@ -1,7 +1,9 @@ package github.kasuminova.mmce.common.integration.groovyscript; import com.cleanroommc.groovyscript.api.IScriptReloadable; +import com.cleanroommc.groovyscript.helper.Alias; import com.cleanroommc.groovyscript.registry.NamedRegistry; +import com.google.common.base.CaseFormat; import net.minecraft.util.ResourceLocation; public class GroovyMachineRecipes extends NamedRegistry implements IScriptReloadable { @@ -9,6 +11,7 @@ public class GroovyMachineRecipes extends NamedRegistry implements IScriptReload private final ResourceLocation name; public GroovyMachineRecipes(ResourceLocation name) { + super(Alias.generateOf(name.getPath(), CaseFormat.LOWER_UNDERSCORE)); this.name = name; } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java index 7602f543..da3d63ba 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java @@ -1,12 +1,17 @@ package github.kasuminova.mmce.common.integration.groovyscript; +import com.cleanroommc.groovyscript.GroovyScript; +import com.cleanroommc.groovyscript.api.GroovyBlacklist; import com.cleanroommc.groovyscript.api.GroovyLog; import com.cleanroommc.groovyscript.api.GroovyPlugin; import com.cleanroommc.groovyscript.api.INamed; import com.cleanroommc.groovyscript.compat.mods.GroovyContainer; -import com.cleanroommc.groovyscript.compat.mods.ModPropertyContainer; +import com.cleanroommc.groovyscript.compat.mods.GroovyPropertyContainer; import com.cleanroommc.groovyscript.event.EventBusType; import com.cleanroommc.groovyscript.event.GroovyEventManager; +import com.cleanroommc.groovyscript.event.GroovyReloadEvent; +import com.cleanroommc.groovyscript.event.ScriptRunEvent; +import com.cleanroommc.groovyscript.sandbox.LoadStage; import github.kasuminova.mmce.client.model.DynamicMachineModelRegistry; import github.kasuminova.mmce.client.resource.GeoModelExternalLoader; import github.kasuminova.mmce.common.concurrent.RecipeCraftingContextPool; @@ -31,20 +36,21 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.Map; import java.util.concurrent.CompletableFuture; public class GroovyScriptPlugin implements GroovyPlugin { - private static GroovyContainer container; + private static GroovyContainer container; public static GroovyContainer getContainer() { return container; @@ -61,13 +67,15 @@ public static GroovyContainer getContainer() { } @Override - public @Nullable ModPropertyContainer createModPropertyContainer() { + public @Nullable GroovyPropertyContainer createGroovyPropertyContainer() { return new Container(); } @Override public void onCompatLoaded(GroovyContainer container) { - GroovyScriptPlugin.container = container; + //MinecraftForge.EVENT_BUS.register(container.get()); + MinecraftForge.EVENT_BUS.register(GroovyScriptPlugin.class); + GroovyScriptPlugin.container = (GroovyContainer) container; } @Override @@ -75,7 +83,12 @@ public void onCompatLoaded(GroovyContainer container) { return Arrays.asList("modmach", "modular_machinery"); } - private static void onReload() { + public static void initMachines() { + container.get().onScriptRun(null); // TODO GrS 1.1.1 + } + + @SubscribeEvent + public static void onReload(GroovyReloadEvent event) { MachineBuilder.WAIT_FOR_LOAD.clear(); RegistryUpgrade.clearAll(); @@ -98,9 +111,12 @@ private static void onReload() { MachineRegistry.preloadMachines(); // Reload All Machine MachineRegistry.reloadMachine(MachineRegistry.loadMachines(null)); + initMachines(); } - private static void afterScriptRun() { + @SubscribeEvent + public static void afterScriptRun(ScriptRunEvent.Post event) { + if (GroovyScript.getSandbox().getCurrentLoader() != LoadStage.POST_INIT) return; MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); boolean isServer = server != null && server.isDedicatedServer(); @@ -135,21 +151,50 @@ private static void afterScriptRun() { } } - private static class Container extends ModPropertyContainer { + private static class Container extends GroovyPropertyContainer { - private final GroovyMachineRecipes dummy = new DummyMachineRecipes(); private final Map machines = new Object2ObjectOpenHashMap<>(); - private final Map properties = new Object2ObjectOpenHashMap<>(); + + @GroovyBlacklist + //@SubscribeEvent TODO GrS 1.1.1 + public void onScriptRun(ScriptRunEvent.Pre event) { + for (DynamicMachine machine : MachineRegistry.getRegistry()) { + if (machine.getRegistryName().getNamespace().equals(ModularMachinery.MODID)) { + if (!getProperties().containsKey(machine.getRegistryName().getPath())) { + addProperty(new GroovyMachineRecipes(machine.getRegistryName())); + } + } + } + } + + private GroovyMachineRecipes findMachine(String name) { + INamed named = getProperties().get(name); + if (named instanceof GroovyMachineRecipes machine) { + return machine; + } + GroovyLog.get().error("Could not find modular machine with name '{}'!", name); + return null; + } public GroovyMachineRecipes machine(ResourceLocation rl) { + if (rl.getNamespace().equals(ModularMachinery.MODID)) { + return findMachine(rl.getPath()); + } + GroovyMachineRecipes machine = this.machines.get(rl); if (machine == null) { DynamicMachine dynamicMachine = MachineRegistry.getRegistry().getMachine(rl); if (dynamicMachine != null) { machine = new GroovyMachineRecipes(rl); this.machines.put(rl, machine); - this.properties.put(rl.getPath(), machine); } + } else if (MachineRegistry.getRegistry().getMachine(rl) == null) { + this.machines.remove(rl); + machine = null; + } + if (machine == null) { + GroovyLog.get().error("Could not find modular machine with name '{}'!", rl); + return null; } return machine; } @@ -164,41 +209,18 @@ public GroovyMachineRecipes machine(String name) { if (i > 0) { mod = name.substring(0, i); name = name.substring(i + 1); - } else if (i == 0) { - mod = ModularMachinery.MODID; - name = name.substring(1); - } else { - mod = ModularMachinery.MODID; + return machine(new ResourceLocation(mod, name)); } - return machine(new ResourceLocation(mod, name)); - } - - @Override - public @Nullable Object getProperty(String name) { - return machine(new ResourceLocation(ModularMachinery.MODID, name)); - } - - @Override - public Map getProperties() { - for (DynamicMachine machine : MachineRegistry.getLoadedMachines()) { - if (!this.machines.containsKey(machine.getRegistryName())) { - GroovyMachineRecipes groovyMachine = new GroovyMachineRecipes(machine.getRegistryName()); - this.machines.put(machine.getRegistryName(), groovyMachine); - this.properties.put(machine.getRegistryName().getPath(), groovyMachine); - } + if (i == 0) { + return findMachine(name.substring(1)); } - return Collections.unmodifiableMap(this.properties); + return findMachine(name); } - public Object getAt(String name) { + public GroovyMachineRecipes getAt(String name) { return machine(name); } - @Override - public Collection getRegistries() { - return Collections.singleton(this.dummy); - } - /*public void registerMachine(String registryName) { registerMachine(registryName, null); }*/ @@ -222,26 +244,4 @@ public void machineEvent(String machineRegistryName, Class allOf(IBlockState[]... blockStates) { + if (blockStates.length == 0) return Collections.emptyList(); + if (blockStates.length == 1) return Arrays.asList(blockStates[0]); + List newBlockStates = new ArrayList<>(); + for (IBlockState[] states : blockStates) { + Collections.addAll(newBlockStates, states); + } + return newBlockStates; + } + public IBlockState[] itemInputs(int min, int max, boolean allowME) { return getBlockStates(BlocksMM.itemInputBus, min, max, allowME ? BlocksMM.meItemInputBus : null); } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java b/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java index 2e479cfd..110b63c1 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java @@ -17,6 +17,7 @@ import github.kasuminova.mmce.common.integration.ModIntegrationAE2; import github.kasuminova.mmce.common.integration.gregtech.ModIntegrationGTCEU; import github.kasuminova.mmce.common.integration.groovyscript.GroovyMachine; +import github.kasuminova.mmce.common.integration.groovyscript.GroovyScriptPlugin; import github.kasuminova.mmce.common.tile.*; import github.kasuminova.mmce.common.util.concurrent.Action; import github.kasuminova.mmce.common.world.MMWorldEventListener; @@ -179,6 +180,9 @@ public void postInit() { action.doAction(); } FactoryRecipeThread.WAIT_FOR_ADD.clear(); + if (Mods.GROOVYSCRIPT.isPresent()) { + GroovyScriptPlugin.initMachines(); + } } public void loadComplete() { From cf1d786aedbe0f32f2bbb42a08dec0ed53e05856 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Tue, 2 Jul 2024 22:03:21 +0200 Subject: [PATCH 09/17] fix custom machine not forming --- .../mmce/common/integration/groovyscript/BlockArrayBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java index 234d43f0..ec7e273e 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java @@ -308,7 +308,7 @@ public void build() { for (int z = 0; z < yRow.length(); z++) { char zChar = yRow.charAt(z); BlockArray.BlockInformation info = this.charMap.get(zChar); - if (info == null) continue; // null -> any allowed -> don't need to check + if (info == null || info == CONTROLLER) continue; // null -> any allowed -> don't need to check; CONTROLLER -> don't need to check ComponentSelectorTag tag = this.selectorTagMap.get(zChar); BlockPos pos = new BlockPos(x - controller.getX(), y - controller.getY(), z - controller.getZ()); blockArray.addBlock(pos, info); From bcf814980b4dc852e196bb5fea9d401f28c42b8c Mon Sep 17 00:00:00 2001 From: brachy84 Date: Sun, 7 Jul 2024 18:34:41 +0200 Subject: [PATCH 10/17] update grs to 1.1.1 --- build.gradle.kts | 2 +- .../integration/groovyscript/GroovyScriptPlugin.java | 9 ++------- .../hellfirepvp/modularmachinery/common/CommonProxy.java | 4 ---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index adf0c706..92c61fa3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -184,7 +184,7 @@ dependencies { compileOnlyApi("org.jetbrains:annotations:24.1.0") annotationProcessor("org.jetbrains:annotations:24.1.0") - api("com.cleanroommc:groovyscript:1.1.0-hotfix1") { isTransitive = false } + api("com.cleanroommc:groovyscript:1.1.1") { isTransitive = false } compileOnly("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.+") implementation(rfg.deobf("curse.maven:had-enough-items-557549:4810661")) compileOnly(rfg.deobf("curse.maven:zenutil-401178:5056679")) diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java index da3d63ba..ed7d84ab 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java @@ -83,10 +83,6 @@ public void onCompatLoaded(GroovyContainer container) { return Arrays.asList("modmach", "modular_machinery"); } - public static void initMachines() { - container.get().onScriptRun(null); // TODO GrS 1.1.1 - } - @SubscribeEvent public static void onReload(GroovyReloadEvent event) { MachineBuilder.WAIT_FOR_LOAD.clear(); @@ -111,12 +107,11 @@ public static void onReload(GroovyReloadEvent event) { MachineRegistry.preloadMachines(); // Reload All Machine MachineRegistry.reloadMachine(MachineRegistry.loadMachines(null)); - initMachines(); } @SubscribeEvent public static void afterScriptRun(ScriptRunEvent.Post event) { - if (GroovyScript.getSandbox().getCurrentLoader() != LoadStage.POST_INIT) return; + if (event.getLoadStage() != LoadStage.POST_INIT) return; MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); boolean isServer = server != null && server.isDedicatedServer(); @@ -156,7 +151,7 @@ private static class Container extends GroovyPropertyContainer { private final Map machines = new Object2ObjectOpenHashMap<>(); @GroovyBlacklist - //@SubscribeEvent TODO GrS 1.1.1 + @SubscribeEvent public void onScriptRun(ScriptRunEvent.Pre event) { for (DynamicMachine machine : MachineRegistry.getRegistry()) { if (machine.getRegistryName().getNamespace().equals(ModularMachinery.MODID)) { diff --git a/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java b/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java index 110b63c1..2e479cfd 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java @@ -17,7 +17,6 @@ import github.kasuminova.mmce.common.integration.ModIntegrationAE2; import github.kasuminova.mmce.common.integration.gregtech.ModIntegrationGTCEU; import github.kasuminova.mmce.common.integration.groovyscript.GroovyMachine; -import github.kasuminova.mmce.common.integration.groovyscript.GroovyScriptPlugin; import github.kasuminova.mmce.common.tile.*; import github.kasuminova.mmce.common.util.concurrent.Action; import github.kasuminova.mmce.common.world.MMWorldEventListener; @@ -180,9 +179,6 @@ public void postInit() { action.doAction(); } FactoryRecipeThread.WAIT_FOR_ADD.clear(); - if (Mods.GROOVYSCRIPT.isPresent()) { - GroovyScriptPlugin.initMachines(); - } } public void loadComplete() { From 71a0d4e5809884da5586519b754b084418835c80 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Sun, 7 Jul 2024 19:37:19 +0200 Subject: [PATCH 11/17] unified logger --- .../mmce/common/integration/Logger.java | 64 +++++++++++++++++++ .../crafttweaker/BlockArrayBuilder.java | 10 +-- .../crafttweaker/IngredientArrayPrimer.java | 8 +-- .../crafttweaker/MachineBuilder.java | 8 +-- .../crafttweaker/MachineModifier.java | 26 ++++---- .../crafttweaker/RecipeAdapterBuilder.java | 4 +- .../crafttweaker/RecipeBuilder.java | 6 +- .../crafttweaker/RecipeModifierBuilder.java | 8 +-- .../crafttweaker/RecipePrimer.java | 56 ++++++++-------- .../crafttweaker/event/MMEvents.java | 20 +++--- .../modifier/MultiBlockModifierBuilder.java | 4 +- .../upgrade/DynamicMachineUpgradeBuilder.java | 12 ++-- .../upgrade/MachineUpgradeBuilder.java | 13 ++-- .../upgrade/MachineUpgradeHelper.java | 8 +-- 14 files changed, 156 insertions(+), 91 deletions(-) create mode 100644 src/main/java/github/kasuminova/mmce/common/integration/Logger.java diff --git a/src/main/java/github/kasuminova/mmce/common/integration/Logger.java b/src/main/java/github/kasuminova/mmce/common/integration/Logger.java new file mode 100644 index 00000000..2f85c7a6 --- /dev/null +++ b/src/main/java/github/kasuminova/mmce/common/integration/Logger.java @@ -0,0 +1,64 @@ +package github.kasuminova.mmce.common.integration; + +import com.cleanroommc.groovyscript.GroovyScript; +import com.cleanroommc.groovyscript.api.GroovyLog; +import crafttweaker.CraftTweakerAPI; +import hellfirepvp.modularmachinery.ModularMachinery; +import hellfirepvp.modularmachinery.common.base.Mods; +import org.apache.logging.log4j.message.ParameterizedMessage; + +public class Logger { + + private static final String CT_PREFIX = "[ModularMachinery] "; + private static final Object[] NO_ARGS = new Object[0]; + + private static boolean isGroovyScriptRunning() { + return Mods.GROOVYSCRIPT.isPresent() && GroovyScript.getSandbox().isRunning(); + } + + private static String formatMsg(String msg, Object... args) { + return args == null || args.length == 0 ? msg : new ParameterizedMessage(msg, args).getFormattedMessage(); + } + + public static void error(String msg) { + error(msg, NO_ARGS); + } + + public static void warn(String msg) { + warn(msg, NO_ARGS); + } + + public static void info(String msg) { + info(msg, NO_ARGS); + } + + public static void error(String msg, Object... args) { + if (isGroovyScriptRunning()) { + GroovyLog.get().error(msg, args); + } + if (Mods.CRAFTTWEAKER.isPresent()) { + CraftTweakerAPI.logError(CT_PREFIX + formatMsg(msg, args)); + } + ModularMachinery.log.error(msg, args); + } + + public static void warn(String msg, Object... args) { + if (isGroovyScriptRunning()) { + GroovyLog.get().warn(msg, args); + } + if (Mods.CRAFTTWEAKER.isPresent()) { + CraftTweakerAPI.logWarning(formatMsg(msg, args)); + } + ModularMachinery.log.warn(msg, args); + } + + public static void info(String msg, Object... args) { + if (isGroovyScriptRunning()) { + GroovyLog.get().info(msg, args); + } + if (Mods.CRAFTTWEAKER.isPresent()) { + CraftTweakerAPI.logInfo(formatMsg(msg, args)); + } + ModularMachinery.log.info(msg, args); + } +} diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/BlockArrayBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/BlockArrayBuilder.java index aaa5f095..46812d4a 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/BlockArrayBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/BlockArrayBuilder.java @@ -2,12 +2,12 @@ import com.cleanroommc.groovyscript.api.GroovyBlacklist; import com.google.gson.JsonParseException; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; import crafttweaker.api.block.IBlockState; import crafttweaker.api.data.IData; import crafttweaker.api.item.IItemStack; import crafttweaker.api.minecraft.CraftTweakerMC; +import github.kasuminova.mmce.common.integration.Logger; import hellfirepvp.modularmachinery.common.crafting.helper.ComponentSelectorTag; import hellfirepvp.modularmachinery.common.integration.crafttweaker.helper.AdvancedBlockCheckerCT; import hellfirepvp.modularmachinery.common.machine.TaggedPositionBlockArray; @@ -139,12 +139,12 @@ public BlockArrayBuilder addBlock(int x, int y, int z, IItemStack... ctItemStack net.minecraft.block.state.IBlockState state = block.getStateFromMeta(meta); stateDescriptorList.add(new IBlockStateDescriptor(state)); } catch (Exception e) { - CraftTweakerAPI.logError(String.format("[ModularMachinery] Failed to get BlockState from <%s>!", - stack.getItem().getRegistryName() + ":" + meta + Logger.error(String.format("[ModularMachinery] Failed to get BlockState from <%s>!", + stack.getItem().getRegistryName() + ":" + meta )); } } else { - CraftTweakerAPI.logError("[ModularMachinery] " + stack.getDisplayName() + " cannot convert to Block!"); + Logger.error("[ModularMachinery] " + stack.getDisplayName() + " cannot convert to Block!"); } } @@ -208,7 +208,7 @@ public BlockArrayBuilder addBlock(int x, int y, int z, String... blockNames) { try { stateDescriptorList.add(BlockArray.BlockInformation.getDescriptor(blockName)); } catch (JsonParseException e) { - CraftTweakerAPI.logError("[ModularMachinery] " + blockName + " is invalid block!", e); + Logger.error("[ModularMachinery] " + blockName + " is invalid block!", e); } } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/IngredientArrayPrimer.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/IngredientArrayPrimer.java index 59c34835..6aa0b8e3 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/IngredientArrayPrimer.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/IngredientArrayPrimer.java @@ -1,12 +1,12 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; import crafttweaker.api.item.IIngredient; import crafttweaker.api.item.IItemStack; import crafttweaker.api.item.IngredientStack; import crafttweaker.api.minecraft.CraftTweakerMC; import crafttweaker.api.oredict.IOreDictEntry; +import github.kasuminova.mmce.common.integration.Logger; import github.kasuminova.mmce.common.itemtype.ChancedIngredientStack; import hellfirepvp.modularmachinery.common.integration.crafttweaker.helper.AdvancedItemCheckerCT; import hellfirepvp.modularmachinery.common.integration.crafttweaker.helper.AdvancedItemModifierCT; @@ -27,7 +27,7 @@ public IngredientArrayPrimer addIngredient(IIngredient input) { if (input instanceof final IItemStack stackCT) { ItemStack stackMC = CraftTweakerMC.getItemStack(input); if (stackMC.isEmpty()) { - CraftTweakerAPI.logError("[ModularMachinery] ItemStack not found/unknown item: " + stackMC); + Logger.error("ItemStack not found/unknown item: " + stackMC); return this; } ChancedIngredientStack ingredientStack = new ChancedIngredientStack(stackMC); @@ -66,7 +66,7 @@ public IngredientArrayPrimer setMinMaxAmount(int min, int max) { lastIngredientStack.minCount = min; lastIngredientStack.maxCount = max; } else { - CraftTweakerAPI.logWarning("[ModularMachinery] `min` cannot larger than `max`!"); + Logger.warn("`min` cannot larger than `max`!"); } } return this; @@ -101,7 +101,7 @@ public IngredientArrayPrimer addItemModifier(AdvancedItemModifierCT modifier) { @ZenMethod @Deprecated public IngredientArrayPrimer build() { - CraftTweakerAPI.logWarning("[ModularMachinery] IngredientArrayPrimer#build is deprecated, it will be removed in future version."); + Logger.warn("IngredientArrayPrimer#build is deprecated, it will be removed in future version."); return this; } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineBuilder.java index 30a6ac4c..e87f6134 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineBuilder.java @@ -2,7 +2,6 @@ import com.cleanroommc.groovyscript.api.GroovyBlacklist; import com.google.gson.JsonParseException; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; import crafttweaker.api.block.IBlockState; import crafttweaker.api.data.IData; @@ -17,6 +16,7 @@ import github.kasuminova.mmce.common.event.machine.MachineStructureUpdateEvent; import github.kasuminova.mmce.common.event.machine.MachineTickEvent; import github.kasuminova.mmce.common.event.machine.SmartInterfaceUpdateEvent; +import github.kasuminova.mmce.common.integration.Logger; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.common.integration.crafttweaker.helper.AdvancedBlockCheckerCT; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; @@ -288,7 +288,7 @@ public MachineBuilder addSingleBlockModifier(int x, int y, int z, IItemStack ctI stateDescriptorList.add(new IBlockStateDescriptor(block)); addSingleBlockModifier(new BlockPos(x, y, z), new BlockArray.BlockInformation(stateDescriptorList), description, modifiers); } else { - CraftTweakerAPI.logError("[ModularMachinery] " + item.getDisplayName() + " cannot convert to Block!"); + Logger.error(item.getDisplayName() + " cannot convert to Block!"); } return this; @@ -312,7 +312,7 @@ public MachineBuilder addSingleBlockModifier(int x, int y, int z, String blockNa stateDescriptorList.add(BlockArray.BlockInformation.getDescriptor(blockName)); addSingleBlockModifier(new BlockPos(x, y, z), new BlockArray.BlockInformation(stateDescriptorList), description, modifiers); } catch (JsonParseException e) { - CraftTweakerAPI.logError("[ModularMachinery] " + blockName + " is invalid block!", e); + Logger.error(blockName + " is invalid block!", e); } return this; @@ -339,7 +339,7 @@ public MachineBuilder addSmartInterfaceType(SmartInterfaceType type) { if (!machine.hasSmartInterfaceType(type.getType())) { machine.addSmartInterfaceType(type); } else { - CraftTweakerAPI.logWarning("[ModularMachinery] DynamicMachine `" + machine.getRegistryName() + "` is already has SmartInterfaceType `" + type.getType() + "`!"); + Logger.warn("DynamicMachine `" + machine.getRegistryName() + "` is already has SmartInterfaceType `" + type.getType() + "`!"); } return this; } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineModifier.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineModifier.java index d54841da..01277b9b 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineModifier.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/MachineModifier.java @@ -1,9 +1,9 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; import github.kasuminova.mmce.client.model.DynamicMachineModelRegistry; import github.kasuminova.mmce.client.model.MachineControllerModel; +import github.kasuminova.mmce.common.integration.Logger; import github.kasuminova.mmce.common.util.concurrent.Action; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; @@ -28,13 +28,13 @@ public static void addSmartInterfaceType(String machineName, SmartInterfaceType WAIT_FOR_MODIFY.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineName)); if (machine == null) { - CraftTweakerAPI.logError("Could not find machine `" + machineName + "`!"); + Logger.error("Could not find machine `" + machineName + "`!"); return; } if (!machine.hasSmartInterfaceType(type.getType())) { machine.addSmartInterfaceType(type); } else { - CraftTweakerAPI.logWarning("[ModularMachinery] DynamicMachine `" + machine.getRegistryName() + "` is already has SmartInterfaceType `" + type.getType() + "`!"); + Logger.warn("DynamicMachine `" + machine.getRegistryName() + "` is already has SmartInterfaceType `" + type.getType() + "`!"); } }); } @@ -42,12 +42,12 @@ public static void addSmartInterfaceType(String machineName, SmartInterfaceType @ZenMethod public static void setMaxParallelism(String machineName, int maxParallelism) { if (maxParallelism < 1) { - CraftTweakerAPI.logError("Max Parallelism must larger than 1!"); + Logger.error("Max Parallelism must larger than 1!"); } WAIT_FOR_MODIFY.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineName)); if (machine == null) { - CraftTweakerAPI.logError("Could not find machine `" + machineName + "`!"); + Logger.error("Could not find machine `" + machineName + "`!"); return; } machine.setMaxParallelism(maxParallelism); @@ -57,12 +57,12 @@ public static void setMaxParallelism(String machineName, int maxParallelism) { @ZenMethod public static void setInternalParallelism(String machineName, int parallelism) { if (parallelism < 0) { - CraftTweakerAPI.logError("Max Parallelism must larger than 0!"); + Logger.error("Max Parallelism must larger than 0!"); } WAIT_FOR_MODIFY.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineName)); if (machine == null) { - CraftTweakerAPI.logError("Could not find machine `" + machineName + "`!"); + Logger.error("Could not find machine `" + machineName + "`!"); return; } machine.setInternalParallelism(parallelism); @@ -73,12 +73,12 @@ public static void setInternalParallelism(String machineName, int parallelism) { public static void setMaxThreads(String machineName, int maxThreads) { // Maybe the author only wanted to use the core thread? if (maxThreads < 0) { - CraftTweakerAPI.logError("Max Threads must larger than or equal 0!"); + Logger.error("Max Threads must larger than or equal 0!"); } WAIT_FOR_MODIFY.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineName)); if (machine == null) { - CraftTweakerAPI.logError("Could not find machine `" + machineName + "`!"); + Logger.error("Could not find machine `" + machineName + "`!"); return; } machine.setMaxThreads(maxThreads); @@ -90,7 +90,7 @@ public static void addCoreThread(String machineName, FactoryRecipeThread thread) WAIT_FOR_MODIFY.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineName)); if (machine == null) { - CraftTweakerAPI.logError("Could not find machine `" + machineName + "`!"); + Logger.error("Could not find machine `" + machineName + "`!"); return; } machine.addCoreThread(thread); @@ -106,13 +106,13 @@ public static void setMachineGeoModel(String machineName, String modelName) { WAIT_FOR_MODIFY.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineName)); if (machine == null) { - CraftTweakerAPI.logError("Could not find machine `" + machineName + "`!"); + Logger.error("Could not find machine `" + machineName + "`!"); return; } MachineControllerModel model = DynamicMachineModelRegistry.INSTANCE.getMachineModel(modelName); if (model == null) { - CraftTweakerAPI.logError("Could not find geo model `" + modelName + "`!"); + Logger.error("Could not find geo model `" + modelName + "`!"); return; } @@ -129,7 +129,7 @@ public static void setMachinePrefix(String machineName, String prefixName) { WAIT_FOR_MODIFY.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineName)); if (machine == null) { - CraftTweakerAPI.logError("Could not find machine `" + machineName + "`!"); + Logger.error("Could not find machine `" + machineName + "`!"); return; } machine.setPrefix(prefixName); diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeAdapterBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeAdapterBuilder.java index 3b19cd9e..07692576 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeAdapterBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeAdapterBuilder.java @@ -1,7 +1,7 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; +import github.kasuminova.mmce.common.integration.Logger; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.common.crafting.RecipeRegistry; import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; @@ -68,7 +68,7 @@ public void build() { //---------------------------------------------------------------------------------------------- @Override public RecipePrimer setParallelized(boolean isParallelized) { - CraftTweakerAPI.logWarning("[ModularMachinery] RecipeAdapterBuilder cannot set parallelized, it depends on the parent machine recipe!"); + Logger.warn("RecipeAdapterBuilder cannot set parallelized, it depends on the parent machine recipe!"); return this; } } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeBuilder.java index ab0f387c..83fb115e 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeBuilder.java @@ -9,8 +9,8 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker; import com.cleanroommc.groovyscript.api.GroovyBlacklist; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; +import github.kasuminova.mmce.common.integration.Logger; import hellfirepvp.modularmachinery.ModularMachinery; import net.minecraft.util.ResourceLocation; import stanhebben.zenscript.annotations.ZenClass; @@ -51,10 +51,10 @@ public static RecipePrimer newBuilder(String recipeRegistryName, String associat } if (!path.matches("[._\\-a-zA-Z][._\\-a-zA-Z0-9]*")) { - CraftTweakerAPI.logWarning("[ModularMachinery] Dangerous recipe registry name: " + path); + Logger.warn("Dangerous recipe registry name: " + path); } if (processingTickTime <= 0) { - CraftTweakerAPI.logWarning("[ModularMachinery] Recipe processing tick time has to be at least 1 tick!"); + Logger.warn("Recipe processing tick time has to be at least 1 tick!"); processingTickTime = 1; } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java index 58d7a3e6..1346e82e 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java @@ -1,7 +1,7 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; +import github.kasuminova.mmce.common.integration.Logger; import hellfirepvp.modularmachinery.common.crafting.requirement.type.RequirementType; import hellfirepvp.modularmachinery.common.lib.RegistriesMM; import hellfirepvp.modularmachinery.common.machine.IOType; @@ -69,7 +69,7 @@ public RecipeModifierBuilder isAffectChance(boolean affectChance) { public RecipeModifier build() { RequirementType target = RegistriesMM.REQUIREMENT_TYPE_REGISTRY.getValue(new ResourceLocation(type)); if (target == null) { - CraftTweakerAPI.logError("Could not find requirementType " + type + "!"); + Logger.error("Could not find requirementType " + type + "!"); return null; } IOType ioType; @@ -77,12 +77,12 @@ public RecipeModifier build() { case "input" -> ioType = IOType.INPUT; case "output" -> ioType = IOType.OUTPUT; default -> { - CraftTweakerAPI.logError("Invalid ioType " + ioTypeStr + "!"); + Logger.error("Invalid ioType " + ioTypeStr + "!"); return null; } } if (operation > 1 || operation < 0) { - CraftTweakerAPI.logError("Invalid operation " + operation + "!"); + Logger.error("Invalid operation " + operation + "!"); return null; } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipePrimer.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipePrimer.java index a2a700ef..9a02ee09 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipePrimer.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipePrimer.java @@ -9,7 +9,6 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker; import com.cleanroommc.groovyscript.api.GroovyBlacklist; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; import crafttweaker.api.data.IData; import crafttweaker.api.item.IIngredient; @@ -21,6 +20,7 @@ import github.kasuminova.mmce.common.event.Phase; import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.*; +import github.kasuminova.mmce.common.integration.Logger; import github.kasuminova.mmce.common.util.concurrent.Action; import hellfirepvp.modularmachinery.common.base.Mods; import hellfirepvp.modularmachinery.common.crafting.PreparedRecipe; @@ -89,7 +89,7 @@ public RecipePrimer setParallelizeUnaffected(boolean unaffected) { if (lastComponent instanceof ComponentRequirement.Parallelizable parallelizable) { parallelizable.setParallelizeUnaffected(unaffected); } else { - CraftTweakerAPI.logWarning("[ModularMachinery] Target " + lastComponent.getClass() + " cannot be parallelized!"); + Logger.warn("Target " + lastComponent.getClass() + " cannot be parallelized!"); } return this; } @@ -106,7 +106,7 @@ public RecipePrimer setChance(float chance) { if (lastComponent instanceof ComponentRequirement.ChancedRequirement chancedReq) { chancedReq.setChance(chance); } else { - CraftTweakerAPI.logWarning("[ModularMachinery] Cannot set chance for not-chance-based Component: " + lastComponent.getClass()); + Logger.warn("Cannot set chance for not-chance-based Component: " + lastComponent.getClass()); } } return this; @@ -126,10 +126,10 @@ public RecipePrimer setPreViewNBT(IData nbt) { if (lastComponent instanceof RequirementItem reqItem) { reqItem.previewDisplayTag = CraftTweakerMC.getNBTCompound(nbt); } else { - CraftTweakerAPI.logWarning("[ModularMachinery] setPreViewNBT(IData nbt) only can be applied to `Item`!"); + Logger.warn("setPreViewNBT(IData nbt) only can be applied to `Item`!"); } } else { - CraftTweakerAPI.logWarning("[ModularMachinery] setPreViewNBT(IData nbt) only can be applied to `Item`!"); + Logger.warn("setPreViewNBT(IData nbt) only can be applied to `Item`!"); } return this; } @@ -140,10 +140,10 @@ public RecipePrimer setNBTChecker(AdvancedItemCheckerCT checker) { if (lastComponent instanceof RequirementItem reqItem) { reqItem.setItemChecker((controller, stack) -> checker.isMatch(controller, CraftTweakerMC.getIItemStack(stack))); } else { - CraftTweakerAPI.logWarning("[ModularMachinery] setNBTChecker(AdvancedItemNBTChecker checker) only can be applied to `Item`!"); + Logger.warn("setNBTChecker(AdvancedItemNBTChecker checker) only can be applied to `Item`!"); } } else { - CraftTweakerAPI.logWarning("[ModularMachinery] setNBTChecker(AdvancedItemNBTChecker checker) only can be applied to `Item`!"); + Logger.warn("setNBTChecker(AdvancedItemNBTChecker checker) only can be applied to `Item`!"); } return this; } @@ -154,10 +154,10 @@ public RecipePrimer addItemModifier(AdvancedItemModifierCT modifier) { if (lastComponent instanceof RequirementItem reqItem) { reqItem.addItemModifier((controller, stack) -> CraftTweakerMC.getItemStack(modifier.apply(controller, CraftTweakerMC.getIItemStackMutable(stack)))); } else { - CraftTweakerAPI.logWarning("[ModularMachinery] addItemModifier(AdvancedItemModifier checker) only can be applied to `Item`!"); + Logger.warn("addItemModifier(AdvancedItemModifier checker) only can be applied to `Item`!"); } } else { - CraftTweakerAPI.logWarning("[ModularMachinery] addItemModifier(AdvancedItemModifier checker) only can be applied to `Item`!"); + Logger.warn("addItemModifier(AdvancedItemModifier checker) only can be applied to `Item`!"); } return this; } @@ -170,13 +170,13 @@ public RecipePrimer setMinMaxAmount(int min, int max) { reqItem.minAmount = min; reqItem.maxAmount = max; } else { - CraftTweakerAPI.logWarning("[ModularMachinery] `min` cannot larger than `max`!"); + Logger.warn("`min` cannot larger than `max`!"); } } else { - CraftTweakerAPI.logWarning("[ModularMachinery] setMinMaxOutputAmount(int min, int max) only can be applied to `Item`!"); + Logger.warn("setMinMaxOutputAmount(int min, int max) only can be applied to `Item`!"); } } else { - CraftTweakerAPI.logWarning("[ModularMachinery] setMinMaxOutputAmount(int min, int max) only can be applied to `Item`!"); + Logger.warn("setMinMaxOutputAmount(int min, int max) only can be applied to `Item`!"); } return this; } @@ -233,12 +233,12 @@ public RecipePrimer addSmartInterfaceDataInput(String typeStr, float minValue, f needAfterInitActions.add(() -> { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(machineName); if (machine == null) { - CraftTweakerAPI.logError("Could not find machine `" + machineName.toString() + "`!"); + Logger.error("Could not find machine `" + machineName.toString() + "`!"); return; } SmartInterfaceType type = machine.getSmartInterfaceType(typeStr); if (type == null) { - CraftTweakerAPI.logError("SmartInterfaceType " + typeStr + " Not Found!"); + Logger.error("SmartInterfaceType " + typeStr + " Not Found!"); return; } appendComponent(new RequirementInterfaceNumInput(type, minValue, maxValue)); @@ -295,7 +295,7 @@ public RecipePrimer addPostCheckHandler(crafttweaker.util.IEventHandler handler) { - CraftTweakerAPI.logWarning("[ModularMachinery] Deprecated method addCheckHandler()! Consider using addPostCheckHandler()"); + Logger.warn("Deprecated method addCheckHandler()! Consider using addPostCheckHandler()"); addRecipeEventHandler(RecipeCheckEvent.class, handler::handle); return this; } @@ -395,7 +395,7 @@ public RecipePrimer addInput(IIngredient input) { addFluidInput(liquidStack); } else if (Mods.MEKANISM.isPresent() && checkIGasStackAndAdd(IOType.INPUT, input)) { } else { - CraftTweakerAPI.logError(String.format("[ModularMachinery] Invalid input type %s(%s)! Ignored.", input, input.getClass())); + Logger.error(String.format("[ModularMachinery] Invalid input type %s(%s)! Ignored.", input, input.getClass())); } return this; } @@ -418,7 +418,7 @@ public RecipePrimer addOutput(IIngredient output) { addFluidOutput((ILiquidStack) output); } else if (Mods.MEKANISM.isPresent() && checkIGasStackAndAdd(IOType.OUTPUT, output)) { } else { - CraftTweakerAPI.logError(String.format("[ModularMachinery] Invalid output type %s(%s)! Ignored.", output, output.getClass())); + Logger.error(String.format("[ModularMachinery] Invalid output type %s(%s)! Ignored.", output, output.getClass())); } return this; } @@ -580,7 +580,7 @@ public RecipePrimer addItemInput(IIngredient input) { } else if (input instanceof IngredientStack && input.getInternal() instanceof IOreDictEntry) { requireFuel(IOType.INPUT, ((IOreDictEntry) input.getInternal()).getName(), input.getAmount()); } else { - CraftTweakerAPI.logError(String.format("[ModularMachinery] Invalid input type %s(%s)! Ignored.", input, input.getClass())); + Logger.error(String.format("[ModularMachinery] Invalid input type %s(%s)! Ignored.", input, input.getClass())); } return this; @@ -590,7 +590,7 @@ public RecipePrimer addItemInput(IIngredient input) { @ZenMethod public RecipePrimer addItemInput(IOreDictEntry oreDict, int amount) { requireFuel(IOType.INPUT, oreDict.getName(), amount); - CraftTweakerAPI.logWarning(String.format("[ModularMachinery] Deprecated method " + + Logger.warn(String.format("[ModularMachinery] Deprecated method " + "`addItemInput(, %s)`! Consider using `addItemInput( * %s)`", oreDict.getName(), amount, oreDict.getName(), amount) ); @@ -641,7 +641,7 @@ public RecipePrimer addItemOutput(IIngredient output) { } else if (output instanceof IngredientStack && output.getInternal() instanceof IOreDictEntry) { requireFuel(IOType.OUTPUT, ((IOreDictEntry) output.getInternal()).getName(), output.getAmount()); } else { - CraftTweakerAPI.logError(String.format("[ModularMachinery] Invalid output type %s(%s)! Ignored.", output, output.getClass())); + Logger.error(String.format("[ModularMachinery] Invalid output type %s(%s)! Ignored.", output, output.getClass())); } return this; @@ -651,7 +651,7 @@ public RecipePrimer addItemOutput(IIngredient output) { @ZenMethod public RecipePrimer addItemOutput(IOreDictEntry oreDict, int amount) { requireFuel(IOType.OUTPUT, oreDict.getName(), amount); - CraftTweakerAPI.logWarning(String.format("[ModularMachinery] Deprecated method " + + Logger.warn(String.format("[ModularMachinery] Deprecated method " + "`addItemOutput(, %s)`! Consider using `addItemOutput( * %s)`", oreDict.getName(), amount, oreDict.getName(), amount) ); @@ -679,7 +679,7 @@ public RecipePrimer addCatalystInput(IIngredient input, String[] tooltips, Recip } else if (input instanceof IngredientStack && input.getInternal() instanceof IOreDictEntry) { requireCatalyst(((IOreDictEntry) input.getInternal()).getName(), input.getAmount(), tooltips, modifiers); } else { - CraftTweakerAPI.logError(String.format("[ModularMachinery] Invalid input type %s(%s)! Ignored.", input, input.getClass())); + Logger.error(String.format("[ModularMachinery] Invalid input type %s(%s)! Ignored.", input, input.getClass())); } return this; @@ -701,7 +701,7 @@ private void requireEnergy(IOType ioType, long perTick) { private void requireFluid(IOType ioType, ILiquidStack stack, boolean isPerTick) { FluidStack mcFluid = CraftTweakerMC.getLiquidStack(stack); if (mcFluid == null) { - CraftTweakerAPI.logError("[ModularMachinery] FluidStack not found/unknown fluid: " + stack.toString()); + Logger.error("[ModularMachinery] FluidStack not found/unknown fluid: " + stack.toString()); return; } if (stack.getTag() != null) { @@ -720,17 +720,17 @@ private void requireFluid(IOType ioType, ILiquidStack stack, boolean isPerTick) private void requireGas(IOType ioType, String gasName, int amount) { Gas gas = GasRegistry.getGas(gasName); if (gas == null) { - CraftTweakerAPI.logError("[ModularMachinery] GasStack not found/unknown gas: " + gasName); + Logger.error("[ModularMachinery] GasStack not found/unknown gas: " + gasName); return; } int max = Math.max(0, amount); GasStack gasStack = new GasStack(gas, max); switch (ioType) { - case INPUT -> CraftTweakerAPI.logWarning(String.format( + case INPUT -> Logger.warn(String.format( "[ModularMachinery] `addGasInput(%s, %d)` is deprecated, consider using ` * %d`!", gasName, amount, gasName, amount )); - case OUTPUT -> CraftTweakerAPI.logWarning(String.format( + case OUTPUT -> Logger.warn(String.format( "[ModularMachinery] `addGasOutput(%s, %d)` is deprecated, consider using ` * %d`!", gasName, amount, gasName, amount )); @@ -752,7 +752,7 @@ private void requireFuel(int requiredTotalBurnTime) { private void requireFuel(IOType ioType, IItemStack stack) { ItemStack mcStack = CraftTweakerMC.getItemStack(stack); if (mcStack.isEmpty()) { - CraftTweakerAPI.logError("[ModularMachinery] ItemStack not found/unknown item: " + stack.toString()); + Logger.error("[ModularMachinery] ItemStack not found/unknown item: " + stack.toString()); return; } RequirementItem ri = new RequirementItem(ioType, mcStack); @@ -783,7 +783,7 @@ private void requireCatalyst(String oreDictName, int amount, String[] tooltips, private void requireCatalyst(IItemStack stack, String[] tooltips, RecipeModifier[] modifiers) { ItemStack mcStack = CraftTweakerMC.getItemStack(stack); if (mcStack.isEmpty()) { - CraftTweakerAPI.logError("[ModularMachinery] ItemStack not found/unknown item: " + stack.toString()); + Logger.error("[ModularMachinery] ItemStack not found/unknown item: " + stack.toString()); return; } RequirementCatalyst catalyst = new RequirementCatalyst(mcStack); diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/event/MMEvents.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/event/MMEvents.java index 81adde0c..d0844710 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/event/MMEvents.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/event/MMEvents.java @@ -1,6 +1,5 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker.event; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; import crafttweaker.util.IEventHandler; import github.kasuminova.mmce.common.event.Phase; @@ -9,6 +8,7 @@ import github.kasuminova.mmce.common.event.client.ControllerModelGetEvent; import github.kasuminova.mmce.common.event.machine.*; import github.kasuminova.mmce.common.event.recipe.*; +import github.kasuminova.mmce.common.integration.Logger; import github.kasuminova.mmce.common.util.concurrent.Action; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; @@ -34,7 +34,7 @@ public static void onStructureFormed(String machineRegistryName, IEventHandler function) { - CraftTweakerAPI.logWarning("[ModularMachinery] Deprecated method onMachineTick()! Consider using onMachinePostTick()"); + Logger.warn("Deprecated method onMachineTick()! Consider using onMachinePostTick()"); onMachinePostTick(machineRegistryName, function); } @@ -102,7 +102,7 @@ public static void onControllerGUIRender(String machineRegistryName, IEventHandl if (machine != null) { machine.addMachineEventHandler(ControllerGUIRenderEvent.class, function::handle); } else { - CraftTweakerAPI.logError("Could not find machine `" + machineRegistryName + "`!"); + Logger.error("Could not find machine `" + machineRegistryName + "`!"); } }); } @@ -118,7 +118,7 @@ public static void onControllerModelAnimation(String machineRegistryName, IEvent if (machine != null) { machine.addMachineEventHandler(ControllerModelAnimationEvent.class, function::handle); } else { - CraftTweakerAPI.logError("Could not find machine `" + machineRegistryName + "`!"); + Logger.error("Could not find machine `" + machineRegistryName + "`!"); } }); } @@ -134,7 +134,7 @@ public static void onControllerModelGet(String machineRegistryName, IEventHandle if (machine != null) { machine.addMachineEventHandler(ControllerModelGetEvent.class, function::handle); } else { - CraftTweakerAPI.logError("Could not find machine `" + machineRegistryName + "`!"); + Logger.error("Could not find machine `" + machineRegistryName + "`!"); } }); } @@ -146,7 +146,7 @@ public static void onSmartInterfaceUpdate(String machineRegistryName, IEventHand if (machine != null) { machine.addMachineEventHandler(SmartInterfaceUpdateEvent.class, function::handle); } else { - CraftTweakerAPI.logError("Could not find machine `" + machineRegistryName + "`!"); + Logger.error("Could not find machine `" + machineRegistryName + "`!"); } }); } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/modifier/MultiBlockModifierBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/modifier/MultiBlockModifierBuilder.java index fa090137..abfd7e69 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/modifier/MultiBlockModifierBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/modifier/MultiBlockModifierBuilder.java @@ -1,9 +1,9 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker.modifier; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; import crafttweaker.api.item.IItemStack; import crafttweaker.api.minecraft.CraftTweakerMC; +import github.kasuminova.mmce.common.integration.Logger; import hellfirepvp.modularmachinery.common.modifier.MultiBlockModifierReplacement; import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; import hellfirepvp.modularmachinery.common.util.BlockArray; @@ -64,7 +64,7 @@ public MultiBlockModifierBuilder setDescriptiveStack(final IItemStack descriptiv @ZenMethod public MultiBlockModifierReplacement build() { if (blockArray == null) { - CraftTweakerAPI.logError("BlockArray cannot be null!"); + Logger.error("BlockArray cannot be null!"); return null; } else { return new MultiBlockModifierReplacement(modifierName, blockArray, modifiers, descriptions, descriptiveStack); diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/DynamicMachineUpgradeBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/DynamicMachineUpgradeBuilder.java index 6d809497..c17aeba2 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/DynamicMachineUpgradeBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/DynamicMachineUpgradeBuilder.java @@ -1,11 +1,11 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker.upgrade; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; import github.kasuminova.mmce.common.event.Phase; import github.kasuminova.mmce.common.event.client.ControllerGUIRenderEvent; import github.kasuminova.mmce.common.event.machine.*; import github.kasuminova.mmce.common.event.recipe.*; +import github.kasuminova.mmce.common.integration.Logger; import github.kasuminova.mmce.common.upgrade.SimpleDynamicMachineUpgrade; import github.kasuminova.mmce.common.upgrade.UpgradeType; import github.kasuminova.mmce.common.upgrade.registry.RegistryUpgrade; @@ -41,7 +41,7 @@ public DynamicMachineUpgradeBuilder(final SimpleDynamicMachineUpgrade machineUpg @ZenMethod public static DynamicMachineUpgradeBuilder newBuilder(String name, String localizedName, float level, int maxStack) { if (RegistryUpgrade.getUpgrade(name) != null) { - CraftTweakerAPI.logError("[ModularMachinery] Already registered SimpleMachineUpgrade " + name + '!'); + Logger.error("[ModularMachinery] Already registered SimpleMachineUpgrade " + name + '!'); return null; } return new DynamicMachineUpgradeBuilder(new SimpleDynamicMachineUpgrade(new UpgradeType(name, localizedName, level, maxStack))); @@ -80,7 +80,7 @@ public DynamicMachineUpgradeBuilder addCompatibleMachines(String... machineNames for (final String machineName : machineNames) { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineName)); if (machine == null) { - CraftTweakerAPI.logError("Cloud not found machine " + machineName); + Logger.error("Cloud not found machine " + machineName); continue; } machineUpgrade.getType().addCompatibleMachine(machine); @@ -100,7 +100,7 @@ public DynamicMachineUpgradeBuilder addIncompatibleMachines(String... machineNam for (final String machineName : machineNames) { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineName)); if (machine == null) { - CraftTweakerAPI.logError("Cloud not found machine " + machineName); + Logger.error("Cloud not found machine " + machineName); continue; } machineUpgrade.getType().addIncompatibleMachine(machine); @@ -119,7 +119,7 @@ public DynamicMachineUpgradeBuilder addIncompatibleMachines(String... machineNam @Deprecated @ZenMethod public DynamicMachineUpgradeBuilder addRecipeCheckHandler(UpgradeEventHandlerCT handler) { - CraftTweakerAPI.logWarning("[ModularMachinery] Deprecated method addRecipeCheckHandler()! Consider using addPostRecipeCheckHandler()"); + Logger.warn("Deprecated method addRecipeCheckHandler()! Consider using addPostRecipeCheckHandler()"); addEventHandler(RecipeCheckEvent.class, handler); return this; } @@ -167,7 +167,7 @@ public DynamicMachineUpgradeBuilder addRecipePostTickHandler(UpgradeEventHandler @ZenMethod @Deprecated public DynamicMachineUpgradeBuilder addRecipeTickHandler(UpgradeEventHandlerCT handler) { - CraftTweakerAPI.logWarning("[ModularMachinery] Deprecated method addTickHandler()! Consider using addPostTickHandler()"); + Logger.warn("Deprecated method addTickHandler()! Consider using addPostTickHandler()"); return addRecipePostTickHandler(handler); } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeBuilder.java index 60234c79..ed370e82 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeBuilder.java @@ -1,11 +1,11 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker.upgrade; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; import github.kasuminova.mmce.common.event.Phase; import github.kasuminova.mmce.common.event.client.ControllerGUIRenderEvent; import github.kasuminova.mmce.common.event.machine.*; import github.kasuminova.mmce.common.event.recipe.*; +import github.kasuminova.mmce.common.integration.Logger; import github.kasuminova.mmce.common.upgrade.SimpleMachineUpgrade; import github.kasuminova.mmce.common.upgrade.UpgradeType; import github.kasuminova.mmce.common.upgrade.registry.RegistryUpgrade; @@ -24,6 +24,7 @@ @ZenRegister @ZenClass("mods.modularmachinery.MachineUpgradeBuilder") public class MachineUpgradeBuilder { + private final SimpleMachineUpgrade machineUpgrade; public MachineUpgradeBuilder(final SimpleMachineUpgrade machineUpgrade) { @@ -42,7 +43,7 @@ public MachineUpgradeBuilder(final SimpleMachineUpgrade machineUpgrade) { @ZenMethod public static MachineUpgradeBuilder newBuilder(String name, String localizedName, float level, int maxStack) { if (RegistryUpgrade.getUpgrade(name) != null) { - CraftTweakerAPI.logError("[ModularMachinery] Already registered SimpleMachineUpgrade " + name + '!'); + Logger.error("Already registered SimpleMachineUpgrade " + name + '!'); return null; } return new MachineUpgradeBuilder(new SimpleMachineUpgrade(new UpgradeType(name, localizedName, level, maxStack))); @@ -83,7 +84,7 @@ public MachineUpgradeBuilder addCompatibleMachines(String... machineNames) { for (final String machineName : machineNames) { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineName)); if (machine == null) { - CraftTweakerAPI.logError("Cloud not found machine " + machineName); + Logger.error("Cloud not found machine " + machineName); continue; } machineUpgrade.getType().addCompatibleMachine(machine); @@ -103,7 +104,7 @@ public MachineUpgradeBuilder addIncompatibleMachines(String... machineNames) { for (final String machineName : machineNames) { DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineName)); if (machine == null) { - CraftTweakerAPI.logError("Cloud not found machine " + machineName); + Logger.error("Cloud not found machine " + machineName); continue; } machineUpgrade.getType().addIncompatibleMachine(machine); @@ -156,7 +157,7 @@ public MachineUpgradeBuilder addModifier(boolean stackAble, String modifierKey, @Deprecated @ZenMethod public MachineUpgradeBuilder addRecipeCheckHandler(UpgradeEventHandlerCT handler) { - CraftTweakerAPI.logWarning("[ModularMachinery] Deprecated method addRecipeCheckHandler()! Consider using addPostRecipeCheckHandler()"); + Logger.warn("Deprecated method addRecipeCheckHandler()! Consider using addPostRecipeCheckHandler()"); addEventHandler(RecipeCheckEvent.class, handler); return this; } @@ -204,7 +205,7 @@ public MachineUpgradeBuilder addRecipePostTickHandler(UpgradeEventHandlerCT hand @ZenMethod @Deprecated public MachineUpgradeBuilder addRecipeTickHandler(UpgradeEventHandlerCT handler) { - CraftTweakerAPI.logWarning("[ModularMachinery] Deprecated method addTickHandler()! Consider using addPostTickHandler()"); + Logger.warn("Deprecated method addTickHandler()! Consider using addPostTickHandler()"); return addRecipePostTickHandler(handler); } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeHelper.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeHelper.java index 9e876ec3..e192e38a 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeHelper.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeHelper.java @@ -1,10 +1,10 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker.upgrade; -import crafttweaker.CraftTweakerAPI; import crafttweaker.annotations.ZenRegister; import crafttweaker.api.item.IItemStack; import crafttweaker.api.minecraft.CraftTweakerMC; import github.kasuminova.mmce.common.capability.CapabilityUpgrade; +import github.kasuminova.mmce.common.integration.Logger; import github.kasuminova.mmce.common.upgrade.MachineUpgrade; import github.kasuminova.mmce.common.upgrade.SimpleDynamicMachineUpgrade; import github.kasuminova.mmce.common.upgrade.SimpleMachineUpgrade; @@ -46,7 +46,7 @@ public static void addFixedUpgrade(IItemStack itemStack, String upgradeName) { } MachineUpgrade upgrade = RegistryUpgrade.getUpgrade(upgradeName); if (upgrade == null) { - CraftTweakerAPI.logError("[ModularMachinery] Cloud not find MachineUpgrade " + upgradeName + '!'); + Logger.error("Cloud not find MachineUpgrade " + upgradeName + '!'); return; } RegistryUpgrade.addFixedUpgrade(stack, upgrade); @@ -63,7 +63,7 @@ public static void addFixedUpgrade(IItemStack itemStack, String upgradeName) { public static IItemStack addUpgradeToIItemStack(IItemStack stackCT, String upgradeName) { ItemStack stack = CraftTweakerMC.getItemStack(stackCT); if (!RegistryUpgrade.supportsUpgrade(stack)) { - CraftTweakerAPI.logWarning("[ModularMachinery] " + stackCT.getDefinition().getId() + " does not support upgrade!"); + Logger.warn(stackCT.getDefinition().getId() + " does not support upgrade!"); return stackCT; } CapabilityUpgrade capability = stack.getCapability(CapabilityUpgrade.MACHINE_UPGRADE_CAPABILITY, null); @@ -72,7 +72,7 @@ public static IItemStack addUpgradeToIItemStack(IItemStack stackCT, String upgra } MachineUpgrade upgrade = RegistryUpgrade.getUpgrade(upgradeName); if (upgrade == null) { - CraftTweakerAPI.logWarning("[ModularMachinery] Cloud not found MachineUpgrade " + upgradeName + '!'); + Logger.warn("Cloud not found MachineUpgrade " + upgradeName + '!'); return stackCT; } capability.getUpgrades().add(upgrade); From 2b2a99912793a67370c08bba515ce9acd3d98470 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Sun, 7 Jul 2024 19:42:04 +0200 Subject: [PATCH 12/17] minor changes & add non ct wrapper methods --- .../common/helper/IMachineController.java | 23 ++++ .../groovyscript/GroovyRecipe.java | 13 +-- .../groovyscript/GroovyScriptPlugin.java | 4 +- .../groovyscript/MachineUpgrades.java | 105 ++++++++++++++++++ .../common/crafting/ActiveMachineRecipe.java | 11 ++ .../base/TileMultiblockMachineController.java | 35 +++++- .../common/util/SmartInterfaceData.java | 2 + 7 files changed, 183 insertions(+), 10 deletions(-) create mode 100644 src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineUpgrades.java diff --git a/src/main/java/github/kasuminova/mmce/common/helper/IMachineController.java b/src/main/java/github/kasuminova/mmce/common/helper/IMachineController.java index 8394a5c9..dbc20360 100644 --- a/src/main/java/github/kasuminova/mmce/common/helper/IMachineController.java +++ b/src/main/java/github/kasuminova/mmce/common/helper/IMachineController.java @@ -12,6 +12,11 @@ import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; import hellfirepvp.modularmachinery.common.tiles.base.TileMultiblockMachineController; import hellfirepvp.modularmachinery.common.util.SmartInterfaceData; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.Optional; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenGetter; import stanhebben.zenscript.annotations.ZenMethod; @@ -28,33 +33,45 @@ public interface IMachineController { * * @return 世界 */ + @Optional.Method(modid = "crafttweaker") @ZenGetter("world") IWorld getIWorld(); + World getWorld(); + /** * 获取控制器方块。 * * @return IBlockState */ + @Optional.Method(modid = "crafttweaker") @ZenGetter("blockState") IBlockState getIBlockState(); + net.minecraft.block.state.IBlockState getBlockState(); + /** * 获取控制器处于世界中的朝向。 * * @return IFacing */ + @Optional.Method(modid = "crafttweaker") @ZenGetter("facing") IFacing getFacing(); + EnumFacing getEnumFacing(); + /** * 获取控制器所在的坐标 * * @return 坐标 */ + @Optional.Method(modid = "crafttweaker") @ZenGetter("pos") IBlockPos getIPos(); + BlockPos getPos(); + /** * 获取机械在当前世界运行的时间(非世界时间,进入退出世界会被重置) */ @@ -124,6 +141,7 @@ public interface IMachineController { * * @return IData */ + @Optional.Method(modid = "crafttweaker") @ZenGetter("customData") IData getCustomData(); @@ -132,9 +150,14 @@ public interface IMachineController { * * @param data IData */ + @Optional.Method(modid = "crafttweaker") @ZenSetter("customData") void setCustomData(IData data); + NBTTagCompound getCustomNbt(); + + void setCustomNbt(NBTTagCompound nbt); + /** * 添加一个半永久 RecipeModifier,会在配方完成的时候自动删除。 * diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java index 6c90fc09..7467ce01 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java @@ -376,8 +376,7 @@ public GroovyRecipe eventHandler(Class clazz, Closure @SuppressWarnings("unchecked") private void addRecipeEventHandler(Class hClass, IEventHandler handler) { - recipeEventHandlers.putIfAbsent(hClass, new ArrayList<>()); - recipeEventHandlers.get(hClass).add((IEventHandler) handler); + recipeEventHandlers.computeIfAbsent(hClass, k -> new ArrayList<>()).add((IEventHandler) handler); } //---------------------------------------------------------------------------------------------- @@ -392,7 +391,7 @@ public GroovyRecipe input(IIngredient input) { } else if (Mods.MEKANISM.isPresent() && input instanceof GasStack gasStack) { gasInput(gasStack); } else { - GroovyLog.get().error(String.format("Invalid input type %s(%s)! Ignored.", input, input.getClass())); + GroovyLog.get().error("Invalid input type {}({})! Ignored.", input, input.getClass()); } return this; } @@ -419,7 +418,7 @@ public GroovyRecipe output(IIngredient output) { } else if (Mods.MEKANISM.isPresent() && output instanceof GasStack gasStack) { gasOutput(gasStack); } else { - GroovyLog.get().error(String.format("Invalid output type %s(%s)! Ignored.", output, output.getClass())); + GroovyLog.get().error("Invalid output type {}({})! Ignored.", output, output.getClass()); } return this; } @@ -573,7 +572,7 @@ public GroovyRecipe itemInput(IIngredient input) { } else if (input instanceof OreDictIngredient oreDictIngredient) { requireFuel(IOType.INPUT, oreDictIngredient.getOreDict(), oreDictIngredient.getAmount()); } else { - GroovyLog.get().error(String.format("Invalid input type %s(%s)! Ignored.", input, input.getClass())); + GroovyLog.get().error("Invalid input type {}({})! Ignored.", input, input.getClass()); } return this; @@ -626,7 +625,7 @@ public GroovyRecipe itemOutput(IIngredient output) { } else if (output instanceof OreDictIngredient oreDictIngredient) { requireFuel(IOType.OUTPUT, oreDictIngredient.getOreDict(), oreDictIngredient.getAmount()); } else { - GroovyLog.get().error(String.format("Invalid output type %s(%s)! Ignored.", output, output.getClass())); + GroovyLog.get().error("Invalid output type {}({})! Ignored.", output, output.getClass()); } return this; @@ -649,7 +648,7 @@ public GroovyRecipe catalyst(IIngredient input, Iterable tooltips, Itera } else if (input instanceof OreDictIngredient oreDictIngredient) { requireCatalyst(oreDictIngredient.getOreDict(), oreDictIngredient.getAmount(), tooltips, modifiers); } else { - GroovyLog.get().error(String.format("Invalid input type %s(%s)! Ignored.", input, input.getClass())); + GroovyLog.get().error("Invalid input type {}({})! Ignored.", input, input.getClass()); } return this; diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java index ed7d84ab..7e6c7a28 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java @@ -1,6 +1,5 @@ package github.kasuminova.mmce.common.integration.groovyscript; -import com.cleanroommc.groovyscript.GroovyScript; import com.cleanroommc.groovyscript.api.GroovyBlacklist; import com.cleanroommc.groovyscript.api.GroovyLog; import com.cleanroommc.groovyscript.api.GroovyPlugin; @@ -73,7 +72,7 @@ public static GroovyContainer getContainer() { @Override public void onCompatLoaded(GroovyContainer container) { - //MinecraftForge.EVENT_BUS.register(container.get()); + MinecraftForge.EVENT_BUS.register(container.get()); MinecraftForge.EVENT_BUS.register(GroovyScriptPlugin.class); GroovyScriptPlugin.container = (GroovyContainer) container; } @@ -149,6 +148,7 @@ public static void afterScriptRun(ScriptRunEvent.Post event) { private static class Container extends GroovyPropertyContainer { private final Map machines = new Object2ObjectOpenHashMap<>(); + public final MachineUpgrades machineUpgrades = new MachineUpgrades(); @GroovyBlacklist @SubscribeEvent diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineUpgrades.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineUpgrades.java new file mode 100644 index 00000000..f660c597 --- /dev/null +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineUpgrades.java @@ -0,0 +1,105 @@ +package github.kasuminova.mmce.common.integration.groovyscript; + +import com.cleanroommc.groovyscript.registry.NamedRegistry; +import github.kasuminova.mmce.common.capability.CapabilityUpgrade; +import github.kasuminova.mmce.common.integration.Logger; +import github.kasuminova.mmce.common.upgrade.MachineUpgrade; +import github.kasuminova.mmce.common.upgrade.SimpleDynamicMachineUpgrade; +import github.kasuminova.mmce.common.upgrade.SimpleMachineUpgrade; +import github.kasuminova.mmce.common.upgrade.registry.RegistryUpgrade; +import hellfirepvp.modularmachinery.common.integration.crafttweaker.upgrade.MachineUpgradeBuilder; +import net.minecraft.item.ItemStack; + +import javax.annotation.Nullable; + +public class MachineUpgrades extends NamedRegistry { + + public MachineUpgradeBuilder builder(String name, String localizedName, float level, int maxStack) { + return MachineUpgradeBuilder.newBuilder(name, localizedName, level, maxStack); + } + + /** + * 为一个物品注册升级能力,只有在注册了之后才能够添加升级。 + * + * @param stack 物品 + */ + public void registerSupportedItem(ItemStack stack) { + if (!stack.isEmpty()) { + RegistryUpgrade.addSupportedItem(stack); + } + } + + /** + * 为一个物品添加固定的机械升级,会在物品被创建时自动添加物品。 + * + * @param stack 物品 + * @param upgradeName 升级名称 + */ + public void addFixedUpgrade(ItemStack stack, String upgradeName) { + if (stack.isEmpty()) { + return; + } + MachineUpgrade upgrade = RegistryUpgrade.getUpgrade(upgradeName); + if (upgrade == null) { + Logger.error("Cloud not find MachineUpgrade " + upgradeName + '!'); + return; + } + RegistryUpgrade.addFixedUpgrade(stack, upgrade); + } + + /** + * 将一个升级应用至机械升级,相当于直接写入相关升级的 NBT. + * + * @param stack 物品 + * @param upgradeName 名称 + * @return 添加了目标机械升级的物品。 + */ + public ItemStack addUpgradeToIItemStack(ItemStack stack, String upgradeName) { + if (!RegistryUpgrade.supportsUpgrade(stack)) { + Logger.warn(stack.getItem().getRegistryName() + " does not support upgrade!"); + return stack; + } + CapabilityUpgrade capability = stack.getCapability(CapabilityUpgrade.MACHINE_UPGRADE_CAPABILITY, null); + if (capability == null) { + return stack; + } + MachineUpgrade upgrade = RegistryUpgrade.getUpgrade(upgradeName); + if (upgrade == null) { + Logger.warn("Cloud not found MachineUpgrade " + upgradeName + '!'); + return stack; + } + capability.getUpgrades().add(upgrade); + return stack; + } + + /** + * 获取一个已注册的机械升级。 + * + * @param upgradeName 升级名称。 + * @return 机械升级,如果无则为 null + */ + @Nullable + public MachineUpgrade getUpgrade(String upgradeName) { + return RegistryUpgrade.getUpgrade(upgradeName); + } + + /** + * 将 MachineUpgrade 转换为 SimpleDynamicMachineUpgrade + * + * @param upgrade 升级 + * @return 强制转换后的升级,如果不支持则为 null。 + */ + public SimpleDynamicMachineUpgrade castToSimpleDynamicMachineUpgrade(MachineUpgrade upgrade) { + return upgrade instanceof SimpleDynamicMachineUpgrade ? (SimpleDynamicMachineUpgrade) upgrade : null; + } + + /** + * 将 MachineUpgrade 转换为 SimpleMachineUpgrade + * + * @param upgrade 升级 + * @return 强制转换后的升级,如果不支持则为 null。 + */ + public SimpleMachineUpgrade castToSimpleMachineUpgrade(MachineUpgrade upgrade) { + return upgrade instanceof SimpleMachineUpgrade ? (SimpleMachineUpgrade) upgrade : null; + } +} diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/ActiveMachineRecipe.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/ActiveMachineRecipe.java index db88bd47..b8dc7e70 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/ActiveMachineRecipe.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/ActiveMachineRecipe.java @@ -21,6 +21,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.util.Constants; +import net.minecraftforge.fml.common.Optional; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenGetter; import stanhebben.zenscript.annotations.ZenSetter; @@ -209,11 +210,13 @@ public String getRegistryName() { return recipe.getRegistryName().getPath(); } + @Optional.Method(modid = "crafttweaker") @ZenGetter("data") public IData getData() { return CraftTweakerMC.getIDataModifyable(data); } + @Optional.Method(modid = "crafttweaker") @ZenSetter("data") public void setData(IData data) { this.data = CraftTweakerMC.getNBTCompound(data); @@ -222,4 +225,12 @@ public void setData(IData data) { public NBTTagCompound getDataCompound() { return data; } + + public NBTTagCompound getNbt() { + return data; + } + + public void setNbt(NBTTagCompound nbt) { + this.data = nbt; + } } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/tiles/base/TileMultiblockMachineController.java b/src/main/java/hellfirepvp/modularmachinery/common/tiles/base/TileMultiblockMachineController.java index 4848c980..5cda2138 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/tiles/base/TileMultiblockMachineController.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/tiles/base/TileMultiblockMachineController.java @@ -843,12 +843,21 @@ public void checkAndAddSmartInterface(MachineComponent component, BlockPos re } } + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") + @Override public IWorld getIWorld() { return CraftTweakerMC.getIWorld(getWorld()); } + @Override + public IBlockState getBlockState() { + return getWorld().getBlockState(getPos()); + } + + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") + @Override public crafttweaker.api.block.IBlockState getIBlockState() { - return CraftTweakerMC.getBlockState(getWorld().getBlockState(getPos())); + return CraftTweakerMC.getBlockState(getBlockState()); } @Override @@ -856,23 +865,46 @@ public IFacing getFacing() { return CraftTweakerMC.getIFacing(controllerRotation); } + @Override + public EnumFacing getEnumFacing() { + return controllerRotation; + } + + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") + @Override public IBlockPos getIPos() { return CraftTweakerMC.getIBlockPos(getPos()); } + @Override public String getFormedMachineName() { return isStructureFormed() ? foundMachine.getRegistryName().toString() : null; } + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") + @Override public IData getCustomData() { return CraftTweakerMC.getIDataModifyable(customData); } + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") + @Override public void setCustomData(IData data) { customData = CraftTweakerMC.getNBTCompound(data); markNoUpdateSync(); } + @Override + public NBTTagCompound getCustomNbt() { + return customData; + } + + @Override + public void setCustomNbt(NBTTagCompound nbt) { + this.customData = nbt; + markNoUpdateSync(); + } + public NBTTagCompound getCustomDataTag() { return customData; } @@ -881,6 +913,7 @@ public void setCustomDataTag(NBTTagCompound customData) { this.customData = customData; } + @Override public boolean hasModifier(String key) { return customModifiers.containsKey(key); } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/util/SmartInterfaceData.java b/src/main/java/hellfirepvp/modularmachinery/common/util/SmartInterfaceData.java index 64ae1169..f2d956e0 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/util/SmartInterfaceData.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/util/SmartInterfaceData.java @@ -6,6 +6,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.common.Optional; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenGetter; import stanhebben.zenscript.annotations.ZenSetter; @@ -38,6 +39,7 @@ public BlockPos getPos() { /** * 返回此数据对应控制器所在的位置。 */ + @Optional.Method(modid = "crafttweaker") @ZenGetter("pos") public IBlockPos getIPos() { return CraftTweakerMC.getIBlockPos(pos); From a58d3058d59cc9aee4bfbe3af6118f3d6b2d9722 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Sat, 20 Jul 2024 10:29:59 +0200 Subject: [PATCH 13/17] recipe modifier builder --- .../mmce/common/integration/Logger.java | 3 ++ .../crafttweaker/RecipeModifierBuilder.java | 48 ++++++++++++++----- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/main/java/github/kasuminova/mmce/common/integration/Logger.java b/src/main/java/github/kasuminova/mmce/common/integration/Logger.java index 2f85c7a6..72666e6c 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/Logger.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/Logger.java @@ -7,6 +7,9 @@ import hellfirepvp.modularmachinery.common.base.Mods; import org.apache.logging.log4j.message.ParameterizedMessage; +/** + * A logger which logs to CraftTweaker, GroovyScript and this mods log, depending on if the mods are loaded. + */ public class Logger { private static final String CT_PREFIX = "[ModularMachinery] "; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java index 1346e82e..3fd2ca92 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java @@ -14,7 +14,7 @@ @ZenClass("mods.modularmachinery.RecipeModifierBuilder") public class RecipeModifierBuilder { private String type = ""; - private String ioTypeStr = ""; + private IOType ioType = null; private float value = 0.0f; private int operation = 0; private boolean affectChance = false; @@ -28,7 +28,7 @@ public static RecipeModifierBuilder newBuilder() { public static RecipeModifierBuilder create(String type, String ioTypeStr, float value, int operation, boolean affectChance) { RecipeModifierBuilder builder = new RecipeModifierBuilder(); builder.type = type; - builder.ioTypeStr = ioTypeStr; + builder.ioType = IOType.getByString(ioTypeStr); builder.value = value; builder.operation = operation; builder.affectChance = affectChance; @@ -41,9 +41,26 @@ public RecipeModifierBuilder setRequirementType(String type) { return this; } + public RecipeModifierBuilder requirementType(String type) { + return setRequirementType(type); + } + @ZenMethod public RecipeModifierBuilder setIOType(String ioTypeStr) { - this.ioTypeStr = ioTypeStr; + this.ioType = IOType.getByString(ioTypeStr); + return this; + } + + public RecipeModifierBuilder input() { + return ioType(IOType.INPUT); + } + + public RecipeModifierBuilder output() { + return ioType(IOType.OUTPUT); + } + + public RecipeModifierBuilder ioType(IOType ioType) { + this.ioType = ioType; return this; } @@ -53,12 +70,26 @@ public RecipeModifierBuilder setValue(float value) { return this; } + public RecipeModifierBuilder value(float value) { + return setValue(value); + } + @ZenMethod public RecipeModifierBuilder setOperation(int operation) { this.operation = operation; return this; } + @ZenMethod + public RecipeModifierBuilder add() { + return setOperation(RecipeModifier.OPERATION_ADD); + } + + @ZenMethod + public RecipeModifierBuilder multiply() { + return setOperation(RecipeModifier.OPERATION_MULTIPLY); + } + @ZenMethod public RecipeModifierBuilder isAffectChance(boolean affectChance) { this.affectChance = affectChance; @@ -72,14 +103,9 @@ public RecipeModifier build() { Logger.error("Could not find requirementType " + type + "!"); return null; } - IOType ioType; - switch (ioTypeStr.toLowerCase()) { - case "input" -> ioType = IOType.INPUT; - case "output" -> ioType = IOType.OUTPUT; - default -> { - Logger.error("Invalid ioType " + ioTypeStr + "!"); - return null; - } + if (this.ioType == null) { + Logger.error("IOType was not set or was invalid. Valid values are: ['input', 'output']."); + return null; } if (operation > 1 || operation < 0) { Logger.error("Invalid operation " + operation + "!"); From d78825d7fe2b89fdbf0ca51542d1477b1bfed2a2 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Sat, 20 Jul 2024 11:14:13 +0200 Subject: [PATCH 14/17] fix mekanism compat --- .../groovyscript/GroovyRecipe.java | 144 +++++++++++------- 1 file changed, 91 insertions(+), 53 deletions(-) diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java index 7467ce01..bfe26788 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java @@ -27,7 +27,6 @@ import hellfirepvp.modularmachinery.common.data.Config; import hellfirepvp.modularmachinery.common.integration.crafttweaker.IngredientArrayPrimer; import hellfirepvp.modularmachinery.common.integration.crafttweaker.RecipePrimer; -import hellfirepvp.modularmachinery.common.lib.RequirementTypesMM; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; import hellfirepvp.modularmachinery.common.machine.IOType; import hellfirepvp.modularmachinery.common.machine.MachineRegistry; @@ -516,23 +515,34 @@ public GroovyRecipe fluidOutputs(Iterable fluids) { //---------------------------------------------------------------------------------------------- @Optional.Method(modid = "mekanism") - public GroovyRecipe gasInput(GasStack gasStack) { - requireGas(IOType.INPUT, gasStack); + public GroovyRecipe gasInput(GasStack gasStack, boolean perTick) { + requireGas(IOType.INPUT, gasStack, perTick); return this; } @Optional.Method(modid = "mekanism") - public GroovyRecipe gasOutput(GasStack gasStack) { - requireGas(IOType.OUTPUT, gasStack); + public GroovyRecipe gasOutput(GasStack gasStack, boolean perTick) { + requireGas(IOType.OUTPUT, gasStack, perTick); return this; } + @Optional.Method(modid = "mekanism") + public GroovyRecipe gasInput(GasStack gasStack) { + return gasInput(gasStack, false); + } + + + @Optional.Method(modid = "mekanism") + public GroovyRecipe gasOutput(GasStack gasStack) { + return gasOutput(gasStack, false); + } + @Optional.Method(modid = "mekanism") public GroovyRecipe gasInput(GasStack... gasStacks) { for (final GasStack gasStack : gasStacks) { - requireGas(IOType.INPUT, gasStack); + requireGas(IOType.INPUT, gasStack, false); } return this; } @@ -540,7 +550,7 @@ public GroovyRecipe gasInput(GasStack... gasStacks) { @Optional.Method(modid = "mekanism") public GroovyRecipe gasInput(Iterable gasStacks) { for (final GasStack gasStack : gasStacks) { - requireGas(IOType.INPUT, gasStack); + requireGas(IOType.INPUT, gasStack, false); } return this; } @@ -549,7 +559,7 @@ public GroovyRecipe gasInput(Iterable gasStacks) { @Optional.Method(modid = "mekanism") public GroovyRecipe gasOutput(GasStack... gasStacks) { for (final GasStack gasStack : gasStacks) { - requireGas(IOType.OUTPUT, gasStack); + requireGas(IOType.OUTPUT, gasStack, false); } return this; } @@ -557,7 +567,7 @@ public GroovyRecipe gasOutput(GasStack... gasStacks) { @Optional.Method(modid = "mekanism") public GroovyRecipe gasOutput(Iterable gasStacks) { for (final GasStack gasStack : gasStacks) { - requireGas(IOType.OUTPUT, gasStack); + requireGas(IOType.OUTPUT, gasStack, false); } return this; } @@ -572,7 +582,7 @@ public GroovyRecipe itemInput(IIngredient input) { } else if (input instanceof OreDictIngredient oreDictIngredient) { requireFuel(IOType.INPUT, oreDictIngredient.getOreDict(), oreDictIngredient.getAmount()); } else { - GroovyLog.get().error("Invalid input type {}({})! Ignored.", input, input.getClass()); + GroovyLog.get().error("Invalid input type {}({})! Only ItemStack and OreDictIngredient is allowed.", input, input.getClass()); } return this; @@ -669,8 +679,8 @@ private void requireEnergy(IOType ioType, long perTick) { } private void requireFluid(IOType ioType, FluidStack stack, boolean isPerTick) { - if (stack == null) { - GroovyLog.get().error("FluidStack not found/unknown fluid"); + if (IngredientHelper.isEmpty(stack) || stack.getFluid() == null) { + GroovyLog.get().error("FluidStack must not be empty"); return; } @@ -682,8 +692,16 @@ private void requireFluid(IOType ioType, FluidStack stack, boolean isPerTick) { } @Optional.Method(modid = "mekanism") - private void requireGas(IOType ioType, GasStack gasStack) { - appendComponent(RequirementFluid.createMekanismGasRequirement(RequirementTypesMM.REQUIREMENT_GAS, ioType, gasStack)); + private void requireGas(IOType ioType, GasStack gasStack, boolean isPerTick) { + if (gasStack == null || gasStack.amount <= 0 || gasStack.getGas() == null) { + GroovyLog.get().error("GasStack must not be empty"); + return; + } + if (isPerTick) { + appendComponent(new RequirementGasPerTick(ioType, gasStack)); + } else { + appendComponent(new RequirementGas(ioType, gasStack)); + } } private void requireFuel(int requiredTotalBurnTime) { @@ -737,7 +755,8 @@ private void requireCatalyst(ItemStack stack, Iterable tooltips, Iterabl appendComponent(catalyst); } - private void requireCatalyst(IngredientArrayPrimer ingredientArrayPrimer, Iterable tooltips, Iterable modifiers) { + private void requireCatalyst(IngredientArrayPrimer ingredientArrayPrimer, Iterable tooltips, + Iterable modifiers) { RequirementCatalyst catalyst = new RequirementCatalyst(ingredientArrayPrimer.getIngredientStackList()); for (String tooltip : tooltips) { catalyst.addTooltip(tooltip); @@ -761,88 +780,97 @@ public void appendComponent(ComponentRequirement component) { public GroovyRecipe aspectInput(String aspectString, int amount) { Aspect aspect = Aspect.getAspect(aspectString); - if (aspect != null) + if (aspect != null) { appendComponent(new RequirementAspect(IOType.INPUT, amount, aspect)); - else + } else { GroovyLog.get().error("Invalid aspect name : " + aspectString); + } return this; } public GroovyRecipe aspectOutput(String aspectString, int amount) { Aspect aspect = Aspect.getAspect(aspectString); - if (aspect != null) + if (aspect != null) { appendComponent(new RequirementAspect(IOType.OUTPUT, amount, aspect)); - else + } else { GroovyLog.get().error("Invalid aspect name : " + aspectString); + } return this; } public GroovyRecipe auraInput(String auraType, int amount) { IAuraType aura = NaturesAuraAPI.AURA_TYPES.get(new ResourceLocation("naturesaura", auraType)); - if (aura != null) + if (aura != null) { appendComponent(new RequirementAura(IOType.INPUT, new Aura(amount, aura), Integer.MAX_VALUE, Integer.MIN_VALUE)); - else + } else { GroovyLog.get().error("Invalid aura name : " + auraType); + } return this; } public GroovyRecipe auraOutput(String auraType, int amount) { IAuraType aura = NaturesAuraAPI.AURA_TYPES.get(new ResourceLocation("naturesaura", auraType)); - if (aura != null) + if (aura != null) { appendComponent(new RequirementAura(IOType.OUTPUT, new Aura(amount, aura), Integer.MAX_VALUE, Integer.MIN_VALUE)); - else + } else { GroovyLog.get().error("Invalid aura name : " + auraType); + } return this; } public GroovyRecipe auraInput(String auraType, int amount, int max, int min) { IAuraType aura = NaturesAuraAPI.AURA_TYPES.get(new ResourceLocation("naturesaura", auraType)); - if (aura != null) + if (aura != null) { appendComponent(new RequirementAura(IOType.INPUT, new Aura(amount, aura), max, min)); - else + } else { GroovyLog.get().error("Invalid aura name : " + auraType); + } return this; } public GroovyRecipe auraOutput(String auraType, int amount, int max, int min) { IAuraType aura = NaturesAuraAPI.AURA_TYPES.get(new ResourceLocation("naturesaura", auraType)); - if (aura != null) + if (aura != null) { appendComponent(new RequirementAura(IOType.OUTPUT, new Aura(amount, aura), max, min)); - else + } else { GroovyLog.get().error("Invalid aura name : " + auraType); + } return this; } public GroovyRecipe constellationInput(String constellationString) { IConstellation constellation = ConstellationRegistry.getConstellationByName("astralsorcery.constellation." + constellationString); - if (constellation != null) + if (constellation != null) { appendComponent(new RequirementConstellation(IOType.INPUT, constellation)); - else + } else { GroovyLog.get().error("Invalid constellation : " + constellationString); + } return this; } public GroovyRecipe gridPowerInput(int amount) { - if (amount > 0) + if (amount > 0) { appendComponent(new RequirementGrid(IOType.INPUT, amount)); - else + } else { GroovyLog.get().error("Invalid Grid Power amount : " + amount + " (need to be positive and not null)"); + } return this; } public GroovyRecipe gridPowerOutput(int amount) { - if (amount > 0) + if (amount > 0) { appendComponent(new RequirementGrid(IOType.OUTPUT, amount)); - else + } else { GroovyLog.get().error("Invalid Grid Power amount : " + amount + " (need to be positive and not null)"); + } return this; } @@ -853,95 +881,105 @@ public GroovyRecipe rainbowInput(RecipePrimer primer) { } public GroovyRecipe lifeEssenceInput(int amount, boolean perTick) { - if (amount > 0) + if (amount > 0) { appendComponent(new RequirementLifeEssence(IOType.INPUT, amount, perTick)); - else + } else { GroovyLog.get().error("Invalid Life Essence amount : " + amount + " (need to be positive and not null)"); + } return this; } public GroovyRecipe lifeEssenceOutput(int amount, boolean perTick) { - if (amount > 0) + if (amount > 0) { appendComponent(new RequirementLifeEssence(IOType.OUTPUT, amount, perTick)); - else + } else { GroovyLog.get().error("Invalid Life Essence amount : " + amount + " (need to be positive and not null)"); + } return this; } public GroovyRecipe starlightInput(float amount) { - if (amount > 0) + if (amount > 0) { appendComponent(new RequirementStarlight(IOType.INPUT, amount)); - else + } else { GroovyLog.get().error("Invalid Starlight amount : " + amount + " (need to be positive and not null)"); + } return this; } public GroovyRecipe starlightOutput(float amount) { - if (amount > 0) + if (amount > 0) { appendComponent(new RequirementStarlight(IOType.OUTPUT, amount)); - else + } else { GroovyLog.get().error("Invalid Starlight amount : " + amount + " (need to be positive and not null)"); + } return this; } public GroovyRecipe willInput(String willTypeString, int amount) { EnumDemonWillType willType = EnumHelper.valueOfNullable(EnumDemonWillType.class, willTypeString, false); - if (willType != null) + if (willType != null) { appendComponent(new RequirementWill(IOType.INPUT, amount, willType, Integer.MIN_VALUE, Integer.MAX_VALUE)); - else + } else { GroovyLog.get().error("Invalid demon will type : " + willTypeString); + } return this; } public GroovyRecipe willOutput(String willTypeString, int amount) { EnumDemonWillType willType = EnumHelper.valueOfNullable(EnumDemonWillType.class, willTypeString, false); - if (willType != null) + if (willType != null) { appendComponent(new RequirementWill(IOType.OUTPUT, amount, willType, Integer.MIN_VALUE, Integer.MAX_VALUE)); - else + } else { GroovyLog.get().error("Invalid demon will type : " + willTypeString); + } return this; } public GroovyRecipe willInput(String willTypeString, int amount, int min, int max) { EnumDemonWillType willType = EnumHelper.valueOfNullable(EnumDemonWillType.class, willTypeString, false); - if (willType != null) + if (willType != null) { appendComponent(new RequirementWill(IOType.INPUT, amount, willType, min, max)); - else + } else { GroovyLog.get().error("Invalid demon will type : " + willTypeString); + } return this; } public GroovyRecipe willOutput(String willTypeString, int amount, int min, int max) { EnumDemonWillType willType = EnumHelper.valueOfNullable(EnumDemonWillType.class, willTypeString, false); - if (willType != null) + if (willType != null) { appendComponent(new RequirementWill(IOType.OUTPUT, amount, willType, min, max)); - else + } else { GroovyLog.get().error("Invalid demon will type : " + willTypeString); + } return this; } public GroovyRecipe manaInput(int amount, boolean perTick) { - if (amount > 0) + if (amount > 0) { appendComponent(new RequirementMana(IOType.INPUT, amount, perTick)); - else + } else { GroovyLog.get().error("Invalid Mana amount : " + amount + " (need to be positive and not null)"); + } return this; } public GroovyRecipe manaOutput(int amount, boolean perTick) { - if (amount > 0) + if (amount > 0) { appendComponent(new RequirementMana(IOType.OUTPUT, amount, perTick)); - else + } else { GroovyLog.get().error("Invalid Mana amount : " + amount + " (need to be positive and not null)"); + } return this; } From 6de9929edb2a303f6e4480c65ba3336ac0d348df Mon Sep 17 00:00:00 2001 From: brachy84 Date: Sat, 20 Jul 2024 13:08:20 +0200 Subject: [PATCH 15/17] machine upgrade builder helpers --- .../groovyscript/GroovyScriptPlugin.java | 28 ++++++++++++++++++- .../groovyscript/MachineBuilderHelper.java | 14 ++++++++++ .../modularmachinery/common/CommonProxy.java | 2 +- .../upgrade/MachineUpgradeBuilder.java | 2 ++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java index 7e6c7a28..406b22a5 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyScriptPlugin.java @@ -10,6 +10,7 @@ import com.cleanroommc.groovyscript.event.GroovyEventManager; import com.cleanroommc.groovyscript.event.GroovyReloadEvent; import com.cleanroommc.groovyscript.event.ScriptRunEvent; +import com.cleanroommc.groovyscript.sandbox.ClosureHelper; import com.cleanroommc.groovyscript.sandbox.LoadStage; import github.kasuminova.mmce.client.model.DynamicMachineModelRegistry; import github.kasuminova.mmce.client.resource.GeoModelExternalLoader; @@ -27,10 +28,13 @@ import hellfirepvp.modularmachinery.common.integration.ModIntegrationJEI; import hellfirepvp.modularmachinery.common.integration.crafttweaker.MachineBuilder; import hellfirepvp.modularmachinery.common.integration.crafttweaker.MachineModifier; +import hellfirepvp.modularmachinery.common.integration.crafttweaker.RecipeModifierBuilder; import hellfirepvp.modularmachinery.common.integration.crafttweaker.event.MMEvents; +import hellfirepvp.modularmachinery.common.integration.crafttweaker.upgrade.MachineUpgradeBuilder; import hellfirepvp.modularmachinery.common.lib.RegistriesMM; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; import hellfirepvp.modularmachinery.common.machine.MachineRegistry; +import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; import hellfirepvp.modularmachinery.common.util.BlockArrayCache; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.server.MinecraftServer; @@ -230,7 +234,8 @@ public void registerMachine(String registryName, @DelegatesTo(MachineBuilderHelp public void machineEvent(String machineRegistryName, Class clazz, Closure listener) { GroovyEventManager.INSTANCE.listen(EventPriority.NORMAL, EventBusType.MAIN, clazz, event -> { - DynamicMachine machine = MachineRegistry.getRegistry().getMachine(new ResourceLocation(ModularMachinery.MODID, machineRegistryName)); + DynamicMachine machine = MachineRegistry.getRegistry() + .getMachine(new ResourceLocation(ModularMachinery.MODID, machineRegistryName)); if (machine != null) { machine.addMachineEventHandler(clazz, IEventHandler.of(listener)); } else { @@ -238,5 +243,26 @@ public void machineEvent(String machineRegistryName, Class builder) { + MachineUpgradeBuilder machineUpgradeBuilder = MachineUpgradeBuilder.newBuilder(name, localizedName, level, maxStack); + if (machineUpgradeBuilder == null) return; + ClosureHelper.withEnvironment(builder, machineUpgradeBuilder, true); + builder.call(); + machineUpgradeBuilder.buildAndRegister(); + } + + public RecipeModifierBuilder recipeModifierBuilder() { + return new RecipeModifierBuilder(); + } + + public RecipeModifierBuilder recipeModifierBuilder(String type, String ioTypeStr, float value, int operation, + boolean affectChance) { + return RecipeModifierBuilder.create(type, ioTypeStr, value, operation, affectChance); + } + + public RecipeModifier recipeModifier(String type, String ioTypeStr, float value, int operation, boolean affectChance) { + return recipeModifierBuilder(type, ioTypeStr, value, operation, affectChance).build(); + } } } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderHelper.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderHelper.java index 779261e5..1e96ed6c 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderHelper.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/MachineBuilderHelper.java @@ -6,7 +6,9 @@ import hellfirepvp.modularmachinery.common.block.prop.EnergyHatchData; import hellfirepvp.modularmachinery.common.block.prop.FluidHatchSize; import hellfirepvp.modularmachinery.common.block.prop.ItemBusSize; +import hellfirepvp.modularmachinery.common.integration.crafttweaker.RecipeModifierBuilder; import hellfirepvp.modularmachinery.common.lib.BlocksMM; +import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; @@ -35,6 +37,18 @@ public GroovyMachineBuilder getSettings() { return settings; } + public RecipeModifierBuilder recipeModifierBuilder() { + return new RecipeModifierBuilder(); + } + + public RecipeModifierBuilder recipeModifierBuilder(String type, String ioTypeStr, float value, int operation, boolean affectChance) { + return RecipeModifierBuilder.create(type, ioTypeStr, value, operation, affectChance); + } + + public RecipeModifier recipeModifier(String type, String ioTypeStr, float value, int operation, boolean affectChance) { + return recipeModifierBuilder(type, ioTypeStr, value, operation, affectChance).build(); + } + private IBlockState[] getBlockStates(Block block, int min, int max, @Nullable Block additional) { int s = max - min; if (additional != null) s++; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java b/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java index ecaf705b..859546b6 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/CommonProxy.java @@ -149,7 +149,7 @@ public void init() { IntegrationTypeHelper.filterModIdRequirementTypes(); if (Mods.GROOVYSCRIPT.isPresent()) { - // the patter requires all mod block to be loaded + // the pattern requires all mod block to be loaded GroovyMachine.init(); } if (Mods.TOP.isPresent()) { diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeBuilder.java index ed370e82..d44f366c 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/upgrade/MachineUpgradeBuilder.java @@ -1,5 +1,6 @@ package hellfirepvp.modularmachinery.common.integration.crafttweaker.upgrade; +import com.cleanroommc.groovyscript.api.GroovyBlacklist; import crafttweaker.annotations.ZenRegister; import github.kasuminova.mmce.common.event.Phase; import github.kasuminova.mmce.common.event.client.ControllerGUIRenderEvent; @@ -295,6 +296,7 @@ public MachineUpgradeBuilder addSmartInterfaceUpdateHandler(UpgradeEventHandlerC return this; } + @GroovyBlacklist @ZenMethod public void buildAndRegister() { RegistryUpgrade.registerUpgrade(machineUpgrade.getType().getName(), machineUpgrade); From 69c4fa4040d87b5c6b7533e01825b5e3935e67d3 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Sat, 20 Jul 2024 13:57:51 +0200 Subject: [PATCH 16/17] fix ct issues --- .../common/helper/IMachineController.java | 9 ++++++ .../base/TileMultiblockMachineController.java | 29 ++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main/java/github/kasuminova/mmce/common/helper/IMachineController.java b/src/main/java/github/kasuminova/mmce/common/helper/IMachineController.java index 04d99fc4..099075c0 100644 --- a/src/main/java/github/kasuminova/mmce/common/helper/IMachineController.java +++ b/src/main/java/github/kasuminova/mmce/common/helper/IMachineController.java @@ -16,6 +16,7 @@ import hellfirepvp.modularmachinery.common.modifier.RecipeModifier; import hellfirepvp.modularmachinery.common.tiles.base.TileMultiblockMachineController; import hellfirepvp.modularmachinery.common.util.SmartInterfaceData; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; @@ -27,6 +28,7 @@ import stanhebben.zenscript.annotations.ZenSetter; import javax.annotation.Nullable; +import java.util.function.Predicate; @ZenRegister @ZenClass("mods.modularmachinery.IMachineController") @@ -295,9 +297,12 @@ public interface IMachineController { * @param blockStack 要判断的方块对应的物品,会被自动转换成对应的 IBlockState,如果转换出现问题会输出错误日志。 * @return 存在数量。 */ + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") @ZenMethod int getBlocksInPattern(final IItemStack blockStack); + int getBlocksInPattern(ItemStack itemStack); + /** * 获取控制器的结构中指定方块的存在数量,只能在控制器成型时使用。
* 会过滤空气方块。
@@ -306,6 +311,7 @@ public interface IMachineController { * @param blockStateMatcher 要判断的方块对应的 IBlockStateMatcher * @return 存在数量。 */ + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") @ZenMethod int getBlocksInPattern(final IBlockStateMatcher blockStateMatcher); @@ -328,9 +334,12 @@ public interface IMachineController { * @param predicate 自定义判断逻辑。 * @return 存在数量。 */ + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") @ZenMethod int getBlocksInPattern(final IBlockStatePredicate predicate); + int getBlocksInPattern(Predicate predicate); + /** * 获取控制器的拥有者,如果玩家不在线则返回 null。 * diff --git a/src/main/java/hellfirepvp/modularmachinery/common/tiles/base/TileMultiblockMachineController.java b/src/main/java/hellfirepvp/modularmachinery/common/tiles/base/TileMultiblockMachineController.java index 7ca65e7f..96aad8b0 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/tiles/base/TileMultiblockMachineController.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/tiles/base/TileMultiblockMachineController.java @@ -889,10 +889,15 @@ public IBlockPos getIPos() { return CraftTweakerMC.getIBlockPos(getPos()); } + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") @Override public IBlockPos rotateWithControllerFacing(final IBlockPos posCT) { BlockPos pos = CraftTweakerMC.getBlockPos(posCT); - return CraftTweakerMC.getIBlockPos(MiscUtils.rotateYCCWNorthUntil(pos, controllerRotation == null ? EnumFacing.NORTH : controllerRotation)); + return CraftTweakerMC.getIBlockPos(rotateWithControllerFacing(pos)); + } + + public BlockPos rotateWithControllerFacing(final BlockPos pos) { + return MiscUtils.rotateYCCWNorthUntil(pos, controllerRotation == null ? EnumFacing.NORTH : controllerRotation); } public String getFormedMachineName() { @@ -1121,6 +1126,7 @@ public IDynamicPatternInfo getDynamicPattern(final String patternName) { return foundDynamicPatterns.get(patternName); } + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") @Override public int getBlocksInPattern(final IItemStack blockStack) { if (foundPattern == null || blockStack == null) { @@ -1134,6 +1140,21 @@ public int getBlocksInPattern(final IItemStack blockStack) { } } + @Override + public int getBlocksInPattern(ItemStack blockStack) { + if (foundPattern == null || blockStack == null || blockStack.isEmpty()) { + return 0; + } + Block block = Block.getBlockFromItem(blockStack.getItem()); + if (blockStack.getMetadata() == OreDictionary.WILDCARD_VALUE) { + return getBlocksInPattern((Predicate) state -> state.getBlock() == block); + } else { + IBlockState blockState = block.getStateFromMeta(blockStack.getMetadata()); + return getBlocksInPattern((Predicate) state -> state.equals(blockState)); + } + } + + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") @Override public int getBlocksInPattern(final IBlockStateMatcher blockStateMatcher) { if (foundPattern == null) { @@ -1151,6 +1172,7 @@ public int getBlocksInPattern(final String blockName) { return getBlocksInPatternInternal(applicable::contains); } + @net.minecraftforge.fml.common.Optional.Method(modid = "crafttweaker") @Override public int getBlocksInPattern(final IBlockStatePredicate predicate) { if (foundPattern == null) { @@ -1159,6 +1181,11 @@ public int getBlocksInPattern(final IBlockStatePredicate predicate) { return getBlocksInPatternInternal(state -> predicate.test(CraftTweakerMC.getBlockState(state))); } + @Override + public int getBlocksInPattern(Predicate predicate) { + return getBlocksInPatternInternal(predicate); + } + public int getBlocksInPatternInternal(final Predicate predicate) { if (foundPattern == null) { return 0; From 4784ff258b553d1d7a037e72d96b8ea93661d215 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Fri, 19 Sep 2025 12:26:21 +0200 Subject: [PATCH 17/17] update groovy to 1.2.5 --- build.gradle.kts | 4 +- .../groovyscript/BlockArrayBuilder.java | 4 +- .../groovyscript/GroovyMachine.java | 2 + .../groovyscript/GroovyMachineBuilder.java | 28 ++++---- .../groovyscript/GroovyMachineRecipes.java | 6 +- .../groovyscript/GroovyRecipe.java | 67 +++++++++++-------- .../common/crafting/MachineRecipe.java | 2 +- .../adapter/RecipeAdapterAccessor.java | 1 - .../adapter/te5/InsolatorRecipeAdapter.java | 3 +- .../crafttweaker/RecipeModifierBuilder.java | 6 +- .../common/machine/AbstractMachine.java | 2 +- .../common/machine/DynamicMachine.java | 1 - 12 files changed, 69 insertions(+), 57 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d27f0183..0af7bfe2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -159,7 +159,7 @@ repositories { url = uri("http://jenkins.usrv.eu:8081/nexus/content/groups/public/") isAllowInsecureProtocol = true } - mavenLocal() + //mavenLocal() } dependencies { @@ -197,7 +197,7 @@ dependencies { compileOnlyApi("org.jetbrains:annotations:24.1.0") annotationProcessor("org.jetbrains:annotations:24.1.0") - api("com.cleanroommc:groovyscript:1.1.1") { isTransitive = false } + implementation("com.cleanroommc:groovyscript:1.2.5") { isTransitive = false } implementation("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.+") implementation(rfg.deobf("curse.maven:had-enough-items-557549:4810661")) diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java index ec7e273e..53ad19b4 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/BlockArrayBuilder.java @@ -227,8 +227,8 @@ public BlockArrayBuilder previewNbt(NBTTagCompound data) { public BlockArrayBuilder blockChecker(Closure checker) { if (lastInformation != null) { - lastInformation.nbtChecker = (world, pos, blockState, nbt) -> - ClosureHelper.call(true, checker, world, pos, blockState, nbt); + lastInformation.setNBTChecker((world, pos, blockState, nbt) -> + ClosureHelper.call(true, checker, world, pos, blockState, nbt)); } return this; } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java index c5b3cc9c..b4befe05 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachine.java @@ -4,6 +4,7 @@ import com.cleanroommc.groovyscript.api.GroovyLog; import com.cleanroommc.groovyscript.sandbox.ClosureHelper; import groovy.lang.Closure; +import hellfirepvp.modularmachinery.common.data.Config; import hellfirepvp.modularmachinery.common.integration.crafttweaker.MachineBuilder; import hellfirepvp.modularmachinery.common.machine.DynamicMachine; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; @@ -52,6 +53,7 @@ public void build() { } BlockArrayBuilder pattern = new BlockArrayBuilder(this.dynamicMachine); GroovyMachineBuilder settings = new GroovyMachineBuilder(this.dynamicMachine); + settings.color(Config.machineColor); // default color ClosureHelper.withEnvironment(this.buildFunction, new MachineBuilderHelper(pattern, settings), true); ClosureHelper.call(this.buildFunction); pattern.build(); diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java index fd256ef5..a227aba3 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineBuilder.java @@ -79,35 +79,35 @@ public GroovyMachineBuilder smartInterfaceType(SmartInterfaceType type) { /** * 添加结构形成事件监听器。 */ - public GroovyMachineBuilder structureFormedHandler(Closure function) { - machine.addMachineEventHandler(MachineStructureFormedEvent.class, IEventHandler.of(function)); + public GroovyMachineBuilder structureFormedHandler(IEventHandler function) { + machine.addMachineEventHandler(MachineStructureFormedEvent.class, function); return this; } /** * 添加结构更新事件监听器。 */ - public GroovyMachineBuilder structureUpdateHandler(Closure function) { - machine.addMachineEventHandler(MachineStructureUpdateEvent.class, IEventHandler.of(function)); + public GroovyMachineBuilder structureUpdateHandler(IEventHandler function) { + machine.addMachineEventHandler(MachineStructureUpdateEvent.class, function); return this; } /** * 添加机器事件监听器。 */ - public GroovyMachineBuilder tickHandler(Closure function) { - machine.addMachineEventHandler(MachineTickEvent.class, IEventHandler.of(function)); + public GroovyMachineBuilder tickHandler(IEventHandler function) { + machine.addMachineEventHandler(MachineTickEvent.class, function); return this; } /** * 添加控制器 GUI 渲染事件监听器。 */ - public GroovyMachineBuilder guiRenderHandler(Closure function) { + public GroovyMachineBuilder guiRenderHandler(IEventHandler function) { if (FMLCommonHandler.instance().getSide().isServer()) { return this; } - machine.addMachineEventHandler(ControllerGUIRenderEvent.class, IEventHandler.of(function)); + machine.addMachineEventHandler(ControllerGUIRenderEvent.class, function); return this; } @@ -115,11 +115,11 @@ public GroovyMachineBuilder guiRenderHandler(Closure function) { * 添加控制器 GeckoLib 模型动画事件监听器。 */ @Optional.Method(modid = "geckolib3") - public GroovyMachineBuilder controllerModelAnimationHandler(Closure function) { + public GroovyMachineBuilder controllerModelAnimationHandler(IEventHandler function) { if (FMLCommonHandler.instance().getSide().isServer()) { return this; } - machine.addMachineEventHandler(ControllerModelAnimationEvent.class, IEventHandler.of(function)); + machine.addMachineEventHandler(ControllerModelAnimationEvent.class, function); return this; } @@ -127,19 +127,19 @@ public GroovyMachineBuilder controllerModelAnimationHandler(Closure function) * 添加控制器 GeckoLib 模型获取事件监听器。 */ @Optional.Method(modid = "geckolib3") - public GroovyMachineBuilder controllerModelGetHandler(Closure function) { + public GroovyMachineBuilder controllerModelGetHandler(IEventHandler function) { if (FMLCommonHandler.instance().getSide().isServer()) { return this; } - machine.addMachineEventHandler(ControllerModelGetEvent.class, IEventHandler.of(function)); + machine.addMachineEventHandler(ControllerModelGetEvent.class, function); return this; } /** * 添加智能数据接口更新事件监听器 */ - public GroovyMachineBuilder smartInterfaceUpdateHandler(Closure function) { - machine.addMachineEventHandler(SmartInterfaceUpdateEvent.class, IEventHandler.of(function)); + public GroovyMachineBuilder smartInterfaceUpdateHandler(IEventHandler function) { + machine.addMachineEventHandler(SmartInterfaceUpdateEvent.class, function); return this; } diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java index 601a0ddb..dcbc2414 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyMachineRecipes.java @@ -16,12 +16,10 @@ public GroovyMachineRecipes(ResourceLocation name) { } @Override - public void onReload() { - } + public void onReload() {} @Override - public void afterScriptLoad() { - } + public void afterScriptLoad() {} public GroovyRecipe recipeBuilder(String name) { return new GroovyRecipe(this.name); diff --git a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java index bfe26788..b00323d3 100644 --- a/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java +++ b/src/main/java/github/kasuminova/mmce/common/integration/groovyscript/GroovyRecipe.java @@ -54,6 +54,7 @@ public class GroovyRecipe implements PreparedRecipe { protected final ResourceLocation machineName; private int tickTime = 100, priority = 0; private boolean doesVoidPerTick = false; + private boolean loadJei = true; private final List> components = new ArrayList<>(); private final List needAfterInitActions = new ArrayList<>(); @@ -276,100 +277,100 @@ public GroovyRecipe threadName(String name) { // EventHandlers //---------------------------------------------------------------------------------------------- - public GroovyRecipe preCheckHandler(Closure handler) { + public GroovyRecipe preCheckHandler(IEventHandler handler) { addRecipeEventHandler(RecipeCheckEvent.class, event -> { if (event.phase != Phase.START) return; - ClosureHelper.call(handler, event); + handler.invoke(event); }); return this; } - public GroovyRecipe postCheckHandler(Closure handler) { + public GroovyRecipe postCheckHandler(IEventHandler handler) { addRecipeEventHandler(RecipeCheckEvent.class, event -> { if (event.phase != Phase.END) return; - ClosureHelper.call(handler, event); + handler.invoke(event); }); return this; } - public GroovyRecipe startHandler(Closure handler) { - addRecipeEventHandler(RecipeStartEvent.class, IEventHandler.of(handler)); + public GroovyRecipe startHandler(IEventHandler handler) { + addRecipeEventHandler(RecipeStartEvent.class, handler); return this; } - public GroovyRecipe preTickHandler(Closure handler) { + public GroovyRecipe preTickHandler(IEventHandler handler) { addRecipeEventHandler(RecipeTickEvent.class, event -> { if (event.phase != Phase.START) return; - ClosureHelper.call(handler, event); + handler.invoke(event); }); return this; } - public GroovyRecipe postTickHandler(Closure handler) { + public GroovyRecipe postTickHandler(IEventHandler handler) { addRecipeEventHandler(RecipeTickEvent.class, event -> { if (event.phase != Phase.END) return; - ClosureHelper.call(handler, event); + handler.invoke(event); }); return this; } - public GroovyRecipe failureHandler(Closure handler) { - addRecipeEventHandler(RecipeFailureEvent.class, IEventHandler.of(handler)); + public GroovyRecipe failureHandler(IEventHandler handler) { + addRecipeEventHandler(RecipeFailureEvent.class, handler); return this; } - public GroovyRecipe finishHandler(Closure handler) { - addRecipeEventHandler(RecipeFinishEvent.class, IEventHandler.of(handler)); + public GroovyRecipe finishHandler(IEventHandler handler) { + addRecipeEventHandler(RecipeFinishEvent.class, handler); return this; } - public GroovyRecipe factoryStartHandler(Closure handler) { - addRecipeEventHandler(FactoryRecipeStartEvent.class, IEventHandler.of(handler)); + public GroovyRecipe factoryStartHandler(IEventHandler handler) { + addRecipeEventHandler(FactoryRecipeStartEvent.class, handler); return this; } - public GroovyRecipe factoryPreTickHandler(Closure handler) { + public GroovyRecipe factoryPreTickHandler(IEventHandler handler) { addRecipeEventHandler(FactoryRecipeTickEvent.class, event -> { if (event.phase != Phase.START) { return; } - ClosureHelper.call(handler, event); + handler.invoke(event); }); return this; } - public GroovyRecipe factoryPostTickHandler(Closure handler) { + public GroovyRecipe factoryPostTickHandler(IEventHandler handler) { addRecipeEventHandler(FactoryRecipeTickEvent.class, event -> { if (event.phase != Phase.END) { return; } - ClosureHelper.call(handler, event); + handler.invoke(event); }); return this; } - public GroovyRecipe factoryFailureHandler(Closure handler) { + public GroovyRecipe factoryFailureHandler(IEventHandler handler) { return eventHandler(FactoryRecipeFailureEvent.class, handler); } - public GroovyRecipe factoryFinishHandler(Closure handler) { + public GroovyRecipe factoryFinishHandler(IEventHandler handler) { return eventHandler(FactoryRecipeFinishEvent.class, handler); } - public GroovyRecipe eventHandler(Closure handler) { + /*public GroovyRecipe eventHandler(IEventHandler<> handler) { if (handler.getParameterTypes().length > 0 && RecipeEvent.class.isAssignableFrom(handler.getParameterTypes()[0])) { Class eventClass = (Class) handler.getParameterTypes()[0]; - addRecipeEventHandler(eventClass, IEventHandler.of(handler)); + addRecipeEventHandler(eventClass, handler); } else { GroovyLog.get().error("The parameter type must be explicitly declared when using `eventHandler({})`"); } return this; - } + }*/ - public GroovyRecipe eventHandler(Class clazz, Closure handler) { - addRecipeEventHandler(clazz, IEventHandler.of(handler)); + public GroovyRecipe eventHandler(Class clazz, IEventHandler handler) { + addRecipeEventHandler(clazz, handler); return this; } @@ -875,7 +876,7 @@ public GroovyRecipe gridPowerOutput(int amount) { return this; } - public GroovyRecipe rainbowInput(RecipePrimer primer) { + public GroovyRecipe rainbowInput() { appendComponent(new RequirementRainbow()); return this; } @@ -994,6 +995,11 @@ public GroovyRecipe impetusOutput(int amount) { return this; } + public GroovyRecipe hide() { + this.loadJei = false; + return this; + } + //---------------------------------------------------------------------------------------------- // build //---------------------------------------------------------------------------------------------- @@ -1087,5 +1093,10 @@ public void loadNeedAfterInitActions() { needAfterInitAction.doAction(); } } + + @Override + public boolean getLoadJEI() { + return loadJei; + } } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/MachineRecipe.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/MachineRecipe.java index 4e572729..894253d8 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/MachineRecipe.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/MachineRecipe.java @@ -16,7 +16,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.ModularMachinery; import hellfirepvp.modularmachinery.common.crafting.command.RecipeCommandContainer; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterAccessor.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterAccessor.java index f35a55f8..372d947b 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterAccessor.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/RecipeAdapterAccessor.java @@ -15,7 +15,6 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; -import crafttweaker.util.IEventHandler; import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import hellfirepvp.modularmachinery.ModularMachinery; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/te5/InsolatorRecipeAdapter.java b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/te5/InsolatorRecipeAdapter.java index 0c3ac222..8192751e 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/te5/InsolatorRecipeAdapter.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/crafting/adapter/te5/InsolatorRecipeAdapter.java @@ -1,7 +1,7 @@ package hellfirepvp.modularmachinery.common.crafting.adapter.te5; import cofh.thermalexpansion.util.managers.machine.InsolatorManager; -import crafttweaker.util.IEventHandler; +import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.recipe.RecipeEvent; import github.kasuminova.mmce.common.util.HashedItemStack; import hellfirepvp.modularmachinery.common.crafting.MachineRecipe; @@ -168,5 +168,4 @@ public Collection createRecipesFor(final ResourceLocation owningM return recipes; } - } diff --git a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java index 42c12a91..733eec75 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/integration/crafttweaker/RecipeModifierBuilder.java @@ -14,7 +14,7 @@ @ZenClass("mods.modularmachinery.RecipeModifierBuilder") public class RecipeModifierBuilder { private String type = ""; - private IOType ioType = ""; + private IOType ioType = null; private float value = 0.0f; private int operation = 0; private boolean affectChance = false; @@ -96,6 +96,10 @@ public RecipeModifierBuilder isAffectChance(boolean affectChance) { return this; } + public RecipeModifierBuilder affectChance(boolean affectChance) { + return isAffectChance(affectChance); + } + @ZenMethod public RecipeModifier build() { RequirementType target = RegistriesMM.REQUIREMENT_TYPE_REGISTRY.getValue(new ResourceLocation(type)); diff --git a/src/main/java/hellfirepvp/modularmachinery/common/machine/AbstractMachine.java b/src/main/java/hellfirepvp/modularmachinery/common/machine/AbstractMachine.java index ecc58caf..a0aa2eb1 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/machine/AbstractMachine.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/machine/AbstractMachine.java @@ -14,7 +14,7 @@ public abstract class AbstractMachine { @Nonnull protected final ResourceLocation registryName; - protected String localizedName = ""; + protected String localizedName = null; protected String prefix = ""; protected int definedColor = Config.machineColor; diff --git a/src/main/java/hellfirepvp/modularmachinery/common/machine/DynamicMachine.java b/src/main/java/hellfirepvp/modularmachinery/common/machine/DynamicMachine.java index bab6acc9..92b8eddc 100644 --- a/src/main/java/hellfirepvp/modularmachinery/common/machine/DynamicMachine.java +++ b/src/main/java/hellfirepvp/modularmachinery/common/machine/DynamicMachine.java @@ -15,7 +15,6 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; -import crafttweaker.util.IEventHandler; import github.kasuminova.mmce.common.concurrent.RecipeCraftingContextPool; import github.kasuminova.mmce.common.event.machine.IEventHandler; import github.kasuminova.mmce.common.event.machine.MachineEvent;