diff options
author | Glease <4586901+Glease@users.noreply.github.com> | 2021-12-03 14:29:00 +0800 |
---|---|---|
committer | Glease <4586901+Glease@users.noreply.github.com> | 2021-12-04 00:13:52 +0800 |
commit | 8c029eab281e8612da2dd12f8b0d61ee8c8417a2 (patch) | |
tree | 332db14831b285b1fa5f08258e59d642c676428a /src | |
parent | 92c78f346995f7140902f9719daa89d427f61a04 (diff) | |
download | GT5-Unofficial-8c029eab281e8612da2dd12f8b0d61ee8c8417a2.tar.gz GT5-Unofficial-8c029eab281e8612da2dd12f8b0d61ee8c8417a2.tar.bz2 GT5-Unofficial-8c029eab281e8612da2dd12f8b0d61ee8c8417a2.zip |
Make machine reconfiguration interface a little nicer
also tweaked the API a little for GT++ conf circuits and bartworks circuit programmer
Signed-off-by: Glease <4586901+Glease@users.noreply.github.com>
Diffstat (limited to 'src')
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; } } |