diff --git a/src/main/java/betterquesting/NBTReplaceUtil.java b/src/main/java/betterquesting/NBTReplaceUtil.java index 4c95302ca..c6ec331fb 100644 --- a/src/main/java/betterquesting/NBTReplaceUtil.java +++ b/src/main/java/betterquesting/NBTReplaceUtil.java @@ -1,34 +1,10 @@ package betterquesting; import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.nbt.NBTTagString; +@Deprecated public class NBTReplaceUtil { - @SuppressWarnings("unchecked") public static T replaceStrings(T baseTag, String key, String replace) { - if (baseTag == null) { - return null; - } - - if (baseTag instanceof NBTTagCompound) { - NBTTagCompound compound = (NBTTagCompound) baseTag; - - for (String k : compound.getKeySet()) { - compound.setTag(k, replaceStrings(compound.getTag(k), key, replace)); - } - } else if (baseTag instanceof NBTTagList) { - NBTTagList list = (NBTTagList) baseTag; - - for (int i = 0; i < list.tagCount(); i++) { - list.set(i, replaceStrings(list.get(i), key, replace)); - } - } else if (baseTag instanceof NBTTagString) { - NBTTagString tString = (NBTTagString) baseTag; - return (T) new NBTTagString(tString.getString().replaceAll(key, replace)); - } - - return baseTag; // Either isn't a string or doesn't contain one + return NBTUtil.replaceStrings(baseTag, key, replace); } } diff --git a/src/main/java/betterquesting/NBTUtil.java b/src/main/java/betterquesting/NBTUtil.java new file mode 100644 index 000000000..d8abc943f --- /dev/null +++ b/src/main/java/betterquesting/NBTUtil.java @@ -0,0 +1,49 @@ +package betterquesting; + +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; + +public class NBTUtil { + + @SuppressWarnings("unchecked") + public static T replaceStrings(T baseTag, String key, String replace) { + if (baseTag == null) { + return null; + } + + if (baseTag instanceof NBTTagCompound) { + NBTTagCompound compound = (NBTTagCompound) baseTag; + + for (String k : compound.getKeySet()) { + compound.setTag(k, replaceStrings(compound.getTag(k), key, replace)); + } + } else if (baseTag instanceof NBTTagList) { + NBTTagList list = (NBTTagList) baseTag; + + for (int i = 0; i < list.tagCount(); i++) { + list.set(i, replaceStrings(list.get(i), key, replace)); + } + } else if (baseTag instanceof NBTTagString) { + NBTTagString tString = (NBTTagString) baseTag; + return (T) new NBTTagString(tString.getString().replaceAll(key, replace)); + } + + return baseTag; // Either isn't a string or doesn't contain one + } + + public static void insertTag(NBTTagList tagList, int index, NBTBase nbt) { + if (index == tagList.tagCount()) { + tagList.appendTag(nbt); + } else { + tagList.appendTag(tagList.get(tagList.tagCount() - 1)); + // Shift entries up manually + for (int n = tagList.tagCount() - 2; n >= index; n--) { + tagList.set(n + 1, tagList.get(n)); + } + tagList.set(index, nbt); + } + } + +} 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 index 471a0c17a..fb1025f23 100644 --- a/src/main/java/betterquesting/api2/client/gui/panels/lists/CanvasScrollingNameValue.java +++ b/src/main/java/betterquesting/api2/client/gui/panels/lists/CanvasScrollingNameValue.java @@ -26,4 +26,5 @@ public void addPanel(String name, Function panelFactory addPanel(panelFactory.apply(rect)); rowNum++; } + } diff --git a/src/main/java/betterquesting/client/gui2/editors/nbt/GuiNbtEditor.java b/src/main/java/betterquesting/client/gui2/editors/nbt/GuiNbtEditor.java index ca9e4f0e4..41ceda50d 100644 --- a/src/main/java/betterquesting/client/gui2/editors/nbt/GuiNbtEditor.java +++ b/src/main/java/betterquesting/client/gui2/editors/nbt/GuiNbtEditor.java @@ -1,10 +1,14 @@ package betterquesting.client.gui2.editors.nbt; +import org.lwjgl.input.Keyboard; + import betterquesting.api.client.gui.misc.IVolatileScreen; import betterquesting.api.misc.ICallback; +import betterquesting.api.utils.JsonHelper; import betterquesting.api2.client.gui.GuiScreenCanvas; import betterquesting.api2.client.gui.controls.IPanelButton; import betterquesting.api2.client.gui.controls.PanelButton; +import betterquesting.api2.client.gui.controls.callbacks.CallbackNBTTagString; import betterquesting.api2.client.gui.events.IPEventListener; import betterquesting.api2.client.gui.events.PEventBroadcaster; import betterquesting.api2.client.gui.events.PanelEvent; @@ -21,13 +25,87 @@ import betterquesting.api2.client.gui.themes.presets.PresetLine; import betterquesting.api2.client.gui.themes.presets.PresetTexture; import betterquesting.api2.utils.QuestTranslation; +import betterquesting.client.gui2.editors.GuiTextEditor; +import betterquesting.client.gui2.editors.nbt.callback.NbtEntityCallback; +import betterquesting.client.gui2.editors.nbt.callback.NbtFluidCallback; +import betterquesting.client.gui2.editors.nbt.callback.NbtItemCallback; import net.minecraft.client.gui.GuiScreen; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import org.lwjgl.input.Keyboard; +import net.minecraft.nbt.NBTTagString; public class GuiNbtEditor extends GuiScreenCanvas implements IPEventListener, IVolatileScreen { + + public static GuiScreen createEditorGui(GuiScreen parent, NBTTagCompound nbt, String targetKey) { + NBTBase entry; + if (nbt.getId() == 10) { + entry = nbt.getTag(targetKey); + } else { + throw new RuntimeException("Invalid NBT tag type!"); + } + + if (entry.getId() == 10) // Object editor + { + NBTTagCompound tag = (NBTTagCompound) entry; + + if (JsonHelper.isItem(tag)) { + return new GuiItemSelection(parent, tag, new NbtItemCallback(tag)); + } else if (JsonHelper.isFluid(tag)) { + return new GuiFluidSelection(parent, tag, new NbtFluidCallback(tag)); + } else if (JsonHelper.isEntity(tag)) { + return new GuiEntitySelection(parent, tag, new NbtEntityCallback(tag)); + } else { + return new GuiNbtEditor(parent, tag, null); + } + } else if (entry.getId() == 9) // List editor + { + return new GuiNbtEditor(parent, (NBTTagList) entry, null); + } else if (entry.getId() == 8) // Text editor + { + return new GuiTextEditor(parent, ((NBTTagString) entry).getString(), new CallbackNBTTagString(nbt, targetKey)); + } else if (entry.getId() == 7 || entry.getId() == 11 || entry.getId() == 12) // Byte/Integer/Long array + { + // TODO: Add supportted editors for Byte, Integer and Long Arrays + throw new UnsupportedOperationException("NBTTagByteArray, NBTTagIntArray and NBTTagLongArray are not currently supported yet"); + } else { + throw new RuntimeException("Invalid NBT tag type!"); + } + } + + public static GuiScreen createEditorGui(GuiScreen parent, NBTTagList nbt, int targetIndex) { + if (nbt.getId() != 9) + throw new RuntimeException("Invalid NBT tag type!"); + + NBTBase entry = nbt.get(targetIndex); + if (entry.getId() == 10) // Object editor + { + NBTTagCompound tag = (NBTTagCompound) entry; + + if (JsonHelper.isItem(tag)) { + return new GuiItemSelection(parent, tag, new NbtItemCallback(tag)); + } else if (JsonHelper.isFluid(tag)) { + return new GuiFluidSelection(parent, tag, new NbtFluidCallback(tag)); + } else if (JsonHelper.isEntity(tag)) { + return new GuiEntitySelection(parent, tag, new NbtEntityCallback(tag)); + } else { + return new GuiNbtEditor(parent, tag, null); + } + } else if (entry.getId() == 9) // List editor + { + return new GuiNbtEditor(parent, (NBTTagList) entry, null); + } else if (entry.getId() == 8) // Text editor + { + return new GuiTextEditor(parent, ((NBTTagString) entry).getString(), new CallbackNBTTagString(nbt, targetIndex)); + } else if (entry.getId() == 7 || entry.getId() == 11 || entry.getId() == 12) // Byte/Integer/Long array + { + // TODO: Add supportted editors for Byte, Integer and Long Arrays + throw new UnsupportedOperationException("NBTTagByteArray, NBTTagIntArray and NBTTagLongArray are not currently supported yet"); + } else { + throw new RuntimeException("Invalid NBT tag type!"); + } + } + private final NBTBase nbt; private final ICallback comCallback; private final ICallback lstCallback; @@ -55,20 +133,23 @@ public void initPanel() { Keyboard.enableRepeatEvents(true); // Background panel - CanvasTextured cvBackground = new CanvasTextured(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(0, 0, 0, 0), 0), PresetTexture.PANEL_MAIN.getTexture()); + CanvasTextured cvBackground = new CanvasTextured(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(0, 0, 0, 0), 0), + PresetTexture.PANEL_MAIN.getTexture()); this.addPanel(cvBackground); cvBackground.addPanel(new PanelButton(new GuiTransform(GuiAlign.BOTTOM_CENTER, -100, -16, 200, 16, 0), 0, QuestTranslation.translate("gui.back"))); - PanelTextBox txTitle = new PanelTextBox(new GuiTransform(GuiAlign.TOP_EDGE, new GuiPadding(0, 16, 0, -32), 0), QuestTranslation.translate(nbt.getId() == 9 ? "betterquesting.title.json_array" : "betterquesting.title.json_object")).setAlignment(1); + PanelTextBox txTitle = new PanelTextBox(new GuiTransform(GuiAlign.TOP_EDGE, new GuiPadding(0, 16, 0, -32), 0), + QuestTranslation.translate(nbt.getId() == 9 ? "betterquesting.title.json_array" : + "betterquesting.title.json_object")).setAlignment(1); txTitle.setColor(PresetColor.TEXT_HEADER.getColor()); cvBackground.addPanel(txTitle); PanelScrollingNBT pnEdit; if (nbt.getId() == 10) { - pnEdit = new PanelScrollingNBT(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(16, 32, 24, 32), 0), (NBTTagCompound) nbt, 1, 2, 3, 4); + pnEdit = new PanelScrollingNBT(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(16, 32, 24, 32), 0), (NBTTagCompound) nbt, 1, 2, 3, 4, 5, 6); } else { - pnEdit = new PanelScrollingNBT(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(16, 32, 24, 32), 0), (NBTTagList) nbt, 1, 2, 3, 4); + pnEdit = new PanelScrollingNBT(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(16, 32, 24, 32), 0), (NBTTagList) nbt, 1, 2, 3, 4, 5, 6); } cvBackground.addPanel(pnEdit); @@ -114,4 +195,5 @@ private void onButtonPress(PEventButton event) { } } } + } diff --git a/src/main/java/betterquesting/client/gui2/editors/nbt/GuiNbtListAdd.java b/src/main/java/betterquesting/client/gui2/editors/nbt/GuiNbtListAdd.java new file mode 100644 index 000000000..a115bb866 --- /dev/null +++ b/src/main/java/betterquesting/client/gui2/editors/nbt/GuiNbtListAdd.java @@ -0,0 +1,205 @@ +package betterquesting.client.gui2.editors.nbt; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.util.vector.Vector4f; + +import betterquesting.NBTUtil; +import betterquesting.api.client.gui.misc.IVolatileScreen; +import betterquesting.api.utils.BigItemStack; +import betterquesting.api.utils.JsonHelper; +import betterquesting.api2.client.gui.GuiScreenCanvas; +import betterquesting.api2.client.gui.controls.IPanelButton; +import betterquesting.api2.client.gui.controls.PanelButton; +import betterquesting.api2.client.gui.controls.PanelButtonStorage; +import betterquesting.api2.client.gui.controls.PanelTextField; +import betterquesting.api2.client.gui.events.IPEventListener; +import betterquesting.api2.client.gui.events.PEventBroadcaster; +import betterquesting.api2.client.gui.events.PanelEvent; +import betterquesting.api2.client.gui.events.types.PEventButton; +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.CanvasScrolling; +import betterquesting.api2.client.gui.themes.presets.PresetColor; +import betterquesting.api2.client.gui.themes.presets.PresetTexture; +import betterquesting.api2.utils.QuestTranslation; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.passive.EntityPig; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagByte; +import net.minecraft.nbt.NBTTagByteArray; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagDouble; +import net.minecraft.nbt.NBTTagFloat; +import net.minecraft.nbt.NBTTagInt; +import net.minecraft.nbt.NBTTagIntArray; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagLong; +import net.minecraft.nbt.NBTTagLongArray; +import net.minecraft.nbt.NBTTagShort; +import net.minecraft.nbt.NBTTagString; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +public class GuiNbtListAdd extends GuiScreenCanvas implements IPEventListener, IVolatileScreen { + + private final NBTTagList nbt; + private final int index; + + private PanelTextField flKey; + private final List> options = new ArrayList<>(); + private NBTBase selected = null; + //private PanelTextBox txtKey; + + public GuiNbtListAdd(GuiScreen parent, NBTTagList list, int index) { + super(parent); + this.nbt = list; + this.index = index; + } + + @Override + public void initPanel() { + super.initPanel(); + + PEventBroadcaster.INSTANCE.register(this, PEventButton.class); + Keyboard.enableRepeatEvents(true); + + // Background panel + CanvasTextured cvBackground = new CanvasTextured(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(0, 0, 0, 0), 0), + PresetTexture.PANEL_MAIN.getTexture()); + this.addPanel(cvBackground); + + cvBackground.addPanel(new PanelButton(new GuiTransform(GuiAlign.BOTTOM_CENTER, -100, -16, 100, 16, 0), 0, QuestTranslation.translate("gui.cancel"))); + + PanelTextBox panTxt = new PanelTextBox(new GuiTransform(GuiAlign.TOP_EDGE, new GuiPadding(0, 16, 0, -32), 0), + QuestTranslation.translate("betterquesting.title.json_add")).setAlignment(1); + panTxt.setColor(PresetColor.TEXT_HEADER.getColor()); + cvBackground.addPanel(panTxt); + + options.clear(); + + int n = 0; + + // Standard Objects + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n * 16, 100, 16, 0), + 2, + QuestTranslation.translate("betterquesting.btn.item"), + JsonHelper.ItemStackToJson(new BigItemStack(Blocks.STONE), new NBTTagCompound()))); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 100, n++ * 16, 92, 16, 0), + 2, + QuestTranslation.translate("betterquesting.btn.fluid"), + JsonHelper.FluidStackToJson(new FluidStack(FluidRegistry.WATER, 1000), new NBTTagCompound()))); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + QuestTranslation.translate("betterquesting.btn.entity"), + JsonHelper.EntityToJson(new EntityPig(mc.world), new NBTTagCompound()))); + + // NBT types + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + NBTTagString.class.getSimpleName(), + new NBTTagString(""))); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + NBTTagCompound.class.getSimpleName(), + new NBTTagCompound())); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + NBTTagList.class.getSimpleName(), + new NBTTagList())); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + NBTTagByte.class.getSimpleName(), + new NBTTagByte((byte) 0))); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + NBTTagShort.class.getSimpleName(), + new NBTTagShort((short) 0))); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + NBTTagInt.class.getSimpleName(), + new NBTTagInt(0))); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + NBTTagLong.class.getSimpleName(), + new NBTTagLong(0L))); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + NBTTagFloat.class.getSimpleName(), + new NBTTagFloat(0F))); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + NBTTagDouble.class.getSimpleName(), + new NBTTagDouble(0D))); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + NBTTagByteArray.class.getSimpleName(), + new NBTTagByteArray(new byte[0]))); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n++ * 16, 192, 16, 0), + 2, + NBTTagIntArray.class.getSimpleName(), + new NBTTagIntArray(new int[0]))); + options.add(new PanelButtonStorage<>(new GuiTransform(GuiAlign.MID_CENTER, 0, n * 16, 192, 16, 0), + 2, + NBTTagLongArray.class.getSimpleName(), + new NBTTagLongArray(new long[0]))); + + CanvasScrolling cvOptions = new CanvasScrolling(new GuiTransform(new Vector4f(0.5F, 0F, 0.5F, 1F), new GuiPadding(-100, 64, -92, 32), 0)); + cvBackground.addPanel(cvOptions); + + for (PanelButtonStorage btn : options) { + cvOptions.addPanel(btn); + } + + PanelVScrollBar scOptions = new PanelVScrollBar(new GuiTransform(new Vector4f(0.5F, 0F, 0.5F, 1F), new GuiPadding(92, 64, -100, 32), 0)); + cvBackground.addPanel(scOptions); + cvOptions.setScrollDriverY(scOptions); + } + + @Override + public void onPanelEvent(PanelEvent event) { + if (event instanceof PEventButton) { + onButtonPress((PEventButton) event); + } + } + + @SuppressWarnings("unchecked") + private void onButtonPress(PEventButton event) { + IPanelButton btn = event.getButton(); + + switch (btn.getButtonID()) { + case 0: // Cancel + { + mc.displayGuiScreen(this.parent); + break; + } + case 1: // Confirm + { + } + case 2: // Select this + { + selected = ((PanelButtonStorage) btn).getStoredValue(); + + for (PanelButtonStorage b : options) { + b.setActive(true); + } + btn.setActive(false); + + if (selected == null) + return; + + NBTUtil.insertTag(nbt, index, selected); + mc.displayGuiScreen(GuiNbtEditor.createEditorGui(this.parent, nbt, index)); + break; + } + } + } + +} diff --git a/src/main/java/betterquesting/client/gui2/editors/nbt/PanelScrollingNBT.java b/src/main/java/betterquesting/client/gui2/editors/nbt/PanelScrollingNBT.java index 949b9bc90..d3174bf9a 100644 --- a/src/main/java/betterquesting/client/gui2/editors/nbt/PanelScrollingNBT.java +++ b/src/main/java/betterquesting/client/gui2/editors/nbt/PanelScrollingNBT.java @@ -1,8 +1,10 @@ package betterquesting.client.gui2.editors.nbt; +import betterquesting.NBTUtil; import betterquesting.api.utils.BigItemStack; import betterquesting.api.utils.JsonHelper; import betterquesting.api2.client.gui.controls.IPanelButton; +import betterquesting.api2.client.gui.controls.PanelButton; import betterquesting.api2.client.gui.controls.PanelButtonStorage; import betterquesting.api2.client.gui.controls.PanelTextField; import betterquesting.api2.client.gui.controls.callbacks.CallbackMulti; @@ -21,27 +23,40 @@ import betterquesting.api2.client.gui.panels.lists.CanvasScrolling; import betterquesting.api2.client.gui.resources.colors.GuiColorStatic; import betterquesting.api2.client.gui.themes.presets.PresetColor; +import betterquesting.api2.client.gui.themes.presets.PresetIcon; import betterquesting.api2.utils.QuestTranslation; -import betterquesting.client.gui2.editors.GuiTextEditor; -import betterquesting.client.gui2.editors.nbt.callback.NbtEntityCallback; -import betterquesting.client.gui2.editors.nbt.callback.NbtFluidCallback; -import betterquesting.client.gui2.editors.nbt.callback.NbtItemCallback; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Stack; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; -import net.minecraft.nbt.*; +import net.minecraft.entity.passive.EntityPig; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTPrimitive; +import net.minecraft.nbt.NBTTagByte; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; +import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import org.lwjgl.input.Keyboard; -import java.util.*; - // Self contained editing panel -// TODO: Add ability for expansions to register modules for identifying and providing custom editors to various NBT data sets (inventory, tinker tool, magic, etc.) +// TODO: Add ability for expansions to register modules for identifying and providing custom editors to various NBT data sets (inventory, tinker tool, magic, +// etc.) // TODO: This however should not be forced in the event of incorrect identification. Open as... public class PanelScrollingNBT extends CanvasScrolling implements IPEventListener { + private NBTBase nbt; private final int btnEdit; private final int btnAdv; + private final int btnUp; + private final int btnDown; private final int btnInsert; private final int btnDelete; @@ -51,23 +66,25 @@ public class PanelScrollingNBT extends CanvasScrolling implements IPEventListene private final Stack nbtStack = new Stack<>(); - public PanelScrollingNBT(IGuiRect rect, NBTTagCompound tag, int btnEdit, int btnAdv, int btnInsert, int btnDelete) { - this(rect, btnEdit, btnAdv, btnInsert, btnDelete); + public PanelScrollingNBT(IGuiRect rect, NBTTagCompound tag, int btnEdit, int btnAdv, int btnUp, int btnDown, int btnInsert, int btnDelete) { + this(rect, btnEdit, btnAdv, btnUp, btnDown, btnInsert, btnDelete); this.setNBT(tag); } - public PanelScrollingNBT(IGuiRect rect, NBTTagList tag, int btnEdit, int btnAdv, int btnInsert, int btnDelete) { - this(rect, btnEdit, btnAdv, btnInsert, btnDelete); + public PanelScrollingNBT(IGuiRect rect, NBTTagList tag, int btnEdit, int btnAdv, int btnUp, int btnDown, int btnInsert, int btnDelete) { + this(rect, btnEdit, btnAdv, btnUp, btnDown, btnInsert, btnDelete); this.setNBT(tag); } - private PanelScrollingNBT(IGuiRect rect, int btnEdit, int btnAdv, int btnInsert, int btnDelete) { + private PanelScrollingNBT(IGuiRect rect, int btnEdit, int btnAdv, int btnUp, int btnDown, int btnInsert, int btnDelete) { super(rect); this.btnEdit = btnEdit; this.btnAdv = btnAdv; + this.btnUp = btnUp; + this.btnDown = btnDown; this.btnInsert = btnInsert; this.btnDelete = btnDelete; @@ -77,18 +94,17 @@ private PanelScrollingNBT(IGuiRect rect, int btnEdit, int btnAdv, int btnInsert, } // TODO: Implement this with a proper way of displaying and choosing between options (and setting priority for default) - /*private final List, Consumer>> filterMap = new ArrayList<>(); - + /*private final List, Consumer>> filterMap = new ArrayList<>(); + public void registerHandler(Predicate filter, Consumer action) { filterMap.add(new Pair<>(filter, action)); } - - @Nullable - public List> getHandler(@Nonnull NBTBase tag) + + @Nullable public List> getHandler(@Nonnull NBTBase tag) { List> list = new ArrayList<>(); - + for(Pair, Consumer> p : filterMap) { if(p.getKey().test(tag)) @@ -96,7 +112,7 @@ public List> getHandler(@Nonnull NBTBase tag) list.add(p.getValue()); } } - + return list; }*/ @@ -151,33 +167,45 @@ private void refreshList() { if (entry.getId() == 10) // Object { - PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw, i * 16, rw - 48, 16, 0), btnEdit, getButtonTitle((NBTTagCompound) entry), k); + PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), + btnEdit, + getButtonTitle((NBTTagCompound) entry), + k); this.addPanel(btn); - btn = new PanelButtonStorage<>(new GuiRectangle(width - 48, i * 16, 16, 16, 0), btnAdv, "...", k); + btn = new PanelButtonStorage<>(new GuiRectangle(width - 32, i * 16, 16, 16, 0), btnAdv, "...", k); this.addPanel(btn); } else if (entry.getId() == 9) // List { - PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), btnEdit, "List...", k); + PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw, i * 16, rw - 16, 16, 0), btnEdit, "List...", k); this.addPanel(btn); } else if (entry.getId() == 8) // Text { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 48, 16, 0), "" + ((NBTTagString) entry).getString(), FieldFilterString.INSTANCE); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), + "" + ((NBTTagString) entry).getString(), + FieldFilterString.INSTANCE); text.setCallback(new CallbackNBTTagString(tag, k)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); - PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(width - 48, i * 16, 16, 16, 0), btnEdit, "Aa", k); + PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(width - 32, i * 16, 16, 16, 0), btnEdit, "Aa", k); this.addPanel(btn); } else if (entry.getId() == 1) // Byte/Boolean { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw / 2, 16, 0), "" + ((NBTPrimitive) entry).getByte(), FieldFilterNumber.BYTE); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw / 2, 16, 0), + "" + ((NBTPrimitive) entry).getByte(), + FieldFilterNumber.BYTE); text.setMaxLength(Integer.MAX_VALUE); // Put callback here this.addPanel(text); - PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw + rw / 2, i * 16, (int) Math.ceil(rw / 2F) - 32, 16, 0), btnEdit, ((NBTPrimitive) entry).getByte() > 0 ? "true" : "false", k); + PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw + rw / 2, i * 16, (int) Math.ceil(rw / 2F) - 16, 16, 0), + btnEdit, + ((NBTPrimitive) entry).getByte() > 0 ? "true" : "false", + k); this.addPanel(btn); - text.setMaxLength(Integer.MAX_VALUE).setCallback(new CallbackMulti<>(new CallbackNBTPrimitive<>(tag, k, Byte.class), value -> btn.setText(value > 0 ? "true" : "false"))); + text.setMaxLength(Integer.MAX_VALUE) + .setCallback(new CallbackMulti<>(new CallbackNBTPrimitive<>(tag, k, Byte.class), + value -> btn.setText(value > 0 ? "true" : "false"))); btn.setCallback(value -> { boolean flag = tag.getByte(value) > 0; tag.setByte(value, flag ? (byte) 0 : (byte) 1); @@ -189,50 +217,57 @@ private void refreshList() { switch (entry.getId()) { case 2: // Short { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), "" + ((NBTPrimitive) entry).getShort(), FieldFilterNumber.SHORT); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 16, 16, 0), + "" + ((NBTPrimitive) entry).getShort(), + FieldFilterNumber.SHORT); text.setCallback(new CallbackNBTPrimitive<>(tag, k, Short.class)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); break; } case 3: // Integer { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), "" + ((NBTPrimitive) entry).getInt(), FieldFilterNumber.INT); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 16, 16, 0), + "" + ((NBTPrimitive) entry).getInt(), + FieldFilterNumber.INT); text.setCallback(new CallbackNBTPrimitive<>(tag, k, Integer.class)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); break; } case 4: // Long { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), "" + ((NBTPrimitive) entry).getLong(), FieldFilterNumber.LONG); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 16, 16, 0), + "" + ((NBTPrimitive) entry).getLong(), + FieldFilterNumber.LONG); text.setCallback(new CallbackNBTPrimitive<>(tag, k, Long.class)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); break; } case 5: // Float { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), "" + ((NBTPrimitive) entry).getFloat(), FieldFilterNumber.FLOAT); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 16, 16, 0), + "" + ((NBTPrimitive) entry).getFloat(), + FieldFilterNumber.FLOAT); text.setCallback(new CallbackNBTPrimitive<>(tag, k, Float.class)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); break; } case 6: // Double { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), "" + ((NBTPrimitive) entry).getDouble(), FieldFilterNumber.DOUBLE); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 16, 16, 0), + "" + ((NBTPrimitive) entry).getDouble(), + FieldFilterNumber.DOUBLE); text.setCallback(new CallbackNBTPrimitive<>(tag, k, Double.class)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); break; } } } else { - PanelTextBox err = new PanelTextBox(new GuiRectangle(lw, i * 16 + 4, rw - 48, 12, 0), entry.getClass().getSimpleName() + " Not Supported Yet").setAlignment(1); + PanelTextBox err = new PanelTextBox(new GuiRectangle(lw, i * 16 + 4, rw - 16, 12, 0), + entry.getClass().getSimpleName() + " Not Supported Yet").setAlignment(1); err.setColor(PresetColor.TEXT_MAIN.getColor()); this.addPanel(err); } - PanelButtonStorage btnI = new PanelButtonStorage<>(new GuiRectangle(width - 32, i * 16, 16, 16, 0), btnInsert, "+", k); - btnI.setTextHighlight(new GuiColorStatic(128, 128, 128, 255), new GuiColorStatic(0, 255, 0, 255), new GuiColorStatic(0, 255, 0, 255)); - this.addPanel(btnI); - PanelButtonStorage btnD = new PanelButtonStorage<>(new GuiRectangle(width - 16, i * 16, 16, 16, 0), btnDelete, "x", k); btnD.setTextHighlight(new GuiColorStatic(128, 128, 128, 255), new GuiColorStatic(255, 0, 0, 255), new GuiColorStatic(255, 0, 0, 255)); this.addPanel(btnD); @@ -240,9 +275,9 @@ private void refreshList() { i++; } - this.addPanel(new PanelGeneric(new GuiRectangle(0, i * 16, width - 32, 16, 0), null)); // Keeps the list from auto resizing + this.addPanel(new PanelGeneric(new GuiRectangle(0, i * 16, width - 16, 16, 0), null)); // Keeps the list from auto resizing - PanelButtonStorage btnI = new PanelButtonStorage<>(new GuiRectangle(width - 32, i * 16, 16, 16, 0), btnInsert, "+", ""); + PanelButtonStorage btnI = new PanelButtonStorage<>(new GuiRectangle(width - 16, i * 16, 16, 16, 0), btnInsert, "+", ""); btnI.setTextHighlight(new GuiColorStatic(128, 128, 128, 255), new GuiColorStatic(0, 255, 0, 255), new GuiColorStatic(0, 255, 0, 255)); this.addPanel(btnI); } else if (nbt.getId() == 9) // NBTTagList @@ -260,32 +295,44 @@ private void refreshList() { if (entry.getId() == 10) // Object { - PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw, i * 16, rw - 48, 16, 0), btnEdit, getButtonTitle((NBTTagCompound) entry), i); + PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw, i * 16, rw - 80, 16, 0), + btnEdit, + getButtonTitle((NBTTagCompound) entry), + i); this.addPanel(btn); - btn = new PanelButtonStorage<>(new GuiRectangle(width - 48, i * 16, 16, 16, 0), btnAdv, "...", i); + btn = new PanelButtonStorage<>(new GuiRectangle(width - 80, i * 16, 16, 16, 0), btnAdv, "...", i); this.addPanel(btn); } else if (entry.getId() == 9) // List { - PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), btnEdit, "List...", i); + PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw, i * 16, rw - 64, 16, 0), btnEdit, "List...", i); this.addPanel(btn); } else if (entry.getId() == 8) // Text { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 48, 16, 0), "" + ((NBTTagString) entry).getString(), FieldFilterString.INSTANCE); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 80, 16, 0), + "" + ((NBTTagString) entry).getString(), + FieldFilterString.INSTANCE); text.setCallback(new CallbackNBTTagString(list, i)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); - PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(width - 48, i * 16, 16, 16, 0), btnEdit, "Aa", i); + PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(width - 80, i * 16, 16, 16, 0), btnEdit, "Aa", i); this.addPanel(btn); } else if (entry.getId() == 1) // Byte/Boolean { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw / 2, 16, 0), "" + ((NBTPrimitive) entry).getByte(), FieldFilterNumber.BYTE); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw / 2, 16, 0), + "" + ((NBTPrimitive) entry).getByte(), + FieldFilterNumber.BYTE); this.addPanel(text); - PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw + rw / 2, i * 16, (int) Math.ceil(rw / 2F) - 32, 16, 0), btnEdit, ((NBTPrimitive) entry).getByte() > 0 ? "true" : "false", i); + PanelButtonStorage btn = new PanelButtonStorage<>(new GuiRectangle(lw + rw / 2, i * 16, (int) Math.ceil(rw / 2F) - 64, 16, 0), + btnEdit, + ((NBTPrimitive) entry).getByte() > 0 ? "true" : "false", + i); this.addPanel(btn); - text.setMaxLength(Integer.MAX_VALUE).setCallback(new CallbackMulti<>(new CallbackNBTPrimitive<>(list, i, Byte.class), value -> btn.setText(value > 0 ? "true" : "false"))); + text.setMaxLength(Integer.MAX_VALUE) + .setCallback(new CallbackMulti<>(new CallbackNBTPrimitive<>(list, i, Byte.class), + value -> btn.setText(value > 0 ? "true" : "false"))); btn.setCallback(value -> { boolean flag = ((NBTTagByte) list.get(value)).getByte() > 0; list.set(value, new NBTTagByte(flag ? (byte) 0 : (byte) 1)); @@ -297,53 +344,75 @@ private void refreshList() { switch (entry.getId()) { case 2: // Short { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), "" + ((NBTPrimitive) entry).getShort(), FieldFilterNumber.SHORT); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 64, 16, 0), + "" + ((NBTPrimitive) entry).getShort(), + FieldFilterNumber.SHORT); text.setCallback(new CallbackNBTPrimitive<>(list, i, Short.class)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); break; } case 3: // Integer { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), "" + ((NBTPrimitive) entry).getInt(), FieldFilterNumber.INT); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 64, 16, 0), + "" + ((NBTPrimitive) entry).getInt(), + FieldFilterNumber.INT); text.setCallback(new CallbackNBTPrimitive<>(list, i, Integer.class)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); break; } case 4: // Long { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), "" + ((NBTPrimitive) entry).getLong(), FieldFilterNumber.LONG); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 64, 16, 0), + "" + ((NBTPrimitive) entry).getLong(), + FieldFilterNumber.LONG); text.setCallback(new CallbackNBTPrimitive<>(list, i, Long.class)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); break; } case 5: // Float { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), "" + ((NBTPrimitive) entry).getFloat(), FieldFilterNumber.FLOAT); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 64, 16, 0), + "" + ((NBTPrimitive) entry).getFloat(), + FieldFilterNumber.FLOAT); text.setCallback(new CallbackNBTPrimitive<>(list, i, Float.class)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); break; } case 6: // Double { - PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 32, 16, 0), "" + ((NBTPrimitive) entry).getDouble(), FieldFilterNumber.DOUBLE); + PanelTextField text = new PanelTextField<>(new GuiRectangle(lw, i * 16, rw - 64, 16, 0), + "" + ((NBTPrimitive) entry).getDouble(), + FieldFilterNumber.DOUBLE); text.setCallback(new CallbackNBTPrimitive<>(list, i, Double.class)).setMaxLength(Integer.MAX_VALUE); this.addPanel(text); break; } } } else { - PanelTextBox err = new PanelTextBox(new GuiRectangle(lw, i * 16 + 4, rw - 48, 12, 0), entry.getClass().getSimpleName() + " Not Supported Yet").setAlignment(1); + PanelTextBox err = new PanelTextBox(new GuiRectangle(lw, i * 16 + 4, rw - 48, 12, 0), + entry.getClass().getSimpleName() + " Not Supported Yet").setAlignment(1); err.setColor(PresetColor.TEXT_MAIN.getColor()); this.addPanel(err); } - PanelButtonStorage btnI = new PanelButtonStorage<>(new GuiRectangle(width - 32, i * 16, 16, 16, 0), btnInsert, "+", i); - btnI.setTextHighlight(new GuiColorStatic(128, 128, 128, 255), new GuiColorStatic(0, 255, 0, 255), new GuiColorStatic(0, 255, 0, 255)); - this.addPanel(btnI); + PanelButton btnUp = new PanelButtonStorage<>(new GuiRectangle(width - 64, i * 16, 16, 16, 0), this.btnUp, "", i).setIcon(PresetIcon.ICON_UP + .getTexture()); + btnUp.setActive(list.tagCount() > 1); + this.addPanel(btnUp); - PanelButtonStorage btnD = new PanelButtonStorage<>(new GuiRectangle(width - 16, i * 16, 16, 16, 0), btnDelete, "x", i); - btnD.setTextHighlight(new GuiColorStatic(128, 128, 128, 255), new GuiColorStatic(255, 0, 0, 255), new GuiColorStatic(255, 0, 0, 255)); - this.addPanel(btnD); + PanelButton btnDown = new PanelButtonStorage<>(new GuiRectangle(width - 48, i * 16, 16, 16, 0), this.btnDown, "", i).setIcon( + PresetIcon.ICON_DOWN + .getTexture()); + btnDown.setActive(list.tagCount() > 1); + this.addPanel(btnDown); + + PanelButtonStorage btnInsert = new PanelButtonStorage<>(new GuiRectangle(width - 32, i * 16, 16, 16, 0), this.btnInsert, "+", i); + btnInsert.setTextHighlight(new GuiColorStatic(128, 128, 128, 255), new GuiColorStatic(0, 255, 0, 255), new GuiColorStatic(0, 255, 0, 255)); + this.addPanel(btnInsert); + + PanelButtonStorage btnDelete = new PanelButtonStorage<>(new GuiRectangle(width - 16, i * 16, 16, 16, 0), this.btnDelete, "x", i); + btnDelete.setTextHighlight(new GuiColorStatic(128, 128, 128, 255), new GuiColorStatic(255, 0, 0, 255), new GuiColorStatic(255, 0, 0, 255)); + this.addPanel(btnDelete); } this.addPanel(new PanelGeneric(new GuiRectangle(0, i * 16, width - 32, 16, 0), null)); // Keeps the list from auto resizing @@ -373,7 +442,8 @@ private void onButtonPress(PEventButton event) { IPanelButton btn = event.getButton(); NBTBase entry; - if (!(btn.getButtonID() == btnEdit || btn.getButtonID() == btnAdv || btn.getButtonID() == btnInsert || btn.getButtonID() == btnDelete)) { + if (!(btn.getButtonID() == btnEdit || btn.getButtonID() == btnAdv || btn.getButtonID() == btnUp || btn.getButtonID() == btnDown || btn.getButtonID() == + btnInsert || btn.getButtonID() == btnDelete)) { return; } @@ -387,33 +457,12 @@ private void onButtonPress(PEventButton event) { if (btn.getButtonID() == btnEdit) // Context dependent action/toggle { - if (entry.getId() == 10) // Object editor - { - NBTTagCompound tag = (NBTTagCompound) entry; - - if (JsonHelper.isItem(tag)) { - mc.displayGuiScreen(new GuiItemSelection(mc.currentScreen, tag, new NbtItemCallback(tag))); - } else if (JsonHelper.isFluid(tag)) { - mc.displayGuiScreen(new GuiFluidSelection(mc.currentScreen, tag, new NbtFluidCallback(tag))); - } else if (JsonHelper.isEntity(tag)) { - mc.displayGuiScreen(new GuiEntitySelection(mc.currentScreen, tag, new NbtEntityCallback(tag))); - } else { - mc.displayGuiScreen(new GuiNbtEditor(mc.currentScreen, tag, null)); - } - } else if (entry.getId() == 9) // List editor - { - mc.displayGuiScreen(new GuiNbtEditor(mc.currentScreen, (NBTTagList) entry, null)); - } else if (entry.getId() == 8) // Text editor - { - if (nbt.getId() == 10) { - mc.displayGuiScreen(new GuiTextEditor(mc.currentScreen, ((NBTTagString) entry).getString(), new CallbackNBTTagString((NBTTagCompound) nbt, ((PanelButtonStorage) btn).getStoredValue()))); - } else if (nbt.getId() == 9) { - mc.displayGuiScreen(new GuiTextEditor(mc.currentScreen, ((NBTTagString) entry).getString(), new CallbackNBTTagString((NBTTagList) nbt, ((PanelButtonStorage) btn).getStoredValue()))); - } - } else if (entry.getId() == 7 || entry.getId() == 11 || entry.getId() == 12) // Byte/Integer/Long array - { - // TODO: Add supportted editors for Byte, Integer and Long Arrays - throw new UnsupportedOperationException("NBTTagByteArray, NBTTagIntArray and NBTTagLongArray are not currently supported yet"); + if (nbt.getId() == 10) { + mc.displayGuiScreen(GuiNbtEditor.createEditorGui(mc.currentScreen, (NBTTagCompound) nbt, ((PanelButtonStorage) btn).getStoredValue())); + } else if (nbt.getId() == 9) { + mc.displayGuiScreen(GuiNbtEditor.createEditorGui(mc.currentScreen, (NBTTagList) nbt, ((PanelButtonStorage) btn).getStoredValue())); + } else { + throw new RuntimeException("Invalid NBT tag type!"); } } else if (btn.getButtonID() == btnAdv) // Open advanced editor (on supported types) { @@ -424,11 +473,40 @@ private void onButtonPress(PEventButton event) { // TODO: Replace with context based list editors mc.displayGuiScreen(new GuiNbtEditor(mc.currentScreen, (NBTTagList) entry, null)); } + } else if (btn.getButtonID() == btnUp) { + if (nbt.getId() == 9) { + NBTTagList tagList = (NBTTagList) nbt; + int index = ((PanelButtonStorage) btn).getStoredValue(); + if (index > 0) { + NBTBase tmp = tagList.get(index); + tagList.set(index, tagList.get(index - 1)); + tagList.set(index - 1, tmp); + refreshList(); + } + } + } else if (btn.getButtonID() == btnDown) { + if (nbt.getId() == 9) { + NBTTagList tagList = (NBTTagList) nbt; + int index = ((PanelButtonStorage) btn).getStoredValue(); + if (index < tagList.tagCount() - 1) { + NBTBase tmp = tagList.get(index); + tagList.set(index, tagList.get(index + 1)); + tagList.set(index + 1, tmp); + refreshList(); + } + } } else if (btn.getButtonID() == btnInsert) { if (nbt.getId() == 10) { mc.displayGuiScreen(new GuiNbtAdd(mc.currentScreen, (NBTTagCompound) nbt)); } else if (nbt.getId() == 9) { - mc.displayGuiScreen(new GuiNbtAdd(mc.currentScreen, (NBTTagList) nbt, ((PanelButtonStorage) btn).getStoredValue())); + NBTTagList tagList = (NBTTagList) nbt; + int index = ((PanelButtonStorage) btn).getStoredValue(); + if (tagList.tagCount() > 0) { + NBTUtil.insertTag(tagList, index, createDefaultNbtTag(tagList.get(0))); + mc.displayGuiScreen(GuiNbtEditor.createEditorGui(mc.currentScreen, tagList, index)); + } else { + mc.displayGuiScreen(new GuiNbtListAdd(mc.currentScreen, tagList, index)); + } } } else if (btn.getButtonID() == btnDelete) { if (nbt.getId() == 10) { @@ -457,4 +535,27 @@ private String getButtonTitle(NBTTagCompound tag) { return "Object..."; } + + private static NBTBase createDefaultNbtTag(NBTBase base) { + if (base.getId() == 10) { + NBTTagCompound tag = (NBTTagCompound) base; + + if (JsonHelper.isItem(tag)) { + return JsonHelper.ItemStackToJson(new BigItemStack(Blocks.STONE), new NBTTagCompound()); + } else if (JsonHelper.isFluid(tag)) { + return JsonHelper.FluidStackToJson(new FluidStack(FluidRegistry.WATER, 1000), new NBTTagCompound()); + } else if (JsonHelper.isEntity(tag)) { + return JsonHelper.EntityToJson(new EntityPig(Minecraft.getMinecraft().world), new NBTTagCompound()); + } else { + return new NBTTagCompound(); + } + } else { + try { + return base.getClass().getConstructor().newInstance(); + } catch (InstantiationException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } + } diff --git a/src/main/java/betterquesting/client/gui2/editors/tasks/GuiEditTaskRetrieval.java b/src/main/java/betterquesting/client/gui2/editors/tasks/GuiEditTaskRetrieval.java index 4c6222fa5..09c00d2be 100644 --- a/src/main/java/betterquesting/client/gui2/editors/tasks/GuiEditTaskRetrieval.java +++ b/src/main/java/betterquesting/client/gui2/editors/tasks/GuiEditTaskRetrieval.java @@ -1,5 +1,6 @@ package betterquesting.client.gui2.editors.tasks; + import betterquesting.EnumUtil; import betterquesting.api.api.ApiReference; import betterquesting.api.api.QuestingAPI; @@ -29,8 +30,10 @@ 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; diff --git a/src/main/java/betterquesting/client/ui_builder/GuiBuilderMain.java b/src/main/java/betterquesting/client/ui_builder/GuiBuilderMain.java index 121f5f721..75a8b20d9 100644 --- a/src/main/java/betterquesting/client/ui_builder/GuiBuilderMain.java +++ b/src/main/java/betterquesting/client/ui_builder/GuiBuilderMain.java @@ -641,7 +641,7 @@ private void openTrayNBT(NBTTagCompound tag) { btnTrayToggle.setIcon(PresetIcon.ICON_DOWN.getTexture()); // TODO: This panel doesn't work on its own - PanelScrollingNBT cvNbt = new PanelScrollingNBT(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(0, 0, 8, 0), 0), tag, 1, 2, 3, 4); + PanelScrollingNBT cvNbt = new PanelScrollingNBT(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(0, 0, 8, 0), 0), tag, 1, 2, 3, 4, 5, 6); cvPropTray.addPanel(cvNbt); PanelVScrollBar scPropTray = new PanelVScrollBar(new GuiTransform(GuiAlign.RIGHT_EDGE, new GuiPadding(-8, 0, 0, 0), 0)); diff --git a/src/main/java/betterquesting/questing/rewards/RewardChoice.java b/src/main/java/betterquesting/questing/rewards/RewardChoice.java index 1913e6bb1..6d6b5386b 100644 --- a/src/main/java/betterquesting/questing/rewards/RewardChoice.java +++ b/src/main/java/betterquesting/questing/rewards/RewardChoice.java @@ -1,6 +1,13 @@ package betterquesting.questing.rewards; -import betterquesting.NBTReplaceUtil; +import java.util.ArrayList; +import java.util.List; +import java.util.TreeMap; +import java.util.UUID; + +import org.apache.logging.log4j.Level; + +import betterquesting.NBTUtil; import betterquesting.api.api.QuestingAPI; import betterquesting.api.questing.IQuest; import betterquesting.api.questing.rewards.IReward; @@ -20,14 +27,9 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.logging.log4j.Level; - -import java.util.ArrayList; -import java.util.List; -import java.util.TreeMap; -import java.util.UUID; public class RewardChoice implements IReward { + /** * The selected reward index to be claimed.
* Should only ever be used client side. NEVER onHit server @@ -36,14 +38,10 @@ public class RewardChoice implements IReward { private final TreeMap selected = new TreeMap<>(); @Override - public ResourceLocation getFactoryID() { - return FactoryRewardChoice.INSTANCE.getRegistryName(); - } + public ResourceLocation getFactoryID() { return FactoryRewardChoice.INSTANCE.getRegistryName(); } @Override - public String getUnlocalisedName() { - return "bq_standard.reward.choice"; - } + public String getUnlocalisedName() { return "bq_standard.reward.choice"; } public int getSelecton(UUID uuid) { if (!selected.containsKey(uuid)) { @@ -59,7 +57,8 @@ public void setSelection(UUID uuid, int value) { @Override public boolean canClaim(EntityPlayer player, DBEntry quest) { - if (!selected.containsKey(QuestingAPI.getQuestingUUID(player))) return false; + if (!selected.containsKey(QuestingAPI.getQuestingUUID(player))) + return false; int tmp = selected.get(QuestingAPI.getQuestingUUID(player)); return choices.size() <= 0 || (tmp >= 0 && tmp < choices.size()); @@ -92,8 +91,8 @@ public void claimReward(EntityPlayer player, DBEntry quest) { for (ItemStack s : stack.getCombinedStacks()) { if (s.getTagCompound() != null) { - s.setTagCompound(NBTReplaceUtil.replaceStrings(s.getTagCompound(), "VAR_NAME", player.getName())); - s.setTagCompound(NBTReplaceUtil.replaceStrings(s.getTagCompound(), "VAR_UUID", QuestingAPI.getQuestingUUID(player).toString())); + s.setTagCompound(NBTUtil.replaceStrings(s.getTagCompound(), "VAR_NAME", player.getName())); + s.setTagCompound(NBTUtil.replaceStrings(s.getTagCompound(), "VAR_UUID", QuestingAPI.getQuestingUUID(player).toString())); } if (!player.inventory.addItemStackToInventory(s)) { @@ -121,15 +120,14 @@ public NBTTagCompound writeToNBT(NBTTagCompound nbt) { return nbt; } - @Override - @SideOnly(Side.CLIENT) + @Override @SideOnly(Side.CLIENT) public IGuiPanel getRewardGui(IGuiRect rect, DBEntry quest) { return new PanelRewardChoice(rect, quest, this); } - @Override - @SideOnly(Side.CLIENT) + @Override @SideOnly(Side.CLIENT) public GuiScreen getRewardEditor(GuiScreen screen, DBEntry quest) { return null; } + } diff --git a/src/main/java/betterquesting/questing/rewards/RewardItem.java b/src/main/java/betterquesting/questing/rewards/RewardItem.java index e0a061680..b7b920e87 100644 --- a/src/main/java/betterquesting/questing/rewards/RewardItem.java +++ b/src/main/java/betterquesting/questing/rewards/RewardItem.java @@ -1,6 +1,11 @@ package betterquesting.questing.rewards; -import betterquesting.NBTReplaceUtil; +import java.util.ArrayList; +import java.util.List; + +import org.apache.logging.log4j.Level; + +import betterquesting.NBTUtil; import betterquesting.api.api.QuestingAPI; import betterquesting.api.questing.IQuest; import betterquesting.api.questing.rewards.IReward; @@ -18,23 +23,16 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; -import org.apache.logging.log4j.Level; - -import java.util.ArrayList; -import java.util.List; public class RewardItem implements IReward { + public final List items = new ArrayList<>(); @Override - public ResourceLocation getFactoryID() { - return FactoryRewardItem.INSTANCE.getRegistryName(); - } + public ResourceLocation getFactoryID() { return FactoryRewardItem.INSTANCE.getRegistryName(); } @Override - public String getUnlocalisedName() { - return "bq_standard.reward.item"; - } + public String getUnlocalisedName() { return "bq_standard.reward.item"; } @Override public boolean canClaim(EntityPlayer player, DBEntry quest) { @@ -48,8 +46,8 @@ public void claimReward(EntityPlayer player, DBEntry quest) { for (ItemStack s : stack.getCombinedStacks()) { if (s.getTagCompound() != null) { - s.setTagCompound(NBTReplaceUtil.replaceStrings(s.getTagCompound(), "VAR_NAME", player.getName())); - s.setTagCompound(NBTReplaceUtil.replaceStrings(s.getTagCompound(), "VAR_UUID", QuestingAPI.getQuestingUUID(player).toString())); + s.setTagCompound(NBTUtil.replaceStrings(s.getTagCompound(), "VAR_NAME", player.getName())); + s.setTagCompound(NBTUtil.replaceStrings(s.getTagCompound(), "VAR_UUID", QuestingAPI.getQuestingUUID(player).toString())); } if (!player.inventory.addItemStackToInventory(s)) { @@ -66,7 +64,8 @@ public void readFromNBT(NBTTagCompound nbt) { for (int i = 0; i < rList.tagCount(); i++) { try { BigItemStack item = JsonHelper.JsonToItemStack(rList.getCompoundTagAt(i)); - if (item != null) items.add(item); + if (item != null) + items.add(item); } catch (Exception e) { BetterQuesting.logger.log(Level.ERROR, "Unable to load reward item data", e); } @@ -92,4 +91,5 @@ public IGuiPanel getRewardGui(IGuiRect rect, DBEntry quest) { public GuiScreen getRewardEditor(GuiScreen screen, DBEntry quest) { return null; } + }