Compare commits

...
Author SHA1 Message Date
slprime fb9d517f78 Added keyboard shortcuts to NEI And More... (#271)
* Added keyboard shortcuts to NEI

* OptionButton: Add Tooltip to long prefix

* fix formatting

* Tooltip shown when shift is held
2022-08-19 14:03:42 +02:00
30 changed files with 756 additions and 306 deletions

No files matched your search

@@ -404,39 +404,39 @@ public class BookmarkPanel extends PanelWidget {
}
public void addOrRemoveItem(ItemStack stackA) {
addOrRemoveItem(stackA, "", null);
addOrRemoveItem(stackA, null, null, false, false);
}
public void addOrRemoveItem(ItemStack stackover, String handlerName, List<PositionedStack> ingredients) {
public void addOrRemoveItem(
ItemStack stackover,
final String handlerName,
final List<PositionedStack> ingredients,
boolean saveIngredients,
boolean saveStackSize) {
loadBookmarksIfNeeded();
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);
BGrid.removeRecipe(slot.slotIndex, saveIngredients);
} else {
final boolean saveStackSize = NEIClientUtils.controlKey();
final NBTTagCompound nbTagA = StackInfo.itemStackToNBT(stackover, saveStackSize);
final ItemStack normalizedA = StackInfo.loadFromNBT(nbTagA);
BookmarkRecipeId recipeId = null;
if (NEIClientConfig.saveCurrentRecipeInBookmarksEnabled()
&& handlerName != ""
&& ingredients != null
&& !ingredients.isEmpty()) {
if (handlerName != "" && ingredients != null && !ingredients.isEmpty()) {
recipeId = new BookmarkRecipeId(handlerName, ingredients);
}
final int idx = BGrid.indexOf(normalizedA, recipeId);
if (idx != -1) {
BGrid.removeRecipe(idx, addFullRecipe);
BGrid.removeRecipe(idx, saveIngredients);
} else {
if (addFullRecipe && handlerName != "" && ingredients != null && !ingredients.isEmpty()) {
if (saveIngredients && handlerName != "" && ingredients != null && !ingredients.isEmpty()) {
final Map<NBTTagCompound, Integer> unique = new HashMap<>();
final ArrayList<NBTTagCompound> sorted = new ArrayList<>();
@@ -448,18 +448,19 @@ public class BookmarkPanel extends PanelWidget {
if (unique.get(nbTag) == null) {
unique.put(nbTag, 1);
sorted.add(nbTag);
} else if (saveStackSize) {
} else {
unique.put(nbTag, unique.get(nbTag) + 1);
}
}
for (NBTTagCompound nbTag : sorted) {
nbTag.setInteger("Count", nbTag.getInteger("Count") * unique.get(nbTag));
final int count = nbTag.getInteger("Count") * unique.get(nbTag);
nbTag.setInteger("Count", count);
BGrid.addItem(
StackInfo.loadFromNBT(nbTag),
new BookmarkStackMeta(
recipeId,
(saveStackSize ? 1 : -1) * nbTag.getInteger("Count"),
recipeId != null ? recipeId.copy() : null,
(saveStackSize ? 1 : -1) * count,
true,
nbTag.hasKey("gtFluidName")));
}
@@ -479,15 +480,14 @@ public class BookmarkPanel extends PanelWidget {
saveBookmarks();
}
public BookmarkRecipeId getBookmarkRecipeId(int slotIndex) {
return ((BookmarkGrid) grid).getRecipeId(slotIndex);
}
public BookmarkRecipeId getBookmarkRecipeId(ItemStack stackA) {
BookmarkRecipeId mouseOverRecipeId = getBookmarkMouseOverRecipeId(stackA);
if (mouseOverRecipeId != null) return mouseOverRecipeId;
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);
@@ -497,23 +497,6 @@ public class BookmarkPanel extends PanelWidget {
return recipeId;
}
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);
}
protected String getNamespaceLabelText(boolean shortFormat) {
String activePage = String.valueOf(activeNamespaceIndex + 1);
@@ -868,7 +851,7 @@ public class BookmarkPanel extends PanelWidget {
int amount = stack.stackSize;
if (meta.factor < 0 && !meta.fluidDisplay) {
amount = NEIClientConfig.getItemQuantity();
amount = NEIClientConfig.showItemQuantityWidget() ? NEIClientConfig.getItemQuantity() : 0;
if (amount == 0) {
amount = stack.getMaxStackSize();
+6 -11
View File
@@ -9,9 +9,9 @@ import codechicken.lib.config.ConfigTag;
import codechicken.nei.KeyManager.IKeyStateTracker;
import codechicken.nei.api.ItemInfo;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.recipe.StackInfo;
import java.awt.Dimension;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderHelper;
@@ -39,17 +39,12 @@ public class HUDRenderer implements IKeyStateTracker {
&& mc.objectMouseOver != null
&& mc.objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {
World world = mc.theWorld;
ArrayList<ItemStack> items = ItemInfo.getIdentifierItems(world, mc.thePlayer, mc.objectMouseOver);
if (items.isEmpty()) return;
ItemStack[] items = ItemInfo.getIdentifierItems(world, mc.thePlayer, mc.objectMouseOver)
.toArray(new ItemStack[0]);
int minDamage = Integer.MAX_VALUE;
ItemStack stack = null;
for (ItemStack astack : items) {
if (astack.getItem() != null && astack.getItemDamage() < minDamage) {
stack = astack;
minDamage = stack.getItemDamage();
}
}
if (items.length == 0) return;
ItemStack stack = StackInfo.getItemStackWithMinimumDamage(items);
renderOverlay(stack, ItemInfo.getText(stack, world, mc.thePlayer, mc.objectMouseOver), getPositioning());
}
+4 -3
View File
@@ -27,7 +27,6 @@ public class ItemPanel extends PanelWidget {
// *looks angrily at AppleCore*
return super.getStackMouseOver(mousex, mousey);
}
;
public Button more;
public Button less;
@@ -155,6 +154,8 @@ public class ItemPanel extends PanelWidget {
}
protected int resizeFooter(GuiContainer gui) {
if (!NEIClientConfig.showItemQuantityWidget()) return 0;
final int BUTTON_SIZE = 16;
more.w = less.w = BUTTON_SIZE;
@@ -174,7 +175,7 @@ public class ItemPanel extends PanelWidget {
public void setVisible() {
super.setVisible();
if (grid.getPerPage() > 0) {
if (grid.getPerPage() > 0 && NEIClientConfig.showItemQuantityWidget()) {
LayoutManager.addWidget(more);
LayoutManager.addWidget(less);
LayoutManager.addWidget(quantity);
@@ -185,7 +186,7 @@ public class ItemPanel extends PanelWidget {
ItemStack stack = grid.getItem(mouseDownSlot);
if (stack != null) {
int amount = NEIClientConfig.getItemQuantity();
int amount = NEIClientConfig.showItemQuantityWidget() ? NEIClientConfig.getItemQuantity() : 0;
if (amount == 0) {
amount = stack.getMaxStackSize();
@@ -1,9 +1,12 @@
package codechicken.nei;
import static codechicken.nei.NEIClientUtils.translate;
public class ItemQuantityField extends TextField {
public ItemQuantityField(String ident) {
super(ident);
centered = true;
field.setDisabledTextColour(0xFF303030);
}
public int intValue() {
@@ -34,4 +37,18 @@ public class ItemQuantityField extends TextField {
public void onTextChange(String oldText) {
NEIClientUtils.setItemQuantity(intValue());
}
@Override
public void draw(int mousex, int mousey) {
if (!focused() && intValue() == 0) {
field.setText(translate("itempanel.quantity.default"));
field.setEnabled(false);
super.draw(mousex, mousey);
field.setEnabled(true);
field.setText("0");
} else {
super.draw(mousex, mousey);
}
}
}
+54 -36
View File
@@ -176,6 +176,18 @@ public class ItemsGrid {
}
}
public Rectangle4i getItemRect(int idx) {
final List<Integer> mask = getMask();
for (int i = 0; i < mask.size(); i++) {
if (mask.get(i) != null && idx == mask.get(i)) {
return getSlotRect(i);
}
}
return null;
}
public Rectangle4i getSlotRect(int i) {
return getSlotRect(i / columns, i % columns);
}
@@ -222,7 +234,7 @@ public class ItemsGrid {
GL11.glEnable(GL11.GL_BLEND);
OpenGlHelper.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
framebuffer.bindFramebufferTexture();
getFrameBuffer().bindFramebufferTexture();
GL11.glEnable(GL11.GL_TEXTURE_2D);
ScaledResolution res = new ScaledResolution(minecraft, minecraft.displayWidth, minecraft.displayHeight);
Tessellator tessellator = Tessellator.instance;
@@ -235,39 +247,17 @@ public class ItemsGrid {
OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
}
public void draw(int mousex, int mousey) {
if (getPerPage() == 0) {
return;
private Framebuffer getFrameBuffer() {
if (framebuffer == null) {
framebuffer = new Framebuffer(1, 1, true);
framebuffer.setFramebufferColor(0.0F, 0.0F, 0.0F, 0.0F);
}
boolean shouldCache = NEIClientConfig.shouldCacheItemRendering() && !PresetsWidget.inEditMode();
if (shouldCache) {
Minecraft minecraft = Minecraft.getMinecraft();
if (framebuffer == null) {
framebuffer = new Framebuffer(minecraft.displayWidth, minecraft.displayHeight, true);
framebuffer.framebufferColor[0] = 0.0F;
framebuffer.framebufferColor[1] = 0.0F;
framebuffer.framebufferColor[2] = 0.0F;
}
drawSlotOutlines(mousex, mousey);
if (refreshBuffer) {
framebuffer.createBindFramebuffer(minecraft.displayWidth, minecraft.displayHeight);
framebuffer.framebufferClear();
framebuffer.bindFramebuffer(false);
/* Set up some rendering state needed for items to work correctly */
GL11.glDisable(GL11.GL_BLEND);
GL11.glDepthMask(true);
OpenGlHelper.glBlendFunc(
GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
} else {
blitExistingBuffer();
return;
}
} else {
drawSlotOutlines(mousex, mousey);
}
return framebuffer;
}
private void drawItems() {
GuiContainerManager.enableMatrixStackLogging();
final List<Integer> mask = getMask();
@@ -278,11 +268,40 @@ public class ItemsGrid {
}
GuiContainerManager.disableMatrixStackLogging();
}
if (refreshBuffer && shouldCache) {
refreshBuffer = false;
Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false);
public void draw(int mousex, int mousey) {
if (getPerPage() == 0) {
return;
}
if (NEIClientConfig.shouldCacheItemRendering()) {
if (refreshBuffer) {
Minecraft minecraft = Minecraft.getMinecraft();
Framebuffer framebuffer = getFrameBuffer();
framebuffer.createBindFramebuffer(minecraft.displayWidth, minecraft.displayHeight);
framebuffer.framebufferClear();
framebuffer.bindFramebuffer(false);
/* Set up some rendering state needed for items to work correctly */
GL11.glDisable(GL11.GL_BLEND);
GL11.glDepthMask(true);
OpenGlHelper.glBlendFunc(
GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
drawItems();
Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false);
refreshBuffer = false;
}
drawSlotOutlines(mousex, mousey);
blitExistingBuffer();
} else {
drawSlotOutlines(mousex, mousey);
drawItems();
}
}
@@ -307,9 +326,8 @@ public class ItemsGrid {
if (mask.size() > slt && mask.get(slt) != null) {
final int idx = mask.get(slt);
final ItemStack stack = getItem(idx).copy();
return new ItemPanelSlot(idx, stack);
return new ItemPanelSlot(idx, getItem(idx));
}
return null;
@@ -3,7 +3,6 @@ package codechicken.nei;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map.Entry;
import org.lwjgl.input.Keyboard;
/**
* Good old down/held/up keystate tracker
@@ -24,9 +23,9 @@ public class KeyManager {
public static void tickKeyStates() {
for (Entry<String, KeyState> entry : keyStates.entrySet()) {
int keyCode = NEIClientConfig.getKeyBinding(entry.getKey());
boolean down = keyCode != 0 && Keyboard.isKeyDown(keyCode);
KeyState state = entry.getValue();
final boolean down = NEIClientConfig.isKeyHashDown(entry.getKey());
final KeyState state = entry.getValue();
if (down) {
state.down = !state.held;
state.up = false;
@@ -34,6 +33,7 @@ public class KeyManager {
state.up = state.held;
state.down = false;
}
state.held = down;
}
@@ -5,7 +5,6 @@ import static codechicken.lib.gui.GuiDraw.drawRect;
import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect;
import static codechicken.nei.NEIClientConfig.canPerformAction;
import static codechicken.nei.NEIClientConfig.disabledActions;
import static codechicken.nei.NEIClientConfig.getKeyBinding;
import static codechicken.nei.NEIClientConfig.getOptionList;
import static codechicken.nei.NEIClientConfig.getSearchExpression;
import static codechicken.nei.NEIClientConfig.hasSMPCounterPart;
@@ -88,7 +87,7 @@ public class LayoutManager
public static BookmarkPanel bookmarkPanel;
public static SubsetWidget dropDown;
public static PresetsWidget presetsPanel;
public static TextField searchField;
public static SearchField searchField;
public static ButtonCycled options;
public static ButtonCycled bookmarksButton;
@@ -209,11 +208,13 @@ public class LayoutManager
@Override
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyID) {
if (keyID == getKeyBinding("gui.hide")) {
if (NEIClientConfig.isKeyHashDown("gui.hide")) {
toggleBooleanSetting("inventory.hidden");
return true;
}
if (keyID == getKeyBinding("gui.hide_bookmarks")) {
if (NEIClientConfig.isKeyHashDown("gui.hide_bookmarks")) {
toggleBooleanSetting("inventory.bookmarksEnabled");
return true;
}
@@ -221,6 +222,7 @@ public class LayoutManager
if (isEnabled() && !isHidden()) {
for (Widget widget : controlWidgets) if (inputFocused == null) widget.lastKeyTyped(keyID, keyChar);
}
return false;
}
@@ -637,6 +639,7 @@ public class LayoutManager
addWidget(presetsPanel);
}
searchField.setVisible(visiblity.showSearchSection);
if (visiblity.showSearchSection) {
addWidget(searchField);
}
@@ -223,10 +223,6 @@ public class NEIClientConfig {
.setComment("Enable/disable bookmarks")
.getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.bookmarksEnabled", true));
tag.getTag("inventory.saveCurrentRecipeInBookmarksEnabled")
.setComment("Save Current Recipe in Bookmarks")
.getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.saveCurrentRecipeInBookmarksEnabled", true));
tag.getTag("inventory.useNBTInBookmarks")
.setComment("Use NBT in Bookmarks")
.getBooleanValue(true);
@@ -236,6 +232,11 @@ public class NEIClientConfig {
.getBooleanValue(false);
API.addOption(new OptionToggleButton("inventory.showRecipeMarker", true));
tag.getTag("inventory.showItemQuantityWidget")
.setComment("Show Item Quantity Widget")
.getBooleanValue(true);
API.addOption(new OptionToggleButton("inventory.showItemQuantityWidget", true));
tag.getTag("inventory.jei_style_tabs")
.setComment("Enable/disable JEI Style Tabs")
.getBooleanValue(true);
@@ -311,22 +312,29 @@ public class NEIClientConfig {
}
private static void setDefaultKeyBindings() {
API.addKeyBind("gui.recipe", Keyboard.KEY_R);
API.addKeyBind("gui.usage", Keyboard.KEY_U);
API.addHashBind("gui.recipe", Keyboard.KEY_R);
API.addHashBind("gui.usage", Keyboard.KEY_U);
API.addKeyBind("gui.back", Keyboard.KEY_BACK);
API.addKeyBind("gui.enchant", Keyboard.KEY_X);
API.addKeyBind("gui.potion", Keyboard.KEY_P);
API.addHashBind("gui.enchant", Keyboard.KEY_X);
API.addHashBind("gui.potion", Keyboard.KEY_P);
API.addKeyBind("gui.prev", Keyboard.KEY_PRIOR);
API.addKeyBind("gui.next", Keyboard.KEY_NEXT);
API.addKeyBind("gui.prev_machine", Keyboard.KEY_UP);
API.addKeyBind("gui.next_machine", Keyboard.KEY_DOWN);
API.addKeyBind("gui.prev_recipe", Keyboard.KEY_LEFT);
API.addKeyBind("gui.next_recipe", Keyboard.KEY_RIGHT);
API.addKeyBind("gui.hide", Keyboard.KEY_O);
API.addKeyBind("gui.search", Keyboard.KEY_F);
API.addKeyBind("gui.bookmark", Keyboard.KEY_A);
API.addKeyBind("gui.overlay", Keyboard.KEY_S);
API.addKeyBind("gui.hide_bookmarks", Keyboard.KEY_B);
API.addHashBind("gui.hide", Keyboard.KEY_O);
API.addHashBind("gui.search", Keyboard.KEY_F);
API.addHashBind("gui.bookmark", Keyboard.KEY_A);
API.addHashBind("gui.bookmark_recipe", Keyboard.KEY_A + NEIClientUtils.SHIFT_HASH);
API.addHashBind("gui.bookmark_count", Keyboard.KEY_A + NEIClientUtils.CTRL_HASH);
API.addHashBind(
"gui.bookmark_recipe_count", Keyboard.KEY_A + NEIClientUtils.SHIFT_HASH + NEIClientUtils.CTRL_HASH);
API.addHashBind("gui.overlay", Keyboard.KEY_S);
API.addHashBind("gui.overlay_use", Keyboard.KEY_S + NEIClientUtils.SHIFT_HASH);
API.addHashBind("gui.overlay_hide", Keyboard.KEY_S + NEIClientUtils.CTRL_HASH);
API.addHashBind("gui.hide_bookmarks", Keyboard.KEY_B);
API.addKeyBind("world.chunkoverlay", Keyboard.KEY_F9);
API.addKeyBind("world.moboverlay", Keyboard.KEY_F7);
API.addKeyBind("world.highlight_tips", Keyboard.KEY_NUMPAD0);
@@ -398,6 +406,11 @@ public class NEIClientConfig {
getSetting("keys." + string).getIntValue(key);
}
public static boolean isKeyHashDown(String string) {
final int hash = getKeyBinding(string);
return hash != Keyboard.CHAR_NONE && hash == NEIClientUtils.getKeyHash();
}
public static void bootNEI(World world) {
if (configLoaded) return;
@@ -475,10 +488,6 @@ public class NEIClientConfig {
return !getBooleanSetting("inventory.bookmarksEnabled");
}
public static boolean saveCurrentRecipeInBookmarksEnabled() {
return getBooleanSetting("inventory.saveCurrentRecipeInBookmarksEnabled");
}
public static boolean useNBTInBookmarks() {
return getBooleanSetting("inventory.useNBTInBookmarks");
}
@@ -487,6 +496,10 @@ public class NEIClientConfig {
return getBooleanSetting("inventory.showRecipeMarker");
}
public static boolean showItemQuantityWidget() {
return getBooleanSetting("inventory.showItemQuantityWidget");
}
public static boolean areJEIStyleTabsVisible() {
return getBooleanSetting("inventory.jei_style_tabs");
}
@@ -15,16 +15,24 @@ import codechicken.nei.api.GuiInfo;
import codechicken.nei.api.IInfiniteItemHandler;
import codechicken.nei.api.ItemInfo;
import com.google.common.collect.Iterables;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
@@ -38,6 +46,13 @@ import org.lwjgl.input.Keyboard;
public class NEIClientUtils extends NEIServerUtils {
public static LangProxy lang = new LangProxy("nei");
/** Formats a number with group separator and at most 2 fraction digits. */
private static final Map<Locale, DecimalFormat> decimalFormatters = new HashMap<>();
public static final int ALT_HASH = 1 << 27;
public static final int SHIFT_HASH = 1 << 26;
public static final int CTRL_HASH = 1 << 25;
public static Minecraft mc() {
return Minecraft.getMinecraft();
}
@@ -50,6 +65,32 @@ public class NEIClientUtils extends NEIServerUtils {
if (mc().ingameGUI != null) mc().ingameGUI.getChatGUI().printChatMessage(msg);
}
private static DecimalFormat getDecimalFormat() {
return decimalFormatters.computeIfAbsent(Locale.getDefault(Locale.Category.FORMAT), locale -> {
DecimalFormat numberFormat = new DecimalFormat(); // uses the necessary locale inside anyway
numberFormat.setGroupingUsed(true);
numberFormat.setMaximumFractionDigits(2);
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
DecimalFormatSymbols decimalFormatSymbols = numberFormat.getDecimalFormatSymbols();
decimalFormatSymbols.setGroupingSeparator(','); // Use sensible separator for best clarity.
numberFormat.setDecimalFormatSymbols(decimalFormatSymbols);
return numberFormat;
});
}
public static String formatNumbers(BigInteger aNumber) {
return getDecimalFormat().format(aNumber);
}
public static String formatNumbers(long aNumber) {
return getDecimalFormat().format(aNumber);
}
public static String formatNumbers(double aNumber) {
return getDecimalFormat().format(aNumber);
}
public static void deleteHeldItem() {
deleteSlotStack(-999);
}
@@ -319,6 +360,24 @@ public class NEIClientUtils extends NEIServerUtils {
return concatIntegersToRanges(damages);
}
public static String cropText(FontRenderer fontRenderer, String text, int containerWidth) {
int textWidth = fontRenderer.getStringWidth(text);
if (textWidth > containerWidth) {
textWidth += fontRenderer.getStringWidth("...");
while (textWidth > containerWidth) {
textWidth -= fontRenderer.getCharWidth(text.charAt(text.length() - 1));
text = text.substring(0, text.length() - 1);
}
return text + "...";
}
return text;
}
public static boolean safeKeyDown(int keyCode) {
try {
return Keyboard.isKeyDown(keyCode);
@@ -342,6 +401,46 @@ public class NEIClientUtils extends NEIServerUtils {
return Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU);
}
public static int getMetaHash() {
if (Keyboard.getEventKeyState()) {
int hash = 0;
if (altKey()) {
hash = hash | ALT_HASH;
}
if (shiftKey()) {
hash = hash | SHIFT_HASH;
}
if (controlKey()) {
hash = hash | CTRL_HASH;
}
return hash;
}
return 0;
}
public static int getKeyHash() {
if (Keyboard.getEventKeyState()) {
final int keycode = Keyboard.getEventKey();
if (keycode != Keyboard.KEY_LSHIFT
&& keycode != Keyboard.KEY_RSHIFT
&& keycode != Keyboard.KEY_LCONTROL
&& keycode != Keyboard.KEY_RCONTROL
&& keycode != Keyboard.KEY_LMENU
&& keycode != Keyboard.KEY_RMENU) {
return getMetaHash() + keycode;
}
}
return Keyboard.CHAR_NONE;
}
public static void playClickSound() {
mc().getSoundHandler()
.playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
+26 -12
View File
@@ -206,10 +206,15 @@ public abstract class PanelWidget extends Widget {
return false;
}
if (NEIClientConfig.canPerformAction("delete") && NEIClientConfig.canPerformAction("item"))
if (button == 1) NEIClientUtils.decreaseSlotStack(-999);
else NEIClientUtils.deleteHeldItem();
else NEIClientUtils.dropHeldItem();
if (NEIClientConfig.canPerformAction("delete") && NEIClientConfig.canPerformAction("item")) {
if (button == 1) {
NEIClientUtils.decreaseSlotStack(-999);
} else {
NEIClientUtils.deleteHeldItem();
}
} else {
NEIClientUtils.dropHeldItem();
}
return true;
}
@@ -243,6 +248,11 @@ public abstract class PanelWidget extends Widget {
return ItemPanels.bookmarkPanel.handleDraggedClick(mouseX, mouseY, button);
}
if (NEIClientUtils.getHeldItem() != null) {
final ItemStack draggedStack = NEIClientUtils.getHeldItem().copy();
return handleGUIContainerClick(draggedStack, mouseX, mouseY, button);
}
return false;
}
@@ -251,7 +261,12 @@ public abstract class PanelWidget extends Widget {
return false;
}
if (handleGUIContainerClick(mouseX, mouseY, button)) {
if (handleGUIContainerClick(draggedStack, mouseX, mouseY, button)) {
if (draggedStack.stackSize == 0) {
draggedStack = null;
}
return true;
}
@@ -266,7 +281,7 @@ public abstract class PanelWidget extends Widget {
return true;
}
protected boolean handleGUIContainerClick(int mouseX, int mouseY, int button) {
protected boolean handleGUIContainerClick(final ItemStack draggedStack, int mouseX, int mouseY, int button) {
final GuiContainer gui = NEIClientUtils.getGuiContainer();
boolean handled = false;
@@ -274,6 +289,9 @@ public abstract class PanelWidget extends Widget {
GuiInfo.readLock.lock();
for (INEIGuiHandler handler : GuiInfo.guiHandlers) {
if (handler.handleDragNDrop(gui, mouseX, mouseY, draggedStack, button)) {
NEIClientConfig.logger.info(handler);
handled = true;
break;
}
@@ -282,10 +300,6 @@ public abstract class PanelWidget extends Widget {
GuiInfo.readLock.unlock();
}
if (draggedStack.stackSize == 0) {
draggedStack = null;
}
return handled;
}
@@ -325,12 +339,12 @@ public abstract class PanelWidget extends Widget {
@Override
public boolean handleKeyPress(int keyID, char keyChar) {
if (keyID == NEIClientConfig.getKeyBinding("gui.next")) {
if (NEIClientConfig.isKeyHashDown("gui.next")) {
grid.shiftPage(1);
return true;
}
if (keyID == NEIClientConfig.getKeyBinding("gui.prev")) {
if (NEIClientConfig.isKeyHashDown("gui.prev")) {
grid.shiftPage(-1);
return true;
}
@@ -1,7 +1,6 @@
package codechicken.nei;
import static codechicken.nei.NEIClientConfig.canPerformAction;
import static codechicken.nei.NEIClientConfig.getKeyBinding;
import codechicken.nei.guihook.IContainerInputHandler;
import net.minecraft.client.gui.inventory.GuiContainer;
@@ -22,14 +21,17 @@ public class PopupInputHandler implements IContainerInputHandler {
@Override
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyID) {
if (keyID == getKeyBinding("gui.enchant") && canPerformAction("enchant")) {
if (NEIClientConfig.isKeyHashDown("gui.enchant") && canPerformAction("enchant")) {
NEICPH.sendOpenEnchantmentWindow();
return true;
}
if (keyID == getKeyBinding("gui.potion") && canPerformAction("potion")) {
if (NEIClientConfig.isKeyHashDown("gui.potion") && canPerformAction("potion")) {
NEICPH.sendOpenPotionWindow();
return true;
}
return false;
}
@@ -312,7 +312,7 @@ public class PresetsWidget extends Widget {
final int directionState = direction.contains(x + mx, y + my) ? 1 : 2;
final int deleteState = delete.contains(x + mx, y + my) ? 1 : 2;
final String displayName = cropText(tag.displayName, option.w - 6);
final String displayName = NEIClientUtils.cropText(fontRenderer, tag.displayName, option.w - 6);
final String dirName =
tag.whitelist ? translate("presets.whitelist.label") : translate("presets.blacklist.label");
@@ -416,7 +416,7 @@ public class PresetsWidget extends Widget {
public MouseSelection(int slotIndex, boolean append) {
final ItemsGrid grid = ItemPanels.itemPanel.getGrid();
final Rectangle4i rec = grid.getSlotRect(slotIndex - (grid.getPage() - 1) * grid.getPerPage());
final Rectangle4i rec = grid.getItemRect(slotIndex);
this.append = append;
endIndex = slotIndex;
@@ -456,7 +456,7 @@ public class PresetsWidget extends Widget {
@Override
public void draw(int mousex, int mousey) {
final String text = cropText(this.text, w);
final String text = NEIClientUtils.cropText(fontRenderer, this.text, w);
if (text.equals(this.text)) {
GuiDraw.drawString(text, x + w - fontRenderer.getStringWidth(text), y + (h - 8) / 2, colour);
@@ -535,24 +535,6 @@ public class PresetsWidget extends Widget {
}
};
protected static String cropText(String text, int containerWidth) {
int textWidth = fontRenderer.getStringWidth(text);
if (textWidth > containerWidth) {
textWidth += fontRenderer.getStringWidth("...");
while (textWidth > containerWidth) {
textWidth -= fontRenderer.getCharWidth(text.charAt(text.length() - 1));
text = text.substring(0, text.length() - 1);
}
return text + "...";
}
return text;
}
protected static void setEditedTag(final PresetTag tag) {
edit = tag;
openListBox = false;
@@ -832,7 +814,7 @@ public class PresetsWidget extends Widget {
mouseSelection.endIndex = slot.slotIndex;
mouseSelection.items.clear();
final Rectangle4i rec = grid.getSlotRect(slot.slotIndex - (grid.getPage() - 1) * grid.getPerPage());
final Rectangle4i rec = grid.getItemRect(slot.slotIndex);
final Rectangle4i sel = new Rectangle4i(
Math.min(rec.x, mouseSelection.startX),
Math.min(rec.y, mouseSelection.startY),
+13 -1
View File
@@ -45,6 +45,7 @@ public class SearchField extends TextField implements ItemFilterProvider {
}
public static List<ISearchProvider> searchProviders = new LinkedList<>();
private boolean isVisible = true;
long lastclicktime;
@@ -58,6 +59,14 @@ public class SearchField extends TextField implements ItemFilterProvider {
return world.nbt.getBoolean("searchinventories");
}
public boolean isVisible() {
return isVisible;
}
public void setVisible(boolean visible) {
isVisible = visible;
}
@Override
public int getTextColour() {
if (ItemPanels.itemPanel.getItems().isEmpty()) {
@@ -103,7 +112,10 @@ public class SearchField extends TextField implements ItemFilterProvider {
@Override
public void lastKeyTyped(int keyID, char keyChar) {
if (keyID == NEIClientConfig.getKeyBinding("gui.search")) setFocus(true);
if (isVisible() && NEIClientConfig.isKeyHashDown("gui.search")) {
setFocus(true);
}
}
@Override
@@ -171,6 +171,16 @@ public class API {
addOption(new OptionKeyBind(ident));
}
/**
* Add a custom KeyBinding to be configured in the Controls menu.
* @param ident An identifier for your key, eg "shoot"
* @param defaultKey The default value, commonly obtained from {@link Keyboard}
*/
public static void addHashBind(String ident, int defaultKey) {
NEIClientConfig.setDefaultKeyBinding(ident, defaultKey);
addOption(new OptionKeyBind(ident, true));
}
public static void addOption(Option option) {
NEIClientConfig.getOptionList().addOption(option);
}
@@ -178,7 +178,7 @@ public class ItemInfo {
API.addOption(new RegistryDumper<Item>("tools.dump.item") {
@Override
public String[] header() {
return new String[] {"Name", "ID", "Has Block", "Mod", "Class"};
return new String[] {"Name", "ID", "Has Block", "Mod", "Class", "Display Name"};
}
@Override
@@ -188,7 +188,9 @@ public class ItemInfo {
Integer.toString(id),
Boolean.toString(Block.getBlockFromItem(item) != Blocks.air),
ItemInfo.itemOwners.get(item),
item.getClass().getCanonicalName()
item.getClass().getCanonicalName(),
EnumChatFormatting.getTextWithoutFormattingCodes(
GuiContainerManager.itemDisplayNameShort(new ItemStack(item)))
};
}
@@ -200,17 +202,22 @@ public class ItemInfo {
API.addOption(new RegistryDumper<Block>("tools.dump.block") {
@Override
public String[] header() {
return new String[] {"Name", "ID", "Has Item", "Mod", "Class"};
return new String[] {"Name", "ID", "Has Item", "Mod", "Class", "Display Name"};
}
@Override
public String[] dump(Block item, int id, String name) {
public String[] dump(Block block, int id, String name) {
final Item item = Item.getItemFromBlock(block);
return new String[] {
name,
Integer.toString(id),
Boolean.toString(Item.getItemFromBlock(item) != null),
ItemInfo.itemOwners.get(item),
item.getClass().getCanonicalName()
Boolean.toString(item != null),
ItemInfo.itemOwners.get(block),
block.getClass().getCanonicalName(),
item != null
? EnumChatFormatting.getTextWithoutFormattingCodes(
GuiContainerManager.itemDisplayNameShort(new ItemStack(item)))
: "null"
};
}
@@ -20,6 +20,7 @@ import java.util.LinkedList;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
public class GuiOptionList extends GuiScreenWidget {
@@ -119,12 +120,16 @@ public class GuiOptionList extends GuiScreenWidget {
o.copyGlobals();
Option.playClickSound();
}
} else if (slotBounds(slot).contains(mx, my)) options.get(slot).mouseClicked(mx - 24, my - 2, button);
} else if (slotBounds(slot).contains(mx, my)) {
options.get(slot).mouseClicked(mx - 24, my - 2, button);
}
}
@Override
public void mouseClicked(int mx, int my, int button) {
for (Option o : options) o.onMouseClicked(mx, my, button);
for (Option o : options) {
o.onMouseClicked(mx, my, button);
}
super.mouseClicked(mx, my, button);
}
@@ -247,8 +252,7 @@ public class GuiOptionList extends GuiScreenWidget {
@Override
public void keyTyped(char c, int keycode) {
if (keycode == 1) // esc
{
if (keycode == Keyboard.KEY_ESCAPE) {
GuiScreen p = parent;
while (p instanceof GuiOptionList) p = ((GuiOptionList) p).parent;
@@ -6,8 +6,10 @@ import static codechicken.lib.gui.GuiDraw.drawStringC;
import static codechicken.lib.gui.GuiDraw.getStringWidth;
import codechicken.nei.LayoutManager;
import codechicken.nei.NEIClientUtils;
import java.awt.Rectangle;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
@@ -53,7 +55,7 @@ public abstract class OptionButton extends Option {
public Rectangle buttonSize() {
if (getPrefix() == null) return new Rectangle(0, 0, slot.slotWidth(), 20);
int width = Math.max(60, getStringWidth(getButtonText()));
int width = Math.max(60, getStringWidth(getButtonText()) + 8);
return new Rectangle(slot.slotWidth() - width, 0, width, 20);
}
@@ -69,14 +71,34 @@ public abstract class OptionButton extends Option {
}
public String getTooltip() {
if (tooltip == null) return null;
String s = translateN(tooltip);
if (s.equals(namespaced(tooltip))) return null;
return s;
String tip = null;
if (tooltip != null) {
String s = translateN(tooltip);
if (!s.equals(namespaced(tooltip))) {
tip = s;
}
}
if (tip == null && getPrefix() != null) {
final int width = getStringWidth(getPrefix());
final Rectangle b = buttonSize();
if (width >= b.x) {
tip = translateN(name);
}
}
return tip;
}
public void drawPrefix() {
if (getPrefix() != null) drawString(getPrefix(), 10, 6, -1);
final String prefix = getPrefix();
if (prefix != null) {
final Rectangle b = buttonSize();
drawString(NEIClientUtils.cropText(Minecraft.getMinecraft().fontRenderer, prefix, b.x - 10), 10, 6, -1);
}
}
public void drawButton(int mx, int my) {
@@ -1,46 +1,94 @@
package codechicken.nei.config;
import static codechicken.lib.gui.GuiDraw.drawRect;
import static codechicken.lib.gui.GuiDraw.drawStringC;
import codechicken.nei.NEIClientUtils;
import java.awt.Rectangle;
import net.minecraft.client.Minecraft;
import net.minecraft.util.EnumChatFormatting;
import org.lwjgl.input.Keyboard;
public class OptionKeyBind extends OptionButton {
private boolean hasFocus = false;
private boolean editing = false;
private boolean useHash = false;
private int keyboard = Keyboard.CHAR_NONE;
public OptionKeyBind(String name) {
this(name, false);
}
public OptionKeyBind(final String name, final boolean useHash) {
super("keys." + name);
this.useHash = useHash;
}
@Override
public void onMouseClicked(int mousex, int mousey, int button) {
hasFocus = false;
if (editing) {
resetChanges();
}
}
@Override
public void keyTyped(char c, int keycode) {
if (hasFocus) {
setValue(keycode);
hasFocus = false;
if (!editing) {
return;
}
if (keycode == Keyboard.KEY_RETURN) {
applyChanges();
return;
}
keyboard = useHash ? NEIClientUtils.getKeyHash() : keycode;
if (keyboard != Keyboard.CHAR_NONE) {
applyChanges();
}
}
@Override
public boolean onClick(int button) {
if (button == 0) {
hasFocus = true;
return true;
}
if (button == 1 && getValue() != 0) {
setValue(0);
public boolean onClick(int btn) {
if (editing) {
return true;
} else if (btn == 0) {
editing = true;
return true;
} else if (btn == 1) {
keyboard = Keyboard.CHAR_NONE;
applyChanges();
return true;
}
return false;
}
public boolean conflicted() {
if (getValue() == 0) return false;
protected void applyChanges() {
setValue(keyboard);
resetChanges();
}
for (Option o : slot.options)
if (o instanceof OptionKeyBind && o != this && ((OptionKeyBind) o).getValue() == getValue()) return true;
protected void resetChanges() {
editing = false;
keyboard = Keyboard.CHAR_NONE;
}
public boolean conflicted() {
final int keyboard = getValue();
if (keyboard <= 0) {
return false;
}
for (Option o : slot.options) {
if (o instanceof OptionKeyBind && o != this && ((OptionKeyBind) o).getValue() == keyboard) {
return true;
}
}
return false;
}
@@ -58,19 +106,50 @@ public class OptionKeyBind extends OptionButton {
return translateN(name);
}
@Override
public void drawButton(int mx, int my) {
if (editing) {
Rectangle b = buttonSize();
drawRect(b.x, b.y, b.width, b.height, -6250336);
drawRect(b.x + 1, b.y + 1, b.width - 2, b.height - 2, -16777216);
drawStringC(getButtonText(), b.x, b.y, b.width, b.height, getTextColour(mx, my));
} else {
super.drawButton(mx, my);
}
}
@Override
public String getButtonText() {
if (hasFocus)
return EnumChatFormatting.WHITE + "> " + EnumChatFormatting.YELLOW + "??? " + EnumChatFormatting.WHITE
+ "<";
String keyText = "";
if (conflicted()) return EnumChatFormatting.RED + Keyboard.getKeyName(getValue());
if (useHash) {
final int metahash = Math.max(editing ? NEIClientUtils.getMetaHash() : getValue(), 0);
final String DELIMITER = EnumChatFormatting.GRAY + " + " + EnumChatFormatting.RESET;
return Keyboard.getKeyName(getValue());
if ((metahash & NEIClientUtils.CTRL_HASH) == NEIClientUtils.CTRL_HASH) {
keyText += NEIClientUtils.translate(Minecraft.isRunningOnMac ? "key.ctrl.mac" : "key.ctrl") + DELIMITER;
}
if ((metahash & NEIClientUtils.SHIFT_HASH) == NEIClientUtils.SHIFT_HASH) {
keyText += "SHIFT" + DELIMITER;
}
if ((metahash & NEIClientUtils.ALT_HASH) == NEIClientUtils.ALT_HASH) {
keyText += "ALT" + DELIMITER;
}
}
if (!editing) {
keyText += Keyboard.getKeyName(
getValue() & ~(NEIClientUtils.CTRL_HASH | NEIClientUtils.SHIFT_HASH | NEIClientUtils.ALT_HASH));
}
return keyText;
}
@Override
public int getTextColour(int mousex, int mousey) {
return -1;
return !editing && conflicted() ? 0xFFFF6666 : -1;
}
}
@@ -6,6 +6,8 @@ import static codechicken.lib.gui.GuiDraw.getMousePosition;
import static codechicken.lib.gui.GuiDraw.renderEngine;
import codechicken.lib.gui.GuiDraw;
import codechicken.nei.NEIClientUtils;
import codechicken.nei.recipe.StackInfo;
import java.awt.Point;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -26,6 +28,7 @@ import net.minecraft.init.Blocks;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.fluids.FluidStack;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
@@ -143,11 +146,50 @@ public class GuiContainerManager {
}
namelist.set(0, stack.getRarity().rarityColor.toString() + namelist.get(0));
for (int i = 1; i < namelist.size(); i++) namelist.set(i, "\u00a77" + namelist.get(i));
for (int i = 1; i < namelist.size(); i++) {
namelist.set(i, EnumChatFormatting.GRAY + namelist.get(i) + EnumChatFormatting.RESET);
}
return namelist;
}
protected static String itemCountDetails(ItemStack stack) {
final FluidStack fluid = StackInfo.getFluid(stack);
int maxStackSize = stack.getMaxStackSize();
int stackSize = stack.stackSize;
String FULL_PATTERN = "Count: %s = %s * %s + %s";
String SHORT_PATTERN = "Count: %s = %s * %s";
if (fluid != null) {
maxStackSize = 144;
stackSize = fluid.amount * Math.max(1, stack.stackSize);
FULL_PATTERN = "Amount: %s L = %s * %s L + %s L";
SHORT_PATTERN = "Amount: %s L = %s * %s L";
}
if (maxStackSize > 1 && stackSize > maxStackSize) {
final int remainder = stackSize % maxStackSize;
if (remainder > 0) {
return String.format(
FULL_PATTERN,
NEIClientUtils.formatNumbers(stackSize),
NEIClientUtils.formatNumbers(stackSize / maxStackSize),
NEIClientUtils.formatNumbers(maxStackSize),
NEIClientUtils.formatNumbers(remainder));
} else {
return String.format(
SHORT_PATTERN,
NEIClientUtils.formatNumbers(stackSize),
NEIClientUtils.formatNumbers(stackSize / maxStackSize),
NEIClientUtils.formatNumbers(maxStackSize));
}
}
return null;
}
/**
* The general name of this item.
*
@@ -203,7 +245,7 @@ public class GuiContainerManager {
int i, int j, ItemStack itemstack, FontRenderer fontRenderer, boolean smallAmount, String stackSize) {
enable3DRender();
// for lighting correction
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
boolean glRescale = GL11.glGetBoolean(GL12.GL_RESCALE_NORMAL);
float zLevel = drawItems.zLevel += 100F;
try {
@@ -244,7 +286,12 @@ public class GuiContainerManager {
drawItems.renderItemIntoGUI(fontRenderer, renderEngine, new ItemStack(Blocks.fire), i, j);
}
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
if (glRescale) {
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
} else {
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
}
enable2DRender();
drawItems.zLevel = zLevel - 100;
}
@@ -439,7 +486,17 @@ public class GuiContainerManager {
if (tooltip.isEmpty() && shouldShowTooltip(window)) { // mouseover tip, not holding an item
ItemStack stack = getStackMouseOver(window);
font = getFontRenderer(stack);
if (stack != null) tooltip = itemDisplayNameMultiline(stack, window, true);
if (stack != null) {
tooltip = itemDisplayNameMultiline(stack, window, true);
if (stack.stackSize != Integer.MAX_VALUE && NEIClientUtils.shiftKey()) {
final String itemCount = itemCountDetails(stack);
if (itemCount != null) {
tooltip.add(String.format(EnumChatFormatting.GRAY + itemCount + EnumChatFormatting.RESET));
}
}
}
synchronized (instanceTooltipHandlers) {
for (IContainerTooltipHandler handler : instanceTooltipHandlers)
@@ -520,10 +577,25 @@ public class GuiContainerManager {
* Delegate for changing item rendering for certain slots. Eg. Shrinking text for large itemstacks
*/
public void drawSlotItem(Slot slot, ItemStack stack, int x, int y, String quantity) {
if (window instanceof IGuiSlotDraw) ((IGuiSlotDraw) window).drawSlotItem(slot, stack, x, y, quantity);
else {
drawItems.renderItemAndEffectIntoGUI(fontRenderer, window.mc.getTextureManager(), stack, x, y);
drawItems.renderItemOverlayIntoGUI(fontRenderer, window.mc.getTextureManager(), stack, x, y, quantity);
// for lighting correction
boolean glRescale = GL11.glGetBoolean(GL12.GL_RESCALE_NORMAL);
if (window instanceof IGuiSlotDraw) {
((IGuiSlotDraw) window).drawSlotItem(slot, stack, x, y, quantity);
} else {
if (quantity == null) {
quantity = stack != null && stack.stackSize > 1 ? String.valueOf(stack.stackSize) : "";
}
drawItems.renderItemAndEffectIntoGUI(fontRenderer, renderEngine, stack, x, y);
drawItems.renderItemOverlayIntoGUI(fontRenderer, renderEngine, stack, x, y, quantity);
}
if (glRescale) {
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
} else {
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
}
}
@@ -27,7 +27,7 @@ public class BookmarkRecipeId {
for (Object pos : stacks) {
if (pos instanceof PositionedStack) {
pos = getItemStackWithMinimumDamage(((PositionedStack) pos).items);
pos = StackInfo.getItemStackWithMinimumDamage(((PositionedStack) pos).items);
}
if (pos instanceof ItemStack) {
@@ -67,7 +67,8 @@ public class BookmarkRecipeId {
Short idx = 0;
for (PositionedStack pStack : stacks) {
final NBTTagCompound tagCompoundA = StackInfo.itemStackToNBT(getItemStackWithMinimumDamage(pStack.items));
final NBTTagCompound tagCompoundA =
StackInfo.itemStackToNBT(StackInfo.getItemStackWithMinimumDamage(pStack.items));
final NBTTagCompound tagCompoundB = ingredients.get(idx);
if (tagCompoundB == null || !tagCompoundB.equals(tagCompoundA)) {
@@ -80,22 +81,6 @@ public class BookmarkRecipeId {
return true;
}
public ItemStack getItemStackWithMinimumDamage(ItemStack[] stacks) {
int damage = Short.MAX_VALUE;
ItemStack result = stacks[0];
if (stacks.length > 1) {
for (ItemStack stack : stacks) {
if (stack.getItemDamage() < damage) {
damage = stack.getItemDamage();
result = stack;
}
}
}
return result.copy();
}
public JsonObject toJsonObject() {
JsonObject json = new JsonObject();
@@ -15,7 +15,7 @@ public class CheatItemHandler extends INEIGuiAdapter {
public boolean handleDragNDrop(GuiContainer gui, int mouseX, int mouseY, ItemStack draggedStack, int button) {
final Slot overSlot = gui.getSlotAtPosition(mouseX, mouseY);
if (overSlot != null && overSlot.isItemValid(draggedStack)) {
if (overSlot != null && overSlot.isItemValid(draggedStack) && NEIClientUtils.getHeldItem() == null) {
if (NEIClientConfig.canCheatItem(draggedStack)) {
int contents = overSlot.getHasStack() ? overSlot.getStack().stackSize : 0;
@@ -84,8 +84,12 @@ public class ContainerRecipe extends Container {
ItemStack stack = recipeInventory.getStackInSlot(slot);
if (stack != null) {
if (button == 0) GuiCraftingRecipe.openRecipeGui("item", stack);
else if (button == 1) GuiUsageRecipe.openRecipeGui("item", stack);
if (button == 0) {
GuiCraftingRecipe.openRecipeGui("item", stack);
} else if (button == 1) {
GuiUsageRecipe.openRecipeGui("item", stack);
}
}
return null;
}
@@ -1,9 +1,13 @@
package codechicken.nei.recipe;
import static codechicken.lib.gui.GuiDraw.getMousePosition;
import codechicken.nei.ItemPanel.ItemPanelSlot;
import codechicken.nei.ItemPanels;
import codechicken.nei.NEIClientConfig;
import codechicken.nei.NEIClientUtils;
import codechicken.nei.PositionedStack;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.client.Minecraft;
@@ -15,36 +19,41 @@ public class GuiCraftingRecipe extends GuiRecipe<ICraftingHandler> {
public static ArrayList<ICraftingHandler> serialCraftingHandlers = new ArrayList<>();
public static boolean openRecipeGui(String outputId, Object... results) {
return openRecipeGui(outputId, false, results);
return openRecipeGui(outputId, false, false, results);
}
public static boolean openRecipeGui(String outputId, Boolean overlay, Object... results) {
RecipeHandlerQuery<ICraftingHandler> recipeQuery = new RecipeHandlerQuery<>(
h -> h.getRecipeHandler(outputId, results), craftinghandlers, serialCraftingHandlers);
ArrayList<ICraftingHandler> handlers = recipeQuery.runWithProfiling("recipe.concurrent.crafting");
if (handlers.isEmpty()) return false;
public static boolean openRecipeGui(
String outputId, final Boolean overlay, final Boolean shift, Object... results) {
final Minecraft mc = NEIClientUtils.mc();
Minecraft mc = NEIClientUtils.mc();
BookmarkRecipeId recipeId = (NEIClientConfig.saveCurrentRecipeInBookmarksEnabled() && "item".equals(outputId))
final BookmarkRecipeId recipeId = "item".equals(outputId)
? getRecipeId(mc.currentScreen, (ItemStack) results[0])
: getCurrentRecipe();
: getCurrentRecipe(mc.currentScreen);
if (overlay && recipeId == null) return false;
GuiCraftingRecipe gui = new GuiCraftingRecipe(handlers, recipeId);
final RecipeHandlerQuery<ICraftingHandler> recipeQuery = new RecipeHandlerQuery<>(
h -> h.getRecipeHandler(outputId, results), craftinghandlers, serialCraftingHandlers);
mc.displayGuiScreen(gui);
final ArrayList<ICraftingHandler> handlers = recipeQuery.runWithProfiling("recipe.concurrent.crafting");
if (recipeId != null && (!NEIClientUtils.shiftKey() || overlay)) {
gui.openTargetRecipe(gui.recipeId);
if (!handlers.isEmpty()) {
GuiCraftingRecipe gui = new GuiCraftingRecipe(handlers, recipeId);
mc.displayGuiScreen(gui);
if (recipeId != null) {
gui.openTargetRecipe(gui.recipeId);
}
if (overlay) {
gui.overlayRecipe(gui.recipeId.position, shift);
}
return true;
}
if (overlay) {
gui.overlayRecipe(gui.recipeId.position);
}
return true;
return false;
}
protected static BookmarkRecipeId getRecipeId(GuiScreen gui, ItemStack stackover) {
@@ -58,6 +67,13 @@ public class GuiCraftingRecipe extends GuiRecipe<ICraftingHandler> {
}
}
final Point mouseover = getMousePosition();
ItemPanelSlot panelSlot = ItemPanels.bookmarkPanel.getSlotMouseOver(mouseover.x, mouseover.y);
if (panelSlot != null) {
return ItemPanels.bookmarkPanel.getBookmarkRecipeId(panelSlot.slotIndex);
}
return ItemPanels.bookmarkPanel.getBookmarkRecipeId(stackover);
}
@@ -28,7 +28,6 @@ import java.util.Optional;
import java.util.regex.Matcher;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiContainer;
@@ -241,12 +240,12 @@ public abstract class GuiRecipe<H extends IRecipeHandler> extends GuiContainer
HandlerInfo localHandlerInfo = GuiRecipeTab.getHandlerInfo(localHandler);
if (localHandlerInfo.getHandlerName().equals(recipeId.handlerName)) {
recipeId.recipetype = j;
if (!recipeId.ingredients.isEmpty()) {
for (int i = 0; i < localHandler.numRecipes(); i++) {
if (recipeId.equalsIngredients(localHandler.getIngredientStacks(i))) {
recipeId.recipetype = j;
recipeId.position = i;
break;
}
@@ -319,12 +318,19 @@ public abstract class GuiRecipe<H extends IRecipeHandler> extends GuiContainer
for (int recipe : getRecipeIndices()) if (handler.keyTyped(this, c, i, recipe)) return;
}
if (i == mc.gameSettings.keyBindInventory.getKeyCode()) mc.displayGuiScreen(firstGuiGeneral);
else if (i == NEIClientConfig.getKeyBinding("gui.back")) mc.displayGuiScreen(prevGui);
else if (i == NEIClientConfig.getKeyBinding("gui.prev_machine")) prevType();
else if (i == NEIClientConfig.getKeyBinding("gui.next_machine")) nextType();
else if (i == NEIClientConfig.getKeyBinding("gui.prev_recipe")) prevPage();
else if (i == NEIClientConfig.getKeyBinding("gui.next_recipe")) nextPage();
if (i == mc.gameSettings.keyBindInventory.getKeyCode()) {
mc.displayGuiScreen(firstGuiGeneral);
} else if (NEIClientConfig.isKeyHashDown("gui.back")) {
mc.displayGuiScreen(prevGui);
} else if (NEIClientConfig.isKeyHashDown("gui.prev_machine")) {
prevType();
} else if (NEIClientConfig.isKeyHashDown("gui.next_machine")) {
nextType();
} else if (NEIClientConfig.isKeyHashDown("gui.prev_recipe")) {
prevPage();
} else if (NEIClientConfig.isKeyHashDown("gui.next_recipe")) {
nextPage();
}
}
@Override
@@ -373,7 +379,8 @@ public abstract class GuiRecipe<H extends IRecipeHandler> extends GuiContainer
if (overlayButtons != null
&& guibutton.id >= OVERLAY_BUTTON_ID_START
&& guibutton.id < OVERLAY_BUTTON_ID_START + overlayButtons.length) {
overlayRecipe(page * getRecipesPerPage() + guibutton.id - OVERLAY_BUTTON_ID_START);
overlayRecipe(
page * getRecipesPerPage() + guibutton.id - OVERLAY_BUTTON_ID_START, NEIClientUtils.shiftKey());
}
}
@@ -426,14 +433,13 @@ public abstract class GuiRecipe<H extends IRecipeHandler> extends GuiContainer
setRecipePage(--recipetype);
}
protected void overlayRecipe(int recipe) {
protected void overlayRecipe(int recipe, final boolean shift) {
if (handler == null || !handler.hasOverlay(firstGui, firstGui.inventorySlots, recipe)) {
mc.displayGuiScreen(firstGui);
return;
}
final IRecipeOverlayRenderer renderer = handler.getOverlayRenderer(firstGui, recipe);
final IOverlayHandler overlayHandler = handler.getOverlayHandler(firstGui, recipe);
final boolean shift = NEIClientUtils.shiftKey();
mc.displayGuiScreen(firstGui);
if (renderer == null || shift) {
@@ -715,14 +721,15 @@ public abstract class GuiRecipe<H extends IRecipeHandler> extends GuiContainer
return area.intersects(x, y, w, h);
}
static BookmarkRecipeId getCurrentRecipe() {
Minecraft mc = NEIClientUtils.mc();
if (mc.currentScreen instanceof GuiRecipe) {
GuiRecipe<?> gui = (GuiRecipe<?>) mc.currentScreen;
protected static BookmarkRecipeId getCurrentRecipe(GuiScreen gui) {
if (gui instanceof GuiRecipe) {
GuiRecipe<?> gRecipe = (GuiRecipe<?>) gui;
return new BookmarkRecipeId(
gui.handlerInfo.getHandlerName(),
gui.getHandler().getIngredientStacks(gui.page * gui.getRecipesPerPage()));
gRecipe.handlerInfo.getHandlerName(),
gRecipe.getHandler().getIngredientStacks(gRecipe.page * gRecipe.getRecipesPerPage()));
}
return null;
}
}
@@ -3,6 +3,7 @@ package codechicken.nei.recipe;
import codechicken.nei.NEIClientConfig;
import codechicken.nei.NEIClientUtils;
import java.util.ArrayList;
import net.minecraft.client.Minecraft;
public class GuiUsageRecipe extends GuiRecipe<IUsageHandler> {
public static ArrayList<IUsageHandler> usagehandlers = new ArrayList<>();
@@ -14,14 +15,13 @@ public class GuiUsageRecipe extends GuiRecipe<IUsageHandler> {
ArrayList<IUsageHandler> handlers = recipeQuery.runWithProfiling("recipe.concurrent.usage");
if (handlers.isEmpty()) return false;
BookmarkRecipeId recipeId = getCurrentRecipe();
Minecraft mc = NEIClientUtils.mc();
BookmarkRecipeId recipeId = getCurrentRecipe(mc.currentScreen);
GuiUsageRecipe gui = new GuiUsageRecipe(handlers, recipeId);
NEIClientUtils.mc().displayGuiScreen(gui);
mc.displayGuiScreen(gui);
if (!NEIClientUtils.shiftKey()) {
gui.openTargetRecipe(gui.recipeId);
}
gui.openTargetRecipe(gui.recipeId);
return true;
}
@@ -3,7 +3,6 @@ package codechicken.nei.recipe;
import codechicken.nei.ItemPanels;
import codechicken.nei.LayoutManager;
import codechicken.nei.NEIClientConfig;
import codechicken.nei.NEIClientUtils;
import codechicken.nei.PositionedStack;
import codechicken.nei.guihook.GuiContainerManager;
import codechicken.nei.guihook.IContainerInputHandler;
@@ -12,41 +11,52 @@ import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;
public class RecipeItemInputHandler implements IContainerInputHandler {
@Override
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyCode) {
ItemStack stackover = GuiContainerManager.getStackMouseOver(gui);
if (stackover == null) return false;
if (keyCode == NEIClientConfig.getKeyBinding("gui.recipe"))
return GuiCraftingRecipe.openRecipeGui("item", stackover.copy());
if (keyCode == NEIClientConfig.getKeyBinding("gui.usage"))
return GuiUsageRecipe.openRecipeGui("item", stackover.copy());
if (keyCode == NEIClientConfig.getKeyBinding("gui.bookmark")) {
NEIClientConfig.logger.debug("Adding or removing {} from bookmarks", stackover.getDisplayName());
List<PositionedStack> ingredients = null;
String handlerName = "";
if (gui instanceof GuiRecipe && NEIClientConfig.saveCurrentRecipeInBookmarksEnabled()) {
ingredients = ((GuiRecipe<?>) gui).getFocusedRecipeIngredients();
handlerName = ((GuiRecipe<?>) gui).getHandlerName();
}
ItemPanels.bookmarkPanel.addOrRemoveItem(stackover.copy(), handlerName, ingredients);
if (NEIClientConfig.isKeyHashDown("gui.overlay_hide")) {
return hideOverlayRecipe();
}
if (keyCode == NEIClientConfig.getKeyBinding("gui.overlay")) {
if (NEIClientUtils.controlKey()) {
LayoutManager.overlayRenderer = null;
return true;
}
if (!NEIClientConfig.saveCurrentRecipeInBookmarksEnabled()) return false;
final BookmarkRecipeId mouseOverRecipeId = ItemPanels.bookmarkPanel.getBookmarkMouseOverRecipeId();
if (mouseOverRecipeId == null
|| mouseOverRecipeId.ingredients == null
|| mouseOverRecipeId.ingredients.isEmpty()) return false;
return GuiCraftingRecipe.openRecipeGui("item", true, stackover.copy());
ItemStack stackover = GuiContainerManager.getStackMouseOver(gui);
if (stackover == null) {
return false;
}
stackover = stackover.copy();
if (NEIClientConfig.isKeyHashDown("gui.overlay")) {
return openOverlayRecipe(gui, stackover, false);
}
if (NEIClientConfig.isKeyHashDown("gui.overlay_use")) {
return openOverlayRecipe(gui, stackover, true);
}
if (NEIClientConfig.isKeyHashDown("gui.recipe")) {
return GuiCraftingRecipe.openRecipeGui("item", stackover);
}
if (NEIClientConfig.isKeyHashDown("gui.usage")) {
return GuiUsageRecipe.openRecipeGui("item", stackover);
}
if (NEIClientConfig.isKeyHashDown("gui.bookmark")) {
return saveRecipeInBookmark(gui, stackover, false, false);
}
if (NEIClientConfig.isKeyHashDown("gui.bookmark_recipe")) {
return saveRecipeInBookmark(gui, stackover, true, false);
}
if (NEIClientConfig.isKeyHashDown("gui.bookmark_count")) {
return saveRecipeInBookmark(gui, stackover, false, true);
}
if (NEIClientConfig.isKeyHashDown("gui.bookmark_recipe_count")) {
return saveRecipeInBookmark(gui, stackover, true, true);
}
return false;
@@ -54,22 +64,57 @@ public class RecipeItemInputHandler implements IContainerInputHandler {
@Override
public boolean mouseClicked(GuiContainer gui, int mousex, int mousey, int button) {
if (!(gui instanceof GuiRecipe)
|| ItemPanels.itemPanel.contains(mousex, mousey)
|| ItemPanels.bookmarkPanel.contains(mousex, mousey)) return false;
ItemStack stackover = GuiContainerManager.getStackMouseOver(gui);
if (stackover == null) return false;
if (stackover != null) {
if (button == 0) {
return GuiCraftingRecipe.openRecipeGui("item", stackover.copy());
} else if (button == 1) {
return GuiUsageRecipe.openRecipeGui("item", stackover.copy());
}
}
if (!(gui instanceof GuiRecipe)) return false;
return false;
}
// disabled open recipe gui if hold shift (player have move recipe)
if (button == 0
&& ItemPanels.bookmarkPanel.getStackMouseOver(mousex, mousey) != null
&& NEIClientUtils.shiftKey()) {
private boolean hideOverlayRecipe() {
if (LayoutManager.overlayRenderer != null) {
LayoutManager.overlayRenderer = null;
return true;
}
return false;
}
private boolean openOverlayRecipe(GuiContainer gui, ItemStack stack, boolean shift) {
if (gui instanceof GuiRecipe) {
return false;
}
if (button == 0) return GuiCraftingRecipe.openRecipeGui("item", stackover.copy());
return GuiCraftingRecipe.openRecipeGui("item", true, shift, stack);
}
if (button == 1) return GuiUsageRecipe.openRecipeGui("item", stackover.copy());
private boolean saveRecipeInBookmark(
GuiContainer gui, ItemStack stack, boolean saveIngredients, boolean saveStackSize) {
if (stack != null) {
List<PositionedStack> ingredients = null;
String handlerName = "";
if (gui instanceof GuiRecipe) {
ingredients = ((GuiRecipe<?>) gui).getFocusedRecipeIngredients();
handlerName = ((GuiRecipe<?>) gui).getHandlerName();
}
ItemPanels.bookmarkPanel.addOrRemoveItem(stack, handlerName, ingredients, saveIngredients, saveStackSize);
return true;
}
return false;
}
@@ -16,7 +16,7 @@ public class SearchInputDropHandler extends INEIGuiAdapter {
@Override
public boolean handleDragNDrop(GuiContainer gui, int mouseX, int mouseY, ItemStack draggedStack, int button) {
if (searchField.contains(mouseX, mouseY)) {
if (searchField.isVisible() && searchField.contains(mouseX, mouseY)) {
final FluidStack fluidStack = StackInfo.getFluid(draggedStack);
if (fluidStack != null) {
@@ -190,4 +190,20 @@ public class StackInfo {
guidfilters.put(parts[0], rules);
}
}
public static ItemStack getItemStackWithMinimumDamage(ItemStack[] stacks) {
int damage = Short.MAX_VALUE;
ItemStack result = stacks[0];
if (stacks.length > 1) {
for (ItemStack stack : stacks) {
if (stack.getItem() != null && stack.getItemDamage() < damage) {
damage = stack.getItemDamage();
result = stack;
}
}
}
return result.copy();
}
}
@@ -4,6 +4,7 @@ import static codechicken.lib.gui.GuiDraw.changeTexture;
import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect;
import static codechicken.lib.gui.GuiDraw.getMousePosition;
import codechicken.lib.vec.Rectangle4i;
import codechicken.nei.ItemList;
import codechicken.nei.NEIClientConfig;
import codechicken.nei.NEIClientUtils;
@@ -178,8 +179,12 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
* is available
*/
public List<PositionedStack> getCycledIngredients(int cycle, List<PositionedStack> ingredients) {
for (int itemIndex = 0; itemIndex < ingredients.size(); itemIndex++)
randomRenderPermutation(ingredients.get(itemIndex), cycle + itemIndex);
if (!NEIClientUtils.shiftKey()) {
for (int itemIndex = 0; itemIndex < ingredients.size(); itemIndex++) {
randomRenderPermutation(ingredients.get(itemIndex), cycle + itemIndex);
}
}
return ingredients;
}
@@ -286,8 +291,11 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyCode) {
if (!canHandle(gui)) return false;
if (keyCode == NEIClientConfig.getKeyBinding("gui.recipe")) return transferRect(gui, false);
else if (keyCode == NEIClientConfig.getKeyBinding("gui.usage")) return transferRect(gui, true);
if (NEIClientConfig.isKeyHashDown("gui.recipe")) {
return transferRect(gui, false);
} else if (NEIClientConfig.isKeyHashDown("gui.usage")) {
return transferRect(gui, true);
}
return false;
}
@@ -645,8 +653,12 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
@Override
public boolean keyTyped(GuiRecipe<?> gui, char keyChar, int keyCode, int recipe) {
if (keyCode == NEIClientConfig.getKeyBinding("gui.recipe")) return transferRect(gui, recipe, false);
else if (keyCode == NEIClientConfig.getKeyBinding("gui.usage")) return transferRect(gui, recipe, true);
if (NEIClientConfig.isKeyHashDown("gui.recipe")) {
return transferRect(gui, recipe, false);
} else if (NEIClientConfig.isKeyHashDown("gui.usage")) {
return transferRect(gui, recipe, true);
}
return false;
}
@@ -661,6 +673,28 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
@Override
public boolean mouseScrolled(GuiRecipe<?> gui, int scroll, int recipe) {
if (!NEIClientUtils.shiftKey()) return false;
final Point offset = gui.getRecipePosition(recipe);
final Point pos = getMousePosition();
final Point relMouse = new Point(pos.x - gui.guiLeft - offset.x, pos.y - gui.guiTop - offset.y);
for (PositionedStack pStack : getIngredientStacks(recipe)) {
if ((new Rectangle4i(pStack.relx, pStack.rely, 18, 18)).contains(relMouse.x, relMouse.y)) {
int index = pStack.items.length + scroll;
for (int i = 0; i < pStack.items.length; i++) {
if (NEIServerUtils.areStacksSameTypeCraftingWithNBT(pStack.items[i], pStack.item)) {
index = index + i;
break;
}
}
pStack.setPermutationToRender(index % pStack.items.length);
return true;
}
}
return false;
}
@@ -10,6 +10,8 @@ nei.bookmark.toggle=Bookmarks
nei.bookmark.toggle.tip=Toggle visibility of the Bookmark Panel
nei.bookmark.viewmode.toggle.tip=Toggle Bookmark View Mode
nei.itempanel.quantity.default=One stack
nei.enchant=Enchant
nei.enchant.level=Level
nei.enchant.locked=Locked
@@ -95,8 +97,13 @@ nei.options.keys.gui.next_machine=Next Machine
nei.options.keys.gui.prev_machine=Prev Machine
nei.options.keys.gui.search=Focus Search Bar
nei.options.keys.gui.bookmark=Add Bookmark
nei.options.keys.gui.bookmark_recipe=Add Bookmark with Recipe
nei.options.keys.gui.bookmark_count=Add Bookmark with Count
nei.options.keys.gui.bookmark_recipe_count=Add Bookmark with Recipe & Count
nei.options.keys.gui.hide_bookmarks=Toggle Bookmark Panel Visibility
nei.options.keys.gui.overlay=Overlay Recipe
nei.options.keys.gui.overlay_hide=Hide Overlay Recipe
nei.options.keys.gui.overlay_use=Use Overlay Recipe
nei.options.keys.world=World
nei.options.keys.world.chunkoverlay=Chunk Boundary Overlay
nei.options.keys.world.moboverlay=Mob Spawn Overlay
@@ -138,6 +145,9 @@ nei.options.inventory.useNBTInBookmarks.false=No
nei.options.inventory.showRecipeMarker=Show Recipe Marker
nei.options.inventory.showRecipeMarker.true=Yes
nei.options.inventory.showRecipeMarker.false=No
nei.options.inventory.showItemQuantityWidget=Show Item Quantity Widget
nei.options.inventory.showItemQuantityWidget.true=Yes
nei.options.inventory.showItemQuantityWidget.false=No
nei.options.inventory.creative_tab_style=Creative or JEI tab style
nei.options.inventory.creative_tab_style.true=Creative
nei.options.inventory.creative_tab_style.false=JEI