21
.github/ISSUE_TEMPLATE.md
vendored
Executable file
21
.github/ISSUE_TEMPLATE.md
vendored
Executable file
@@ -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]
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -13,3 +13,4 @@ run/
|
|||||||
*.iws
|
*.iws
|
||||||
.idea/
|
.idea/
|
||||||
out/
|
out/
|
||||||
|
translation-diff.diff
|
||||||
|
|||||||
88
CHANGELOG.md
88
CHANGELOG.md
@@ -1,13 +1,101 @@
|
|||||||
# Refined Storage Changelog
|
# 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
|
### 0.8.11
|
||||||
**Bugfixes**
|
**Bugfixes**
|
||||||
- Fixed minor dupe bug with JEI transferring
|
- Fixed minor dupe bug with JEI transferring
|
||||||
- Fixed exporter crafting upgrades taking priority over other tasks
|
- 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 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**
|
**Features**
|
||||||
- Added X button to Processing Pattern Encoder to clear configuration of inputs and outputs
|
- 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
|
- Re-added opposite facing on shift click functionality
|
||||||
- Updated to Forge 2014
|
- Updated to Forge 2014
|
||||||
|
|
||||||
|
|||||||
@@ -10,3 +10,4 @@
|
|||||||
## Translations
|
## Translations
|
||||||
- ChaoticTabris (Portuguese (Brazilian) translation)
|
- ChaoticTabris (Portuguese (Brazilian) translation)
|
||||||
- Leventovitch (French translation)
|
- Leventovitch (French translation)
|
||||||
|
- ChillUpX (German translation)
|
||||||
17
build.gradle
17
build.gradle
@@ -12,12 +12,15 @@ buildscript {
|
|||||||
}
|
}
|
||||||
apply plugin: 'net.minecraftforge.gradle.forge'
|
apply plugin: 'net.minecraftforge.gradle.forge'
|
||||||
|
|
||||||
version = "0.8.11"
|
version = "0.9"
|
||||||
group = "refinedstorage"
|
group = "refinedstorage"
|
||||||
archivesBaseName = "refinedstorage"
|
archivesBaseName = "refinedstorage"
|
||||||
|
|
||||||
|
sourceCompatibility = 1.8
|
||||||
|
targetCompatibility = 1.8
|
||||||
|
|
||||||
minecraft {
|
minecraft {
|
||||||
version = "1.10.2-12.18.1.2014"
|
version = "1.10.2-12.18.1.2065"
|
||||||
runDir = "run"
|
runDir = "run"
|
||||||
useDepAts = true
|
useDepAts = true
|
||||||
mappings = "snapshot_20160518"
|
mappings = "snapshot_20160518"
|
||||||
@@ -34,12 +37,16 @@ repositories {
|
|||||||
name = "ic2"
|
name = "ic2"
|
||||||
url = "http://maven.ic2.player.to/"
|
url = "http://maven.ic2.player.to/"
|
||||||
}
|
}
|
||||||
|
maven {
|
||||||
|
url "http://maven.amadornes.com/"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
deobfCompile "mezz.jei:jei_1.10.2:3.7.+"
|
deobfCompile "mezz.jei:jei_1.10.2:3.9.+"
|
||||||
compile "net.darkhax.tesla:Tesla:1.10-1.2.0.34"
|
compile "net.darkhax.tesla:Tesla:1.10-1.2.+"
|
||||||
compile "net.industrial-craft:industrialcraft-2:2.6.9-ex110:api"
|
compile "net.industrial-craft:industrialcraft-2:2.6.41-ex110:api"
|
||||||
|
deobfCompile "MCMultiPart:MCMultiPart:1.2.1+:universal"
|
||||||
}
|
}
|
||||||
|
|
||||||
processResources {
|
processResources {
|
||||||
|
|||||||
BIN
screenshots/wireless_networks.png
Executable file
BIN
screenshots/wireless_networks.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 233 KiB |
@@ -4,7 +4,7 @@ import net.minecraft.creativetab.CreativeTabs;
|
|||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.common.config.Configuration;
|
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;
|
||||||
import net.minecraftforge.fml.common.Mod.EventHandler;
|
import net.minecraftforge.fml.common.Mod.EventHandler;
|
||||||
import net.minecraftforge.fml.common.Mod.Instance;
|
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.event.FMLPreInitializationEvent;
|
||||||
import net.minecraftforge.fml.common.network.NetworkRegistry;
|
import net.minecraftforge.fml.common.network.NetworkRegistry;
|
||||||
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
|
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
|
||||||
import refinedstorage.apiimpl.storage.ClientStack;
|
|
||||||
import refinedstorage.proxy.CommonProxy;
|
import refinedstorage.proxy.CommonProxy;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
@Mod(modid = RefinedStorage.ID, version = RefinedStorage.VERSION, dependencies = RefinedStorage.DEPENDENCIES)
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mod(modid = RefinedStorage.ID, version = RefinedStorage.VERSION)
|
|
||||||
public final class RefinedStorage {
|
public final class RefinedStorage {
|
||||||
public static final String ID = "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")
|
@SidedProxy(clientSide = "refinedstorage.proxy.ClientProxy", serverSide = "refinedstorage.proxy.ServerProxy")
|
||||||
public static CommonProxy PROXY;
|
public static CommonProxy PROXY;
|
||||||
@@ -45,8 +42,11 @@ public final class RefinedStorage {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public List<ClientStack> items = new ArrayList<ClientStack>();
|
static {
|
||||||
|
FluidRegistry.enableUniversalBucket();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int controllerBaseUsage;
|
||||||
public int cableUsage;
|
public int cableUsage;
|
||||||
public int constructorUsage;
|
public int constructorUsage;
|
||||||
public int crafterUsage;
|
public int crafterUsage;
|
||||||
@@ -61,24 +61,38 @@ public final class RefinedStorage {
|
|||||||
public int exporterUsage;
|
public int exporterUsage;
|
||||||
public int importerUsage;
|
public int importerUsage;
|
||||||
public int interfaceUsage;
|
public int interfaceUsage;
|
||||||
|
public int fluidInterfaceUsage;
|
||||||
public int relayUsage;
|
public int relayUsage;
|
||||||
public int soldererUsage;
|
public int soldererUsage;
|
||||||
public int storageUsage;
|
public int storageUsage;
|
||||||
|
public int fluidStorageUsage;
|
||||||
public int wirelessTransmitterUsage;
|
public int wirelessTransmitterUsage;
|
||||||
public int gridUsage;
|
public int gridUsage;
|
||||||
public int craftingGridUsage;
|
public int craftingGridUsage;
|
||||||
public int patternGridUsage;
|
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 boolean controllerUsesEnergy;
|
||||||
|
|
||||||
public int wirelessTransmitterBaseRange;
|
public int wirelessTransmitterBaseRange;
|
||||||
|
public int wirelessTransmitterRangePerUpgrade;
|
||||||
|
|
||||||
|
public boolean wirelessGridUsesEnergy;
|
||||||
|
public int wirelessGridOpenUsage;
|
||||||
|
public int wirelessGridExtractUsage;
|
||||||
|
public int wirelessGridInsertUsage;
|
||||||
|
|
||||||
public int rangeUpgradeUsage;
|
public int rangeUpgradeUsage;
|
||||||
public int speedUpgradeUsage;
|
public int speedUpgradeUsage;
|
||||||
public int craftingUpgradeUsage;
|
public int craftingUpgradeUsage;
|
||||||
public int stackUpgradeUsage;
|
public int stackUpgradeUsage;
|
||||||
public int wirelessTransmitterRangePerUpgrade;
|
public int interdimensionalUpgradeUsage;
|
||||||
|
|
||||||
|
public boolean translucentCables;
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void preInit(FMLPreInitializationEvent e) {
|
public void preInit(FMLPreInitializationEvent e) {
|
||||||
@@ -86,6 +100,7 @@ public final class RefinedStorage {
|
|||||||
|
|
||||||
Configuration config = new Configuration(e.getSuggestedConfigurationFile());
|
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");
|
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");
|
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");
|
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");
|
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");
|
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");
|
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");
|
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");
|
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");
|
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");
|
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");
|
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");
|
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");
|
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");
|
controllerCapacity = config.getInt("capacity", "controller", 32000, 0, Integer.MAX_VALUE, "The energy capacity of the Controller");
|
||||||
controllerUsesEnergy = config.getBoolean("controllerUsesEnergy", "energy", true, "Whether the controller uses RF");
|
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");
|
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");
|
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");
|
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");
|
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");
|
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");
|
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();
|
config.save();
|
||||||
}
|
}
|
||||||
@@ -131,16 +160,4 @@ public final class RefinedStorage {
|
|||||||
public void postInit(FMLPostInitializationEvent e) {
|
public void postInit(FMLPostInitializationEvent e) {
|
||||||
PROXY.postInit(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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,4 +22,8 @@ public final class RefinedStorageBlocks {
|
|||||||
public static final BlockWirelessTransmitter WIRELESS_TRANSMITTER = new BlockWirelessTransmitter();
|
public static final BlockWirelessTransmitter WIRELESS_TRANSMITTER = new BlockWirelessTransmitter();
|
||||||
public static final BlockCrafter CRAFTER = new BlockCrafter();
|
public static final BlockCrafter CRAFTER = new BlockCrafter();
|
||||||
public static final BlockProcessingPatternEncoder PROCESSING_PATTERN_ENCODER = new BlockProcessingPatternEncoder();
|
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();
|
||||||
|
}
|
||||||
@@ -18,4 +18,9 @@ public final class RefinedStorageGui {
|
|||||||
public static final int WIRELESS_TRANSMITTER = 14;
|
public static final int WIRELESS_TRANSMITTER = 14;
|
||||||
public static final int CRAFTER = 15;
|
public static final int CRAFTER = 15;
|
||||||
public static final int PROCESSING_PATTERN_ENCODER = 16;
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,4 +13,8 @@ public final class RefinedStorageItems {
|
|||||||
public static final ItemPattern PATTERN = new ItemPattern();
|
public static final ItemPattern PATTERN = new ItemPattern();
|
||||||
public static final ItemUpgrade UPGRADE = new ItemUpgrade();
|
public static final ItemUpgrade UPGRADE = new ItemUpgrade();
|
||||||
public static final ItemStorageHousing STORAGE_HOUSING = new ItemStorageHousing();
|
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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<String> lines, ItemStack... stacks) {
|
|
||||||
Set<Integer> combinedIndices = new HashSet<Integer>();
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,7 +4,7 @@ import refinedstorage.api.solderer.ISoldererRegistry;
|
|||||||
|
|
||||||
public final class RefinedStorageAPI {
|
public final class RefinedStorageAPI {
|
||||||
/**
|
/**
|
||||||
* The solderer registry, set in pre-initialization.
|
* The solderer registry, set in pre-initialization
|
||||||
*/
|
*/
|
||||||
public static ISoldererRegistry SOLDERER_REGISTRY;
|
public static ISoldererRegistry SOLDERER_REGISTRY;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ public interface ICraftingPatternContainer {
|
|||||||
/**
|
/**
|
||||||
* This usually corresponds to the amount of speed upgrades in a crafter.
|
* 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();
|
int getSpeed();
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -4,10 +4,14 @@ import cofh.api.energy.EnergyStorage;
|
|||||||
import net.minecraft.entity.player.EntityPlayerMP;
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||||
import refinedstorage.api.autocrafting.ICraftingTask;
|
import refinedstorage.api.autocrafting.ICraftingTask;
|
||||||
import refinedstorage.api.storage.CompareFlags;
|
import refinedstorage.api.network.grid.IFluidGridHandler;
|
||||||
import refinedstorage.api.storage.IGroupedStorage;
|
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.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
@@ -38,14 +42,19 @@ public interface INetworkMaster {
|
|||||||
boolean canRun();
|
boolean canRun();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return A list with all the network nodes
|
* @return A graph of connected nodes to this network
|
||||||
*/
|
*/
|
||||||
List<INetworkNode> 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
|
* @return The {@link IWirelessGridHandler} for this network
|
||||||
@@ -53,9 +62,14 @@ public interface INetworkMaster {
|
|||||||
IWirelessGridHandler getWirelessGridHandler();
|
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
|
* @return The crafting tasks in this network, do NOT modify this list
|
||||||
@@ -101,23 +115,18 @@ public interface INetworkMaster {
|
|||||||
*/
|
*/
|
||||||
void rebuildPatterns();
|
void rebuildPatterns();
|
||||||
|
|
||||||
/**
|
|
||||||
* Rebuilds the network node list.
|
|
||||||
*/
|
|
||||||
void rebuildNodes();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns crafting patterns from an item stack.
|
* Returns crafting patterns from an item stack.
|
||||||
*
|
*
|
||||||
* @param pattern The {@link ItemStack} to get a pattern for
|
* @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
|
* @return A list of crafting patterns where the given pattern is one of the outputs
|
||||||
*/
|
*/
|
||||||
List<ICraftingPattern> getPatterns(ItemStack pattern, int flags);
|
List<ICraftingPattern> getPatterns(ItemStack pattern, int flags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param pattern The {@link ItemStack} to get a pattern for
|
* @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
|
* @return The pattern, or null if the pattern is not found
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -126,20 +135,38 @@ public interface INetworkMaster {
|
|||||||
/**
|
/**
|
||||||
* Sends a grid packet with all the items to all clients that are watching a grid.
|
* 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.
|
* 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 stack The stack
|
||||||
* @param delta The delta
|
* @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.
|
* 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 stack The prototype of the stack to extract, do NOT modify
|
||||||
* @param size The amount of that prototype that has to be extracted
|
* @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
|
* @return null if we didn't extract anything, or a {@link ItemStack} with the result
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags);
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package refinedstorage.api.network;
|
package refinedstorage.api.network;
|
||||||
|
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a node in the storage network.
|
* Represents a node in the storage network.
|
||||||
@@ -37,7 +39,7 @@ public interface INetworkNode {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the connection state of this node changes.
|
* 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 network The network
|
||||||
* @param state The state
|
* @param state The state
|
||||||
@@ -50,17 +52,23 @@ public interface INetworkNode {
|
|||||||
boolean isConnected();
|
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();
|
boolean canUpdate();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param direction The direction to conduct to
|
||||||
* @return Whether this node can conduct a network signal
|
* @return Whether this node can conduct a network signal
|
||||||
*/
|
*/
|
||||||
boolean canConduct();
|
boolean canConduct(EnumFacing direction);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The network
|
* @return The network
|
||||||
*/
|
*/
|
||||||
INetworkMaster getNetwork();
|
INetworkMaster getNetwork();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The world where this node is in
|
||||||
|
*/
|
||||||
|
World getNodeWorld();
|
||||||
}
|
}
|
||||||
|
|||||||
35
src/main/java/refinedstorage/api/network/INetworkNodeGraph.java
Executable file
35
src/main/java/refinedstorage/api/network/INetworkNodeGraph.java
Executable file
@@ -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<INetworkNode> all();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return A set of hashes of all connected nodes, see {@link NetworkUtils#getNodeHashCode(World, INetworkNode)}
|
||||||
|
*/
|
||||||
|
Set<Integer> allHashes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disconnects and notifies all connected nodes.
|
||||||
|
*/
|
||||||
|
void disconnectAll();
|
||||||
|
}
|
||||||
@@ -2,17 +2,11 @@ package refinedstorage.api.network;
|
|||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.EnumHand;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a player using a wireless grid.
|
* Represents a player using a wireless grid.
|
||||||
*/
|
*/
|
||||||
public interface IWirelessGridConsumer {
|
public interface IWirelessGridConsumer {
|
||||||
/**
|
|
||||||
* @return The hand this wireless grid is opened with
|
|
||||||
*/
|
|
||||||
EnumHand getHand();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The player using the wireless grid
|
* @return The player using the wireless grid
|
||||||
*/
|
*/
|
||||||
|
|||||||
46
src/main/java/refinedstorage/api/network/NetworkUtils.java
Executable file
46
src/main/java/refinedstorage/api/network/NetworkUtils.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
36
src/main/java/refinedstorage/api/network/grid/IFluidGridHandler.java
Executable file
36
src/main/java/refinedstorage/api/network/grid/IFluidGridHandler.java
Executable file
@@ -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);
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package refinedstorage.api.network;
|
package refinedstorage.api.network.grid;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayerMP;
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -6,42 +6,47 @@ import net.minecraft.item.ItemStack;
|
|||||||
import javax.annotation.Nullable;
|
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.
|
* 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 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, see {@link GridExtractFlags}
|
* @param flags How we are extracting
|
||||||
* @param player The player that is attempting the extraction
|
* @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.
|
* 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
|
* @return The remainder, or null if there is no remainder
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@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.
|
* 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 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.
|
* 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
|
* @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.
|
* Called when a player wants to cancel a crafting task.
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
158
src/main/java/refinedstorage/api/storage/CompareUtils.java
Executable file
158
src/main/java/refinedstorage/api/storage/CompareUtils.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<ItemStack> getStacks();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return The storages connected to this network
|
|
||||||
*/
|
|
||||||
List<IStorage> getStorages();
|
|
||||||
}
|
|
||||||
@@ -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<IStorage> storages);
|
|
||||||
}
|
|
||||||
54
src/main/java/refinedstorage/api/storage/fluid/IFluidStorage.java
Executable file
54
src/main/java/refinedstorage/api/storage/fluid/IFluidStorage.java
Executable file
@@ -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<FluidStack> 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.
|
||||||
|
* <p>
|
||||||
|
* 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();
|
||||||
|
}
|
||||||
15
src/main/java/refinedstorage/api/storage/fluid/IFluidStorageProvider.java
Executable file
15
src/main/java/refinedstorage/api/storage/fluid/IFluidStorageProvider.java
Executable file
@@ -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<IFluidStorage> storages);
|
||||||
|
}
|
||||||
76
src/main/java/refinedstorage/api/storage/fluid/IGroupedFluidStorage.java
Executable file
76
src/main/java/refinedstorage/api/storage/fluid/IGroupedFluidStorage.java
Executable file
@@ -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}.
|
||||||
|
* <p>
|
||||||
|
* 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.
|
||||||
|
* <p>
|
||||||
|
* 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.
|
||||||
|
* <p>
|
||||||
|
* 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.
|
||||||
|
* <p>
|
||||||
|
* 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<FluidStack> getStacks();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The fluid storages connected to this network
|
||||||
|
*/
|
||||||
|
List<IFluidStorage> getStorages();
|
||||||
|
}
|
||||||
75
src/main/java/refinedstorage/api/storage/item/IGroupedItemStorage.java
Executable file
75
src/main/java/refinedstorage/api/storage/item/IGroupedItemStorage.java
Executable file
@@ -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}.
|
||||||
|
* <p>
|
||||||
|
* 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.
|
||||||
|
* <p>
|
||||||
|
* 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.
|
||||||
|
* <p>
|
||||||
|
* 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.
|
||||||
|
* <p>
|
||||||
|
* 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<ItemStack> getStacks();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The item storages connected to this network
|
||||||
|
*/
|
||||||
|
List<IItemStorage> getStorages();
|
||||||
|
}
|
||||||
@@ -1,16 +1,17 @@
|
|||||||
package refinedstorage.api.storage;
|
package refinedstorage.api.storage.item;
|
||||||
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import refinedstorage.api.storage.CompareUtils;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a storage sink for the storage network.
|
* Represents an item storage sink for the storage network.
|
||||||
* Provide this through an {@link IStorageProvider}.
|
* Provide this through an {@link IItemStorageProvider}.
|
||||||
*/
|
*/
|
||||||
public interface IStorage {
|
public interface IItemStorage {
|
||||||
/**
|
/**
|
||||||
* @return Items stored in this storage
|
* @return Items stored in this storage
|
||||||
*/
|
*/
|
||||||
@@ -28,14 +29,13 @@ public interface IStorage {
|
|||||||
ItemStack insertItem(@Nonnull ItemStack stack, int size, boolean simulate);
|
ItemStack insertItem(@Nonnull ItemStack stack, int size, boolean simulate);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extracts an item from storage.
|
* Extracts an item from this storage.
|
||||||
*
|
* <p>
|
||||||
* If the stack we found in the system is smaller than the requested size, return the stack anyway.
|
* If the stack we found in the system is smaller than the requested size, return that stack anyway.
|
||||||
* For example: if this method is called for dirt (64x) while there is only dirt (32x), return the dirt (32x) anyway.
|
|
||||||
*
|
*
|
||||||
* @param stack A prototype of the stack to extract, do NOT modify
|
* @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 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
|
* @return null if we didn't extract anything, or an {@link ItemStack} with the result
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
15
src/main/java/refinedstorage/api/storage/item/IItemStorageProvider.java
Executable file
15
src/main/java/refinedstorage/api/storage/item/IItemStorageProvider.java
Executable file
@@ -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<IItemStorage> storages);
|
||||||
|
}
|
||||||
@@ -2,13 +2,15 @@ package refinedstorage.apiimpl.autocrafting;
|
|||||||
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagIntArray;
|
||||||
import net.minecraft.nbt.NBTTagList;
|
import net.minecraft.nbt.NBTTagList;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.common.util.Constants;
|
import net.minecraftforge.common.util.Constants;
|
||||||
import refinedstorage.RefinedStorageUtils;
|
|
||||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||||
import refinedstorage.api.autocrafting.ICraftingTask;
|
import refinedstorage.api.autocrafting.ICraftingTask;
|
||||||
import refinedstorage.api.network.INetworkMaster;
|
import refinedstorage.api.network.INetworkMaster;
|
||||||
|
import refinedstorage.api.network.NetworkUtils;
|
||||||
|
import refinedstorage.apiimpl.storage.fluid.FluidUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -25,7 +27,7 @@ public class BasicCraftingTask implements ICraftingTask {
|
|||||||
private boolean satisfied[];
|
private boolean satisfied[];
|
||||||
private boolean checked[];
|
private boolean checked[];
|
||||||
private boolean childTasks[];
|
private boolean childTasks[];
|
||||||
private List<ItemStack> itemsTook = new ArrayList<ItemStack>();
|
private List<ItemStack> itemsTook = new ArrayList<>();
|
||||||
private boolean updatedOnce;
|
private boolean updatedOnce;
|
||||||
|
|
||||||
public BasicCraftingTask(ICraftingPattern pattern) {
|
public BasicCraftingTask(ICraftingPattern pattern) {
|
||||||
@@ -37,9 +39,9 @@ public class BasicCraftingTask implements ICraftingTask {
|
|||||||
|
|
||||||
public BasicCraftingTask(NBTTagCompound tag, ICraftingPattern pattern) {
|
public BasicCraftingTask(NBTTagCompound tag, ICraftingPattern pattern) {
|
||||||
this.pattern = pattern;
|
this.pattern = pattern;
|
||||||
this.satisfied = RefinedStorageUtils.readBooleanArray(tag, NBT_SATISFIED);
|
this.satisfied = readBooleanArray(tag, NBT_SATISFIED);
|
||||||
this.checked = RefinedStorageUtils.readBooleanArray(tag, NBT_CHECKED);
|
this.checked = readBooleanArray(tag, NBT_CHECKED);
|
||||||
this.childTasks = RefinedStorageUtils.readBooleanArray(tag, NBT_CHILD_TASKS);
|
this.childTasks = readBooleanArray(tag, NBT_CHILD_TASKS);
|
||||||
|
|
||||||
NBTTagList tookList = tag.getTagList(NBT_TOOK, Constants.NBT.TAG_COMPOUND);
|
NBTTagList tookList = tag.getTagList(NBT_TOOK, Constants.NBT.TAG_COMPOUND);
|
||||||
|
|
||||||
@@ -67,14 +69,14 @@ public class BasicCraftingTask implements ICraftingTask {
|
|||||||
if (!satisfied[i]) {
|
if (!satisfied[i]) {
|
||||||
done = false;
|
done = false;
|
||||||
|
|
||||||
ItemStack took = RefinedStorageUtils.extractItem(network, input, 1);
|
ItemStack took = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, 1);
|
||||||
|
|
||||||
if (took != null) {
|
if (took != null) {
|
||||||
itemsTook.add(took);
|
itemsTook.add(took);
|
||||||
|
|
||||||
satisfied[i] = true;
|
satisfied[i] = true;
|
||||||
} else if (!childTasks[i]) {
|
} else if (!childTasks[i]) {
|
||||||
ICraftingPattern pattern = RefinedStorageUtils.getPattern(network, input);
|
ICraftingPattern pattern = NetworkUtils.getPattern(network, input);
|
||||||
|
|
||||||
if (pattern != null) {
|
if (pattern != null) {
|
||||||
network.addCraftingTask(network.createCraftingTask(pattern));
|
network.addCraftingTask(network.createCraftingTask(pattern));
|
||||||
@@ -92,7 +94,7 @@ public class BasicCraftingTask implements ICraftingTask {
|
|||||||
return done;
|
return done;
|
||||||
}
|
}
|
||||||
|
|
||||||
// @todo: handle no space
|
// @TODO: Handle no space
|
||||||
@Override
|
@Override
|
||||||
public void onDone(INetworkMaster network) {
|
public void onDone(INetworkMaster network) {
|
||||||
for (ItemStack output : pattern.getOutputs()) {
|
for (ItemStack output : pattern.getOutputs()) {
|
||||||
@@ -106,7 +108,7 @@ public class BasicCraftingTask implements ICraftingTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// @todo: handle no space
|
// @TODO: Handle no space
|
||||||
@Override
|
@Override
|
||||||
public void onCancelled(INetworkMaster network) {
|
public void onCancelled(INetworkMaster network) {
|
||||||
for (ItemStack took : itemsTook) {
|
for (ItemStack took : itemsTook) {
|
||||||
@@ -120,9 +122,9 @@ public class BasicCraftingTask implements ICraftingTask {
|
|||||||
pattern.writeToNBT(patternTag);
|
pattern.writeToNBT(patternTag);
|
||||||
tag.setTag(CraftingPattern.NBT, patternTag);
|
tag.setTag(CraftingPattern.NBT, patternTag);
|
||||||
|
|
||||||
RefinedStorageUtils.writeBooleanArray(tag, NBT_SATISFIED, satisfied);
|
writeBooleanArray(tag, NBT_SATISFIED, satisfied);
|
||||||
RefinedStorageUtils.writeBooleanArray(tag, NBT_CHECKED, checked);
|
writeBooleanArray(tag, NBT_CHECKED, checked);
|
||||||
RefinedStorageUtils.writeBooleanArray(tag, NBT_CHILD_TASKS, childTasks);
|
writeBooleanArray(tag, NBT_CHILD_TASKS, childTasks);
|
||||||
|
|
||||||
NBTTagList tookList = new NBTTagList();
|
NBTTagList tookList = new NBTTagList();
|
||||||
|
|
||||||
@@ -177,4 +179,26 @@ public class BasicCraftingTask implements ICraftingTask {
|
|||||||
|
|
||||||
return builder.toString();
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ package refinedstorage.apiimpl.autocrafting;
|
|||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import refinedstorage.RefinedStorageUtils;
|
|
||||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||||
import refinedstorage.api.network.INetworkMaster;
|
import refinedstorage.api.network.INetworkMaster;
|
||||||
|
import refinedstorage.api.storage.CompareUtils;
|
||||||
|
|
||||||
public class CraftingTaskScheduler {
|
public class CraftingTaskScheduler {
|
||||||
private static final String NBT_SCHEDULED = "CraftingTaskScheduled";
|
private static final String NBT_SCHEDULED = "CraftingTaskScheduled";
|
||||||
@@ -18,7 +18,7 @@ public class CraftingTaskScheduler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean canSchedule(int compare, ItemStack item) {
|
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) {
|
public void schedule(INetworkMaster network, int compare, ItemStack item) {
|
||||||
@@ -39,7 +39,7 @@ public class CraftingTaskScheduler {
|
|||||||
tile.markDirty();
|
tile.markDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeToNBT(NBTTagCompound tag) {
|
public void write(NBTTagCompound tag) {
|
||||||
if (scheduledItem != null) {
|
if (scheduledItem != null) {
|
||||||
tag.setTag(NBT_SCHEDULED, scheduledItem.serializeNBT());
|
tag.setTag(NBT_SCHEDULED, scheduledItem.serializeNBT());
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -4,11 +4,13 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.items.ItemHandlerHelper;
|
import net.minecraftforge.items.ItemHandlerHelper;
|
||||||
import refinedstorage.RefinedStorageUtils;
|
|
||||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||||
import refinedstorage.api.autocrafting.ICraftingPatternContainer;
|
import refinedstorage.api.autocrafting.ICraftingPatternContainer;
|
||||||
import refinedstorage.api.autocrafting.ICraftingTask;
|
import refinedstorage.api.autocrafting.ICraftingTask;
|
||||||
import refinedstorage.api.network.INetworkMaster;
|
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 class ProcessingCraftingTask implements ICraftingTask {
|
||||||
public static final int ID = 1;
|
public static final int ID = 1;
|
||||||
@@ -32,9 +34,9 @@ public class ProcessingCraftingTask implements ICraftingTask {
|
|||||||
|
|
||||||
public ProcessingCraftingTask(NBTTagCompound tag, ICraftingPattern pattern) {
|
public ProcessingCraftingTask(NBTTagCompound tag, ICraftingPattern pattern) {
|
||||||
this.pattern = pattern;
|
this.pattern = pattern;
|
||||||
this.inserted = RefinedStorageUtils.readBooleanArray(tag, NBT_INSERTED);
|
this.inserted = BasicCraftingTask.readBooleanArray(tag, NBT_INSERTED);
|
||||||
this.childTasks = RefinedStorageUtils.readBooleanArray(tag, NBT_CHILD_TASKS);
|
this.childTasks = BasicCraftingTask.readBooleanArray(tag, NBT_CHILD_TASKS);
|
||||||
this.satisfied = RefinedStorageUtils.readBooleanArray(tag, NBT_SATISFIED);
|
this.satisfied = BasicCraftingTask.readBooleanArray(tag, NBT_SATISFIED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -52,7 +54,7 @@ public class ProcessingCraftingTask implements ICraftingTask {
|
|||||||
for (int i = 0; i < inserted.length; ++i) {
|
for (int i = 0; i < inserted.length; ++i) {
|
||||||
if (!inserted[i]) {
|
if (!inserted[i]) {
|
||||||
ItemStack input = pattern.getInputs()[i];
|
ItemStack input = pattern.getInputs()[i];
|
||||||
ItemStack took = RefinedStorageUtils.extractItem(network, input, 1);
|
ItemStack took = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, 1);
|
||||||
|
|
||||||
if (took != null) {
|
if (took != null) {
|
||||||
if (ItemHandlerHelper.insertItem(container.getConnectedItems(), took, true) == null) {
|
if (ItemHandlerHelper.insertItem(container.getConnectedItems(), took, true) == null) {
|
||||||
@@ -63,7 +65,7 @@ public class ProcessingCraftingTask implements ICraftingTask {
|
|||||||
network.insertItem(took, took.stackSize, false);
|
network.insertItem(took, took.stackSize, false);
|
||||||
}
|
}
|
||||||
} else if (!childTasks[i]) {
|
} else if (!childTasks[i]) {
|
||||||
ICraftingPattern pattern = RefinedStorageUtils.getPattern(network, input);
|
ICraftingPattern pattern = NetworkUtils.getPattern(network, input);
|
||||||
|
|
||||||
if (pattern != null) {
|
if (pattern != null) {
|
||||||
childTasks[i] = true;
|
childTasks[i] = true;
|
||||||
@@ -92,7 +94,7 @@ public class ProcessingCraftingTask implements ICraftingTask {
|
|||||||
|
|
||||||
public boolean onInserted(ItemStack stack) {
|
public boolean onInserted(ItemStack stack) {
|
||||||
for (int i = 0; i < pattern.getOutputs().length; ++i) {
|
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;
|
satisfied[i] = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -118,9 +120,9 @@ public class ProcessingCraftingTask implements ICraftingTask {
|
|||||||
pattern.writeToNBT(patternTag);
|
pattern.writeToNBT(patternTag);
|
||||||
tag.setTag(CraftingPattern.NBT, patternTag);
|
tag.setTag(CraftingPattern.NBT, patternTag);
|
||||||
|
|
||||||
RefinedStorageUtils.writeBooleanArray(tag, NBT_INSERTED, inserted);
|
BasicCraftingTask.writeBooleanArray(tag, NBT_INSERTED, inserted);
|
||||||
RefinedStorageUtils.writeBooleanArray(tag, NBT_CHILD_TASKS, childTasks);
|
BasicCraftingTask.writeBooleanArray(tag, NBT_CHILD_TASKS, childTasks);
|
||||||
RefinedStorageUtils.writeBooleanArray(tag, NBT_SATISFIED, satisfied);
|
BasicCraftingTask.writeBooleanArray(tag, NBT_SATISFIED, satisfied);
|
||||||
|
|
||||||
tag.setInteger("Type", ID);
|
tag.setInteger("Type", ID);
|
||||||
}
|
}
|
||||||
|
|||||||
166
src/main/java/refinedstorage/apiimpl/network/NetworkNodeGraph.java
Executable file
166
src/main/java/refinedstorage/apiimpl/network/NetworkNodeGraph.java
Executable file
@@ -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<INetworkNode> nodes = new ArrayList<>();
|
||||||
|
private Set<Integer> 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<INetworkNode> newNodes = new ArrayList<>();
|
||||||
|
Set<Integer> newNodeHashes = new HashSet<>();
|
||||||
|
|
||||||
|
Set<BlockPos> checked = new HashSet<>();
|
||||||
|
Queue<BlockPos> 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<INetworkNode> oldNodes = new ArrayList<>(nodes);
|
||||||
|
Set<Integer> 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<INetworkNode> all() {
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Integer> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,25 +2,17 @@ package refinedstorage.apiimpl.network;
|
|||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.EnumHand;
|
|
||||||
import refinedstorage.api.network.IWirelessGridConsumer;
|
import refinedstorage.api.network.IWirelessGridConsumer;
|
||||||
|
|
||||||
public class WirelessGridConsumer implements IWirelessGridConsumer {
|
public class WirelessGridConsumer implements IWirelessGridConsumer {
|
||||||
private EntityPlayer player;
|
private EntityPlayer player;
|
||||||
private EnumHand hand;
|
|
||||||
private ItemStack stack;
|
private ItemStack stack;
|
||||||
|
|
||||||
public WirelessGridConsumer(EntityPlayer player, EnumHand hand, ItemStack stack) {
|
public WirelessGridConsumer(EntityPlayer player, ItemStack stack) {
|
||||||
this.player = player;
|
this.player = player;
|
||||||
this.hand = hand;
|
|
||||||
this.stack = stack;
|
this.stack = stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public EnumHand getHand() {
|
|
||||||
return hand;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EntityPlayer getPlayer() {
|
public EntityPlayer getPlayer() {
|
||||||
return player;
|
return player;
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import net.minecraft.util.EnumHand;
|
|||||||
import refinedstorage.RefinedStorage;
|
import refinedstorage.RefinedStorage;
|
||||||
import refinedstorage.RefinedStorageGui;
|
import refinedstorage.RefinedStorageGui;
|
||||||
import refinedstorage.RefinedStorageItems;
|
import refinedstorage.RefinedStorageItems;
|
||||||
import refinedstorage.RefinedStorageUtils;
|
|
||||||
import refinedstorage.api.network.*;
|
import refinedstorage.api.network.*;
|
||||||
import refinedstorage.item.ItemWirelessGrid;
|
import refinedstorage.item.ItemWirelessGrid;
|
||||||
|
|
||||||
@@ -16,14 +15,10 @@ import java.util.Iterator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class WirelessGridHandler implements IWirelessGridHandler {
|
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 INetworkMaster network;
|
||||||
|
|
||||||
private List<IWirelessGridConsumer> consumers = new ArrayList<IWirelessGridConsumer>();
|
private List<IWirelessGridConsumer> consumers = new ArrayList<>();
|
||||||
private List<IWirelessGridConsumer> consumersToRemove = new ArrayList<IWirelessGridConsumer>();
|
private List<IWirelessGridConsumer> consumersToRemove = new ArrayList<>();
|
||||||
|
|
||||||
public WirelessGridHandler(INetworkMaster network) {
|
public WirelessGridHandler(INetworkMaster network) {
|
||||||
this.network = network;
|
this.network = network;
|
||||||
@@ -33,26 +28,13 @@ public class WirelessGridHandler implements IWirelessGridHandler {
|
|||||||
public void update() {
|
public void update() {
|
||||||
consumers.removeAll(consumersToRemove);
|
consumers.removeAll(consumersToRemove);
|
||||||
consumersToRemove.clear();
|
consumersToRemove.clear();
|
||||||
|
|
||||||
Iterator<IWirelessGridConsumer> 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
|
@Override
|
||||||
public boolean onOpen(EntityPlayer player, EnumHand hand) {
|
public boolean onOpen(EntityPlayer player, EnumHand hand) {
|
||||||
boolean inRange = false;
|
boolean inRange = false;
|
||||||
|
|
||||||
for (INetworkNode node : network.getNodes()) {
|
for (INetworkNode node : network.getNodeGraph().all()) {
|
||||||
if (node instanceof IWirelessTransmitter) {
|
if (node instanceof IWirelessTransmitter) {
|
||||||
IWirelessTransmitter transmitter = (IWirelessTransmitter) node;
|
IWirelessTransmitter transmitter = (IWirelessTransmitter) node;
|
||||||
|
|
||||||
@@ -70,13 +52,19 @@ public class WirelessGridHandler implements IWirelessGridHandler {
|
|||||||
return false;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -94,15 +82,15 @@ public class WirelessGridHandler implements IWirelessGridHandler {
|
|||||||
public void drainEnergy(EntityPlayer player, int energy) {
|
public void drainEnergy(EntityPlayer player, int energy) {
|
||||||
IWirelessGridConsumer consumer = getConsumer(player);
|
IWirelessGridConsumer consumer = getConsumer(player);
|
||||||
|
|
||||||
if (consumer != null) {
|
if (consumer != null && RefinedStorage.INSTANCE.wirelessGridUsesEnergy) {
|
||||||
ItemWirelessGrid item = RefinedStorageItems.WIRELESS_GRID;
|
ItemWirelessGrid item = RefinedStorageItems.WIRELESS_GRID;
|
||||||
ItemStack held = consumer.getPlayer().getHeldItem(consumer.getHand());
|
|
||||||
|
|
||||||
if (held.getItemDamage() != ItemWirelessGrid.TYPE_CREATIVE) {
|
if (consumer.getStack().getItemDamage() != ItemWirelessGrid.TYPE_CREATIVE) {
|
||||||
item.extractEnergy(held, energy, false);
|
item.extractEnergy(consumer.getStack(), energy, false);
|
||||||
|
|
||||||
if (item.getEnergyStored(held) <= 0) {
|
if (item.getEnergyStored(consumer.getStack()) <= 0) {
|
||||||
onClose(player);
|
onClose(player);
|
||||||
|
|
||||||
consumer.getPlayer().closeScreen();
|
consumer.getPlayer().closeScreen();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
80
src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java
Executable file
80
src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java
Executable file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,27 +1,28 @@
|
|||||||
package refinedstorage.apiimpl.network;
|
package refinedstorage.apiimpl.network.grid;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayerMP;
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
import net.minecraft.inventory.InventoryHelper;
|
import net.minecraft.inventory.InventoryHelper;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import refinedstorage.RefinedStorageUtils;
|
import refinedstorage.RefinedStorage;
|
||||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||||
import refinedstorage.api.autocrafting.ICraftingTask;
|
import refinedstorage.api.autocrafting.ICraftingTask;
|
||||||
import refinedstorage.api.network.GridExtractFlags;
|
|
||||||
import refinedstorage.api.network.IGridHandler;
|
|
||||||
import refinedstorage.api.network.INetworkMaster;
|
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;
|
public static final int MAX_CRAFTING_PER_REQUEST = 500;
|
||||||
|
|
||||||
private INetworkMaster network;
|
private INetworkMaster network;
|
||||||
|
|
||||||
public GridHandler(INetworkMaster network) {
|
public ItemGridHandler(INetworkMaster network) {
|
||||||
this.network = network;
|
this.network = network;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onExtract(int id, int flags, EntityPlayerMP player) {
|
public void onExtract(int hash, int flags, EntityPlayerMP player) {
|
||||||
ItemStack item = network.getStorage().get(id);
|
ItemStack item = network.getItemStorage().get(hash);
|
||||||
|
|
||||||
if (item == null) {
|
if (item == null) {
|
||||||
return;
|
return;
|
||||||
@@ -29,12 +30,12 @@ public class GridHandler implements IGridHandler {
|
|||||||
|
|
||||||
int itemSize = item.stackSize;
|
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();
|
ItemStack held = player.inventory.getItemStack();
|
||||||
|
|
||||||
if (single) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
} else if (player.inventory.getItemStack() != null) {
|
} else if (player.inventory.getItemStack() != null) {
|
||||||
@@ -43,7 +44,7 @@ public class GridHandler implements IGridHandler {
|
|||||||
|
|
||||||
int size = 64;
|
int size = 64;
|
||||||
|
|
||||||
if ((flags & GridExtractFlags.EXTRACT_HALF) == GridExtractFlags.EXTRACT_HALF && itemSize > 1) {
|
if ((flags & EXTRACT_HALF) == EXTRACT_HALF && itemSize > 1) {
|
||||||
size = itemSize / 2;
|
size = itemSize / 2;
|
||||||
|
|
||||||
if (size > 32) {
|
if (size > 32) {
|
||||||
@@ -51,16 +52,16 @@ public class GridHandler implements IGridHandler {
|
|||||||
}
|
}
|
||||||
} else if (single) {
|
} else if (single) {
|
||||||
size = 1;
|
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
|
// NO OP, the quantity already set (64) is needed for shift
|
||||||
}
|
}
|
||||||
|
|
||||||
size = Math.min(size, item.getItem().getItemStackLimit(item));
|
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 (took != null) {
|
||||||
if ((flags & GridExtractFlags.EXTRACT_SHIFT) == GridExtractFlags.EXTRACT_SHIFT) {
|
if ((flags & EXTRACT_SHIFT) == EXTRACT_SHIFT) {
|
||||||
if (!player.inventory.addItemStackToInventory(took.copy())) {
|
if (!player.inventory.addItemStackToInventory(took.copy())) {
|
||||||
InventoryHelper.spawnItemStack(player.worldObj, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), took);
|
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();
|
player.updateHeldItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
network.getWirelessGridHandler().drainEnergy(player, WirelessGridHandler.USAGE_EXTRACT);
|
network.getWirelessGridHandler().drainEnergy(player, RefinedStorage.INSTANCE.wirelessGridExtractUsage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack onInsert(ItemStack stack) {
|
public ItemStack onInsert(EntityPlayerMP player, ItemStack stack) {
|
||||||
return network.insertItem(stack, stack.stackSize, false);
|
ItemStack remainder = network.insertItem(stack, stack.stackSize, false);
|
||||||
|
|
||||||
|
network.getWirelessGridHandler().drainEnergy(player, RefinedStorage.INSTANCE.wirelessGridInsertUsage);
|
||||||
|
|
||||||
|
return remainder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInsertHeldItem(boolean single, EntityPlayerMP player) {
|
public void onInsertHeldItem(EntityPlayerMP player, boolean single) {
|
||||||
if (player.inventory.getItemStack() == null) {
|
if (player.inventory.getItemStack() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -108,16 +113,16 @@ public class GridHandler implements IGridHandler {
|
|||||||
|
|
||||||
player.updateHeldItem();
|
player.updateHeldItem();
|
||||||
|
|
||||||
network.getWirelessGridHandler().drainEnergy(player, WirelessGridHandler.USAGE_INSERT);
|
network.getWirelessGridHandler().drainEnergy(player, RefinedStorage.INSTANCE.wirelessGridInsertUsage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCraftingRequested(int id, int quantity) {
|
public void onCraftingRequested(int hash, int quantity) {
|
||||||
if (quantity <= 0 || quantity > MAX_CRAFTING_PER_REQUEST) {
|
if (quantity <= 0 || quantity > MAX_CRAFTING_PER_REQUEST) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack stack = network.getStorage().get(id);
|
ItemStack stack = network.getItemStorage().get(hash);
|
||||||
|
|
||||||
if (stack == null) {
|
if (stack == null) {
|
||||||
return;
|
return;
|
||||||
@@ -125,11 +130,11 @@ public class GridHandler implements IGridHandler {
|
|||||||
|
|
||||||
int quantityPerRequest = 0;
|
int quantityPerRequest = 0;
|
||||||
|
|
||||||
ICraftingPattern pattern = RefinedStorageUtils.getPattern(network, stack);
|
ICraftingPattern pattern = NetworkUtils.getPattern(network, stack);
|
||||||
|
|
||||||
if (pattern != null) {
|
if (pattern != null) {
|
||||||
for (ItemStack output : pattern.getOutputs()) {
|
for (ItemStack output : pattern.getOutputs()) {
|
||||||
if (RefinedStorageUtils.compareStackNoQuantity(stack, output)) {
|
if (CompareUtils.compareStackNoQuantity(stack, output)) {
|
||||||
quantityPerRequest += output.stackSize;
|
quantityPerRequest += output.stackSize;
|
||||||
|
|
||||||
if (!pattern.isProcessing()) {
|
if (!pattern.isProcessing()) {
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,15 +4,15 @@ import net.minecraft.item.ItemStack;
|
|||||||
import refinedstorage.RefinedStorageBlocks;
|
import refinedstorage.RefinedStorageBlocks;
|
||||||
import refinedstorage.RefinedStorageItems;
|
import refinedstorage.RefinedStorageItems;
|
||||||
import refinedstorage.api.solderer.ISoldererRecipe;
|
import refinedstorage.api.solderer.ISoldererRecipe;
|
||||||
import refinedstorage.block.EnumStorageType;
|
import refinedstorage.block.EnumItemStorageType;
|
||||||
import refinedstorage.item.ItemBlockStorage;
|
import refinedstorage.item.ItemBlockStorage;
|
||||||
import refinedstorage.item.ItemProcessor;
|
import refinedstorage.item.ItemProcessor;
|
||||||
|
|
||||||
public class SoldererRecipeStorage implements ISoldererRecipe {
|
public class SoldererRecipeStorage implements ISoldererRecipe {
|
||||||
private EnumStorageType type;
|
private EnumItemStorageType type;
|
||||||
private ItemStack[] rows;
|
private ItemStack[] rows;
|
||||||
|
|
||||||
public SoldererRecipeStorage(EnumStorageType type, int storagePart) {
|
public SoldererRecipeStorage(EnumItemStorageType type, int storagePart) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.rows = new ItemStack[]{
|
this.rows = new ItemStack[]{
|
||||||
new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_BASIC),
|
new ItemStack(RefinedStorageItems.PROCESSOR, 1, ItemProcessor.TYPE_BASIC),
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package refinedstorage.apiimpl.solderer;
|
package refinedstorage.apiimpl.solderer;
|
||||||
|
|
||||||
import net.minecraft.init.Blocks;
|
|
||||||
import net.minecraft.init.Items;
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import refinedstorage.RefinedStorageItems;
|
import refinedstorage.RefinedStorageItems;
|
||||||
import refinedstorage.api.solderer.ISoldererRecipe;
|
import refinedstorage.api.solderer.ISoldererRecipe;
|
||||||
@@ -12,25 +10,11 @@ public class SoldererRecipeUpgrade implements ISoldererRecipe {
|
|||||||
private ItemStack result;
|
private ItemStack result;
|
||||||
|
|
||||||
public SoldererRecipeUpgrade(int type) {
|
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.result = new ItemStack(RefinedStorageItems.UPGRADE, 1, type);
|
||||||
this.rows = new ItemStack[]{
|
this.rows = new ItemStack[]{
|
||||||
requirement,
|
ItemUpgrade.getRequirement(type),
|
||||||
new ItemStack(RefinedStorageItems.UPGRADE, 1, 0),
|
new ItemStack(RefinedStorageItems.UPGRADE, 1, 0),
|
||||||
requirement
|
ItemUpgrade.getRequirement(type)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package refinedstorage.apiimpl.solderer;
|
package refinedstorage.apiimpl.solderer;
|
||||||
|
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
import refinedstorage.RefinedStorageUtils;
|
|
||||||
import refinedstorage.api.solderer.ISoldererRecipe;
|
import refinedstorage.api.solderer.ISoldererRecipe;
|
||||||
import refinedstorage.api.solderer.ISoldererRegistry;
|
import refinedstorage.api.solderer.ISoldererRegistry;
|
||||||
|
import refinedstorage.api.storage.CompareUtils;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
@@ -11,7 +11,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class SoldererRegistry implements ISoldererRegistry {
|
public class SoldererRegistry implements ISoldererRegistry {
|
||||||
private List<ISoldererRecipe> recipes = new ArrayList<ISoldererRecipe>();
|
private List<ISoldererRecipe> recipes = new ArrayList<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addRecipe(@Nonnull ISoldererRecipe recipe) {
|
public void addRecipe(@Nonnull ISoldererRecipe recipe) {
|
||||||
@@ -30,7 +30,7 @@ public class SoldererRegistry implements ISoldererRegistry {
|
|||||||
boolean found = true;
|
boolean found = true;
|
||||||
|
|
||||||
for (int i = 0; i < 3; ++i) {
|
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;
|
found = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
126
src/main/java/refinedstorage/apiimpl/storage/fluid/FluidRenderer.java
Executable file
126
src/main/java/refinedstorage/apiimpl/storage/fluid/FluidRenderer.java
Executable file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
217
src/main/java/refinedstorage/apiimpl/storage/fluid/FluidStorageNBT.java
Executable file
217
src/main/java/refinedstorage/apiimpl/storage/fluid/FluidStorageNBT.java
Executable file
@@ -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<FluidStack> 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<FluidStack> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
68
src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java
Executable file
68
src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java
Executable file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
119
src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java
Executable file
119
src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java
Executable file
@@ -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<IFluidStorage> storages = new ArrayList<>();
|
||||||
|
private Multimap<Fluid, FluidStack> 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<FluidStack> getStacks() {
|
||||||
|
return stacks.values();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<IFluidStorage> getStorages() {
|
||||||
|
return storages;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,27 +1,29 @@
|
|||||||
package refinedstorage.apiimpl.storage;
|
package refinedstorage.apiimpl.storage.item;
|
||||||
|
|
||||||
import com.google.common.collect.ArrayListMultimap;
|
import com.google.common.collect.ArrayListMultimap;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import refinedstorage.RefinedStorageUtils;
|
|
||||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||||
import refinedstorage.api.network.INetworkMaster;
|
import refinedstorage.api.network.INetworkMaster;
|
||||||
import refinedstorage.api.network.INetworkNode;
|
import refinedstorage.api.network.NetworkUtils;
|
||||||
import refinedstorage.api.storage.IGroupedStorage;
|
import refinedstorage.api.storage.CompareUtils;
|
||||||
import refinedstorage.api.storage.IStorage;
|
import refinedstorage.api.storage.item.IGroupedItemStorage;
|
||||||
import refinedstorage.api.storage.IStorageProvider;
|
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.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class GroupedStorage implements IGroupedStorage {
|
public class GroupedItemStorage implements IGroupedItemStorage {
|
||||||
private INetworkMaster network;
|
private INetworkMaster network;
|
||||||
private List<IStorage> storages = new ArrayList<IStorage>();
|
private List<IItemStorage> storages = new ArrayList<>();
|
||||||
private Multimap<Item, ItemStack> stacks = ArrayListMultimap.create();
|
private Multimap<Item, ItemStack> stacks = ArrayListMultimap.create();
|
||||||
|
|
||||||
public GroupedStorage(INetworkMaster network) {
|
public GroupedItemStorage(INetworkMaster network) {
|
||||||
this.network = network;
|
this.network = network;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,15 +31,13 @@ public class GroupedStorage implements IGroupedStorage {
|
|||||||
public void rebuild() {
|
public void rebuild() {
|
||||||
storages.clear();
|
storages.clear();
|
||||||
|
|
||||||
for (INetworkNode node : network.getNodes()) {
|
network.getNodeGraph().all().stream()
|
||||||
if (node.canUpdate() && node instanceof IStorageProvider) {
|
.filter(node -> node.canUpdate() && node instanceof IItemStorageProvider)
|
||||||
((IStorageProvider) node).addStorages(storages);
|
.forEach(node -> ((IItemStorageProvider) node).addItemStorages(storages));
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stacks.clear();
|
stacks.clear();
|
||||||
|
|
||||||
for (IStorage storage : storages) {
|
for (IItemStorage storage : storages) {
|
||||||
for (ItemStack stack : storage.getItems()) {
|
for (ItemStack stack : storage.getItems()) {
|
||||||
add(stack, true);
|
add(stack, true);
|
||||||
}
|
}
|
||||||
@@ -51,17 +51,17 @@ public class GroupedStorage implements IGroupedStorage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
network.sendStorageToClient();
|
network.sendItemStorageToClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(ItemStack stack, boolean rebuilding) {
|
public void add(@Nonnull ItemStack stack, boolean rebuilding) {
|
||||||
for (ItemStack otherStack : stacks.get(stack.getItem())) {
|
for (ItemStack otherStack : stacks.get(stack.getItem())) {
|
||||||
if (RefinedStorageUtils.compareStackNoQuantity(otherStack, stack)) {
|
if (CompareUtils.compareStackNoQuantity(otherStack, stack)) {
|
||||||
otherStack.stackSize += stack.stackSize;
|
otherStack.stackSize += stack.stackSize;
|
||||||
|
|
||||||
if (!rebuilding) {
|
if (!rebuilding) {
|
||||||
network.sendStorageDeltaToClient(stack, stack.stackSize);
|
network.sendItemStorageDeltaToClient(stack, stack.stackSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -71,23 +71,23 @@ public class GroupedStorage implements IGroupedStorage {
|
|||||||
stacks.put(stack.getItem(), stack.copy());
|
stacks.put(stack.getItem(), stack.copy());
|
||||||
|
|
||||||
if (!rebuilding) {
|
if (!rebuilding) {
|
||||||
network.sendStorageDeltaToClient(stack, stack.stackSize);
|
network.sendItemStorageDeltaToClient(stack, stack.stackSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void remove(ItemStack stack) {
|
public void remove(@Nonnull ItemStack stack) {
|
||||||
for (ItemStack otherStack : stacks.get(stack.getItem())) {
|
for (ItemStack otherStack : stacks.get(stack.getItem())) {
|
||||||
if (RefinedStorageUtils.compareStackNoQuantity(otherStack, stack)) {
|
if (CompareUtils.compareStackNoQuantity(otherStack, stack)) {
|
||||||
otherStack.stackSize -= stack.stackSize;
|
otherStack.stackSize -= stack.stackSize;
|
||||||
|
|
||||||
if (otherStack.stackSize == 0) {
|
if (otherStack.stackSize == 0) {
|
||||||
if (!RefinedStorageUtils.hasPattern(network, stack)) {
|
if (!NetworkUtils.hasPattern(network, stack)) {
|
||||||
stacks.remove(otherStack.getItem(), otherStack);
|
stacks.remove(otherStack.getItem(), otherStack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
network.sendStorageDeltaToClient(stack, -stack.stackSize);
|
network.sendItemStorageDeltaToClient(stack, -stack.stackSize);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -95,9 +95,10 @@ public class GroupedStorage implements IGroupedStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack get(ItemStack stack, int flags) {
|
@Nullable
|
||||||
|
public ItemStack get(@Nonnull ItemStack stack, int flags) {
|
||||||
for (ItemStack otherStack : stacks.get(stack.getItem())) {
|
for (ItemStack otherStack : stacks.get(stack.getItem())) {
|
||||||
if (RefinedStorageUtils.compareStack(otherStack, stack, flags)) {
|
if (CompareUtils.compareStack(otherStack, stack, flags)) {
|
||||||
return otherStack;
|
return otherStack;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -106,9 +107,10 @@ public class GroupedStorage implements IGroupedStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack get(int id) {
|
@Nullable
|
||||||
|
public ItemStack get(int hash) {
|
||||||
for (ItemStack stack : this.stacks.values()) {
|
for (ItemStack stack : this.stacks.values()) {
|
||||||
if (RefinedStorageUtils.getItemStackHashCode(stack) == id) {
|
if (NetworkUtils.getItemStackHashCode(stack) == hash) {
|
||||||
return stack;
|
return stack;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -122,7 +124,7 @@ public class GroupedStorage implements IGroupedStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<IStorage> getStorages() {
|
public List<IItemStorage> getStorages() {
|
||||||
return storages;
|
return storages;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package refinedstorage.apiimpl.storage;
|
package refinedstorage.apiimpl.storage.item;
|
||||||
|
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -6,19 +6,19 @@ import net.minecraft.nbt.NBTTagCompound;
|
|||||||
import net.minecraft.nbt.NBTTagList;
|
import net.minecraft.nbt.NBTTagList;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraftforge.items.ItemHandlerHelper;
|
import net.minecraftforge.items.ItemHandlerHelper;
|
||||||
import refinedstorage.RefinedStorageUtils;
|
import refinedstorage.api.storage.CompareUtils;
|
||||||
import refinedstorage.api.storage.IStorage;
|
import refinedstorage.api.storage.item.IItemStorage;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
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.
|
* safe backwards compatibility breaks.
|
||||||
*/
|
*/
|
||||||
private static final int PROTOCOL = 1;
|
private static final int PROTOCOL = 1;
|
||||||
@@ -38,14 +38,14 @@ public abstract class NBTStorage implements IStorage {
|
|||||||
private int capacity;
|
private int capacity;
|
||||||
private TileEntity tile;
|
private TileEntity tile;
|
||||||
|
|
||||||
private List<ItemStack> stacks = new ArrayList<ItemStack>();
|
private List<ItemStack> 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 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
|
* @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.tag = tag;
|
||||||
this.capacity = capacity;
|
this.capacity = capacity;
|
||||||
this.tile = tile;
|
this.tile = tile;
|
||||||
@@ -117,7 +117,7 @@ public abstract class NBTStorage implements IStorage {
|
|||||||
@Override
|
@Override
|
||||||
public ItemStack insertItem(ItemStack stack, int size, boolean simulate) {
|
public ItemStack insertItem(ItemStack stack, int size, boolean simulate) {
|
||||||
for (ItemStack otherStack : stacks) {
|
for (ItemStack otherStack : stacks) {
|
||||||
if (RefinedStorageUtils.compareStackNoQuantity(otherStack, stack)) {
|
if (CompareUtils.compareStackNoQuantity(otherStack, stack)) {
|
||||||
if (getCapacity() != -1 && getStored() + size > getCapacity()) {
|
if (getCapacity() != -1 && getStored() + size > getCapacity()) {
|
||||||
int remainingSpace = getCapacity() - getStored();
|
int remainingSpace = getCapacity() - getStored();
|
||||||
|
|
||||||
@@ -180,7 +180,7 @@ public abstract class NBTStorage implements IStorage {
|
|||||||
@Override
|
@Override
|
||||||
public ItemStack extractItem(ItemStack stack, int size, int flags) {
|
public ItemStack extractItem(ItemStack stack, int size, int flags) {
|
||||||
for (ItemStack otherStack : stacks) {
|
for (ItemStack otherStack : stacks) {
|
||||||
if (RefinedStorageUtils.compareStack(otherStack, stack, flags)) {
|
if (CompareUtils.compareStack(otherStack, stack, flags)) {
|
||||||
if (size > otherStack.stackSize) {
|
if (size > otherStack.stackSize) {
|
||||||
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()}
|
* @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 NBTStorage#createNBT()}
|
* @return The provided {@link ItemStack} with NBT tags from {@link ItemStorageNBT#createNBT()}
|
||||||
*/
|
*/
|
||||||
public static ItemStack createStackWithNBT(ItemStack stack) {
|
public static ItemStack createStackWithNBT(ItemStack stack) {
|
||||||
stack.setTagCompound(createNBT());
|
stack.setTagCompound(createNBT());
|
||||||
@@ -17,12 +17,11 @@ import net.minecraft.world.IBlockAccess;
|
|||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
import refinedstorage.RefinedStorage;
|
import refinedstorage.RefinedStorage;
|
||||||
import refinedstorage.RefinedStorageUtils;
|
|
||||||
import refinedstorage.item.ItemBlockBase;
|
import refinedstorage.item.ItemBlockBase;
|
||||||
import refinedstorage.tile.TileBase;
|
import refinedstorage.tile.TileBase;
|
||||||
|
|
||||||
public abstract class BlockBase extends Block {
|
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;
|
private String name;
|
||||||
|
|
||||||
@@ -91,7 +90,7 @@ public abstract class BlockBase extends Block {
|
|||||||
|
|
||||||
tile.setDirection(getPlacementType().getNext(tile.getDirection()));
|
tile.setDirection(getPlacementType().getNext(tile.getDirection()));
|
||||||
|
|
||||||
RefinedStorageUtils.updateBlock(world, pos);
|
tile.updateBlock();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -99,12 +98,23 @@ public abstract class BlockBase extends Block {
|
|||||||
return false;
|
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
|
@Override
|
||||||
public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack stack) {
|
public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, ItemStack stack) {
|
||||||
super.onBlockPlacedBy(world, pos, state, player, stack);
|
super.onBlockPlacedBy(world, pos, state, player, stack);
|
||||||
|
|
||||||
if (getPlacementType() != null) {
|
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) {
|
public void breakBlock(World world, BlockPos pos, IBlockState state) {
|
||||||
TileEntity tile = world.getTileEntity(pos);
|
TileEntity tile = world.getTileEntity(pos);
|
||||||
|
|
||||||
if (tile instanceof TileBase && ((TileBase) tile).getDroppedItems() != null) {
|
if (tile instanceof TileBase && ((TileBase) tile).getDrops() != null) {
|
||||||
IItemHandler handler = ((TileBase) tile).getDroppedItems();
|
IItemHandler handler = ((TileBase) tile).getDrops();
|
||||||
|
|
||||||
for (int i = 0; i < handler.getSlots(); ++i) {
|
for (int i = 0; i < handler.getSlots(); ++i) {
|
||||||
if (handler.getStackInSlot(i) != null) {
|
if (handler.getStackInSlot(i) != null) {
|
||||||
@@ -137,7 +147,7 @@ public abstract class BlockBase extends Block {
|
|||||||
world.setBlockToAir(pos);
|
world.setBlockToAir(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
public EnumPlacementType getPlacementType() {
|
protected EnumPlacementType getPlacementType() {
|
||||||
return EnumPlacementType.HORIZONTAL;
|
return EnumPlacementType.HORIZONTAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,83 +1,226 @@
|
|||||||
package refinedstorage.block;
|
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.PropertyBool;
|
||||||
|
import net.minecraft.block.properties.PropertyDirection;
|
||||||
import net.minecraft.block.state.BlockStateContainer;
|
import net.minecraft.block.state.BlockStateContainer;
|
||||||
import net.minecraft.block.state.IBlockState;
|
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.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.BlockRenderLayer;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
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.IBlockAccess;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
import refinedstorage.RefinedStorage;
|
||||||
import refinedstorage.api.network.INetworkMaster;
|
import refinedstorage.api.network.INetworkMaster;
|
||||||
import refinedstorage.api.network.INetworkNode;
|
import refinedstorage.api.network.INetworkNode;
|
||||||
|
import refinedstorage.api.network.NetworkUtils;
|
||||||
import refinedstorage.tile.TileBase;
|
import refinedstorage.tile.TileBase;
|
||||||
import refinedstorage.tile.TileCable;
|
import refinedstorage.tile.TileCable;
|
||||||
|
import refinedstorage.tile.TileMultipartNode;
|
||||||
|
import refinedstorage.tile.TileNode;
|
||||||
|
|
||||||
public class BlockCable extends BlockNode {
|
import java.util.ArrayList;
|
||||||
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.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public static final PropertyBool NORTH = PropertyBool.create("north");
|
public class BlockCable extends BlockCoverable {
|
||||||
public static final PropertyBool EAST = PropertyBool.create("east");
|
protected static final PropertyDirection DIRECTION = PropertyDirection.create("direction");
|
||||||
public static final PropertyBool SOUTH = PropertyBool.create("south");
|
|
||||||
public static final PropertyBool WEST = PropertyBool.create("west");
|
protected static AxisAlignedBB createAABB(int fromX, int fromY, int fromZ, int toX, int toY, int toZ) {
|
||||||
public static final PropertyBool UP = PropertyBool.create("up");
|
return new AxisAlignedBB((float) fromX / 16F, (float) fromY / 16F, (float) fromZ / 16F, (float) toX / 16F, (float) toY / 16F, (float) toZ / 16F);
|
||||||
public static final PropertyBool DOWN = PropertyBool.create("down");
|
}
|
||||||
|
|
||||||
|
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) {
|
public BlockCable(String name) {
|
||||||
super(name);
|
super(Material.ROCK);
|
||||||
|
|
||||||
|
this.name = name;
|
||||||
|
|
||||||
setHardness(0.6F);
|
setHardness(0.6F);
|
||||||
|
setRegistryName(RefinedStorage.ID, name);
|
||||||
|
setCreativeTab(RefinedStorage.INSTANCE.tab);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlockCable() {
|
public BlockCable() {
|
||||||
this("cable");
|
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
|
@Override
|
||||||
public TileEntity createTileEntity(World world, IBlockState state) {
|
public TileEntity createTileEntity(World world, IBlockState state) {
|
||||||
return new TileCable();
|
return new TileCable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BlockStateContainer.Builder createBlockStateBuilder() {
|
protected BlockStateContainer createBlockState() {
|
||||||
return super.createBlockStateBuilder()
|
BlockStateContainer.Builder builder = new BlockStateContainer.Builder(this);
|
||||||
.add(NORTH)
|
|
||||||
|
builder.add(NORTH)
|
||||||
.add(EAST)
|
.add(EAST)
|
||||||
.add(SOUTH)
|
.add(SOUTH)
|
||||||
.add(WEST)
|
.add(WEST)
|
||||||
.add(UP)
|
.add(UP)
|
||||||
.add(DOWN);
|
.add(DOWN)
|
||||||
|
.add(BlockMultipartContainer.PROPERTY_MULTIPART_CONTAINER);
|
||||||
|
|
||||||
|
if (getPlacementType() != null) {
|
||||||
|
builder.add(DIRECTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) {
|
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) {
|
||||||
return super.getActualState(state, world, pos)
|
state = super.getActualState(state, world, pos)
|
||||||
.withProperty(NORTH, hasConnectionWith(world, pos, pos.north()))
|
.withProperty(NORTH, hasConnectionWith(world, pos, EnumFacing.NORTH))
|
||||||
.withProperty(EAST, hasConnectionWith(world, pos, pos.east()))
|
.withProperty(EAST, hasConnectionWith(world, pos, EnumFacing.EAST))
|
||||||
.withProperty(SOUTH, hasConnectionWith(world, pos, pos.south()))
|
.withProperty(SOUTH, hasConnectionWith(world, pos, EnumFacing.SOUTH))
|
||||||
.withProperty(WEST, hasConnectionWith(world, pos, pos.west()))
|
.withProperty(WEST, hasConnectionWith(world, pos, EnumFacing.WEST))
|
||||||
.withProperty(UP, hasConnectionWith(world, pos, pos.up()))
|
.withProperty(UP, hasConnectionWith(world, pos, EnumFacing.UP))
|
||||||
.withProperty(DOWN, hasConnectionWith(world, pos, pos.down()));
|
.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) {
|
private boolean hasConnectionWith(IBlockAccess world, BlockPos pos, EnumFacing direction) {
|
||||||
TileEntity tile = world.getTileEntity(pos);
|
TileEntity facing = world.getTileEntity(pos.offset(direction));
|
||||||
|
|
||||||
if (tile instanceof INetworkMaster || tile instanceof INetworkNode) {
|
if (facing instanceof INetworkMaster || facing instanceof INetworkNode) {
|
||||||
// Do not render a cable extension to on this position when we have a direction (like an exporter, importer or external storage)
|
// Do not render a cable extension where our cable "head" is (e.g. importer, exporter, external storage heads).
|
||||||
if (getPlacementType() != null) {
|
if (getPlacementType() != null && ((TileMultipartNode) world.getTileEntity(pos)).getFacingTile() == facing) {
|
||||||
return ((TileBase) world.getTileEntity(basePos)).getFacingTile() != tile;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return !TileMultipartNode.hasBlockingMicroblock(world, pos, direction) && !TileMultipartNode.hasBlockingMicroblock(world, pos.offset(direction), direction.getOpposite());
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
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<AxisAlignedBB> getUnionizedCollisionBoxes(IBlockState state) {
|
||||||
|
List<AxisAlignedBB> 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<AxisAlignedBB> getNonUnionizedCollisionBoxes(IBlockState state) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<AxisAlignedBB> getCollisionBoxes(IBlockState state) {
|
||||||
|
List<AxisAlignedBB> boxes = new ArrayList<>();
|
||||||
|
|
||||||
|
boxes.addAll(getUnionizedCollisionBoxes(state));
|
||||||
|
boxes.addAll(getNonUnionizedCollisionBoxes(state));
|
||||||
|
|
||||||
|
return boxes;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) {
|
public void addCollisionBoxToListDefault(IBlockState state, World world, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, Entity entityIn) {
|
||||||
return CABLE_AABB;
|
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
|
@Override
|
||||||
@@ -90,8 +233,113 @@ public class BlockCable extends BlockNode {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
protected EnumPlacementType getPlacementType() {
|
||||||
public EnumPlacementType getPlacementType() {
|
|
||||||
return null;
|
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<ItemStack> getDropsDefault(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
|
||||||
|
List<ItemStack> 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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,15 +6,71 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import refinedstorage.RefinedStorage;
|
import refinedstorage.RefinedStorage;
|
||||||
import refinedstorage.RefinedStorageGui;
|
import refinedstorage.RefinedStorageGui;
|
||||||
import refinedstorage.tile.TileConstructor;
|
import refinedstorage.tile.TileConstructor;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class BlockConstructor extends BlockCable {
|
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() {
|
public BlockConstructor() {
|
||||||
super("constructor");
|
this("constructor");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AxisAlignedBB> getNonUnionizedCollisionBoxes(IBlockState state) {
|
||||||
|
List<AxisAlignedBB> 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
|
@Override
|
||||||
@@ -23,7 +79,11 @@ public class BlockConstructor extends BlockCable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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) {
|
if (!world.isRemote) {
|
||||||
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.CONSTRUCTOR, world, pos.getX(), pos.getY(), pos.getZ());
|
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.CONSTRUCTOR, world, pos.getX(), pos.getY(), pos.getZ());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,22 +20,24 @@ import net.minecraft.world.World;
|
|||||||
import refinedstorage.RefinedStorage;
|
import refinedstorage.RefinedStorage;
|
||||||
import refinedstorage.RefinedStorageBlocks;
|
import refinedstorage.RefinedStorageBlocks;
|
||||||
import refinedstorage.RefinedStorageGui;
|
import refinedstorage.RefinedStorageGui;
|
||||||
|
import refinedstorage.api.network.NetworkUtils;
|
||||||
import refinedstorage.item.ItemBlockController;
|
import refinedstorage.item.ItemBlockController;
|
||||||
import refinedstorage.tile.controller.TileController;
|
import refinedstorage.tile.TileController;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class BlockController extends BlockBase {
|
public class BlockController extends BlockBase {
|
||||||
public static final PropertyEnum TYPE = PropertyEnum.create("type", EnumControllerType.class);
|
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() {
|
public BlockController() {
|
||||||
super("controller");
|
super("controller");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getSubBlocks(Item item, CreativeTabs tab, List subItems) {
|
public void getSubBlocks(Item item, CreativeTabs tab, List<ItemStack> subItems) {
|
||||||
for (int i = 0; i <= 1; i++) {
|
for (int i = 0; i <= 1; i++) {
|
||||||
subItems.add(ItemBlockController.createStackWithNBT(new ItemStack(item, 1, i)));
|
subItems.add(ItemBlockController.createStackWithNBT(new ItemStack(item, 1, i)));
|
||||||
}
|
}
|
||||||
@@ -104,7 +106,7 @@ public class BlockController extends BlockBase {
|
|||||||
@Override
|
@Override
|
||||||
public void breakBlock(World world, BlockPos pos, IBlockState state) {
|
public void breakBlock(World world, BlockPos pos, IBlockState state) {
|
||||||
if (!world.isRemote) {
|
if (!world.isRemote) {
|
||||||
((TileController) world.getTileEntity(pos)).disconnectAll();
|
((TileController) world.getTileEntity(pos)).getNodeGraph().disconnectAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
super.breakBlock(world, pos, state);
|
super.breakBlock(world, pos, state);
|
||||||
@@ -115,13 +117,13 @@ public class BlockController extends BlockBase {
|
|||||||
super.neighborChanged(state, world, pos, block);
|
super.neighborChanged(state, world, pos, block);
|
||||||
|
|
||||||
if (!world.isRemote) {
|
if (!world.isRemote) {
|
||||||
((TileController) world.getTileEntity(pos)).rebuildNodes();
|
NetworkUtils.rebuildGraph((TileController) world.getTileEntity(pos));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
|
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
|
||||||
List<ItemStack> drops = new ArrayList<ItemStack>();
|
List<ItemStack> drops = new ArrayList<>();
|
||||||
|
|
||||||
ItemStack stack = new ItemStack(RefinedStorageBlocks.CONTROLLER, 1, RefinedStorageBlocks.CONTROLLER.getMetaFromState(state));
|
ItemStack stack = new ItemStack(RefinedStorageBlocks.CONTROLLER, 1, RefinedStorageBlocks.CONTROLLER.getMetaFromState(state));
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class BlockCrafter extends BlockNode {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EnumPlacementType getPlacementType() {
|
public EnumPlacementType getPlacementType() {
|
||||||
return EnumPlacementType.ANY;
|
return EnumPlacementType.ANY_FACE_PLAYER;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasConnectivityState() {
|
public boolean hasConnectivityState() {
|
||||||
|
|||||||
@@ -6,15 +6,23 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import refinedstorage.RefinedStorage;
|
import refinedstorage.RefinedStorage;
|
||||||
|
import refinedstorage.RefinedStorageBlocks;
|
||||||
import refinedstorage.RefinedStorageGui;
|
import refinedstorage.RefinedStorageGui;
|
||||||
import refinedstorage.tile.TileDestructor;
|
import refinedstorage.tile.TileDestructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class BlockDestructor extends BlockCable {
|
public class BlockDestructor extends BlockCable {
|
||||||
|
public BlockDestructor(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
public BlockDestructor() {
|
public BlockDestructor() {
|
||||||
super("destructor");
|
this("destructor");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -23,7 +31,16 @@ public class BlockDestructor extends BlockCable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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<AxisAlignedBB> 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) {
|
if (!world.isRemote) {
|
||||||
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.DESTRUCTOR, world, pos.getX(), pos.getY(), pos.getZ());
|
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.DESTRUCTOR, world, pos.getX(), pos.getY(), pos.getZ());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ import refinedstorage.RefinedStorageGui;
|
|||||||
import refinedstorage.tile.TileDetector;
|
import refinedstorage.tile.TileDetector;
|
||||||
|
|
||||||
public class BlockDetector extends BlockNode {
|
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() {
|
public BlockDetector() {
|
||||||
super("detector");
|
super("detector");
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import refinedstorage.RefinedStorageGui;
|
|||||||
import refinedstorage.tile.TileDiskDrive;
|
import refinedstorage.tile.TileDiskDrive;
|
||||||
|
|
||||||
public class BlockDiskDrive extends BlockNode {
|
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() {
|
public BlockDiskDrive() {
|
||||||
super("disk_drive");
|
super("disk_drive");
|
||||||
@@ -37,7 +37,7 @@ public class BlockDiskDrive extends BlockNode {
|
|||||||
@Override
|
@Override
|
||||||
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) {
|
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) {
|
||||||
return super.getActualState(state, world, 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
|
@Override
|
||||||
|
|||||||
@@ -6,24 +6,91 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import refinedstorage.RefinedStorage;
|
import refinedstorage.RefinedStorage;
|
||||||
import refinedstorage.RefinedStorageGui;
|
import refinedstorage.RefinedStorageGui;
|
||||||
import refinedstorage.tile.TileExporter;
|
import refinedstorage.tile.TileExporter;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class BlockExporter extends BlockCable {
|
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() {
|
public BlockExporter() {
|
||||||
super("exporter");
|
super("exporter");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AxisAlignedBB> getNonUnionizedCollisionBoxes(IBlockState state) {
|
||||||
|
List<AxisAlignedBB> 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
|
@Override
|
||||||
public TileEntity createTileEntity(World world, IBlockState state) {
|
public TileEntity createTileEntity(World world, IBlockState state) {
|
||||||
return new TileExporter();
|
return new TileExporter();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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) {
|
if (!world.isRemote) {
|
||||||
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.EXPORTER, world, pos.getX(), pos.getY(), pos.getZ());
|
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.EXPORTER, world, pos.getX(), pos.getY(), pos.getZ());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,34 +7,83 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import refinedstorage.RefinedStorage;
|
import refinedstorage.RefinedStorage;
|
||||||
import refinedstorage.RefinedStorageGui;
|
import refinedstorage.RefinedStorageGui;
|
||||||
import refinedstorage.tile.externalstorage.TileExternalStorage;
|
import refinedstorage.tile.externalstorage.TileExternalStorage;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class BlockExternalStorage extends BlockCable {
|
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() {
|
public BlockExternalStorage() {
|
||||||
super("external_storage");
|
super("external_storage");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AxisAlignedBB> getNonUnionizedCollisionBoxes(IBlockState state) {
|
||||||
|
List<AxisAlignedBB> 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
|
@Override
|
||||||
public TileEntity createTileEntity(World world, IBlockState state) {
|
public TileEntity createTileEntity(World world, IBlockState state) {
|
||||||
return new TileExternalStorage();
|
return new TileExternalStorage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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) {
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block block) {
|
public void onNeighborBlockChangeDefault(World world, BlockPos pos, IBlockState state, Block neighborBlock) {
|
||||||
super.neighborChanged(state, world, pos, block);
|
super.onNeighborBlockChangeDefault(world, pos, state, neighborBlock);
|
||||||
|
|
||||||
if (!world.isRemote) {
|
if (!world.isRemote) {
|
||||||
TileExternalStorage externalStorage = (TileExternalStorage) world.getTileEntity(pos);
|
TileExternalStorage externalStorage = (TileExternalStorage) world.getTileEntity(pos);
|
||||||
|
|||||||
43
src/main/java/refinedstorage/block/BlockFluidInterface.java
Executable file
43
src/main/java/refinedstorage/block/BlockFluidInterface.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
114
src/main/java/refinedstorage/block/BlockFluidStorage.java
Executable file
114
src/main/java/refinedstorage/block/BlockFluidStorage.java
Executable file
@@ -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<ItemStack> 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<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
|
||||||
|
TileFluidStorage storage = (TileFluidStorage) world.getTileEntity(pos);
|
||||||
|
|
||||||
|
List<ItemStack> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,8 +32,8 @@ public class BlockGrid extends BlockNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getSubBlocks(Item item, CreativeTabs tab, List subItems) {
|
public void getSubBlocks(Item item, CreativeTabs tab, List<ItemStack> subItems) {
|
||||||
for (int i = 0; i <= 2; i++) {
|
for (int i = 0; i <= 3; i++) {
|
||||||
subItems.add(new ItemStack(item, 1, i));
|
subItems.add(new ItemStack(item, 1, i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -47,12 +47,12 @@ public class BlockGrid extends BlockNode {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBlockState getStateFromMeta(int meta) {
|
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
|
@Override
|
||||||
public int getMetaFromState(IBlockState state) {
|
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
|
@Override
|
||||||
|
|||||||
@@ -6,15 +6,82 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import refinedstorage.RefinedStorage;
|
import refinedstorage.RefinedStorage;
|
||||||
import refinedstorage.RefinedStorageGui;
|
import refinedstorage.RefinedStorageGui;
|
||||||
import refinedstorage.tile.TileImporter;
|
import refinedstorage.tile.TileImporter;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class BlockImporter extends BlockCable {
|
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() {
|
public BlockImporter() {
|
||||||
super("importer");
|
this("importer");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AxisAlignedBB> getNonUnionizedCollisionBoxes(IBlockState state) {
|
||||||
|
List<AxisAlignedBB> 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
|
@Override
|
||||||
@@ -23,7 +90,11 @@ public class BlockImporter extends BlockCable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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) {
|
if (!world.isRemote) {
|
||||||
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.IMPORTER, world, pos.getX(), pos.getY(), pos.getZ());
|
player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.IMPORTER, world, pos.getX(), pos.getY(), pos.getZ());
|
||||||
}
|
}
|
||||||
|
|||||||
27
src/main/java/refinedstorage/block/BlockNetworkReceiver.java
Executable file
27
src/main/java/refinedstorage/block/BlockNetworkReceiver.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
43
src/main/java/refinedstorage/block/BlockNetworkTransmitter.java
Executable file
43
src/main/java/refinedstorage/block/BlockNetworkTransmitter.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,10 +11,11 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
import net.minecraft.world.IBlockAccess;
|
import net.minecraft.world.IBlockAccess;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import refinedstorage.api.network.INetworkMaster;
|
import refinedstorage.api.network.INetworkMaster;
|
||||||
|
import refinedstorage.api.network.NetworkUtils;
|
||||||
import refinedstorage.tile.TileNode;
|
import refinedstorage.tile.TileNode;
|
||||||
|
|
||||||
public abstract class BlockNode extends BlockBase {
|
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) {
|
public BlockNode(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
@@ -63,7 +64,7 @@ public abstract class BlockNode extends BlockBase {
|
|||||||
TileEntity tile = world.getTileEntity(pos.offset(facing));
|
TileEntity tile = world.getTileEntity(pos.offset(facing));
|
||||||
|
|
||||||
if (tile instanceof TileNode && ((TileNode) tile).isConnected()) {
|
if (tile instanceof TileNode && ((TileNode) tile).isConnected()) {
|
||||||
((TileNode) tile).getNetwork().rebuildNodes();
|
NetworkUtils.rebuildGraph(((TileNode) tile).getNetwork());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -86,7 +87,7 @@ public abstract class BlockNode extends BlockBase {
|
|||||||
super.breakBlock(world, pos, state);
|
super.breakBlock(world, pos, state);
|
||||||
|
|
||||||
if (network != null) {
|
if (network != null) {
|
||||||
network.rebuildNodes();
|
NetworkUtils.rebuildGraph(network);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,9 +17,9 @@ import refinedstorage.RefinedStorageGui;
|
|||||||
import refinedstorage.tile.TileSolderer;
|
import refinedstorage.tile.TileSolderer;
|
||||||
|
|
||||||
public class BlockSolderer extends BlockNode {
|
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() {
|
public BlockSolderer() {
|
||||||
super("solderer");
|
super("solderer");
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class BlockStorage extends BlockNode {
|
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() {
|
public BlockStorage() {
|
||||||
super("storage");
|
super("storage");
|
||||||
@@ -34,7 +34,7 @@ public class BlockStorage extends BlockNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getSubBlocks(Item item, CreativeTabs tab, List subItems) {
|
public void getSubBlocks(Item item, CreativeTabs tab, List<ItemStack> subItems) {
|
||||||
for (int i = 0; i <= 4; ++i) {
|
for (int i = 0; i <= 4; ++i) {
|
||||||
subItems.add(ItemBlockStorage.initNBT(new ItemStack(item, 1, i)));
|
subItems.add(ItemBlockStorage.initNBT(new ItemStack(item, 1, i)));
|
||||||
}
|
}
|
||||||
@@ -49,12 +49,12 @@ public class BlockStorage extends BlockNode {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBlockState getStateFromMeta(int meta) {
|
public IBlockState getStateFromMeta(int meta) {
|
||||||
return getDefaultState().withProperty(TYPE, EnumStorageType.getById(meta));
|
return getDefaultState().withProperty(TYPE, EnumItemStorageType.getById(meta));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMetaFromState(IBlockState state) {
|
public int getMetaFromState(IBlockState state) {
|
||||||
return ((EnumStorageType) state.getValue(TYPE)).getId();
|
return ((EnumItemStorageType) state.getValue(TYPE)).getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -91,9 +91,9 @@ public class BlockStorage extends BlockNode {
|
|||||||
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
|
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
|
||||||
TileStorage storage = (TileStorage) world.getTileEntity(pos);
|
TileStorage storage = (TileStorage) world.getTileEntity(pos);
|
||||||
|
|
||||||
List<ItemStack> drops = new ArrayList<ItemStack>();
|
List<ItemStack> 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.setTagCompound(new NBTTagCompound());
|
||||||
stack.getTagCompound().setTag(TileStorage.NBT_STORAGE, storage.getStorageTag());
|
stack.getTagCompound().setTag(TileStorage.NBT_STORAGE, storage.getStorageTag());
|
||||||
|
|
||||||
|
|||||||
52
src/main/java/refinedstorage/block/EnumFluidStorageType.java
Executable file
52
src/main/java/refinedstorage/block/EnumFluidStorageType.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,8 @@ import net.minecraft.util.IStringSerializable;
|
|||||||
public enum EnumGridType implements IStringSerializable {
|
public enum EnumGridType implements IStringSerializable {
|
||||||
NORMAL(0, "normal"),
|
NORMAL(0, "normal"),
|
||||||
CRAFTING(1, "crafting"),
|
CRAFTING(1, "crafting"),
|
||||||
PATTERN(2, "pattern");
|
PATTERN(2, "pattern"),
|
||||||
|
FLUID(3, "fluid");
|
||||||
|
|
||||||
private int id;
|
private int id;
|
||||||
private String name;
|
private String name;
|
||||||
|
|||||||
@@ -1,52 +1,52 @@
|
|||||||
package refinedstorage.block;
|
package refinedstorage.block;
|
||||||
|
|
||||||
import net.minecraft.util.IStringSerializable;
|
import net.minecraft.util.IStringSerializable;
|
||||||
|
|
||||||
public enum EnumStorageType implements IStringSerializable {
|
public enum EnumItemStorageType implements IStringSerializable {
|
||||||
TYPE_1K(0, 1000, "1k"),
|
TYPE_1K(0, 1000, "1k"),
|
||||||
TYPE_4K(1, 4000, "4k"),
|
TYPE_4K(1, 4000, "4k"),
|
||||||
TYPE_16K(2, 16000, "16k"),
|
TYPE_16K(2, 16000, "16k"),
|
||||||
TYPE_64K(3, 64000, "64k"),
|
TYPE_64K(3, 64000, "64k"),
|
||||||
TYPE_CREATIVE(4, -1, "creative");
|
TYPE_CREATIVE(4, -1, "creative");
|
||||||
|
|
||||||
private int id;
|
private int id;
|
||||||
private int capacity;
|
private int capacity;
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
EnumStorageType(int id, int capacity, String name) {
|
EnumItemStorageType(int id, int capacity, String name) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.capacity = capacity;
|
this.capacity = capacity;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getId() {
|
public int getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getCapacity() {
|
public int getCapacity() {
|
||||||
return capacity;
|
return capacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static EnumStorageType getById(int id) {
|
public static EnumItemStorageType getById(int id) {
|
||||||
if (id == 5) {
|
if (id == 5) {
|
||||||
return TYPE_CREATIVE;
|
return TYPE_CREATIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (EnumStorageType type : EnumStorageType.values()) {
|
for (EnumItemStorageType type : EnumItemStorageType.values()) {
|
||||||
if (type.getId() == id) {
|
if (type.getId() == id) {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return TYPE_CREATIVE;
|
return TYPE_CREATIVE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,9 @@ public enum EnumPlacementType {
|
|||||||
ANY(
|
ANY(
|
||||||
EnumFacing.VALUES
|
EnumFacing.VALUES
|
||||||
),
|
),
|
||||||
|
ANY_FACE_PLAYER(
|
||||||
|
EnumFacing.VALUES
|
||||||
|
),
|
||||||
HORIZONTAL(
|
HORIZONTAL(
|
||||||
EnumFacing.NORTH,
|
EnumFacing.NORTH,
|
||||||
EnumFacing.EAST,
|
EnumFacing.EAST,
|
||||||
@@ -16,18 +19,18 @@ public enum EnumPlacementType {
|
|||||||
EnumFacing.WEST
|
EnumFacing.WEST
|
||||||
);
|
);
|
||||||
|
|
||||||
public final EnumFacing[] allowed;
|
final EnumFacing[] allowed;
|
||||||
|
|
||||||
EnumPlacementType(EnumFacing... allowed) {
|
EnumPlacementType(EnumFacing... allowed) {
|
||||||
this.allowed = allowed;
|
this.allowed = allowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
EnumFacing getFrom(BlockPos pos, EntityLivingBase entity) {
|
EnumFacing getFrom(EnumFacing facing, BlockPos pos, EntityLivingBase entity) {
|
||||||
switch (this) {
|
switch (this) {
|
||||||
case ANY:
|
case ANY:
|
||||||
EnumFacing facing = BlockPistonBase.getFacingFromEntity(pos, entity);
|
return facing.getOpposite();
|
||||||
|
case ANY_FACE_PLAYER:
|
||||||
return entity.isSneaking() ? facing.getOpposite() : facing;
|
return BlockPistonBase.getFacingFromEntity(pos, entity);
|
||||||
case HORIZONTAL:
|
case HORIZONTAL:
|
||||||
return entity.getHorizontalFacing().getOpposite();
|
return entity.getHorizontalFacing().getOpposite();
|
||||||
default:
|
default:
|
||||||
@@ -38,6 +41,7 @@ public enum EnumPlacementType {
|
|||||||
EnumFacing getNext(EnumFacing previous) {
|
EnumFacing getNext(EnumFacing previous) {
|
||||||
switch (this) {
|
switch (this) {
|
||||||
case ANY:
|
case ANY:
|
||||||
|
case ANY_FACE_PLAYER:
|
||||||
return previous.ordinal() + 1 >= EnumFacing.VALUES.length ? EnumFacing.VALUES[0] : EnumFacing.VALUES[previous.ordinal() + 1];
|
return previous.ordinal() + 1 >= EnumFacing.VALUES.length ? EnumFacing.VALUES[0] : EnumFacing.VALUES[previous.ordinal() + 1];
|
||||||
case HORIZONTAL:
|
case HORIZONTAL:
|
||||||
return previous.rotateYCCW();
|
return previous.rotateYCCW();
|
||||||
|
|||||||
@@ -1,19 +1,22 @@
|
|||||||
package refinedstorage.container;
|
package refinedstorage.container;
|
||||||
|
|
||||||
import net.minecraft.client.gui.GuiScreen;
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.inventory.ClickType;
|
import net.minecraft.inventory.ClickType;
|
||||||
import net.minecraft.inventory.Container;
|
import net.minecraft.inventory.Container;
|
||||||
import net.minecraft.inventory.Slot;
|
import net.minecraft.inventory.Slot;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import refinedstorage.container.slot.SlotDisabled;
|
import net.minecraftforge.items.ItemHandlerHelper;
|
||||||
import refinedstorage.container.slot.SlotSpecimen;
|
import refinedstorage.api.storage.CompareUtils;
|
||||||
import refinedstorage.container.slot.SlotSpecimenLegacy;
|
import refinedstorage.container.slot.*;
|
||||||
|
import refinedstorage.tile.TileBase;
|
||||||
|
import refinedstorage.tile.grid.WirelessGrid;
|
||||||
|
|
||||||
public abstract class ContainerBase extends Container {
|
public abstract class ContainerBase extends Container {
|
||||||
|
private TileBase tile;
|
||||||
private EntityPlayer player;
|
private EntityPlayer player;
|
||||||
|
|
||||||
public ContainerBase(EntityPlayer player) {
|
public ContainerBase(TileBase tile, EntityPlayer player) {
|
||||||
|
this.tile = tile;
|
||||||
this.player = player;
|
this.player = player;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21,11 +24,22 @@ public abstract class ContainerBase extends Container {
|
|||||||
return player;
|
return player;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TileBase getTile() {
|
||||||
|
return tile;
|
||||||
|
}
|
||||||
|
|
||||||
protected void addPlayerInventory(int xInventory, int yInventory) {
|
protected void addPlayerInventory(int xInventory, int yInventory) {
|
||||||
int id = 0;
|
int id = 0;
|
||||||
|
|
||||||
for (int i = 0; i < 9; i++) {
|
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++;
|
id++;
|
||||||
}
|
}
|
||||||
@@ -46,23 +60,15 @@ public abstract class ContainerBase extends Container {
|
|||||||
if (slot instanceof SlotSpecimen) {
|
if (slot instanceof SlotSpecimen) {
|
||||||
if (((SlotSpecimen) slot).isWithSize()) {
|
if (((SlotSpecimen) slot).isWithSize()) {
|
||||||
if (slot.getStack() != null) {
|
if (slot.getStack() != null) {
|
||||||
if (GuiScreen.isShiftKeyDown()) {
|
if (clickType == ClickType.QUICK_MOVE) {
|
||||||
slot.putStack(null);
|
slot.putStack(null);
|
||||||
} else {
|
} else {
|
||||||
int amount = slot.getStack().stackSize;
|
int amount = slot.getStack().stackSize;
|
||||||
|
|
||||||
if (clickedButton == 0) {
|
if (clickedButton == 0) {
|
||||||
amount--;
|
amount = Math.max(1, amount - 1);
|
||||||
|
|
||||||
if (amount < 1) {
|
|
||||||
amount = 1;
|
|
||||||
}
|
|
||||||
} else if (clickedButton == 1) {
|
} else if (clickedButton == 1) {
|
||||||
amount++;
|
amount = Math.min(64, amount + 1);
|
||||||
|
|
||||||
if (amount > 64) {
|
|
||||||
amount = 64;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
slot.getStack().stackSize = amount;
|
slot.getStack().stackSize = amount;
|
||||||
@@ -70,14 +76,7 @@ public abstract class ContainerBase extends Container {
|
|||||||
} else if (player.inventory.getItemStack() != null) {
|
} else if (player.inventory.getItemStack() != null) {
|
||||||
int amount = player.inventory.getItemStack().stackSize;
|
int amount = player.inventory.getItemStack().stackSize;
|
||||||
|
|
||||||
if (clickedButton == 1) {
|
slot.putStack(ItemHandlerHelper.copyStackWithSize(player.inventory.getItemStack(), clickedButton == 1 ? 1 : amount));
|
||||||
amount = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemStack toPut = player.inventory.getItemStack().copy();
|
|
||||||
toPut.stackSize = amount;
|
|
||||||
|
|
||||||
slot.putStack(toPut);
|
|
||||||
}
|
}
|
||||||
} else if (player.inventory.getItemStack() == null) {
|
} else if (player.inventory.getItemStack() == null) {
|
||||||
slot.putStack(null);
|
slot.putStack(null);
|
||||||
@@ -106,6 +105,41 @@ public abstract class ContainerBase extends Container {
|
|||||||
return null;
|
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
|
@Override
|
||||||
public boolean canInteractWith(EntityPlayer player) {
|
public boolean canInteractWith(EntityPlayer player) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -5,17 +5,18 @@ import net.minecraft.inventory.Slot;
|
|||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.items.SlotItemHandler;
|
import net.minecraftforge.items.SlotItemHandler;
|
||||||
import refinedstorage.container.slot.SlotSpecimen;
|
import refinedstorage.container.slot.SlotSpecimen;
|
||||||
|
import refinedstorage.container.slot.SlotSpecimenType;
|
||||||
import refinedstorage.tile.TileConstructor;
|
import refinedstorage.tile.TileConstructor;
|
||||||
|
|
||||||
public class ContainerConstructor extends ContainerBase {
|
public class ContainerConstructor extends ContainerBase {
|
||||||
public ContainerConstructor(EntityPlayer player, TileConstructor constructor) {
|
public ContainerConstructor(TileConstructor constructor, EntityPlayer player) {
|
||||||
super(player);
|
super(constructor, player);
|
||||||
|
|
||||||
for (int i = 0; i < 4; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
addSlotToContainer(new SlotItemHandler(constructor.getUpgrades(), i, 187, 6 + (i * 18)));
|
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);
|
addPlayerInventory(8, 55);
|
||||||
}
|
}
|
||||||
@@ -34,7 +35,7 @@ public class ContainerConstructor extends ContainerBase {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} else if (!mergeItemStack(stack, 0, 4, false)) {
|
} else if (!mergeItemStack(stack, 0, 4, false)) {
|
||||||
return null;
|
return mergeItemStackToSpecimen(stack, 4, 4 + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stack.stackSize == 0) {
|
if (stack.stackSize == 0) {
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package refinedstorage.container;
|
package refinedstorage.container;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import refinedstorage.tile.TileController;
|
||||||
|
|
||||||
public class ContainerController extends ContainerBase {
|
public class ContainerController extends ContainerBase {
|
||||||
public ContainerController(EntityPlayer player) {
|
public ContainerController(TileController controller, EntityPlayer player) {
|
||||||
super(player);
|
super(controller, player);
|
||||||
|
|
||||||
addPlayerInventory(8, 99);
|
addPlayerInventory(8, 99);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraftforge.items.SlotItemHandler;
|
import net.minecraftforge.items.SlotItemHandler;
|
||||||
import refinedstorage.tile.TileCrafter;
|
import refinedstorage.tile.TileCrafter;
|
||||||
|
|
||||||
public class ContainerCrafter extends ContainerStorage {
|
public class ContainerCrafter extends ContainerBase {
|
||||||
public ContainerCrafter(EntityPlayer player, TileCrafter crafter) {
|
public ContainerCrafter(TileCrafter crafter, EntityPlayer player) {
|
||||||
super(player);
|
super(crafter, player);
|
||||||
|
|
||||||
for (int i = 0; i < 9; ++i) {
|
for (int i = 0; i < 9; ++i) {
|
||||||
addSlotToContainer(new SlotItemHandler(crafter.getPatterns(), i, 8 + (18 * i), 20));
|
addSlotToContainer(new SlotItemHandler(crafter.getPatterns(), i, 8 + (18 * i), 20));
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package refinedstorage.container;
|
package refinedstorage.container;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import refinedstorage.tile.TileCraftingMonitor;
|
||||||
|
|
||||||
public class ContainerCraftingMonitor extends ContainerBase {
|
public class ContainerCraftingMonitor extends ContainerBase {
|
||||||
public ContainerCraftingMonitor(EntityPlayer player) {
|
public ContainerCraftingMonitor(TileCraftingMonitor craftingMonitor, EntityPlayer player) {
|
||||||
super(player);
|
super(craftingMonitor, player);
|
||||||
|
|
||||||
addPlayerInventory(8, 148);
|
addPlayerInventory(8, 148);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import javax.annotation.Nullable;
|
|||||||
|
|
||||||
public class ContainerCraftingSettings extends ContainerBase {
|
public class ContainerCraftingSettings extends ContainerBase {
|
||||||
public ContainerCraftingSettings(EntityPlayer player, final ItemStack stack) {
|
public ContainerCraftingSettings(EntityPlayer player, final ItemStack stack) {
|
||||||
super(player);
|
super(null, player);
|
||||||
|
|
||||||
final ItemStack slot = ItemHandlerHelper.copyStackWithSize(stack, 1);
|
final ItemStack slot = ItemHandlerHelper.copyStackWithSize(stack, 1);
|
||||||
|
|
||||||
|
|||||||
@@ -5,18 +5,19 @@ import net.minecraft.inventory.Slot;
|
|||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.items.SlotItemHandler;
|
import net.minecraftforge.items.SlotItemHandler;
|
||||||
import refinedstorage.container.slot.SlotSpecimen;
|
import refinedstorage.container.slot.SlotSpecimen;
|
||||||
|
import refinedstorage.container.slot.SlotSpecimenType;
|
||||||
import refinedstorage.tile.TileDestructor;
|
import refinedstorage.tile.TileDestructor;
|
||||||
|
|
||||||
public class ContainerDestructor extends ContainerBase {
|
public class ContainerDestructor extends ContainerBase {
|
||||||
public ContainerDestructor(EntityPlayer player, TileDestructor destructor) {
|
public ContainerDestructor(TileDestructor destructor, EntityPlayer player) {
|
||||||
super(player);
|
super(destructor, player);
|
||||||
|
|
||||||
for (int i = 0; i < 4; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
addSlotToContainer(new SlotItemHandler(destructor.getUpgrades(), i, 187, 6 + (i * 18)));
|
addSlotToContainer(new SlotItemHandler(destructor.getUpgrades(), i, 187, 6 + (i * 18)));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 9; ++i) {
|
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);
|
addPlayerInventory(8, 55);
|
||||||
@@ -36,7 +37,7 @@ public class ContainerDestructor extends ContainerBase {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} else if (!mergeItemStack(stack, 0, 4, false)) {
|
} else if (!mergeItemStack(stack, 0, 4, false)) {
|
||||||
return null;
|
return mergeItemStackToSpecimen(stack, 4, 4 + 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stack.stackSize == 0) {
|
if (stack.stackSize == 0) {
|
||||||
|
|||||||
@@ -1,15 +1,28 @@
|
|||||||
package refinedstorage.container;
|
package refinedstorage.container;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
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;
|
import refinedstorage.tile.TileDetector;
|
||||||
|
|
||||||
public class ContainerDetector extends ContainerBase {
|
public class ContainerDetector extends ContainerBase {
|
||||||
public ContainerDetector(EntityPlayer player, TileDetector detector) {
|
public ContainerDetector(TileDetector detector, EntityPlayer player) {
|
||||||
super(player);
|
super(detector, player);
|
||||||
|
|
||||||
addSlotToContainer(new SlotSpecimen(detector.getInventory(), 0, 107, 20));
|
addSlotToContainer(new SlotSpecimenType(detector, 0, 107, 20));
|
||||||
|
|
||||||
addPlayerInventory(8, 55);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,12 @@ import net.minecraft.entity.player.EntityPlayer;
|
|||||||
import net.minecraft.inventory.Slot;
|
import net.minecraft.inventory.Slot;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.items.SlotItemHandler;
|
import net.minecraftforge.items.SlotItemHandler;
|
||||||
|
import refinedstorage.container.slot.SlotSpecimenType;
|
||||||
import refinedstorage.tile.TileDiskDrive;
|
import refinedstorage.tile.TileDiskDrive;
|
||||||
|
|
||||||
public class ContainerDiskDrive extends ContainerStorage {
|
public class ContainerDiskDrive extends ContainerBase {
|
||||||
public ContainerDiskDrive(EntityPlayer player, TileDiskDrive drive) {
|
public ContainerDiskDrive(TileDiskDrive drive, EntityPlayer player) {
|
||||||
super(player);
|
super(drive, player);
|
||||||
|
|
||||||
for (int i = 0; i < 4; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
addSlotToContainer(new SlotItemHandler(drive.getDisks(), i, 98 + (i * 18), 78));
|
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));
|
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
|
@Override
|
||||||
@@ -35,7 +40,7 @@ public class ContainerDiskDrive extends ContainerStorage {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} else if (!mergeItemStack(stack, 0, 8, false)) {
|
} else if (!mergeItemStack(stack, 0, 8, false)) {
|
||||||
return null;
|
return mergeItemStackToSpecimen(stack, 8, 8 + 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stack.stackSize == 0) {
|
if (stack.stackSize == 0) {
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,19 +4,19 @@ import net.minecraft.entity.player.EntityPlayer;
|
|||||||
import net.minecraft.inventory.Slot;
|
import net.minecraft.inventory.Slot;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.items.SlotItemHandler;
|
import net.minecraftforge.items.SlotItemHandler;
|
||||||
import refinedstorage.container.slot.SlotSpecimen;
|
import refinedstorage.container.slot.SlotSpecimenType;
|
||||||
import refinedstorage.tile.TileExporter;
|
import refinedstorage.tile.TileExporter;
|
||||||
|
|
||||||
public class ContainerExporter extends ContainerBase {
|
public class ContainerExporter extends ContainerBase {
|
||||||
public ContainerExporter(EntityPlayer player, TileExporter exporter) {
|
public ContainerExporter(TileExporter exporter, EntityPlayer player) {
|
||||||
super(player);
|
super(exporter, player);
|
||||||
|
|
||||||
for (int i = 0; i < 4; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
addSlotToContainer(new SlotItemHandler(exporter.getUpgrades(), i, 187, 6 + (i * 18)));
|
addSlotToContainer(new SlotItemHandler(exporter.getUpgrades(), i, 187, 6 + (i * 18)));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 9; ++i) {
|
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);
|
addPlayerInventory(8, 55);
|
||||||
@@ -36,7 +36,7 @@ public class ContainerExporter extends ContainerBase {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} else if (!mergeItemStack(stack, 0, 4, false)) {
|
} else if (!mergeItemStack(stack, 0, 4, false)) {
|
||||||
return null;
|
return mergeItemStackToSpecimen(stack, 4, 4 + 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stack.stackSize == 0) {
|
if (stack.stackSize == 0) {
|
||||||
|
|||||||
30
src/main/java/refinedstorage/container/ContainerExternalStorage.java
Executable file
30
src/main/java/refinedstorage/container/ContainerExternalStorage.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
50
src/main/java/refinedstorage/container/ContainerFluidInterface.java
Executable file
50
src/main/java/refinedstorage/container/ContainerFluidInterface.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
30
src/main/java/refinedstorage/container/ContainerFluidStorage.java
Executable file
30
src/main/java/refinedstorage/container/ContainerFluidStorage.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
package refinedstorage.container;
|
package refinedstorage.container;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
import net.minecraft.inventory.Slot;
|
import net.minecraft.inventory.Slot;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.items.SlotItemHandler;
|
import net.minecraftforge.items.SlotItemHandler;
|
||||||
import refinedstorage.block.EnumGridType;
|
import refinedstorage.block.EnumGridType;
|
||||||
import refinedstorage.container.slot.*;
|
import refinedstorage.container.slot.*;
|
||||||
|
import refinedstorage.tile.TileBase;
|
||||||
import refinedstorage.tile.grid.IGrid;
|
import refinedstorage.tile.grid.IGrid;
|
||||||
import refinedstorage.tile.grid.TileGrid;
|
import refinedstorage.tile.grid.TileGrid;
|
||||||
import refinedstorage.tile.grid.WirelessGrid;
|
import refinedstorage.tile.grid.WirelessGrid;
|
||||||
@@ -16,8 +18,8 @@ public class ContainerGrid extends ContainerBase {
|
|||||||
private SlotGridCraftingResult craftingResultSlot;
|
private SlotGridCraftingResult craftingResultSlot;
|
||||||
private SlotDisabled patternResultSlot;
|
private SlotDisabled patternResultSlot;
|
||||||
|
|
||||||
public ContainerGrid(EntityPlayer player, IGrid grid) {
|
public ContainerGrid(IGrid grid, EntityPlayer player) {
|
||||||
super(player);
|
super(grid instanceof TileBase ? (TileBase) grid : null, player);
|
||||||
|
|
||||||
this.grid = grid;
|
this.grid = grid;
|
||||||
|
|
||||||
@@ -59,6 +61,12 @@ public class ContainerGrid extends ContainerBase {
|
|||||||
addSlotToContainer(new SlotItemHandler(((TileGrid) grid).getPatterns(), 0, 152, 96));
|
addSlotToContainer(new SlotItemHandler(((TileGrid) grid).getPatterns(), 0, 152, 96));
|
||||||
addSlotToContainer(new SlotOutput(((TileGrid) grid).getPatterns(), 1, 152, 132));
|
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() {
|
public IGrid getGrid() {
|
||||||
@@ -96,12 +104,18 @@ public class ContainerGrid extends ContainerBase {
|
|||||||
if (!player.worldObj.isRemote) {
|
if (!player.worldObj.isRemote) {
|
||||||
Slot slot = inventorySlots.get(slotIndex);
|
Slot slot = inventorySlots.get(slotIndex);
|
||||||
|
|
||||||
if (slot == craftingResultSlot) {
|
if (slot.getHasStack()) {
|
||||||
((TileGrid) grid).onCraftedShift(this, player);
|
if (slot == craftingResultSlot) {
|
||||||
} else if (grid.getGridHandler() != null && slot != patternResultSlot && !(slot instanceof SlotSpecimenLegacy) && slot.getHasStack()) {
|
((TileGrid) grid).onCraftedShift(this, player);
|
||||||
slot.putStack(grid.getGridHandler().onInsert(slot.getStack()));
|
} 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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
48
src/main/java/refinedstorage/container/ContainerGridFilter.java
Executable file
48
src/main/java/refinedstorage/container/ContainerGridFilter.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,19 +4,19 @@ import net.minecraft.entity.player.EntityPlayer;
|
|||||||
import net.minecraft.inventory.Slot;
|
import net.minecraft.inventory.Slot;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.items.SlotItemHandler;
|
import net.minecraftforge.items.SlotItemHandler;
|
||||||
import refinedstorage.container.slot.SlotSpecimen;
|
import refinedstorage.container.slot.SlotSpecimenType;
|
||||||
import refinedstorage.tile.TileImporter;
|
import refinedstorage.tile.TileImporter;
|
||||||
|
|
||||||
public class ContainerImporter extends ContainerBase {
|
public class ContainerImporter extends ContainerBase {
|
||||||
public ContainerImporter(EntityPlayer player, TileImporter importer) {
|
public ContainerImporter(TileImporter importer, EntityPlayer player) {
|
||||||
super(player);
|
super(importer, player);
|
||||||
|
|
||||||
for (int i = 0; i < 4; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
addSlotToContainer(new SlotItemHandler(importer.getUpgrades(), i, 187, 6 + (i * 18)));
|
addSlotToContainer(new SlotItemHandler(importer.getUpgrades(), i, 187, 6 + (i * 18)));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 9; ++i) {
|
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);
|
addPlayerInventory(8, 55);
|
||||||
@@ -36,7 +36,7 @@ public class ContainerImporter extends ContainerBase {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} else if (!mergeItemStack(stack, 0, 4, false)) {
|
} else if (!mergeItemStack(stack, 0, 4, false)) {
|
||||||
return null;
|
return mergeItemStackToSpecimen(stack, 4, 4 + 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stack.stackSize == 0) {
|
if (stack.stackSize == 0) {
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import refinedstorage.container.slot.SlotSpecimen;
|
|||||||
import refinedstorage.tile.TileInterface;
|
import refinedstorage.tile.TileInterface;
|
||||||
|
|
||||||
public class ContainerInterface extends ContainerBase {
|
public class ContainerInterface extends ContainerBase {
|
||||||
public ContainerInterface(EntityPlayer player, TileInterface tile) {
|
public ContainerInterface(TileInterface tile, EntityPlayer player) {
|
||||||
super(player);
|
super(tile, player);
|
||||||
|
|
||||||
for (int i = 0; i < 9; ++i) {
|
for (int i = 0; i < 9; ++i) {
|
||||||
addSlotToContainer(new SlotItemHandler(tile.getImportItems(), i, 8 + (18 * i), 20));
|
addSlotToContainer(new SlotItemHandler(tile.getImportItems(), i, 8 + (18 * i), 20));
|
||||||
|
|||||||
46
src/main/java/refinedstorage/container/ContainerNetworkTransmitter.java
Executable file
46
src/main/java/refinedstorage/container/ContainerNetworkTransmitter.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,8 +9,8 @@ import refinedstorage.container.slot.SlotSpecimen;
|
|||||||
import refinedstorage.tile.TileProcessingPatternEncoder;
|
import refinedstorage.tile.TileProcessingPatternEncoder;
|
||||||
|
|
||||||
public class ContainerProcessingPatternEncoder extends ContainerBase {
|
public class ContainerProcessingPatternEncoder extends ContainerBase {
|
||||||
public ContainerProcessingPatternEncoder(EntityPlayer player, TileProcessingPatternEncoder processingPatternEncoder) {
|
public ContainerProcessingPatternEncoder(TileProcessingPatternEncoder processingPatternEncoder, EntityPlayer player) {
|
||||||
super(player);
|
super(processingPatternEncoder, player);
|
||||||
|
|
||||||
addSlotToContainer(new SlotItemHandler(processingPatternEncoder.getPatterns(), 0, 152, 18));
|
addSlotToContainer(new SlotItemHandler(processingPatternEncoder.getPatterns(), 0, 152, 18));
|
||||||
addSlotToContainer(new SlotOutput(processingPatternEncoder.getPatterns(), 1, 152, 58));
|
addSlotToContainer(new SlotOutput(processingPatternEncoder.getPatterns(), 1, 152, 58));
|
||||||
@@ -20,7 +20,7 @@ public class ContainerProcessingPatternEncoder extends ContainerBase {
|
|||||||
int y = 20;
|
int y = 20;
|
||||||
|
|
||||||
for (int i = 0; i < 9 * 2; ++i) {
|
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;
|
x += 18;
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package refinedstorage.container;
|
package refinedstorage.container;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import refinedstorage.tile.TileRelay;
|
||||||
|
|
||||||
public class ContainerRelay extends ContainerBase {
|
public class ContainerRelay extends ContainerBase {
|
||||||
public ContainerRelay(EntityPlayer player) {
|
public ContainerRelay(TileRelay relay, EntityPlayer player) {
|
||||||
super(player);
|
super(relay, player);
|
||||||
|
|
||||||
addPlayerInventory(8, 50);
|
addPlayerInventory(8, 50);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import refinedstorage.container.slot.SlotOutput;
|
|||||||
import refinedstorage.tile.TileSolderer;
|
import refinedstorage.tile.TileSolderer;
|
||||||
|
|
||||||
public class ContainerSolderer extends ContainerBase {
|
public class ContainerSolderer extends ContainerBase {
|
||||||
public ContainerSolderer(EntityPlayer player, TileSolderer solderer) {
|
public ContainerSolderer(TileSolderer solderer, EntityPlayer player) {
|
||||||
super(player);
|
super(solderer, player);
|
||||||
|
|
||||||
int x = 44;
|
int x = 44;
|
||||||
int y = 20;
|
int y = 20;
|
||||||
|
|||||||
@@ -1,25 +1,30 @@
|
|||||||
package refinedstorage.container;
|
package refinedstorage.container;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
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.container.slot.SlotSpecimen;
|
||||||
|
import refinedstorage.tile.TileStorage;
|
||||||
|
|
||||||
public class ContainerStorage extends ContainerBase {
|
public class ContainerStorage extends ContainerBase {
|
||||||
public ContainerStorage(EntityPlayer player) {
|
public ContainerStorage(TileStorage tile, EntityPlayer player) {
|
||||||
super(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) {
|
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);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import net.minecraftforge.items.SlotItemHandler;
|
|||||||
import refinedstorage.tile.TileWirelessTransmitter;
|
import refinedstorage.tile.TileWirelessTransmitter;
|
||||||
|
|
||||||
public class ContainerWirelessTransmitter extends ContainerBase {
|
public class ContainerWirelessTransmitter extends ContainerBase {
|
||||||
public ContainerWirelessTransmitter(EntityPlayer player, TileWirelessTransmitter wirelessTransmitter) {
|
public ContainerWirelessTransmitter(TileWirelessTransmitter wirelessTransmitter, EntityPlayer player) {
|
||||||
super(player);
|
super(wirelessTransmitter, player);
|
||||||
|
|
||||||
for (int i = 0; i < 4; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
addSlotToContainer(new SlotItemHandler(wirelessTransmitter.getUpgrades(), i, 187, 6 + (i * 18)));
|
addSlotToContainer(new SlotItemHandler(wirelessTransmitter.getUpgrades(), i, 187, 6 + (i * 18)));
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public class SlotSpecimen extends SlotItemHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isItemValid(ItemStack stack) {
|
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
|
@Override
|
||||||
@@ -67,9 +67,7 @@ public class SlotSpecimen extends SlotItemHandler {
|
|||||||
Field f = ((ItemBlockSpecial) item).getClass().getDeclaredField("block");
|
Field f = ((ItemBlockSpecial) item).getClass().getDeclaredField("block");
|
||||||
f.setAccessible(true);
|
f.setAccessible(true);
|
||||||
return ((Block) f.get(item)).getDefaultState();
|
return ((Block) f.get(item)).getDefaultState();
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException | NoSuchFieldException e) {
|
||||||
// NO OP
|
|
||||||
} catch (NoSuchFieldException e) {
|
|
||||||
// NO OP
|
// NO OP
|
||||||
}
|
}
|
||||||
} else if (item instanceof ItemBlock) {
|
} else if (item instanceof ItemBlock) {
|
||||||
|
|||||||
23
src/main/java/refinedstorage/container/slot/SlotSpecimenFluid.java
Executable file
23
src/main/java/refinedstorage/container/slot/SlotSpecimenFluid.java
Executable file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
44
src/main/java/refinedstorage/container/slot/SlotSpecimenType.java
Executable file
44
src/main/java/refinedstorage/container/slot/SlotSpecimenType.java
Executable file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user