mirror of
https://github.com/GTNewHorizons/NotEnoughItems.git
synced 2026-11-15 17:54:50 +00:00
Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb9d517f78 | ||
|
|
529f4374d6 | ||
|
|
0bf369a996 | ||
|
|
1897dba35a | ||
|
|
5bbf275980 | ||
|
|
f7a900e910 |
No files matched your search
@@ -1,9 +0,0 @@
|
||||
directory="run/crash-reports"
|
||||
if [ -d $directory ]; then
|
||||
echo "Crash reports detected:"
|
||||
cat $directory/*
|
||||
exit 1
|
||||
else
|
||||
echo "No crash reports detected"
|
||||
exit 0
|
||||
fi
|
||||
@@ -1,5 +1,3 @@
|
||||
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
|
||||
|
||||
name: Build and test
|
||||
|
||||
@@ -11,35 +9,5 @@ on:
|
||||
|
||||
jobs:
|
||||
build-and-test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up JDK 8
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '8'
|
||||
distribution: 'adopt'
|
||||
cache: gradle
|
||||
|
||||
- name: Grant execute permission for gradlew
|
||||
run: chmod +x gradlew
|
||||
|
||||
- name: Setup the workspace
|
||||
run: ./gradlew setupCIWorkspace
|
||||
|
||||
- name: Build the mod
|
||||
run: ./gradlew build
|
||||
|
||||
- name: Run server for 1 minute
|
||||
run: |
|
||||
mkdir run
|
||||
echo "eula=true" > run/eula.txt
|
||||
timeout 10 ./gradlew runServer || true
|
||||
|
||||
- name: Test no crashes happend
|
||||
run: |
|
||||
chmod +x .github/scripts/test-no-crash-reports.sh
|
||||
.github/scripts/test-no-crash-reports.sh
|
||||
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/build-and-test.yml@master
|
||||
secrets: inherit
|
||||
@@ -1,51 +1,14 @@
|
||||
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
|
||||
|
||||
name: Release tagged build
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
tags: [ '*' ]
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set release version
|
||||
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
|
||||
|
||||
- name: Set up JDK 8
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '8'
|
||||
distribution: 'adopt'
|
||||
cache: gradle
|
||||
|
||||
- name: Grant execute permission for gradlew
|
||||
run: chmod +x gradlew
|
||||
|
||||
- name: Setup the workspace
|
||||
run: ./gradlew setupCIWorkspace
|
||||
|
||||
- name: Build the mod
|
||||
run: ./gradlew build
|
||||
|
||||
- name: Release under current tag
|
||||
uses: "marvinpinto/action-automatic-releases@latest"
|
||||
with:
|
||||
repo_token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
automatic_release_tag: "${{ env.RELEASE_VERSION }}"
|
||||
prerelease: false
|
||||
title: "${{ env.RELEASE_VERSION }}"
|
||||
files: build/libs/*.jar
|
||||
|
||||
- name: Publish to Maven
|
||||
run: ./gradlew publish
|
||||
env:
|
||||
MAVEN_USER: ${{ secrets.MAVEN_USER }}
|
||||
MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
|
||||
release-tags:
|
||||
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/release-tags.yml@master
|
||||
secrets: inherit
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -150,7 +150,7 @@ public class FireworkRecipeHandler extends ShapelessRecipeHandler {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> handleTooltip(GuiRecipe gui, List<String> currenttip, int recipe) {
|
||||
public List<String> handleTooltip(GuiRecipe<?> gui, List<String> currenttip, int recipe) {
|
||||
currenttip = super.handleTooltip(gui, currenttip, recipe);
|
||||
Point mousepos = GuiDraw.getMousePosition();
|
||||
Point relMouse = new Point(mousepos.x - gui.guiLeft, mousepos.y - gui.guiTop);
|
||||
|
||||
@@ -1,118 +1,88 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
import codechicken.core.TaskProfiler;
|
||||
import codechicken.nei.ItemList;
|
||||
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 java.util.concurrent.ExecutionException;
|
||||
import java.util.stream.Collectors;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ChatComponentTranslation;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
import net.minecraft.util.IChatComponent;
|
||||
|
||||
public class GuiCraftingRecipe extends GuiRecipe {
|
||||
public class GuiCraftingRecipe extends GuiRecipe<ICraftingHandler> {
|
||||
public static ArrayList<ICraftingHandler> craftinghandlers = new ArrayList<>();
|
||||
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) {
|
||||
Minecraft mc = NEIClientUtils.mc();
|
||||
GuiScreen prevscreen = mc.currentScreen; // instanceof GuiContainer ? (GuiContainer) mc.currentScreen : null;
|
||||
public static boolean openRecipeGui(
|
||||
String outputId, final Boolean overlay, final Boolean shift, Object... results) {
|
||||
final Minecraft mc = NEIClientUtils.mc();
|
||||
|
||||
ArrayList<ICraftingHandler> handlers;
|
||||
TaskProfiler profiler = ProfilerRecipeHandler.getProfiler();
|
||||
profiler.start("recipe.concurrent.crafting");
|
||||
final BookmarkRecipeId recipeId = "item".equals(outputId)
|
||||
? getRecipeId(mc.currentScreen, (ItemStack) results[0])
|
||||
: getCurrentRecipe(mc.currentScreen);
|
||||
|
||||
// Pre-find the fuels so we're not fighting over it
|
||||
FuelRecipeHandler.findFuelsOnceParallel();
|
||||
if (overlay && recipeId == null) return false;
|
||||
|
||||
try {
|
||||
handlers = serialCraftingHandlers.stream()
|
||||
.map(h -> h.getRecipeHandler(outputId, results))
|
||||
.filter(h -> h.numRecipes() > 0)
|
||||
.collect(Collectors.toCollection(ArrayList::new));
|
||||
final RecipeHandlerQuery<ICraftingHandler> recipeQuery = new RecipeHandlerQuery<>(
|
||||
h -> h.getRecipeHandler(outputId, results), craftinghandlers, serialCraftingHandlers);
|
||||
|
||||
handlers.addAll(ItemList.forkJoinPool
|
||||
.submit(() -> craftinghandlers.parallelStream()
|
||||
.map(h -> h.getRecipeHandler(outputId, results))
|
||||
.filter(h -> h.numRecipes() > 0)
|
||||
.collect(Collectors.toCollection(ArrayList::new)))
|
||||
.get());
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
|
||||
if (player != null) {
|
||||
IChatComponent chat = new ChatComponentTranslation("nei.chat.recipe.error");
|
||||
chat.getChatStyle().setColor(EnumChatFormatting.RED);
|
||||
player.addChatComponentMessage(chat);
|
||||
}
|
||||
return false;
|
||||
} finally {
|
||||
profiler.end();
|
||||
}
|
||||
final ArrayList<ICraftingHandler> handlers = recipeQuery.runWithProfiling("recipe.concurrent.crafting");
|
||||
|
||||
if (handlers.isEmpty()) return false;
|
||||
if (!handlers.isEmpty()) {
|
||||
GuiCraftingRecipe gui = new GuiCraftingRecipe(handlers, recipeId);
|
||||
|
||||
handlers.sort(NEIClientConfig.HANDLER_COMPARATOR);
|
||||
mc.displayGuiScreen(gui);
|
||||
|
||||
BookmarkRecipeId recipeId = null;
|
||||
|
||||
if ("item".equals(outputId)) {
|
||||
recipeId = getRecipeId(prevscreen, (ItemStack) results[0]);
|
||||
}
|
||||
|
||||
GuiCraftingRecipe gui = new GuiCraftingRecipe(prevscreen, handlers, recipeId);
|
||||
|
||||
mc.displayGuiScreen(gui);
|
||||
|
||||
if (NEIClientConfig.saveCurrentRecipeInBookmarksEnabled())
|
||||
if (!NEIClientUtils.shiftKey() || overlay) {
|
||||
if (recipeId != null) {
|
||||
gui.openTargetRecipe(gui.recipeId);
|
||||
}
|
||||
|
||||
if (overlay) {
|
||||
if (!NEIClientConfig.saveCurrentRecipeInBookmarksEnabled() || gui.recipeId == null) {
|
||||
mc.displayGuiScreen(prevscreen);
|
||||
return false;
|
||||
if (overlay) {
|
||||
gui.overlayRecipe(gui.recipeId.position, shift);
|
||||
}
|
||||
gui.overlayRecipe(gui.recipeId.position);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
protected static BookmarkRecipeId getRecipeId(GuiScreen gui, ItemStack stackover) {
|
||||
|
||||
if (gui instanceof GuiRecipe) {
|
||||
final List<PositionedStack> ingredients = ((GuiRecipe) gui).getFocusedRecipeIngredients();
|
||||
final String handlerName = ((GuiRecipe) gui).getHandlerName();
|
||||
final List<PositionedStack> ingredients = ((GuiRecipe<?>) gui).getFocusedRecipeIngredients();
|
||||
final String handlerName = ((GuiRecipe<?>) gui).getHandlerName();
|
||||
|
||||
if (ingredients != null && !ingredients.isEmpty()) {
|
||||
return new BookmarkRecipeId(handlerName, ingredients);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
private GuiCraftingRecipe(GuiScreen prevgui, ArrayList<ICraftingHandler> handlers, BookmarkRecipeId recipeId) {
|
||||
this(prevgui, handlers);
|
||||
private GuiCraftingRecipe(ArrayList<ICraftingHandler> handlers, BookmarkRecipeId recipeId) {
|
||||
super(NEIClientUtils.mc().currentScreen);
|
||||
this.currenthandlers = handlers;
|
||||
this.recipeId = recipeId;
|
||||
}
|
||||
|
||||
private GuiCraftingRecipe(GuiScreen prevgui, ArrayList<ICraftingHandler> handlers) {
|
||||
super(prevgui);
|
||||
currenthandlers = handlers;
|
||||
}
|
||||
|
||||
public static void registerRecipeHandler(ICraftingHandler handler) {
|
||||
final String handlerId = handler.getHandlerId();
|
||||
if (craftinghandlers.stream().anyMatch(h -> h.getHandlerId().equals(handlerId))
|
||||
@@ -123,12 +93,8 @@ public class GuiCraftingRecipe extends GuiRecipe {
|
||||
else craftinghandlers.add(handler);
|
||||
}
|
||||
|
||||
public ArrayList<? extends IRecipeHandler> getCurrentRecipeHandlers() {
|
||||
@Override
|
||||
public ArrayList<ICraftingHandler> getCurrentRecipeHandlers() {
|
||||
return currenthandlers;
|
||||
}
|
||||
|
||||
public ArrayList<ICraftingHandler> currenthandlers;
|
||||
|
||||
public static ArrayList<ICraftingHandler> craftinghandlers = new ArrayList<>();
|
||||
public static ArrayList<ICraftingHandler> serialCraftingHandlers = new ArrayList<>();
|
||||
}
|
||||
@@ -38,7 +38,7 @@ import net.minecraft.item.ItemStack;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
public abstract class GuiRecipe extends GuiContainer
|
||||
public abstract class GuiRecipe<H extends IRecipeHandler> extends GuiContainer
|
||||
implements IGuiContainerOverlay,
|
||||
IGuiClientSide,
|
||||
IGuiHandleMouseWheel,
|
||||
@@ -66,7 +66,7 @@ public abstract class GuiRecipe extends GuiContainer
|
||||
final DrawableResource bgBottom =
|
||||
new DrawableBuilder("nei:textures/gui/recipebg.png", 0, BG_BOTTOM_Y, 176, BG_BOTTOM_HEIGHT).build();
|
||||
|
||||
public ArrayList<? extends IRecipeHandler> currenthandlers = new ArrayList<>();
|
||||
public ArrayList<H> currenthandlers = new ArrayList<>();
|
||||
|
||||
public int page;
|
||||
public int recipetype;
|
||||
@@ -80,13 +80,13 @@ public abstract class GuiRecipe extends GuiContainer
|
||||
private GuiButton nexttype;
|
||||
private GuiButton prevtype;
|
||||
|
||||
private int OVERLAY_BUTTON_ID_START = 4;
|
||||
private final int OVERLAY_BUTTON_ID_START = 4;
|
||||
private GuiButton[] overlayButtons;
|
||||
|
||||
private final Rectangle area = new Rectangle();
|
||||
private final GuiRecipeTabs recipeTabs;
|
||||
private final GuiRecipeCatalyst guiRecipeCatalyst;
|
||||
private IRecipeHandler handler;
|
||||
private H handler;
|
||||
private HandlerInfo handlerInfo;
|
||||
|
||||
private int yShift = 0;
|
||||
@@ -236,16 +236,16 @@ public abstract class GuiRecipe extends GuiContainer
|
||||
if (recipeId.handlerName != null) {
|
||||
|
||||
for (int j = 0; j < currenthandlers.size(); j++) {
|
||||
IRecipeHandler localHandler = currenthandlers.get(j);
|
||||
H localHandler = currenthandlers.get(j);
|
||||
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;
|
||||
}
|
||||
@@ -293,7 +293,7 @@ public abstract class GuiRecipe extends GuiContainer
|
||||
return handlerInfo.getHandlerName();
|
||||
}
|
||||
|
||||
public IRecipeHandler getHandler() {
|
||||
public H getHandler() {
|
||||
return handler;
|
||||
}
|
||||
|
||||
@@ -318,12 +318,19 @@ public abstract class GuiRecipe 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
|
||||
@@ -372,7 +379,8 @@ public abstract class GuiRecipe 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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -425,14 +433,13 @@ public abstract class GuiRecipe 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) {
|
||||
@@ -686,7 +693,7 @@ public abstract class GuiRecipe extends GuiContainer
|
||||
return new Point(5, 32 + yShift + ((recipe % getRecipesPerPage()) * handlerInfo.getHeight()));
|
||||
}
|
||||
|
||||
public abstract ArrayList<? extends IRecipeHandler> getCurrentRecipeHandlers();
|
||||
public abstract ArrayList<H> getCurrentRecipeHandlers();
|
||||
|
||||
@Override
|
||||
public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility) {
|
||||
@@ -713,4 +720,16 @@ public abstract class GuiRecipe extends GuiContainer
|
||||
// Because some of the handlers *cough avaritia* are oversized
|
||||
return area.intersects(x, y, w, h);
|
||||
}
|
||||
|
||||
protected static BookmarkRecipeId getCurrentRecipe(GuiScreen gui) {
|
||||
|
||||
if (gui instanceof GuiRecipe) {
|
||||
GuiRecipe<?> gRecipe = (GuiRecipe<?>) gui;
|
||||
return new BookmarkRecipeId(
|
||||
gRecipe.handlerInfo.getHandlerName(),
|
||||
gRecipe.getHandler().getIngredientStacks(gRecipe.page * gRecipe.getRecipesPerPage()));
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@ import net.minecraft.util.ResourceLocation;
|
||||
import org.lwjgl.util.Rectangle;
|
||||
|
||||
public class GuiRecipeCatalyst extends INEIGuiAdapter {
|
||||
private GuiRecipe guiRecipe;
|
||||
private GuiRecipe<?> guiRecipe;
|
||||
public static final int ingredientSize = 16;
|
||||
public static final int ingredientBorder = 1;
|
||||
public static final int tabBorder = 5;
|
||||
@@ -18,7 +18,7 @@ public class GuiRecipeCatalyst extends INEIGuiAdapter {
|
||||
private static final Rectangle catalystRect = new Rectangle();
|
||||
private static final Rectangle targetRect = new Rectangle();
|
||||
|
||||
public GuiRecipeCatalyst(GuiRecipe guiRecipe) {
|
||||
public GuiRecipeCatalyst(GuiRecipe<?> guiRecipe) {
|
||||
this.guiRecipe = guiRecipe;
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ public class GuiRecipeCatalyst extends INEIGuiAdapter {
|
||||
@Override
|
||||
public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) {
|
||||
if (!(gui instanceof GuiRecipe)) return false;
|
||||
guiRecipe = (GuiRecipe) gui;
|
||||
guiRecipe = (GuiRecipe<?>) gui;
|
||||
int catalystsSize =
|
||||
RecipeCatalysts.getRecipeCatalysts(guiRecipe.getHandler()).size();
|
||||
if (catalystsSize == 0) return false;
|
||||
|
||||
@@ -35,7 +35,7 @@ public abstract class GuiRecipeTab extends Widget {
|
||||
public static HashMap<String, HandlerInfo> handlerAdderFromIMC = new HashMap<>();
|
||||
public static Set<String> handlerRemoverFromIMC = new HashSet<>();
|
||||
|
||||
private final GuiRecipe guiRecipe;
|
||||
private final GuiRecipe<?> guiRecipe;
|
||||
private final IRecipeHandler handler;
|
||||
private final String handlerName;
|
||||
private final String handlerID;
|
||||
@@ -54,7 +54,7 @@ public abstract class GuiRecipeTab extends Widget {
|
||||
|
||||
protected abstract int getForegroundIconY();
|
||||
|
||||
public GuiRecipeTab(GuiRecipe guiRecipe, IRecipeHandler handler, int x, int y) {
|
||||
public GuiRecipeTab(GuiRecipe<?> guiRecipe, IRecipeHandler handler, int x, int y) {
|
||||
super();
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
|
||||
@@ -11,7 +11,7 @@ public class GuiRecipeTabCreative extends GuiRecipeTab {
|
||||
private static final DrawableResource unselectedTabImage =
|
||||
new DrawableBuilder("minecraft:textures/gui/container/creative_inventory/tabs.png", 28, 0, 28, 30).build();
|
||||
|
||||
public GuiRecipeTabCreative(GuiRecipe guiRecipe, IRecipeHandler handler, int x, int y) {
|
||||
public GuiRecipeTabCreative(GuiRecipe<?> guiRecipe, IRecipeHandler handler, int x, int y) {
|
||||
super(guiRecipe, handler, x, y);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ public class GuiRecipeTabJEI extends GuiRecipeTab {
|
||||
private static final DrawableResource unselectedTabImage =
|
||||
new DrawableBuilder("nei:textures/nei_tabbed_sprites.png", 24, 16, 24, 24).build();
|
||||
|
||||
public GuiRecipeTabJEI(GuiRecipe guiRecipe, IRecipeHandler handler, int x, int y) {
|
||||
public GuiRecipeTabJEI(GuiRecipe<?> guiRecipe, IRecipeHandler handler, int x, int y) {
|
||||
super(guiRecipe, handler, x, y);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,12 +8,11 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class GuiRecipeTabs {
|
||||
private final GuiRecipe guiRecipe;
|
||||
private final GuiRecipe<?> guiRecipe;
|
||||
private final List<GuiRecipeTab> tabs = new ArrayList<>();
|
||||
private final List<Button> buttons = new ArrayList<>();
|
||||
|
||||
private final Rectangle area = new Rectangle();
|
||||
private boolean creative_tab_style;
|
||||
|
||||
private int pageCount = 1;
|
||||
private int pageNumber = 0;
|
||||
@@ -22,13 +21,12 @@ public class GuiRecipeTabs {
|
||||
private int tabWidth;
|
||||
private int tabHeight;
|
||||
|
||||
public GuiRecipeTabs(GuiRecipe guiRecipe) {
|
||||
public GuiRecipeTabs(GuiRecipe<?> guiRecipe) {
|
||||
this.guiRecipe = guiRecipe;
|
||||
}
|
||||
|
||||
public void initLayout() {
|
||||
creative_tab_style = NEIClientConfig.useCreativeTabStyle();
|
||||
if (creative_tab_style) {
|
||||
if (NEIClientConfig.useCreativeTabStyle()) {
|
||||
tabWidth = GuiRecipeTabCreative.TAB_WIDTH;
|
||||
tabHeight = GuiRecipeTabCreative.TAB_HEIGHT;
|
||||
} else {
|
||||
|
||||
@@ -1,87 +1,37 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
import codechicken.core.TaskProfiler;
|
||||
import codechicken.nei.ItemList;
|
||||
import codechicken.nei.NEIClientConfig;
|
||||
import codechicken.nei.NEIClientUtils;
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.stream.Collectors;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.ChatComponentTranslation;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
import net.minecraft.util.IChatComponent;
|
||||
|
||||
public class GuiUsageRecipe extends GuiRecipe {
|
||||
public class GuiUsageRecipe extends GuiRecipe<IUsageHandler> {
|
||||
public static ArrayList<IUsageHandler> usagehandlers = new ArrayList<>();
|
||||
public static ArrayList<IUsageHandler> serialUsageHandlers = new ArrayList<>();
|
||||
|
||||
public static boolean openRecipeGui(String inputId, Object... ingredients) {
|
||||
Minecraft mc = NEIClientUtils.mc();
|
||||
GuiContainer prevscreen = mc.currentScreen instanceof GuiContainer ? (GuiContainer) mc.currentScreen : null;
|
||||
|
||||
ArrayList<IUsageHandler> handlers;
|
||||
TaskProfiler profiler = ProfilerRecipeHandler.getProfiler();
|
||||
|
||||
// Pre-find the fuels so we're not fighting over it
|
||||
FuelRecipeHandler.findFuelsOnceParallel();
|
||||
|
||||
profiler.start("recipe.concurrent.usage");
|
||||
try {
|
||||
handlers = serialUsageHandlers.stream()
|
||||
.map(h -> getUsageOrCatalystHandler(h, inputId, ingredients))
|
||||
.filter(h -> h.numRecipes() > 0)
|
||||
.collect(Collectors.toCollection(ArrayList::new));
|
||||
|
||||
handlers.addAll(ItemList.forkJoinPool
|
||||
.submit(() -> usagehandlers.parallelStream()
|
||||
.map(h -> getUsageOrCatalystHandler(h, inputId, ingredients))
|
||||
.filter(h -> h.numRecipes() > 0)
|
||||
.collect(Collectors.toCollection(ArrayList::new)))
|
||||
.get());
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
|
||||
if (player != null) {
|
||||
IChatComponent chat = new ChatComponentTranslation("nei.chat.recipe.error");
|
||||
chat.getChatStyle().setColor(EnumChatFormatting.RED);
|
||||
player.addChatComponentMessage(chat);
|
||||
}
|
||||
return false;
|
||||
} finally {
|
||||
profiler.end();
|
||||
}
|
||||
|
||||
RecipeHandlerQuery<IUsageHandler> recipeQuery = new RecipeHandlerQuery<>(
|
||||
h -> getUsageOrCatalystHandler(h, inputId, ingredients), usagehandlers, serialUsageHandlers);
|
||||
ArrayList<IUsageHandler> handlers = recipeQuery.runWithProfiling("recipe.concurrent.usage");
|
||||
if (handlers.isEmpty()) return false;
|
||||
|
||||
handlers.sort(NEIClientConfig.HANDLER_COMPARATOR);
|
||||
|
||||
BookmarkRecipeId recipeId = null;
|
||||
|
||||
if (prevscreen instanceof GuiRecipe && ((GuiRecipe) prevscreen).recipeId != null) {
|
||||
recipeId = (((GuiRecipe) prevscreen).recipeId).copy();
|
||||
}
|
||||
|
||||
GuiUsageRecipe gui = new GuiUsageRecipe(prevscreen, handlers, recipeId);
|
||||
Minecraft mc = NEIClientUtils.mc();
|
||||
BookmarkRecipeId recipeId = getCurrentRecipe(mc.currentScreen);
|
||||
GuiUsageRecipe gui = new GuiUsageRecipe(handlers, recipeId);
|
||||
|
||||
mc.displayGuiScreen(gui);
|
||||
|
||||
if (!NEIClientUtils.shiftKey()) {
|
||||
gui.openTargetRecipe(recipeId);
|
||||
}
|
||||
gui.openTargetRecipe(gui.recipeId);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private GuiUsageRecipe(GuiContainer prevgui, ArrayList<IUsageHandler> handlers, BookmarkRecipeId recipeId) {
|
||||
this(prevgui, handlers);
|
||||
private GuiUsageRecipe(ArrayList<IUsageHandler> handlers, BookmarkRecipeId recipeId) {
|
||||
super(NEIClientUtils.mc().currentScreen);
|
||||
this.currenthandlers = handlers;
|
||||
this.recipeId = recipeId;
|
||||
}
|
||||
|
||||
private GuiUsageRecipe(GuiContainer prevgui, ArrayList<IUsageHandler> handlers) {
|
||||
super(prevgui);
|
||||
currenthandlers = handlers;
|
||||
}
|
||||
|
||||
public static void registerUsageHandler(IUsageHandler handler) {
|
||||
final String handlerId = handler.getHandlerId();
|
||||
if (usagehandlers.stream().anyMatch(h -> h.getHandlerId().equals(handlerId))
|
||||
@@ -91,10 +41,6 @@ public class GuiUsageRecipe extends GuiRecipe {
|
||||
else usagehandlers.add(handler);
|
||||
}
|
||||
|
||||
public ArrayList<? extends IRecipeHandler> getCurrentRecipeHandlers() {
|
||||
return currenthandlers;
|
||||
}
|
||||
|
||||
private static IUsageHandler getUsageOrCatalystHandler(
|
||||
IUsageHandler handler, String inputId, Object... ingredients) {
|
||||
boolean skipCatalyst = NEIClientUtils.controlKey();
|
||||
@@ -105,8 +51,8 @@ public class GuiUsageRecipe extends GuiRecipe {
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList<IUsageHandler> currenthandlers;
|
||||
|
||||
public static ArrayList<IUsageHandler> usagehandlers = new ArrayList<>();
|
||||
public static ArrayList<IUsageHandler> serialUsageHandlers = new ArrayList<>();
|
||||
@Override
|
||||
public ArrayList<IUsageHandler> getCurrentRecipeHandlers() {
|
||||
return currenthandlers;
|
||||
}
|
||||
}
|
||||
@@ -117,7 +117,7 @@ public interface IRecipeHandler {
|
||||
* @param recipe The recipe index being handled
|
||||
* @return The modified tooltip. DO NOT return null
|
||||
*/
|
||||
List<String> handleTooltip(GuiRecipe gui, List<String> currenttip, int recipe);
|
||||
List<String> handleTooltip(GuiRecipe<?> gui, List<String> currenttip, int recipe);
|
||||
/**
|
||||
*
|
||||
* @param gui An instance of the currentscreen
|
||||
@@ -126,7 +126,7 @@ public interface IRecipeHandler {
|
||||
* @param recipe The recipe index being handled
|
||||
* @return The modified tooltip. DO NOT return null
|
||||
*/
|
||||
List<String> handleItemTooltip(GuiRecipe gui, ItemStack stack, List<String> currenttip, int recipe);
|
||||
List<String> handleItemTooltip(GuiRecipe<?> gui, ItemStack stack, List<String> currenttip, int recipe);
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -135,7 +135,7 @@ public interface IRecipeHandler {
|
||||
* @param keyCode The KeyCode as defined in {@link Keyboard}
|
||||
* @return true to terminate further processing of this event.
|
||||
*/
|
||||
boolean keyTyped(GuiRecipe gui, char keyChar, int keyCode, int recipe);
|
||||
boolean keyTyped(GuiRecipe<?> gui, char keyChar, int keyCode, int recipe);
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -143,7 +143,7 @@ public interface IRecipeHandler {
|
||||
* @param button The button index being pressed, {0 = Left Click, 1 = Right Click, 2 = Middle Click}
|
||||
* @return true to terminate further processing of this event.
|
||||
*/
|
||||
boolean mouseClicked(GuiRecipe gui, int button, int recipe);
|
||||
boolean mouseClicked(GuiRecipe<?> gui, int button, int recipe);
|
||||
|
||||
/**
|
||||
* For legacy compatibility reasons, this method has a do-nothing default implementation.
|
||||
@@ -152,7 +152,7 @@ public interface IRecipeHandler {
|
||||
* @param scroll The scroll direction, {> 0 = Up, < 0 = Down}
|
||||
* @return true to terminate further processing of this event.
|
||||
*/
|
||||
default boolean mouseScrolled(GuiRecipe gui, int scroll, int recipe) {
|
||||
default boolean mouseScrolled(GuiRecipe<?> gui, int scroll, int recipe) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -110,22 +110,22 @@ public class ProfilerRecipeHandler implements ICraftingHandler, IUsageHandler {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> handleTooltip(GuiRecipe gui, List<String> currenttip, int recipe) {
|
||||
public List<String> handleTooltip(GuiRecipe<?> gui, List<String> currenttip, int recipe) {
|
||||
return currenttip;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> handleItemTooltip(GuiRecipe gui, ItemStack stack, List<String> currenttip, int recipe) {
|
||||
public List<String> handleItemTooltip(GuiRecipe<?> gui, ItemStack stack, List<String> currenttip, int recipe) {
|
||||
return currenttip;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean keyTyped(GuiRecipe gui, char keyChar, int keyCode, int recipe) {
|
||||
public boolean keyTyped(GuiRecipe<?> gui, char keyChar, int keyCode, int recipe) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mouseClicked(GuiRecipe gui, int button, int recipe) {
|
||||
public boolean mouseClicked(GuiRecipe<?> gui, int button, int recipe) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
import codechicken.core.TaskProfiler;
|
||||
import codechicken.nei.ItemList;
|
||||
import codechicken.nei.NEIClientConfig;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.ChatComponentTranslation;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
import net.minecraft.util.IChatComponent;
|
||||
|
||||
class RecipeHandlerQuery<T extends IRecipeHandler> {
|
||||
private final Function<T, T> recipeHandlerFunction;
|
||||
private final List<T> recipeHandlers;
|
||||
private final List<T> serialRecipeHandlers;
|
||||
|
||||
RecipeHandlerQuery(Function<T, T> recipeHandlerFunction, List<T> recipeHandlers, List<T> serialRecipeHandlers) {
|
||||
this.recipeHandlerFunction = recipeHandlerFunction;
|
||||
this.recipeHandlers = recipeHandlers;
|
||||
this.serialRecipeHandlers = serialRecipeHandlers;
|
||||
}
|
||||
|
||||
ArrayList<T> runWithProfiling(String profilerSection) {
|
||||
TaskProfiler profiler = ProfilerRecipeHandler.getProfiler();
|
||||
profiler.start(profilerSection);
|
||||
try {
|
||||
return getRecipeHandlersParallel();
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
displayRecipeLookupError(e);
|
||||
return new ArrayList<>(0);
|
||||
} finally {
|
||||
profiler.end();
|
||||
}
|
||||
}
|
||||
|
||||
private ArrayList<T> getRecipeHandlersParallel() throws InterruptedException, ExecutionException {
|
||||
// Pre-find the fuels so we're not fighting over it
|
||||
FuelRecipeHandler.findFuelsOnceParallel();
|
||||
ArrayList<T> handlers = getSerialHandlersWithRecipes();
|
||||
handlers.addAll(getHandlersWithRecipes());
|
||||
handlers.sort(NEIClientConfig.HANDLER_COMPARATOR);
|
||||
return handlers;
|
||||
}
|
||||
|
||||
private ArrayList<T> getSerialHandlersWithRecipes() {
|
||||
return serialRecipeHandlers.stream()
|
||||
.map(recipeHandlerFunction)
|
||||
.filter(h -> h.numRecipes() > 0)
|
||||
.collect(Collectors.toCollection(ArrayList::new));
|
||||
}
|
||||
|
||||
private ArrayList<T> getHandlersWithRecipes() throws InterruptedException, ExecutionException {
|
||||
return ItemList.forkJoinPool
|
||||
.submit(() -> recipeHandlers.parallelStream()
|
||||
.map(recipeHandlerFunction)
|
||||
.filter(h -> h.numRecipes() > 0)
|
||||
.collect(Collectors.toCollection(ArrayList::new)))
|
||||
.get();
|
||||
}
|
||||
|
||||
private static void displayRecipeLookupError(Exception e) {
|
||||
e.printStackTrace();
|
||||
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
|
||||
if (player != null) {
|
||||
IChatComponent chat = new ChatComponentTranslation("nei.chat.recipe.error");
|
||||
chat.getChatStyle().setColor(EnumChatFormatting.RED);
|
||||
player.addChatComponentMessage(chat);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -36,11 +36,6 @@ public class ShapedRecipeHandler extends TemplateRecipeHandler {
|
||||
this(recipe.recipeWidth, recipe.recipeHeight, recipe.recipeItems, recipe.getRecipeOutput());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param width
|
||||
* @param height
|
||||
* @param items an ItemStack[] or ItemStack[][]
|
||||
*/
|
||||
public void setIngredients(int width, int height, Object[] items) {
|
||||
for (int x = 0; x < width; x++) {
|
||||
for (int y = 0; y < height; y++) {
|
||||
|
||||
@@ -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;
|
||||
@@ -172,12 +173,18 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
|
||||
|
||||
/**
|
||||
* This will perform default cycling of ingredients, mulitItem capable
|
||||
*
|
||||
* @return
|
||||
* @param cycle Current cycle step
|
||||
* @param ingredients List of ItemStacks to cycle
|
||||
* @return The provided list of ingredients, with their permutations cycled to a different permutation, if one
|
||||
* 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;
|
||||
}
|
||||
@@ -187,11 +194,6 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
|
||||
stack.setPermutationToRender(Math.abs(rand.nextInt()) % stack.items.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set all variable ingredients to this permutation.
|
||||
*
|
||||
* @param ingredient
|
||||
*/
|
||||
public void setIngredientPermutation(Collection<PositionedStack> ingredients, ItemStack ingredient) {
|
||||
for (PositionedStack stack : ingredients) {
|
||||
for (int i = 0; i < stack.items.length; i++) {
|
||||
@@ -211,8 +213,9 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ingredient
|
||||
* @return true if any of the permutations of any of the ingredients contain this stack
|
||||
* @param ingredients Collection of ItemStacks
|
||||
* @param ingredient ItemStack we're looking for
|
||||
* @return true if any of the permutations of the ingredients contain this ItemStack
|
||||
*/
|
||||
public boolean contains(Collection<PositionedStack> ingredients, ItemStack ingredient) {
|
||||
for (PositionedStack stack : ingredients) if (stack.contains(ingredient)) return true;
|
||||
@@ -230,11 +233,12 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ingred
|
||||
* @return true if any of the permutations of any of the ingredients contain this stack
|
||||
* @param ingredients Collection of ItemStacks
|
||||
* @param ingredient Item we're looking for
|
||||
* @return true if any of the permutations of the ingredients contain this Item
|
||||
*/
|
||||
public boolean contains(Collection<PositionedStack> ingredients, Item ingred) {
|
||||
for (PositionedStack stack : ingredients) if (stack.contains(ingred)) return true;
|
||||
public boolean contains(Collection<PositionedStack> ingredients, Item ingredient) {
|
||||
for (PositionedStack stack : ingredients) if (stack.contains(ingredient)) return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -266,7 +270,8 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
|
||||
}
|
||||
|
||||
public static class RecipeTransferRectHandler implements IContainerInputHandler, IContainerTooltipHandler {
|
||||
private static HashMap<Class<? extends GuiContainer>, HashSet<RecipeTransferRect>> guiMap = new HashMap<>();
|
||||
private static final HashMap<Class<? extends GuiContainer>, HashSet<RecipeTransferRect>> guiMap =
|
||||
new HashMap<>();
|
||||
|
||||
public static void registerRectsToGuis(
|
||||
List<Class<? extends GuiContainer>> classes, List<RecipeTransferRect> rects) {
|
||||
@@ -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;
|
||||
}
|
||||
@@ -630,7 +638,7 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> handleTooltip(GuiRecipe gui, List<String> currenttip, int recipe) {
|
||||
public List<String> handleTooltip(GuiRecipe<?> gui, List<String> currenttip, int recipe) {
|
||||
if (GuiContainerManager.shouldShowTooltip(gui) && currenttip.size() == 0) {
|
||||
Point offset = gui.getRecipePosition(recipe);
|
||||
currenttip = transferRectTooltip(gui, transferRects, offset.x, offset.y, currenttip);
|
||||
@@ -639,20 +647,24 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> handleItemTooltip(GuiRecipe gui, ItemStack stack, List<String> currenttip, int recipe) {
|
||||
public List<String> handleItemTooltip(GuiRecipe<?> gui, ItemStack stack, List<String> currenttip, int recipe) {
|
||||
return currenttip;
|
||||
}
|
||||
|
||||
@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);
|
||||
public boolean keyTyped(GuiRecipe<?> gui, char keyChar, int keyCode, int recipe) {
|
||||
|
||||
if (NEIClientConfig.isKeyHashDown("gui.recipe")) {
|
||||
return transferRect(gui, recipe, false);
|
||||
} else if (NEIClientConfig.isKeyHashDown("gui.usage")) {
|
||||
return transferRect(gui, recipe, true);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mouseClicked(GuiRecipe gui, int button, int recipe) {
|
||||
public boolean mouseClicked(GuiRecipe<?> gui, int button, int recipe) {
|
||||
if (button == 0) return transferRect(gui, recipe, false);
|
||||
else if (button == 1) return transferRect(gui, recipe, true);
|
||||
|
||||
@@ -660,11 +672,33 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mouseScrolled(GuiRecipe gui, int scroll, int recipe) {
|
||||
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;
|
||||
}
|
||||
|
||||
private boolean transferRect(GuiRecipe gui, int recipe, boolean usage) {
|
||||
private boolean transferRect(GuiRecipe<?> gui, int recipe, boolean usage) {
|
||||
Point offset = gui.getRecipePosition(recipe);
|
||||
return transferRect(gui, transferRects, offset.x, offset.y, usage);
|
||||
}
|
||||
|
||||
@@ -795,6 +795,10 @@ smelting,gregtech:gt.blockmachines:674,,gregtech,TRUE,gregapi_post,,,,,
|
||||
smelting,gregtech:gt.blockmachines:675,,gregtech,TRUE,gregapi_post,,,,,
|
||||
gt.recipe.blastfurnace,gregtech:gt.blockmachines:1000,,gregtech,TRUE,gregapi_post,,,,,
|
||||
gt.recipe.implosioncompressor,gregtech:gt.blockmachines:1001,,gregtech,TRUE,gregapi_post,,,,,
|
||||
gt.recipe.largeboilerfakefuels,gregtech:gt.blockmachines:1020,,gregtech,TRUE,gregapi_post,,,,,
|
||||
gt.recipe.largeboilerfakefuels,gregtech:gt.blockmachines:1021,,gregtech,TRUE,gregapi_post,,,,,
|
||||
gt.recipe.largeboilerfakefuels,gregtech:gt.blockmachines:1022,,gregtech,TRUE,gregapi_post,,,,,
|
||||
gt.recipe.largeboilerfakefuels,gregtech:gt.blockmachines:1023,,gregtech,TRUE,gregapi_post,,,,,
|
||||
gt.recipe.vacuumfreezer,gregtech:gt.blockmachines:1002,,gregtech,TRUE,gregapi_post,,,,,
|
||||
smelting,gregtech:gt.blockmachines:1003,,gregtech,TRUE,gregapi_post,,,,,
|
||||
gt.recipe.dieselgeneratorfuel,gregtech:gt.blockmachines:1110,,gregtech,TRUE,gregapi_post,,,,,
|
||||
@@ -1142,7 +1146,6 @@ gt.recipe.circuitassembler,gregtech:gt.blockmachines:12091,,dreamcraft,TRUE,,,,,
|
||||
gt.recipe.circuitassembler,gregtech:gt.blockmachines:12092,,dreamcraft,TRUE,,,,,,
|
||||
gt.recipe.circuitassembler,gregtech:gt.blockmachines:12093,,dreamcraft,TRUE,,,,,,
|
||||
gt.recipe.circuitassembler,gregtech:gt.blockmachines:12094,,dreamcraft,TRUE,,,,,,
|
||||
gt.recipe.circuitassembler,gregtech:gt.blockmachines:12095,,dreamcraft,TRUE,,,,,,
|
||||
gt.recipe.circuitassembler,gregtech:gt.blockmachines:12096,,dreamcraft,TRUE,,,,,,
|
||||
gt.recipe.alloysmelter,gregtech:gt.blockmachines:31023,,miscutils,TRUE,,,,,,
|
||||
gt.recipe.assembler,gregtech:gt.blockmachines:876,,miscutils,TRUE,,,,,,
|
||||
@@ -1241,7 +1244,6 @@ bw.recipe.biolab,gregtech:gt.blockmachines:12706,,bartworks,TRUE,,,,,,
|
||||
bw.recipe.biolab,gregtech:gt.blockmachines:12707,,bartworks,TRUE,,,,,,
|
||||
bw.recipe.biolab,gregtech:gt.blockmachines:12708,,bartworks,TRUE,,,,,,
|
||||
bw.recipe.biolab,gregtech:gt.blockmachines:12709,,bartworks,TRUE,,,,,,
|
||||
bw.recipe.biolab,gregtech:gt.blockmachines:12710,,bartworks,TRUE,,,,,,
|
||||
bw.recipe.biolab,gregtech:gt.blockmachines:12711,,bartworks,TRUE,,,,,,
|
||||
bw.recipe.BacteriaVat,gregtech:gt.blockmachines:12712,,bartworks,TRUE,,,,,,
|
||||
gt.recipe.electricimplosioncompressor,gregtech:gt.blockmachines:12734,,bartworks,TRUE,,,,,,
|
||||
|
||||
|
@@ -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
|
||||
|
||||
Reference in new issue
Block a user