伐木任务支持不种植树苗

This commit is contained in:
xypp
2025-04-30 00:24:56 +08:00
parent 09048cc006
commit a330813d38
12 changed files with 262 additions and 5 deletions

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -0,0 +1,5 @@
package studio.fantasyit.maid_useful_task.data;
public interface IConfigSetter {
void setConfigValue(String name, String value);
}

View File

@@ -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<T>(TaskDataKey<T> key, Supplier<T> defaultValue) {
}
public static Map<ResourceLocation, keyAndDefSupp<?>> keys = new HashMap<>();
public static <T> void addKey(ResourceLocation key, TaskDataKey<T> dataKey, Supplier<T> defaultValue) {
keys.put(key, new keyAndDefSupp<>(dataKey, defaultValue));
}
public static <T> T getValue(EntityMaid maid, ResourceLocation key) {
keyAndDefSupp<T> pair = (keyAndDefSupp<T>) keys.get(key);
return maid.getOrCreateData(pair.key, pair.defaultValue.get());
}
}

View File

@@ -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<MaidLoggingConfig.Data> {
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<Data> 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);
}
}

View File

@@ -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<MaidLoggingConfigGui.Container> {
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");
}
));
}
}

View File

@@ -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<NetworkEvent.Context> context) {
public static void handle(MaidConfigurePacket msg, Supplier<NetworkEvent.Context> 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));
}
}

View File

@@ -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);
});
}
}

View File

@@ -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<MenuType<?>> MENU_TYPES = DeferredRegister.create(ForgeRegistries.MENU_TYPES, MaidUsefulTask.MODID);
public static final RegistryObject<MenuType<MaidLoggingConfigGui.Container>> 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);
}
}

View File

@@ -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);
}

View File

@@ -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"));
}
}

View File

@@ -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"
}