2019-12-24 13:37:41 -08:00
|
|
|
package codechicken.nei;
|
|
|
|
|
|
2022-01-09 19:05:30 +02:00
|
|
|
import codechicken.core.CommonUtils;
|
2022-01-02 23:30:54 +02:00
|
|
|
import codechicken.lib.vec.Rectangle4i;
|
2021-02-13 14:10:56 -08:00
|
|
|
import codechicken.nei.util.NBTJson;
|
2021-11-22 05:31:02 +02:00
|
|
|
import codechicken.nei.recipe.StackInfo;
|
|
|
|
|
import codechicken.nei.recipe.BookmarkRecipeId;
|
2022-05-06 22:41:45 +03:00
|
|
|
import codechicken.nei.ItemPanel.ItemPanelSlot;
|
2022-01-02 23:30:54 +02:00
|
|
|
import codechicken.nei.guihook.GuiContainerManager;
|
2021-02-13 14:10:56 -08:00
|
|
|
import com.google.gson.JsonParser;
|
2022-01-02 23:30:54 +02:00
|
|
|
import com.google.gson.JsonPrimitive;
|
2021-11-22 05:31:02 +02:00
|
|
|
import com.google.gson.JsonObject;
|
2021-02-13 14:10:56 -08:00
|
|
|
import com.google.gson.JsonSyntaxException;
|
2022-05-06 22:41:45 +03:00
|
|
|
|
|
|
|
|
import net.minecraft.client.gui.FontRenderer;
|
2019-12-24 13:37:41 -08:00
|
|
|
import net.minecraft.client.gui.inventory.GuiContainer;
|
|
|
|
|
import net.minecraft.item.ItemStack;
|
|
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
|
|
|
import org.apache.commons.io.IOUtils;
|
2022-05-06 22:41:45 +03:00
|
|
|
import org.lwjgl.opengl.GL11;
|
2019-12-24 13:37:41 -08:00
|
|
|
|
2022-05-27 07:42:41 -04:00
|
|
|
import javax.annotation.Nullable;
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
import static codechicken.lib.gui.GuiDraw.getMousePosition;
|
|
|
|
|
import static codechicken.lib.gui.GuiDraw.drawRect;
|
|
|
|
|
|
|
|
|
|
import java.awt.Point;
|
2019-12-24 13:37:41 -08:00
|
|
|
import java.io.File;
|
|
|
|
|
import java.io.FileReader;
|
2022-01-09 19:05:30 +02:00
|
|
|
import java.io.InputStream;
|
|
|
|
|
import java.io.OutputStream;
|
|
|
|
|
import java.io.FileInputStream;
|
|
|
|
|
import java.io.FileOutputStream;
|
2019-12-24 13:37:41 -08:00
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.List;
|
2022-01-02 23:30:54 +02:00
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.HashMap;
|
2019-12-24 13:37:41 -08:00
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
public class BookmarkPanel extends PanelWidget
|
2022-01-02 23:30:54 +02:00
|
|
|
{
|
2019-12-24 13:37:41 -08:00
|
|
|
|
2022-01-09 19:05:30 +02:00
|
|
|
protected File bookmarkFile;
|
2021-11-22 05:31:02 +02:00
|
|
|
protected boolean bookmarksIsLoaded = false;
|
|
|
|
|
public int sortedStackIndex = -1;
|
2022-01-02 23:30:54 +02:00
|
|
|
public int sortedNamespaceIndex = -1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Button namespacePrev;
|
|
|
|
|
public Button namespaceNext;
|
|
|
|
|
public Label namespaceLabel;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected ArrayList<BookmarkGrid> namespaces = new ArrayList<>();
|
2022-05-06 22:41:45 +03:00
|
|
|
protected int activeNamespaceIndex = 0;
|
2022-01-02 23:30:54 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
protected static class BookmarkStackMeta
|
|
|
|
|
{
|
|
|
|
|
public int factor;
|
|
|
|
|
public BookmarkRecipeId recipeId;
|
|
|
|
|
public boolean ingredient = false;
|
2022-05-06 22:41:45 +03:00
|
|
|
public boolean fluidDisplay = false;
|
2022-01-02 23:30:54 +02:00
|
|
|
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
public BookmarkStackMeta(BookmarkRecipeId recipeId, int count, boolean ingredient, boolean fluidDisplay)
|
2022-01-02 23:30:54 +02:00
|
|
|
{
|
|
|
|
|
this.recipeId = recipeId;
|
|
|
|
|
this.factor = count;
|
|
|
|
|
this.ingredient = ingredient;
|
2022-05-06 22:41:45 +03:00
|
|
|
this.fluidDisplay = fluidDisplay;
|
2022-01-02 23:30:54 +02:00
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
protected static class BookmarkGrid extends ItemsGrid
|
|
|
|
|
{
|
|
|
|
|
protected List<BookmarkStackMeta> metadata = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
public int indexOf(ItemStack stackA, BookmarkRecipeId recipeId)
|
|
|
|
|
{
|
|
|
|
|
final boolean useNBT = NEIClientConfig.useNBTInBookmarks();
|
|
|
|
|
|
|
|
|
|
for (int idx = 0; idx < realItems.size(); idx++) {
|
|
|
|
|
final BookmarkStackMeta meta = getMetadata(idx);
|
|
|
|
|
if ((recipeId == null && meta.recipeId == null || recipeId != null && meta.recipeId != null && recipeId.equals(meta.recipeId)) && StackInfo.equalItemAndNBT(stackA, realItems.get(idx), useNBT)) {
|
|
|
|
|
return idx;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public BookmarkStackMeta getMetadata(int idx)
|
|
|
|
|
{
|
|
|
|
|
return metadata.get(idx);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void addItem(ItemStack stackA, BookmarkStackMeta meta)
|
|
|
|
|
{
|
|
|
|
|
realItems.add(stackA);
|
|
|
|
|
metadata.add(meta);
|
2022-05-27 07:42:41 -04:00
|
|
|
refreshBuffer = true;
|
2022-01-02 23:30:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void replaceItem(int idx, ItemStack stack)
|
|
|
|
|
{
|
|
|
|
|
realItems.set(idx, stack);
|
2022-05-27 07:42:41 -04:00
|
|
|
refreshBuffer = true;
|
2022-01-02 23:30:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void removeRecipe(int idx, boolean removeFullRecipe)
|
|
|
|
|
{
|
|
|
|
|
final BookmarkStackMeta meta = getMetadata(idx);
|
|
|
|
|
|
|
|
|
|
if (removeFullRecipe && meta.recipeId != null) {
|
|
|
|
|
removeRecipe(meta.recipeId);
|
|
|
|
|
} else {
|
|
|
|
|
removeItem(idx);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void removeRecipe(BookmarkRecipeId recipeIdA)
|
|
|
|
|
{
|
|
|
|
|
BookmarkRecipeId recipeIdB;
|
|
|
|
|
|
|
|
|
|
for (int slotIndex = metadata.size() - 1; slotIndex >= 0; slotIndex--) {
|
|
|
|
|
recipeIdB = getRecipeId(slotIndex);
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
if (recipeIdB != null && recipeIdB.equals(recipeIdA)) {
|
2022-01-02 23:30:54 +02:00
|
|
|
removeItem(slotIndex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected boolean removeItem(int idx)
|
|
|
|
|
{
|
|
|
|
|
realItems.remove(idx);
|
|
|
|
|
metadata.remove(idx);
|
2022-05-27 07:42:41 -04:00
|
|
|
refreshBuffer = true;
|
2022-01-02 23:30:54 +02:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public BookmarkRecipeId getRecipeId(int idx)
|
|
|
|
|
{
|
|
|
|
|
return getMetadata(idx).recipeId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public BookmarkRecipeId findRecipeId(ItemStack stackA)
|
|
|
|
|
{
|
|
|
|
|
final boolean useNBT = NEIClientConfig.useNBTInBookmarks();
|
|
|
|
|
|
|
|
|
|
for (int idx = 0; idx < realItems.size(); idx++) {
|
|
|
|
|
if (StackInfo.equalItemAndNBT(stackA, getItem(idx), useNBT)) {
|
|
|
|
|
return getRecipeId(idx);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void moveItem(int src, int dst)
|
|
|
|
|
{
|
|
|
|
|
realItems.add(dst, realItems.remove(src));
|
|
|
|
|
metadata.add(dst, metadata.remove(src));
|
2022-05-27 07:42:41 -04:00
|
|
|
refreshBuffer = true;
|
2022-01-02 23:30:54 +02:00
|
|
|
}
|
|
|
|
|
|
2022-05-27 07:42:41 -04:00
|
|
|
private boolean isPartOfFocusedRecipe(ItemPanelSlot focused, int myIdx) {
|
|
|
|
|
return (NEIClientUtils.shiftKey()
|
|
|
|
|
&& LayoutManager.bookmarkPanel.sortedStackIndex == -1
|
|
|
|
|
&& focused != null
|
|
|
|
|
&& getRecipeId(focused.slotIndex) != null
|
|
|
|
|
&& getRecipeId(myIdx) != null
|
|
|
|
|
&& getRecipeId(focused.slotIndex).equals(getRecipeId(myIdx)));
|
|
|
|
|
}
|
2022-01-02 23:30:54 +02:00
|
|
|
|
2022-05-27 07:42:41 -04:00
|
|
|
@Override
|
|
|
|
|
protected void drawSlotOutline(@Nullable ItemPanelSlot focus, int idx, Rectangle4i rect) {
|
|
|
|
|
if(LayoutManager.bookmarkPanel.sortedNamespaceIndex == LayoutManager.bookmarkPanel.activeNamespaceIndex && LayoutManager.bookmarkPanel.sortedStackIndex == idx) {
|
2022-01-02 23:30:54 +02:00
|
|
|
drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555);//highlight
|
2022-05-27 07:42:41 -04:00
|
|
|
} else if(focus != null) {
|
|
|
|
|
BookmarkStackMeta meta = getMetadata(idx);
|
|
|
|
|
if (isPartOfFocusedRecipe(focus, idx)) {
|
|
|
|
|
drawRect(rect.x, rect.y, rect.w, rect.h, meta.ingredient? 0x88b3b300: 0x88009933);//highlight recipe
|
|
|
|
|
} else if(focus.slotIndex == idx) {
|
|
|
|
|
drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555);//highlight
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void drawItem(Rectangle4i rect, int idx)
|
|
|
|
|
{
|
|
|
|
|
if (LayoutManager.bookmarkPanel.sortedNamespaceIndex != LayoutManager.bookmarkPanel.activeNamespaceIndex || LayoutManager.bookmarkPanel.sortedStackIndex != idx) {
|
2022-05-06 22:41:45 +03:00
|
|
|
final ItemStack stack = getItem(idx);
|
|
|
|
|
final BookmarkStackMeta meta = getMetadata(idx);
|
2022-01-02 23:30:54 +02:00
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
GuiContainerManager.drawItem(rect.x + 1, rect.y + 1, stack, true, meta.factor < 0 || meta.fluidDisplay? "": String.valueOf(stack.stackSize));
|
|
|
|
|
|
|
|
|
|
if (meta.recipeId != null && !meta.ingredient && NEIClientConfig.showRecipeMarker()) {
|
|
|
|
|
drawRecipeMarker(rect.x, rect.y, GuiContainerManager.getFontRenderer(stack));
|
2022-01-02 23:30:54 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
protected void drawRecipeMarker(int offsetX, int offsetY, FontRenderer fontRenderer )
|
|
|
|
|
{
|
|
|
|
|
final float scaleFactor = fontRenderer.getUnicodeFlag() ? 0.85f : 0.5f;
|
|
|
|
|
final float inverseScaleFactor = 1.0f / scaleFactor;
|
|
|
|
|
|
|
|
|
|
GuiContainerManager.enable2DRender();
|
|
|
|
|
GL11.glScaled(scaleFactor, scaleFactor, scaleFactor);
|
|
|
|
|
|
|
|
|
|
final int X = (int) ( ( (float) offsetX + 1.0f) * inverseScaleFactor );
|
|
|
|
|
final int Y = (int) ( ( (float) offsetY + 1.0f) * inverseScaleFactor );
|
|
|
|
|
fontRenderer.drawStringWithShadow("R", X, Y, 0xA0A0A0);
|
|
|
|
|
|
|
|
|
|
GL11.glScaled(inverseScaleFactor, inverseScaleFactor, inverseScaleFactor);
|
|
|
|
|
GuiContainerManager.enable3DRender();
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-20 09:42:39 -08:00
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
|
|
|
|
|
public BookmarkPanel()
|
|
|
|
|
{
|
|
|
|
|
grid = new BookmarkGrid();
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
@Override
|
2022-01-02 23:30:54 +02:00
|
|
|
public void init()
|
2021-11-22 05:31:02 +02:00
|
|
|
{
|
2022-01-02 23:30:54 +02:00
|
|
|
super.init();
|
|
|
|
|
|
|
|
|
|
namespaceLabel = new Label("1", true);
|
|
|
|
|
|
|
|
|
|
namespacePrev = new Button("Prev")
|
|
|
|
|
{
|
|
|
|
|
public boolean onButtonPress(boolean rightclick)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if (rightclick) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return prevNamespace();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String getRenderLabel()
|
|
|
|
|
{
|
|
|
|
|
return "<";
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
namespaceNext = new Button("Next")
|
|
|
|
|
{
|
|
|
|
|
public boolean onButtonPress(boolean rightclick)
|
|
|
|
|
{
|
|
|
|
|
if (rightclick) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nextNamespace();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String getRenderLabel()
|
|
|
|
|
{
|
|
|
|
|
return ">";
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
namespaces.add(new BookmarkGrid());
|
|
|
|
|
grid = namespaces.get(activeNamespaceIndex);
|
2021-11-22 05:31:02 +02:00
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
@Override
|
|
|
|
|
public String getLabelText()
|
|
|
|
|
{
|
2022-05-06 22:41:45 +03:00
|
|
|
return String.format("(%d/%d) [%d]", getPage(), Math.max(1, getNumPages()), grid.size());
|
2022-01-02 23:30:54 +02:00
|
|
|
}
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
public void addOrRemoveItem(ItemStack stackA)
|
|
|
|
|
{
|
|
|
|
|
addOrRemoveItem(stackA, "", null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void addOrRemoveItem(ItemStack stackover, String handlerName, List<PositionedStack> ingredients)
|
2021-11-22 05:31:02 +02:00
|
|
|
{
|
|
|
|
|
loadBookmarksIfNeeded();
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
final Point mousePos = getMousePosition();
|
|
|
|
|
final ItemPanelSlot slot = getSlotMouseOver(mousePos.x, mousePos.y);
|
|
|
|
|
final boolean addFullRecipe = NEIClientUtils.shiftKey();
|
|
|
|
|
final BookmarkGrid BGrid = (BookmarkGrid) grid;
|
|
|
|
|
|
|
|
|
|
if (slot != null && StackInfo.equalItemAndNBT(slot.item, stackover, true)) {
|
|
|
|
|
BGrid.removeRecipe(slot.slotIndex, addFullRecipe);
|
|
|
|
|
} else {
|
|
|
|
|
final boolean saveStackSize = NEIClientUtils.controlKey();
|
|
|
|
|
final NBTTagCompound nbTagA = StackInfo.itemStackToNBT(stackover, saveStackSize);
|
|
|
|
|
final ItemStack normalizedA = StackInfo.loadFromNBT(nbTagA);
|
|
|
|
|
BookmarkRecipeId recipeId = null;
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
if (NEIClientConfig.saveCurrentRecipeInBookmarksEnabled() && handlerName != "" && ingredients != null && !ingredients.isEmpty()) {
|
2022-01-02 23:30:54 +02:00
|
|
|
recipeId = new BookmarkRecipeId(handlerName, ingredients);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final int idx = BGrid.indexOf(normalizedA, recipeId);
|
|
|
|
|
|
|
|
|
|
if (idx != -1) {
|
|
|
|
|
BGrid.removeRecipe(idx, addFullRecipe);
|
|
|
|
|
} else {
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
if (addFullRecipe && handlerName != "" && ingredients != null && !ingredients.isEmpty()) {
|
2022-01-02 23:30:54 +02:00
|
|
|
final Map<NBTTagCompound, Integer> unique = new HashMap<>();
|
|
|
|
|
final ArrayList<NBTTagCompound> sorted = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
BGrid.removeRecipe(recipeId);
|
|
|
|
|
|
|
|
|
|
for (PositionedStack stack : ingredients) {
|
|
|
|
|
final NBTTagCompound nbTag = StackInfo.itemStackToNBT(stack.item, saveStackSize);
|
|
|
|
|
|
2022-01-07 19:06:05 +02:00
|
|
|
if (unique.get(nbTag) == null) {
|
|
|
|
|
unique.put(nbTag, 1);
|
|
|
|
|
sorted.add(nbTag);
|
|
|
|
|
} else if (saveStackSize) {
|
|
|
|
|
unique.put(nbTag, unique.get(nbTag) + 1);
|
2022-01-02 23:30:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (NBTTagCompound nbTag : sorted) {
|
|
|
|
|
nbTag.setInteger("Count", nbTag.getInteger("Count") * unique.get(nbTag));
|
2022-05-06 22:41:45 +03:00
|
|
|
BGrid.addItem(StackInfo.loadFromNBT(nbTag), new BookmarkStackMeta(recipeId, (saveStackSize ? 1: -1) * nbTag.getInteger("Count"), true, nbTag.hasKey("gtFluidName")));
|
2022-01-02 23:30:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
BGrid.addItem(normalizedA, new BookmarkStackMeta(recipeId, (saveStackSize ? 1: -1) * nbTagA.getInteger("Count"), false, nbTagA.hasKey("gtFluidName")));
|
2022-01-02 23:30:54 +02:00
|
|
|
}
|
|
|
|
|
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-04 13:28:43 +02:00
|
|
|
fixCountOfNamespaces();
|
2019-12-24 13:37:41 -08:00
|
|
|
saveBookmarks();
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
public BookmarkRecipeId getBookmarkRecipeId(ItemStack stackA)
|
2020-01-05 12:13:50 -08:00
|
|
|
{
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-05-16 23:57:00 +08:00
|
|
|
BookmarkRecipeId mouseOverRecipeId = getBookmarkMouseOverRecipeId(stackA);
|
|
|
|
|
if (mouseOverRecipeId != null) return mouseOverRecipeId;
|
2020-01-05 12:13:50 -08:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
BookmarkRecipeId recipeId = ((BookmarkGrid) grid).findRecipeId(stackA);
|
|
|
|
|
|
|
|
|
|
if (recipeId == null) {
|
|
|
|
|
|
|
|
|
|
for (int idx = 0; idx < namespaces.size() && recipeId == null; idx++) {
|
|
|
|
|
if (idx == activeNamespaceIndex) continue;
|
|
|
|
|
recipeId = namespaces.get(idx).findRecipeId(stackA);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return recipeId;
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-16 23:57:00 +08:00
|
|
|
public BookmarkRecipeId getBookmarkMouseOverRecipeId(ItemStack stackA)
|
|
|
|
|
{
|
|
|
|
|
final Point mousePos = getMousePosition();
|
|
|
|
|
final ItemPanelSlot slot = getSlotMouseOver(mousePos.x, mousePos.y);
|
|
|
|
|
|
|
|
|
|
if (slot != null) {
|
|
|
|
|
if (stackA == null || StackInfo.equalItemAndNBT(slot.item, stackA, true)) {
|
|
|
|
|
return ((BookmarkGrid) grid).getRecipeId(slot.slotIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public BookmarkRecipeId getBookmarkMouseOverRecipeId()
|
|
|
|
|
{
|
|
|
|
|
return getBookmarkMouseOverRecipeId(null);
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
protected String getNamespaceLabelText(boolean shortFormat)
|
|
|
|
|
{
|
|
|
|
|
String activePage = String.valueOf(activeNamespaceIndex + 1);
|
|
|
|
|
|
|
|
|
|
return shortFormat? activePage: (activePage + "/" + fixCountOfNamespaces());
|
2020-01-05 12:13:50 -08:00
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
protected int fixCountOfNamespaces()
|
2020-01-05 12:13:50 -08:00
|
|
|
{
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
if (namespaces.get(namespaces.size() - 1).size() > 0) {
|
|
|
|
|
namespaces.add(new BookmarkGrid());
|
|
|
|
|
} else if (activeNamespaceIndex == namespaces.size() - 2 && grid.size() == 0) {
|
|
|
|
|
namespaces.remove(namespaces.size() - 1);
|
|
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
return namespaces.size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected boolean removeEmptyNamespaces()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if (activeNamespaceIndex != namespaces.size() - 1 && grid.size() == 0) {
|
|
|
|
|
namespaces.remove(activeNamespaceIndex);
|
|
|
|
|
grid = namespaces.get(activeNamespaceIndex);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
protected boolean prevNamespace()
|
|
|
|
|
{
|
|
|
|
|
if (!bookmarksIsLoaded) {
|
|
|
|
|
return false;
|
2020-01-05 12:13:50 -08:00
|
|
|
}
|
2022-01-02 23:30:54 +02:00
|
|
|
|
|
|
|
|
fixCountOfNamespaces();
|
|
|
|
|
removeEmptyNamespaces();
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
if (activeNamespaceIndex == 0) {
|
|
|
|
|
activeNamespaceIndex = namespaces.size() - 1;
|
|
|
|
|
} else {
|
|
|
|
|
activeNamespaceIndex --;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
grid = namespaces.get(activeNamespaceIndex);
|
|
|
|
|
|
|
|
|
|
return true;
|
2020-01-05 12:13:50 -08:00
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
protected boolean nextNamespace()
|
|
|
|
|
{
|
|
|
|
|
if (!bookmarksIsLoaded) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (removeEmptyNamespaces()) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (activeNamespaceIndex == fixCountOfNamespaces() - 1) {
|
|
|
|
|
activeNamespaceIndex = 0;
|
|
|
|
|
} else {
|
|
|
|
|
activeNamespaceIndex ++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
grid = namespaces.get(activeNamespaceIndex);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-09 19:05:30 +02:00
|
|
|
public void setBookmarkFile(String worldPath)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
final File dir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/" + worldPath);
|
|
|
|
|
|
|
|
|
|
if (!dir.exists()) {
|
|
|
|
|
dir.mkdirs();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bookmarkFile = new File(dir, "bookmarks.ini");
|
|
|
|
|
|
|
|
|
|
if (!bookmarkFile.exists()) {
|
|
|
|
|
final File globalBookmarks = new File(CommonUtils.getMinecraftDir(), "saves/NEI/global/bookmarks.ini");
|
|
|
|
|
final File configBookmarks = new File(NEIClientConfig.configDir, "bookmarks.ini");
|
|
|
|
|
final File defaultBookmarks = configBookmarks.exists()? configBookmarks: globalBookmarks;
|
|
|
|
|
|
|
|
|
|
if (defaultBookmarks.exists()) {
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
bookmarkFile.createNewFile();
|
|
|
|
|
|
|
|
|
|
InputStream src = new FileInputStream(defaultBookmarks);
|
|
|
|
|
OutputStream dst = new FileOutputStream(bookmarkFile);
|
|
|
|
|
|
|
|
|
|
IOUtils.copy(src, dst);
|
|
|
|
|
|
|
|
|
|
src.close();
|
|
|
|
|
dst.close();
|
|
|
|
|
|
|
|
|
|
} catch(IOException e) {}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bookmarksIsLoaded = false;
|
|
|
|
|
}
|
2022-01-02 23:30:54 +02:00
|
|
|
|
2021-11-22 05:31:02 +02:00
|
|
|
public void saveBookmarks()
|
|
|
|
|
{
|
|
|
|
|
|
2022-02-06 17:42:11 +02:00
|
|
|
if (bookmarkFile == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
ArrayList<String> strings = new ArrayList<>();
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
for (int grpIdx = 0; grpIdx < namespaces.size() - 1; grpIdx++) {
|
|
|
|
|
final BookmarkGrid grid = namespaces.get(grpIdx);
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
if (grpIdx > 0) {
|
|
|
|
|
strings.add("");//namespace separator; ignore first namespace
|
|
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
for (int idx = 0; idx < grid.size(); idx++) {
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
final NBTTagCompound nbTag = StackInfo.itemStackToNBT(grid.getItem(idx));
|
|
|
|
|
|
|
|
|
|
if (nbTag != null) {
|
|
|
|
|
JsonObject row = new JsonObject();
|
|
|
|
|
BookmarkStackMeta meta = grid.getMetadata(idx);
|
|
|
|
|
|
|
|
|
|
row.add("item", NBTJson.toJsonObject(nbTag));
|
|
|
|
|
row.add("factor", new JsonPrimitive(meta.factor));
|
|
|
|
|
row.add("ingredient", new JsonPrimitive(meta.ingredient));
|
|
|
|
|
|
|
|
|
|
if (meta.recipeId != null) {
|
|
|
|
|
row.add("recipeId", meta.recipeId.toJsonObject());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strings.add(NBTJson.toJson(row));
|
2021-11-22 05:31:02 +02:00
|
|
|
}
|
2022-01-02 23:30:54 +02:00
|
|
|
|
|
|
|
|
} catch (JsonSyntaxException e) {
|
|
|
|
|
NEIClientConfig.logger.error("Failed to stringify bookmarked ItemStack to json string");
|
2021-11-22 05:31:02 +02:00
|
|
|
}
|
2022-01-02 23:30:54 +02:00
|
|
|
|
2021-11-22 05:31:02 +02:00
|
|
|
}
|
|
|
|
|
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-02-06 17:42:11 +02:00
|
|
|
try (FileOutputStream output = new FileOutputStream(bookmarkFile)) {
|
|
|
|
|
IOUtils.writeLines(strings, "\n", output, "UTF-8");
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
NEIClientConfig.logger.error("Filed to save bookmarks list to file {}", bookmarkFile, e);
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
|
|
|
|
|
2021-11-22 05:31:02 +02:00
|
|
|
public void loadBookmarksIfNeeded()
|
|
|
|
|
{
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
if (bookmarksIsLoaded) {
|
2021-11-22 05:31:02 +02:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bookmarksIsLoaded = true;
|
|
|
|
|
|
2022-01-09 19:05:30 +02:00
|
|
|
if (bookmarkFile == null || !bookmarkFile.exists()) {
|
2019-12-24 13:37:41 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2022-01-02 23:30:54 +02:00
|
|
|
|
2019-12-24 13:37:41 -08:00
|
|
|
List<String> itemStrings;
|
2022-01-09 19:05:30 +02:00
|
|
|
try (FileReader reader = new FileReader(bookmarkFile)) {
|
|
|
|
|
NEIClientConfig.logger.info("Loading bookmarks from file {}", bookmarkFile);
|
2019-12-24 13:37:41 -08:00
|
|
|
itemStrings = IOUtils.readLines(reader);
|
|
|
|
|
} catch (IOException e) {
|
2022-01-09 19:05:30 +02:00
|
|
|
NEIClientConfig.logger.error("Failed to load bookmarks from file {}", bookmarkFile, e);
|
2019-12-24 13:37:41 -08:00
|
|
|
return;
|
|
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
namespaces.clear();
|
|
|
|
|
namespaces.add(new BookmarkGrid());
|
|
|
|
|
activeNamespaceIndex = 0;
|
|
|
|
|
|
|
|
|
|
final JsonParser parser = new JsonParser();
|
|
|
|
|
|
2019-12-24 13:37:41 -08:00
|
|
|
for (String itemStr: itemStrings) {
|
|
|
|
|
try {
|
2022-01-02 23:30:54 +02:00
|
|
|
|
|
|
|
|
if (itemStr.isEmpty()) {
|
|
|
|
|
|
|
|
|
|
if (namespaces.get(activeNamespaceIndex).size() > 0) {
|
|
|
|
|
//do not create empty namespaces
|
|
|
|
|
namespaces.add(new BookmarkGrid());
|
|
|
|
|
activeNamespaceIndex++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-22 05:31:02 +02:00
|
|
|
JsonObject jsonObject = parser.parse(itemStr).getAsJsonObject();
|
|
|
|
|
BookmarkRecipeId recipeId = null;
|
2022-01-02 23:30:54 +02:00
|
|
|
NBTTagCompound itemStackNBT;
|
2021-11-22 05:31:02 +02:00
|
|
|
|
|
|
|
|
if (jsonObject.get("item") != null) {
|
|
|
|
|
itemStackNBT = (NBTTagCompound) NBTJson.toNbt(jsonObject.get("item"));
|
2022-01-02 23:30:54 +02:00
|
|
|
} else {// old format
|
2021-11-22 05:31:02 +02:00
|
|
|
itemStackNBT = (NBTTagCompound) NBTJson.toNbt(jsonObject);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (jsonObject.get("recipeId") != null && jsonObject.get("recipeId") instanceof JsonObject) {
|
|
|
|
|
recipeId = new BookmarkRecipeId((JsonObject) jsonObject.get("recipeId"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ItemStack itemStack = StackInfo.loadFromNBT(itemStackNBT);
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
|
2019-12-24 13:37:41 -08:00
|
|
|
if (itemStack != null) {
|
2022-01-02 23:30:54 +02:00
|
|
|
namespaces.get(activeNamespaceIndex).addItem(itemStack, new BookmarkStackMeta(
|
|
|
|
|
recipeId,
|
2022-05-06 22:41:45 +03:00
|
|
|
jsonObject.has("factor")? jsonObject.get("factor").getAsInt(): 0,
|
|
|
|
|
jsonObject.has("ingredient")? jsonObject.get("ingredient").getAsBoolean(): false,
|
|
|
|
|
itemStackNBT.hasKey("gtFluidName")
|
2022-01-02 23:30:54 +02:00
|
|
|
));
|
2019-12-24 13:37:41 -08:00
|
|
|
} else {
|
|
|
|
|
NEIClientConfig.logger.warn("Failed to load bookmarked ItemStack from json string, the item no longer exists:\n{}", itemStr);
|
|
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2021-02-13 14:10:56 -08:00
|
|
|
} catch (IllegalArgumentException | JsonSyntaxException e) {
|
|
|
|
|
NEIClientConfig.logger.error("Failed to load bookmarked ItemStack from json string:\n{}", itemStr);
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
|
|
|
|
}
|
2022-01-02 23:30:54 +02:00
|
|
|
|
|
|
|
|
if (namespaces.get(activeNamespaceIndex).size() == 0) {
|
|
|
|
|
activeNamespaceIndex = Math.max(activeNamespaceIndex - 1, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
grid = namespaces.get(activeNamespaceIndex);
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
|
2021-11-22 05:31:02 +02:00
|
|
|
@Override
|
2022-01-02 23:30:54 +02:00
|
|
|
public void resize(GuiContainer gui)
|
2021-11-22 05:31:02 +02:00
|
|
|
{
|
|
|
|
|
loadBookmarksIfNeeded();
|
2022-01-02 23:30:54 +02:00
|
|
|
super.resize(gui);
|
2022-05-06 22:41:45 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected int resizeHeader(GuiContainer gui)
|
|
|
|
|
{
|
|
|
|
|
final LayoutStyleMinecraft layout = (LayoutStyleMinecraft) LayoutManager.getLayoutStyle();
|
|
|
|
|
final int rows = (int) Math.ceil((double) layout.buttonCount / layout.numButtons);
|
|
|
|
|
final int diff = rows * 18 + getMarginTop(gui) - y;
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
if (diff > 0) {
|
|
|
|
|
y += diff;
|
|
|
|
|
h -= diff;
|
|
|
|
|
}
|
2022-01-02 23:30:54 +02:00
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
return super.resizeHeader(gui);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected int resizeFooter(GuiContainer gui)
|
|
|
|
|
{
|
|
|
|
|
final int BUTTON_SIZE = 16;
|
|
|
|
|
|
|
|
|
|
final ButtonCycled button = LayoutManager.bookmarksButton;
|
|
|
|
|
final int leftBorder = y + h > button.y? button.x + button.w + 2: x;
|
2022-01-02 23:30:54 +02:00
|
|
|
final int rightBorder = x + w;
|
2022-05-06 22:41:45 +03:00
|
|
|
final int center = leftBorder + Math.max(0, (rightBorder - leftBorder) / 2);
|
2022-01-02 23:30:54 +02:00
|
|
|
int labelWidth = 2;
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
namespacePrev.h = namespaceNext.h = BUTTON_SIZE;
|
|
|
|
|
namespacePrev.w = namespaceNext.w = BUTTON_SIZE;
|
|
|
|
|
namespacePrev.y = namespaceNext.y = y + h - BUTTON_SIZE;
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
|
|
|
|
|
if (rightBorder - leftBorder >= 70) {
|
|
|
|
|
labelWidth = 36;
|
|
|
|
|
namespaceLabel.text = getNamespaceLabelText(false);
|
|
|
|
|
} else {
|
|
|
|
|
labelWidth = 18;
|
|
|
|
|
namespaceLabel.text = getNamespaceLabelText(true);
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
namespaceLabel.y = namespacePrev.y + 5;
|
2022-01-02 23:30:54 +02:00
|
|
|
namespaceLabel.x = center;
|
|
|
|
|
|
|
|
|
|
namespacePrev.x = center - labelWidth / 2 - 2 - namespacePrev.w;
|
|
|
|
|
namespaceNext.x = center + labelWidth / 2 + 2;
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
return BUTTON_SIZE + 2;
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
|
|
|
|
|
2020-02-04 20:11:17 -08:00
|
|
|
@Override
|
2022-01-02 23:30:54 +02:00
|
|
|
public void setVisible()
|
|
|
|
|
{
|
|
|
|
|
super.setVisible();
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
if (grid.getPerPage() > 0) {
|
|
|
|
|
LayoutManager.addWidget(namespacePrev);
|
|
|
|
|
LayoutManager.addWidget(namespaceNext);
|
|
|
|
|
LayoutManager.addWidget(namespaceLabel);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected String getPositioningSettingName()
|
|
|
|
|
{
|
|
|
|
|
return "world.panels.bookmarks";
|
2020-02-04 20:11:17 -08:00
|
|
|
}
|
2019-12-24 13:37:41 -08:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
public int getMarginLeft(GuiContainer gui)
|
|
|
|
|
{
|
2022-05-06 22:41:45 +03:00
|
|
|
return PADDING;
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
public int getMarginTop(GuiContainer gui)
|
|
|
|
|
{
|
2022-05-06 22:41:45 +03:00
|
|
|
return PADDING;
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
public int getWidth(GuiContainer gui)
|
|
|
|
|
{
|
2022-05-06 22:41:45 +03:00
|
|
|
return gui.width - (gui.xSize + gui.width) / 2 - PADDING * 2;
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
public int getHeight(GuiContainer gui)
|
|
|
|
|
{
|
2022-05-06 22:41:45 +03:00
|
|
|
return gui.height - getMarginTop(gui) - PADDING;
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
protected ItemStack getDraggedStackWithQuantity(int mouseDownSlot)
|
|
|
|
|
{
|
|
|
|
|
final ItemStack stack = grid.getItem(mouseDownSlot);
|
|
|
|
|
|
|
|
|
|
if (stack == null) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final BookmarkStackMeta meta = ((BookmarkGrid) grid).getMetadata(mouseDownSlot);
|
|
|
|
|
int amount = stack.stackSize;
|
|
|
|
|
|
|
|
|
|
if (meta.factor < 0 && !meta.fluidDisplay) {
|
|
|
|
|
amount = NEIClientConfig.getItemQuantity();
|
|
|
|
|
|
|
|
|
|
if (amount == 0) {
|
|
|
|
|
amount = stack.getMaxStackSize();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return NEIServerUtils.copyStack(stack, amount);
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-22 05:31:02 +02:00
|
|
|
@Override
|
|
|
|
|
public void mouseDragged(int mousex, int mousey, int button, long heldTime)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if (button == 0 && NEIClientUtils.shiftKey() && mouseDownSlot >= 0) {
|
|
|
|
|
ItemPanelSlot mouseOverSlot = getSlotMouseOver(mousex, mousey);
|
|
|
|
|
|
|
|
|
|
if (sortedStackIndex == -1) {
|
2022-01-02 23:30:54 +02:00
|
|
|
final ItemStack stack = grid.getItem(mouseDownSlot);
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
if (stack != null && (mouseOverSlot == null || mouseOverSlot.slotIndex != mouseDownSlot || heldTime > 250)) {
|
|
|
|
|
sortedNamespaceIndex = activeNamespaceIndex;
|
2021-11-22 05:31:02 +02:00
|
|
|
sortedStackIndex = mouseDownSlot;
|
2022-05-27 07:42:41 -04:00
|
|
|
grid.refreshBuffer = true;
|
2021-11-22 05:31:02 +02:00
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
} else {
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
if (mouseOverSlot == null && sortedNamespaceIndex != activeNamespaceIndex) {
|
|
|
|
|
mouseOverSlot = getNextSlot(mousex, mousey);
|
|
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
if (mouseOverSlot != null) {
|
|
|
|
|
|
|
|
|
|
if (sortedNamespaceIndex != activeNamespaceIndex) {
|
|
|
|
|
BookmarkGrid BGrid = namespaces.get(sortedNamespaceIndex);
|
|
|
|
|
BookmarkStackMeta meta = BGrid.getMetadata(sortedStackIndex);
|
|
|
|
|
ItemStack stack = BGrid.getItem(sortedStackIndex);
|
|
|
|
|
BGrid.removeItem(sortedStackIndex);
|
|
|
|
|
|
|
|
|
|
((BookmarkGrid) grid).addItem(stack, meta);
|
|
|
|
|
|
|
|
|
|
sortedNamespaceIndex = activeNamespaceIndex;
|
|
|
|
|
sortedStackIndex = grid.size() - 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mouseOverSlot.slotIndex != sortedStackIndex) {
|
|
|
|
|
((BookmarkGrid) grid).moveItem(sortedStackIndex, mouseOverSlot.slotIndex);
|
|
|
|
|
sortedStackIndex = mouseOverSlot.slotIndex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2021-11-22 05:31:02 +02:00
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
super.mouseDragged(mousex, mousey, button, heldTime);
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
private ItemPanelSlot getNextSlot(int mousex, int mousey)
|
|
|
|
|
{
|
|
|
|
|
int idx = grid.getPage() * grid.getPerPage() - grid.getPerPage();
|
|
|
|
|
int gSize = grid.size();
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < grid.getRows() * grid.getColumns() && idx <= gSize; i++) {
|
|
|
|
|
|
|
|
|
|
if (!grid.isInvalidSlot(i)) {
|
|
|
|
|
|
|
|
|
|
if (idx == gSize && grid.getSlotRect(i).contains(mousex, mousey)) {
|
|
|
|
|
return new ItemPanelSlot(idx, null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
idx++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void postDraw(int mousex, int mousey)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if (sortedStackIndex != -1) {
|
|
|
|
|
GuiContainerManager.drawItems.zLevel += 100;
|
|
|
|
|
GuiContainerManager.drawItem(mousex - 8, mousey - 8, namespaces.get(sortedNamespaceIndex).getItem(sortedStackIndex).copy(), true);
|
|
|
|
|
GuiContainerManager.drawItems.zLevel -= 100;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
super.postDraw(mousex, mousey);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2021-11-22 05:31:02 +02:00
|
|
|
@Override
|
|
|
|
|
public void mouseUp(int mousex, int mousey, int button)
|
|
|
|
|
{
|
2022-01-02 23:30:54 +02:00
|
|
|
if (sortedStackIndex != -1) {
|
2022-02-06 17:42:11 +02:00
|
|
|
draggedStack = null;
|
2022-01-02 23:30:54 +02:00
|
|
|
sortedNamespaceIndex = -1;
|
2021-11-22 05:31:02 +02:00
|
|
|
sortedStackIndex = -1;
|
|
|
|
|
mouseDownSlot = -1;
|
2022-05-27 07:42:41 -04:00
|
|
|
grid.refreshBuffer = true; /* make sure grid redraws the new item */
|
2021-11-22 05:31:02 +02:00
|
|
|
saveBookmarks();
|
|
|
|
|
} else {
|
|
|
|
|
super.mouseUp(mousex, mousey, button);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-02 23:30:54 +02:00
|
|
|
@Override
|
|
|
|
|
public boolean onMouseWheel(int shift, int mousex, int mousey)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if (new Rectangle4i(namespacePrev.x, namespacePrev.y, namespaceNext.x + namespaceNext.w - namespacePrev.x, namespacePrev.h).contains(mousex, mousey)) {
|
|
|
|
|
|
|
|
|
|
if (shift > 0) {
|
|
|
|
|
prevNamespace();
|
|
|
|
|
} else {
|
|
|
|
|
nextNamespace();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!contains(mousex, mousey)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (NEIClientUtils.controlKey()) {
|
|
|
|
|
final ItemPanelSlot slot = getSlotMouseOver(mousex, mousey);
|
|
|
|
|
|
|
|
|
|
if (slot != null) {
|
|
|
|
|
final BookmarkGrid BGrid = (BookmarkGrid)grid;
|
|
|
|
|
final BookmarkRecipeId recipeId = BGrid.getRecipeId(slot.slotIndex);
|
|
|
|
|
final boolean addFullRecipe = NEIClientUtils.shiftKey();
|
|
|
|
|
|
|
|
|
|
if (addFullRecipe) {
|
|
|
|
|
BookmarkStackMeta iMeta;
|
|
|
|
|
|
|
|
|
|
for (int slotIndex = grid.size() - 1; slotIndex >= 0; slotIndex--) {
|
|
|
|
|
iMeta = BGrid.getMetadata(slotIndex);
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
if (iMeta.recipeId != null && iMeta.recipeId.equals(recipeId) && slotIndex != slot.slotIndex) {
|
|
|
|
|
shiftStackSize(slotIndex, shift);
|
2022-01-02 23:30:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
shiftStackSize(slot.slotIndex, shift);
|
2022-01-02 23:30:54 +02:00
|
|
|
|
|
|
|
|
saveBookmarks();
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return super.onMouseWheel(shift, mousex, mousey);
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-06 22:41:45 +03:00
|
|
|
protected void shiftStackSize(int slotIndex, int shift)
|
|
|
|
|
{
|
|
|
|
|
final BookmarkGrid BGrid = (BookmarkGrid)grid;
|
|
|
|
|
final NBTTagCompound nbTag = StackInfo.itemStackToNBT(BGrid.getItem(slotIndex), true);
|
|
|
|
|
final BookmarkStackMeta meta = BGrid.getMetadata(slotIndex);
|
|
|
|
|
final int factor = Math.abs(meta.factor);
|
|
|
|
|
|
|
|
|
|
if (nbTag.getInteger("Count") == factor && meta.factor < 0 && shift > 0) {
|
|
|
|
|
meta.factor = factor;
|
|
|
|
|
} else {
|
|
|
|
|
meta.factor = nbTag.getInteger("Count") == factor && shift < 0? -1 * factor: factor;
|
|
|
|
|
nbTag.setInteger("Count", Math.max(nbTag.getInteger("Count") + factor * shift, factor));
|
|
|
|
|
BGrid.replaceItem(slotIndex, StackInfo.loadFromNBT(nbTag));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-24 13:37:41 -08:00
|
|
|
}
|