Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add retrieval task editor #100

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -273,11 +273,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
Loading