diff --git a/src/main/java/io/github/skippyall/minions/MinionRegistries.java b/src/main/java/io/github/skippyall/minions/MinionRegistries.java index 4aeba4e..866246b 100644 --- a/src/main/java/io/github/skippyall/minions/MinionRegistries.java +++ b/src/main/java/io/github/skippyall/minions/MinionRegistries.java @@ -2,9 +2,9 @@ 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 io.github.skippyall.minions.program.argument.GenericArgumentType; +import io.github.skippyall.minions.program.instruction.InstructionType; +import io.github.skippyall.minions.program.value.ValueType; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.SimpleRegistry; diff --git a/src/main/java/io/github/skippyall/minions/Minions.java b/src/main/java/io/github/skippyall/minions/Minions.java index 114acb6..a93c073 100644 --- a/src/main/java/io/github/skippyall/minions/Minions.java +++ b/src/main/java/io/github/skippyall/minions/Minions.java @@ -1,23 +1,16 @@ package io.github.skippyall.minions; -import eu.pb4.polymer.core.api.entity.PolymerEntityUtils; 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 io.github.skippyall.minions.module.MinionModule; +import io.github.skippyall.minions.program.instruction.Instructions; +import io.github.skippyall.minions.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; @@ -50,7 +43,5 @@ public class Minions implements ModInitializer { 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/InstructionGui.java b/src/main/java/io/github/skippyall/minions/gui/InstructionGui.java new file mode 100644 index 0000000..6de99a2 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/gui/InstructionGui.java @@ -0,0 +1,226 @@ +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.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.module.MinionModule; +import io.github.skippyall.minions.program.argument.Argument; +import io.github.skippyall.minions.program.argument.GenericArgumentType; +import io.github.skippyall.minions.program.argument.SpecificArgumentType; +import io.github.skippyall.minions.program.instruction.ConfiguredInstruction; +import io.github.skippyall.minions.program.instruction.InstructionType; +import io.github.skippyall.minions.program.argument.Parameter; +import io.github.skippyall.minions.util.TranslationUtil; +import net.minecraft.item.ItemStack; +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; +import java.util.NoSuchElementException; +import java.util.concurrent.CompletableFuture; + +public class InstructionGui { + public static void openInstructionMainMenu(MinionFakePlayer minion, ServerPlayerEntity player) { + SimpleGui gui = new SimpleGui(ScreenHandlerType.GENERIC_3X3, player, false); + gui.setSlot(3, new GuiElementBuilder() + .setItem(Items.BOOK) + .setName(Text.literal("Instruction List")) + .setCallback(() -> instructionList(minion, player)) + ); + gui.setSlot(5, new GuiElementBuilder() + .setItem(Items.WRITABLE_BOOK) + .setName(Text.literal("New Instruction")) + .setCallback(() -> createNewInstruction(minion, player)) + ); + + gui.open(); + } + + public static void instructionList(MinionFakePlayer minion, ServerPlayerEntity player) { + SimpleGui gui = new SimpleGui(ScreenHandlerType.GENERIC_9X3, player, false); + for(String instructionName : minion.getInstructionManager().getInstructionNames()) { + ConfiguredInstruction instruction = minion.getInstructionManager().getInstruction(instructionName); + gui.addSlot(instruction.getInstruction().getDisplay().createElement() + .setName(Text.literal(instructionName)) + .setLore(List.of()) + .setCallback(() -> configureInstructionMenu(instructionName, instruction, minion, player)) + ); + } + gui.open(); + } + + public static void createNewInstruction(MinionFakePlayer minion, ServerPlayerEntity player) { + selectInstructionModuleMenu(minion, player).thenAccept(instructionType -> + TextInput.inputString(player, Text.translatable("minions.gui.instruction.enter_name"), "Instruction").thenAccept(name -> { + ConfiguredInstruction configuredInstruction = minion.getInstructionManager().createInstruction(name, instructionType); + configureInstructionMenu(name, configuredInstruction, minion, player); + }) + ); + } + + public static boolean checkInstructionExists(String name, ConfiguredInstruction instruction, MinionFakePlayer minion, ServerPlayerEntity player) { + boolean stillExists = minion.getInstructionManager().getInstruction(name) == instruction; + if(!stillExists) { + player.closeHandledScreen(); + player.sendMessage(Text.translatable("minions.gui.instruction.removed")); + } + return stillExists; + } + + public static void configureInstructionMenu(String name, ConfiguredInstruction instruction, MinionFakePlayer minion, ServerPlayerEntity player) { + if(!checkInstructionExists(name, instruction, minion, player)) { + return; + } + + SimpleGui gui = new SimpleGui(ScreenHandlerType.GENERIC_9X3, player, false); + + gui.setSlot(12, createInstructionElement(instruction.getInstruction())); + + int slot = 13; + for(Parameter parameter : instruction.getInstruction().getParameters()) { + gui.setSlot(slot, createArgumentElement(instruction.getArguments().getArgument(parameter)) + .setCallback(() -> configureArgumentMenu(name, instruction, parameter, minion, player)) + ); + slot++; + } + updateRunSlot(instruction, minion, gui); + + gui.open(); + } + + private static void updateRunSlot(ConfiguredInstruction instruction, MinionFakePlayer minion, SimpleGui gui) { + if(!instruction.isRunning()) { + gui.setSlot(26, new GuiElementBuilder(Items.ARROW) + .setName(Text.literal("Run")) + .setCallback(() -> { + instruction.run(minion); + updateRunSlot(instruction, minion, gui); + }) + ); + } else { + gui.setSlot(26, new GuiElementBuilder(Items.BARRIER) + .setName(Text.literal("Stop")) + .setCallback(() -> { + instruction.stop(minion); + updateRunSlot(instruction, minion, gui); + }) + ); + } + } + + public static >> void configureArgumentMenu(String name, ConfiguredInstruction instruction, Parameter parameter, MinionFakePlayer minion, ServerPlayerEntity player) { + if(!checkInstructionExists(name, instruction, minion, player)) { + return; + } + + A argument = instruction.getArguments().getArgument(parameter); + + SimpleGui gui = new SimpleGui(ScreenHandlerType.GENERIC_3X3, player, false); + gui.setSlot(3, new GuiElementBuilder(Items.STICK) + .setName(Text.literal("Type: " + (argument == null ? "Unset" : MinionRegistries.GENERIC_ARGUMENT_TYPE_REGISTRY.getId(argument.getType().getGenericArgumentType()).getPath()))) + .setCallback(() -> selectArgumentType(player) + .thenApply(type -> type.createTypeSpecific(parameter.type()).openArgumentDialog(player, null) + .thenAccept(newArgument -> { + instruction.getArguments().setArgument(parameter, newArgument); + configureArgumentMenu(name, instruction, parameter, minion, player); + }) + ) + ) + ); + + if(argument != null) { + gui.setSlot(5, new GuiElementBuilder(Items.STRUCTURE_VOID) + .setName(Text.literal("Configure")) + .setCallback(() -> argument.getType().openArgumentDialog(player, argument) + .thenAccept(newArgument -> instruction.getArguments().setArgument(parameter, newArgument)) + ) + ); + } + gui.open(); + } + + public static CompletableFuture selectArgumentType(ServerPlayerEntity player) { + CompletableFuture future = new CompletableFuture<>(); + SimpleGui gui = new SimpleGui(ScreenHandlerType.GENERIC_9X3, player, false); + for(GenericArgumentType type : MinionRegistries.GENERIC_ARGUMENT_TYPE_REGISTRY) { + gui.addSlot(new GuiElementBuilder() + .setName(Text.translatable(TranslationUtil.getTranslationKey(type, MinionRegistries.GENERIC_ARGUMENT_TYPE_REGISTRY))) + .setCallback(() -> future.complete(type)) + ); + } + gui.open(); + return future; + } + + public static CompletableFuture> selectInstructionModuleMenu(MinionFakePlayer minion, ServerPlayerEntity player) { + if(minion.getModuleInventory().getModules().isEmpty()) { + player.sendMessage(Text.literal("This minion has no modules")); + return CompletableFuture.failedFuture(new NoSuchElementException("No modules")); + } + + CompletableFuture> future = new CompletableFuture<>(); + + SimpleGui gui = new SimpleGui(ScreenHandlerType.GENERIC_9X3, player, false) { + @Override + public void onClose() { + if(!future.isDone()) { + future.cancel(false); + } + } + }; + + for(int i = 0; i < minion.getModuleInventory().size(); i++) { + ItemStack module = minion.getModuleInventory().getStack(i); + if(module.contains(MinionModule.COMPONENT_TYPE)) { + gui.addSlot(new GuiElementBuilder(module) + .setCallback(() -> selectInstructionMenu(module.get(MinionModule.COMPONENT_TYPE), minion, player) + .thenApply(future::complete) + ) + ); + } + } + + gui.open(); + return future; + } + + public static CompletableFuture> selectInstructionMenu(MinionModule module, MinionFakePlayer minion, ServerPlayerEntity player) { + CompletableFuture> future = new CompletableFuture<>(); + + SimpleGui gui = new SimpleGui(ScreenHandlerType.GENERIC_9X3, player, false); + for(InstructionType instructionType : module.instructions()) { + gui.addSlot(createInstructionElement(instructionType) + .setCallback(() -> future.complete(instructionType)) + ); + } + + gui.open(); + return future; + } + + public static GuiElementBuilder createInstructionElement(InstructionType instructionType) { + GuiElementBuilder instructionBuilder; + if(instructionType != null) { + instructionBuilder = instructionType.getDisplay().createElement(); + } else { + instructionBuilder = new GuiElementBuilder(Items.RED_WOOL) + .setName(Text.translatable("minions.gui.instruction.no_instruction_set")); + } + return instructionBuilder; + } + + public static GuiElementBuilder createArgumentElement(Argument argument) { + GuiElementBuilder argumentBuilder; + if(argument != null) { + argumentBuilder = argument.getDisplay().createElement(); + } else { + argumentBuilder = new GuiElementBuilder(Items.RED_WOOL) + .setName(Text.translatable("minions.gui.instruction.no_argument_set")); + } + return argumentBuilder; + } +} 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 100f27a..6616223 100644 --- a/src/main/java/io/github/skippyall/minions/gui/MinionGui.java +++ b/src/main/java/io/github/skippyall/minions/gui/MinionGui.java @@ -3,6 +3,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.minion.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.module.ModuleInventory; import net.minecraft.item.Items; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.screen.slot.Slot; diff --git a/src/main/java/io/github/skippyall/minions/minion/MinionInstructionManager.java b/src/main/java/io/github/skippyall/minions/minion/MinionInstructionManager.java index 2f3f982..fa15dc2 100644 --- a/src/main/java/io/github/skippyall/minions/minion/MinionInstructionManager.java +++ b/src/main/java/io/github/skippyall/minions/minion/MinionInstructionManager.java @@ -2,8 +2,8 @@ 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 io.github.skippyall.minions.program.instruction.ConfiguredInstruction; +import io.github.skippyall.minions.program.instruction.InstructionType; import net.minecraft.storage.ReadView; import net.minecraft.storage.WriteView; @@ -46,6 +46,10 @@ public class MinionInstructionManager { return configuredInstructions.get(name); } + public boolean hasInstruction(String name) { + return configuredInstructions.containsKey(name); + } + public void save(WriteView view) { WriteView.ListView list = view.getList("configuredInstructions"); for (Map.Entry> instruction : configuredInstructions.entrySet()) { 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 c70f426..bc73118 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 @@ -10,7 +10,7 @@ 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.module.ModuleInventory; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EquipmentSlot; diff --git a/src/main/java/io/github/skippyall/minions/new_module/MinionModule.java b/src/main/java/io/github/skippyall/minions/module/MinionModule.java similarity index 75% rename from src/main/java/io/github/skippyall/minions/new_module/MinionModule.java rename to src/main/java/io/github/skippyall/minions/module/MinionModule.java index e8995a9..9bf4129 100644 --- a/src/main/java/io/github/skippyall/minions/new_module/MinionModule.java +++ b/src/main/java/io/github/skippyall/minions/module/MinionModule.java @@ -1,15 +1,14 @@ -package io.github.skippyall.minions.new_module; +package io.github.skippyall.minions.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 io.github.skippyall.minions.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; @@ -21,9 +20,7 @@ public record MinionModule(List> 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 ComponentType COMPONENT_TYPE = ComponentType.builder().codec(CODEC).build(); public static final MinionModule EMPTY = new MinionModule(List.of()); diff --git a/src/main/java/io/github/skippyall/minions/gui/ModuleInventory.java b/src/main/java/io/github/skippyall/minions/module/ModuleInventory.java similarity index 93% rename from src/main/java/io/github/skippyall/minions/gui/ModuleInventory.java rename to src/main/java/io/github/skippyall/minions/module/ModuleInventory.java index b021a00..11a6d0b 100644 --- a/src/main/java/io/github/skippyall/minions/gui/ModuleInventory.java +++ b/src/main/java/io/github/skippyall/minions/module/ModuleInventory.java @@ -1,8 +1,7 @@ -package io.github.skippyall.minions.gui; +package io.github.skippyall.minions.module; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.new_module.MinionModule; -import io.github.skippyall.minions.new_program.instruction.InstructionType; +import io.github.skippyall.minions.program.instruction.InstructionType; import net.minecraft.inventory.Inventories; import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.ItemStack; diff --git a/src/main/java/io/github/skippyall/minions/gui/ModuleInventoryScreenHandler.java b/src/main/java/io/github/skippyall/minions/module/ModuleInventoryScreenHandler.java similarity index 98% rename from src/main/java/io/github/skippyall/minions/gui/ModuleInventoryScreenHandler.java rename to src/main/java/io/github/skippyall/minions/module/ModuleInventoryScreenHandler.java index 691b9ee..2e325b6 100644 --- a/src/main/java/io/github/skippyall/minions/gui/ModuleInventoryScreenHandler.java +++ b/src/main/java/io/github/skippyall/minions/module/ModuleInventoryScreenHandler.java @@ -1,4 +1,4 @@ -package io.github.skippyall.minions.gui; +package io.github.skippyall.minions.module; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; 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 deleted file mode 100644 index 3dbe7de..0000000 --- a/src/main/java/io/github/skippyall/minions/new_module/ModuleLoader.java +++ /dev/null @@ -1,30 +0,0 @@ -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/argument/Argument.java b/src/main/java/io/github/skippyall/minions/program/argument/Argument.java similarity index 89% rename from src/main/java/io/github/skippyall/minions/new_program/argument/Argument.java rename to src/main/java/io/github/skippyall/minions/program/argument/Argument.java index c07cf80..54ef08a 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/Argument.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/Argument.java @@ -1,8 +1,8 @@ -package io.github.skippyall.minions.new_program.argument; +package io.github.skippyall.minions.program.argument; import io.github.skippyall.minions.gui.GuiDisplay; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.new_program.value.ValueType; +import io.github.skippyall.minions.program.value.ValueType; import org.jetbrains.annotations.Nullable; /** diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/ArgumentList.java b/src/main/java/io/github/skippyall/minions/program/argument/ArgumentList.java similarity index 96% rename from src/main/java/io/github/skippyall/minions/new_program/argument/ArgumentList.java rename to src/main/java/io/github/skippyall/minions/program/argument/ArgumentList.java index 6af4f7b..75d2abf 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/ArgumentList.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/ArgumentList.java @@ -1,4 +1,4 @@ -package io.github.skippyall.minions.new_program.argument; +package io.github.skippyall.minions.program.argument; import com.mojang.serialization.Codec; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/Arguments.java b/src/main/java/io/github/skippyall/minions/program/argument/Arguments.java similarity index 86% rename from src/main/java/io/github/skippyall/minions/new_program/argument/Arguments.java rename to src/main/java/io/github/skippyall/minions/program/argument/Arguments.java index 2253be4..946159b 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/Arguments.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/Arguments.java @@ -1,13 +1,9 @@ -package io.github.skippyall.minions.new_program.argument; +package io.github.skippyall.minions.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; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.SimpleRegistry; import net.minecraft.util.Identifier; public class Arguments { diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/GenericArgumentType.java b/src/main/java/io/github/skippyall/minions/program/argument/GenericArgumentType.java similarity index 54% rename from src/main/java/io/github/skippyall/minions/new_program/argument/GenericArgumentType.java rename to src/main/java/io/github/skippyall/minions/program/argument/GenericArgumentType.java index 0ab05b4..d2844c5 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/GenericArgumentType.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/GenericArgumentType.java @@ -1,6 +1,6 @@ -package io.github.skippyall.minions.new_program.argument; +package io.github.skippyall.minions.program.argument; -import io.github.skippyall.minions.new_program.value.ValueType; +import io.github.skippyall.minions.program.value.ValueType; public interface GenericArgumentType { 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/program/argument/Parameter.java similarity index 87% rename from src/main/java/io/github/skippyall/minions/new_program/argument/Parameter.java rename to src/main/java/io/github/skippyall/minions/program/argument/Parameter.java index e8067c3..5e5eede 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/Parameter.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/Parameter.java @@ -1,9 +1,9 @@ -package io.github.skippyall.minions.new_program.argument; +package io.github.skippyall.minions.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 io.github.skippyall.minions.program.value.ValueType; import org.jetbrains.annotations.Nullable; public record Parameter(String name, ValueType type) { diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/SpecificArgumentType.java b/src/main/java/io/github/skippyall/minions/program/argument/SpecificArgumentType.java similarity index 89% rename from src/main/java/io/github/skippyall/minions/new_program/argument/SpecificArgumentType.java rename to src/main/java/io/github/skippyall/minions/program/argument/SpecificArgumentType.java index 95f6896..4934ee0 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/SpecificArgumentType.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/SpecificArgumentType.java @@ -1,7 +1,7 @@ -package io.github.skippyall.minions.new_program.argument; +package io.github.skippyall.minions.program.argument; import com.mojang.serialization.Codec; -import io.github.skippyall.minions.new_program.value.ValueType; +import io.github.skippyall.minions.program.value.ValueType; import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgument.java b/src/main/java/io/github/skippyall/minions/program/argument/ValueArgument.java similarity index 86% rename from src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgument.java rename to src/main/java/io/github/skippyall/minions/program/argument/ValueArgument.java index 0bc8ae3..f3b67a5 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgument.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/ValueArgument.java @@ -1,8 +1,7 @@ -package io.github.skippyall.minions.new_program.argument; +package io.github.skippyall.minions.program.argument; import io.github.skippyall.minions.gui.GuiDisplay; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.new_program.value.ValueType; /** * An argument that always resolves to a fixed value diff --git a/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgumentType.java b/src/main/java/io/github/skippyall/minions/program/argument/ValueArgumentType.java similarity index 89% rename from src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgumentType.java rename to src/main/java/io/github/skippyall/minions/program/argument/ValueArgumentType.java index 0604fe6..7316bad 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/argument/ValueArgumentType.java +++ b/src/main/java/io/github/skippyall/minions/program/argument/ValueArgumentType.java @@ -1,7 +1,7 @@ -package io.github.skippyall.minions.new_program.argument; +package io.github.skippyall.minions.program.argument; import com.mojang.serialization.Codec; -import io.github.skippyall.minions.new_program.value.ValueType; +import io.github.skippyall.minions.program.value.ValueType; import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/io/github/skippyall/minions/program/instruction/ConfiguredInstruction.java b/src/main/java/io/github/skippyall/minions/program/instruction/ConfiguredInstruction.java new file mode 100644 index 0000000..51efa33 --- /dev/null +++ b/src/main/java/io/github/skippyall/minions/program/instruction/ConfiguredInstruction.java @@ -0,0 +1,113 @@ +package io.github.skippyall.minions.program.instruction; + +import io.github.skippyall.minions.MinionRegistries; +import io.github.skippyall.minions.Minions; +import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; +import io.github.skippyall.minions.program.argument.ArgumentList; +import net.minecraft.storage.ReadView; +import net.minecraft.storage.WriteView; +import org.jetbrains.annotations.Nullable; + +public class ConfiguredInstruction { + private final InstructionType instruction; + private final ArgumentList arguments; + private @Nullable InstructionExecution execution; + private final String name; + + private ConfiguredInstruction(InstructionType instruction, ArgumentList arguments, @Nullable InstructionExecution execution, String name) { + this.instruction = instruction; + this.arguments = arguments; + this.execution = execution; + this.name = name; + } + + public ConfiguredInstruction(InstructionType instruction, String name) { + this(instruction, new ArgumentList(), null, name); + } + + public InstructionType getInstruction() { + return instruction; + } + + public ArgumentList getArguments() { + return arguments; + } + + public String getName() { + return name; + } + + public boolean canRun() { + return instruction != null && arguments != null && arguments.hasArgumentForAll(instruction.getParameters()); + } + + public boolean isRunning() { + return execution != null; + } + + public @Nullable InstructionExecution getExecution() { + return execution; + } + + public void run(MinionFakePlayer minion) { + if(canRun() && !isRunning()) { + try { + execution = instruction.createExecution(arguments, minion); + execution.start(minion); + } catch (Exception e) { + Minions.LOGGER.error("An error occurred while executing configured Instruction {} of minion {}", name, minion.getGameProfile().getName(), e); + + } + } + } + + public void tick(MinionFakePlayer minion) { + if(isRunning()) { + if(execution.isDone(minion)) { + stop(minion); + } else { + execution.tick(minion); + if (execution.isDone(minion)) { + stop(minion); + } + } + } + } + + public void stop(MinionFakePlayer minion) { + if(isRunning()) { + execution.stop(minion); + execution = null; + } + } + + public void save(WriteView view, MinionFakePlayer minion) { + view.put("instruction", MinionRegistries.INSTRUCTION_TYPES.getCodec(), instruction); + view.put("arguments", ArgumentList.CODEC, arguments); + view.putBoolean("running", isRunning()); + if(isRunning()) { + execution.save(view.get("execution"), minion); + } + } + + public static ConfiguredInstruction load(ReadView view, MinionFakePlayer minion, String name) { + //noinspection unchecked + InstructionType instructionType = (InstructionType) view.read("instruction", MinionRegistries.INSTRUCTION_TYPES.getCodec()).orElseThrow(); + + ArgumentList arguments = view.read("arguments", ArgumentList.CODEC).orElseThrow(); + + boolean running = view.getBoolean("running", false); + + if(running) { + ReadView executionView = view.getReadView("execution"); + try { + InstructionExecution execution = instructionType.loadExecution(executionView, minion); + return new ConfiguredInstruction<>(instructionType, arguments, execution, name); + } catch (Exception e) { + + } + } + + return new ConfiguredInstruction<>(instructionType, arguments, null, name); + } +} diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionExecution.java b/src/main/java/io/github/skippyall/minions/program/instruction/InstructionExecution.java similarity index 89% rename from src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionExecution.java rename to src/main/java/io/github/skippyall/minions/program/instruction/InstructionExecution.java index 51a5847..3be5bda 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionExecution.java +++ b/src/main/java/io/github/skippyall/minions/program/instruction/InstructionExecution.java @@ -1,7 +1,7 @@ -package io.github.skippyall.minions.new_program.instruction; +package io.github.skippyall.minions.program.instruction; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.new_program.argument.ArgumentList; +import io.github.skippyall.minions.program.argument.ArgumentList; import net.minecraft.storage.ReadView; import net.minecraft.storage.WriteView; @@ -39,7 +39,7 @@ public interface InstructionExecution { * 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}.
+ * {@link io.github.skippyall.minions.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. diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionType.java b/src/main/java/io/github/skippyall/minions/program/instruction/InstructionType.java similarity index 89% rename from src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionType.java rename to src/main/java/io/github/skippyall/minions/program/instruction/InstructionType.java index 9f2268a..e20d6ea 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/instruction/InstructionType.java +++ b/src/main/java/io/github/skippyall/minions/program/instruction/InstructionType.java @@ -1,10 +1,10 @@ -package io.github.skippyall.minions.new_program.instruction; +package io.github.skippyall.minions.program.instruction; import io.github.skippyall.minions.gui.GuiDisplay; import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer; -import io.github.skippyall.minions.new_program.argument.Parameter; -import io.github.skippyall.minions.new_program.argument.ArgumentList; -import io.github.skippyall.minions.new_program.value.ValueType; +import io.github.skippyall.minions.program.argument.Parameter; +import io.github.skippyall.minions.program.argument.ArgumentList; +import io.github.skippyall.minions.program.value.ValueType; import net.minecraft.storage.ReadView; import java.util.Collection; diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/Instructions.java b/src/main/java/io/github/skippyall/minions/program/instruction/Instructions.java similarity index 60% rename from src/main/java/io/github/skippyall/minions/new_program/instruction/Instructions.java rename to src/main/java/io/github/skippyall/minions/program/instruction/Instructions.java index 4bbfe39..554d9eb 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/instruction/Instructions.java +++ b/src/main/java/io/github/skippyall/minions/program/instruction/Instructions.java @@ -1,12 +1,14 @@ -package io.github.skippyall.minions.new_program.instruction; +package io.github.skippyall.minions.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.minion.fakeplayer.EntityPlayerActionPack; +import io.github.skippyall.minions.program.instruction.execution.ActionExecution; +import io.github.skippyall.minions.program.instruction.execution.WalkExecution; +import io.github.skippyall.minions.program.argument.Parameter; +import io.github.skippyall.minions.program.value.ValueType; +import io.github.skippyall.minions.program.value.ValueTypes; import io.github.skippyall.minions.util.ModelIdUtil; import net.minecraft.item.Items; import net.minecraft.registry.Registry; @@ -26,10 +28,16 @@ public class Instructions { public static final InstructionType ATTACK = register( "attack", - base -> new GuiDisplay.ModelBased(ModelIdUtil.getItemModelId(Items.IRON_PICKAXE), base, true), - WalkExecution::new, - ValueTypes.VOID, - WalkExecution.blocksToMoveParam + base -> new GuiDisplay.ModelBased(ModelIdUtil.getItemModelId(Items.IRON_BOOTS), base, true), + () -> new ActionExecution(EntityPlayerActionPack.ActionType.ATTACK), + ValueTypes.VOID + ); + + public static final InstructionType USE = register( + "use", + base -> new GuiDisplay.ModelBased(ModelIdUtil.getItemModelId(Items.LEVER), base, true), + () -> new ActionExecution(EntityPlayerActionPack.ActionType.USE), + ValueTypes.VOID ); private static InstructionType register(String id, Function displayFunction, Supplier> factory, ValueType returnType, Parameter... parameters) { diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ActionExecution.java b/src/main/java/io/github/skippyall/minions/program/instruction/execution/ActionExecution.java similarity index 88% rename from src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ActionExecution.java rename to src/main/java/io/github/skippyall/minions/program/instruction/execution/ActionExecution.java index 1a801ce..7738011 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ActionExecution.java +++ b/src/main/java/io/github/skippyall/minions/program/instruction/execution/ActionExecution.java @@ -1,8 +1,8 @@ -package io.github.skippyall.minions.new_program.instruction.execution; +package io.github.skippyall.minions.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 io.github.skippyall.minions.program.argument.ArgumentList; import net.minecraft.storage.ReadView; import net.minecraft.storage.WriteView; diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ContinuousInstructionExecution.java b/src/main/java/io/github/skippyall/minions/program/instruction/execution/ContinuousInstructionExecution.java similarity index 62% rename from src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ContinuousInstructionExecution.java rename to src/main/java/io/github/skippyall/minions/program/instruction/execution/ContinuousInstructionExecution.java index 551fbac..2ba6f6c 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/ContinuousInstructionExecution.java +++ b/src/main/java/io/github/skippyall/minions/program/instruction/execution/ContinuousInstructionExecution.java @@ -1,7 +1,7 @@ -package io.github.skippyall.minions.new_program.instruction.execution; +package io.github.skippyall.minions.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.program.instruction.InstructionExecution; public interface ContinuousInstructionExecution extends InstructionExecution { @Override diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TimedInstructionExecution.java b/src/main/java/io/github/skippyall/minions/program/instruction/execution/TimedInstructionExecution.java similarity index 87% rename from src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TimedInstructionExecution.java rename to src/main/java/io/github/skippyall/minions/program/instruction/execution/TimedInstructionExecution.java index 2ed056c..f06c450 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TimedInstructionExecution.java +++ b/src/main/java/io/github/skippyall/minions/program/instruction/execution/TimedInstructionExecution.java @@ -1,7 +1,7 @@ -package io.github.skippyall.minions.new_program.instruction.execution; +package io.github.skippyall.minions.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.program.instruction.InstructionExecution; import net.minecraft.storage.ReadView; import net.minecraft.storage.WriteView; diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TurnExecution.java b/src/main/java/io/github/skippyall/minions/program/instruction/execution/TurnExecution.java similarity index 87% rename from src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TurnExecution.java rename to src/main/java/io/github/skippyall/minions/program/instruction/execution/TurnExecution.java index 97e8bd7..a337150 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/TurnExecution.java +++ b/src/main/java/io/github/skippyall/minions/program/instruction/execution/TurnExecution.java @@ -1,9 +1,9 @@ -package io.github.skippyall.minions.new_program.instruction.execution; +package io.github.skippyall.minions.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 io.github.skippyall.minions.program.argument.ArgumentList; +import io.github.skippyall.minions.program.instruction.InstructionExecution; import net.minecraft.storage.ReadView; import net.minecraft.storage.WriteView; import net.minecraft.util.StringIdentifiable; diff --git a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/WalkExecution.java b/src/main/java/io/github/skippyall/minions/program/instruction/execution/WalkExecution.java similarity index 82% rename from src/main/java/io/github/skippyall/minions/new_program/instruction/execution/WalkExecution.java rename to src/main/java/io/github/skippyall/minions/program/instruction/execution/WalkExecution.java index 922c8c4..1d5e9fa 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/instruction/execution/WalkExecution.java +++ b/src/main/java/io/github/skippyall/minions/program/instruction/execution/WalkExecution.java @@ -1,10 +1,10 @@ -package io.github.skippyall.minions.new_program.instruction.execution; +package io.github.skippyall.minions.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 io.github.skippyall.minions.program.instruction.InstructionExecution; +import io.github.skippyall.minions.program.argument.Parameter; +import io.github.skippyall.minions.program.argument.ArgumentList; +import io.github.skippyall.minions.program.value.ValueTypes; import net.minecraft.entity.MovementType; import net.minecraft.storage.ReadView; import net.minecraft.storage.WriteView; diff --git a/src/main/java/io/github/skippyall/minions/new_program/value/ValueType.java b/src/main/java/io/github/skippyall/minions/program/value/ValueType.java similarity index 90% rename from src/main/java/io/github/skippyall/minions/new_program/value/ValueType.java rename to src/main/java/io/github/skippyall/minions/program/value/ValueType.java index 14cc032..a56325c 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/value/ValueType.java +++ b/src/main/java/io/github/skippyall/minions/program/value/ValueType.java @@ -1,4 +1,4 @@ -package io.github.skippyall.minions.new_program.value; +package io.github.skippyall.minions.program.value; import com.mojang.serialization.Codec; import io.github.skippyall.minions.gui.GuiDisplay; diff --git a/src/main/java/io/github/skippyall/minions/new_program/value/ValueTypes.java b/src/main/java/io/github/skippyall/minions/program/value/ValueTypes.java similarity index 98% rename from src/main/java/io/github/skippyall/minions/new_program/value/ValueTypes.java rename to src/main/java/io/github/skippyall/minions/program/value/ValueTypes.java index e6f80f9..e69ed6d 100644 --- a/src/main/java/io/github/skippyall/minions/new_program/value/ValueTypes.java +++ b/src/main/java/io/github/skippyall/minions/program/value/ValueTypes.java @@ -1,4 +1,4 @@ -package io.github.skippyall.minions.new_program.value; +package io.github.skippyall.minions.program.value; import com.mojang.serialization.Codec; import io.github.skippyall.minions.MinionRegistries; diff --git a/src/main/resources/data/minions/lang/en_us.json b/src/main/resources/data/minions/lang/en_us.json index 1c14de4..ac46830 100644 --- a/src/main/resources/data/minions/lang/en_us.json +++ b/src/main/resources/data/minions/lang/en_us.json @@ -17,6 +17,8 @@ "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.gui.instruction.removed": "This instruction no longer exists", + "minions.gui.instruction.no_argument_set": "No argument set", "minions.command.input.int.fail": "Not an integer", "minions.command.input.float.fail": "Not a number", @@ -48,6 +50,5 @@ "minions.generic.name.invalid": "Name is invalid", "minions.generic.name.taken": "This name is already used", "minions.generic.mod_name": "Minions", - "minions.generic.unknown": "Unknown", - "minions.gui.instruction.no_argument_set": "No argument set" + "minions.generic.unknown": "Unknown" } \ 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 deleted file mode 100644 index fd1873f..0000000 --- a/src/main/resources/data/minions/minion_module/move.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "instructions": [ - "minions:walk" - ] -} \ No newline at end of file