From 64ecdd82bd83a47cf5a5952edb49654c8bb7a576 Mon Sep 17 00:00:00 2001 From: Adrian Date: Fri, 7 Aug 2015 13:23:47 +0200 Subject: [PATCH] refactor match handler example generation, add tool handling, minor tweaks and fixes --- .../api/lists/ListMatchHandler.java | 23 ++++++++++++ .../buildcraft/api/lists}/ListRegistry.java | 5 ++- api/buildcraft/api/lists/package-info.java | 12 +++++++ buildcraft_resources/changelog/7.1.1 | 9 +++++ common/buildcraft/BuildCraftCore.java | 9 ++--- common/buildcraft/BuildCraftRobotics.java | 4 +-- common/buildcraft/BuildCraftTransport.java | 10 +++--- .../core/lib/gui/GuiAdvancedInterface.java | 1 + common/buildcraft/core/list/GuiListNew.java | 7 ++-- .../buildcraft/core/list/ListHandlerNew.java | 33 +++++++++++++++-- .../core/list/ListMatchHandler.java | 17 --------- .../core/list/ListMatchHandlerClass.java | 29 ++++----------- .../core/list/ListMatchHandlerFluid.java | 11 ++++++ .../list/ListMatchHandlerOreDictionary.java | 13 +++++++ .../core/list/ListMatchHandlerTools.java | 35 +++++++++++++++++++ 15 files changed, 161 insertions(+), 57 deletions(-) create mode 100644 api/buildcraft/api/lists/ListMatchHandler.java rename {common/buildcraft/core/list => api/buildcraft/api/lists}/ListRegistry.java (71%) create mode 100644 api/buildcraft/api/lists/package-info.java create mode 100644 buildcraft_resources/changelog/7.1.1 delete mode 100644 common/buildcraft/core/list/ListMatchHandler.java create mode 100644 common/buildcraft/core/list/ListMatchHandlerTools.java diff --git a/api/buildcraft/api/lists/ListMatchHandler.java b/api/buildcraft/api/lists/ListMatchHandler.java new file mode 100644 index 00000000..7ed405a8 --- /dev/null +++ b/api/buildcraft/api/lists/ListMatchHandler.java @@ -0,0 +1,23 @@ +package buildcraft.api.lists; + +import java.util.List; +import net.minecraft.item.ItemStack; + +public abstract class ListMatchHandler { + public enum Type { + TYPE, MATERIAL, CLASS + } + + public abstract boolean matches(Type type, ItemStack stack, ItemStack target, boolean precise); + public abstract boolean isValidSource(Type type, ItemStack stack); + + /** + * Get custom client examples. + * @param type + * @param stack + * @return A List (even empty!) if the examples satisfy this handler, null if iteration and .matches should be used instead. + */ + public List getClientExamples(Type type, ItemStack stack) { + return null; + } +} diff --git a/common/buildcraft/core/list/ListRegistry.java b/api/buildcraft/api/lists/ListRegistry.java similarity index 71% rename from common/buildcraft/core/list/ListRegistry.java rename to api/buildcraft/api/lists/ListRegistry.java index 4dbbecc5..ce9f0566 100644 --- a/common/buildcraft/core/list/ListRegistry.java +++ b/api/buildcraft/api/lists/ListRegistry.java @@ -1,10 +1,13 @@ -package buildcraft.core.list; +package buildcraft.api.lists; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import net.minecraft.item.Item; + public final class ListRegistry { + public static final List> itemClassAsType = new ArrayList>(); private static final List handlers = new ArrayList(); private ListRegistry() { diff --git a/api/buildcraft/api/lists/package-info.java b/api/buildcraft/api/lists/package-info.java new file mode 100644 index 00000000..8289f37b --- /dev/null +++ b/api/buildcraft/api/lists/package-info.java @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team + * http://www.mod-buildcraft.com + * + * The BuildCraft API is distributed under the terms of the MIT License. + * Please check the contents of the license, which should be located + * as "LICENSE.API" in the BuildCraft source code distribution. + */ +@API(apiVersion = "1.0", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|lists") +package buildcraft.api.lists; +import cpw.mods.fml.common.API; + diff --git a/buildcraft_resources/changelog/7.1.1 b/buildcraft_resources/changelog/7.1.1 new file mode 100644 index 00000000..5f7b57ca --- /dev/null +++ b/buildcraft_resources/changelog/7.1.1 @@ -0,0 +1,9 @@ +Improvements: + +* Lists + * Lists now accept empty Lists for sorting (asie) + * Support for sorting tools by type (asie) + +Bugs fixed: + +* Hovering over slot causing incorrect item lighting (asie) diff --git a/common/buildcraft/BuildCraftCore.java b/common/buildcraft/BuildCraftCore.java index 4eccd666..e34d05c2 100644 --- a/common/buildcraft/BuildCraftCore.java +++ b/common/buildcraft/BuildCraftCore.java @@ -131,8 +131,9 @@ import buildcraft.core.lib.utils.XorShift128Random; import buildcraft.core.list.ListMatchHandlerClass; import buildcraft.core.list.ListMatchHandlerFluid; import buildcraft.core.list.ListMatchHandlerOreDictionary; +import buildcraft.core.list.ListMatchHandlerTools; import buildcraft.core.list.ListOreDictionaryCache; -import buildcraft.core.list.ListRegistry; +import buildcraft.api.lists.ListRegistry; import buildcraft.core.list.ListTooltipHandler; import buildcraft.core.network.PacketHandlerCore; import buildcraft.core.properties.WorldPropertyIsDirt; @@ -466,7 +467,7 @@ public class BuildCraftCore extends BuildCraftMod { FillerManager.registry.addPattern(new PatternCylinder()); FillerManager.registry.addPattern(new PatternFrame()); } catch (Error error) { - BCLog.logErrorAPI("Buildcraft", error, IFillerPattern.class); + BCLog.logErrorAPI(error, IFillerPattern.class); throw error; } @@ -477,12 +478,12 @@ public class BuildCraftCore extends BuildCraftMod { ListRegistry.registerHandler(new ListMatchHandlerClass()); ListRegistry.registerHandler(new ListMatchHandlerFluid()); - ListMatchHandlerClass.itemClasses.add(ItemFood.class); + ListRegistry.registerHandler(new ListMatchHandlerTools()); + ListRegistry.itemClassAsType.add(ItemFood.class); } @Mod.EventHandler public void postInit(FMLPostInitializationEvent event) { - OreDictionary.registerOre("dustTinyRedstone", Blocks.fence_gate); BCLog.logger.info("BuildCraft's fake player: UUID = " + gameProfile.getId().toString() + ", name = '" + gameProfile.getName() + "'!"); for (Object o : Block.blockRegistry) { diff --git a/common/buildcraft/BuildCraftRobotics.java b/common/buildcraft/BuildCraftRobotics.java index e1bdabd8..a50646cc 100644 --- a/common/buildcraft/BuildCraftRobotics.java +++ b/common/buildcraft/BuildCraftRobotics.java @@ -37,6 +37,7 @@ import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.MinecraftForge; import buildcraft.api.boards.RedstoneBoardRegistry; +import buildcraft.api.lists.ListRegistry; import buildcraft.api.recipes.BuildcraftRecipeRegistry; import buildcraft.api.robots.RobotManager; import buildcraft.api.statements.IActionInternal; @@ -49,7 +50,6 @@ import buildcraft.core.DefaultProps; import buildcraft.core.InterModComms; import buildcraft.core.Version; import buildcraft.core.config.ConfigManager; -import buildcraft.core.list.ListMatchHandlerClass; import buildcraft.core.network.EntityIds; import buildcraft.core.proxy.CoreProxy; import buildcraft.robotics.BlockRequester; @@ -340,7 +340,7 @@ public class BuildCraftRobotics extends BuildCraftMod { RoboticsProxy.proxy.registerRenderers(); - ListMatchHandlerClass.itemClasses.add(ItemRobot.class); + ListRegistry.itemClassAsType.add(ItemRobot.class); } public static void loadRecipes() { diff --git a/common/buildcraft/BuildCraftTransport.java b/common/buildcraft/BuildCraftTransport.java index 8d79bb03..cd435c48 100644 --- a/common/buildcraft/BuildCraftTransport.java +++ b/common/buildcraft/BuildCraftTransport.java @@ -51,6 +51,7 @@ import buildcraft.api.core.IIconProvider; import buildcraft.api.facades.FacadeAPI; import buildcraft.api.gates.GateExpansions; import buildcraft.api.gates.IGateExpansion; +import buildcraft.api.lists.ListRegistry; import buildcraft.api.statements.IActionInternal; import buildcraft.api.statements.ITriggerInternal; import buildcraft.api.statements.StatementManager; @@ -66,7 +67,6 @@ import buildcraft.core.config.ConfigManager; import buildcraft.core.lib.items.ItemBuildCraft; import buildcraft.core.lib.network.ChannelHandler; import buildcraft.core.lib.utils.ColorUtils; -import buildcraft.core.list.ListMatchHandlerClass; import buildcraft.core.proxy.CoreProxy; import buildcraft.transport.BlockFilteredBuffer; import buildcraft.transport.BlockGenericPipe; @@ -552,10 +552,10 @@ public class BuildCraftTransport extends BuildCraftMod { } } - ListMatchHandlerClass.itemClasses.add(ItemPipe.class); - ListMatchHandlerClass.itemClasses.add(ItemGate.class); - ListMatchHandlerClass.itemClasses.add(ItemFacade.class); - ListMatchHandlerClass.itemClasses.add(ItemPipeWire.class); + ListRegistry.itemClassAsType.add(ItemPipe.class); + ListRegistry.itemClassAsType.add(ItemGate.class); + ListRegistry.itemClassAsType.add(ItemFacade.class); + ListRegistry.itemClassAsType.add(ItemPipeWire.class); } public void reloadConfig(ConfigManager.RestartRequirement restartType) { diff --git a/common/buildcraft/core/lib/gui/GuiAdvancedInterface.java b/common/buildcraft/core/lib/gui/GuiAdvancedInterface.java index ad189d4f..fadb0608 100644 --- a/common/buildcraft/core/lib/gui/GuiAdvancedInterface.java +++ b/common/buildcraft/core/lib/gui/GuiAdvancedInterface.java @@ -97,6 +97,7 @@ public abstract class GuiAdvancedInterface extends GuiBuildCraft { if (slot != null) { slot.drawTooltip(this, mouseX, mouseY); + RenderHelper.enableGUIStandardItemLighting(); } } diff --git a/common/buildcraft/core/list/GuiListNew.java b/common/buildcraft/core/list/GuiListNew.java index afcc61dd..5a3e0a3b 100755 --- a/common/buildcraft/core/list/GuiListNew.java +++ b/common/buildcraft/core/list/GuiListNew.java @@ -19,6 +19,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import buildcraft.BuildCraftCore; +import buildcraft.api.lists.ListMatchHandler; import buildcraft.core.ItemList; import buildcraft.core.lib.gui.AdvancedSlot; import buildcraft.core.lib.gui.GuiAdvancedInterface; @@ -175,9 +176,9 @@ public class GuiListNew extends GuiAdvancedInterface implements IButtonClickEven drawTooltipForSlotAt(par1, par2); } - private boolean isCarryingList() { + private boolean isCarryingNonEmptyList() { ItemStack stack = mc.thePlayer.inventory.getItemStack(); - return stack != null && stack.getItem() instanceof ItemList; + return stack != null && stack.getItem() instanceof ItemList && stack.getTagCompound() != null; } private boolean hasListEquipped() { @@ -188,7 +189,7 @@ public class GuiListNew extends GuiAdvancedInterface implements IButtonClickEven protected void mouseClicked(int x, int y, int b) { super.mouseClicked(x, y, b); - if (isCarryingList() || !hasListEquipped()) { + if (isCarryingNonEmptyList() || !hasListEquipped()) { return; } diff --git a/common/buildcraft/core/list/ListHandlerNew.java b/common/buildcraft/core/list/ListHandlerNew.java index 0921feaa..457fa02a 100644 --- a/common/buildcraft/core/list/ListHandlerNew.java +++ b/common/buildcraft/core/list/ListHandlerNew.java @@ -4,10 +4,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import buildcraft.api.lists.ListMatchHandler; +import buildcraft.api.lists.ListRegistry; import buildcraft.core.lib.inventory.StackHelper; import buildcraft.core.lib.utils.NBTUtils; @@ -130,13 +134,36 @@ public final class ListHandlerNew { List stackList = new ArrayList(); if (stacks[0] != null) { List handlers = ListRegistry.getHandlers(); + List handlersCustom = new ArrayList(); ListMatchHandler.Type type = getSortingType(); for (ListMatchHandler h : handlers) { - List examples = h.getClientExamples(type, stacks[0]); - if (examples != null) { - stackList.addAll(examples); + if (h.isValidSource(type, stacks[0])) { + List examples = h.getClientExamples(type, stacks[0]); + if (examples != null) { + stackList.addAll(examples); + } else { + handlersCustom.add(h); + } } } + if (handlersCustom.size() > 0) { + for (Object o: Item.itemRegistry) { + if (o != null && o instanceof Item) { + Item i = (Item) o; + List examples = new ArrayList(); + i.getSubItems(i, CreativeTabs.tabMisc, examples); + for (ItemStack s : examples) { + for (ListMatchHandler mh : handlersCustom) { + if (mh.matches(type, stacks[0], s, false)) { + stackList.add(s); + break; + } + } + } + } + } + } + Collections.shuffle(stackList); } return stackList; diff --git a/common/buildcraft/core/list/ListMatchHandler.java b/common/buildcraft/core/list/ListMatchHandler.java deleted file mode 100644 index f6d4366d..00000000 --- a/common/buildcraft/core/list/ListMatchHandler.java +++ /dev/null @@ -1,17 +0,0 @@ -package buildcraft.core.list; - -import java.util.List; -import net.minecraft.item.ItemStack; - -/** - * Internal interface for now - it will become public once its shape is set - * in stone better. - */ -public abstract class ListMatchHandler { - public enum Type { - TYPE, MATERIAL, CLASS - } - - public abstract boolean matches(Type type, ItemStack stack, ItemStack target, boolean precise); - public abstract List getClientExamples(Type type, ItemStack stack); -} diff --git a/common/buildcraft/core/list/ListMatchHandlerClass.java b/common/buildcraft/core/list/ListMatchHandlerClass.java index d4527992..b8f76928 100644 --- a/common/buildcraft/core/list/ListMatchHandlerClass.java +++ b/common/buildcraft/core/list/ListMatchHandlerClass.java @@ -1,41 +1,26 @@ package buildcraft.core.list; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class ListMatchHandlerClass extends ListMatchHandler { - public static final Set> itemClasses = new HashSet>(); +import buildcraft.api.lists.ListMatchHandler; +import buildcraft.api.lists.ListRegistry; +public class ListMatchHandlerClass extends ListMatchHandler { @Override public boolean matches(Type type, ItemStack stack, ItemStack target, boolean precise) { if (type == Type.TYPE) { Class kl = stack.getItem().getClass(); - return itemClasses.contains(kl) && kl.equals(target.getClass()); + return ListRegistry.itemClassAsType.contains(kl) && kl.equals(target.getClass()); } return false; } @Override - public List getClientExamples(Type type, ItemStack stack) { + public boolean isValidSource(Type type, ItemStack stack) { if (type == Type.TYPE) { Class kl = stack.getItem().getClass(); - List examples = new ArrayList(); - if (itemClasses.contains(kl)) { - for (Object key : Item.itemRegistry.getKeys()) { - Item i = (Item) Item.itemRegistry.getObject(key); - if (i != null && kl.equals(i.getClass())) { - i.getSubItems(i, CreativeTabs.tabMisc, examples); - } - } - } - return examples; + return ListRegistry.itemClassAsType.contains(kl); } - return null; + return false; } } diff --git a/common/buildcraft/core/list/ListMatchHandlerFluid.java b/common/buildcraft/core/list/ListMatchHandlerFluid.java index 51ea6a18..087b617c 100644 --- a/common/buildcraft/core/list/ListMatchHandlerFluid.java +++ b/common/buildcraft/core/list/ListMatchHandlerFluid.java @@ -7,6 +7,7 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; +import buildcraft.api.lists.ListMatchHandler; import buildcraft.core.lib.inventory.StackHelper; import buildcraft.core.lib.utils.FluidUtils; @@ -31,6 +32,16 @@ public class ListMatchHandlerFluid extends ListMatchHandler { return false; } + @Override + public boolean isValidSource(Type type, ItemStack stack) { + if (type == Type.TYPE) { + return FluidContainerRegistry.isContainer(stack); + } else if (type == Type.MATERIAL) { + return FluidUtils.getFluidStackFromItemStack(stack) != null; + } + return false; + } + @Override public List getClientExamples(Type type, ItemStack stack) { if (type == Type.MATERIAL) { diff --git a/common/buildcraft/core/list/ListMatchHandlerOreDictionary.java b/common/buildcraft/core/list/ListMatchHandlerOreDictionary.java index 95d68f21..3a5c32be 100644 --- a/common/buildcraft/core/list/ListMatchHandlerOreDictionary.java +++ b/common/buildcraft/core/list/ListMatchHandlerOreDictionary.java @@ -7,6 +7,8 @@ import java.util.Set; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; + +import buildcraft.api.lists.ListMatchHandler; import buildcraft.core.lib.inventory.StackHelper; public class ListMatchHandlerOreDictionary extends ListMatchHandler { @@ -66,6 +68,17 @@ public class ListMatchHandlerOreDictionary extends ListMatchHandler { return false; } + @Override + public boolean isValidSource(Type type, ItemStack stack) { + if (OreDictionary.getOreIDs(stack).length > 0) { + return true; + } + if (type == Type.TYPE && stack.getHasSubtypes()) { + return true; + } + return false; + } + private String getBestOreString(int[] oreIds) { String s = null, st; int suc = 0, suct; diff --git a/common/buildcraft/core/list/ListMatchHandlerTools.java b/common/buildcraft/core/list/ListMatchHandlerTools.java new file mode 100644 index 00000000..39faa014 --- /dev/null +++ b/common/buildcraft/core/list/ListMatchHandlerTools.java @@ -0,0 +1,35 @@ +package buildcraft.core.list; + +import java.util.HashSet; +import java.util.Set; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import buildcraft.api.lists.ListMatchHandler; + +public class ListMatchHandlerTools extends ListMatchHandler { + public static final Set> itemClasses = new HashSet>(); + + @Override + public boolean matches(Type type, ItemStack stack, ItemStack target, boolean precise) { + if (type == Type.TYPE) { + Set toolClassesSource = stack.getItem().getToolClasses(stack); + Set toolClassesTarget = target.getItem().getToolClasses(stack); + if (toolClassesSource.size() > 0 && toolClassesTarget.size() > 0) { + for (String s : toolClassesSource) { + if (!toolClassesTarget.contains(s)) { + return false; + } + } + return true; + } + } + return false; + } + + @Override + public boolean isValidSource(Type type, ItemStack stack) { + return stack.getItem().getToolClasses(stack).size() > 0; + } +}