From 72c3268feeb6af1070e80c8b5bbbdf9fbc659be1 Mon Sep 17 00:00:00 2001 From: "Katatsumuri.Pan" <79035439+KatatsumuriPan@users.noreply.github.com> Date: Fri, 15 Mar 2024 00:50:01 +0900 Subject: [PATCH] Add retrieval task editor (#100) --- src/main/java/betterquesting/EnumUtil.java | 13 ++ .../controls/buttons/PanelButtonBoolean.java | 39 ++++++ .../gui/controls/buttons/PanelButtonEnum.java | 41 ++++++ .../lists/CanvasScrollingNameValue.java | 29 +++++ .../editors/tasks/GuiEditTaskRetrieval.java | 117 ++++++++++++++++++ .../questing/tasks/TaskRetrieval.java | 3 +- .../assets/betterquesting/lang/en_us.lang | 2 + 7 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 src/main/java/betterquesting/EnumUtil.java create mode 100644 src/main/java/betterquesting/api2/client/gui/controls/buttons/PanelButtonBoolean.java create mode 100644 src/main/java/betterquesting/api2/client/gui/controls/buttons/PanelButtonEnum.java create mode 100644 src/main/java/betterquesting/api2/client/gui/panels/lists/CanvasScrollingNameValue.java create mode 100644 src/main/java/betterquesting/client/gui2/editors/tasks/GuiEditTaskRetrieval.java diff --git a/src/main/java/betterquesting/EnumUtil.java b/src/main/java/betterquesting/EnumUtil.java new file mode 100644 index 000000000..c9b28dd49 --- /dev/null +++ b/src/main/java/betterquesting/EnumUtil.java @@ -0,0 +1,13 @@ +package betterquesting; + +import org.apache.commons.lang3.EnumUtils; + +public class EnumUtil { + + @SuppressWarnings("unchecked") + public static > E getEnum(String enumName, E defaultValue) { + E value = (E) EnumUtils.getEnum(defaultValue.getClass(), enumName); + return value != null ? value : defaultValue; + } + +} diff --git a/src/main/java/betterquesting/api2/client/gui/controls/buttons/PanelButtonBoolean.java b/src/main/java/betterquesting/api2/client/gui/controls/buttons/PanelButtonBoolean.java new file mode 100644 index 000000000..ce235affe --- /dev/null +++ b/src/main/java/betterquesting/api2/client/gui/controls/buttons/PanelButtonBoolean.java @@ -0,0 +1,39 @@ +package betterquesting.api2.client.gui.controls.buttons; + +import betterquesting.api.misc.ICallback; +import betterquesting.api2.client.gui.controls.PanelButton; +import betterquesting.api2.client.gui.misc.IGuiRect; + +public class PanelButtonBoolean extends PanelButton { + + private boolean stored; + private ICallback callback = null; + + public PanelButtonBoolean(IGuiRect rect, int id, boolean value) { + super(rect, id, Boolean.toString(value)); + this.setStoredValue(value); + } + + public PanelButtonBoolean setStoredValue(boolean value) { + this.stored = value; + return this; + } + + public boolean getStoredValue() { return stored; } + + public PanelButtonBoolean setCallback(ICallback callback) { + this.callback = callback; + return this; + } + + public ICallback getCallback() { return this.callback; } + + @Override + public void onButtonClick() { + stored = !stored; + setText(Boolean.toString(stored)); + if (callback != null) + this.callback.setValue(this.getStoredValue()); + } + +} diff --git a/src/main/java/betterquesting/api2/client/gui/controls/buttons/PanelButtonEnum.java b/src/main/java/betterquesting/api2/client/gui/controls/buttons/PanelButtonEnum.java new file mode 100644 index 000000000..e4a150821 --- /dev/null +++ b/src/main/java/betterquesting/api2/client/gui/controls/buttons/PanelButtonEnum.java @@ -0,0 +1,41 @@ +package betterquesting.api2.client.gui.controls.buttons; + +import betterquesting.api.misc.ICallback; +import betterquesting.api2.client.gui.controls.PanelButton; +import betterquesting.api2.client.gui.misc.IGuiRect; + +public class PanelButtonEnum> extends PanelButton { + + private E stored; + private ICallback callback = null; + + public PanelButtonEnum(IGuiRect rect, int id, E value) { + super(rect, id, value.toString()); + this.setStoredValue(value); + } + + public PanelButtonEnum setStoredValue(E value) { + this.stored = value; + return this; + } + + public E getStoredValue() { return stored; } + + public PanelButtonEnum setCallback(ICallback callback) { + this.callback = callback; + return this; + } + + public ICallback getCallback() { return this.callback; } + + @Override + public void onButtonClick() { + @SuppressWarnings("unchecked") + E[] values = (E[]) stored.getClass().getEnumConstants(); + stored = values[(stored.ordinal() + 1) % values.length]; + setText(stored.toString()); + if (callback != null) + this.callback.setValue(this.getStoredValue()); + } + +} diff --git a/src/main/java/betterquesting/api2/client/gui/panels/lists/CanvasScrollingNameValue.java b/src/main/java/betterquesting/api2/client/gui/panels/lists/CanvasScrollingNameValue.java new file mode 100644 index 000000000..471a0c17a --- /dev/null +++ b/src/main/java/betterquesting/api2/client/gui/panels/lists/CanvasScrollingNameValue.java @@ -0,0 +1,29 @@ +package betterquesting.api2.client.gui.panels.lists; + +import betterquesting.api2.client.gui.misc.GuiRectangle; +import betterquesting.api2.client.gui.misc.IGuiRect; +import betterquesting.api2.client.gui.panels.IGuiPanel; +import betterquesting.api2.client.gui.panels.content.PanelTextBox; +import betterquesting.api2.client.gui.themes.presets.PresetColor; +import java.util.function.Function; + +public class CanvasScrollingNameValue extends CanvasScrolling { + + private int rowNum = 0; + + public CanvasScrollingNameValue(IGuiRect rect) { + super(rect); + } + + public void addPanel(String name, Function panelFactory) { + int width = getTransform().getWidth(); + int lw = (int) (width / 3F); + int rw = width - lw; // Width on right side (rounds up to account for rounding errors lost on left side) + PanelTextBox namePanel = new PanelTextBox(new GuiRectangle(0, rowNum * 16 + 4, lw - 8, 12, 0), name).setAlignment(2); + namePanel.setColor(PresetColor.TEXT_MAIN.getColor()); + addPanel(namePanel); + GuiRectangle rect = new GuiRectangle(lw, rowNum * 16, rw - 32, 16); + addPanel(panelFactory.apply(rect)); + rowNum++; + } +} diff --git a/src/main/java/betterquesting/client/gui2/editors/tasks/GuiEditTaskRetrieval.java b/src/main/java/betterquesting/client/gui2/editors/tasks/GuiEditTaskRetrieval.java new file mode 100644 index 000000000..4c6222fa5 --- /dev/null +++ b/src/main/java/betterquesting/client/gui2/editors/tasks/GuiEditTaskRetrieval.java @@ -0,0 +1,117 @@ +package betterquesting.client.gui2.editors.tasks; + +import betterquesting.EnumUtil; +import betterquesting.api.api.ApiReference; +import betterquesting.api.api.QuestingAPI; +import betterquesting.api.client.gui.misc.IVolatileScreen; +import betterquesting.api.enums.EnumLogic; +import betterquesting.api.network.QuestingPacket; +import betterquesting.api.questing.IQuest; +import betterquesting.api2.client.gui.GuiScreenCanvas; +import betterquesting.api2.client.gui.controls.PanelButton; +import betterquesting.api2.client.gui.controls.buttons.PanelButtonBoolean; +import betterquesting.api2.client.gui.controls.buttons.PanelButtonEnum; +import betterquesting.api2.client.gui.misc.GuiAlign; +import betterquesting.api2.client.gui.misc.GuiPadding; +import betterquesting.api2.client.gui.misc.GuiTransform; +import betterquesting.api2.client.gui.panels.CanvasTextured; +import betterquesting.api2.client.gui.panels.bars.PanelVScrollBar; +import betterquesting.api2.client.gui.panels.content.PanelTextBox; +import betterquesting.api2.client.gui.panels.lists.CanvasScrollingNameValue; +import betterquesting.api2.client.gui.themes.presets.PresetColor; +import betterquesting.api2.client.gui.themes.presets.PresetTexture; +import betterquesting.api2.storage.DBEntry; +import betterquesting.api2.utils.QuestTranslation; +import betterquesting.client.gui2.editors.nbt.GuiNbtEditor; +import betterquesting.core.ModReference; +import betterquesting.questing.tasks.TaskRetrieval; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Keyboard; + +public class GuiEditTaskRetrieval extends GuiScreenCanvas implements IVolatileScreen { + + private final DBEntry quest; + private final TaskRetrieval task; + private NBTTagCompound current; + + public GuiEditTaskRetrieval(GuiScreen parent, DBEntry quest, TaskRetrieval task) { + super(parent); + this.quest = quest; + this.task = task; + current = task.writeToNBT(new NBTTagCompound()); + } + + @Override + public void initPanel() { + super.initPanel(); + Keyboard.enableRepeatEvents(true); + + CanvasTextured cvBackground = new CanvasTextured(new GuiTransform(), PresetTexture.PANEL_MAIN.getTexture()); + this.addPanel(cvBackground); + + cvBackground.addPanel(new PanelTextBox(new GuiTransform(GuiAlign.TOP_EDGE, new GuiPadding(16, 16, 16, -32), 0), + QuestTranslation.translate("bq_standard.title.edit_retrieval_task")).setAlignment(1) + .setColor(PresetColor.TEXT_HEADER.getColor())); + + CanvasScrollingNameValue cvList = new CanvasScrollingNameValue(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(16, 32, 24, 48), 0)); + cvBackground.addPanel(cvList); + initItems(cvList); + + PanelVScrollBar scList = new PanelVScrollBar(new GuiTransform(GuiAlign.RIGHT_EDGE, new GuiPadding(-24, 32, 16, 48), 0)); + cvBackground.addPanel(scList); + cvList.setScrollDriverY(scList); + + PanelButton btnEditNBT = new PanelButton(new GuiTransform(GuiAlign.BOTTOM_CENTER, -100, -36, 200, 16, 0), + -1, + QuestTranslation.translate("bq_standard.btn.edit_nbt")); + btnEditNBT.setClickAction(btn -> { + mc.displayGuiScreen(new GuiNbtEditor(GuiEditTaskRetrieval.this, current, value -> current = value)); + }); + cvBackground.addPanel(btnEditNBT); + + cvBackground.addPanel(new PanelButton(new GuiTransform(GuiAlign.BOTTOM_CENTER, -100, -16, 200, 16, 0), -1, QuestTranslation.translate("gui.done")) { + + @Override + public void onButtonClick() { + task.readFromNBT(current); + sendChanges(); + mc.displayGuiScreen(parent); + } + + }); + } + + private void initItems(CanvasScrollingNameValue cvList) { + addBoolean("autoConsume", cvList); + addBoolean("consume", cvList); + cvList.addPanel("entryLogic", rect -> new PanelButtonEnum<>(rect, -1, EnumUtil.getEnum(current.getString("entryLogic"), EnumLogic.AND)).setCallback(value -> current.setString("entryLogic", value.name()))); + addBoolean("groupDetect", cvList); + addBoolean("ignoreNBT", cvList); + addBoolean("partialMatch", cvList); + cvList.addPanel("requiredItems", rect -> new PanelButton(rect, -1, "List...").setClickAction(b -> { + mc.displayGuiScreen(new GuiNbtEditor(mc.currentScreen, (NBTTagList) current.getTag("requiredItems"), null)); + })); + } + + private void addBoolean(String name, CanvasScrollingNameValue cvList) { + cvList.addPanel(name, rect -> new PanelButtonBoolean(rect, -1, current.getBoolean(name)).setCallback(value -> current.setBoolean(name, value))); + } + + private static final ResourceLocation QUEST_EDIT = new ResourceLocation(ModReference.MODID, "quest_edit"); // TODO: Really need to make the native packet types accessible in the API + + private void sendChanges() { + NBTTagCompound payload = new NBTTagCompound(); + NBTTagList dataList = new NBTTagList(); + NBTTagCompound entry = new NBTTagCompound(); + entry.setInteger("questID", quest.getID()); + entry.setTag("config", quest.getValue().writeToNBT(new NBTTagCompound())); + dataList.appendTag(entry); + payload.setTag("data", dataList); + payload.setInteger("action", 0); // Action: Update data + QuestingAPI.getAPI(ApiReference.PACKET_SENDER).sendToServer(new QuestingPacket(QUEST_EDIT, payload)); + } + +} diff --git a/src/main/java/betterquesting/questing/tasks/TaskRetrieval.java b/src/main/java/betterquesting/questing/tasks/TaskRetrieval.java index 96de78345..e7a9163bf 100644 --- a/src/main/java/betterquesting/questing/tasks/TaskRetrieval.java +++ b/src/main/java/betterquesting/questing/tasks/TaskRetrieval.java @@ -10,6 +10,7 @@ import betterquesting.api2.client.gui.panels.IGuiPanel; import betterquesting.api2.storage.DBEntry; import betterquesting.api2.utils.ParticipantInfo; +import betterquesting.client.gui2.editors.tasks.GuiEditTaskRetrieval; import betterquesting.client.gui2.tasks.PanelTaskRetrieval; import betterquesting.core.BetterQuesting; import betterquesting.questing.tasks.factory.FactoryTaskRetrieval; @@ -400,7 +401,7 @@ public ItemStack submitItem(UUID owner, DBEntry quest, ItemStack input) @Override @SideOnly(Side.CLIENT) public GuiScreen getTaskEditor(GuiScreen parent, DBEntry quest) { - return null; + return new GuiEditTaskRetrieval(parent, quest, this); } private void setUserProgress(UUID uuid, int[] progress) { diff --git a/src/main/resources/assets/betterquesting/lang/en_us.lang b/src/main/resources/assets/betterquesting/lang/en_us.lang index 2d2a1b911..f8d973818 100644 --- a/src/main/resources/assets/betterquesting/lang/en_us.lang +++ b/src/main/resources/assets/betterquesting/lang/en_us.lang @@ -277,11 +277,13 @@ bq_standard.title.edit_crafting=Edit Crafting Task bq_standard.title.edit_scoreboard=Edit Scoreboard Task bq_standard.title.edit_advancement=Edit Advancement Task bq_standard.title.edit_tame=Edit Tame Task +bq_standard.title.edit_retrieval_task=Edit Retrieval Task bq_standard.btn.select_mob=Select Mob bq_standard.btn.add_remove_drops=Add/Remove Drops bq_standard.btn.edit_items=Add/Remove Items bq_standard.btn.consume=Consume: %s +bq_standard.btn.edit_nbt=Edit NBT bq_standard.gui.amount=Amount bq_standard.gui.kill=Kill %s