aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/gregtech/api/GregTech_API.java74
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainer_BasicMachine.java2
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java12
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java11
-rw-r--r--src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java44
5 files changed, 104 insertions, 39 deletions
diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java
index 7c47ec4a7b..87b0457f4f 100644
--- a/src/main/java/gregtech/api/GregTech_API.java
+++ b/src/main/java/gregtech/api/GregTech_API.java
@@ -1,5 +1,7 @@
package gregtech.api;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gregtech.api.enums.Materials;
@@ -32,24 +34,29 @@ import gregtech.api.world.GT_Worldgen;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
-import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.World;
import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.oredict.OreDictionary;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.Function;
+import java.util.function.BiFunction;
+import java.util.function.UnaryOperator;
+import java.util.stream.Collectors;
+import java.util.function.Predicate;
import static gregtech.api.enums.GT_Values.B;
import static gregtech.api.enums.GT_Values.L;
@@ -182,9 +189,22 @@ public class GregTech_API {
sHeatHazmatList = new GT_HashSet<>(),
sRadioHazmatList = new GT_HashSet<>(),
sElectroHazmatList = new GT_HashSet<>();
- private static final List<ItemStack> sRealConfigurationList = new ArrayList<>();
- private static final List<ItemStack> sConfigurationList = Collections.unmodifiableList(sRealConfigurationList);
- public static final GT_HashSet<GT_ItemStack> sCircuitProgrammerList = new GT_HashSet<>();
+ private static final Multimap<Integer, ItemStack> sRealConfigurationList = Multimaps.newListMultimap(new TreeMap<>(), ArrayList::new);
+ private static final Map<Integer, List<ItemStack>> sConfigurationLists = new HashMap<>();
+ private static final Map<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> sRealCircuitProgrammerList = new LinkedHashMap<>();
+ public static final Map<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> sCircuitProgrammerList = Collections.unmodifiableMap(sRealCircuitProgrammerList);
+ static {
+ registerCircuitProgrammer(new Predicate<ItemStack>() {
+ private final int screwdriverOreId = OreDictionary.getOreID("craftingToolScrewdriver");
+ @Override
+ public boolean test(ItemStack stack) {
+ for (int i : OreDictionary.getOreIDs(stack))
+ if (i == screwdriverOreId)
+ return true;
+ return false;
+ }
+ }, true);
+ }
/**
* The List of Dimensions, which are Whitelisted for the Teleporter. This list should not contain other Planets.
* Mystcraft Dimensions and other Dimensional Things should be allowed.
@@ -643,24 +663,50 @@ public class GregTech_API {
* Duplicates or invalid stacks will be silently ignored.
*/
public static void registerConfigurationCircuit(ItemStack aStack) {
+ registerConfigurationCircuit(aStack, 0);
+ }
+
+ /**
+ * Register a new ItemStack as configuration circuits.
+ * Duplicates or invalid stacks will be silently ignored.
+ * @param minTier the minimal tier this circuit can be offered for free, e.g. normal configuration circuit is available
+ * in LV+ single blocks, GT++ breakthrough circuit is offered in HV+ single blocks
+ */
+ public static void registerConfigurationCircuit(ItemStack aStack, int minTier) {
if (GT_Utility.isStackInvalid(aStack))
return;
- for (ItemStack tRegistered : sRealConfigurationList)
+ for (ItemStack tRegistered : sRealConfigurationList.values())
if (GT_Utility.areStacksEqual(tRegistered, aStack))
return;
- sRealConfigurationList.add(GT_Utility.copyAmount(0, aStack));
+ ItemStack stack = GT_Utility.copyAmount(0, aStack);
+ sRealConfigurationList.put(minTier, stack);
+ sConfigurationLists.entrySet().stream()
+ .filter(e -> e.getKey() >= minTier)
+ .forEach(e -> e.getValue().add(stack));
}
/**
- * Get a list of Configuration circuits. All of these stacks will have a stack size of 0.
- * Use {@link #registerConfigurationCircuit(ItemStack)} to add to this list.
+ * Get a list of Configuration circuits. These stacks will have a stack size of 0.
+ * Use {@link #registerConfigurationCircuit(ItemStack, int)} or its overload to add to this list.
*
+ * @param machineTier The voltage tier where this list will be used. use Integer.MAX_VALUE to get all circuits
* @return An unmodifiable view of actual list.
- * It will reflect the changes to the underlying list as new circuits are registered.
* DO NOT MODIFY THE ItemStacks!
*/
- public static List<ItemStack> getConfigurationCircuitList() {
- return sConfigurationList;
+ public static List<ItemStack> getConfigurationCircuitList(int machineTier) {
+ return Collections.unmodifiableList(sConfigurationLists.computeIfAbsent(machineTier, (t) -> sRealConfigurationList.entries().stream().filter(e -> e.getKey() <= machineTier).map(Map.Entry::getValue).collect(Collectors.toList())));
+ }
+
+ public static void registerCircuitProgrammer(ItemStack stack, boolean ignoreNBT, boolean useContainer) {
+ registerCircuitProgrammer(rhs -> GT_Utility.areStacksEqual(stack, rhs, ignoreNBT), useContainer);
+ }
+
+ public static void registerCircuitProgrammer(Predicate<ItemStack> predicate, boolean useContainer) {
+ sRealCircuitProgrammerList.put(predicate, useContainer ? (s, p) -> s.getItem().getContainerItem(s) : (s, p) -> s);
+ }
+
+ public static void registerCircuitProgrammer(Predicate<ItemStack> predicate, BiFunction<ItemStack, EntityPlayerMP, ItemStack> doDamage) {
+ sRealCircuitProgrammerList.put(predicate, doDamage);
}
public static void registerCover(ItemStack aStack, ITexture aCover, GT_CoverBehavior aBehavior) {
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer_BasicMachine.java b/src/main/java/gregtech/api/gui/GT_GUIContainer_BasicMachine.java
index df02d219fd..f9580aa5fd 100644
--- a/src/main/java/gregtech/api/gui/GT_GUIContainer_BasicMachine.java
+++ b/src/main/java/gregtech/api/gui/GT_GUIContainer_BasicMachine.java
@@ -50,7 +50,7 @@ public class GT_GUIContainer_BasicMachine extends GT_GUIContainerMetaTile_Machin
private void openSelectCircuitDialog() {
mc.displayGuiScreen(new GT_GUIDialogSelectItem(
StatCollector.translateToLocal("GT5U.machines.select_circuit"),
- null,
+ mContainer.mTileEntity.getMetaTileEntity().getStackForm(0),
this,
this::onCircuitSelected,
getMachine().getConfigurationCircuits(),
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java
index 2c1d8aa886..045730dd7f 100644
--- a/src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java
@@ -4,8 +4,10 @@ import codechicken.lib.gui.GuiDraw;
import gregtech.api.interfaces.IGuiScreen;
import gregtech.api.util.GT_UtilityClient;
import net.minecraft.client.Minecraft;
+import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
import java.awt.*;
import java.util.List;
@@ -108,9 +110,17 @@ public class GT_GuiFakeItemButton implements IGuiScreen.IGuiElement {
GT_GuiIcon.render(bgIcon, xPosition-1, yPosition-1, 18, 18,0,true);
}
- if (item != null)
+ if (item != null) {
+ if (item.getItem() instanceof ItemBlock) {
+ GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ }
gui.getItemRenderer().renderItemAndEffectIntoGUI(gui.getFontRenderer(), Minecraft.getMinecraft().getTextureManager(), item, xPosition, yPosition);
+ if (item.getItem() instanceof ItemBlock)
+ GL11.glPopAttrib();
+ }
+
if (getMimicSlot())
if (getBounds().contains(mouseX - gui.getGuiLeft(), mouseY - gui.getGuiTop())) {
GL11.glDisable(GL11.GL_LIGHTING);
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java
index 8f77b6ac5a..92bf07f379 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java
@@ -139,6 +139,13 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B
}
@Override
+ public void setInventorySlotContents(int aIndex, ItemStack aStack) {
+ if (allowSelectCircuit() && aIndex == getCircuitSlot() && aStack != null && aStack.stackSize != 0)
+ aStack = GT_Utility.copyAmount(0, aStack);
+ super.setInventorySlotContents(aIndex, aStack);
+ }
+
+ @Override
public GT_MetaTileEntity_Cleanroom getCallbackBase() {
return this.mCleanroom;
}
@@ -210,7 +217,7 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B
@Override
public boolean isValidSlot(int aIndex) {
- return aIndex > 0 && super.isValidSlot(aIndex) && aIndex != OTHER_SLOT_COUNT + mInputSlotCount + mOutputItems.length;
+ return aIndex > 0 && super.isValidSlot(aIndex) && aIndex != getCircuitSlot() && aIndex != OTHER_SLOT_COUNT + mInputSlotCount + mOutputItems.length;
}
@Override
@@ -871,7 +878,7 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B
* This list is unmodifiable. Its elements are not supposed to be modified in any way!
*/
public List<ItemStack> getConfigurationCircuits() {
- return GregTech_API.getConfigurationCircuitList();
+ return GregTech_API.getConfigurationCircuitList(mTier);
}
/**
diff --git a/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java b/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java
index 9ae287c610..e1393e7d04 100644
--- a/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java
+++ b/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java
@@ -8,7 +8,6 @@ import gregtech.api.enums.GT_Values;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.Materials;
import gregtech.api.enums.OrePrefixes;
-import gregtech.api.enums.ToolDictNames;
import gregtech.api.gui.GT_GUIDialogSelectItem;
import gregtech.api.interfaces.INetworkUpdatableItem;
import gregtech.api.items.GT_Generic_Item;
@@ -33,11 +32,13 @@ import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.FakePlayer;
-import net.minecraftforge.oredict.OreDictionary;
+import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.function.Predicate;
import static gregtech.GT_Mod.GT_FML_LOGGER;
import static gregtech.api.enums.GT_Values.RES_PATH_ITEM;
@@ -56,7 +57,7 @@ public class GT_IntegratedCircuit_Item extends GT_Generic_Item implements INetwo
ALL_VARIANTS.add(new ItemStack(this, 0, 0));
for (int i = 1; i <= 24; i++) {
ItemStack aStack = new ItemStack(this, 0, i);
- GregTech_API.registerConfigurationCircuit(aStack);
+ GregTech_API.registerConfigurationCircuit(aStack, 1);
ALL_VARIANTS.add(aStack);
}
@@ -160,12 +161,11 @@ public class GT_IntegratedCircuit_Item extends GT_Generic_Item implements INetwo
return true;
if (!player.capabilities.isCreativeMode) {
- int toolIndex = findConfiguratorInInv(player);
- if (toolIndex < 0) return true;
+ Pair<Integer, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> toolIndex = findConfiguratorInInv(player);
+ if (toolIndex == null) return true;
ItemStack[] mainInventory = player.inventory.mainInventory;
- ItemStack oldToolStack = mainInventory[toolIndex];
- mainInventory[toolIndex] = oldToolStack.getItem().getContainerItem(oldToolStack);
+ mainInventory[toolIndex.getKey()] = toolIndex.getValue().apply(mainInventory[toolIndex.getKey()], player);
}
stack.setItemDamage(meta);
@@ -178,11 +178,11 @@ public class GT_IntegratedCircuit_Item extends GT_Generic_Item implements INetwo
if (player instanceof FakePlayer || !world.isRemote) return false;
// check if any screwdriver
ItemStack configuratorStack;
- if (player.capabilities.isCreativeMode) {
+ if (!player.capabilities.isCreativeMode) {
configuratorStack = null;
} else {
- int configurator = findConfiguratorInInv(player);
- if (configurator < 0) {
+ Pair<Integer, ?> configurator = findConfiguratorInInv(player);
+ if (configurator == null) {
int count;
try {
count = Integer.parseInt(StatCollector.translateToLocal("GT5U.item.programmed_circuit.no_screwdriver.count"));
@@ -193,13 +193,13 @@ public class GT_IntegratedCircuit_Item extends GT_Generic_Item implements INetwo
player.addChatComponentMessage(new ChatComponentTranslation("GT5U.item.programmed_circuit.no_screwdriver." + XSTR.XSTR_INSTANCE.nextInt(count)));
return false;
}
- configuratorStack = player.inventory.mainInventory[configurator];
+ configuratorStack = player.inventory.mainInventory[configurator.getKey()];
}
- openSelectorGui(player, configuratorStack, stack.getItemDamage());
+ openSelectorGui(configuratorStack, stack.getItemDamage());
return true;
}
- private void openSelectorGui(EntityPlayer player, ItemStack configurator, int meta) {
+ private void openSelectorGui(ItemStack configurator, int meta) {
FMLCommonHandler.instance().showGuiScreen(new GT_GUIDialogSelectItem(
StatCollector.translateToLocal("GT5U.item.programmed_circuit.select.header"),
configurator,
@@ -217,16 +217,18 @@ public class GT_IntegratedCircuit_Item extends GT_Generic_Item implements INetwo
GT_Values.NW.sendToServer(new GT_Packet_UpdateItem(tag));
}
- private static int findConfiguratorInInv(EntityPlayer player) {
- int screwdriverOreId = OreDictionary.getOreID(ToolDictNames.craftingToolScrewdriver.name());
+ private static Pair<Integer, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> findConfiguratorInInv(EntityPlayer player) {
ItemStack[] mainInventory = player.inventory.mainInventory;
for (int j = 0, mainInventoryLength = mainInventory.length; j < mainInventoryLength; j++) {
ItemStack toolStack = mainInventory[j];
- boolean accepted = GT_Utility.isStackInList(toolStack, GregTech_API.sCircuitProgrammerList) ||
- Arrays.stream(OreDictionary.getOreIDs(toolStack)).anyMatch(i -> i == screwdriverOreId);
- if (accepted)
- return j;
+
+ if (!GT_Utility.isStackValid(toolStack))
+ continue;
+
+ for (Map.Entry<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> p : GregTech_API.sCircuitProgrammerList.entrySet())
+ if (p.getKey().test(toolStack))
+ return Pair.of(j, p.getValue());
}
- return -1;
+ return null;
}
}