diff --git a/src/main/java/studio/fantasyit/maid_useful_task/MaidUsefulTask.java b/src/main/java/studio/fantasyit/maid_useful_task/MaidUsefulTask.java index 0e97579..73f5f2f 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/MaidUsefulTask.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/MaidUsefulTask.java @@ -28,6 +28,7 @@ import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import org.slf4j.Logger; +import studio.fantasyit.maid_useful_task.registry.GuiRegistry; import studio.fantasyit.maid_useful_task.registry.MemoryModuleRegistry; import studio.fantasyit.maid_useful_task.vehicle.MaidVehicleManager; @@ -42,6 +43,7 @@ public class MaidUsefulTask { public MaidUsefulTask() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); MemoryModuleRegistry.register(modEventBus); + GuiRegistry.init(modEventBus); MaidVehicleManager.register(); } } diff --git a/src/main/java/studio/fantasyit/maid_useful_task/UsefulTaskExtension.java b/src/main/java/studio/fantasyit/maid_useful_task/UsefulTaskExtension.java index 9e9c0c8..c0001bb 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/UsefulTaskExtension.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/UsefulTaskExtension.java @@ -4,8 +4,11 @@ import com.github.tartaricacid.touhoulittlemaid.api.ILittleMaid; import com.github.tartaricacid.touhoulittlemaid.api.LittleMaidExtension; import com.github.tartaricacid.touhoulittlemaid.api.entity.ai.IExtraMaidBrain; import com.github.tartaricacid.touhoulittlemaid.entity.ai.brain.ExtraMaidBrainManager; +import com.github.tartaricacid.touhoulittlemaid.entity.data.TaskDataRegister; import com.github.tartaricacid.touhoulittlemaid.entity.task.TaskManager; import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import studio.fantasyit.maid_useful_task.data.MaidConfigKeys; +import studio.fantasyit.maid_useful_task.data.MaidLoggingConfig; import studio.fantasyit.maid_useful_task.registry.MemoryModuleRegistry; import studio.fantasyit.maid_useful_task.task.MaidLocateTask; import studio.fantasyit.maid_useful_task.task.MaidTreeTask; @@ -39,4 +42,11 @@ public class UsefulTaskExtension implements ILittleMaid { } }); } + + @Override + public void registerTaskData(TaskDataRegister register) { + MaidConfigKeys.addKey(MaidLoggingConfig.LOCATION, + MaidLoggingConfig.KEY = register.register(new MaidLoggingConfig()), + MaidLoggingConfig.Data::getDefault); + } } diff --git a/src/main/java/studio/fantasyit/maid_useful_task/data/IConfigSetter.java b/src/main/java/studio/fantasyit/maid_useful_task/data/IConfigSetter.java new file mode 100644 index 0000000..6e28fc0 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/data/IConfigSetter.java @@ -0,0 +1,5 @@ +package studio.fantasyit.maid_useful_task.data; + +public interface IConfigSetter { + void setConfigValue(String name, String value); +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/data/MaidConfigKeys.java b/src/main/java/studio/fantasyit/maid_useful_task/data/MaidConfigKeys.java new file mode 100644 index 0000000..ad91cae --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/data/MaidConfigKeys.java @@ -0,0 +1,26 @@ +package studio.fantasyit.maid_useful_task.data; + +import com.github.tartaricacid.touhoulittlemaid.api.entity.data.TaskDataKey; +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; +import net.minecraft.resources.ResourceLocation; +import oshi.util.tuples.Pair; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +public class MaidConfigKeys { + record keyAndDefSupp(TaskDataKey key, Supplier defaultValue) { + } + + public static Map> keys = new HashMap<>(); + + public static void addKey(ResourceLocation key, TaskDataKey dataKey, Supplier defaultValue) { + keys.put(key, new keyAndDefSupp<>(dataKey, defaultValue)); + } + + public static T getValue(EntityMaid maid, ResourceLocation key) { + keyAndDefSupp pair = (keyAndDefSupp) keys.get(key); + return maid.getOrCreateData(pair.key, pair.defaultValue.get()); + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/data/MaidLoggingConfig.java b/src/main/java/studio/fantasyit/maid_useful_task/data/MaidLoggingConfig.java new file mode 100644 index 0000000..ef2f148 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/data/MaidLoggingConfig.java @@ -0,0 +1,60 @@ +package studio.fantasyit.maid_useful_task.data; + +import com.github.tartaricacid.touhoulittlemaid.api.entity.data.TaskDataKey; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import studio.fantasyit.maid_useful_task.MaidUsefulTask; + +public class MaidLoggingConfig implements TaskDataKey { + + + public static final class Data implements IConfigSetter { + private boolean plant; + + public Data(boolean plant) { + this.plant = plant; + } + + public static Data getDefault() { + return new Data(true); + } + + public boolean plant() { + return plant; + } + + public void plant(boolean plant) { + this.plant = plant; + } + + @Override + public void setConfigValue(String name, String value) { + switch (name) { + case "plant": + plant = Boolean.parseBoolean(value); + break; + } + } + } + + public static TaskDataKey KEY = null; + public static final ResourceLocation LOCATION = new ResourceLocation(MaidUsefulTask.MODID, "logging"); + + @Override + public ResourceLocation getKey() { + return LOCATION; + } + + @Override + public CompoundTag writeSaveData(Data data) { + CompoundTag tag = new CompoundTag(); + tag.putBoolean("plant", data.plant); + return tag; + } + + @Override + public Data readSaveData(CompoundTag compound) { + boolean plant = compound.getBoolean("plant"); + return new Data(plant); + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/menu/MaidLoggingConfigGui.java b/src/main/java/studio/fantasyit/maid_useful_task/menu/MaidLoggingConfigGui.java new file mode 100644 index 0000000..48a22f1 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/menu/MaidLoggingConfigGui.java @@ -0,0 +1,53 @@ +package studio.fantasyit.maid_useful_task.menu; + +import com.github.tartaricacid.touhoulittlemaid.client.gui.entity.maid.task.MaidTaskConfigGui; +import com.github.tartaricacid.touhoulittlemaid.client.gui.widget.button.MaidConfigButton; +import com.github.tartaricacid.touhoulittlemaid.inventory.container.task.TaskConfigContainer; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import studio.fantasyit.maid_useful_task.data.MaidLoggingConfig; +import studio.fantasyit.maid_useful_task.network.MaidConfigurePacket; +import studio.fantasyit.maid_useful_task.network.Network; +import studio.fantasyit.maid_useful_task.registry.GuiRegistry; +import studio.fantasyit.maid_useful_task.util.TranslateUtil; + +public class MaidLoggingConfigGui extends MaidTaskConfigGui { + private MaidLoggingConfig.Data currentData; + + public MaidLoggingConfigGui(Container screenContainer, Inventory inv, Component titleIn) { + super(screenContainer, inv, titleIn); + } + + public static class Container extends TaskConfigContainer { + public Container(int id, Inventory inventory, int entityId) { + super(GuiRegistry.MAID_LOGGING_CONFIG_GUI.get(), id, inventory, entityId); + } + } + + @Override + protected void initAdditionData() { + this.currentData = this.maid.getOrCreateData(MaidLoggingConfig.KEY, MaidLoggingConfig.Data.getDefault()); + } + + @Override + protected void initAdditionWidgets() { + super.initAdditionWidgets(); + + int startLeft = leftPos + 87; + int startTop = topPos + 36; + this.addRenderableWidget(new MaidConfigButton(startLeft, startTop + 0, + Component.translatable("gui.maid_useful_task.logging.plant"), + TranslateUtil.getBooleanTranslate(this.currentData.plant()), + button -> { + this.currentData.plant(false); + button.setValue(TranslateUtil.getBooleanTranslate(false)); + MaidConfigurePacket.send(this.maid, MaidLoggingConfig.LOCATION, "plant", "false"); + }, + button -> { + this.currentData.plant(true); + button.setValue(TranslateUtil.getBooleanTranslate(true)); + MaidConfigurePacket.send(this.maid, MaidLoggingConfig.LOCATION, "plant", "true"); + } + )); + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/network/MaidConfigurePacket.java b/src/main/java/studio/fantasyit/maid_useful_task/network/MaidConfigurePacket.java index 7da824d..ef08f39 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/network/MaidConfigurePacket.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/network/MaidConfigurePacket.java @@ -1,30 +1,56 @@ package studio.fantasyit.maid_useful_task.network; +import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.network.NetworkEvent; +import org.jetbrains.annotations.Nullable; +import studio.fantasyit.maid_useful_task.data.IConfigSetter; +import studio.fantasyit.maid_useful_task.data.MaidConfigKeys; import java.util.function.Supplier; public class MaidConfigurePacket { - public String name; - public String value; + final public int maidId; + final public String name; + final public String value; + final public ResourceLocation key; - public MaidConfigurePacket(String name, String value) { + public MaidConfigurePacket(int maidId, ResourceLocation key, String name, String value) { + this.maidId = maidId; + this.key = key; this.name = name; this.value = value; } public MaidConfigurePacket(FriendlyByteBuf buffer) { + this.maidId = buffer.readInt(); + this.key = ResourceLocation.tryParse(buffer.readUtf()); this.name = buffer.readUtf(); this.value = buffer.readUtf(); } public void toBytes(FriendlyByteBuf buffer) { + buffer.writeInt(maidId); + buffer.writeUtf(key.toString()); buffer.writeUtf(name); buffer.writeUtf(value); } - public static void handle(MaidConfigurePacket msg, Supplier context) { + public static void handle(MaidConfigurePacket msg, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + @Nullable ServerPlayer sender = context.getSender(); + if (sender != null) { + if (sender.level().getEntity(msg.maidId) instanceof EntityMaid entityMaid) { + if (MaidConfigKeys.getValue(entityMaid, msg.key) instanceof IConfigSetter ics) { + ics.setConfigValue(msg.name, msg.value); + } + } + } + } + public static void send(EntityMaid maid, ResourceLocation key, String name, String value) { + Network.INSTANCE.sendToServer(new MaidConfigurePacket(maid.getId(), key, name, value)); } } diff --git a/src/main/java/studio/fantasyit/maid_useful_task/registry/ClientGuiRegistry.java b/src/main/java/studio/fantasyit/maid_useful_task/registry/ClientGuiRegistry.java new file mode 100644 index 0000000..eaa104e --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/registry/ClientGuiRegistry.java @@ -0,0 +1,19 @@ +package studio.fantasyit.maid_useful_task.registry; + +import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import studio.fantasyit.maid_useful_task.MaidUsefulTask; +import studio.fantasyit.maid_useful_task.menu.MaidLoggingConfigGui; + +@Mod.EventBusSubscriber(modid = MaidUsefulTask.MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) +public class ClientGuiRegistry { + @SubscribeEvent + public static void init(FMLClientSetupEvent event) { + event.enqueueWork(() -> { + MenuScreens.register(GuiRegistry.MAID_LOGGING_CONFIG_GUI.get(), MaidLoggingConfigGui::new); + }); + } +} diff --git a/src/main/java/studio/fantasyit/maid_useful_task/registry/GuiRegistry.java b/src/main/java/studio/fantasyit/maid_useful_task/registry/GuiRegistry.java new file mode 100644 index 0000000..58e9bdb --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/registry/GuiRegistry.java @@ -0,0 +1,20 @@ +package studio.fantasyit.maid_useful_task.registry; + +import net.minecraft.world.inventory.MenuType; +import net.minecraftforge.common.extensions.IForgeMenuType; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import studio.fantasyit.maid_useful_task.MaidUsefulTask; +import studio.fantasyit.maid_useful_task.menu.MaidLoggingConfigGui; + +public class GuiRegistry { + public static final DeferredRegister> MENU_TYPES = DeferredRegister.create(ForgeRegistries.MENU_TYPES, MaidUsefulTask.MODID); + public static final RegistryObject> MAID_LOGGING_CONFIG_GUI = MENU_TYPES.register("maid_logging_config_gui", + () -> IForgeMenuType.create((windowId, inv, data) -> new MaidLoggingConfigGui.Container(windowId, inv, data.readInt()))); + + public static void init(IEventBus modEventBus) { + MENU_TYPES.register(modEventBus); + } +} \ No newline at end of file diff --git a/src/main/java/studio/fantasyit/maid_useful_task/task/MaidTreeTask.java b/src/main/java/studio/fantasyit/maid_useful_task/task/MaidTreeTask.java index f5864aa..3df9620 100644 --- a/src/main/java/studio/fantasyit/maid_useful_task/task/MaidTreeTask.java +++ b/src/main/java/studio/fantasyit/maid_useful_task/task/MaidTreeTask.java @@ -4,13 +4,18 @@ import com.github.tartaricacid.touhoulittlemaid.api.task.IMaidTask; import com.github.tartaricacid.touhoulittlemaid.entity.passive.EntityMaid; import com.mojang.datafixers.util.Pair; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.world.InteractionHand; +import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.ai.behavior.BehaviorControl; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.LeavesBlock; @@ -20,7 +25,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import studio.fantasyit.maid_useful_task.MaidUsefulTask; import studio.fantasyit.maid_useful_task.behavior.common.*; +import studio.fantasyit.maid_useful_task.data.MaidLoggingConfig; import studio.fantasyit.maid_useful_task.memory.BlockValidationMemory; +import studio.fantasyit.maid_useful_task.menu.MaidLoggingConfigGui; +import studio.fantasyit.maid_useful_task.registry.GuiRegistry; import studio.fantasyit.maid_useful_task.util.MaidUtils; import studio.fantasyit.maid_useful_task.util.MemoryUtil; import studio.fantasyit.maid_useful_task.util.WrappedMaidFakePlayer; @@ -52,6 +60,21 @@ public class MaidTreeTask implements IMaidTask, IMaidBlockPlaceTask, IMaidBlockD return null; } + @Override + public MenuProvider getTaskConfigGuiProvider(EntityMaid maid) { + return new MenuProvider() { + @Override + public Component getDisplayName() { + return Component.literal(""); + } + + @Override + public AbstractContainerMenu createMenu(int index, Inventory playerInventory, Player player) { + return new MaidLoggingConfigGui.Container(index, playerInventory, maid.getId()); + } + }; + } + @Override public boolean shouldDestroyBlock(EntityMaid maid, BlockPos pos) { if (MemoryUtil.getBlockUpContext(maid).hasTarget()) { @@ -79,6 +102,7 @@ public class MaidTreeTask implements IMaidTask, IMaidBlockPlaceTask, IMaidBlockD @Override public boolean shouldPlaceItemStack(EntityMaid maid, ItemStack itemStack) { + if (!maid.getOrCreateData(MaidLoggingConfig.KEY, MaidLoggingConfig.Data.getDefault()).plant()) return false; return itemStack.is(ItemTags.SAPLINGS); } diff --git a/src/main/java/studio/fantasyit/maid_useful_task/util/TranslateUtil.java b/src/main/java/studio/fantasyit/maid_useful_task/util/TranslateUtil.java new file mode 100644 index 0000000..b548c66 --- /dev/null +++ b/src/main/java/studio/fantasyit/maid_useful_task/util/TranslateUtil.java @@ -0,0 +1,9 @@ +package studio.fantasyit.maid_useful_task.util; + +import net.minecraft.network.chat.Component; + +public class TranslateUtil { + public static Component getBooleanTranslate(boolean b) { + return (b ? Component.translatable("gui.maid_useful_task.yes") : Component.translatable("gui.maid_useful_task.no")); + } +} diff --git a/src/main/resources/assets/maid_useful_task/lang/en_us.json b/src/main/resources/assets/maid_useful_task/lang/en_us.json index 8a9abd3..6937a7d 100644 --- a/src/main/resources/assets/maid_useful_task/lang/en_us.json +++ b/src/main/resources/assets/maid_useful_task/lang/en_us.json @@ -7,5 +7,8 @@ "maid_useful_task.allow_handle_vehicle.none": "Not allowing maid control vehicle", "maid_useful_task.allow_handle_vehicle.rot_only": "Allow maid control rotation only", "maid_useful_task.allow_handle_vehicle.full": "Allow maid control vehicle", - "key.maid_useful_tasks.categories.main": "Maid Useful Tasks" + "key.maid_useful_tasks.categories.main": "Maid Useful Tasks", + "gui.maid_useful_task.logging.plant": "Plant Saplings", + "gui.maid_useful_task.no": "No", + "gui.maid_useful_task.yes": "Yes" } \ No newline at end of file