diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100755 index 000000000..9049acaef --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,21 @@ +#### Issue description: + +#### What happens: + +#### What you expected to happen: + +#### Steps to reproduce: +1. +2. +3. +... + +#### Version (Make sure you are on the latest version before reporting): + +- Minecraft: 1.10.2 +- Forge: +- Refined Storage: + +#### If a (crash)log is relevant for this issue, link it here: + +[pastebin/gist/etc link here] \ No newline at end of file diff --git a/.gitignore b/.gitignore index ae019ee66..defc03d02 100755 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ run/ *.iws .idea/ out/ +translation-diff.diff diff --git a/CHANGELOG.md b/CHANGELOG.md index 4875e76ec..e90696985 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,101 @@ # Refined Storage Changelog +### 0.9 +**Bugfixes** +- Fixed crash with Grid +- Fixed Grid Filter only updating the Grid when reopening the GUI +- Priority field and detector amount field can now display 4 digits at a time + +**Features** +- Added fluid storage +- Energy usage of Wireless Grid is now configurable + +### 0.8.20 +**Bugfixes** +- Fixed crash with Grid + +### 0.8.19 +**Bugfixes** +- Fixed item duplication bug with External Storage +- Fixed External Storage taking too long to update storage +- Fixed crash with Grid +- Fixed crash when shift clicking unsupported item in a slot + +### 0.8.18 +**Bugfixes** +- Fixed Detector mode not persisting +- Fixed bug where scrollbar didn't scroll correctly and thus hiding some items +- Fixed Network Transmitter not dropping inventory when broken + +### 0.8.17 +**Bugfixes** +- Fixed Grid causing sorting lag on the client + +### 0.8.16 +**Bugfixes** +- Fixed issue with IC2 integration causing console spam +- Slight performance increase and network efficiency improvement in all GUI's +- Slight performance increase in Grid GUI +- Fixed not being able to change some configs in blocks +- Fixed serverside configs not syncing up with clientside +- Fixed not being able to move inventory items in Grid GUI's to hotbar via the number keys +- Fixed Relays when being in "Ignore Redstone" mode using up energy +- Fixed Crafter facing bottom side on placement +- Improved collisions of Cable parts +- You now have to click the actual cable part head in order to get the GUI open + +**Features** +- Added German translation by ChillUpX +- Grid Filters can now only filter 9 items, but, Grids take 4 filters now instead +- Grid Filters can now be configured to compare on NBT and/ or damage +- It is now possible to shift click items to the Storage Device filters +- Updated to Forge 2046 +- Updated Tesla +- Java 8 is now a requirement +- Added MCMultiPart integration for Cable Parts + +### 0.8.15 +**Bugfixes** +- Fixed server startup crash + +### 0.8.14 +**Features** +- Added Interdimensional Upgrade so the Network Transmitter can work over different dimensions + +### 0.8.13 +**Bugfixes** +- Fixed rendering crash with Disk Drive +- Fixed crash when quickly toggling sorting direction in Grid +- Fixed not being able to clear exporter row in interface + +**Features** +- Added config option to set the base energy usage of the Controller (default is 0) +- Added Grid Filter item to filter items in any Grid +- Added support for processing patterns with big stacksizes +- Added Network Transmitter, Network Receiver and Network Cards +- The slot where the Wireless Grid is in in the Wireless Grid GUI is now disabled, so the item can't be thrown out of the inventory by accident +- Changed Relay recipe to use redstone torch instead of Basic Processor +- Placed machines now face the block they are placed on, like hoppers + +**NOTE:** Config change: the config options for the energy capacity of the Controller and wether the Controller uses energy are now in a different config category called "controller", if you changed these config options, don't forget the change it under the new category. + +### 0.8.12 +**Bugfixes** +- Fixed dupe bug when shift clicking output slot in grid + ### 0.8.11 **Bugfixes** - Fixed minor dupe bug with JEI transferring - Fixed exporter crafting upgrades taking priority over other tasks +- Solderer upgrades go to upgrades slots first now when shift clicking - Fixed NPE with incorrectly initialized disks +- Fixed not being able to take out items of Grid 2K16 +- Fixed not being able to start autocrafting for certain items (most notably IC2 items) **Features** - Added X button to Processing Pattern Encoder to clear configuration of inputs and outputs +- Added Grid view toggle buttons (regular, craftable items only, no craftable items) +- Added ability to shift click items into Importer, Exporter, Constructor, Destructor and Detector to set up whitelist / blacklist configurations easier - Re-added opposite facing on shift click functionality - Updated to Forge 2014 diff --git a/CREDITS.md b/CREDITS.md index ade1746e9..6f68c2dde 100755 --- a/CREDITS.md +++ b/CREDITS.md @@ -10,3 +10,4 @@ ## Translations - ChaoticTabris (Portuguese (Brazilian) translation) - Leventovitch (French translation) +- ChillUpX (German translation) \ No newline at end of file diff --git a/build.gradle b/build.gradle index 95d11e44b..bb988c5ac 100755 --- a/build.gradle +++ b/build.gradle @@ -12,12 +12,15 @@ buildscript { } apply plugin: 'net.minecraftforge.gradle.forge' -version = "0.8.11" +version = "0.9" group = "refinedstorage" archivesBaseName = "refinedstorage" +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + minecraft { - version = "1.10.2-12.18.1.2014" + version = "1.10.2-12.18.1.2065" runDir = "run" useDepAts = true mappings = "snapshot_20160518" @@ -34,12 +37,16 @@ repositories { name = "ic2" url = "http://maven.ic2.player.to/" } + maven { + url "http://maven.amadornes.com/" + } } dependencies { - deobfCompile "mezz.jei:jei_1.10.2:3.7.+" - compile "net.darkhax.tesla:Tesla:1.10-1.2.0.34" - compile "net.industrial-craft:industrialcraft-2:2.6.9-ex110:api" + deobfCompile "mezz.jei:jei_1.10.2:3.9.+" + compile "net.darkhax.tesla:Tesla:1.10-1.2.+" + compile "net.industrial-craft:industrialcraft-2:2.6.41-ex110:api" + deobfCompile "MCMultiPart:MCMultiPart:1.2.1+:universal" } processResources { diff --git a/screenshots/wireless_networks.png b/screenshots/wireless_networks.png new file mode 100755 index 000000000..615beb203 Binary files /dev/null and b/screenshots/wireless_networks.png differ diff --git a/src/main/java/refinedstorage/RefinedStorage.java b/src/main/java/refinedstorage/RefinedStorage.java index d4afca352..c37c5b77b 100755 --- a/src/main/java/refinedstorage/RefinedStorage.java +++ b/src/main/java/refinedstorage/RefinedStorage.java @@ -4,7 +4,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.Mod.Instance; @@ -14,16 +14,13 @@ import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; -import refinedstorage.apiimpl.storage.ClientStack; import refinedstorage.proxy.CommonProxy; -import java.util.ArrayList; -import java.util.List; - -@Mod(modid = RefinedStorage.ID, version = RefinedStorage.VERSION) +@Mod(modid = RefinedStorage.ID, version = RefinedStorage.VERSION, dependencies = RefinedStorage.DEPENDENCIES) public final class RefinedStorage { public static final String ID = "refinedstorage"; - public static final String VERSION = "0.8.11"; + public static final String VERSION = "0.9"; + public static final String DEPENDENCIES = "required-after:mcmultipart@[1.2.1,);"; @SidedProxy(clientSide = "refinedstorage.proxy.ClientProxy", serverSide = "refinedstorage.proxy.ServerProxy") public static CommonProxy PROXY; @@ -45,8 +42,11 @@ public final class RefinedStorage { } }; - public List items = new ArrayList(); + static { + FluidRegistry.enableUniversalBucket(); + } + public int controllerBaseUsage; public int cableUsage; public int constructorUsage; public int crafterUsage; @@ -61,24 +61,38 @@ public final class RefinedStorage { public int exporterUsage; public int importerUsage; public int interfaceUsage; + public int fluidInterfaceUsage; public int relayUsage; public int soldererUsage; public int storageUsage; + public int fluidStorageUsage; public int wirelessTransmitterUsage; public int gridUsage; public int craftingGridUsage; public int patternGridUsage; + public int fluidGridUsage; + public int networkTransmitterUsage; + public float networkTransmitterPerBlockUsage; + public int networkReceiverUsage; - public int controller; + public int controllerCapacity; public boolean controllerUsesEnergy; public int wirelessTransmitterBaseRange; + public int wirelessTransmitterRangePerUpgrade; + + public boolean wirelessGridUsesEnergy; + public int wirelessGridOpenUsage; + public int wirelessGridExtractUsage; + public int wirelessGridInsertUsage; public int rangeUpgradeUsage; public int speedUpgradeUsage; public int craftingUpgradeUsage; public int stackUpgradeUsage; - public int wirelessTransmitterRangePerUpgrade; + public int interdimensionalUpgradeUsage; + + public boolean translucentCables; @EventHandler public void preInit(FMLPreInitializationEvent e) { @@ -86,6 +100,7 @@ public final class RefinedStorage { Configuration config = new Configuration(e.getSuggestedConfigurationFile()); + controllerBaseUsage = config.getInt("controllerBase", "energy", 0, 0, Integer.MAX_VALUE, "The base energy used by the Controller"); cableUsage = config.getInt("cable", "energy", 0, 0, Integer.MAX_VALUE, "The energy used by Cables"); constructorUsage = config.getInt("constructor", "energy", 1, 0, Integer.MAX_VALUE, "The energy used by Constructors"); crafterUsage = config.getInt("crafter", "energy", 2, 0, Integer.MAX_VALUE, "The base energy used by Crafters"); @@ -100,24 +115,38 @@ public final class RefinedStorage { exporterUsage = config.getInt("exporter", "energy", 1, 0, Integer.MAX_VALUE, "The energy used by Exporters"); importerUsage = config.getInt("importer", "energy", 1, 0, Integer.MAX_VALUE, "The energy used by Importers"); interfaceUsage = config.getInt("interface", "energy", 3, 0, Integer.MAX_VALUE, "The energy used by Interfaces"); + fluidInterfaceUsage = config.getInt("fluidInterface", "energy", 3, 0, Integer.MAX_VALUE, "The energy used by Fluid Interfaces"); relayUsage = config.getInt("relay", "energy", 1, 0, Integer.MAX_VALUE, "The energy used by Relays"); soldererUsage = config.getInt("solderer", "energy", 3, 0, Integer.MAX_VALUE, "The energy used by Solderers"); storageUsage = config.getInt("storage", "energy", 1, 0, Integer.MAX_VALUE, "The energy used by Storage Blocks"); + fluidStorageUsage = config.getInt("fluidStorage", "energy", 1, 0, Integer.MAX_VALUE, "The energy used by Fluid Storage Blocks"); wirelessTransmitterUsage = config.getInt("wirelessTransmitter", "energy", 8, 0, Integer.MAX_VALUE, "The energy used by Wireless Transmitters"); gridUsage = config.getInt("grid", "energy", 2, 0, Integer.MAX_VALUE, "The energy used by Grids"); craftingGridUsage = config.getInt("craftingGrid", "energy", 4, 0, Integer.MAX_VALUE, "The energy used by Crafting Grids"); patternGridUsage = config.getInt("patternGrid", "energy", 3, 0, Integer.MAX_VALUE, "The energy used by Pattern Grids"); + fluidGridUsage = config.getInt("fluidGrid", "energy", 2, 0, Integer.MAX_VALUE, "The energy used by Fluid Grids"); + networkTransmitterUsage = config.getInt("networkTransmitter", "energy", 50, 0, Integer.MAX_VALUE, "The base energy used by Network Transmitters"); + networkTransmitterPerBlockUsage = config.getFloat("networkTransmitterPerBlock", "energy", 4, 0, Float.MAX_VALUE, "The additional energy per block that the Network Transmitter uses, gets rounded up"); + networkReceiverUsage = config.getInt("networkReceiver", "energy", 15, 0, Integer.MAX_VALUE, "The energy used by Network Receivers"); - controller = config.getInt("controller", "energy", 32000, 0, Integer.MAX_VALUE, "The energy capacity of the controller"); - controllerUsesEnergy = config.getBoolean("controllerUsesEnergy", "energy", true, "Whether the controller uses RF"); + controllerCapacity = config.getInt("capacity", "controller", 32000, 0, Integer.MAX_VALUE, "The energy capacity of the Controller"); + controllerUsesEnergy = config.getBoolean("usesEnergy", "controller", true, "Whether the Controller uses energy"); wirelessTransmitterBaseRange = config.getInt("range", "wirelessTransmitter", 16, 0, Integer.MAX_VALUE, "The base range of the Wireless Transmitter"); wirelessTransmitterRangePerUpgrade = config.getInt("rangePerUpgrade", "wirelessTransmitter", 8, 0, Integer.MAX_VALUE, "The additional range per Range Upgrade in the Wireless Transmitter"); + wirelessGridUsesEnergy = config.getBoolean("usesEnergy", "wirelessGrid", true, "Whether the Wireless Grid uses energy"); + wirelessGridOpenUsage = config.getInt("open", "wirelessGrid", 30, 0, Integer.MAX_VALUE, "The energy used by the Wireless Grid to open"); + wirelessGridInsertUsage = config.getInt("insert", "wirelessGrid", 3, 0, Integer.MAX_VALUE, "The energy used by the Wireless Grid to insert items"); + wirelessGridExtractUsage = config.getInt("extract", "wirelessGrid", 3, 0, Integer.MAX_VALUE, "The energy used by the Wireless Grid to extract items"); + rangeUpgradeUsage = config.getInt("range", "upgrades", 8, 0, Integer.MAX_VALUE, "The additional energy used per Range Upgrade"); speedUpgradeUsage = config.getInt("speed", "upgrades", 2, 0, Integer.MAX_VALUE, "The additional energy used per Speed Upgrade"); craftingUpgradeUsage = config.getInt("crafting", "upgrades", 5, 0, Integer.MAX_VALUE, "The additional energy used per Crafting Upgrade"); stackUpgradeUsage = config.getInt("stack", "upgrades", 12, 0, Integer.MAX_VALUE, "The additional energy used per Stack Upgrade"); + interdimensionalUpgradeUsage = config.getInt("interdimensional", "upgrades", 1000, 0, Integer.MAX_VALUE, "The additional energy used by the Interdimensional Upgrade"); + + translucentCables = config.getBoolean("translucentCables", "misc", false, "For resource pack makers that want a translucent cable"); config.save(); } @@ -131,16 +160,4 @@ public final class RefinedStorage { public void postInit(FMLPostInitializationEvent e) { PROXY.postInit(e); } - - public static boolean hasJei() { - return Loader.isModLoaded("JEI"); - } - - public static boolean hasIC2() { - return Loader.isModLoaded("IC2"); - } - - public static boolean hasTesla() { - return Loader.isModLoaded("Tesla"); - } } diff --git a/src/main/java/refinedstorage/RefinedStorageBlocks.java b/src/main/java/refinedstorage/RefinedStorageBlocks.java index d9f376622..b28804898 100755 --- a/src/main/java/refinedstorage/RefinedStorageBlocks.java +++ b/src/main/java/refinedstorage/RefinedStorageBlocks.java @@ -22,4 +22,8 @@ public final class RefinedStorageBlocks { public static final BlockWirelessTransmitter WIRELESS_TRANSMITTER = new BlockWirelessTransmitter(); public static final BlockCrafter CRAFTER = new BlockCrafter(); public static final BlockProcessingPatternEncoder PROCESSING_PATTERN_ENCODER = new BlockProcessingPatternEncoder(); -} + public static final BlockNetworkTransmitter NETWORK_TRANSMITTER = new BlockNetworkTransmitter(); + public static final BlockNetworkReceiver NETWORK_RECEIVER = new BlockNetworkReceiver(); + public static final BlockFluidInterface FLUID_INTERFACE = new BlockFluidInterface(); + public static final BlockFluidStorage FLUID_STORAGE = new BlockFluidStorage(); +} \ No newline at end of file diff --git a/src/main/java/refinedstorage/RefinedStorageGui.java b/src/main/java/refinedstorage/RefinedStorageGui.java index e454987b3..0bf90311d 100755 --- a/src/main/java/refinedstorage/RefinedStorageGui.java +++ b/src/main/java/refinedstorage/RefinedStorageGui.java @@ -18,4 +18,9 @@ public final class RefinedStorageGui { public static final int WIRELESS_TRANSMITTER = 14; public static final int CRAFTER = 15; public static final int PROCESSING_PATTERN_ENCODER = 16; + public static final int GRID_FILTER = 17; + public static final int NETWORK_TRANSMITTER = 18; + public static final int FLUID_INTERFACE = 19; + public static final int EXTERNAL_STORAGE = 20; + public static final int FLUID_STORAGE = 21; } diff --git a/src/main/java/refinedstorage/RefinedStorageItems.java b/src/main/java/refinedstorage/RefinedStorageItems.java index df83bd2dc..a4796a2a6 100755 --- a/src/main/java/refinedstorage/RefinedStorageItems.java +++ b/src/main/java/refinedstorage/RefinedStorageItems.java @@ -13,4 +13,8 @@ public final class RefinedStorageItems { public static final ItemPattern PATTERN = new ItemPattern(); public static final ItemUpgrade UPGRADE = new ItemUpgrade(); public static final ItemStorageHousing STORAGE_HOUSING = new ItemStorageHousing(); + public static final ItemGridFilter GRID_FILTER = new ItemGridFilter(); + public static final ItemNetworkCard NETWORK_CARD = new ItemNetworkCard(); + public static final ItemFluidStorageDisk FLUID_STORAGE_DISK = new ItemFluidStorageDisk(); + public static final ItemFluidStoragePart FLUID_STORAGE_PART = new ItemFluidStoragePart(); } diff --git a/src/main/java/refinedstorage/RefinedStorageUtils.java b/src/main/java/refinedstorage/RefinedStorageUtils.java deleted file mode 100755 index 8fbff4a1d..000000000 --- a/src/main/java/refinedstorage/RefinedStorageUtils.java +++ /dev/null @@ -1,348 +0,0 @@ -package refinedstorage; - -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagIntArray; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.util.Constants; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.wrapper.InvWrapper; -import net.minecraftforge.items.wrapper.SidedInvWrapper; -import net.minecraftforge.oredict.OreDictionary; -import org.apache.commons.lang3.ArrayUtils; -import refinedstorage.api.autocrafting.ICraftingPattern; -import refinedstorage.api.network.INetworkMaster; -import refinedstorage.api.storage.CompareFlags; -import refinedstorage.item.ItemUpgrade; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public final class RefinedStorageUtils { - private static final String NBT_INVENTORY = "Inventory_%d"; - private static final String NBT_SLOT = "Slot"; - - public static void writeItems(IItemHandler handler, int id, NBTTagCompound nbt) { - NBTTagList tagList = new NBTTagList(); - - for (int i = 0; i < handler.getSlots(); i++) { - if (handler.getStackInSlot(i) != null) { - NBTTagCompound compoundTag = new NBTTagCompound(); - - compoundTag.setInteger(NBT_SLOT, i); - - handler.getStackInSlot(i).writeToNBT(compoundTag); - - tagList.appendTag(compoundTag); - } - } - - nbt.setTag(String.format(NBT_INVENTORY, id), tagList); - } - - public static void readItems(IItemHandler handler, int id, NBTTagCompound nbt) { - String name = String.format(NBT_INVENTORY, id); - - if (nbt.hasKey(name)) { - NBTTagList tagList = nbt.getTagList(name, Constants.NBT.TAG_COMPOUND); - - for (int i = 0; i < tagList.tagCount(); i++) { - int slot = tagList.getCompoundTagAt(i).getInteger(NBT_SLOT); - - ItemStack stack = ItemStack.loadItemStackFromNBT(tagList.getCompoundTagAt(i)); - - handler.insertItem(slot, stack, false); - } - } - } - - public static void writeItemsLegacy(IInventory inventory, int id, NBTTagCompound nbt) { - NBTTagList tagList = new NBTTagList(); - - for (int i = 0; i < inventory.getSizeInventory(); i++) { - if (inventory.getStackInSlot(i) != null) { - NBTTagCompound compoundTag = new NBTTagCompound(); - - compoundTag.setInteger(NBT_SLOT, i); - - inventory.getStackInSlot(i).writeToNBT(compoundTag); - - tagList.appendTag(compoundTag); - } - } - - nbt.setTag(String.format(NBT_INVENTORY, id), tagList); - } - - public static void readItemsLegacy(IInventory inventory, int id, NBTTagCompound nbt) { - String name = String.format(NBT_INVENTORY, id); - - if (nbt.hasKey(name)) { - NBTTagList tagList = nbt.getTagList(name, Constants.NBT.TAG_COMPOUND); - - for (int i = 0; i < tagList.tagCount(); i++) { - int slot = tagList.getCompoundTagAt(i).getInteger(NBT_SLOT); - - ItemStack stack = ItemStack.loadItemStackFromNBT(tagList.getCompoundTagAt(i)); - - inventory.setInventorySlotContents(slot, stack); - } - } - } - - public static boolean compareStack(ItemStack left, ItemStack right) { - return compareStack(left, right, CompareFlags.COMPARE_NBT | CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_QUANTITY); - } - - public static boolean compareStack(ItemStack left, ItemStack right, int flags) { - if (left == null && right == null) { - return true; - } - - if ((left == null && right != null) || (left != null && right == null)) { - return false; - } - - if (left.getItem() != right.getItem()) { - return false; - } - - if ((flags & CompareFlags.COMPARE_DAMAGE) == CompareFlags.COMPARE_DAMAGE) { - if (left.getItemDamage() != right.getItemDamage()) { - return false; - } - } - - if ((flags & CompareFlags.COMPARE_NBT) == CompareFlags.COMPARE_NBT) { - if (!compareNbt(left, right)) { - return false; - } - } - - if ((flags & CompareFlags.COMPARE_QUANTITY) == CompareFlags.COMPARE_QUANTITY) { - if (left.stackSize != right.stackSize) { - return false; - } - } - - return true; - } - - public static boolean compareNbt(ItemStack left, ItemStack right) { - if (!ItemStack.areItemStackTagsEqual(left, right)) { - if (left.hasTagCompound() && !right.hasTagCompound() && left.getTagCompound().hasNoTags()) { - return true; - } else if (!left.hasTagCompound() && right.hasTagCompound() && right.getTagCompound().hasNoTags()) { - return true; - } - - return false; - } - - return true; - } - - public static boolean compareStackNoQuantity(ItemStack left, ItemStack right) { - return compareStack(left, right, CompareFlags.COMPARE_NBT | CompareFlags.COMPARE_DAMAGE); - } - - public static boolean compareStackOreDict(ItemStack left, ItemStack right) { - if (left == null && right == null) { - return true; - } - - if ((left == null && right != null) || (left != null && right == null)) { - return false; - } - - int[] leftIds = OreDictionary.getOreIDs(left); - int[] rightIds = OreDictionary.getOreIDs(right); - - for (int i : rightIds) { - if (ArrayUtils.contains(leftIds, i)) { - return true; - } - } - - return false; - } - - public static int getSpeed(IItemHandler handler) { - return getSpeed(handler, 9, 2); - } - - public static int getSpeed(IItemHandler handler, int speed, int speedIncrease) { - for (int i = 0; i < handler.getSlots(); ++i) { - if (handler.getStackInSlot(i) != null && handler.getStackInSlot(i).getMetadata() == ItemUpgrade.TYPE_SPEED) { - speed -= speedIncrease; - } - } - - return speed; - } - - public static boolean hasUpgrade(IItemHandler handler, int type) { - return getUpgradeCount(handler, type) > 0; - } - - public static int getUpgradeCount(IItemHandler handler, int type) { - int upgrades = 0; - - for (int i = 0; i < handler.getSlots(); ++i) { - if (handler.getStackInSlot(i) != null && handler.getStackInSlot(i).getMetadata() == type) { - upgrades++; - } - } - - return upgrades; - } - - public static int getUpgradeEnergyUsage(IItemHandler handler) { - int usage = 0; - - for (int i = 0; i < handler.getSlots(); ++i) { - if (handler.getStackInSlot(i) != null) { - usage += ItemUpgrade.getEnergyUsage(handler.getStackInSlot(i).getMetadata()); - } - } - - return usage; - } - - public static void writeBooleanArray(NBTTagCompound tag, String name, boolean[] array) { - int[] intArray = new int[array.length]; - - for (int i = 0; i < intArray.length; ++i) { - intArray[i] = array[i] ? 1 : 0; - } - - tag.setTag(name, new NBTTagIntArray(intArray)); - } - - public static boolean[] readBooleanArray(NBTTagCompound tag, String name) { - int[] intArray = tag.getIntArray(name); - - boolean array[] = new boolean[intArray.length]; - - for (int i = 0; i < intArray.length; ++i) { - array[i] = intArray[i] == 1 ? true : false; - } - - return array; - } - - public static EnumHand getHandById(int id) { - switch (id) { - case 0: - return EnumHand.MAIN_HAND; - case 1: - return EnumHand.OFF_HAND; - default: - return EnumHand.MAIN_HAND; - } - } - - public static int getIdFromHand(EnumHand hand) { - switch (hand) { - case MAIN_HAND: - return 0; - case OFF_HAND: - return 1; - default: - return 0; - } - } - - public static void updateBlock(World world, BlockPos pos) { - world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 1 | 2); - } - - public static IItemHandler getItemHandler(TileEntity tile, EnumFacing side) { - if (tile == null) { - return null; - } - - IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side); - - if (handler == null) { - if (side != null && tile instanceof ISidedInventory) { - handler = new SidedInvWrapper((ISidedInventory) tile, side); - } else if (tile instanceof IInventory) { - handler = new InvWrapper((IInventory) tile); - } - } - - return handler; - } - - public static int calculateOffsetOnScale(int pos, float scale) { - float multiplier = (pos / scale); - - return (int) multiplier; - } - - public static void combineMultipleItemsInTooltip(List lines, ItemStack... stacks) { - Set combinedIndices = new HashSet(); - - for (int i = 0; i < stacks.length; ++i) { - if (!combinedIndices.contains(i)) { - String data = stacks[i].getDisplayName(); - - int amount = stacks[i].stackSize; - - for (int j = i + 1; j < stacks.length; ++j) { - if (RefinedStorageUtils.compareStack(stacks[i], stacks[j])) { - amount += stacks[j].stackSize; - - combinedIndices.add(j); - } - } - - if (amount != 1) { - data += " (" + amount + "x)"; - } - - lines.add(data); - } - } - } - - // Keep this on par with the Forestry generators (1 EU is worth 4 RF) - public static int convertIC2ToRF(double amount) { - // IC2 passes infinity sometimes as a simulate test - if (amount >= Double.POSITIVE_INFINITY) { - return Integer.MAX_VALUE; - } - - return (int) Math.floor(amount) * 4; - } - - public static double convertRFToIC2(int amount) { - return Math.floor(amount / 4); - } - - public static ItemStack extractItem(INetworkMaster network, ItemStack stack, int size) { - return network.extractItem(stack, size, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); - } - - public static ICraftingPattern getPattern(INetworkMaster network, ItemStack stack) { - return network.getPattern(stack, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); - } - - public static boolean hasPattern(INetworkMaster network, ItemStack stack) { - return RefinedStorageUtils.getPattern(network, stack) != null; - } - - public static int getItemStackHashCode(ItemStack stack) { - return stack.getItem().hashCode() * (stack.getItemDamage() + 1) * (stack.hasTagCompound() ? stack.getTagCompound().hashCode() : 1); - } -} diff --git a/src/main/java/refinedstorage/api/RefinedStorageAPI.java b/src/main/java/refinedstorage/api/RefinedStorageAPI.java index 8ae613dc1..ebef434ae 100755 --- a/src/main/java/refinedstorage/api/RefinedStorageAPI.java +++ b/src/main/java/refinedstorage/api/RefinedStorageAPI.java @@ -4,7 +4,7 @@ import refinedstorage.api.solderer.ISoldererRegistry; public final class RefinedStorageAPI { /** - * The solderer registry, set in pre-initialization. + * The solderer registry, set in pre-initialization */ public static ISoldererRegistry SOLDERER_REGISTRY; } diff --git a/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java b/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java index fb1b1cf81..733543471 100755 --- a/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java +++ b/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java @@ -9,7 +9,7 @@ public interface ICraftingPatternContainer { /** * This usually corresponds to the amount of speed upgrades in a crafter. * - * @return The speed of this pattern + * @return The speed of this container */ int getSpeed(); diff --git a/src/main/java/refinedstorage/api/network/GridExtractFlags.java b/src/main/java/refinedstorage/api/network/GridExtractFlags.java deleted file mode 100755 index 1dd9917fa..000000000 --- a/src/main/java/refinedstorage/api/network/GridExtractFlags.java +++ /dev/null @@ -1,10 +0,0 @@ -package refinedstorage.api.network; - -/** - * Flags for knowing what extract action the player is performing, these can be combined. - */ -public class GridExtractFlags { - public static final int EXTRACT_HALF = 1; - public static final int EXTRACT_SINGLE = 2; - public static final int EXTRACT_SHIFT = 4; -} diff --git a/src/main/java/refinedstorage/api/network/INetworkMaster.java b/src/main/java/refinedstorage/api/network/INetworkMaster.java index 4856ed90f..bf1288b1b 100755 --- a/src/main/java/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/refinedstorage/api/network/INetworkMaster.java @@ -4,10 +4,14 @@ import cofh.api.energy.EnergyStorage; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fluids.FluidStack; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingTask; -import refinedstorage.api.storage.CompareFlags; -import refinedstorage.api.storage.IGroupedStorage; +import refinedstorage.api.network.grid.IFluidGridHandler; +import refinedstorage.api.network.grid.IItemGridHandler; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.storage.fluid.IGroupedFluidStorage; +import refinedstorage.api.storage.item.IGroupedItemStorage; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -38,14 +42,19 @@ public interface INetworkMaster { boolean canRun(); /** - * @return A list with all the network nodes + * @return A graph of connected nodes to this network */ - List getNodes(); + INetworkNodeGraph getNodeGraph(); /** - * @return The {@link IGridHandler} for this network + * @return The {@link IItemGridHandler} for this network */ - IGridHandler getGridHandler(); + IItemGridHandler getItemGridHandler(); + + /** + * @return The {@link IFluidGridHandler} for this network + */ + IFluidGridHandler getFluidGridHandler(); /** * @return The {@link IWirelessGridHandler} for this network @@ -53,9 +62,14 @@ public interface INetworkMaster { IWirelessGridHandler getWirelessGridHandler(); /** - * @return The {@link IGroupedStorage} of this network + * @return The {@link IGroupedItemStorage} of this network */ - IGroupedStorage getStorage(); + IGroupedItemStorage getItemStorage(); + + /** + * @return The {@link IGroupedFluidStorage} of this network + */ + IGroupedFluidStorage getFluidStorage(); /** * @return The crafting tasks in this network, do NOT modify this list @@ -101,23 +115,18 @@ public interface INetworkMaster { */ void rebuildPatterns(); - /** - * Rebuilds the network node list. - */ - void rebuildNodes(); - /** * Returns crafting patterns from an item stack. * * @param pattern The {@link ItemStack} to get a pattern for - * @param flags The flags to compare on, see {@link CompareFlags} + * @param flags The flags to compare on, see {@link CompareUtils} * @return A list of crafting patterns where the given pattern is one of the outputs */ List getPatterns(ItemStack pattern, int flags); /** * @param pattern The {@link ItemStack} to get a pattern for - * @param flags The flags to compare on, see {@link CompareFlags} + * @param flags The flags to compare on, see {@link CompareUtils} * @return The pattern, or null if the pattern is not found */ @Nullable @@ -126,20 +135,38 @@ public interface INetworkMaster { /** * Sends a grid packet with all the items to all clients that are watching a grid. */ - void sendStorageToClient(); + void sendItemStorageToClient(); /** * Sends a grid packet with all the items to a specific player. */ - void sendStorageToClient(EntityPlayerMP player); + void sendItemStorageToClient(EntityPlayerMP player); /** - * Sends a storage change to all clients that are watching a grid. + * Sends a item storage change to all clients that are watching a grid. * * @param stack The stack * @param delta The delta */ - void sendStorageDeltaToClient(ItemStack stack, int delta); + void sendItemStorageDeltaToClient(ItemStack stack, int delta); + + /** + * Sends a grid packet with all the fluids to all clients that are watching a grid. + */ + void sendFluidStorageToClient(); + + /** + * Sends a grid packet with all the fluids to a specific player. + */ + void sendFluidStorageToClient(EntityPlayerMP player); + + /** + * Sends a fluids storage change to all clients that are watching a grid. + * + * @param stack The stack + * @param delta The delta + */ + void sendFluidStorageDeltaToClient(FluidStack stack, int delta); /** * Inserts an item to this network. @@ -157,9 +184,31 @@ public interface INetworkMaster { * * @param stack The prototype of the stack to extract, do NOT modify * @param size The amount of that prototype that has to be extracted - * @param flags The flags to compare on, see {@link CompareFlags} + * @param flags The flags to compare on, see {@link CompareUtils} * @return null if we didn't extract anything, or a {@link ItemStack} with the result */ @Nullable ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags); + + /** + * Inserts a fluid to this network. + * + * @param stack The stack prototype to insert, do NOT modify + * @param size The amount of that prototype that has to be inserted + * @param simulate If we are simulating + * @return null if the insert was successful, or an {@link FluidStack} with the remainder + */ + @Nullable + FluidStack insertFluid(@Nonnull FluidStack stack, int size, boolean simulate); + + /** + * Extracts a fluid from this network. + * + * @param stack The prototype of the stack to extract, do NOT modify + * @param size The amount of that prototype that has to be extracted + * @param flags The flags to compare on, see {@link CompareUtils} + * @return null if we didn't extract anything, or a {@link FluidStack} with the result + */ + @Nullable + FluidStack extractFluid(@Nonnull FluidStack stack, int size, int flags); } diff --git a/src/main/java/refinedstorage/api/network/INetworkNode.java b/src/main/java/refinedstorage/api/network/INetworkNode.java index 854426326..7937218fd 100755 --- a/src/main/java/refinedstorage/api/network/INetworkNode.java +++ b/src/main/java/refinedstorage/api/network/INetworkNode.java @@ -1,6 +1,8 @@ package refinedstorage.api.network; +import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; /** * Represents a node in the storage network. @@ -37,7 +39,7 @@ public interface INetworkNode { /** * Called when the connection state of this node changes. - * This is also called when redstone mode is updated, as opposed to {@link INetworkNode#onConnected(INetworkMaster)} and {@link INetworkNode#onDisconnected()}. + * This is also called when redstone mode is updated, as opposed to {@link INetworkNode#onConnected(INetworkMaster)} and {@link INetworkNode#onDisconnected(INetworkMaster)}. * * @param network The network * @param state The state @@ -50,17 +52,23 @@ public interface INetworkNode { boolean isConnected(); /** - * @return If {@link INetworkNode#canUpdate()} can get called, typically checks for connection status and redstone mode + * @return If {@link INetworkNode#updateNode()} can get called, typically checks for connection status and redstone mode */ boolean canUpdate(); /** + * @param direction The direction to conduct to * @return Whether this node can conduct a network signal */ - boolean canConduct(); + boolean canConduct(EnumFacing direction); /** * @return The network */ INetworkMaster getNetwork(); + + /** + * @return The world where this node is in + */ + World getNodeWorld(); } diff --git a/src/main/java/refinedstorage/api/network/INetworkNodeGraph.java b/src/main/java/refinedstorage/api/network/INetworkNodeGraph.java new file mode 100755 index 000000000..e63db1ae9 --- /dev/null +++ b/src/main/java/refinedstorage/api/network/INetworkNodeGraph.java @@ -0,0 +1,35 @@ +package refinedstorage.api.network; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.List; +import java.util.Set; + +/** + * A graph of all the nodes connected to a network. + */ +public interface INetworkNodeGraph { + /** + * Rebuilds the node graph. + * + * @param start The starting position to start looking for nodes + * @param notify Whether to notify nodes of a connection change + */ + void rebuild(BlockPos start, boolean notify); + + /** + * @return A list of all connected nodes + */ + List all(); + + /** + * @return A set of hashes of all connected nodes, see {@link NetworkUtils#getNodeHashCode(World, INetworkNode)} + */ + Set allHashes(); + + /** + * Disconnects and notifies all connected nodes. + */ + void disconnectAll(); +} diff --git a/src/main/java/refinedstorage/api/network/IWirelessGridConsumer.java b/src/main/java/refinedstorage/api/network/IWirelessGridConsumer.java index df4259e2b..39851adca 100755 --- a/src/main/java/refinedstorage/api/network/IWirelessGridConsumer.java +++ b/src/main/java/refinedstorage/api/network/IWirelessGridConsumer.java @@ -2,17 +2,11 @@ package refinedstorage.api.network; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumHand; /** * Represents a player using a wireless grid. */ public interface IWirelessGridConsumer { - /** - * @return The hand this wireless grid is opened with - */ - EnumHand getHand(); - /** * @return The player using the wireless grid */ diff --git a/src/main/java/refinedstorage/api/network/NetworkUtils.java b/src/main/java/refinedstorage/api/network/NetworkUtils.java new file mode 100755 index 000000000..c576b1c20 --- /dev/null +++ b/src/main/java/refinedstorage/api/network/NetworkUtils.java @@ -0,0 +1,46 @@ +package refinedstorage.api.network; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; +import refinedstorage.api.autocrafting.ICraftingPattern; +import refinedstorage.api.storage.CompareUtils; + +/** + * Utilities for network manipulation. + */ +public final class NetworkUtils { + public static ItemStack extractItem(INetworkMaster network, ItemStack stack, int size) { + return network.extractItem(stack, size, CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT); + } + + public static FluidStack extractFluid(INetworkMaster network, FluidStack stack, int size) { + return network.extractFluid(stack, size, CompareUtils.COMPARE_NBT); + } + + public static ICraftingPattern getPattern(INetworkMaster network, ItemStack stack) { + return network.getPattern(stack, CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT); + } + + public static boolean hasPattern(INetworkMaster network, ItemStack stack) { + return getPattern(network, stack) != null; + } + + public static void rebuildGraph(INetworkMaster network) { + network.getNodeGraph().rebuild(network.getPosition(), true); + } + + public static int getItemStackHashCode(ItemStack stack) { + return stack.getItem().hashCode() * (stack.getItemDamage() + 1) * (stack.hasTagCompound() ? stack.getTagCompound().hashCode() : 1); + } + + public static int getFluidStackHashCode(FluidStack stack) { + return stack.getFluid().hashCode() * (stack.tag != null ? stack.tag.hashCode() : 1); + } + + public static int getNodeHashCode(World world, INetworkNode node) { + int result = node.getPosition().hashCode(); + result = 31 * result + world.provider.getDimension(); + return result; + } +} diff --git a/src/main/java/refinedstorage/api/network/grid/IFluidGridHandler.java b/src/main/java/refinedstorage/api/network/grid/IFluidGridHandler.java new file mode 100755 index 000000000..dde84a07a --- /dev/null +++ b/src/main/java/refinedstorage/api/network/grid/IFluidGridHandler.java @@ -0,0 +1,36 @@ +package refinedstorage.api.network.grid; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; + +import javax.annotation.Nullable; + +/** + * Defines the behavior of item grids. + */ +public interface IFluidGridHandler { + /** + * Called when a player tries to extract a fluid from the grid. + * + * @param hash The hash of the fluid we're trying to extract, see {@link refinedstorage.api.network.NetworkUtils#getFluidStackHashCode(net.minecraftforge.fluids.FluidStack)} + * @param shift If we're shift clicking + * @param player The player that is attempting the extraction + */ + void onExtract(int hash, boolean shift, EntityPlayerMP player); + + /** + * Called when a player tries to insert fluids to the grid. + * + * @param container A stack with a container we're trying to insert + * @return The remainder, or null if there is no remainder + */ + @Nullable + ItemStack onInsert(ItemStack container); + + /** + * Called when a player is trying to insert a fluid that it is holding in their hand in the GUI. + * + * @param player The player that is attempting the insert + */ + void onInsertHeldContainer(EntityPlayerMP player); +} diff --git a/src/main/java/refinedstorage/api/network/IGridHandler.java b/src/main/java/refinedstorage/api/network/grid/IItemGridHandler.java similarity index 53% rename from src/main/java/refinedstorage/api/network/IGridHandler.java rename to src/main/java/refinedstorage/api/network/grid/IItemGridHandler.java index 373c28e2f..c9a5db79d 100755 --- a/src/main/java/refinedstorage/api/network/IGridHandler.java +++ b/src/main/java/refinedstorage/api/network/grid/IItemGridHandler.java @@ -1,4 +1,4 @@ -package refinedstorage.api.network; +package refinedstorage.api.network.grid; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; @@ -6,42 +6,47 @@ import net.minecraft.item.ItemStack; import javax.annotation.Nullable; /** - * Defines the behavior of grids. + * Defines the behavior of item grids. */ -public interface IGridHandler { +public interface IItemGridHandler { + int EXTRACT_HALF = 1; + int EXTRACT_SINGLE = 2; + int EXTRACT_SHIFT = 4; + /** * Called when a player tries to extract an item from the grid. * - * @param id The ID of the item we're trying to extract - * @param flags How we are extracting, see {@link GridExtractFlags} + * @param hash The hash of the item we're trying to extract, see {@link refinedstorage.api.network.NetworkUtils#getItemStackHashCode(ItemStack)} + * @param flags How we are extracting * @param player The player that is attempting the extraction */ - void onExtract(int id, int flags, EntityPlayerMP player); + void onExtract(int hash, int flags, EntityPlayerMP player); /** * Called when a player tries to insert an item to the grid. * - * @param stack The item we're trying to insert + * @param player The player that is attempting the insert + * @param stack The item we're trying to insert * @return The remainder, or null if there is no remainder */ @Nullable - ItemStack onInsert(ItemStack stack); + ItemStack onInsert(EntityPlayerMP player, ItemStack stack); /** * Called when a player is trying to insert an item that it is holding in their hand in the GUI. * - * @param single If we are only inserting 1 item * @param player The player that is attempting the insert + * @param single If we are only inserting 1 item */ - void onInsertHeldItem(boolean single, EntityPlayerMP player); + void onInsertHeldItem(EntityPlayerMP player, boolean single); /** * Called when a player requested crafting for an item. * - * @param id The ID of the item we're requesting crafting for + * @param hash The hash of the item we're requesting crafting for, see {@link refinedstorage.api.network.NetworkUtils#getItemStackHashCode(ItemStack)} * @param quantity The amount of that item that has to be crafted */ - void onCraftingRequested(int id, int quantity); + void onCraftingRequested(int hash, int quantity); /** * Called when a player wants to cancel a crafting task. diff --git a/src/main/java/refinedstorage/api/storage/CompareFlags.java b/src/main/java/refinedstorage/api/storage/CompareFlags.java deleted file mode 100755 index fa5d62d08..000000000 --- a/src/main/java/refinedstorage/api/storage/CompareFlags.java +++ /dev/null @@ -1,10 +0,0 @@ -package refinedstorage.api.storage; - -/** - * Comparison flags. - */ -public final class CompareFlags { - public static final int COMPARE_DAMAGE = 1; - public static final int COMPARE_NBT = 2; - public static final int COMPARE_QUANTITY = 4; -} diff --git a/src/main/java/refinedstorage/api/storage/CompareUtils.java b/src/main/java/refinedstorage/api/storage/CompareUtils.java new file mode 100755 index 000000000..83a5e7f28 --- /dev/null +++ b/src/main/java/refinedstorage/api/storage/CompareUtils.java @@ -0,0 +1,158 @@ +package refinedstorage.api.storage; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.oredict.OreDictionary; +import org.apache.commons.lang3.ArrayUtils; + +/** + * Utilities for comparing. + */ +public final class CompareUtils { + public static final int COMPARE_DAMAGE = 1; + public static final int COMPARE_NBT = 2; + public static final int COMPARE_QUANTITY = 4; + + /** + * Compares two stacks by NBT, damage and quantity. + * + * @param left The left stack + * @param right The right stack + * @return Whether the left and right stack are equal + */ + public static boolean compareStack(ItemStack left, ItemStack right) { + return compareStack(left, right, COMPARE_NBT | COMPARE_DAMAGE | COMPARE_QUANTITY); + } + + /** + * Compares two stacks by NBT and damage. + * + * @param left The left stack + * @param right The right stack + * @return Whether the left and right stack are equal + */ + public static boolean compareStackNoQuantity(ItemStack left, ItemStack right) { + return compareStack(left, right, COMPARE_NBT | COMPARE_DAMAGE); + } + + /** + * Compares two stacks by the given flags. + * + * @param left The left stack + * @param right The right stack + * @param flags The flags to compare with + * @return Whether the left and right stack are equal + */ + public static boolean compareStack(ItemStack left, ItemStack right, int flags) { + if (left == null && right == null) { + return true; + } + + if ((left == null && right != null) || (left != null && right == null)) { + return false; + } + + if (left.getItem() != right.getItem()) { + return false; + } + + if ((flags & COMPARE_DAMAGE) == COMPARE_DAMAGE) { + if (left.getItemDamage() != right.getItemDamage()) { + return false; + } + } + + if ((flags & COMPARE_NBT) == COMPARE_NBT) { + if (!compareNbt(left, right)) { + return false; + } + } + + if ((flags & COMPARE_QUANTITY) == COMPARE_QUANTITY) { + if (left.stackSize != right.stackSize) { + return false; + } + } + + return true; + } + + /** + * Compares two stacks by the given flags. + * + * @param left The left stack + * @param right The right stack + * @param flags The flags to compare with + * @return Whether the left and right stack are equal + */ + public static boolean compareStack(FluidStack left, FluidStack right, int flags) { + if (left == null && right == null) { + return true; + } + + if ((left == null && right != null) || (left != null && right == null)) { + return false; + } + + if (left.getFluid() != right.getFluid()) { + return false; + } + + if ((flags & COMPARE_NBT) == COMPARE_NBT) { + if (left.tag != null && !left.tag.equals(right)) { + return false; + } + } + + return true; + } + + /** + * Compares the NBT tags of two stacks. + * + * @param left The left stack + * @param right The right stack + * @return Whether the NBT tags are equal + */ + public static boolean compareNbt(ItemStack left, ItemStack right) { + if (!ItemStack.areItemStackTagsEqual(left, right)) { + if (left.hasTagCompound() && !right.hasTagCompound() && left.getTagCompound().hasNoTags()) { + return true; + } else if (!left.hasTagCompound() && right.hasTagCompound() && right.getTagCompound().hasNoTags()) { + return true; + } + + return false; + } + + return true; + } + + /** + * Compares two stacks and checks if they share the same ore dictionary entry. + * + * @param left The left stack + * @param right The right stack + * @return Whether the stacks share the same ore dictionary entry + */ + public static boolean compareStackOreDict(ItemStack left, ItemStack right) { + if (left == null && right == null) { + return true; + } + + if ((left == null && right != null) || (left != null && right == null)) { + return false; + } + + int[] leftIds = OreDictionary.getOreIDs(left); + int[] rightIds = OreDictionary.getOreIDs(right); + + for (int i : rightIds) { + if (ArrayUtils.contains(leftIds, i)) { + return true; + } + } + + return false; + } +} diff --git a/src/main/java/refinedstorage/api/storage/IGroupedStorage.java b/src/main/java/refinedstorage/api/storage/IGroupedStorage.java deleted file mode 100755 index 0d349f98d..000000000 --- a/src/main/java/refinedstorage/api/storage/IGroupedStorage.java +++ /dev/null @@ -1,59 +0,0 @@ -package refinedstorage.api.storage; - -import net.minecraft.item.ItemStack; -import refinedstorage.api.network.INetworkMaster; - -import java.util.Collection; -import java.util.List; - -/** - * This holds all items from all the connected storages from a {@link INetworkMaster}. - */ -public interface IGroupedStorage { - /** - * Rebuilds the storages and items for a network. Typically called when a {@link IStorageProvider} is - * added or removed from the network. - */ - void rebuild(); - - /** - * Adds an item to the network. Will merge it with another item if it already exists. - * - * @param stack The stack to add, do NOT modify - * @param rebuilding Whether this method is called while the storage is rebuilding - */ - void add(ItemStack stack, boolean rebuilding); - - /** - * Removes a item from the network. - * - * @param stack The item to remove, do NOT modify - */ - void remove(ItemStack stack); - - /** - * Gets an item from the network, does not decrement its count like {@link IGroupedStorage#remove(ItemStack)} does. - * - * @param stack The stack to find - * @param flags The flags to compare on, see {@link CompareFlags} - * @return The {@link ItemStack}, do NOT modify - */ - ItemStack get(ItemStack stack, int flags); - - /** - * Gets an item from the network by ID. - * - * @return The {@link ItemStack}, do NOT modify - */ - ItemStack get(int id); - - /** - * @return All items in this storage network - */ - Collection getStacks(); - - /** - * @return The storages connected to this network - */ - List getStorages(); -} diff --git a/src/main/java/refinedstorage/api/storage/IStorageProvider.java b/src/main/java/refinedstorage/api/storage/IStorageProvider.java deleted file mode 100755 index 2003b5502..000000000 --- a/src/main/java/refinedstorage/api/storage/IStorageProvider.java +++ /dev/null @@ -1,15 +0,0 @@ -package refinedstorage.api.storage; - -import java.util.List; - -/** - * Implement this interface on the tile that has a {@link refinedstorage.api.RefinedStorageCapabilities#NETWORK_NODE_CAPABILITY} capability. - */ -public interface IStorageProvider { - /** - * Adds the storages that this storage provider provides. - * - * @param storages The previously added storages - */ - void addStorages(List storages); -} diff --git a/src/main/java/refinedstorage/api/storage/fluid/IFluidStorage.java b/src/main/java/refinedstorage/api/storage/fluid/IFluidStorage.java new file mode 100755 index 000000000..33c3e99a3 --- /dev/null +++ b/src/main/java/refinedstorage/api/storage/fluid/IFluidStorage.java @@ -0,0 +1,54 @@ +package refinedstorage.api.storage.fluid; + +import net.minecraftforge.fluids.FluidStack; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.storage.item.IItemStorageProvider; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; + +/** + * Represents a fluid storage sink for the storage network. + * Provide this through an {@link IItemStorageProvider}. + */ +public interface IFluidStorage { + /** + * @return Fluids stored in this storage + */ + List getStacks(); + + /** + * Inserts a fluid to this storage. + * + * @param stack The fluid prototype to insert, do NOT modify + * @param size The amount of that prototype that has to be inserted + * @param simulate If we are simulating + * @return null if the insert was successful, or a {@link FluidStack} with the remainder + */ + @Nullable + FluidStack insertFluid(@Nonnull FluidStack stack, int size, boolean simulate); + + /** + * Extracts a fluid from this storage. + *

+ * If the fluid we found in the system is smaller than the requested size, return that fluid anyway. + * + * @param stack A prototype of the fluid to extract, do NOT modify + * @param size The amount of that fluid that has to be extracted + * @param flags On what we are comparing to extract this fluid, see {@link CompareUtils} + * @return null if we didn't extract anything, or an {@link FluidStack} with the result + */ + @Nullable + FluidStack extractFluid(@Nonnull FluidStack stack, int size, int flags); + + /** + * @return The amount of fluids stored in this storage + */ + int getStored(); + + /** + * @return The priority of this storage + */ + int getPriority(); +} diff --git a/src/main/java/refinedstorage/api/storage/fluid/IFluidStorageProvider.java b/src/main/java/refinedstorage/api/storage/fluid/IFluidStorageProvider.java new file mode 100755 index 000000000..a26562f27 --- /dev/null +++ b/src/main/java/refinedstorage/api/storage/fluid/IFluidStorageProvider.java @@ -0,0 +1,15 @@ +package refinedstorage.api.storage.fluid; + +import java.util.List; + +/** + * Represents a tile that provides item storage to the network. Implement this on a tile that is a {@link refinedstorage.api.network.INetworkNode}. + */ +public interface IFluidStorageProvider { + /** + * Adds the fluid storages that this storage provider provides. + * + * @param storages The previously added fluid storages + */ + void addFluidStorages(List storages); +} diff --git a/src/main/java/refinedstorage/api/storage/fluid/IGroupedFluidStorage.java b/src/main/java/refinedstorage/api/storage/fluid/IGroupedFluidStorage.java new file mode 100755 index 000000000..fef2a937f --- /dev/null +++ b/src/main/java/refinedstorage/api/storage/fluid/IGroupedFluidStorage.java @@ -0,0 +1,76 @@ +package refinedstorage.api.storage.fluid; + +import net.minecraftforge.fluids.FluidStack; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.storage.item.IItemStorageProvider; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.List; + +/** + * This holds all fluids from all the connected storages from a {@link INetworkMaster}. + *

+ * Refined Storage uses this class mainly for use in Grids and Detectors to avoid querying + * individual {@link IFluidStorage} constantly (performance impact) and to send and detect storage changes + * more efficiently. + */ +public interface IGroupedFluidStorage { + /** + * Rebuilds the global fluid list. Typically called when a {@link IItemStorageProvider} is added or removed from the network. + */ + void rebuild(); + + /** + * Adds an item to the global fluid list. + *

+ * Note that this doesn't modify any of the connected storages, but just modifies the global fluid list. + * Use {@link INetworkMaster#insertFluid(FluidStack, int, boolean)} to add a fluid to an actual storage. + *

+ * Will merge it with another fluid if it already exists. + * + * @param stack The fluid to add, do NOT modify + * @param rebuilding Whether this method is called while the storage is rebuilding + */ + void add(@Nonnull FluidStack stack, boolean rebuilding); + + /** + * Removes a fluid from the global fluid list. + *

+ * Note that this doesn't modify any of the connected storages, but just modifies the global fluid list. + * Use {@link INetworkMaster#extractFluid(FluidStack, int, int)} to remove an fluid from an actual storage. + * + * @param stack The fluid to remove, do NOT modify + */ + void remove(@Nonnull FluidStack stack); + + /** + * Gets a fluid from the network. + * + * @param stack The stack to find + * @param flags The flags to compare on, see {@link CompareUtils} + * @return Null if no fluid is found, or the {@link FluidStack}, do NOT modify + */ + @Nullable + FluidStack get(@Nonnull FluidStack stack, int flags); + + /** + * Gets a fluid from the network by hash, see {@link refinedstorage.api.network.NetworkUtils#getFluidStackHashCode(FluidStack)}. + * + * @return Null if no fluid is found matching the hash, or the {@link FluidStack}, do NOT modify + */ + @Nullable + FluidStack get(int hash); + + /** + * @return All fluids in this storage network + */ + Collection getStacks(); + + /** + * @return The fluid storages connected to this network + */ + List getStorages(); +} diff --git a/src/main/java/refinedstorage/api/storage/item/IGroupedItemStorage.java b/src/main/java/refinedstorage/api/storage/item/IGroupedItemStorage.java new file mode 100755 index 000000000..c4f9291d5 --- /dev/null +++ b/src/main/java/refinedstorage/api/storage/item/IGroupedItemStorage.java @@ -0,0 +1,75 @@ +package refinedstorage.api.storage.item; + +import net.minecraft.item.ItemStack; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.storage.CompareUtils; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.List; + +/** + * This holds all items from all the connected storages from a {@link INetworkMaster}. + *

+ * Refined Storage uses this class mainly for use in Grids and Detectors to avoid querying + * individual {@link IItemStorage} constantly (performance impact) and to send and detect storage changes + * more efficiently. + */ +public interface IGroupedItemStorage { + /** + * Rebuilds the global item list. Typically called when a {@link IItemStorageProvider} is added or removed from the network. + */ + void rebuild(); + + /** + * Adds an item to the global item list. + *

+ * Note that this doesn't modify any of the connected storages, but just modifies the global item list. + * Use {@link INetworkMaster#insertItem(ItemStack, int, boolean)} to add an item to an actual storage. + *

+ * Will merge it with another item if it already exists. + * + * @param stack The stack to add, do NOT modify + * @param rebuilding Whether this method is called while the storage is rebuilding + */ + void add(@Nonnull ItemStack stack, boolean rebuilding); + + /** + * Removes a item from global item list. + *

+ * Note that this doesn't modify any of the connected storages, but just modifies the global item list. + * Use {@link INetworkMaster#extractItem(ItemStack, int, int)} to remove an item from an actual storage. + * + * @param stack The item to remove, do NOT modify + */ + void remove(@Nonnull ItemStack stack); + + /** + * Gets an item from the network. + * + * @param stack The stack to find + * @param flags The flags to compare on, see {@link CompareUtils} + * @return Null if no item is found, or the {@link ItemStack}, do NOT modify + */ + @Nullable + ItemStack get(@Nonnull ItemStack stack, int flags); + + /** + * Gets an item from the network by hash, see {@link refinedstorage.api.network.NetworkUtils#getItemStackHashCode(ItemStack)}. + * + * @return Null if no item is found matching the hash, or the {@link ItemStack}, do NOT modify + */ + @Nullable + ItemStack get(int hash); + + /** + * @return All items in this storage network + */ + Collection getStacks(); + + /** + * @return The item storages connected to this network + */ + List getStorages(); +} diff --git a/src/main/java/refinedstorage/api/storage/IStorage.java b/src/main/java/refinedstorage/api/storage/item/IItemStorage.java similarity index 76% rename from src/main/java/refinedstorage/api/storage/IStorage.java rename to src/main/java/refinedstorage/api/storage/item/IItemStorage.java index 085b98bc2..a30bb0134 100755 --- a/src/main/java/refinedstorage/api/storage/IStorage.java +++ b/src/main/java/refinedstorage/api/storage/item/IItemStorage.java @@ -1,16 +1,17 @@ -package refinedstorage.api.storage; +package refinedstorage.api.storage.item; import net.minecraft.item.ItemStack; +import refinedstorage.api.storage.CompareUtils; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.List; /** - * Represents a storage sink for the storage network. - * Provide this through an {@link IStorageProvider}. + * Represents an item storage sink for the storage network. + * Provide this through an {@link IItemStorageProvider}. */ -public interface IStorage { +public interface IItemStorage { /** * @return Items stored in this storage */ @@ -28,14 +29,13 @@ public interface IStorage { ItemStack insertItem(@Nonnull ItemStack stack, int size, boolean simulate); /** - * Extracts an item from storage. - * - * If the stack we found in the system is smaller than the requested size, return the stack anyway. - * For example: if this method is called for dirt (64x) while there is only dirt (32x), return the dirt (32x) anyway. + * Extracts an item from this storage. + *

+ * If the stack we found in the system is smaller than the requested size, return that stack anyway. * * @param stack A prototype of the stack to extract, do NOT modify * @param size The amount of that prototype that has to be extracted - * @param flags On what we are comparing to extract this item, see {@link CompareFlags} + * @param flags On what we are comparing to extract this item, see {@link CompareUtils} * @return null if we didn't extract anything, or an {@link ItemStack} with the result */ @Nullable diff --git a/src/main/java/refinedstorage/api/storage/item/IItemStorageProvider.java b/src/main/java/refinedstorage/api/storage/item/IItemStorageProvider.java new file mode 100755 index 000000000..e0e365df6 --- /dev/null +++ b/src/main/java/refinedstorage/api/storage/item/IItemStorageProvider.java @@ -0,0 +1,15 @@ +package refinedstorage.api.storage.item; + +import java.util.List; + +/** + * Represents a tile that provides item storage to the network. Implement this on a tile that is a {@link refinedstorage.api.network.INetworkNode}. + */ +public interface IItemStorageProvider { + /** + * Adds the item storages that this storage provider provides. + * + * @param storages The previously added item storages + */ + void addItemStorages(List storages); +} diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java index 93f126982..9f6dc854f 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java @@ -2,13 +2,15 @@ package refinedstorage.apiimpl.autocrafting; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagIntArray; import net.minecraft.nbt.NBTTagList; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingTask; import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.apiimpl.storage.fluid.FluidUtils; import java.util.ArrayList; import java.util.List; @@ -25,7 +27,7 @@ public class BasicCraftingTask implements ICraftingTask { private boolean satisfied[]; private boolean checked[]; private boolean childTasks[]; - private List itemsTook = new ArrayList(); + private List itemsTook = new ArrayList<>(); private boolean updatedOnce; public BasicCraftingTask(ICraftingPattern pattern) { @@ -37,9 +39,9 @@ public class BasicCraftingTask implements ICraftingTask { public BasicCraftingTask(NBTTagCompound tag, ICraftingPattern pattern) { this.pattern = pattern; - this.satisfied = RefinedStorageUtils.readBooleanArray(tag, NBT_SATISFIED); - this.checked = RefinedStorageUtils.readBooleanArray(tag, NBT_CHECKED); - this.childTasks = RefinedStorageUtils.readBooleanArray(tag, NBT_CHILD_TASKS); + this.satisfied = readBooleanArray(tag, NBT_SATISFIED); + this.checked = readBooleanArray(tag, NBT_CHECKED); + this.childTasks = readBooleanArray(tag, NBT_CHILD_TASKS); NBTTagList tookList = tag.getTagList(NBT_TOOK, Constants.NBT.TAG_COMPOUND); @@ -67,14 +69,14 @@ public class BasicCraftingTask implements ICraftingTask { if (!satisfied[i]) { done = false; - ItemStack took = RefinedStorageUtils.extractItem(network, input, 1); + ItemStack took = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, 1); if (took != null) { itemsTook.add(took); satisfied[i] = true; } else if (!childTasks[i]) { - ICraftingPattern pattern = RefinedStorageUtils.getPattern(network, input); + ICraftingPattern pattern = NetworkUtils.getPattern(network, input); if (pattern != null) { network.addCraftingTask(network.createCraftingTask(pattern)); @@ -92,7 +94,7 @@ public class BasicCraftingTask implements ICraftingTask { return done; } - // @todo: handle no space + // @TODO: Handle no space @Override public void onDone(INetworkMaster network) { for (ItemStack output : pattern.getOutputs()) { @@ -106,7 +108,7 @@ public class BasicCraftingTask implements ICraftingTask { } } - // @todo: handle no space + // @TODO: Handle no space @Override public void onCancelled(INetworkMaster network) { for (ItemStack took : itemsTook) { @@ -120,9 +122,9 @@ public class BasicCraftingTask implements ICraftingTask { pattern.writeToNBT(patternTag); tag.setTag(CraftingPattern.NBT, patternTag); - RefinedStorageUtils.writeBooleanArray(tag, NBT_SATISFIED, satisfied); - RefinedStorageUtils.writeBooleanArray(tag, NBT_CHECKED, checked); - RefinedStorageUtils.writeBooleanArray(tag, NBT_CHILD_TASKS, childTasks); + writeBooleanArray(tag, NBT_SATISFIED, satisfied); + writeBooleanArray(tag, NBT_CHECKED, checked); + writeBooleanArray(tag, NBT_CHILD_TASKS, childTasks); NBTTagList tookList = new NBTTagList(); @@ -177,4 +179,26 @@ public class BasicCraftingTask implements ICraftingTask { return builder.toString(); } + + public static void writeBooleanArray(NBTTagCompound tag, String name, boolean[] array) { + int[] intArray = new int[array.length]; + + for (int i = 0; i < intArray.length; ++i) { + intArray[i] = array[i] ? 1 : 0; + } + + tag.setTag(name, new NBTTagIntArray(intArray)); + } + + public static boolean[] readBooleanArray(NBTTagCompound tag, String name) { + int[] intArray = tag.getIntArray(name); + + boolean array[] = new boolean[intArray.length]; + + for (int i = 0; i < intArray.length; ++i) { + array[i] = intArray[i] == 1 ? true : false; + } + + return array; + } } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingTaskScheduler.java b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingTaskScheduler.java index 201779bc7..ac3d20738 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingTaskScheduler.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingTaskScheduler.java @@ -3,9 +3,9 @@ package refinedstorage.apiimpl.autocrafting; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.storage.CompareUtils; public class CraftingTaskScheduler { private static final String NBT_SCHEDULED = "CraftingTaskScheduled"; @@ -18,7 +18,7 @@ public class CraftingTaskScheduler { } public boolean canSchedule(int compare, ItemStack item) { - return scheduledItem == null || !RefinedStorageUtils.compareStack(scheduledItem, item, compare); + return scheduledItem == null || !CompareUtils.compareStack(scheduledItem, item, compare); } public void schedule(INetworkMaster network, int compare, ItemStack item) { @@ -39,7 +39,7 @@ public class CraftingTaskScheduler { tile.markDirty(); } - public void writeToNBT(NBTTagCompound tag) { + public void write(NBTTagCompound tag) { if (scheduledItem != null) { tag.setTag(NBT_SCHEDULED, scheduledItem.serializeNBT()); } else { diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java index 70368b580..e22ce9ce4 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java @@ -4,11 +4,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.items.ItemHandlerHelper; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingPatternContainer; import refinedstorage.api.autocrafting.ICraftingTask; import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.apiimpl.storage.fluid.FluidUtils; public class ProcessingCraftingTask implements ICraftingTask { public static final int ID = 1; @@ -32,9 +34,9 @@ public class ProcessingCraftingTask implements ICraftingTask { public ProcessingCraftingTask(NBTTagCompound tag, ICraftingPattern pattern) { this.pattern = pattern; - this.inserted = RefinedStorageUtils.readBooleanArray(tag, NBT_INSERTED); - this.childTasks = RefinedStorageUtils.readBooleanArray(tag, NBT_CHILD_TASKS); - this.satisfied = RefinedStorageUtils.readBooleanArray(tag, NBT_SATISFIED); + this.inserted = BasicCraftingTask.readBooleanArray(tag, NBT_INSERTED); + this.childTasks = BasicCraftingTask.readBooleanArray(tag, NBT_CHILD_TASKS); + this.satisfied = BasicCraftingTask.readBooleanArray(tag, NBT_SATISFIED); } @Override @@ -52,7 +54,7 @@ public class ProcessingCraftingTask implements ICraftingTask { for (int i = 0; i < inserted.length; ++i) { if (!inserted[i]) { ItemStack input = pattern.getInputs()[i]; - ItemStack took = RefinedStorageUtils.extractItem(network, input, 1); + ItemStack took = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, 1); if (took != null) { if (ItemHandlerHelper.insertItem(container.getConnectedItems(), took, true) == null) { @@ -63,7 +65,7 @@ public class ProcessingCraftingTask implements ICraftingTask { network.insertItem(took, took.stackSize, false); } } else if (!childTasks[i]) { - ICraftingPattern pattern = RefinedStorageUtils.getPattern(network, input); + ICraftingPattern pattern = NetworkUtils.getPattern(network, input); if (pattern != null) { childTasks[i] = true; @@ -92,7 +94,7 @@ public class ProcessingCraftingTask implements ICraftingTask { public boolean onInserted(ItemStack stack) { for (int i = 0; i < pattern.getOutputs().length; ++i) { - if (!satisfied[i] && RefinedStorageUtils.compareStackNoQuantity(stack, pattern.getOutputs()[i])) { + if (!satisfied[i] && CompareUtils.compareStackNoQuantity(stack, pattern.getOutputs()[i])) { satisfied[i] = true; return true; @@ -118,9 +120,9 @@ public class ProcessingCraftingTask implements ICraftingTask { pattern.writeToNBT(patternTag); tag.setTag(CraftingPattern.NBT, patternTag); - RefinedStorageUtils.writeBooleanArray(tag, NBT_INSERTED, inserted); - RefinedStorageUtils.writeBooleanArray(tag, NBT_CHILD_TASKS, childTasks); - RefinedStorageUtils.writeBooleanArray(tag, NBT_SATISFIED, satisfied); + BasicCraftingTask.writeBooleanArray(tag, NBT_INSERTED, inserted); + BasicCraftingTask.writeBooleanArray(tag, NBT_CHILD_TASKS, childTasks); + BasicCraftingTask.writeBooleanArray(tag, NBT_SATISFIED, satisfied); tag.setInteger("Type", ID); } diff --git a/src/main/java/refinedstorage/apiimpl/network/NetworkNodeGraph.java b/src/main/java/refinedstorage/apiimpl/network/NetworkNodeGraph.java new file mode 100755 index 000000000..562c98c35 --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/network/NetworkNodeGraph.java @@ -0,0 +1,166 @@ +package refinedstorage.apiimpl.network; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import refinedstorage.api.network.INetworkNode; +import refinedstorage.api.network.INetworkNodeGraph; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.tile.TileController; +import refinedstorage.tile.TileNetworkTransmitter; + +import java.util.*; + +public class NetworkNodeGraph implements INetworkNodeGraph { + private TileController controller; + + private List nodes = new ArrayList<>(); + private Set nodeHashes = new HashSet<>(); + + public NetworkNodeGraph(TileController controller) { + this.controller = controller; + } + + @Override + public void rebuild(BlockPos start, boolean notify) { + if (!controller.canRun()) { + if (!nodes.isEmpty()) { + disconnectAll(); + } + + return; + } + + World world = getWorld(); + + List newNodes = new ArrayList<>(); + Set newNodeHashes = new HashSet<>(); + + Set checked = new HashSet<>(); + Queue toCheck = new ArrayDeque<>(); + + checked.add(start); + toCheck.add(start); + + for (EnumFacing facing : EnumFacing.VALUES) { + BlockPos pos = start.offset(facing); + + checked.add(pos); + toCheck.add(pos); + } + + BlockPos currentPos; + while ((currentPos = toCheck.poll()) != null) { + TileEntity tile = world.getTileEntity(currentPos); + + if (tile instanceof TileController && !controller.getPos().equals(tile.getPos())) { + world.createExplosion(null, tile.getPos().getX(), tile.getPos().getY(), tile.getPos().getZ(), 4.5f, true); + } + + if (!(tile instanceof INetworkNode)) { + continue; + } + + INetworkNode node = (INetworkNode) tile; + + newNodes.add(node); + newNodeHashes.add(NetworkUtils.getNodeHashCode(world, node)); + + if (tile instanceof TileNetworkTransmitter) { + final TileNetworkTransmitter transmitter = (TileNetworkTransmitter) tile; + + if (transmitter.canTransmit()) { + if (!transmitter.isSameDimension()) { + NetworkNodeGraph dimensionGraph = new NetworkNodeGraph(controller) { + @Override + public World getWorld() { + return DimensionManager.getWorld(transmitter.getReceiverDimension()); + } + }; + + dimensionGraph.rebuild(transmitter.getReceiver(), false); + + newNodes.addAll(dimensionGraph.all()); + newNodeHashes.addAll(dimensionGraph.allHashes()); + } else { + BlockPos receiver = transmitter.getReceiver(); + + if (checked.add(receiver)) { + toCheck.add(receiver); + } + } + } + } + + for (EnumFacing facing : EnumFacing.VALUES) { + if (node.canConduct(facing)) { + BlockPos pos = currentPos.offset(facing); + + if (checked.add(pos)) { + toCheck.add(pos); + } + } + } + } + + List oldNodes = new ArrayList<>(nodes); + Set oldNodeHashes = new HashSet<>(nodeHashes); + + this.nodes = newNodes; + this.nodeHashes = newNodeHashes; + + if (notify) { + boolean changed = false; + + for (INetworkNode newNode : nodes) { + if (!oldNodeHashes.contains(NetworkUtils.getNodeHashCode(newNode.getNodeWorld(), newNode))) { + newNode.onConnected(controller); + + changed = true; + } + } + + for (INetworkNode oldNode : oldNodes) { + if (!nodeHashes.contains(NetworkUtils.getNodeHashCode(oldNode.getNodeWorld(), oldNode))) { + oldNode.onDisconnected(controller); + + changed = true; + } + } + + if (changed) { + controller.getDataManager().sendParameterToWatchers(TileController.NODES); + } + } + } + + @Override + public List all() { + return nodes; + } + + @Override + public Set allHashes() { + return nodeHashes; + } + + @Override + public void disconnectAll() { + for (INetworkNode node : nodes) { + if (node.isConnected()) { + node.onDisconnected(controller); + } + } + + nodes.clear(); + nodeHashes.clear(); + + controller.getDataManager().sendParameterToWatchers(TileController.NODES); + } + + public World getWorld() { + return controller.getWorld(); + } +} diff --git a/src/main/java/refinedstorage/apiimpl/network/WirelessGridConsumer.java b/src/main/java/refinedstorage/apiimpl/network/WirelessGridConsumer.java index 497642f16..124145a4b 100755 --- a/src/main/java/refinedstorage/apiimpl/network/WirelessGridConsumer.java +++ b/src/main/java/refinedstorage/apiimpl/network/WirelessGridConsumer.java @@ -2,25 +2,17 @@ package refinedstorage.apiimpl.network; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumHand; import refinedstorage.api.network.IWirelessGridConsumer; public class WirelessGridConsumer implements IWirelessGridConsumer { private EntityPlayer player; - private EnumHand hand; private ItemStack stack; - public WirelessGridConsumer(EntityPlayer player, EnumHand hand, ItemStack stack) { + public WirelessGridConsumer(EntityPlayer player, ItemStack stack) { this.player = player; - this.hand = hand; this.stack = stack; } - @Override - public EnumHand getHand() { - return hand; - } - @Override public EntityPlayer getPlayer() { return player; diff --git a/src/main/java/refinedstorage/apiimpl/network/WirelessGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/WirelessGridHandler.java index ab8a566ed..15f3d1d97 100755 --- a/src/main/java/refinedstorage/apiimpl/network/WirelessGridHandler.java +++ b/src/main/java/refinedstorage/apiimpl/network/WirelessGridHandler.java @@ -7,7 +7,6 @@ import net.minecraft.util.EnumHand; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageGui; import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.network.*; import refinedstorage.item.ItemWirelessGrid; @@ -16,14 +15,10 @@ import java.util.Iterator; import java.util.List; public class WirelessGridHandler implements IWirelessGridHandler { - public static final int USAGE_OPEN = 30; - public static final int USAGE_EXTRACT = 3; - public static final int USAGE_INSERT = 3; - private INetworkMaster network; - private List consumers = new ArrayList(); - private List consumersToRemove = new ArrayList(); + private List consumers = new ArrayList<>(); + private List consumersToRemove = new ArrayList<>(); public WirelessGridHandler(INetworkMaster network) { this.network = network; @@ -33,26 +28,13 @@ public class WirelessGridHandler implements IWirelessGridHandler { public void update() { consumers.removeAll(consumersToRemove); consumersToRemove.clear(); - - Iterator it = consumers.iterator(); - - while (it.hasNext()) { - IWirelessGridConsumer consumer = it.next(); - - if (!RefinedStorageUtils.compareStack(consumer.getStack(), consumer.getPlayer().getHeldItem(consumer.getHand()))) { - /** - * This will call {@link net.minecraft.inventory.Container#onContainerClosed(EntityPlayer)} so the consumer is removed from the list. - */ - consumer.getPlayer().closeScreen(); - } - } } @Override public boolean onOpen(EntityPlayer player, EnumHand hand) { boolean inRange = false; - for (INetworkNode node : network.getNodes()) { + for (INetworkNode node : network.getNodeGraph().all()) { if (node instanceof IWirelessTransmitter) { IWirelessTransmitter transmitter = (IWirelessTransmitter) node; @@ -70,13 +52,19 @@ public class WirelessGridHandler implements IWirelessGridHandler { return false; } - consumers.add(new WirelessGridConsumer(player, hand, player.getHeldItem(hand))); + ItemStack stack = player.getHeldItem(hand); - player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.WIRELESS_GRID, player.worldObj, RefinedStorageUtils.getIdFromHand(hand), 0, 0); + if (RefinedStorage.INSTANCE.wirelessGridUsesEnergy && stack.getItemDamage() != ItemWirelessGrid.TYPE_CREATIVE && RefinedStorageItems.WIRELESS_GRID.getEnergyStored(stack) <= RefinedStorage.INSTANCE.wirelessGridOpenUsage) { + return true; + } - network.sendStorageToClient((EntityPlayerMP) player); + consumers.add(new WirelessGridConsumer(player, stack)); - drainEnergy(player, USAGE_OPEN); + player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.WIRELESS_GRID, player.worldObj, hand.ordinal(), 0, 0); + + network.sendItemStorageToClient((EntityPlayerMP) player); + + drainEnergy(player, RefinedStorage.INSTANCE.wirelessGridOpenUsage); return true; } @@ -94,15 +82,15 @@ public class WirelessGridHandler implements IWirelessGridHandler { public void drainEnergy(EntityPlayer player, int energy) { IWirelessGridConsumer consumer = getConsumer(player); - if (consumer != null) { + if (consumer != null && RefinedStorage.INSTANCE.wirelessGridUsesEnergy) { ItemWirelessGrid item = RefinedStorageItems.WIRELESS_GRID; - ItemStack held = consumer.getPlayer().getHeldItem(consumer.getHand()); - if (held.getItemDamage() != ItemWirelessGrid.TYPE_CREATIVE) { - item.extractEnergy(held, energy, false); + if (consumer.getStack().getItemDamage() != ItemWirelessGrid.TYPE_CREATIVE) { + item.extractEnergy(consumer.getStack(), energy, false); - if (item.getEnergyStored(held) <= 0) { + if (item.getEnergyStored(consumer.getStack()) <= 0) { onClose(player); + consumer.getPlayer().closeScreen(); } } diff --git a/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java new file mode 100755 index 000000000..afae15666 --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java @@ -0,0 +1,80 @@ +package refinedstorage.apiimpl.network.grid; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.api.network.grid.IFluidGridHandler; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.apiimpl.storage.fluid.FluidUtils; + +import javax.annotation.Nullable; + +public class FluidGridHandler implements IFluidGridHandler { + private INetworkMaster network; + + public FluidGridHandler(INetworkMaster network) { + this.network = network; + } + + @Override + public void onExtract(int hash, boolean shift, EntityPlayerMP player) { + FluidStack stack = network.getFluidStorage().get(hash); + + if (stack != null && FluidUtils.hasFluidBucket(stack)) { + ItemStack bucket = FluidUtils.extractBucket(network); + + if (bucket == null) { + for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { + ItemStack slot = player.inventory.getStackInSlot(i); + + if (CompareUtils.compareStackNoQuantity(FluidUtils.EMPTY_BUCKET, slot)) { + bucket = FluidUtils.EMPTY_BUCKET.copy(); + + player.inventory.decrStackSize(i, 1); + + break; + } + } + } + + if (bucket != null) { + bucket.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null).fill(NetworkUtils.extractFluid(network, stack, Fluid.BUCKET_VOLUME), true); + + if (shift) { + if (!player.inventory.addItemStackToInventory(bucket.copy())) { + InventoryHelper.spawnItemStack(player.worldObj, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), bucket); + } + } else { + player.inventory.setItemStack(bucket); + player.updateHeldItem(); + } + } + } + } + + @Nullable + @Override + public ItemStack onInsert(ItemStack container) { + FluidStack stack = FluidUtils.getFluidFromStack(container, true); + + if (stack != null && network.insertFluid(stack, stack.amount, true) == null) { + FluidStack drained = FluidUtils.getFluidFromStack(container, false); + + network.insertFluid(drained, drained.amount, false); + } + + return container; + } + + @Override + public void onInsertHeldContainer(EntityPlayerMP player) { + onInsert(player.inventory.getItemStack()); + + player.updateHeldItem(); + } +} diff --git a/src/main/java/refinedstorage/apiimpl/network/GridHandler.java b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java similarity index 66% rename from src/main/java/refinedstorage/apiimpl/network/GridHandler.java rename to src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java index 806811846..282f7f2a5 100755 --- a/src/main/java/refinedstorage/apiimpl/network/GridHandler.java +++ b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java @@ -1,27 +1,28 @@ -package refinedstorage.apiimpl.network; +package refinedstorage.apiimpl.network.grid; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; -import refinedstorage.RefinedStorageUtils; +import refinedstorage.RefinedStorage; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingTask; -import refinedstorage.api.network.GridExtractFlags; -import refinedstorage.api.network.IGridHandler; import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.api.network.grid.IItemGridHandler; +import refinedstorage.api.storage.CompareUtils; -public class GridHandler implements IGridHandler { +public class ItemGridHandler implements IItemGridHandler { public static final int MAX_CRAFTING_PER_REQUEST = 500; private INetworkMaster network; - public GridHandler(INetworkMaster network) { + public ItemGridHandler(INetworkMaster network) { this.network = network; } @Override - public void onExtract(int id, int flags, EntityPlayerMP player) { - ItemStack item = network.getStorage().get(id); + public void onExtract(int hash, int flags, EntityPlayerMP player) { + ItemStack item = network.getItemStorage().get(hash); if (item == null) { return; @@ -29,12 +30,12 @@ public class GridHandler implements IGridHandler { int itemSize = item.stackSize; - boolean single = (flags & GridExtractFlags.EXTRACT_SINGLE) == GridExtractFlags.EXTRACT_SINGLE; + boolean single = (flags & EXTRACT_SINGLE) == EXTRACT_SINGLE; ItemStack held = player.inventory.getItemStack(); if (single) { - if (held != null && (!RefinedStorageUtils.compareStackNoQuantity(item, held) || held.stackSize + 1 > held.getMaxStackSize())) { + if (held != null && (!CompareUtils.compareStackNoQuantity(item, held) || held.stackSize + 1 > held.getMaxStackSize())) { return; } } else if (player.inventory.getItemStack() != null) { @@ -43,7 +44,7 @@ public class GridHandler implements IGridHandler { int size = 64; - if ((flags & GridExtractFlags.EXTRACT_HALF) == GridExtractFlags.EXTRACT_HALF && itemSize > 1) { + if ((flags & EXTRACT_HALF) == EXTRACT_HALF && itemSize > 1) { size = itemSize / 2; if (size > 32) { @@ -51,16 +52,16 @@ public class GridHandler implements IGridHandler { } } else if (single) { size = 1; - } else if ((flags & GridExtractFlags.EXTRACT_SHIFT) == GridExtractFlags.EXTRACT_SHIFT) { + } else if ((flags & EXTRACT_SHIFT) == EXTRACT_SHIFT) { // NO OP, the quantity already set (64) is needed for shift } size = Math.min(size, item.getItem().getItemStackLimit(item)); - ItemStack took = RefinedStorageUtils.extractItem(network, item, size); + ItemStack took = NetworkUtils.extractItem(network, item, size); if (took != null) { - if ((flags & GridExtractFlags.EXTRACT_SHIFT) == GridExtractFlags.EXTRACT_SHIFT) { + if ((flags & EXTRACT_SHIFT) == EXTRACT_SHIFT) { if (!player.inventory.addItemStackToInventory(took.copy())) { InventoryHelper.spawnItemStack(player.worldObj, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), took); } @@ -74,17 +75,21 @@ public class GridHandler implements IGridHandler { player.updateHeldItem(); } - network.getWirelessGridHandler().drainEnergy(player, WirelessGridHandler.USAGE_EXTRACT); + network.getWirelessGridHandler().drainEnergy(player, RefinedStorage.INSTANCE.wirelessGridExtractUsage); } } @Override - public ItemStack onInsert(ItemStack stack) { - return network.insertItem(stack, stack.stackSize, false); + public ItemStack onInsert(EntityPlayerMP player, ItemStack stack) { + ItemStack remainder = network.insertItem(stack, stack.stackSize, false); + + network.getWirelessGridHandler().drainEnergy(player, RefinedStorage.INSTANCE.wirelessGridInsertUsage); + + return remainder; } @Override - public void onInsertHeldItem(boolean single, EntityPlayerMP player) { + public void onInsertHeldItem(EntityPlayerMP player, boolean single) { if (player.inventory.getItemStack() == null) { return; } @@ -108,16 +113,16 @@ public class GridHandler implements IGridHandler { player.updateHeldItem(); - network.getWirelessGridHandler().drainEnergy(player, WirelessGridHandler.USAGE_INSERT); + network.getWirelessGridHandler().drainEnergy(player, RefinedStorage.INSTANCE.wirelessGridInsertUsage); } @Override - public void onCraftingRequested(int id, int quantity) { + public void onCraftingRequested(int hash, int quantity) { if (quantity <= 0 || quantity > MAX_CRAFTING_PER_REQUEST) { return; } - ItemStack stack = network.getStorage().get(id); + ItemStack stack = network.getItemStorage().get(hash); if (stack == null) { return; @@ -125,11 +130,11 @@ public class GridHandler implements IGridHandler { int quantityPerRequest = 0; - ICraftingPattern pattern = RefinedStorageUtils.getPattern(network, stack); + ICraftingPattern pattern = NetworkUtils.getPattern(network, stack); if (pattern != null) { for (ItemStack output : pattern.getOutputs()) { - if (RefinedStorageUtils.compareStackNoQuantity(stack, output)) { + if (CompareUtils.compareStackNoQuantity(stack, output)) { quantityPerRequest += output.stackSize; if (!pattern.isProcessing()) { diff --git a/src/main/java/refinedstorage/apiimpl/solderer/SoldererRecipeFluidStorage.java b/src/main/java/refinedstorage/apiimpl/solderer/SoldererRecipeFluidStorage.java new file mode 100755 index 000000000..08da59181 --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/solderer/SoldererRecipeFluidStorage.java @@ -0,0 +1,38 @@ +package refinedstorage.apiimpl.solderer; + +import net.minecraft.item.ItemStack; +import refinedstorage.RefinedStorageBlocks; +import refinedstorage.RefinedStorageItems; +import refinedstorage.api.solderer.ISoldererRecipe; +import refinedstorage.block.EnumFluidStorageType; +import refinedstorage.item.ItemBlockFluidStorage; +import refinedstorage.item.ItemProcessor; + +public class SoldererRecipeFluidStorage implements ISoldererRecipe { + private EnumFluidStorageType type; + private ItemStack[] rows; + + public SoldererRecipeFluidStorage(EnumFluidStorageType type, int storagePart) { + this.type = type; + this.rows = new ItemStack[]{ + new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_BASIC), + new ItemStack(RefinedStorageBlocks.MACHINE_CASING), + new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, storagePart) + }; + } + + @Override + public ItemStack getRow(int row) { + return rows[row]; + } + + @Override + public ItemStack getResult() { + return ItemBlockFluidStorage.initNBT(new ItemStack(RefinedStorageBlocks.FLUID_STORAGE, 1, type.getId())); + } + + @Override + public int getDuration() { + return 200; + } +} diff --git a/src/main/java/refinedstorage/apiimpl/solderer/SoldererRecipeStorage.java b/src/main/java/refinedstorage/apiimpl/solderer/SoldererRecipeStorage.java index 122b918d9..259b9f7cb 100755 --- a/src/main/java/refinedstorage/apiimpl/solderer/SoldererRecipeStorage.java +++ b/src/main/java/refinedstorage/apiimpl/solderer/SoldererRecipeStorage.java @@ -4,15 +4,15 @@ import net.minecraft.item.ItemStack; import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageItems; import refinedstorage.api.solderer.ISoldererRecipe; -import refinedstorage.block.EnumStorageType; +import refinedstorage.block.EnumItemStorageType; import refinedstorage.item.ItemBlockStorage; import refinedstorage.item.ItemProcessor; public class SoldererRecipeStorage implements ISoldererRecipe { - private EnumStorageType type; + private EnumItemStorageType type; private ItemStack[] rows; - public SoldererRecipeStorage(EnumStorageType type, int storagePart) { + public SoldererRecipeStorage(EnumItemStorageType type, int storagePart) { this.type = type; this.rows = new ItemStack[]{ new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_BASIC), diff --git a/src/main/java/refinedstorage/apiimpl/solderer/SoldererRecipeUpgrade.java b/src/main/java/refinedstorage/apiimpl/solderer/SoldererRecipeUpgrade.java index 8f8f223ec..e92266508 100755 --- a/src/main/java/refinedstorage/apiimpl/solderer/SoldererRecipeUpgrade.java +++ b/src/main/java/refinedstorage/apiimpl/solderer/SoldererRecipeUpgrade.java @@ -1,7 +1,5 @@ package refinedstorage.apiimpl.solderer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import refinedstorage.RefinedStorageItems; import refinedstorage.api.solderer.ISoldererRecipe; @@ -12,25 +10,11 @@ public class SoldererRecipeUpgrade implements ISoldererRecipe { private ItemStack result; public SoldererRecipeUpgrade(int type) { - ItemStack requirement = null; - - switch (type) { - case ItemUpgrade.TYPE_RANGE: - requirement = new ItemStack(Items.ENDER_PEARL); - break; - case ItemUpgrade.TYPE_SPEED: - requirement = new ItemStack(Items.SUGAR); - break; - case ItemUpgrade.TYPE_CRAFTING: - requirement = new ItemStack(Blocks.CRAFTING_TABLE); - break; - } - this.result = new ItemStack(RefinedStorageItems.UPGRADE, 1, type); this.rows = new ItemStack[]{ - requirement, + ItemUpgrade.getRequirement(type), new ItemStack(RefinedStorageItems.UPGRADE, 1, 0), - requirement + ItemUpgrade.getRequirement(type) }; } diff --git a/src/main/java/refinedstorage/apiimpl/solderer/SoldererRegistry.java b/src/main/java/refinedstorage/apiimpl/solderer/SoldererRegistry.java index efed97dc7..971b5aade 100755 --- a/src/main/java/refinedstorage/apiimpl/solderer/SoldererRegistry.java +++ b/src/main/java/refinedstorage/apiimpl/solderer/SoldererRegistry.java @@ -1,9 +1,9 @@ package refinedstorage.apiimpl.solderer; import net.minecraftforge.items.IItemHandler; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.solderer.ISoldererRecipe; import refinedstorage.api.solderer.ISoldererRegistry; +import refinedstorage.api.storage.CompareUtils; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.List; public class SoldererRegistry implements ISoldererRegistry { - private List recipes = new ArrayList(); + private List recipes = new ArrayList<>(); @Override public void addRecipe(@Nonnull ISoldererRecipe recipe) { @@ -30,7 +30,7 @@ public class SoldererRegistry implements ISoldererRegistry { boolean found = true; for (int i = 0; i < 3; ++i) { - if (!RefinedStorageUtils.compareStackNoQuantity(recipe.getRow(i), items.getStackInSlot(i)) && !RefinedStorageUtils.compareStackOreDict(recipe.getRow(i), items.getStackInSlot(i))) { + if (!CompareUtils.compareStackNoQuantity(recipe.getRow(i), items.getStackInSlot(i)) && !CompareUtils.compareStackOreDict(recipe.getRow(i), items.getStackInSlot(i))) { found = false; } diff --git a/src/main/java/refinedstorage/apiimpl/storage/ClientStack.java b/src/main/java/refinedstorage/apiimpl/storage/ClientStack.java deleted file mode 100755 index 0b568540c..000000000 --- a/src/main/java/refinedstorage/apiimpl/storage/ClientStack.java +++ /dev/null @@ -1,53 +0,0 @@ -package refinedstorage.apiimpl.storage; - -import io.netty.buffer.ByteBuf; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.network.ByteBufUtils; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.api.network.INetworkMaster; - -public class ClientStack { - private int id; - private ItemStack stack; - private boolean craftable; - - public ClientStack(int id, ItemStack stack, boolean craftable) { - this.id = id; - this.stack = stack; - this.craftable = craftable; - } - - public ClientStack(ByteBuf buf) { - stack = new ItemStack(Item.getItemById(buf.readInt()), buf.readInt(), buf.readInt()); - stack.setTagCompound(ByteBufUtils.readTag(buf)); - id = buf.readInt(); - craftable = buf.readBoolean(); - } - - public int getId() { - return id; - } - - public ItemStack getStack() { - return stack; - } - - public boolean isCraftable() { - return craftable; - } - - @Override - public boolean equals(Object obj) { - return obj instanceof ClientStack && ((ClientStack) obj).getId() == id; - } - - public static void write(ByteBuf buf, INetworkMaster network, ItemStack stack) { - buf.writeInt(Item.getIdFromItem(stack.getItem())); - buf.writeInt(stack.stackSize); - buf.writeInt(stack.getItemDamage()); - ByteBufUtils.writeTag(buf, stack.getTagCompound()); - buf.writeInt(RefinedStorageUtils.getItemStackHashCode(stack)); - buf.writeBoolean(RefinedStorageUtils.hasPattern(network, stack)); - } -} diff --git a/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidRenderer.java b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidRenderer.java new file mode 100755 index 000000000..a5c486aad --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidRenderer.java @@ -0,0 +1,126 @@ +package refinedstorage.apiimpl.storage.fluid; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +/** + * This fluid renderer is copied over from JEI because Forge lacks a utility method for rendering fluids. + * + * @link https://github.com/mezz/JustEnoughItems/blob/1.10/src/main/java/mezz/jei/gui/ingredients/FluidStackRenderer.java + */ +public class FluidRenderer { + private static final int TEX_WIDTH = 16; + private static final int TEX_HEIGHT = 16; + private static final int MIN_FLUID_HEIGHT = 1; + + private final int capacityMb; + private final int width; + private final int height; + + public FluidRenderer(int capacityMb, int width, int height) { + this.capacityMb = capacityMb; + this.width = width; + this.height = height; + } + + public void draw(Minecraft minecraft, final int xPosition, final int yPosition, FluidStack fluidStack) { + GlStateManager.enableBlend(); + GlStateManager.enableAlpha(); + + drawFluid(minecraft, xPosition, yPosition, fluidStack); + + GlStateManager.color(1, 1, 1, 1); + + GlStateManager.disableAlpha(); + GlStateManager.disableBlend(); + } + + private void drawFluid(Minecraft minecraft, final int xPosition, final int yPosition, FluidStack fluidStack) { + if (fluidStack == null) { + return; + } + Fluid fluid = fluidStack.getFluid(); + if (fluid == null) { + return; + } + + TextureMap textureMapBlocks = minecraft.getTextureMapBlocks(); + ResourceLocation fluidStill = fluid.getStill(); + TextureAtlasSprite fluidStillSprite = null; + if (fluidStill != null) { + fluidStillSprite = textureMapBlocks.getTextureExtry(fluidStill.toString()); + } + if (fluidStillSprite == null) { + fluidStillSprite = textureMapBlocks.getMissingSprite(); + } + + int fluidColor = fluid.getColor(fluidStack); + + int scaledAmount = (fluidStack.amount * height) / capacityMb; + if (fluidStack.amount > 0 && scaledAmount < MIN_FLUID_HEIGHT) { + scaledAmount = MIN_FLUID_HEIGHT; + } + if (scaledAmount > height) { + scaledAmount = height; + } + + minecraft.renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); + setGLColorFromInt(fluidColor); + + final int xTileCount = width / TEX_WIDTH; + final int xRemainder = width - (xTileCount * TEX_WIDTH); + final int yTileCount = scaledAmount / TEX_HEIGHT; + final int yRemainder = scaledAmount - (yTileCount * TEX_HEIGHT); + + final int yStart = yPosition + height; + + for (int xTile = 0; xTile <= xTileCount; xTile++) { + for (int yTile = 0; yTile <= yTileCount; yTile++) { + int width = (xTile == xTileCount) ? xRemainder : TEX_WIDTH; + int height = (yTile == yTileCount) ? yRemainder : TEX_HEIGHT; + int x = xPosition + (xTile * TEX_WIDTH); + int y = yStart - ((yTile + 1) * TEX_HEIGHT); + if (width > 0 && height > 0) { + int maskTop = TEX_HEIGHT - height; + int maskRight = TEX_WIDTH - width; + + drawFluidTexture(x, y, fluidStillSprite, maskTop, maskRight, 100); + } + } + } + } + + private static void setGLColorFromInt(int color) { + float red = (color >> 16 & 0xFF) / 255.0F; + float green = (color >> 8 & 0xFF) / 255.0F; + float blue = (color & 0xFF) / 255.0F; + + GlStateManager.color(red, green, blue, 1.0F); + } + + private static void drawFluidTexture(double xCoord, double yCoord, TextureAtlasSprite textureSprite, int maskTop, int maskRight, double zLevel) { + double uMin = (double) textureSprite.getMinU(); + double uMax = (double) textureSprite.getMaxU(); + double vMin = (double) textureSprite.getMinV(); + double vMax = (double) textureSprite.getMaxV(); + uMax = uMax - (maskRight / 16.0 * (uMax - uMin)); + vMax = vMax - (maskTop / 16.0 * (vMax - vMin)); + + Tessellator tessellator = Tessellator.getInstance(); + VertexBuffer vertexBuffer = tessellator.getBuffer(); + vertexBuffer.begin(7, DefaultVertexFormats.POSITION_TEX); + vertexBuffer.pos(xCoord, yCoord + 16, zLevel).tex(uMin, vMax).endVertex(); + vertexBuffer.pos(xCoord + 16 - maskRight, yCoord + 16, zLevel).tex(uMax, vMax).endVertex(); + vertexBuffer.pos(xCoord + 16 - maskRight, yCoord + maskTop, zLevel).tex(uMax, vMin).endVertex(); + vertexBuffer.pos(xCoord, yCoord + maskTop, zLevel).tex(uMin, vMin).endVertex(); + tessellator.draw(); + } +} diff --git a/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidStorageNBT.java b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidStorageNBT.java new file mode 100755 index 000000000..8760ef1e8 --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidStorageNBT.java @@ -0,0 +1,217 @@ +package refinedstorage.apiimpl.storage.fluid; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.FluidStack; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.storage.fluid.IFluidStorage; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; + +/** + * A implementation of {@link IFluidStorage} that stores storage fluids in NBT. + */ +public abstract class FluidStorageNBT implements IFluidStorage { + /** + * The current save protocol that is used. It's set to every {@link FluidStorageNBT} to allow for + * safe backwards compatibility breaks. + */ + private static final int PROTOCOL = 1; + + private static final String NBT_PROTOCOL = "Protocol"; + + private static final String NBT_FLUIDS = "Fluids"; + private static final String NBT_STORED = "Stored"; + + private NBTTagCompound tag; + private int capacity; + private TileEntity tile; + + private List stacks = new ArrayList<>(); + + /** + * @param tag The NBT tag we are reading from and writing the amount stored to, has to be initialized with {@link FluidStorageNBT#createNBT()} if it doesn't exist yet + * @param capacity The capacity of this storage, -1 for infinite capacity + * @param tile A {@link TileEntity} that the NBT storage is in, will be marked dirty when the storage changes + */ + public FluidStorageNBT(NBTTagCompound tag, int capacity, @Nullable TileEntity tile) { + this.tag = tag; + this.capacity = capacity; + this.tile = tile; + + readFromNBT(); + } + + public void readFromNBT() { + NBTTagList list = (NBTTagList) tag.getTag(NBT_FLUIDS); + + for (int i = 0; i < list.tagCount(); ++i) { + FluidStack stack = FluidStack.loadFluidStackFromNBT(list.getCompoundTagAt(i)); + + if (stack != null) { + stacks.add(stack); + } + } + } + + /** + * Writes the items to the NBT tag. + */ + public void writeToNBT() { + NBTTagList list = new NBTTagList(); + + for (FluidStack stack : stacks) { + list.appendTag(stack.writeToNBT(new NBTTagCompound())); + } + + tag.setTag(NBT_FLUIDS, list); + tag.setInteger(NBT_PROTOCOL, PROTOCOL); + } + + @Override + public List getStacks() { + return stacks; + } + + @Override + public FluidStack insertFluid(FluidStack stack, int size, boolean simulate) { + for (FluidStack otherStack : stacks) { + if (otherStack.isFluidEqual(stack)) { + if (getCapacity() != -1 && getStored() + size > getCapacity()) { + int remainingSpace = getCapacity() - getStored(); + + if (remainingSpace <= 0) { + return FluidUtils.copyStackWithSize(stack, size); + } + + if (!simulate) { + tag.setInteger(NBT_STORED, getStored() + remainingSpace); + + otherStack.amount += remainingSpace; + + onStorageChanged(); + } + + return FluidUtils.copyStackWithSize(otherStack, size - remainingSpace); + } else { + if (!simulate) { + tag.setInteger(NBT_STORED, getStored() + size); + + otherStack.amount += size; + + onStorageChanged(); + } + + return null; + } + } + } + + if (getCapacity() != -1 && getStored() + size > getCapacity()) { + int remainingSpace = getCapacity() - getStored(); + + if (remainingSpace <= 0) { + return FluidUtils.copyStackWithSize(stack, size); + } + + if (!simulate) { + tag.setInteger(NBT_STORED, getStored() + remainingSpace); + + stacks.add(FluidUtils.copyStackWithSize(stack, remainingSpace)); + + onStorageChanged(); + } + + return FluidUtils.copyStackWithSize(stack, size - remainingSpace); + } else { + if (!simulate) { + tag.setInteger(NBT_STORED, getStored() + size); + + stacks.add(FluidUtils.copyStackWithSize(stack, size)); + + onStorageChanged(); + } + + return null; + } + } + + @Override + public FluidStack extractFluid(FluidStack stack, int size, int flags) { + for (FluidStack otherStack : stacks) { + if (CompareUtils.compareStack(otherStack, stack, flags)) { + if (size > otherStack.amount) { + size = otherStack.amount; + } + + if (otherStack.amount - size == 0) { + stacks.remove(otherStack); + } else { + otherStack.amount -= size; + } + + tag.setInteger(NBT_STORED, getStored() - size); + + onStorageChanged(); + + return FluidUtils.copyStackWithSize(otherStack, size); + } + } + + return null; + } + + public void onStorageChanged() { + if (tile != null) { + tile.markDirty(); + } + } + + @Override + public int getStored() { + return getStoredFromNBT(tag); + } + + public int getCapacity() { + return capacity; + } + + public NBTTagCompound getTag() { + return tag; + } + + public static int getStoredFromNBT(NBTTagCompound tag) { + return tag.getInteger(NBT_STORED); + } + + /* + * @return A NBT tag initialized with the fields that {@link NBTStorage} uses + */ + public static NBTTagCompound createNBT() { + NBTTagCompound tag = new NBTTagCompound(); + + tag.setTag(NBT_FLUIDS, new NBTTagList()); + tag.setInteger(NBT_STORED, 0); + tag.setInteger(NBT_PROTOCOL, PROTOCOL); + + return tag; + } + + public static boolean isValid(ItemStack stack) { + return stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_FLUIDS) && stack.getTagCompound().hasKey(NBT_STORED); + } + + /** + * @param stack The {@link ItemStack} to populate with the NBT tags from {@link FluidStorageNBT#createNBT()} + * @return The provided {@link ItemStack} with NBT tags from {@link FluidStorageNBT#createNBT()} + */ + public static ItemStack createStackWithNBT(ItemStack stack) { + stack.setTagCompound(createNBT()); + + return stack; + } +} diff --git a/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java new file mode 100755 index 000000000..512b0016f --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java @@ -0,0 +1,68 @@ +package refinedstorage.apiimpl.storage.fluid; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidContainerItem; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import refinedstorage.api.autocrafting.ICraftingPattern; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; + +public final class FluidUtils { + public static final ItemStack EMPTY_BUCKET = new ItemStack(Items.BUCKET); + + public static FluidStack copyStackWithSize(FluidStack stack, int size) { + FluidStack copy = stack.copy(); + copy.amount = size; + return copy; + } + + public static FluidStack copy(FluidStack stack) { + return stack == null ? null : stack.copy(); + } + + public static FluidStack getFluidFromStack(ItemStack stack, boolean simulate) { + if (stack.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null)) { + return stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null).drain(Fluid.BUCKET_VOLUME, !simulate); + } else if (stack.getItem() instanceof IFluidContainerItem) { + return ((IFluidContainerItem) stack.getItem()).drain(stack, Fluid.BUCKET_VOLUME, !simulate); + } + + return null; + } + + public static boolean hasFluidBucket(FluidStack stack) { + return stack.getFluid() == FluidRegistry.WATER || stack.getFluid() == FluidRegistry.LAVA || FluidRegistry.getBucketFluids().contains(stack.getFluid()); + } + + public static ItemStack extractItemOrIfBucketLookInFluids(INetworkMaster network, ItemStack stack, int size) { + ItemStack result = NetworkUtils.extractItem(network, stack, size); + + if (result == null && stack.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null)) { + FluidStack fluidStack = getFluidFromStack(stack, true); + + if (fluidStack != null && hasFluidBucket(fluidStack)) { + result = extractBucket(network); + + if (result != null) { + result.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null).fill(NetworkUtils.extractFluid(network, fluidStack, Fluid.BUCKET_VOLUME), true); + } else { + ICraftingPattern pattern = NetworkUtils.getPattern(network, EMPTY_BUCKET); + + if (pattern != null) { + network.addCraftingTask(network.createCraftingTask(pattern)); + } + } + } + } + + return result; + } + + public static ItemStack extractBucket(INetworkMaster network) { + return NetworkUtils.extractItem(network, EMPTY_BUCKET, 1); + } +} diff --git a/src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java b/src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java new file mode 100755 index 000000000..f143a562e --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java @@ -0,0 +1,119 @@ +package refinedstorage.apiimpl.storage.fluid; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.storage.fluid.IFluidStorage; +import refinedstorage.api.storage.fluid.IFluidStorageProvider; +import refinedstorage.api.storage.fluid.IGroupedFluidStorage; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class GroupedFluidStorage implements IGroupedFluidStorage { + private INetworkMaster network; + private List storages = new ArrayList<>(); + private Multimap stacks = ArrayListMultimap.create(); + + public GroupedFluidStorage(INetworkMaster network) { + this.network = network; + } + + @Override + public void rebuild() { + storages.clear(); + + network.getNodeGraph().all().stream() + .filter(node -> node.canUpdate() && node instanceof IFluidStorageProvider) + .forEach(node -> ((IFluidStorageProvider) node).addFluidStorages(storages)); + + stacks.clear(); + + for (IFluidStorage storage : storages) { + for (FluidStack stack : storage.getStacks()) { + add(stack, true); + } + } + + network.sendFluidStorageToClient(); + } + + @Override + public void add(@Nonnull FluidStack stack, boolean rebuilding) { + for (FluidStack otherStack : stacks.get(stack.getFluid())) { + if (otherStack.isFluidEqual(stack)) { + otherStack.amount += stack.amount; + + if (!rebuilding) { + network.sendFluidStorageDeltaToClient(stack, stack.amount); + } + + return; + } + } + + stacks.put(stack.getFluid(), stack.copy()); + + if (!rebuilding) { + network.sendFluidStorageDeltaToClient(stack, stack.amount); + } + } + + @Override + public void remove(@Nonnull FluidStack stack) { + for (FluidStack otherStack : stacks.get(stack.getFluid())) { + if (otherStack.isFluidEqual(stack)) { + otherStack.amount -= stack.amount; + + if (otherStack.amount == 0) { + stacks.remove(otherStack.getFluid(), otherStack); + } + + network.sendFluidStorageDeltaToClient(stack, -stack.amount); + + return; + } + } + } + + @Override + @Nullable + public FluidStack get(@Nonnull FluidStack stack, int flags) { + for (FluidStack otherStack : stacks.get(stack.getFluid())) { + if (CompareUtils.compareStack(otherStack, stack, flags)) { + return otherStack; + } + } + + return null; + } + + @Override + @Nullable + public FluidStack get(int hash) { + for (FluidStack stack : this.stacks.values()) { + if (NetworkUtils.getFluidStackHashCode(stack) == hash) { + return stack; + } + } + + return null; + } + + @Override + public Collection getStacks() { + return stacks.values(); + } + + @Override + public List getStorages() { + return storages; + } +} diff --git a/src/main/java/refinedstorage/apiimpl/storage/GroupedStorage.java b/src/main/java/refinedstorage/apiimpl/storage/item/GroupedItemStorage.java similarity index 55% rename from src/main/java/refinedstorage/apiimpl/storage/GroupedStorage.java rename to src/main/java/refinedstorage/apiimpl/storage/item/GroupedItemStorage.java index 21855ae17..8fc055d89 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/GroupedStorage.java +++ b/src/main/java/refinedstorage/apiimpl/storage/item/GroupedItemStorage.java @@ -1,27 +1,29 @@ -package refinedstorage.apiimpl.storage; +package refinedstorage.apiimpl.storage.item; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.network.INetworkMaster; -import refinedstorage.api.network.INetworkNode; -import refinedstorage.api.storage.IGroupedStorage; -import refinedstorage.api.storage.IStorage; -import refinedstorage.api.storage.IStorageProvider; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.storage.item.IGroupedItemStorage; +import refinedstorage.api.storage.item.IItemStorage; +import refinedstorage.api.storage.item.IItemStorageProvider; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.List; -public class GroupedStorage implements IGroupedStorage { +public class GroupedItemStorage implements IGroupedItemStorage { private INetworkMaster network; - private List storages = new ArrayList(); + private List storages = new ArrayList<>(); private Multimap stacks = ArrayListMultimap.create(); - public GroupedStorage(INetworkMaster network) { + public GroupedItemStorage(INetworkMaster network) { this.network = network; } @@ -29,15 +31,13 @@ public class GroupedStorage implements IGroupedStorage { public void rebuild() { storages.clear(); - for (INetworkNode node : network.getNodes()) { - if (node.canUpdate() && node instanceof IStorageProvider) { - ((IStorageProvider) node).addStorages(storages); - } - } + network.getNodeGraph().all().stream() + .filter(node -> node.canUpdate() && node instanceof IItemStorageProvider) + .forEach(node -> ((IItemStorageProvider) node).addItemStorages(storages)); stacks.clear(); - for (IStorage storage : storages) { + for (IItemStorage storage : storages) { for (ItemStack stack : storage.getItems()) { add(stack, true); } @@ -51,17 +51,17 @@ public class GroupedStorage implements IGroupedStorage { } } - network.sendStorageToClient(); + network.sendItemStorageToClient(); } @Override - public void add(ItemStack stack, boolean rebuilding) { + public void add(@Nonnull ItemStack stack, boolean rebuilding) { for (ItemStack otherStack : stacks.get(stack.getItem())) { - if (RefinedStorageUtils.compareStackNoQuantity(otherStack, stack)) { + if (CompareUtils.compareStackNoQuantity(otherStack, stack)) { otherStack.stackSize += stack.stackSize; if (!rebuilding) { - network.sendStorageDeltaToClient(stack, stack.stackSize); + network.sendItemStorageDeltaToClient(stack, stack.stackSize); } return; @@ -71,23 +71,23 @@ public class GroupedStorage implements IGroupedStorage { stacks.put(stack.getItem(), stack.copy()); if (!rebuilding) { - network.sendStorageDeltaToClient(stack, stack.stackSize); + network.sendItemStorageDeltaToClient(stack, stack.stackSize); } } @Override - public void remove(ItemStack stack) { + public void remove(@Nonnull ItemStack stack) { for (ItemStack otherStack : stacks.get(stack.getItem())) { - if (RefinedStorageUtils.compareStackNoQuantity(otherStack, stack)) { + if (CompareUtils.compareStackNoQuantity(otherStack, stack)) { otherStack.stackSize -= stack.stackSize; if (otherStack.stackSize == 0) { - if (!RefinedStorageUtils.hasPattern(network, stack)) { + if (!NetworkUtils.hasPattern(network, stack)) { stacks.remove(otherStack.getItem(), otherStack); } } - network.sendStorageDeltaToClient(stack, -stack.stackSize); + network.sendItemStorageDeltaToClient(stack, -stack.stackSize); return; } @@ -95,9 +95,10 @@ public class GroupedStorage implements IGroupedStorage { } @Override - public ItemStack get(ItemStack stack, int flags) { + @Nullable + public ItemStack get(@Nonnull ItemStack stack, int flags) { for (ItemStack otherStack : stacks.get(stack.getItem())) { - if (RefinedStorageUtils.compareStack(otherStack, stack, flags)) { + if (CompareUtils.compareStack(otherStack, stack, flags)) { return otherStack; } } @@ -106,9 +107,10 @@ public class GroupedStorage implements IGroupedStorage { } @Override - public ItemStack get(int id) { + @Nullable + public ItemStack get(int hash) { for (ItemStack stack : this.stacks.values()) { - if (RefinedStorageUtils.getItemStackHashCode(stack) == id) { + if (NetworkUtils.getItemStackHashCode(stack) == hash) { return stack; } } @@ -122,7 +124,7 @@ public class GroupedStorage implements IGroupedStorage { } @Override - public List getStorages() { + public List getStorages() { return storages; } } diff --git a/src/main/java/refinedstorage/apiimpl/storage/NBTStorage.java b/src/main/java/refinedstorage/apiimpl/storage/item/ItemStorageNBT.java similarity index 89% rename from src/main/java/refinedstorage/apiimpl/storage/NBTStorage.java rename to src/main/java/refinedstorage/apiimpl/storage/item/ItemStorageNBT.java index 8d85afe15..ab98cc810 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/NBTStorage.java +++ b/src/main/java/refinedstorage/apiimpl/storage/item/ItemStorageNBT.java @@ -1,4 +1,4 @@ -package refinedstorage.apiimpl.storage; +package refinedstorage.apiimpl.storage.item; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -6,19 +6,19 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.items.ItemHandlerHelper; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.api.storage.IStorage; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.storage.item.IItemStorage; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; /** - * A implementation of {@link IStorage} that stores storage items in NBT. + * A implementation of {@link IItemStorage} that stores storage items in NBT. */ -public abstract class NBTStorage implements IStorage { +public abstract class ItemStorageNBT implements IItemStorage { /** - * The current save protocol that is used. It's set to every {@link NBTStorage} to allow for + * The current save protocol that is used. It's set to every {@link ItemStorageNBT} to allow for * safe backwards compatibility breaks. */ private static final int PROTOCOL = 1; @@ -38,14 +38,14 @@ public abstract class NBTStorage implements IStorage { private int capacity; private TileEntity tile; - private List stacks = new ArrayList(); + private List stacks = new ArrayList<>(); /** - * @param tag The NBT tag we are reading from and writing the amount stored to, has to be initialized with {@link NBTStorage#createNBT()} if it doesn't exist yet + * @param tag The NBT tag we are reading from and writing the amount stored to, has to be initialized with {@link ItemStorageNBT#createNBT()} if it doesn't exist yet * @param capacity The capacity of this storage, -1 for infinite capacity * @param tile A {@link TileEntity} that the NBT storage is in, will be marked dirty when the storage changes */ - public NBTStorage(NBTTagCompound tag, int capacity, @Nullable TileEntity tile) { + public ItemStorageNBT(NBTTagCompound tag, int capacity, @Nullable TileEntity tile) { this.tag = tag; this.capacity = capacity; this.tile = tile; @@ -117,7 +117,7 @@ public abstract class NBTStorage implements IStorage { @Override public ItemStack insertItem(ItemStack stack, int size, boolean simulate) { for (ItemStack otherStack : stacks) { - if (RefinedStorageUtils.compareStackNoQuantity(otherStack, stack)) { + if (CompareUtils.compareStackNoQuantity(otherStack, stack)) { if (getCapacity() != -1 && getStored() + size > getCapacity()) { int remainingSpace = getCapacity() - getStored(); @@ -180,7 +180,7 @@ public abstract class NBTStorage implements IStorage { @Override public ItemStack extractItem(ItemStack stack, int size, int flags) { for (ItemStack otherStack : stacks) { - if (RefinedStorageUtils.compareStack(otherStack, stack, flags)) { + if (CompareUtils.compareStack(otherStack, stack, flags)) { if (size > otherStack.stackSize) { size = otherStack.stackSize; } @@ -243,8 +243,8 @@ public abstract class NBTStorage implements IStorage { } /** - * @param stack The {@link ItemStack} to populate with the NBT tags from {@link NBTStorage#createNBT()} - * @return The provided {@link ItemStack} with NBT tags from {@link NBTStorage#createNBT()} + * @param stack The {@link ItemStack} to populate with the NBT tags from {@link ItemStorageNBT#createNBT()} + * @return The provided {@link ItemStack} with NBT tags from {@link ItemStorageNBT#createNBT()} */ public static ItemStack createStackWithNBT(ItemStack stack) { stack.setTagCompound(createNBT()); diff --git a/src/main/java/refinedstorage/block/BlockBase.java b/src/main/java/refinedstorage/block/BlockBase.java index 33599093b..9def51704 100755 --- a/src/main/java/refinedstorage/block/BlockBase.java +++ b/src/main/java/refinedstorage/block/BlockBase.java @@ -17,12 +17,11 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandler; import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageUtils; import refinedstorage.item.ItemBlockBase; import refinedstorage.tile.TileBase; public abstract class BlockBase extends Block { - public static final PropertyDirection DIRECTION = PropertyDirection.create("direction"); + private static final PropertyDirection DIRECTION = PropertyDirection.create("direction"); private String name; @@ -91,7 +90,7 @@ public abstract class BlockBase extends Block { tile.setDirection(getPlacementType().getNext(tile.getDirection())); - RefinedStorageUtils.updateBlock(world, pos); + tile.updateBlock(); return true; } @@ -99,12 +98,23 @@ public abstract class BlockBase extends Block { return false; } + @Override + public IBlockState onBlockPlaced(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase entity) { + IBlockState state = super.onBlockPlaced(world, pos, facing, hitX, hitY, hitZ, meta, entity); + + if (getPlacementType() != null) { + return state.withProperty(DIRECTION, getPlacementType().getFrom(facing, pos, entity)); + } + + return state; + } + @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack stack) { super.onBlockPlacedBy(world, pos, state, player, stack); if (getPlacementType() != null) { - ((TileBase) world.getTileEntity(pos)).setDirection(getPlacementType().getFrom(pos, player)); + ((TileBase) world.getTileEntity(pos)).setDirection(state.getValue(DIRECTION)); } } @@ -112,8 +122,8 @@ public abstract class BlockBase extends Block { public void breakBlock(World world, BlockPos pos, IBlockState state) { TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileBase && ((TileBase) tile).getDroppedItems() != null) { - IItemHandler handler = ((TileBase) tile).getDroppedItems(); + if (tile instanceof TileBase && ((TileBase) tile).getDrops() != null) { + IItemHandler handler = ((TileBase) tile).getDrops(); for (int i = 0; i < handler.getSlots(); ++i) { if (handler.getStackInSlot(i) != null) { @@ -137,7 +147,7 @@ public abstract class BlockBase extends Block { world.setBlockToAir(pos); } - public EnumPlacementType getPlacementType() { + protected EnumPlacementType getPlacementType() { return EnumPlacementType.HORIZONTAL; } } diff --git a/src/main/java/refinedstorage/block/BlockCable.java b/src/main/java/refinedstorage/block/BlockCable.java index e301b8b24..0c11019d1 100755 --- a/src/main/java/refinedstorage/block/BlockCable.java +++ b/src/main/java/refinedstorage/block/BlockCable.java @@ -1,83 +1,226 @@ package refinedstorage.block; +import mcmultipart.block.BlockCoverable; +import mcmultipart.block.BlockMultipartContainer; +import mcmultipart.raytrace.RayTraceUtils; +import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.properties.PropertyDirection; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.items.IItemHandler; +import refinedstorage.RefinedStorage; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.INetworkNode; +import refinedstorage.api.network.NetworkUtils; import refinedstorage.tile.TileBase; import refinedstorage.tile.TileCable; +import refinedstorage.tile.TileMultipartNode; +import refinedstorage.tile.TileNode; -public class BlockCable extends BlockNode { - private static final AxisAlignedBB CABLE_AABB = new AxisAlignedBB(4 * (1F / 16F), 4 * (1F / 16F), 4 * (1F / 16F), 1 - 4 * (1F / 16F), 1 - 4 * (1F / 16F), 1 - 4 * (1F / 16F)); +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; - public static final PropertyBool NORTH = PropertyBool.create("north"); - public static final PropertyBool EAST = PropertyBool.create("east"); - public static final PropertyBool SOUTH = PropertyBool.create("south"); - public static final PropertyBool WEST = PropertyBool.create("west"); - public static final PropertyBool UP = PropertyBool.create("up"); - public static final PropertyBool DOWN = PropertyBool.create("down"); +public class BlockCable extends BlockCoverable { + protected static final PropertyDirection DIRECTION = PropertyDirection.create("direction"); + + protected static AxisAlignedBB createAABB(int fromX, int fromY, int fromZ, int toX, int toY, int toZ) { + return new AxisAlignedBB((float) fromX / 16F, (float) fromY / 16F, (float) fromZ / 16F, (float) toX / 16F, (float) toY / 16F, (float) toZ / 16F); + } + + protected static AxisAlignedBB CORE_AABB = createAABB(6, 6, 6, 10, 10, 10); + protected static AxisAlignedBB NORTH_AABB = createAABB(6, 6, 0, 10, 10, 6); + protected static AxisAlignedBB EAST_AABB = createAABB(10, 6, 6, 16, 10, 10); + protected static AxisAlignedBB SOUTH_AABB = createAABB(6, 6, 10, 10, 10, 16); + protected static AxisAlignedBB WEST_AABB = createAABB(0, 6, 6, 6, 10, 10); + protected static AxisAlignedBB UP_AABB = createAABB(6, 10, 6, 10, 16, 10); + protected static AxisAlignedBB DOWN_AABB = createAABB(6, 0, 6, 10, 6, 10); + + protected static final PropertyBool NORTH = PropertyBool.create("north"); + protected static final PropertyBool EAST = PropertyBool.create("east"); + protected static final PropertyBool SOUTH = PropertyBool.create("south"); + protected static final PropertyBool WEST = PropertyBool.create("west"); + protected static final PropertyBool UP = PropertyBool.create("up"); + protected static final PropertyBool DOWN = PropertyBool.create("down"); + + private String name; public BlockCable(String name) { - super(name); + super(Material.ROCK); + + this.name = name; setHardness(0.6F); + setRegistryName(RefinedStorage.ID, name); + setCreativeTab(RefinedStorage.INSTANCE.tab); } public BlockCable() { this("cable"); } + @Override + public String getUnlocalizedName() { + return "block." + RefinedStorage.ID + ":" + name; + } + + public String getName() { + return name; + } + + @Override + public boolean canProvidePower(IBlockState state) { + return false; + } + + @Override + public boolean hasTileEntity(IBlockState state) { + return true; + } + @Override public TileEntity createTileEntity(World world, IBlockState state) { return new TileCable(); } @Override - protected BlockStateContainer.Builder createBlockStateBuilder() { - return super.createBlockStateBuilder() - .add(NORTH) + protected BlockStateContainer createBlockState() { + BlockStateContainer.Builder builder = new BlockStateContainer.Builder(this); + + builder.add(NORTH) .add(EAST) .add(SOUTH) .add(WEST) .add(UP) - .add(DOWN); + .add(DOWN) + .add(BlockMultipartContainer.PROPERTY_MULTIPART_CONTAINER); + + if (getPlacementType() != null) { + builder.add(DIRECTION); + } + + return builder.build(); } @Override public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { - return super.getActualState(state, world, pos) - .withProperty(NORTH, hasConnectionWith(world, pos, pos.north())) - .withProperty(EAST, hasConnectionWith(world, pos, pos.east())) - .withProperty(SOUTH, hasConnectionWith(world, pos, pos.south())) - .withProperty(WEST, hasConnectionWith(world, pos, pos.west())) - .withProperty(UP, hasConnectionWith(world, pos, pos.up())) - .withProperty(DOWN, hasConnectionWith(world, pos, pos.down())); + state = super.getActualState(state, world, pos) + .withProperty(NORTH, hasConnectionWith(world, pos, EnumFacing.NORTH)) + .withProperty(EAST, hasConnectionWith(world, pos, EnumFacing.EAST)) + .withProperty(SOUTH, hasConnectionWith(world, pos, EnumFacing.SOUTH)) + .withProperty(WEST, hasConnectionWith(world, pos, EnumFacing.WEST)) + .withProperty(UP, hasConnectionWith(world, pos, EnumFacing.UP)) + .withProperty(DOWN, hasConnectionWith(world, pos, EnumFacing.DOWN)); + + if (getPlacementType() != null) { + state = state.withProperty(DIRECTION, ((TileNode) world.getTileEntity(pos)).getDirection()); + } + + return state; } - private boolean hasConnectionWith(IBlockAccess world, BlockPos basePos, BlockPos pos) { - TileEntity tile = world.getTileEntity(pos); + private boolean hasConnectionWith(IBlockAccess world, BlockPos pos, EnumFacing direction) { + TileEntity facing = world.getTileEntity(pos.offset(direction)); - if (tile instanceof INetworkMaster || tile instanceof INetworkNode) { - // Do not render a cable extension to on this position when we have a direction (like an exporter, importer or external storage) - if (getPlacementType() != null) { - return ((TileBase) world.getTileEntity(basePos)).getFacingTile() != tile; + if (facing instanceof INetworkMaster || facing instanceof INetworkNode) { + // Do not render a cable extension where our cable "head" is (e.g. importer, exporter, external storage heads). + if (getPlacementType() != null && ((TileMultipartNode) world.getTileEntity(pos)).getFacingTile() == facing) { + return false; } - return true; + return !TileMultipartNode.hasBlockingMicroblock(world, pos, direction) && !TileMultipartNode.hasBlockingMicroblock(world, pos.offset(direction), direction.getOpposite()); } return false; } + private boolean isInAABB(AxisAlignedBB aabb, float hitX, float hitY, float hitZ) { + return hitX >= aabb.minX && hitX <= aabb.maxX && hitY >= aabb.minY && hitY <= aabb.maxY && hitZ >= aabb.minZ && hitZ <= aabb.maxZ; + } + + protected boolean hitCablePart(IBlockState state, World world, BlockPos pos, float hitX, float hitY, float hitZ) { + state = getActualState(state, world, pos); + + return isInAABB(CORE_AABB, hitX, hitY, hitZ) || + (state.getValue(NORTH) && isInAABB(NORTH_AABB, hitX, hitY, hitZ)) || + (state.getValue(EAST) && isInAABB(EAST_AABB, hitX, hitY, hitZ)) || + (state.getValue(SOUTH) && isInAABB(SOUTH_AABB, hitX, hitY, hitZ)) || + (state.getValue(WEST) && isInAABB(WEST_AABB, hitX, hitY, hitZ)) || + (state.getValue(UP) && isInAABB(UP_AABB, hitX, hitY, hitZ)) || + (state.getValue(DOWN) && isInAABB(DOWN_AABB, hitX, hitY, hitZ)); + } + + public List getUnionizedCollisionBoxes(IBlockState state) { + List boxes = new ArrayList<>(); + + boxes.add(CORE_AABB); + + if (state.getValue(NORTH)) { + boxes.add(NORTH_AABB); + } + + if (state.getValue(EAST)) { + boxes.add(EAST_AABB); + } + + if (state.getValue(SOUTH)) { + boxes.add(SOUTH_AABB); + } + + if (state.getValue(WEST)) { + boxes.add(WEST_AABB); + } + + if (state.getValue(UP)) { + boxes.add(UP_AABB); + } + + if (state.getValue(DOWN)) { + boxes.add(DOWN_AABB); + } + + return boxes; + } + + public List getNonUnionizedCollisionBoxes(IBlockState state) { + return Collections.emptyList(); + } + + public List getCollisionBoxes(IBlockState state) { + List boxes = new ArrayList<>(); + + boxes.addAll(getUnionizedCollisionBoxes(state)); + boxes.addAll(getNonUnionizedCollisionBoxes(state)); + + return boxes; + } + @Override - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) { - return CABLE_AABB; + public void addCollisionBoxToListDefault(IBlockState state, World world, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, Entity entityIn) { + for (AxisAlignedBB aabb : getCollisionBoxes(this.getActualState(state, world, pos))) { + addCollisionBoxToList(pos, entityBox, collidingBoxes, aabb); + } + } + + @Override + public RayTraceResult collisionRayTraceDefault(IBlockState state, World world, BlockPos pos, Vec3d start, Vec3d end) { + RayTraceUtils.AdvancedRayTraceResult result = RayTraceUtils.collisionRayTrace(world, pos, start, end, getCollisionBoxes(this.getActualState(state, world, pos))); + + return result != null ? result.hit : null; } @Override @@ -90,8 +233,113 @@ public class BlockCable extends BlockNode { return false; } - @Override - public EnumPlacementType getPlacementType() { + protected EnumPlacementType getPlacementType() { return null; } + + @Override + public IBlockState onBlockPlaced(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase entity) { + IBlockState state = super.onBlockPlaced(world, pos, facing, hitX, hitY, hitZ, meta, entity); + + if (getPlacementType() != null) { + return state.withProperty(DIRECTION, getPlacementType().getFrom(facing, pos, entity)); + } + + return state; + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack stack) { + super.onBlockPlacedBy(world, pos, state, player, stack); + + if (getPlacementType() != null) { + ((TileBase) world.getTileEntity(pos)).setDirection(state.getValue(DIRECTION)); + } + + attemptConnect(world, pos); + } + + public void attemptConnect(World world, BlockPos pos) { + if (!world.isRemote) { + for (EnumFacing facing : EnumFacing.VALUES) { + TileEntity tile = world.getTileEntity(pos.offset(facing)); + + if (tile instanceof TileNode && ((TileNode) tile).isConnected()) { + NetworkUtils.rebuildGraph(((TileNode) tile).getNetwork()); + + break; + } + } + } + } + + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) { + INetworkMaster network = null; + + if (!world.isRemote) { + TileEntity tile = world.getTileEntity(pos); + + if (tile instanceof TileNode) { + network = ((TileNode) tile).getNetwork(); + } + + if (tile instanceof TileBase && ((TileBase) tile).getDrops() != null) { + IItemHandler handler = ((TileBase) tile).getDrops(); + + for (int i = 0; i < handler.getSlots(); ++i) { + if (handler.getStackInSlot(i) != null) { + InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), handler.getStackInSlot(i)); + } + } + } + } + + super.breakBlock(world, pos, state); + + if (network != null) { + NetworkUtils.rebuildGraph(network); + } + } + + @Override + public List getDropsDefault(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) { + List drops = new ArrayList<>(); + + drops.add(new ItemStack(this, 1, getMetaFromState(state))); + + TileEntity tile = world.getTileEntity(pos); + + if (tile instanceof TileBase && ((TileBase) tile).getDrops() != null) { + IItemHandler handler = ((TileBase) tile).getDrops(); + + for (int i = 0; i < handler.getSlots(); ++i) { + if (handler.getStackInSlot(i) != null) { + drops.add(handler.getStackInSlot(i)); + } + } + } + + return drops; + } + + @Override + public boolean rotateBlock(World world, BlockPos pos, EnumFacing axis) { + if (!world.isRemote && getPlacementType() != null) { + TileBase tile = (TileBase) world.getTileEntity(pos); + + tile.setDirection(getPlacementType().getNext(tile.getDirection())); + + tile.updateBlock(); + + return true; + } + + return false; + } + + @Override + public BlockRenderLayer getBlockLayer() { + return RefinedStorage.INSTANCE.translucentCables ? BlockRenderLayer.TRANSLUCENT : super.getBlockLayer(); + } } diff --git a/src/main/java/refinedstorage/block/BlockConstructor.java b/src/main/java/refinedstorage/block/BlockConstructor.java index d5a879d85..35e6476d7 100755 --- a/src/main/java/refinedstorage/block/BlockConstructor.java +++ b/src/main/java/refinedstorage/block/BlockConstructor.java @@ -6,15 +6,71 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageGui; import refinedstorage.tile.TileConstructor; +import java.util.ArrayList; +import java.util.List; + public class BlockConstructor extends BlockCable { + public static final AxisAlignedBB HOLDER_NORTH_AABB = createAABB(7, 7, 2, 9, 9, 6); + public static final AxisAlignedBB HOLDER_EAST_AABB = createAABB(10, 7, 7, 14, 9, 9); + public static final AxisAlignedBB HOLDER_SOUTH_AABB = createAABB(7, 7, 10, 9, 9, 14); + public static final AxisAlignedBB HOLDER_WEST_AABB = createAABB(2, 7, 7, 6, 9, 9); + public static final AxisAlignedBB HOLDER_UP_AABB = createAABB(7, 10, 7, 9, 14, 9); + public static final AxisAlignedBB HOLDER_DOWN_AABB = createAABB(7, 2, 7, 9, 6, 9); + + public static final AxisAlignedBB HEAD_NORTH_AABB = createAABB(0, 0, 0, 16, 16, 2); + public static final AxisAlignedBB HEAD_EAST_AABB = createAABB(14, 0, 0, 16, 16, 16); + public static final AxisAlignedBB HEAD_SOUTH_AABB = createAABB(0, 0, 14, 16, 16, 16); + public static final AxisAlignedBB HEAD_WEST_AABB = createAABB(0, 0, 0, 2, 16, 16); + public static final AxisAlignedBB HEAD_DOWN_AABB = createAABB(0, 0, 0, 16, 2, 16); + public static final AxisAlignedBB HEAD_UP_AABB = createAABB(0, 14, 0, 16, 16, 16); + + public BlockConstructor(String name) { + super(name); + } + public BlockConstructor() { - super("constructor"); + this("constructor"); + } + + @Override + public List getNonUnionizedCollisionBoxes(IBlockState state) { + List boxes = new ArrayList<>(); + + switch (state.getValue(DIRECTION)) { + case NORTH: + boxes.add(HOLDER_NORTH_AABB); + boxes.add(HEAD_NORTH_AABB); + break; + case EAST: + boxes.add(HOLDER_EAST_AABB); + boxes.add(HEAD_EAST_AABB); + break; + case SOUTH: + boxes.add(HOLDER_SOUTH_AABB); + boxes.add(HEAD_SOUTH_AABB); + break; + case WEST: + boxes.add(HOLDER_WEST_AABB); + boxes.add(HEAD_WEST_AABB); + break; + case UP: + boxes.add(HOLDER_UP_AABB); + boxes.add(HEAD_UP_AABB); + break; + case DOWN: + boxes.add(HOLDER_DOWN_AABB); + boxes.add(HEAD_DOWN_AABB); + break; + } + + return boxes; } @Override @@ -23,7 +79,11 @@ public class BlockConstructor extends BlockCable { } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + public boolean onBlockActivatedDefault(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (hitCablePart(state, world, pos, hitX, hitY, hitZ)) { + return false; + } + if (!world.isRemote) { player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.CONSTRUCTOR, world, pos.getX(), pos.getY(), pos.getZ()); } diff --git a/src/main/java/refinedstorage/block/BlockController.java b/src/main/java/refinedstorage/block/BlockController.java index 8b0fad77c..ec991271c 100755 --- a/src/main/java/refinedstorage/block/BlockController.java +++ b/src/main/java/refinedstorage/block/BlockController.java @@ -20,22 +20,24 @@ import net.minecraft.world.World; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageGui; +import refinedstorage.api.network.NetworkUtils; import refinedstorage.item.ItemBlockController; -import refinedstorage.tile.controller.TileController; +import refinedstorage.tile.TileController; import java.util.ArrayList; import java.util.List; public class BlockController extends BlockBase { public static final PropertyEnum TYPE = PropertyEnum.create("type", EnumControllerType.class); - public static final PropertyInteger ENERGY = PropertyInteger.create("energy", 0, 7); + + private static final PropertyInteger ENERGY = PropertyInteger.create("energy", 0, 7); public BlockController() { super("controller"); } @Override - public void getSubBlocks(Item item, CreativeTabs tab, List subItems) { + public void getSubBlocks(Item item, CreativeTabs tab, List subItems) { for (int i = 0; i <= 1; i++) { subItems.add(ItemBlockController.createStackWithNBT(new ItemStack(item, 1, i))); } @@ -104,7 +106,7 @@ public class BlockController extends BlockBase { @Override public void breakBlock(World world, BlockPos pos, IBlockState state) { if (!world.isRemote) { - ((TileController) world.getTileEntity(pos)).disconnectAll(); + ((TileController) world.getTileEntity(pos)).getNodeGraph().disconnectAll(); } super.breakBlock(world, pos, state); @@ -115,13 +117,13 @@ public class BlockController extends BlockBase { super.neighborChanged(state, world, pos, block); if (!world.isRemote) { - ((TileController) world.getTileEntity(pos)).rebuildNodes(); + NetworkUtils.rebuildGraph((TileController) world.getTileEntity(pos)); } } @Override public List getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) { - List drops = new ArrayList(); + List drops = new ArrayList<>(); ItemStack stack = new ItemStack(RefinedStorageBlocks.CONTROLLER, 1, RefinedStorageBlocks.CONTROLLER.getMetaFromState(state)); diff --git a/src/main/java/refinedstorage/block/BlockCrafter.java b/src/main/java/refinedstorage/block/BlockCrafter.java index ad95c3552..23f33586a 100755 --- a/src/main/java/refinedstorage/block/BlockCrafter.java +++ b/src/main/java/refinedstorage/block/BlockCrafter.java @@ -33,7 +33,7 @@ public class BlockCrafter extends BlockNode { @Override public EnumPlacementType getPlacementType() { - return EnumPlacementType.ANY; + return EnumPlacementType.ANY_FACE_PLAYER; } public boolean hasConnectivityState() { diff --git a/src/main/java/refinedstorage/block/BlockDestructor.java b/src/main/java/refinedstorage/block/BlockDestructor.java index 77f81f85c..306b31418 100755 --- a/src/main/java/refinedstorage/block/BlockDestructor.java +++ b/src/main/java/refinedstorage/block/BlockDestructor.java @@ -6,15 +6,23 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import refinedstorage.RefinedStorage; +import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageGui; import refinedstorage.tile.TileDestructor; +import java.util.List; + public class BlockDestructor extends BlockCable { + public BlockDestructor(String name) { + super(name); + } + public BlockDestructor() { - super("destructor"); + this("destructor"); } @Override @@ -23,7 +31,16 @@ public class BlockDestructor extends BlockCable { } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + public List getNonUnionizedCollisionBoxes(IBlockState state) { + return RefinedStorageBlocks.CONSTRUCTOR.getNonUnionizedCollisionBoxes(state); + } + + @Override + public boolean onBlockActivatedDefault(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (hitCablePart(state, world, pos, hitX, hitY, hitZ)) { + return false; + } + if (!world.isRemote) { player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.DESTRUCTOR, world, pos.getX(), pos.getY(), pos.getZ()); } diff --git a/src/main/java/refinedstorage/block/BlockDetector.java b/src/main/java/refinedstorage/block/BlockDetector.java index c29c2f6e4..2b40487d9 100755 --- a/src/main/java/refinedstorage/block/BlockDetector.java +++ b/src/main/java/refinedstorage/block/BlockDetector.java @@ -18,9 +18,9 @@ import refinedstorage.RefinedStorageGui; import refinedstorage.tile.TileDetector; public class BlockDetector extends BlockNode { - public static final AxisAlignedBB AABB_DETECTOR = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 4D / 16D, 1.0D); + private static final AxisAlignedBB AABB_DETECTOR = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 4D / 16D, 1.0D); - public static final PropertyBool POWERED = PropertyBool.create("powered"); + private static final PropertyBool POWERED = PropertyBool.create("powered"); public BlockDetector() { super("detector"); diff --git a/src/main/java/refinedstorage/block/BlockDiskDrive.java b/src/main/java/refinedstorage/block/BlockDiskDrive.java index 3399c96ea..35aa8c510 100755 --- a/src/main/java/refinedstorage/block/BlockDiskDrive.java +++ b/src/main/java/refinedstorage/block/BlockDiskDrive.java @@ -16,7 +16,7 @@ import refinedstorage.RefinedStorageGui; import refinedstorage.tile.TileDiskDrive; public class BlockDiskDrive extends BlockNode { - public static final PropertyInteger STORED = PropertyInteger.create("stored", 0, 7); + private static final PropertyInteger STORED = PropertyInteger.create("stored", 0, 7); public BlockDiskDrive() { super("disk_drive"); @@ -37,7 +37,7 @@ public class BlockDiskDrive extends BlockNode { @Override public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { return super.getActualState(state, world, pos) - .withProperty(STORED, ((TileDiskDrive) world.getTileEntity(pos)).getStoredForScaledDisplay()); + .withProperty(STORED, Math.max(0, ((TileDiskDrive) world.getTileEntity(pos)).getStoredForDisplay())); } @Override diff --git a/src/main/java/refinedstorage/block/BlockExporter.java b/src/main/java/refinedstorage/block/BlockExporter.java index 3b54455db..b78aaef9f 100755 --- a/src/main/java/refinedstorage/block/BlockExporter.java +++ b/src/main/java/refinedstorage/block/BlockExporter.java @@ -6,24 +6,91 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageGui; import refinedstorage.tile.TileExporter; +import java.util.ArrayList; +import java.util.List; + public class BlockExporter extends BlockCable { + public static final AxisAlignedBB LINE_NORTH_1_AABB = createAABB(6, 6, 0, 10, 10, 2); + public static final AxisAlignedBB LINE_NORTH_2_AABB = createAABB(5, 5, 2, 11, 11, 4); + public static final AxisAlignedBB LINE_NORTH_3_AABB = createAABB(3, 3, 4, 13, 13, 6); + public static final AxisAlignedBB LINE_EAST_1_AABB = createAABB(14, 6, 6, 16, 10, 10); + public static final AxisAlignedBB LINE_EAST_2_AABB = createAABB(12, 5, 5, 14, 11, 11); + public static final AxisAlignedBB LINE_EAST_3_AABB = createAABB(10, 3, 3, 12, 13, 13); + public static final AxisAlignedBB LINE_SOUTH_1_AABB = createAABB(6, 6, 14, 10, 10, 16); + public static final AxisAlignedBB LINE_SOUTH_2_AABB = createAABB(5, 5, 12, 11, 11, 14); + public static final AxisAlignedBB LINE_SOUTH_3_AABB = createAABB(3, 3, 10, 13, 13, 12); + public static final AxisAlignedBB LINE_WEST_1_AABB = createAABB(0, 6, 6, 2, 10, 10); + public static final AxisAlignedBB LINE_WEST_2_AABB = createAABB(2, 5, 5, 4, 11, 11); + public static final AxisAlignedBB LINE_WEST_3_AABB = createAABB(4, 3, 3, 6, 13, 13); + public static final AxisAlignedBB LINE_UP_1_AABB = createAABB(6, 14, 6, 10, 16, 10); + public static final AxisAlignedBB LINE_UP_2_AABB = createAABB(5, 12, 5, 11, 14, 11); + public static final AxisAlignedBB LINE_UP_3_AABB = createAABB(3, 10, 3, 13, 12, 13); + public static final AxisAlignedBB LINE_DOWN_1_AABB = createAABB(6, 0, 6, 10, 2, 10); + public static final AxisAlignedBB LINE_DOWN_2_AABB = createAABB(5, 2, 5, 11, 4, 11); + public static final AxisAlignedBB LINE_DOWN_3_AABB = createAABB(3, 4, 3, 13, 6, 13); + public BlockExporter() { super("exporter"); } + @Override + public List getNonUnionizedCollisionBoxes(IBlockState state) { + List boxes = new ArrayList<>(); + + switch (state.getValue(DIRECTION)) { + case NORTH: + boxes.add(LINE_NORTH_1_AABB); + boxes.add(LINE_NORTH_2_AABB); + boxes.add(LINE_NORTH_3_AABB); + break; + case EAST: + boxes.add(LINE_EAST_1_AABB); + boxes.add(LINE_EAST_2_AABB); + boxes.add(LINE_EAST_3_AABB); + break; + case SOUTH: + boxes.add(LINE_SOUTH_1_AABB); + boxes.add(LINE_SOUTH_2_AABB); + boxes.add(LINE_SOUTH_3_AABB); + break; + case WEST: + boxes.add(LINE_WEST_1_AABB); + boxes.add(LINE_WEST_2_AABB); + boxes.add(LINE_WEST_3_AABB); + break; + case UP: + boxes.add(LINE_UP_1_AABB); + boxes.add(LINE_UP_2_AABB); + boxes.add(LINE_UP_3_AABB); + break; + case DOWN: + boxes.add(LINE_DOWN_1_AABB); + boxes.add(LINE_DOWN_2_AABB); + boxes.add(LINE_DOWN_3_AABB); + break; + } + + return boxes; + } + @Override public TileEntity createTileEntity(World world, IBlockState state) { return new TileExporter(); } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + public boolean onBlockActivatedDefault(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (hitCablePart(state, world, pos, hitX, hitY, hitZ)) { + return false; + } + if (!world.isRemote) { player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.EXPORTER, world, pos.getX(), pos.getY(), pos.getZ()); } diff --git a/src/main/java/refinedstorage/block/BlockExternalStorage.java b/src/main/java/refinedstorage/block/BlockExternalStorage.java index 54ad9a34e..a41a50c27 100755 --- a/src/main/java/refinedstorage/block/BlockExternalStorage.java +++ b/src/main/java/refinedstorage/block/BlockExternalStorage.java @@ -7,34 +7,83 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageGui; import refinedstorage.tile.externalstorage.TileExternalStorage; +import java.util.ArrayList; +import java.util.List; + public class BlockExternalStorage extends BlockCable { + public static final AxisAlignedBB HEAD_NORTH_AABB = createAABB(3, 3, 0, 13, 13, 2); + public static final AxisAlignedBB HEAD_EAST_AABB = createAABB(14, 3, 3, 16, 13, 13); + public static final AxisAlignedBB HEAD_SOUTH_AABB = createAABB(3, 3, 14, 13, 13, 16); + public static final AxisAlignedBB HEAD_WEST_AABB = createAABB(0, 3, 3, 2, 13, 13); + public static final AxisAlignedBB HEAD_UP_AABB = createAABB(3, 14, 3, 13, 16, 13); + public static final AxisAlignedBB HEAD_DOWN_AABB = createAABB(3, 0, 3, 13, 2, 13); + public BlockExternalStorage() { super("external_storage"); } + @Override + public List getNonUnionizedCollisionBoxes(IBlockState state) { + List boxes = new ArrayList<>(); + + switch (state.getValue(DIRECTION)) { + case NORTH: + boxes.add(BlockConstructor.HOLDER_NORTH_AABB); + boxes.add(HEAD_NORTH_AABB); + break; + case EAST: + boxes.add(BlockConstructor.HOLDER_EAST_AABB); + boxes.add(HEAD_EAST_AABB); + break; + case SOUTH: + boxes.add(BlockConstructor.HOLDER_SOUTH_AABB); + boxes.add(HEAD_SOUTH_AABB); + break; + case WEST: + boxes.add(BlockConstructor.HOLDER_WEST_AABB); + boxes.add(HEAD_WEST_AABB); + break; + case UP: + boxes.add(BlockConstructor.HOLDER_UP_AABB); + boxes.add(HEAD_UP_AABB); + break; + case DOWN: + boxes.add(BlockConstructor.HOLDER_DOWN_AABB); + boxes.add(HEAD_DOWN_AABB); + break; + } + + return boxes; + } + @Override public TileEntity createTileEntity(World world, IBlockState state) { return new TileExternalStorage(); } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + public boolean onBlockActivatedDefault(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (hitCablePart(state, world, pos, hitX, hitY, hitZ)) { + return false; + } + if (!world.isRemote) { - player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.STORAGE, world, pos.getX(), pos.getY(), pos.getZ()); + player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.EXTERNAL_STORAGE, world, pos.getX(), pos.getY(), pos.getZ()); } return true; } @Override - public void neighborChanged(IBlockState state, World world, BlockPos pos, Block block) { - super.neighborChanged(state, world, pos, block); + public void onNeighborBlockChangeDefault(World world, BlockPos pos, IBlockState state, Block neighborBlock) { + super.onNeighborBlockChangeDefault(world, pos, state, neighborBlock); if (!world.isRemote) { TileExternalStorage externalStorage = (TileExternalStorage) world.getTileEntity(pos); diff --git a/src/main/java/refinedstorage/block/BlockFluidInterface.java b/src/main/java/refinedstorage/block/BlockFluidInterface.java new file mode 100755 index 000000000..e7be93f32 --- /dev/null +++ b/src/main/java/refinedstorage/block/BlockFluidInterface.java @@ -0,0 +1,43 @@ +package refinedstorage.block; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import refinedstorage.RefinedStorage; +import refinedstorage.RefinedStorageGui; +import refinedstorage.tile.TileFluidInterface; + +public class BlockFluidInterface extends BlockNode { + public BlockFluidInterface() { + super("fluid_interface"); + } + + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileFluidInterface(); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (!world.isRemote) { + player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.FLUID_INTERFACE, world, pos.getX(), pos.getY(), pos.getZ()); + } + + return true; + } + + @Override + public boolean hasConnectivityState() { + return true; + } + + @Override + public EnumPlacementType getPlacementType() { + return null; + } +} diff --git a/src/main/java/refinedstorage/block/BlockFluidStorage.java b/src/main/java/refinedstorage/block/BlockFluidStorage.java new file mode 100755 index 000000000..774c57818 --- /dev/null +++ b/src/main/java/refinedstorage/block/BlockFluidStorage.java @@ -0,0 +1,114 @@ +package refinedstorage.block; + +import net.minecraft.block.properties.PropertyEnum; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import refinedstorage.RefinedStorage; +import refinedstorage.RefinedStorageBlocks; +import refinedstorage.RefinedStorageGui; +import refinedstorage.item.ItemBlockFluidStorage; +import refinedstorage.tile.TileFluidStorage; + +import java.util.ArrayList; +import java.util.List; + +public class BlockFluidStorage extends BlockNode { + public static final PropertyEnum TYPE = PropertyEnum.create("type", EnumFluidStorageType.class); + + public BlockFluidStorage() { + super("fluid_storage"); + + setHardness(5.8F); + } + + @Override + public void getSubBlocks(Item item, CreativeTabs tab, List subItems) { + for (int i = 0; i <= 4; ++i) { + subItems.add(ItemBlockFluidStorage.initNBT(new ItemStack(item, 1, i))); + } + } + + @Override + protected BlockStateContainer createBlockState() { + return createBlockStateBuilder() + .add(TYPE) + .build(); + } + + @Override + public IBlockState getStateFromMeta(int meta) { + return getDefaultState().withProperty(TYPE, EnumFluidStorageType.getById(meta)); + } + + @Override + public int getMetaFromState(IBlockState state) { + return ((EnumFluidStorageType) state.getValue(TYPE)).getId(); + } + + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileFluidStorage(); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (!world.isRemote) { + player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.FLUID_STORAGE, world, pos.getX(), pos.getY(), pos.getZ()); + } + + return true; + } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack stack) { + super.onBlockPlacedBy(world, pos, state, player, stack); + + if (!world.isRemote && stack.hasTagCompound() && stack.getTagCompound().hasKey(TileFluidStorage.NBT_STORAGE)) { + ((TileFluidStorage) world.getTileEntity(pos)).setStorageTag(stack.getTagCompound().getCompoundTag(TileFluidStorage.NBT_STORAGE)); + } + } + + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) { + ((TileFluidStorage) world.getTileEntity(pos)).onBreak(); + + super.breakBlock(world, pos, state); + } + + @Override + public List getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) { + TileFluidStorage storage = (TileFluidStorage) world.getTileEntity(pos); + + List drops = new ArrayList<>(); + + ItemStack stack = new ItemStack(RefinedStorageBlocks.FLUID_STORAGE, 1, getMetaFromState(state)); + stack.setTagCompound(new NBTTagCompound()); + stack.getTagCompound().setTag(TileFluidStorage.NBT_STORAGE, storage.getStorageTag()); + + drops.add(stack); + + return drops; + } + + @Override + public Item createItem() { + return new ItemBlockFluidStorage(); + } + + @Override + public EnumPlacementType getPlacementType() { + return null; + } +} diff --git a/src/main/java/refinedstorage/block/BlockGrid.java b/src/main/java/refinedstorage/block/BlockGrid.java index e653dd5b6..7360a1124 100755 --- a/src/main/java/refinedstorage/block/BlockGrid.java +++ b/src/main/java/refinedstorage/block/BlockGrid.java @@ -32,8 +32,8 @@ public class BlockGrid extends BlockNode { } @Override - public void getSubBlocks(Item item, CreativeTabs tab, List subItems) { - for (int i = 0; i <= 2; i++) { + public void getSubBlocks(Item item, CreativeTabs tab, List subItems) { + for (int i = 0; i <= 3; i++) { subItems.add(new ItemStack(item, 1, i)); } } @@ -47,12 +47,12 @@ public class BlockGrid extends BlockNode { @Override public IBlockState getStateFromMeta(int meta) { - return getDefaultState().withProperty(TYPE, meta == 0 ? EnumGridType.NORMAL : (meta == 1 ? EnumGridType.CRAFTING : EnumGridType.PATTERN)); + return getDefaultState().withProperty(TYPE, meta == 0 ? EnumGridType.NORMAL : (meta == 1 ? EnumGridType.CRAFTING : (meta == 2 ? EnumGridType.PATTERN : EnumGridType.FLUID))); } @Override public int getMetaFromState(IBlockState state) { - return state.getValue(TYPE) == EnumGridType.NORMAL ? 0 : (state.getValue(TYPE) == EnumGridType.CRAFTING ? 1 : 2); + return state.getValue(TYPE) == EnumGridType.NORMAL ? 0 : (state.getValue(TYPE) == EnumGridType.CRAFTING ? 1 : (state.getValue(TYPE) == EnumGridType.PATTERN ? 2 : 3)); } @Override diff --git a/src/main/java/refinedstorage/block/BlockImporter.java b/src/main/java/refinedstorage/block/BlockImporter.java index cae887e19..1e574576e 100755 --- a/src/main/java/refinedstorage/block/BlockImporter.java +++ b/src/main/java/refinedstorage/block/BlockImporter.java @@ -6,15 +6,82 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageGui; import refinedstorage.tile.TileImporter; +import java.util.ArrayList; +import java.util.List; + public class BlockImporter extends BlockCable { + public static final AxisAlignedBB LINE_NORTH_1_AABB = createAABB(6, 6, 4, 10, 10, 6); + public static final AxisAlignedBB LINE_NORTH_2_AABB = createAABB(5, 5, 2, 11, 11, 4); + public static final AxisAlignedBB LINE_NORTH_3_AABB = createAABB(3, 3, 0, 13, 13, 2); + public static final AxisAlignedBB LINE_EAST_1_AABB = createAABB(10, 6, 6, 12, 10, 10); + public static final AxisAlignedBB LINE_EAST_2_AABB = createAABB(12, 5, 5, 14, 11, 11); + public static final AxisAlignedBB LINE_EAST_3_AABB = createAABB(14, 3, 3, 16, 13, 13); + public static final AxisAlignedBB LINE_SOUTH_1_AABB = createAABB(6, 6, 10, 10, 10, 12); + public static final AxisAlignedBB LINE_SOUTH_2_AABB = createAABB(5, 5, 12, 11, 11, 14); + public static final AxisAlignedBB LINE_SOUTH_3_AABB = createAABB(3, 3, 14, 13, 13, 16); + public static final AxisAlignedBB LINE_WEST_1_AABB = createAABB(4, 6, 6, 6, 10, 10); + public static final AxisAlignedBB LINE_WEST_2_AABB = createAABB(2, 5, 5, 4, 11, 11); + public static final AxisAlignedBB LINE_WEST_3_AABB = createAABB(0, 3, 3, 2, 13, 13); + public static final AxisAlignedBB LINE_UP_1_AABB = createAABB(6, 10, 6, 10, 12, 10); + public static final AxisAlignedBB LINE_UP_2_AABB = createAABB(5, 12, 5, 11, 14, 11); + public static final AxisAlignedBB LINE_UP_3_AABB = createAABB(3, 14, 3, 13, 16, 13); + public static final AxisAlignedBB LINE_DOWN_1_AABB = createAABB(6, 4, 6, 10, 6, 10); + public static final AxisAlignedBB LINE_DOWN_2_AABB = createAABB(5, 2, 5, 11, 4, 11); + public static final AxisAlignedBB LINE_DOWN_3_AABB = createAABB(3, 0, 3, 13, 2, 13); + + public BlockImporter(String name) { + super(name); + } + public BlockImporter() { - super("importer"); + this("importer"); + } + + @Override + public List getNonUnionizedCollisionBoxes(IBlockState state) { + List boxes = new ArrayList<>(); + + switch (state.getValue(DIRECTION)) { + case NORTH: + boxes.add(LINE_NORTH_1_AABB); + boxes.add(LINE_NORTH_2_AABB); + boxes.add(LINE_NORTH_3_AABB); + break; + case EAST: + boxes.add(LINE_EAST_1_AABB); + boxes.add(LINE_EAST_2_AABB); + boxes.add(LINE_EAST_3_AABB); + break; + case SOUTH: + boxes.add(LINE_SOUTH_1_AABB); + boxes.add(LINE_SOUTH_2_AABB); + boxes.add(LINE_SOUTH_3_AABB); + break; + case WEST: + boxes.add(LINE_WEST_1_AABB); + boxes.add(LINE_WEST_2_AABB); + boxes.add(LINE_WEST_3_AABB); + break; + case UP: + boxes.add(LINE_UP_1_AABB); + boxes.add(LINE_UP_2_AABB); + boxes.add(LINE_UP_3_AABB); + break; + case DOWN: + boxes.add(LINE_DOWN_1_AABB); + boxes.add(LINE_DOWN_2_AABB); + boxes.add(LINE_DOWN_3_AABB); + break; + } + + return boxes; } @Override @@ -23,7 +90,11 @@ public class BlockImporter extends BlockCable { } @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + public boolean onBlockActivatedDefault(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (hitCablePart(state, world, pos, hitX, hitY, hitZ)) { + return false; + } + if (!world.isRemote) { player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.IMPORTER, world, pos.getX(), pos.getY(), pos.getZ()); } diff --git a/src/main/java/refinedstorage/block/BlockNetworkReceiver.java b/src/main/java/refinedstorage/block/BlockNetworkReceiver.java new file mode 100755 index 000000000..64b17b618 --- /dev/null +++ b/src/main/java/refinedstorage/block/BlockNetworkReceiver.java @@ -0,0 +1,27 @@ +package refinedstorage.block; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import refinedstorage.tile.TileNetworkReceiver; + +public class BlockNetworkReceiver extends BlockNode { + public BlockNetworkReceiver() { + super("network_receiver"); + } + + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileNetworkReceiver(); + } + + @Override + public EnumPlacementType getPlacementType() { + return null; + } + + @Override + public boolean hasConnectivityState() { + return true; + } +} diff --git a/src/main/java/refinedstorage/block/BlockNetworkTransmitter.java b/src/main/java/refinedstorage/block/BlockNetworkTransmitter.java new file mode 100755 index 000000000..75b6512b3 --- /dev/null +++ b/src/main/java/refinedstorage/block/BlockNetworkTransmitter.java @@ -0,0 +1,43 @@ +package refinedstorage.block; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import refinedstorage.RefinedStorage; +import refinedstorage.RefinedStorageGui; +import refinedstorage.tile.TileNetworkTransmitter; + +public class BlockNetworkTransmitter extends BlockNode { + public BlockNetworkTransmitter() { + super("network_transmitter"); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (!world.isRemote) { + player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.NETWORK_TRANSMITTER, world, pos.getX(), pos.getY(), pos.getZ()); + } + + return true; + } + + @Override + public TileEntity createTileEntity(World world, IBlockState state) { + return new TileNetworkTransmitter(); + } + + @Override + public EnumPlacementType getPlacementType() { + return null; + } + + @Override + public boolean hasConnectivityState() { + return true; + } +} diff --git a/src/main/java/refinedstorage/block/BlockNode.java b/src/main/java/refinedstorage/block/BlockNode.java index 86e274f97..896f2cb65 100755 --- a/src/main/java/refinedstorage/block/BlockNode.java +++ b/src/main/java/refinedstorage/block/BlockNode.java @@ -11,10 +11,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; import refinedstorage.tile.TileNode; public abstract class BlockNode extends BlockBase { - public static final PropertyBool CONNECTED = PropertyBool.create("connected"); + private static final PropertyBool CONNECTED = PropertyBool.create("connected"); public BlockNode(String name) { super(name); @@ -63,7 +64,7 @@ public abstract class BlockNode extends BlockBase { TileEntity tile = world.getTileEntity(pos.offset(facing)); if (tile instanceof TileNode && ((TileNode) tile).isConnected()) { - ((TileNode) tile).getNetwork().rebuildNodes(); + NetworkUtils.rebuildGraph(((TileNode) tile).getNetwork()); break; } @@ -86,7 +87,7 @@ public abstract class BlockNode extends BlockBase { super.breakBlock(world, pos, state); if (network != null) { - network.rebuildNodes(); + NetworkUtils.rebuildGraph(network); } } } diff --git a/src/main/java/refinedstorage/block/BlockSolderer.java b/src/main/java/refinedstorage/block/BlockSolderer.java index b3f81f07a..a1508e167 100755 --- a/src/main/java/refinedstorage/block/BlockSolderer.java +++ b/src/main/java/refinedstorage/block/BlockSolderer.java @@ -17,9 +17,9 @@ import refinedstorage.RefinedStorageGui; import refinedstorage.tile.TileSolderer; public class BlockSolderer extends BlockNode { - public static final AxisAlignedBB AABB_SOLDERER = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 14D / 16D, 1.0D); + private static final AxisAlignedBB AABB_SOLDERER = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 14D / 16D, 1.0D); - public static final PropertyBool WORKING = PropertyBool.create("working"); + private static final PropertyBool WORKING = PropertyBool.create("working"); public BlockSolderer() { super("solderer"); diff --git a/src/main/java/refinedstorage/block/BlockStorage.java b/src/main/java/refinedstorage/block/BlockStorage.java index 02e4b7a5b..c2880d805 100755 --- a/src/main/java/refinedstorage/block/BlockStorage.java +++ b/src/main/java/refinedstorage/block/BlockStorage.java @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.List; public class BlockStorage extends BlockNode { - public static final PropertyEnum TYPE = PropertyEnum.create("type", EnumStorageType.class); + public static final PropertyEnum TYPE = PropertyEnum.create("type", EnumItemStorageType.class); public BlockStorage() { super("storage"); @@ -34,7 +34,7 @@ public class BlockStorage extends BlockNode { } @Override - public void getSubBlocks(Item item, CreativeTabs tab, List subItems) { + public void getSubBlocks(Item item, CreativeTabs tab, List subItems) { for (int i = 0; i <= 4; ++i) { subItems.add(ItemBlockStorage.initNBT(new ItemStack(item, 1, i))); } @@ -49,12 +49,12 @@ public class BlockStorage extends BlockNode { @Override public IBlockState getStateFromMeta(int meta) { - return getDefaultState().withProperty(TYPE, EnumStorageType.getById(meta)); + return getDefaultState().withProperty(TYPE, EnumItemStorageType.getById(meta)); } @Override public int getMetaFromState(IBlockState state) { - return ((EnumStorageType) state.getValue(TYPE)).getId(); + return ((EnumItemStorageType) state.getValue(TYPE)).getId(); } @Override @@ -91,9 +91,9 @@ public class BlockStorage extends BlockNode { public List getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) { TileStorage storage = (TileStorage) world.getTileEntity(pos); - List drops = new ArrayList(); + List drops = new ArrayList<>(); - ItemStack stack = new ItemStack(RefinedStorageBlocks.STORAGE, 1, RefinedStorageBlocks.STORAGE.getMetaFromState(state)); + ItemStack stack = new ItemStack(RefinedStorageBlocks.STORAGE, 1, getMetaFromState(state)); stack.setTagCompound(new NBTTagCompound()); stack.getTagCompound().setTag(TileStorage.NBT_STORAGE, storage.getStorageTag()); diff --git a/src/main/java/refinedstorage/block/EnumFluidStorageType.java b/src/main/java/refinedstorage/block/EnumFluidStorageType.java new file mode 100755 index 000000000..ab60cf368 --- /dev/null +++ b/src/main/java/refinedstorage/block/EnumFluidStorageType.java @@ -0,0 +1,52 @@ +package refinedstorage.block; + +import net.minecraft.util.IStringSerializable; + +public enum EnumFluidStorageType implements IStringSerializable { + TYPE_64K(0, 64000, "64k"), + TYPE_128K(1, 128000, "128k"), + TYPE_256K(2, 256000, "256k"), + TYPE_512K(3, 512000, "512k"), + TYPE_CREATIVE(4, -1, "creative"); + + private int id; + private int capacity; + private String name; + + EnumFluidStorageType(int id, int capacity, String name) { + this.id = id; + this.capacity = capacity; + this.name = name; + } + + @Override + public String getName() { + return name; + } + + public int getId() { + return id; + } + + public int getCapacity() { + return capacity; + } + + @Override + public String toString() { + return name; + } + + public static EnumFluidStorageType getById(int id) { + if (id == 5) { + return TYPE_CREATIVE; + } + + for (EnumFluidStorageType type : EnumFluidStorageType.values()) { + if (type.getId() == id) { + return type; + } + } + return TYPE_CREATIVE; + } +} diff --git a/src/main/java/refinedstorage/block/EnumGridType.java b/src/main/java/refinedstorage/block/EnumGridType.java index dc0d28de1..8c0293ae5 100755 --- a/src/main/java/refinedstorage/block/EnumGridType.java +++ b/src/main/java/refinedstorage/block/EnumGridType.java @@ -5,7 +5,8 @@ import net.minecraft.util.IStringSerializable; public enum EnumGridType implements IStringSerializable { NORMAL(0, "normal"), CRAFTING(1, "crafting"), - PATTERN(2, "pattern"); + PATTERN(2, "pattern"), + FLUID(3, "fluid"); private int id; private String name; diff --git a/src/main/java/refinedstorage/block/EnumStorageType.java b/src/main/java/refinedstorage/block/EnumItemStorageType.java similarity index 74% rename from src/main/java/refinedstorage/block/EnumStorageType.java rename to src/main/java/refinedstorage/block/EnumItemStorageType.java index 9426057b1..b48b36d04 100755 --- a/src/main/java/refinedstorage/block/EnumStorageType.java +++ b/src/main/java/refinedstorage/block/EnumItemStorageType.java @@ -1,52 +1,52 @@ -package refinedstorage.block; - -import net.minecraft.util.IStringSerializable; - -public enum EnumStorageType implements IStringSerializable { - TYPE_1K(0, 1000, "1k"), - TYPE_4K(1, 4000, "4k"), - TYPE_16K(2, 16000, "16k"), - TYPE_64K(3, 64000, "64k"), - TYPE_CREATIVE(4, -1, "creative"); - - private int id; - private int capacity; - private String name; - - EnumStorageType(int id, int capacity, String name) { - this.id = id; - this.capacity = capacity; - this.name = name; - } - - @Override - public String getName() { - return name; - } - - public int getId() { - return id; - } - - public int getCapacity() { - return capacity; - } - - @Override - public String toString() { - return name; - } - - public static EnumStorageType getById(int id) { - if (id == 5) { - return TYPE_CREATIVE; - } - - for (EnumStorageType type : EnumStorageType.values()) { - if (type.getId() == id) { - return type; - } - } - return TYPE_CREATIVE; - } -} +package refinedstorage.block; + +import net.minecraft.util.IStringSerializable; + +public enum EnumItemStorageType implements IStringSerializable { + TYPE_1K(0, 1000, "1k"), + TYPE_4K(1, 4000, "4k"), + TYPE_16K(2, 16000, "16k"), + TYPE_64K(3, 64000, "64k"), + TYPE_CREATIVE(4, -1, "creative"); + + private int id; + private int capacity; + private String name; + + EnumItemStorageType(int id, int capacity, String name) { + this.id = id; + this.capacity = capacity; + this.name = name; + } + + @Override + public String getName() { + return name; + } + + public int getId() { + return id; + } + + public int getCapacity() { + return capacity; + } + + @Override + public String toString() { + return name; + } + + public static EnumItemStorageType getById(int id) { + if (id == 5) { + return TYPE_CREATIVE; + } + + for (EnumItemStorageType type : EnumItemStorageType.values()) { + if (type.getId() == id) { + return type; + } + } + return TYPE_CREATIVE; + } +} diff --git a/src/main/java/refinedstorage/block/EnumPlacementType.java b/src/main/java/refinedstorage/block/EnumPlacementType.java index 5d61a53d5..650c8f9e4 100755 --- a/src/main/java/refinedstorage/block/EnumPlacementType.java +++ b/src/main/java/refinedstorage/block/EnumPlacementType.java @@ -9,6 +9,9 @@ public enum EnumPlacementType { ANY( EnumFacing.VALUES ), + ANY_FACE_PLAYER( + EnumFacing.VALUES + ), HORIZONTAL( EnumFacing.NORTH, EnumFacing.EAST, @@ -16,18 +19,18 @@ public enum EnumPlacementType { EnumFacing.WEST ); - public final EnumFacing[] allowed; + final EnumFacing[] allowed; EnumPlacementType(EnumFacing... allowed) { this.allowed = allowed; } - EnumFacing getFrom(BlockPos pos, EntityLivingBase entity) { + EnumFacing getFrom(EnumFacing facing, BlockPos pos, EntityLivingBase entity) { switch (this) { case ANY: - EnumFacing facing = BlockPistonBase.getFacingFromEntity(pos, entity); - - return entity.isSneaking() ? facing.getOpposite() : facing; + return facing.getOpposite(); + case ANY_FACE_PLAYER: + return BlockPistonBase.getFacingFromEntity(pos, entity); case HORIZONTAL: return entity.getHorizontalFacing().getOpposite(); default: @@ -38,6 +41,7 @@ public enum EnumPlacementType { EnumFacing getNext(EnumFacing previous) { switch (this) { case ANY: + case ANY_FACE_PLAYER: return previous.ordinal() + 1 >= EnumFacing.VALUES.length ? EnumFacing.VALUES[0] : EnumFacing.VALUES[previous.ordinal() + 1]; case HORIZONTAL: return previous.rotateYCCW(); diff --git a/src/main/java/refinedstorage/container/ContainerBase.java b/src/main/java/refinedstorage/container/ContainerBase.java index a9d9afef1..6e6953cd2 100755 --- a/src/main/java/refinedstorage/container/ContainerBase.java +++ b/src/main/java/refinedstorage/container/ContainerBase.java @@ -1,19 +1,22 @@ package refinedstorage.container; -import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ClickType; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import refinedstorage.container.slot.SlotDisabled; -import refinedstorage.container.slot.SlotSpecimen; -import refinedstorage.container.slot.SlotSpecimenLegacy; +import net.minecraftforge.items.ItemHandlerHelper; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.container.slot.*; +import refinedstorage.tile.TileBase; +import refinedstorage.tile.grid.WirelessGrid; public abstract class ContainerBase extends Container { + private TileBase tile; private EntityPlayer player; - public ContainerBase(EntityPlayer player) { + public ContainerBase(TileBase tile, EntityPlayer player) { + this.tile = tile; this.player = player; } @@ -21,11 +24,22 @@ public abstract class ContainerBase extends Container { return player; } + public TileBase getTile() { + return tile; + } + protected void addPlayerInventory(int xInventory, int yInventory) { int id = 0; for (int i = 0; i < 9; i++) { - addSlotToContainer(new Slot(player.inventory, id, xInventory + i * 18, yInventory + 4 + (3 * 18))); + int x = xInventory + i * 18; + int y = yInventory + 4 + (3 * 18); + + if (i == player.inventory.currentItem && (ContainerBase.this instanceof ContainerGridFilter || (ContainerBase.this instanceof ContainerGrid && ((ContainerGrid) ContainerBase.this).getGrid() instanceof WirelessGrid))) { + addSlotToContainer(new SlotDisabled(player.inventory, id, x, y)); + } else { + addSlotToContainer(new Slot(player.inventory, id, x, y)); + } id++; } @@ -46,23 +60,15 @@ public abstract class ContainerBase extends Container { if (slot instanceof SlotSpecimen) { if (((SlotSpecimen) slot).isWithSize()) { if (slot.getStack() != null) { - if (GuiScreen.isShiftKeyDown()) { + if (clickType == ClickType.QUICK_MOVE) { slot.putStack(null); } else { int amount = slot.getStack().stackSize; if (clickedButton == 0) { - amount--; - - if (amount < 1) { - amount = 1; - } + amount = Math.max(1, amount - 1); } else if (clickedButton == 1) { - amount++; - - if (amount > 64) { - amount = 64; - } + amount = Math.min(64, amount + 1); } slot.getStack().stackSize = amount; @@ -70,14 +76,7 @@ public abstract class ContainerBase extends Container { } else if (player.inventory.getItemStack() != null) { int amount = player.inventory.getItemStack().stackSize; - if (clickedButton == 1) { - amount = 1; - } - - ItemStack toPut = player.inventory.getItemStack().copy(); - toPut.stackSize = amount; - - slot.putStack(toPut); + slot.putStack(ItemHandlerHelper.copyStackWithSize(player.inventory.getItemStack(), clickedButton == 1 ? 1 : amount)); } } else if (player.inventory.getItemStack() == null) { slot.putStack(null); @@ -106,6 +105,41 @@ public abstract class ContainerBase extends Container { return null; } + protected ItemStack mergeItemStackToSpecimen(ItemStack stack, int begin, int end) { + for (int i = begin; i < end; ++i) { + if (CompareUtils.compareStackNoQuantity(getStackFromSlot(getSlot(i)), stack)) { + return null; + } + } + + for (int i = begin; i < end; ++i) { + Slot slot = getSlot(i); + + if (getStackFromSlot(slot) == null && slot.isItemValid(stack)) { + slot.putStack(ItemHandlerHelper.copyStackWithSize(stack, 1)); + slot.onSlotChanged(); + + return null; + } + } + + return null; + } + + private ItemStack getStackFromSlot(Slot slot) { + ItemStack stackInSlot = slot.getStack(); + + if (stackInSlot == null) { + if (slot instanceof SlotSpecimenFluid) { + stackInSlot = ((SlotSpecimenFluid) slot).getRealStack(); + } else if (slot instanceof SlotSpecimenType) { + stackInSlot = ((SlotSpecimenType) slot).getRealStack(); + } + } + + return stackInSlot; + } + @Override public boolean canInteractWith(EntityPlayer player) { return true; diff --git a/src/main/java/refinedstorage/container/ContainerConstructor.java b/src/main/java/refinedstorage/container/ContainerConstructor.java index 93894e402..de12f58ed 100755 --- a/src/main/java/refinedstorage/container/ContainerConstructor.java +++ b/src/main/java/refinedstorage/container/ContainerConstructor.java @@ -5,17 +5,18 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; import refinedstorage.container.slot.SlotSpecimen; +import refinedstorage.container.slot.SlotSpecimenType; import refinedstorage.tile.TileConstructor; public class ContainerConstructor extends ContainerBase { - public ContainerConstructor(EntityPlayer player, TileConstructor constructor) { - super(player); + public ContainerConstructor(TileConstructor constructor, EntityPlayer player) { + super(constructor, player); for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(constructor.getUpgrades(), i, 187, 6 + (i * 18))); } - addSlotToContainer(new SlotSpecimen(constructor.getFilter(), 0, 80, 20, SlotSpecimen.SPECIMEN_BLOCK)); + addSlotToContainer(new SlotSpecimenType(constructor, 0, 80, 20, SlotSpecimen.SPECIMEN_BLOCK)); addPlayerInventory(8, 55); } @@ -34,7 +35,7 @@ public class ContainerConstructor extends ContainerBase { return null; } } else if (!mergeItemStack(stack, 0, 4, false)) { - return null; + return mergeItemStackToSpecimen(stack, 4, 4 + 1); } if (stack.stackSize == 0) { diff --git a/src/main/java/refinedstorage/container/ContainerController.java b/src/main/java/refinedstorage/container/ContainerController.java index 79b385d7b..e3595e993 100755 --- a/src/main/java/refinedstorage/container/ContainerController.java +++ b/src/main/java/refinedstorage/container/ContainerController.java @@ -1,10 +1,11 @@ package refinedstorage.container; import net.minecraft.entity.player.EntityPlayer; +import refinedstorage.tile.TileController; public class ContainerController extends ContainerBase { - public ContainerController(EntityPlayer player) { - super(player); + public ContainerController(TileController controller, EntityPlayer player) { + super(controller, player); addPlayerInventory(8, 99); } diff --git a/src/main/java/refinedstorage/container/ContainerCrafter.java b/src/main/java/refinedstorage/container/ContainerCrafter.java index f46c54dfb..c7d44e702 100755 --- a/src/main/java/refinedstorage/container/ContainerCrafter.java +++ b/src/main/java/refinedstorage/container/ContainerCrafter.java @@ -6,9 +6,9 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; import refinedstorage.tile.TileCrafter; -public class ContainerCrafter extends ContainerStorage { - public ContainerCrafter(EntityPlayer player, TileCrafter crafter) { - super(player); +public class ContainerCrafter extends ContainerBase { + public ContainerCrafter(TileCrafter crafter, EntityPlayer player) { + super(crafter, player); for (int i = 0; i < 9; ++i) { addSlotToContainer(new SlotItemHandler(crafter.getPatterns(), i, 8 + (18 * i), 20)); diff --git a/src/main/java/refinedstorage/container/ContainerCraftingMonitor.java b/src/main/java/refinedstorage/container/ContainerCraftingMonitor.java index b39a7f9e5..e49888b50 100755 --- a/src/main/java/refinedstorage/container/ContainerCraftingMonitor.java +++ b/src/main/java/refinedstorage/container/ContainerCraftingMonitor.java @@ -1,10 +1,11 @@ package refinedstorage.container; import net.minecraft.entity.player.EntityPlayer; +import refinedstorage.tile.TileCraftingMonitor; public class ContainerCraftingMonitor extends ContainerBase { - public ContainerCraftingMonitor(EntityPlayer player) { - super(player); + public ContainerCraftingMonitor(TileCraftingMonitor craftingMonitor, EntityPlayer player) { + super(craftingMonitor, player); addPlayerInventory(8, 148); } diff --git a/src/main/java/refinedstorage/container/ContainerCraftingSettings.java b/src/main/java/refinedstorage/container/ContainerCraftingSettings.java index f2296d648..ff39fff7a 100755 --- a/src/main/java/refinedstorage/container/ContainerCraftingSettings.java +++ b/src/main/java/refinedstorage/container/ContainerCraftingSettings.java @@ -11,7 +11,7 @@ import javax.annotation.Nullable; public class ContainerCraftingSettings extends ContainerBase { public ContainerCraftingSettings(EntityPlayer player, final ItemStack stack) { - super(player); + super(null, player); final ItemStack slot = ItemHandlerHelper.copyStackWithSize(stack, 1); diff --git a/src/main/java/refinedstorage/container/ContainerDestructor.java b/src/main/java/refinedstorage/container/ContainerDestructor.java index 1bce4b602..b56f1ff86 100755 --- a/src/main/java/refinedstorage/container/ContainerDestructor.java +++ b/src/main/java/refinedstorage/container/ContainerDestructor.java @@ -5,18 +5,19 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; import refinedstorage.container.slot.SlotSpecimen; +import refinedstorage.container.slot.SlotSpecimenType; import refinedstorage.tile.TileDestructor; public class ContainerDestructor extends ContainerBase { - public ContainerDestructor(EntityPlayer player, TileDestructor destructor) { - super(player); + public ContainerDestructor(TileDestructor destructor, EntityPlayer player) { + super(destructor, player); for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(destructor.getUpgrades(), i, 187, 6 + (i * 18))); } for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotSpecimen(destructor.getInventory(), i, 8 + (18 * i), 20, SlotSpecimen.SPECIMEN_BLOCK)); + addSlotToContainer(new SlotSpecimenType(destructor, i, 8 + (18 * i), 20, SlotSpecimen.SPECIMEN_BLOCK)); } addPlayerInventory(8, 55); @@ -36,7 +37,7 @@ public class ContainerDestructor extends ContainerBase { return null; } } else if (!mergeItemStack(stack, 0, 4, false)) { - return null; + return mergeItemStackToSpecimen(stack, 4, 4 + 9); } if (stack.stackSize == 0) { diff --git a/src/main/java/refinedstorage/container/ContainerDetector.java b/src/main/java/refinedstorage/container/ContainerDetector.java index dcc92e29d..555131202 100755 --- a/src/main/java/refinedstorage/container/ContainerDetector.java +++ b/src/main/java/refinedstorage/container/ContainerDetector.java @@ -1,15 +1,28 @@ package refinedstorage.container; import net.minecraft.entity.player.EntityPlayer; -import refinedstorage.container.slot.SlotSpecimen; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import refinedstorage.container.slot.SlotSpecimenType; import refinedstorage.tile.TileDetector; public class ContainerDetector extends ContainerBase { - public ContainerDetector(EntityPlayer player, TileDetector detector) { - super(player); + public ContainerDetector(TileDetector detector, EntityPlayer player) { + super(detector, player); - addSlotToContainer(new SlotSpecimen(detector.getInventory(), 0, 107, 20)); + addSlotToContainer(new SlotSpecimenType(detector, 0, 107, 20)); addPlayerInventory(8, 55); } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + Slot slot = getSlot(index); + + if (slot != null && slot.getHasStack() && index > 0) { + return mergeItemStackToSpecimen(slot.getStack(), 0, 1); + } + + return null; + } } diff --git a/src/main/java/refinedstorage/container/ContainerDiskDrive.java b/src/main/java/refinedstorage/container/ContainerDiskDrive.java index e3e421cb5..a39801384 100755 --- a/src/main/java/refinedstorage/container/ContainerDiskDrive.java +++ b/src/main/java/refinedstorage/container/ContainerDiskDrive.java @@ -4,11 +4,12 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; +import refinedstorage.container.slot.SlotSpecimenType; import refinedstorage.tile.TileDiskDrive; -public class ContainerDiskDrive extends ContainerStorage { - public ContainerDiskDrive(EntityPlayer player, TileDiskDrive drive) { - super(player); +public class ContainerDiskDrive extends ContainerBase { + public ContainerDiskDrive(TileDiskDrive drive, EntityPlayer player) { + super(drive, player); for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(drive.getDisks(), i, 98 + (i * 18), 78)); @@ -18,7 +19,11 @@ public class ContainerDiskDrive extends ContainerStorage { addSlotToContainer(new SlotItemHandler(drive.getDisks(), 4 + i, 98 + (i * 18), 96)); } - addSpecimenAndPlayerInventorySlots(drive.getFilters()); + for (int i = 0; i < 9; ++i) { + addSlotToContainer(new SlotSpecimenType(drive, i, 8 + (18 * i), 20)); + } + + addPlayerInventory(8, 129); } @Override @@ -35,7 +40,7 @@ public class ContainerDiskDrive extends ContainerStorage { return null; } } else if (!mergeItemStack(stack, 0, 8, false)) { - return null; + return mergeItemStackToSpecimen(stack, 8, 8 + 9); } if (stack.stackSize == 0) { diff --git a/src/main/java/refinedstorage/container/ContainerDummy.java b/src/main/java/refinedstorage/container/ContainerDummy.java deleted file mode 100755 index c9022f70b..000000000 --- a/src/main/java/refinedstorage/container/ContainerDummy.java +++ /dev/null @@ -1,11 +0,0 @@ -package refinedstorage.container; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; - -public class ContainerDummy extends Container { - @Override - public boolean canInteractWith(EntityPlayer player) { - return false; - } -} diff --git a/src/main/java/refinedstorage/container/ContainerExporter.java b/src/main/java/refinedstorage/container/ContainerExporter.java index 7ff6f990c..c3b29a4f5 100755 --- a/src/main/java/refinedstorage/container/ContainerExporter.java +++ b/src/main/java/refinedstorage/container/ContainerExporter.java @@ -4,19 +4,19 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; -import refinedstorage.container.slot.SlotSpecimen; +import refinedstorage.container.slot.SlotSpecimenType; import refinedstorage.tile.TileExporter; public class ContainerExporter extends ContainerBase { - public ContainerExporter(EntityPlayer player, TileExporter exporter) { - super(player); + public ContainerExporter(TileExporter exporter, EntityPlayer player) { + super(exporter, player); for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(exporter.getUpgrades(), i, 187, 6 + (i * 18))); } for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotSpecimen(exporter.getFilters(), i, 8 + (18 * i), 20)); + addSlotToContainer(new SlotSpecimenType(exporter, i, 8 + (18 * i), 20)); } addPlayerInventory(8, 55); @@ -36,7 +36,7 @@ public class ContainerExporter extends ContainerBase { return null; } } else if (!mergeItemStack(stack, 0, 4, false)) { - return null; + return mergeItemStackToSpecimen(stack, 4, 4 + 9); } if (stack.stackSize == 0) { diff --git a/src/main/java/refinedstorage/container/ContainerExternalStorage.java b/src/main/java/refinedstorage/container/ContainerExternalStorage.java new file mode 100755 index 000000000..248cb990e --- /dev/null +++ b/src/main/java/refinedstorage/container/ContainerExternalStorage.java @@ -0,0 +1,30 @@ +package refinedstorage.container; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import refinedstorage.container.slot.SlotSpecimenType; +import refinedstorage.tile.externalstorage.TileExternalStorage; + +public class ContainerExternalStorage extends ContainerBase { + public ContainerExternalStorage(TileExternalStorage tile, EntityPlayer player) { + super(tile, player); + + for (int i = 0; i < 9; ++i) { + addSlotToContainer(new SlotSpecimenType(tile, i, 8 + (18 * i), 20)); + } + + addPlayerInventory(8, 129); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + Slot slot = getSlot(index); + + if (slot != null && slot.getHasStack() && index >= 8) { + return mergeItemStackToSpecimen(slot.getStack(), 0, 9); + } + + return null; + } +} diff --git a/src/main/java/refinedstorage/container/ContainerFluidInterface.java b/src/main/java/refinedstorage/container/ContainerFluidInterface.java new file mode 100755 index 000000000..3c535c3db --- /dev/null +++ b/src/main/java/refinedstorage/container/ContainerFluidInterface.java @@ -0,0 +1,50 @@ +package refinedstorage.container; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.SlotItemHandler; +import refinedstorage.container.slot.SlotSpecimenFluid; +import refinedstorage.tile.TileFluidInterface; + +public class ContainerFluidInterface extends ContainerBase { + public ContainerFluidInterface(TileFluidInterface fluidInterface, EntityPlayer player) { + super(fluidInterface, player); + + for (int i = 0; i < 4; ++i) { + addSlotToContainer(new SlotItemHandler(fluidInterface.getUpgrades(), i, 187, 6 + (i * 18))); + } + + addSlotToContainer(new SlotItemHandler(fluidInterface.getIn(), 0, 44, 32)); + addSlotToContainer(new SlotSpecimenFluid(!fluidInterface.getWorld().isRemote, fluidInterface.getOut(), 0, 116, 32)); + + addPlayerInventory(8, 122); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack stack = null; + + Slot slot = getSlot(index); + + if (slot != null && slot.getHasStack()) { + stack = slot.getStack(); + + if (index < 4 + 2) { + if (!mergeItemStack(stack, 4 + 2, inventorySlots.size(), false)) { + return null; + } + } else if (!mergeItemStack(stack, 0, 4 + 2, false)) { + return null; + } + + if (stack.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + } + + return stack; + } +} diff --git a/src/main/java/refinedstorage/container/ContainerFluidStorage.java b/src/main/java/refinedstorage/container/ContainerFluidStorage.java new file mode 100755 index 000000000..85f8a4445 --- /dev/null +++ b/src/main/java/refinedstorage/container/ContainerFluidStorage.java @@ -0,0 +1,30 @@ +package refinedstorage.container; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import refinedstorage.container.slot.SlotSpecimenFluid; +import refinedstorage.tile.TileFluidStorage; + +public class ContainerFluidStorage extends ContainerBase { + public ContainerFluidStorage(TileFluidStorage tile, EntityPlayer player) { + super(tile, player); + + for (int i = 0; i < 9; ++i) { + addSlotToContainer(new SlotSpecimenFluid(!tile.getWorld().isRemote, tile.getFilters(), i, 8 + (18 * i), 20)); + } + + addPlayerInventory(8, 129); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + Slot slot = getSlot(index); + + if (slot != null && slot.getHasStack() && index >= 8) { + return mergeItemStackToSpecimen(slot.getStack(), 0, 9); + } + + return null; + } +} diff --git a/src/main/java/refinedstorage/container/ContainerGrid.java b/src/main/java/refinedstorage/container/ContainerGrid.java index be2bbc681..9f366c112 100755 --- a/src/main/java/refinedstorage/container/ContainerGrid.java +++ b/src/main/java/refinedstorage/container/ContainerGrid.java @@ -1,11 +1,13 @@ package refinedstorage.container; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; import refinedstorage.block.EnumGridType; import refinedstorage.container.slot.*; +import refinedstorage.tile.TileBase; import refinedstorage.tile.grid.IGrid; import refinedstorage.tile.grid.TileGrid; import refinedstorage.tile.grid.WirelessGrid; @@ -16,8 +18,8 @@ public class ContainerGrid extends ContainerBase { private SlotGridCraftingResult craftingResultSlot; private SlotDisabled patternResultSlot; - public ContainerGrid(EntityPlayer player, IGrid grid) { - super(player); + public ContainerGrid(IGrid grid, EntityPlayer player) { + super(grid instanceof TileBase ? (TileBase) grid : null, player); this.grid = grid; @@ -59,6 +61,12 @@ public class ContainerGrid extends ContainerBase { addSlotToContainer(new SlotItemHandler(((TileGrid) grid).getPatterns(), 0, 152, 96)); addSlotToContainer(new SlotOutput(((TileGrid) grid).getPatterns(), 1, 152, 132)); } + + if (grid.getType() != EnumGridType.FLUID) { + for (int i = 0; i < 4; ++i) { + addSlotToContainer(new SlotItemHandler(grid.getFilter(), i, 204, 6 + (18 * i))); + } + } } public IGrid getGrid() { @@ -96,12 +104,18 @@ public class ContainerGrid extends ContainerBase { if (!player.worldObj.isRemote) { Slot slot = inventorySlots.get(slotIndex); - if (slot == craftingResultSlot) { - ((TileGrid) grid).onCraftedShift(this, player); - } else if (grid.getGridHandler() != null && slot != patternResultSlot && !(slot instanceof SlotSpecimenLegacy) && slot.getHasStack()) { - slot.putStack(grid.getGridHandler().onInsert(slot.getStack())); + if (slot.getHasStack()) { + if (slot == craftingResultSlot) { + ((TileGrid) grid).onCraftedShift(this, player); + } else if (slot != patternResultSlot && !(slot instanceof SlotSpecimenLegacy)) { + if (grid.getType() != EnumGridType.FLUID && grid.getItemHandler() != null) { + slot.putStack(grid.getItemHandler().onInsert((EntityPlayerMP) player, slot.getStack())); + } else if (grid.getType() == EnumGridType.FLUID && grid.getFluidHandler() != null) { + slot.putStack(grid.getFluidHandler().onInsert(slot.getStack())); + } - detectAndSendChanges(); + detectAndSendChanges(); + } } } diff --git a/src/main/java/refinedstorage/container/ContainerGridFilter.java b/src/main/java/refinedstorage/container/ContainerGridFilter.java new file mode 100755 index 000000000..86acaa40b --- /dev/null +++ b/src/main/java/refinedstorage/container/ContainerGridFilter.java @@ -0,0 +1,48 @@ +package refinedstorage.container; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import refinedstorage.container.slot.SlotSpecimen; +import refinedstorage.inventory.ItemHandlerGridFilter; + +public class ContainerGridFilter extends ContainerBase { + private ItemHandlerGridFilter filter; + private ItemStack stack; + + public ContainerGridFilter(EntityPlayer player, ItemStack stack) { + super(null, player); + + this.stack = stack; + this.filter = new ItemHandlerGridFilter(stack); + + for (int i = 0; i < 9; ++i) { + addSlotToContainer(new SlotSpecimen(filter, i, 8 + (i * 18), 20)); + } + + addPlayerInventory(8, 70); + } + + public ItemStack getStack() { + return stack; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack stack = null; + + Slot slot = getSlot(index); + + if (slot != null && slot.getHasStack()) { + stack = slot.getStack(); + + if (index > 9 - 1) { + return mergeItemStackToSpecimen(stack, 0, 9); + } + + return null; + } + + return stack; + } +} diff --git a/src/main/java/refinedstorage/container/ContainerImporter.java b/src/main/java/refinedstorage/container/ContainerImporter.java index c21727668..01e5f805b 100755 --- a/src/main/java/refinedstorage/container/ContainerImporter.java +++ b/src/main/java/refinedstorage/container/ContainerImporter.java @@ -4,19 +4,19 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; -import refinedstorage.container.slot.SlotSpecimen; +import refinedstorage.container.slot.SlotSpecimenType; import refinedstorage.tile.TileImporter; public class ContainerImporter extends ContainerBase { - public ContainerImporter(EntityPlayer player, TileImporter importer) { - super(player); + public ContainerImporter(TileImporter importer, EntityPlayer player) { + super(importer, player); for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(importer.getUpgrades(), i, 187, 6 + (i * 18))); } for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotSpecimen(importer.getFilters(), i, 8 + (18 * i), 20)); + addSlotToContainer(new SlotSpecimenType(importer, i, 8 + (18 * i), 20)); } addPlayerInventory(8, 55); @@ -36,7 +36,7 @@ public class ContainerImporter extends ContainerBase { return null; } } else if (!mergeItemStack(stack, 0, 4, false)) { - return null; + return mergeItemStackToSpecimen(stack, 4, 4 + 9); } if (stack.stackSize == 0) { diff --git a/src/main/java/refinedstorage/container/ContainerInterface.java b/src/main/java/refinedstorage/container/ContainerInterface.java index e1dad439e..07aa7c911 100755 --- a/src/main/java/refinedstorage/container/ContainerInterface.java +++ b/src/main/java/refinedstorage/container/ContainerInterface.java @@ -9,8 +9,8 @@ import refinedstorage.container.slot.SlotSpecimen; import refinedstorage.tile.TileInterface; public class ContainerInterface extends ContainerBase { - public ContainerInterface(EntityPlayer player, TileInterface tile) { - super(player); + public ContainerInterface(TileInterface tile, EntityPlayer player) { + super(tile, player); for (int i = 0; i < 9; ++i) { addSlotToContainer(new SlotItemHandler(tile.getImportItems(), i, 8 + (18 * i), 20)); diff --git a/src/main/java/refinedstorage/container/ContainerNetworkTransmitter.java b/src/main/java/refinedstorage/container/ContainerNetworkTransmitter.java new file mode 100755 index 000000000..9de920677 --- /dev/null +++ b/src/main/java/refinedstorage/container/ContainerNetworkTransmitter.java @@ -0,0 +1,46 @@ +package refinedstorage.container; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.SlotItemHandler; +import refinedstorage.tile.TileNetworkTransmitter; + +public class ContainerNetworkTransmitter extends ContainerBase { + public ContainerNetworkTransmitter(TileNetworkTransmitter networkTransmitter, EntityPlayer player) { + super(networkTransmitter, player); + + addSlotToContainer(new SlotItemHandler(networkTransmitter.getNetworkCard(), 0, 8, 20)); + + addSlotToContainer(new SlotItemHandler(networkTransmitter.getUpgrades(), 0, 187, 6)); + + addPlayerInventory(8, 55); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack stack = null; + + Slot slot = getSlot(index); + + if (slot != null && slot.getHasStack()) { + stack = slot.getStack(); + + if (index <= 1) { + if (!mergeItemStack(stack, 2, inventorySlots.size(), false)) { + return null; + } + } else if (!mergeItemStack(stack, 0, 2, false)) { + return null; + } + + if (stack.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + } + + return stack; + } +} diff --git a/src/main/java/refinedstorage/container/ContainerProcessingPatternEncoder.java b/src/main/java/refinedstorage/container/ContainerProcessingPatternEncoder.java index 9541dac20..374dfaa55 100755 --- a/src/main/java/refinedstorage/container/ContainerProcessingPatternEncoder.java +++ b/src/main/java/refinedstorage/container/ContainerProcessingPatternEncoder.java @@ -9,8 +9,8 @@ import refinedstorage.container.slot.SlotSpecimen; import refinedstorage.tile.TileProcessingPatternEncoder; public class ContainerProcessingPatternEncoder extends ContainerBase { - public ContainerProcessingPatternEncoder(EntityPlayer player, TileProcessingPatternEncoder processingPatternEncoder) { - super(player); + public ContainerProcessingPatternEncoder(TileProcessingPatternEncoder processingPatternEncoder, EntityPlayer player) { + super(processingPatternEncoder, player); addSlotToContainer(new SlotItemHandler(processingPatternEncoder.getPatterns(), 0, 152, 18)); addSlotToContainer(new SlotOutput(processingPatternEncoder.getPatterns(), 1, 152, 58)); @@ -20,7 +20,7 @@ public class ContainerProcessingPatternEncoder extends ContainerBase { int y = 20; for (int i = 0; i < 9 * 2; ++i) { - addSlotToContainer(new SlotSpecimen(processingPatternEncoder.getConfiguration(), i, x, y)); + addSlotToContainer(new SlotSpecimen(processingPatternEncoder.getConfiguration(), i, x, y, SlotSpecimen.SPECIMEN_SIZE)); x += 18; diff --git a/src/main/java/refinedstorage/container/ContainerRelay.java b/src/main/java/refinedstorage/container/ContainerRelay.java index 0c8a0a1de..234d2eb60 100755 --- a/src/main/java/refinedstorage/container/ContainerRelay.java +++ b/src/main/java/refinedstorage/container/ContainerRelay.java @@ -1,10 +1,11 @@ package refinedstorage.container; import net.minecraft.entity.player.EntityPlayer; +import refinedstorage.tile.TileRelay; public class ContainerRelay extends ContainerBase { - public ContainerRelay(EntityPlayer player) { - super(player); + public ContainerRelay(TileRelay relay, EntityPlayer player) { + super(relay, player); addPlayerInventory(8, 50); } diff --git a/src/main/java/refinedstorage/container/ContainerSolderer.java b/src/main/java/refinedstorage/container/ContainerSolderer.java index ee672a684..f27a565ab 100755 --- a/src/main/java/refinedstorage/container/ContainerSolderer.java +++ b/src/main/java/refinedstorage/container/ContainerSolderer.java @@ -9,8 +9,8 @@ import refinedstorage.container.slot.SlotOutput; import refinedstorage.tile.TileSolderer; public class ContainerSolderer extends ContainerBase { - public ContainerSolderer(EntityPlayer player, TileSolderer solderer) { - super(player); + public ContainerSolderer(TileSolderer solderer, EntityPlayer player) { + super(solderer, player); int x = 44; int y = 20; diff --git a/src/main/java/refinedstorage/container/ContainerStorage.java b/src/main/java/refinedstorage/container/ContainerStorage.java index 62dd6c897..01f93d584 100755 --- a/src/main/java/refinedstorage/container/ContainerStorage.java +++ b/src/main/java/refinedstorage/container/ContainerStorage.java @@ -1,25 +1,30 @@ package refinedstorage.container; import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.items.IItemHandler; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; import refinedstorage.container.slot.SlotSpecimen; +import refinedstorage.tile.TileStorage; public class ContainerStorage extends ContainerBase { - public ContainerStorage(EntityPlayer player) { - super(player); - } + public ContainerStorage(TileStorage tile, EntityPlayer player) { + super(tile, player); - public ContainerStorage(EntityPlayer player, IItemHandler filters) { - this(player); - - addSpecimenAndPlayerInventorySlots(filters); - } - - protected void addSpecimenAndPlayerInventorySlots(IItemHandler filters) { for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotSpecimen(filters, i, 8 + (18 * i), 20)); + addSlotToContainer(new SlotSpecimen(tile.getFilters(), i, 8 + (18 * i), 20)); } addPlayerInventory(8, 129); } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + Slot slot = getSlot(index); + + if (slot != null && slot.getHasStack() && index >= 8) { + return mergeItemStackToSpecimen(slot.getStack(), 0, 9); + } + + return null; + } } diff --git a/src/main/java/refinedstorage/container/ContainerWirelessTransmitter.java b/src/main/java/refinedstorage/container/ContainerWirelessTransmitter.java index 729b6eeed..cb980c13c 100755 --- a/src/main/java/refinedstorage/container/ContainerWirelessTransmitter.java +++ b/src/main/java/refinedstorage/container/ContainerWirelessTransmitter.java @@ -7,8 +7,8 @@ import net.minecraftforge.items.SlotItemHandler; import refinedstorage.tile.TileWirelessTransmitter; public class ContainerWirelessTransmitter extends ContainerBase { - public ContainerWirelessTransmitter(EntityPlayer player, TileWirelessTransmitter wirelessTransmitter) { - super(player); + public ContainerWirelessTransmitter(TileWirelessTransmitter wirelessTransmitter, EntityPlayer player) { + super(wirelessTransmitter, player); for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(wirelessTransmitter.getUpgrades(), i, 187, 6 + (i * 18))); diff --git a/src/main/java/refinedstorage/container/slot/SlotSpecimen.java b/src/main/java/refinedstorage/container/slot/SlotSpecimen.java index e936b08c4..c96aaedf0 100755 --- a/src/main/java/refinedstorage/container/slot/SlotSpecimen.java +++ b/src/main/java/refinedstorage/container/slot/SlotSpecimen.java @@ -38,7 +38,7 @@ public class SlotSpecimen extends SlotItemHandler { @Override public boolean isItemValid(ItemStack stack) { - return isBlockOnly() ? (stack.getItem() instanceof ItemBlock || stack.getItem() instanceof ItemBlockSpecial || stack.getItem() instanceof IPlantable) : true; + return super.isItemValid(stack) && (isBlockOnly() ? (stack.getItem() instanceof ItemBlock || stack.getItem() instanceof ItemBlockSpecial || stack.getItem() instanceof IPlantable) : true); } @Override @@ -67,9 +67,7 @@ public class SlotSpecimen extends SlotItemHandler { Field f = ((ItemBlockSpecial) item).getClass().getDeclaredField("block"); f.setAccessible(true); return ((Block) f.get(item)).getDefaultState(); - } catch (IllegalAccessException e) { - // NO OP - } catch (NoSuchFieldException e) { + } catch (IllegalAccessException | NoSuchFieldException e) { // NO OP } } else if (item instanceof ItemBlock) { diff --git a/src/main/java/refinedstorage/container/slot/SlotSpecimenFluid.java b/src/main/java/refinedstorage/container/slot/SlotSpecimenFluid.java new file mode 100755 index 000000000..fb3917535 --- /dev/null +++ b/src/main/java/refinedstorage/container/slot/SlotSpecimenFluid.java @@ -0,0 +1,23 @@ +package refinedstorage.container.slot; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; + +public class SlotSpecimenFluid extends SlotSpecimen { + private boolean server; + + public SlotSpecimenFluid(boolean server, IItemHandler handler, int id, int x, int y) { + super(handler, id, x, y); + + this.server = server; + } + + @Override + public ItemStack getStack() { + return server ? super.getStack() : null; + } + + public ItemStack getRealStack() { + return super.getStack(); + } +} \ No newline at end of file diff --git a/src/main/java/refinedstorage/container/slot/SlotSpecimenType.java b/src/main/java/refinedstorage/container/slot/SlotSpecimenType.java new file mode 100755 index 000000000..a0a20cb62 --- /dev/null +++ b/src/main/java/refinedstorage/container/slot/SlotSpecimenType.java @@ -0,0 +1,44 @@ +package refinedstorage.container.slot; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.items.IItemHandler; +import refinedstorage.tile.config.IType; + +public class SlotSpecimenType extends SlotSpecimen { + private IType type; + + public SlotSpecimenType(IType type, int id, int x, int y, int flags) { + super(null, id, x, y, flags); + + this.type = type; + } + + public SlotSpecimenType(IType type, int id, int x, int y) { + this(type, id, x, y, 0); + } + + @Override + public IItemHandler getItemHandler() { + return type.getFilterInventory(); + } + + @Override + public boolean isWithSize() { + return super.isWithSize() && type.getType() != IType.FLUIDS; + } + + @Override + public boolean isBlockOnly() { + return super.isBlockOnly() && type.getType() == IType.ITEMS; + } + + @Override + public ItemStack getStack() { + return (type.getType() == IType.ITEMS || !((TileEntity) type).getWorld().isRemote) ? super.getStack() : null; + } + + public ItemStack getRealStack() { + return super.getStack(); + } +} diff --git a/src/main/java/refinedstorage/gui/GuiBase.java b/src/main/java/refinedstorage/gui/GuiBase.java index 9d3b30615..10af8c5c3 100755 --- a/src/main/java/refinedstorage/gui/GuiBase.java +++ b/src/main/java/refinedstorage/gui/GuiBase.java @@ -5,22 +5,31 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.client.config.GuiCheckBox; +import net.minecraftforge.items.SlotItemHandler; import org.lwjgl.input.Mouse; import refinedstorage.RefinedStorage; +import refinedstorage.apiimpl.storage.fluid.FluidRenderer; import refinedstorage.gui.sidebutton.SideButton; +import refinedstorage.inventory.ItemHandlerFluid; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; public abstract class GuiBase extends GuiContainer { + private static final Map TEXTURE_CACHE = new HashMap<>(); + + public static final FluidRenderer FLUID_RENDERER = new FluidRenderer(Fluid.BUCKET_VOLUME, 16, 16); + protected static final int SIDE_BUTTON_WIDTH = 20; protected static final int SIDE_BUTTON_HEIGHT = 20; - private List sideButtons = new ArrayList(); + private List sideButtons = new ArrayList<>(); private int lastButtonId = 0; private int lastSideButtonY = 6; @@ -89,6 +98,18 @@ public abstract class GuiBase extends GuiContainer { drawBackground(guiLeft, guiTop, mouseX, mouseY); + for (int i = 0; i < inventorySlots.inventorySlots.size(); ++i) { + Slot slot = inventorySlots.inventorySlots.get(i); + + if (slot instanceof SlotItemHandler && ((SlotItemHandler) slot).getItemHandler() instanceof ItemHandlerFluid) { + FluidStack stack = ((ItemHandlerFluid) ((SlotItemHandler) slot).getItemHandler()).getFluids()[slot.getSlotIndex()]; + + if (stack != null) { + FLUID_RENDERER.draw(mc, guiLeft + slot.xDisplayPosition, guiTop + slot.yDisplayPosition, stack); + } + } + } + if (scrollbar != null) { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); @@ -135,11 +156,7 @@ public abstract class GuiBase extends GuiContainer { protected void actionPerformed(GuiButton button) throws IOException { super.actionPerformed(button); - for (SideButton sideButton : sideButtons) { - if (sideButton.getId() == button.id) { - sideButton.actionPerformed(); - } - } + sideButtons.stream().filter(b -> b.getId() == button.id).findFirst().ifPresent(SideButton::actionPerformed); } public GuiButton addButton(int x, int y, int w, int h) { @@ -150,6 +167,14 @@ public abstract class GuiBase extends GuiContainer { return addButton(x, y, w, h, text, true); } + public GuiCheckBox addCheckBox(int x, int y, String text, boolean checked) { + GuiCheckBox checkBox = new GuiCheckBox(lastButtonId++, x, y, text, checked); + + buttonList.add(checkBox); + + return checkBox; + } + public GuiButton addButton(int x, int y, int w, int h, String text, boolean enabled) { GuiButton button = new GuiButton(lastButtonId++, x, y, w, h, text); button.enabled = enabled; @@ -178,7 +203,13 @@ public abstract class GuiBase extends GuiContainer { } public void bindTexture(String base, String file) { - mc.getTextureManager().bindTexture(new ResourceLocation(base, "textures/" + file)); + String id = base + ":" + file; + + if (!TEXTURE_CACHE.containsKey(id)) { + TEXTURE_CACHE.put(id, new ResourceLocation(base, "textures/" + file)); + } + + mc.getTextureManager().bindTexture(TEXTURE_CACHE.get(id)); } public void drawItem(int x, int y, ItemStack stack) { @@ -207,28 +238,32 @@ public abstract class GuiBase extends GuiContainer { itemRender.renderItemOverlayIntoGUI(fontRendererObj, stack, x, y, ""); if (text != null) { - GlStateManager.pushMatrix(); - GlStateManager.translate(x, y, 1); - GlStateManager.scale(0.5f, 0.5f, 1); - - GlStateManager.disableLighting(); - GlStateManager.disableRescaleNormal(); - GlStateManager.depthMask(false); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 771); - GlStateManager.disableDepth(); - - fontRendererObj.drawStringWithShadow(text, 30 - fontRendererObj.getStringWidth(text), 22, 16777215); - - GlStateManager.enableDepth(); - GlStateManager.enableTexture2D(); - GlStateManager.depthMask(true); - GlStateManager.enableLighting(); - GlStateManager.disableBlend(); - GlStateManager.popMatrix(); + drawQuantity(x, y, text); } } + public void drawQuantity(int x, int y, String qty) { + GlStateManager.pushMatrix(); + GlStateManager.translate(x, y, 1); + GlStateManager.scale(0.5f, 0.5f, 1); + + GlStateManager.disableLighting(); + GlStateManager.disableRescaleNormal(); + GlStateManager.depthMask(false); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(770, 771); + GlStateManager.disableDepth(); + + fontRendererObj.drawStringWithShadow(qty, 30 - fontRendererObj.getStringWidth(qty), 22, 16777215); + + GlStateManager.enableDepth(); + GlStateManager.enableTexture2D(); + GlStateManager.depthMask(true); + GlStateManager.enableLighting(); + GlStateManager.disableBlend(); + GlStateManager.popMatrix(); + } + public void drawString(int x, int y, String message) { drawString(x, y, message, 4210752); } @@ -278,4 +313,10 @@ public abstract class GuiBase extends GuiContainer { public int getGuiTop() { return guiTop; } + + protected int calculateOffsetOnScale(int pos, float scale) { + float multiplier = (pos / scale); + + return (int) multiplier; + } } diff --git a/src/main/java/refinedstorage/gui/GuiConstructor.java b/src/main/java/refinedstorage/gui/GuiConstructor.java index b97436463..b99b7b3cf 100755 --- a/src/main/java/refinedstorage/gui/GuiConstructor.java +++ b/src/main/java/refinedstorage/gui/GuiConstructor.java @@ -1,26 +1,25 @@ package refinedstorage.gui; -import refinedstorage.api.storage.CompareFlags; +import refinedstorage.api.storage.CompareUtils; import refinedstorage.container.ContainerConstructor; import refinedstorage.gui.sidebutton.SideButtonCompare; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; +import refinedstorage.gui.sidebutton.SideButtonType; import refinedstorage.tile.TileConstructor; public class GuiConstructor extends GuiBase { - private TileConstructor constructor; - - public GuiConstructor(ContainerConstructor container, TileConstructor constructor) { + public GuiConstructor(ContainerConstructor container) { super(container, 211, 137); - - this.constructor = constructor; } @Override public void init(int x, int y) { - addSideButton(new SideButtonRedstoneMode(constructor)); + addSideButton(new SideButtonRedstoneMode(TileConstructor.REDSTONE_MODE)); - addSideButton(new SideButtonCompare(constructor, CompareFlags.COMPARE_DAMAGE)); - addSideButton(new SideButtonCompare(constructor, CompareFlags.COMPARE_NBT)); + addSideButton(new SideButtonType(TileConstructor.TYPE)); + + addSideButton(new SideButtonCompare(TileConstructor.COMPARE, CompareUtils.COMPARE_DAMAGE)); + addSideButton(new SideButtonCompare(TileConstructor.COMPARE, CompareUtils.COMPARE_NBT)); } @Override diff --git a/src/main/java/refinedstorage/gui/GuiController.java b/src/main/java/refinedstorage/gui/GuiController.java index 9f5e937ac..3dbe8532d 100755 --- a/src/main/java/refinedstorage/gui/GuiController.java +++ b/src/main/java/refinedstorage/gui/GuiController.java @@ -2,11 +2,10 @@ package refinedstorage.gui; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; -import refinedstorage.RefinedStorageUtils; import refinedstorage.container.ContainerController; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; -import refinedstorage.tile.controller.ClientNode; -import refinedstorage.tile.controller.TileController; +import refinedstorage.tile.ClientNode; +import refinedstorage.tile.TileController; import java.util.List; @@ -30,13 +29,13 @@ public class GuiController extends GuiBase { @Override public void init(int x, int y) { - addSideButton(new SideButtonRedstoneMode(controller)); + addSideButton(new SideButtonRedstoneMode(TileController.REDSTONE_MODE)); } @Override public void update(int x, int y) { - getScrollbar().setCanScroll(getRows() > VISIBLE_ROWS); - getScrollbar().setScrollDelta((float) getScrollbar().getScrollbarHeight() / (float) getRows()); + getScrollbar().setEnabled(getRows() > VISIBLE_ROWS); + getScrollbar().setMaxOffset(getRows() - VISIBLE_ROWS); } @Override @@ -45,7 +44,7 @@ public class GuiController extends GuiBase { drawTexture(x, y, 0, 0, width, height); - int barHeightNew = controller.getEnergyScaled(barHeight); + int barHeightNew = TileController.getEnergyScaled(TileController.ENERGY_STORED.getValue(), TileController.ENERGY_CAPACITY.getValue(), barHeight); drawTexture(x + barX, y + barY + barHeight - barHeightNew, 178, barHeight - barHeightNew, barWidth, barHeightNew); } @@ -58,11 +57,11 @@ public class GuiController extends GuiBase { int x = 33; int y = 26; - int slot = getOffset() * 2; + int slot = getScrollbar().getOffset() * 2; RenderHelper.enableGUIStandardItemLighting(); - List nodes = controller.getClientNodes(); + List nodes = TileController.NODES.getValue(); ClientNode nodeHovering = null; @@ -70,15 +69,15 @@ public class GuiController extends GuiBase { if (slot < nodes.size()) { ClientNode node = nodes.get(slot); - drawItem(x, y + 5, node.stack); + drawItem(x, y + 5, node.getStack()); float scale = 0.5f; GlStateManager.pushMatrix(); GlStateManager.scale(scale, scale, 1); - drawString(RefinedStorageUtils.calculateOffsetOnScale(x + 1, scale), RefinedStorageUtils.calculateOffsetOnScale(y - 2, scale), node.stack.getDisplayName()); - drawString(RefinedStorageUtils.calculateOffsetOnScale(x + 21, scale), RefinedStorageUtils.calculateOffsetOnScale(y + 10, scale), t("gui.refinedstorage:controller.machine_amount", node.amount)); + drawString(calculateOffsetOnScale(x + 1, scale), calculateOffsetOnScale(y - 2, scale), node.getStack().getDisplayName()); + drawString(calculateOffsetOnScale(x + 21, scale), calculateOffsetOnScale(y + 10, scale), t("gui.refinedstorage:controller.machine_amount", node.getAmount())); GlStateManager.popMatrix(); @@ -98,21 +97,15 @@ public class GuiController extends GuiBase { } if (nodeHovering != null) { - drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage_minimal", nodeHovering.energyUsage)); + drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage_minimal", nodeHovering.getEnergyUsage())); } if (inBounds(barX, barY, barWidth, barHeight, mouseX, mouseY)) { - drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage", controller.getEnergyUsage()) + "\n" + t("misc.refinedstorage:energy_stored", controller.getEnergy().getEnergyStored(), controller.getEnergy().getMaxEnergyStored())); + drawTooltip(mouseX, mouseY, t("misc.refinedstorage:energy_usage", TileController.ENERGY_USAGE.getValue()) + "\n" + t("misc.refinedstorage:energy_stored", TileController.ENERGY_STORED.getValue(), TileController.ENERGY_CAPACITY.getValue())); } } - public int getOffset() { - return (int) Math.ceil(getScrollbar().getCurrentScroll() / 59f * (float) getRows()); - } - private int getRows() { - int max = (int) Math.ceil((float) controller.getClientNodes().size() / (float) 2); - - return max < 0 ? 0 : max; + return Math.max(0, (int) Math.ceil((float) TileController.NODES.getValue().size() / 2F)); } } diff --git a/src/main/java/refinedstorage/gui/GuiCrafter.java b/src/main/java/refinedstorage/gui/GuiCrafter.java index e26b43c06..7f578ebb3 100755 --- a/src/main/java/refinedstorage/gui/GuiCrafter.java +++ b/src/main/java/refinedstorage/gui/GuiCrafter.java @@ -5,17 +5,13 @@ import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.tile.TileCrafter; public class GuiCrafter extends GuiBase { - private TileCrafter crafter; - - public GuiCrafter(ContainerCrafter container, TileCrafter crafter) { + public GuiCrafter(ContainerCrafter container) { super(container, 211, 137); - - this.crafter = crafter; } @Override public void init(int x, int y) { - addSideButton(new SideButtonRedstoneMode(crafter)); + addSideButton(new SideButtonRedstoneMode(TileCrafter.REDSTONE_MODE)); } @Override diff --git a/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java index 0733e6bf2..571558414 100755 --- a/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java +++ b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java @@ -5,14 +5,15 @@ import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.util.text.TextFormatting; import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageUtils; import refinedstorage.container.ContainerCraftingMonitor; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.network.MessageCraftingMonitorCancel; +import refinedstorage.tile.ClientCraftingTask; import refinedstorage.tile.TileCraftingMonitor; import java.io.IOException; import java.util.Arrays; +import java.util.List; public class GuiCraftingMonitor extends GuiBase { private static final int VISIBLE_ROWS = 3; @@ -41,7 +42,7 @@ public class GuiCraftingMonitor extends GuiBase { @Override public void init(int x, int y) { - addSideButton(new SideButtonRedstoneMode(craftingMonitor)); + addSideButton(new SideButtonRedstoneMode(TileCraftingMonitor.REDSTONE_MODE)); String cancel = t("gui.cancel"); String cancelAll = t("misc.refinedstorage:cancel_all"); @@ -55,15 +56,15 @@ public class GuiCraftingMonitor extends GuiBase { @Override public void update(int x, int y) { - getScrollbar().setCanScroll(getRows() > VISIBLE_ROWS); - getScrollbar().setScrollDelta((float) getScrollbar().getScrollbarHeight() / (float) getRows()); + getScrollbar().setEnabled(getRows() > VISIBLE_ROWS); + getScrollbar().setMaxOffset(getRows() - VISIBLE_ROWS); - if (itemSelected >= craftingMonitor.getTasks().size()) { + if (itemSelected >= getTasks().size()) { itemSelected = -1; } cancelButton.enabled = itemSelected != -1; - cancelAllButton.enabled = craftingMonitor.getTasks().size() > 0; + cancelAllButton.enabled = getTasks().size() > 0; } @Override @@ -85,7 +86,7 @@ public class GuiCraftingMonitor extends GuiBase { int x = 8; int y = 20; - int item = getOffset() * 2; + int item = getScrollbar().getOffset() * 2; RenderHelper.enableGUIStandardItemLighting(); @@ -94,28 +95,28 @@ public class GuiCraftingMonitor extends GuiBase { renderItemSelection = false; for (int i = 0; i < 6; ++i) { - if (item < craftingMonitor.getTasks().size()) { + if (item < getTasks().size()) { if (item == itemSelected) { renderItemSelection = true; renderItemSelectionX = x; renderItemSelectionY = y; } - TileCraftingMonitor.ClientSideCraftingTask task = craftingMonitor.getTasks().get(i); + ClientCraftingTask task = getTasks().get(i); - drawItem(x + 4, y + 11, task.output); + drawItem(x + 4, y + 11, task.getOutput()); float scale = 0.5f; GlStateManager.pushMatrix(); GlStateManager.scale(scale, scale, 1); - drawString(RefinedStorageUtils.calculateOffsetOnScale(x + 5, scale), RefinedStorageUtils.calculateOffsetOnScale(y + 4, scale), task.output.getDisplayName()); + drawString(calculateOffsetOnScale(x + 5, scale), calculateOffsetOnScale(y + 4, scale), task.getOutput().getDisplayName()); GlStateManager.popMatrix(); - if (inBounds(x + 5, y + 10, 16, 16, mouseX, mouseY) && !task.info.trim().equals("")) { - lines = task.info.split("\n"); + if (inBounds(x + 5, y + 10, 16, 16, mouseX, mouseY) && !task.getInfo().trim().equals("")) { + lines = task.getInfo().split("\n"); for (int j = 0; j < lines.length; ++j) { String line = lines[j]; @@ -146,14 +147,8 @@ public class GuiCraftingMonitor extends GuiBase { } } - public int getOffset() { - return (int) Math.ceil(getScrollbar().getCurrentScroll() / 89f * (float) getRows()); - } - private int getRows() { - int max = (int) Math.ceil((float) craftingMonitor.getTasks().size() / (float) 2); - - return max < 0 ? 0 : max; + return Math.max(0, (int) Math.ceil((float) getTasks().size() / (float) 2)); } @Override @@ -161,8 +156,8 @@ public class GuiCraftingMonitor extends GuiBase { super.actionPerformed(button); if (button == cancelButton && itemSelected != -1) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, craftingMonitor.getTasks().get(itemSelected).id)); - } else if (button == cancelAllButton && craftingMonitor.getTasks().size() > 0) { + RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, getTasks().get(itemSelected).getId())); + } else if (button == cancelAllButton && getTasks().size() > 0) { RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, -1)); } } @@ -174,14 +169,14 @@ public class GuiCraftingMonitor extends GuiBase { if (mouseButton == 0 && inBounds(8, 20, 144, 90, mouseX - guiLeft, mouseY - guiTop)) { itemSelected = -1; - int item = getOffset() * 2; + int item = getScrollbar().getOffset() * 2; for (int y = 0; y < 3; ++y) { for (int x = 0; x < 2; ++x) { int ix = 8 + (x * ITEM_WIDTH); int iy = 20 + (y * ITEM_HEIGHT); - if (inBounds(ix, iy, ITEM_WIDTH, ITEM_HEIGHT, mouseX - guiLeft, mouseY - guiTop) && item < craftingMonitor.getTasks().size()) { + if (inBounds(ix, iy, ITEM_WIDTH, ITEM_HEIGHT, mouseX - guiLeft, mouseY - guiTop) && item < getTasks().size()) { itemSelected = item; } @@ -190,4 +185,8 @@ public class GuiCraftingMonitor extends GuiBase { } } } + + private List getTasks() { + return TileCraftingMonitor.TASKS.getValue(); + } } diff --git a/src/main/java/refinedstorage/gui/GuiDestructor.java b/src/main/java/refinedstorage/gui/GuiDestructor.java index 3b62a970a..ce2e861e9 100755 --- a/src/main/java/refinedstorage/gui/GuiDestructor.java +++ b/src/main/java/refinedstorage/gui/GuiDestructor.java @@ -1,29 +1,28 @@ package refinedstorage.gui; -import refinedstorage.api.storage.CompareFlags; +import refinedstorage.api.storage.CompareUtils; import refinedstorage.container.ContainerDestructor; import refinedstorage.gui.sidebutton.SideButtonCompare; import refinedstorage.gui.sidebutton.SideButtonMode; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; +import refinedstorage.gui.sidebutton.SideButtonType; import refinedstorage.tile.TileDestructor; public class GuiDestructor extends GuiBase { - private TileDestructor destructor; - - public GuiDestructor(ContainerDestructor container, TileDestructor destructor) { + public GuiDestructor(ContainerDestructor container) { super(container, 211, 137); - - this.destructor = destructor; } @Override public void init(int x, int y) { - addSideButton(new SideButtonRedstoneMode(destructor)); + addSideButton(new SideButtonRedstoneMode(TileDestructor.REDSTONE_MODE)); - addSideButton(new SideButtonMode(destructor)); + addSideButton(new SideButtonType(TileDestructor.TYPE)); - addSideButton(new SideButtonCompare(destructor, CompareFlags.COMPARE_DAMAGE)); - addSideButton(new SideButtonCompare(destructor, CompareFlags.COMPARE_NBT)); + addSideButton(new SideButtonMode(TileDestructor.MODE)); + + addSideButton(new SideButtonCompare(TileDestructor.COMPARE, CompareUtils.COMPARE_DAMAGE)); + addSideButton(new SideButtonCompare(TileDestructor.COMPARE, CompareUtils.COMPARE_NBT)); } @Override diff --git a/src/main/java/refinedstorage/gui/GuiDetector.java b/src/main/java/refinedstorage/gui/GuiDetector.java index a52f83ef6..9b9317653 100755 --- a/src/main/java/refinedstorage/gui/GuiDetector.java +++ b/src/main/java/refinedstorage/gui/GuiDetector.java @@ -2,41 +2,39 @@ package refinedstorage.gui; import com.google.common.primitives.Ints; import net.minecraft.client.gui.GuiTextField; -import refinedstorage.RefinedStorage; -import refinedstorage.api.storage.CompareFlags; +import refinedstorage.api.storage.CompareUtils; import refinedstorage.container.ContainerDetector; import refinedstorage.gui.sidebutton.SideButtonCompare; import refinedstorage.gui.sidebutton.SideButtonDetectorMode; -import refinedstorage.network.MessageDetectorAmountUpdate; +import refinedstorage.gui.sidebutton.SideButtonType; import refinedstorage.tile.TileDetector; +import refinedstorage.tile.data.TileDataManager; import java.io.IOException; public class GuiDetector extends GuiBase { - private TileDetector detector; + public static GuiTextField AMOUNT; - private GuiTextField amountField; - - public GuiDetector(ContainerDetector container, TileDetector detector) { + public GuiDetector(ContainerDetector container) { super(container, 176, 137); - - this.detector = detector; } @Override public void init(int x, int y) { - addSideButton(new SideButtonCompare(detector, CompareFlags.COMPARE_DAMAGE)); - addSideButton(new SideButtonCompare(detector, CompareFlags.COMPARE_NBT)); + addSideButton(new SideButtonType(TileDetector.TYPE)); - addSideButton(new SideButtonDetectorMode(detector)); + addSideButton(new SideButtonDetectorMode()); - amountField = new GuiTextField(0, fontRendererObj, x + 62 + 1, y + 23 + 1, 25, fontRendererObj.FONT_HEIGHT); - amountField.setText(String.valueOf(detector.getAmount())); - amountField.setEnableBackgroundDrawing(false); - amountField.setVisible(true); - amountField.setTextColor(16777215); - amountField.setCanLoseFocus(false); - amountField.setFocused(true); + addSideButton(new SideButtonCompare(TileDetector.COMPARE, CompareUtils.COMPARE_DAMAGE)); + addSideButton(new SideButtonCompare(TileDetector.COMPARE, CompareUtils.COMPARE_NBT)); + + AMOUNT = new GuiTextField(0, fontRendererObj, x + 62 + 1, y + 23 + 1, 29, fontRendererObj.FONT_HEIGHT); + AMOUNT.setText(String.valueOf(TileDetector.AMOUNT.getValue())); + AMOUNT.setEnableBackgroundDrawing(false); + AMOUNT.setVisible(true); + AMOUNT.setTextColor(16777215); + AMOUNT.setCanLoseFocus(false); + AMOUNT.setFocused(true); } @Override @@ -49,7 +47,7 @@ public class GuiDetector extends GuiBase { drawTexture(x, y, 0, 0, width, height); - amountField.drawTextBox(); + AMOUNT.drawTextBox(); } @Override @@ -60,11 +58,11 @@ public class GuiDetector extends GuiBase { @Override protected void keyTyped(char character, int keyCode) throws IOException { - if (!checkHotbarKeys(keyCode) && amountField.textboxKeyTyped(character, keyCode)) { - Integer result = Ints.tryParse(amountField.getText()); + if (!checkHotbarKeys(keyCode) && AMOUNT.textboxKeyTyped(character, keyCode)) { + Integer result = Ints.tryParse(AMOUNT.getText()); if (result != null) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageDetectorAmountUpdate(detector, result)); + TileDataManager.setParameter(TileDetector.AMOUNT, result); } } else { super.keyTyped(character, keyCode); diff --git a/src/main/java/refinedstorage/gui/GuiExporter.java b/src/main/java/refinedstorage/gui/GuiExporter.java index 5d8587cd9..edef72ec0 100755 --- a/src/main/java/refinedstorage/gui/GuiExporter.java +++ b/src/main/java/refinedstorage/gui/GuiExporter.java @@ -1,26 +1,25 @@ package refinedstorage.gui; -import refinedstorage.api.storage.CompareFlags; +import refinedstorage.api.storage.CompareUtils; import refinedstorage.container.ContainerExporter; import refinedstorage.gui.sidebutton.SideButtonCompare; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; +import refinedstorage.gui.sidebutton.SideButtonType; import refinedstorage.tile.TileExporter; public class GuiExporter extends GuiBase { - private TileExporter exporter; - - public GuiExporter(ContainerExporter container, TileExporter exporter) { + public GuiExporter(ContainerExporter container) { super(container, 211, 137); - - this.exporter = exporter; } @Override public void init(int x, int y) { - addSideButton(new SideButtonRedstoneMode(exporter)); + addSideButton(new SideButtonRedstoneMode(TileExporter.REDSTONE_MODE)); - addSideButton(new SideButtonCompare(exporter, CompareFlags.COMPARE_DAMAGE)); - addSideButton(new SideButtonCompare(exporter, CompareFlags.COMPARE_NBT)); + addSideButton(new SideButtonType(TileExporter.TYPE)); + + addSideButton(new SideButtonCompare(TileExporter.COMPARE, CompareUtils.COMPARE_DAMAGE)); + addSideButton(new SideButtonCompare(TileExporter.COMPARE, CompareUtils.COMPARE_NBT)); } @Override diff --git a/src/main/java/refinedstorage/gui/GuiFluidInterface.java b/src/main/java/refinedstorage/gui/GuiFluidInterface.java new file mode 100755 index 000000000..61945d0ab --- /dev/null +++ b/src/main/java/refinedstorage/gui/GuiFluidInterface.java @@ -0,0 +1,58 @@ +package refinedstorage.gui; + +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.apiimpl.storage.fluid.FluidRenderer; +import refinedstorage.container.ContainerFluidInterface; +import refinedstorage.gui.sidebutton.SideButtonCompare; +import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; +import refinedstorage.tile.TileFluidInterface; + +public class GuiFluidInterface extends GuiBase { + private static final FluidRenderer TANK_RENDERER = new FluidRenderer(TileFluidInterface.TANK_CAPACITY, 12, 47); + + public GuiFluidInterface(ContainerFluidInterface container) { + super(container, 211, 204); + } + + @Override + public void init(int x, int y) { + addSideButton(new SideButtonRedstoneMode(TileFluidInterface.REDSTONE_MODE)); + + addSideButton(new SideButtonCompare(TileFluidInterface.COMPARE, CompareUtils.COMPARE_NBT)); + } + + @Override + public void update(int x, int y) { + } + + @Override + public void drawBackground(int x, int y, int mouseX, int mouseY) { + bindTexture("gui/fluid_interface.png"); + + drawTexture(x, y, 0, 0, width, height); + + if (TileFluidInterface.TANK_IN.getValue() != null) { + TANK_RENDERER.draw(mc, x + 46, y + 56, TileFluidInterface.TANK_IN.getValue()); + } + + if (TileFluidInterface.TANK_OUT.getValue() != null) { + TANK_RENDERER.draw(mc, x + 118, y + 56, TileFluidInterface.TANK_OUT.getValue()); + } + } + + @Override + public void drawForeground(int mouseX, int mouseY) { + drawString(7, 7, t("gui.refinedstorage:fluid_interface")); + drawString(43 + 4, 20, t("gui.refinedstorage:fluid_interface.in")); + drawString(115 + 1, 20, t("gui.refinedstorage:fluid_interface.out")); + drawString(7, 111, t("container.inventory")); + + if (inBounds(46, 56, 12, 47, mouseX, mouseY) && TileFluidInterface.TANK_IN.getValue() != null) { + drawTooltip(mouseX, mouseY, TileFluidInterface.TANK_IN.getValue().getLocalizedName() + "\n" + TileFluidInterface.TANK_IN.getValue().amount + " mB"); + } + + if (inBounds(118, 56, 12, 47, mouseX, mouseY) && TileFluidInterface.TANK_OUT.getValue() != null) { + drawTooltip(mouseX, mouseY, TileFluidInterface.TANK_OUT.getValue().getLocalizedName() + "\n" + TileFluidInterface.TANK_OUT.getValue().amount + " mB"); + } + } +} diff --git a/src/main/java/refinedstorage/gui/GuiGridFilter.java b/src/main/java/refinedstorage/gui/GuiGridFilter.java new file mode 100755 index 000000000..8d6b119ed --- /dev/null +++ b/src/main/java/refinedstorage/gui/GuiGridFilter.java @@ -0,0 +1,60 @@ +package refinedstorage.gui; + +import net.minecraft.client.gui.GuiButton; +import net.minecraftforge.fml.client.config.GuiCheckBox; +import refinedstorage.RefinedStorage; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.container.ContainerGridFilter; +import refinedstorage.item.ItemGridFilter; +import refinedstorage.network.MessageGridFilterUpdate; + +import java.io.IOException; + +public class GuiGridFilter extends GuiBase { + private int compare; + + private GuiCheckBox compareDamage; + private GuiCheckBox compareNBT; + + public GuiGridFilter(ContainerGridFilter container) { + super(container, 176, 152); + + this.compare = ItemGridFilter.getCompare(container.getStack()); + } + + @Override + public void init(int x, int y) { + compareDamage = addCheckBox(x + 7, y + 41, t("gui.refinedstorage:grid_filter.compare_damage"), (compare & CompareUtils.COMPARE_DAMAGE) == CompareUtils.COMPARE_DAMAGE); + compareNBT = addCheckBox(x + 7 + compareDamage.getButtonWidth() + 4, y + 41, t("gui.refinedstorage:grid_filter.compare_nbt"), (compare & CompareUtils.COMPARE_NBT) == CompareUtils.COMPARE_NBT); + } + + @Override + public void update(int x, int y) { + } + + @Override + public void drawBackground(int x, int y, int mouseX, int mouseY) { + bindTexture("gui/grid_filter.png"); + + drawTexture(x, y, 0, 0, width, height); + } + + @Override + public void drawForeground(int mouseX, int mouseY) { + drawString(7, 7, t("gui.refinedstorage:grid_filter")); + drawString(7, 58, t("container.inventory")); + } + + @Override + protected void actionPerformed(GuiButton button) throws IOException { + super.actionPerformed(button); + + if (button == compareDamage) { + compare ^= CompareUtils.COMPARE_DAMAGE; + } else if (button == compareNBT) { + compare ^= CompareUtils.COMPARE_NBT; + } + + RefinedStorage.INSTANCE.network.sendToServer(new MessageGridFilterUpdate(compare)); + } +} diff --git a/src/main/java/refinedstorage/gui/GuiHandler.java b/src/main/java/refinedstorage/gui/GuiHandler.java index 87e374ce4..899719eeb 100755 --- a/src/main/java/refinedstorage/gui/GuiHandler.java +++ b/src/main/java/refinedstorage/gui/GuiHandler.java @@ -3,14 +3,15 @@ package refinedstorage.gui; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.common.network.IGuiHandler; import refinedstorage.RefinedStorageGui; -import refinedstorage.RefinedStorageUtils; import refinedstorage.container.*; +import refinedstorage.gui.grid.GuiGrid; import refinedstorage.tile.*; -import refinedstorage.tile.controller.TileController; +import refinedstorage.tile.externalstorage.TileExternalStorage; import refinedstorage.tile.grid.TileGrid; import refinedstorage.tile.grid.WirelessGrid; @@ -18,67 +19,73 @@ public class GuiHandler implements IGuiHandler { private Container getContainer(int ID, EntityPlayer player, TileEntity tile) { switch (ID) { case RefinedStorageGui.CONTROLLER: - return new ContainerController(player); + return new ContainerController((TileController) tile, player); case RefinedStorageGui.GRID: - return new ContainerGrid(player, (TileGrid) tile); + return new ContainerGrid((TileGrid) tile, player); case RefinedStorageGui.DISK_DRIVE: - return new ContainerDiskDrive(player, (TileDiskDrive) tile); + return new ContainerDiskDrive((TileDiskDrive) tile, player); case RefinedStorageGui.IMPORTER: - return new ContainerImporter(player, (TileImporter) tile); + return new ContainerImporter((TileImporter) tile, player); case RefinedStorageGui.EXPORTER: - return new ContainerExporter(player, (TileExporter) tile); + return new ContainerExporter((TileExporter) tile, player); case RefinedStorageGui.DETECTOR: - return new ContainerDetector(player, (TileDetector) tile); + return new ContainerDetector((TileDetector) tile, player); case RefinedStorageGui.SOLDERER: - return new ContainerSolderer(player, (TileSolderer) tile); + return new ContainerSolderer((TileSolderer) tile, player); case RefinedStorageGui.DESTRUCTOR: - return new ContainerDestructor(player, (TileDestructor) tile); + return new ContainerDestructor((TileDestructor) tile, player); case RefinedStorageGui.CONSTRUCTOR: - return new ContainerConstructor(player, (TileConstructor) tile); + return new ContainerConstructor((TileConstructor) tile, player); case RefinedStorageGui.STORAGE: - return new ContainerStorage(player, ((IStorageGui) tile).getFilters()); + return new ContainerStorage((TileStorage) tile, player); + case RefinedStorageGui.EXTERNAL_STORAGE: + return new ContainerExternalStorage((TileExternalStorage) tile, player); case RefinedStorageGui.RELAY: - return new ContainerRelay(player); + return new ContainerRelay((TileRelay) tile, player); case RefinedStorageGui.INTERFACE: - return new ContainerInterface(player, (TileInterface) tile); + return new ContainerInterface((TileInterface) tile, player); case RefinedStorageGui.CRAFTING_MONITOR: - return new ContainerCraftingMonitor(player); + return new ContainerCraftingMonitor((TileCraftingMonitor) tile, player); case RefinedStorageGui.WIRELESS_TRANSMITTER: - return new ContainerWirelessTransmitter(player, (TileWirelessTransmitter) tile); + return new ContainerWirelessTransmitter((TileWirelessTransmitter) tile, player); case RefinedStorageGui.CRAFTER: - return new ContainerCrafter(player, (TileCrafter) tile); + return new ContainerCrafter((TileCrafter) tile, player); case RefinedStorageGui.PROCESSING_PATTERN_ENCODER: - return new ContainerProcessingPatternEncoder(player, (TileProcessingPatternEncoder) tile); + return new ContainerProcessingPatternEncoder((TileProcessingPatternEncoder) tile, player); + case RefinedStorageGui.NETWORK_TRANSMITTER: + return new ContainerNetworkTransmitter((TileNetworkTransmitter) tile, player); + case RefinedStorageGui.FLUID_INTERFACE: + return new ContainerFluidInterface((TileFluidInterface) tile, player); + case RefinedStorageGui.FLUID_STORAGE: + return new ContainerFluidStorage((TileFluidStorage) tile, player); default: return null; } } + private WirelessGrid getWirelessGrid(EntityPlayer player, int hand) { + return new WirelessGrid(player.worldObj, player.getHeldItem(EnumHand.values()[hand])); + } + + private ContainerGrid getWirelessGridContainer(EntityPlayer player, int hand) { + return new ContainerGrid(getWirelessGrid(player, hand), player); + } + + private ContainerGridFilter getGridFilterContainer(EntityPlayer player, int hand) { + return new ContainerGridFilter(player, player.getHeldItem(EnumHand.values()[hand])); + } + @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if (ID == RefinedStorageGui.WIRELESS_GRID) { return getWirelessGridContainer(player, x); + } else if (ID == RefinedStorageGui.GRID_FILTER) { + return getGridFilterContainer(player, x); } return getContainer(ID, player, world.getTileEntity(new BlockPos(x, y, z))); } - private WirelessGrid getWirelessGrid(EntityPlayer player, int hand) { - return new WirelessGrid(player.worldObj, player.getHeldItem(RefinedStorageUtils.getHandById(hand)), RefinedStorageUtils.getHandById(hand)); - } - - private ContainerGrid getWirelessGridContainer(EntityPlayer player, int hand) { - WirelessGrid wirelessGrid = getWirelessGrid(player, hand); - - return new ContainerGrid(player, wirelessGrid); - } - - private GuiGrid getWirelessGridGui(EntityPlayer player, int hand) { - WirelessGrid wirelessGrid = getWirelessGrid(player, hand); - - return new GuiGrid(new ContainerGrid(player, wirelessGrid), wirelessGrid); - } - @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity tile = world.getTileEntity(new BlockPos(x, y, z)); @@ -91,35 +98,51 @@ public class GuiHandler implements IGuiHandler { case RefinedStorageGui.WIRELESS_GRID: return getWirelessGridGui(player, x); case RefinedStorageGui.DISK_DRIVE: - return new GuiStorage((ContainerStorage) getContainer(ID, player, tile), (IStorageGui) tile, "gui/disk_drive.png"); + return new GuiStorage((ContainerDiskDrive) getContainer(ID, player, tile), (IStorageGui) tile, "gui/disk_drive.png"); case RefinedStorageGui.IMPORTER: - return new GuiImporter((ContainerImporter) getContainer(ID, player, tile), (TileImporter) tile); + return new GuiImporter((ContainerImporter) getContainer(ID, player, tile)); case RefinedStorageGui.EXPORTER: - return new GuiExporter((ContainerExporter) getContainer(ID, player, tile), (TileExporter) tile); + return new GuiExporter((ContainerExporter) getContainer(ID, player, tile)); case RefinedStorageGui.DETECTOR: - return new GuiDetector((ContainerDetector) getContainer(ID, player, tile), (TileDetector) tile); + return new GuiDetector((ContainerDetector) getContainer(ID, player, tile)); case RefinedStorageGui.SOLDERER: return new GuiSolderer((ContainerSolderer) getContainer(ID, player, tile), (TileSolderer) tile); case RefinedStorageGui.DESTRUCTOR: - return new GuiDestructor((ContainerDestructor) getContainer(ID, player, tile), (TileDestructor) tile); + return new GuiDestructor((ContainerDestructor) getContainer(ID, player, tile)); case RefinedStorageGui.CONSTRUCTOR: - return new GuiConstructor((ContainerConstructor) getContainer(ID, player, tile), (TileConstructor) tile); + return new GuiConstructor((ContainerConstructor) getContainer(ID, player, tile)); case RefinedStorageGui.STORAGE: - return new GuiStorage((ContainerStorage) getContainer(ID, player, tile), (IStorageGui) tile); + return new GuiStorage((ContainerStorage) getContainer(ID, player, tile), (TileStorage) tile); + case RefinedStorageGui.EXTERNAL_STORAGE: + return new GuiStorage((ContainerExternalStorage) getContainer(ID, player, tile), (TileExternalStorage) tile); case RefinedStorageGui.RELAY: - return new GuiRelay((ContainerRelay) getContainer(ID, player, tile), (TileRelay) tile); + return new GuiRelay((ContainerRelay) getContainer(ID, player, tile)); case RefinedStorageGui.INTERFACE: - return new GuiInterface((ContainerInterface) getContainer(ID, player, tile), (TileInterface) tile); + return new GuiInterface((ContainerInterface) getContainer(ID, player, tile)); case RefinedStorageGui.CRAFTING_MONITOR: return new GuiCraftingMonitor((ContainerCraftingMonitor) getContainer(ID, player, tile), (TileCraftingMonitor) tile); case RefinedStorageGui.WIRELESS_TRANSMITTER: - return new GuiWirelessTransmitter((ContainerWirelessTransmitter) getContainer(ID, player, tile), (TileWirelessTransmitter) tile); + return new GuiWirelessTransmitter((ContainerWirelessTransmitter) getContainer(ID, player, tile)); case RefinedStorageGui.CRAFTER: - return new GuiCrafter((ContainerCrafter) getContainer(ID, player, tile), (TileCrafter) tile); + return new GuiCrafter((ContainerCrafter) getContainer(ID, player, tile)); case RefinedStorageGui.PROCESSING_PATTERN_ENCODER: return new GuiProcessingPatternEncoder((ContainerProcessingPatternEncoder) getContainer(ID, player, tile), (TileProcessingPatternEncoder) tile); + case RefinedStorageGui.GRID_FILTER: + return new GuiGridFilter(getGridFilterContainer(player, x)); + case RefinedStorageGui.NETWORK_TRANSMITTER: + return new GuiNetworkTransmitter((ContainerNetworkTransmitter) getContainer(ID, player, tile), (TileNetworkTransmitter) tile); + case RefinedStorageGui.FLUID_INTERFACE: + return new GuiFluidInterface((ContainerFluidInterface) getContainer(ID, player, tile)); + case RefinedStorageGui.FLUID_STORAGE: + return new GuiStorage((ContainerFluidStorage) getContainer(ID, player, tile), (TileFluidStorage) tile); default: return null; } } + + private GuiGrid getWirelessGridGui(EntityPlayer player, int hand) { + WirelessGrid grid = getWirelessGrid(player, hand); + + return new GuiGrid(new ContainerGrid(grid, player), grid); + } } diff --git a/src/main/java/refinedstorage/gui/GuiImporter.java b/src/main/java/refinedstorage/gui/GuiImporter.java index 7aa5e7a6d..77b1c7c6f 100755 --- a/src/main/java/refinedstorage/gui/GuiImporter.java +++ b/src/main/java/refinedstorage/gui/GuiImporter.java @@ -1,29 +1,28 @@ package refinedstorage.gui; -import refinedstorage.api.storage.CompareFlags; +import refinedstorage.api.storage.CompareUtils; import refinedstorage.container.ContainerImporter; import refinedstorage.gui.sidebutton.SideButtonCompare; import refinedstorage.gui.sidebutton.SideButtonMode; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; +import refinedstorage.gui.sidebutton.SideButtonType; import refinedstorage.tile.TileImporter; public class GuiImporter extends GuiBase { - private TileImporter importer; - - public GuiImporter(ContainerImporter container, TileImporter importer) { + public GuiImporter(ContainerImporter container) { super(container, 211, 137); - - this.importer = importer; } @Override public void init(int x, int y) { - addSideButton(new SideButtonRedstoneMode(importer)); + addSideButton(new SideButtonRedstoneMode(TileImporter.REDSTONE_MODE)); - addSideButton(new SideButtonMode(importer)); + addSideButton(new SideButtonType(TileImporter.TYPE)); - addSideButton(new SideButtonCompare(importer, CompareFlags.COMPARE_DAMAGE)); - addSideButton(new SideButtonCompare(importer, CompareFlags.COMPARE_NBT)); + addSideButton(new SideButtonMode(TileImporter.MODE)); + + addSideButton(new SideButtonCompare(TileImporter.COMPARE, CompareUtils.COMPARE_DAMAGE)); + addSideButton(new SideButtonCompare(TileImporter.COMPARE, CompareUtils.COMPARE_NBT)); } @Override diff --git a/src/main/java/refinedstorage/gui/GuiInterface.java b/src/main/java/refinedstorage/gui/GuiInterface.java index 9a8f9831a..627456013 100755 --- a/src/main/java/refinedstorage/gui/GuiInterface.java +++ b/src/main/java/refinedstorage/gui/GuiInterface.java @@ -1,26 +1,22 @@ package refinedstorage.gui; -import refinedstorage.api.storage.CompareFlags; +import refinedstorage.api.storage.CompareUtils; import refinedstorage.container.ContainerInterface; import refinedstorage.gui.sidebutton.SideButtonCompare; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.tile.TileInterface; public class GuiInterface extends GuiBase { - private TileInterface tile; - - public GuiInterface(ContainerInterface container, TileInterface tile) { + public GuiInterface(ContainerInterface container) { super(container, 211, 217); - - this.tile = tile; } @Override public void init(int x, int y) { - addSideButton(new SideButtonRedstoneMode(tile)); + addSideButton(new SideButtonRedstoneMode(TileInterface.REDSTONE_MODE)); - addSideButton(new SideButtonCompare(tile, CompareFlags.COMPARE_DAMAGE)); - addSideButton(new SideButtonCompare(tile, CompareFlags.COMPARE_NBT)); + addSideButton(new SideButtonCompare(TileInterface.COMPARE, CompareUtils.COMPARE_DAMAGE)); + addSideButton(new SideButtonCompare(TileInterface.COMPARE, CompareUtils.COMPARE_NBT)); } @Override diff --git a/src/main/java/refinedstorage/gui/GuiNetworkTransmitter.java b/src/main/java/refinedstorage/gui/GuiNetworkTransmitter.java new file mode 100755 index 000000000..111343e9b --- /dev/null +++ b/src/main/java/refinedstorage/gui/GuiNetworkTransmitter.java @@ -0,0 +1,51 @@ +package refinedstorage.gui; + +import refinedstorage.container.ContainerNetworkTransmitter; +import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; +import refinedstorage.tile.TileNetworkTransmitter; + +public class GuiNetworkTransmitter extends GuiBase { + private TileNetworkTransmitter networkTransmitter; + + public GuiNetworkTransmitter(ContainerNetworkTransmitter container, TileNetworkTransmitter networkTransmitter) { + super(container, 210, 137); + + this.networkTransmitter = networkTransmitter; + } + + @Override + public void init(int x, int y) { + addSideButton(new SideButtonRedstoneMode(TileNetworkTransmitter.REDSTONE_MODE)); + } + + @Override + public void update(int x, int y) { + } + + @Override + public void drawBackground(int x, int y, int mouseX, int mouseY) { + bindTexture("gui/network_transmitter.png"); + + drawTexture(x, y, 0, 0, width, height); + } + + @Override + public void drawForeground(int mouseX, int mouseY) { + drawString(7, 7, t("gui.refinedstorage:network_transmitter")); + + String distance; + + if (networkTransmitter.getNetworkCard().getStackInSlot(0) == null) { + distance = t("gui.refinedstorage:network_transmitter.missing_card"); + } else if (!TileNetworkTransmitter.RECEIVER_DIMENSION_SUPPORTED.getValue()) { + distance = t("gui.refinedstorage:network_transmitter.missing_upgrade"); + } else if (TileNetworkTransmitter.RECEIVER_DIMENSION.getValue() != networkTransmitter.getWorld().provider.getDimension()) { + distance = t("gui.refinedstorage:network_transmitter.dimension", TileNetworkTransmitter.RECEIVER_DIMENSION.getValue()); + } else { + distance = t("gui.refinedstorage:network_transmitter.distance", TileNetworkTransmitter.DISTANCE.getValue()); + } + + drawString(51, 24, distance); + drawString(7, 42, t("container.inventory")); + } +} \ No newline at end of file diff --git a/src/main/java/refinedstorage/gui/GuiRelay.java b/src/main/java/refinedstorage/gui/GuiRelay.java index b50810d9b..604d4f506 100755 --- a/src/main/java/refinedstorage/gui/GuiRelay.java +++ b/src/main/java/refinedstorage/gui/GuiRelay.java @@ -5,17 +5,13 @@ import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.tile.TileRelay; public class GuiRelay extends GuiBase { - private TileRelay relay; - - public GuiRelay(ContainerRelay container, TileRelay relay) { + public GuiRelay(ContainerRelay container) { super(container, 176, 131); - - this.relay = relay; } @Override public void init(int x, int y) { - addSideButton(new SideButtonRedstoneMode(relay)); + addSideButton(new SideButtonRedstoneMode(TileRelay.REDSTONE_MODE)); } @Override diff --git a/src/main/java/refinedstorage/gui/GuiSolderer.java b/src/main/java/refinedstorage/gui/GuiSolderer.java index 8b63e7477..1dfe957f2 100755 --- a/src/main/java/refinedstorage/gui/GuiSolderer.java +++ b/src/main/java/refinedstorage/gui/GuiSolderer.java @@ -15,7 +15,7 @@ public class GuiSolderer extends GuiBase { @Override public void init(int x, int y) { - addSideButton(new SideButtonRedstoneMode(solderer)); + addSideButton(new SideButtonRedstoneMode(TileSolderer.REDSTONE_MODE)); } @Override @@ -29,7 +29,7 @@ public class GuiSolderer extends GuiBase { drawTexture(x, y, 0, 0, width, height); if (solderer.isWorking()) { - drawTexture(x + 83, y + 38 - 1, 212, 0, solderer.getProgressScaled(22), 15); + drawTexture(x + 83, y + 38 - 1, 212, 0, getProgressScaled(22), 15); } } @@ -39,7 +39,18 @@ public class GuiSolderer extends GuiBase { drawString(7, 77, t("container.inventory")); if (inBounds(83, 38, 22, 15, mouseX, mouseY) && solderer.isWorking()) { - drawTooltip(mouseX, mouseY, t("gui.refinedstorage:solderer.progress", solderer.getProgressScaled(100))); + drawTooltip(mouseX, mouseY, t("gui.refinedstorage:solderer.progress", getProgressScaled(100))); } } + + private int getProgressScaled(int scale) { + float progress = TileSolderer.PROGRESS.getValue(); + float duration = TileSolderer.DURATION.getValue(); + + if (progress > duration) { + return scale; + } + + return (int) (progress / duration * (float) scale); + } } diff --git a/src/main/java/refinedstorage/gui/GuiStorage.java b/src/main/java/refinedstorage/gui/GuiStorage.java index cf996419d..631da0bb7 100755 --- a/src/main/java/refinedstorage/gui/GuiStorage.java +++ b/src/main/java/refinedstorage/gui/GuiStorage.java @@ -2,12 +2,14 @@ package refinedstorage.gui; import com.google.common.primitives.Ints; import net.minecraft.client.gui.GuiTextField; -import refinedstorage.api.storage.CompareFlags; -import refinedstorage.container.ContainerStorage; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.container.ContainerBase; import refinedstorage.gui.sidebutton.SideButtonCompare; import refinedstorage.gui.sidebutton.SideButtonMode; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; +import refinedstorage.gui.sidebutton.SideButtonType; import refinedstorage.tile.IStorageGui; +import refinedstorage.tile.data.TileDataManager; import java.io.IOException; @@ -22,39 +24,44 @@ public class GuiStorage extends GuiBase { private int barWidth = 16; private int barHeight = 58; - public GuiStorage(ContainerStorage container, IStorageGui gui, String texture) { + public GuiStorage(ContainerBase container, IStorageGui gui, String texture) { super(container, 176, 211); this.gui = gui; this.texture = texture; } - public GuiStorage(ContainerStorage container, IStorageGui gui) { + public GuiStorage(ContainerBase container, IStorageGui gui) { this(container, gui, "gui/storage.png"); } @Override public void init(int x, int y) { - if (gui.getRedstoneModeConfig() != null) { - addSideButton(new SideButtonRedstoneMode(gui.getRedstoneModeConfig())); + if (gui.getRedstoneModeParameter() != null) { + addSideButton(new SideButtonRedstoneMode(gui.getRedstoneModeParameter())); } - if (gui.getModeConfig() != null) { - addSideButton(new SideButtonMode(gui.getModeConfig())); + if (gui.getTypeParameter() != null) { + addSideButton(new SideButtonType(gui.getTypeParameter())); } - if (gui.getCompareConfig() != null) { - addSideButton(new SideButtonCompare(gui.getCompareConfig(), CompareFlags.COMPARE_DAMAGE)); - addSideButton(new SideButtonCompare(gui.getCompareConfig(), CompareFlags.COMPARE_NBT)); + if (gui.getFilterParameter() != null) { + addSideButton(new SideButtonMode(gui.getFilterParameter())); } - priorityField = new GuiTextField(0, fontRendererObj, x + 98 + 1, y + 54 + 1, 25, fontRendererObj.FONT_HEIGHT); - priorityField.setText(String.valueOf(gui.getPriority())); + if (gui.getCompareParameter() != null) { + addSideButton(new SideButtonCompare(gui.getCompareParameter(), CompareUtils.COMPARE_DAMAGE)); + addSideButton(new SideButtonCompare(gui.getCompareParameter(), CompareUtils.COMPARE_NBT)); + } + + priorityField = new GuiTextField(0, fontRendererObj, x + 98 + 1, y + 54 + 1, 29, fontRendererObj.FONT_HEIGHT); priorityField.setEnableBackgroundDrawing(false); priorityField.setVisible(true); priorityField.setTextColor(16777215); priorityField.setCanLoseFocus(true); priorityField.setFocused(false); + + updatePriority(gui.getPriorityParameter().getValue()); } @Override @@ -101,14 +108,22 @@ public class GuiStorage extends GuiBase { @Override protected void keyTyped(char character, int keyCode) throws IOException { - if (!checkHotbarKeys(keyCode) && priorityField.textboxKeyTyped(character, keyCode)) { + if (checkHotbarKeys(keyCode)) { + // NO OP + } else if (priorityField.textboxKeyTyped(character, keyCode)) { Integer result = Ints.tryParse(priorityField.getText()); if (result != null) { - gui.onPriorityChanged(result); + TileDataManager.setParameter(gui.getPriorityParameter(), result); } } else { super.keyTyped(character, keyCode); } } + + public void updatePriority(int priority) { + if (priorityField != null) { + priorityField.setText(String.valueOf(priority)); + } + } } diff --git a/src/main/java/refinedstorage/gui/GuiWirelessTransmitter.java b/src/main/java/refinedstorage/gui/GuiWirelessTransmitter.java index b64fcca8c..2b2dab4f7 100755 --- a/src/main/java/refinedstorage/gui/GuiWirelessTransmitter.java +++ b/src/main/java/refinedstorage/gui/GuiWirelessTransmitter.java @@ -5,17 +5,13 @@ import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.tile.TileWirelessTransmitter; public class GuiWirelessTransmitter extends GuiBase { - private TileWirelessTransmitter wirelessTransmitter; - - public GuiWirelessTransmitter(ContainerWirelessTransmitter container, TileWirelessTransmitter wirelessTransmitter) { + public GuiWirelessTransmitter(ContainerWirelessTransmitter container) { super(container, 211, 137); - - this.wirelessTransmitter = wirelessTransmitter; } @Override public void init(int x, int y) { - addSideButton(new SideButtonRedstoneMode(wirelessTransmitter)); + addSideButton(new SideButtonRedstoneMode(TileWirelessTransmitter.REDSTONE_MODE)); } @Override @@ -32,7 +28,7 @@ public class GuiWirelessTransmitter extends GuiBase { @Override public void drawForeground(int mouseX, int mouseY) { drawString(7, 7, t("gui.refinedstorage:wireless_transmitter")); - drawString(28, 25, t("gui.refinedstorage:wireless_transmitter.distance", wirelessTransmitter.getRange())); + drawString(28, 25, t("gui.refinedstorage:wireless_transmitter.distance", TileWirelessTransmitter.RANGE.getValue())); drawString(7, 43, t("container.inventory")); } } diff --git a/src/main/java/refinedstorage/gui/Scrollbar.java b/src/main/java/refinedstorage/gui/Scrollbar.java index f1fed1e0c..b82fa0f87 100755 --- a/src/main/java/refinedstorage/gui/Scrollbar.java +++ b/src/main/java/refinedstorage/gui/Scrollbar.java @@ -3,80 +3,56 @@ package refinedstorage.gui; import org.lwjgl.input.Mouse; public class Scrollbar { - private boolean canScroll = true; + private static final int SCROLLER_HEIGHT = 15; private int x; private int y; - private int scrollbarWidth; - private int scrollbarHeight; + private int width; + private int height; + private boolean enabled = false; - private float scrollDelta = 15f; + private int offset; + private int maxOffset; - private float currentScroll; private boolean wasClicking = false; private boolean isScrolling = false; - public Scrollbar(int x, int y, int scrollbarWidth, int scrollbarHeight) { + public Scrollbar(int x, int y, int width, int height) { this.x = x; this.y = y; - this.scrollbarWidth = scrollbarWidth; - this.scrollbarHeight = scrollbarHeight; + this.width = width; + this.height = height; } - public int getScrollbarWidth() { - return scrollbarWidth; + public int getWidth() { + return width; } - public int getScrollbarHeight() { - return scrollbarHeight; + public int getHeight() { + return height; } - public void setCanScroll(boolean canScroll) { - this.canScroll = canScroll; + public void setEnabled(boolean enabled) { + this.enabled = enabled; } - public boolean canScroll() { - return canScroll; - } - - public float getCurrentScroll() { - return currentScroll; - } - - public void setCurrentScroll(float newCurrentScroll) { - if (newCurrentScroll < 0) { - newCurrentScroll = 0; - } - - int scrollbarItselfHeight = 12; - - int max = scrollbarHeight - scrollbarItselfHeight - 3; - - if (newCurrentScroll > max) { - newCurrentScroll = max; - } - - currentScroll = newCurrentScroll; - } - - public void setScrollDelta(float delta) { - this.scrollDelta = delta; + public boolean isEnabled() { + return enabled; } public void draw(GuiBase gui) { gui.bindTexture("icons.png"); - gui.drawTexture(gui.getGuiLeft() + x, gui.getGuiTop() + y + (int) currentScroll, canScroll() ? 232 : 244, 0, 12, 15); + gui.drawTexture(gui.getGuiLeft() + x, gui.getGuiTop() + y + (int) Math.min(height - SCROLLER_HEIGHT, (float) offset / (float) maxOffset * (float) (height - SCROLLER_HEIGHT)), isEnabled() ? 232 : 244, 0, 12, 15); } public void update(GuiBase gui, int mouseX, int mouseY) { - if (!canScroll()) { + if (!isEnabled()) { isScrolling = false; wasClicking = false; - currentScroll = 0; } else { boolean down = Mouse.isButtonDown(0); - if (!wasClicking && down && gui.inBounds(x, y, scrollbarWidth, scrollbarHeight, mouseX, mouseY)) { + if (!wasClicking && down && gui.inBounds(x, y, width, height, mouseX, mouseY)) { isScrolling = true; } @@ -87,20 +63,32 @@ public class Scrollbar { wasClicking = down; if (isScrolling) { - setCurrentScroll(mouseY - 20); + setOffset((int) Math.floor((float) (mouseY - SCROLLER_HEIGHT) / (float) (height - SCROLLER_HEIGHT) * (float) maxOffset)); } } } public void wheel(int delta) { - if (canScroll()) { - delta = Math.max(Math.min(-delta, 1), -1); + if (isEnabled()) { + setOffset(offset + Math.max(Math.min(-delta, 1), -1)); + } + } - if (delta == -1) { - setCurrentScroll(currentScroll - scrollDelta); - } else if (delta == 1) { - setCurrentScroll(currentScroll + scrollDelta); - } + public void setMaxOffset(int maxOffset) { + this.maxOffset = maxOffset; + + if (offset > maxOffset) { + this.offset = Math.max(0, maxOffset); + } + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + if (offset >= 0 && offset <= maxOffset) { + this.offset = offset; } } } diff --git a/src/main/java/refinedstorage/gui/grid/GridFilteredItem.java b/src/main/java/refinedstorage/gui/grid/GridFilteredItem.java new file mode 100755 index 000000000..3e3505850 --- /dev/null +++ b/src/main/java/refinedstorage/gui/grid/GridFilteredItem.java @@ -0,0 +1,21 @@ +package refinedstorage.gui.grid; + +import net.minecraft.item.ItemStack; + +public class GridFilteredItem { + private ItemStack stack; + private int compare; + + public GridFilteredItem(ItemStack stack, int compare) { + this.stack = stack; + this.compare = compare; + } + + public ItemStack getStack() { + return stack; + } + + public int getCompare() { + return compare; + } +} diff --git a/src/main/java/refinedstorage/gui/GuiCraftingSettings.java b/src/main/java/refinedstorage/gui/grid/GuiCraftingSettings.java similarity index 89% rename from src/main/java/refinedstorage/gui/GuiCraftingSettings.java rename to src/main/java/refinedstorage/gui/grid/GuiCraftingSettings.java index 634d9369c..3638645d0 100755 --- a/src/main/java/refinedstorage/gui/GuiCraftingSettings.java +++ b/src/main/java/refinedstorage/gui/grid/GuiCraftingSettings.java @@ -1,4 +1,4 @@ -package refinedstorage.gui; +package refinedstorage.gui.grid; import com.google.common.primitives.Ints; import net.minecraft.client.gui.GuiButton; @@ -7,9 +7,10 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.fml.client.FMLClientHandler; import org.lwjgl.input.Keyboard; import refinedstorage.RefinedStorage; -import refinedstorage.apiimpl.network.GridHandler; -import refinedstorage.apiimpl.storage.ClientStack; +import refinedstorage.apiimpl.network.grid.ItemGridHandler; import refinedstorage.container.ContainerCraftingSettings; +import refinedstorage.gui.GuiBase; +import refinedstorage.gui.grid.stack.ClientStackItem; import refinedstorage.network.MessageGridCraftingStart; import java.io.IOException; @@ -19,12 +20,12 @@ public class GuiCraftingSettings extends GuiBase { private GuiTextField amountField; private GuiGrid gui; - private ClientStack stack; + private ClientStackItem stack; private GuiButton startButton; private GuiButton cancelButton; private GuiButton[] incrementButtons = new GuiButton[6]; - public GuiCraftingSettings(GuiGrid gui, EntityPlayer player, ClientStack stack) { + public GuiCraftingSettings(GuiGrid gui, EntityPlayer player, ClientStackItem stack) { super(new ContainerCraftingSettings(player, stack.getStack()), 172, 99); this.gui = gui; @@ -110,7 +111,7 @@ public class GuiCraftingSettings extends GuiBase { int newAmount = Integer.parseInt(incrementButton.displayString); - newAmount = Math.min(Math.max(DEFAULT_AMOUNT, oldAmount + newAmount), GridHandler.MAX_CRAFTING_PER_REQUEST); + newAmount = Math.min(Math.max(DEFAULT_AMOUNT, oldAmount + newAmount), ItemGridHandler.MAX_CRAFTING_PER_REQUEST); amountField.setText(String.valueOf(newAmount)); @@ -123,8 +124,8 @@ public class GuiCraftingSettings extends GuiBase { private void startRequest() { Integer quantity = Ints.tryParse(amountField.getText()); - if (quantity != null && quantity > 0 && quantity <= GridHandler.MAX_CRAFTING_PER_REQUEST) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageGridCraftingStart(stack.getId(), quantity)); + if (quantity != null && quantity > 0 && quantity <= ItemGridHandler.MAX_CRAFTING_PER_REQUEST) { + RefinedStorage.INSTANCE.network.sendToServer(new MessageGridCraftingStart(stack.getHash(), quantity)); close(); } diff --git a/src/main/java/refinedstorage/gui/GuiGrid.java b/src/main/java/refinedstorage/gui/grid/GuiGrid.java similarity index 51% rename from src/main/java/refinedstorage/gui/GuiGrid.java rename to src/main/java/refinedstorage/gui/grid/GuiGrid.java index 5b904435a..066c1495f 100755 --- a/src/main/java/refinedstorage/gui/GuiGrid.java +++ b/src/main/java/refinedstorage/gui/grid/GuiGrid.java @@ -1,5 +1,8 @@ -package refinedstorage.gui; +package refinedstorage.gui.grid; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Multimaps; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiTextField; @@ -9,76 +12,58 @@ import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fml.common.FMLCommonHandler; -import org.apache.commons.lang3.StringUtils; import refinedstorage.RefinedStorage; -import refinedstorage.api.network.GridExtractFlags; -import refinedstorage.apiimpl.storage.ClientStack; +import refinedstorage.api.network.grid.IItemGridHandler; +import refinedstorage.api.storage.CompareUtils; import refinedstorage.block.EnumGridType; import refinedstorage.container.ContainerGrid; -import refinedstorage.gui.sidebutton.SideButtonGridSearchBoxMode; -import refinedstorage.gui.sidebutton.SideButtonGridSortingDirection; -import refinedstorage.gui.sidebutton.SideButtonGridSortingType; -import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; -import refinedstorage.jei.RefinedStorageJEIPlugin; -import refinedstorage.network.MessageGridCraftingClear; -import refinedstorage.network.MessageGridInsertHeld; -import refinedstorage.network.MessageGridPatternCreate; -import refinedstorage.network.MessageGridPull; +import refinedstorage.gui.GuiBase; +import refinedstorage.gui.Scrollbar; +import refinedstorage.gui.grid.sorting.GridSortingName; +import refinedstorage.gui.grid.sorting.GridSortingQuantity; +import refinedstorage.gui.grid.stack.ClientStackFluid; +import refinedstorage.gui.grid.stack.ClientStackItem; +import refinedstorage.gui.grid.stack.IClientStack; +import refinedstorage.gui.sidebutton.*; +import refinedstorage.integration.jei.IntegrationJEI; +import refinedstorage.network.*; import refinedstorage.tile.grid.IGrid; import refinedstorage.tile.grid.TileGrid; -import refinedstorage.tile.grid.WirelessGrid; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; public class GuiGrid extends GuiBase { - private Comparator quantityComparator = new Comparator() { - @Override - public int compare(ClientStack left, ClientStack right) { - int leftSize = left.getStack().stackSize; - int rightSize = right.getStack().stackSize; + public static final GridSortingQuantity SORTING_QUANTITY = new GridSortingQuantity(); + public static final GridSortingName SORTING_NAME = new GridSortingName(); - if (leftSize == rightSize) { - return 0; - } + public static final ListMultimap ITEMS = Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); + public static final ListMultimap FLUIDS = Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); - if (grid.getSortingDirection() == TileGrid.SORTING_DIRECTION_ASCENDING) { - return (leftSize > rightSize) ? 1 : -1; - } else if (grid.getSortingDirection() == TileGrid.SORTING_DIRECTION_DESCENDING) { - return (rightSize > leftSize) ? 1 : -1; - } + public static List STACKS = new ArrayList<>(); - return 0; - } - }; - - private Comparator nameComparator = new Comparator() { - @Override - public int compare(ClientStack left, ClientStack right) { - if (grid.getSortingDirection() == TileGrid.SORTING_DIRECTION_ASCENDING) { - return left.getStack().getDisplayName().compareTo(right.getStack().getDisplayName()); - } else if (grid.getSortingDirection() == TileGrid.SORTING_DIRECTION_DESCENDING) { - return right.getStack().getDisplayName().compareTo(left.getStack().getDisplayName()); - } - - return 0; - } - }; + private static boolean markedForSorting; private GuiTextField searchField; private ContainerGrid container; - private List items = new ArrayList(); private IGrid grid; private int slotNumber; - public GuiGrid(ContainerGrid container, IGrid grid) { - super(container, 193, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 247 : 208); + public static void markForSorting() { + markedForSorting = true; + } - setScrollbar(new Scrollbar(174, 20, 12, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 70 : 88)); - getScrollbar().setCanScroll(false); + public GuiGrid(ContainerGrid container, IGrid grid) { + super(container, grid.getType() == EnumGridType.FLUID ? 193 : 227, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 247 : 208); + + setScrollbar(new Scrollbar(174, 20, 12, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN || grid.getType() == EnumGridType.FLUID) ? 70 : 88)); this.container = container; this.grid = grid; @@ -99,95 +84,129 @@ public class GuiGrid extends GuiBase { searchField.setVisible(true); searchField.setTextColor(16777215); - updateSearchBoxFocus(grid.getSearchBoxMode()); + updateSearchFieldFocus(grid.getSearchBoxMode()); } else { searchField.xPosition = sx; searchField.yPosition = sy; } + if (grid.getType() != EnumGridType.FLUID) { + addSideButton(new SideButtonGridViewType(grid)); + } + addSideButton(new SideButtonGridSortingDirection(grid)); addSideButton(new SideButtonGridSortingType(grid)); addSideButton(new SideButtonGridSearchBoxMode(this)); + + sortItems(); } public IGrid getGrid() { return grid; } - @Override - public void update(int x, int y) { - items.clear(); + private void sortItems() { + List stacks = new ArrayList<>(); if (grid.isConnected()) { - items.addAll(RefinedStorage.INSTANCE.items); + stacks.addAll(grid.getType() == EnumGridType.FLUID ? FLUIDS.values() : ITEMS.values()); String query = searchField.getText().trim().toLowerCase(); - if (!query.isEmpty()) { - Iterator t = items.iterator(); + Iterator t = stacks.iterator(); - while (t.hasNext()) { - ItemStack item = t.next().getStack(); + while (t.hasNext()) { + IClientStack stack = t.next(); - if (query.startsWith("@")) { - String[] parts = query.split(" "); + if (grid.getType() != EnumGridType.FLUID) { + List filteredItems = grid.getFilteredItems(); - String modId = parts[0].substring(1); - String modIdFromItem = Item.REGISTRY.getNameForObject(item.getItem()).getResourceDomain(); + boolean found = filteredItems.isEmpty(); - if (!modIdFromItem.contains(modId)) { - t.remove(); - } else if (parts.length >= 2) { - StringBuilder itemFromMod = new StringBuilder(); + for (GridFilteredItem filteredItem : filteredItems) { + if (CompareUtils.compareStack(((ClientStackItem) stack).getStack(), filteredItem.getStack(), filteredItem.getCompare())) { + found = true; - for (int i = 1; i < parts.length; ++i) { - itemFromMod.append(parts[i]); - - if (i != parts.length - 1) { - itemFromMod.append(" "); - } - } - - if (!item.getDisplayName().toLowerCase().contains(itemFromMod.toString())) { - t.remove(); - } + break; } - } else if (query.startsWith("#")) { - String tooltip = query.substring(1); - String tooltipFromItem = StringUtils.join(item.getTooltip(container.getPlayer(), true), "\n"); - - if (!tooltipFromItem.contains(tooltip)) { - t.remove(); - } - } else if (!item.getDisplayName().toLowerCase().contains(query)) { - t.remove(); } + + if (!found) { + t.remove(); + + continue; + } + + if (grid.getViewType() == TileGrid.VIEW_TYPE_NON_CRAFTABLES && ((ClientStackItem) stack).isCraftable()) { + t.remove(); + + continue; + } else if (grid.getViewType() == TileGrid.VIEW_TYPE_CRAFTABLES && !((ClientStackItem) stack).isCraftable()) { + t.remove(); + + continue; + } + } + + if (query.startsWith("@")) { + String[] parts = query.split(" "); + + String modId = parts[0].substring(1); + String modIdFromItem = stack.getModId(); + + if (!modIdFromItem.contains(modId)) { + t.remove(); + } else if (parts.length >= 2) { + StringBuilder itemFromMod = new StringBuilder(); + + for (int i = 1; i < parts.length; ++i) { + itemFromMod.append(parts[i]); + + if (i != parts.length - 1) { + itemFromMod.append(" "); + } + } + + if (!stack.getName().toLowerCase().contains(itemFromMod.toString())) { + t.remove(); + } + } + } else if (!stack.getName().toLowerCase().contains(query)) { + t.remove(); } } - Collections.sort(items, nameComparator); + SORTING_NAME.setSortingDirection(grid.getSortingDirection()); + SORTING_QUANTITY.setSortingDirection(grid.getSortingDirection()); + + Collections.sort(stacks, SORTING_NAME); if (grid.getSortingType() == TileGrid.SORTING_TYPE_QUANTITY) { - Collections.sort(items, quantityComparator); + Collections.sort(stacks, SORTING_QUANTITY); } } - getScrollbar().setCanScroll(getRows() > getVisibleRows()); - getScrollbar().setScrollDelta((float) getScrollbar().getScrollbarHeight() / (float) getRows()); + STACKS = stacks; + + getScrollbar().setEnabled(getRows() > getVisibleRows()); + getScrollbar().setMaxOffset(getRows() - getVisibleRows()); } - private int getOffset() { - return (int) Math.ceil(getScrollbar().getCurrentScroll() / 70f * (float) getRows()); + @Override + public void update(int x, int y) { + if (markedForSorting) { + markedForSorting = false; + + sortItems(); + } } private int getRows() { - int max = (int) Math.ceil((float) items.size() / 9f); - - return max < 0 ? 0 : max; + return Math.max(0, (int) Math.ceil((float) STACKS.size() / 9F)); } private boolean isOverSlotWithItem() { - return grid.isConnected() && isOverSlot() && slotNumber < items.size(); + return grid.isConnected() && isOverSlot() && slotNumber < STACKS.size(); } private boolean isOverSlot() { @@ -240,7 +259,7 @@ public class GuiGrid extends GuiBase { ty = 2; } - drawTexture(x + 152, y + 114, 195, ty * 16, 16, 16); + drawTexture(x + 152, y + 114, 240, ty * 16, 16, 16); } searchField.drawTextBox(); @@ -248,7 +267,7 @@ public class GuiGrid extends GuiBase { @Override public void drawForeground(int mouseX, int mouseY) { - drawString(7, 7, t(grid instanceof WirelessGrid ? "gui.refinedstorage:wireless_grid" : "gui.refinedstorage:grid")); + drawString(7, 7, t(grid.getGuiTitle())); drawString(7, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 153 : 114, t("container.inventory")); int x = 8; @@ -256,7 +275,7 @@ public class GuiGrid extends GuiBase { this.slotNumber = -1; - int slot = getOffset() * 9; + int slot = getScrollbar().getOffset() * 9; RenderHelper.enableGUIStandardItemLighting(); @@ -265,8 +284,8 @@ public class GuiGrid extends GuiBase { this.slotNumber = slot; } - if (slot < items.size()) { - drawItem(x, y, items.get(slot).getStack(), true, formatQuantity(items.get(slot).getStack().stackSize, slot)); + if (slot < STACKS.size()) { + STACKS.get(slot).draw(this, x, y, GuiScreen.isShiftKeyDown() && slotNumber == slot); } if (inBounds(x, y, 16, 16, mouseX, mouseY) || !grid.isConnected()) { @@ -294,7 +313,7 @@ public class GuiGrid extends GuiBase { } if (isOverSlotWithItem()) { - drawTooltip(mouseX, mouseY, items.get(slotNumber).getStack()); + drawTooltip(mouseX, mouseY, STACKS.get(slotNumber).getTooltip()); } if (isOverClear(mouseX, mouseY)) { @@ -306,24 +325,6 @@ public class GuiGrid extends GuiBase { } } - private String formatQuantity(int qty, int slot) { - if (slotNumber == slot && GuiScreen.isShiftKeyDown() && qty > 1) { - return String.valueOf(qty); - } - - if (qty >= 1000000) { - return String.format(Locale.US, "%.1f", (float) qty / 1000000).replace(".0", "") + "M"; - } else if (qty >= 1000) { - return String.format(Locale.US, "%.1f", (float) qty / 1000).replace(".0", "") + "K"; - } else if (qty == 1) { - return null; - } else if (qty == 0) { - return t("gui.refinedstorage:grid.craft"); - } else { - return String.valueOf(qty); - } - } - @Override public void mouseClicked(int mouseX, int mouseY, int clickedButton) throws IOException { super.mouseClicked(mouseX, mouseY, clickedButton); @@ -334,6 +335,8 @@ public class GuiGrid extends GuiBase { searchField.setText(""); searchField.setFocused(true); + sortItems(); + updateJEI(); } @@ -352,28 +355,34 @@ public class GuiGrid extends GuiBase { ItemStack held = container.getPlayer().inventory.getItemStack(); if (isOverSlotArea(mouseX - guiLeft, mouseY - guiTop) && held != null && (clickedButton == 0 || clickedButton == 1)) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageGridInsertHeld(clickedButton == 1)); + RefinedStorage.INSTANCE.network.sendToServer(grid.getType() == EnumGridType.FLUID ? new MessageGridFluidInsertHeld() : new MessageGridItemInsertHeld(clickedButton == 1)); } - if (isOverSlotWithItem() && (held == null || (held != null && clickedButton == 2))) { - if (items.get(slotNumber).isCraftable() && (items.get(slotNumber).getStack().stackSize == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) { - FMLCommonHandler.instance().showGuiScreen(new GuiCraftingSettings(this, container.getPlayer(), items.get(slotNumber))); - } else { - int flags = 0; + if (isOverSlotWithItem()) { + if (grid.getType() != EnumGridType.FLUID && (held == null || (held != null && clickedButton == 2))) { + ClientStackItem stack = (ClientStackItem) STACKS.get(slotNumber); - if (clickedButton == 1) { - flags |= GridExtractFlags.EXTRACT_HALF; + if (stack.isCraftable() && (stack.getQuantity() == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) { + FMLCommonHandler.instance().showGuiScreen(new GuiCraftingSettings(this, container.getPlayer(), stack)); + } else { + int flags = 0; + + if (clickedButton == 1) { + flags |= IItemGridHandler.EXTRACT_HALF; + } + + if (GuiScreen.isShiftKeyDown()) { + flags |= IItemGridHandler.EXTRACT_SHIFT; + } + + if (clickedButton == 2) { + flags |= IItemGridHandler.EXTRACT_SINGLE; + } + + RefinedStorage.INSTANCE.network.sendToServer(new MessageGridItemPull(stack.getHash(), flags)); } - - if (GuiScreen.isShiftKeyDown()) { - flags |= GridExtractFlags.EXTRACT_SHIFT; - } - - if (clickedButton == 2) { - flags |= GridExtractFlags.EXTRACT_SINGLE; - } - - RefinedStorage.INSTANCE.network.sendToServer(new MessageGridPull(items.get(slotNumber).getId(), flags)); + } else if (grid.getType() == EnumGridType.FLUID && held == null) { + RefinedStorage.INSTANCE.network.sendToServer(new MessageGridFluidPull(STACKS.get(slotNumber).getHash(), GuiScreen.isShiftKeyDown())); } } } @@ -385,21 +394,27 @@ public class GuiGrid extends GuiBase { @Override protected void keyTyped(char character, int keyCode) throws IOException { - if (!checkHotbarKeys(keyCode) && searchField.textboxKeyTyped(character, keyCode)) { + if (checkHotbarKeys(keyCode)) { + // NO OP + } else if (searchField.textboxKeyTyped(character, keyCode)) { updateJEI(); + + sortItems(); } else { super.keyTyped(character, keyCode); } } private void updateJEI() { - if (RefinedStorage.hasJei() && (grid.getSearchBoxMode() == TileGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED || grid.getSearchBoxMode() == TileGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED_AUTOSELECTED)) { - RefinedStorageJEIPlugin.INSTANCE.getRuntime().getItemListOverlay().setFilterText(searchField.getText()); + if (IntegrationJEI.isLoaded() && (grid.getSearchBoxMode() == TileGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED || grid.getSearchBoxMode() == TileGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED_AUTOSELECTED)) { + IntegrationJEI.INSTANCE.getRuntime().getItemListOverlay().setFilterText(searchField.getText()); } } - public void updateSearchBoxFocus(int mode) { - searchField.setCanLoseFocus(!TileGrid.isSearchBoxModeWithAutoselection(mode)); - searchField.setFocused(TileGrid.isSearchBoxModeWithAutoselection(mode)); + public void updateSearchFieldFocus(int mode) { + if (searchField != null) { + searchField.setCanLoseFocus(!TileGrid.isSearchBoxModeWithAutoselection(mode)); + searchField.setFocused(TileGrid.isSearchBoxModeWithAutoselection(mode)); + } } } diff --git a/src/main/java/refinedstorage/gui/grid/sorting/GridSorting.java b/src/main/java/refinedstorage/gui/grid/sorting/GridSorting.java new file mode 100755 index 000000000..b67451fe3 --- /dev/null +++ b/src/main/java/refinedstorage/gui/grid/sorting/GridSorting.java @@ -0,0 +1,13 @@ +package refinedstorage.gui.grid.sorting; + +import refinedstorage.gui.grid.stack.IClientStack; + +import java.util.Comparator; + +public abstract class GridSorting implements Comparator { + protected int sortingDirection; + + public void setSortingDirection(int sortingDirection) { + this.sortingDirection = sortingDirection; + } +} diff --git a/src/main/java/refinedstorage/gui/grid/sorting/GridSortingName.java b/src/main/java/refinedstorage/gui/grid/sorting/GridSortingName.java new file mode 100755 index 000000000..c61701d55 --- /dev/null +++ b/src/main/java/refinedstorage/gui/grid/sorting/GridSortingName.java @@ -0,0 +1,20 @@ +package refinedstorage.gui.grid.sorting; + +import refinedstorage.gui.grid.stack.IClientStack; +import refinedstorage.tile.grid.TileGrid; + +public class GridSortingName extends GridSorting { + @Override + public int compare(IClientStack left, IClientStack right) { + String leftName = left.getName(); + String rightName = right.getName(); + + if (sortingDirection == TileGrid.SORTING_DIRECTION_ASCENDING) { + return leftName.compareTo(rightName); + } else if (sortingDirection == TileGrid.SORTING_DIRECTION_DESCENDING) { + return rightName.compareTo(leftName); + } + + return 0; + } +} diff --git a/src/main/java/refinedstorage/gui/grid/sorting/GridSortingQuantity.java b/src/main/java/refinedstorage/gui/grid/sorting/GridSortingQuantity.java new file mode 100755 index 000000000..d4b51b287 --- /dev/null +++ b/src/main/java/refinedstorage/gui/grid/sorting/GridSortingQuantity.java @@ -0,0 +1,22 @@ +package refinedstorage.gui.grid.sorting; + +import refinedstorage.gui.grid.stack.IClientStack; +import refinedstorage.tile.grid.TileGrid; + +public class GridSortingQuantity extends GridSorting { + @Override + public int compare(IClientStack left, IClientStack right) { + int leftSize = left.getQuantity(); + int rightSize = right.getQuantity(); + + if (leftSize != rightSize) { + if (sortingDirection == TileGrid.SORTING_DIRECTION_ASCENDING) { + return (leftSize > rightSize) ? 1 : -1; + } else if (sortingDirection == TileGrid.SORTING_DIRECTION_DESCENDING) { + return (rightSize > leftSize) ? 1 : -1; + } + } + + return 0; + } +} diff --git a/src/main/java/refinedstorage/gui/grid/stack/ClientStackFluid.java b/src/main/java/refinedstorage/gui/grid/stack/ClientStackFluid.java new file mode 100755 index 000000000..21915a964 --- /dev/null +++ b/src/main/java/refinedstorage/gui/grid/stack/ClientStackFluid.java @@ -0,0 +1,68 @@ +package refinedstorage.gui.grid.stack; + +import io.netty.buffer.ByteBuf; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.gui.GuiBase; + +import java.util.Locale; + +public class ClientStackFluid implements IClientStack { + private int hash; + private FluidStack stack; + + public ClientStackFluid(ByteBuf buf) { + this.hash = buf.readInt(); + this.stack = new FluidStack(FluidRegistry.getFluid(ByteBufUtils.readUTF8String(buf)), buf.readInt(), ByteBufUtils.readTag(buf)); + } + + public FluidStack getStack() { + return stack; + } + + @Override + public int getHash() { + return hash; + } + + @Override + public String getName() { + return stack.getFluid().getLocalizedName(stack); + } + + @Override + public String getModId() { + return stack.getFluid().getStill(stack).getResourceDomain(); + } + + @Override + public String getTooltip() { + return stack.getFluid().getLocalizedName(stack); + } + + @Override + public int getQuantity() { + return stack.amount; + } + + @Override + public void draw(GuiBase gui, int x, int y, boolean isOverWithShift) { + GuiBase.FLUID_RENDERER.draw(gui.mc, x, y, stack); + + gui.drawQuantity(x, y, String.format(Locale.US, "%.1f", (float) stack.amount / 1000).replace(".0", "") + "B"); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ClientStackFluid && ((ClientStackFluid) obj).getStack().isFluidEqual(stack); + } + + public static void write(ByteBuf buf, FluidStack stack) { + buf.writeInt(NetworkUtils.getFluidStackHashCode(stack)); + ByteBufUtils.writeUTF8String(buf, FluidRegistry.getFluidName(stack.getFluid())); + buf.writeInt(stack.amount); + ByteBufUtils.writeTag(buf, stack.tag); + } +} diff --git a/src/main/java/refinedstorage/gui/grid/stack/ClientStackItem.java b/src/main/java/refinedstorage/gui/grid/stack/ClientStackItem.java new file mode 100755 index 000000000..346f54bdf --- /dev/null +++ b/src/main/java/refinedstorage/gui/grid/stack/ClientStackItem.java @@ -0,0 +1,99 @@ +package refinedstorage.gui.grid.stack; + +import io.netty.buffer.ByteBuf; +import joptsimple.internal.Strings; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.gui.GuiBase; + +import java.util.Locale; + +public class ClientStackItem implements IClientStack { + private int hash; + private ItemStack stack; + private boolean craftable; + + public ClientStackItem(ByteBuf buf) { + stack = new ItemStack(Item.getItemById(buf.readInt()), buf.readInt(), buf.readInt()); + stack.setTagCompound(ByteBufUtils.readTag(buf)); + hash = buf.readInt(); + craftable = buf.readBoolean(); + } + + public ItemStack getStack() { + return stack; + } + + public boolean isCraftable() { + return craftable; + } + + @Override + public int getHash() { + return hash; + } + + @Override + public String getName() { + return stack.getDisplayName(); + } + + @Override + public String getModId() { + return Item.REGISTRY.getNameForObject(stack.getItem()).getResourceDomain(); + } + + @Override + public String getTooltip() { + return Strings.join(stack.getTooltip(Minecraft.getMinecraft().thePlayer, true), "\n"); + } + + @Override + public int getQuantity() { + return stack.stackSize; + } + + private String getQuantityForDisplay(boolean advanced) { + int qty = stack.stackSize; + + if (advanced && qty > 1) { + return String.valueOf(qty); + } + + if (qty >= 1000000) { + return String.format(Locale.US, "%.1f", (float) qty / 1000000).replace(".0", "") + "M"; + } else if (qty >= 1000) { + return String.format(Locale.US, "%.1f", (float) qty / 1000).replace(".0", "") + "K"; + } else if (qty == 1) { + return null; + } else if (qty == 0) { + return I18n.format("gui.refinedstorage:grid.craft"); + } + + return String.valueOf(qty); + } + + @Override + public void draw(GuiBase gui, int x, int y, boolean isOverWithShift) { + gui.drawItem(x, y, stack, true, getQuantityForDisplay(isOverWithShift)); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof IClientStack && ((ClientStackItem) obj).getHash() == hash; + } + + public static void write(ByteBuf buf, INetworkMaster network, ItemStack stack) { + buf.writeInt(Item.getIdFromItem(stack.getItem())); + buf.writeInt(stack.stackSize); + buf.writeInt(stack.getItemDamage()); + ByteBufUtils.writeTag(buf, stack.getTagCompound()); + buf.writeInt(NetworkUtils.getItemStackHashCode(stack)); + buf.writeBoolean(NetworkUtils.hasPattern(network, stack)); + } +} diff --git a/src/main/java/refinedstorage/gui/grid/stack/IClientStack.java b/src/main/java/refinedstorage/gui/grid/stack/IClientStack.java new file mode 100755 index 000000000..8aae2cc32 --- /dev/null +++ b/src/main/java/refinedstorage/gui/grid/stack/IClientStack.java @@ -0,0 +1,17 @@ +package refinedstorage.gui.grid.stack; + +import refinedstorage.gui.GuiBase; + +public interface IClientStack { + int getHash(); + + String getName(); + + String getModId(); + + String getTooltip(); + + int getQuantity(); + + void draw(GuiBase gui, int x, int y, boolean isOverWithShift); +} diff --git a/src/main/java/refinedstorage/gui/sidebutton/SideButtonCompare.java b/src/main/java/refinedstorage/gui/sidebutton/SideButtonCompare.java index 7b9de9eae..aad6ddfda 100755 --- a/src/main/java/refinedstorage/gui/sidebutton/SideButtonCompare.java +++ b/src/main/java/refinedstorage/gui/sidebutton/SideButtonCompare.java @@ -1,18 +1,17 @@ package refinedstorage.gui.sidebutton; import net.minecraft.util.text.TextFormatting; -import refinedstorage.RefinedStorage; -import refinedstorage.api.storage.CompareFlags; +import refinedstorage.api.storage.CompareUtils; import refinedstorage.gui.GuiBase; -import refinedstorage.network.MessageCompareUpdate; -import refinedstorage.tile.config.ICompareConfig; +import refinedstorage.tile.data.TileDataManager; +import refinedstorage.tile.data.TileDataParameter; public class SideButtonCompare extends SideButton { - private ICompareConfig config; + private TileDataParameter parameter; private int mask; - public SideButtonCompare(ICompareConfig config, int mask) { - this.config = config; + public SideButtonCompare(TileDataParameter parameter, int mask) { + this.parameter = parameter; this.mask = mask; } @@ -20,7 +19,7 @@ public class SideButtonCompare extends SideButton { public String getTooltip(GuiBase gui) { String tooltip = TextFormatting.YELLOW + gui.t("sidebutton.refinedstorage:compare." + mask) + TextFormatting.RESET + "\n"; - if ((config.getCompare() & mask) == mask) { + if ((parameter.getValue() & mask) == mask) { tooltip += gui.t("gui.yes"); } else { tooltip += gui.t("gui.no"); @@ -35,19 +34,19 @@ public class SideButtonCompare extends SideButton { int ty = 0; - if (mask == CompareFlags.COMPARE_DAMAGE) { + if (mask == CompareUtils.COMPARE_DAMAGE) { ty = 80; - } else if (mask == CompareFlags.COMPARE_NBT) { + } else if (mask == CompareUtils.COMPARE_NBT) { ty = 48; } - int tx = (config.getCompare() & mask) == mask ? 0 : 16; + int tx = (parameter.getValue() & mask) == mask ? 0 : 16; gui.drawTexture(x, y + 1, tx, ty, 16, 16); } @Override public void actionPerformed() { - RefinedStorage.INSTANCE.network.sendToServer(new MessageCompareUpdate(config, config.getCompare() ^ mask)); + TileDataManager.setParameter(parameter, parameter.getValue() ^ mask); } } diff --git a/src/main/java/refinedstorage/gui/sidebutton/SideButtonDetectorMode.java b/src/main/java/refinedstorage/gui/sidebutton/SideButtonDetectorMode.java index 2382b3fbf..af47bcb84 100755 --- a/src/main/java/refinedstorage/gui/sidebutton/SideButtonDetectorMode.java +++ b/src/main/java/refinedstorage/gui/sidebutton/SideButtonDetectorMode.java @@ -3,21 +3,14 @@ package refinedstorage.gui.sidebutton; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.util.text.TextFormatting; -import refinedstorage.RefinedStorage; import refinedstorage.gui.GuiBase; -import refinedstorage.network.MessageDetectorModeUpdate; import refinedstorage.tile.TileDetector; +import refinedstorage.tile.data.TileDataManager; public class SideButtonDetectorMode extends SideButton { - private TileDetector detector; - - public SideButtonDetectorMode(TileDetector detector) { - this.detector = detector; - } - @Override public String getTooltip(GuiBase gui) { - return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:detector.mode") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:detector.mode." + detector.getMode()); + return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:detector.mode") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:detector.mode." + TileDetector.MODE.getValue()); } @Override @@ -27,6 +20,16 @@ public class SideButtonDetectorMode extends SideButton { @Override public void actionPerformed() { - RefinedStorage.INSTANCE.network.sendToServer(new MessageDetectorModeUpdate(detector)); + int mode = TileDetector.MODE.getValue(); + + if (mode == TileDetector.MODE_EQUAL) { + mode = TileDetector.MODE_ABOVE; + } else if (mode == TileDetector.MODE_ABOVE) { + mode = TileDetector.MODE_UNDER; + } else if (mode == TileDetector.MODE_UNDER) { + mode = TileDetector.MODE_EQUAL; + } + + TileDataManager.setParameter(TileDetector.MODE, mode); } } diff --git a/src/main/java/refinedstorage/gui/sidebutton/SideButtonGridSearchBoxMode.java b/src/main/java/refinedstorage/gui/sidebutton/SideButtonGridSearchBoxMode.java index 8e08f7612..2b8b14087 100755 --- a/src/main/java/refinedstorage/gui/sidebutton/SideButtonGridSearchBoxMode.java +++ b/src/main/java/refinedstorage/gui/sidebutton/SideButtonGridSearchBoxMode.java @@ -1,9 +1,9 @@ package refinedstorage.gui.sidebutton; import net.minecraft.util.text.TextFormatting; -import refinedstorage.RefinedStorage; import refinedstorage.gui.GuiBase; -import refinedstorage.gui.GuiGrid; +import refinedstorage.gui.grid.GuiGrid; +import refinedstorage.integration.jei.IntegrationJEI; import refinedstorage.tile.grid.TileGrid; public class SideButtonGridSearchBoxMode extends SideButton { @@ -31,7 +31,7 @@ public class SideButtonGridSearchBoxMode extends SideButton { if (mode == TileGrid.SEARCH_BOX_MODE_NORMAL) { mode = TileGrid.SEARCH_BOX_MODE_NORMAL_AUTOSELECTED; } else if (mode == TileGrid.SEARCH_BOX_MODE_NORMAL_AUTOSELECTED) { - if (RefinedStorage.hasJei()) { + if (IntegrationJEI.isLoaded()) { mode = TileGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED; } else { mode = TileGrid.SEARCH_BOX_MODE_NORMAL; @@ -44,6 +44,6 @@ public class SideButtonGridSearchBoxMode extends SideButton { gui.getGrid().onSearchBoxModeChanged(mode); - gui.updateSearchBoxFocus(mode); + gui.updateSearchFieldFocus(mode); } } diff --git a/src/main/java/refinedstorage/gui/sidebutton/SideButtonGridViewType.java b/src/main/java/refinedstorage/gui/sidebutton/SideButtonGridViewType.java new file mode 100755 index 000000000..745c64420 --- /dev/null +++ b/src/main/java/refinedstorage/gui/sidebutton/SideButtonGridViewType.java @@ -0,0 +1,40 @@ +package refinedstorage.gui.sidebutton; + +import net.minecraft.util.text.TextFormatting; +import refinedstorage.gui.GuiBase; +import refinedstorage.tile.grid.IGrid; +import refinedstorage.tile.grid.TileGrid; + +public class SideButtonGridViewType extends SideButton { + private IGrid grid; + + public SideButtonGridViewType(IGrid grid) { + this.grid = grid; + } + + @Override + public String getTooltip(GuiBase gui) { + return TextFormatting.YELLOW + gui.t("sidebutton.refinedstorage:grid.view_type") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:grid.view_type." + grid.getViewType()); + } + + @Override + public void draw(GuiBase gui, int x, int y) { + gui.bindTexture("icons.png"); + gui.drawTexture(x, y + 2 - 1, grid.getViewType() * 16, 112, 16, 16); + } + + @Override + public void actionPerformed() { + int type = grid.getViewType(); + + if (type == TileGrid.VIEW_TYPE_NORMAL) { + type = TileGrid.VIEW_TYPE_NON_CRAFTABLES; + } else if (type == TileGrid.VIEW_TYPE_NON_CRAFTABLES) { + type = TileGrid.VIEW_TYPE_CRAFTABLES; + } else if (type == TileGrid.VIEW_TYPE_CRAFTABLES) { + type = TileGrid.VIEW_TYPE_NORMAL; + } + + grid.onViewTypeChanged(type); + } +} diff --git a/src/main/java/refinedstorage/gui/sidebutton/SideButtonMode.java b/src/main/java/refinedstorage/gui/sidebutton/SideButtonMode.java index 97c854571..e88283ad7 100755 --- a/src/main/java/refinedstorage/gui/sidebutton/SideButtonMode.java +++ b/src/main/java/refinedstorage/gui/sidebutton/SideButtonMode.java @@ -1,41 +1,32 @@ package refinedstorage.gui.sidebutton; import net.minecraft.util.text.TextFormatting; -import refinedstorage.RefinedStorage; import refinedstorage.gui.GuiBase; -import refinedstorage.network.MessageModeToggle; -import refinedstorage.tile.config.IModeConfig; -import refinedstorage.tile.config.ModeConstants; +import refinedstorage.tile.config.IFilterable; +import refinedstorage.tile.data.TileDataManager; +import refinedstorage.tile.data.TileDataParameter; public class SideButtonMode extends SideButton { - private IModeConfig config; + private TileDataParameter parameter; - public SideButtonMode(IModeConfig config) { - this.config = config; + public SideButtonMode(TileDataParameter parameter) { + this.parameter = parameter; } @Override public String getTooltip(GuiBase gui) { - return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:mode") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:mode." + (config.getMode() == ModeConstants.WHITELIST ? "whitelist" : "blacklist")); + return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:mode") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:mode." + (parameter.getValue() == IFilterable.WHITELIST ? "whitelist" : "blacklist")); } @Override public void draw(GuiBase gui, int x, int y) { gui.bindTexture("icons.png"); - int tx = 0; - - if (config.getMode() == ModeConstants.WHITELIST) { - tx = 0; - } else if (config.getMode() == ModeConstants.BLACKLIST) { - tx = 16; - } - - gui.drawTexture(x, y + 1, tx, 64, 16, 16); + gui.drawTexture(x, y + 1, parameter.getValue() == IFilterable.WHITELIST ? 0 : 16, 64, 16, 16); } @Override public void actionPerformed() { - RefinedStorage.INSTANCE.network.sendToServer(new MessageModeToggle(config)); + TileDataManager.setParameter(parameter, parameter.getValue() == IFilterable.WHITELIST ? IFilterable.BLACKLIST : IFilterable.WHITELIST); } } diff --git a/src/main/java/refinedstorage/gui/sidebutton/SideButtonRedstoneMode.java b/src/main/java/refinedstorage/gui/sidebutton/SideButtonRedstoneMode.java index 8b1b5b5c4..77e499eb2 100755 --- a/src/main/java/refinedstorage/gui/sidebutton/SideButtonRedstoneMode.java +++ b/src/main/java/refinedstorage/gui/sidebutton/SideButtonRedstoneMode.java @@ -1,31 +1,30 @@ package refinedstorage.gui.sidebutton; import net.minecraft.util.text.TextFormatting; -import refinedstorage.RefinedStorage; import refinedstorage.gui.GuiBase; -import refinedstorage.network.MessageRedstoneModeUpdate; -import refinedstorage.tile.config.IRedstoneModeConfig; +import refinedstorage.tile.data.TileDataManager; +import refinedstorage.tile.data.TileDataParameter; public class SideButtonRedstoneMode extends SideButton { - private IRedstoneModeConfig config; + private TileDataParameter parameter; - public SideButtonRedstoneMode(IRedstoneModeConfig config) { - this.config = config; + public SideButtonRedstoneMode(TileDataParameter parameter) { + this.parameter = parameter; } @Override public String getTooltip(GuiBase gui) { - return TextFormatting.RED + gui.t("sidebutton.refinedstorage:redstone_mode") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:redstone_mode." + config.getRedstoneMode().id); + return TextFormatting.RED + gui.t("sidebutton.refinedstorage:redstone_mode") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:redstone_mode." + parameter.getValue()); } @Override public void draw(GuiBase gui, int x, int y) { gui.bindTexture("icons.png"); - gui.drawTexture(x, y + 1, config.getRedstoneMode().id * 16, 0, 16, 16); + gui.drawTexture(x, y + 1, parameter.getValue() * 16, 0, 16, 16); } @Override public void actionPerformed() { - RefinedStorage.INSTANCE.network.sendToServer(new MessageRedstoneModeUpdate(config)); + TileDataManager.setParameter(parameter, parameter.getValue() + 1); } } diff --git a/src/main/java/refinedstorage/gui/sidebutton/SideButtonType.java b/src/main/java/refinedstorage/gui/sidebutton/SideButtonType.java new file mode 100755 index 000000000..4072419ab --- /dev/null +++ b/src/main/java/refinedstorage/gui/sidebutton/SideButtonType.java @@ -0,0 +1,30 @@ +package refinedstorage.gui.sidebutton; + +import net.minecraft.util.text.TextFormatting; +import refinedstorage.gui.GuiBase; +import refinedstorage.tile.config.IType; +import refinedstorage.tile.data.TileDataManager; +import refinedstorage.tile.data.TileDataParameter; + +// @TODO: Add icons +public class SideButtonType extends SideButton { + private TileDataParameter type; + + public SideButtonType(TileDataParameter type) { + this.type = type; + } + + @Override + public String getTooltip(GuiBase gui) { + return TextFormatting.GREEN + gui.t("sidebutton.refinedstorage:type") + TextFormatting.RESET + "\n" + gui.t("sidebutton.refinedstorage:type." + type.getValue()); + } + + @Override + public void draw(GuiBase gui, int x, int y) { + } + + @Override + public void actionPerformed() { + TileDataManager.setParameter(type, type.getValue() == IType.ITEMS ? IType.FLUIDS : IType.ITEMS); + } +} diff --git a/src/main/java/refinedstorage/integration/ic2/ControllerEnergyIC2.java b/src/main/java/refinedstorage/integration/ic2/ControllerEnergyIC2.java new file mode 100755 index 000000000..129b5af60 --- /dev/null +++ b/src/main/java/refinedstorage/integration/ic2/ControllerEnergyIC2.java @@ -0,0 +1,40 @@ +package refinedstorage.integration.ic2; + +import ic2.api.energy.prefab.BasicSink; +import net.minecraft.util.EnumFacing; +import refinedstorage.tile.TileController; + +public class ControllerEnergyIC2 implements IControllerEnergyIC2 { + private BasicSink sink; + + public ControllerEnergyIC2(final TileController controller) { + this.sink = new BasicSink(controller, (int) IntegrationIC2.toEU(controller.getEnergy().getMaxEnergyStored()), Integer.MAX_VALUE) { + @Override + public double getDemandedEnergy() { + return Math.max(0.0D, IntegrationIC2.toEU(controller.getEnergy().getMaxEnergyStored()) - IntegrationIC2.toEU(controller.getEnergy().getEnergyStored())); + } + + @Override + public double injectEnergy(EnumFacing directionFrom, double amount, double voltage) { + controller.getEnergy().setEnergyStored(controller.getEnergy().getEnergyStored() + IntegrationIC2.toRS(amount)); + + return 0.0D; + } + }; + } + + @Override + public void invalidate() { + sink.invalidate(); + } + + @Override + public void update() { + sink.update(); + } + + @Override + public void onChunkUnload() { + sink.onChunkUnload(); + } +} diff --git a/src/main/java/refinedstorage/integration/ic2/ControllerEnergyIC2None.java b/src/main/java/refinedstorage/integration/ic2/ControllerEnergyIC2None.java new file mode 100755 index 000000000..211f597e0 --- /dev/null +++ b/src/main/java/refinedstorage/integration/ic2/ControllerEnergyIC2None.java @@ -0,0 +1,15 @@ +package refinedstorage.integration.ic2; + +public class ControllerEnergyIC2None implements IControllerEnergyIC2 { + @Override + public void invalidate() { + } + + @Override + public void update() { + } + + @Override + public void onChunkUnload() { + } +} diff --git a/src/main/java/refinedstorage/integration/ic2/IControllerEnergyIC2.java b/src/main/java/refinedstorage/integration/ic2/IControllerEnergyIC2.java new file mode 100755 index 000000000..3ef9d0761 --- /dev/null +++ b/src/main/java/refinedstorage/integration/ic2/IControllerEnergyIC2.java @@ -0,0 +1,9 @@ +package refinedstorage.integration.ic2; + +public interface IControllerEnergyIC2 { + void invalidate(); + + void update(); + + void onChunkUnload(); +} diff --git a/src/main/java/refinedstorage/integration/ic2/IntegrationIC2.java b/src/main/java/refinedstorage/integration/ic2/IntegrationIC2.java new file mode 100755 index 000000000..e41b656f4 --- /dev/null +++ b/src/main/java/refinedstorage/integration/ic2/IntegrationIC2.java @@ -0,0 +1,17 @@ +package refinedstorage.integration.ic2; + +import net.minecraftforge.fml.common.Loader; + +public final class IntegrationIC2 { + public static boolean isLoaded() { + return Loader.isModLoaded("IC2"); + } + + public static int toRS(double amount) { + return amount >= Double.POSITIVE_INFINITY ? Integer.MAX_VALUE : ((int) Math.floor(amount) * 4); + } + + public static double toEU(int amount) { + return Math.floor(amount / 4); + } +} diff --git a/src/main/java/refinedstorage/jei/RefinedStorageJEIPlugin.java b/src/main/java/refinedstorage/integration/jei/IntegrationJEI.java similarity index 56% rename from src/main/java/refinedstorage/jei/RefinedStorageJEIPlugin.java rename to src/main/java/refinedstorage/integration/jei/IntegrationJEI.java index 5faab58aa..88a7f7b35 100755 --- a/src/main/java/refinedstorage/jei/RefinedStorageJEIPlugin.java +++ b/src/main/java/refinedstorage/integration/jei/IntegrationJEI.java @@ -1,15 +1,16 @@ -package refinedstorage.jei; +package refinedstorage.integration.jei; import mezz.jei.api.IJeiRuntime; import mezz.jei.api.IModPlugin; import mezz.jei.api.IModRegistry; import mezz.jei.api.JEIPlugin; import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.Loader; import refinedstorage.RefinedStorageBlocks; @JEIPlugin -public class RefinedStorageJEIPlugin implements IModPlugin { - public static RefinedStorageJEIPlugin INSTANCE; +public class IntegrationJEI implements IModPlugin { + public static IntegrationJEI INSTANCE; private IJeiRuntime runtime; @@ -17,15 +18,15 @@ public class RefinedStorageJEIPlugin implements IModPlugin { public void register(IModRegistry registry) { INSTANCE = this; - registry.getRecipeTransferRegistry().addRecipeTransferHandler(new GridRecipeTransferHandler()); + registry.getRecipeTransferRegistry().addRecipeTransferHandler(new RecipeTransferHandlerGrid()); - registry.addRecipeCategories(new SoldererRecipeCategory(registry.getJeiHelpers().getGuiHelper())); + registry.addRecipeCategories(new RecipeCategorySolderer(registry.getJeiHelpers().getGuiHelper())); - registry.addRecipeHandlers(new SoldererRecipeHandler()); + registry.addRecipeHandlers(new RecipeHandlerSolderer()); - registry.addRecipes(SoldererRecipeMaker.getRecipes()); + registry.addRecipes(RecipeMakerSolderer.getRecipes()); - registry.addRecipeCategoryCraftingItem(new ItemStack(RefinedStorageBlocks.SOLDERER), SoldererRecipeCategory.ID); + registry.addRecipeCategoryCraftingItem(new ItemStack(RefinedStorageBlocks.SOLDERER), RecipeCategorySolderer.ID); } @Override @@ -36,4 +37,8 @@ public class RefinedStorageJEIPlugin implements IModPlugin { public IJeiRuntime getRuntime() { return runtime; } + + public static boolean isLoaded() { + return Loader.isModLoaded("JEI"); + } } diff --git a/src/main/java/refinedstorage/jei/SoldererRecipeCategory.java b/src/main/java/refinedstorage/integration/jei/RecipeCategorySolderer.java similarity index 85% rename from src/main/java/refinedstorage/jei/SoldererRecipeCategory.java rename to src/main/java/refinedstorage/integration/jei/RecipeCategorySolderer.java index 8a2a2452b..6682cf506 100755 --- a/src/main/java/refinedstorage/jei/SoldererRecipeCategory.java +++ b/src/main/java/refinedstorage/integration/jei/RecipeCategorySolderer.java @@ -1,69 +1,69 @@ -package refinedstorage.jei; - -import mezz.jei.api.IGuiHelper; -import mezz.jei.api.gui.IDrawable; -import mezz.jei.api.gui.IGuiItemStackGroup; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.recipe.IRecipeCategory; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.I18n; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -public class SoldererRecipeCategory implements IRecipeCategory { - public static final String ID = "refinedstorage.solderer"; - - private IDrawable background; - - public SoldererRecipeCategory(IGuiHelper helper) { - background = helper.createDrawable(new ResourceLocation("refinedstorage", "textures/gui/solderer.png"), 8, 5, 162, 83); - } - - @Override - public String getUid() { - return ID; - } - - @Override - public String getTitle() { - return I18n.format("gui.refinedstorage:solderer"); - } - - @Override - public IDrawable getBackground() { - return background; - } - - @Override - public void drawExtras(Minecraft minecraft) { - } - - @Override - public void drawAnimations(Minecraft minecraft) { - } - - @Override - public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper) { - IGuiItemStackGroup group = recipeLayout.getItemStacks(); - - int x = 44 - 9; - int y = 20 - 6; - - for (int i = 0; i < 3; ++i) { - group.init(i, true, x, y); - - y += 18; - } - - group.init(3, false, 127 - 9, 38 - 6); - - if (recipeWrapper instanceof SoldererRecipeWrapper) { - for (int i = 0; i < 3; ++i) { - group.set(i, (ItemStack) recipeWrapper.getInputs().get(i)); - } - - group.set(3, (ItemStack) recipeWrapper.getOutputs().get(0)); - } - } -} +package refinedstorage.integration.jei; + +import mezz.jei.api.IGuiHelper; +import mezz.jei.api.gui.IDrawable; +import mezz.jei.api.gui.IGuiItemStackGroup; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.IRecipeCategory; +import mezz.jei.api.recipe.IRecipeWrapper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +public class RecipeCategorySolderer implements IRecipeCategory { + public static final String ID = "refinedstorage.solderer"; + + private IDrawable background; + + public RecipeCategorySolderer(IGuiHelper helper) { + background = helper.createDrawable(new ResourceLocation("refinedstorage", "textures/gui/solderer.png"), 8, 5, 162, 83); + } + + @Override + public String getUid() { + return ID; + } + + @Override + public String getTitle() { + return I18n.format("gui.refinedstorage:solderer"); + } + + @Override + public IDrawable getBackground() { + return background; + } + + @Override + public void drawExtras(Minecraft minecraft) { + } + + @Override + public void drawAnimations(Minecraft minecraft) { + } + + @Override + public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper) { + IGuiItemStackGroup group = recipeLayout.getItemStacks(); + + int x = 44 - 9; + int y = 20 - 6; + + for (int i = 0; i < 3; ++i) { + group.init(i, true, x, y); + + y += 18; + } + + group.init(3, false, 127 - 9, 38 - 6); + + if (recipeWrapper instanceof RecipeWrapperSolderer) { + for (int i = 0; i < 3; ++i) { + group.set(i, (ItemStack) recipeWrapper.getInputs().get(i)); + } + + group.set(3, (ItemStack) recipeWrapper.getOutputs().get(0)); + } + } +} diff --git a/src/main/java/refinedstorage/integration/jei/RecipeHandlerSolderer.java b/src/main/java/refinedstorage/integration/jei/RecipeHandlerSolderer.java new file mode 100755 index 000000000..95b511da2 --- /dev/null +++ b/src/main/java/refinedstorage/integration/jei/RecipeHandlerSolderer.java @@ -0,0 +1,34 @@ +package refinedstorage.integration.jei; + +import mezz.jei.api.recipe.IRecipeHandler; +import mezz.jei.api.recipe.IRecipeWrapper; + +import javax.annotation.Nonnull; + +public class RecipeHandlerSolderer implements IRecipeHandler { + @Override + public Class getRecipeClass() { + return RecipeWrapperSolderer.class; + } + + @Override + public String getRecipeCategoryUid() { + return RecipeCategorySolderer.ID; + } + + @Nonnull + @Override + public String getRecipeCategoryUid(@Nonnull RecipeWrapperSolderer recipe) { + return RecipeCategorySolderer.ID; + } + + @Override + public IRecipeWrapper getRecipeWrapper(RecipeWrapperSolderer recipe) { + return recipe; + } + + @Override + public boolean isRecipeValid(RecipeWrapperSolderer recipe) { + return true; + } +} diff --git a/src/main/java/refinedstorage/jei/SoldererRecipeMaker.java b/src/main/java/refinedstorage/integration/jei/RecipeMakerSolderer.java similarity index 58% rename from src/main/java/refinedstorage/jei/SoldererRecipeMaker.java rename to src/main/java/refinedstorage/integration/jei/RecipeMakerSolderer.java index d042d2aa3..727e66d01 100755 --- a/src/main/java/refinedstorage/jei/SoldererRecipeMaker.java +++ b/src/main/java/refinedstorage/integration/jei/RecipeMakerSolderer.java @@ -1,28 +1,28 @@ -package refinedstorage.jei; - -import net.minecraft.item.ItemStack; -import refinedstorage.api.RefinedStorageAPI; -import refinedstorage.api.solderer.ISoldererRecipe; - -import java.util.ArrayList; -import java.util.List; - -public class SoldererRecipeMaker { - public static List getRecipes() { - List recipes = new ArrayList(); - - for (ISoldererRecipe recipe : RefinedStorageAPI.SOLDERER_REGISTRY.getRecipes()) { - List inputs = new ArrayList(); - - inputs.add(recipe.getRow(0)); - inputs.add(recipe.getRow(1)); - inputs.add(recipe.getRow(2)); - - ItemStack output = recipe.getResult(); - - recipes.add(new SoldererRecipeWrapper(inputs, output)); - } - - return recipes; - } -} +package refinedstorage.integration.jei; + +import net.minecraft.item.ItemStack; +import refinedstorage.api.RefinedStorageAPI; +import refinedstorage.api.solderer.ISoldererRecipe; + +import java.util.ArrayList; +import java.util.List; + +public final class RecipeMakerSolderer { + public static List getRecipes() { + List recipes = new ArrayList<>(); + + for (ISoldererRecipe recipe : RefinedStorageAPI.SOLDERER_REGISTRY.getRecipes()) { + List inputs = new ArrayList<>(); + + inputs.add(recipe.getRow(0)); + inputs.add(recipe.getRow(1)); + inputs.add(recipe.getRow(2)); + + ItemStack output = recipe.getResult(); + + recipes.add(new RecipeWrapperSolderer(inputs, output)); + } + + return recipes; + } +} diff --git a/src/main/java/refinedstorage/jei/GridRecipeTransferHandler.java b/src/main/java/refinedstorage/integration/jei/RecipeTransferHandlerGrid.java similarity index 96% rename from src/main/java/refinedstorage/jei/GridRecipeTransferHandler.java rename to src/main/java/refinedstorage/integration/jei/RecipeTransferHandlerGrid.java index 73f116c7f..36f61b40c 100755 --- a/src/main/java/refinedstorage/jei/GridRecipeTransferHandler.java +++ b/src/main/java/refinedstorage/integration/jei/RecipeTransferHandlerGrid.java @@ -1,4 +1,4 @@ -package refinedstorage.jei; +package refinedstorage.integration.jei; import mezz.jei.api.gui.IGuiIngredient; import mezz.jei.api.gui.IRecipeLayout; @@ -21,7 +21,7 @@ import java.util.Map; /** * @link https://github.com/zerofall/EZStorage/blob/master/src/main/java/com/zerofall/ezstorage/jei/RecipeTransferHandler.java */ -public class GridRecipeTransferHandler implements IRecipeTransferHandler { +public class RecipeTransferHandlerGrid implements IRecipeTransferHandler { @Override public Class getContainerClass() { return ContainerGrid.class; diff --git a/src/main/java/refinedstorage/jei/SoldererRecipeWrapper.java b/src/main/java/refinedstorage/integration/jei/RecipeWrapperSolderer.java similarity index 74% rename from src/main/java/refinedstorage/jei/SoldererRecipeWrapper.java rename to src/main/java/refinedstorage/integration/jei/RecipeWrapperSolderer.java index ede772266..ff649757f 100755 --- a/src/main/java/refinedstorage/jei/SoldererRecipeWrapper.java +++ b/src/main/java/refinedstorage/integration/jei/RecipeWrapperSolderer.java @@ -1,49 +1,49 @@ -package refinedstorage.jei; - -import mezz.jei.plugins.vanilla.VanillaRecipeWrapper; -import net.minecraft.item.ItemStack; - -import java.util.Collections; -import java.util.List; - -public class SoldererRecipeWrapper extends VanillaRecipeWrapper { - private List inputs; - private ItemStack output; - - public SoldererRecipeWrapper(List inputs, ItemStack output) { - this.inputs = inputs; - this.output = output; - } - - @Override - public List getInputs() { - return inputs; - } - - @Override - public List getOutputs() { - return Collections.singletonList(output); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof SoldererRecipeWrapper)) { - return false; - } - - SoldererRecipeWrapper other = (SoldererRecipeWrapper) obj; - - for (int i = 0; i < inputs.size(); i++) { - if (!ItemStack.areItemStacksEqual(inputs.get(i), other.inputs.get(i))) { - return false; - } - } - - return ItemStack.areItemStacksEqual(output, other.output); - } - - @Override - public String toString() { - return inputs + " = " + output; - } -} +package refinedstorage.integration.jei; + +import mezz.jei.plugins.vanilla.VanillaRecipeWrapper; +import net.minecraft.item.ItemStack; + +import java.util.Collections; +import java.util.List; + +public class RecipeWrapperSolderer extends VanillaRecipeWrapper { + private List inputs; + private ItemStack output; + + public RecipeWrapperSolderer(List inputs, ItemStack output) { + this.inputs = inputs; + this.output = output; + } + + @Override + public List getInputs() { + return inputs; + } + + @Override + public List getOutputs() { + return Collections.singletonList(output); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof RecipeWrapperSolderer)) { + return false; + } + + RecipeWrapperSolderer other = (RecipeWrapperSolderer) obj; + + for (int i = 0; i < inputs.size(); i++) { + if (!ItemStack.areItemStacksEqual(inputs.get(i), other.inputs.get(i))) { + return false; + } + } + + return ItemStack.areItemStacksEqual(output, other.output); + } + + @Override + public String toString() { + return inputs + " = " + output; + } +} diff --git a/src/main/java/refinedstorage/integration/tesla/ControllerEnergyTesla.java b/src/main/java/refinedstorage/integration/tesla/ControllerEnergyTesla.java new file mode 100755 index 000000000..578d96548 --- /dev/null +++ b/src/main/java/refinedstorage/integration/tesla/ControllerEnergyTesla.java @@ -0,0 +1,28 @@ +package refinedstorage.integration.tesla; + +import cofh.api.energy.EnergyStorage; +import net.darkhax.tesla.api.ITeslaConsumer; +import net.darkhax.tesla.api.ITeslaHolder; + +public class ControllerEnergyTesla implements ITeslaHolder, ITeslaConsumer { + private EnergyStorage energy; + + public ControllerEnergyTesla(EnergyStorage energy) { + this.energy = energy; + } + + @Override + public long givePower(long power, boolean simulated) { + return energy.receiveEnergy((int) power, simulated); + } + + @Override + public long getStoredPower() { + return energy.getEnergyStored(); + } + + @Override + public long getCapacity() { + return energy.getMaxEnergyStored(); + } +} diff --git a/src/main/java/refinedstorage/integration/tesla/IntegrationTesla.java b/src/main/java/refinedstorage/integration/tesla/IntegrationTesla.java new file mode 100755 index 000000000..5cee05796 --- /dev/null +++ b/src/main/java/refinedstorage/integration/tesla/IntegrationTesla.java @@ -0,0 +1,9 @@ +package refinedstorage.integration.tesla; + +import net.minecraftforge.fml.common.Loader; + +public final class IntegrationTesla { + public static boolean isLoaded() { + return Loader.isModLoaded("tesla"); + } +} diff --git a/src/main/java/refinedstorage/integration/tesla/WirelessGridEnergyTesla.java b/src/main/java/refinedstorage/integration/tesla/WirelessGridEnergyTesla.java new file mode 100755 index 000000000..9a469e7f2 --- /dev/null +++ b/src/main/java/refinedstorage/integration/tesla/WirelessGridEnergyTesla.java @@ -0,0 +1,31 @@ +package refinedstorage.integration.tesla; + +import net.darkhax.tesla.api.ITeslaConsumer; +import net.darkhax.tesla.api.ITeslaHolder; +import net.minecraft.item.ItemStack; +import refinedstorage.item.ItemWirelessGrid; + +public class WirelessGridEnergyTesla implements ITeslaHolder, ITeslaConsumer { + private ItemWirelessGrid wirelessGrid; + private ItemStack stack; + + public WirelessGridEnergyTesla(ItemWirelessGrid wirelessGrid, ItemStack stack) { + this.wirelessGrid = wirelessGrid; + this.stack = stack; + } + + @Override + public long getStoredPower() { + return wirelessGrid.getEnergyStored(stack); + } + + @Override + public long getCapacity() { + return wirelessGrid.getMaxEnergyStored(stack); + } + + @Override + public long givePower(long power, boolean simulated) { + return wirelessGrid.receiveEnergy(stack, (int) power, simulated); + } +} diff --git a/src/main/java/refinedstorage/inventory/BasicItemHandler.java b/src/main/java/refinedstorage/inventory/ItemHandlerBasic.java similarity index 81% rename from src/main/java/refinedstorage/inventory/BasicItemHandler.java rename to src/main/java/refinedstorage/inventory/ItemHandlerBasic.java index 07edaa151..cb65b2210 100755 --- a/src/main/java/refinedstorage/inventory/BasicItemHandler.java +++ b/src/main/java/refinedstorage/inventory/ItemHandlerBasic.java @@ -4,18 +4,19 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.items.ItemStackHandler; -public class BasicItemHandler extends ItemStackHandler { +public class ItemHandlerBasic extends ItemStackHandler { private TileEntity tile; - private IItemValidator[] validators; - public BasicItemHandler(int size, TileEntity tile, IItemValidator... validators) { + protected IItemValidator[] validators; + + public ItemHandlerBasic(int size, TileEntity tile, IItemValidator... validators) { super(size); this.tile = tile; this.validators = validators; } - public BasicItemHandler(int size, IItemValidator... validators) { + public ItemHandlerBasic(int size, IItemValidator... validators) { this(size, null, validators); } diff --git a/src/main/java/refinedstorage/inventory/ItemHandlerFluid.java b/src/main/java/refinedstorage/inventory/ItemHandlerFluid.java new file mode 100755 index 000000000..5e6f98bbf --- /dev/null +++ b/src/main/java/refinedstorage/inventory/ItemHandlerFluid.java @@ -0,0 +1,34 @@ +package refinedstorage.inventory; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.items.ItemHandlerHelper; +import refinedstorage.apiimpl.storage.fluid.FluidUtils; + +public class ItemHandlerFluid extends ItemHandlerBasic { + private FluidStack[] fluids; + + public ItemHandlerFluid(int size, TileEntity tile) { + super(size, tile, s -> FluidUtils.getFluidFromStack(ItemHandlerHelper.copyStackWithSize(s, 1), true) != null); + + this.fluids = new FluidStack[size]; + } + + @Override + protected void onContentsChanged(int slot) { + super.onContentsChanged(slot); + + ItemStack stack = getStackInSlot(slot); + + if (stack == null) { + fluids[slot] = null; + } else { + fluids[slot] = FluidUtils.getFluidFromStack(ItemHandlerHelper.copyStackWithSize(stack, 1), true); + } + } + + public FluidStack[] getFluids() { + return fluids; + } +} diff --git a/src/main/java/refinedstorage/inventory/ItemHandlerGridFilter.java b/src/main/java/refinedstorage/inventory/ItemHandlerGridFilter.java new file mode 100755 index 000000000..1184700c3 --- /dev/null +++ b/src/main/java/refinedstorage/inventory/ItemHandlerGridFilter.java @@ -0,0 +1,35 @@ +package refinedstorage.inventory; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.items.ItemStackHandler; +import refinedstorage.tile.TileBase; + +public class ItemHandlerGridFilter extends ItemStackHandler { + private ItemStack stack; + + public ItemHandlerGridFilter(ItemStack stack) { + super(9); + + this.stack = stack; + + if (stack.hasTagCompound()) { + TileBase.readItems(this, 0, stack.getTagCompound()); + } + } + + @Override + protected void onContentsChanged(int slot) { + super.onContentsChanged(slot); + + if (!stack.hasTagCompound()) { + stack.setTagCompound(new NBTTagCompound()); + } + + TileBase.writeItems(this, 0, stack.getTagCompound()); + } + + public ItemStack[] getFilteredItems() { + return stacks; + } +} diff --git a/src/main/java/refinedstorage/inventory/ItemHandlerGridFilterInGrid.java b/src/main/java/refinedstorage/inventory/ItemHandlerGridFilterInGrid.java new file mode 100755 index 000000000..b729a33d7 --- /dev/null +++ b/src/main/java/refinedstorage/inventory/ItemHandlerGridFilterInGrid.java @@ -0,0 +1,48 @@ +package refinedstorage.inventory; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.relauncher.Side; +import refinedstorage.RefinedStorageItems; +import refinedstorage.gui.grid.GridFilteredItem; +import refinedstorage.gui.grid.GuiGrid; +import refinedstorage.item.ItemGridFilter; + +import java.util.List; + +public class ItemHandlerGridFilterInGrid extends ItemHandlerBasic { + private List filteredItems; + + public ItemHandlerGridFilterInGrid(List filteredItems) { + super(4, new ItemValidatorBasic(RefinedStorageItems.GRID_FILTER)); + + this.filteredItems = filteredItems; + } + + @Override + protected void onContentsChanged(int slot) { + super.onContentsChanged(slot); + + filteredItems.clear(); + + for (int i = 0; i < getSlots(); ++i) { + ItemStack filter = getStackInSlot(i); + + if (filter != null) { + int compare = ItemGridFilter.getCompare(filter); + + ItemHandlerGridFilter items = new ItemHandlerGridFilter(filter); + + for (ItemStack item : items.getFilteredItems()) { + if (item != null) { + filteredItems.add(new GridFilteredItem(item, compare)); + } + } + } + } + + if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { + GuiGrid.markForSorting(); + } + } +} diff --git a/src/main/java/refinedstorage/inventory/ProxyItemHandler.java b/src/main/java/refinedstorage/inventory/ItemHandlerProxy.java similarity index 88% rename from src/main/java/refinedstorage/inventory/ProxyItemHandler.java rename to src/main/java/refinedstorage/inventory/ItemHandlerProxy.java index 2c0863630..4b1a6d37b 100755 --- a/src/main/java/refinedstorage/inventory/ProxyItemHandler.java +++ b/src/main/java/refinedstorage/inventory/ItemHandlerProxy.java @@ -6,10 +6,10 @@ import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; -public class ProxyItemHandler implements IItemHandler, IItemHandlerModifiable, INBTSerializable { - private BasicItemHandler proxy; +public class ItemHandlerProxy implements IItemHandler, IItemHandlerModifiable, INBTSerializable { + private ItemHandlerBasic proxy; - public ProxyItemHandler(BasicItemHandler proxy) { + public ItemHandlerProxy(ItemHandlerBasic proxy) { this.proxy = proxy; } diff --git a/src/main/java/refinedstorage/inventory/SoldererItemHandler.java b/src/main/java/refinedstorage/inventory/ItemHandlerSolderer.java similarity index 91% rename from src/main/java/refinedstorage/inventory/SoldererItemHandler.java rename to src/main/java/refinedstorage/inventory/ItemHandlerSolderer.java index edc46aabb..b66af4a65 100755 --- a/src/main/java/refinedstorage/inventory/SoldererItemHandler.java +++ b/src/main/java/refinedstorage/inventory/ItemHandlerSolderer.java @@ -4,11 +4,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import refinedstorage.tile.TileSolderer; -public class SoldererItemHandler extends ProxyItemHandler { +public class ItemHandlerSolderer extends ItemHandlerProxy { private TileSolderer solderer; private EnumFacing side; - public SoldererItemHandler(TileSolderer solderer, EnumFacing side) { + public ItemHandlerSolderer(TileSolderer solderer, EnumFacing side) { super(solderer.getItems()); this.solderer = solderer; diff --git a/src/main/java/refinedstorage/inventory/ItemHandlerUpgrade.java b/src/main/java/refinedstorage/inventory/ItemHandlerUpgrade.java new file mode 100755 index 000000000..38243f5a1 --- /dev/null +++ b/src/main/java/refinedstorage/inventory/ItemHandlerUpgrade.java @@ -0,0 +1,57 @@ +package refinedstorage.inventory; + +import net.minecraft.tileentity.TileEntity; +import refinedstorage.RefinedStorageItems; +import refinedstorage.item.ItemUpgrade; + +public class ItemHandlerUpgrade extends ItemHandlerBasic { + public ItemHandlerUpgrade(int size, TileEntity tile, int... supportedUpgrades) { + super(size, tile, new IItemValidator[supportedUpgrades.length]); + + for (int i = 0; i < supportedUpgrades.length; ++i) { + this.validators[i] = new ItemValidatorBasic(RefinedStorageItems.UPGRADE, supportedUpgrades[i]); + } + } + + public int getSpeed() { + return getSpeed(9, 2); + } + + public int getSpeed(int speed, int speedIncrease) { + for (int i = 0; i < getSlots(); ++i) { + if (getStackInSlot(i) != null && getStackInSlot(i).getItemDamage() == ItemUpgrade.TYPE_SPEED) { + speed -= speedIncrease; + } + } + + return speed; + } + + public boolean hasUpgrade(int type) { + return getUpgradeCount(type) > 0; + } + + public int getUpgradeCount(int type) { + int upgrades = 0; + + for (int i = 0; i < getSlots(); ++i) { + if (getStackInSlot(i) != null && getStackInSlot(i).getItemDamage() == type) { + upgrades++; + } + } + + return upgrades; + } + + public int getEnergyUsage() { + int usage = 0; + + for (int i = 0; i < getSlots(); ++i) { + if (getStackInSlot(i) != null) { + usage += ItemUpgrade.getEnergyUsage(getStackInSlot(i).getItemDamage()); + } + } + + return usage; + } +} diff --git a/src/main/java/refinedstorage/inventory/BasicItemValidator.java b/src/main/java/refinedstorage/inventory/ItemValidatorBasic.java similarity index 77% rename from src/main/java/refinedstorage/inventory/BasicItemValidator.java rename to src/main/java/refinedstorage/inventory/ItemValidatorBasic.java index 8938a002c..cfae89161 100755 --- a/src/main/java/refinedstorage/inventory/BasicItemValidator.java +++ b/src/main/java/refinedstorage/inventory/ItemValidatorBasic.java @@ -3,15 +3,15 @@ package refinedstorage.inventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public class BasicItemValidator implements IItemValidator { +public class ItemValidatorBasic implements IItemValidator { private Item item; private int damage = -1; - public BasicItemValidator(Item item) { + public ItemValidatorBasic(Item item) { this.item = item; } - public BasicItemValidator(Item item, int damage) { + public ItemValidatorBasic(Item item, int damage) { this.item = item; this.damage = damage; } diff --git a/src/main/java/refinedstorage/item/ItemBlockController.java b/src/main/java/refinedstorage/item/ItemBlockController.java index 8f20acc69..1a77c1288 100755 --- a/src/main/java/refinedstorage/item/ItemBlockController.java +++ b/src/main/java/refinedstorage/item/ItemBlockController.java @@ -8,7 +8,7 @@ import net.minecraft.world.World; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; import refinedstorage.block.EnumControllerType; -import refinedstorage.tile.controller.TileController; +import refinedstorage.tile.TileController; import java.util.List; @@ -18,10 +18,10 @@ public class ItemBlockController extends ItemBlockBase { } @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { if (stack.getMetadata() != EnumControllerType.CREATIVE.getId()) { int energyStored = 0; - int energyCapacity = RefinedStorage.INSTANCE.controller; + int energyCapacity = RefinedStorage.INSTANCE.controllerCapacity; if (stack.getTagCompound() != null) { if (stack.getTagCompound().hasKey(TileController.NBT_ENERGY)) { @@ -33,7 +33,7 @@ public class ItemBlockController extends ItemBlockBase { } } - list.add(I18n.format("misc.refinedstorage:energy_stored", energyStored, energyCapacity)); + tooltip.add(I18n.format("misc.refinedstorage:energy_stored", energyStored, energyCapacity)); } } @@ -51,7 +51,7 @@ public class ItemBlockController extends ItemBlockBase { tag = new NBTTagCompound(); } - tag.setInteger(TileController.NBT_ENERGY, stack.getMetadata() == EnumControllerType.CREATIVE.getId() ? RefinedStorage.INSTANCE.controller : 0); + tag.setInteger(TileController.NBT_ENERGY, stack.getMetadata() == EnumControllerType.CREATIVE.getId() ? RefinedStorage.INSTANCE.controllerCapacity : 0); return stack; } diff --git a/src/main/java/refinedstorage/item/ItemBlockFluidStorage.java b/src/main/java/refinedstorage/item/ItemBlockFluidStorage.java new file mode 100755 index 000000000..f4d484798 --- /dev/null +++ b/src/main/java/refinedstorage/item/ItemBlockFluidStorage.java @@ -0,0 +1,90 @@ +package refinedstorage.item; + +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.world.World; +import refinedstorage.RefinedStorageBlocks; +import refinedstorage.RefinedStorageItems; +import refinedstorage.apiimpl.storage.fluid.FluidStorageNBT; +import refinedstorage.block.EnumFluidStorageType; +import refinedstorage.tile.TileFluidStorage; + +import java.util.List; + +public class ItemBlockFluidStorage extends ItemBlockBase { + public ItemBlockFluidStorage() { + super(RefinedStorageBlocks.FLUID_STORAGE, true); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { + EnumFluidStorageType type = EnumFluidStorageType.getById(stack.getMetadata()); + + if (type != null && isValid(stack)) { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(TileFluidStorage.NBT_STORAGE); + + if (type == EnumFluidStorageType.TYPE_CREATIVE) { + tooltip.add(I18n.format("misc.refinedstorage:storage.stored", FluidStorageNBT.getStoredFromNBT(tag))); + } else { + tooltip.add(I18n.format("misc.refinedstorage:storage.stored_capacity", FluidStorageNBT.getStoredFromNBT(tag), type.getCapacity())); + } + } + } + + @Override + public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) { + EnumFluidStorageType type = EnumFluidStorageType.getById(stack.getMetadata()); + + if (type != null && isValid(stack) && FluidStorageNBT.getStoredFromNBT(stack.getTagCompound().getCompoundTag(TileFluidStorage.NBT_STORAGE)) == 0 && stack.getMetadata() != ItemFluidStorageDisk.TYPE_CREATIVE && !world.isRemote && player.isSneaking()) { + ItemStack storagePart = new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, stack.getMetadata()); + + if (!player.inventory.addItemStackToInventory(storagePart.copy())) { + InventoryHelper.spawnItemStack(world, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), storagePart); + } + + ItemStack processor = new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_BASIC); + + if (!player.inventory.addItemStackToInventory(processor.copy())) { + InventoryHelper.spawnItemStack(world, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), processor); + } + + return new ActionResult<>(EnumActionResult.SUCCESS, new ItemStack(RefinedStorageBlocks.MACHINE_CASING)); + } + + return new ActionResult<>(EnumActionResult.PASS, stack); + } + + private static boolean isValid(ItemStack stack) { + return stack.getTagCompound() != null && stack.getTagCompound().hasKey(TileFluidStorage.NBT_STORAGE); + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected) { + super.onUpdate(stack, world, entity, slot, selected); + + if (!stack.hasTagCompound()) { + initNBT(stack); + } + } + + @Override + public void onCreated(ItemStack stack, World world, EntityPlayer player) { + super.onCreated(stack, world, player); + + initNBT(stack); + } + + public static ItemStack initNBT(ItemStack stack) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setTag(TileFluidStorage.NBT_STORAGE, FluidStorageNBT.createNBT()); + stack.setTagCompound(tag); + return stack; + } +} diff --git a/src/main/java/refinedstorage/item/ItemBlockStorage.java b/src/main/java/refinedstorage/item/ItemBlockStorage.java index c30000c81..bab92210b 100755 --- a/src/main/java/refinedstorage/item/ItemBlockStorage.java +++ b/src/main/java/refinedstorage/item/ItemBlockStorage.java @@ -12,8 +12,8 @@ import net.minecraft.util.EnumHand; import net.minecraft.world.World; import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageItems; -import refinedstorage.apiimpl.storage.NBTStorage; -import refinedstorage.block.EnumStorageType; +import refinedstorage.apiimpl.storage.item.ItemStorageNBT; +import refinedstorage.block.EnumItemStorageType; import refinedstorage.tile.TileStorage; import java.util.List; @@ -24,25 +24,25 @@ public class ItemBlockStorage extends ItemBlockBase { } @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { - EnumStorageType type = EnumStorageType.getById(stack.getMetadata()); + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { + EnumItemStorageType type = EnumItemStorageType.getById(stack.getMetadata()); if (type != null && isValid(stack)) { NBTTagCompound tag = stack.getTagCompound().getCompoundTag(TileStorage.NBT_STORAGE); - if (type == EnumStorageType.TYPE_CREATIVE) { - list.add(I18n.format("misc.refinedstorage:storage.stored", NBTStorage.getStoredFromNBT(tag))); + if (type == EnumItemStorageType.TYPE_CREATIVE) { + tooltip.add(I18n.format("misc.refinedstorage:storage.stored", ItemStorageNBT.getStoredFromNBT(tag))); } else { - list.add(I18n.format("misc.refinedstorage:storage.stored_capacity", NBTStorage.getStoredFromNBT(tag), type.getCapacity())); + tooltip.add(I18n.format("misc.refinedstorage:storage.stored_capacity", ItemStorageNBT.getStoredFromNBT(tag), type.getCapacity())); } } } @Override public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) { - EnumStorageType type = EnumStorageType.getById(stack.getMetadata()); + EnumItemStorageType type = EnumItemStorageType.getById(stack.getMetadata()); - if (type != null && isValid(stack) && NBTStorage.getStoredFromNBT(stack.getTagCompound().getCompoundTag(TileStorage.NBT_STORAGE)) == 0 && stack.getMetadata() != ItemStorageDisk.TYPE_CREATIVE && !world.isRemote && player.isSneaking()) { + if (type != null && isValid(stack) && ItemStorageNBT.getStoredFromNBT(stack.getTagCompound().getCompoundTag(TileStorage.NBT_STORAGE)) == 0 && stack.getMetadata() != ItemStorageDisk.TYPE_CREATIVE && !world.isRemote && player.isSneaking()) { ItemStack storagePart = new ItemStack(RefinedStorageItems.STORAGE_PART, 1, stack.getMetadata()); if (!player.inventory.addItemStackToInventory(storagePart.copy())) { @@ -55,10 +55,10 @@ public class ItemBlockStorage extends ItemBlockBase { InventoryHelper.spawnItemStack(world, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), processor); } - return new ActionResult(EnumActionResult.SUCCESS, new ItemStack(RefinedStorageBlocks.MACHINE_CASING)); + return new ActionResult<>(EnumActionResult.SUCCESS, new ItemStack(RefinedStorageBlocks.MACHINE_CASING)); } - return new ActionResult(EnumActionResult.PASS, stack); + return new ActionResult<>(EnumActionResult.PASS, stack); } private static boolean isValid(ItemStack stack) { @@ -83,7 +83,7 @@ public class ItemBlockStorage extends ItemBlockBase { public static ItemStack initNBT(ItemStack stack) { NBTTagCompound tag = new NBTTagCompound(); - tag.setTag(TileStorage.NBT_STORAGE, NBTStorage.createNBT()); + tag.setTag(TileStorage.NBT_STORAGE, ItemStorageNBT.createNBT()); stack.setTagCompound(tag); return stack; } diff --git a/src/main/java/refinedstorage/item/ItemCore.java b/src/main/java/refinedstorage/item/ItemCore.java index 9028b7aee..26515b552 100755 --- a/src/main/java/refinedstorage/item/ItemCore.java +++ b/src/main/java/refinedstorage/item/ItemCore.java @@ -18,7 +18,7 @@ public class ItemCore extends ItemBase { } @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { + public void getSubItems(Item item, CreativeTabs tab, List list) { for (int i = 0; i < 2; ++i) { list.add(new ItemStack(item, 1, i)); } diff --git a/src/main/java/refinedstorage/item/ItemFluidStorageDisk.java b/src/main/java/refinedstorage/item/ItemFluidStorageDisk.java new file mode 100755 index 000000000..d33e4463b --- /dev/null +++ b/src/main/java/refinedstorage/item/ItemFluidStorageDisk.java @@ -0,0 +1,85 @@ +package refinedstorage.item; + +import net.minecraft.client.resources.I18n; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.world.World; +import refinedstorage.RefinedStorageItems; +import refinedstorage.apiimpl.storage.fluid.FluidStorageNBT; +import refinedstorage.block.EnumFluidStorageType; + +import java.util.List; + +public class ItemFluidStorageDisk extends ItemBase { + public static final int TYPE_64K = 0; + public static final int TYPE_128K = 1; + public static final int TYPE_256K = 2; + public static final int TYPE_512K = 3; + public static final int TYPE_CREATIVE = 4; + + public ItemFluidStorageDisk() { + super("fluid_storage_disk"); + + setMaxStackSize(1); + setHasSubtypes(true); + setMaxDamage(0); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int i = 0; i < 5; ++i) { + list.add(FluidStorageNBT.createStackWithNBT(new ItemStack(item, 1, i))); + } + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected) { + super.onUpdate(stack, world, entity, slot, selected); + + if (!stack.hasTagCompound()) { + FluidStorageNBT.createStackWithNBT(stack); + } + } + + @Override + public ActionResult onItemRightClick(ItemStack disk, World world, EntityPlayer player, EnumHand hand) { + if (!world.isRemote && player.isSneaking() && FluidStorageNBT.isValid(disk) && FluidStorageNBT.getStoredFromNBT(disk.getTagCompound()) == 0 && disk.getMetadata() != TYPE_CREATIVE) { + ItemStack storagePart = new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, disk.getMetadata()); + + if (!player.inventory.addItemStackToInventory(storagePart.copy())) { + InventoryHelper.spawnItemStack(world, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), storagePart); + } + + return new ActionResult<>(EnumActionResult.SUCCESS, new ItemStack(RefinedStorageItems.STORAGE_HOUSING)); + } + + return new ActionResult<>(EnumActionResult.PASS, disk); + } + + @Override + public void addInformation(ItemStack disk, EntityPlayer player, List tooltip, boolean advanced) { + if (FluidStorageNBT.isValid(disk)) { + int capacity = EnumFluidStorageType.getById(disk.getItemDamage()).getCapacity(); + + if (capacity == -1) { + tooltip.add(I18n.format("misc.refinedstorage:storage.stored", FluidStorageNBT.getStoredFromNBT(disk.getTagCompound()))); + } else { + tooltip.add(I18n.format("misc.refinedstorage:storage.stored_capacity", FluidStorageNBT.getStoredFromNBT(disk.getTagCompound()), capacity)); + } + } + } + + @Override + public void onCreated(ItemStack stack, World world, EntityPlayer player) { + super.onCreated(stack, world, player); + + FluidStorageNBT.createStackWithNBT(stack); + } +} diff --git a/src/main/java/refinedstorage/item/ItemFluidStoragePart.java b/src/main/java/refinedstorage/item/ItemFluidStoragePart.java new file mode 100755 index 000000000..bbf502d80 --- /dev/null +++ b/src/main/java/refinedstorage/item/ItemFluidStoragePart.java @@ -0,0 +1,28 @@ +package refinedstorage.item; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import java.util.List; + +public class ItemFluidStoragePart extends ItemBase { + public static final int TYPE_64K = 0; + public static final int TYPE_128K = 1; + public static final int TYPE_256K = 2; + public static final int TYPE_512K = 3; + + public ItemFluidStoragePart() { + super("fluid_storage_part"); + + setHasSubtypes(true); + setMaxDamage(0); + } + + @Override + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int i = 0; i <= 3; ++i) { + list.add(new ItemStack(item, 1, i)); + } + } +} diff --git a/src/main/java/refinedstorage/item/ItemGridFilter.java b/src/main/java/refinedstorage/item/ItemGridFilter.java new file mode 100755 index 000000000..81048e31e --- /dev/null +++ b/src/main/java/refinedstorage/item/ItemGridFilter.java @@ -0,0 +1,62 @@ +package refinedstorage.item; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.world.World; +import refinedstorage.RefinedStorage; +import refinedstorage.RefinedStorageGui; +import refinedstorage.RefinedStorageItems; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.inventory.ItemHandlerGridFilter; + +import java.util.List; + +public class ItemGridFilter extends ItemBase { + private static final String NBT_COMPARE = "Compare"; + + public ItemGridFilter() { + super("grid_filter"); + + setMaxStackSize(1); + } + + @Override + public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) { + if (!world.isRemote) { + if (player.isSneaking()) { + return new ActionResult<>(EnumActionResult.SUCCESS, new ItemStack(RefinedStorageItems.GRID_FILTER)); + } + + player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.GRID_FILTER, world, hand.ordinal(), 0, 0); + + return new ActionResult<>(EnumActionResult.SUCCESS, stack); + } + + return new ActionResult<>(EnumActionResult.PASS, stack); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { + super.addInformation(stack, player, tooltip, advanced); + + ItemHandlerGridFilter items = new ItemHandlerGridFilter(stack); + + ItemPattern.combineItems(tooltip, false, items.getFilteredItems()); + } + + public static int getCompare(ItemStack stack) { + return (stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_COMPARE)) ? stack.getTagCompound().getInteger(NBT_COMPARE) : (CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT); + } + + public static void setCompare(ItemStack stack, int compare) { + if (!stack.hasTagCompound()) { + stack.setTagCompound(new NBTTagCompound()); + } + + stack.getTagCompound().setInteger(NBT_COMPARE, compare); + } +} diff --git a/src/main/java/refinedstorage/item/ItemNetworkCard.java b/src/main/java/refinedstorage/item/ItemNetworkCard.java new file mode 100755 index 000000000..61cd73b12 --- /dev/null +++ b/src/main/java/refinedstorage/item/ItemNetworkCard.java @@ -0,0 +1,75 @@ +package refinedstorage.item; + +import net.minecraft.block.Block; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import refinedstorage.RefinedStorageBlocks; + +import java.util.List; + +public class ItemNetworkCard extends ItemBase { + private static final String NBT_RECEIVER_X = "ReceiverX"; + private static final String NBT_RECEIVER_Y = "ReceiverY"; + private static final String NBT_RECEIVER_Z = "ReceiverZ"; + private static final String NBT_DIMENSION = "Dimension"; + + public ItemNetworkCard() { + super("network_card"); + + setMaxStackSize(1); + } + + @Override + public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + Block block = world.getBlockState(pos).getBlock(); + + if (block == RefinedStorageBlocks.NETWORK_RECEIVER) { + setReceiver(stack, pos, world.provider.getDimension()); + + return EnumActionResult.SUCCESS; + } + + return EnumActionResult.PASS; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { + super.addInformation(stack, player, tooltip, advanced); + + BlockPos pos = getReceiver(stack); + + if (pos != null) { + tooltip.add(I18n.format("misc.refinedstorage:network_card.tooltip", pos.getX(), pos.getY(), pos.getZ())); + } + } + + public static BlockPos getReceiver(ItemStack stack) { + if (stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_RECEIVER_X) && stack.getTagCompound().hasKey(NBT_RECEIVER_Y) && stack.getTagCompound().hasKey(NBT_RECEIVER_Z)) { + return new BlockPos(stack.getTagCompound().getInteger(NBT_RECEIVER_X), stack.getTagCompound().getInteger(NBT_RECEIVER_Y), stack.getTagCompound().getInteger(NBT_RECEIVER_Z)); + } + + return null; + } + + public static int getDimension(ItemStack stack) { + return (stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_DIMENSION)) ? stack.getTagCompound().getInteger(NBT_DIMENSION) : 0; + } + + public static void setReceiver(ItemStack stack, BlockPos pos, int dimension) { + NBTTagCompound tag = new NBTTagCompound(); + + tag.setInteger(NBT_RECEIVER_X, pos.getX()); + tag.setInteger(NBT_RECEIVER_Y, pos.getY()); + tag.setInteger(NBT_RECEIVER_Z, pos.getZ()); + tag.setInteger(NBT_DIMENSION, dimension); + + stack.setTagCompound(tag); + } +} diff --git a/src/main/java/refinedstorage/item/ItemPattern.java b/src/main/java/refinedstorage/item/ItemPattern.java index b8320fc38..3ab1897aa 100755 --- a/src/main/java/refinedstorage/item/ItemPattern.java +++ b/src/main/java/refinedstorage/item/ItemPattern.java @@ -13,9 +13,11 @@ import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; +import refinedstorage.api.storage.CompareUtils; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class ItemPattern extends ItemBase { public static final String NBT_INPUTS = "Inputs"; @@ -28,27 +30,51 @@ public class ItemPattern extends ItemBase { } @Override - public void addInformation(ItemStack pattern, EntityPlayer player, List list, boolean b) { + public void addInformation(ItemStack pattern, EntityPlayer player, List tooltip, boolean advanced) { if (isValid(pattern)) { if (GuiScreen.isShiftKeyDown() || isProcessing(pattern)) { - list.add(TextFormatting.YELLOW + I18n.format("misc.refinedstorage:pattern.inputs") + TextFormatting.RESET); + tooltip.add(TextFormatting.YELLOW + I18n.format("misc.refinedstorage:pattern.inputs") + TextFormatting.RESET); - RefinedStorageUtils.combineMultipleItemsInTooltip(list, getInputs(pattern)); + combineItems(tooltip, true, getInputs(pattern)); - list.add(TextFormatting.YELLOW + I18n.format("misc.refinedstorage:pattern.outputs") + TextFormatting.RESET); + tooltip.add(TextFormatting.YELLOW + I18n.format("misc.refinedstorage:pattern.outputs") + TextFormatting.RESET); } - RefinedStorageUtils.combineMultipleItemsInTooltip(list, getOutputs(pattern)); + combineItems(tooltip, true, getOutputs(pattern)); + } + } + + public static void combineItems(List tooltip, boolean displayAmount, ItemStack... stacks) { + Set combinedIndices = new HashSet<>(); + + for (int i = 0; i < stacks.length; ++i) { + if (stacks[i] != null && !combinedIndices.contains(i)) { + String data = stacks[i].getDisplayName(); + + int amount = stacks[i].stackSize; + + for (int j = i + 1; j < stacks.length; ++j) { + if (CompareUtils.compareStack(stacks[i], stacks[j])) { + amount += stacks[j].stackSize; + + combinedIndices.add(j); + } + } + + data = (displayAmount ? (TextFormatting.WHITE + String.valueOf(amount) + " ") : "") + TextFormatting.GRAY + data; + + tooltip.add(data); + } } } @Override public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) { if (!world.isRemote && player.isSneaking()) { - return new ActionResult(EnumActionResult.SUCCESS, new ItemStack(RefinedStorageItems.PATTERN)); + return new ActionResult<>(EnumActionResult.SUCCESS, new ItemStack(RefinedStorageItems.PATTERN)); } - return new ActionResult(EnumActionResult.PASS, stack); + return new ActionResult<>(EnumActionResult.PASS, stack); } public static void addInput(ItemStack pattern, ItemStack stack) { diff --git a/src/main/java/refinedstorage/item/ItemProcessor.java b/src/main/java/refinedstorage/item/ItemProcessor.java index b60613ff1..3e4d807e4 100755 --- a/src/main/java/refinedstorage/item/ItemProcessor.java +++ b/src/main/java/refinedstorage/item/ItemProcessor.java @@ -23,7 +23,7 @@ public class ItemProcessor extends ItemBase { } @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { + public void getSubItems(Item item, CreativeTabs tab, List list) { for (int i = 0; i <= 6; ++i) { list.add(new ItemStack(item, 1, i)); } diff --git a/src/main/java/refinedstorage/item/ItemStorageDisk.java b/src/main/java/refinedstorage/item/ItemStorageDisk.java index 622fb1950..b809b0cc7 100755 --- a/src/main/java/refinedstorage/item/ItemStorageDisk.java +++ b/src/main/java/refinedstorage/item/ItemStorageDisk.java @@ -13,8 +13,8 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; import net.minecraft.world.World; import refinedstorage.RefinedStorageItems; -import refinedstorage.apiimpl.storage.NBTStorage; -import refinedstorage.block.EnumStorageType; +import refinedstorage.apiimpl.storage.item.ItemStorageNBT; +import refinedstorage.block.EnumItemStorageType; import java.util.ArrayList; import java.util.Iterator; @@ -39,9 +39,9 @@ public class ItemStorageDisk extends ItemBase { } @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { + public void getSubItems(Item item, CreativeTabs tab, List list) { for (int i = 0; i < 5; ++i) { - list.add(NBTStorage.createStackWithNBT(new ItemStack(item, 1, i))); + list.add(ItemStorageNBT.createStackWithNBT(new ItemStack(item, 1, i))); } } @@ -50,19 +50,19 @@ public class ItemStorageDisk extends ItemBase { super.onUpdate(stack, world, entity, slot, selected); if (!stack.hasTagCompound()) { - if (stack.getItemDamage() == 5) { + if (stack.getItemDamage() == TYPE_DEBUG) { applyDebugDiskData(stack); } else { - NBTStorage.createStackWithNBT(stack); + ItemStorageNBT.createStackWithNBT(stack); } } } private void applyDebugDiskData(ItemStack stack) { if (debugDiskTag == null) { - debugDiskTag = NBTStorage.createNBT(); + debugDiskTag = ItemStorageNBT.createNBT(); - NBTStorage storage = new NBTStorage(debugDiskTag, -1, null) { + ItemStorageNBT storage = new ItemStorageNBT(debugDiskTag, -1, null) { @Override public int getPriority() { return 0; @@ -75,7 +75,7 @@ public class ItemStorageDisk extends ItemBase { Item item = it.next(); if (item != RefinedStorageItems.STORAGE_DISK) { - List stacks = new ArrayList(); + List stacks = new ArrayList<>(); item.getSubItems(item, CreativeTabs.INVENTORY, stacks); @@ -92,37 +92,37 @@ public class ItemStorageDisk extends ItemBase { } @Override - public void addInformation(ItemStack disk, EntityPlayer player, List list, boolean b) { - if (NBTStorage.isValid(disk)) { - int capacity = EnumStorageType.getById(disk.getItemDamage()).getCapacity(); + public void addInformation(ItemStack disk, EntityPlayer player, List tooltip, boolean advanced) { + if (ItemStorageNBT.isValid(disk)) { + int capacity = EnumItemStorageType.getById(disk.getItemDamage()).getCapacity(); if (capacity == -1) { - list.add(I18n.format("misc.refinedstorage:storage.stored", NBTStorage.getStoredFromNBT(disk.getTagCompound()))); + tooltip.add(I18n.format("misc.refinedstorage:storage.stored", ItemStorageNBT.getStoredFromNBT(disk.getTagCompound()))); } else { - list.add(I18n.format("misc.refinedstorage:storage.stored_capacity", NBTStorage.getStoredFromNBT(disk.getTagCompound()), capacity)); + tooltip.add(I18n.format("misc.refinedstorage:storage.stored_capacity", ItemStorageNBT.getStoredFromNBT(disk.getTagCompound()), capacity)); } } } @Override public ActionResult onItemRightClick(ItemStack disk, World world, EntityPlayer player, EnumHand hand) { - if (!world.isRemote && player.isSneaking() && NBTStorage.isValid(disk) && NBTStorage.getStoredFromNBT(disk.getTagCompound()) == 0 && disk.getMetadata() != TYPE_CREATIVE) { + if (!world.isRemote && player.isSneaking() && ItemStorageNBT.isValid(disk) && ItemStorageNBT.getStoredFromNBT(disk.getTagCompound()) == 0 && disk.getMetadata() != TYPE_CREATIVE) { ItemStack storagePart = new ItemStack(RefinedStorageItems.STORAGE_PART, 1, disk.getMetadata()); if (!player.inventory.addItemStackToInventory(storagePart.copy())) { InventoryHelper.spawnItemStack(world, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), storagePart); } - return new ActionResult(EnumActionResult.SUCCESS, new ItemStack(RefinedStorageItems.STORAGE_HOUSING)); + return new ActionResult<>(EnumActionResult.SUCCESS, new ItemStack(RefinedStorageItems.STORAGE_HOUSING)); } - return new ActionResult(EnumActionResult.PASS, disk); + return new ActionResult<>(EnumActionResult.PASS, disk); } @Override public void onCreated(ItemStack stack, World world, EntityPlayer player) { super.onCreated(stack, world, player); - NBTStorage.createStackWithNBT(stack); + ItemStorageNBT.createStackWithNBT(stack); } } diff --git a/src/main/java/refinedstorage/item/ItemStoragePart.java b/src/main/java/refinedstorage/item/ItemStoragePart.java index 509378f43..b643e9780 100755 --- a/src/main/java/refinedstorage/item/ItemStoragePart.java +++ b/src/main/java/refinedstorage/item/ItemStoragePart.java @@ -20,7 +20,7 @@ public class ItemStoragePart extends ItemBase { } @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { + public void getSubItems(Item item, CreativeTabs tab, List list) { for (int i = 0; i <= 3; ++i) { list.add(new ItemStack(item, 1, i)); } diff --git a/src/main/java/refinedstorage/item/ItemUpgrade.java b/src/main/java/refinedstorage/item/ItemUpgrade.java index 921cc7887..7d12b0e5d 100755 --- a/src/main/java/refinedstorage/item/ItemUpgrade.java +++ b/src/main/java/refinedstorage/item/ItemUpgrade.java @@ -1,6 +1,8 @@ package refinedstorage.item; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import refinedstorage.RefinedStorage; @@ -12,6 +14,7 @@ public class ItemUpgrade extends ItemBase { public static final int TYPE_SPEED = 2; public static final int TYPE_CRAFTING = 3; public static final int TYPE_STACK = 4; + public static final int TYPE_INTERDIMENSIONAL = 5; public ItemUpgrade() { super("upgrade"); @@ -22,8 +25,8 @@ public class ItemUpgrade extends ItemBase { } @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { - for (int i = 0; i <= 4; ++i) { + public void getSubItems(Item item, CreativeTabs tab, List list) { + for (int i = 0; i <= 5; ++i) { list.add(new ItemStack(item, 1, i)); } } @@ -38,8 +41,25 @@ public class ItemUpgrade extends ItemBase { return RefinedStorage.INSTANCE.craftingUpgradeUsage; case TYPE_STACK: return RefinedStorage.INSTANCE.stackUpgradeUsage; + case TYPE_INTERDIMENSIONAL: + return RefinedStorage.INSTANCE.interdimensionalUpgradeUsage; default: return 0; } } + + public static ItemStack getRequirement(int type) { + switch (type) { + case ItemUpgrade.TYPE_RANGE: + return new ItemStack(Items.ENDER_PEARL); + case ItemUpgrade.TYPE_SPEED: + return new ItemStack(Items.SUGAR); + case ItemUpgrade.TYPE_CRAFTING: + return new ItemStack(Blocks.CRAFTING_TABLE); + case ItemUpgrade.TYPE_INTERDIMENSIONAL: + return new ItemStack(Items.NETHER_STAR); + default: + return null; + } + } } diff --git a/src/main/java/refinedstorage/item/ItemWirelessGrid.java b/src/main/java/refinedstorage/item/ItemWirelessGrid.java index b05b179c0..18bb0ed4a 100755 --- a/src/main/java/refinedstorage/item/ItemWirelessGrid.java +++ b/src/main/java/refinedstorage/item/ItemWirelessGrid.java @@ -3,15 +3,12 @@ package refinedstorage.item; import cofh.api.energy.ItemEnergyContainer; import ic2.api.item.IElectricItemManager; import ic2.api.item.ISpecialElectricItem; -import net.darkhax.tesla.api.ITeslaConsumer; -import net.darkhax.tesla.api.ITeslaHolder; import net.darkhax.tesla.capability.TeslaCapabilities; import net.minecraft.block.Block; import net.minecraft.client.resources.I18n; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.IItemPropertyGetter; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -25,15 +22,15 @@ import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.fml.common.Optional; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; -import refinedstorage.tile.controller.TileController; +import refinedstorage.integration.ic2.IntegrationIC2; +import refinedstorage.integration.tesla.IntegrationTesla; +import refinedstorage.integration.tesla.WirelessGridEnergyTesla; +import refinedstorage.tile.TileController; import refinedstorage.tile.grid.TileGrid; import javax.annotation.Nullable; import java.util.List; -import static refinedstorage.RefinedStorageUtils.convertIC2ToRF; -import static refinedstorage.RefinedStorageUtils.convertRFToIC2; - @Optional.InterfaceList({ @Optional.Interface(iface = "ic2.api.item.ISpecialElectricItem", modid = "IC2"), @Optional.Interface(iface = "ic2.api.item.IElectricItemManager", modid = "IC2") @@ -42,10 +39,6 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle public static final int TYPE_NORMAL = 0; public static final int TYPE_CREATIVE = 1; - public static final String NBT_SORTING_TYPE = "SortingType"; - public static final String NBT_SORTING_DIRECTION = "SortingDirection"; - public static final String NBT_SEARCH_BOX_MODE = "SearchBoxMode"; - private static final String NBT_CONTROLLER_X = "ControllerX"; private static final String NBT_CONTROLLER_Y = "ControllerY"; private static final String NBT_CONTROLLER_Z = "ControllerZ"; @@ -54,18 +47,12 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle public ItemWirelessGrid() { super(3200); - addPropertyOverride(new ResourceLocation("connected"), new IItemPropertyGetter() { - @Override - public float apply(ItemStack stack, World world, EntityLivingBase entity) { - return (entity != null && hasValidNBT(stack) && getDimensionId(stack) == entity.dimension) ? 1.0f : 0.0f; - } - }); - setRegistryName(RefinedStorage.ID, "wireless_grid"); setMaxDamage(3200); setMaxStackSize(1); setHasSubtypes(true); setCreativeTab(RefinedStorage.INSTANCE.tab); + addPropertyOverride(new ResourceLocation("connected"), (stack, world, entity) -> (entity != null && isValid(stack) && getDimensionId(stack) == entity.dimension) ? 1.0f : 0.0f); } @Override @@ -85,7 +72,7 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle @Override public double getDurabilityForDisplay(ItemStack stack) { - return 1d - ((double) getEnergyStored(stack) / (double) getMaxEnergyStored(stack)); + return 1D - ((double) getEnergyStored(stack) / (double) getMaxEnergyStored(stack)); } @Override @@ -99,7 +86,7 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle } @Override - public void getSubItems(Item item, CreativeTabs tab, List list) { + public void getSubItems(Item item, CreativeTabs tab, List list) { list.add(new ItemStack(item, 1, TYPE_NORMAL)); ItemStack fullyCharged = new ItemStack(item, 1, TYPE_NORMAL); @@ -110,15 +97,13 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle } @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean b) { + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) { if (stack.getItemDamage() != TYPE_CREATIVE) { - list.add(I18n.format("misc.refinedstorage:energy_stored", getEnergyStored(stack), getMaxEnergyStored(stack))); + tooltip.add(I18n.format("misc.refinedstorage:energy_stored", getEnergyStored(stack), getMaxEnergyStored(stack))); } - if (hasValidNBT(stack)) { - list.add(I18n.format("misc.refinedstorage:wireless_grid.tooltip.0", getX(stack))); - list.add(I18n.format("misc.refinedstorage:wireless_grid.tooltip.1", getY(stack))); - list.add(I18n.format("misc.refinedstorage:wireless_grid.tooltip.2", getZ(stack))); + if (isValid(stack)) { + tooltip.add(I18n.format("misc.refinedstorage:wireless_grid.tooltip", getX(stack), getY(stack), getZ(stack))); } } @@ -137,9 +122,10 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle tag.setInteger(NBT_CONTROLLER_Y, pos.getY()); tag.setInteger(NBT_CONTROLLER_Z, pos.getZ()); tag.setInteger(NBT_DIMENSION_ID, player.dimension); - tag.setInteger(NBT_SORTING_DIRECTION, TileGrid.SORTING_DIRECTION_DESCENDING); - tag.setInteger(NBT_SORTING_TYPE, TileGrid.SORTING_TYPE_NAME); - tag.setInteger(NBT_SEARCH_BOX_MODE, TileGrid.SEARCH_BOX_MODE_NORMAL); + tag.setInteger(TileGrid.NBT_VIEW_TYPE, TileGrid.VIEW_TYPE_NORMAL); + tag.setInteger(TileGrid.NBT_SORTING_DIRECTION, TileGrid.SORTING_DIRECTION_DESCENDING); + tag.setInteger(TileGrid.NBT_SORTING_TYPE, TileGrid.SORTING_TYPE_NAME); + tag.setInteger(TileGrid.NBT_SEARCH_BOX_MODE, TileGrid.SEARCH_BOX_MODE_NORMAL); stack.setTagCompound(tag); @@ -151,12 +137,12 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle @Override public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) { - if (!world.isRemote && hasValidNBT(stack) && getDimensionId(stack) == player.dimension) { + if (!world.isRemote && isValid(stack) && getDimensionId(stack) == player.dimension) { TileEntity tile = world.getTileEntity(new BlockPos(getX(stack), getY(stack), getZ(stack))); if (tile instanceof TileController) { if (((TileController) tile).getWirelessGridHandler().onOpen(player, hand)) { - return new ActionResult(EnumActionResult.SUCCESS, stack); + return new ActionResult<>(EnumActionResult.SUCCESS, stack); } else { player.addChatComponentMessage(new TextComponentTranslation("misc.refinedstorage:wireless_grid.out_of_range")); } @@ -165,7 +151,7 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle } } - return new ActionResult(EnumActionResult.PASS, stack); + return new ActionResult<>(EnumActionResult.PASS, stack); } public static int getDimensionId(ItemStack stack) { @@ -184,33 +170,38 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle return stack.getTagCompound().getInteger(NBT_CONTROLLER_Z); } + public static int getViewType(ItemStack stack) { + return stack.getTagCompound().getInteger(TileGrid.NBT_VIEW_TYPE); + } + public static int getSortingType(ItemStack stack) { - return stack.getTagCompound().getInteger(NBT_SORTING_TYPE); + return stack.getTagCompound().getInteger(TileGrid.NBT_SORTING_TYPE); } public static int getSortingDirection(ItemStack stack) { - return stack.getTagCompound().getInteger(NBT_SORTING_DIRECTION); + return stack.getTagCompound().getInteger(TileGrid.NBT_SORTING_DIRECTION); } public static int getSearchBoxMode(ItemStack stack) { - return stack.getTagCompound().getInteger(NBT_SEARCH_BOX_MODE); + return stack.getTagCompound().getInteger(TileGrid.NBT_SEARCH_BOX_MODE); } - private static boolean hasValidNBT(ItemStack stack) { + private static boolean isValid(ItemStack stack) { return stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_CONTROLLER_X) && stack.getTagCompound().hasKey(NBT_CONTROLLER_Y) && stack.getTagCompound().hasKey(NBT_CONTROLLER_Z) && stack.getTagCompound().hasKey(NBT_DIMENSION_ID) - && stack.getTagCompound().hasKey(NBT_SORTING_DIRECTION) - && stack.getTagCompound().hasKey(NBT_SORTING_TYPE) - && stack.getTagCompound().hasKey(NBT_SEARCH_BOX_MODE); + && stack.getTagCompound().hasKey(TileGrid.NBT_VIEW_TYPE) + && stack.getTagCompound().hasKey(TileGrid.NBT_SORTING_DIRECTION) + && stack.getTagCompound().hasKey(TileGrid.NBT_SORTING_TYPE) + && stack.getTagCompound().hasKey(TileGrid.NBT_SEARCH_BOX_MODE); } @Override public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { if (oldStack.getItem() == newStack.getItem()) { - if (hasValidNBT(oldStack) && hasValidNBT(newStack)) { + if (isValid(oldStack) && isValid(newStack)) { if (getX(oldStack) == getX(newStack) && getY(oldStack) == getY(newStack) && getZ(oldStack) == getZ(newStack) && getDimensionId(oldStack) == getDimensionId(newStack)) { return false; } @@ -239,25 +230,25 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle @Optional.Method(modid = "IC2") @Override public double charge(ItemStack stack, double amount, int tier, boolean ignoreTransferLimit, boolean simulate) { - return convertRFToIC2(receiveEnergy(stack, convertIC2ToRF(amount), simulate)); + return IntegrationIC2.toEU(receiveEnergy(stack, IntegrationIC2.toRS(amount), simulate)); } @Optional.Method(modid = "IC2") @Override public double discharge(ItemStack stack, double amount, int tier, boolean ignoreTransferLimit, boolean externally, boolean simulate) { - return convertRFToIC2(extractEnergy(stack, convertIC2ToRF(amount), simulate)); + return IntegrationIC2.toEU(extractEnergy(stack, IntegrationIC2.toRS(amount), simulate)); } @Optional.Method(modid = "IC2") @Override public double getCharge(ItemStack stack) { - return convertRFToIC2(getEnergyStored(stack)); + return IntegrationIC2.toEU(getEnergyStored(stack)); } @Optional.Method(modid = "IC2") @Override public double getMaxCharge(ItemStack stack) { - return convertRFToIC2(getMaxEnergyStored(stack)); + return IntegrationIC2.toEU(getMaxEnergyStored(stack)); } @Optional.Method(modid = "IC2") @@ -290,29 +281,6 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle return Integer.MAX_VALUE; } - class TeslaEnergy implements ITeslaHolder, ITeslaConsumer { - private ItemStack stack; - - public TeslaEnergy(ItemStack stack) { - this.stack = stack; - } - - @Override - public long getStoredPower() { - return getEnergyStored(stack); - } - - @Override - public long getCapacity() { - return getMaxEnergyStored(stack); - } - - @Override - public long givePower(long power, boolean simulated) { - return receiveEnergy(stack, (int) power, simulated); - } - } - class WirelessGridCapabilityProvider implements ICapabilityProvider { private ItemStack stack; @@ -322,13 +290,13 @@ public class ItemWirelessGrid extends ItemEnergyContainer implements ISpecialEle @Override public boolean hasCapability(Capability capability, @Nullable EnumFacing facing) { - return RefinedStorage.hasTesla() && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER); + return IntegrationTesla.isLoaded() && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER); } @Override public T getCapability(Capability capability, @Nullable EnumFacing facing) { - if (RefinedStorage.hasTesla() && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER)) { - return (T) new TeslaEnergy(stack); + if (IntegrationTesla.isLoaded() && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER)) { + return (T) new WirelessGridEnergyTesla(ItemWirelessGrid.this, stack); } return null; diff --git a/src/main/java/refinedstorage/jei/SoldererRecipeHandler.java b/src/main/java/refinedstorage/jei/SoldererRecipeHandler.java deleted file mode 100755 index ce122bb10..000000000 --- a/src/main/java/refinedstorage/jei/SoldererRecipeHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package refinedstorage.jei; - -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; - -import javax.annotation.Nonnull; - -public class SoldererRecipeHandler implements IRecipeHandler { - @Override - public Class getRecipeClass() { - return SoldererRecipeWrapper.class; - } - - @Override - public String getRecipeCategoryUid() { - return SoldererRecipeCategory.ID; - } - - @Nonnull - @Override - public String getRecipeCategoryUid(@Nonnull SoldererRecipeWrapper recipe) { - return SoldererRecipeCategory.ID; - } - - @Override - public IRecipeWrapper getRecipeWrapper(SoldererRecipeWrapper recipe) { - return recipe; - } - - @Override - public boolean isRecipeValid(SoldererRecipeWrapper recipe) { - return true; - } -} diff --git a/src/main/java/refinedstorage/network/MessageCompareUpdate.java b/src/main/java/refinedstorage/network/MessageCompareUpdate.java deleted file mode 100755 index e3f09e3a7..000000000 --- a/src/main/java/refinedstorage/network/MessageCompareUpdate.java +++ /dev/null @@ -1,50 +0,0 @@ -package refinedstorage.network; - -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import refinedstorage.tile.config.ICompareConfig; - -public class MessageCompareUpdate extends MessageHandlerPlayerToServer implements IMessage { - private int x; - private int y; - private int z; - private int compare; - - public MessageCompareUpdate() { - } - - public MessageCompareUpdate(ICompareConfig setting, int compare) { - this.x = ((TileEntity) setting).getPos().getX(); - this.y = ((TileEntity) setting).getPos().getY(); - this.z = ((TileEntity) setting).getPos().getZ(); - this.compare = compare; - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - compare = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - buf.writeInt(compare); - } - - @Override - public void handle(MessageCompareUpdate message, EntityPlayerMP player) { - TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.x, message.y, message.z)); - - if (tile instanceof ICompareConfig) { - ((ICompareConfig) tile).setCompare(message.compare); - } - } -} diff --git a/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java b/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java index eb93f2ce0..48852412b 100755 --- a/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java +++ b/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java @@ -47,7 +47,7 @@ public class MessageCraftingMonitorCancel extends MessageHandlerPlayerToServer implements IMessage { - private int x; - private int y; - private int z; - private int amount; - - public MessageDetectorAmountUpdate() { - } - - public MessageDetectorAmountUpdate(TileDetector detector, int amount) { - this.x = detector.getPos().getX(); - this.y = detector.getPos().getY(); - this.z = detector.getPos().getZ(); - this.amount = amount; - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - amount = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - buf.writeInt(amount); - } - - @Override - public void handle(MessageDetectorAmountUpdate message, EntityPlayerMP player) { - TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.x, message.y, message.z)); - - if (tile instanceof TileDetector && message.amount >= 0) { - ((TileDetector) tile).setAmount(message.amount); - } - } -} diff --git a/src/main/java/refinedstorage/network/MessageDetectorModeUpdate.java b/src/main/java/refinedstorage/network/MessageDetectorModeUpdate.java deleted file mode 100755 index 4b2905426..000000000 --- a/src/main/java/refinedstorage/network/MessageDetectorModeUpdate.java +++ /dev/null @@ -1,58 +0,0 @@ -package refinedstorage.network; - -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import refinedstorage.tile.TileDetector; - -public class MessageDetectorModeUpdate extends MessageHandlerPlayerToServer implements IMessage { - private int x; - private int y; - private int z; - - public MessageDetectorModeUpdate() { - } - - public MessageDetectorModeUpdate(TileDetector detector) { - this.x = detector.getPos().getX(); - this.y = detector.getPos().getY(); - this.z = detector.getPos().getZ(); - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - } - - @Override - public void handle(MessageDetectorModeUpdate message, EntityPlayerMP player) { - TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.x, message.y, message.z)); - - if (tile instanceof TileDetector) { - TileDetector detector = (TileDetector) tile; - - switch (detector.getMode()) { - case TileDetector.MODE_UNDER: - detector.setMode(TileDetector.MODE_EQUAL); - break; - case TileDetector.MODE_EQUAL: - detector.setMode(TileDetector.MODE_ABOVE); - break; - case TileDetector.MODE_ABOVE: - detector.setMode(TileDetector.MODE_UNDER); - break; - } - } - } -} diff --git a/src/main/java/refinedstorage/network/MessageGridCraftingStart.java b/src/main/java/refinedstorage/network/MessageGridCraftingStart.java index e0d610f9e..e13ad0159 100755 --- a/src/main/java/refinedstorage/network/MessageGridCraftingStart.java +++ b/src/main/java/refinedstorage/network/MessageGridCraftingStart.java @@ -4,30 +4,30 @@ import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import refinedstorage.api.network.IGridHandler; +import refinedstorage.api.network.grid.IItemGridHandler; import refinedstorage.container.ContainerGrid; public class MessageGridCraftingStart extends MessageHandlerPlayerToServer implements IMessage { - private int id; + private int hash; private int quantity; public MessageGridCraftingStart() { } - public MessageGridCraftingStart(int id, int quantity) { - this.id = id; + public MessageGridCraftingStart(int hash, int quantity) { + this.hash = hash; this.quantity = quantity; } @Override public void fromBytes(ByteBuf buf) { - id = buf.readInt(); + hash = buf.readInt(); quantity = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { - buf.writeInt(id); + buf.writeInt(hash); buf.writeInt(quantity); } @@ -36,10 +36,10 @@ public class MessageGridCraftingStart extends MessageHandlerPlayerToServer implements IMessage { + private int compare; + + public MessageGridFilterUpdate() { + } + + public MessageGridFilterUpdate(int compare) { + this.compare = compare; + } + + @Override + public void fromBytes(ByteBuf buf) { + compare = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(compare); + } + + @Override + public void handle(MessageGridFilterUpdate message, EntityPlayerMP player) { + if (player.openContainer instanceof ContainerGridFilter) { + ItemGridFilter.setCompare(((ContainerGridFilter) player.openContainer).getStack(), message.compare); + } + } +} diff --git a/src/main/java/refinedstorage/network/MessageGridFluidDelta.java b/src/main/java/refinedstorage/network/MessageGridFluidDelta.java new file mode 100755 index 000000000..a14070fee --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageGridFluidDelta.java @@ -0,0 +1,61 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import refinedstorage.gui.grid.GuiGrid; +import refinedstorage.gui.grid.stack.ClientStackFluid; + +public class MessageGridFluidDelta implements IMessage, IMessageHandler { + private FluidStack stack; + private int delta; + + private ClientStackFluid clientStack; + + public MessageGridFluidDelta() { + } + + public MessageGridFluidDelta(FluidStack stack, int delta) { + this.stack = stack; + this.delta = delta; + } + + @Override + public void fromBytes(ByteBuf buf) { + clientStack = new ClientStackFluid(buf); + delta = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + ClientStackFluid.write(buf, stack); + buf.writeInt(delta); + } + + @Override + public IMessage onMessage(MessageGridFluidDelta message, MessageContext ctx) { + Fluid fluid = message.clientStack.getStack().getFluid(); + + for (ClientStackFluid stack : GuiGrid.FLUIDS.get(fluid)) { + if (stack.equals(message.clientStack)) { + if (stack.getStack().amount + message.delta == 0) { + GuiGrid.FLUIDS.remove(fluid, stack); + } else { + stack.getStack().amount += message.delta; + } + + GuiGrid.markForSorting(); + + return null; + } + } + + GuiGrid.FLUIDS.put(fluid, message.clientStack); + GuiGrid.markForSorting(); + + return null; + } +} diff --git a/src/main/java/refinedstorage/network/MessageGridFluidInsertHeld.java b/src/main/java/refinedstorage/network/MessageGridFluidInsertHeld.java new file mode 100755 index 000000000..f0b47435c --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageGridFluidInsertHeld.java @@ -0,0 +1,34 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import refinedstorage.api.network.grid.IFluidGridHandler; +import refinedstorage.container.ContainerGrid; + +public class MessageGridFluidInsertHeld extends MessageHandlerPlayerToServer implements IMessage { + public MessageGridFluidInsertHeld() { + } + + @Override + public void fromBytes(ByteBuf buf) { + } + + @Override + public void toBytes(ByteBuf buf) { + } + + @Override + public void handle(MessageGridFluidInsertHeld message, EntityPlayerMP player) { + Container container = player.openContainer; + + if (container instanceof ContainerGrid) { + IFluidGridHandler handler = ((ContainerGrid) container).getGrid().getFluidHandler(); + + if (handler != null) { + handler.onInsertHeldContainer(player); + } + } + } +} diff --git a/src/main/java/refinedstorage/network/MessageGridFluidPull.java b/src/main/java/refinedstorage/network/MessageGridFluidPull.java new file mode 100755 index 000000000..0210ef782 --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageGridFluidPull.java @@ -0,0 +1,46 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import refinedstorage.api.network.grid.IFluidGridHandler; +import refinedstorage.container.ContainerGrid; + +public class MessageGridFluidPull extends MessageHandlerPlayerToServer implements IMessage { + private int hash; + private boolean shift; + + public MessageGridFluidPull() { + } + + public MessageGridFluidPull(int hash, boolean shift) { + this.hash = hash; + this.shift = shift; + } + + @Override + public void fromBytes(ByteBuf buf) { + hash = buf.readInt(); + shift = buf.readBoolean(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(hash); + buf.writeBoolean(shift); + } + + @Override + public void handle(MessageGridFluidPull message, EntityPlayerMP player) { + Container container = player.openContainer; + + if (container instanceof ContainerGrid) { + IFluidGridHandler handler = ((ContainerGrid) container).getGrid().getFluidHandler(); + + if (handler != null) { + handler.onExtract(message.hash, message.shift, player); + } + } + } +} diff --git a/src/main/java/refinedstorage/network/MessageGridFluidUpdate.java b/src/main/java/refinedstorage/network/MessageGridFluidUpdate.java new file mode 100755 index 000000000..fa88d7c45 --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageGridFluidUpdate.java @@ -0,0 +1,56 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.gui.grid.GuiGrid; +import refinedstorage.gui.grid.stack.ClientStackFluid; + +import java.util.ArrayList; +import java.util.List; + +public class MessageGridFluidUpdate implements IMessage, IMessageHandler { + private INetworkMaster network; + private List stacks = new ArrayList<>(); + + public MessageGridFluidUpdate() { + } + + public MessageGridFluidUpdate(INetworkMaster network) { + this.network = network; + } + + @Override + public void fromBytes(ByteBuf buf) { + int items = buf.readInt(); + + for (int i = 0; i < items; ++i) { + this.stacks.add(new ClientStackFluid(buf)); + } + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(network.getFluidStorage().getStacks().size()); + + for (FluidStack stack : network.getFluidStorage().getStacks()) { + ClientStackFluid.write(buf, stack); + } + } + + @Override + public IMessage onMessage(MessageGridFluidUpdate message, MessageContext ctx) { + GuiGrid.FLUIDS.clear(); + + for (ClientStackFluid item : message.stacks) { + GuiGrid.FLUIDS.put(item.getStack().getFluid(), item); + } + + GuiGrid.markForSorting(); + + return null; + } +} diff --git a/src/main/java/refinedstorage/network/MessageGridDelta.java b/src/main/java/refinedstorage/network/MessageGridItemDelta.java similarity index 55% rename from src/main/java/refinedstorage/network/MessageGridDelta.java rename to src/main/java/refinedstorage/network/MessageGridItemDelta.java index 1116b865b..dc6e5c838 100755 --- a/src/main/java/refinedstorage/network/MessageGridDelta.java +++ b/src/main/java/refinedstorage/network/MessageGridItemDelta.java @@ -1,25 +1,26 @@ package refinedstorage.network; import io.netty.buffer.ByteBuf; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import refinedstorage.RefinedStorage; import refinedstorage.api.network.INetworkMaster; -import refinedstorage.apiimpl.storage.ClientStack; +import refinedstorage.gui.grid.GuiGrid; +import refinedstorage.gui.grid.stack.ClientStackItem; -public class MessageGridDelta implements IMessage, IMessageHandler { +public class MessageGridItemDelta implements IMessage, IMessageHandler { private INetworkMaster network; private ItemStack stack; private int delta; - private ClientStack clientStack; + private ClientStackItem clientStack; - public MessageGridDelta() { + public MessageGridItemDelta() { } - public MessageGridDelta(INetworkMaster network, ItemStack stack, int delta) { + public MessageGridItemDelta(INetworkMaster network, ItemStack stack, int delta) { this.network = network; this.stack = stack; this.delta = delta; @@ -27,31 +28,36 @@ public class MessageGridDelta implements IMessage, IMessageHandler implements IMessage { +public class MessageGridItemInsertHeld extends MessageHandlerPlayerToServer implements IMessage { private boolean single; - public MessageGridInsertHeld() { + public MessageGridItemInsertHeld() { } - public MessageGridInsertHeld(boolean single) { + public MessageGridItemInsertHeld(boolean single) { this.single = single; } @@ -28,14 +28,14 @@ public class MessageGridInsertHeld extends MessageHandlerPlayerToServer implements IMessage { - private int id; +public class MessageGridItemPull extends MessageHandlerPlayerToServer implements IMessage { + private int hash; private int flags; - public MessageGridPull() { + public MessageGridItemPull() { } - public MessageGridPull(int id, int flags) { - this.id = id; + public MessageGridItemPull(int hash, int flags) { + this.hash = hash; this.flags = flags; } @Override public void fromBytes(ByteBuf buf) { - id = buf.readInt(); + hash = buf.readInt(); flags = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { - buf.writeInt(id); + buf.writeInt(hash); buf.writeInt(flags); } @Override - public void handle(MessageGridPull message, EntityPlayerMP player) { + public void handle(MessageGridItemPull message, EntityPlayerMP player) { Container container = player.openContainer; if (container instanceof ContainerGrid) { - IGridHandler handler = ((ContainerGrid) container).getGrid().getGridHandler(); + IItemGridHandler handler = ((ContainerGrid) container).getGrid().getItemHandler(); if (handler != null) { - handler.onExtract(message.id, message.flags, player); + handler.onExtract(message.hash, message.flags, player); } } } diff --git a/src/main/java/refinedstorage/network/MessageGridItemUpdate.java b/src/main/java/refinedstorage/network/MessageGridItemUpdate.java new file mode 100755 index 000000000..2fa33c108 --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageGridItemUpdate.java @@ -0,0 +1,56 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.gui.grid.GuiGrid; +import refinedstorage.gui.grid.stack.ClientStackItem; + +import java.util.ArrayList; +import java.util.List; + +public class MessageGridItemUpdate implements IMessage, IMessageHandler { + private INetworkMaster network; + private List stacks = new ArrayList<>(); + + public MessageGridItemUpdate() { + } + + public MessageGridItemUpdate(INetworkMaster network) { + this.network = network; + } + + @Override + public void fromBytes(ByteBuf buf) { + int items = buf.readInt(); + + for (int i = 0; i < items; ++i) { + this.stacks.add(new ClientStackItem(buf)); + } + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(network.getItemStorage().getStacks().size()); + + for (ItemStack stack : network.getItemStorage().getStacks()) { + ClientStackItem.write(buf, network, stack); + } + } + + @Override + public IMessage onMessage(MessageGridItemUpdate message, MessageContext ctx) { + GuiGrid.ITEMS.clear(); + + for (ClientStackItem item : message.stacks) { + GuiGrid.ITEMS.put(item.getStack().getItem(), item); + } + + GuiGrid.markForSorting(); + + return null; + } +} diff --git a/src/main/java/refinedstorage/network/MessageGridSettingsUpdate.java b/src/main/java/refinedstorage/network/MessageGridSettingsUpdate.java deleted file mode 100755 index 35319cbbb..000000000 --- a/src/main/java/refinedstorage/network/MessageGridSettingsUpdate.java +++ /dev/null @@ -1,68 +0,0 @@ -package refinedstorage.network; - -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import refinedstorage.tile.grid.TileGrid; - -public class MessageGridSettingsUpdate extends MessageHandlerPlayerToServer implements IMessage { - private int x; - private int y; - private int z; - private int sortingDirection; - private int sortingType; - private int searchBoxMode; - - public MessageGridSettingsUpdate() { - } - - public MessageGridSettingsUpdate(TileGrid grid, int sortingDirection, int sortingType, int searchBoxMode) { - this.x = grid.getPos().getX(); - this.y = grid.getPos().getY(); - this.z = grid.getPos().getZ(); - this.sortingDirection = sortingDirection; - this.sortingType = sortingType; - this.searchBoxMode = searchBoxMode; - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - sortingDirection = buf.readInt(); - sortingType = buf.readInt(); - searchBoxMode = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - buf.writeInt(sortingDirection); - buf.writeInt(sortingType); - buf.writeInt(searchBoxMode); - } - - @Override - public void handle(MessageGridSettingsUpdate message, EntityPlayerMP player) { - TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.x, message.y, message.z)); - - if (tile instanceof TileGrid) { - if (TileGrid.isValidSortingDirection(message.sortingDirection)) { - ((TileGrid) tile).setSortingDirection(message.sortingDirection); - } - - if (TileGrid.isValidSortingType(message.sortingType)) { - ((TileGrid) tile).setSortingType(message.sortingType); - } - - if (TileGrid.isValidSearchBoxMode(message.searchBoxMode)) { - ((TileGrid) tile).setSearchBoxMode(message.searchBoxMode); - } - } - } -} diff --git a/src/main/java/refinedstorage/network/MessageGridUpdate.java b/src/main/java/refinedstorage/network/MessageGridUpdate.java deleted file mode 100755 index 5eccb2d4b..000000000 --- a/src/main/java/refinedstorage/network/MessageGridUpdate.java +++ /dev/null @@ -1,50 +0,0 @@ -package refinedstorage.network; - -import io.netty.buffer.ByteBuf; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import refinedstorage.RefinedStorage; -import refinedstorage.api.network.INetworkMaster; -import refinedstorage.apiimpl.storage.ClientStack; - -import java.util.ArrayList; -import java.util.List; - -public class MessageGridUpdate implements IMessage, IMessageHandler { - private INetworkMaster network; - private List items = new ArrayList(); - - public MessageGridUpdate() { - } - - public MessageGridUpdate(INetworkMaster network) { - this.network = network; - } - - @Override - public void fromBytes(ByteBuf buf) { - int items = buf.readInt(); - - for (int i = 0; i < items; ++i) { - this.items.add(new ClientStack(buf)); - } - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(network.getStorage().getStacks().size()); - - for (ItemStack stack : network.getStorage().getStacks()) { - ClientStack.write(buf, network, stack); - } - } - - @Override - public IMessage onMessage(MessageGridUpdate message, MessageContext ctx) { - RefinedStorage.INSTANCE.items = message.items; - - return null; - } -} diff --git a/src/main/java/refinedstorage/network/MessageHandlerPlayerToServer.java b/src/main/java/refinedstorage/network/MessageHandlerPlayerToServer.java index 42dd45673..de261d388 100755 --- a/src/main/java/refinedstorage/network/MessageHandlerPlayerToServer.java +++ b/src/main/java/refinedstorage/network/MessageHandlerPlayerToServer.java @@ -10,12 +10,7 @@ public abstract class MessageHandlerPlayerToServer implement public IMessage onMessage(final T message, MessageContext context) { final EntityPlayerMP player = context.getServerHandler().playerEntity; - player.getServerWorld().addScheduledTask(new Runnable() { - @Override - public void run() { - handle(message, player); - } - }); + player.getServerWorld().addScheduledTask(() -> handle(message, player)); return null; } diff --git a/src/main/java/refinedstorage/network/MessageModeToggle.java b/src/main/java/refinedstorage/network/MessageModeToggle.java deleted file mode 100755 index 4632c3b5d..000000000 --- a/src/main/java/refinedstorage/network/MessageModeToggle.java +++ /dev/null @@ -1,53 +0,0 @@ -package refinedstorage.network; - -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import refinedstorage.tile.config.IModeConfig; -import refinedstorage.tile.config.ModeConstants; - -public class MessageModeToggle extends MessageHandlerPlayerToServer implements IMessage { - private int x; - private int y; - private int z; - - public MessageModeToggle() { - } - - public MessageModeToggle(IModeConfig mode) { - this.x = ((TileEntity) mode).getPos().getX(); - this.y = ((TileEntity) mode).getPos().getY(); - this.z = ((TileEntity) mode).getPos().getZ(); - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - } - - @Override - public void handle(MessageModeToggle message, EntityPlayerMP player) { - TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.x, message.y, message.z)); - - if (tile instanceof IModeConfig) { - IModeConfig mode = (IModeConfig) tile; - - if (mode.getMode() == ModeConstants.WHITELIST) { - mode.setMode(ModeConstants.BLACKLIST); - } else { - mode.setMode(ModeConstants.WHITELIST); - } - } - } -} diff --git a/src/main/java/refinedstorage/network/MessagePriorityUpdate.java b/src/main/java/refinedstorage/network/MessagePriorityUpdate.java deleted file mode 100755 index 6d981a6b3..000000000 --- a/src/main/java/refinedstorage/network/MessagePriorityUpdate.java +++ /dev/null @@ -1,56 +0,0 @@ -package refinedstorage.network; - -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import refinedstorage.tile.TileDiskDrive; -import refinedstorage.tile.TileStorage; -import refinedstorage.tile.externalstorage.TileExternalStorage; - -public class MessagePriorityUpdate extends MessageHandlerPlayerToServer implements IMessage { - private int x; - private int y; - private int z; - private int priority; - - public MessagePriorityUpdate() { - } - - public MessagePriorityUpdate(BlockPos pos, int priority) { - this.x = pos.getX(); - this.y = pos.getY(); - this.z = pos.getZ(); - this.priority = priority; - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - priority = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - buf.writeInt(priority); - } - - @Override - public void handle(MessagePriorityUpdate message, EntityPlayerMP player) { - TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.x, message.y, message.z)); - - if (tile instanceof TileStorage) { - ((TileStorage) tile).setPriority(message.priority); - } else if (tile instanceof TileExternalStorage) { - ((TileExternalStorage) tile).setPriority(message.priority); - } else if (tile instanceof TileDiskDrive) { - ((TileDiskDrive) tile).setPriority(message.priority); - } - } -} diff --git a/src/main/java/refinedstorage/network/MessageRedstoneModeUpdate.java b/src/main/java/refinedstorage/network/MessageRedstoneModeUpdate.java deleted file mode 100755 index ba6752aad..000000000 --- a/src/main/java/refinedstorage/network/MessageRedstoneModeUpdate.java +++ /dev/null @@ -1,48 +0,0 @@ -package refinedstorage.network; - -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import refinedstorage.tile.config.IRedstoneModeConfig; - -public class MessageRedstoneModeUpdate extends MessageHandlerPlayerToServer implements IMessage { - private int x; - private int y; - private int z; - - public MessageRedstoneModeUpdate() { - } - - public MessageRedstoneModeUpdate(IRedstoneModeConfig setting) { - this.x = ((TileEntity) setting).getPos().getX(); - this.y = ((TileEntity) setting).getPos().getY(); - this.z = ((TileEntity) setting).getPos().getZ(); - } - - @Override - public void fromBytes(ByteBuf buf) { - x = buf.readInt(); - y = buf.readInt(); - z = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(x); - buf.writeInt(y); - buf.writeInt(z); - } - - @Override - public void handle(MessageRedstoneModeUpdate message, EntityPlayerMP player) { - TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.x, message.y, message.z)); - - if (tile instanceof IRedstoneModeConfig) { - IRedstoneModeConfig setting = (IRedstoneModeConfig) tile; - - setting.setRedstoneMode(setting.getRedstoneMode().next()); - } - } -} diff --git a/src/main/java/refinedstorage/network/MessageTileContainerUpdate.java b/src/main/java/refinedstorage/network/MessageTileContainerUpdate.java deleted file mode 100755 index 03880c1f5..000000000 --- a/src/main/java/refinedstorage/network/MessageTileContainerUpdate.java +++ /dev/null @@ -1,53 +0,0 @@ -package refinedstorage.network; - -import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import refinedstorage.proxy.ClientProxy; -import refinedstorage.tile.ISynchronizedContainer; - -public class MessageTileContainerUpdate implements IMessage, IMessageHandler { - private TileEntity tile; - - public MessageTileContainerUpdate() { - } - - public MessageTileContainerUpdate(TileEntity tile) { - this.tile = tile; - } - - @Override - public void fromBytes(ByteBuf buf) { - int x = buf.readInt(); - int y = buf.readInt(); - int z = buf.readInt(); - - if (Minecraft.getMinecraft().theWorld != null) { - tile = ClientProxy.getWorld().getTileEntity(new BlockPos(x, y, z)); - - if (tile instanceof ISynchronizedContainer) { - ((ISynchronizedContainer) tile).readContainerData(buf); - } - } - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(tile.getPos().getX()); - buf.writeInt(tile.getPos().getY()); - buf.writeInt(tile.getPos().getZ()); - - if (tile instanceof ISynchronizedContainer) { - ((ISynchronizedContainer) tile).writeContainerData(buf); - } - } - - @Override - public IMessage onMessage(MessageTileContainerUpdate message, MessageContext ctx) { - return null; - } -} diff --git a/src/main/java/refinedstorage/network/MessageTileDataParameter.java b/src/main/java/refinedstorage/network/MessageTileDataParameter.java new file mode 100755 index 000000000..c57daa17f --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageTileDataParameter.java @@ -0,0 +1,51 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import refinedstorage.tile.data.TileDataManager; +import refinedstorage.tile.data.TileDataParameter; + +import java.io.IOException; + +public class MessageTileDataParameter implements IMessage, IMessageHandler { + private TileEntity tile; + private TileDataParameter parameter; + + public MessageTileDataParameter() { + } + + public MessageTileDataParameter(TileEntity tile, TileDataParameter parameter) { + this.tile = tile; + this.parameter = parameter; + } + + @Override + public void fromBytes(ByteBuf buf) { + int id = buf.readInt(); + + TileDataParameter parameter = TileDataManager.getParameter(id); + + if (parameter != null) { + try { + parameter.setValue(parameter.getSerializer().read(new PacketBuffer(buf))); + } catch (IOException ignored) { + } + } + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(parameter.getId()); + + parameter.getSerializer().write((PacketBuffer) buf, parameter.getValueProducer().getValue(tile)); + } + + @Override + public IMessage onMessage(MessageTileDataParameter message, MessageContext ctx) { + return null; + } +} diff --git a/src/main/java/refinedstorage/network/MessageTileDataParameterUpdate.java b/src/main/java/refinedstorage/network/MessageTileDataParameterUpdate.java new file mode 100755 index 000000000..b4dd676ae --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageTileDataParameterUpdate.java @@ -0,0 +1,60 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import refinedstorage.container.ContainerBase; +import refinedstorage.tile.data.ITileDataConsumer; +import refinedstorage.tile.data.TileDataManager; +import refinedstorage.tile.data.TileDataParameter; + +import java.io.IOException; + +public class MessageTileDataParameterUpdate extends MessageHandlerPlayerToServer implements IMessage { + private TileDataParameter parameter; + private Object value; + + public MessageTileDataParameterUpdate() { + } + + public MessageTileDataParameterUpdate(TileDataParameter parameter, Object value) { + this.parameter = parameter; + this.value = value; + } + + @Override + public void fromBytes(ByteBuf buf) { + int id = buf.readInt(); + + parameter = TileDataManager.getParameter(id); + + if (parameter != null) { + try { + value = parameter.getSerializer().read(new PacketBuffer(buf)); + } catch (IOException ignored) { + } + } + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(parameter.getId()); + + parameter.getSerializer().write((PacketBuffer) buf, value); + } + + @Override + public void handle(MessageTileDataParameterUpdate message, EntityPlayerMP player) { + Container c = player.openContainer; + + if (c instanceof ContainerBase) { + ITileDataConsumer consumer = message.parameter.getValueConsumer(); + + if (consumer != null) { + consumer.setValue(((ContainerBase) c).getTile(), message.value); + } + } + } +} diff --git a/src/main/java/refinedstorage/network/MessageWirelessGridSettingsUpdate.java b/src/main/java/refinedstorage/network/MessageWirelessGridSettingsUpdate.java index 05d345114..2729a1795 100755 --- a/src/main/java/refinedstorage/network/MessageWirelessGridSettingsUpdate.java +++ b/src/main/java/refinedstorage/network/MessageWirelessGridSettingsUpdate.java @@ -4,13 +4,13 @@ import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.item.ItemWirelessGrid; +import refinedstorage.container.ContainerGrid; +import refinedstorage.tile.grid.IGrid; import refinedstorage.tile.grid.TileGrid; +import refinedstorage.tile.grid.WirelessGrid; public class MessageWirelessGridSettingsUpdate extends MessageHandlerPlayerToServer implements IMessage { - private int hand; + private int viewType; private int sortingDirection; private int sortingType; private int searchBoxMode; @@ -18,8 +18,8 @@ public class MessageWirelessGridSettingsUpdate extends MessageHandlerPlayerToSer public MessageWirelessGridSettingsUpdate() { } - public MessageWirelessGridSettingsUpdate(int hand, int sortingDirection, int sortingType, int searchBoxMode) { - this.hand = hand; + public MessageWirelessGridSettingsUpdate(int viewType, int sortingDirection, int sortingType, int searchBoxMode) { + this.viewType = viewType; this.sortingDirection = sortingDirection; this.sortingType = sortingType; this.searchBoxMode = searchBoxMode; @@ -27,7 +27,7 @@ public class MessageWirelessGridSettingsUpdate extends MessageHandlerPlayerToSer @Override public void fromBytes(ByteBuf buf) { - hand = buf.readInt(); + viewType = buf.readInt(); sortingDirection = buf.readInt(); sortingType = buf.readInt(); searchBoxMode = buf.readInt(); @@ -35,7 +35,7 @@ public class MessageWirelessGridSettingsUpdate extends MessageHandlerPlayerToSer @Override public void toBytes(ByteBuf buf) { - buf.writeInt(hand); + buf.writeInt(viewType); buf.writeInt(sortingDirection); buf.writeInt(sortingType); buf.writeInt(searchBoxMode); @@ -43,19 +43,27 @@ public class MessageWirelessGridSettingsUpdate extends MessageHandlerPlayerToSer @Override public void handle(MessageWirelessGridSettingsUpdate message, EntityPlayerMP player) { - ItemStack held = player.getHeldItem(RefinedStorageUtils.getHandById(message.hand)); + if (player.openContainer instanceof ContainerGrid) { + IGrid grid = ((ContainerGrid) player.openContainer).getGrid(); - if (held != null && held.getItem() == RefinedStorageItems.WIRELESS_GRID && held.getTagCompound() != null) { - if (TileGrid.isValidSortingDirection(message.sortingDirection)) { - held.getTagCompound().setInteger(ItemWirelessGrid.NBT_SORTING_DIRECTION, message.sortingDirection); - } + if (grid instanceof WirelessGrid) { + ItemStack stack = ((WirelessGrid) grid).getStack(); - if (TileGrid.isValidSortingType(message.sortingType)) { - held.getTagCompound().setInteger(ItemWirelessGrid.NBT_SORTING_TYPE, message.sortingType); - } + if (TileGrid.isValidViewType(message.viewType)) { + stack.getTagCompound().setInteger(TileGrid.NBT_VIEW_TYPE, message.viewType); + } - if (TileGrid.isValidSearchBoxMode(message.searchBoxMode)) { - held.getTagCompound().setInteger(ItemWirelessGrid.NBT_SEARCH_BOX_MODE, message.searchBoxMode); + if (TileGrid.isValidSortingDirection(message.sortingDirection)) { + stack.getTagCompound().setInteger(TileGrid.NBT_SORTING_DIRECTION, message.sortingDirection); + } + + if (TileGrid.isValidSortingType(message.sortingType)) { + stack.getTagCompound().setInteger(TileGrid.NBT_SORTING_TYPE, message.sortingType); + } + + if (TileGrid.isValidSearchBoxMode(message.searchBoxMode)) { + stack.getTagCompound().setInteger(TileGrid.NBT_SEARCH_BOX_MODE, message.searchBoxMode); + } } } } diff --git a/src/main/java/refinedstorage/proxy/ClientProxy.java b/src/main/java/refinedstorage/proxy/ClientProxy.java index 51a02b210..47e87b205 100755 --- a/src/main/java/refinedstorage/proxy/ClientProxy.java +++ b/src/main/java/refinedstorage/proxy/ClientProxy.java @@ -1,38 +1,153 @@ package refinedstorage.proxy; -import net.minecraft.client.Minecraft; +import mcmultipart.client.multipart.ModelMultipartContainer; +import mcmultipart.raytrace.PartMOP; +import mcmultipart.raytrace.RayTraceUtils; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.block.model.ModelBakery; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.statemap.StateMap; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.client.event.DrawBlockHighlightEvent; +import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.lwjgl.opengl.GL11; +import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageItems; -import refinedstorage.block.EnumControllerType; -import refinedstorage.block.EnumGridType; -import refinedstorage.block.EnumStorageType; +import refinedstorage.block.*; import refinedstorage.item.*; +import java.util.List; + public class ClientProxy extends CommonProxy { - public static World getWorld() { - return Minecraft.getMinecraft().theWorld; + @SubscribeEvent + public void onModelBake(ModelBakeEvent e) { + for (ModelResourceLocation model : e.getModelRegistry().getKeys()) { + for (BlockCable cable : cables) { + if (model.getResourceDomain().equals(RefinedStorage.ID) && model.getResourcePath().equals(cable.getName()) && !model.getVariant().equals("inventory")) { + e.getModelRegistry().putObject(model, new ModelMultipartContainer(e.getModelRegistry().getObject(model), input -> cable.canRenderInLayer(input))); + } + } + } + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onBlockDrawHighlight(DrawBlockHighlightEvent e) { + if (e.getTarget() == null || e.getTarget().getBlockPos() == null) { + return; + } + + EntityPlayer player = e.getPlayer(); + + BlockPos pos = e.getTarget().getBlockPos(); + + IBlockState state = player.worldObj.getBlockState(pos); + + if (!(state.getBlock() instanceof BlockCable)) { + return; + } + + state = ((BlockCable) state.getBlock()).getActualState(state, player.worldObj, pos); + + if (((BlockCable) state.getBlock()).collisionRayTrace(state, player.worldObj, pos, RayTraceUtils.getStart(player), RayTraceUtils.getEnd(player)) instanceof PartMOP) { + return; + } + + List unionized = ((BlockCable) state.getBlock()).getUnionizedCollisionBoxes(state); + List nonUnionized = ((BlockCable) state.getBlock()).getNonUnionizedCollisionBoxes(state); + + e.setCanceled(true); + + GlStateManager.enableBlend(); + GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); + GlStateManager.color(0.0F, 0.0F, 0.0F, 0.4F); + GL11.glLineWidth(2.0F); + GlStateManager.disableTexture2D(); + GlStateManager.depthMask(false); + + double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) e.getPartialTicks(); + double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) e.getPartialTicks(); + double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double) e.getPartialTicks(); + + AxisAlignedBB unionizedAabb = unionized.get(0); + + for (int i = 1; i < unionized.size(); ++i) { + unionizedAabb = unionizedAabb.union(unionized.get(i)); + } + + drawSelectionBoundingBox(unionizedAabb.expand(0.0020000000949949026D, 0.0020000000949949026D, 0.0020000000949949026D).offset(-d0, -d1, -d2).offset(pos.getX(), pos.getY(), pos.getZ())); + + for (AxisAlignedBB aabb : nonUnionized) { + drawSelectionBoundingBox(aabb.expand(0.0020000000949949026D, 0.0020000000949949026D, 0.0020000000949949026D).offset(-d0, -d1, -d2).offset(pos.getX(), pos.getY(), pos.getZ())); + } + + GlStateManager.depthMask(true); + GlStateManager.enableTexture2D(); + GlStateManager.disableBlend(); + } + + private void drawSelectionBoundingBox(AxisAlignedBB aabb) { + Tessellator tessellator = Tessellator.getInstance(); + + VertexBuffer buffer = tessellator.getBuffer(); + + buffer.begin(3, DefaultVertexFormats.POSITION); + buffer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex(); + buffer.pos(aabb.maxX, aabb.minY, aabb.minZ).endVertex(); + buffer.pos(aabb.maxX, aabb.minY, aabb.maxZ).endVertex(); + buffer.pos(aabb.minX, aabb.minY, aabb.maxZ).endVertex(); + buffer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex(); + + tessellator.draw(); + + buffer.begin(3, DefaultVertexFormats.POSITION); + buffer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex(); + buffer.pos(aabb.maxX, aabb.maxY, aabb.minZ).endVertex(); + buffer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex(); + buffer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex(); + buffer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex(); + + tessellator.draw(); + + buffer.begin(1, DefaultVertexFormats.POSITION); + buffer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex(); + buffer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex(); + buffer.pos(aabb.maxX, aabb.minY, aabb.minZ).endVertex(); + buffer.pos(aabb.maxX, aabb.maxY, aabb.minZ).endVertex(); + buffer.pos(aabb.maxX, aabb.minY, aabb.maxZ).endVertex(); + buffer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex(); + buffer.pos(aabb.minX, aabb.minY, aabb.maxZ).endVertex(); + buffer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex(); + + tessellator.draw(); } @Override public void preInit(FMLPreInitializationEvent e) { super.preInit(e); + MinecraftForge.EVENT_BUS.register(this); + // Item Variants ModelBakery.registerItemVariants(RefinedStorageItems.STORAGE_DISK, new ResourceLocation("refinedstorage:1k_storage_disk"), new ResourceLocation("refinedstorage:4k_storage_disk"), new ResourceLocation("refinedstorage:16k_storage_disk"), new ResourceLocation("refinedstorage:64k_storage_disk"), - new ResourceLocation("refinedstorage:creative_storage_disk"), - new ResourceLocation("refinedstorage:debug_storage_disk") + new ResourceLocation("refinedstorage:creative_storage_disk") ); ModelBakery.registerItemVariants(RefinedStorageItems.STORAGE_PART, @@ -42,6 +157,21 @@ public class ClientProxy extends CommonProxy { new ResourceLocation("refinedstorage:64k_storage_part") ); + ModelBakery.registerItemVariants(RefinedStorageItems.FLUID_STORAGE_DISK, + new ResourceLocation("refinedstorage:64k_fluid_storage_disk"), + new ResourceLocation("refinedstorage:128k_fluid_storage_disk"), + new ResourceLocation("refinedstorage:256k_fluid_storage_disk"), + new ResourceLocation("refinedstorage:512k_fluid_storage_disk"), + new ResourceLocation("refinedstorage:creative_fluid_storage_disk") + ); + + ModelBakery.registerItemVariants(RefinedStorageItems.FLUID_STORAGE_PART, + new ResourceLocation("refinedstorage:64k_fluid_storage_part"), + new ResourceLocation("refinedstorage:128k_fluid_storage_part"), + new ResourceLocation("refinedstorage:256k_fluid_storage_part"), + new ResourceLocation("refinedstorage:512k_fluid_storage_part") + ); + ModelBakery.registerItemVariants(RefinedStorageItems.PROCESSOR, new ResourceLocation("refinedstorage:basic_printed_processor"), new ResourceLocation("refinedstorage:improved_printed_processor"), @@ -61,7 +191,8 @@ public class ClientProxy extends CommonProxy { new ResourceLocation("refinedstorage:upgrade"), new ResourceLocation("refinedstorage:range_upgrade"), new ResourceLocation("refinedstorage:speed_upgrade"), - new ResourceLocation("refinedstorage:stack_upgrade") + new ResourceLocation("refinedstorage:stack_upgrade"), + new ResourceLocation("refinedstorage:interdimensional_upgrade") ); // Items @@ -70,13 +201,23 @@ public class ClientProxy extends CommonProxy { ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.STORAGE_DISK, ItemStorageDisk.TYPE_16K, new ModelResourceLocation("refinedstorage:16k_storage_disk", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.STORAGE_DISK, ItemStorageDisk.TYPE_64K, new ModelResourceLocation("refinedstorage:64k_storage_disk", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.STORAGE_DISK, ItemStorageDisk.TYPE_CREATIVE, new ModelResourceLocation("refinedstorage:creative_storage_disk", "inventory")); - ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.STORAGE_DISK, ItemStorageDisk.TYPE_DEBUG, new ModelResourceLocation("refinedstorage:debug_storage_disk", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.STORAGE_PART, ItemStoragePart.TYPE_1K, new ModelResourceLocation("refinedstorage:1k_storage_part", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.STORAGE_PART, ItemStoragePart.TYPE_4K, new ModelResourceLocation("refinedstorage:4k_storage_part", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.STORAGE_PART, ItemStoragePart.TYPE_16K, new ModelResourceLocation("refinedstorage:16k_storage_part", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.STORAGE_PART, ItemStoragePart.TYPE_64K, new ModelResourceLocation("refinedstorage:64k_storage_part", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.FLUID_STORAGE_DISK, ItemFluidStorageDisk.TYPE_64K, new ModelResourceLocation("refinedstorage:64k_fluid_storage_disk", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.FLUID_STORAGE_DISK, ItemFluidStorageDisk.TYPE_128K, new ModelResourceLocation("refinedstorage:128k_fluid_storage_disk", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.FLUID_STORAGE_DISK, ItemFluidStorageDisk.TYPE_256K, new ModelResourceLocation("refinedstorage:256k_fluid_storage_disk", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.FLUID_STORAGE_DISK, ItemFluidStorageDisk.TYPE_512K, new ModelResourceLocation("refinedstorage:512k_fluid_storage_disk", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.FLUID_STORAGE_DISK, ItemFluidStorageDisk.TYPE_CREATIVE, new ModelResourceLocation("refinedstorage:creative_fluid_storage_disk", "inventory")); + + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.FLUID_STORAGE_PART, ItemFluidStoragePart.TYPE_64K, new ModelResourceLocation("refinedstorage:64k_fluid_storage_part", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.FLUID_STORAGE_PART, ItemFluidStoragePart.TYPE_128K, new ModelResourceLocation("refinedstorage:128k_fluid_storage_part", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.FLUID_STORAGE_PART, ItemFluidStoragePart.TYPE_256K, new ModelResourceLocation("refinedstorage:256k_fluid_storage_part", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.FLUID_STORAGE_PART, ItemFluidStoragePart.TYPE_512K, new ModelResourceLocation("refinedstorage:512k_fluid_storage_part", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.PROCESSOR, ItemProcessor.TYPE_PRINTED_BASIC, new ModelResourceLocation("refinedstorage:basic_printed_processor", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.PROCESSOR, ItemProcessor.TYPE_PRINTED_IMPROVED, new ModelResourceLocation("refinedstorage:improved_printed_processor", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.PROCESSOR, ItemProcessor.TYPE_PRINTED_ADVANCED, new ModelResourceLocation("refinedstorage:advanced_printed_processor", "inventory")); @@ -94,12 +235,15 @@ public class ClientProxy extends CommonProxy { ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.WIRELESS_GRID, 0, new ModelResourceLocation("refinedstorage:wireless_grid", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.PATTERN, 0, new ModelResourceLocation("refinedstorage:pattern", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.STORAGE_HOUSING, 0, new ModelResourceLocation("refinedstorage:storage_housing", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.GRID_FILTER, 0, new ModelResourceLocation("refinedstorage:grid_filter", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.NETWORK_CARD, 0, new ModelResourceLocation("refinedstorage:network_card", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.UPGRADE, 0, new ModelResourceLocation("refinedstorage:upgrade", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_RANGE, new ModelResourceLocation("refinedstorage:range_upgrade", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_SPEED, new ModelResourceLocation("refinedstorage:speed_upgrade", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_CRAFTING, new ModelResourceLocation("refinedstorage:crafting_upgrade", "inventory")); ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_STACK, new ModelResourceLocation("refinedstorage:stack_upgrade", "inventory")); + ModelLoader.setCustomModelResourceLocation(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_INTERDIMENSIONAL, new ModelResourceLocation("refinedstorage:interdimensional_upgrade", "inventory")); // Blocks ModelLoader.setCustomStateMapper(RefinedStorageBlocks.GRID, (new StateMap.Builder()) @@ -111,6 +255,7 @@ public class ClientProxy extends CommonProxy { ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.GRID), EnumGridType.NORMAL.getId(), new ModelResourceLocation("refinedstorage:grid", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.GRID), EnumGridType.CRAFTING.getId(), new ModelResourceLocation("refinedstorage:grid", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.GRID), EnumGridType.PATTERN.getId(), new ModelResourceLocation("refinedstorage:grid", "inventory")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.GRID), EnumGridType.FLUID.getId(), new ModelResourceLocation("refinedstorage:grid", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.MACHINE_CASING), 0, new ModelResourceLocation("refinedstorage:machine_casing", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.EXPORTER), 0, new ModelResourceLocation("refinedstorage:exporter", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.IMPORTER), 0, new ModelResourceLocation("refinedstorage:importer", "inventory")); @@ -124,14 +269,22 @@ public class ClientProxy extends CommonProxy { ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.DETECTOR), 0, new ModelResourceLocation("refinedstorage:detector", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.RELAY), 0, new ModelResourceLocation("refinedstorage:relay", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.INTERFACE), 0, new ModelResourceLocation("refinedstorage:interface", "inventory")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.FLUID_INTERFACE), 0, new ModelResourceLocation("refinedstorage:fluid_interface", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.WIRELESS_TRANSMITTER), 0, new ModelResourceLocation("refinedstorage:wireless_transmitter", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.CRAFTING_MONITOR), 0, new ModelResourceLocation("refinedstorage:crafting_monitor", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.CRAFTER), 0, new ModelResourceLocation("refinedstorage:crafter", "inventory")); ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.PROCESSING_PATTERN_ENCODER), 0, new ModelResourceLocation("refinedstorage:processing_pattern_encoder", "inventory")); - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.STORAGE), EnumStorageType.TYPE_1K.getId(), new ModelResourceLocation("refinedstorage:storage", "type=1k")); - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.STORAGE), EnumStorageType.TYPE_4K.getId(), new ModelResourceLocation("refinedstorage:storage", "type=4k")); - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.STORAGE), EnumStorageType.TYPE_16K.getId(), new ModelResourceLocation("refinedstorage:storage", "type=16k")); - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.STORAGE), EnumStorageType.TYPE_64K.getId(), new ModelResourceLocation("refinedstorage:storage", "type=64k")); - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.STORAGE), EnumStorageType.TYPE_CREATIVE.getId(), new ModelResourceLocation("refinedstorage:storage", "type=creative")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.NETWORK_TRANSMITTER), 0, new ModelResourceLocation("refinedstorage:network_transmitter", "inventory")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.NETWORK_RECEIVER), 0, new ModelResourceLocation("refinedstorage:network_receiver", "inventory")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.STORAGE), EnumItemStorageType.TYPE_1K.getId(), new ModelResourceLocation("refinedstorage:storage", "type=1k")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.STORAGE), EnumItemStorageType.TYPE_4K.getId(), new ModelResourceLocation("refinedstorage:storage", "type=4k")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.STORAGE), EnumItemStorageType.TYPE_16K.getId(), new ModelResourceLocation("refinedstorage:storage", "type=16k")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.STORAGE), EnumItemStorageType.TYPE_64K.getId(), new ModelResourceLocation("refinedstorage:storage", "type=64k")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.STORAGE), EnumItemStorageType.TYPE_CREATIVE.getId(), new ModelResourceLocation("refinedstorage:storage", "type=creative")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.FLUID_STORAGE), EnumFluidStorageType.TYPE_64K.getId(), new ModelResourceLocation("refinedstorage:fluid_storage", "type=64k")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.FLUID_STORAGE), EnumFluidStorageType.TYPE_128K.getId(), new ModelResourceLocation("refinedstorage:fluid_storage", "type=128k")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.FLUID_STORAGE), EnumFluidStorageType.TYPE_256K.getId(), new ModelResourceLocation("refinedstorage:fluid_storage", "type=256k")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.FLUID_STORAGE), EnumFluidStorageType.TYPE_512K.getId(), new ModelResourceLocation("refinedstorage:fluid_storage", "type=512k")); + ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(RefinedStorageBlocks.FLUID_STORAGE), EnumFluidStorageType.TYPE_CREATIVE.getId(), new ModelResourceLocation("refinedstorage:fluid_storage", "type=creative")); } } diff --git a/src/main/java/refinedstorage/proxy/CommonProxy.java b/src/main/java/refinedstorage/proxy/CommonProxy.java index 8383ba7fe..96da659e5 100755 --- a/src/main/java/refinedstorage/proxy/CommonProxy.java +++ b/src/main/java/refinedstorage/proxy/CommonProxy.java @@ -4,7 +4,9 @@ import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; @@ -18,67 +20,73 @@ import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageItems; import refinedstorage.api.RefinedStorageAPI; import refinedstorage.apiimpl.solderer.*; -import refinedstorage.apiimpl.storage.NBTStorage; -import refinedstorage.block.BlockBase; -import refinedstorage.block.EnumControllerType; -import refinedstorage.block.EnumGridType; -import refinedstorage.block.EnumStorageType; +import refinedstorage.apiimpl.storage.item.ItemStorageNBT; +import refinedstorage.block.*; import refinedstorage.gui.GuiHandler; import refinedstorage.item.*; import refinedstorage.network.*; import refinedstorage.tile.*; -import refinedstorage.tile.controller.TileController; +import refinedstorage.tile.data.ContainerListener; +import refinedstorage.tile.data.TileDataManager; import refinedstorage.tile.externalstorage.TileExternalStorage; import refinedstorage.tile.grid.TileGrid; -import static refinedstorage.RefinedStorage.ID; +import java.util.ArrayList; +import java.util.List; public class CommonProxy { + protected List cables = new ArrayList<>(); + public void preInit(FMLPreInitializationEvent e) { RefinedStorageAPI.SOLDERER_REGISTRY = new SoldererRegistry(); int id = 0; - RefinedStorage.INSTANCE.network.registerMessage(MessageTileContainerUpdate.class, MessageTileContainerUpdate.class, id++, Side.CLIENT); - RefinedStorage.INSTANCE.network.registerMessage(MessageRedstoneModeUpdate.class, MessageRedstoneModeUpdate.class, id++, Side.SERVER); - RefinedStorage.INSTANCE.network.registerMessage(MessageGridInsertHeld.class, MessageGridInsertHeld.class, id++, Side.SERVER); - RefinedStorage.INSTANCE.network.registerMessage(MessageGridPull.class, MessageGridPull.class, id++, Side.SERVER); - RefinedStorage.INSTANCE.network.registerMessage(MessageCompareUpdate.class, MessageCompareUpdate.class, id++, Side.SERVER); - RefinedStorage.INSTANCE.network.registerMessage(MessageModeToggle.class, MessageModeToggle.class, id++, Side.SERVER); - RefinedStorage.INSTANCE.network.registerMessage(MessageDetectorModeUpdate.class, MessageDetectorModeUpdate.class, id++, Side.SERVER); - RefinedStorage.INSTANCE.network.registerMessage(MessageDetectorAmountUpdate.class, MessageDetectorAmountUpdate.class, id++, Side.SERVER); + RefinedStorage.INSTANCE.network.registerMessage(MessageTileDataParameter.class, MessageTileDataParameter.class, id++, Side.CLIENT); + RefinedStorage.INSTANCE.network.registerMessage(MessageTileDataParameterUpdate.class, MessageTileDataParameterUpdate.class, id++, Side.SERVER); + RefinedStorage.INSTANCE.network.registerMessage(MessageGridItemInsertHeld.class, MessageGridItemInsertHeld.class, id++, Side.SERVER); + RefinedStorage.INSTANCE.network.registerMessage(MessageGridItemPull.class, MessageGridItemPull.class, id++, Side.SERVER); RefinedStorage.INSTANCE.network.registerMessage(MessageGridCraftingClear.class, MessageGridCraftingClear.class, id++, Side.SERVER); - RefinedStorage.INSTANCE.network.registerMessage(MessagePriorityUpdate.class, MessagePriorityUpdate.class, id++, Side.SERVER); - RefinedStorage.INSTANCE.network.registerMessage(MessageGridSettingsUpdate.class, MessageGridSettingsUpdate.class, id++, Side.SERVER); RefinedStorage.INSTANCE.network.registerMessage(MessageGridCraftingTransfer.class, MessageGridCraftingTransfer.class, id++, Side.SERVER); RefinedStorage.INSTANCE.network.registerMessage(MessageWirelessGridSettingsUpdate.class, MessageWirelessGridSettingsUpdate.class, id++, Side.SERVER); RefinedStorage.INSTANCE.network.registerMessage(MessageGridCraftingStart.class, MessageGridCraftingStart.class, id++, Side.SERVER); RefinedStorage.INSTANCE.network.registerMessage(MessageGridPatternCreate.class, MessageGridPatternCreate.class, id++, Side.SERVER); RefinedStorage.INSTANCE.network.registerMessage(MessageCraftingMonitorCancel.class, MessageCraftingMonitorCancel.class, id++, Side.SERVER); - RefinedStorage.INSTANCE.network.registerMessage(MessageGridUpdate.class, MessageGridUpdate.class, id++, Side.CLIENT); - RefinedStorage.INSTANCE.network.registerMessage(MessageGridDelta.class, MessageGridDelta.class, id++, Side.CLIENT); + RefinedStorage.INSTANCE.network.registerMessage(MessageGridItemUpdate.class, MessageGridItemUpdate.class, id++, Side.CLIENT); + RefinedStorage.INSTANCE.network.registerMessage(MessageGridItemDelta.class, MessageGridItemDelta.class, id++, Side.CLIENT); + RefinedStorage.INSTANCE.network.registerMessage(MessageGridFluidUpdate.class, MessageGridFluidUpdate.class, id++, Side.CLIENT); + RefinedStorage.INSTANCE.network.registerMessage(MessageGridFluidDelta.class, MessageGridFluidDelta.class, id++, Side.CLIENT); + RefinedStorage.INSTANCE.network.registerMessage(MessageGridFluidPull.class, MessageGridFluidPull.class, id++, Side.SERVER); + RefinedStorage.INSTANCE.network.registerMessage(MessageGridFluidInsertHeld.class, MessageGridFluidInsertHeld.class, id++, Side.SERVER); RefinedStorage.INSTANCE.network.registerMessage(MessageProcessingPatternEncoderClear.class, MessageProcessingPatternEncoderClear.class, id++, Side.SERVER); + RefinedStorage.INSTANCE.network.registerMessage(MessageGridFilterUpdate.class, MessageGridFilterUpdate.class, id++, Side.SERVER); NetworkRegistry.INSTANCE.registerGuiHandler(RefinedStorage.INSTANCE, new GuiHandler()); - GameRegistry.registerTileEntity(TileController.class, ID + ":controller"); - GameRegistry.registerTileEntity(TileGrid.class, ID + ":grid"); - GameRegistry.registerTileEntity(TileDiskDrive.class, ID + ":disk_drive"); - GameRegistry.registerTileEntity(TileExternalStorage.class, ID + ":external_storage"); - GameRegistry.registerTileEntity(TileImporter.class, ID + ":importer"); - GameRegistry.registerTileEntity(TileExporter.class, ID + ":exporter"); - GameRegistry.registerTileEntity(TileDetector.class, ID + ":detector"); - GameRegistry.registerTileEntity(TileSolderer.class, ID + ":solderer"); - GameRegistry.registerTileEntity(TileDestructor.class, ID + ":destructor"); - GameRegistry.registerTileEntity(TileConstructor.class, ID + ":constructor"); - GameRegistry.registerTileEntity(TileStorage.class, ID + ":storage"); - GameRegistry.registerTileEntity(TileRelay.class, ID + ":relay"); - GameRegistry.registerTileEntity(TileInterface.class, ID + ":interface"); - GameRegistry.registerTileEntity(TileCraftingMonitor.class, ID + ":crafting_monitor"); - GameRegistry.registerTileEntity(TileWirelessTransmitter.class, ID + ":wireless_transmitter"); - GameRegistry.registerTileEntity(TileCrafter.class, ID + ":crafter"); - GameRegistry.registerTileEntity(TileProcessingPatternEncoder.class, ID + ":processing_pattern_encoder"); - GameRegistry.registerTileEntity(TileCable.class, ID + ":cable"); + MinecraftForge.EVENT_BUS.register(new ContainerListener()); + + registerTile(TileController.class, "controller"); + registerTile(TileGrid.class, "grid"); + registerTile(TileDiskDrive.class, "disk_drive"); + registerTile(TileExternalStorage.class, "external_storage"); + registerTile(TileImporter.class, "importer"); + registerTile(TileExporter.class, "exporter"); + registerTile(TileDetector.class, "detector"); + registerTile(TileSolderer.class, "solderer"); + registerTile(TileDestructor.class, "destructor"); + registerTile(TileConstructor.class, "constructor"); + registerTile(TileStorage.class, "storage"); + registerTile(TileRelay.class, "relay"); + registerTile(TileInterface.class, "interface"); + registerTile(TileCraftingMonitor.class, "crafting_monitor"); + registerTile(TileWirelessTransmitter.class, "wireless_transmitter"); + registerTile(TileCrafter.class, "crafter"); + registerTile(TileProcessingPatternEncoder.class, "processing_pattern_encoder"); + registerTile(TileCable.class, "cable"); + registerTile(TileNetworkReceiver.class, "network_receiver"); + registerTile(TileNetworkTransmitter.class, "network_transmitter"); + registerTile(TileFluidInterface.class, "fluid_interface"); + registerTile(TileFluidStorage.class, "fluid_storage"); registerBlock(RefinedStorageBlocks.CONTROLLER); registerBlock(RefinedStorageBlocks.GRID); @@ -99,6 +107,10 @@ public class CommonProxy { registerBlock(RefinedStorageBlocks.INTERFACE); registerBlock(RefinedStorageBlocks.WIRELESS_TRANSMITTER); registerBlock(RefinedStorageBlocks.MACHINE_CASING); + registerBlock(RefinedStorageBlocks.NETWORK_TRANSMITTER); + registerBlock(RefinedStorageBlocks.NETWORK_RECEIVER); + registerBlock(RefinedStorageBlocks.FLUID_INTERFACE); + registerBlock(RefinedStorageBlocks.FLUID_STORAGE); registerItem(RefinedStorageItems.QUARTZ_ENRICHED_IRON); registerItem(RefinedStorageItems.STORAGE_DISK); @@ -110,6 +122,10 @@ public class CommonProxy { registerItem(RefinedStorageItems.CORE); registerItem(RefinedStorageItems.SILICON); registerItem(RefinedStorageItems.UPGRADE); + registerItem(RefinedStorageItems.GRID_FILTER); + registerItem(RefinedStorageItems.NETWORK_CARD); + registerItem(RefinedStorageItems.FLUID_STORAGE_DISK); + registerItem(RefinedStorageItems.FLUID_STORAGE_PART); OreDictionary.registerOre("itemSilicon", RefinedStorageItems.SILICON); @@ -156,9 +172,9 @@ public class CommonProxy { // Relay GameRegistry.addShapelessRecipe(new ItemStack(RefinedStorageBlocks.RELAY), - new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_BASIC), new ItemStack(RefinedStorageBlocks.MACHINE_CASING), - new ItemStack(RefinedStorageBlocks.CABLE) + new ItemStack(RefinedStorageBlocks.CABLE), + new ItemStack(Blocks.REDSTONE_TORCH) ); // Controller @@ -241,6 +257,15 @@ public class CommonProxy { new ItemStack(RefinedStorageItems.PATTERN) )); + // Fluid Grid + RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeBasic( + new ItemStack(RefinedStorageBlocks.GRID, 1, EnumGridType.FLUID.getId()), + 500, + new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_ADVANCED), + new ItemStack(RefinedStorageBlocks.GRID, 1, EnumGridType.NORMAL.getId()), + new ItemStack(Items.BUCKET) + )); + // Wireless Grid GameRegistry.addRecipe(new ItemStack(RefinedStorageItems.WIRELESS_GRID, 1, ItemWirelessGrid.TYPE_NORMAL), "EPE", @@ -379,8 +404,49 @@ public class CommonProxy { 'S', new ItemStack(RefinedStorageItems.STORAGE_PART, 1, ItemStoragePart.TYPE_16K) ); + // Fluid Storage Parts + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, ItemFluidStoragePart.TYPE_64K), + "SES", + "GRG", + "SGS", + 'R', new ItemStack(Items.BUCKET), + 'E', new ItemStack(RefinedStorageItems.QUARTZ_ENRICHED_IRON), + 'S', "itemSilicon", + 'G', "blockGlass" + )); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, ItemFluidStoragePart.TYPE_128K), + "PEP", + "SRS", + "PSP", + 'R', new ItemStack(Items.BUCKET), + 'E', new ItemStack(RefinedStorageItems.QUARTZ_ENRICHED_IRON), + 'P', new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_BASIC), + 'S', new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, ItemFluidStoragePart.TYPE_64K) + )); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, ItemFluidStoragePart.TYPE_256K), + "PEP", + "SRS", + "PSP", + 'R', new ItemStack(Items.BUCKET), + 'E', new ItemStack(RefinedStorageItems.QUARTZ_ENRICHED_IRON), + 'P', new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_IMPROVED), + 'S', new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, ItemFluidStoragePart.TYPE_128K) + )); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, ItemFluidStoragePart.TYPE_512K), + "PEP", + "SRS", + "PSP", + 'R', new ItemStack(Items.BUCKET), + 'E', new ItemStack(RefinedStorageItems.QUARTZ_ENRICHED_IRON), + 'P', new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_ADVANCED), + 'S', new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, ItemFluidStoragePart.TYPE_256K) + )); + // Storage Housing - GameRegistry.addRecipe(new ShapedOreRecipe(NBTStorage.createStackWithNBT(new ItemStack(RefinedStorageItems.STORAGE_HOUSING)), + GameRegistry.addRecipe(new ShapedOreRecipe(ItemStorageNBT.createStackWithNBT(new ItemStack(RefinedStorageItems.STORAGE_HOUSING)), "GRG", "R R", "EEE", @@ -391,7 +457,7 @@ public class CommonProxy { // Storage Disks for (int type = 0; type <= 3; ++type) { - ItemStack disk = NBTStorage.createStackWithNBT(new ItemStack(RefinedStorageItems.STORAGE_DISK, 1, type)); + ItemStack disk = ItemStorageNBT.createStackWithNBT(new ItemStack(RefinedStorageItems.STORAGE_DISK, 1, type)); GameRegistry.addRecipe(new ShapedOreRecipe(disk, "GRG", @@ -409,6 +475,26 @@ public class CommonProxy { ); } + // Fluid Storage Parts + for (int type = 0; type <= 3; ++type) { + ItemStack disk = ItemStorageNBT.createStackWithNBT(new ItemStack(RefinedStorageItems.FLUID_STORAGE_DISK, 1, type)); + + GameRegistry.addRecipe(new ShapedOreRecipe(disk, + "GRG", + "RPR", + "EEE", + 'G', "blockGlass", + 'R', new ItemStack(Items.REDSTONE), + 'P', new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, type), + 'E', new ItemStack(RefinedStorageItems.QUARTZ_ENRICHED_IRON) + )); + + GameRegistry.addShapelessRecipe(disk, + new ItemStack(RefinedStorageItems.STORAGE_HOUSING), + new ItemStack(RefinedStorageItems.FLUID_STORAGE_PART, 1, type) + ); + } + // Pattern GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RefinedStorageItems.PATTERN), "GRG", @@ -432,6 +518,7 @@ public class CommonProxy { RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeUpgrade(ItemUpgrade.TYPE_RANGE)); RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeUpgrade(ItemUpgrade.TYPE_SPEED)); RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeUpgrade(ItemUpgrade.TYPE_CRAFTING)); + RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeUpgrade(ItemUpgrade.TYPE_INTERDIMENSIONAL)); GameRegistry.addShapedRecipe(new ItemStack(RefinedStorageItems.UPGRADE, 1, ItemUpgrade.TYPE_STACK), "USU", @@ -442,10 +529,16 @@ public class CommonProxy { ); // Storage Blocks - RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeStorage(EnumStorageType.TYPE_1K, ItemStoragePart.TYPE_1K)); - RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeStorage(EnumStorageType.TYPE_4K, ItemStoragePart.TYPE_4K)); - RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeStorage(EnumStorageType.TYPE_16K, ItemStoragePart.TYPE_16K)); - RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeStorage(EnumStorageType.TYPE_64K, ItemStoragePart.TYPE_64K)); + RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeStorage(EnumItemStorageType.TYPE_1K, ItemStoragePart.TYPE_1K)); + RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeStorage(EnumItemStorageType.TYPE_4K, ItemStoragePart.TYPE_4K)); + RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeStorage(EnumItemStorageType.TYPE_16K, ItemStoragePart.TYPE_16K)); + RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeStorage(EnumItemStorageType.TYPE_64K, ItemStoragePart.TYPE_64K)); + + // Fluid Storage Blocks + RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeFluidStorage(EnumFluidStorageType.TYPE_64K, ItemFluidStoragePart.TYPE_64K)); + RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeFluidStorage(EnumFluidStorageType.TYPE_128K, ItemFluidStoragePart.TYPE_128K)); + RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeFluidStorage(EnumFluidStorageType.TYPE_256K, ItemFluidStoragePart.TYPE_256K)); + RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeFluidStorage(EnumFluidStorageType.TYPE_512K, ItemFluidStoragePart.TYPE_512K)); // Crafting Monitor GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(RefinedStorageBlocks.CRAFTING_MONITOR), @@ -466,6 +559,59 @@ public class CommonProxy { new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_BASIC), new ItemStack(RefinedStorageBlocks.EXPORTER) )); + + // Fluid Interface + RefinedStorageAPI.SOLDERER_REGISTRY.addRecipe(new SoldererRecipeBasic( + new ItemStack(RefinedStorageBlocks.FLUID_INTERFACE), + 200, + new ItemStack(Items.BUCKET), + new ItemStack(RefinedStorageBlocks.INTERFACE), + new ItemStack(Items.BUCKET) + )); + + // Grid Filter + GameRegistry.addShapedRecipe(new ItemStack(RefinedStorageItems.GRID_FILTER), + "EPE", + "PHP", + "EPE", + 'E', new ItemStack(RefinedStorageItems.QUARTZ_ENRICHED_IRON), + 'P', new ItemStack(Items.PAPER), + 'H', new ItemStack(Blocks.HOPPER) + ); + + // Network Card + GameRegistry.addShapedRecipe(new ItemStack(RefinedStorageItems.NETWORK_CARD), + "EEE", + "PAP", + "EEE", + 'E', new ItemStack(RefinedStorageItems.QUARTZ_ENRICHED_IRON), + 'P', new ItemStack(Items.PAPER), + 'A', new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_ADVANCED) + ); + + // Network Transmitter + GameRegistry.addShapedRecipe(new ItemStack(RefinedStorageBlocks.NETWORK_TRANSMITTER), + "EEE", + "CMD", + "AAA", + 'E', new ItemStack(Items.ENDER_PEARL), + 'C', new ItemStack(RefinedStorageItems.CORE, 1, ItemCore.TYPE_CONSTRUCTION), + 'M', new ItemStack(RefinedStorageBlocks.MACHINE_CASING), + 'D', new ItemStack(RefinedStorageItems.CORE, 1, ItemCore.TYPE_DESTRUCTION), + 'A', new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_ADVANCED) + ); + + // Network Receiver + GameRegistry.addShapedRecipe(new ItemStack(RefinedStorageBlocks.NETWORK_RECEIVER), + "AAA", + "CMD", + "EEE", + 'E', new ItemStack(Items.ENDER_PEARL), + 'C', new ItemStack(RefinedStorageItems.CORE, 1, ItemCore.TYPE_CONSTRUCTION), + 'M', new ItemStack(RefinedStorageBlocks.MACHINE_CASING), + 'D', new ItemStack(RefinedStorageItems.CORE, 1, ItemCore.TYPE_DESTRUCTION), + 'A', new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_ADVANCED) + ); } public void init(FMLInitializationEvent e) { @@ -479,6 +625,25 @@ public class CommonProxy { GameRegistry.register(block.createItem()); } + private void registerBlock(BlockCable cable) { + GameRegistry.register(cable); + GameRegistry.register(new ItemBlock(cable).setRegistryName(cable.getRegistryName())); + + cables.add(cable); + } + + private void registerTile(Class tile, String id) { + GameRegistry.registerTileEntity(tile, RefinedStorage.ID + ":" + id); + + try { + TileBase tileInstance = tile.newInstance(); + + tileInstance.getDataManager().getParameters().forEach(TileDataManager::registerParameter); + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + } + private void registerItem(Item item) { GameRegistry.register(item); } diff --git a/src/main/java/refinedstorage/tile/ClientCraftingTask.java b/src/main/java/refinedstorage/tile/ClientCraftingTask.java new file mode 100755 index 000000000..d99f99055 --- /dev/null +++ b/src/main/java/refinedstorage/tile/ClientCraftingTask.java @@ -0,0 +1,39 @@ +package refinedstorage.tile; + +import net.minecraft.item.ItemStack; + +public class ClientCraftingTask { + private ItemStack output; + private int id; + private String info; + + // Used server-side while sending + private ItemStack[] outputs; + + public ClientCraftingTask(ItemStack output, int id, String info) { + this.output = output; + this.id = id; + this.info = info; + } + + public ClientCraftingTask(String info, ItemStack[] outputs) { + this.info = info; + this.outputs = outputs; + } + + public ItemStack getOutput() { + return output; + } + + public ItemStack[] getOutputs() { + return outputs; + } + + public int getId() { + return id; + } + + public String getInfo() { + return info; + } +} diff --git a/src/main/java/refinedstorage/tile/ClientNode.java b/src/main/java/refinedstorage/tile/ClientNode.java new file mode 100755 index 000000000..47723884e --- /dev/null +++ b/src/main/java/refinedstorage/tile/ClientNode.java @@ -0,0 +1,52 @@ +package refinedstorage.tile; + +import net.minecraft.item.ItemStack; +import refinedstorage.api.storage.CompareUtils; + +public class ClientNode { + private ItemStack stack; + private int amount; + private int energyUsage; + + public ClientNode(ItemStack stack, int amount, int energyUsage) { + this.stack = stack; + this.amount = amount; + this.energyUsage = energyUsage; + } + + public ItemStack getStack() { + return stack; + } + + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public int getEnergyUsage() { + return energyUsage; + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + + if (!(other instanceof ClientNode)) { + return false; + } + + return energyUsage == ((ClientNode) other).energyUsage && CompareUtils.compareStack(stack, ((ClientNode) other).stack); + } + + @Override + public int hashCode() { + int result = stack.hashCode(); + result = 31 * result + energyUsage; + return result; + } +} diff --git a/src/main/java/refinedstorage/tile/IStorageGui.java b/src/main/java/refinedstorage/tile/IStorageGui.java index 257b802f0..62b962f7c 100755 --- a/src/main/java/refinedstorage/tile/IStorageGui.java +++ b/src/main/java/refinedstorage/tile/IStorageGui.java @@ -1,24 +1,19 @@ package refinedstorage.tile; -import net.minecraftforge.items.IItemHandler; -import refinedstorage.tile.config.ICompareConfig; -import refinedstorage.tile.config.IModeConfig; -import refinedstorage.tile.config.IRedstoneModeConfig; +import refinedstorage.tile.data.TileDataParameter; public interface IStorageGui { String getGuiTitle(); - int getPriority(); + TileDataParameter getTypeParameter(); - void onPriorityChanged(int priority); + TileDataParameter getRedstoneModeParameter(); - IItemHandler getFilters(); + TileDataParameter getCompareParameter(); - IRedstoneModeConfig getRedstoneModeConfig(); + TileDataParameter getFilterParameter(); - ICompareConfig getCompareConfig(); - - IModeConfig getModeConfig(); + TileDataParameter getPriorityParameter(); int getStored(); diff --git a/src/main/java/refinedstorage/tile/ISynchronizedContainer.java b/src/main/java/refinedstorage/tile/ISynchronizedContainer.java deleted file mode 100755 index c901ffc5e..000000000 --- a/src/main/java/refinedstorage/tile/ISynchronizedContainer.java +++ /dev/null @@ -1,12 +0,0 @@ -package refinedstorage.tile; - -import io.netty.buffer.ByteBuf; -import net.minecraft.inventory.Container; - -public interface ISynchronizedContainer { - void readContainerData(ByteBuf buf); - - void writeContainerData(ByteBuf buf); - - Class getContainer(); -} diff --git a/src/main/java/refinedstorage/tile/TileBase.java b/src/main/java/refinedstorage/tile/TileBase.java index 98cee85a4..dce0d386b 100755 --- a/src/main/java/refinedstorage/tile/TileBase.java +++ b/src/main/java/refinedstorage/tile/TileBase.java @@ -1,9 +1,11 @@ package refinedstorage.tile; import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; @@ -11,18 +13,27 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.wrappers.FluidHandlerWrapper; +import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.network.MessageTileContainerUpdate; +import net.minecraftforge.items.wrapper.InvWrapper; +import net.minecraftforge.items.wrapper.SidedInvWrapper; +import refinedstorage.tile.data.TileDataManager; import javax.annotation.Nullable; public abstract class TileBase extends TileEntity implements ITickable { private static final String NBT_DIRECTION = "Direction"; + private static final String NBT_INVENTORY = "Inventory_%d"; + private static final String NBT_SLOT = "Slot"; + private EnumFacing direction = EnumFacing.NORTH; + protected TileDataManager dataManager = new TileDataManager(this); protected int ticks = 0; @Override @@ -30,16 +41,14 @@ public abstract class TileBase extends TileEntity implements ITickable { if (!worldObj.isRemote) { ticks++; - if (this instanceof ISynchronizedContainer) { - for (EntityPlayer player : worldObj.playerEntities) { - if (((ISynchronizedContainer) this).getContainer() == player.openContainer.getClass()) { - RefinedStorage.INSTANCE.network.sendTo(new MessageTileContainerUpdate(this), (EntityPlayerMP) player); - } - } - } + dataManager.detectAndSendChanges(); } } + public void updateBlock() { + worldObj.notifyBlockUpdate(pos, worldObj.getBlockState(pos), worldObj.getBlockState(pos), 1 | 2); + } + public void setDirection(EnumFacing direction) { this.direction = direction; @@ -50,6 +59,10 @@ public abstract class TileBase extends TileEntity implements ITickable { return direction; } + public TileDataManager getDataManager() { + return dataManager; + } + public NBTTagCompound write(NBTTagCompound tag) { tag.setInteger(NBT_DIRECTION, direction.ordinal()); @@ -69,7 +82,7 @@ public abstract class TileBase extends TileEntity implements ITickable { public void readUpdate(NBTTagCompound tag) { direction = EnumFacing.getFront(tag.getInteger(NBT_DIRECTION)); - RefinedStorageUtils.updateBlock(worldObj, pos); + updateBlock(); } @Override @@ -116,7 +129,111 @@ public abstract class TileBase extends TileEntity implements ITickable { return worldObj.getTileEntity(pos.offset(direction)); } - public IItemHandler getDroppedItems() { + public IItemHandler getDrops() { return null; } + + public static void writeItems(IItemHandler handler, int id, NBTTagCompound nbt) { + NBTTagList tagList = new NBTTagList(); + + for (int i = 0; i < handler.getSlots(); i++) { + if (handler.getStackInSlot(i) != null) { + NBTTagCompound compoundTag = new NBTTagCompound(); + + compoundTag.setInteger(NBT_SLOT, i); + + handler.getStackInSlot(i).writeToNBT(compoundTag); + + tagList.appendTag(compoundTag); + } + } + + nbt.setTag(String.format(NBT_INVENTORY, id), tagList); + } + + public static void readItems(IItemHandler handler, int id, NBTTagCompound nbt) { + String name = String.format(NBT_INVENTORY, id); + + if (nbt.hasKey(name)) { + NBTTagList tagList = nbt.getTagList(name, Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < tagList.tagCount(); i++) { + int slot = tagList.getCompoundTagAt(i).getInteger(NBT_SLOT); + + ItemStack stack = ItemStack.loadItemStackFromNBT(tagList.getCompoundTagAt(i)); + + if (slot >= 0 && slot < handler.getSlots()) { + handler.insertItem(slot, stack, false); + } + } + } + } + + public static void writeItemsLegacy(IInventory inventory, int id, NBTTagCompound nbt) { + NBTTagList tagList = new NBTTagList(); + + for (int i = 0; i < inventory.getSizeInventory(); i++) { + if (inventory.getStackInSlot(i) != null) { + NBTTagCompound compoundTag = new NBTTagCompound(); + + compoundTag.setInteger(NBT_SLOT, i); + + inventory.getStackInSlot(i).writeToNBT(compoundTag); + + tagList.appendTag(compoundTag); + } + } + + nbt.setTag(String.format(NBT_INVENTORY, id), tagList); + } + + public static void readItemsLegacy(IInventory inventory, int id, NBTTagCompound nbt) { + String name = String.format(NBT_INVENTORY, id); + + if (nbt.hasKey(name)) { + NBTTagList tagList = nbt.getTagList(name, Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < tagList.tagCount(); i++) { + int slot = tagList.getCompoundTagAt(i).getInteger(NBT_SLOT); + + ItemStack stack = ItemStack.loadItemStackFromNBT(tagList.getCompoundTagAt(i)); + + inventory.setInventorySlotContents(slot, stack); + } + } + } + + protected IItemHandler getItemHandler(TileEntity tile, EnumFacing side) { + if (tile == null) { + return null; + } + + IItemHandler handler = tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side) ? tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side) : null; + + if (handler == null) { + if (side != null && tile instanceof ISidedInventory) { + handler = new SidedInvWrapper((ISidedInventory) tile, side); + } else if (tile instanceof IInventory) { + handler = new InvWrapper((IInventory) tile); + } + } + + return handler; + } + + protected IFluidHandler getFluidHandler(TileEntity tile, EnumFacing side) { + if (tile == null) { + return null; + } + + IFluidHandler handler = null; + + if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { + handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); + } else if (tile instanceof net.minecraftforge.fluids.IFluidHandler) { + handler = new FluidHandlerWrapper((net.minecraftforge.fluids.IFluidHandler) tile, side); + } + + return handler; + } } diff --git a/src/main/java/refinedstorage/tile/TileCable.java b/src/main/java/refinedstorage/tile/TileCable.java index 305a9f76b..b76b70a05 100755 --- a/src/main/java/refinedstorage/tile/TileCable.java +++ b/src/main/java/refinedstorage/tile/TileCable.java @@ -1,9 +1,8 @@ package refinedstorage.tile; -import net.minecraft.inventory.Container; import refinedstorage.RefinedStorage; -public class TileCable extends TileNode { +public class TileCable extends TileMultipartNode { @Override public int getEnergyUsage() { return RefinedStorage.INSTANCE.cableUsage; @@ -13,9 +12,4 @@ public class TileCable extends TileNode { public void updateNode() { // NO OP } - - @Override - public Class getContainer() { - return null; - } } diff --git a/src/main/java/refinedstorage/tile/TileConstructor.java b/src/main/java/refinedstorage/tile/TileConstructor.java index 59b73e4d4..d66a2ff0a 100755 --- a/src/main/java/refinedstorage/tile/TileConstructor.java +++ b/src/main/java/refinedstorage/tile/TileConstructor.java @@ -1,34 +1,41 @@ package refinedstorage.tile; -import io.netty.buffer.ByteBuf; +import mcmultipart.microblock.IMicroblock; +import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.state.IBlockState; -import net.minecraft.inventory.Container; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; import refinedstorage.apiimpl.autocrafting.CraftingTaskScheduler; -import refinedstorage.container.ContainerConstructor; import refinedstorage.container.slot.SlotSpecimen; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.inventory.BasicItemValidator; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerFluid; +import refinedstorage.inventory.ItemHandlerUpgrade; import refinedstorage.item.ItemUpgrade; -import refinedstorage.tile.config.ICompareConfig; +import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.config.IType; +import refinedstorage.tile.data.TileDataParameter; + +public class TileConstructor extends TileMultipartNode implements IComparable, IType { + public static final TileDataParameter COMPARE = IComparable.createParameter(); + public static final TileDataParameter TYPE = IType.createParameter(); -public class TileConstructor extends TileNode implements ICompareConfig { private static final String NBT_COMPARE = "Compare"; + private static final String NBT_TYPE = "Type"; private static final int BASE_SPEED = 20; - private BasicItemHandler filter = new BasicItemHandler(1, this) { + private ItemHandlerBasic itemFilters = new ItemHandlerBasic(1, this) { @Override protected void onContentsChanged(int slot) { super.onContentsChanged(slot); @@ -36,42 +43,77 @@ public class TileConstructor extends TileNode implements ICompareConfig { block = SlotSpecimen.getBlockState(worldObj, pos.offset(getDirection()), getStackInSlot(0)); } }; - private BasicItemHandler upgrades = new BasicItemHandler( - 4, - this, - new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_SPEED), - new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_CRAFTING) - ); + private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(1, this); + + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_CRAFTING); private int compare = 0; + private int type = IType.ITEMS; + private IBlockState block; private CraftingTaskScheduler scheduler = new CraftingTaskScheduler(this); + public TileConstructor() { + dataManager.addWatchedParameter(COMPARE); + dataManager.addWatchedParameter(TYPE); + } + + @Override + public boolean canAddMicroblock(IMicroblock microblock) { + return !isBlockingMicroblock(microblock, getDirection()); + } + @Override public int getEnergyUsage() { - return RefinedStorage.INSTANCE.constructorUsage + RefinedStorageUtils.getUpgradeEnergyUsage(upgrades); + return RefinedStorage.INSTANCE.constructorUsage + upgrades.getEnergyUsage(); } @Override public void updateNode() { - if (block != null && ticks % RefinedStorageUtils.getSpeed(upgrades, BASE_SPEED, 4) == 0) { - BlockPos front = pos.offset(getDirection()); + if (ticks % upgrades.getSpeed(BASE_SPEED, 4) == 0) { + if (type == IType.ITEMS && block != null) { + BlockPos front = pos.offset(getDirection()); - if (worldObj.isAirBlock(front) && block.getBlock().canPlaceBlockAt(worldObj, front)) { - ItemStack took = network.extractItem(filter.getStackInSlot(0), 1, compare); + if (worldObj.isAirBlock(front) && block.getBlock().canPlaceBlockAt(worldObj, front)) { + ItemStack took = network.extractItem(itemFilters.getStackInSlot(0), 1, compare); - if (took != null) { - scheduler.resetSchedule(); - worldObj.setBlockState(front, block.getBlock().getStateFromMeta(took.getMetadata()), 1 | 2); - // From ItemBlock.onItemUse - SoundType blockSound = block.getBlock().getSoundType(); - worldObj.playSound(null, front, blockSound.getPlaceSound(), SoundCategory.BLOCKS, (blockSound.getVolume() + 1.0F) / 2.0F, blockSound.getPitch() * 0.8F); - } else if (RefinedStorageUtils.hasUpgrade(upgrades, ItemUpgrade.TYPE_CRAFTING)) { - ItemStack craft = filter.getStackInSlot(0); + if (took != null) { + scheduler.resetSchedule(); + worldObj.setBlockState(front, block.getBlock().getStateFromMeta(took.getMetadata()), 1 | 2); + // From ItemBlock.onItemUse + SoundType blockSound = block.getBlock().getSoundType(); + worldObj.playSound(null, front, blockSound.getPlaceSound(), SoundCategory.BLOCKS, (blockSound.getVolume() + 1.0F) / 2.0F, blockSound.getPitch() * 0.8F); + } else if (upgrades.hasUpgrade(ItemUpgrade.TYPE_CRAFTING)) { + ItemStack craft = itemFilters.getStackInSlot(0); - if (scheduler.canSchedule(compare, craft)) { - scheduler.schedule(network, compare, craft); + if (scheduler.canSchedule(compare, craft)) { + scheduler.schedule(network, compare, craft); + } + } + } + } else if (type == IType.FLUIDS) { + FluidStack stack = fluidFilters.getFluids()[0]; + + if (stack != null && stack.getFluid().canBePlacedInWorld()) { + BlockPos front = pos.offset(getDirection()); + + Block block = stack.getFluid().getBlock(); + + if (worldObj.isAirBlock(front) && block.canPlaceBlockAt(worldObj, front)) { + FluidStack took = network.extractFluid(stack, Fluid.BUCKET_VOLUME, compare); + + if (took != null) { + IBlockState state = block.getDefaultState(); + + if (state.getBlock() == Blocks.WATER) { + state = Blocks.FLOWING_WATER.getDefaultState(); + } else if (state.getBlock() == Blocks.LAVA) { + state = Blocks.FLOWING_LAVA.getDefaultState(); + } + + worldObj.setBlockState(front, state, 1 | 2); + } } } } @@ -98,8 +140,13 @@ public class TileConstructor extends TileNode implements ICompareConfig { compare = tag.getInteger(NBT_COMPARE); } - RefinedStorageUtils.readItems(filter, 0, tag); - RefinedStorageUtils.readItems(upgrades, 1, tag); + if (tag.hasKey(NBT_TYPE)) { + type = tag.getInteger(NBT_TYPE); + } + + readItems(itemFilters, 0, tag); + readItems(upgrades, 1, tag); + readItems(fluidFilters, 2, tag); scheduler.read(tag); } @@ -109,45 +156,41 @@ public class TileConstructor extends TileNode implements ICompareConfig { super.write(tag); tag.setInteger(NBT_COMPARE, compare); + tag.setInteger(NBT_TYPE, type); - RefinedStorageUtils.writeItems(filter, 0, tag); - RefinedStorageUtils.writeItems(upgrades, 1, tag); + writeItems(itemFilters, 0, tag); + writeItems(upgrades, 1, tag); + writeItems(fluidFilters, 2, tag); - scheduler.writeToNBT(tag); + scheduler.write(tag); return tag; } - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - compare = buf.readInt(); - } - - @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - buf.writeInt(compare); - } - - @Override - public Class getContainer() { - return ContainerConstructor.class; - } - public IItemHandler getUpgrades() { return upgrades; } - public IItemHandler getFilter() { - return filter; + @Override + public IItemHandler getDrops() { + return upgrades; } @Override - public IItemHandler getDroppedItems() { - return upgrades; + public int getType() { + return worldObj.isRemote ? TYPE.getValue() : type; + } + + @Override + public void setType(int type) { + this.type = type; + + markDirty(); + } + + @Override + public IItemHandler getFilterInventory() { + return getType() == IType.ITEMS ? itemFilters : fluidFilters; } @Override diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/TileController.java similarity index 51% rename from src/main/java/refinedstorage/tile/controller/TileController.java rename to src/main/java/refinedstorage/tile/TileController.java index af94298e1..f056e7b19 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -1,111 +1,188 @@ -package refinedstorage.tile.controller; +package refinedstorage.tile; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; -import io.netty.buffer.ByteBuf; -import net.darkhax.tesla.api.ITeslaConsumer; -import net.darkhax.tesla.api.ITeslaHolder; import net.darkhax.tesla.capability.TeslaCapabilities; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; +import net.minecraft.network.datasync.DataSerializers; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants; -import net.minecraftforge.fml.common.Optional; -import net.minecraftforge.fml.common.network.ByteBufUtils; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingPatternContainer; import refinedstorage.api.autocrafting.ICraftingTask; -import refinedstorage.api.network.IGridHandler; -import refinedstorage.api.network.INetworkMaster; -import refinedstorage.api.network.INetworkNode; -import refinedstorage.api.network.IWirelessGridHandler; -import refinedstorage.api.storage.CompareFlags; -import refinedstorage.api.storage.IGroupedStorage; -import refinedstorage.api.storage.IStorage; +import refinedstorage.api.network.*; +import refinedstorage.api.network.grid.IFluidGridHandler; +import refinedstorage.api.network.grid.IItemGridHandler; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.storage.fluid.IFluidStorage; +import refinedstorage.api.storage.fluid.IGroupedFluidStorage; +import refinedstorage.api.storage.item.IGroupedItemStorage; +import refinedstorage.api.storage.item.IItemStorage; import refinedstorage.apiimpl.autocrafting.BasicCraftingTask; import refinedstorage.apiimpl.autocrafting.CraftingPattern; import refinedstorage.apiimpl.autocrafting.ProcessingCraftingTask; -import refinedstorage.apiimpl.network.GridHandler; +import refinedstorage.apiimpl.network.NetworkNodeGraph; import refinedstorage.apiimpl.network.WirelessGridHandler; -import refinedstorage.apiimpl.storage.GroupedStorage; +import refinedstorage.apiimpl.network.grid.FluidGridHandler; +import refinedstorage.apiimpl.network.grid.ItemGridHandler; +import refinedstorage.apiimpl.storage.fluid.FluidUtils; +import refinedstorage.apiimpl.storage.fluid.GroupedFluidStorage; +import refinedstorage.apiimpl.storage.item.GroupedItemStorage; import refinedstorage.block.BlockController; import refinedstorage.block.EnumControllerType; -import refinedstorage.container.ContainerController; +import refinedstorage.block.EnumGridType; import refinedstorage.container.ContainerGrid; +import refinedstorage.integration.ic2.ControllerEnergyIC2; +import refinedstorage.integration.ic2.ControllerEnergyIC2None; +import refinedstorage.integration.ic2.IControllerEnergyIC2; +import refinedstorage.integration.ic2.IntegrationIC2; +import refinedstorage.integration.tesla.ControllerEnergyTesla; +import refinedstorage.integration.tesla.IntegrationTesla; import refinedstorage.item.ItemPattern; -import refinedstorage.network.MessageGridDelta; -import refinedstorage.network.MessageGridUpdate; -import refinedstorage.tile.ISynchronizedContainer; -import refinedstorage.tile.TileBase; -import refinedstorage.tile.TileCrafter; -import refinedstorage.tile.config.IRedstoneModeConfig; +import refinedstorage.network.MessageGridFluidDelta; +import refinedstorage.network.MessageGridFluidUpdate; +import refinedstorage.network.MessageGridItemDelta; +import refinedstorage.network.MessageGridItemUpdate; +import refinedstorage.tile.config.IRedstoneConfigurable; import refinedstorage.tile.config.RedstoneMode; -import refinedstorage.tile.externalstorage.ExternalStorage; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.RefinedStorageSerializers; +import refinedstorage.tile.data.TileDataParameter; +import refinedstorage.tile.externalstorage.FluidStorageExternal; +import refinedstorage.tile.externalstorage.ItemStorageExternal; +import refinedstorage.tile.grid.IGrid; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.*; -@Optional.InterfaceList({ - @Optional.Interface(iface = "net.darkhax.tesla.api.ITeslaConsumer", modid = "Tesla"), - @Optional.Interface(iface = "net.darkhax.tesla.api.ITeslaHolder", modid = "Tesla") -}) -public class TileController extends TileBase implements INetworkMaster, IEnergyReceiver, ITeslaHolder, ITeslaConsumer, ISynchronizedContainer, IRedstoneModeConfig { +public class TileController extends TileBase implements INetworkMaster, IEnergyReceiver, IRedstoneConfigurable { + public static final TileDataParameter REDSTONE_MODE = RedstoneMode.createParameter(); + + public static final TileDataParameter ENERGY_USAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileController tile) { + return tile.getEnergyUsage(); + } + }); + + public static final TileDataParameter ENERGY_STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileController tile) { + return tile.getEnergy().getEnergyStored(); + } + }); + + public static final TileDataParameter ENERGY_CAPACITY = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileController tile) { + return tile.getEnergy().getMaxEnergyStored(); + } + }); + + public static final TileDataParameter> NODES = new TileDataParameter<>(RefinedStorageSerializers.CLIENT_NODE_SERIALIZER, new ArrayList<>(), new ITileDataProducer, TileController>() { + @Override + public List getValue(TileController tile) { + List nodes = new ArrayList<>(); + + for (INetworkNode node : tile.nodeGraph.all()) { + if (node.canUpdate()) { + IBlockState state = tile.worldObj.getBlockState(node.getPosition()); + + ClientNode clientNode = new ClientNode( + new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)), + 1, + node.getEnergyUsage() + ); + + if (clientNode.getStack().getItem() != null) { + if (nodes.contains(clientNode)) { + for (ClientNode other : nodes) { + if (other.equals(clientNode)) { + other.setAmount(other.getAmount() + 1); + + break; + } + } + } else { + nodes.add(clientNode); + } + } + } + } + + return nodes; + } + }); + public static final String NBT_ENERGY = "Energy"; public static final String NBT_ENERGY_CAPACITY = "EnergyCapacity"; private static final String NBT_CRAFTING_TASKS = "CraftingTasks"; - private GridHandler gridHandler = new GridHandler(this); + private static final Comparator ITEM_SIZE_COMPARATOR = (left, right) -> { + if (left.getStored() == right.getStored()) { + return 0; + } + + return (left.getStored() > right.getStored()) ? -1 : 1; + }; + + private static final Comparator ITEM_PRIORITY_COMPARATOR = (left, right) -> { + if (left.getPriority() == right.getPriority()) { + return 0; + } + + return (left.getPriority() > right.getPriority()) ? -1 : 1; + }; + + private static final Comparator FLUID_SIZE_COMPARATOR = (left, right) -> { + if (left.getStored() == right.getStored()) { + return 0; + } + + return (left.getStored() > right.getStored()) ? -1 : 1; + }; + + private static final Comparator FLUID_PRIORITY_COMPARATOR = (left, right) -> { + if (left.getPriority() == right.getPriority()) { + return 0; + } + + return (left.getPriority() > right.getPriority()) ? -1 : 1; + }; + + private ItemGridHandler itemGridHandler = new ItemGridHandler(this); + private FluidGridHandler fluidGridHandler = new FluidGridHandler(this); + private WirelessGridHandler wirelessGridHandler = new WirelessGridHandler(this); - private IGroupedStorage storage = new GroupedStorage(this); + private INetworkNodeGraph nodeGraph = new NetworkNodeGraph(this); - private Comparator sizeComparator = new Comparator() { - @Override - public int compare(IStorage left, IStorage right) { - if (left.getStored() == right.getStored()) { - return 0; - } + private IGroupedItemStorage itemStorage = new GroupedItemStorage(this); + private IGroupedFluidStorage fluidStorage = new GroupedFluidStorage(this); - return (left.getStored() > right.getStored()) ? -1 : 1; - } - }; + private List patterns = new ArrayList<>(); - private Comparator priorityComparator = new Comparator() { - @Override - public int compare(IStorage left, IStorage right) { - if (left.getPriority() == right.getPriority()) { - return 0; - } + private Stack craftingTasks = new Stack<>(); + private List craftingTasksToAddAsLast = new ArrayList<>(); + private List craftingTasksToAdd = new ArrayList<>(); + private List craftingTasksToCancel = new ArrayList<>(); - return (left.getPriority() > right.getPriority()) ? -1 : 1; - } - }; - - private List nodes = new ArrayList(); - private Set nodesPos = new HashSet(); - - private List patterns = new ArrayList(); - - private Stack craftingTasks = new Stack(); - private List craftingTasksToAddAsLast = new ArrayList(); - private List craftingTasksToAdd = new ArrayList(); - private List craftingTasksToCancel = new ArrayList(); - - private EnergyStorage energy = new EnergyStorage(RefinedStorage.INSTANCE.controller); - private IC2Energy IC2Energy; - private int energyUsage; + private EnergyStorage energy = new EnergyStorage(RefinedStorage.INSTANCE.controllerCapacity); + private IControllerEnergyIC2 energyEU; + private ControllerEnergyTesla energyTesla; private int lastEnergyDisplay; private int lastEnergyComparator; @@ -116,11 +193,21 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR private RedstoneMode redstoneMode = RedstoneMode.IGNORE; - private List clientNodes = new ArrayList(); - public TileController() { - if (RefinedStorage.hasIC2()) { - this.IC2Energy = new IC2Energy(this); + dataManager.addWatchedParameter(REDSTONE_MODE); + dataManager.addWatchedParameter(ENERGY_USAGE); + dataManager.addWatchedParameter(ENERGY_STORED); + dataManager.addParameter(ENERGY_CAPACITY); + dataManager.addParameter(NODES); + + if (IntegrationIC2.isLoaded()) { + this.energyEU = new ControllerEnergyIC2(this); + } else { + this.energyEU = new ControllerEnergyIC2None(); + } + + if (IntegrationTesla.isLoaded()) { + this.energyTesla = new ControllerEnergyTesla(energy); } } @@ -139,16 +226,24 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR return energy.getEnergyStored() > 0 && redstoneMode.isEnabled(worldObj, pos); } + @Override + public INetworkNodeGraph getNodeGraph() { + return nodeGraph; + } + @Override public void update() { if (!worldObj.isRemote) { - if (IC2Energy != null) { - IC2Energy.update(); - } + energyEU.update(); if (canRun()) { - Collections.sort(storage.getStorages(), sizeComparator); - Collections.sort(storage.getStorages(), priorityComparator); + Collections.sort(itemStorage.getStorages(), ITEM_SIZE_COMPARATOR); + Collections.sort(itemStorage.getStorages(), ITEM_PRIORITY_COMPARATOR); + + Collections.sort(fluidStorage.getStorages(), FLUID_SIZE_COMPARATOR); + Collections.sort(fluidStorage.getStorages(), FLUID_PRIORITY_COMPARATOR); + + boolean craftingTasksChanged = !craftingTasksToAdd.isEmpty() || !craftingTasksToAddAsLast.isEmpty() || !craftingTasksToCancel.isEmpty(); for (ICraftingTask taskToCancel : craftingTasksToCancel) { taskToCancel.onCancelled(this); @@ -170,6 +265,10 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR craftingTasksToAddAsLast.clear(); updateTopCraftingTask(true); + + if (craftingTasksChanged) { + updateCraftingTasks(); + } } wirelessGridHandler.update(); @@ -189,13 +288,13 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR if (couldRun != canRun()) { couldRun = canRun(); - rebuildNodes(); + NetworkUtils.rebuildGraph(this); } if (getEnergyScaledForDisplay() != lastEnergyDisplay) { lastEnergyDisplay = getEnergyScaledForDisplay(); - RefinedStorageUtils.updateBlock(worldObj, pos); + updateBlock(); } if (getEnergyScaledForComparator() != lastEnergyComparator) { @@ -208,6 +307,14 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR super.update(); } + private void updateCraftingTasks() { + for (INetworkNode node : nodeGraph.all()) { + if (node instanceof TileCraftingMonitor) { + ((TileCraftingMonitor) node).dataManager.sendParameterToWatchers(TileCraftingMonitor.TASKS); + } + } + } + private void updateTopCraftingTask(boolean withSpeed) { if (!craftingTasks.empty()) { markDirty(); @@ -220,42 +327,27 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR top.onDone(this); craftingTasks.pop(); + + updateCraftingTasks(); } } } - public void disconnectAll() { - for (INetworkNode node : nodes) { - if (node.isConnected()) { - node.onDisconnected(this); - } - } - - nodes.clear(); - nodesPos.clear(); - } - @Override public void invalidate() { + energyEU.invalidate(); + super.invalidate(); - - if (IC2Energy != null) { - IC2Energy.invalidate(); - } } @Override - public List getNodes() { - return nodes; - } - - public List getClientNodes() { - return clientNodes; + public IItemGridHandler getItemGridHandler() { + return itemGridHandler; } @Override - public IGridHandler getGridHandler() { - return gridHandler; + public IFluidGridHandler getFluidGridHandler() { + return fluidGridHandler; } @Override @@ -265,13 +357,18 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR @Override public void onChunkUnload() { - if (IC2Energy != null) { - IC2Energy.invalidate(); - } + super.onChunkUnload(); + + energyEU.onChunkUnload(); } - public IGroupedStorage getStorage() { - return storage; + public IGroupedItemStorage getItemStorage() { + return itemStorage; + } + + @Override + public IGroupedFluidStorage getFluidStorage() { + return fluidStorage; } @Override @@ -316,11 +413,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR @Override public List getPatterns(ItemStack pattern, int flags) { - List patterns = new ArrayList(); + List patterns = new ArrayList<>(); for (ICraftingPattern craftingPattern : getPatterns()) { for (ItemStack output : craftingPattern.getOutputs()) { - if (RefinedStorageUtils.compareStack(output, pattern, flags)) { + if (CompareUtils.compareStack(output, pattern, flags)) { patterns.add(craftingPattern); } } @@ -346,7 +443,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR int score = 0; for (ItemStack input : patterns.get(i).getInputs()) { - ItemStack stored = storage.get(input, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); + ItemStack stored = itemStorage.get(input, CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT); score += stored != null ? stored.stackSize : 0; } @@ -364,7 +461,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR public void rebuildPatterns() { patterns.clear(); - for (INetworkNode node : nodes) { + for (INetworkNode node : nodeGraph.all()) { if (node instanceof TileCrafter && node.canUpdate()) { TileCrafter crafter = (TileCrafter) node; @@ -384,109 +481,62 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR } } - storage.rebuild(); + itemStorage.rebuild(); } @Override - public void rebuildNodes() { - if (!canRun()) { - if (!nodes.isEmpty()) { - disconnectAll(); - } - - return; - } - - List newNodes = new ArrayList(); - Set newNodesPos = new HashSet(); - - Set checked = new HashSet(); - Queue toCheck = new ArrayDeque(); - - for (EnumFacing facing : EnumFacing.VALUES) { - BlockPos pos = this.pos.offset(facing); - - checked.add(pos); - toCheck.add(pos); - } - - BlockPos currentPos; - while ((currentPos = toCheck.poll()) != null) { - TileEntity tile = worldObj.getTileEntity(currentPos); - - if (tile instanceof TileController && !pos.equals(tile.getPos())) { - worldObj.createExplosion(null, tile.getPos().getX(), tile.getPos().getY(), tile.getPos().getZ(), 4.5f, true); - } - - if (!(tile instanceof INetworkNode)) { - continue; - } - - INetworkNode node = (INetworkNode) tile; - - newNodes.add(node); - newNodesPos.add(node.getPosition()); - - if (node.canConduct()) { - for (EnumFacing facing : EnumFacing.VALUES) { - BlockPos pos = currentPos.offset(facing); - - if (checked.add(pos)) { - toCheck.add(pos); - } - } - } - } - - List oldNodes = new ArrayList(nodes); - Set oldNodesPos = new HashSet(nodesPos); - - this.nodes = newNodes; - this.nodesPos = newNodesPos; - - for (INetworkNode newNode : nodes) { - if (!oldNodesPos.contains(newNode.getPosition())) { - newNode.onConnected(this); - } - } - - for (INetworkNode oldNode : oldNodes) { - if (!nodesPos.contains(oldNode.getPosition())) { - oldNode.onDisconnected(this); - } - } + public void sendItemStorageToClient() { + worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream() + .filter(player -> isWatchingGrid(player, EnumGridType.NORMAL, EnumGridType.CRAFTING, EnumGridType.PATTERN)) + .forEach(this::sendItemStorageToClient); } @Override - public void sendStorageToClient() { - for (EntityPlayer player : worldObj.playerEntities) { - if (isWatchingGrid(player)) { - sendStorageToClient((EntityPlayerMP) player); - } - } + public void sendItemStorageToClient(EntityPlayerMP player) { + RefinedStorage.INSTANCE.network.sendTo(new MessageGridItemUpdate(this), player); } @Override - public void sendStorageToClient(EntityPlayerMP player) { - RefinedStorage.INSTANCE.network.sendTo(new MessageGridUpdate(this), player); + public void sendItemStorageDeltaToClient(ItemStack stack, int delta) { + worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream() + .filter(player -> isWatchingGrid(player, EnumGridType.NORMAL, EnumGridType.CRAFTING, EnumGridType.PATTERN)) + .forEach(player -> RefinedStorage.INSTANCE.network.sendTo(new MessageGridItemDelta(this, stack, delta), player)); } @Override - public void sendStorageDeltaToClient(ItemStack stack, int delta) { - for (EntityPlayer player : worldObj.playerEntities) { - if (isWatchingGrid(player)) { - RefinedStorage.INSTANCE.network.sendTo(new MessageGridDelta(this, stack, delta), (EntityPlayerMP) player); - } - } + public void sendFluidStorageToClient() { + worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream() + .filter(player -> isWatchingGrid(player, EnumGridType.FLUID)) + .forEach(this::sendFluidStorageToClient); } - private boolean isWatchingGrid(EntityPlayer player) { - return player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition()); + @Override + public void sendFluidStorageToClient(EntityPlayerMP player) { + RefinedStorage.INSTANCE.network.sendTo(new MessageGridFluidUpdate(this), player); + } + + @Override + public void sendFluidStorageDeltaToClient(FluidStack stack, int delta) { + worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream() + .filter(player -> isWatchingGrid(player, EnumGridType.FLUID)) + .forEach(player -> RefinedStorage.INSTANCE.network.sendTo(new MessageGridFluidDelta(stack, delta), player)); + } + + private boolean isWatchingGrid(EntityPlayer player, EnumGridType... types) { + if (player.openContainer.getClass() == ContainerGrid.class) { + IGrid grid = ((ContainerGrid) player.openContainer).getGrid(); + + if (pos.equals(grid.getNetworkPosition())) { + return Arrays.asList(types).contains(grid.getType()); + } + } + + return false; } @Override public ItemStack insertItem(ItemStack stack, int size, boolean simulate) { - if (stack == null || stack.getItem() == null || storage.getStorages().isEmpty()) { + if (stack == null || stack.getItem() == null || itemStorage.getStorages().isEmpty()) { return ItemHandlerHelper.copyStackWithSize(stack, size); } @@ -494,11 +544,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR ItemStack remainder = stack; - for (IStorage storage : this.storage.getStorages()) { + for (IItemStorage storage : this.itemStorage.getStorages()) { remainder = storage.insertItem(remainder, size, simulate); - if (storage instanceof ExternalStorage && !simulate) { - ((ExternalStorage) storage).updateCacheForcefully(); + if (storage instanceof ItemStorageExternal && !simulate) { + ((ItemStorageExternal) storage).updateCacheForcefully(); } if (remainder == null) { @@ -519,7 +569,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR } } - storage.add(ItemHandlerHelper.copyStackWithSize(stack, inserted), false); + itemStorage.add(ItemHandlerHelper.copyStackWithSize(stack, inserted), false); } return remainder; @@ -532,12 +582,12 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR ItemStack newStack = null; - for (IStorage storage : this.storage.getStorages()) { + for (IItemStorage storage : this.itemStorage.getStorages()) { ItemStack took = storage.extractItem(stack, requested - received, flags); if (took != null) { - if (storage instanceof ExternalStorage) { - ((ExternalStorage) storage).updateCacheForcefully(); + if (storage instanceof ItemStorageExternal) { + ((ItemStorageExternal) storage).updateCacheForcefully(); } if (newStack == null) { @@ -555,7 +605,78 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR } if (newStack != null) { - storage.remove(newStack); + itemStorage.remove(newStack); + } + + return newStack; + } + + @Nullable + @Override + public FluidStack insertFluid(@Nonnull FluidStack stack, int size, boolean simulate) { + if (stack == null || fluidStorage.getStorages().isEmpty()) { + return FluidUtils.copyStackWithSize(stack, size); + } + + int orginalSize = size; + + FluidStack remainder = stack; + + for (IFluidStorage storage : this.fluidStorage.getStorages()) { + remainder = storage.insertFluid(remainder, size, simulate); + + if (storage instanceof FluidStorageExternal && !simulate) { + ((FluidStorageExternal) storage).updateCacheForcefully(); + } + + if (remainder == null) { + break; + } else { + size = remainder.amount; + } + } + + int inserted = remainder != null ? (orginalSize - remainder.amount) : orginalSize; + + if (!simulate && inserted > 0) { + fluidStorage.add(FluidUtils.copyStackWithSize(stack, inserted), false); + } + + return remainder; + } + + @Nullable + @Override + public FluidStack extractFluid(@Nonnull FluidStack stack, int size, int flags) { + int requested = size; + int received = 0; + + FluidStack newStack = null; + + for (IFluidStorage storage : this.fluidStorage.getStorages()) { + FluidStack took = storage.extractFluid(stack, requested - received, flags); + + if (took != null) { + if (storage instanceof FluidStorageExternal) { + ((FluidStorageExternal) storage).updateCacheForcefully(); + } + + if (newStack == null) { + newStack = took; + } else { + newStack.amount += took.amount; + } + + received += took.amount; + } + + if (requested == received) { + break; + } + } + + if (newStack != null) { + fluidStorage.remove(newStack); } return newStack; @@ -599,7 +720,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR energy.writeToNBT(tag); - tag.setInteger(RedstoneMode.NBT, redstoneMode.id); + tag.setInteger(RedstoneMode.NBT, redstoneMode.ordinal()); NBTTagList list = new NBTTagList(); @@ -642,34 +763,16 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR return energy.getEnergyStored(); } - @Optional.Method(modid = "Tesla") - @Override - public long getStoredPower() { - return energy.getEnergyStored(); - } - - @Optional.Method(modid = "Tesla") - @Override - public long getCapacity() { - return energy.getMaxEnergyStored(); - } - - @Optional.Method(modid = "Tesla") - @Override - public long givePower(long power, boolean simulated) { - return energy.receiveEnergy((int) power, simulated); - } - - public int getEnergyScaled(int i) { - return (int) ((float) energy.getEnergyStored() / (float) energy.getMaxEnergyStored() * (float) i); + public static int getEnergyScaled(int stored, int capacity, int scale) { + return (int) ((float) stored / (float) capacity * (float) scale); } public int getEnergyScaledForDisplay() { - return getEnergyScaled(7); + return getEnergyScaled(energy.getEnergyStored(), energy.getMaxEnergyStored(), 7); } public int getEnergyScaledForComparator() { - return getEnergyScaled(15); + return getEnergyScaled(energy.getEnergyStored(), energy.getMaxEnergyStored(), 15); } @Override @@ -696,19 +799,15 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR @Override public int getEnergyUsage() { - if (!worldObj.isRemote) { - int usage = 0; + int usage = RefinedStorage.INSTANCE.controllerBaseUsage; - for (INetworkNode node : nodes) { - if (node.canUpdate()) { - usage += node.getEnergyUsage(); - } + for (INetworkNode node : nodeGraph.all()) { + if (node.canUpdate()) { + usage += node.getEnergyUsage(); } - - return usage; } - return energyUsage; + return usage; } public EnumControllerType getType() { @@ -719,82 +818,10 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR return type == null ? EnumControllerType.NORMAL : type; } - @Override - public void readContainerData(ByteBuf buf) { - energy.setEnergyStored(buf.readInt()); - this.energyUsage = buf.readInt(); - this.redstoneMode = RedstoneMode.getById(buf.readInt()); - - List nodes = new ArrayList(); - - int size = buf.readInt(); - - for (int i = 0; i < size; ++i) { - ClientNode node = new ClientNode(); - - node.energyUsage = buf.readInt(); - node.amount = buf.readInt(); - node.stack = ByteBufUtils.readItemStack(buf); - - nodes.add(node); - } - - this.clientNodes = nodes; - } - - @Override - public void writeContainerData(ByteBuf buf) { - buf.writeInt(energy.getEnergyStored()); - buf.writeInt(getEnergyUsage()); - - buf.writeInt(redstoneMode.id); - - List clientNodes = new ArrayList(); - - for (INetworkNode node : nodes) { - if (node.canUpdate()) { - IBlockState state = worldObj.getBlockState(node.getPosition()); - - ClientNode clientNode = new ClientNode(); - - clientNode.energyUsage = node.getEnergyUsage(); - clientNode.amount = 1; - clientNode.stack = new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)); - - if (clientNode.stack.getItem() != null) { - if (clientNodes.contains(clientNode)) { - for (ClientNode other : clientNodes) { - if (other.equals(clientNode)) { - other.amount++; - - break; - } - } - } else { - clientNodes.add(clientNode); - } - } - } - } - - buf.writeInt(clientNodes.size()); - - for (ClientNode node : clientNodes) { - buf.writeInt(node.energyUsage); - buf.writeInt(node.amount); - ByteBufUtils.writeItemStack(buf, node.stack); - } - } - - @Override - public Class getContainer() { - return ContainerController.class; - } - @Override public T getCapability(Capability capability, EnumFacing facing) { - if (RefinedStorage.hasTesla() && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER)) { - return (T) this; + if (energyTesla != null && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER)) { + return (T) energyTesla; } return super.getCapability(capability, facing); @@ -802,6 +829,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR @Override public boolean hasCapability(Capability capability, EnumFacing facing) { - return (RefinedStorage.hasTesla() && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER)) || super.hasCapability(capability, facing); + return (energyTesla != null && (capability == TeslaCapabilities.CAPABILITY_HOLDER || capability == TeslaCapabilities.CAPABILITY_CONSUMER)) || super.hasCapability(capability, facing); } } diff --git a/src/main/java/refinedstorage/tile/TileCrafter.java b/src/main/java/refinedstorage/tile/TileCrafter.java index 19968f471..300e7adf5 100755 --- a/src/main/java/refinedstorage/tile/TileCrafter.java +++ b/src/main/java/refinedstorage/tile/TileCrafter.java @@ -1,7 +1,5 @@ package refinedstorage.tile; -import net.minecraft.inventory.Container; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; @@ -10,24 +8,15 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.autocrafting.ICraftingPatternContainer; -import refinedstorage.api.autocrafting.ICraftingTask; import refinedstorage.api.network.INetworkMaster; -import refinedstorage.container.ContainerCrafter; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.inventory.BasicItemValidator; -import refinedstorage.inventory.IItemValidator; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerUpgrade; import refinedstorage.item.ItemPattern; import refinedstorage.item.ItemUpgrade; public class TileCrafter extends TileNode implements ICraftingPatternContainer { - private BasicItemHandler patterns = new BasicItemHandler(9, this, new IItemValidator() { - @Override - public boolean isValid(ItemStack stack) { - return stack.getItem() == RefinedStorageItems.PATTERN && ItemPattern.isValid(stack); - } - }) { + private ItemHandlerBasic patterns = new ItemHandlerBasic(9, this, stack -> (stack.getItem() == RefinedStorageItems.PATTERN && ItemPattern.isValid(stack))) { @Override protected void onContentsChanged(int slot) { super.onContentsChanged(slot); @@ -38,11 +27,11 @@ public class TileCrafter extends TileNode implements ICraftingPatternContainer { } }; - private BasicItemHandler upgrades = new BasicItemHandler(4, this, new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_SPEED)); + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_SPEED); @Override public int getEnergyUsage() { - int usage = RefinedStorage.INSTANCE.crafterUsage + RefinedStorageUtils.getUpgradeEnergyUsage(upgrades); + int usage = RefinedStorage.INSTANCE.crafterUsage + upgrades.getEnergyUsage(); for (int i = 0; i < patterns.getSlots(); ++i) { if (patterns.getStackInSlot(i) != null) { @@ -57,50 +46,43 @@ public class TileCrafter extends TileNode implements ICraftingPatternContainer { public void updateNode() { } - @Override - public Class getContainer() { - return ContainerCrafter.class; - } - @Override public void onConnectionChange(INetworkMaster network, boolean state) { if (!state) { - for (ICraftingTask task : network.getCraftingTasks()) { - if (task.getPattern().getContainerPosition().equals(pos)) { - network.cancelCraftingTask(task); - } - } + network.getCraftingTasks().stream() + .filter(task -> task.getPattern().getContainerPosition().equals(pos)) + .forEach(network::cancelCraftingTask); } network.rebuildPatterns(); } @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void read(NBTTagCompound tag) { + super.read(tag); - RefinedStorageUtils.readItems(patterns, 0, nbt); - RefinedStorageUtils.readItems(upgrades, 1, nbt); + readItems(patterns, 0, tag); + readItems(upgrades, 1, tag); } @Override public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - RefinedStorageUtils.writeItems(patterns, 0, tag); - RefinedStorageUtils.writeItems(upgrades, 1, tag); + writeItems(patterns, 0, tag); + writeItems(upgrades, 1, tag); return tag; } @Override public int getSpeed() { - return 20 - (RefinedStorageUtils.getUpgradeCount(upgrades, ItemUpgrade.TYPE_SPEED) * 4); + return 20 - (upgrades.getUpgradeCount(ItemUpgrade.TYPE_SPEED) * 4); } @Override public IItemHandler getConnectedItems() { - return RefinedStorageUtils.getItemHandler(getFacingTile(), getDirection().getOpposite()); + return getItemHandler(getFacingTile(), getDirection().getOpposite()); } public IItemHandler getPatterns() { @@ -112,7 +94,7 @@ public class TileCrafter extends TileNode implements ICraftingPatternContainer { } @Override - public IItemHandler getDroppedItems() { + public IItemHandler getDrops() { return new CombinedInvWrapper(patterns, upgrades); } diff --git a/src/main/java/refinedstorage/tile/TileCraftingMonitor.java b/src/main/java/refinedstorage/tile/TileCraftingMonitor.java index 4357bd91a..bc66338e2 100755 --- a/src/main/java/refinedstorage/tile/TileCraftingMonitor.java +++ b/src/main/java/refinedstorage/tile/TileCraftingMonitor.java @@ -1,19 +1,35 @@ package refinedstorage.tile; -import io.netty.buffer.ByteBuf; -import net.minecraft.inventory.Container; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.network.ByteBufUtils; import refinedstorage.RefinedStorage; -import refinedstorage.api.autocrafting.ICraftingTask; -import refinedstorage.container.ContainerCraftingMonitor; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.RefinedStorageSerializers; +import refinedstorage.tile.data.TileDataParameter; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public class TileCraftingMonitor extends TileNode { - private List tasks = new ArrayList(); + public static final TileDataParameter> TASKS = new TileDataParameter<>(RefinedStorageSerializers.CLIENT_CRAFTING_TASK_SERIALIZER, new ArrayList<>(), new ITileDataProducer, TileCraftingMonitor>() { + @Override + public List getValue(TileCraftingMonitor tile) { + if (tile.connected) { + List tasks = tile.network.getCraftingTasks().stream().map(t -> new ClientCraftingTask( + t.getInfo(), + t.getPattern().getOutputs() + )).collect(Collectors.toList()); + + return tasks; + } else { + return Collections.emptyList(); + } + } + }); + + public TileCraftingMonitor() { + dataManager.addParameter(TASKS); + } @Override public int getEnergyUsage() { @@ -23,69 +39,4 @@ public class TileCraftingMonitor extends TileNode { @Override public void updateNode() { } - - @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - if (connected) { - buf.writeInt(network.getCraftingTasks().size()); - - for (ICraftingTask task : network.getCraftingTasks()) { - ByteBufUtils.writeUTF8String(buf, task.getInfo()); - - buf.writeInt(task.getPattern().getOutputs().length); - - for (ItemStack output : task.getPattern().getOutputs()) { - ByteBufUtils.writeItemStack(buf, output); - } - } - } else { - buf.writeInt(0); - } - } - - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - int size = buf.readInt(); - - List newTasks = new ArrayList(); - - for (int i = 0; i < size; ++i) { - String info = ByteBufUtils.readUTF8String(buf); - - int outputs = buf.readInt(); - - for (int j = 0; j < outputs; ++j) { - newTasks.add(new ClientSideCraftingTask(ByteBufUtils.readItemStack(buf), i, info)); - } - } - - Collections.reverse(newTasks); - - tasks = newTasks; - } - - public List getTasks() { - return tasks; - } - - @Override - public Class getContainer() { - return ContainerCraftingMonitor.class; - } - - public class ClientSideCraftingTask { - public ItemStack output; - public int id; - public String info; - - public ClientSideCraftingTask(ItemStack output, int id, String info) { - this.output = output; - this.id = id; - this.info = info; - } - } } diff --git a/src/main/java/refinedstorage/tile/TileDestructor.java b/src/main/java/refinedstorage/tile/TileDestructor.java index 59ff51fdd..5c99e96d0 100755 --- a/src/main/java/refinedstorage/tile/TileDestructor.java +++ b/src/main/java/refinedstorage/tile/TileDestructor.java @@ -1,81 +1,124 @@ package refinedstorage.tile; -import io.netty.buffer.ByteBuf; +import mcmultipart.microblock.IMicroblock; import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; import net.minecraft.block.state.IBlockState; -import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidBlock; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.wrappers.BlockLiquidWrapper; +import net.minecraftforge.fluids.capability.wrappers.FluidBlockWrapper; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.container.ContainerDestructor; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.inventory.BasicItemValidator; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerFluid; +import refinedstorage.inventory.ItemHandlerUpgrade; import refinedstorage.item.ItemUpgrade; -import refinedstorage.tile.config.ICompareConfig; -import refinedstorage.tile.config.IModeConfig; -import refinedstorage.tile.config.ModeConstants; -import refinedstorage.tile.config.ModeFilter; +import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.config.IFilterable; +import refinedstorage.tile.config.IType; +import refinedstorage.tile.data.TileDataParameter; import java.util.List; -public class TileDestructor extends TileNode implements ICompareConfig, IModeConfig { +public class TileDestructor extends TileMultipartNode implements IComparable, IFilterable, IType { + public static final TileDataParameter COMPARE = IComparable.createParameter(); + public static final TileDataParameter MODE = IFilterable.createParameter(); + public static final TileDataParameter TYPE = IType.createParameter(); + private static final String NBT_COMPARE = "Compare"; private static final String NBT_MODE = "Mode"; + private static final String NBT_TYPE = "Type"; private static final int BASE_SPEED = 20; - private BasicItemHandler filters = new BasicItemHandler(9, this); - private BasicItemHandler upgrades = new BasicItemHandler( - 4, - this, - new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_SPEED) - ); + private ItemHandlerBasic itemFilters = new ItemHandlerBasic(9, this); + private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(9, this); + + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_SPEED); private int compare = 0; - private int mode = ModeConstants.WHITELIST; + private int mode = IFilterable.WHITELIST; + private int type = IType.ITEMS; + + public TileDestructor() { + dataManager.addWatchedParameter(COMPARE); + dataManager.addWatchedParameter(MODE); + dataManager.addWatchedParameter(TYPE); + } + + @Override + public boolean canAddMicroblock(IMicroblock microblock) { + return !isBlockingMicroblock(microblock, getDirection()); + } @Override public int getEnergyUsage() { - return RefinedStorage.INSTANCE.destructorUsage + RefinedStorageUtils.getUpgradeEnergyUsage(upgrades); + return RefinedStorage.INSTANCE.destructorUsage + upgrades.getEnergyUsage(); } @Override public void updateNode() { - if (ticks % RefinedStorageUtils.getSpeed(upgrades, BASE_SPEED, 4) == 0) { - BlockPos front = pos.offset(getDirection()); + if (ticks % upgrades.getSpeed(BASE_SPEED, 4) == 0) { + if (type == IType.ITEMS) { + BlockPos front = pos.offset(getDirection()); - IBlockState frontBlockState = worldObj.getBlockState(front); - ItemStack frontStack = frontBlockState.getBlock().getItem(worldObj, front, frontBlockState); + IBlockState frontBlockState = worldObj.getBlockState(front); + ItemStack frontStack = frontBlockState.getBlock().getItem(worldObj, front, frontBlockState); - if (frontStack != null) { - if (ModeFilter.respectsMode(filters, this, compare, frontStack)) { - List drops = frontBlockState.getBlock().getDrops(worldObj, front, frontBlockState, 0); + if (frontStack != null) { + if (IFilterable.canTake(itemFilters, mode, compare, frontStack)) { + List drops = frontBlockState.getBlock().getDrops(worldObj, front, frontBlockState, 0); - worldObj.playEvent(null, 2001, front, Block.getStateId(frontBlockState)); - worldObj.setBlockToAir(front); + worldObj.playEvent(null, 2001, front, Block.getStateId(frontBlockState)); + worldObj.setBlockToAir(front); - for (ItemStack drop : drops) { - // We check if the controller isn't null here because when a destructor faces a node and removes it - // it will essentially remove this block itself from the network without knowing - if (network == null) { - InventoryHelper.spawnItemStack(worldObj, front.getX(), front.getY(), front.getZ(), drop); - } else { - ItemStack remainder = network.insertItem(drop, drop.stackSize, false); + for (ItemStack drop : drops) { + // We check if the controller isn't null here because when a destructor faces a node and removes it + // it will essentially remove this block itself from the network without knowing + if (network == null) { + InventoryHelper.spawnItemStack(worldObj, front.getX(), front.getY(), front.getZ(), drop); + } else { + ItemStack remainder = network.insertItem(drop, drop.stackSize, false); - if (remainder != null) { - InventoryHelper.spawnItemStack(worldObj, front.getX(), front.getY(), front.getZ(), remainder); + if (remainder != null) { + InventoryHelper.spawnItemStack(worldObj, front.getX(), front.getY(), front.getZ(), remainder); + } } } } } + } else if (type == IType.FLUIDS) { + BlockPos front = pos.offset(getDirection()); + + Block frontBlock = worldObj.getBlockState(front).getBlock(); + + IFluidHandler handler = null; + + if (frontBlock instanceof BlockLiquid) { + handler = new BlockLiquidWrapper((BlockLiquid) frontBlock, worldObj, front); + } else if (frontBlock instanceof IFluidBlock) { + handler = new FluidBlockWrapper((IFluidBlock) frontBlock, worldObj, front); + } + + if (handler != null) { + FluidStack stack = handler.drain(Fluid.BUCKET_VOLUME, false); + + if (stack != null && IFilterable.canTakeFluids(fluidFilters, mode, compare, stack) && network.insertFluid(stack, stack.amount, true) == null) { + FluidStack drained = handler.drain(Fluid.BUCKET_VOLUME, true); + + network.insertFluid(drained, drained.amount, false); + } + } } } } @@ -105,19 +148,24 @@ public class TileDestructor extends TileNode implements ICompareConfig, IModeCon } @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void read(NBTTagCompound tag) { + super.read(tag); - if (nbt.hasKey(NBT_COMPARE)) { - compare = nbt.getInteger(NBT_COMPARE); + if (tag.hasKey(NBT_COMPARE)) { + compare = tag.getInteger(NBT_COMPARE); } - if (nbt.hasKey(NBT_MODE)) { - mode = nbt.getInteger(NBT_MODE); + if (tag.hasKey(NBT_MODE)) { + mode = tag.getInteger(NBT_MODE); } - RefinedStorageUtils.readItems(filters, 0, nbt); - RefinedStorageUtils.readItems(upgrades, 1, nbt); + if (tag.hasKey(NBT_TYPE)) { + type = tag.getInteger(NBT_TYPE); + } + + readItems(itemFilters, 0, tag); + readItems(upgrades, 1, tag); + readItems(fluidFilters, 2, tag); } @Override @@ -126,46 +174,45 @@ public class TileDestructor extends TileNode implements ICompareConfig, IModeCon tag.setInteger(NBT_COMPARE, compare); tag.setInteger(NBT_MODE, mode); + tag.setInteger(NBT_TYPE, type); - RefinedStorageUtils.writeItems(filters, 0, tag); - RefinedStorageUtils.writeItems(upgrades, 1, tag); + writeItems(itemFilters, 0, tag); + writeItems(upgrades, 1, tag); + writeItems(fluidFilters, 2, tag); return tag; } - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - compare = buf.readInt(); - mode = buf.readInt(); - } - - @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - buf.writeInt(compare); - buf.writeInt(mode); - } - - public Class getContainer() { - return ContainerDestructor.class; - } - public IItemHandler getUpgrades() { return upgrades; } public IItemHandler getInventory() { - return filters; + return itemFilters; } @Override - public IItemHandler getDroppedItems() { + public IItemHandler getDrops() { return upgrades; } + @Override + public int getType() { + return worldObj.isRemote ? TYPE.getValue() : type; + } + + @Override + public void setType(int type) { + this.type = type; + + markDirty(); + } + + @Override + public IItemHandler getFilterInventory() { + return getType() == IType.ITEMS ? itemFilters : fluidFilters; + } + @Override public T getCapability(Capability capability, EnumFacing facing) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { diff --git a/src/main/java/refinedstorage/tile/TileDetector.java b/src/main/java/refinedstorage/tile/TileDetector.java index ef508062a..b7b903b5c 100755 --- a/src/main/java/refinedstorage/tile/TileDetector.java +++ b/src/main/java/refinedstorage/tile/TileDetector.java @@ -1,21 +1,70 @@ package refinedstorage.tile; -import io.netty.buffer.ByteBuf; -import net.minecraft.inventory.Container; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataSerializers; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.items.IItemHandler; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.network.INetworkMaster; -import refinedstorage.container.ContainerDetector; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.tile.config.ICompareConfig; +import refinedstorage.gui.GuiDetector; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerFluid; +import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.config.IType; import refinedstorage.tile.config.RedstoneMode; +import refinedstorage.tile.data.ITileDataConsumer; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; -public class TileDetector extends TileNode implements ICompareConfig { - public static final int SPEED = 5; +public class TileDetector extends TileNode implements IComparable, IType { + public static final TileDataParameter COMPARE = IComparable.createParameter(); + public static final TileDataParameter TYPE = IType.createParameter(); + + public static final TileDataParameter MODE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileDetector tile) { + return tile.mode; + } + }, new ITileDataConsumer() { + @Override + public void setValue(TileDetector tile, Integer value) { + if (value == MODE_UNDER || value == MODE_EQUAL || value == MODE_ABOVE) { + tile.mode = value; + + tile.markDirty(); + } + } + }); + + public static final TileDataParameter AMOUNT = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileDetector tile) { + return tile.amount; + } + }, new ITileDataConsumer() { + @Override + public void setValue(TileDetector tile, Integer value) { + tile.amount = value; + + tile.markDirty(); + } + }, parameter -> { + if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) { + GuiScreen gui = Minecraft.getMinecraft().currentScreen; + + if (gui instanceof GuiDetector) { + ((GuiDetector) gui).AMOUNT.setText(String.valueOf(parameter.getValue())); + } + } + }); + + private static final int SPEED = 5; public static final int MODE_UNDER = 0; public static final int MODE_EQUAL = 1; @@ -25,16 +74,26 @@ public class TileDetector extends TileNode implements ICompareConfig { private static final String NBT_MODE = "Mode"; private static final String NBT_AMOUNT = "Amount"; private static final String NBT_POWERED = "Powered"; + private static final String NBT_TYPE = "Type"; - private BasicItemHandler filter = new BasicItemHandler(1, this); + private ItemHandlerBasic itemFilters = new ItemHandlerBasic(1, this); + private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(1, this); private int compare = 0; + private int type = IType.ITEMS; private int mode = MODE_EQUAL; private int amount = 0; private boolean powered = false; private boolean wasPowered; + public TileDetector() { + dataManager.addWatchedParameter(COMPARE); + dataManager.addWatchedParameter(TYPE); + dataManager.addWatchedParameter(MODE); + dataManager.addWatchedParameter(AMOUNT); + } + @Override public int getEnergyUsage() { return RefinedStorage.INSTANCE.detectorUsage; @@ -43,34 +102,26 @@ public class TileDetector extends TileNode implements ICompareConfig { @Override public void updateNode() { if (ticks % SPEED == 0) { - ItemStack slot = filter.getStackInSlot(0); + if (type == IType.ITEMS) { + ItemStack slot = itemFilters.getStackInSlot(0); - if (slot != null) { - ItemStack stack = network.getStorage().get(slot, compare); + if (slot != null) { + ItemStack stack = network.getItemStorage().get(slot, compare); - if (stack != null) { - switch (mode) { - case MODE_UNDER: - powered = stack.stackSize < amount; - break; - case MODE_EQUAL: - powered = stack.stackSize == amount; - break; - case MODE_ABOVE: - powered = stack.stackSize > amount; - break; - } + powered = isPowered(stack == null ? null : stack.stackSize); } else { - if (mode == MODE_UNDER && amount != 0) { - powered = true; - } else if (mode == MODE_EQUAL && amount == 0) { - powered = true; - } else { - powered = false; - } + powered = false; + } + } else if (type == IType.FLUIDS) { + FluidStack slot = fluidFilters.getFluids()[0]; + + if (slot != null) { + FluidStack stack = network.getFluidStorage().get(slot, compare); + + powered = isPowered(stack == null ? null : stack.amount); + } else { + powered = false; } - } else { - powered = false; } } } @@ -82,7 +133,7 @@ public class TileDetector extends TileNode implements ICompareConfig { worldObj.notifyNeighborsOfStateChange(pos, RefinedStorageBlocks.DETECTOR); - RefinedStorageUtils.updateBlock(worldObj, pos); + updateBlock(); } super.update(); @@ -101,6 +152,29 @@ public class TileDetector extends TileNode implements ICompareConfig { return powered; } + public boolean isPowered(Integer size) { + if (size != null) { + switch (mode) { + case MODE_UNDER: + return size < amount; + case MODE_EQUAL: + return size == amount; + case MODE_ABOVE: + return size > amount; + } + } else { + if (mode == MODE_UNDER && amount != 0) { + return true; + } else if (mode == MODE_EQUAL && amount == 0) { + return true; + } else { + return false; + } + } + + return false; + } + @Override public int getCompare() { return compare; @@ -113,43 +187,28 @@ public class TileDetector extends TileNode implements ICompareConfig { markDirty(); } - public int getMode() { - return mode; - } - - public void setMode(int mode) { - this.mode = mode; - - markDirty(); - } - - public int getAmount() { - return amount; - } - - public void setAmount(int amount) { - this.amount = amount; - - markDirty(); - } - @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void read(NBTTagCompound tag) { + super.read(tag); - if (nbt.hasKey(NBT_COMPARE)) { - compare = nbt.getInteger(NBT_COMPARE); + if (tag.hasKey(NBT_COMPARE)) { + compare = tag.getInteger(NBT_COMPARE); } - if (nbt.hasKey(NBT_MODE)) { - mode = nbt.getInteger(NBT_MODE); + if (tag.hasKey(NBT_MODE)) { + mode = tag.getInteger(NBT_MODE); } - if (nbt.hasKey(NBT_AMOUNT)) { - amount = nbt.getInteger(NBT_AMOUNT); + if (tag.hasKey(NBT_AMOUNT)) { + amount = tag.getInteger(NBT_AMOUNT); } - RefinedStorageUtils.readItems(filter, 0, nbt); + if (tag.hasKey(NBT_TYPE)) { + type = tag.getInteger(NBT_TYPE); + } + + readItems(itemFilters, 0, tag); + readItems(fluidFilters, 1, tag); } @Override @@ -159,8 +218,10 @@ public class TileDetector extends TileNode implements ICompareConfig { tag.setInteger(NBT_COMPARE, compare); tag.setInteger(NBT_MODE, mode); tag.setInteger(NBT_AMOUNT, amount); + tag.setInteger(NBT_TYPE, type); - RefinedStorageUtils.writeItems(filter, 0, tag); + writeItems(itemFilters, 0, tag); + writeItems(fluidFilters, 1, tag); return tag; } @@ -181,35 +242,29 @@ public class TileDetector extends TileNode implements ICompareConfig { return tag; } - @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - buf.writeInt(compare); - buf.writeInt(mode); - buf.writeInt(amount); - } - - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - compare = buf.readInt(); - mode = buf.readInt(); - amount = buf.readInt(); - } - - @Override - public Class getContainer() { - return ContainerDetector.class; - } - public IItemHandler getInventory() { - return filter; + return itemFilters; } @Override public void setRedstoneMode(RedstoneMode mode) { // NO OP } + + @Override + public int getType() { + return worldObj.isRemote ? TYPE.getValue() : type; + } + + @Override + public void setType(int type) { + this.type = type; + + markDirty(); + } + + @Override + public IItemHandler getFilterInventory() { + return getType() == IType.ITEMS ? itemFilters : fluidFilters; + } } diff --git a/src/main/java/refinedstorage/tile/TileDiskDrive.java b/src/main/java/refinedstorage/tile/TileDiskDrive.java index 2ff45cb73..c25982b79 100755 --- a/src/main/java/refinedstorage/tile/TileDiskDrive.java +++ b/src/main/java/refinedstorage/tile/TileDiskDrive.java @@ -1,11 +1,10 @@ package refinedstorage.tile; -import io.netty.buffer.ByteBuf; -import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.items.CapabilityItemHandler; @@ -13,24 +12,36 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.network.INetworkMaster; -import refinedstorage.api.storage.IStorage; -import refinedstorage.api.storage.IStorageProvider; -import refinedstorage.apiimpl.storage.NBTStorage; -import refinedstorage.block.EnumStorageType; -import refinedstorage.container.ContainerDiskDrive; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.inventory.BasicItemValidator; -import refinedstorage.network.MessagePriorityUpdate; -import refinedstorage.tile.config.*; +import refinedstorage.api.storage.fluid.IFluidStorage; +import refinedstorage.api.storage.fluid.IFluidStorageProvider; +import refinedstorage.api.storage.item.IItemStorage; +import refinedstorage.api.storage.item.IItemStorageProvider; +import refinedstorage.apiimpl.storage.fluid.FluidStorageNBT; +import refinedstorage.apiimpl.storage.fluid.FluidUtils; +import refinedstorage.apiimpl.storage.item.ItemStorageNBT; +import refinedstorage.block.EnumFluidStorageType; +import refinedstorage.block.EnumItemStorageType; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerFluid; +import refinedstorage.inventory.ItemValidatorBasic; +import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.config.IFilterable; +import refinedstorage.tile.config.IPrioritizable; +import refinedstorage.tile.config.IType; +import refinedstorage.tile.data.TileDataParameter; import java.util.List; -public class TileDiskDrive extends TileNode implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig { - public class Storage extends NBTStorage { - public Storage(ItemStack disk) { - super(disk.getTagCompound(), EnumStorageType.getById(disk.getItemDamage()).getCapacity(), TileDiskDrive.this); +public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFluidStorageProvider, IStorageGui, IComparable, IFilterable, IPrioritizable, IType { + public static final TileDataParameter PRIORITY = IPrioritizable.createParameter(); + public static final TileDataParameter COMPARE = IComparable.createParameter(); + public static final TileDataParameter MODE = IFilterable.createParameter(); + public static final TileDataParameter TYPE = IType.createParameter(); + + public class ItemStorage extends ItemStorageNBT { + public ItemStorage(ItemStack disk) { + super(disk.getTagCompound(), EnumItemStorageType.getById(disk.getItemDamage()).getCapacity(), TileDiskDrive.this); } @Override @@ -40,7 +51,7 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag @Override public ItemStack insertItem(ItemStack stack, int size, boolean simulate) { - if (!ModeFilter.respectsMode(getFilters(), getModeConfig(), getCompare(), stack)) { + if (!IFilterable.canTake(itemFilters, mode, getCompare(), stack)) { return ItemHandlerHelper.copyStackWithSize(stack, size); } @@ -48,64 +59,110 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag } } + public class FluidStorage extends FluidStorageNBT { + public FluidStorage(ItemStack disk) { + super(disk.getTagCompound(), EnumFluidStorageType.getById(disk.getItemDamage()).getCapacity(), TileDiskDrive.this); + } + + @Override + public int getPriority() { + return priority; + } + + @Override + public FluidStack insertFluid(FluidStack stack, int size, boolean simulate) { + if (!IFilterable.canTakeFluids(fluidFilters, mode, getCompare(), stack)) { + return FluidUtils.copyStackWithSize(stack, size); + } + + return super.insertFluid(stack, size, simulate); + } + } + private static final String NBT_PRIORITY = "Priority"; private static final String NBT_COMPARE = "Compare"; private static final String NBT_MODE = "Mode"; private static final String NBT_STORED = "Stored"; + private static final String NBT_TYPE = "Type"; - private BasicItemHandler disks = new BasicItemHandler(8, this, new BasicItemValidator(RefinedStorageItems.STORAGE_DISK) { + private ItemHandlerBasic disks = new ItemHandlerBasic(8, this, new ItemValidatorBasic(RefinedStorageItems.STORAGE_DISK) { @Override public boolean isValid(ItemStack disk) { - return super.isValid(disk) && NBTStorage.isValid(disk); + return super.isValid(disk) && ItemStorageNBT.isValid(disk); + } + }, new ItemValidatorBasic(RefinedStorageItems.FLUID_STORAGE_DISK) { + @Override + public boolean isValid(ItemStack disk) { + return super.isValid(disk) && FluidStorageNBT.isValid(disk); } }) { @Override protected void onContentsChanged(int slot) { super.onContentsChanged(slot); - /** - * Can't use {@link net.minecraft.world.World#isRemote} here because when {@link TileDiskDrive#readFromNBT(NBTTagCompound)} is called there is no world set yet. - */ if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { ItemStack disk = getStackInSlot(slot); if (disk == null) { - storages[slot] = null; + itemStorages[slot] = null; + fluidStorages[slot] = null; } else { - storages[slot] = new Storage(disk); + if (disk.getItem() == RefinedStorageItems.STORAGE_DISK) { + itemStorages[slot] = new ItemStorage(disk); + } else if (disk.getItem() == RefinedStorageItems.FLUID_STORAGE_DISK) { + fluidStorages[slot] = new FluidStorage(disk); + } } if (network != null) { - network.getStorage().rebuild(); + network.getItemStorage().rebuild(); + network.getFluidStorage().rebuild(); } } } @Override public ItemStack extractItem(int slot, int amount, boolean simulate) { - if (storages[slot] != null) { - storages[slot].writeToNBT(); + if (itemStorages[slot] != null) { + itemStorages[slot].writeToNBT(); } + if (fluidStorages[slot] != null) { + fluidStorages[slot].writeToNBT(); + } + + return super.extractItem(slot, amount, simulate); } }; - private BasicItemHandler filters = new BasicItemHandler(9, this); - private Storage storages[] = new Storage[8]; + private ItemHandlerBasic itemFilters = new ItemHandlerBasic(9, this); + private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(9, this); + + private ItemStorage itemStorages[] = new ItemStorage[8]; + private FluidStorage fluidStorages[] = new FluidStorage[8]; private int priority = 0; private int compare = 0; - private int mode = ModeConstants.WHITELIST; + private int mode = IFilterable.WHITELIST; + private int type = IType.ITEMS; + private int stored = 0; + public TileDiskDrive() { + dataManager.addWatchedParameter(PRIORITY); + dataManager.addWatchedParameter(COMPARE); + dataManager.addWatchedParameter(MODE); + dataManager.addWatchedParameter(TYPE); + } + @Override public void update() { if (!worldObj.isRemote) { if (stored != getStoredForDisplayServer()) { stored = getStoredForDisplayServer(); - RefinedStorageUtils.updateBlock(worldObj, pos); + updateBlock(); } } @@ -130,7 +187,13 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag } public void onBreak() { - for (Storage storage : this.storages) { + for (ItemStorage storage : this.itemStorages) { + if (storage != null) { + storage.writeToNBT(); + } + } + + for (FluidStorage storage : this.fluidStorages) { if (storage != null) { storage.writeToNBT(); } @@ -141,12 +204,13 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag public void onConnectionChange(INetworkMaster network, boolean state) { super.onConnectionChange(network, state); - network.getStorage().rebuild(); + network.getItemStorage().rebuild(); + network.getFluidStorage().rebuild(); } @Override - public void addStorages(List storages) { - for (IStorage storage : this.storages) { + public void addItemStorages(List storages) { + for (IItemStorage storage : this.itemStorages) { if (storage != null) { storages.add(storage); } @@ -154,22 +218,36 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag } @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void addFluidStorages(List storages) { + for (IFluidStorage storage : this.fluidStorages) { + if (storage != null) { + storages.add(storage); + } + } + } - RefinedStorageUtils.readItems(disks, 0, nbt); - RefinedStorageUtils.readItems(filters, 1, nbt); + @Override + public void read(NBTTagCompound tag) { + super.read(tag); - if (nbt.hasKey(NBT_PRIORITY)) { - priority = nbt.getInteger(NBT_PRIORITY); + readItems(disks, 0, tag); + readItems(itemFilters, 1, tag); + readItems(fluidFilters, 2, tag); + + if (tag.hasKey(NBT_PRIORITY)) { + priority = tag.getInteger(NBT_PRIORITY); } - if (nbt.hasKey(NBT_COMPARE)) { - compare = nbt.getInteger(NBT_COMPARE); + if (tag.hasKey(NBT_COMPARE)) { + compare = tag.getInteger(NBT_COMPARE); } - if (nbt.hasKey(NBT_MODE)) { - mode = nbt.getInteger(NBT_MODE); + if (tag.hasKey(NBT_MODE)) { + mode = tag.getInteger(NBT_MODE); + } + + if (tag.hasKey(NBT_TYPE)) { + type = tag.getInteger(NBT_TYPE); } } @@ -178,17 +256,23 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag super.write(tag); for (int i = 0; i < disks.getSlots(); ++i) { - if (storages[i] != null) { - storages[i].writeToNBT(); + if (itemStorages[i] != null) { + itemStorages[i].writeToNBT(); + } + + if (fluidStorages[i] != null) { + fluidStorages[i].writeToNBT(); } } - RefinedStorageUtils.writeItems(disks, 0, tag); - RefinedStorageUtils.writeItems(filters, 1, tag); + writeItems(disks, 0, tag); + writeItems(itemFilters, 1, tag); + writeItems(fluidFilters, 2, tag); tag.setInteger(NBT_PRIORITY, priority); tag.setInteger(NBT_COMPARE, compare); tag.setInteger(NBT_MODE, mode); + tag.setInteger(NBT_TYPE, type); return tag; } @@ -209,29 +293,6 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag super.readUpdate(tag); } - @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - buf.writeInt(priority); - buf.writeInt(compare); - buf.writeInt(mode); - } - - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - priority = buf.readInt(); - compare = buf.readInt(); - mode = buf.readInt(); - } - - @Override - public Class getContainer() { - return ContainerDiskDrive.class; - } - @Override public int getCompare() { return compare; @@ -258,31 +319,31 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag public int getStoredForDisplayServer() { float stored = 0; - float storedMax = 0; + float capacity = 0; for (int i = 0; i < disks.getSlots(); ++i) { ItemStack disk = disks.getStackInSlot(i); if (disk != null) { - int capacity = EnumStorageType.getById(disk.getItemDamage()).getCapacity(); + int diskCapacity = disk.getItem() == RefinedStorageItems.STORAGE_DISK ? EnumItemStorageType.getById(disk.getItemDamage()).getCapacity() : EnumFluidStorageType.getById(disk.getItemDamage()).getCapacity(); if (capacity == -1) { return 0; } - stored += NBTStorage.getStoredFromNBT(disk.getTagCompound()); - storedMax += EnumStorageType.getById(disk.getItemDamage()).getCapacity(); + stored += disk.getItem() == RefinedStorageItems.STORAGE_DISK ? ItemStorageNBT.getStoredFromNBT(disk.getTagCompound()) : FluidStorageNBT.getStoredFromNBT(disk.getTagCompound()); + capacity += diskCapacity; } } - if (storedMax == 0) { + if (capacity == 0) { return 0; } - return (int) Math.floor((stored / storedMax) * 7f); + return (int) Math.floor((stored / capacity) * 7F); } - public int getStoredForScaledDisplay() { + public int getStoredForDisplay() { return stored; } @@ -292,28 +353,28 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag } @Override - public IItemHandler getFilters() { - return filters; + public TileDataParameter getTypeParameter() { + return TYPE; } @Override - public IRedstoneModeConfig getRedstoneModeConfig() { - return this; + public TileDataParameter getRedstoneModeParameter() { + return REDSTONE_MODE; } @Override - public ICompareConfig getCompareConfig() { - return this; + public TileDataParameter getCompareParameter() { + return COMPARE; } @Override - public IModeConfig getModeConfig() { - return this; + public TileDataParameter getFilterParameter() { + return MODE; } @Override - public void onPriorityChanged(int priority) { - RefinedStorage.INSTANCE.network.sendToServer(new MessagePriorityUpdate(pos, priority)); + public TileDataParameter getPriorityParameter() { + return PRIORITY; } @Override @@ -321,6 +382,7 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag return priority; } + @Override public void setPriority(int priority) { this.priority = priority; @@ -332,10 +394,10 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag int stored = 0; for (int i = 0; i < disks.getSlots(); ++i) { - ItemStack stack = disks.getStackInSlot(i); + ItemStack disk = disks.getStackInSlot(i); - if (stack != null) { - stored += NBTStorage.getStoredFromNBT(stack.getTagCompound()); + if (disk != null) { + stored += disk.getItem() == RefinedStorageItems.STORAGE_DISK ? ItemStorageNBT.getStoredFromNBT(disk.getTagCompound()) : FluidStorageNBT.getStoredFromNBT(disk.getTagCompound()); } } @@ -347,10 +409,10 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag int capacity = 0; for (int i = 0; i < disks.getSlots(); ++i) { - ItemStack stack = disks.getStackInSlot(i); + ItemStack disk = disks.getStackInSlot(i); - if (stack != null) { - int diskCapacity = EnumStorageType.getById(stack.getItemDamage()).getCapacity(); + if (disk != null) { + int diskCapacity = disk.getItem() == RefinedStorageItems.STORAGE_DISK ? EnumItemStorageType.getById(disk.getItemDamage()).getCapacity() : EnumFluidStorageType.getById(disk.getItemDamage()).getCapacity(); if (diskCapacity == -1) { return -1; @@ -368,7 +430,24 @@ public class TileDiskDrive extends TileNode implements IStorageProvider, IStorag } @Override - public IItemHandler getDroppedItems() { + public int getType() { + return worldObj.isRemote ? TYPE.getValue() : type; + } + + @Override + public void setType(int type) { + this.type = type; + + markDirty(); + } + + @Override + public IItemHandler getFilterInventory() { + return getType() == IType.ITEMS ? itemFilters : fluidFilters; + } + + @Override + public IItemHandler getDrops() { return disks; } diff --git a/src/main/java/refinedstorage/tile/TileExporter.java b/src/main/java/refinedstorage/tile/TileExporter.java index 808975969..3e4079b6d 100755 --- a/src/main/java/refinedstorage/tile/TileExporter.java +++ b/src/main/java/refinedstorage/tile/TileExporter.java @@ -1,69 +1,104 @@ package refinedstorage.tile; -import io.netty.buffer.ByteBuf; -import net.minecraft.inventory.Container; +import mcmultipart.microblock.IMicroblock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; import refinedstorage.apiimpl.autocrafting.CraftingTaskScheduler; -import refinedstorage.container.ContainerExporter; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.inventory.BasicItemValidator; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerFluid; +import refinedstorage.inventory.ItemHandlerUpgrade; import refinedstorage.item.ItemUpgrade; -import refinedstorage.tile.config.ICompareConfig; +import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.config.IType; +import refinedstorage.tile.data.TileDataParameter; + +public class TileExporter extends TileMultipartNode implements IComparable, IType { + public static final TileDataParameter COMPARE = IComparable.createParameter(); + public static final TileDataParameter TYPE = IType.createParameter(); -public class TileExporter extends TileNode implements ICompareConfig { private static final String NBT_COMPARE = "Compare"; + private static final String NBT_TYPE = "Type"; - private BasicItemHandler filters = new BasicItemHandler(9, this); - private BasicItemHandler upgrades = new BasicItemHandler( - 4, - this, - new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_SPEED), - new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_CRAFTING), - new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_STACK) - ); + private ItemHandlerBasic itemFilters = new ItemHandlerBasic(9, this); + private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(9, this); + + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_CRAFTING, ItemUpgrade.TYPE_STACK); private int compare = 0; + private int type = IType.ITEMS; private CraftingTaskScheduler scheduler = new CraftingTaskScheduler(this); + public TileExporter() { + dataManager.addWatchedParameter(COMPARE); + dataManager.addWatchedParameter(TYPE); + } + + @Override + public boolean canAddMicroblock(IMicroblock microblock) { + return !isBlockingMicroblock(microblock, getDirection()); + } + @Override public int getEnergyUsage() { - return RefinedStorage.INSTANCE.exporterUsage + RefinedStorageUtils.getUpgradeEnergyUsage(upgrades); + return RefinedStorage.INSTANCE.exporterUsage + upgrades.getEnergyUsage(); } @Override public void updateNode() { - IItemHandler handler = RefinedStorageUtils.getItemHandler(getFacingTile(), getDirection().getOpposite()); + if (ticks % upgrades.getSpeed() == 0) { + if (type == IType.ITEMS) { + IItemHandler handler = getItemHandler(getFacingTile(), getDirection().getOpposite()); - int size = RefinedStorageUtils.hasUpgrade(upgrades, ItemUpgrade.TYPE_STACK) ? 64 : 1; + int size = upgrades.hasUpgrade(ItemUpgrade.TYPE_STACK) ? 64 : 1; - if (handler != null && ticks % RefinedStorageUtils.getSpeed(upgrades) == 0) { - for (int i = 0; i < filters.getSlots(); ++i) { - ItemStack slot = filters.getStackInSlot(i); + if (handler != null) { + for (int i = 0; i < itemFilters.getSlots(); ++i) { + ItemStack slot = itemFilters.getStackInSlot(i); - if (slot != null) { - ItemStack took = network.extractItem(slot, size, compare); + if (slot != null) { + ItemStack took = network.extractItem(slot, size, compare); - if (took != null) { - scheduler.resetSchedule(); + if (took != null) { + scheduler.resetSchedule(); - ItemStack remainder = ItemHandlerHelper.insertItem(handler, took, false); + ItemStack remainder = ItemHandlerHelper.insertItem(handler, took, false); - if (remainder != null) { - network.insertItem(remainder, remainder.stackSize, false); + if (remainder != null) { + network.insertItem(remainder, remainder.stackSize, false); + } + } else if (upgrades.hasUpgrade(ItemUpgrade.TYPE_CRAFTING)) { + if (scheduler.canSchedule(compare, slot)) { + scheduler.schedule(network, compare, slot); + } + } } - } else if (RefinedStorageUtils.hasUpgrade(upgrades, ItemUpgrade.TYPE_CRAFTING)) { - if (scheduler.canSchedule(compare, slot)) { - scheduler.schedule(network, compare, slot); + } + } + } else if (type == IType.FLUIDS) { + IFluidHandler handler = getFluidHandler(getFacingTile(), getDirection().getOpposite()); + + if (handler != null) { + for (FluidStack stack : fluidFilters.getFluids()) { + if (stack != null) { + FluidStack took = network.extractFluid(stack, Fluid.BUCKET_VOLUME, compare); + + if (took != null) { + int remainder = Fluid.BUCKET_VOLUME - handler.fill(took, true); + + if (remainder > 0) { + network.insertFluid(took, remainder, false); + } + } } } } @@ -84,17 +119,22 @@ public class TileExporter extends TileNode implements ICompareConfig { } @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void read(NBTTagCompound tag) { + super.read(tag); - if (nbt.hasKey(NBT_COMPARE)) { - compare = nbt.getInteger(NBT_COMPARE); + if (tag.hasKey(NBT_COMPARE)) { + compare = tag.getInteger(NBT_COMPARE); } - RefinedStorageUtils.readItems(filters, 0, nbt); - RefinedStorageUtils.readItems(upgrades, 1, nbt); + if (tag.hasKey(NBT_TYPE)) { + type = tag.getInteger(NBT_TYPE); + } - scheduler.read(nbt); + readItems(itemFilters, 0, tag); + readItems(upgrades, 1, tag); + readItems(fluidFilters, 2, tag); + + scheduler.read(tag); } @Override @@ -102,47 +142,43 @@ public class TileExporter extends TileNode implements ICompareConfig { super.write(tag); tag.setInteger(NBT_COMPARE, compare); + tag.setInteger(NBT_TYPE, type); - RefinedStorageUtils.writeItems(filters, 0, tag); - RefinedStorageUtils.writeItems(upgrades, 1, tag); + writeItems(itemFilters, 0, tag); + writeItems(upgrades, 1, tag); + writeItems(fluidFilters, 2, tag); - scheduler.writeToNBT(tag); + scheduler.write(tag); return tag; } - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - compare = buf.readInt(); - } - - @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - buf.writeInt(compare); - } - - @Override - public Class getContainer() { - return ContainerExporter.class; - } - - public IItemHandler getFilters() { - return filters; - } - public IItemHandler getUpgrades() { return upgrades; } @Override - public IItemHandler getDroppedItems() { + public IItemHandler getDrops() { return upgrades; } + @Override + public int getType() { + return worldObj.isRemote ? TYPE.getValue() : type; + } + + @Override + public void setType(int type) { + this.type = type; + + markDirty(); + } + + @Override + public IItemHandler getFilterInventory() { + return getType() == IType.ITEMS ? itemFilters : fluidFilters; + } + @Override public T getCapability(Capability capability, EnumFacing facing) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { diff --git a/src/main/java/refinedstorage/tile/TileFluidInterface.java b/src/main/java/refinedstorage/tile/TileFluidInterface.java new file mode 100755 index 000000000..965334d66 --- /dev/null +++ b/src/main/java/refinedstorage/tile/TileFluidInterface.java @@ -0,0 +1,212 @@ +package refinedstorage.tile; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import refinedstorage.RefinedStorage; +import refinedstorage.apiimpl.storage.fluid.FluidUtils; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerFluid; +import refinedstorage.inventory.ItemHandlerUpgrade; +import refinedstorage.item.ItemUpgrade; +import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.RefinedStorageSerializers; +import refinedstorage.tile.data.TileDataParameter; + +public class TileFluidInterface extends TileNode implements IComparable { + public static final int TANK_CAPACITY = 16000; + + public static final TileDataParameter COMPARE = IComparable.createParameter(); + + public static final TileDataParameter TANK_IN = new TileDataParameter<>(RefinedStorageSerializers.FLUID_STACK_SERIALIZER, null, new ITileDataProducer() { + @Override + public FluidStack getValue(TileFluidInterface tile) { + return tile.tankIn.getFluid(); + } + }); + + public static final TileDataParameter TANK_OUT = new TileDataParameter<>(RefinedStorageSerializers.FLUID_STACK_SERIALIZER, null, new ITileDataProducer() { + @Override + public FluidStack getValue(TileFluidInterface tile) { + return tile.tankOut.getFluid(); + } + }); + + private static final String NBT_COMPARE = "Compare"; + private static final String NBT_TANK_IN = "TankIn"; + private static final String NBT_TANK_OUT = "TankOut"; + + private int compare = 0; + + private FluidTank tankIn = new FluidTank(TANK_CAPACITY) { + @Override + protected void onContentsChanged() { + super.onContentsChanged(); + + if (worldObj != null && !worldObj.isRemote) { + dataManager.sendParameterToWatchers(TANK_IN); + } + + markDirty(); + } + }; + + private FluidTank tankOut = new FluidTank(TANK_CAPACITY) { + @Override + protected void onContentsChanged() { + super.onContentsChanged(); + + if (worldObj != null && !worldObj.isRemote) { + dataManager.sendParameterToWatchers(TANK_OUT); + } + + markDirty(); + } + }; + + private ItemHandlerBasic in = new ItemHandlerBasic(1, this); + private ItemHandlerFluid out = new ItemHandlerFluid(1, this); + + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_SPEED); + + public TileFluidInterface() { + dataManager.addWatchedParameter(COMPARE); + dataManager.addParameter(TANK_IN); + dataManager.addParameter(TANK_OUT); + + tankIn.setCanDrain(false); + tankIn.setCanFill(true); + + tankOut.setCanDrain(true); + tankOut.setCanFill(false); + } + + @Override + public void updateNode() { + ItemStack container = in.getStackInSlot(0); + + if (container != null) { + FluidStack fluid = FluidUtils.getFluidFromStack(container, true); + + if (fluid != null && tankIn.fillInternal(fluid, false) == fluid.amount) { + tankIn.fillInternal(FluidUtils.getFluidFromStack(container, false), true); + } + } + + if (ticks % upgrades.getSpeed() == 0) { + FluidStack drained = tankIn.drainInternal(Fluid.BUCKET_VOLUME, true); + + if (drained != null) { + FluidStack remainder = network.insertFluid(drained, drained.amount, false); + + if (remainder != null) { + tankIn.fillInternal(remainder, true); + } + } + + FluidStack stack = out.getFluids()[0]; + + if (tankOut.getFluid() != null && (stack == null || (tankOut.getFluid().getFluid() != stack.getFluid()))) { + FluidStack remainder = tankOut.drainInternal(Fluid.BUCKET_VOLUME, true); + + if (remainder != null) { + network.insertFluid(remainder, remainder.amount, false); + } + } else if (stack != null) { + FluidStack result = network.extractFluid(stack, Fluid.BUCKET_VOLUME, compare); + + if (result != null) { + int remainder = Fluid.BUCKET_VOLUME - tankOut.fillInternal(result, true); + + if (remainder > 0) { + network.insertFluid(stack, remainder, false); + } + } + } + } + } + + @Override + public int getEnergyUsage() { + return RefinedStorage.INSTANCE.fluidInterfaceUsage; + } + + @Override + public NBTTagCompound write(NBTTagCompound tag) { + super.write(tag); + + writeItems(upgrades, 0, tag); + writeItems(in, 1, tag); + writeItems(out, 2, tag); + + tag.setTag(NBT_TANK_IN, tankIn.writeToNBT(new NBTTagCompound())); + tag.setTag(NBT_TANK_OUT, tankOut.writeToNBT(new NBTTagCompound())); + + tag.setInteger(NBT_COMPARE, compare); + + return tag; + } + + @Override + public void read(NBTTagCompound tag) { + super.read(tag); + + readItems(upgrades, 0, tag); + readItems(in, 1, tag); + readItems(out, 2, tag); + + if (tag.hasKey(NBT_TANK_IN)) { + tankIn.readFromNBT(tag.getCompoundTag(NBT_TANK_IN)); + } + + if (tag.hasKey(NBT_TANK_OUT)) { + tankOut.readFromNBT(tag.getCompoundTag(NBT_TANK_OUT)); + } + + if (tag.hasKey(NBT_COMPARE)) { + compare = tag.getInteger(NBT_COMPARE); + } + } + + public ItemHandlerUpgrade getUpgrades() { + return upgrades; + } + + public ItemHandlerBasic getIn() { + return in; + } + + public ItemHandlerFluid getOut() { + return out; + } + + @Override + public boolean hasCapability(Capability capability, EnumFacing facing) { + return capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY || super.hasCapability(capability, facing); + } + + @Override + public T getCapability(Capability capability, EnumFacing facing) { + if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { + return facing == EnumFacing.DOWN ? (T) tankOut : (T) tankIn; + } + + return super.getCapability(capability, facing); + } + + @Override + public int getCompare() { + return compare; + } + + @Override + public void setCompare(int compare) { + this.compare = compare; + } +} diff --git a/src/main/java/refinedstorage/tile/TileFluidStorage.java b/src/main/java/refinedstorage/tile/TileFluidStorage.java new file mode 100755 index 000000000..cedf6479b --- /dev/null +++ b/src/main/java/refinedstorage/tile/TileFluidStorage.java @@ -0,0 +1,264 @@ +package refinedstorage.tile; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataSerializers; +import net.minecraftforge.fluids.FluidStack; +import refinedstorage.RefinedStorage; +import refinedstorage.RefinedStorageBlocks; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.storage.fluid.IFluidStorage; +import refinedstorage.api.storage.fluid.IFluidStorageProvider; +import refinedstorage.apiimpl.storage.fluid.FluidStorageNBT; +import refinedstorage.apiimpl.storage.fluid.FluidUtils; +import refinedstorage.block.BlockFluidStorage; +import refinedstorage.block.EnumFluidStorageType; +import refinedstorage.inventory.ItemHandlerFluid; +import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.config.IFilterable; +import refinedstorage.tile.config.IPrioritizable; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; + +import java.util.List; + +public class TileFluidStorage extends TileNode implements IFluidStorageProvider, IStorageGui, IComparable, IFilterable, IPrioritizable { + public static final TileDataParameter PRIORITY = IPrioritizable.createParameter(); + public static final TileDataParameter COMPARE = IComparable.createParameter(); + public static final TileDataParameter MODE = IFilterable.createParameter(); + public static final TileDataParameter STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileFluidStorage tile) { + return FluidStorageNBT.getStoredFromNBT(tile.storageTag); + } + }); + + class FluidStorage extends FluidStorageNBT { + public FluidStorage() { + super(TileFluidStorage.this.getStorageTag(), TileFluidStorage.this.getCapacity(), TileFluidStorage.this); + } + + @Override + public int getPriority() { + return priority; + } + + @Override + public FluidStack insertFluid(FluidStack stack, int size, boolean simulate) { + if (!IFilterable.canTakeFluids(filters, mode, compare, stack)) { + return FluidUtils.copyStackWithSize(stack, size); + } + + return super.insertFluid(stack, size, simulate); + } + } + + public static final String NBT_STORAGE = "Storage"; + + private static final String NBT_PRIORITY = "Priority"; + private static final String NBT_COMPARE = "Compare"; + private static final String NBT_MODE = "Mode"; + + private ItemHandlerFluid filters = new ItemHandlerFluid(9, this); + + private NBTTagCompound storageTag = FluidStorageNBT.createNBT(); + + private FluidStorage storage; + + private EnumFluidStorageType type; + + private int priority = 0; + private int compare = 0; + private int mode = IFilterable.WHITELIST; + + public TileFluidStorage() { + dataManager.addWatchedParameter(PRIORITY); + dataManager.addWatchedParameter(COMPARE); + dataManager.addWatchedParameter(MODE); + dataManager.addWatchedParameter(STORED); + } + + @Override + public int getEnergyUsage() { + return RefinedStorage.INSTANCE.fluidStorageUsage; + } + + @Override + public void updateNode() { + } + + @Override + public void update() { + super.update(); + + if (storage == null && storageTag != null) { + storage = new FluidStorage(); + + if (network != null) { + network.getFluidStorage().rebuild(); + } + } + } + + public void onBreak() { + if (storage != null) { + storage.writeToNBT(); + } + } + + @Override + public void onConnectionChange(INetworkMaster network, boolean state) { + super.onConnectionChange(network, state); + + network.getFluidStorage().rebuild(); + } + + @Override + public void addFluidStorages(List storages) { + if (storage != null) { + storages.add(storage); + } + } + + @Override + public void read(NBTTagCompound tag) { + super.read(tag); + + readItems(filters, 0, tag); + + if (tag.hasKey(NBT_PRIORITY)) { + priority = tag.getInteger(NBT_PRIORITY); + } + + if (tag.hasKey(NBT_STORAGE)) { + storageTag = tag.getCompoundTag(NBT_STORAGE); + } + + if (tag.hasKey(NBT_COMPARE)) { + compare = tag.getInteger(NBT_COMPARE); + } + + if (tag.hasKey(NBT_MODE)) { + mode = tag.getInteger(NBT_MODE); + } + } + + @Override + public NBTTagCompound write(NBTTagCompound tag) { + super.write(tag); + + writeItems(filters, 0, tag); + + tag.setInteger(NBT_PRIORITY, priority); + + if (storage != null) { + storage.writeToNBT(); + } + + tag.setTag(NBT_STORAGE, storageTag); + tag.setInteger(NBT_COMPARE, compare); + tag.setInteger(NBT_MODE, mode); + + return tag; + } + + public EnumFluidStorageType getType() { + if (type == null && worldObj.getBlockState(pos).getBlock() == RefinedStorageBlocks.FLUID_STORAGE) { + this.type = ((EnumFluidStorageType) worldObj.getBlockState(pos).getValue(BlockFluidStorage.TYPE)); + } + + return type == null ? EnumFluidStorageType.TYPE_64K : type; + } + + @Override + public int getCompare() { + return compare; + } + + @Override + public void setCompare(int compare) { + this.compare = compare; + + markDirty(); + } + + @Override + public int getMode() { + return mode; + } + + @Override + public void setMode(int mode) { + this.mode = mode; + + markDirty(); + } + + @Override + public String getGuiTitle() { + return "block.refinedstorage:fluid_storage." + getType().getId() + ".name"; + } + + @Override + public TileDataParameter getTypeParameter() { + return null; + } + + @Override + public TileDataParameter getRedstoneModeParameter() { + return REDSTONE_MODE; + } + + @Override + public TileDataParameter getCompareParameter() { + return COMPARE; + } + + @Override + public TileDataParameter getFilterParameter() { + return MODE; + } + + @Override + public TileDataParameter getPriorityParameter() { + return PRIORITY; + } + + public NBTTagCompound getStorageTag() { + return storageTag; + } + + public void setStorageTag(NBTTagCompound storageTag) { + this.storageTag = storageTag; + } + + public FluidStorageNBT getStorage() { + return storage; + } + + public ItemHandlerFluid getFilters() { + return filters; + } + + @Override + public int getPriority() { + return priority; + } + + @Override + public void setPriority(int priority) { + this.priority = priority; + + markDirty(); + } + + @Override + public int getStored() { + return STORED.getValue(); + } + + @Override + public int getCapacity() { + return getType().getCapacity(); + } +} + diff --git a/src/main/java/refinedstorage/tile/TileImporter.java b/src/main/java/refinedstorage/tile/TileImporter.java index dafab8a2f..ccfb54f0d 100755 --- a/src/main/java/refinedstorage/tile/TileImporter.java +++ b/src/main/java/refinedstorage/tile/TileImporter.java @@ -1,75 +1,103 @@ package refinedstorage.tile; -import io.netty.buffer.ByteBuf; -import net.minecraft.inventory.Container; +import mcmultipart.microblock.IMicroblock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.container.ContainerImporter; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.inventory.BasicItemValidator; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerFluid; +import refinedstorage.inventory.ItemHandlerUpgrade; import refinedstorage.item.ItemUpgrade; -import refinedstorage.tile.config.ICompareConfig; -import refinedstorage.tile.config.IModeConfig; -import refinedstorage.tile.config.ModeConstants; -import refinedstorage.tile.config.ModeFilter; +import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.config.IFilterable; +import refinedstorage.tile.config.IType; +import refinedstorage.tile.data.TileDataParameter; + +public class TileImporter extends TileMultipartNode implements IComparable, IFilterable, IType { + public static final TileDataParameter COMPARE = IComparable.createParameter(); + public static final TileDataParameter MODE = IFilterable.createParameter(); + public static final TileDataParameter TYPE = IType.createParameter(); -public class TileImporter extends TileNode implements ICompareConfig, IModeConfig { private static final String NBT_COMPARE = "Compare"; private static final String NBT_MODE = "Mode"; + private static final String NBT_TYPE = "Type"; - private BasicItemHandler filters = new BasicItemHandler(9, this); - private BasicItemHandler upgrades = new BasicItemHandler( - 4, - this, - new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_SPEED), - new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_STACK) - ); + private ItemHandlerBasic itemFilters = new ItemHandlerBasic(9, this); + private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(9, this); + + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_STACK); private int compare = 0; - private int mode = ModeConstants.WHITELIST; + private int mode = IFilterable.WHITELIST; + private int type = IType.ITEMS; private int currentSlot; + public TileImporter() { + dataManager.addWatchedParameter(COMPARE); + dataManager.addWatchedParameter(MODE); + dataManager.addWatchedParameter(TYPE); + } + + @Override + public boolean canAddMicroblock(IMicroblock microblock) { + return !isBlockingMicroblock(microblock, getDirection()); + } + @Override public int getEnergyUsage() { - return RefinedStorage.INSTANCE.importerUsage + RefinedStorageUtils.getUpgradeEnergyUsage(upgrades); + return RefinedStorage.INSTANCE.importerUsage + upgrades.getEnergyUsage(); } @Override public void updateNode() { - IItemHandler handler = RefinedStorageUtils.getItemHandler(getFacingTile(), getDirection().getOpposite()); + if (type == IType.ITEMS) { + IItemHandler handler = getItemHandler(getFacingTile(), getDirection().getOpposite()); - if (getFacingTile() instanceof TileDiskDrive || handler == null) { - return; - } + if (getFacingTile() instanceof TileDiskDrive || handler == null) { + return; + } - if (currentSlot >= handler.getSlots()) { - currentSlot = 0; - } + if (currentSlot >= handler.getSlots()) { + currentSlot = 0; + } - if (handler.getSlots() > 0) { - ItemStack stack = handler.getStackInSlot(currentSlot); + if (handler.getSlots() > 0) { + ItemStack stack = handler.getStackInSlot(currentSlot); - if (stack == null || !ModeFilter.respectsMode(filters, this, compare, stack)) { - currentSlot++; - } else if (ticks % RefinedStorageUtils.getSpeed(upgrades) == 0) { - int quantity = RefinedStorageUtils.hasUpgrade(upgrades, ItemUpgrade.TYPE_STACK) ? 64 : 1; - - ItemStack result = handler.extractItem(currentSlot, quantity, true); - - if (result != null && network.insertItem(result, result.stackSize, true) == null) { - network.insertItem(result, result.stackSize, false); - - handler.extractItem(currentSlot, quantity, false); - } else { + if (stack == null || !IFilterable.canTake(itemFilters, mode, compare, stack)) { currentSlot++; + } else if (ticks % upgrades.getSpeed() == 0) { + int quantity = upgrades.hasUpgrade(ItemUpgrade.TYPE_STACK) ? 64 : 1; + + ItemStack result = handler.extractItem(currentSlot, quantity, true); + + if (result != null && network.insertItem(result, result.stackSize, true) == null) { + network.insertItem(result, result.stackSize, false); + + handler.extractItem(currentSlot, quantity, false); + } else { + currentSlot++; + } + } + } + } else if (type == IType.FLUIDS && ticks % upgrades.getSpeed() == 0) { + IFluidHandler handler = getFluidHandler(getFacingTile(), getDirection().getOpposite()); + + if (handler != null) { + FluidStack stack = handler.drain(Fluid.BUCKET_VOLUME, false); + + if (stack != null && IFilterable.canTakeFluids(fluidFilters, mode, compare, stack) && network.insertFluid(stack, stack.amount, true) == null) { + FluidStack drain = handler.drain(Fluid.BUCKET_VOLUME, true); + + network.insertFluid(drain, drain.amount, false); } } } @@ -100,19 +128,24 @@ public class TileImporter extends TileNode implements ICompareConfig, IModeConfi } @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void read(NBTTagCompound tag) { + super.read(tag); - if (nbt.hasKey(NBT_COMPARE)) { - compare = nbt.getInteger(NBT_COMPARE); + if (tag.hasKey(NBT_COMPARE)) { + compare = tag.getInteger(NBT_COMPARE); } - if (nbt.hasKey(NBT_MODE)) { - mode = nbt.getInteger(NBT_MODE); + if (tag.hasKey(NBT_MODE)) { + mode = tag.getInteger(NBT_MODE); } - RefinedStorageUtils.readItems(filters, 0, nbt); - RefinedStorageUtils.readItems(upgrades, 1, nbt); + if (tag.hasKey(NBT_TYPE)) { + type = tag.getInteger(NBT_TYPE); + } + + readItems(itemFilters, 0, tag); + readItems(upgrades, 1, tag); + readItems(fluidFilters, 2, tag); } @Override @@ -121,45 +154,39 @@ public class TileImporter extends TileNode implements ICompareConfig, IModeConfi tag.setInteger(NBT_COMPARE, compare); tag.setInteger(NBT_MODE, mode); + tag.setInteger(NBT_TYPE, type); - RefinedStorageUtils.writeItems(filters, 0, tag); - RefinedStorageUtils.writeItems(upgrades, 1, tag); + writeItems(itemFilters, 0, tag); + writeItems(upgrades, 1, tag); + writeItems(fluidFilters, 2, tag); return tag; } - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - compare = buf.readInt(); - mode = buf.readInt(); - } - - @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - buf.writeInt(compare); - buf.writeInt(mode); - } - - @Override - public Class getContainer() { - return ContainerImporter.class; - } - public IItemHandler getUpgrades() { return upgrades; } - public IItemHandler getFilters() { - return filters; + @Override + public IItemHandler getDrops() { + return upgrades; } @Override - public IItemHandler getDroppedItems() { - return upgrades; + public int getType() { + return worldObj.isRemote ? TYPE.getValue() : type; + } + + @Override + public void setType(int type) { + this.type = type; + + markDirty(); + } + + @Override + public IItemHandler getFilterInventory() { + return getType() == IType.ITEMS ? itemFilters : fluidFilters; } @Override diff --git a/src/main/java/refinedstorage/tile/TileInterface.java b/src/main/java/refinedstorage/tile/TileInterface.java index 05fd82d64..6b6359ecb 100755 --- a/src/main/java/refinedstorage/tile/TileInterface.java +++ b/src/main/java/refinedstorage/tile/TileInterface.java @@ -1,7 +1,5 @@ package refinedstorage.tile; -import io.netty.buffer.ByteBuf; -import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; @@ -10,34 +8,33 @@ import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.container.ContainerInterface; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.inventory.BasicItemValidator; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerUpgrade; import refinedstorage.item.ItemUpgrade; -import refinedstorage.tile.config.ICompareConfig; +import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.data.TileDataParameter; + +public class TileInterface extends TileNode implements IComparable { + public static final TileDataParameter COMPARE = IComparable.createParameter(); -public class TileInterface extends TileNode implements ICompareConfig { private static final String NBT_COMPARE = "Compare"; - private BasicItemHandler importItems = new BasicItemHandler(9, this); - private BasicItemHandler exportSpecimenItems = new BasicItemHandler(9, this); - private BasicItemHandler exportItems = new BasicItemHandler(9, this); - private BasicItemHandler upgrades = new BasicItemHandler( - 4, - this, - new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_SPEED), - new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_STACK) - ); + private ItemHandlerBasic importItems = new ItemHandlerBasic(9, this); + private ItemHandlerBasic exportSpecimenItems = new ItemHandlerBasic(9, this); + private ItemHandlerBasic exportItems = new ItemHandlerBasic(9, this); + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_STACK); private int compare = 0; private int currentSlot = 0; + public TileInterface() { + dataManager.addWatchedParameter(COMPARE); + } + @Override public int getEnergyUsage() { - return RefinedStorage.INSTANCE.interfaceUsage + RefinedStorageUtils.getUpgradeEnergyUsage(upgrades); + return RefinedStorage.INSTANCE.interfaceUsage + upgrades.getEnergyUsage(); } @Override @@ -50,8 +47,8 @@ public class TileInterface extends TileNode implements ICompareConfig { if (slot == null) { currentSlot++; - } else if (ticks % RefinedStorageUtils.getSpeed(upgrades) == 0) { - int size = Math.min(slot.stackSize, RefinedStorageUtils.hasUpgrade(upgrades, ItemUpgrade.TYPE_STACK) ? 64 : 1); + } else if (ticks % upgrades.getSpeed() == 0) { + int size = Math.min(slot.stackSize, upgrades.hasUpgrade(ItemUpgrade.TYPE_STACK) ? 64 : 1); ItemStack remainder = network.insertItem(slot, size, false); @@ -109,16 +106,16 @@ public class TileInterface extends TileNode implements ICompareConfig { } @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void read(NBTTagCompound tag) { + super.read(tag); - RefinedStorageUtils.readItems(importItems, 0, nbt); - RefinedStorageUtils.readItems(exportSpecimenItems, 1, nbt); - RefinedStorageUtils.readItems(exportItems, 2, nbt); - RefinedStorageUtils.readItems(upgrades, 3, nbt); + readItems(importItems, 0, tag); + readItems(exportSpecimenItems, 1, tag); + readItems(exportItems, 2, tag); + readItems(upgrades, 3, tag); - if (nbt.hasKey(NBT_COMPARE)) { - compare = nbt.getInteger(NBT_COMPARE); + if (tag.hasKey(NBT_COMPARE)) { + compare = tag.getInteger(NBT_COMPARE); } } @@ -126,36 +123,16 @@ public class TileInterface extends TileNode implements ICompareConfig { public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - RefinedStorageUtils.writeItems(importItems, 0, tag); - RefinedStorageUtils.writeItems(exportSpecimenItems, 1, tag); - RefinedStorageUtils.writeItems(exportItems, 2, tag); - RefinedStorageUtils.writeItems(upgrades, 3, tag); + writeItems(importItems, 0, tag); + writeItems(exportSpecimenItems, 1, tag); + writeItems(exportItems, 2, tag); + writeItems(upgrades, 3, tag); tag.setInteger(NBT_COMPARE, compare); return tag; } - - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - compare = buf.readInt(); - } - - @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - buf.writeInt(compare); - } - - @Override - public Class getContainer() { - return ContainerInterface.class; - } - public IItemHandler getImportItems() { return importItems; } @@ -173,7 +150,7 @@ public class TileInterface extends TileNode implements ICompareConfig { } @Override - public IItemHandler getDroppedItems() { + public IItemHandler getDrops() { return new CombinedInvWrapper(importItems, exportItems, upgrades); } diff --git a/src/main/java/refinedstorage/tile/TileMultipartNode.java b/src/main/java/refinedstorage/tile/TileMultipartNode.java new file mode 100755 index 000000000..5232494db --- /dev/null +++ b/src/main/java/refinedstorage/tile/TileMultipartNode.java @@ -0,0 +1,212 @@ +package refinedstorage.tile; + +import mcmultipart.capabilities.ISlottedCapabilityProvider; +import mcmultipart.capabilities.MultipartCapabilityHelper; +import mcmultipart.microblock.IMicroblock; +import mcmultipart.microblock.IMicroblockContainerTile; +import mcmultipart.microblock.MicroblockContainer; +import mcmultipart.multipart.IMultipart; +import mcmultipart.multipart.IMultipartContainer; +import mcmultipart.multipart.PartSlot; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import refinedstorage.RefinedStorageBlocks; +import refinedstorage.api.network.NetworkUtils; + +public abstract class TileMultipartNode extends TileNode implements IMicroblockContainerTile, ISlottedCapabilityProvider { + private MicroblockContainer container; + + @Override + public World getWorldIn() { + return getWorld(); + } + + @Override + public BlockPos getPosIn() { + return getPos(); + } + + @Override + public MicroblockContainer getMicroblockContainer() { + if (container == null) { + container = new MicroblockContainer(this); + + container.getPartContainer().setListener(new IMultipartContainer.IMultipartContainerListener() { + @Override + public void onAddPartPre(IMultipart part) { + } + + @Override + public void onAddPartPost(IMultipart part) { + onMicroblocksChanged(); + } + + @Override + public void onRemovePartPre(IMultipart part) { + } + + @Override + public void onRemovePartPost(IMultipart part) { + onMicroblocksChanged(); + } + }); + } + + return container; + } + + @Override + public boolean canAddMicroblock(IMicroblock microblock) { + return true; + } + + @Override + public void onMicroblocksChanged() { + markDirty(); + + if (network != null) { + NetworkUtils.rebuildGraph(network); + } else if (worldObj != null) { + RefinedStorageBlocks.CABLE.attemptConnect(worldObj, pos); + } + } + + public static boolean hasBlockingMicroblock(IBlockAccess world, BlockPos pos, EnumFacing direction) { + TileEntity tile = world.getTileEntity(pos); + + if (tile instanceof TileMultipartNode) { + for (IMicroblock microblock : ((TileMultipartNode) tile).getMicroblockContainer().getParts()) { + if (isBlockingMicroblock(microblock, direction)) { + return true; + } + } + } + + return false; + } + + public static boolean isBlockingMicroblock(IMicroblock microblock, EnumFacing direction) { + if (!(microblock instanceof IMicroblock.IFaceMicroblock)) { + return false; + } + + IMicroblock.IFaceMicroblock faceMicroblock = (IMicroblock.IFaceMicroblock) microblock; + + return faceMicroblock.getFace() == direction && !faceMicroblock.isFaceHollow(); + } + + @Override + public boolean canConduct(EnumFacing direction) { + return !hasBlockingMicroblock(worldObj, pos, direction) && !hasBlockingMicroblock(worldObj, pos.offset(direction), direction.getOpposite()); + } + + @Override + public boolean hasCapability(Capability capability, EnumFacing facing) { + if (super.hasCapability(capability, facing)) { + return true; + } + + return MultipartCapabilityHelper.hasCapability(container, capability, facing); + } + + @Override + public T getCapability(Capability capability, EnumFacing facing) { + T impl = super.getCapability(capability, facing); + + if (impl != null) { + return impl; + } + + return MultipartCapabilityHelper.getCapability(container, capability, facing); + } + + @Override + public boolean hasCapability(Capability capability, PartSlot slot, EnumFacing facing) { + return container.hasCapability(capability, slot, facing); + } + + @Override + public T getCapability(Capability capability, PartSlot slot, EnumFacing facing) { + return container.getCapability(capability, slot, facing); + } + + @Override + public void onLoad() { + super.onLoad(); + + for (IMultipart part : getMicroblockContainer().getParts()) { + part.onLoaded(); + } + } + + @Override + public void onChunkUnload() { + super.onChunkUnload(); + + for (IMultipart part : getMicroblockContainer().getParts()) { + part.onUnloaded(); + } + } + + @Override + public NBTTagCompound write(NBTTagCompound tag) { + super.write(tag); + + getMicroblockContainer().getPartContainer().writeToNBT(tag); + + return tag; + } + + @Override + public void read(NBTTagCompound tag) { + super.read(tag); + + getMicroblockContainer().getPartContainer().readFromNBT(tag); + } + + @Override + public NBTTagCompound writeUpdate(NBTTagCompound tag) { + super.writeUpdate(tag); + + getMicroblockContainer().getPartContainer().writeToNBT(tag); + + return tag; + } + + @Override + public void readUpdate(NBTTagCompound tag) { + getMicroblockContainer().getPartContainer().readFromNBT(tag); + + super.readUpdate(tag); + } + + @Override + public boolean canRenderBreaking() { + return true; + } + + @Override + public boolean shouldRenderInPass(int pass) { + return true; + } + + @Override + public AxisAlignedBB getRenderBoundingBox() { + AxisAlignedBB bounds = super.getRenderBoundingBox().offset(-getPosIn().getX(), -getPosIn().getY(), -getPosIn().getZ()); + + for (IMultipart part : getMicroblockContainer().getParts()) { + AxisAlignedBB bb = part.getRenderBoundingBox(); + if (bb != null) { + bounds = bounds.union(bb); + } + } + + return bounds.offset(getPosIn().getX(), getPosIn().getY(), getPosIn().getZ()); + } +} \ No newline at end of file diff --git a/src/main/java/refinedstorage/tile/TileNetworkReceiver.java b/src/main/java/refinedstorage/tile/TileNetworkReceiver.java new file mode 100755 index 000000000..37516f84b --- /dev/null +++ b/src/main/java/refinedstorage/tile/TileNetworkReceiver.java @@ -0,0 +1,20 @@ +package refinedstorage.tile; + +import refinedstorage.RefinedStorage; +import refinedstorage.tile.config.RedstoneMode; + +public class TileNetworkReceiver extends TileNode { + @Override + public void updateNode() { + } + + @Override + public int getEnergyUsage() { + return RefinedStorage.INSTANCE.networkReceiverUsage; + } + + @Override + public void setRedstoneMode(RedstoneMode mode) { + // NO OP + } +} diff --git a/src/main/java/refinedstorage/tile/TileNetworkTransmitter.java b/src/main/java/refinedstorage/tile/TileNetworkTransmitter.java new file mode 100755 index 000000000..491d9591a --- /dev/null +++ b/src/main/java/refinedstorage/tile/TileNetworkTransmitter.java @@ -0,0 +1,151 @@ +package refinedstorage.tile; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import refinedstorage.RefinedStorage; +import refinedstorage.RefinedStorageItems; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerUpgrade; +import refinedstorage.inventory.ItemValidatorBasic; +import refinedstorage.item.ItemNetworkCard; +import refinedstorage.item.ItemUpgrade; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; + +public class TileNetworkTransmitter extends TileNode { + public static final TileDataParameter DISTANCE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileNetworkTransmitter tile) { + return (tile.receiver != null && tile.isSameDimension()) ? tile.getDistance() : -1; + } + }); + + public static final TileDataParameter RECEIVER_DIMENSION = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileNetworkTransmitter tile) { + return tile.receiverDimension; + } + }); + + public static final TileDataParameter RECEIVER_DIMENSION_SUPPORTED = new TileDataParameter<>(DataSerializers.BOOLEAN, false, new ITileDataProducer() { + @Override + public Boolean getValue(TileNetworkTransmitter tile) { + return tile.isDimensionSupported(); + } + }); + + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(1, this, ItemUpgrade.TYPE_INTERDIMENSIONAL) { + @Override + protected void onContentsChanged(int slot) { + super.onContentsChanged(slot); + + if (network != null) { + NetworkUtils.rebuildGraph(network); + } + } + }; + + private ItemHandlerBasic networkCard = new ItemHandlerBasic(1, this, new ItemValidatorBasic(RefinedStorageItems.NETWORK_CARD)) { + @Override + protected void onContentsChanged(int slot) { + super.onContentsChanged(slot); + + ItemStack card = getStackInSlot(slot); + + if (card == null) { + receiver = null; + } else { + receiver = ItemNetworkCard.getReceiver(card); + receiverDimension = ItemNetworkCard.getDimension(card); + } + + if (network != null) { + NetworkUtils.rebuildGraph(network); + } + } + }; + + private BlockPos receiver; + private int receiverDimension; + + public TileNetworkTransmitter() { + dataManager.addWatchedParameter(DISTANCE); + dataManager.addWatchedParameter(RECEIVER_DIMENSION); + dataManager.addWatchedParameter(RECEIVER_DIMENSION_SUPPORTED); + + rebuildOnUpdateChange = true; + } + + @Override + public void updateNode() { + } + + public boolean canTransmit() { + return canUpdate() && receiver != null && isDimensionSupported(); + } + + @Override + public NBTTagCompound write(NBTTagCompound tag) { + super.write(tag); + + writeItems(networkCard, 0, tag); + writeItems(upgrades, 1, tag); + + return tag; + } + + @Override + public void read(NBTTagCompound tag) { + super.read(tag); + + readItems(networkCard, 0, tag); + readItems(upgrades, 1, tag); + } + + @Override + public int getEnergyUsage() { + return RefinedStorage.INSTANCE.networkTransmitterUsage + (isSameDimension() ? (int) Math.ceil(RefinedStorage.INSTANCE.networkTransmitterPerBlockUsage * getDistance()) : 0) + upgrades.getEnergyUsage(); + } + + public ItemHandlerBasic getNetworkCard() { + return networkCard; + } + + public ItemHandlerUpgrade getUpgrades() { + return upgrades; + } + + @Override + public IItemHandler getDrops() { + return new CombinedInvWrapper(networkCard, upgrades); + } + + public BlockPos getReceiver() { + return receiver; + } + + public int getReceiverDimension() { + return receiverDimension; + } + + public int getDistance() { + if (receiver == null) { + return 0; + } + + return (int) Math.sqrt(Math.pow(pos.getX() - receiver.getX(), 2) + Math.pow(pos.getY() - receiver.getY(), 2) + Math.pow(pos.getZ() - receiver.getZ(), 2)); + } + + public boolean isSameDimension() { + return worldObj.provider.getDimension() == receiverDimension; + } + + public boolean isDimensionSupported() { + return isSameDimension() || upgrades.hasUpgrade(ItemUpgrade.TYPE_INTERDIMENSIONAL); + } +} diff --git a/src/main/java/refinedstorage/tile/TileNode.java b/src/main/java/refinedstorage/tile/TileNode.java index 70202a4e6..042891f0a 100755 --- a/src/main/java/refinedstorage/tile/TileNode.java +++ b/src/main/java/refinedstorage/tile/TileNode.java @@ -1,26 +1,35 @@ package refinedstorage.tile; -import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; -import refinedstorage.RefinedStorageUtils; +import net.minecraft.world.World; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.INetworkNode; +import refinedstorage.api.network.NetworkUtils; import refinedstorage.block.BlockNode; -import refinedstorage.tile.config.IRedstoneModeConfig; +import refinedstorage.tile.config.IRedstoneConfigurable; import refinedstorage.tile.config.RedstoneMode; +import refinedstorage.tile.data.TileDataParameter; + +public abstract class TileNode extends TileBase implements INetworkNode, IRedstoneConfigurable { + public static final TileDataParameter REDSTONE_MODE = RedstoneMode.createParameter(); -public abstract class TileNode extends TileBase implements INetworkNode, ISynchronizedContainer, IRedstoneModeConfig { private static final String NBT_CONNECTED = "Connected"; private RedstoneMode redstoneMode = RedstoneMode.IGNORE; private boolean active; private boolean update; + protected boolean rebuildOnUpdateChange; protected boolean connected; protected INetworkMaster network; + public TileNode() { + dataManager.addWatchedParameter(REDSTONE_MODE); + } + @Override public boolean canUpdate() { return redstoneMode.isEnabled(worldObj, pos); @@ -43,10 +52,14 @@ public abstract class TileNode extends TileBase implements INetworkNode, ISynchr update = canUpdate(); onConnectionChange(network, update); + + if (rebuildOnUpdateChange) { + NetworkUtils.rebuildGraph(network); + } } if (active != isActive() && canSendConnectivityUpdate()) { - RefinedStorageUtils.updateBlock(worldObj, pos); + updateBlock(); active = isActive(); } @@ -81,7 +94,7 @@ public abstract class TileNode extends TileBase implements INetworkNode, ISynchr } @Override - public boolean canConduct() { + public boolean canConduct(EnumFacing direction) { return true; } @@ -90,6 +103,11 @@ public abstract class TileNode extends TileBase implements INetworkNode, ISynchr return network; } + @Override + public World getNodeWorld() { + return worldObj; + } + @Override public BlockPos getPosition() { return pos; @@ -117,21 +135,11 @@ public abstract class TileNode extends TileBase implements INetworkNode, ISynchr } @Override - public void readContainerData(ByteBuf buf) { - redstoneMode = RedstoneMode.getById(buf.readInt()); - } + public void read(NBTTagCompound tag) { + super.read(tag); - @Override - public void writeContainerData(ByteBuf buf) { - buf.writeInt(redstoneMode.id); - } - - @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); - - if (nbt.hasKey(RedstoneMode.NBT)) { - redstoneMode = RedstoneMode.getById(nbt.getInteger(RedstoneMode.NBT)); + if (tag.hasKey(RedstoneMode.NBT)) { + redstoneMode = RedstoneMode.getById(tag.getInteger(RedstoneMode.NBT)); } } @@ -139,7 +147,7 @@ public abstract class TileNode extends TileBase implements INetworkNode, ISynchr public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - tag.setInteger(RedstoneMode.NBT, redstoneMode.id); + tag.setInteger(RedstoneMode.NBT, redstoneMode.ordinal()); return tag; } diff --git a/src/main/java/refinedstorage/tile/TileProcessingPatternEncoder.java b/src/main/java/refinedstorage/tile/TileProcessingPatternEncoder.java index ae1ab3e03..d915efc8b 100755 --- a/src/main/java/refinedstorage/tile/TileProcessingPatternEncoder.java +++ b/src/main/java/refinedstorage/tile/TileProcessingPatternEncoder.java @@ -6,32 +6,32 @@ import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.inventory.BasicItemValidator; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemValidatorBasic; import refinedstorage.item.ItemPattern; public class TileProcessingPatternEncoder extends TileBase { - private BasicItemHandler patterns = new BasicItemHandler(2, this, new BasicItemValidator(RefinedStorageItems.PATTERN)); - private BasicItemHandler configuration = new BasicItemHandler(9 * 2, this); + private ItemHandlerBasic patterns = new ItemHandlerBasic(2, this, new ItemValidatorBasic(RefinedStorageItems.PATTERN)); + private ItemHandlerBasic configuration = new ItemHandlerBasic(9 * 2, this); @Override public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - RefinedStorageUtils.writeItems(patterns, 0, tag); - RefinedStorageUtils.writeItems(configuration, 1, tag); + writeItems(patterns, 0, tag); + writeItems(configuration, 1, tag); return tag; } @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void read(NBTTagCompound tag) { + super.read(tag); - RefinedStorageUtils.readItems(patterns, 0, nbt); - RefinedStorageUtils.readItems(configuration, 1, nbt); + readItems(patterns, 0, tag); + readItems(configuration, 1, tag); } public void onCreatePattern() { @@ -42,10 +42,12 @@ public class TileProcessingPatternEncoder extends TileBase { for (int i = 0; i < 18; ++i) { if (configuration.getStackInSlot(i) != null) { - if (i >= 9) { - ItemPattern.addOutput(pattern, configuration.getStackInSlot(i)); - } else { - ItemPattern.addInput(pattern, configuration.getStackInSlot(i)); + for (int j = 0; j < configuration.getStackInSlot(i).stackSize; ++j) { + if (i >= 9) { + ItemPattern.addOutput(pattern, ItemHandlerHelper.copyStackWithSize(configuration.getStackInSlot(i), 1)); + } else { + ItemPattern.addInput(pattern, ItemHandlerHelper.copyStackWithSize(configuration.getStackInSlot(i), 1)); + } } } } @@ -73,16 +75,16 @@ public class TileProcessingPatternEncoder extends TileBase { return inputsFilled > 0 && outputsFilled > 0 && patterns.getStackInSlot(0) != null && patterns.getStackInSlot(1) == null; } - public BasicItemHandler getPatterns() { + public ItemHandlerBasic getPatterns() { return patterns; } - public BasicItemHandler getConfiguration() { + public ItemHandlerBasic getConfiguration() { return configuration; } @Override - public IItemHandler getDroppedItems() { + public IItemHandler getDrops() { return patterns; } diff --git a/src/main/java/refinedstorage/tile/TileRelay.java b/src/main/java/refinedstorage/tile/TileRelay.java index 07c1a9df9..37b0f971b 100755 --- a/src/main/java/refinedstorage/tile/TileRelay.java +++ b/src/main/java/refinedstorage/tile/TileRelay.java @@ -1,43 +1,27 @@ package refinedstorage.tile; -import net.minecraft.inventory.Container; +import net.minecraft.util.EnumFacing; import refinedstorage.RefinedStorage; -import refinedstorage.container.ContainerRelay; import refinedstorage.tile.config.RedstoneMode; public class TileRelay extends TileNode { - private boolean couldUpdate; - public TileRelay() { setRedstoneMode(RedstoneMode.LOW); + + rebuildOnUpdateChange = true; } @Override public int getEnergyUsage() { - return RefinedStorage.INSTANCE.relayUsage; + return getRedstoneMode() == RedstoneMode.IGNORE ? 0 : RefinedStorage.INSTANCE.relayUsage; } @Override public void updateNode() { } - public void update() { - super.update(); - - if (network != null && couldUpdate != canUpdate()) { - couldUpdate = canUpdate(); - - network.rebuildNodes(); - } - } - @Override - public boolean canConduct() { + public boolean canConduct(EnumFacing direction) { return canUpdate(); } - - @Override - public Class getContainer() { - return ContainerRelay.class; - } } diff --git a/src/main/java/refinedstorage/tile/TileSolderer.java b/src/main/java/refinedstorage/tile/TileSolderer.java index 723aef9a7..74e4c94ff 100755 --- a/src/main/java/refinedstorage/tile/TileSolderer.java +++ b/src/main/java/refinedstorage/tile/TileSolderer.java @@ -1,42 +1,59 @@ package refinedstorage.tile; -import io.netty.buffer.ByteBuf; -import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataSerializers; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.RefinedStorageAPI; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.solderer.ISoldererRecipe; -import refinedstorage.container.ContainerSolderer; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.inventory.BasicItemValidator; -import refinedstorage.inventory.SoldererItemHandler; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerSolderer; +import refinedstorage.inventory.ItemHandlerUpgrade; import refinedstorage.item.ItemUpgrade; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; public class TileSolderer extends TileNode { + public static final TileDataParameter DURATION = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileSolderer tile) { + return tile.recipe != null ? tile.recipe.getDuration() : 0; + } + }); + + public static final TileDataParameter PROGRESS = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileSolderer tile) { + return tile.progress; + } + }); + private static final String NBT_WORKING = "Working"; private static final String NBT_PROGRESS = "Progress"; - private BasicItemHandler items = new BasicItemHandler(4, this); - private BasicItemHandler upgrades = new BasicItemHandler(4, this, new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_SPEED)); - private SoldererItemHandler[] itemsFacade = new SoldererItemHandler[EnumFacing.values().length]; + private ItemHandlerBasic items = new ItemHandlerBasic(4, this); + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_SPEED); + private ItemHandlerSolderer[] itemsFacade = new ItemHandlerSolderer[EnumFacing.values().length]; private ISoldererRecipe recipe; private boolean working = false; private int progress = 0; - private int duration; + + public TileSolderer() { + dataManager.addWatchedParameter(DURATION); + dataManager.addWatchedParameter(PROGRESS); + } @Override public int getEnergyUsage() { - return RefinedStorage.INSTANCE.soldererUsage + RefinedStorageUtils.getUpgradeEnergyUsage(upgrades); + return RefinedStorage.INSTANCE.soldererUsage + upgrades.getEnergyUsage(); } @Override @@ -51,7 +68,7 @@ public class TileSolderer extends TileNode { if (newRecipe == null) { stop(); } else if (newRecipe != recipe) { - boolean sameItem = items.getStackInSlot(3) != null ? RefinedStorageUtils.compareStackNoQuantity(items.getStackInSlot(3), newRecipe.getResult()) : false; + boolean sameItem = items.getStackInSlot(3) != null ? CompareUtils.compareStackNoQuantity(items.getStackInSlot(3), newRecipe.getResult()) : false; if (items.getStackInSlot(3) == null || (sameItem && ((items.getStackInSlot(3).stackSize + newRecipe.getResult().stackSize) <= items.getStackInSlot(3).getMaxStackSize()))) { recipe = newRecipe; @@ -61,7 +78,7 @@ public class TileSolderer extends TileNode { markDirty(); } } else if (working) { - progress += 1 + RefinedStorageUtils.getUpgradeCount(upgrades, ItemUpgrade.TYPE_SPEED); + progress += 1 + upgrades.getUpgradeCount(ItemUpgrade.TYPE_SPEED); if (progress >= recipe.getDuration()) { if (items.getStackInSlot(3) != null) { @@ -86,7 +103,7 @@ public class TileSolderer extends TileNode { } if (wasWorking != working) { - RefinedStorageUtils.updateBlock(worldObj, pos); + updateBlock(); } } @@ -108,20 +125,20 @@ public class TileSolderer extends TileNode { } @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void read(NBTTagCompound tag) { + super.read(tag); - RefinedStorageUtils.readItems(items, 0, nbt); - RefinedStorageUtils.readItems(upgrades, 1, nbt); + readItems(items, 0, tag); + readItems(upgrades, 1, tag); recipe = RefinedStorageAPI.SOLDERER_REGISTRY.getRecipe(items); - if (nbt.hasKey(NBT_WORKING)) { - working = nbt.getBoolean(NBT_WORKING); + if (tag.hasKey(NBT_WORKING)) { + working = tag.getBoolean(NBT_WORKING); } - if (nbt.hasKey(NBT_PROGRESS)) { - progress = nbt.getInteger(NBT_PROGRESS); + if (tag.hasKey(NBT_PROGRESS)) { + progress = tag.getInteger(NBT_PROGRESS); } } @@ -129,8 +146,8 @@ public class TileSolderer extends TileNode { public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - RefinedStorageUtils.writeItems(items, 0, tag); - RefinedStorageUtils.writeItems(upgrades, 1, tag); + writeItems(items, 0, tag); + writeItems(upgrades, 1, tag); tag.setBoolean(NBT_WORKING, working); tag.setInteger(NBT_PROGRESS, progress); @@ -154,40 +171,11 @@ public class TileSolderer extends TileNode { super.readUpdate(tag); } - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - progress = buf.readInt(); - duration = buf.readInt(); - } - - @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - buf.writeInt(progress); - buf.writeInt(recipe != null ? recipe.getDuration() : 0); - } - - @Override - public Class getContainer() { - return ContainerSolderer.class; - } - public boolean isWorking() { return working; } - public int getProgressScaled(int i) { - if (progress > duration) { - return i; - } - - return (int) ((float) progress / (float) duration * (float) i); - } - - public BasicItemHandler getItems() { + public ItemHandlerBasic getItems() { return items; } @@ -196,7 +184,7 @@ public class TileSolderer extends TileNode { } @Override - public IItemHandler getDroppedItems() { + public IItemHandler getDrops() { return new CombinedInvWrapper(items, upgrades); } @@ -210,7 +198,7 @@ public class TileSolderer extends TileNode { int i = facing.ordinal(); if (itemsFacade[i] == null) { - itemsFacade[i] = new SoldererItemHandler(this, facing); + itemsFacade[i] = new ItemHandlerSolderer(this, facing); } return (T) itemsFacade[i]; diff --git a/src/main/java/refinedstorage/tile/TileStorage.java b/src/main/java/refinedstorage/tile/TileStorage.java index 69e9b5621..5e07fa8bd 100755 --- a/src/main/java/refinedstorage/tile/TileStorage.java +++ b/src/main/java/refinedstorage/tile/TileStorage.java @@ -1,30 +1,39 @@ package refinedstorage.tile; -import io.netty.buffer.ByteBuf; -import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.items.IItemHandler; +import net.minecraft.network.datasync.DataSerializers; import net.minecraftforge.items.ItemHandlerHelper; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.network.INetworkMaster; -import refinedstorage.api.storage.IStorage; -import refinedstorage.api.storage.IStorageProvider; -import refinedstorage.apiimpl.storage.NBTStorage; +import refinedstorage.api.storage.item.IItemStorage; +import refinedstorage.api.storage.item.IItemStorageProvider; +import refinedstorage.apiimpl.storage.item.ItemStorageNBT; import refinedstorage.block.BlockStorage; -import refinedstorage.block.EnumStorageType; -import refinedstorage.container.ContainerStorage; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.network.MessagePriorityUpdate; -import refinedstorage.tile.config.*; +import refinedstorage.block.EnumItemStorageType; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.config.IFilterable; +import refinedstorage.tile.config.IPrioritizable; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; import java.util.List; -public class TileStorage extends TileNode implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig { - class Storage extends NBTStorage { - public Storage() { +public class TileStorage extends TileNode implements IItemStorageProvider, IStorageGui, IComparable, IFilterable, IPrioritizable { + public static final TileDataParameter PRIORITY = IPrioritizable.createParameter(); + public static final TileDataParameter COMPARE = IComparable.createParameter(); + public static final TileDataParameter MODE = IFilterable.createParameter(); + public static final TileDataParameter STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileStorage tile) { + return ItemStorageNBT.getStoredFromNBT(tile.storageTag); + } + }); + + class ItemStorage extends ItemStorageNBT { + public ItemStorage() { super(TileStorage.this.getStorageTag(), TileStorage.this.getCapacity(), TileStorage.this); } @@ -35,7 +44,7 @@ public class TileStorage extends TileNode implements IStorageProvider, IStorageG @Override public ItemStack insertItem(ItemStack stack, int size, boolean simulate) { - if (!ModeFilter.respectsMode(filters, TileStorage.this, compare, stack)) { + if (!IFilterable.canTake(filters, mode, compare, stack)) { return ItemHandlerHelper.copyStackWithSize(stack, size); } @@ -49,18 +58,24 @@ public class TileStorage extends TileNode implements IStorageProvider, IStorageG private static final String NBT_COMPARE = "Compare"; private static final String NBT_MODE = "Mode"; - private BasicItemHandler filters = new BasicItemHandler(9, this); + private ItemHandlerBasic filters = new ItemHandlerBasic(9, this); - private NBTTagCompound storageTag = NBTStorage.createNBT(); + private NBTTagCompound storageTag = ItemStorageNBT.createNBT(); - private Storage storage; + private ItemStorage storage; - private EnumStorageType type; + private EnumItemStorageType type; private int priority = 0; private int compare = 0; - private int mode = ModeConstants.WHITELIST; - private int stored; + private int mode = IFilterable.WHITELIST; + + public TileStorage() { + dataManager.addWatchedParameter(PRIORITY); + dataManager.addWatchedParameter(COMPARE); + dataManager.addWatchedParameter(MODE); + dataManager.addWatchedParameter(STORED); + } @Override public int getEnergyUsage() { @@ -76,10 +91,10 @@ public class TileStorage extends TileNode implements IStorageProvider, IStorageG super.update(); if (storage == null && storageTag != null) { - storage = new Storage(); + storage = new ItemStorage(); if (network != null) { - network.getStorage().rebuild(); + network.getItemStorage().rebuild(); } } } @@ -94,36 +109,36 @@ public class TileStorage extends TileNode implements IStorageProvider, IStorageG public void onConnectionChange(INetworkMaster network, boolean state) { super.onConnectionChange(network, state); - network.getStorage().rebuild(); + network.getItemStorage().rebuild(); } @Override - public void addStorages(List storages) { + public void addItemStorages(List storages) { if (storage != null) { storages.add(storage); } } @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void read(NBTTagCompound tag) { + super.read(tag); - RefinedStorageUtils.readItems(filters, 0, nbt); + readItems(filters, 0, tag); - if (nbt.hasKey(NBT_PRIORITY)) { - priority = nbt.getInteger(NBT_PRIORITY); + if (tag.hasKey(NBT_PRIORITY)) { + priority = tag.getInteger(NBT_PRIORITY); } - if (nbt.hasKey(NBT_STORAGE)) { - storageTag = nbt.getCompoundTag(NBT_STORAGE); + if (tag.hasKey(NBT_STORAGE)) { + storageTag = tag.getCompoundTag(NBT_STORAGE); } - if (nbt.hasKey(NBT_COMPARE)) { - compare = nbt.getInteger(NBT_COMPARE); + if (tag.hasKey(NBT_COMPARE)) { + compare = tag.getInteger(NBT_COMPARE); } - if (nbt.hasKey(NBT_MODE)) { - mode = nbt.getInteger(NBT_MODE); + if (tag.hasKey(NBT_MODE)) { + mode = tag.getInteger(NBT_MODE); } } @@ -131,7 +146,7 @@ public class TileStorage extends TileNode implements IStorageProvider, IStorageG public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - RefinedStorageUtils.writeItems(filters, 0, tag); + writeItems(filters, 0, tag); tag.setInteger(NBT_PRIORITY, priority); @@ -146,37 +161,12 @@ public class TileStorage extends TileNode implements IStorageProvider, IStorageG return tag; } - public EnumStorageType getType() { + public EnumItemStorageType getType() { if (type == null && worldObj.getBlockState(pos).getBlock() == RefinedStorageBlocks.STORAGE) { - this.type = ((EnumStorageType) worldObj.getBlockState(pos).getValue(BlockStorage.TYPE)); + this.type = ((EnumItemStorageType) worldObj.getBlockState(pos).getValue(BlockStorage.TYPE)); } - return type == null ? EnumStorageType.TYPE_1K : type; - } - - @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - buf.writeInt(NBTStorage.getStoredFromNBT(storageTag)); - buf.writeInt(priority); - buf.writeInt(compare); - buf.writeInt(mode); - } - - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - stored = buf.readInt(); - priority = buf.readInt(); - compare = buf.readInt(); - mode = buf.readInt(); - } - - @Override - public Class getContainer() { - return ContainerStorage.class; + return type == null ? EnumItemStorageType.TYPE_1K : type; } @Override @@ -209,28 +199,28 @@ public class TileStorage extends TileNode implements IStorageProvider, IStorageG } @Override - public IItemHandler getFilters() { - return filters; + public TileDataParameter getTypeParameter() { + return null; } @Override - public IRedstoneModeConfig getRedstoneModeConfig() { - return this; + public TileDataParameter getRedstoneModeParameter() { + return REDSTONE_MODE; } @Override - public ICompareConfig getCompareConfig() { - return this; + public TileDataParameter getCompareParameter() { + return COMPARE; } @Override - public IModeConfig getModeConfig() { - return this; + public TileDataParameter getFilterParameter() { + return MODE; } @Override - public void onPriorityChanged(int priority) { - RefinedStorage.INSTANCE.network.sendToServer(new MessagePriorityUpdate(pos, priority)); + public TileDataParameter getPriorityParameter() { + return PRIORITY; } public NBTTagCompound getStorageTag() { @@ -241,15 +231,20 @@ public class TileStorage extends TileNode implements IStorageProvider, IStorageG this.storageTag = storageTag; } - public NBTStorage getStorage() { + public ItemStorageNBT getStorage() { return storage; } + public ItemHandlerBasic getFilters() { + return filters; + } + @Override public int getPriority() { return priority; } + @Override public void setPriority(int priority) { this.priority = priority; @@ -258,7 +253,7 @@ public class TileStorage extends TileNode implements IStorageProvider, IStorageG @Override public int getStored() { - return stored; + return STORED.getValue(); } @Override diff --git a/src/main/java/refinedstorage/tile/TileWirelessTransmitter.java b/src/main/java/refinedstorage/tile/TileWirelessTransmitter.java index b92221410..ed325040d 100755 --- a/src/main/java/refinedstorage/tile/TileWirelessTransmitter.java +++ b/src/main/java/refinedstorage/tile/TileWirelessTransmitter.java @@ -1,27 +1,37 @@ package refinedstorage.tile; -import net.minecraft.inventory.Container; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataSerializers; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.network.IWirelessTransmitter; -import refinedstorage.container.ContainerWirelessTransmitter; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.inventory.BasicItemValidator; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerUpgrade; import refinedstorage.item.ItemUpgrade; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; public class TileWirelessTransmitter extends TileNode implements IWirelessTransmitter { - private BasicItemHandler upgrades = new BasicItemHandler(4, this, new BasicItemValidator(RefinedStorageItems.UPGRADE, ItemUpgrade.TYPE_RANGE)); + public static final TileDataParameter RANGE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileWirelessTransmitter tile) { + return tile.getRange(); + } + }); + + private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, this, ItemUpgrade.TYPE_RANGE); + + public TileWirelessTransmitter() { + dataManager.addWatchedParameter(RANGE); + } @Override public int getEnergyUsage() { - return RefinedStorage.INSTANCE.wirelessTransmitterUsage + RefinedStorageUtils.getUpgradeEnergyUsage(upgrades); + return RefinedStorage.INSTANCE.wirelessTransmitterUsage + upgrades.getEnergyUsage(); } @Override @@ -29,24 +39,24 @@ public class TileWirelessTransmitter extends TileNode implements IWirelessTransm } @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void read(NBTTagCompound tag) { + super.read(tag); - RefinedStorageUtils.readItems(upgrades, 0, nbt); + readItems(upgrades, 0, tag); } @Override public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - RefinedStorageUtils.writeItems(upgrades, 0, tag); + writeItems(upgrades, 0, tag); return tag; } @Override public int getRange() { - return RefinedStorage.INSTANCE.wirelessTransmitterBaseRange + (RefinedStorageUtils.getUpgradeCount(upgrades, ItemUpgrade.TYPE_RANGE) * RefinedStorage.INSTANCE.wirelessTransmitterRangePerUpgrade); + return RefinedStorage.INSTANCE.wirelessTransmitterBaseRange + (upgrades.getUpgradeCount(ItemUpgrade.TYPE_RANGE) * RefinedStorage.INSTANCE.wirelessTransmitterRangePerUpgrade); } @Override @@ -54,22 +64,17 @@ public class TileWirelessTransmitter extends TileNode implements IWirelessTransm return pos; } - public BasicItemHandler getUpgrades() { + public ItemHandlerBasic getUpgrades() { return upgrades; } @Override - public Class getContainer() { - return ContainerWirelessTransmitter.class; - } - - @Override - public IItemHandler getDroppedItems() { + public IItemHandler getDrops() { return upgrades; } @Override - public boolean canConduct() { + public boolean canConduct(EnumFacing direction) { return false; } diff --git a/src/main/java/refinedstorage/tile/config/IComparable.java b/src/main/java/refinedstorage/tile/config/IComparable.java new file mode 100755 index 000000000..3c3c94366 --- /dev/null +++ b/src/main/java/refinedstorage/tile/config/IComparable.java @@ -0,0 +1,27 @@ +package refinedstorage.tile.config; + +import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.tileentity.TileEntity; +import refinedstorage.tile.data.ITileDataConsumer; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; + +public interface IComparable { + static TileDataParameter createParameter() { + return new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(T tile) { + return ((IComparable) tile).getCompare(); + } + }, new ITileDataConsumer() { + @Override + public void setValue(T tile, Integer value) { + ((IComparable) tile).setCompare(value); + } + }); + } + + int getCompare(); + + void setCompare(int compare); +} diff --git a/src/main/java/refinedstorage/tile/config/ICompareConfig.java b/src/main/java/refinedstorage/tile/config/ICompareConfig.java deleted file mode 100755 index 26da4637e..000000000 --- a/src/main/java/refinedstorage/tile/config/ICompareConfig.java +++ /dev/null @@ -1,7 +0,0 @@ -package refinedstorage.tile.config; - -public interface ICompareConfig { - int getCompare(); - - void setCompare(int compare); -} diff --git a/src/main/java/refinedstorage/tile/config/IFilterable.java b/src/main/java/refinedstorage/tile/config/IFilterable.java new file mode 100755 index 000000000..5f605f3f2 --- /dev/null +++ b/src/main/java/refinedstorage/tile/config/IFilterable.java @@ -0,0 +1,101 @@ +package refinedstorage.tile.config; + +import net.minecraft.item.ItemStack; +import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.items.IItemHandler; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.inventory.ItemHandlerFluid; +import refinedstorage.tile.data.ITileDataConsumer; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; + +public interface IFilterable { + int WHITELIST = 0; + int BLACKLIST = 1; + + static TileDataParameter createParameter() { + return new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(T tile) { + return ((IFilterable) tile).getMode(); + } + }, new ITileDataConsumer() { + @Override + public void setValue(T tile, Integer value) { + if (value == WHITELIST || value == BLACKLIST) { + ((IFilterable) tile).setMode(value); + } + } + }); + } + + static boolean canTake(IItemHandler filters, int mode, int compare, ItemStack stack) { + if (mode == WHITELIST) { + int slots = 0; + + for (int i = 0; i < filters.getSlots(); ++i) { + ItemStack slot = filters.getStackInSlot(i); + + if (slot != null) { + slots++; + + if (CompareUtils.compareStack(slot, stack, compare)) { + return true; + } + } + } + + return slots == 0; + } else if (mode == BLACKLIST) { + for (int i = 0; i < filters.getSlots(); ++i) { + ItemStack slot = filters.getStackInSlot(i); + + if (slot != null && CompareUtils.compareStack(slot, stack, compare)) { + return false; + } + } + + return true; + } + + return false; + } + + static boolean canTakeFluids(ItemHandlerFluid filters, int mode, int compare, FluidStack stack) { + if (mode == WHITELIST) { + int slots = 0; + + for (int i = 0; i < filters.getSlots(); ++i) { + FluidStack slot = filters.getFluids()[i]; + + if (slot != null) { + slots++; + + if (CompareUtils.compareStack(slot, stack, compare)) { + return true; + } + } + } + + return slots == 0; + } else if (mode == BLACKLIST) { + for (int i = 0; i < filters.getSlots(); ++i) { + FluidStack slot = filters.getFluids()[i]; + + if (slot != null && CompareUtils.compareStack(slot, stack, compare)) { + return false; + } + } + + return true; + } + + return false; + } + + void setMode(int mode); + + int getMode(); +} diff --git a/src/main/java/refinedstorage/tile/config/IModeConfig.java b/src/main/java/refinedstorage/tile/config/IModeConfig.java deleted file mode 100755 index cc7fa1ef0..000000000 --- a/src/main/java/refinedstorage/tile/config/IModeConfig.java +++ /dev/null @@ -1,7 +0,0 @@ -package refinedstorage.tile.config; - -public interface IModeConfig { - void setMode(int mode); - - int getMode(); -} diff --git a/src/main/java/refinedstorage/tile/config/IPrioritizable.java b/src/main/java/refinedstorage/tile/config/IPrioritizable.java new file mode 100755 index 000000000..c23abf188 --- /dev/null +++ b/src/main/java/refinedstorage/tile/config/IPrioritizable.java @@ -0,0 +1,33 @@ +package refinedstorage.tile.config; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.tileentity.TileEntity; +import refinedstorage.gui.GuiStorage; +import refinedstorage.tile.data.ITileDataConsumer; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; + +public interface IPrioritizable { + static TileDataParameter createParameter() { + return new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(T tile) { + return ((IPrioritizable) tile).getPriority(); + } + }, new ITileDataConsumer() { + @Override + public void setValue(T tile, Integer value) { + ((IPrioritizable) tile).setPriority(value); + } + }, parameter -> { + if (Minecraft.getMinecraft().currentScreen instanceof GuiStorage) { + ((GuiStorage) Minecraft.getMinecraft().currentScreen).updatePriority(parameter.getValue()); + } + }); + } + + int getPriority(); + + void setPriority(int priority); +} diff --git a/src/main/java/refinedstorage/tile/config/IRedstoneModeConfig.java b/src/main/java/refinedstorage/tile/config/IRedstoneConfigurable.java similarity index 74% rename from src/main/java/refinedstorage/tile/config/IRedstoneModeConfig.java rename to src/main/java/refinedstorage/tile/config/IRedstoneConfigurable.java index 21d0dcd58..6a4e4d830 100755 --- a/src/main/java/refinedstorage/tile/config/IRedstoneModeConfig.java +++ b/src/main/java/refinedstorage/tile/config/IRedstoneConfigurable.java @@ -1,6 +1,6 @@ package refinedstorage.tile.config; -public interface IRedstoneModeConfig { +public interface IRedstoneConfigurable { RedstoneMode getRedstoneMode(); void setRedstoneMode(RedstoneMode mode); diff --git a/src/main/java/refinedstorage/tile/config/IType.java b/src/main/java/refinedstorage/tile/config/IType.java new file mode 100755 index 000000000..63db8ccdc --- /dev/null +++ b/src/main/java/refinedstorage/tile/config/IType.java @@ -0,0 +1,40 @@ +package refinedstorage.tile.config; + +import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.items.IItemHandler; +import refinedstorage.container.ContainerBase; +import refinedstorage.tile.data.ITileDataConsumer; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; + +public interface IType { + int ITEMS = 0; + int FLUIDS = 1; + + static TileDataParameter createParameter() { + return new TileDataParameter<>(DataSerializers.VARINT, ITEMS, new ITileDataProducer() { + @Override + public Integer getValue(T tile) { + return ((IType) tile).getType(); + } + }, new ITileDataConsumer() { + @Override + public void setValue(T tile, Integer value) { + if (value == 0 || value == 1) { + ((IType) tile).setType(value); + + tile.getWorld().playerEntities.stream() + .filter(p -> p.openContainer instanceof ContainerBase && ((ContainerBase) p.openContainer).getTile().getPos().equals(tile.getPos())) + .forEach(p -> p.openContainer.detectAndSendChanges()); + } + } + }); + } + + int getType(); + + void setType(int type); + + IItemHandler getFilterInventory(); +} diff --git a/src/main/java/refinedstorage/tile/config/ModeConstants.java b/src/main/java/refinedstorage/tile/config/ModeConstants.java deleted file mode 100755 index 12dcc16f3..000000000 --- a/src/main/java/refinedstorage/tile/config/ModeConstants.java +++ /dev/null @@ -1,6 +0,0 @@ -package refinedstorage.tile.config; - -public final class ModeConstants { - public static final int WHITELIST = 0; - public static final int BLACKLIST = 1; -} diff --git a/src/main/java/refinedstorage/tile/config/ModeFilter.java b/src/main/java/refinedstorage/tile/config/ModeFilter.java deleted file mode 100755 index 090916feb..000000000 --- a/src/main/java/refinedstorage/tile/config/ModeFilter.java +++ /dev/null @@ -1,39 +0,0 @@ -package refinedstorage.tile.config; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.items.IItemHandler; -import refinedstorage.RefinedStorageUtils; - -public final class ModeFilter { - public static boolean respectsMode(IItemHandler filters, IModeConfig mode, int compare, ItemStack stack) { - if (mode.getMode() == ModeConstants.WHITELIST) { - int slots = 0; - - for (int i = 0; i < filters.getSlots(); ++i) { - ItemStack slot = filters.getStackInSlot(i); - - if (slot != null) { - slots++; - - if (RefinedStorageUtils.compareStack(slot, stack, compare)) { - return true; - } - } - } - - return slots == 0; - } else if (mode.getMode() == ModeConstants.BLACKLIST) { - for (int i = 0; i < filters.getSlots(); ++i) { - ItemStack slot = filters.getStackInSlot(i); - - if (slot != null && RefinedStorageUtils.compareStack(slot, stack, compare)) { - return false; - } - } - - return true; - } - - return false; - } -} diff --git a/src/main/java/refinedstorage/tile/config/RedstoneMode.java b/src/main/java/refinedstorage/tile/config/RedstoneMode.java index a0f1bbcc2..3c43f4cde 100755 --- a/src/main/java/refinedstorage/tile/config/RedstoneMode.java +++ b/src/main/java/refinedstorage/tile/config/RedstoneMode.java @@ -1,31 +1,18 @@ package refinedstorage.tile.config; +import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import refinedstorage.tile.data.ITileDataConsumer; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; public enum RedstoneMode { - IGNORE(0), - HIGH(1), - LOW(2); + IGNORE, HIGH, LOW; public static final String NBT = "RedstoneMode"; - public final int id; - - RedstoneMode(int id) { - this.id = id; - } - - public RedstoneMode next() { - RedstoneMode next = getById(id + 1); - - if (next == null) { - return getById(0); - } - - return next; - } - public boolean isEnabled(World world, BlockPos pos) { switch (this) { case IGNORE: @@ -40,12 +27,20 @@ public enum RedstoneMode { } public static RedstoneMode getById(int id) { - for (RedstoneMode control : values()) { - if (control.id == id) { - return control; - } - } + return id < 0 || id >= values().length ? IGNORE : values()[id]; + } - return null; + public static TileDataParameter createParameter() { + return new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(T tile) { + return ((IRedstoneConfigurable) tile).getRedstoneMode().ordinal(); + } + }, new ITileDataConsumer() { + @Override + public void setValue(T tile, Integer value) { + ((IRedstoneConfigurable) tile).setRedstoneMode(RedstoneMode.getById(value)); + } + }); } } diff --git a/src/main/java/refinedstorage/tile/controller/ClientNode.java b/src/main/java/refinedstorage/tile/controller/ClientNode.java deleted file mode 100755 index 7b97be51e..000000000 --- a/src/main/java/refinedstorage/tile/controller/ClientNode.java +++ /dev/null @@ -1,30 +0,0 @@ -package refinedstorage.tile.controller; - -import net.minecraft.item.ItemStack; -import refinedstorage.RefinedStorageUtils; - -public final class ClientNode { - public ItemStack stack; - public int amount; - public int energyUsage; - - @Override - public boolean equals(Object other) { - if (this == other) { - return true; - } - - if (!(other instanceof ClientNode)) { - return false; - } - - return energyUsage == ((ClientNode) other).energyUsage && RefinedStorageUtils.compareStack(stack, ((ClientNode) other).stack); - } - - @Override - public int hashCode() { - int result = stack.hashCode(); - result = 31 * result + energyUsage; - return result; - } -} diff --git a/src/main/java/refinedstorage/tile/controller/IC2Energy.java b/src/main/java/refinedstorage/tile/controller/IC2Energy.java deleted file mode 100755 index aaf7e8a8b..000000000 --- a/src/main/java/refinedstorage/tile/controller/IC2Energy.java +++ /dev/null @@ -1,35 +0,0 @@ -package refinedstorage.tile.controller; - -import ic2.api.energy.prefab.BasicSink; -import net.minecraft.util.EnumFacing; - -import static refinedstorage.RefinedStorageUtils.convertIC2ToRF; -import static refinedstorage.RefinedStorageUtils.convertRFToIC2; - -public class IC2Energy { - private BasicSink sink; - - public IC2Energy(final TileController controller) { - this.sink = new BasicSink(controller, (int) convertRFToIC2(controller.getEnergy().getMaxEnergyStored()), Integer.MAX_VALUE) { - @Override - public double getDemandedEnergy() { - return Math.max(0.0D, convertRFToIC2(controller.getEnergy().getMaxEnergyStored()) - convertRFToIC2(controller.getEnergy().getEnergyStored())); - } - - @Override - public double injectEnergy(EnumFacing directionFrom, double amount, double voltage) { - controller.getEnergy().setEnergyStored(controller.getEnergy().getEnergyStored() + convertIC2ToRF(amount)); - - return 0.0D; - } - }; - } - - public void invalidate() { - sink.invalidate(); - } - - public void update() { - sink.update(); - } -} diff --git a/src/main/java/refinedstorage/tile/data/ContainerListener.java b/src/main/java/refinedstorage/tile/data/ContainerListener.java new file mode 100755 index 000000000..e82717803 --- /dev/null +++ b/src/main/java/refinedstorage/tile/data/ContainerListener.java @@ -0,0 +1,23 @@ +package refinedstorage.tile.data; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; +import net.minecraftforge.event.entity.player.PlayerContainerEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import refinedstorage.container.ContainerBase; +import refinedstorage.tile.TileBase; + +public class ContainerListener { + @SubscribeEvent + public void onContainerOpen(PlayerContainerEvent.Open e) { + Container container = e.getContainer(); + + if (container instanceof ContainerBase) { + TileBase tile = ((ContainerBase) container).getTile(); + + if (tile != null && !tile.getWorld().isRemote) { + tile.getDataManager().sendParametersTo((EntityPlayerMP) e.getEntityPlayer()); + } + } + } +} diff --git a/src/main/java/refinedstorage/tile/data/ITileDataConsumer.java b/src/main/java/refinedstorage/tile/data/ITileDataConsumer.java new file mode 100755 index 000000000..03fafd823 --- /dev/null +++ b/src/main/java/refinedstorage/tile/data/ITileDataConsumer.java @@ -0,0 +1,7 @@ +package refinedstorage.tile.data; + +import net.minecraft.tileentity.TileEntity; + +public interface ITileDataConsumer { + void setValue(E tile, T value); +} diff --git a/src/main/java/refinedstorage/tile/data/ITileDataListener.java b/src/main/java/refinedstorage/tile/data/ITileDataListener.java new file mode 100755 index 000000000..79114d194 --- /dev/null +++ b/src/main/java/refinedstorage/tile/data/ITileDataListener.java @@ -0,0 +1,5 @@ +package refinedstorage.tile.data; + +public interface ITileDataListener { + void onChanged(TileDataParameter parameter); +} diff --git a/src/main/java/refinedstorage/tile/data/ITileDataProducer.java b/src/main/java/refinedstorage/tile/data/ITileDataProducer.java new file mode 100755 index 000000000..1a8bd948c --- /dev/null +++ b/src/main/java/refinedstorage/tile/data/ITileDataProducer.java @@ -0,0 +1,7 @@ +package refinedstorage.tile.data; + +import net.minecraft.tileentity.TileEntity; + +public interface ITileDataProducer { + T getValue(E tile); +} diff --git a/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java new file mode 100755 index 000000000..6f0608691 --- /dev/null +++ b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java @@ -0,0 +1,120 @@ +package refinedstorage.tile.data; + +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.datasync.DataParameter; +import net.minecraft.network.datasync.DataSerializer; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import refinedstorage.tile.ClientCraftingTask; +import refinedstorage.tile.ClientNode; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public final class RefinedStorageSerializers { + public static final DataSerializer> CLIENT_NODE_SERIALIZER = new DataSerializer>() { + @Override + public void write(PacketBuffer buf, List nodes) { + buf.writeInt(nodes.size()); + + for (ClientNode node : nodes) { + ByteBufUtils.writeItemStack(buf, node.getStack()); + buf.writeInt(node.getAmount()); + buf.writeInt(node.getEnergyUsage()); + } + } + + @Override + public List read(PacketBuffer buf) throws IOException { + List nodes = new ArrayList<>(); + + int size = buf.readInt(); + + for (int i = 0; i < size; ++i) { + nodes.add(new ClientNode(ByteBufUtils.readItemStack(buf), buf.readInt(), buf.readInt())); + } + + return nodes; + } + + @Override + public DataParameter> createKey(int id) { + return null; + } + }; + + public static final DataSerializer> CLIENT_CRAFTING_TASK_SERIALIZER = new DataSerializer>() { + @Override + public void write(PacketBuffer buf, List tasks) { + buf.writeInt(tasks.size()); + + for (ClientCraftingTask task : tasks) { + ByteBufUtils.writeUTF8String(buf, task.getInfo()); + + buf.writeInt(task.getOutputs().length); + + for (ItemStack output : task.getOutputs()) { + ByteBufUtils.writeItemStack(buf, output); + } + } + } + + @Override + public List read(PacketBuffer buf) throws IOException { + int size = buf.readInt(); + + List tasks = new ArrayList<>(); + + for (int i = 0; i < size; ++i) { + String info = ByteBufUtils.readUTF8String(buf); + + int outputs = buf.readInt(); + + for (int j = 0; j < outputs; ++j) { + tasks.add(new ClientCraftingTask(ByteBufUtils.readItemStack(buf), i, info)); + } + } + + Collections.reverse(tasks); + + return tasks; + } + + @Override + public DataParameter> createKey(int id) { + return null; + } + }; + + public static final DataSerializer FLUID_STACK_SERIALIZER = new DataSerializer() { + @Override + public void write(PacketBuffer buf, FluidStack value) { + if (value == null) { + buf.writeBoolean(false); + } else { + buf.writeBoolean(true); + ByteBufUtils.writeUTF8String(buf, FluidRegistry.getFluidName(value)); + buf.writeInt(value.amount); + buf.writeNBTTagCompoundToBuffer(value.tag); + } + } + + @Override + public FluidStack read(PacketBuffer buf) throws IOException { + if (buf.readBoolean()) { + return new FluidStack(FluidRegistry.getFluid(ByteBufUtils.readUTF8String(buf)), buf.readInt(), buf.readNBTTagCompoundFromBuffer()); + } + + return null; + } + + @Override + public DataParameter createKey(int id) { + return null; + } + }; +} diff --git a/src/main/java/refinedstorage/tile/data/TileDataManager.java b/src/main/java/refinedstorage/tile/data/TileDataManager.java new file mode 100755 index 000000000..a051bee4e --- /dev/null +++ b/src/main/java/refinedstorage/tile/data/TileDataManager.java @@ -0,0 +1,100 @@ +package refinedstorage.tile.data; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; +import net.minecraft.tileentity.TileEntity; +import refinedstorage.RefinedStorage; +import refinedstorage.container.ContainerBase; +import refinedstorage.network.MessageTileDataParameter; +import refinedstorage.network.MessageTileDataParameterUpdate; +import refinedstorage.tile.TileBase; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TileDataManager { + private static int LAST_ID = 0; + private static Map REGISTRY = new HashMap<>(); + + private List parameters = new ArrayList<>(); + + private List watchedParameters = new ArrayList<>(); + private List watchedParametersCache = new ArrayList<>(); + + public static void registerParameter(TileDataParameter parameter) { + parameter.setId(LAST_ID); + + REGISTRY.put(LAST_ID++, parameter); + } + + public static TileDataParameter getParameter(int id) { + return REGISTRY.get(id); + } + + public static void setParameter(TileDataParameter parameter, T value) { + RefinedStorage.INSTANCE.network.sendToServer(new MessageTileDataParameterUpdate(parameter, value)); + } + + private TileEntity tile; + + public TileDataManager(TileEntity tile) { + this.tile = tile; + } + + public void addParameter(TileDataParameter parameter) { + parameters.add(parameter); + } + + public List getParameters() { + return parameters; + } + + public void addWatchedParameter(TileDataParameter parameter) { + addParameter(parameter); + + watchedParameters.add(parameter); + watchedParametersCache.add(null); + } + + public void detectAndSendChanges() { + for (int i = 0; i < watchedParameters.size(); ++i) { + TileDataParameter parameter = watchedParameters.get(i); + + Object real = parameter.getValueProducer().getValue(tile); + Object cached = watchedParametersCache.get(i); + + if (!real.equals(cached)) { + watchedParametersCache.set(i, real); + + sendParameterToWatchers(parameter); + } + } + } + + public void sendParametersTo(EntityPlayerMP player) { + for (TileDataParameter parameter : parameters) { + sendParameter(player, parameter); + } + } + + public void sendParameter(EntityPlayerMP player, TileDataParameter parameter) { + RefinedStorage.INSTANCE.network.sendTo(new MessageTileDataParameter(tile, parameter), player); + } + + public void sendParameterToWatchers(TileDataParameter parameter) { + for (EntityPlayer player : tile.getWorld().playerEntities) { + Container container = player.openContainer; + + if (container instanceof ContainerBase) { + TileBase tile = ((ContainerBase) container).getTile(); + + if (tile != null && tile.getPos().equals(this.tile.getPos())) { + sendParameter((EntityPlayerMP) player, parameter); + } + } + } + } +} diff --git a/src/main/java/refinedstorage/tile/data/TileDataParameter.java b/src/main/java/refinedstorage/tile/data/TileDataParameter.java new file mode 100755 index 000000000..26e7aa0c1 --- /dev/null +++ b/src/main/java/refinedstorage/tile/data/TileDataParameter.java @@ -0,0 +1,61 @@ +package refinedstorage.tile.data; + +import net.minecraft.network.datasync.DataSerializer; +import net.minecraft.tileentity.TileEntity; + +public class TileDataParameter { + private int id; + private DataSerializer serializer; + private ITileDataProducer valueProducer; + private ITileDataConsumer valueConsumer; + private ITileDataListener listener; + private T value; + + public TileDataParameter(DataSerializer serializer, T defaultValue, ITileDataProducer producer) { + this(serializer, defaultValue, producer, null); + } + + public TileDataParameter(DataSerializer serializer, T defaultValue, ITileDataProducer producer, ITileDataConsumer consumer) { + this(serializer, defaultValue, producer, consumer, null); + } + + public TileDataParameter(DataSerializer serializer, T defaultValue, ITileDataProducer producer, ITileDataConsumer consumer, ITileDataListener listener) { + this.value = defaultValue; + this.serializer = serializer; + this.valueProducer = producer; + this.valueConsumer = consumer; + this.listener = listener; + } + + public void setId(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public DataSerializer getSerializer() { + return serializer; + } + + public ITileDataProducer getValueProducer() { + return valueProducer; + } + + public ITileDataConsumer getValueConsumer() { + return valueConsumer; + } + + public void setValue(T value) { + this.value = value; + + if (listener != null) { + listener.onChanged(this); + } + } + + public T getValue() { + return value; + } +} \ No newline at end of file diff --git a/src/main/java/refinedstorage/tile/externalstorage/FluidStorageExternal.java b/src/main/java/refinedstorage/tile/externalstorage/FluidStorageExternal.java new file mode 100755 index 000000000..d78cbd3b7 --- /dev/null +++ b/src/main/java/refinedstorage/tile/externalstorage/FluidStorageExternal.java @@ -0,0 +1,93 @@ +package refinedstorage.tile.externalstorage; + +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidTankProperties; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.storage.fluid.IFluidStorage; +import refinedstorage.apiimpl.storage.fluid.FluidUtils; +import refinedstorage.tile.config.IFilterable; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Collections; +import java.util.List; + +public class FluidStorageExternal implements IFluidStorage { + private FluidStack cache; + + private TileExternalStorage externalStorage; + private IFluidHandler handler; + private IFluidTankProperties properties; + + public FluidStorageExternal(TileExternalStorage externalStorage, IFluidHandler handler, IFluidTankProperties properties) { + this.externalStorage = externalStorage; + this.handler = handler; + this.properties = properties; + } + + @Override + public List getStacks() { + return properties.getContents() == null ? Collections.emptyList() : Collections.singletonList(properties.getContents().copy()); + } + + @Nullable + @Override + public FluidStack insertFluid(@Nonnull FluidStack stack, int size, boolean simulate) { + if (IFilterable.canTakeFluids(externalStorage.getFluidFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack) && properties.canFillFluidType(stack)) { + int filled = handler.fill(FluidUtils.copyStackWithSize(stack, size), !simulate); + + if (filled == size) { + return null; + } + + return FluidUtils.copyStackWithSize(stack, size - filled); + } + + return FluidUtils.copyStackWithSize(stack, size); + } + + @Nullable + @Override + public FluidStack extractFluid(@Nonnull FluidStack stack, int size, int flags) { + FluidStack toDrain = FluidUtils.copyStackWithSize(stack, size); + + if (CompareUtils.compareStack(properties.getContents(), toDrain, flags)) { + return handler.drain(toDrain, true); + } + + return null; + } + + @Override + public int getStored() { + return properties.getContents() != null ? properties.getContents().amount : 0; + } + + public int getCapacity() { + return properties.getCapacity(); + } + + @Override + public int getPriority() { + return externalStorage.getPriority(); + } + + public boolean updateCache() { + FluidStack stack = properties.getContents(); + + if (cache == null) { + cache = FluidUtils.copy(stack); + } else if (!CompareUtils.compareStack(stack, cache, CompareUtils.COMPARE_NBT)) { + cache = FluidUtils.copy(stack); + + return true; + } + + return false; + } + + public void updateCacheForcefully() { + cache = FluidUtils.copy(properties.getContents()); + } +} diff --git a/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java b/src/main/java/refinedstorage/tile/externalstorage/ItemStorageDSU.java similarity index 85% rename from src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java rename to src/main/java/refinedstorage/tile/externalstorage/ItemStorageDSU.java index 3ed8b7352..4523fe739 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/ItemStorageDSU.java @@ -3,18 +3,18 @@ package refinedstorage.tile.externalstorage; import net.minecraft.item.ItemStack; import net.minecraftforge.items.ItemHandlerHelper; import powercrystals.minefactoryreloaded.api.IDeepStorageUnit; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.tile.config.ModeFilter; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.tile.config.IFilterable; import javax.annotation.Nonnull; import java.util.Collections; import java.util.List; -public class DeepStorageUnitStorage extends ExternalStorage { +public class ItemStorageDSU extends ItemStorageExternal { private TileExternalStorage externalStorage; private IDeepStorageUnit unit; - public DeepStorageUnitStorage(TileExternalStorage externalStorage, IDeepStorageUnit unit) { + public ItemStorageDSU(TileExternalStorage externalStorage, IDeepStorageUnit unit) { this.externalStorage = externalStorage; this.unit = unit; } @@ -35,9 +35,9 @@ public class DeepStorageUnitStorage extends ExternalStorage { @Override public ItemStack insertItem(@Nonnull ItemStack stack, int size, boolean simulate) { - if (ModeFilter.respectsMode(externalStorage.getFilters(), externalStorage, externalStorage.getCompare(), stack)) { + if (IFilterable.canTake(externalStorage.getItemFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack)) { if (unit.getStoredItemType() != null) { - if (RefinedStorageUtils.compareStackNoQuantity(unit.getStoredItemType(), stack)) { + if (CompareUtils.compareStackNoQuantity(unit.getStoredItemType(), stack)) { if (getStored() + size > unit.getMaxStoredCount()) { int remainingSpace = getCapacity() - getStored(); @@ -86,7 +86,7 @@ public class DeepStorageUnitStorage extends ExternalStorage { @Override public ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags) { - if (RefinedStorageUtils.compareStack(stack, unit.getStoredItemType(), flags)) { + if (CompareUtils.compareStack(stack, unit.getStoredItemType(), flags)) { if (size > unit.getStoredItemType().stackSize) { size = unit.getStoredItemType().stackSize; } diff --git a/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java b/src/main/java/refinedstorage/tile/externalstorage/ItemStorageDrawer.java similarity index 85% rename from src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java rename to src/main/java/refinedstorage/tile/externalstorage/ItemStorageDrawer.java index c25924744..c40f38c22 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/DrawerStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/ItemStorageDrawer.java @@ -4,17 +4,17 @@ import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; import com.jaquadro.minecraft.storagedrawers.api.storage.attribute.IVoidable; import net.minecraft.item.ItemStack; import net.minecraftforge.items.ItemHandlerHelper; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.tile.config.ModeFilter; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.tile.config.IFilterable; import java.util.Collections; import java.util.List; -public class DrawerStorage extends ExternalStorage { +public class ItemStorageDrawer extends ItemStorageExternal { private TileExternalStorage externalStorage; private IDrawer drawer; - public DrawerStorage(TileExternalStorage externalStorage, IDrawer drawer) { + public ItemStorageDrawer(TileExternalStorage externalStorage, IDrawer drawer) { this.externalStorage = externalStorage; this.drawer = drawer; } @@ -33,13 +33,13 @@ public class DrawerStorage extends ExternalStorage { return Collections.emptyList(); } - public boolean isVoidable() { + private boolean isVoidable() { return drawer instanceof IVoidable && ((IVoidable) drawer).isVoid(); } @Override public ItemStack insertItem(ItemStack stack, int size, boolean simulate) { - if (ModeFilter.respectsMode(externalStorage.getFilters(), externalStorage, externalStorage.getCompare(), stack) && drawer.canItemBeStored(stack)) { + if (IFilterable.canTake(externalStorage.getItemFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack) && drawer.canItemBeStored(stack)) { if (!drawer.isEmpty()) { if (getStored() + size > drawer.getMaxCapacity(stack)) { int remainingSpace = getCapacity() - getStored(); @@ -88,7 +88,7 @@ public class DrawerStorage extends ExternalStorage { @Override public ItemStack extractItem(ItemStack stack, int size, int flags) { - if (RefinedStorageUtils.compareStack(stack, drawer.getStoredItemPrototype(), flags) && drawer.canItemBeExtracted(stack)) { + if (CompareUtils.compareStack(stack, drawer.getStoredItemPrototype(), flags) && drawer.canItemBeExtracted(stack)) { if (size > drawer.getStoredItemCount()) { size = drawer.getStoredItemCount(); } diff --git a/src/main/java/refinedstorage/tile/externalstorage/ExternalStorage.java b/src/main/java/refinedstorage/tile/externalstorage/ItemStorageExternal.java similarity index 74% rename from src/main/java/refinedstorage/tile/externalstorage/ExternalStorage.java rename to src/main/java/refinedstorage/tile/externalstorage/ItemStorageExternal.java index 19f7832c5..5973d041b 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/ExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/ItemStorageExternal.java @@ -1,12 +1,12 @@ package refinedstorage.tile.externalstorage; import net.minecraft.item.ItemStack; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.api.storage.IStorage; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.api.storage.item.IItemStorage; import java.util.List; -public abstract class ExternalStorage implements IStorage { +public abstract class ItemStorageExternal implements IItemStorage { private List cache; public abstract int getCapacity(); @@ -22,7 +22,7 @@ public abstract class ExternalStorage implements IStorage { return true; } else { for (int i = 0; i < items.size(); ++i) { - if (!RefinedStorageUtils.compareStack(items.get(i), cache.get(i))) { + if (!CompareUtils.compareStack(items.get(i), cache.get(i))) { cache = items; return true; diff --git a/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java b/src/main/java/refinedstorage/tile/externalstorage/ItemStorageItemHandler.java similarity index 61% rename from src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java rename to src/main/java/refinedstorage/tile/externalstorage/ItemStorageItemHandler.java index f56af7c1e..efa400c2a 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/ItemHandlerStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/ItemStorageItemHandler.java @@ -3,17 +3,17 @@ package refinedstorage.tile.externalstorage; import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.tile.config.ModeFilter; +import refinedstorage.api.storage.CompareUtils; +import refinedstorage.tile.config.IFilterable; import java.util.ArrayList; import java.util.List; -public class ItemHandlerStorage extends ExternalStorage { +public class ItemStorageItemHandler extends ItemStorageExternal { private TileExternalStorage externalStorage; private IItemHandler handler; - public ItemHandlerStorage(TileExternalStorage externalStorage, IItemHandler handler) { + public ItemStorageItemHandler(TileExternalStorage externalStorage, IItemHandler handler) { this.externalStorage = externalStorage; this.handler = handler; } @@ -25,7 +25,7 @@ public class ItemHandlerStorage extends ExternalStorage { @Override public List getItems() { - List items = new ArrayList(); + List items = new ArrayList<>(); for (int i = 0; i < handler.getSlots(); ++i) { if (handler.getStackInSlot(i) != null && handler.getStackInSlot(i).getItem() != null) { @@ -38,7 +38,7 @@ public class ItemHandlerStorage extends ExternalStorage { @Override public ItemStack insertItem(ItemStack stack, int size, boolean simulate) { - if (ModeFilter.respectsMode(externalStorage.getFilters(), externalStorage, externalStorage.getCompare(), stack)) { + if (IFilterable.canTake(externalStorage.getItemFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack)) { return ItemHandlerHelper.insertItem(handler, ItemHandlerHelper.copyStackWithSize(stack, size), simulate); } @@ -47,21 +47,33 @@ public class ItemHandlerStorage extends ExternalStorage { @Override public ItemStack extractItem(ItemStack stack, int size, int flags) { + int remaining = size; + + ItemStack received = null; + for (int i = 0; i < handler.getSlots(); ++i) { ItemStack slot = handler.getStackInSlot(i); - if (slot != null && RefinedStorageUtils.compareStack(slot, stack, flags)) { - size = Math.min(size, slot.stackSize); + if (slot != null && CompareUtils.compareStack(slot, stack, flags)) { + ItemStack got = handler.extractItem(i, remaining, false); - ItemStack took = ItemHandlerHelper.copyStackWithSize(slot, size); + if (got != null) { + if (received == null) { + received = got; + } else { + received.stackSize += got.stackSize; + } - handler.extractItem(i, size, false); + remaining -= got.stackSize; - return took; + if (remaining == 0) { + break; + } + } } } - return null; + return received; } @Override diff --git a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java index d22304d3d..cd0e2cf66 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java @@ -2,50 +2,109 @@ package refinedstorage.tile.externalstorage; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup; -import io.netty.buffer.ByteBuf; -import net.minecraft.inventory.Container; +import mcmultipart.microblock.IMicroblock; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataSerializers; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.items.IItemHandler; import powercrystals.minefactoryreloaded.api.IDeepStorageUnit; import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageUtils; import refinedstorage.api.network.INetworkMaster; -import refinedstorage.api.storage.IStorage; -import refinedstorage.api.storage.IStorageProvider; -import refinedstorage.container.ContainerStorage; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.network.MessagePriorityUpdate; +import refinedstorage.api.storage.fluid.IFluidStorage; +import refinedstorage.api.storage.fluid.IFluidStorageProvider; +import refinedstorage.api.storage.item.IItemStorage; +import refinedstorage.api.storage.item.IItemStorageProvider; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerFluid; import refinedstorage.tile.IStorageGui; -import refinedstorage.tile.TileNode; -import refinedstorage.tile.config.ICompareConfig; -import refinedstorage.tile.config.IModeConfig; -import refinedstorage.tile.config.IRedstoneModeConfig; -import refinedstorage.tile.config.ModeConstants; +import refinedstorage.tile.TileMultipartNode; +import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.config.IFilterable; +import refinedstorage.tile.config.IPrioritizable; +import refinedstorage.tile.config.IType; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; import java.util.ArrayList; import java.util.List; -public class TileExternalStorage extends TileNode implements IStorageProvider, IStorageGui, ICompareConfig, IModeConfig { +public class TileExternalStorage extends TileMultipartNode implements IItemStorageProvider, IFluidStorageProvider, IStorageGui, IComparable, IFilterable, IPrioritizable, IType { + public static final TileDataParameter PRIORITY = IPrioritizable.createParameter(); + public static final TileDataParameter COMPARE = IComparable.createParameter(); + public static final TileDataParameter MODE = IFilterable.createParameter(); + public static final TileDataParameter TYPE = IType.createParameter(); + + public static final TileDataParameter STORED = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileExternalStorage tile) { + int stored = 0; + + for (ItemStorageExternal storage : tile.itemStorages) { + stored += storage.getStored(); + } + + for (FluidStorageExternal storage : tile.fluidStorages) { + stored += storage.getStored(); + } + + return stored; + } + }); + + public static final TileDataParameter CAPACITY = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileExternalStorage tile) { + int capacity = 0; + + for (ItemStorageExternal storage : tile.itemStorages) { + capacity += storage.getCapacity(); + } + + for (FluidStorageExternal storage : tile.fluidStorages) { + capacity += storage.getCapacity(); + } + + return capacity; + } + }); + private static final String NBT_PRIORITY = "Priority"; private static final String NBT_COMPARE = "Compare"; private static final String NBT_MODE = "Mode"; + private static final String NBT_TYPE = "Type"; - private BasicItemHandler filters = new BasicItemHandler(9, this); + private ItemHandlerBasic itemFilters = new ItemHandlerBasic(9, this); + private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(9, this); private int priority = 0; private int compare = 0; - private int mode = ModeConstants.WHITELIST; + private int mode = IFilterable.WHITELIST; + private int type = IType.ITEMS; - private int stored; - private int capacity; + private List itemStorages = new ArrayList<>(); + private List fluidStorages = new ArrayList<>(); - private List storages = new ArrayList(); private int lastDrawerCount; + public TileExternalStorage() { + dataManager.addWatchedParameter(PRIORITY); + dataManager.addWatchedParameter(COMPARE); + dataManager.addWatchedParameter(MODE); + dataManager.addWatchedParameter(STORED); + dataManager.addWatchedParameter(CAPACITY); + dataManager.addWatchedParameter(TYPE); + } + + @Override + public boolean canAddMicroblock(IMicroblock microblock) { + return !isBlockingMicroblock(microblock, getDirection()); + } + @Override public int getEnergyUsage() { - return RefinedStorage.INSTANCE.externalStorageUsage + (storages.size() * RefinedStorage.INSTANCE.externalStoragePerStorageUsage); + return RefinedStorage.INSTANCE.externalStorageUsage + ((itemStorages.size() + fluidStorages.size()) * RefinedStorage.INSTANCE.externalStoragePerStorageUsage); } @Override @@ -58,26 +117,36 @@ public class TileExternalStorage extends TileNode implements IStorageProvider, I updateStorage(network); - network.getStorage().rebuild(); + network.getItemStorage().rebuild(); + network.getFluidStorage().rebuild(); } @Override public void update() { if (!worldObj.isRemote && network != null) { - if (ticks % (20 * 4) == 0) { - boolean shouldRebuild = false; + boolean itemChangeDetected = false, fluidChangeDetected = false; - for (ExternalStorage storage : storages) { - if (storage.updateCache()) { - shouldRebuild = true; - } + for (ItemStorageExternal storage : itemStorages) { + if (storage.updateCache()) { + itemChangeDetected = true; } + } - if (shouldRebuild) { - network.getStorage().rebuild(); + for (FluidStorageExternal storage : fluidStorages) { + if (storage.updateCache()) { + fluidChangeDetected = true; } } + if (itemChangeDetected) { + network.getItemStorage().rebuild(); + } + + // @TODO: This is broken? + if (fluidChangeDetected) { + network.getFluidStorage().rebuild(); + } + if (getFacingTile() instanceof IDrawerGroup && lastDrawerCount != ((IDrawerGroup) getFacingTile()).getDrawerCount()) { lastDrawerCount = ((IDrawerGroup) getFacingTile()).getDrawerCount(); @@ -89,48 +158,26 @@ public class TileExternalStorage extends TileNode implements IStorageProvider, I } @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); + public void read(NBTTagCompound tag) { + super.read(tag); - buf.writeInt(priority); - buf.writeInt(getStored()); - buf.writeInt(getCapacity()); - buf.writeInt(compare); - buf.writeInt(mode); - } + readItems(itemFilters, 0, tag); + readItems(fluidFilters, 1, tag); - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - priority = buf.readInt(); - stored = buf.readInt(); - capacity = buf.readInt(); - compare = buf.readInt(); - mode = buf.readInt(); - } - - @Override - public Class getContainer() { - return ContainerStorage.class; - } - - @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); - - RefinedStorageUtils.readItems(filters, 0, nbt); - - if (nbt.hasKey(NBT_PRIORITY)) { - priority = nbt.getInteger(NBT_PRIORITY); + if (tag.hasKey(NBT_PRIORITY)) { + priority = tag.getInteger(NBT_PRIORITY); } - if (nbt.hasKey(NBT_COMPARE)) { - compare = nbt.getInteger(NBT_COMPARE); + if (tag.hasKey(NBT_COMPARE)) { + compare = tag.getInteger(NBT_COMPARE); } - if (nbt.hasKey(NBT_MODE)) { - mode = nbt.getInteger(NBT_MODE); + if (tag.hasKey(NBT_MODE)) { + mode = tag.getInteger(NBT_MODE); + } + + if (tag.hasKey(NBT_TYPE)) { + type = tag.getInteger(NBT_TYPE); } } @@ -138,11 +185,13 @@ public class TileExternalStorage extends TileNode implements IStorageProvider, I public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - RefinedStorageUtils.writeItems(filters, 0, tag); + writeItems(itemFilters, 0, tag); + writeItems(fluidFilters, 1, tag); tag.setInteger(NBT_PRIORITY, priority); tag.setInteger(NBT_COMPARE, compare); tag.setInteger(NBT_MODE, mode); + tag.setInteger(NBT_TYPE, type); return tag; } @@ -176,6 +225,7 @@ public class TileExternalStorage extends TileNode implements IStorageProvider, I return priority; } + @Override public void setPriority(int priority) { this.priority = priority; @@ -183,7 +233,8 @@ public class TileExternalStorage extends TileNode implements IStorageProvider, I } public void updateStorage(INetworkMaster network) { - storages.clear(); + itemStorages.clear(); + fluidStorages.clear(); TileEntity facing = getFacingTile(); @@ -192,27 +243,41 @@ public class TileExternalStorage extends TileNode implements IStorageProvider, I for (int i = 0; i < group.getDrawerCount(); ++i) { if (group.isDrawerEnabled(i)) { - storages.add(new DrawerStorage(this, group.getDrawer(i))); + itemStorages.add(new ItemStorageDrawer(this, group.getDrawer(i))); } } } else if (facing instanceof IDrawer) { - storages.add(new DrawerStorage(this, (IDrawer) facing)); + itemStorages.add(new ItemStorageDrawer(this, (IDrawer) facing)); } else if (facing instanceof IDeepStorageUnit) { - storages.add(new DeepStorageUnitStorage(this, (IDeepStorageUnit) facing)); + itemStorages.add(new ItemStorageDSU(this, (IDeepStorageUnit) facing)); } else { - IItemHandler handler = RefinedStorageUtils.getItemHandler(facing, getDirection().getOpposite()); + IItemHandler itemHandler = getItemHandler(facing, getDirection().getOpposite()); - if (handler != null) { - storages.add(new ItemHandlerStorage(this, handler)); + if (itemHandler != null) { + itemStorages.add(new ItemStorageItemHandler(this, itemHandler)); + } + + IFluidHandler fluidHandler = getFluidHandler(facing, getDirection().getOpposite()); + + if (fluidHandler != null) { + for (IFluidTankProperties property : fluidHandler.getTankProperties()) { + fluidStorages.add(new FluidStorageExternal(this, fluidHandler, property)); + } } } - network.getStorage().rebuild(); + network.getItemStorage().rebuild(); + network.getFluidStorage().rebuild(); } @Override - public void addStorages(List storages) { - storages.addAll(this.storages); + public void addItemStorages(List storages) { + storages.addAll(this.itemStorages); + } + + @Override + public void addFluidStorages(List storages) { + storages.addAll(this.fluidStorages); } @Override @@ -221,57 +286,63 @@ public class TileExternalStorage extends TileNode implements IStorageProvider, I } @Override - public IRedstoneModeConfig getRedstoneModeConfig() { - return this; + public TileDataParameter getRedstoneModeParameter() { + return REDSTONE_MODE; } @Override - public ICompareConfig getCompareConfig() { - return this; + public TileDataParameter getCompareParameter() { + return COMPARE; } @Override - public IModeConfig getModeConfig() { - return this; + public TileDataParameter getFilterParameter() { + return MODE; + } + + @Override + public TileDataParameter getPriorityParameter() { + return PRIORITY; } @Override public int getStored() { - if (!worldObj.isRemote) { - int stored = 0; - - for (ExternalStorage storage : storages) { - stored += storage.getStored(); - } - - return stored; - } - - return stored; + return STORED.getValue(); } @Override public int getCapacity() { - if (!worldObj.isRemote) { - int capacity = 0; - - for (ExternalStorage storage : storages) { - capacity += storage.getCapacity(); - } - - return capacity; - } - - return capacity; + return CAPACITY.getValue(); } @Override - public void onPriorityChanged(int priority) { - RefinedStorage.INSTANCE.network.sendToServer(new MessagePriorityUpdate(pos, priority)); + public TileDataParameter getTypeParameter() { + return TYPE; + } + + + @Override + public int getType() { + return worldObj.isRemote ? TYPE.getValue() : type; } @Override - public IItemHandler getFilters() { - return filters; + public void setType(int type) { + this.type = type; + + markDirty(); + } + + @Override + public IItemHandler getFilterInventory() { + return getType() == IType.ITEMS ? itemFilters : fluidFilters; + } + + public ItemHandlerBasic getItemFilters() { + return itemFilters; + } + + public ItemHandlerFluid getFluidFilters() { + return fluidFilters; } } diff --git a/src/main/java/refinedstorage/tile/grid/IGrid.java b/src/main/java/refinedstorage/tile/grid/IGrid.java index ef77bad8e..56bfd38ec 100755 --- a/src/main/java/refinedstorage/tile/grid/IGrid.java +++ b/src/main/java/refinedstorage/tile/grid/IGrid.java @@ -1,16 +1,27 @@ package refinedstorage.tile.grid; import net.minecraft.util.math.BlockPos; -import refinedstorage.api.network.IGridHandler; +import refinedstorage.api.network.grid.IFluidGridHandler; +import refinedstorage.api.network.grid.IItemGridHandler; import refinedstorage.block.EnumGridType; -import refinedstorage.tile.config.IRedstoneModeConfig; +import refinedstorage.gui.grid.GridFilteredItem; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.tile.data.TileDataParameter; + +import java.util.List; public interface IGrid { EnumGridType getType(); BlockPos getNetworkPosition(); - IGridHandler getGridHandler(); + IItemGridHandler getItemHandler(); + + IFluidGridHandler getFluidHandler(); + + String getGuiTitle(); + + int getViewType(); int getSortingType(); @@ -18,13 +29,19 @@ public interface IGrid { int getSearchBoxMode(); + void onViewTypeChanged(int type); + void onSortingTypeChanged(int type); void onSortingDirectionChanged(int direction); void onSearchBoxModeChanged(int searchBoxMode); - IRedstoneModeConfig getRedstoneModeConfig(); + List getFilteredItems(); + + ItemHandlerBasic getFilter(); + + TileDataParameter getRedstoneModeConfig(); boolean isConnected(); } diff --git a/src/main/java/refinedstorage/tile/grid/TileGrid.java b/src/main/java/refinedstorage/tile/grid/TileGrid.java index eb8145489..dc79472e0 100755 --- a/src/main/java/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/refinedstorage/tile/grid/TileGrid.java @@ -1,37 +1,115 @@ package refinedstorage.tile.grid; -import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.*; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataSerializers; import net.minecraft.util.math.BlockPos; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; import net.minecraftforge.items.wrapper.InvWrapper; import refinedstorage.RefinedStorage; import refinedstorage.RefinedStorageBlocks; import refinedstorage.RefinedStorageItems; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.api.network.IGridHandler; +import refinedstorage.api.network.NetworkUtils; +import refinedstorage.api.network.grid.IFluidGridHandler; +import refinedstorage.api.network.grid.IItemGridHandler; +import refinedstorage.api.storage.CompareUtils; import refinedstorage.block.BlockGrid; import refinedstorage.block.EnumGridType; import refinedstorage.container.ContainerGrid; -import refinedstorage.inventory.BasicItemHandler; -import refinedstorage.inventory.BasicItemValidator; +import refinedstorage.gui.grid.GridFilteredItem; +import refinedstorage.gui.grid.GuiGrid; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerGridFilterInGrid; +import refinedstorage.inventory.ItemValidatorBasic; import refinedstorage.item.ItemPattern; -import refinedstorage.network.MessageGridSettingsUpdate; import refinedstorage.tile.TileNode; -import refinedstorage.tile.config.IRedstoneModeConfig; +import refinedstorage.tile.data.ITileDataConsumer; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataManager; +import refinedstorage.tile.data.TileDataParameter; import java.util.ArrayList; import java.util.List; public class TileGrid extends TileNode implements IGrid { - private static final String NBT_SORTING_DIRECTION = "SortingDirection"; - private static final String NBT_SORTING_TYPE = "SortingType"; - private static final String NBT_SEARCH_BOX_MODE = "SearchBoxMode"; + public static final TileDataParameter VIEW_TYPE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileGrid tile) { + return tile.viewType; + } + }, new ITileDataConsumer() { + @Override + public void setValue(TileGrid tile, Integer value) { + if (isValidViewType(value)) { + tile.viewType = value; + + tile.markDirty(); + } + } + }, parameter -> GuiGrid.markForSorting()); + + public static final TileDataParameter SORTING_DIRECTION = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileGrid tile) { + return tile.sortingDirection; + } + }, new ITileDataConsumer() { + @Override + public void setValue(TileGrid tile, Integer value) { + if (isValidSortingDirection(value)) { + tile.sortingDirection = value; + + tile.markDirty(); + } + } + }, parameter -> GuiGrid.markForSorting()); + + public static final TileDataParameter SORTING_TYPE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileGrid tile) { + return tile.sortingType; + } + }, new ITileDataConsumer() { + @Override + public void setValue(TileGrid tile, Integer value) { + if (isValidSortingType(value)) { + tile.sortingType = value; + + tile.markDirty(); + } + } + }, parameter -> GuiGrid.markForSorting()); + + public static final TileDataParameter SEARCH_BOX_MODE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { + @Override + public Integer getValue(TileGrid tile) { + return tile.searchBoxMode; + } + }, new ITileDataConsumer() { + @Override + public void setValue(TileGrid tile, Integer value) { + if (isValidSearchBoxMode(value)) { + tile.searchBoxMode = value; + + tile.markDirty(); + } + } + }, parameter -> { + if (Minecraft.getMinecraft().currentScreen instanceof GuiGrid) { + ((GuiGrid) Minecraft.getMinecraft().currentScreen).updateSearchFieldFocus(parameter.getValue()); + } + }); + + public static final String NBT_VIEW_TYPE = "ViewType"; + public static final String NBT_SORTING_DIRECTION = "SortingDirection"; + public static final String NBT_SORTING_TYPE = "SortingType"; + public static final String NBT_SEARCH_BOX_MODE = "SearchBoxMode"; public static final int SORTING_DIRECTION_ASCENDING = 0; public static final int SORTING_DIRECTION_DESCENDING = 1; @@ -44,6 +122,10 @@ public class TileGrid extends TileNode implements IGrid { public static final int SEARCH_BOX_MODE_JEI_SYNCHRONIZED = 2; public static final int SEARCH_BOX_MODE_JEI_SYNCHRONIZED_AUTOSELECTED = 3; + public static final int VIEW_TYPE_NORMAL = 0; + public static final int VIEW_TYPE_NON_CRAFTABLES = 1; + public static final int VIEW_TYPE_CRAFTABLES = 2; + private Container craftingContainer = new Container() { @Override public boolean canInteractWith(EntityPlayer player) { @@ -58,14 +140,24 @@ public class TileGrid extends TileNode implements IGrid { private InventoryCrafting matrix = new InventoryCrafting(craftingContainer, 3, 3); private InventoryCraftResult result = new InventoryCraftResult(); - private BasicItemHandler patterns = new BasicItemHandler(2, this, new BasicItemValidator(RefinedStorageItems.PATTERN)); + private ItemHandlerBasic patterns = new ItemHandlerBasic(2, this, new ItemValidatorBasic(RefinedStorageItems.PATTERN)); + private List filteredItems = new ArrayList<>(); + private ItemHandlerGridFilterInGrid filter = new ItemHandlerGridFilterInGrid(filteredItems); private EnumGridType type; + private int viewType = VIEW_TYPE_NORMAL; private int sortingDirection = SORTING_DIRECTION_DESCENDING; private int sortingType = SORTING_TYPE_NAME; private int searchBoxMode = SEARCH_BOX_MODE_NORMAL; + public TileGrid() { + dataManager.addWatchedParameter(VIEW_TYPE); + dataManager.addWatchedParameter(SORTING_DIRECTION); + dataManager.addWatchedParameter(SORTING_TYPE); + dataManager.addWatchedParameter(SEARCH_BOX_MODE); + } + @Override public int getEnergyUsage() { switch (getType()) { @@ -75,6 +167,8 @@ public class TileGrid extends TileNode implements IGrid { return RefinedStorage.INSTANCE.craftingGridUsage; case PATTERN: return RefinedStorage.INSTANCE.patternGridUsage; + case FLUID: + return RefinedStorage.INSTANCE.fluidGridUsage; default: return 0; } @@ -99,13 +193,27 @@ public class TileGrid extends TileNode implements IGrid { public void onGridOpened(EntityPlayer player) { if (isConnected()) { - network.sendStorageToClient((EntityPlayerMP) player); + if (getType() == EnumGridType.FLUID) { + network.sendFluidStorageToClient((EntityPlayerMP) player); + } else { + network.sendItemStorageToClient((EntityPlayerMP) player); + } } } @Override - public IGridHandler getGridHandler() { - return isConnected() ? network.getGridHandler() : null; + public IItemGridHandler getItemHandler() { + return isConnected() ? network.getItemGridHandler() : null; + } + + @Override + public IFluidGridHandler getFluidHandler() { + return isConnected() ? network.getFluidGridHandler() : null; + } + + @Override + public String getGuiTitle() { + return getType() == EnumGridType.FLUID ? "gui.refinedstorage:fluid_grid" : "gui.refinedstorage:grid"; } public InventoryCrafting getMatrix() { @@ -120,6 +228,16 @@ public class TileGrid extends TileNode implements IGrid { return patterns; } + @Override + public ItemHandlerBasic getFilter() { + return filter; + } + + @Override + public List getFilteredItems() { + return filteredItems; + } + public void onCraftingMatrixChanged() { markDirty(); @@ -145,7 +263,7 @@ public class TileGrid extends TileNode implements IGrid { } else { if (slot != null) { if (slot.stackSize == 1 && isConnected()) { - matrix.setInventorySlotContents(i, RefinedStorageUtils.extractItem(network, slot, 1)); + matrix.setInventorySlotContents(i, NetworkUtils.extractItem(network, slot, 1)); } else { matrix.decrStackSize(i, 1); } @@ -157,7 +275,7 @@ public class TileGrid extends TileNode implements IGrid { } public void onCraftedShift(ContainerGrid container, EntityPlayer player) { - List craftedItemsList = new ArrayList(); + List craftedItemsList = new ArrayList<>(); int craftedItems = 0; ItemStack crafted = result.getStackInSlot(0); @@ -168,7 +286,7 @@ public class TileGrid extends TileNode implements IGrid { craftedItems += crafted.stackSize; - if (!RefinedStorageUtils.compareStack(crafted, result.getStackInSlot(0)) || craftedItems + crafted.stackSize > crafted.getMaxStackSize()) { + if (!CompareUtils.compareStack(crafted, result.getStackInSlot(0)) || craftedItems + crafted.stackSize > crafted.getMaxStackSize()) { break; } } @@ -239,7 +357,7 @@ public class TileGrid extends TileNode implements IGrid { if (getType() == EnumGridType.CRAFTING) { for (ItemStack possibility : possibilities) { - ItemStack took = RefinedStorageUtils.extractItem(network, possibility, 1); + ItemStack took = NetworkUtils.extractItem(network, possibility, 1); if (took != null) { matrix.setInventorySlotContents(i, took); @@ -255,73 +373,73 @@ public class TileGrid extends TileNode implements IGrid { } } + @Override + public int getViewType() { + return worldObj.isRemote ? VIEW_TYPE.getValue() : viewType; + } + + @Override public int getSortingDirection() { - return sortingDirection; - } - - public void setSortingDirection(int sortingDirection) { - this.sortingDirection = sortingDirection; - - markDirty(); + return worldObj.isRemote ? SORTING_DIRECTION.getValue() : sortingDirection; } + @Override public int getSortingType() { - return sortingType; - } - - public void setSortingType(int sortingType) { - this.sortingType = sortingType; - - markDirty(); + return worldObj.isRemote ? SORTING_TYPE.getValue() : sortingType; } + @Override public int getSearchBoxMode() { - return searchBoxMode; + return worldObj.isRemote ? SEARCH_BOX_MODE.getValue() : searchBoxMode; } - public void setSearchBoxMode(int searchBoxMode) { - this.searchBoxMode = searchBoxMode; - - markDirty(); + @Override + public void onViewTypeChanged(int type) { + TileDataManager.setParameter(VIEW_TYPE, type); } @Override public void onSortingTypeChanged(int type) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageGridSettingsUpdate(this, sortingDirection, type, searchBoxMode)); + TileDataManager.setParameter(SORTING_TYPE, type); } @Override public void onSortingDirectionChanged(int direction) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageGridSettingsUpdate(this, direction, sortingType, searchBoxMode)); + TileDataManager.setParameter(SORTING_DIRECTION, direction); } @Override public void onSearchBoxModeChanged(int searchBoxMode) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageGridSettingsUpdate(this, sortingDirection, sortingType, searchBoxMode)); + TileDataManager.setParameter(SEARCH_BOX_MODE, searchBoxMode); } @Override - public IRedstoneModeConfig getRedstoneModeConfig() { - return this; + public TileDataParameter getRedstoneModeConfig() { + return REDSTONE_MODE; } @Override - public void read(NBTTagCompound nbt) { - super.read(nbt); + public void read(NBTTagCompound tag) { + super.read(tag); - RefinedStorageUtils.readItemsLegacy(matrix, 0, nbt); - RefinedStorageUtils.readItems(patterns, 1, nbt); + readItemsLegacy(matrix, 0, tag); + readItems(patterns, 1, tag); + readItems(filter, 2, tag); - if (nbt.hasKey(NBT_SORTING_DIRECTION)) { - sortingDirection = nbt.getInteger(NBT_SORTING_DIRECTION); + if (tag.hasKey(NBT_VIEW_TYPE)) { + viewType = tag.getInteger(NBT_VIEW_TYPE); } - if (nbt.hasKey(NBT_SORTING_TYPE)) { - sortingType = nbt.getInteger(NBT_SORTING_TYPE); + if (tag.hasKey(NBT_SORTING_DIRECTION)) { + sortingDirection = tag.getInteger(NBT_SORTING_DIRECTION); } - if (nbt.hasKey(NBT_SEARCH_BOX_MODE)) { - searchBoxMode = nbt.getInteger(NBT_SEARCH_BOX_MODE); + if (tag.hasKey(NBT_SORTING_TYPE)) { + sortingType = tag.getInteger(NBT_SORTING_TYPE); + } + + if (tag.hasKey(NBT_SEARCH_BOX_MODE)) { + searchBoxMode = tag.getInteger(NBT_SEARCH_BOX_MODE); } } @@ -329,9 +447,11 @@ public class TileGrid extends TileNode implements IGrid { public NBTTagCompound write(NBTTagCompound tag) { super.write(tag); - RefinedStorageUtils.writeItemsLegacy(matrix, 0, tag); - RefinedStorageUtils.writeItems(patterns, 1, tag); + writeItemsLegacy(matrix, 0, tag); + writeItems(patterns, 1, tag); + writeItems(filter, 2, tag); + tag.setInteger(NBT_VIEW_TYPE, viewType); tag.setInteger(NBT_SORTING_DIRECTION, sortingDirection); tag.setInteger(NBT_SORTING_TYPE, sortingType); tag.setInteger(NBT_SEARCH_BOX_MODE, searchBoxMode); @@ -340,42 +460,23 @@ public class TileGrid extends TileNode implements IGrid { } @Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - buf.writeBoolean(isConnected()); - buf.writeInt(sortingDirection); - buf.writeInt(sortingType); - buf.writeInt(searchBoxMode); - } - - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - connected = buf.readBoolean(); - sortingDirection = buf.readInt(); - sortingType = buf.readInt(); - searchBoxMode = buf.readInt(); - } - - @Override - public Class getContainer() { - return ContainerGrid.class; - } - - @Override - public IItemHandler getDroppedItems() { + public IItemHandler getDrops() { switch (getType()) { case CRAFTING: - return new InvWrapper(matrix); + return new CombinedInvWrapper(filter, new InvWrapper(matrix)); case PATTERN: - return patterns; + return new CombinedInvWrapper(filter, patterns); default: - return null; + return new CombinedInvWrapper(filter); } } + public static boolean isValidViewType(int type) { + return type == VIEW_TYPE_NORMAL || + type == VIEW_TYPE_CRAFTABLES || + type == VIEW_TYPE_NON_CRAFTABLES; + } + public static boolean isValidSearchBoxMode(int mode) { return mode == SEARCH_BOX_MODE_NORMAL || mode == SEARCH_BOX_MODE_NORMAL_AUTOSELECTED || diff --git a/src/main/java/refinedstorage/tile/grid/WirelessGrid.java b/src/main/java/refinedstorage/tile/grid/WirelessGrid.java index 7379b1879..0cdd1722a 100755 --- a/src/main/java/refinedstorage/tile/grid/WirelessGrid.java +++ b/src/main/java/refinedstorage/tile/grid/WirelessGrid.java @@ -2,34 +2,76 @@ package refinedstorage.tile.grid; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import refinedstorage.RefinedStorage; -import refinedstorage.RefinedStorageUtils; -import refinedstorage.api.network.IGridHandler; +import refinedstorage.api.network.grid.IFluidGridHandler; +import refinedstorage.api.network.grid.IItemGridHandler; import refinedstorage.block.EnumGridType; +import refinedstorage.gui.grid.GridFilteredItem; +import refinedstorage.gui.grid.GuiGrid; +import refinedstorage.inventory.ItemHandlerBasic; +import refinedstorage.inventory.ItemHandlerGridFilterInGrid; import refinedstorage.item.ItemWirelessGrid; import refinedstorage.network.MessageWirelessGridSettingsUpdate; -import refinedstorage.tile.config.IRedstoneModeConfig; -import refinedstorage.tile.controller.TileController; +import refinedstorage.tile.TileBase; +import refinedstorage.tile.TileController; +import refinedstorage.tile.data.TileDataParameter; + +import java.util.ArrayList; +import java.util.List; public class WirelessGrid implements IGrid { - private EnumHand hand; private World world; - private BlockPos controllerPos; + + private ItemStack stack; + + private BlockPos controller; + + private int viewType; private int sortingType; private int sortingDirection; private int searchBoxMode; - public WirelessGrid(World world, ItemStack stack, EnumHand hand) { - this.hand = hand; + private List filteredItems = new ArrayList<>(); + private ItemHandlerGridFilterInGrid filter = new ItemHandlerGridFilterInGrid(filteredItems) { + @Override + protected void onContentsChanged(int slot) { + super.onContentsChanged(slot); + + if (!world.isRemote) { + if (!stack.hasTagCompound()) { + stack.setTagCompound(new NBTTagCompound()); + } + + TileBase.writeItems(this, slot, stack.getTagCompound()); + } + } + }; + + public WirelessGrid(World world, ItemStack stack) { this.world = world; - this.controllerPos = new BlockPos(ItemWirelessGrid.getX(stack), ItemWirelessGrid.getY(stack), ItemWirelessGrid.getZ(stack)); + + this.stack = stack; + + this.controller = new BlockPos(ItemWirelessGrid.getX(stack), ItemWirelessGrid.getY(stack), ItemWirelessGrid.getZ(stack)); + + this.viewType = ItemWirelessGrid.getViewType(stack); this.sortingType = ItemWirelessGrid.getSortingType(stack); this.sortingDirection = ItemWirelessGrid.getSortingDirection(stack); this.searchBoxMode = ItemWirelessGrid.getSearchBoxMode(stack); + + if (stack.hasTagCompound()) { + for (int i = 0; i < 4; ++i) { + TileBase.readItems(filter, i, stack.getTagCompound()); + } + } + } + + public ItemStack getStack() { + return stack; } @Override @@ -39,28 +81,29 @@ public class WirelessGrid implements IGrid { @Override public BlockPos getNetworkPosition() { - return controllerPos; + return controller; } @Override - public IGridHandler getGridHandler() { + public IItemGridHandler getItemHandler() { TileController controller = getController(); - return controller != null ? controller.getGridHandler() : null; + return controller != null ? controller.getItemGridHandler() : null; } - public void onClose(EntityPlayer player) { - TileController controller = getController(); - - if (controller != null) { - controller.getWirelessGridHandler().onClose(player); - } + @Override + public IFluidGridHandler getFluidHandler() { + return null; } - private TileController getController() { - TileEntity tile = world.getTileEntity(controllerPos); + @Override + public String getGuiTitle() { + return "gui.refinedstorage:wireless_grid"; + } - return tile instanceof TileController ? (TileController) tile : null; + @Override + public int getViewType() { + return viewType; } @Override @@ -78,29 +121,52 @@ public class WirelessGrid implements IGrid { return searchBoxMode; } + @Override + public void onViewTypeChanged(int type) { + RefinedStorage.INSTANCE.network.sendToServer(new MessageWirelessGridSettingsUpdate(type, getSortingDirection(), getSortingType(), getSearchBoxMode())); + + this.viewType = type; + + GuiGrid.markForSorting(); + } + @Override public void onSortingTypeChanged(int type) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageWirelessGridSettingsUpdate(RefinedStorageUtils.getIdFromHand(hand), getSortingDirection(), type, getSearchBoxMode())); + RefinedStorage.INSTANCE.network.sendToServer(new MessageWirelessGridSettingsUpdate(getViewType(), getSortingDirection(), type, getSearchBoxMode())); this.sortingType = type; + + GuiGrid.markForSorting(); } @Override public void onSortingDirectionChanged(int direction) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageWirelessGridSettingsUpdate(RefinedStorageUtils.getIdFromHand(hand), direction, getSortingType(), getSearchBoxMode())); + RefinedStorage.INSTANCE.network.sendToServer(new MessageWirelessGridSettingsUpdate(getViewType(), direction, getSortingType(), getSearchBoxMode())); this.sortingDirection = direction; + + GuiGrid.markForSorting(); } @Override public void onSearchBoxModeChanged(int searchBoxMode) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageWirelessGridSettingsUpdate(RefinedStorageUtils.getIdFromHand(hand), getSortingDirection(), getSortingType(), searchBoxMode)); + RefinedStorage.INSTANCE.network.sendToServer(new MessageWirelessGridSettingsUpdate(getViewType(), getSortingDirection(), getSortingType(), searchBoxMode)); this.searchBoxMode = searchBoxMode; } @Override - public IRedstoneModeConfig getRedstoneModeConfig() { + public List getFilteredItems() { + return filteredItems; + } + + @Override + public ItemHandlerBasic getFilter() { + return filter; + } + + @Override + public TileDataParameter getRedstoneModeConfig() { return null; } @@ -108,4 +174,18 @@ public class WirelessGrid implements IGrid { public boolean isConnected() { return true; } + + public void onClose(EntityPlayer player) { + TileController controller = getController(); + + if (controller != null) { + controller.getWirelessGridHandler().onClose(player); + } + } + + private TileController getController() { + TileEntity tile = world.getTileEntity(controller); + + return tile instanceof TileController ? (TileController) tile : null; + } } diff --git a/src/main/resources/assets/refinedstorage/blockstates/constructor.json b/src/main/resources/assets/refinedstorage/blockstates/constructor.json index 147bb6734..5af28062c 100755 --- a/src/main/resources/assets/refinedstorage/blockstates/constructor.json +++ b/src/main/resources/assets/refinedstorage/blockstates/constructor.json @@ -5,7 +5,7 @@ "all": "refinedstorage:blocks/cable", "particle": "refinedstorage:blocks/cable", "front": "refinedstorage:blocks/constructor", - "line": "refinedstorage:blocks/importer_exporter_external_storage" + "line": "refinedstorage:blocks/cable_part" }, "model": "refinedstorage:cable_core", "uvlock": true diff --git a/src/main/resources/assets/refinedstorage/blockstates/destructor.json b/src/main/resources/assets/refinedstorage/blockstates/destructor.json index b8f2b82f7..e625d0e07 100755 --- a/src/main/resources/assets/refinedstorage/blockstates/destructor.json +++ b/src/main/resources/assets/refinedstorage/blockstates/destructor.json @@ -5,7 +5,7 @@ "all": "refinedstorage:blocks/cable", "particle": "refinedstorage:blocks/cable", "front": "refinedstorage:blocks/destructor", - "line": "refinedstorage:blocks/importer_exporter_external_storage" + "line": "refinedstorage:blocks/cable_part" }, "model": "refinedstorage:cable_core", "uvlock": true diff --git a/src/main/resources/assets/refinedstorage/blockstates/exporter.json b/src/main/resources/assets/refinedstorage/blockstates/exporter.json index 8cb54ce29..a0f233ebd 100755 --- a/src/main/resources/assets/refinedstorage/blockstates/exporter.json +++ b/src/main/resources/assets/refinedstorage/blockstates/exporter.json @@ -4,7 +4,7 @@ "textures": { "all": "refinedstorage:blocks/cable", "particle": "refinedstorage:blocks/cable", - "line": "refinedstorage:blocks/importer_exporter_external_storage" + "line": "refinedstorage:blocks/cable_part" }, "model": "refinedstorage:cable_core", "uvlock": true diff --git a/src/main/resources/assets/refinedstorage/blockstates/external_storage.json b/src/main/resources/assets/refinedstorage/blockstates/external_storage.json index d5499367e..adf5b62a1 100755 --- a/src/main/resources/assets/refinedstorage/blockstates/external_storage.json +++ b/src/main/resources/assets/refinedstorage/blockstates/external_storage.json @@ -4,7 +4,7 @@ "textures": { "all": "refinedstorage:blocks/cable", "particle": "refinedstorage:blocks/cable", - "line": "refinedstorage:blocks/importer_exporter_external_storage" + "line": "refinedstorage:blocks/cable_part" }, "model": "refinedstorage:cable_core", "uvlock": true diff --git a/src/main/resources/assets/refinedstorage/blockstates/fluid_interface.json b/src/main/resources/assets/refinedstorage/blockstates/fluid_interface.json new file mode 100755 index 000000000..e51a496b8 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/blockstates/fluid_interface.json @@ -0,0 +1,25 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "cube_all", + "textures": { + "all": "refinedstorage:blocks/fluid_interface_disconnected" + } + }, + "variants": { + "inventory": [ + { + "transform": "forge:default-block" + } + ], + "connected": { + "true": { + "textures": { + "all": "refinedstorage:blocks/fluid_interface_connected" + } + }, + "false": { + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/blockstates/fluid_storage.json b/src/main/resources/assets/refinedstorage/blockstates/fluid_storage.json new file mode 100755 index 000000000..a6dfa7feb --- /dev/null +++ b/src/main/resources/assets/refinedstorage/blockstates/fluid_storage.json @@ -0,0 +1,36 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "cube_all", + "transform": "forge:default-block" + }, + "variants": { + "type": { + "64k": { + "textures": { + "all": "refinedstorage:blocks/64k_fluid_storage_block" + } + }, + "128k": { + "textures": { + "all": "refinedstorage:blocks/128k_fluid_storage_block" + } + }, + "256k": { + "textures": { + "all": "refinedstorage:blocks/256k_fluid_storage_block" + } + }, + "512k": { + "textures": { + "all": "refinedstorage:blocks/512k_fluid_storage_block" + } + }, + "creative": { + "textures": { + "all": "refinedstorage:blocks/creative_fluid_storage_block" + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/blockstates/importer.json b/src/main/resources/assets/refinedstorage/blockstates/importer.json index a131e1e27..ccbadf616 100755 --- a/src/main/resources/assets/refinedstorage/blockstates/importer.json +++ b/src/main/resources/assets/refinedstorage/blockstates/importer.json @@ -4,7 +4,7 @@ "textures": { "all": "refinedstorage:blocks/cable", "particle": "refinedstorage:blocks/cable", - "line": "refinedstorage:blocks/importer_exporter_external_storage" + "line": "refinedstorage:blocks/cable_part" }, "model": "refinedstorage:cable_core", "uvlock": true diff --git a/src/main/resources/assets/refinedstorage/blockstates/network_receiver.json b/src/main/resources/assets/refinedstorage/blockstates/network_receiver.json new file mode 100755 index 000000000..774d8c95a --- /dev/null +++ b/src/main/resources/assets/refinedstorage/blockstates/network_receiver.json @@ -0,0 +1,25 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "cube_all", + "textures": { + "all": "refinedstorage:blocks/network_receiver_disconnected" + } + }, + "variants": { + "inventory": [ + { + "transform": "forge:default-block" + } + ], + "connected": { + "true": { + "textures": { + "all": "refinedstorage:blocks/network_receiver_connected" + } + }, + "false": { + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/blockstates/network_transmitter.json b/src/main/resources/assets/refinedstorage/blockstates/network_transmitter.json new file mode 100755 index 000000000..86e56d08f --- /dev/null +++ b/src/main/resources/assets/refinedstorage/blockstates/network_transmitter.json @@ -0,0 +1,25 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "cube_all", + "textures": { + "all": "refinedstorage:blocks/network_transmitter_disconnected" + } + }, + "variants": { + "inventory": [ + { + "transform": "forge:default-block" + } + ], + "connected": { + "true": { + "textures": { + "all": "refinedstorage:blocks/network_transmitter_connected" + } + }, + "false": { + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/lang/de_DE.lang b/src/main/resources/assets/refinedstorage/lang/de_DE.lang new file mode 100755 index 000000000..c53c918bc --- /dev/null +++ b/src/main/resources/assets/refinedstorage/lang/de_DE.lang @@ -0,0 +1,160 @@ +itemGroup.refinedstorage=Refined Storage + +gui.refinedstorage:controller.0=Controller +gui.refinedstorage:controller.1=Kreativmodus Controller +gui.refinedstorage:controller.machine_amount=%dx +gui.refinedstorage:grid=Zugangspunkt +gui.refinedstorage:grid.craft=Craften +gui.refinedstorage:grid.pattern_create=Erstelle Schema +gui.refinedstorage:wireless_grid=Kabelloser Zugangspunkt +gui.refinedstorage:disk_drive=Laufwerk +gui.refinedstorage:external_storage=Externe Speicherverbindung +gui.refinedstorage:importer=Import-Kabel +gui.refinedstorage:exporter=Export-Kabel +gui.refinedstorage:detector=Detektor +gui.refinedstorage:solderer=Lötmaschiene +gui.refinedstorage:solderer.progress=%d%% +gui.refinedstorage:destructor=Block-Zerstörer +gui.refinedstorage:constructor=Block-Platzierer +gui.refinedstorage:relay=Relais +gui.refinedstorage:interface.import=Eingang +gui.refinedstorage:interface.export=Ausgang +gui.refinedstorage:crafting_monitor=Craftingprozess Überwachung +gui.refinedstorage:crafting_monitor.missing_items=Fehlende Items +gui.refinedstorage:crafting_monitor.items_crafting=Items werden gecraftet +gui.refinedstorage:crafting_monitor.items_processing=Items werden verarbeitet +gui.refinedstorage:crafting_monitor.not_started_yet=Noch nicht gestartet +gui.refinedstorage:wireless_transmitter=Kabelloser Übermittler +gui.refinedstorage:wireless_transmitter.distance=%d Blöcke +gui.refinedstorage:crafter=Crafter +gui.refinedstorage:crafter.processing=Verarbeitung +gui.refinedstorage:processing_pattern_encoder=Schema Anfertigung +gui.refinedstorage:processing_pattern_encoder.pattern_create=Kreatives Schema +gui.refinedstorage:grid_filter=Zugangspunkt Filter +gui.refinedstorage:grid_filter.compare_damage=Schaden +gui.refinedstorage:grid_filter.compare_nbt=NBT +gui.refinedstorage:network_transmitter=Netzwerk Übermittler +gui.refinedstorage:network_transmitter.distance=%d Blöcke +gui.refinedstorage:network_transmitter.dimension=Dimension %d +gui.refinedstorage:network_transmitter.missing_card=Netzwerkkarte fehlt +gui.refinedstorage:network_transmitter.missing_upgrade=Erweiterung fehlt + +misc.refinedstorage:energy_stored=%d / %d RS +misc.refinedstorage:energy_usage=Verbrauch: %d RS/t +misc.refinedstorage:energy_usage_minimal=%d RS/t + +misc.refinedstorage:storage.stored=Stored: %d +misc.refinedstorage:storage.stored_capacity=Gespeichert: %d / %d +misc.refinedstorage:storage.stored_minimal=%d +misc.refinedstorage:storage.stored_capacity_minimal=%d / %d +misc.refinedstorage:storage.full=%d%% voll + +misc.refinedstorage:wireless_grid.tooltip=Verbunden mit %d, %d, %d. +misc.refinedstorage:wireless_grid.out_of_range=Es gibt keine Verbindung zu einem kabellosen Übermittler. +misc.refinedstorage:wireless_grid.not_found=Controller konnte nicht gefunden werden. + +misc.refinedstorage:network_card.tooltip=Verbunden mit %d, %d, %d. + +misc.refinedstorage:pattern.inputs=Eingänge +misc.refinedstorage:pattern.outputs=Ausgänge + +misc.refinedstorage:start=Start +misc.refinedstorage:clear=Frei machen +misc.refinedstorage:cancel_all=Alles abbrechen +misc.refinedstorage:priority=Priorität + +sidebutton.refinedstorage:compare.1=Schaden vergleichen +sidebutton.refinedstorage:compare.2=NBT vergleichen + +sidebutton.refinedstorage:redstone_mode=Redstone Modus +sidebutton.refinedstorage:redstone_mode.0=Ignoriert Redstone-Signale +sidebutton.refinedstorage:redstone_mode.1=Funktioniert nur mit Redstone-Signal +sidebutton.refinedstorage:redstone_mode.2=Funktioniert nur ohne Redstone-Signal + +sidebutton.refinedstorage:grid.view_type=Anzeigen +sidebutton.refinedstorage:grid.view_type.0=Alles +sidebutton.refinedstorage:grid.view_type.1=Uncraftbares +sidebutton.refinedstorage:grid.view_type.2=Nur Craftbares +sidebutton.refinedstorage:grid.sorting.direction=Sortierrichtung +sidebutton.refinedstorage:grid.sorting.direction.0=Aufsteigend +sidebutton.refinedstorage:grid.sorting.direction.1=Absteigend +sidebutton.refinedstorage:grid.sorting.type=Sortieren nach +sidebutton.refinedstorage:grid.sorting.type.0=Anzahl +sidebutton.refinedstorage:grid.sorting.type.1=Name +sidebutton.refinedstorage:grid.search_box_mode=Suchbox Modus +sidebutton.refinedstorage:grid.search_box_mode.0=Normal +sidebutton.refinedstorage:grid.search_box_mode.1=Normal (automatisch Ausgewählt) +sidebutton.refinedstorage:grid.search_box_mode.2=Synchronisiert mit JEI +sidebutton.refinedstorage:grid.search_box_mode.3=Synchronisiert mit JEI (automatisch Ausgewählt) + +sidebutton.refinedstorage:mode=Modus +sidebutton.refinedstorage:mode.whitelist=Zugelassene Items +sidebutton.refinedstorage:mode.blacklist=Verbotene Items + +sidebutton.refinedstorage:detector.mode=Modus +sidebutton.refinedstorage:detector.mode.0=Signal geben, wenn Wert unterschritten wird +sidebutton.refinedstorage:detector.mode.1=Signal geben, wenn genauer Wert erreicht wird +sidebutton.refinedstorage:detector.mode.2=Signal geben, wenn Wert überschritten wird + +block.refinedstorage:controller.0.name=Controller +block.refinedstorage:controller.1.name=Kreativer Controller +block.refinedstorage:cable.name=Kabel +block.refinedstorage:grid.0.name=Zugangspunkt +block.refinedstorage:grid.1.name=Zugangspunkt - Crafting +block.refinedstorage:grid.2.name=Zugangspunkt - Schema Anfertigung +block.refinedstorage:disk_drive.name=Laufwerk +block.refinedstorage:external_storage.name=Externe Speicherverbindung +block.refinedstorage:importer.name=Import-Kabel +block.refinedstorage:exporter.name=Export-Kabel +block.refinedstorage:detector.name=Detektor +block.refinedstorage:machine_casing.name=Maschienengehäuse +block.refinedstorage:solderer.name=Lötmaschiene +block.refinedstorage:destructor.name=Block-Zerstörer +block.refinedstorage:constructor.name=Block-Platzierer +block.refinedstorage:storage.0.name=1Tsd. Speicherblock +block.refinedstorage:storage.1.name=4Tsd. Speicherblock +block.refinedstorage:storage.2.name=16Tsd. Speicherblock +block.refinedstorage:storage.3.name=64Tsd. Speicherblock +block.refinedstorage:storage.4.name=Kreativer Speicherblock +block.refinedstorage:relay.name=Relais +block.refinedstorage:interface.name=Schnittstelle +block.refinedstorage:crafting_monitor.name=Craftingprozess Überwachung +block.refinedstorage:wireless_transmitter.name=Kabelloser Übermittler +block.refinedstorage:crafter.name=Crafter +block.refinedstorage:processing_pattern_encoder.name=Anfertigung für Verarbeitungs Schemata +block.refinedstorage:network_receiver.name=Netzwerk Empfänger +block.refinedstorage:network_transmitter.name=Network Übermittler + +item.refinedstorage:storage_disk.0.name=1Tsd. Speicherkarte +item.refinedstorage:storage_disk.1.name=4Tsd. Speicherkarte +item.refinedstorage:storage_disk.2.name=16Tsd. Speicherkarte +item.refinedstorage:storage_disk.3.name=64Tsd. Speicherkarte +item.refinedstorage:storage_disk.4.name=Kreative Speicherkarte +item.refinedstorage:storage_disk.5.name=Speicherkarte debuggen +item.refinedstorage:wireless_grid.0.name=Kabelloses Zugangsgerät +item.refinedstorage:wireless_grid.1.name=Kreatives kabelloses Zugangsgerät +item.refinedstorage:quartz_enriched_iron.name=Quartzeisenbarren +item.refinedstorage:core.0.name=Erschaffungskern +item.refinedstorage:core.1.name=Zerstörungskern +item.refinedstorage:silicon.name=Silizium +item.refinedstorage:processor.0.name=Einfacher Prozessor (vorgepresst) +item.refinedstorage:processor.1.name=Verbesserter Prozessor (vorgepresst) +item.refinedstorage:processor.2.name=Fortgeschrittener Prozessor (vorgepresst) +item.refinedstorage:processor.3.name=Einfacher Prozessor +item.refinedstorage:processor.4.name=Verbesserter Prozessor +item.refinedstorage:processor.5.name=Fortgeschrittener Prozessor +item.refinedstorage:processor.6.name=Gepresstes Silizium +item.refinedstorage:storage_part.0.name=1Tsd. Speicherzelle +item.refinedstorage:storage_part.1.name=4Tsd. Speicherzelle +item.refinedstorage:storage_part.2.name=16Tsd. Speicherzelle +item.refinedstorage:storage_part.3.name=64Tsd. Speicherzelle +item.refinedstorage:pattern.name=Schema +item.refinedstorage:upgrade.0.name=Erweiterung +item.refinedstorage:upgrade.1.name=Erweiterung für Reichweite +item.refinedstorage:upgrade.2.name=Erweiterung für Geschwindigkeit +item.refinedstorage:upgrade.3.name=Erweiterung für Crafting +item.refinedstorage:upgrade.4.name=Gebündelte Erweiterung +item.refinedstorage:upgrade.5.name=Überdimensionales Upgrade +item.refinedstorage:storage_housing.name=Speicherzellen-Hülle +item.refinedstorage:grid_filter.name=Schema Filter +item.refinedstorage:network_card.name=Netzwerkkarte \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index 4b0efcd39..d9a0dbaad 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -7,6 +7,7 @@ gui.refinedstorage:grid=Grid gui.refinedstorage:grid.craft=Craft gui.refinedstorage:grid.pattern_create=Create Pattern gui.refinedstorage:wireless_grid=Wireless Grid +gui.refinedstorage:fluid_grid=Fluid Grid gui.refinedstorage:disk_drive=Drive gui.refinedstorage:external_storage=External Storage gui.refinedstorage:importer=Importer @@ -30,6 +31,17 @@ gui.refinedstorage:crafter=Crafter gui.refinedstorage:crafter.processing=Processing gui.refinedstorage:processing_pattern_encoder=Processing Pattern Encoder gui.refinedstorage:processing_pattern_encoder.pattern_create=Create Pattern +gui.refinedstorage:grid_filter=Grid Filter +gui.refinedstorage:grid_filter.compare_damage=Damage +gui.refinedstorage:grid_filter.compare_nbt=NBT +gui.refinedstorage:network_transmitter=Network Transmitter +gui.refinedstorage:network_transmitter.distance=%d blocks +gui.refinedstorage:network_transmitter.dimension=Dimension %d +gui.refinedstorage:network_transmitter.missing_card=Missing Network Card +gui.refinedstorage:network_transmitter.missing_upgrade=Insert upgrade +gui.refinedstorage:fluid_interface=Fluid Interface +gui.refinedstorage:fluid_interface.in=In +gui.refinedstorage:fluid_interface.out=Out misc.refinedstorage:energy_stored=%d / %d RS misc.refinedstorage:energy_usage=Usage: %d RS/t @@ -41,12 +53,12 @@ misc.refinedstorage:storage.stored_minimal=%d misc.refinedstorage:storage.stored_capacity_minimal=%d / %d misc.refinedstorage:storage.full=%d%% full -misc.refinedstorage:wireless_grid.tooltip.0=X: %d -misc.refinedstorage:wireless_grid.tooltip.1=Y: %d -misc.refinedstorage:wireless_grid.tooltip.2=Z: %d +misc.refinedstorage:wireless_grid.tooltip=Linked to %d, %d, %d. misc.refinedstorage:wireless_grid.out_of_range=There is no Wireless Transmitter in range. misc.refinedstorage:wireless_grid.not_found=Controller not found. +misc.refinedstorage:network_card.tooltip=Linked to %d, %d, %d. + misc.refinedstorage:pattern.inputs=Inputs misc.refinedstorage:pattern.outputs=Outputs @@ -63,6 +75,10 @@ sidebutton.refinedstorage:redstone_mode.0=Ignore redstone signal sidebutton.refinedstorage:redstone_mode.1=Only work with redstone signal sidebutton.refinedstorage:redstone_mode.2=Only work without redstone signal +sidebutton.refinedstorage:grid.view_type=Display +sidebutton.refinedstorage:grid.view_type.0=Normal +sidebutton.refinedstorage:grid.view_type.1=No craftables +sidebutton.refinedstorage:grid.view_type.2=Only craftables sidebutton.refinedstorage:grid.sorting.direction=Sorting Direction sidebutton.refinedstorage:grid.sorting.direction.0=Ascending sidebutton.refinedstorage:grid.sorting.direction.1=Descending @@ -79,6 +95,10 @@ sidebutton.refinedstorage:mode=Mode sidebutton.refinedstorage:mode.whitelist=Whitelist sidebutton.refinedstorage:mode.blacklist=Blacklist +sidebutton.refinedstorage:type=Type +sidebutton.refinedstorage:type.0=Items +sidebutton.refinedstorage:type.1=Fluids + sidebutton.refinedstorage:detector.mode=Mode sidebutton.refinedstorage:detector.mode.0=Emit signal when under the amount sidebutton.refinedstorage:detector.mode.1=Emit signal when on the amount @@ -90,6 +110,7 @@ block.refinedstorage:cable.name=Cable block.refinedstorage:grid.0.name=Grid block.refinedstorage:grid.1.name=Crafting Grid block.refinedstorage:grid.2.name=Pattern Grid +block.refinedstorage:grid.3.name=Fluid Grid block.refinedstorage:disk_drive.name=Disk Drive block.refinedstorage:external_storage.name=External Storage block.refinedstorage:importer.name=Importer @@ -110,6 +131,14 @@ block.refinedstorage:crafting_monitor.name=Crafting Monitor block.refinedstorage:wireless_transmitter.name=Wireless Transmitter block.refinedstorage:crafter.name=Crafter block.refinedstorage:processing_pattern_encoder.name=Processing Pattern Encoder +block.refinedstorage:network_receiver.name=Network Receiver +block.refinedstorage:network_transmitter.name=Network Transmitter +block.refinedstorage:fluid_interface.name=Fluid Interface +block.refinedstorage:fluid_storage.0.name=64k Fluid Storage Block +block.refinedstorage:fluid_storage.1.name=128k Fluid Storage Block +block.refinedstorage:fluid_storage.2.name=256k Fluid Storage Block +block.refinedstorage:fluid_storage.3.name=512k Fluid Storage Block +block.refinedstorage:fluid_storage.4.name=Creative Fluid Storage Block item.refinedstorage:storage_disk.0.name=1k Storage Disk item.refinedstorage:storage_disk.1.name=4k Storage Disk @@ -117,6 +146,11 @@ item.refinedstorage:storage_disk.2.name=16k Storage Disk item.refinedstorage:storage_disk.3.name=64k Storage Disk item.refinedstorage:storage_disk.4.name=Creative Storage Disk item.refinedstorage:storage_disk.5.name=Debug Storage Disk +item.refinedstorage:fluid_storage_disk.0.name=64k Fluid Storage Disk +item.refinedstorage:fluid_storage_disk.1.name=128k Fluid Storage Disk +item.refinedstorage:fluid_storage_disk.2.name=256k Fluid Storage Disk +item.refinedstorage:fluid_storage_disk.3.name=512k Fluid Storage Disk +item.refinedstorage:fluid_storage_disk.4.name=Creative Fluid Storage Disk item.refinedstorage:wireless_grid.0.name=Wireless Grid item.refinedstorage:wireless_grid.1.name=Creative Wireless Grid item.refinedstorage:quartz_enriched_iron.name=Quartz Enriched Iron @@ -134,10 +168,17 @@ item.refinedstorage:storage_part.0.name=1k Storage Part item.refinedstorage:storage_part.1.name=4k Storage Part item.refinedstorage:storage_part.2.name=16k Storage Part item.refinedstorage:storage_part.3.name=64k Storage Part +item.refinedstorage:fluid_storage_part.0.name=64k Fluid Storage Part +item.refinedstorage:fluid_storage_part.1.name=128k Fluid Storage Part +item.refinedstorage:fluid_storage_part.2.name=256k Fluid Storage Part +item.refinedstorage:fluid_storage_part.3.name=512k Fluid Storage Part item.refinedstorage:pattern.name=Pattern item.refinedstorage:upgrade.0.name=Upgrade item.refinedstorage:upgrade.1.name=Range Upgrade item.refinedstorage:upgrade.2.name=Speed Upgrade item.refinedstorage:upgrade.3.name=Crafting Upgrade item.refinedstorage:upgrade.4.name=Stack Upgrade -item.refinedstorage:storage_housing.name=Storage Housing \ No newline at end of file +item.refinedstorage:upgrade.5.name=Interdimensional Upgrade +item.refinedstorage:storage_housing.name=Storage Housing +item.refinedstorage:grid_filter.name=Grid Filter +item.refinedstorage:network_card.name=Network Card \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/lang/fr_FR.lang b/src/main/resources/assets/refinedstorage/lang/fr_FR.lang index 87d64dc37..5790ddb16 100755 --- a/src/main/resources/assets/refinedstorage/lang/fr_FR.lang +++ b/src/main/resources/assets/refinedstorage/lang/fr_FR.lang @@ -41,9 +41,6 @@ misc.refinedstorage:storage.stored_minimal=%d misc.refinedstorage:storage.stored_capacity_minimal=%d / %d misc.refinedstorage:storage.full=%d%% plein -misc.refinedstorage:wireless_grid.tooltip.0=X: %d -misc.refinedstorage:wireless_grid.tooltip.1=Y: %d -misc.refinedstorage:wireless_grid.tooltip.2=Z: %d misc.refinedstorage:wireless_grid.out_of_range=Il n'y a pas un Émetteur sans Fil dans la gamme. misc.refinedstorage:wireless_grid.not_found=Contrôleur non trouvé. diff --git a/src/main/resources/assets/refinedstorage/lang/nl_NL.lang b/src/main/resources/assets/refinedstorage/lang/nl_NL.lang index fe838210b..891c76d5d 100755 --- a/src/main/resources/assets/refinedstorage/lang/nl_NL.lang +++ b/src/main/resources/assets/refinedstorage/lang/nl_NL.lang @@ -30,6 +30,14 @@ gui.refinedstorage:crafter=Crafter gui.refinedstorage:crafter.processing=Verwerking gui.refinedstorage:processing_pattern_encoder=Verwerkingspatroon Codeerder gui.refinedstorage:processing_pattern_encoder.pattern_create=Patroon maken +gui.refinedstorage:grid_filter=Rooster Filter +gui.refinedstorage:grid_filter.compare_damage=Schade +gui.refinedstorage:grid_filter.compare_nbt=NBT +gui.refinedstorage:network_transmitter=Netwerkzender +gui.refinedstorage:network_transmitter.distance=%d blokken +gui.refinedstorage:network_transmitter.dimension=Dimensie %d +gui.refinedstorage:network_transmitter.missing_card=Geen Netwerkkaart +gui.refinedstorage:network_transmitter.missing_upgrade=Ontbrekende upgrade misc.refinedstorage:energy_stored=%d / %d RS misc.refinedstorage:energy_usage=Vebruik: %d RS/t @@ -41,12 +49,12 @@ misc.refinedstorage:storage.stored_minimal=%d misc.refinedstorage:storage.stored_capacity_minimal=%d / %d misc.refinedstorage:storage.full=%d%% vol -misc.refinedstorage:wireless_grid.tooltip.0=X: %d -misc.refinedstorage:wireless_grid.tooltip.1=Y: %d -misc.refinedstorage:wireless_grid.tooltip.2=Z: %d +misc.refinedstorage:wireless_grid.tooltip=Gelinkt aan %d, %d, %d. misc.refinedstorage:wireless_grid.out_of_range=Er is geen Draadloze Zender binnen bereik. misc.refinedstorage:wireless_grid.not_found=Controller niet gevonden. +misc.refinedstorage:network_card.tooltip=Gelinkt aan %d, %d, %d. + misc.refinedstorage:pattern.inputs=Inputs misc.refinedstorage:pattern.outputs=Outputs @@ -63,6 +71,10 @@ sidebutton.refinedstorage:redstone_mode.0=Redstone negeren sidebutton.refinedstorage:redstone_mode.1=Alleen werken met redstone signaal sidebutton.refinedstorage:redstone_mode.2=Alleen werken zonder redstone signaal +sidebutton.refinedstorage:grid.view_type=Weergave +sidebutton.refinedstorage:grid.view_type.0=Normaal +sidebutton.refinedstorage:grid.view_type.1=Geen craftables +sidebutton.refinedstorage:grid.view_type.2=Alleen craftables sidebutton.refinedstorage:grid.sorting.direction=Sorteer Richting sidebutton.refinedstorage:grid.sorting.direction.0=Oplopend sidebutton.refinedstorage:grid.sorting.direction.1=Aflopend @@ -110,6 +122,8 @@ block.refinedstorage:crafting_monitor.name=Crafting Monitor block.refinedstorage:wireless_transmitter.name=Draadloze Zender block.refinedstorage:crafter.name=Crafter block.refinedstorage:processing_pattern_encoder.name=Verwerkingspatroon Codeerder +block.refinedstorage:network_receiver.name=Netwerkontvanger +block.refinedstorage:network_transmitter.name=Netwerkzender item.refinedstorage:storage_disk.0.name=1k Opslagschijf item.refinedstorage:storage_disk.1.name=4k Opslagschijf @@ -140,4 +154,7 @@ item.refinedstorage:upgrade.1.name=Afstand Upgrade item.refinedstorage:upgrade.2.name=Snelheid Upgrade item.refinedstorage:upgrade.3.name=Crafting Upgrade item.refinedstorage:upgrade.4.name=Stack Upgrade -item.refinedstorage:storage_housing.name=Opslagomhulsel \ No newline at end of file +item.refinedstorage:upgrade.5.name=Interdimensionale Upgrade +item.refinedstorage:storage_housing.name=Opslagomhulsel +item.refinedstorage:grid_filter.name=Rooster Filter +item.refinedstorage:network_card.name=Netwerk Kaart \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/lang/pt_BR.lang b/src/main/resources/assets/refinedstorage/lang/pt_BR.lang index 7aaece026..bc743fd86 100755 --- a/src/main/resources/assets/refinedstorage/lang/pt_BR.lang +++ b/src/main/resources/assets/refinedstorage/lang/pt_BR.lang @@ -41,9 +41,6 @@ misc.refinedstorage:storage.stored_minimal=%d misc.refinedstorage:storage.stored_capacity_minimal=%d / %d misc.refinedstorage:storage.full=%d%% full -misc.refinedstorage:wireless_grid.tooltip.0=X: %d -misc.refinedstorage:wireless_grid.tooltip.1=Y: %d -misc.refinedstorage:wireless_grid.tooltip.2=Z: %d misc.refinedstorage:wireless_grid.out_of_range=Não há Transmissor Sem Fio na gama. misc.refinedstorage:wireless_grid.not_found=Controlador não encontrado. diff --git a/src/main/resources/assets/refinedstorage/models/item/128k_fluid_storage_disk.json b/src/main/resources/assets/refinedstorage/models/item/128k_fluid_storage_disk.json new file mode 100755 index 000000000..8503c025d --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/128k_fluid_storage_disk.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/128k_fluid_storage_disk" + } +} diff --git a/src/main/resources/assets/refinedstorage/models/item/128k_fluid_storage_part.json b/src/main/resources/assets/refinedstorage/models/item/128k_fluid_storage_part.json new file mode 100755 index 000000000..6a0f26529 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/128k_fluid_storage_part.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/128k_fluid_storage_part" + } +} diff --git a/src/main/resources/assets/refinedstorage/models/item/256k_fluid_storage_disk.json b/src/main/resources/assets/refinedstorage/models/item/256k_fluid_storage_disk.json new file mode 100755 index 000000000..b01ab7929 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/256k_fluid_storage_disk.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/256k_fluid_storage_disk" + } +} diff --git a/src/main/resources/assets/refinedstorage/models/item/256k_fluid_storage_part.json b/src/main/resources/assets/refinedstorage/models/item/256k_fluid_storage_part.json new file mode 100755 index 000000000..c15cbf508 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/256k_fluid_storage_part.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/256k_fluid_storage_part" + } +} diff --git a/src/main/resources/assets/refinedstorage/models/item/512k_fluid_storage_disk.json b/src/main/resources/assets/refinedstorage/models/item/512k_fluid_storage_disk.json new file mode 100755 index 000000000..c915ab76b --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/512k_fluid_storage_disk.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/512k_fluid_storage_disk" + } +} diff --git a/src/main/resources/assets/refinedstorage/models/item/512k_fluid_storage_part.json b/src/main/resources/assets/refinedstorage/models/item/512k_fluid_storage_part.json new file mode 100755 index 000000000..04771a814 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/512k_fluid_storage_part.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/512k_fluid_storage_part" + } +} diff --git a/src/main/resources/assets/refinedstorage/models/item/64k_fluid_storage_disk.json b/src/main/resources/assets/refinedstorage/models/item/64k_fluid_storage_disk.json new file mode 100755 index 000000000..7d84a85f7 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/64k_fluid_storage_disk.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/64k_fluid_storage_disk" + } +} diff --git a/src/main/resources/assets/refinedstorage/models/item/64k_fluid_storage_part.json b/src/main/resources/assets/refinedstorage/models/item/64k_fluid_storage_part.json new file mode 100755 index 000000000..1e8e6fc0b --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/64k_fluid_storage_part.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/64k_fluid_storage_part" + } +} diff --git a/src/main/resources/assets/refinedstorage/models/item/creative_fluid_storage_disk.json b/src/main/resources/assets/refinedstorage/models/item/creative_fluid_storage_disk.json new file mode 100755 index 000000000..90d5cf800 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/creative_fluid_storage_disk.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/creative_fluid_storage_disk" + } +} diff --git a/src/main/resources/assets/refinedstorage/models/item/debug_storage_disk.json b/src/main/resources/assets/refinedstorage/models/item/debug_storage_disk.json deleted file mode 100755 index 4119b149f..000000000 --- a/src/main/resources/assets/refinedstorage/models/item/debug_storage_disk.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "refinedstorage:items/debug_storage_disk" - } -} diff --git a/src/main/resources/assets/refinedstorage/models/item/grid_filter.json b/src/main/resources/assets/refinedstorage/models/item/grid_filter.json new file mode 100755 index 000000000..7dcacb623 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/grid_filter.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/grid_filter" + } +} diff --git a/src/main/resources/assets/refinedstorage/models/item/interdimensional_upgrade.json b/src/main/resources/assets/refinedstorage/models/item/interdimensional_upgrade.json new file mode 100755 index 000000000..7fef125b7 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/interdimensional_upgrade.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/interdimensional_upgrade" + } +} diff --git a/src/main/resources/assets/refinedstorage/models/item/network_card.json b/src/main/resources/assets/refinedstorage/models/item/network_card.json new file mode 100755 index 000000000..cd2b01777 --- /dev/null +++ b/src/main/resources/assets/refinedstorage/models/item/network_card.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "refinedstorage:items/network_card" + } +} diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/128k_fluid_storage_block.png b/src/main/resources/assets/refinedstorage/textures/blocks/128k_fluid_storage_block.png new file mode 100755 index 000000000..4bf722d41 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/blocks/128k_fluid_storage_block.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/256k_fluid_storage_block.png b/src/main/resources/assets/refinedstorage/textures/blocks/256k_fluid_storage_block.png new file mode 100755 index 000000000..93ab532fb Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/blocks/256k_fluid_storage_block.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/512k_fluid_storage_block.png b/src/main/resources/assets/refinedstorage/textures/blocks/512k_fluid_storage_block.png new file mode 100755 index 000000000..d759dc3e1 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/blocks/512k_fluid_storage_block.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/64k_fluid_storage_block.png b/src/main/resources/assets/refinedstorage/textures/blocks/64k_fluid_storage_block.png new file mode 100755 index 000000000..bc7093ac4 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/blocks/64k_fluid_storage_block.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/importer_exporter_external_storage.png b/src/main/resources/assets/refinedstorage/textures/blocks/cable_part.png similarity index 100% rename from src/main/resources/assets/refinedstorage/textures/blocks/importer_exporter_external_storage.png rename to src/main/resources/assets/refinedstorage/textures/blocks/cable_part.png diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/constructor.png b/src/main/resources/assets/refinedstorage/textures/blocks/constructor.png index 44719621a..dfbc00905 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/blocks/constructor.png and b/src/main/resources/assets/refinedstorage/textures/blocks/constructor.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/controller_7.png b/src/main/resources/assets/refinedstorage/textures/blocks/controller_7.png index 203a34401..e4b82d6e0 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/blocks/controller_7.png and b/src/main/resources/assets/refinedstorage/textures/blocks/controller_7.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/creative_fluid_storage_block.png b/src/main/resources/assets/refinedstorage/textures/blocks/creative_fluid_storage_block.png new file mode 100755 index 000000000..87e71fcc0 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/blocks/creative_fluid_storage_block.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/destructor.png b/src/main/resources/assets/refinedstorage/textures/blocks/destructor.png index 21033289f..f4d75f47f 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/blocks/destructor.png and b/src/main/resources/assets/refinedstorage/textures/blocks/destructor.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/fluid_interface_connected.png b/src/main/resources/assets/refinedstorage/textures/blocks/fluid_interface_connected.png new file mode 100755 index 000000000..52dd35e12 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/blocks/fluid_interface_connected.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/fluid_interface_disconnected.png b/src/main/resources/assets/refinedstorage/textures/blocks/fluid_interface_disconnected.png new file mode 100755 index 000000000..b57031f9b Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/blocks/fluid_interface_disconnected.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/network_receiver_connected.png b/src/main/resources/assets/refinedstorage/textures/blocks/network_receiver_connected.png new file mode 100755 index 000000000..46c528615 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/blocks/network_receiver_connected.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/network_receiver_disconnected.png b/src/main/resources/assets/refinedstorage/textures/blocks/network_receiver_disconnected.png new file mode 100755 index 000000000..f56457e64 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/blocks/network_receiver_disconnected.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/network_transmitter_connected.png b/src/main/resources/assets/refinedstorage/textures/blocks/network_transmitter_connected.png new file mode 100755 index 000000000..1e590c582 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/blocks/network_transmitter_connected.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/blocks/network_transmitter_disconnected.png b/src/main/resources/assets/refinedstorage/textures/blocks/network_transmitter_disconnected.png new file mode 100755 index 000000000..77c4f8da5 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/blocks/network_transmitter_disconnected.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/gui/crafting_grid.png b/src/main/resources/assets/refinedstorage/textures/gui/crafting_grid.png index 8a4578e0a..f00b3b24e 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/gui/crafting_grid.png and b/src/main/resources/assets/refinedstorage/textures/gui/crafting_grid.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/gui/fluid_interface.png b/src/main/resources/assets/refinedstorage/textures/gui/fluid_interface.png new file mode 100755 index 000000000..864ca9e79 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/gui/fluid_interface.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/gui/grid.png b/src/main/resources/assets/refinedstorage/textures/gui/grid.png index 2d2cb3a5f..0644972f7 100644 Binary files a/src/main/resources/assets/refinedstorage/textures/gui/grid.png and b/src/main/resources/assets/refinedstorage/textures/gui/grid.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/gui/grid_filter.png b/src/main/resources/assets/refinedstorage/textures/gui/grid_filter.png new file mode 100755 index 000000000..94a6a60b5 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/gui/grid_filter.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/gui/network_transmitter.png b/src/main/resources/assets/refinedstorage/textures/gui/network_transmitter.png new file mode 100755 index 000000000..02b15cbae Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/gui/network_transmitter.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/gui/pattern_grid.png b/src/main/resources/assets/refinedstorage/textures/gui/pattern_grid.png index 0c495db60..b6b62fc42 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/gui/pattern_grid.png and b/src/main/resources/assets/refinedstorage/textures/gui/pattern_grid.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/icons.png b/src/main/resources/assets/refinedstorage/textures/icons.png index 7cb5226bf..87821afeb 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/icons.png and b/src/main/resources/assets/refinedstorage/textures/icons.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/128k_fluid_storage_disk.png b/src/main/resources/assets/refinedstorage/textures/items/128k_fluid_storage_disk.png new file mode 100755 index 000000000..4bf722d41 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/128k_fluid_storage_disk.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/128k_fluid_storage_part.png b/src/main/resources/assets/refinedstorage/textures/items/128k_fluid_storage_part.png new file mode 100755 index 000000000..4bf722d41 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/128k_fluid_storage_part.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/256k_fluid_storage_disk.png b/src/main/resources/assets/refinedstorage/textures/items/256k_fluid_storage_disk.png new file mode 100755 index 000000000..93ab532fb Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/256k_fluid_storage_disk.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/256k_fluid_storage_part.png b/src/main/resources/assets/refinedstorage/textures/items/256k_fluid_storage_part.png new file mode 100755 index 000000000..93ab532fb Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/256k_fluid_storage_part.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/512k_fluid_storage_disk.png b/src/main/resources/assets/refinedstorage/textures/items/512k_fluid_storage_disk.png new file mode 100755 index 000000000..d759dc3e1 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/512k_fluid_storage_disk.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/512k_fluid_storage_part.png b/src/main/resources/assets/refinedstorage/textures/items/512k_fluid_storage_part.png new file mode 100755 index 000000000..d759dc3e1 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/512k_fluid_storage_part.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/64k_fluid_storage_disk.png b/src/main/resources/assets/refinedstorage/textures/items/64k_fluid_storage_disk.png new file mode 100755 index 000000000..bc7093ac4 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/64k_fluid_storage_disk.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/64k_fluid_storage_part.png b/src/main/resources/assets/refinedstorage/textures/items/64k_fluid_storage_part.png new file mode 100755 index 000000000..bc7093ac4 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/64k_fluid_storage_part.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/creative_fluid_storage_disk.png b/src/main/resources/assets/refinedstorage/textures/items/creative_fluid_storage_disk.png new file mode 100755 index 000000000..87e71fcc0 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/creative_fluid_storage_disk.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/grid_filter.png b/src/main/resources/assets/refinedstorage/textures/items/grid_filter.png new file mode 100755 index 000000000..9d2a62091 Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/grid_filter.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/interdimensional_upgrade.png b/src/main/resources/assets/refinedstorage/textures/items/interdimensional_upgrade.png new file mode 100755 index 000000000..df8e37dda Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/interdimensional_upgrade.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/network_card.png b/src/main/resources/assets/refinedstorage/textures/items/network_card.png new file mode 100755 index 000000000..40d0716be Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/items/network_card.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/items/pattern.png b/src/main/resources/assets/refinedstorage/textures/items/pattern.png index e4c5d8ba0..8d5627bcf 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/items/pattern.png and b/src/main/resources/assets/refinedstorage/textures/items/pattern.png differ diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 8509f28dc..d352c688c 100755 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "refinedstorage", "name": "Refined Storage", "description": "A Minecraft mod all about storage.", - "version": "0.8.11", + "version": "0.9", "mcversion": "1.10.2", "url": "", "updateUrl": "", diff --git a/translation-diff.pl b/translation-diff.pl new file mode 100755 index 000000000..8c101baa9 --- /dev/null +++ b/translation-diff.pl @@ -0,0 +1,51 @@ +# Utility for comparing language translation keys of BASE_LANG and a given language. +# Usage: perl translation-diff.pl $lang +# Will output a translation-diff.diff file that compares the lang keys of BASE_LANG to $lang. + +use constant { + BASE_LANG => "en_US", + OUTPUT_FILE => "translation-diff.diff" +}; + +my $lang = $ARGV[0] or die("Missing language to diff with"); + +sub lang_file { + my ($lang) = @_; + my $filename = "src/main/resources/assets/refinedstorage/lang/" . $lang . ".lang"; + open(my $fh, $filename) or die("Couldn't open $filename"); + return $fh; +} + +sub write_keys { + my ($lang, $lang_keys) = @_; + my $filename = $lang . ".tmp"; + open(my $fh, '>', $filename) or die("Couldn't open temp file $filename for $lang for writing"); + print $fh $lang_keys; + close $fh; + return $filename; +} + +sub lang_keys { + my ($lang_file) = @_; + my $keys = ""; + while (my $line = <$lang_file>) { + my @p = split("=", $line); + $keys .= $p[0] . "\n"; + } + return $keys; +} + +my $f1 = lang_file(BASE_LANG); +my $f2 = lang_file($lang); + +my $base_keys = lang_keys($f1); +my $t1 = write_keys(BASE_LANG, $base_keys); + +my $lang_keys = lang_keys($f2); +my $t2 = write_keys($lang, $lang_keys); + +system("diff -s -y $t1 $t2 > " . OUTPUT_FILE); + +unlink($t1, $t2); + +close($f1, $f2);