From b6f7bfc57b03d60c5fe29d83dbd3c500a9812e1b Mon Sep 17 00:00:00 2001 From: skippyall <> Date: Fri, 12 Sep 2025 00:59:57 +0200 Subject: [PATCH] Redo everything --- .../github/skippyall/minions/MinionItems.java | 2 - .../skippyall/minions/MinionRegistries.java | 22 ++++++ .../io/github/skippyall/minions/Minions.java | 19 ++++- .../skippyall/minions/gui/CommandsGui.java | 18 +---- .../skippyall/minions/gui/Displayable.java | 5 ++ .../skippyall/minions/gui/GuiDisplay.java | 36 +++++++++ .../skippyall/minions/gui/MinionGui.java | 4 +- .../skippyall/minions/gui/MinionLookGui.java | 7 +- .../minions/gui/ModuleInventory.java | 40 ++++------ .../skippyall/minions/input/ChoiceInput.java | 37 +++++++++ .../skippyall/minions/input/TextInput.java | 6 +- .../minion/MinionInstructionManager.java | 75 ++++++++++++++++++ .../minion/fakeplayer/MinionFakePlayer.java | 37 +++++---- .../minions/minion/skin/SkinProviders.java | 9 +-- .../minions/mixins/MobEntityMixin.java | 3 +- .../minions/mixins/SpawnHelperMixin.java | 3 +- ...DistanceFromNearestPlayerTrackerMixin.java | 3 +- .../minions/module/AttackModule.java | 34 -------- .../skippyall/minions/module/ChatModule.java | 22 ------ .../minions/module/InteractModule.java | 34 -------- .../minions/module/MobSpawningModule.java | 30 ------- .../skippyall/minions/module/ModuleItem.java | 10 --- .../skippyall/minions/module/Modules.java | 30 ------- .../skippyall/minions/module/MountModule.java | 41 ---------- .../skippyall/minions/module/MoveModule.java | 76 ------------------ .../minions/module/SimpleModuleItem.java | 24 ------ .../minions/module/action/ActionModules.java | 68 ---------------- .../minions/module/command/Command.java | 10 --- .../module/command/CommandExecutor.java | 8 -- .../minions/module/command/SimpleCommand.java | 40 ---------- .../instruction/InstructionDisplay.java | 9 --- .../minions/new_module/MinionModule.java | 38 +++++++++ .../minions/new_module/ModuleLoader.java | 30 +++++++ .../minions/new_program/ParameterList.java | 32 -------- .../new_program/argument/Argument.java | 29 ++++++- .../new_program/argument/ArgumentList.java | 50 ++++++++++++ .../new_program/argument/Arguments.java | 22 ++++-- .../argument/GenericArgumentType.java | 2 +- .../new_program/argument/Parameter.java | 24 ++++++ .../argument/SpecificArgumentType.java | 13 +++- .../new_program/argument/ValueArgument.java | 21 +++-- .../argument/ValueArgumentType.java | 17 +++- .../new_program/instruction/Instruction.java | 15 ---- .../instruction/InstructionExecution.java | 66 ++++++++++++++++ .../instruction/InstructionRun.java | 9 --- .../instruction/InstructionType.java | 58 ++++++++++++++ .../new_program/instruction/Instructions.java | 43 ++++++++++ .../execution/ActionExecution.java | 35 +++++++++ .../ContinuousInstructionExecution.java | 11 +++ .../execution/TimedInstructionExecution.java | 43 ++++++++++ .../instruction/execution/TurnExecution.java | 67 ++++++++++++++++ .../instruction/execution/WalkExecution.java | 53 +++++++++++++ .../new_program/value/FloatValueType.java | 20 ----- .../new_program/value/IntegerValueType.java | 20 ----- .../minions/new_program/value/ValueType.java | 10 ++- .../minions/new_program/value/ValueTypes.java | 78 +++++++++++++++++++ .../minions/program/argument/Arg.java | 9 --- .../minions/program/argument/ArgUtils.java | 16 ---- .../minions/program/block/CodeBlock.java | 34 -------- .../minions/program/block/CodeBlocks.java | 5 -- .../block/CodeContainingCodeBlock.java | 15 ---- .../minions/program/block/GoBlock.java | 27 ------- .../minions/program/block/UseBlock.java | 26 ------- .../program/runtime/MinionRuntime.java | 15 ---- .../program/runtime/ProgramRuntime.java | 42 ---------- .../minions/program/statement/Statement.java | 73 ----------------- .../program/statement/StatementList.java | 50 ------------ .../minions/program/tuple/Tuple.java | 29 ------- .../minions/program/tuple/Tuple0.java | 25 ------ .../minions/program/tuple/Tuple1.java | 25 ------ .../minions/program/tuple/Tuple2.java | 25 ------ .../minions/program/tuple/Tuple3.java | 25 ------ .../minions/program/tuple/Tuple4.java | 25 ------ .../minions/program/tuple/Tuple5.java | 25 ------ .../minions/program/variables/FloatType.java | 4 - .../program/variables/IntegerType.java | 4 - .../minions/program/variables/Type.java | 8 -- .../minions/program/variables/Types.java | 7 -- .../program/variables/ValueStorage.java | 7 -- .../minions/program/variables/Variable.java | 29 ------- .../skippyall/minions/util/ModelIdUtil.java | 12 +++ .../minions/util/TranslationUtil.java | 26 +++++++ .../resources/data/minions/lang/en_us.json | 7 +- .../data/minions/minion_module/move.json | 5 ++ 84 files changed, 980 insertions(+), 1188 deletions(-) create mode 100644 src/main/java/io/github/skippyall/minions/MinionRegistries.java create mode 100644 src/main/java/io/github/skippyall/minions/gui/Displayable.java create mode 100644 src/main/java/io/github/skippyall/minions/gui/GuiDisplay.java create mode 100644 src/main/java/io/github/skippyall/minions/input/ChoiceInput.java create mode 100644 src/main/java/io/github/skippyall/minions/minion/MinionInstructionManager.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/AttackModule.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/ChatModule.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/InteractModule.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/MobSpawningModule.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/ModuleItem.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/Modules.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/MountModule.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/MoveModule.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/SimpleModuleItem.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/action/ActionModules.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/command/Command.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/command/CommandExecutor.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/command/SimpleCommand.java delete mode 100644 src/main/java/io/github/skippyall/minions/module/instruction/InstructionDisplay.java create mode 100644 src/main/java/io/github/skippyall/minions/new_module/MinionModule.java create mode 100644 src/main/java/io/github/skippyall/minions/new_module/ModuleLoader.java delete mode 100644 src/main/java/io/github/skippyall/minions/new_program/ParameterList.java create mode 100644 src/main/java/io/github/skippyall/minions/new_program/argument/ArgumentList.java create mode 100644 src/main/java/io/github/skippyall/minions/new_program/argument/Parameter.java delete mode 100644 src/main/java/io/github/skippyall/minions/new_program/instruction/Instruction.java create mode 100644 src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionExecution.java delete mode 100644 src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionRun.java create mode 100644 src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionType.java create mode 100644 src/main/java/io/github/skippyall/minions/new_program/instruction/Instructions.java create mode 100644 src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ActionExecution.java create mode 100644 src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ContinuousInstructionExecution.java create mode 100644 src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TimedInstructionExecution.java create mode 100644 src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TurnExecution.java create mode 100644 src/main/java/io/github/skippyall/minions/new_program/instruction/execution/WalkExecution.java delete mode 100644 src/main/java/io/github/skippyall/minions/new_program/value/FloatValueType.java delete mode 100644 src/main/java/io/github/skippyall/minions/new_program/value/IntegerValueType.java create mode 100644 src/main/java/io/github/skippyall/minions/new_program/value/ValueTypes.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/argument/Arg.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/argument/ArgUtils.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/block/CodeBlock.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/block/CodeBlocks.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/block/CodeContainingCodeBlock.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/block/GoBlock.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/block/UseBlock.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/runtime/MinionRuntime.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/runtime/ProgramRuntime.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/statement/Statement.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/statement/StatementList.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/tuple/Tuple.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/tuple/Tuple0.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/tuple/Tuple1.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/tuple/Tuple2.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/tuple/Tuple3.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/tuple/Tuple4.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/tuple/Tuple5.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/variables/FloatType.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/variables/IntegerType.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/variables/Type.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/variables/Types.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/variables/ValueStorage.java delete mode 100644 src/main/java/io/github/skippyall/minions/program/variables/Variable.java create mode 100644 src/main/java/io/github/skippyall/minions/util/ModelIdUtil.java create mode 100644 src/main/java/io/github/skippyall/minions/util/TranslationUtil.java create mode 100644 src/main/resources/data/minions/minion_module/move.json diff --git a/src/main/java/io/github/skippyall/minions/MinionItems.java b/src/main/java/io/github/skippyall/minions/MinionItems.java index f4e2c27..e9d644c 100644 --- a/src/main/java/io/github/skippyall/minions/MinionItems.java +++ b/src/main/java/io/github/skippyall/minions/MinionItems.java @@ -2,7 +2,6 @@ package io.github.skippyall.minions; import eu.pb4.polymer.core.api.item.SimplePolymerItem; import io.github.skippyall.minions.minion.MinionItem; -import io.github.skippyall.minions.module.Modules; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.DamageResistantComponent; import net.minecraft.entity.damage.DamageType; @@ -39,6 +38,5 @@ public class MinionItems { } public static void register() { - Modules.register(); } } diff --git a/src/main/java/io/github/skippyall/minions/MinionRegistries.java b/src/main/java/io/github/skippyall/minions/MinionRegistries.java new file mode 100644 index 0000000..4aeba4e --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/MinionRegistries.java @@ -0,0 +1,22 @@ +package io.github.skippyall.minions; + +import com.mojang.serialization.Lifecycle; +import io.github.skippyall.minions.minion.skin.SkinProvider; +import io.github.skippyall.minions.new_program.argument.GenericArgumentType; +import io.github.skippyall.minions.new_program.instruction.InstructionType; +import io.github.skippyall.minions.new_program.value.ValueType; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.SimpleRegistry; +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 SKIN_PROVIDERS = registry("skin_providers"); + + private static Registry registry(String id) { + return new SimpleRegistry<>(RegistryKey.ofRegistry(Identifier.of(Minions.MOD_ID, id)), Lifecycle.stable()); + } +} diff --git a/src/main/java/io/github/skippyall/minions/Minions.java b/src/main/java/io/github/skippyall/minions/Minions.java index 71ba195..114acb6 100644 --- a/src/main/java/io/github/skippyall/minions/Minions.java +++ b/src/main/java/io/github/skippyall/minions/Minions.java @@ -5,12 +5,19 @@ import io.github.skippyall.minions.command.MinionsCommand; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.minion.MinionData; import io.github.skippyall.minions.minion.MinionPersistentState; +import io.github.skippyall.minions.minion.skin.SkinProviders; import io.github.skippyall.minions.mixins.PlayerListEntryS2CPacket$EntryMixin; +import io.github.skippyall.minions.new_module.MinionModule; +import io.github.skippyall.minions.new_module.ModuleLoader; +import io.github.skippyall.minions.new_program.instruction.Instructions; +import io.github.skippyall.minions.new_program.value.ValueTypes; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.resource.ResourceType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,10 +28,12 @@ public class Minions implements ModInitializer { @Override public void onInitialize() { + Instructions.register(); + MinionData.register(); - PolymerEntityUtils.registerType(); + MinionModule.register(); + ServerLifecycleEvents.SERVER_STARTED.register(server -> { - LOGGER.error("Initializing Minion data"); MinionPersistentState.create(server); MinionPersistentState.INSTANCE.getMinionData().forEach((uuid, data) -> { if(data.isSpawned()) { @@ -32,14 +41,16 @@ public class Minions implements ModInitializer { } }); }); - PlayerEntity - ClientPlayNetworkHandler CommandRegistrationCallback.EVENT.register((commandDispatcher, commandRegistryAccess, registrationEnvironment) -> { MinionsCommand.register(commandDispatcher); }); + ValueTypes.register(); + SkinProviders.register(); MinionItems.register(); MinionCreativeTab.registerGroup(); + + ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(new ModuleLoader()); } } diff --git a/src/main/java/io/github/skippyall/minions/gui/CommandsGui.java b/src/main/java/io/github/skippyall/minions/gui/CommandsGui.java index 64eba4d..8fa1f06 100644 --- a/src/main/java/io/github/skippyall/minions/gui/CommandsGui.java +++ b/src/main/java/io/github/skippyall/minions/gui/CommandsGui.java @@ -1,20 +1,8 @@ package io.github.skippyall.minions.gui; -import eu.pb4.sgui.api.elements.GuiElementBuilder; -import eu.pb4.sgui.api.gui.SimpleGui; -import io.github.skippyall.minions.module.command.Command; -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.module.ModuleItem; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; - -import java.util.Collection; -import java.util.List; - public class CommandsGui { - public static void openServerModuleCommandGui(ServerPlayerEntity player, MinionFakePlayer minion) { - Collection modules = minion.getModuleInventory().getModuleItems(); + /*public static void openServerModuleCommandGui(ServerPlayerEntity player, MinionFakePlayer minion) { + Collection modules = minion.getModuleInventory().getModules(); SimpleGui gui = new SimpleGui(ScreenHandlerType.GENERIC_9X3, player, false); @@ -48,5 +36,5 @@ public class CommandsGui { } commandGui.open(); - } + }*/ } diff --git a/src/main/java/io/github/skippyall/minions/gui/Displayable.java b/src/main/java/io/github/skippyall/minions/gui/Displayable.java new file mode 100644 index 0000000..75da4b0 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/gui/Displayable.java @@ -0,0 +1,5 @@ +package io.github.skippyall.minions.gui; + +public interface Displayable { + GuiDisplay getDisplay(); +} diff --git a/src/main/java/io/github/skippyall/minions/gui/GuiDisplay.java b/src/main/java/io/github/skippyall/minions/gui/GuiDisplay.java new file mode 100644 index 0000000..33e6e57 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/gui/GuiDisplay.java @@ -0,0 +1,36 @@ +package io.github.skippyall.minions.gui; + +import eu.pb4.sgui.api.elements.GuiElementBuilder; +import io.github.skippyall.minions.util.ModelIdUtil; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.LoreComponent; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public interface GuiDisplay { + default GuiElementBuilder createElement() { + return new GuiElementBuilder(createItemStack()); + } + + ItemStack createItemStack(); + + record ModelBased(Identifier model, String translationKeyBase, boolean withLore) implements GuiDisplay { + public ModelBased(Item model, String translationKeyBase, boolean withLore) { + this(ModelIdUtil.getItemModelId(model), translationKeyBase, withLore); + } + + @Override + public ItemStack createItemStack() { + ItemStack stack = new ItemStack(Items.BARRIER); + stack.set(DataComponentTypes.ITEM_MODEL, model); + stack.set(DataComponentTypes.ITEM_NAME, Text.translatable(translationKeyBase + ".name")); + if(withLore) { + stack.set(DataComponentTypes.LORE, LoreComponent.DEFAULT.with(Text.translatable(translationKeyBase + ".description"))); + } + return stack; + } + } +} diff --git a/src/main/java/io/github/skippyall/minions/gui/MinionGui.java b/src/main/java/io/github/skippyall/minions/gui/MinionGui.java index 7c62408..100f27a 100644 --- a/src/main/java/io/github/skippyall/minions/gui/MinionGui.java +++ b/src/main/java/io/github/skippyall/minions/gui/MinionGui.java @@ -22,7 +22,7 @@ public class MinionGui { .setItem(Items.COMMAND_BLOCK) .setName(Text.translatable("minions.gui.main.commands")) .setCallback((i, clickType, slotActionType) -> { - openCommandsGui(player, minion); + InstructionGui.openInstructionMainMenu(minion, player); }) ); gui.setSlot(3, new GuiElementBuilder() @@ -50,7 +50,7 @@ public class MinionGui { } public static void openCommandsGui(ServerPlayerEntity player, MinionFakePlayer minion) { - CommandsGui.openServerModuleCommandGui(player, minion); + //CommandsGui.openServerModuleCommandGui(player, minion); } public static void openProgrammingInventory(ServerPlayerEntity player, MinionFakePlayer minion) { diff --git a/src/main/java/io/github/skippyall/minions/gui/MinionLookGui.java b/src/main/java/io/github/skippyall/minions/gui/MinionLookGui.java index bbef5b0..ca88b79 100644 --- a/src/main/java/io/github/skippyall/minions/gui/MinionLookGui.java +++ b/src/main/java/io/github/skippyall/minions/gui/MinionLookGui.java @@ -2,6 +2,7 @@ package io.github.skippyall.minions.gui; 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.MinionData; import io.github.skippyall.minions.minion.MinionItem; @@ -57,13 +58,13 @@ public class MinionLookGui extends SimpleGui { } private void cycleSkinProvider() { - int currentId = SkinProviders.SKIN_PROVIDERS.getRawId(currentSkinProvider); + int currentId = MinionRegistries.SKIN_PROVIDERS.getRawId(currentSkinProvider); currentId++; - if(SkinProviders.SKIN_PROVIDERS.size() == currentId) { + if(MinionRegistries.SKIN_PROVIDERS.size() == currentId) { currentId = 0; } - currentSkinProvider = SkinProviders.SKIN_PROVIDERS.get(currentId); + currentSkinProvider = MinionRegistries.SKIN_PROVIDERS.get(currentId); updateSkinProvider(); } diff --git a/src/main/java/io/github/skippyall/minions/gui/ModuleInventory.java b/src/main/java/io/github/skippyall/minions/gui/ModuleInventory.java index 78e2f8c..b021a00 100644 --- a/src/main/java/io/github/skippyall/minions/gui/ModuleInventory.java +++ b/src/main/java/io/github/skippyall/minions/gui/ModuleInventory.java @@ -1,9 +1,8 @@ package io.github.skippyall.minions.gui; -import io.github.skippyall.minions.module.command.Command; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.module.ModuleItem; -import io.github.skippyall.minions.program.block.CodeBlock; +import io.github.skippyall.minions.new_module.MinionModule; +import io.github.skippyall.minions.new_program.instruction.InstructionType; import net.minecraft.inventory.Inventories; import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.ItemStack; @@ -20,7 +19,7 @@ import java.util.List; import java.util.Set; public class ModuleInventory extends SimpleInventory { - private final Set modules = new HashSet<>(); + private final Set modules = new HashSet<>(); public ModuleInventory() { super(27); } @@ -36,7 +35,7 @@ public class ModuleInventory extends SimpleInventory { @Override public boolean isValid(int slot, ItemStack stack) { - return (stack.getCount() <= getMaxCountPerStack()) && stack.getItem() instanceof ModuleItem; + return (stack.getCount() <= getMaxCountPerStack()) && stack.contains(MinionModule.COMPONENT_TYPE); } @Override @@ -48,8 +47,9 @@ public class ModuleInventory extends SimpleInventory { public void updateModules() { modules.clear(); for (ItemStack heldStack : heldStacks) { - if(heldStack.getItem() instanceof ModuleItem moduleItem) { - modules.add(moduleItem); + MinionModule module = heldStack.get(MinionModule.COMPONENT_TYPE); + if(module != null) { + modules.add(module); } } } @@ -63,31 +63,19 @@ public class ModuleInventory extends SimpleInventory { Inventories.writeData(view, heldStacks); } - public boolean hasModule(ModuleItem module) { + public boolean hasModule(MinionModule module) { return modules.contains(module); } - public Collection getModuleItems() { + public Collection getModules() { return modules; } - public List getAllCommands() { - ArrayList commands = new ArrayList<>(); - for(ItemStack stack : heldStacks) { - if(stack.getItem() instanceof ModuleItem module) { - commands.addAll(module.getCommands()); - } + public List> getAllInstructions() { + ArrayList> instructionTypes = new ArrayList<>(); + for(MinionModule module : modules) { + instructionTypes.addAll(module.instructions()); } - return commands; - } - - public List> getAllCodeBlocks() { - ArrayList> commands = new ArrayList<>(); - for(ItemStack stack : heldStacks) { - if(stack.getItem() instanceof ModuleItem module) { - commands.addAll(module.getCodeBlocks()); - } - } - return commands; + return instructionTypes; } } diff --git a/src/main/java/io/github/skippyall/minions/input/ChoiceInput.java b/src/main/java/io/github/skippyall/minions/input/ChoiceInput.java new file mode 100644 index 0000000..9b1a207 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/input/ChoiceInput.java @@ -0,0 +1,37 @@ +package io.github.skippyall.minions.input; + +import eu.pb4.sgui.api.gui.SimpleGui; +import io.github.skippyall.minions.gui.Displayable; +import io.github.skippyall.minions.gui.GuiDisplay; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.server.network.ServerPlayerEntity; + +import java.util.concurrent.CompletableFuture; +import java.util.function.BiFunction; +import java.util.function.Function; + +public class ChoiceInput { + public static BiFunction> createDialogOpener(Function displayFunction, T[] values) { + return (player, object) -> { + CompletableFuture future = new CompletableFuture<>(); + + SimpleGui gui = new SimpleGui(ScreenHandlerType.GENERIC_9X3, player, false) { + @Override + public void onClose() { + future.cancel(false); + } + }; + for(T value : values) { + gui.addSlot(displayFunction.apply(value).createElement() + .setCallback(() -> future.complete(value)) + ); + } + gui.open(); + return future; + }; + } + + public static BiFunction> createDialogOpener(T[] values) { + return createDialogOpener(Displayable::getDisplay, values); + } +} diff --git a/src/main/java/io/github/skippyall/minions/input/TextInput.java b/src/main/java/io/github/skippyall/minions/input/TextInput.java index 1ad03d5..14fdb7a 100644 --- a/src/main/java/io/github/skippyall/minions/input/TextInput.java +++ b/src/main/java/io/github/skippyall/minions/input/TextInput.java @@ -22,6 +22,7 @@ public class TextInput extends AnvilInputGui { private final Function>> parser; private final CompletableFuture future; private Result result; + private boolean isConfirm; public TextInput(ServerPlayerEntity player, Text title, String defaultValue, Function>> parser, CompletableFuture future) { super(player, false); @@ -74,7 +75,7 @@ public class TextInput extends AnvilInputGui { @Override public void onClose() { - if(!future.isDone()) { + if(!future.isDone() && !isConfirm) { future.cancel(false); } } @@ -82,8 +83,9 @@ public class TextInput extends AnvilInputGui { public void onConfirm() { if(result != null) { result.ifSuccess(success -> { - future.complete(success); + isConfirm = true; close(); + future.complete(success); }); } } diff --git a/src/main/java/io/github/skippyall/minions/minion/MinionInstructionManager.java b/src/main/java/io/github/skippyall/minions/minion/MinionInstructionManager.java new file mode 100644 index 0000000..2f3f982 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/minion/MinionInstructionManager.java @@ -0,0 +1,75 @@ +package io.github.skippyall.minions.minion; + +import io.github.skippyall.minions.Minions; +import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.new_program.instruction.ConfiguredInstruction; +import io.github.skippyall.minions.new_program.instruction.InstructionType; +import net.minecraft.storage.ReadView; +import net.minecraft.storage.WriteView; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +public class MinionInstructionManager { + private final MinionFakePlayer minion; + private final Map> configuredInstructions = new HashMap<>(); + + public MinionInstructionManager(MinionFakePlayer minion) { + this.minion = minion; + } + + public void tick() { + for (ConfiguredInstruction instruction : configuredInstructions.values()) { + instruction.tick(minion); + } + } + + public Set getInstructionNames() { + return configuredInstructions.keySet(); + } + + public ConfiguredInstruction createInstruction(String name, InstructionType instructionType) { + ConfiguredInstruction instruction = new ConfiguredInstruction<>(instructionType, name); + configuredInstructions.put(name, instruction); + return instruction; + } + + public void removeInstruction(String name) { + ConfiguredInstruction instruction = getInstruction(name); + instruction.stop(minion); + configuredInstructions.remove(name); + } + + public ConfiguredInstruction getInstruction(String name) { + return configuredInstructions.get(name); + } + + public void save(WriteView view) { + WriteView.ListView list = view.getList("configuredInstructions"); + for (Map.Entry> instruction : configuredInstructions.entrySet()) { + WriteView inner = list.add(); + inner.putString("name", instruction.getKey()); + instruction.getValue().save(inner, minion); + } + } + + public void load(ReadView view) { + ReadView.ListReadView list = view.getListReadView("configuredInstructions"); + for (ReadView inner : list) { + Optional name = inner.getOptionalString("name"); + if(name.isEmpty()) { + Minions.LOGGER.error("Tried deserializing configured instruction without a name of minion \"{}\":", minion.getGameProfile().getName()); + continue; + } + + try { + ConfiguredInstruction instruction = ConfiguredInstruction.load(inner, minion, name.get()); + configuredInstructions.put(name.get(), instruction); + } catch (Exception e) { + Minions.LOGGER.error("Could not deserialize configured instruction \"{}\" of minion \"{}\":", name.get(), minion.getGameProfile().getName(), e); + } + } + } +} diff --git a/src/main/java/io/github/skippyall/minions/minion/fakeplayer/MinionFakePlayer.java b/src/main/java/io/github/skippyall/minions/minion/fakeplayer/MinionFakePlayer.java index d8e9219..c70f426 100644 --- a/src/main/java/io/github/skippyall/minions/minion/fakeplayer/MinionFakePlayer.java +++ b/src/main/java/io/github/skippyall/minions/minion/fakeplayer/MinionFakePlayer.java @@ -6,16 +6,15 @@ import com.mojang.authlib.properties.PropertyMap; import io.github.skippyall.minions.MinionItems; import io.github.skippyall.minions.minion.MinionData; import io.github.skippyall.minions.gui.MinionGui; +import io.github.skippyall.minions.minion.MinionInstructionManager; import io.github.skippyall.minions.minion.MinionItem; import io.github.skippyall.minions.minion.MinionPersistentState; import io.github.skippyall.minions.minion.MinionProfileUtils; import io.github.skippyall.minions.gui.ModuleInventory; -import io.github.skippyall.minions.program.runtime.MinionRuntime; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.MovementType; import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.HungerManager; @@ -56,7 +55,7 @@ public class MinionFakePlayer extends ServerPlayerEntity { private float moveSideways; private final ModuleInventory moduleInventory = new ModuleInventory(); - private final MinionRuntime runtime = new MinionRuntime(this); + private final MinionInstructionManager instructionManager = new MinionInstructionManager(this); private final MinionData data; @@ -115,14 +114,26 @@ public class MinionFakePlayer extends ServerPlayerEntity { return moduleInventory; } - public MinionRuntime getRuntime() { - return runtime; - } - public EntityPlayerActionPack getMinionActionPack() { return actionPack; } + public MinionInstructionManager getInstructionManager() { + return instructionManager; + } + + public MinionData getData() { + return data; + } + + public boolean canSpawnMobs() { + return true; + } + + public boolean canDespawnMobs() { + return true; + } + @Override public ActionResult interact(PlayerEntity player, Hand hand) { if(player instanceof ServerPlayerEntity spe) { @@ -176,13 +187,13 @@ public class MinionFakePlayer extends ServerPlayerEntity { { super.tick(); this.playerTick(); + instructionManager.tick(); } catch (NullPointerException ignored) { // happens with that paper port thingy - not sure what that would fix, but hey // the game not gonna crash violently. } - runtime.tick(); } @@ -238,7 +249,7 @@ public class MinionFakePlayer extends ServerPlayerEntity { return networkHandler.player; } - public void moveForward(float forward) { + /*public void moveForward(float forward) { this.moveForward += forward; EntityPlayerActionPack actionPack = getMinionActionPack(); if (moveForward != 0) { @@ -274,7 +285,7 @@ public class MinionFakePlayer extends ServerPlayerEntity { moveSideways = newSideways; } super.move(movementType, newMovement); - } + }*/ @Override public void drop(ServerWorld world, DamageSource damageSource) { @@ -291,19 +302,17 @@ public class MinionFakePlayer extends ServerPlayerEntity { return stack; } - public MinionData getData() { - return data; - } - @Override public void writeCustomData(WriteView view) { super.writeCustomData(view); moduleInventory.writeData(view.get("modules")); + instructionManager.save(view.get("instructionManager")); } @Override public void readCustomData(ReadView view) { super.readCustomData(view); moduleInventory.readData(view.getReadView("modules")); + instructionManager.load(view.getReadView("instructionManager")); } } \ No newline at end of file diff --git a/src/main/java/io/github/skippyall/minions/minion/skin/SkinProviders.java b/src/main/java/io/github/skippyall/minions/minion/skin/SkinProviders.java index 06f230d..7749c46 100644 --- a/src/main/java/io/github/skippyall/minions/minion/skin/SkinProviders.java +++ b/src/main/java/io/github/skippyall/minions/minion/skin/SkinProviders.java @@ -1,22 +1,17 @@ package io.github.skippyall.minions.minion.skin; -import com.mojang.serialization.Lifecycle; +import io.github.skippyall.minions.MinionRegistries; import io.github.skippyall.minions.Minions; import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.SimpleRegistry; import net.minecraft.util.Identifier; public class SkinProviders { - public static final Registry SKIN_PROVIDERS = new SimpleRegistry<>(RegistryKey.ofRegistry(Identifier.of(Minions.MOD_ID, "skin_providers")), Lifecycle.stable()); - public static NameSkinProvider NAME = register(new NameSkinProvider(), "name"); public static UUIDSkinProvider UUID = register(new UUIDSkinProvider(), "uuid"); public static Base64SkinProvider BASE64 = register(new Base64SkinProvider(), "base64"); - public static T register(T skinProvider, String path) { - return Registry.register(SKIN_PROVIDERS, Identifier.of(Minions.MOD_ID, path), skinProvider); + return Registry.register(MinionRegistries.SKIN_PROVIDERS, Identifier.of(Minions.MOD_ID, path), skinProvider); } public static void register() { diff --git a/src/main/java/io/github/skippyall/minions/mixins/MobEntityMixin.java b/src/main/java/io/github/skippyall/minions/mixins/MobEntityMixin.java index 1fc138e..8d0e29d 100644 --- a/src/main/java/io/github/skippyall/minions/mixins/MobEntityMixin.java +++ b/src/main/java/io/github/skippyall/minions/mixins/MobEntityMixin.java @@ -4,7 +4,6 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.mixinhelper.EntityViewMixinHelper; -import io.github.skippyall.minions.module.MobSpawningModule; import net.minecraft.entity.Entity; import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.player.PlayerEntity; @@ -18,7 +17,7 @@ public abstract class MobEntityMixin { public PlayerEntity checkMobDespawningMinion(World instance, Entity entity, double maxDistance, Operation original) { EntityViewMixinHelper.ADDITIONAL_PREDICATE.set(entity2 -> { if(entity2 instanceof MinionFakePlayer minion) { - return MobSpawningModule.canMinionDespawnMobs(minion); + return minion.canDespawnMobs(); } else { return true; } diff --git a/src/main/java/io/github/skippyall/minions/mixins/SpawnHelperMixin.java b/src/main/java/io/github/skippyall/minions/mixins/SpawnHelperMixin.java index 4eedb31..a2a31fc 100644 --- a/src/main/java/io/github/skippyall/minions/mixins/SpawnHelperMixin.java +++ b/src/main/java/io/github/skippyall/minions/mixins/SpawnHelperMixin.java @@ -1,7 +1,6 @@ package io.github.skippyall.minions.mixins; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.module.MobSpawningModule; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.server.network.ServerPlayerEntity; @@ -18,7 +17,7 @@ public class SpawnHelperMixin { return instance.getClosestPlayer(x, y, z, maxDistance, EntityPredicates.EXCEPT_SPECTATOR.and(entity -> { if(entity instanceof ServerPlayerEntity player) { if(player instanceof MinionFakePlayer minion) { - return MobSpawningModule.canMinionSpawnMobs(minion); + return minion.canSpawnMobs(); } return true; } diff --git a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManager$DistanceFromNearestPlayerTrackerMixin.java b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManager$DistanceFromNearestPlayerTrackerMixin.java index b6827ac..4af3981 100644 --- a/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManager$DistanceFromNearestPlayerTrackerMixin.java +++ b/src/main/java/io/github/skippyall/minions/mixins/antimobcap/ChunkLevelManager$DistanceFromNearestPlayerTrackerMixin.java @@ -3,7 +3,6 @@ package io.github.skippyall.minions.mixins.antimobcap; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.mixinhelper.ChunkLevelManager$DistanceFromNearestPlayerTrackerAccessor; import io.github.skippyall.minions.mixinhelper.ChunkLevelManagerAccessor; -import io.github.skippyall.minions.module.MobSpawningModule; import it.unimi.dsi.fastutil.longs.Long2ByteMap; import it.unimi.dsi.fastutil.objects.ObjectSet; import net.minecraft.server.network.ServerPlayerEntity; @@ -47,7 +46,7 @@ public abstract class ChunkLevelManager$DistanceFromNearestPlayerTrackerMixin ex if(players != null) { contains = players.stream().anyMatch(player -> { if (player instanceof MinionFakePlayer minion) { - return MobSpawningModule.canMinionSpawnMobs(minion); + return minion.canSpawnMobs(); } return true; }); diff --git a/src/main/java/io/github/skippyall/minions/module/AttackModule.java b/src/main/java/io/github/skippyall/minions/module/AttackModule.java deleted file mode 100644 index ed3913c..0000000 --- a/src/main/java/io/github/skippyall/minions/module/AttackModule.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.github.skippyall.minions.module; - -import io.github.skippyall.minions.Minions; -import io.github.skippyall.minions.module.action.ActionModules; -import io.github.skippyall.minions.minion.fakeplayer.EntityPlayerActionPack; -import io.github.skippyall.minions.module.instruction.InstructionDisplay; -import net.minecraft.item.Items; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import java.util.List; - -import static io.github.skippyall.minions.module.Modules.register; - -public class AttackModule { - public static final InstructionDisplay ATTACK_COMMAND = new InstructionDisplay( - Text.translatable("minions.command.attack.name"), - Text.translatable("minions.command.attack.description"), - Items.DIAMOND_PICKAXE, - ActionModules.detailSelectionExecutor(EntityPlayerActionPack.ActionType.ATTACK, Text.translatable("minions.command.attack.name")) - ); - - public static final SimpleModuleItem ATTACK_MODULE = register( - Identifier.of(Minions.MOD_ID, "attack_module"), - List.of(), - List.of(ATTACK_COMMAND), - Items.DIAMOND_PICKAXE - ); - - public static void registerMe() { - - } -} - diff --git a/src/main/java/io/github/skippyall/minions/module/ChatModule.java b/src/main/java/io/github/skippyall/minions/module/ChatModule.java deleted file mode 100644 index a541598..0000000 --- a/src/main/java/io/github/skippyall/minions/module/ChatModule.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.github.skippyall.minions.module; - -import io.github.skippyall.minions.Minions; -import io.github.skippyall.minions.module.command.SimpleCommand; -import net.minecraft.item.Items; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import java.util.ArrayList; -import java.util.Arrays; - -import static io.github.skippyall.minions.module.Modules.register; - -public class ChatModule { - public static final SimpleModuleItem CHAT_MODULE = register(Identifier.of(Minions.MOD_ID, "chat_module"), - new ArrayList<>(), Arrays.asList( - new SimpleCommand(Text.of("Message"), Text.of("Send Message in Public Chat"), Items.PAPER, (player, minion) -> minion.getServer().getPlayerManager().broadcast(Text.of("message"), true)), - new SimpleCommand(Text.of("Prvt-Message"), Text.of("Send Message to one Person"), Items.TRIAL_KEY, (player, minion) -> {}) - ), Items.PAPER); - - public static void registerMe() {} -} diff --git a/src/main/java/io/github/skippyall/minions/module/InteractModule.java b/src/main/java/io/github/skippyall/minions/module/InteractModule.java deleted file mode 100644 index 9689ac3..0000000 --- a/src/main/java/io/github/skippyall/minions/module/InteractModule.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.github.skippyall.minions.module; - -import io.github.skippyall.minions.Minions; -import io.github.skippyall.minions.module.action.ActionModules; -import io.github.skippyall.minions.module.command.SimpleCommand; -import io.github.skippyall.minions.minion.fakeplayer.EntityPlayerActionPack; -import net.minecraft.item.Items; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import java.util.List; - -import static io.github.skippyall.minions.module.Modules.register; - -public class InteractModule { - public static final SimpleCommand INTERACT_COMMAND = new SimpleCommand( - Text.translatable("minions.command.interact.name"), - Text.translatable("minions.command.interact.description"), - Items.LEVER, - ActionModules.detailSelectionExecutor(EntityPlayerActionPack.ActionType.USE, Text.translatable("minions.command.interact.name")) - ); - - public static final SimpleModuleItem INTERACT_MODULE = register( - Identifier.of(Minions.MOD_ID, "interact_module"), - List.of(), - List.of(INTERACT_COMMAND), - Items.LEVER - ); - - public static void registerMe() { - - } -} - diff --git a/src/main/java/io/github/skippyall/minions/module/MobSpawningModule.java b/src/main/java/io/github/skippyall/minions/module/MobSpawningModule.java deleted file mode 100644 index 9b24257..0000000 --- a/src/main/java/io/github/skippyall/minions/module/MobSpawningModule.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.github.skippyall.minions.module; - -import io.github.skippyall.minions.Minions; -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import net.minecraft.item.Items; -import net.minecraft.util.Identifier; - -import java.util.List; - -import static io.github.skippyall.minions.module.Modules.register; - -public class MobSpawningModule { - public static final SimpleModuleItem MOB_SPAWNING_MODULE = - register( - Identifier.of(Minions.MOD_ID, "mob_spawning_module"), - List.of(), - List.of(), - Items.SPAWNER - ); - - public static boolean canMinionSpawnMobs(MinionFakePlayer minion) { - return minion.getModuleInventory().hasModule(MOB_SPAWNING_MODULE); - } - - public static boolean canMinionDespawnMobs(MinionFakePlayer minion) { - return minion.getModuleInventory().hasModule(MOB_SPAWNING_MODULE); - } - - public static void registerMe() {} -} diff --git a/src/main/java/io/github/skippyall/minions/module/ModuleItem.java b/src/main/java/io/github/skippyall/minions/module/ModuleItem.java deleted file mode 100644 index 87a9e21..0000000 --- a/src/main/java/io/github/skippyall/minions/module/ModuleItem.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.github.skippyall.minions.module; - -import io.github.skippyall.minions.module.instruction.InstructionDisplay; -import net.minecraft.item.ItemConvertible; - -import java.util.List; - -public interface ModuleItem extends ItemConvertible { - List getInstructions(); -} diff --git a/src/main/java/io/github/skippyall/minions/module/Modules.java b/src/main/java/io/github/skippyall/minions/module/Modules.java deleted file mode 100644 index 739e8eb..0000000 --- a/src/main/java/io/github/skippyall/minions/module/Modules.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.github.skippyall.minions.module; - -import io.github.skippyall.minions.MinionItems; -import io.github.skippyall.minions.module.command.Command; -import io.github.skippyall.minions.module.instruction.InstructionDisplay; -import io.github.skippyall.minions.new_program.instruction.Instruction; -import io.github.skippyall.minions.program.block.CodeBlock; -import net.minecraft.item.Item; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.util.Identifier; - -import java.util.List; - -public class Modules { - public static void register() { - ChatModule.registerMe(); - MountModule.registerMe(); - MoveModule.registerMe(); - MobSpawningModule.registerMe(); - InteractModule.registerMe(); - AttackModule.registerMe(); - } - - public static SimpleModuleItem register(Identifier id, List instructions, Item vanillaItem) { - return MinionItems.registerItem(id, settings -> new SimpleModuleItem(instructions, settings, vanillaItem)); - } -} diff --git a/src/main/java/io/github/skippyall/minions/module/MountModule.java b/src/main/java/io/github/skippyall/minions/module/MountModule.java deleted file mode 100644 index 6c23f16..0000000 --- a/src/main/java/io/github/skippyall/minions/module/MountModule.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.github.skippyall.minions.module; - -import io.github.skippyall.minions.Minions; -import io.github.skippyall.minions.module.command.SimpleCommand; -import net.minecraft.item.Items; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import java.util.List; - -import static io.github.skippyall.minions.module.Modules.register; - -public class MountModule { - public static final SimpleCommand MOUNT_COMMAND = new SimpleCommand( - Text.of("Mount"), - Text.of("Mount the minion to the nearest mountable Entity"), - Items.MINECART, - (player, minion) -> minion.getMinionActionPack().mount(true) - ); - - public static final SimpleCommand DISMOUNT_COMMAND = new SimpleCommand( - Text.of("Dismount"), - Text.of("Dismount the minion"), - Items.BARRIER, - (player, minion) -> minion.getMinionActionPack().dismount() - ); - - public static final SimpleModuleItem MOUNT_MODULE = - register(Identifier.of(Minions.MOD_ID, "mount_module"), - List.of(), - List.of( - MOUNT_COMMAND, - DISMOUNT_COMMAND - ), - Items.MINECART - ); - - public static void registerMe() { - } - -} diff --git a/src/main/java/io/github/skippyall/minions/module/MoveModule.java b/src/main/java/io/github/skippyall/minions/module/MoveModule.java deleted file mode 100644 index 5c251a7..0000000 --- a/src/main/java/io/github/skippyall/minions/module/MoveModule.java +++ /dev/null @@ -1,76 +0,0 @@ -package io.github.skippyall.minions.module; - -import io.github.skippyall.minions.Minions; -import io.github.skippyall.minions.module.command.SimpleCommand; -import io.github.skippyall.minions.input.TextInput; -import net.minecraft.item.Items; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import java.util.List; - -import static io.github.skippyall.minions.module.Modules.register; - -public class MoveModule { - public static final SimpleCommand WALK_COMMAND = - new SimpleCommand( - Text.literal("Walk"), - Text.literal("Walk a specific amount of blocks forward"), - Items.IRON_BOOTS, - (player, minion) -> TextInput.inputFloat(player, Text.literal("Amount of Blocks"), "1") - .thenAccept(minion::moveForward) - ); - - public static final SimpleCommand TURN_RIGHT_COMMAND = - new SimpleCommand( - Text.literal("Turn Right"), - Text.literal("Turn a specific amount of degrees right"), - Items.COMPASS, - (player, minion) -> TextInput.inputFloat(player, Text.literal("Degrees"), "90") - .thenAccept(degrees -> minion.getMinionActionPack().turn(degrees, 0)) - ); - - public static final SimpleCommand TURN_LEFT_COMMAND = - new SimpleCommand( - Text.literal("Turn Left"), - Text.literal("Turn a specific amount of degrees left"), - Items.COMPASS, - (player, minion) -> TextInput.inputFloat(player, Text.literal("Degrees"), "90") - .thenAccept(degrees -> minion.getMinionActionPack().turn(-degrees, 0)) - ); - - public static final SimpleCommand TURN_UP_COMMAND = - new SimpleCommand( - Text.literal("Turn Up"), - Text.literal("Turn a specific amount of degrees up"), - Items.COMPASS, - (player, minion) -> TextInput.inputFloat(player, Text.literal("Degrees"), "90") - .thenAccept(degrees -> minion.getMinionActionPack().turn(0, -degrees)) - ); - - public static final SimpleCommand TURN_DOWN_COMMAND = - new SimpleCommand( - Text.literal("Turn Down"), - Text.literal("Turn a specific amount of degrees down"), - Items.COMPASS, - (player, minion) -> TextInput.inputFloat(player, Text.literal("Degrees"), "90") - .thenAccept(degrees -> minion.getMinionActionPack().turn(0, degrees)) - ); - - - - public static final SimpleModuleItem MOVE_MODULE = - register(Identifier.of(Minions.MOD_ID, "move_module"), - List.of(), - List.of( - WALK_COMMAND, - TURN_RIGHT_COMMAND, - TURN_LEFT_COMMAND, - TURN_UP_COMMAND, - TURN_DOWN_COMMAND - ), - Items.IRON_BOOTS - ); - - public static void registerMe() {} -} diff --git a/src/main/java/io/github/skippyall/minions/module/SimpleModuleItem.java b/src/main/java/io/github/skippyall/minions/module/SimpleModuleItem.java deleted file mode 100644 index 0659e50..0000000 --- a/src/main/java/io/github/skippyall/minions/module/SimpleModuleItem.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.github.skippyall.minions.module; - -import eu.pb4.polymer.core.api.item.SimplePolymerItem; -import io.github.skippyall.minions.module.command.Command; -import io.github.skippyall.minions.module.instruction.InstructionDisplay; -import io.github.skippyall.minions.new_program.instruction.Instruction; -import io.github.skippyall.minions.program.block.CodeBlock; -import net.minecraft.item.Item; - -import java.util.List; - -public class SimpleModuleItem extends SimplePolymerItem implements ModuleItem { - private final List instructions; - - public SimpleModuleItem(List instructions, Settings settings, Item vanillaItem) { - super(settings.maxCount(1), vanillaItem); - this.instructions = instructions; - } - - @Override - public List getInstructions() { - return instructions; - } -} diff --git a/src/main/java/io/github/skippyall/minions/module/action/ActionModules.java b/src/main/java/io/github/skippyall/minions/module/action/ActionModules.java deleted file mode 100644 index 1cbd104..0000000 --- a/src/main/java/io/github/skippyall/minions/module/action/ActionModules.java +++ /dev/null @@ -1,68 +0,0 @@ -package io.github.skippyall.minions.module.action; - -import eu.pb4.sgui.api.elements.GuiElementBuilder; -import eu.pb4.sgui.api.gui.SimpleGui; -import io.github.skippyall.minions.input.TextInput; -import io.github.skippyall.minions.minion.fakeplayer.EntityPlayerActionPack; -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.new_program.instruction.Instruction; -import net.minecraft.item.Items; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; - -import java.util.List; - -public class ActionModules { - public static void executeOnce(EntityPlayerActionPack.ActionType actionType, ServerPlayerEntity player, MinionFakePlayer minion) { - minion.getMinionActionPack().start(actionType, EntityPlayerActionPack.Action.once()); - } - - public static void executeContinuous(EntityPlayerActionPack.ActionType actionType, ServerPlayerEntity player, MinionFakePlayer minion) { - minion.getMinionActionPack().start(actionType, EntityPlayerActionPack.Action.continuous()); - } - - public static void executeInterval(EntityPlayerActionPack.ActionType actionType, ServerPlayerEntity player, MinionFakePlayer minion) { - TextInput.inputFloat(player, Text.translatable("minions.command.action.interval.enter"), "3.5").thenAccept(interval -> { - int ticks = Math.round(interval * 20); - minion.getMinionActionPack().start(actionType, EntityPlayerActionPack.Action.interval(ticks)); - }); - } - - public static void executeStop(EntityPlayerActionPack.ActionType actionType, ServerPlayerEntity player, MinionFakePlayer minion) { - minion.getMinionActionPack().stop(actionType); - } - - public static List actionInstruction(EntityPlayerActionPack.ActionType actionType, Text actionName) { - return List.of( - - ) - - return (player, minion) -> { - SimpleGui gui = new SimpleGui(ScreenHandlerType.GENERIC_3X3, player, false); - gui.setTitle(Text.translatable("minions.command.action.details", actionName)); - - gui.setSlot(1, new GuiElementBuilder() - .setItem(Items.COMMAND_BLOCK) - .setName(Text.translatable("minions.command.action.once", actionName)) - .setCallback(() -> executeOnce(actionType, player, minion)) - ); - gui.setSlot(3, new GuiElementBuilder() - .setItem(Items.REPEATING_COMMAND_BLOCK) - .setName(Text.translatable("minions.command.action.continuous", actionName)) - .setCallback(() -> executeContinuous(actionType, player, minion)) - ); - gui.setSlot(5, new GuiElementBuilder() - .setItem(Items.CHAIN_COMMAND_BLOCK) - .setName(Text.translatable("minions.command.action.interval", actionName)) - .setCallback(() -> executeInterval(actionType, player, minion)) - ); - gui.setSlot(4, new GuiElementBuilder() - .setItem(Items.BARRIER) - .setName(Text.translatable("minions.command.action.stop", actionName)) - .setCallback(() -> executeStop(actionType, player, minion)) - ); - gui.open(); - }; - } -} diff --git a/src/main/java/io/github/skippyall/minions/module/command/Command.java b/src/main/java/io/github/skippyall/minions/module/command/Command.java deleted file mode 100644 index b056bad..0000000 --- a/src/main/java/io/github/skippyall/minions/module/command/Command.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.github.skippyall.minions.module.command; - -import net.minecraft.item.Item; -import net.minecraft.text.Text; - -public interface Command extends CommandExecutor { - Text getName(); - Text getDescription(); - Item getItemRepresentation(); -} diff --git a/src/main/java/io/github/skippyall/minions/module/command/CommandExecutor.java b/src/main/java/io/github/skippyall/minions/module/command/CommandExecutor.java deleted file mode 100644 index 603d341..0000000 --- a/src/main/java/io/github/skippyall/minions/module/command/CommandExecutor.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.github.skippyall.minions.module.command; - -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import net.minecraft.server.network.ServerPlayerEntity; - -public interface CommandExecutor { - void execute(ServerPlayerEntity player, MinionFakePlayer minion); -} diff --git a/src/main/java/io/github/skippyall/minions/module/command/SimpleCommand.java b/src/main/java/io/github/skippyall/minions/module/command/SimpleCommand.java deleted file mode 100644 index dc7708d..0000000 --- a/src/main/java/io/github/skippyall/minions/module/command/SimpleCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -package io.github.skippyall.minions.module.command; - -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import net.minecraft.item.Item; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; - -public class SimpleCommand implements Command { - private final Text name; - private final Text description; - private final Item itemRepresentation; - private final CommandExecutor executor; - - public SimpleCommand(Text name, Text description, Item itemRepresentation, CommandExecutor executor) { - this.name = name; - this.description = description; - this.itemRepresentation = itemRepresentation; - this.executor = executor; - } - - @Override - public Text getName() { - return name; - } - - @Override - public Text getDescription() { - return description; - } - - @Override - public Item getItemRepresentation() { - return itemRepresentation; - } - - @Override - public void execute(ServerPlayerEntity player, MinionFakePlayer minion) { - executor.execute(player, minion); - } -} diff --git a/src/main/java/io/github/skippyall/minions/module/instruction/InstructionDisplay.java b/src/main/java/io/github/skippyall/minions/module/instruction/InstructionDisplay.java deleted file mode 100644 index 8bd2cc9..0000000 --- a/src/main/java/io/github/skippyall/minions/module/instruction/InstructionDisplay.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.github.skippyall.minions.module.instruction; - -import io.github.skippyall.minions.new_program.instruction.Instruction; -import net.minecraft.item.Item; -import net.minecraft.text.Text; - -public record InstructionDisplay(Text name, Text description, Item itemRepresentation, Instruction instruction) { - -} diff --git a/src/main/java/io/github/skippyall/minions/new_module/MinionModule.java b/src/main/java/io/github/skippyall/minions/new_module/MinionModule.java new file mode 100644 index 0000000..e8995a9 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_module/MinionModule.java @@ -0,0 +1,38 @@ +package io.github.skippyall.minions.new_module; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import eu.pb4.polymer.core.api.other.PolymerComponent; +import io.github.skippyall.minions.MinionRegistries; +import io.github.skippyall.minions.Minions; +import io.github.skippyall.minions.new_program.instruction.InstructionType; +import net.minecraft.component.ComponentType; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.Identifier; + +import java.util.List; + +public record MinionModule(List> instructions) { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + instance.group( + MinionRegistries.INSTRUCTION_TYPES.getCodec().listOf().fieldOf("instructions").forGetter(MinionModule::instructions) + ).apply(instance, MinionModule::new) + ); + + public static final Codec DATAPACK_CODEC = Codec.withAlternative(Identifier.CODEC.xmap(ModuleLoader.MODULES::get, ModuleLoader.ID_BY_MODULE::get), CODEC); + + public static final ComponentType COMPONENT_TYPE = ComponentType.builder().codec(DATAPACK_CODEC).build(); + + public static final MinionModule EMPTY = new MinionModule(List.of()); + + public MinionModule(List> instructions) { + this.instructions = List.copyOf(instructions); + } + + public static void register() { + Registry.register(Registries.DATA_COMPONENT_TYPE, Identifier.of(Minions.MOD_ID, "minion_module"), COMPONENT_TYPE); + PolymerComponent.registerDataComponent(COMPONENT_TYPE); + } +} diff --git a/src/main/java/io/github/skippyall/minions/new_module/ModuleLoader.java b/src/main/java/io/github/skippyall/minions/new_module/ModuleLoader.java new file mode 100644 index 0000000..3dbe7de --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_module/ModuleLoader.java @@ -0,0 +1,30 @@ +package io.github.skippyall.minions.new_module; + +import com.mojang.serialization.JsonOps; +import io.github.skippyall.minions.Minions; +import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; +import net.minecraft.resource.JsonDataLoader; +import net.minecraft.resource.ResourceFinder; +import net.minecraft.resource.ResourceManager; +import net.minecraft.util.Identifier; + +import java.util.HashMap; +import java.util.Map; + +public class ModuleLoader implements SimpleSynchronousResourceReloadListener { + public static final HashMap ID_BY_MODULE = new HashMap<>(); + public static final Map MODULES = new HashMap<>(); + + @Override + public Identifier getFabricId() { + return Identifier.of(Minions.MOD_ID, "module"); + } + + @Override + public void reload(ResourceManager manager) { + MODULES.clear(); + ID_BY_MODULE.clear(); + JsonDataLoader.load(manager, ResourceFinder.json("minion_module"), JsonOps.INSTANCE, MinionModule.CODEC, MODULES); + MODULES.forEach((id, module) -> ID_BY_MODULE.put(module, id)); + } +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/ParameterList.java b/src/main/java/io/github/skippyall/minions/new_program/ParameterList.java deleted file mode 100644 index 646a25a..0000000 --- a/src/main/java/io/github/skippyall/minions/new_program/ParameterList.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.github.skippyall.minions.new_program; - -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.new_program.argument.Argument; -import io.github.skippyall.minions.new_program.value.ValueType; -import org.jetbrains.annotations.Nullable; - -import java.util.HashMap; -import java.util.Map; - -public class ParameterList { - Map> parameters = new HashMap<>(); - - public @Nullable T getValue(String name, ValueType valueType, MinionFakePlayer minion) { - Argument argument = getArgument(name, valueType); - return argument != null ? argument.resolve(minion) : null; - } - - public @Nullable Argument getArgument(String name, ValueType valueType) { - Argument argument = parameters.get(name); - if(argument != null && argument.getType() == valueType) { - //noinspection unchecked - return (Argument) argument; - } else { - return null; - } - } - - public void setArgument(String name, Argument argument) { - parameters.put(name, argument); - } -} diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/Argument.java b/src/main/java/io/github/skippyall/minions/new_program/argument/Argument.java index 3b1813a..c07cf80 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/Argument.java +++ b/src/main/java/io/github/skippyall/minions/new_program/argument/Argument.java @@ -1,9 +1,34 @@ package io.github.skippyall.minions.new_program.argument; +import io.github.skippyall.minions.gui.GuiDisplay; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.new_program.value.ValueType; +import org.jetbrains.annotations.Nullable; -public interface Argument { +/** + * An Argument can be supplied to an instruction with a matching parameter. + * 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>> { T resolve(MinionFakePlayer minion); - ValueType getType(); + + default ValueType getValueType() { + return getType().getValueType(); + } + + GuiDisplay getDisplay(); + + S getType(); + + default >> @Nullable A cast(ValueType type) { + if(getValueType() == type) { + //noinspection unchecked + return (A) this; + } else { + return null; + } + } } diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/ArgumentList.java b/src/main/java/io/github/skippyall/minions/new_program/argument/ArgumentList.java new file mode 100644 index 0000000..6af4f7b --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_program/argument/ArgumentList.java @@ -0,0 +1,50 @@ +package io.github.skippyall.minions.new_program.argument; + +import com.mojang.serialization.Codec; +import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class ArgumentList { + public static final Codec CODEC = Codec.unboundedMap(Codec.STRING, Arguments.ARGUMENT_CODEC) + .xmap(ArgumentList::new, list -> list.arguments); + + private final Map> arguments; + + public ArgumentList() { + arguments = new HashMap<>(); + } + + public ArgumentList(Map> arguments) { + this.arguments = new HashMap<>(arguments); + } + + public T getValue(Parameter parameter, MinionFakePlayer minion) { + Argument argument = getArgument(parameter); + return argument != null ? argument.resolve(minion) : null; + } + + 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) { + 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; + } +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/Arguments.java b/src/main/java/io/github/skippyall/minions/new_program/argument/Arguments.java index d745475..2253be4 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/Arguments.java +++ b/src/main/java/io/github/skippyall/minions/new_program/argument/Arguments.java @@ -1,6 +1,8 @@ package io.github.skippyall.minions.new_program.argument; +import com.mojang.serialization.Codec; import com.mojang.serialization.Lifecycle; +import io.github.skippyall.minions.MinionRegistries; import io.github.skippyall.minions.Minions; import io.github.skippyall.minions.new_program.value.ValueType; import net.minecraft.registry.Registry; @@ -9,20 +11,30 @@ import net.minecraft.registry.SimpleRegistry; import net.minecraft.util.Identifier; public class Arguments { - public static final Registry GENERIC_ARGUMENT_TYPE_REGISTRY = new SimpleRegistry<>(RegistryKey.ofRegistry(Identifier.of("minions", "generic_argument_type")), Lifecycle.stable()); + public static final Codec> SPECIFIC_ARGUMENT_TYPE_CODEC = MinionRegistries.GENERIC_ARGUMENT_TYPE_REGISTRY.getCodec().dispatch( + "type", + SpecificArgumentType::getGenericArgumentType, + generic -> + MinionRegistries.VALUE_TYPES.getCodec().xmap( + generic::createTypeSpecific, + SpecificArgumentType::getValueType + ).fieldOf("valueType") + ); + + public static final Codec> ARGUMENT_CODEC = SPECIFIC_ARGUMENT_TYPE_CODEC.dispatch(Argument::getType, specific -> specific.getArgumentCodec().fieldOf("data")); public static final GenericArgumentType VALUE_ARGUMENT = register(Identifier.of(Minions.MOD_ID, "value"), ValueArgumentType::new); - public static SpecificArgumentType getArgumentType(Identifier id, ValueType valueType) { - GenericArgumentType generic = GENERIC_ARGUMENT_TYPE_REGISTRY.get(id); + /*public static SpecificArgumentType> 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(GENERIC_ARGUMENT_TYPE_REGISTRY, id, argumentType); + return Registry.register(MinionRegistries.GENERIC_ARGUMENT_TYPE_REGISTRY, id, argumentType); } } diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/GenericArgumentType.java b/src/main/java/io/github/skippyall/minions/new_program/argument/GenericArgumentType.java index 17595ae..0ab05b4 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/GenericArgumentType.java +++ b/src/main/java/io/github/skippyall/minions/new_program/argument/GenericArgumentType.java @@ -3,5 +3,5 @@ package io.github.skippyall.minions.new_program.argument; import io.github.skippyall.minions.new_program.value.ValueType; public interface GenericArgumentType { - SpecificArgumentType> createTypeSpecific(ValueType valueType); + SpecificArgumentType> createTypeSpecific(ValueType valueType); } diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/Parameter.java b/src/main/java/io/github/skippyall/minions/new_program/argument/Parameter.java new file mode 100644 index 0000000..e8067c3 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_program/argument/Parameter.java @@ -0,0 +1,24 @@ +package io.github.skippyall.minions.new_program.argument; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.github.skippyall.minions.MinionRegistries; +import io.github.skippyall.minions.new_program.value.ValueType; +import org.jetbrains.annotations.Nullable; + +public record Parameter(String name, ValueType type) { + public static final Codec> CODEC = RecordCodecBuilder.create(instance -> + instance.group( + Codec.STRING.fieldOf("name").forGetter(Parameter::name), + MinionRegistries.VALUE_TYPES.getCodec().fieldOf("type").forGetter(Parameter::type) + ).apply(instance, Parameter::new)); + + public @Nullable Parameter cast(ValueType type) { + if(this.type == type) { + //noinspection unchecked + return (Parameter) this; + } else { + return null; + } + } +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/SpecificArgumentType.java b/src/main/java/io/github/skippyall/minions/new_program/argument/SpecificArgumentType.java index ad5914c..95f6896 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/SpecificArgumentType.java +++ b/src/main/java/io/github/skippyall/minions/new_program/argument/SpecificArgumentType.java @@ -3,19 +3,28 @@ package io.github.skippyall.minions.new_program.argument; import com.mojang.serialization.Codec; import io.github.skippyall.minions.new_program.value.ValueType; import net.minecraft.server.network.ServerPlayerEntity; +import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; -public abstract class SpecificArgumentType> { +/** + * 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>> { protected final ValueType valueType; public SpecificArgumentType(ValueType valueType) { this.valueType = valueType; } + public abstract GenericArgumentType getGenericArgumentType(); + public abstract Codec getArgumentCodec(); - public abstract CompletableFuture openArgumentDialog(ServerPlayerEntity player, A previousArgument); + public abstract CompletableFuture openArgumentDialog(ServerPlayerEntity player, @Nullable A previousArgument); public ValueType getValueType() { return valueType; diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgument.java b/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgument.java index f3509d1..0bc8ae3 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgument.java +++ b/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgument.java @@ -1,14 +1,18 @@ package io.github.skippyall.minions.new_program.argument; +import io.github.skippyall.minions.gui.GuiDisplay; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; import io.github.skippyall.minions.new_program.value.ValueType; -public class ValueArgument implements Argument { - private final ValueType valueType; +/** + * An argument that always resolves to a fixed value + */ +public class ValueArgument implements Argument> { + private final ValueArgumentType type; private final T value; - public ValueArgument(ValueType valueType, T value) { - this.valueType = valueType; + public ValueArgument(ValueArgumentType valueType, T value) { + this.type = valueType; this.value = value; } @@ -22,7 +26,12 @@ public class ValueArgument implements Argument { } @Override - public ValueType getType() { - return valueType; + public GuiDisplay getDisplay() { + return getValueType().display(); + } + + @Override + public ValueArgumentType getType() { + return type; } } diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgumentType.java b/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgumentType.java index a7b9788..0604fe6 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgumentType.java +++ b/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgumentType.java @@ -3,6 +3,7 @@ package io.github.skippyall.minions.new_program.argument; import com.mojang.serialization.Codec; import io.github.skippyall.minions.new_program.value.ValueType; import net.minecraft.server.network.ServerPlayerEntity; +import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; @@ -12,12 +13,20 @@ public class ValueArgumentType extends SpecificArgumentType> getArgumentCodec() { - return valueType.getCodec().xmap(value -> new ValueArgument<>(valueType, value), ValueArgument::getValue); + public GenericArgumentType getGenericArgumentType() { + return Arguments.VALUE_ARGUMENT; } @Override - public CompletableFuture> openArgumentDialog(ServerPlayerEntity player, ValueArgument previousArgument) { - return valueType.openValueDialog(player, previousArgument.getValue()).thenApply(value -> new ValueArgument<>(valueType, value)); + public Codec> getArgumentCodec() { + return valueType.codec().xmap(value -> new ValueArgument<>(this, value), ValueArgument::getValue); + } + + @Override + public CompletableFuture> openArgumentDialog(ServerPlayerEntity player, @Nullable ValueArgument previousArgument) { + return valueType.openValueDialog( + player, + previousArgument != null ? previousArgument.getValue() : valueType.defaultValue() + ).thenApply(value -> new ValueArgument<>(this, value)); } } diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/Instruction.java b/src/main/java/io/github/skippyall/minions/new_program/instruction/Instruction.java deleted file mode 100644 index 979f075..0000000 --- a/src/main/java/io/github/skippyall/minions/new_program/instruction/Instruction.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.github.skippyall.minions.new_program.instruction; - -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.new_program.ParameterList; -import io.github.skippyall.minions.program.variables.Type; - -import java.util.List; - -public interface Instruction { - List> getParameterTypes(); - - Type getReturnType(); - - InstructionRun run(MinionFakePlayer minion, ParameterList params); -} diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionExecution.java b/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionExecution.java new file mode 100644 index 0000000..51a5847 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionExecution.java @@ -0,0 +1,66 @@ +package io.github.skippyall.minions.new_program.instruction; + +import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.new_program.argument.ArgumentList; +import net.minecraft.storage.ReadView; +import net.minecraft.storage.WriteView; + +/** + * Responsible for executing instructions. + * When an instruction is executed: + *
  • A new instance is created using the factory
  • + *
  • {@link InstructionExecution#readArguments(ArgumentList, MinionFakePlayer) readFromParameters} is called
  • + *
  • {@link InstructionExecution#start(MinionFakePlayer) start} is called
  • + * @param + */ +public interface InstructionExecution { + /** + * Starts the execution. + * @param minion + */ + default void start(MinionFakePlayer minion) {} + + /** + * Continues the execution of this instruction. + * Called every tick while executing the instruction. + * @param minion + */ + default void tick(MinionFakePlayer minion) {} + + /** + * Called every tick to determine if the execution of this instruction should be stopped. + * Shouldn't + * @param minion The minion executing the instruction + * @return true if the instruction is done, false otherwise. + */ + boolean isDone(MinionFakePlayer minion); + + /** + * Stops this execution. This is guaranteed to be called if {@link InstructionExecution#isDone(MinionFakePlayer) isDone} + * returns true after ticking the execution, but it may also be called before that. + * In this case, the return value is ignored unless this is a + * {@link io.github.skippyall.minions.new_program.instruction.execution.ContinuousInstructionExecution ContinuousInstructionExecution}.
    + * This should undo changes to the minion unless they are supposed to be permanent. + * + * @param minion The minion that was executing this instruction. + * @return The return value of the instruction + */ + R stop(MinionFakePlayer minion); + + /** + * Initializes the execution with its arguments. + * @param arguments The arguments to initialize the execution + * @param minion The minion should be used to resolve the arguments + */ + void readArguments(ArgumentList arguments, MinionFakePlayer minion); + + /** + * Saves the execution, e.g. when the server is closed. + */ + void save(WriteView view, MinionFakePlayer minion); + + /** + * Loads the execution, e.g. when the server is started. + */ + void load(ReadView view, MinionFakePlayer minion); +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionRun.java b/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionRun.java deleted file mode 100644 index b76359c..0000000 --- a/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionRun.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.github.skippyall.minions.new_program.instruction; - -public interface InstructionRun { - default void tick() {} - - default boolean isDone() { - return true; - } -} diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionType.java b/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionType.java new file mode 100644 index 0000000..9f2268a --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionType.java @@ -0,0 +1,58 @@ +package io.github.skippyall.minions.new_program.instruction; + +import io.github.skippyall.minions.gui.GuiDisplay; +import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.new_program.argument.Parameter; +import io.github.skippyall.minions.new_program.argument.ArgumentList; +import io.github.skippyall.minions.new_program.value.ValueType; +import net.minecraft.storage.ReadView; + +import java.util.Collection; +import java.util.List; +import java.util.function.Supplier; + +public final class InstructionType { + private final GuiDisplay display; + private final Collection> parameters; + private final ValueType returnType; + private final Supplier> executionFactory; + + private InstructionType(GuiDisplay display, Supplier> executionFactory, ValueType returnType, 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, ValueType returnType, Parameter... parameters) { + return new InstructionType<>(display, executionFactory, returnType, List.of(parameters)); + } + + public Collection> getParameters() { + return parameters; + } + + public ValueType getReturnType() { + return returnType; + } + + public GuiDisplay getDisplay() { + return display; + } + + public InstructionExecution createExecution(ArgumentList parameters, MinionFakePlayer minion) { + InstructionExecution execution = executionFactory.get(); + execution.readArguments(parameters, minion); + return execution; + } + + public InstructionExecution loadExecution(ReadView view, MinionFakePlayer minion) { + InstructionExecution execution = executionFactory.get(); + execution.load(view, minion); + return execution; + } +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/Instructions.java b/src/main/java/io/github/skippyall/minions/new_program/instruction/Instructions.java new file mode 100644 index 0000000..4bbfe39 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_program/instruction/Instructions.java @@ -0,0 +1,43 @@ +package io.github.skippyall.minions.new_program.instruction; + +import io.github.skippyall.minions.MinionRegistries; +import io.github.skippyall.minions.Minions; +import io.github.skippyall.minions.gui.GuiDisplay; +import io.github.skippyall.minions.new_program.instruction.execution.WalkExecution; +import io.github.skippyall.minions.new_program.argument.Parameter; +import io.github.skippyall.minions.new_program.value.ValueType; +import io.github.skippyall.minions.new_program.value.ValueTypes; +import io.github.skippyall.minions.util.ModelIdUtil; +import net.minecraft.item.Items; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; + +import java.util.function.Function; +import java.util.function.Supplier; + +public class Instructions { + public static final InstructionType WALK = register( + "walk", + base -> new GuiDisplay.ModelBased(ModelIdUtil.getItemModelId(Items.IRON_BOOTS), base, true), + WalkExecution::new, + ValueTypes.VOID, + WalkExecution.blocksToMoveParam + ); + + public static final InstructionType ATTACK = register( + "attack", + base -> new GuiDisplay.ModelBased(ModelIdUtil.getItemModelId(Items.IRON_PICKAXE), base, true), + WalkExecution::new, + ValueTypes.VOID, + WalkExecution.blocksToMoveParam + ); + + private static InstructionType register(String id, Function displayFunction, Supplier> factory, ValueType returnType, Parameter... parameters) { + Identifier identifier = Identifier.of(Minions.MOD_ID, id); + return Registry.register(MinionRegistries.INSTRUCTION_TYPES, identifier, InstructionType.create(displayFunction.apply(identifier.toTranslationKey("instruction_type")), factory, returnType, parameters)); + } + + public static void register() { + + } +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ActionExecution.java b/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ActionExecution.java new file mode 100644 index 0000000..1a801ce --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ActionExecution.java @@ -0,0 +1,35 @@ +package io.github.skippyall.minions.new_program.instruction.execution; + +import io.github.skippyall.minions.minion.fakeplayer.EntityPlayerActionPack; +import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.new_program.argument.ArgumentList; +import net.minecraft.storage.ReadView; +import net.minecraft.storage.WriteView; + +public class ActionExecution implements ContinuousInstructionExecution { + private final EntityPlayerActionPack.ActionType action; + + public ActionExecution(EntityPlayerActionPack.ActionType action) { + this.action = action; + } + + @Override + public void start(MinionFakePlayer minion) { + minion.getMinionActionPack().start(action, EntityPlayerActionPack.Action.continuous()); + } + + @Override + public Void stop(MinionFakePlayer minion) { + minion.getMinionActionPack().stop(action); + return null; + } + + @Override + public void readArguments(ArgumentList parameters, MinionFakePlayer minion) {} + + @Override + public void save(WriteView view, MinionFakePlayer minion) {} + + @Override + public void load(ReadView view, MinionFakePlayer minion) {} +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ContinuousInstructionExecution.java b/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ContinuousInstructionExecution.java new file mode 100644 index 0000000..551fbac --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ContinuousInstructionExecution.java @@ -0,0 +1,11 @@ +package io.github.skippyall.minions.new_program.instruction.execution; + +import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.new_program.instruction.InstructionExecution; + +public interface ContinuousInstructionExecution extends InstructionExecution { + @Override + default boolean isDone(MinionFakePlayer minion) { + return false; + } +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TimedInstructionExecution.java b/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TimedInstructionExecution.java new file mode 100644 index 0000000..2ed056c --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TimedInstructionExecution.java @@ -0,0 +1,43 @@ +package io.github.skippyall.minions.new_program.instruction.execution; + +import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.new_program.instruction.InstructionExecution; +import net.minecraft.storage.ReadView; +import net.minecraft.storage.WriteView; + +/** + * An InstructionExecution that takes a predefined time to execute. + * The timer must be set with setTimer when reading from parameters. + * Saving and loading of the timer is automatic if the super method is called by the subclass. + */ +public abstract class TimedInstructionExecution implements InstructionExecution { + int timer; + + public int getTimer() { + return timer; + } + + protected void setTimer(int timer) { + this.timer = timer; + } + + @Override + public void tick(MinionFakePlayer minion) { + timer--; + } + + @Override + public boolean isDone(MinionFakePlayer minion) { + return timer > 0; + } + + @Override + public void save(WriteView view, MinionFakePlayer minion) { + view.putInt("timer", timer); + } + + @Override + public void load(ReadView view, MinionFakePlayer minion) { + timer = view.getInt("timer", 0); + } +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TurnExecution.java b/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TurnExecution.java new file mode 100644 index 0000000..97e8bd7 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TurnExecution.java @@ -0,0 +1,67 @@ +package io.github.skippyall.minions.new_program.instruction.execution; + +import com.mojang.serialization.Codec; +import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.new_program.argument.ArgumentList; +import io.github.skippyall.minions.new_program.instruction.InstructionExecution; +import net.minecraft.storage.ReadView; +import net.minecraft.storage.WriteView; +import net.minecraft.util.StringIdentifiable; + +public class TurnExecution implements InstructionExecution { + + + @Override + public void start(MinionFakePlayer minion) { + InstructionExecution.super.start(minion); + } + + @Override + public boolean isDone(MinionFakePlayer minion) { + return false; + } + + @Override + public Void stop(MinionFakePlayer minion) { + return null; + } + + @Override + public void readArguments(ArgumentList arguments, MinionFakePlayer minion) { + + } + + @Override + public void save(WriteView view, MinionFakePlayer minion) { + + } + + @Override + public void load(ReadView view, MinionFakePlayer minion) { + + } + + public enum TurnDirection implements StringIdentifiable { + LEFT("left", -1, 0), + UP("up", 0, -1), + RIGHT("right", 1, 0), + DOWN("down", 0, 1); + + public static final Codec CODEC = StringIdentifiable.createCodec(TurnDirection::values); + + public final String name; + public final int xFactor; + public final int yFactor; + + TurnDirection(String name, int xFactor, int yFactor) { + this.xFactor = xFactor; + this.yFactor = yFactor; + this.name = name; + } + + @Override + public String asString() { + return name; + } + } +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/WalkExecution.java b/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/WalkExecution.java new file mode 100644 index 0000000..922c8c4 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/WalkExecution.java @@ -0,0 +1,53 @@ +package io.github.skippyall.minions.new_program.instruction.execution; + +import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.new_program.instruction.InstructionExecution; +import io.github.skippyall.minions.new_program.argument.Parameter; +import io.github.skippyall.minions.new_program.argument.ArgumentList; +import io.github.skippyall.minions.new_program.value.ValueTypes; +import net.minecraft.entity.MovementType; +import net.minecraft.storage.ReadView; +import net.minecraft.storage.WriteView; + +public class WalkExecution implements InstructionExecution { + public static final Parameter blocksToMoveParam = new Parameter<>("blocksToMove", ValueTypes.FLOAT); + private final float ACCURACY = 1F / 32F; + + private float totalBlocksToMove; + private float blocksMoved; + + @Override + public void tick(MinionFakePlayer minion) { + float speed = Math.min(minion.getMovementSpeed(), totalBlocksToMove - blocksMoved); + minion.move(MovementType.SELF, minion.getHorizontalFacing().getDoubleVector().normalize().multiply(speed)); + blocksMoved += speed; + } + + @Override + public boolean isDone(MinionFakePlayer minion) { + return totalBlocksToMove - blocksMoved < ACCURACY; + } + + @Override + public Void stop(MinionFakePlayer minion) { + return null; + } + + @Override + public void readArguments(ArgumentList parameters, MinionFakePlayer minion) { + totalBlocksToMove = parameters.getValue(blocksToMoveParam, minion); + blocksMoved = 0; + } + + @Override + public void save(WriteView view, MinionFakePlayer minion) { + view.putFloat("totalBlocksToMove", totalBlocksToMove); + view.putFloat("blocksMoved", blocksMoved); + } + + @Override + public void load(ReadView view, MinionFakePlayer minion) { + totalBlocksToMove = view.getFloat("totalBlocksToMove", 0F); + blocksMoved = view.getFloat("blocksMoved", 0F); + } +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/value/FloatValueType.java b/src/main/java/io/github/skippyall/minions/new_program/value/FloatValueType.java deleted file mode 100644 index 139e3f8..0000000 --- a/src/main/java/io/github/skippyall/minions/new_program/value/FloatValueType.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.github.skippyall.minions.new_program.value; - -import com.mojang.serialization.Codec; -import io.github.skippyall.minions.input.TextInput; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; - -import java.util.concurrent.CompletableFuture; - -public class FloatValueType implements ValueType { - @Override - public Codec getCodec() { - return Codec.FLOAT; - } - - @Override - public CompletableFuture openValueDialog(ServerPlayerEntity player, Float previousValue) { - return TextInput.inputFloat(player, Text.literal("Please enter a decimal number."), previousValue.toString()); - } -} diff --git a/src/main/java/io/github/skippyall/minions/new_program/value/IntegerValueType.java b/src/main/java/io/github/skippyall/minions/new_program/value/IntegerValueType.java deleted file mode 100644 index 99bcfaf..0000000 --- a/src/main/java/io/github/skippyall/minions/new_program/value/IntegerValueType.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.github.skippyall.minions.new_program.value; - -import com.mojang.serialization.Codec; -import io.github.skippyall.minions.input.TextInput; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; - -import java.util.concurrent.CompletableFuture; - -public class IntegerValueType implements ValueType { - @Override - public Codec getCodec() { - return Codec.INT; - } - - @Override - public CompletableFuture openValueDialog(ServerPlayerEntity player, Integer previousValue) { - return TextInput.inputInt(player, Text.literal("Please enter an integer number."), previousValue.toString()); - } -} diff --git a/src/main/java/io/github/skippyall/minions/new_program/value/ValueType.java b/src/main/java/io/github/skippyall/minions/new_program/value/ValueType.java index 92ad1c9..14cc032 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/value/ValueType.java +++ b/src/main/java/io/github/skippyall/minions/new_program/value/ValueType.java @@ -1,12 +1,14 @@ package io.github.skippyall.minions.new_program.value; import com.mojang.serialization.Codec; +import io.github.skippyall.minions.gui.GuiDisplay; import net.minecraft.server.network.ServerPlayerEntity; import java.util.concurrent.CompletableFuture; +import java.util.function.BiFunction; -public interface ValueType { - Codec getCodec(); - - CompletableFuture openValueDialog(ServerPlayerEntity player, T previousValue); +public record ValueType(Codec codec, GuiDisplay display, T defaultValue, BiFunction> valueDialogOpener) { + public CompletableFuture openValueDialog(ServerPlayerEntity player, T previousValue) { + return valueDialogOpener.apply(player, previousValue); + } } diff --git a/src/main/java/io/github/skippyall/minions/new_program/value/ValueTypes.java b/src/main/java/io/github/skippyall/minions/new_program/value/ValueTypes.java new file mode 100644 index 0000000..e6f80f9 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/new_program/value/ValueTypes.java @@ -0,0 +1,78 @@ +package io.github.skippyall.minions.new_program.value; + +import com.mojang.serialization.Codec; +import io.github.skippyall.minions.MinionRegistries; +import io.github.skippyall.minions.Minions; +import io.github.skippyall.minions.gui.GuiDisplay; +import io.github.skippyall.minions.input.TextInput; +import net.minecraft.item.Items; +import net.minecraft.registry.Registry; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.concurrent.CompletableFuture; +import java.util.function.BiFunction; +import java.util.function.Function; + +public class ValueTypes { + public static ValueType INTEGER = registerSimple( + "integer", + Codec.INT, + key -> new GuiDisplay.ModelBased(Items.NETHERITE_SCRAP, key, true), + 0, + (player, oldValue) -> TextInput.inputInt( + player, + Text.literal("Integer"), + String.valueOf(oldValue) + ) + ); + + public static ValueType FLOAT = registerSimple( + "float", + Codec.FLOAT, + key -> new GuiDisplay.ModelBased(Items.BAMBOO_RAFT, key, true), + 0F, + (player, oldValue) -> TextInput.inputFloat( + player, + Text.literal("Number"), + String.valueOf(oldValue) + ) + ); + + public static ValueType STRING = registerSimple( + "string", + Codec.STRING, + key -> new GuiDisplay.ModelBased(Items.STRING, key, true), + "", + ((player, oldValue) -> TextInput.inputString( + player, + Text.literal("Text"), + oldValue) + ) + ); + + public static ValueType VOID = registerSimple( + "void", + Codec.unit(null), + key -> new GuiDisplay.ModelBased(Items.BARRIER, key, false), + null, + (player, oldValue) -> CompletableFuture.completedFuture(null) + ); + + private static ValueType registerSimple(String id, Codec codec, Function displayFunction, T defaultValue, BiFunction> valueDialogOpener) { + Identifier identifier = Identifier.of(Minions.MOD_ID, id); + return Registry.register( + MinionRegistries.VALUE_TYPES, + identifier, + new ValueType<>( + codec, + displayFunction.apply(identifier.toTranslationKey("value_type")), + defaultValue, + valueDialogOpener + ) + ); + } + + public static void register() {} +} diff --git a/src/main/java/io/github/skippyall/minions/program/argument/Arg.java b/src/main/java/io/github/skippyall/minions/program/argument/Arg.java deleted file mode 100644 index 377e0b5..0000000 --- a/src/main/java/io/github/skippyall/minions/program/argument/Arg.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.github.skippyall.minions.program.argument; - -import io.github.skippyall.minions.program.runtime.ProgramRuntime; -import io.github.skippyall.minions.program.variables.Type; - -public interface Arg { - T resolve(ProgramRuntime runtime); - Type getType(); -} diff --git a/src/main/java/io/github/skippyall/minions/program/argument/ArgUtils.java b/src/main/java/io/github/skippyall/minions/program/argument/ArgUtils.java deleted file mode 100644 index a387301..0000000 --- a/src/main/java/io/github/skippyall/minions/program/argument/ArgUtils.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.skippyall.minions.program.argument; - -import io.github.skippyall.minions.program.runtime.ProgramRuntime; -import io.github.skippyall.minions.program.tuple.Tuple; -import io.github.skippyall.minions.program.tuple.Tuple0; - -public class ArgUtils { - public static Tuple resolveArgs(Tuple args, ProgramRuntime runtime) { - Tuple tuple = new Tuple0(); - for(Object object : args) { - Arg arg =(Arg) object; - tuple = tuple.add(arg.getType().cast(arg.resolve(runtime))); - } - return tuple; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/block/CodeBlock.java b/src/main/java/io/github/skippyall/minions/program/block/CodeBlock.java deleted file mode 100644 index db3b601..0000000 --- a/src/main/java/io/github/skippyall/minions/program/block/CodeBlock.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.github.skippyall.minions.program.block; - -import io.github.skippyall.minions.program.argument.Arg; -import io.github.skippyall.minions.program.runtime.ProgramRuntime; -import io.github.skippyall.minions.program.statement.Statement; -import io.github.skippyall.minions.program.tuple.Tuple; -import io.github.skippyall.minions.program.variables.Type; - -import java.util.List; -import java.util.concurrent.ForkJoinPool; - -public abstract class CodeBlock { - private String name; - private final List> arguments; - private final Type returnType; - - public CodeBlock(String name, List> arguments, Type returnType) { - this.arguments = arguments; - this.returnType = returnType; - } - - protected abstract R execute(ProgramRuntime runtime, A args, Statement.Run run); - - public boolean fits(Arg arg, int slot) { - return arguments.get(slot) == arg.getType(); - } - - public void start(ProgramRuntime runtime, A args, Statement.Run run) { - ForkJoinPool.commonPool().execute(() -> { - R result = execute(runtime, args, run); - run.afterRun(result); - }); - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/block/CodeBlocks.java b/src/main/java/io/github/skippyall/minions/program/block/CodeBlocks.java deleted file mode 100644 index 4284640..0000000 --- a/src/main/java/io/github/skippyall/minions/program/block/CodeBlocks.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.github.skippyall.minions.program.block; - -public class CodeBlocks { - public static final GoBlock GO = new GoBlock(); -} diff --git a/src/main/java/io/github/skippyall/minions/program/block/CodeContainingCodeBlock.java b/src/main/java/io/github/skippyall/minions/program/block/CodeContainingCodeBlock.java deleted file mode 100644 index 10b92f4..0000000 --- a/src/main/java/io/github/skippyall/minions/program/block/CodeContainingCodeBlock.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.github.skippyall.minions.program.block; - -import io.github.skippyall.minions.program.variables.Type; - -import java.util.List; - -public abstract class CodeContainingCodeBlock extends CodeBlock{ - public CodeContainingCodeBlock(String name, List arguments, Type returnType) { - super(name, arguments, returnType); - } - - protected void executeBlocks() { - - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/block/GoBlock.java b/src/main/java/io/github/skippyall/minions/program/block/GoBlock.java deleted file mode 100644 index ea0265c..0000000 --- a/src/main/java/io/github/skippyall/minions/program/block/GoBlock.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.github.skippyall.minions.program.block; - -import io.github.skippyall.minions.minion.fakeplayer.EntityPlayerActionPack; -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.program.runtime.MinionRuntime; -import io.github.skippyall.minions.program.runtime.ProgramRuntime; -import io.github.skippyall.minions.program.statement.Statement; -import io.github.skippyall.minions.program.tuple.Tuple2; -import io.github.skippyall.minions.program.variables.Types; - -import java.util.List; - -public class GoBlock extends CodeBlock> { - public GoBlock() { - super("move", List.of(Types.FLOAT, Types.FLOAT), Types.VOID); - } - - public Void execute(ProgramRuntime runtime, Tuple2 args, Statement>.Run run) { - if(runtime instanceof MinionRuntime minionRuntime) { - MinionFakePlayer minion = minionRuntime.getMinion(); - EntityPlayerActionPack action = ((ServerPlayerInterface) minion).minions$getActionPack(); - minion.moveForward(args.v0()); - minion.moveSideways(args.v1()); - } - return null; - } -} \ No newline at end of file diff --git a/src/main/java/io/github/skippyall/minions/program/block/UseBlock.java b/src/main/java/io/github/skippyall/minions/program/block/UseBlock.java deleted file mode 100644 index 3e81ce5..0000000 --- a/src/main/java/io/github/skippyall/minions/program/block/UseBlock.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.github.skippyall.minions.program.block; - -import io.github.skippyall.minions.minion.fakeplayer.EntityPlayerActionPack; -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.program.runtime.MinionRuntime; -import io.github.skippyall.minions.program.runtime.ProgramRuntime; -import io.github.skippyall.minions.program.statement.Statement; -import io.github.skippyall.minions.program.tuple.Tuple0; -import io.github.skippyall.minions.program.variables.Types; - -import java.util.List; - -public class UseBlock extends CodeBlock{ - public UseBlock(String name) { - super("use", List.of(), Types.VOID); - } - - @Override - public Void execute(ProgramRuntime runtime, Tuple0 args, Statement.Run run) { - if(runtime instanceof MinionRuntime minionRuntime) { - MinionFakePlayer minion = minionRuntime.getMinion(); - minion.getMinionActionPack().start(EntityPlayerActionPack.ActionType.USE, EntityPlayerActionPack.Action.once()); - } - return null; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/runtime/MinionRuntime.java b/src/main/java/io/github/skippyall/minions/program/runtime/MinionRuntime.java deleted file mode 100644 index fe1e131..0000000 --- a/src/main/java/io/github/skippyall/minions/program/runtime/MinionRuntime.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.github.skippyall.minions.program.runtime; - -import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; - -public class MinionRuntime extends ProgramRuntime { - private final MinionFakePlayer minion; - - public MinionRuntime(MinionFakePlayer minion) { - this.minion = minion; - } - - public MinionFakePlayer getMinion() { - return minion; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/runtime/ProgramRuntime.java b/src/main/java/io/github/skippyall/minions/program/runtime/ProgramRuntime.java deleted file mode 100644 index ea4a7ef..0000000 --- a/src/main/java/io/github/skippyall/minions/program/runtime/ProgramRuntime.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.github.skippyall.minions.program.runtime; - -import io.github.skippyall.minions.program.statement.StatementList; - -import java.util.HashMap; -import java.util.Map; - -public abstract class ProgramRuntime { - private final Map variables = new HashMap<>(); - private StatementList statements; - private StatementList.Run run; - - public ProgramRuntime() { - this(new StatementList()); - } - - public ProgramRuntime(StatementList statements) { - this.statements = statements; - } - - public void start() { - run = statements.start(this); - } - - public void tick() { - if(run != null) { - run.tick(); - } - } - - public StatementList getStatementList() { - return statements; - } - - public Object getVariable(String name) { - return variables.get(name); - } - - public void setVariable(String name, Object value) { - variables.put(name, value); - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/statement/Statement.java b/src/main/java/io/github/skippyall/minions/program/statement/Statement.java deleted file mode 100644 index 3ca0f93..0000000 --- a/src/main/java/io/github/skippyall/minions/program/statement/Statement.java +++ /dev/null @@ -1,73 +0,0 @@ -package io.github.skippyall.minions.program.statement; - -import io.github.skippyall.minions.program.argument.ArgUtils; -import io.github.skippyall.minions.program.block.CodeBlock; -import io.github.skippyall.minions.program.runtime.ProgramRuntime; -import io.github.skippyall.minions.program.tuple.Tuple; -import io.github.skippyall.minions.program.variables.ValueStorage; - -public record Statement(CodeBlock codeBlock, A args, ValueStorage valueStorage) { - @SuppressWarnings("unchecked") - public Run start(ProgramRuntime runtime) { - Run run = new Run(runtime); - codeBlock.start(runtime, (A) ArgUtils.resolveArgs(args, runtime), run); - return run; - } - - public class Run { - private boolean running = false; - private boolean waiting = false; - private boolean afterRun = false; - private R cachedResult; - private int ticksRunning = 0; - private int ticksLeft = 0; - - private final ProgramRuntime runtime; - - Run(ProgramRuntime runtime) { - this.runtime = runtime; - } - - public boolean isDone() { - return !running; - } - - public void tick() { - if(running) { - ticksRunning ++; - ticksLeft --; - if(ticksLeft == 0 && waiting && afterRun) { - complete(cachedResult); - } - } - } - - public void afterRun(R result) { - afterRun = true; - if(ticksLeft == 0) { - complete(result); - } - } - - private void complete(R result) { - if(valueStorage != null) { - valueStorage.storeValue(result, runtime); - } - running = false; - waiting = false; - cachedResult = null; - ticksRunning = 0; - ticksLeft = 0; - } - - public void completeAfter(int ticks, R value) { - waiting = true; - ticksLeft = ticks; - cachedResult = value; - } - - public int getTicksRunning() { - return ticksRunning; - } - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/statement/StatementList.java b/src/main/java/io/github/skippyall/minions/program/statement/StatementList.java deleted file mode 100644 index 3755f35..0000000 --- a/src/main/java/io/github/skippyall/minions/program/statement/StatementList.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.github.skippyall.minions.program.statement; - -import io.github.skippyall.minions.program.runtime.ProgramRuntime; - -import java.util.Iterator; -import java.util.List; - -public class StatementList { - private final List> statements; - - public StatementList() { - this.statements = List.of(); - } - - public StatementList(List> statements) { - this.statements = List.copyOf(statements); - } - - public Run start(ProgramRuntime runtime) { - return new Run(runtime); - } - - public class Run { - final ProgramRuntime runtime; - final Iterator> iterator; - Statement.Run run; - - public Run(ProgramRuntime runtime) { - this.runtime = runtime; - iterator = statements.iterator(); - startNext(); - } - - private boolean startNext() { - if(iterator.hasNext()) { - run = iterator.next().start(runtime); - return true; - } else { - return false; - } - } - - public void tick() { - run.tick(); - if(run.isDone()){ - startNext(); - } - } - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple.java b/src/main/java/io/github/skippyall/minions/program/tuple/Tuple.java deleted file mode 100644 index 3d7a54a..0000000 --- a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.github.skippyall.minions.program.tuple; - -import org.jetbrains.annotations.NotNull; - -import java.util.Iterator; -import java.util.List; - -public interface Tuple extends Iterable{ - Tuple add(T value); - Tuple removeLast(); - List getValueList(); - int size(); - - @NotNull - @Override - default Iterator iterator() { - return getValueList().iterator(); - } - - static Tuple ofList(List list) { - return switch (list.size()) { - case 0 -> new Tuple0(); - case 1 -> new Tuple1(list.get(0)); - case 2 -> new Tuple2(list.get(0), list.get(1)); - case 3 -> new Tuple3(list.get(0), list.get(1), list.get(2)); - default -> throw new UnsupportedOperationException(); - }; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple0.java b/src/main/java/io/github/skippyall/minions/program/tuple/Tuple0.java deleted file mode 100644 index 3da543a..0000000 --- a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple0.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.skippyall.minions.program.tuple; - -import java.util.List; - -public record Tuple0() implements Tuple{ - @Override - public Tuple add(T value) { - return new Tuple1<>(value); - } - - @Override - public Tuple removeLast() { - throw new UnsupportedOperationException("Cannot remove element from length 0 tuple."); - } - - @Override - public List getValueList() { - return List.of(); - } - - @Override - public int size() { - return 0; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple1.java b/src/main/java/io/github/skippyall/minions/program/tuple/Tuple1.java deleted file mode 100644 index 69d5389..0000000 --- a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple1.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.skippyall.minions.program.tuple; - -import java.util.List; - -public record Tuple1(T0 v0) implements Tuple{ - @Override - public Tuple add(T value) { - return new Tuple2<>(v0, value); - } - - @Override - public Tuple removeLast() { - return new Tuple0(); - } - - @Override - public List getValueList() { - return List.of(v0); - } - - @Override - public int size() { - return 1; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple2.java b/src/main/java/io/github/skippyall/minions/program/tuple/Tuple2.java deleted file mode 100644 index b2772a5..0000000 --- a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple2.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.skippyall.minions.program.tuple; - -import java.util.List; - -public record Tuple2(T0 v0, T1 v1) implements Tuple { - @Override - public Tuple add(T value) { - return new Tuple3<>(v0, v1, value); - } - - @Override - public Tuple removeLast() { - return new Tuple1<>(v0); - } - - @Override - public List getValueList() { - return List.of(v0, v1); - } - - @Override - public int size() { - return 2; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple3.java b/src/main/java/io/github/skippyall/minions/program/tuple/Tuple3.java deleted file mode 100644 index 615b34a..0000000 --- a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple3.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.skippyall.minions.program.tuple; - -import java.util.List; - -public record Tuple3(T0 v0, T1 v1, T2 v2) implements Tuple { - @Override - public Tuple add(T value) { - return new Tuple4<>(v0, v1, v2, value); - } - - @Override - public Tuple removeLast() { - return new Tuple2<>(v0, v1); - } - - @Override - public List getValueList() { - return List.of(v0, v1, v2); - } - - @Override - public int size() { - return 3; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple4.java b/src/main/java/io/github/skippyall/minions/program/tuple/Tuple4.java deleted file mode 100644 index 946135d..0000000 --- a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple4.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.skippyall.minions.program.tuple; - -import java.util.List; - -public record Tuple4(T0 v0, T1 v1, T2 v2, T3 v3) implements Tuple { - @Override - public Tuple add(T value) { - return new Tuple5<>(v0, v1, v2, v3, value); - } - - @Override - public Tuple removeLast() { - return new Tuple3<>(v0, v1, v2); - } - - @Override - public List getValueList() { - return List.of(v0, v1, v2, v3); - } - - @Override - public int size() { - return 4; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple5.java b/src/main/java/io/github/skippyall/minions/program/tuple/Tuple5.java deleted file mode 100644 index dddd5b2..0000000 --- a/src/main/java/io/github/skippyall/minions/program/tuple/Tuple5.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.skippyall.minions.program.tuple; - -import java.util.List; - -public record Tuple5(T0 v0, T1 v1, T2 v2, T3 v3, T4 v4) implements Tuple { - @Override - public Tuple add(T value) { - throw new UnsupportedOperationException("Cannot add element to length 5 tuple."); - } - - @Override - public Tuple removeLast() { - return new Tuple4<>(v0, v1, v2, v3); - } - - @Override - public List getValueList() { - return List.of(v0, v1, v2, v3, v4); - } - - @Override - public int size() { - return 5; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/variables/FloatType.java b/src/main/java/io/github/skippyall/minions/program/variables/FloatType.java deleted file mode 100644 index 010dd50..0000000 --- a/src/main/java/io/github/skippyall/minions/program/variables/FloatType.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.github.skippyall.minions.program.variables; - -public class FloatType extends Type{ -} diff --git a/src/main/java/io/github/skippyall/minions/program/variables/IntegerType.java b/src/main/java/io/github/skippyall/minions/program/variables/IntegerType.java deleted file mode 100644 index 40b8feb..0000000 --- a/src/main/java/io/github/skippyall/minions/program/variables/IntegerType.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.github.skippyall.minions.program.variables; - -public class IntegerType extends Type{ -} diff --git a/src/main/java/io/github/skippyall/minions/program/variables/Type.java b/src/main/java/io/github/skippyall/minions/program/variables/Type.java deleted file mode 100644 index 3cceff6..0000000 --- a/src/main/java/io/github/skippyall/minions/program/variables/Type.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.github.skippyall.minions.program.variables; - -public abstract class Type { - @SuppressWarnings("unchecked") - public T cast(Object object) throws ClassCastException { - return (T) object; - } -} diff --git a/src/main/java/io/github/skippyall/minions/program/variables/Types.java b/src/main/java/io/github/skippyall/minions/program/variables/Types.java deleted file mode 100644 index 94e7589..0000000 --- a/src/main/java/io/github/skippyall/minions/program/variables/Types.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.github.skippyall.minions.program.variables; - -public class Types { - public static final IntegerType INTEGER = new IntegerType(); - public static final FloatType FLOAT = new FloatType(); - public static final Type VOID = new Type<>() {}; -} diff --git a/src/main/java/io/github/skippyall/minions/program/variables/ValueStorage.java b/src/main/java/io/github/skippyall/minions/program/variables/ValueStorage.java deleted file mode 100644 index 44ffe39..0000000 --- a/src/main/java/io/github/skippyall/minions/program/variables/ValueStorage.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.github.skippyall.minions.program.variables; - -import io.github.skippyall.minions.program.runtime.ProgramRuntime; - -public interface ValueStorage { - void storeValue(T value, ProgramRuntime runtime); -} diff --git a/src/main/java/io/github/skippyall/minions/program/variables/Variable.java b/src/main/java/io/github/skippyall/minions/program/variables/Variable.java deleted file mode 100644 index 4414f7d..0000000 --- a/src/main/java/io/github/skippyall/minions/program/variables/Variable.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.github.skippyall.minions.program.variables; - -import io.github.skippyall.minions.program.argument.Arg; -import io.github.skippyall.minions.program.runtime.ProgramRuntime; - -public class Variable implements Arg, ValueStorage { - private final Type type; - private final String name; - - public Variable(Type type, String name) { - this.type = type; - this.name = name; - } - - @Override - public T resolve(ProgramRuntime runtime) { - return type.cast(runtime.getVariable(name)); - } - - @Override - public Type getType() { - return type; - } - - @Override - public void storeValue(T value, ProgramRuntime runtime) { - runtime.setVariable(name, value); - } -} diff --git a/src/main/java/io/github/skippyall/minions/util/ModelIdUtil.java b/src/main/java/io/github/skippyall/minions/util/ModelIdUtil.java new file mode 100644 index 0000000..10cfed5 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/util/ModelIdUtil.java @@ -0,0 +1,12 @@ +package io.github.skippyall.minions.util; + +import net.minecraft.item.Item; +import net.minecraft.registry.Registries; +import net.minecraft.util.Identifier; + +public class ModelIdUtil { + public static Identifier getItemModelId(Item item) { + Identifier identifier = Registries.ITEM.getId(item); + return identifier.withPrefixedPath("item/"); + } +} diff --git a/src/main/java/io/github/skippyall/minions/util/TranslationUtil.java b/src/main/java/io/github/skippyall/minions/util/TranslationUtil.java new file mode 100644 index 0000000..6500604 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/util/TranslationUtil.java @@ -0,0 +1,26 @@ +package io.github.skippyall.minions.util; + +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; + +public class TranslationUtil { + public static String getTranslationKey(T object, Registry registry, String defaultKey) { + return getTranslationKey(object, registry, registry.getKey().getValue().getPath(), defaultKey); + } + + public static String getTranslationKey(T object, Registry registry, String prefix, String defaultKey) { + if(object == null) { + return defaultKey; + } + + Identifier id = registry.getId(object); + if(id == null) { + return defaultKey; + } + return id.toTranslationKey(prefix); + } + + public static String getTranslationKey(T object, Registry registry) { + return getTranslationKey(object, registry, "minions.generic.unknown"); + } +} diff --git a/src/main/resources/data/minions/lang/en_us.json b/src/main/resources/data/minions/lang/en_us.json index 343f9c2..1c14de4 100644 --- a/src/main/resources/data/minions/lang/en_us.json +++ b/src/main/resources/data/minions/lang/en_us.json @@ -15,6 +15,8 @@ "minions.gui.look.skin.base64": "Base64", "minions.gui.look.skin.base64.title": "Enter a skin in base64 encoding", "minions.gui.look.rename.title": "Enter a name", + "minions.gui.instruction.no_instruction_set": "No instruction set", + "minions.gui.instruction.enter_name": "Enter a name", "minions.command.input.int.fail": "Not an integer", "minions.command.input.float.fail": "Not a number", @@ -29,6 +31,8 @@ "minions.command.attack.name": "Attack", "minions.command.attack.description": "Attack and mine blocks", + "minions.command.minion.not_present": "This minion does not exist", + "item.minions.attack_module": "Attack Module", "item.minions.interact_module": "Interact Module", "item.minions.mob_spawning_module": "Mob Spawning Module", @@ -44,5 +48,6 @@ "minions.generic.name.invalid": "Name is invalid", "minions.generic.name.taken": "This name is already used", "minions.generic.mod_name": "Minions", - "minions.command.minion.not_present": "This minion does not exist" + "minions.generic.unknown": "Unknown", + "minions.gui.instruction.no_argument_set": "No argument set" } \ No newline at end of file diff --git a/src/main/resources/data/minions/minion_module/move.json b/src/main/resources/data/minions/minion_module/move.json new file mode 100644 index 0000000..fd1873f --- /dev/null +++ b/src/main/resources/data/minions/minion_module/move.json @@ -0,0 +1,5 @@ +{ + "instructions": [ + "minions:walk" + ] +} \ No newline at end of file