Skip to content

Commit

Permalink
Add retrieval task editor (#100)
Browse files Browse the repository at this point in the history
  • Loading branch information
KatatsumuriPan authored Mar 14, 2024
1 parent 16f0195 commit 72c3268
Show file tree
Hide file tree
Showing 7 changed files with 243 additions and 1 deletion.
13 changes: 13 additions & 0 deletions src/main/java/betterquesting/EnumUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package betterquesting;

import org.apache.commons.lang3.EnumUtils;

public class EnumUtil {

@SuppressWarnings("unchecked")
public static <E extends Enum<E>> E getEnum(String enumName, E defaultValue) {
E value = (E) EnumUtils.getEnum(defaultValue.getClass(), enumName);
return value != null ? value : defaultValue;
}

}
Original file line number Diff line number Diff line change
@@ -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<Boolean> 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<Boolean> callback) {
this.callback = callback;
return this;
}

public ICallback<Boolean> getCallback() { return this.callback; }

@Override
public void onButtonClick() {
stored = !stored;
setText(Boolean.toString(stored));
if (callback != null)
this.callback.setValue(this.getStoredValue());
}

}
Original file line number Diff line number Diff line change
@@ -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<E extends Enum<E>> extends PanelButton {

private E stored;
private ICallback<E> callback = null;

public PanelButtonEnum(IGuiRect rect, int id, E value) {
super(rect, id, value.toString());
this.setStoredValue(value);
}

public PanelButtonEnum<E> setStoredValue(E value) {
this.stored = value;
return this;
}

public E getStoredValue() { return stored; }

public PanelButtonEnum<E> setCallback(ICallback<E> callback) {
this.callback = callback;
return this;
}

public ICallback<E> 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());
}

}
Original file line number Diff line number Diff line change
@@ -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<GuiRectangle, IGuiPanel> 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++;
}
}
Original file line number Diff line number Diff line change
@@ -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<IQuest> quest;
private final TaskRetrieval task;
private NBTTagCompound current;

public GuiEditTaskRetrieval(GuiScreen parent, DBEntry<IQuest> 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));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -400,7 +401,7 @@ public ItemStack submitItem(UUID owner, DBEntry<IQuest> quest, ItemStack input)
@Override
@SideOnly(Side.CLIENT)
public GuiScreen getTaskEditor(GuiScreen parent, DBEntry<IQuest> quest) {
return null;
return new GuiEditTaskRetrieval(parent, quest, this);
}

private void setUserProgress(UUID uuid, int[] progress) {
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/assets/betterquesting/lang/en_us.lang
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 72c3268

Please sign in to comment.