From cc1320d5c64c0b90df4cfa326119088032be4db8 Mon Sep 17 00:00:00 2001 From: skippyall <> Date: Sat, 11 Oct 2025 00:41:47 +0200 Subject: [PATCH] Nuke some generics --- .../skippyall/minions/MinionRegistries.java | 7 +-- .../skippyall/minions/gui/InstructionGui.java | 4 +- .../minions/program/InstructionRuntime.java | 25 ++++---- .../minions/program/argument/Argument.java | 13 ++--- .../program/argument/ArgumentList.java | 16 +++--- .../program/argument/ArgumentType.java | 15 +++++ .../minions/program/argument/Arguments.java | 45 +++------------ .../program/argument/GenericArgumentType.java | 16 ------ .../argument/SpecificArgumentType.java | 37 ------------ .../program/argument/ValueArgument.java | 18 ++++-- .../program/argument/ValueArgumentType.java | 18 +++--- .../instruction/ConfiguredInstruction.java | 32 +++++------ .../instruction/InstructionExecution.java | 7 +-- .../program/instruction/InstructionType.java | 31 ++++------ .../returnvalue/GenericValueConsumerType.java | 19 ------- .../program/returnvalue/ReturnValueList.java | 57 ------------------- .../SpecificValueConsumerType.java | 39 ------------- .../program/returnvalue/ValueConsumer.java | 15 ++--- .../returnvalue/ValueConsumerList.java | 34 +++++++++++ .../returnvalue/ValueConsumerType.java | 16 ++++++ .../program/returnvalue/ValueConsumers.java | 24 ++++++++ 21 files changed, 182 insertions(+), 306 deletions(-) create mode 100644 src/main/java/io/github/skippyall/minions/program/argument/ArgumentType.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/argument/GenericArgumentType.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/argument/SpecificArgumentType.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/returnvalue/GenericValueConsumerType.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/returnvalue/ReturnValueList.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/returnvalue/SpecificValueConsumerType.java create mode 100644 src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumerList.java create mode 100644 src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumerType.java create mode 100644 src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumers.java diff --git a/src/main/java/io/github/skippyall/minions/MinionRegistries.java b/src/main/java/io/github/skippyall/minions/MinionRegistries.java index 9ff4631..cce73d6 100644 --- a/src/main/java/io/github/skippyall/minions/MinionRegistries.java +++ b/src/main/java/io/github/skippyall/minions/MinionRegistries.java @@ -2,9 +2,8 @@ package io.github.skippyall.minions; import com.mojang.serialization.Lifecycle; import io.github.skippyall.minions.minion.MinionRuntime; -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.minion.skin.SkinProvider; -import io.github.skippyall.minions.program.argument.GenericArgumentType; +import io.github.skippyall.minions.program.argument.ArgumentType; import io.github.skippyall.minions.program.instruction.InstructionType; import io.github.skippyall.minions.program.value.ValueType; import net.minecraft.registry.Registry; @@ -14,8 +13,8 @@ import net.minecraft.util.Identifier; public class MinionRegistries { public static final Registry> VALUE_TYPES = registry("value_type"); - public static final Registry> GENERIC_ARGUMENT_TYPE_REGISTRY = registry("generic_argument_type"); - public static final Registry> INSTRUCTION_TYPES = registry("instruction_type"); + public static final Registry> ARGUMENT_TYPE_REGISTRY = registry("argument_type"); + public static final Registry> INSTRUCTION_TYPES = registry("instruction_type"); public static final Registry SKIN_PROVIDERS = registry("skin_providers"); private static Registry registry(String id) { diff --git a/src/main/java/io/github/skippyall/minions/gui/InstructionGui.java b/src/main/java/io/github/skippyall/minions/gui/InstructionGui.java index e575427..717c194 100644 --- a/src/main/java/io/github/skippyall/minions/gui/InstructionGui.java +++ b/src/main/java/io/github/skippyall/minions/gui/InstructionGui.java @@ -4,11 +4,13 @@ import eu.pb4.sgui.api.elements.GuiElementBuilder; import eu.pb4.sgui.api.gui.SimpleGui; import io.github.skippyall.minions.MinionRegistries; import io.github.skippyall.minions.input.TextInput; +import io.github.skippyall.minions.minion.MinionRuntime; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.module.MinionModule; import io.github.skippyall.minions.program.argument.Argument; import io.github.skippyall.minions.program.argument.GenericArgumentType; import io.github.skippyall.minions.program.argument.SpecificArgumentType; +import io.github.skippyall.minions.program.dingenskirchen.SpecificDingenskirchenType; import io.github.skippyall.minions.program.instruction.ConfiguredInstruction; import io.github.skippyall.minions.program.instruction.InstructionType; import io.github.skippyall.minions.program.argument.Parameter; @@ -112,7 +114,7 @@ public class InstructionGui { } } - public static , MinionFakePlayer>> void configureArgumentMenu(String name, ConfiguredInstruction instruction, Parameter parameter, MinionFakePlayer minion, ServerPlayerEntity player) { + public static , MinionRuntime>> void configureArgumentMenu(String name, ConfiguredInstruction instruction, Parameter parameter, MinionFakePlayer minion, ServerPlayerEntity player) { if(!checkInstructionExists(name, instruction, minion, player)) { return; } diff --git a/src/main/java/io/github/skippyall/minions/program/InstructionRuntime.java b/src/main/java/io/github/skippyall/minions/program/InstructionRuntime.java index ff51bf7..71293b2 100644 --- a/src/main/java/io/github/skippyall/minions/program/InstructionRuntime.java +++ b/src/main/java/io/github/skippyall/minions/program/InstructionRuntime.java @@ -3,27 +3,28 @@ package io.github.skippyall.minions.program; import com.mojang.serialization.Codec; import io.github.skippyall.minions.program.argument.Argument; import io.github.skippyall.minions.program.argument.ArgumentList; +import io.github.skippyall.minions.program.argument.ArgumentType; import io.github.skippyall.minions.program.argument.Arguments; -import io.github.skippyall.minions.program.argument.GenericArgumentType; -import io.github.skippyall.minions.program.argument.SpecificArgumentType; +import io.github.skippyall.minions.program.instruction.InstructionType; +import io.github.skippyall.minions.program.returnvalue.ValueConsumerType; import net.minecraft.registry.Registry; public interface InstructionRuntime> { - Registry> getGenericArgumentTypeRegistry(); + Registry> getArgumentTypeRegistry(); - default Codec> getGenericArgumentTypeCodec() { - return getGenericArgumentTypeRegistry().getCodec(); + Registry> getInstructionTypeRegistry(); + + Registry> getValueConsumerRegistry(); + + default Codec> getArgumentTypeCodec() { + return getArgumentTypeRegistry().getCodec(); } - default Codec> getSpecificArgumentTypeCodec() { - return Arguments.createSpecificTypeCodec(getGenericArgumentTypeCodec()); - } - - default Codec> getArgumentCodec() { - return Arguments.createArgumentCodec(getGenericArgumentTypeCodec()); + default Codec> getArgumentCodec() { + return Arguments.createArgumentCodec(getArgumentTypeCodec()); } default Codec> getArgumentListCodec() { - return ArgumentList.getCodec(getGenericArgumentTypeCodec()); + return ArgumentList.getCodec(getArgumentTypeCodec()); } } diff --git a/src/main/java/io/github/skippyall/minions/program/argument/Argument.java b/src/main/java/io/github/skippyall/minions/program/argument/Argument.java index 7adfe7a..0f0ee7f 100644 --- a/src/main/java/io/github/skippyall/minions/program/argument/Argument.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/Argument.java @@ -10,20 +10,17 @@ import org.jetbrains.annotations.Nullable; * Its value is resolved at runtime and can vary between executions. * Arguments are created exclusively by SpecificArgumentTypes. * @param The type of the Argument's value - * @param The SpecificArgumentType */ -public interface Argument, R>, R extends InstructionRuntime> { +public interface Argument> { T resolve(R minion); - default ValueType getValueType() { - return getType().getValueType(); - } - GuiDisplay getDisplay(); - S getType(); + ValueType getValueType(); - default , R>> @Nullable A cast(ValueType type) { + ArgumentType getType(); + + default > @Nullable A cast(ValueType type) { if(getValueType() == type) { //noinspection unchecked return (A) this; diff --git a/src/main/java/io/github/skippyall/minions/program/argument/ArgumentList.java b/src/main/java/io/github/skippyall/minions/program/argument/ArgumentList.java index 9c71411..672ecb4 100644 --- a/src/main/java/io/github/skippyall/minions/program/argument/ArgumentList.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/ArgumentList.java @@ -1,8 +1,6 @@ package io.github.skippyall.minions.program.argument; import com.mojang.serialization.Codec; -import io.github.skippyall.minions.Minions; -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.program.InstructionRuntime; import java.util.Collection; @@ -10,27 +8,27 @@ import java.util.HashMap; import java.util.Map; public class ArgumentList> { - private final Map> arguments; + private final Map> arguments; public ArgumentList() { arguments = new HashMap<>(); } - public ArgumentList(Map> arguments) { + public ArgumentList(Map> arguments) { this.arguments = new HashMap<>(arguments); } public T getValue(Parameter parameter, R runtime) { - Argument argument = getArgument(parameter); + Argument argument = getArgument(parameter); return argument != null ? argument.resolve(runtime) : null; } - public ,R>> A getArgument(Parameter parameter) { - Argument argument = arguments.get(parameter.name()); + public > A getArgument(Parameter parameter) { + Argument argument = arguments.get(parameter.name()); return argument == null ? null : argument.cast(parameter.type()); } - public void setArgument(Parameter parameter, Argument argument) { + public void setArgument(Parameter parameter, Argument argument) { arguments.put(parameter.name(), argument); } @@ -47,7 +45,7 @@ public class ArgumentList> { return true; } - public static > Codec> getCodec(Codec> genericCodec) { + public static > Codec> getCodec(Codec> genericCodec) { return Codec.unboundedMap(Codec.STRING, Arguments.createArgumentCodec(genericCodec)) .xmap(ArgumentList::new, list -> list.arguments); } diff --git a/src/main/java/io/github/skippyall/minions/program/argument/ArgumentType.java b/src/main/java/io/github/skippyall/minions/program/argument/ArgumentType.java new file mode 100644 index 0000000..0fbc0c8 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/program/argument/ArgumentType.java @@ -0,0 +1,15 @@ +package io.github.skippyall.minions.program.argument; + +import com.mojang.serialization.Codec; +import io.github.skippyall.minions.program.InstructionRuntime; +import io.github.skippyall.minions.program.value.ValueType; +import net.minecraft.server.network.ServerPlayerEntity; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +public abstract class ArgumentType> { + public abstract Codec> getCodec(ValueType type); + + public abstract CompletableFuture> openConfiguration(ServerPlayerEntity player, ValueType valueType, @Nullable Argument previous); +} diff --git a/src/main/java/io/github/skippyall/minions/program/argument/Arguments.java b/src/main/java/io/github/skippyall/minions/program/argument/Arguments.java index 18728af..19787d0 100644 --- a/src/main/java/io/github/skippyall/minions/program/argument/Arguments.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/Arguments.java @@ -2,49 +2,18 @@ package io.github.skippyall.minions.program.argument; import com.mojang.serialization.Codec; import io.github.skippyall.minions.MinionRegistries; -import io.github.skippyall.minions.Minions; -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.program.InstructionRuntime; -import io.github.skippyall.minions.program.value.ValueType; -import net.minecraft.registry.Registry; -import net.minecraft.util.Identifier; public class Arguments { - public static final Codec> SPECIFIC_ARGUMENT_TYPE_CODEC = createSpecificTypeCodec(MinionRegistries.GENERIC_ARGUMENT_TYPE_REGISTRY.getCodec()); - public static final Codec> ARGUMENT_CODEC = createArgumentCodecFromSpecific(SPECIFIC_ARGUMENT_TYPE_CODEC); - - public static final GenericArgumentType VALUE_ARGUMENT = register(Identifier.of(Minions.MOD_ID, "value"), ValueArgumentType::new); - - public static Codec> createSpecificTypeCodec(Codec> genericCodec) { - return genericCodec.dispatch( + public static > Codec> createArgumentCodec(Codec> codec) { + return codec.dispatch( "type", - SpecificArgumentType::getGenericArgumentType, - generic -> - MinionRegistries.VALUE_TYPES.getCodec().xmap( - generic::createTypeSpecific, - SpecificArgumentType::getValueType + Argument::getType, + type -> + MinionRegistries.VALUE_TYPES.getCodec().>dispatch( + Argument::getValueType, + valueType -> type.getCodec(valueType).fieldOf("valueType") ).fieldOf("valueType") ); } - - public static > Codec> createArgumentCodecFromSpecific(Codec> specificTypeCodec) { - return specificTypeCodec.dispatch(Argument::getType, specific -> specific.getArgumentCodec().fieldOf("data")); - } - - public static > Codec> createArgumentCodec(Codec> genericTypeCodec) { - return createArgumentCodecFromSpecific(createSpecificTypeCodec(genericTypeCodec)); - } - - public static SpecificArgumentType, MinionFakePlayer> getArgumentType(Identifier id, ValueType valueType) { - GenericArgumentType generic = MinionRegistries.GENERIC_ARGUMENT_TYPE_REGISTRY.get(id); - if(generic != null) { - return generic.createTypeSpecific(valueType); - } - - return null; - } - - public static GenericArgumentType register(Identifier id, GenericArgumentType argumentType) { - return Registry.register(MinionRegistries.GENERIC_ARGUMENT_TYPE_REGISTRY, id, argumentType); - } } diff --git a/src/main/java/io/github/skippyall/minions/program/argument/GenericArgumentType.java b/src/main/java/io/github/skippyall/minions/program/argument/GenericArgumentType.java deleted file mode 100644 index 9f698a7..0000000 --- a/src/main/java/io/github/skippyall/minions/program/argument/GenericArgumentType.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.skippyall.minions.program.argument; - -import io.github.skippyall.minions.program.InstructionRuntime; -import io.github.skippyall.minions.program.value.ValueType; - -public interface GenericArgumentType> { - default SpecificArgumentType, R> createTypeSpecific(ValueType valueType) { - return createTypeSpecific(valueType, this); - } - - SpecificArgumentType, R> createTypeSpecific(ValueType valueType, GenericArgumentType me); - - default boolean canCreate(ValueType valueType) { - return true; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/argument/SpecificArgumentType.java b/src/main/java/io/github/skippyall/minions/program/argument/SpecificArgumentType.java deleted file mode 100644 index b8ad189..0000000 --- a/src/main/java/io/github/skippyall/minions/program/argument/SpecificArgumentType.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.github.skippyall.minions.program.argument; - -import com.mojang.serialization.Codec; -import io.github.skippyall.minions.program.InstructionRuntime; -import io.github.skippyall.minions.program.value.ValueType; -import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.Nullable; - -import java.util.concurrent.CompletableFuture; - -/** - * SpecificArgumentTypes create Arguments of the specified ValueType. - * They are also responsible for the serialization and user input of arguments. - * @param The value type of the Arguments to create - * @param The type of the Arguments themselves - */ -public abstract class SpecificArgumentType, R>, R extends InstructionRuntime> { - public final ValueType valueType; - public final GenericArgumentType genericType; - - public SpecificArgumentType(ValueType valueType, GenericArgumentType genericType) { - this.valueType = valueType; - this.genericType = genericType; - } - - public abstract Codec getArgumentCodec(); - - public abstract CompletableFuture openArgumentDialog(ServerPlayerEntity player, @Nullable A previousArgument); - - public ValueType getValueType() { - return valueType; - } - - public GenericArgumentType getGenericArgumentType() { - return genericType; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/argument/ValueArgument.java b/src/main/java/io/github/skippyall/minions/program/argument/ValueArgument.java index f8cef1a..b9b1814 100644 --- a/src/main/java/io/github/skippyall/minions/program/argument/ValueArgument.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/ValueArgument.java @@ -3,16 +3,19 @@ package io.github.skippyall.minions.program.argument; import io.github.skippyall.minions.gui.GuiDisplay; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.program.InstructionRuntime; +import io.github.skippyall.minions.program.value.ValueType; /** * An argument that always resolves to a fixed value */ -public class ValueArgument> implements Argument, R> { - private final ValueArgumentType type; +public class ValueArgument> implements Argument { + private final ValueArgumentType type; + private final ValueType valueType; private final T value; - public ValueArgument(ValueArgumentType valueType, T value) { - this.type = valueType; + public ValueArgument(ValueArgumentType type, ValueType valueType, T value) { + this.type = type; + this.valueType = valueType; this.value = value; } @@ -31,7 +34,12 @@ public class ValueArgument> implements Argume } @Override - public ValueArgumentType getType() { + public ValueType getValueType() { + return valueType; + } + + @Override + public ValueArgumentType getType() { return type; } } diff --git a/src/main/java/io/github/skippyall/minions/program/argument/ValueArgumentType.java b/src/main/java/io/github/skippyall/minions/program/argument/ValueArgumentType.java index bce1169..f511166 100644 --- a/src/main/java/io/github/skippyall/minions/program/argument/ValueArgumentType.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/ValueArgumentType.java @@ -8,21 +8,17 @@ import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; -public class ValueArgumentType> extends SpecificArgumentType, R> { - public ValueArgumentType(ValueType valueType, GenericArgumentType genericType) { - super(valueType, genericType); +public class ValueArgumentType> extends ArgumentType { + @Override + public Codec> getCodec(ValueType valueType) { + return valueType.codec().xmap(value -> new ValueArgument<>(this, valueType, value), ValueArgument::getValue); } @Override - public Codec> getArgumentCodec() { - return valueType.codec().xmap(value -> new ValueArgument<>(this, value), ValueArgument::getValue); - } - - @Override - public CompletableFuture> openArgumentDialog(ServerPlayerEntity player, @Nullable ValueArgument previousArgument) { + public CompletableFuture> openConfiguration(ServerPlayerEntity player, ValueType valueType, @Nullable Argument previousArgument) { return valueType.openValueDialog( player, - previousArgument != null ? previousArgument.getValue() : valueType.defaultValue() - ).thenApply(value -> new ValueArgument<>(this, value)); + previousArgument instanceof ValueArgument val ? val.getValue() : valueType.defaultValue() + ).thenApply(value -> new ValueArgument<>(this, valueType, value)); } } diff --git a/src/main/java/io/github/skippyall/minions/program/instruction/ConfiguredInstruction.java b/src/main/java/io/github/skippyall/minions/program/instruction/ConfiguredInstruction.java index f729f08..bb330cc 100644 --- a/src/main/java/io/github/skippyall/minions/program/instruction/ConfiguredInstruction.java +++ b/src/main/java/io/github/skippyall/minions/program/instruction/ConfiguredInstruction.java @@ -1,31 +1,30 @@ package io.github.skippyall.minions.program.instruction; -import io.github.skippyall.minions.MinionRegistries; import io.github.skippyall.minions.Minions; -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.program.InstructionRuntime; import io.github.skippyall.minions.program.argument.ArgumentList; import net.minecraft.storage.ReadView; import net.minecraft.storage.WriteView; import org.jetbrains.annotations.Nullable; -public class ConfiguredInstruction { - private final InstructionType instruction; +public class ConfiguredInstruction> { + private final InstructionType instruction; private final ArgumentList arguments; - private @Nullable InstructionExecution execution; + private @Nullable InstructionExecution execution; private final String name; - private ConfiguredInstruction(InstructionType instruction, ArgumentList arguments, @Nullable InstructionExecution execution, String name) { + private ConfiguredInstruction(InstructionType instruction, ArgumentList arguments, @Nullable InstructionExecution execution, String name) { this.instruction = instruction; this.arguments = arguments; this.execution = execution; this.name = name; } - public ConfiguredInstruction(InstructionType instruction, String name) { + public ConfiguredInstruction(InstructionType instruction, String name) { this(instruction, new ArgumentList<>(), null, name); } - public InstructionType getInstruction() { + public InstructionType getInstruction() { return instruction; } @@ -45,7 +44,7 @@ public class ConfiguredInstruction { return execution != null; } - public @Nullable InstructionExecution getExecution() { + public @Nullable InstructionExecution getExecution() { return execution; } @@ -55,7 +54,7 @@ public class ConfiguredInstruction { execution = instruction.createExecution(arguments, minion); execution.start(minion); } catch (Exception e) { - Minions.LOGGER.error("An error occurred while executing configured Instruction {} of minion {}", name, minion.getGameProfile().getName(), e); + Minions.LOGGER.error("An error occurred while executing configured Instruction {}", name, e); } } @@ -82,26 +81,25 @@ public class ConfiguredInstruction { } public void save(WriteView view, R minion) { - view.put("instruction", MinionRegistries.INSTRUCTION_TYPES.getCodec(), instruction); - view.put("arguments", ArgumentList.CODEC, arguments); + view.put("instruction", minion.getInstructionTypeRegistry().getCodec(), instruction); + view.put("arguments", minion.getArgumentListCodec(), arguments); view.putBoolean("running", isRunning()); if(isRunning()) { execution.save(view.get("execution"), minion); } } - public static ConfiguredInstruction load(ReadView view, R minion, String name) { - //noinspection unchecked - InstructionType instructionType = (InstructionType) view.read("instruction", MinionRegistries.INSTRUCTION_TYPES.getCodec()).orElseThrow(); + public static > ConfiguredInstruction load(ReadView view, R minion, String name) { + InstructionType instructionType = view.read("instruction", minion.getInstructionTypeRegistry().getCodec()).orElseThrow(); - ArgumentList arguments = view.read("arguments", ArgumentList.get).orElseThrow(); + ArgumentList arguments = view.read("arguments", minion.getArgumentListCodec()).orElseThrow(); boolean running = view.getBoolean("running", false); if(running) { ReadView executionView = view.getReadView("execution"); try { - InstructionExecution execution = instructionType.loadExecution(executionView, minion); + InstructionExecution execution = instructionType.loadExecution(executionView, minion); return new ConfiguredInstruction<>(instructionType, arguments, execution, name); } catch (Exception e) { diff --git a/src/main/java/io/github/skippyall/minions/program/instruction/InstructionExecution.java b/src/main/java/io/github/skippyall/minions/program/instruction/InstructionExecution.java index 3446482..ee84554 100644 --- a/src/main/java/io/github/skippyall/minions/program/instruction/InstructionExecution.java +++ b/src/main/java/io/github/skippyall/minions/program/instruction/InstructionExecution.java @@ -1,5 +1,6 @@ package io.github.skippyall.minions.program.instruction; +import io.github.skippyall.minions.program.InstructionRuntime; import io.github.skippyall.minions.program.argument.ArgumentList; import net.minecraft.storage.ReadView; import net.minecraft.storage.WriteView; @@ -10,9 +11,8 @@ import net.minecraft.storage.WriteView; *
  • A new instance is created using the factory
  • *
  • {@link InstructionExecution#readArguments(ArgumentList, R) readFromParameters} is called
  • *
  • {@link InstructionExecution#start(R) start} is called
  • - * @param */ -public interface InstructionExecution { +public interface InstructionExecution> { /** * Starts the execution. */ @@ -36,9 +36,8 @@ public interface InstructionExecution { * This should undo changes to the minion unless they are supposed to be permanent. * * @param runtime The runtime that was executing this instruction. - * @return The return value of the instruction */ - Return stop(R runtime); + void stop(R runtime); /** * Initializes the execution with its arguments. diff --git a/src/main/java/io/github/skippyall/minions/program/instruction/InstructionType.java b/src/main/java/io/github/skippyall/minions/program/instruction/InstructionType.java index d057809..a6d64a3 100644 --- a/src/main/java/io/github/skippyall/minions/program/instruction/InstructionType.java +++ b/src/main/java/io/github/skippyall/minions/program/instruction/InstructionType.java @@ -1,60 +1,51 @@ package io.github.skippyall.minions.program.instruction; import io.github.skippyall.minions.gui.GuiDisplay; -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.program.InstructionRuntime; import io.github.skippyall.minions.program.argument.Parameter; import io.github.skippyall.minions.program.argument.ArgumentList; import io.github.skippyall.minions.program.value.ValueType; -import net.minecraft.network.codec.PacketCodec; -import net.minecraft.recipe.Recipe; import net.minecraft.storage.ReadView; import java.util.Collection; import java.util.List; import java.util.function.Supplier; -public class InstructionType> { +public class InstructionType> { private final GuiDisplay display; private final Collection> parameters; - private final ValueType returnType; - private final Supplier> executionFactory; + private final Supplier> executionFactory; - private InstructionType(GuiDisplay display, Supplier> executionFactory, ValueType returnType, Collection> parameters) { + private InstructionType(GuiDisplay display, Supplier> executionFactory, Collection> parameters) { this.display = display; this.parameters = parameters; - this.returnType = returnType; this.executionFactory = executionFactory; } - public static > InstructionType create(GuiDisplay display, Supplier> executionFactory, ValueType returnType, Collection> parameters) { - return new InstructionType<>(display, executionFactory, returnType, List.copyOf(parameters)); + public static > InstructionType create(GuiDisplay display, Supplier> executionFactory, Collection> parameters) { + return new InstructionType<>(display, executionFactory, List.copyOf(parameters)); } - public static > InstructionType create(GuiDisplay display, Supplier> executionFactory, ValueType returnType, Parameter... parameters) { - return new InstructionType<>(display, executionFactory, returnType, List.of(parameters)); + public static > InstructionType create(GuiDisplay display, Supplier> executionFactory, ValueType returnType, Parameter... parameters) { + return new InstructionType<>(display, executionFactory, List.of(parameters)); } public Collection> getParameters() { return parameters; } - public ValueType getReturnType() { - return returnType; - } - public GuiDisplay getDisplay() { return display; } - public InstructionExecution createExecution(ArgumentList parameters, R minion) { - InstructionExecution execution = executionFactory.get(); + public InstructionExecution createExecution(ArgumentList parameters, R minion) { + InstructionExecution execution = executionFactory.get(); execution.readArguments(parameters, minion); return execution; } - public InstructionExecution loadExecution(ReadView view, R minion) { - InstructionExecution execution = executionFactory.get(); + public InstructionExecution loadExecution(ReadView view, R minion) { + InstructionExecution execution = executionFactory.get(); execution.load(view, minion); return execution; } diff --git a/src/main/java/io/github/skippyall/minions/program/returnvalue/GenericValueConsumerType.java b/src/main/java/io/github/skippyall/minions/program/returnvalue/GenericValueConsumerType.java deleted file mode 100644 index 850300f..0000000 --- a/src/main/java/io/github/skippyall/minions/program/returnvalue/GenericValueConsumerType.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.skippyall.minions.program.returnvalue; - -import io.github.skippyall.minions.program.InstructionRuntime; -import io.github.skippyall.minions.program.argument.Argument; -import io.github.skippyall.minions.program.argument.SpecificArgumentType; -import io.github.skippyall.minions.program.value.ValueType; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; - -public interface GenericValueConsumerType> { - default SpecificValueConsumerType, R> createTypeSpecific(ValueType valueType) { - return createTypeSpecific(valueType, this); - } - - SpecificValueConsumerType, R> createTypeSpecific(ValueType valueType, GenericValueConsumerType me); - - default boolean canCreate(ValueType valueType) { - return true; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/returnvalue/ReturnValueList.java b/src/main/java/io/github/skippyall/minions/program/returnvalue/ReturnValueList.java deleted file mode 100644 index 6db8ac7..0000000 --- a/src/main/java/io/github/skippyall/minions/program/returnvalue/ReturnValueList.java +++ /dev/null @@ -1,57 +0,0 @@ -package io.github.skippyall.minions.program.returnvalue; - -import com.mojang.serialization.Codec; -import io.github.skippyall.minions.program.InstructionRuntime; -import io.github.skippyall.minions.program.argument.Argument; -import io.github.skippyall.minions.program.argument.Arguments; -import io.github.skippyall.minions.program.argument.GenericArgumentType; -import io.github.skippyall.minions.program.argument.Parameter; -import io.github.skippyall.minions.program.argument.SpecificArgumentType; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -public class ReturnValueList> { - private final Map> arguments; - - public ReturnValueList() { - arguments = new HashMap<>(); - } - - public ReturnValueList(Map> arguments) { - this.arguments = new HashMap<>(arguments); - } - - public T getValue(Parameter parameter, R runtime) { - Argument argument = getArgument(parameter); - return argument != null ? argument.resolve(runtime) : null; - } - - public ,R>> A getArgument(Parameter parameter) { - Argument argument = arguments.get(parameter.name()); - return argument == null ? null : argument.cast(parameter.type()); - } - - public void setArgument(Parameter parameter, Argument argument) { - arguments.put(parameter.name(), argument); - } - - public boolean hasArgumentFor(Parameter parameter) { - return getArgument(parameter) != null; - } - - public boolean hasArgumentForAll(Collection> checkParameters) { - for(Parameter parameter : checkParameters) { - if(!hasArgumentFor(parameter)) { - return false; - } - } - return true; - } - - public static > Codec> getCodec(Codec> genericCodec) { - return Codec.unboundedMap(Codec.STRING, Arguments.createArgumentCodec(genericCodec)) - .xmap(ReturnValueList::new, list -> list.arguments); - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/returnvalue/SpecificValueConsumerType.java b/src/main/java/io/github/skippyall/minions/program/returnvalue/SpecificValueConsumerType.java deleted file mode 100644 index 74cf27c..0000000 --- a/src/main/java/io/github/skippyall/minions/program/returnvalue/SpecificValueConsumerType.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.skippyall.minions.program.returnvalue; - -import com.mojang.serialization.Codec; -import io.github.skippyall.minions.program.InstructionRuntime; -import io.github.skippyall.minions.program.argument.Argument; -import io.github.skippyall.minions.program.argument.GenericArgumentType; -import io.github.skippyall.minions.program.value.ValueType; -import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.Nullable; - -import java.util.concurrent.CompletableFuture; - -/** - * SpecificArgumentTypes create Arguments of the specified ValueType. - * They are also responsible for the serialization and user input of arguments. - * @param The value type of the Arguments to create - * @param
    The type of the Arguments themselves - */ -public abstract class SpecificValueConsumerType, R>, R extends InstructionRuntime> { - public final ValueType valueType; - public final GenericArgumentType genericType; - - public SpecificValueConsumerType(ValueType valueType, GenericArgumentType genericType) { - this.valueType = valueType; - this.genericType = genericType; - } - - public abstract Codec getValueConsumerCodec(); - - public abstract CompletableFuture openValueConsumerDialog(ServerPlayerEntity player, @Nullable A previousArgument); - - public ValueType getValueType() { - return valueType; - } - - public GenericArgumentType getGenericArgumentType() { - return genericType; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumer.java b/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumer.java index 66a0ac8..18d9e35 100644 --- a/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumer.java +++ b/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumer.java @@ -2,7 +2,7 @@ package io.github.skippyall.minions.program.returnvalue; import io.github.skippyall.minions.gui.GuiDisplay; import io.github.skippyall.minions.program.InstructionRuntime; -import io.github.skippyall.minions.program.argument.SpecificArgumentType; +import io.github.skippyall.minions.program.argument.ArgumentType; import io.github.skippyall.minions.program.value.ValueType; import org.jetbrains.annotations.Nullable; @@ -11,20 +11,17 @@ import org.jetbrains.annotations.Nullable; * Its value is resolved at runtime and can vary between executions. * Arguments are created exclusively by SpecificArgumentTypes. * @param The type of the Argument's value - * @param The SpecificArgumentType */ -public interface ValueConsumer, R>, R extends InstructionRuntime> { +public interface ValueConsumer> { void consume(T value, R runtime); - default ValueType getValueType() { - return getType().getValueType(); - } - GuiDisplay getDisplay(); - S getType(); + ValueType getValueType(); - default , R>> @Nullable A cast(ValueType type) { + ValueConsumerType getType(); + + default > @Nullable A cast(ValueType type) { if(getValueType() == type) { //noinspection unchecked return (A) this; diff --git a/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumerList.java b/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumerList.java new file mode 100644 index 0000000..867aa15 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumerList.java @@ -0,0 +1,34 @@ +package io.github.skippyall.minions.program.returnvalue; + +import com.mojang.serialization.Codec; +import io.github.skippyall.minions.program.InstructionRuntime; +import io.github.skippyall.minions.program.argument.Parameter; + +import java.util.HashMap; +import java.util.Map; + +public class ValueConsumerList> { + private final Map> valueConsumers; + + public ValueConsumerList() { + valueConsumers = new HashMap<>(); + } + + public ValueConsumerList(Map> valueConsumers) { + this.valueConsumers = new HashMap<>(valueConsumers); + } + + public > A getValueConsumer(Parameter parameter) { + ValueConsumer argument = valueConsumers.get(parameter.name()); + return argument == null ? null : argument.cast(parameter.type()); + } + + public void setValueConsumer(Parameter parameter, ValueConsumer consumer) { + valueConsumers.put(parameter.name(), consumer); + } + + public static > Codec> getCodec(Codec> genericCodec) { + return Codec.unboundedMap(Codec.STRING, ValueConsumers.createValueConsumersCodec(genericCodec)) + .xmap(ValueConsumerList::new, list -> list.valueConsumers); + } +} diff --git a/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumerType.java b/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumerType.java new file mode 100644 index 0000000..0b9f9e1 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumerType.java @@ -0,0 +1,16 @@ +package io.github.skippyall.minions.program.returnvalue; + +import com.mojang.serialization.Codec; +import io.github.skippyall.minions.program.InstructionRuntime; +import io.github.skippyall.minions.program.argument.Argument; +import io.github.skippyall.minions.program.value.ValueType; +import net.minecraft.server.network.ServerPlayerEntity; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +public abstract class ValueConsumerType> { + public abstract Codec> getCodec(ValueType type); + + public abstract CompletableFuture> openConfiguration(ServerPlayerEntity player, ValueType valueType, @Nullable ValueConsumer previous); +} diff --git a/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumers.java b/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumers.java new file mode 100644 index 0000000..fb1e76d --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/program/returnvalue/ValueConsumers.java @@ -0,0 +1,24 @@ +package io.github.skippyall.minions.program.returnvalue; + +import com.mojang.serialization.Codec; +import io.github.skippyall.minions.MinionRegistries; +import io.github.skippyall.minions.Minions; +import io.github.skippyall.minions.minion.MinionRuntime; +import io.github.skippyall.minions.program.InstructionRuntime; +import io.github.skippyall.minions.program.argument.Argument; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; + +public class ValueConsumers { + public static > Codec> createValueConsumersCodec(Codec> codec) { + return codec.dispatch( + "type", + ValueConsumer::getType, + type -> + MinionRegistries.VALUE_TYPES.getCodec().>dispatch( + ValueConsumer::getValueType, + valueType -> type.getCodec(valueType).fieldOf("valueType") + ).fieldOf("valueType") + ); + } +}