Compare commits
43 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 883d9ba49b | |||
| fe8d824526 | |||
| d2250b115f | |||
| e5ab9df086 | |||
| 96af371882 | |||
| bde76d1fb1 | |||
| eb4caaa688 | |||
| 3ba04b3831 | |||
| 7cd8b72bb7 | |||
| 2182b6e37c | |||
| 5d26b98ab8 | |||
| 979531afb7 | |||
| dcf7de9000 | |||
| 87999dbf27 | |||
| c2d18ce013 | |||
| 046a27bf4c | |||
| 841bc6e356 | |||
| e72b5b369c | |||
| d635a87f01 | |||
| 51481d3e30 | |||
| 77e11c7a24 | |||
| 3056bb6ffb | |||
| edc0cef2bb | |||
| 4bd2797f5e | |||
| f37dfd0a24 | |||
| 937ea00e9d | |||
| b431d5d681 | |||
| 0ef854ca4b | |||
| 2c6e50d48a | |||
| dcd94b1cfa | |||
| 89de98f71e | |||
| d16677224a | |||
| 89bebc4385 | |||
| 987ea8d39d | |||
| f4212a86c3 | |||
| 3c4a0cae11 | |||
| 2894a7caa0 | |||
| 044e639827 | |||
| d7b97fa7b8 | |||
| 62435a65f1 | |||
| bf4818cf97 | |||
| 3e09c49e03 | |||
| 9481c9a7d7 |
@@ -27,17 +27,18 @@ A Mod about Matter, Energy and using them to conquer the world..
|
||||
* [Website](http://ae-mod.info/)
|
||||
* [IRC #appliedenergistics on esper.net](http://webchat.esper.net/?channels=appliedenergistics&prompt=1)
|
||||
* [GitHub](https://github.com/AppliedEnergistics/Applied-Energistics-2)
|
||||
* [Discord](https://discord.gg/DJ9hVAN)
|
||||
|
||||
## License
|
||||
|
||||
* Applied Energistics 2 API
|
||||
- (c) 2013 - 2017 AlgorithmX2 et al
|
||||
- (c) 2013 - 2018 AlgorithmX2 et al
|
||||
- [](http://opensource.org/licenses/MIT)
|
||||
* Applied Energistics 2
|
||||
- (c) 2013 - 2017 AlgorithmX2 et al
|
||||
- (c) 2013 - 2018 AlgorithmX2 et al
|
||||
- [](https://raw.githubusercontent.com/AppliedEnergistics/Applied-Energistics-2/rv2/LICENSE)
|
||||
* Textures and Models
|
||||
- (c) 2013 - 2017 AlgorithmX2 et al
|
||||
- (c) 2013 - 2018 AlgorithmX2 et al
|
||||
- [](https://creativecommons.org/licenses/by-nc-sa/3.0/)
|
||||
* Text and Translations
|
||||
- [](https://creativecommons.org/publicdomain/zero/1.0/)
|
||||
@@ -146,14 +147,14 @@ Universal builds obtained [Here](http://ae2.ae-mod.info/Downloads/) should work
|
||||
When compiling against the AE2 API you can use gradle dependencies, just add
|
||||
|
||||
dependencies {
|
||||
compile "appeng:appliedenergistics2:rv_-_____-__:dev"
|
||||
compile "appeng:appliedenergistics2:rv_-_____-__:api"
|
||||
}
|
||||
|
||||
or add the compile line to your existing dependencies task to your build.gradle
|
||||
|
||||
Where the __ are filled in with the correct version criteria; AE2 is available from the default forge maven so no additional repositories are necessary.
|
||||
|
||||
An example string would be `appeng:appliedenergistics2:rv2-alpha-30:dev`
|
||||
An example string would be `appeng:appliedenergistics2:rv5-stable-1:api` for the API only or `appeng:appliedenergistics2:rv5-stable-1` for the whole mod.
|
||||
|
||||
## Applied Energistics 2 CraftTweaker
|
||||
|
||||
|
||||
+8
-8
@@ -9,22 +9,22 @@ aebasename=appliedenergistics2
|
||||
#########################################################
|
||||
minecraft_version=1.12.2
|
||||
mcp_mappings=snapshot_20171003
|
||||
forge_version=14.23.1.2554
|
||||
forge_version=14.23.3.2655
|
||||
|
||||
#########################################################
|
||||
# Installable #
|
||||
#########################################################
|
||||
hwyla_version=1.8.20-B35_1.12
|
||||
hwyla_version=1.8.26-B41_1.12.2
|
||||
|
||||
#########################################################
|
||||
# Provided APIs #
|
||||
#########################################################
|
||||
jei_version=4.8.0.105
|
||||
tesla_version=1.0.61
|
||||
ic2_version=2.8.19-ex112
|
||||
top_version=1.12-1.4.18-10
|
||||
cofhcore_version=1.12-4.+
|
||||
crafttweaker_version=4.0.10.310
|
||||
jei_version=4.10.0.198
|
||||
tesla_version=1.0.63
|
||||
ic2_version=2.8.73-ex112
|
||||
top_version=1.12-1.4.23-16
|
||||
cofhcore_version=1.12.2-4.5.2.19
|
||||
crafttweaker_version=4.1.8.9
|
||||
|
||||
#########################################################
|
||||
# Deployment #
|
||||
|
||||
@@ -83,7 +83,7 @@ dependencies {
|
||||
// compile against provided APIs
|
||||
compileOnly "mezz.jei:jei_${minecraft_version}:${jei_version}:api"
|
||||
compileOnly "mcp.mobius.waila:Hwyla:${hwyla_version}"
|
||||
compileOnly "net.darkhax.tesla:Tesla-1.12:${tesla_version}"
|
||||
compileOnly "net.darkhax.tesla:Tesla-1.12.2:${tesla_version}"
|
||||
compileOnly "net.industrial-craft:industrialcraft-2:${ic2_version}:api"
|
||||
compileOnly "mcjty.theoneprobe:TheOneProbe-1.12:${top_version}:api"
|
||||
compileOnly "cofh:CoFHCore:${cofhcore_version}:deobf"
|
||||
|
||||
@@ -148,6 +148,8 @@ public interface IBlocks
|
||||
|
||||
ITileDefinition iface();
|
||||
|
||||
ITileDefinition fluidIface();
|
||||
|
||||
ITileDefinition cellWorkbench();
|
||||
|
||||
ITileDefinition iOPort();
|
||||
|
||||
@@ -88,6 +88,14 @@ public interface IItems
|
||||
|
||||
IItemDefinition cell64k();
|
||||
|
||||
IItemDefinition fluidCell1k();
|
||||
|
||||
IItemDefinition fluidCell4k();
|
||||
|
||||
IItemDefinition fluidCell16k();
|
||||
|
||||
IItemDefinition fluidCell64k();
|
||||
|
||||
IItemDefinition spatialCell2();
|
||||
|
||||
IItemDefinition spatialCell16();
|
||||
|
||||
@@ -134,4 +134,12 @@ public interface IMaterials
|
||||
IItemDefinition qESingularity();
|
||||
|
||||
IItemDefinition blankPattern();
|
||||
|
||||
IItemDefinition fluidCell1kPart();
|
||||
|
||||
IItemDefinition fluidCell4kPart();
|
||||
|
||||
IItemDefinition fluidCell16kPart();
|
||||
|
||||
IItemDefinition fluidCell64kPart();
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public interface IParts
|
||||
AEColoredItemDefinition cableGlass();
|
||||
|
||||
AEColoredItemDefinition cableDenseCovered();
|
||||
|
||||
|
||||
AEColoredItemDefinition cableDenseSmart();
|
||||
|
||||
AEColoredItemDefinition lumenCableSmart();
|
||||
@@ -64,6 +64,8 @@ public interface IParts
|
||||
|
||||
IItemDefinition iface();
|
||||
|
||||
IItemDefinition fluidIface();
|
||||
|
||||
IItemDefinition levelEmitter();
|
||||
|
||||
IItemDefinition annihilationPlane();
|
||||
@@ -107,4 +109,18 @@ public interface IParts
|
||||
IItemDefinition storageMonitor();
|
||||
|
||||
IItemDefinition conversionMonitor();
|
||||
|
||||
IItemDefinition fluidTerminal();
|
||||
|
||||
IItemDefinition fluidImportBus();
|
||||
|
||||
IItemDefinition fluidExportBus();
|
||||
|
||||
IItemDefinition fluidStorageBus();
|
||||
|
||||
IItemDefinition fluidLevelEmitter();
|
||||
|
||||
IItemDefinition fluidAnnihilationPlane();
|
||||
|
||||
IItemDefinition fluidFormationnPlane();
|
||||
}
|
||||
|
||||
@@ -27,7 +27,8 @@ package appeng.api.implementations.items;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import appeng.api.storage.ICellWorkbenchItem;
|
||||
import appeng.api.storage.data.IAEItemStack;
|
||||
import appeng.api.storage.IStorageChannel;
|
||||
import appeng.api.storage.data.IAEStack;
|
||||
|
||||
|
||||
/**
|
||||
@@ -40,7 +41,7 @@ import appeng.api.storage.data.IAEItemStack;
|
||||
*
|
||||
* The standard AE implementation only provides 1-63 Types
|
||||
*/
|
||||
public interface IStorageCell extends ICellWorkbenchItem
|
||||
public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
|
||||
{
|
||||
|
||||
/**
|
||||
@@ -82,7 +83,7 @@ public interface IStorageCell extends ICellWorkbenchItem
|
||||
*
|
||||
* @return true to preventAdditionOfItem
|
||||
*/
|
||||
boolean isBlackListed( ItemStack cellItem, IAEItemStack requestedAddition );
|
||||
boolean isBlackListed( ItemStack cellItem, T requestedAddition );
|
||||
|
||||
/**
|
||||
* Allows you to specify if this storage cell can be stored inside other
|
||||
@@ -109,4 +110,9 @@ public interface IStorageCell extends ICellWorkbenchItem
|
||||
* @return drain in ae/t this storage cell will use.
|
||||
*/
|
||||
double getIdleDrain();
|
||||
|
||||
/**
|
||||
* @return the type of channel your cell should be part of
|
||||
*/
|
||||
IStorageChannel<T> getChannel();
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
package appeng.api.networking;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.networking.events.MENetworkEvent;
|
||||
import appeng.api.util.IReadOnlyCollection;
|
||||
|
||||
@@ -43,7 +45,8 @@ public interface IGrid
|
||||
*
|
||||
* @return the IGridCache you requested.
|
||||
*/
|
||||
<C extends IGridCache> C getCache( Class<? extends IGridCache> iface );
|
||||
@Nonnull
|
||||
<C extends IGridCache> C getCache( @Nonnull Class<? extends IGridCache> iface );
|
||||
|
||||
/**
|
||||
* Post an event into the network event bus.
|
||||
@@ -52,7 +55,8 @@ public interface IGrid
|
||||
*
|
||||
* @return returns ev back to original poster
|
||||
*/
|
||||
MENetworkEvent postEvent( MENetworkEvent ev );
|
||||
@Nonnull
|
||||
MENetworkEvent postEvent( @Nonnull MENetworkEvent ev );
|
||||
|
||||
/**
|
||||
* Post an event into the network event bus, but direct it at a single node.
|
||||
@@ -61,7 +65,8 @@ public interface IGrid
|
||||
*
|
||||
* @return returns ev back to original poster
|
||||
*/
|
||||
MENetworkEvent postEventTo( IGridNode node, MENetworkEvent ev );
|
||||
@Nonnull
|
||||
MENetworkEvent postEventTo( @Nonnull IGridNode node, @Nonnull MENetworkEvent ev );
|
||||
|
||||
/**
|
||||
* get a list of the diversity of classes, you can use this to better detect which machines your interested in,
|
||||
@@ -69,6 +74,7 @@ public interface IGrid
|
||||
*
|
||||
* @return IReadOnlyCollection of all available host types (Of Type IGridHost).
|
||||
*/
|
||||
@Nonnull
|
||||
IReadOnlyCollection<Class<? extends IGridHost>> getMachinesClasses();
|
||||
|
||||
/**
|
||||
@@ -78,11 +84,13 @@ public interface IGrid
|
||||
*
|
||||
* @return IMachineSet of all nodes belonging to hosts of specified class.
|
||||
*/
|
||||
IMachineSet getMachines( Class<? extends IGridHost> gridHostClass );
|
||||
@Nonnull
|
||||
IMachineSet getMachines( @Nonnull Class<? extends IGridHost> gridHostClass );
|
||||
|
||||
/**
|
||||
* @return IReadOnlyCollection for all nodes on the network, node visitors are preferred.
|
||||
*/
|
||||
@Nonnull
|
||||
IReadOnlyCollection<IGridNode> getNodes();
|
||||
|
||||
/**
|
||||
@@ -93,5 +101,6 @@ public interface IGrid
|
||||
/**
|
||||
* @return the node considered the pivot point of the grid.
|
||||
*/
|
||||
@Nonnull
|
||||
IGridNode getPivot();
|
||||
}
|
||||
@@ -26,6 +26,10 @@ package appeng.api.networking;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
import javax.annotation.Nonnegative;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
@@ -49,6 +53,7 @@ public interface IGridBlock
|
||||
*
|
||||
* @return ae/t to use.
|
||||
*/
|
||||
@Nonnegative
|
||||
double getIdlePowerUsage();
|
||||
|
||||
/**
|
||||
@@ -56,10 +61,11 @@ public interface IGridBlock
|
||||
*
|
||||
* @return Set of flags for this IGridBlock
|
||||
*/
|
||||
@Nonnull
|
||||
EnumSet<GridFlags> getFlags();
|
||||
|
||||
/**
|
||||
* generally speaking you will return true for this, the one exception is buses, or worm holes where the node
|
||||
* Generally speaking you will return true for this, the one exception is buses, or worm holes where the node
|
||||
* represents something that isn't a real connection in the world, but rather one represented internally to the
|
||||
* block.
|
||||
*
|
||||
@@ -68,37 +74,46 @@ public interface IGridBlock
|
||||
boolean isWorldAccessible();
|
||||
|
||||
/**
|
||||
* Must not return when {@link #isWorldAccessible()} is true.
|
||||
* Otherwise the behavior is unspecified.
|
||||
*
|
||||
* @return current location of this node
|
||||
*/
|
||||
@Nonnull
|
||||
DimensionalCoord getLocation();
|
||||
|
||||
/**
|
||||
* @return Transparent, or a valid color, NULL IS NOT A VALID RETURN
|
||||
*/
|
||||
@Nonnull
|
||||
AEColor getGridColor();
|
||||
|
||||
/**
|
||||
* Notifies your IGridBlock that changes were made to your connections
|
||||
*/
|
||||
void onGridNotification( GridNotification notification );
|
||||
void onGridNotification( @Nonnull GridNotification notification );
|
||||
|
||||
/**
|
||||
* Update Blocks network/connection/booting status. grid,
|
||||
*
|
||||
* @param grid grid
|
||||
* @param channelsInUse used channels
|
||||
* @deprecated to be removed in rv7
|
||||
*/
|
||||
@Deprecated
|
||||
void setNetworkStatus( IGrid grid, int channelsInUse );
|
||||
|
||||
/**
|
||||
* Determine which sides of the block can be connected too, only used when isWorldAccessible returns true, not used
|
||||
* for {@link IPart} implementations.
|
||||
*/
|
||||
@Nonnull
|
||||
EnumSet<EnumFacing> getConnectableSides();
|
||||
|
||||
/**
|
||||
* @return the IGridHost for the node, this will be an IGridPart or a TileEntity generally speaking.
|
||||
*/
|
||||
@Nonnull
|
||||
IGridHost getMachine();
|
||||
|
||||
/**
|
||||
@@ -111,5 +126,6 @@ public interface IGridBlock
|
||||
*
|
||||
* @return the render item stack to use to render this node, null is valid, and will not show this node.
|
||||
*/
|
||||
@Nullable
|
||||
ItemStack getMachineRepresentation();
|
||||
}
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
package appeng.api.networking;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
|
||||
/**
|
||||
* Allows you to create a network wise service, AE2 uses these for providing
|
||||
* item, spatial, and tunnel services.
|
||||
@@ -50,7 +53,7 @@ public interface IGridCache
|
||||
* @param gridNode removed from that grid
|
||||
* @param machine to be removed machine
|
||||
*/
|
||||
void removeNode( IGridNode gridNode, IGridHost machine );
|
||||
void removeNode( @Nonnull IGridNode gridNode, @Nonnull IGridHost machine );
|
||||
|
||||
/**
|
||||
* informs you cache that a machine was added to the grid.
|
||||
@@ -62,7 +65,7 @@ public interface IGridCache
|
||||
* @param gridNode added to grid node
|
||||
* @param machine to be added machine
|
||||
*/
|
||||
void addNode( IGridNode gridNode, IGridHost machine );
|
||||
void addNode( @Nonnull IGridNode gridNode, @Nonnull IGridHost machine );
|
||||
|
||||
/**
|
||||
* Called when a grid splits into two grids, AE will call a split as it
|
||||
@@ -71,7 +74,7 @@ public interface IGridCache
|
||||
*
|
||||
* @param destinationStorage storage which receives half of old grid
|
||||
*/
|
||||
void onSplit( IGridStorage destinationStorage );
|
||||
void onSplit( @Nonnull IGridStorage destinationStorage );
|
||||
|
||||
/**
|
||||
* Called when two grids merge into one, AE will call a join as it
|
||||
@@ -80,12 +83,12 @@ public interface IGridCache
|
||||
*
|
||||
* @param sourceStorage old storage
|
||||
*/
|
||||
void onJoin( IGridStorage sourceStorage );
|
||||
void onJoin( @Nonnull IGridStorage sourceStorage );
|
||||
|
||||
/**
|
||||
* Called when saving changes,
|
||||
*
|
||||
* @param destinationStorage storage
|
||||
*/
|
||||
void populateGridStorage( IGridStorage destinationStorage );
|
||||
void populateGridStorage( @Nonnull IGridStorage destinationStorage );
|
||||
}
|
||||
|
||||
@@ -24,7 +24,9 @@
|
||||
package appeng.api.networking;
|
||||
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
|
||||
/**
|
||||
@@ -38,14 +40,14 @@ public interface IGridCacheRegistry
|
||||
*
|
||||
* @param iface grid cache class
|
||||
*/
|
||||
void registerGridCache( Class<? extends IGridCache> iface, Class<? extends IGridCache> implementation );
|
||||
void registerGridCache( @Nonnull Class<? extends IGridCache> iface, @Nonnull Class<? extends IGridCache> implementation );
|
||||
|
||||
/**
|
||||
* requests a new INSTANCE of a grid cache for use, used internally
|
||||
*
|
||||
* @param grid grid
|
||||
*
|
||||
* @return a new HashMap of IGridCaches from the registry, called from IGrid when constructing a new grid.
|
||||
* @return a new Map of IGridCaches from the registry, called from IGrid when constructing a new grid.
|
||||
*/
|
||||
HashMap<Class<? extends IGridCache>, IGridCache> createCacheInstance( IGrid grid );
|
||||
Map<Class<? extends IGridCache>, IGridCache> createCacheInstance( IGrid grid );
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
package appeng.api.networking;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.util.AEPartLocation;
|
||||
|
||||
|
||||
@@ -45,6 +47,7 @@ public interface IGridConnection
|
||||
*
|
||||
* @return the IGridNode which represents the opposite side of the connection.
|
||||
*/
|
||||
@Nonnull
|
||||
IGridNode getOtherSide( IGridNode gridNode );
|
||||
|
||||
/**
|
||||
@@ -54,6 +57,7 @@ public interface IGridConnection
|
||||
*
|
||||
* @return the direction of the connection, only valid for in world connections.
|
||||
*/
|
||||
@Nonnull
|
||||
AEPartLocation getDirection( IGridNode gridNode );
|
||||
|
||||
/**
|
||||
@@ -65,11 +69,13 @@ public interface IGridConnection
|
||||
/**
|
||||
* @return node A
|
||||
*/
|
||||
@Nonnull
|
||||
IGridNode a();
|
||||
|
||||
/**
|
||||
* @return node B
|
||||
*/
|
||||
@Nonnull
|
||||
IGridNode b();
|
||||
|
||||
/**
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
package appeng.api.networking;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
|
||||
public interface IGridConnectionVisitor extends IGridVisitor
|
||||
{
|
||||
|
||||
@@ -32,5 +35,5 @@ public interface IGridConnectionVisitor extends IGridVisitor
|
||||
*
|
||||
* @param n the connection.
|
||||
*/
|
||||
void visitConnection( IGridConnection n );
|
||||
void visitConnection( @Nonnull IGridConnection n );
|
||||
}
|
||||
|
||||
@@ -24,12 +24,14 @@
|
||||
package appeng.api.networking;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.exceptions.FailedConnectionException;
|
||||
|
||||
|
||||
/**
|
||||
* A helper responsible for creating new {@link IGridNode}, {@link IGridConnection} or potentially similar tasks.
|
||||
*
|
||||
*
|
||||
* @author yueh
|
||||
* @version rv5
|
||||
* @since rv5
|
||||
@@ -39,7 +41,7 @@ public interface IGridHelper
|
||||
|
||||
/**
|
||||
* Create a grid node for your {@link IGridHost}
|
||||
*
|
||||
*
|
||||
* The passed {@link IGridBlock} represents the definition for properties like connectable sides.
|
||||
* Refer to its documentation for further details.
|
||||
*
|
||||
@@ -47,18 +49,20 @@ public interface IGridHelper
|
||||
*
|
||||
* @return grid node of block
|
||||
*/
|
||||
IGridNode createGridNode( IGridBlock block );
|
||||
@Nonnull
|
||||
IGridNode createGridNode( @Nonnull IGridBlock block );
|
||||
|
||||
/**
|
||||
* Create a direct connection between two {@link IGridNode}.
|
||||
*
|
||||
*
|
||||
* This will be considered as having a distance of 1, regardless of the location of both nodes.
|
||||
*
|
||||
*
|
||||
* @param a to be connected gridnode
|
||||
* @param b to be connected gridnode
|
||||
*
|
||||
* @throws appeng.api.exceptions.FailedConnectionException
|
||||
*/
|
||||
IGridConnection createGridConnection( IGridNode a, IGridNode b ) throws FailedConnectionException;
|
||||
@Nonnull
|
||||
IGridConnection createGridConnection( @Nonnull IGridNode a, @Nonnull IGridNode b ) throws FailedConnectionException;
|
||||
|
||||
}
|
||||
@@ -24,6 +24,9 @@
|
||||
package appeng.api.networking;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
import appeng.api.parts.IPart;
|
||||
@@ -49,7 +52,8 @@ public interface IGridHost
|
||||
* @return a new IGridNode, create these with
|
||||
* AEApi.INSTANCE().createGridNode( MyIGridBlock )
|
||||
*/
|
||||
IGridNode getGridNode( AEPartLocation dir );
|
||||
@Nullable
|
||||
IGridNode getGridNode( @Nonnull AEPartLocation dir );
|
||||
|
||||
/**
|
||||
* Determines how cables render when they connect to this block. Priority is
|
||||
@@ -57,7 +61,8 @@ public interface IGridHost
|
||||
*
|
||||
* @param dir direction
|
||||
*/
|
||||
AECableType getCableConnectionType( AEPartLocation dir );
|
||||
@Nonnull
|
||||
AECableType getCableConnectionType( @Nonnull AEPartLocation dir );
|
||||
|
||||
/**
|
||||
* break this host, its violating security rules, just break your block, or part.
|
||||
|
||||
@@ -26,6 +26,8 @@ package appeng.api.networking;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
|
||||
/**
|
||||
* An extension of IGridBlock, only means something when your getFlags() contains REQUIRE_CHANNEL, when done properly it
|
||||
@@ -40,5 +42,6 @@ public interface IGridMultiblock extends IGridBlock
|
||||
*
|
||||
* @return an iterator that will iterate all the nodes for the multiblock. ( read-only iterator expected. )
|
||||
*/
|
||||
@Nonnull
|
||||
Iterator<IGridNode> getMultiblockNodes();
|
||||
}
|
||||
|
||||
@@ -26,6 +26,8 @@ package appeng.api.networking;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
@@ -50,7 +52,7 @@ public interface IGridNode
|
||||
*
|
||||
* @param visitor visitor
|
||||
*/
|
||||
void beginVisit( IGridVisitor visitor );
|
||||
void beginVisit( @Nonnull IGridVisitor visitor );
|
||||
|
||||
/**
|
||||
* inform the node that your IGridBlock has changed its internal state, and force the node to update.
|
||||
@@ -68,6 +70,7 @@ public interface IGridNode
|
||||
*
|
||||
* @return grid host
|
||||
*/
|
||||
@Nonnull
|
||||
IGridHost getMachine();
|
||||
|
||||
/**
|
||||
@@ -75,6 +78,7 @@ public interface IGridNode
|
||||
*
|
||||
* @return grid
|
||||
*/
|
||||
@Nonnull
|
||||
IGrid getGrid();
|
||||
|
||||
/**
|
||||
@@ -86,11 +90,13 @@ public interface IGridNode
|
||||
/**
|
||||
* @return the world the node is located in
|
||||
*/
|
||||
@Nonnull
|
||||
World getWorld();
|
||||
|
||||
/**
|
||||
* @return a set of the connected sides, INTERNAL represents an invisible connection
|
||||
*/
|
||||
@Nonnull
|
||||
EnumSet<AEPartLocation> getConnectedSides();
|
||||
|
||||
/**
|
||||
@@ -98,11 +104,13 @@ public interface IGridNode
|
||||
*
|
||||
* @return grid connections
|
||||
*/
|
||||
@Nonnull
|
||||
IReadOnlyCollection<IGridConnection> getConnections();
|
||||
|
||||
/**
|
||||
* @return the IGridBlock for this node
|
||||
*/
|
||||
@Nonnull
|
||||
IGridBlock getGridBlock();
|
||||
|
||||
/**
|
||||
@@ -122,7 +130,7 @@ public interface IGridNode
|
||||
* @param name nbt name
|
||||
* @param nodeData to be loaded data
|
||||
*/
|
||||
void loadFromNBT( String name, NBTTagCompound nodeData );
|
||||
void loadFromNBT( @Nonnull String name, @Nonnull NBTTagCompound nodeData );
|
||||
|
||||
/**
|
||||
* this should be called for each node you maintain, you can save all your nodes to the same tag with different
|
||||
@@ -131,7 +139,7 @@ public interface IGridNode
|
||||
* @param name nbt name
|
||||
* @param nodeData to be saved data
|
||||
*/
|
||||
void saveToNBT( String name, NBTTagCompound nodeData );
|
||||
void saveToNBT( @Nonnull String name, @Nonnull NBTTagCompound nodeData );
|
||||
|
||||
/**
|
||||
* @return if the node's channel requirements are currently met, use this for display purposes, use isActive for
|
||||
@@ -146,7 +154,7 @@ public interface IGridNode
|
||||
*
|
||||
* @return true if has flag
|
||||
*/
|
||||
boolean hasFlag( GridFlags flag );
|
||||
boolean hasFlag( @Nonnull GridFlags flag );
|
||||
|
||||
/**
|
||||
* @return the ownerID this represents the person who placed the node.
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
package appeng.api.networking;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
|
||||
@@ -33,6 +35,7 @@ public interface IGridStorage
|
||||
/**
|
||||
* @return an NBTTagCompound that can be read, and written too.
|
||||
*/
|
||||
@Nonnull
|
||||
NBTTagCompound dataObject();
|
||||
|
||||
/**
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
package appeng.api.networking;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
|
||||
/**
|
||||
* Simple Visitor pattern access to network nodes.
|
||||
*/
|
||||
@@ -39,5 +42,5 @@ public interface IGridVisitor
|
||||
*
|
||||
* @return true to continue visiting nodes beyond this node.
|
||||
*/
|
||||
boolean visitNode( IGridNode n );
|
||||
boolean visitNode( @Nonnull IGridNode n );
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
package appeng.api.networking;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.util.IReadOnlyCollection;
|
||||
|
||||
|
||||
@@ -33,5 +35,6 @@ public interface IMachineSet extends IReadOnlyCollection<IGridNode>
|
||||
/**
|
||||
* @return the machine class for this set.
|
||||
*/
|
||||
@Nonnull
|
||||
Class<? extends IGridHost> getMachineClass();
|
||||
}
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
package appeng.api.networking.crafting;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
|
||||
public interface ICraftingCallback
|
||||
{
|
||||
|
||||
@@ -32,5 +35,5 @@ public interface ICraftingCallback
|
||||
*
|
||||
* @param job - final job
|
||||
*/
|
||||
void calculationComplete( ICraftingJob job );
|
||||
void calculationComplete( @Nonnull ICraftingJob job );
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
package appeng.api.networking.energy;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.config.AccessRestriction;
|
||||
import appeng.api.config.Actionable;
|
||||
|
||||
@@ -42,7 +44,7 @@ public interface IAEPowerStorage extends IEnergySource
|
||||
*
|
||||
* @return amount of power which was unable to be stored
|
||||
*/
|
||||
double injectAEPower( double amt, Actionable mode );
|
||||
double injectAEPower( double amt, @Nonnull Actionable mode );
|
||||
|
||||
/**
|
||||
* @return the current maximum power ( this can change :P )
|
||||
@@ -67,5 +69,6 @@ public interface IAEPowerStorage extends IEnergySource
|
||||
*
|
||||
* @return access restriction what the network can do
|
||||
*/
|
||||
@Nonnull
|
||||
AccessRestriction getPowerFlow();
|
||||
}
|
||||
@@ -24,6 +24,9 @@
|
||||
package appeng.api.networking.energy;
|
||||
|
||||
|
||||
import javax.annotation.Nonnegative;
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.config.Actionable;
|
||||
import appeng.api.networking.IGridCache;
|
||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
||||
@@ -38,17 +41,20 @@ public interface IEnergyGrid extends IGridCache, IEnergySource, IEnergyGridProvi
|
||||
/**
|
||||
* @return the current calculated idle energy drain each tick, is used internally to drain power for each tick.
|
||||
*/
|
||||
@Nonnegative
|
||||
double getIdlePowerUsage();
|
||||
|
||||
/**
|
||||
* @return the average power drain over the past 10 ticks, includes idle usage during this time, and all use of
|
||||
* extractPower.
|
||||
*/
|
||||
@Nonnegative
|
||||
double getAvgPowerUsage();
|
||||
|
||||
/**
|
||||
* @return the average energy injected into the system per tick, for the last 10 ticks.
|
||||
*/
|
||||
@Nonnegative
|
||||
double getAvgPowerInjection();
|
||||
|
||||
/**
|
||||
@@ -79,13 +85,15 @@ public interface IEnergyGrid extends IGridCache, IEnergySource, IEnergyGridProvi
|
||||
*
|
||||
* @return the amount of power that the network has OVER the limit.
|
||||
*/
|
||||
double injectPower( double amt, Actionable mode );
|
||||
@Nonnegative
|
||||
double injectPower( @Nonnegative double amt, @Nonnull Actionable mode );
|
||||
|
||||
/**
|
||||
* this is should be considered an estimate, and not relied upon for real calculations.
|
||||
*
|
||||
* @return estimated available power.
|
||||
*/
|
||||
@Nonnegative
|
||||
double getStoredPower();
|
||||
|
||||
/**
|
||||
@@ -93,6 +101,7 @@ public interface IEnergyGrid extends IGridCache, IEnergySource, IEnergyGridProvi
|
||||
*
|
||||
* @return estimated available power.
|
||||
*/
|
||||
@Nonnegative
|
||||
double getMaxStoredPower();
|
||||
|
||||
/**
|
||||
@@ -101,5 +110,6 @@ public interface IEnergyGrid extends IGridCache, IEnergySource, IEnergyGridProvi
|
||||
*
|
||||
* @return Amount of power required to charge the grid, in AE.
|
||||
*/
|
||||
double getEnergyDemand( double maxRequired );
|
||||
@Nonnegative
|
||||
double getEnergyDemand( @Nonnegative double maxRequired );
|
||||
}
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
package appeng.api.networking.energy;
|
||||
|
||||
|
||||
import javax.annotation.Nonnegative;
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.config.Actionable;
|
||||
import appeng.api.config.PowerMultiplier;
|
||||
|
||||
@@ -39,5 +42,6 @@ public interface IEnergySource
|
||||
*
|
||||
* @return returns extracted power.
|
||||
*/
|
||||
double extractAEPower( double amt, Actionable mode, PowerMultiplier usePowerMultiplier );
|
||||
@Nonnegative
|
||||
double extractAEPower( @Nonnegative double amt, @Nonnull Actionable mode, @Nonnull PowerMultiplier usePowerMultiplier );
|
||||
}
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
package appeng.api.networking.energy;
|
||||
|
||||
|
||||
import javax.annotation.Nonnegative;
|
||||
|
||||
|
||||
/**
|
||||
* DO NOT IMPLEMENT.
|
||||
*
|
||||
@@ -39,7 +42,7 @@ public interface IEnergyWatcher
|
||||
* @param amount
|
||||
* @return true, if successfully added.
|
||||
*/
|
||||
boolean add( double amount );
|
||||
boolean add( @Nonnegative double amount );
|
||||
|
||||
/**
|
||||
* Remove a specific threshold from the watcher.
|
||||
@@ -47,7 +50,7 @@ public interface IEnergyWatcher
|
||||
* @param amount
|
||||
* @return true, if successfully removed.
|
||||
*/
|
||||
boolean remove( double amount );
|
||||
boolean remove( @Nonnegative double amount );
|
||||
|
||||
/**
|
||||
* Removes all thresholds and resets the watcher to a clean state.
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
package appeng.api.networking.energy;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
|
||||
public interface IEnergyWatcherHost
|
||||
{
|
||||
|
||||
@@ -33,12 +36,12 @@ public interface IEnergyWatcherHost
|
||||
*
|
||||
* @param newWatcher new watcher
|
||||
*/
|
||||
void updateWatcher( IEnergyWatcher newWatcher );
|
||||
void updateWatcher( @Nonnull IEnergyWatcher newWatcher );
|
||||
|
||||
/**
|
||||
* Called when a threshold is crossed.
|
||||
*
|
||||
* @param energyGrid grid
|
||||
*/
|
||||
void onThresholdPass( IEnergyGrid energyGrid );
|
||||
void onThresholdPass( @Nonnull IEnergyGrid energyGrid );
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
package appeng.api.networking.pathing;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.networking.IGridCache;
|
||||
|
||||
|
||||
@@ -39,6 +41,7 @@ public interface IPathingGrid extends IGridCache
|
||||
* @return the controller state of the network, useful if you want to
|
||||
* require a controller for a feature.
|
||||
*/
|
||||
@Nonnull
|
||||
ControllerState getControllerState();
|
||||
|
||||
/**
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
package appeng.api.networking.security;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.networking.IGridNode;
|
||||
|
||||
|
||||
@@ -38,5 +40,6 @@ public interface IActionHost
|
||||
* @return the the gridnode that actions from this IGridHost are preformed
|
||||
* by.
|
||||
*/
|
||||
@Nonnull
|
||||
IGridNode getActionableNode();
|
||||
}
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
package appeng.api.networking.security;
|
||||
|
||||
|
||||
import javax.annotation.Nonnegative;
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
|
||||
import appeng.api.config.SecurityPermissions;
|
||||
@@ -46,7 +49,7 @@ public interface ISecurityGrid extends IGridCache
|
||||
*
|
||||
* @return true if the player has permissions.
|
||||
*/
|
||||
boolean hasPermission( EntityPlayer player, SecurityPermissions perm );
|
||||
boolean hasPermission( @Nonnull EntityPlayer player, @Nonnull SecurityPermissions perm );
|
||||
|
||||
/**
|
||||
* Check if a player has permissions.
|
||||
@@ -56,7 +59,7 @@ public interface ISecurityGrid extends IGridCache
|
||||
*
|
||||
* @return true if the player has permissions.
|
||||
*/
|
||||
boolean hasPermission( int playerID, SecurityPermissions perm );
|
||||
boolean hasPermission( @Nonnegative int playerID, @Nonnull SecurityPermissions perm );
|
||||
|
||||
/**
|
||||
* @return PlayerID of the admin, or owner, this is the person who placed the security block.
|
||||
|
||||
@@ -25,7 +25,7 @@ package appeng.api.networking.security;
|
||||
|
||||
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import appeng.api.config.SecurityPermissions;
|
||||
|
||||
@@ -48,7 +48,7 @@ public interface ISecurityProvider
|
||||
*
|
||||
* @param playerPerms player permissions
|
||||
*/
|
||||
void readPermissions( HashMap<Integer, EnumSet<SecurityPermissions>> playerPerms );
|
||||
void readPermissions( Map<Integer, EnumSet<SecurityPermissions>> playerPerms );
|
||||
|
||||
/**
|
||||
* @return is security on or off?
|
||||
|
||||
@@ -26,6 +26,8 @@ package appeng.api.networking.security;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.config.SecurityPermissions;
|
||||
|
||||
|
||||
@@ -41,5 +43,5 @@ public interface ISecurityRegistry
|
||||
* @param playerID player id
|
||||
* @param permissions permissions of player
|
||||
*/
|
||||
void addPlayer( int playerID, EnumSet<SecurityPermissions> permissions );
|
||||
void addPlayer( int playerID, @Nonnull EnumSet<SecurityPermissions> permissions );
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
package appeng.api.networking.ticking;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.networking.IGridNode;
|
||||
|
||||
|
||||
@@ -45,18 +47,18 @@ public interface IGridTickable
|
||||
*/
|
||||
|
||||
/**
|
||||
* You can return null, if you wish to tick using MC's ticking mechanism, or
|
||||
* you can return a valid TickingRequest to tell AE a guide for which type
|
||||
* of responsiveness your device wants.
|
||||
* Return a valid TickingRequest to tell AE a guide for which type of
|
||||
* responsiveness your device wants.
|
||||
*
|
||||
* this will be called for your tile any time your tile changes grids, this
|
||||
* This will be called for your tile any time your tile changes grids, this
|
||||
* can happen at any time, so if your using the sleep feature you may wish
|
||||
* to preserve your sleep, in the result of this method. or you can simply
|
||||
* reset it.
|
||||
*
|
||||
* @return null or a valid new TickingRequest
|
||||
* @return a valid new TickingRequest
|
||||
*/
|
||||
TickingRequest getTickingRequest( IGridNode node );
|
||||
@Nonnull
|
||||
TickingRequest getTickingRequest( @Nonnull IGridNode node );
|
||||
|
||||
/**
|
||||
* AE lets you adjust your tick rate based on the results of your tick, if
|
||||
@@ -67,11 +69,12 @@ public interface IGridTickable
|
||||
*
|
||||
* Note: this is never called if you return null from getTickingRequest.
|
||||
*
|
||||
* @param TicksSinceLastCall the number of world ticks that were skipped since your last
|
||||
* @param ticksSinceLastCall the number of world ticks that were skipped since your last
|
||||
* tick, you can use this to adjust speed of processing or adjust
|
||||
* your tick rate.
|
||||
*
|
||||
* @return tick rate adjustment.
|
||||
*/
|
||||
TickRateModulation tickingRequest( IGridNode node, int TicksSinceLastCall );
|
||||
@Nonnull
|
||||
TickRateModulation tickingRequest( @Nonnull IGridNode node, int ticksSinceLastCall );
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
package appeng.api.networking.ticking;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.networking.IGridCache;
|
||||
import appeng.api.networking.IGridNode;
|
||||
|
||||
@@ -42,7 +44,7 @@ public interface ITickManager extends IGridCache
|
||||
*
|
||||
* @param node gridnode
|
||||
*/
|
||||
boolean alertDevice( IGridNode node );
|
||||
boolean alertDevice( @Nonnull IGridNode node );
|
||||
|
||||
/**
|
||||
* disables ticking for your device.
|
||||
@@ -51,7 +53,7 @@ public interface ITickManager extends IGridCache
|
||||
*
|
||||
* @return if the call was successful.
|
||||
*/
|
||||
boolean sleepDevice( IGridNode node );
|
||||
boolean sleepDevice( @Nonnull IGridNode node );
|
||||
|
||||
/**
|
||||
* enables ticking for your device, undoes a sleepDevice call.
|
||||
@@ -60,5 +62,5 @@ public interface ITickManager extends IGridCache
|
||||
*
|
||||
* @return if the call was successful.
|
||||
*/
|
||||
boolean wakeDevice( IGridNode node );
|
||||
boolean wakeDevice( @Nonnull IGridNode node );
|
||||
}
|
||||
|
||||
@@ -28,10 +28,10 @@ import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
import appeng.api.config.FuzzyMode;
|
||||
import appeng.api.storage.data.IAEItemStack;
|
||||
import appeng.api.storage.data.IAEStack;
|
||||
|
||||
|
||||
public interface ICellInventory extends IMEInventory<IAEItemStack>
|
||||
public interface ICellInventory<T extends IAEStack<T>> extends IMEInventory<T>
|
||||
{
|
||||
|
||||
/**
|
||||
|
||||
@@ -25,10 +25,10 @@ package appeng.api.storage;
|
||||
|
||||
|
||||
import appeng.api.config.IncludeExclude;
|
||||
import appeng.api.storage.data.IAEItemStack;
|
||||
import appeng.api.storage.data.IAEStack;
|
||||
|
||||
|
||||
public interface ICellInventoryHandler extends IMEInventoryHandler<IAEItemStack>
|
||||
public interface ICellInventoryHandler<T extends IAEStack<T>> extends IMEInventoryHandler<T>
|
||||
{
|
||||
|
||||
/**
|
||||
|
||||
@@ -24,7 +24,11 @@
|
||||
package appeng.api.storage;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
||||
|
||||
import appeng.api.IAppEngApi;
|
||||
import appeng.api.storage.data.IAEStack;
|
||||
@@ -42,9 +46,12 @@ public interface ICellRegistry
|
||||
/**
|
||||
* Register a new handler.
|
||||
*
|
||||
* Never be call before {@link FMLInitializationEvent} was handled by AE2.
|
||||
* Will throw an exception otherwise.
|
||||
*
|
||||
* @param handler cell handler
|
||||
*/
|
||||
void addCellHandler( ICellHandler handler );
|
||||
void addCellHandler( @Nonnull ICellHandler handler );
|
||||
|
||||
/**
|
||||
* return true, if you can get a InventoryHandler for the item passed.
|
||||
@@ -63,6 +70,7 @@ public interface ICellRegistry
|
||||
*
|
||||
* @return the handler registered for this item type.
|
||||
*/
|
||||
@Nullable
|
||||
ICellHandler getHandler( ItemStack is );
|
||||
|
||||
/**
|
||||
@@ -74,5 +82,6 @@ public interface ICellRegistry
|
||||
*
|
||||
* @return new IMEInventoryHandler, or null if there isn't one.
|
||||
*/
|
||||
@Nullable
|
||||
<T extends IAEStack<T>> IMEInventoryHandler<T> getCellInventory( ItemStack is, ISaveProvider host, IStorageChannel<T> chan );
|
||||
}
|
||||
@@ -149,16 +149,14 @@ public interface IAEStack<T extends IAEStack<T>>
|
||||
boolean equals( Object obj );
|
||||
|
||||
/**
|
||||
* compare stacks using fuzzy logic
|
||||
* Compare the same subtype of {@link IAEStack} with another using a fuzzy comparison.
|
||||
*
|
||||
* a IAEItemStack to another AEItemStack or a ItemStack.
|
||||
*
|
||||
* @param st stacks
|
||||
* @param mode used fuzzy mode
|
||||
* @param other The stack to compare.
|
||||
* @param mode Which {@link FuzzyMode} should be used.
|
||||
*
|
||||
* @return true if two stacks are equal based on AE Fuzzy Comparison.
|
||||
*/
|
||||
boolean fuzzyComparison( Object st, FuzzyMode mode );
|
||||
boolean fuzzyComparison( T other, FuzzyMode mode );
|
||||
|
||||
/**
|
||||
* Slower for disk saving, but smaller/more efficient for packets.
|
||||
@@ -200,7 +198,7 @@ public interface IAEStack<T extends IAEStack<T>>
|
||||
|
||||
/**
|
||||
* Returns itemstack for display and similar purposes. Always has a count of 1.
|
||||
*
|
||||
*
|
||||
* @return itemstack
|
||||
*/
|
||||
ItemStack asItemStackRepresentation();
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2013 AlgorithmX2
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package appeng.api.util;
|
||||
|
||||
|
||||
public enum AECableSize
|
||||
{
|
||||
NONE,
|
||||
NORMAL,
|
||||
DENSE;
|
||||
|
||||
public static AECableSize min( AECableSize a, AECableSize b )
|
||||
{
|
||||
return a.compareTo( b ) < 0 ? a : b;
|
||||
}
|
||||
|
||||
public static AECableSize max( AECableSize a, AECableSize b )
|
||||
{
|
||||
return a.compareTo( b ) > 0 ? a : b;
|
||||
}
|
||||
}
|
||||
@@ -29,32 +29,32 @@ public enum AECableType
|
||||
/**
|
||||
* No Cable present.
|
||||
*/
|
||||
NONE,
|
||||
NONE( AECableVariant.NONE, AECableSize.NONE ),
|
||||
|
||||
/**
|
||||
* Connections to this block should render as glass.
|
||||
*/
|
||||
GLASS,
|
||||
GLASS( AECableVariant.GLASS, AECableSize.NORMAL ),
|
||||
|
||||
/**
|
||||
* Connections to this block should render as covered.
|
||||
*/
|
||||
COVERED,
|
||||
COVERED( AECableVariant.COVERED, AECableSize.NORMAL ),
|
||||
|
||||
/**
|
||||
* Connections to this block should render as smart.
|
||||
*/
|
||||
SMART,
|
||||
SMART( AECableVariant.SMART, AECableSize.NORMAL ),
|
||||
|
||||
/**
|
||||
* Smart Dense Cable, represents a tier 2 block that can carry 32 channels.
|
||||
*/
|
||||
DENSE_COVERED,
|
||||
DENSE_COVERED( AECableVariant.COVERED, AECableSize.DENSE ),
|
||||
|
||||
/**
|
||||
* Smart Dense Cable, represents a tier 2 block that can carry 32 channels.
|
||||
*/
|
||||
DENSE_SMART;
|
||||
DENSE_SMART( AECableVariant.SMART, AECableSize.DENSE );
|
||||
|
||||
public static final AECableType[] VALIDCABLES = {
|
||||
GLASS,
|
||||
@@ -64,4 +64,97 @@ public enum AECableType
|
||||
DENSE_SMART
|
||||
};
|
||||
|
||||
private final AECableVariant variant;
|
||||
private final AECableSize size;
|
||||
|
||||
private AECableType( AECableVariant variant, AECableSize size )
|
||||
{
|
||||
this.variant = variant;
|
||||
this.size = size;
|
||||
}
|
||||
|
||||
public AECableSize size()
|
||||
{
|
||||
return size;
|
||||
}
|
||||
|
||||
public AECableVariant variant()
|
||||
{
|
||||
return variant;
|
||||
}
|
||||
|
||||
public boolean isValid()
|
||||
{
|
||||
return this.variant != AECableVariant.NONE && this.size != AECableSize.NONE;
|
||||
}
|
||||
|
||||
public boolean isDense()
|
||||
{
|
||||
return this.size == AECableSize.DENSE;
|
||||
}
|
||||
|
||||
public boolean isSmart()
|
||||
{
|
||||
return this.variant == AECableVariant.SMART;
|
||||
}
|
||||
|
||||
public static AECableType min( AECableType a, AECableType b )
|
||||
{
|
||||
final AECableVariant v = AECableVariant.min( a.variant(), b.variant() );
|
||||
final AECableSize s = AECableSize.min( a.size(), b.size() );
|
||||
|
||||
return AECableType.from( v, s );
|
||||
}
|
||||
|
||||
public static AECableType max( AECableType a, AECableType b )
|
||||
{
|
||||
final AECableVariant v = AECableVariant.max( a.variant(), b.variant() );
|
||||
final AECableSize s = AECableSize.max( a.size(), b.size() );
|
||||
|
||||
return AECableType.from( v, s );
|
||||
}
|
||||
|
||||
private static AECableType from( AECableVariant variant, AECableSize size )
|
||||
{
|
||||
switch( variant )
|
||||
{
|
||||
case GLASS:
|
||||
switch( size )
|
||||
{
|
||||
case NORMAL:
|
||||
return GLASS;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case COVERED:
|
||||
switch( size )
|
||||
{
|
||||
case NORMAL:
|
||||
return COVERED;
|
||||
case DENSE:
|
||||
return DENSE_COVERED;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case SMART:
|
||||
switch( size )
|
||||
{
|
||||
case NORMAL:
|
||||
return SMART;
|
||||
case DENSE:
|
||||
return DENSE_SMART;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return NONE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2013 AlgorithmX2
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package appeng.api.util;
|
||||
|
||||
|
||||
public enum AECableVariant
|
||||
{
|
||||
NONE,
|
||||
GLASS,
|
||||
COVERED,
|
||||
SMART;
|
||||
|
||||
public static AECableVariant min( AECableVariant a, AECableVariant b )
|
||||
{
|
||||
return a.compareTo( b ) < 0 ? a : b;
|
||||
}
|
||||
|
||||
public static AECableVariant max( AECableVariant a, AECableVariant b )
|
||||
{
|
||||
return a.compareTo( b ) > 0 ? a : b;
|
||||
}
|
||||
}
|
||||
@@ -74,13 +74,8 @@ public class BlockDrive extends AEBaseTileBlock
|
||||
public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
|
||||
{
|
||||
TileDrive te = this.getTileEntity( world, pos );
|
||||
if( te == null )
|
||||
{
|
||||
return super.getExtendedState( state, world, pos );
|
||||
}
|
||||
|
||||
IExtendedBlockState extState = (IExtendedBlockState) super.getExtendedState( state, world, pos );
|
||||
return extState.withProperty( SLOTS_STATE, DriveSlotsState.fromChestOrDrive( te ) );
|
||||
return extState.withProperty( SLOTS_STATE, te == null ? DriveSlotsState.createEmpty( 10 ) : DriveSlotsState.fromChestOrDrive( te ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -75,4 +75,14 @@ public class DriveSlotsState
|
||||
}
|
||||
return new DriveSlotsState( slots );
|
||||
}
|
||||
|
||||
public static DriveSlotsState createEmpty( int slotCount )
|
||||
{
|
||||
DriveSlotState[] slots = new DriveSlotState[slotCount];
|
||||
for( int i = 0; i < slotCount; i++ )
|
||||
{
|
||||
slots[i] = DriveSlotState.EMPTY;
|
||||
}
|
||||
return new DriveSlotsState( slots );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,11 +22,11 @@ package appeng.client.gui;
|
||||
import java.io.IOException;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.ParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@@ -46,6 +46,8 @@ import net.minecraft.client.renderer.BufferBuilder;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.client.renderer.RenderHelper;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.client.renderer.texture.TextureMap;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.ClickType;
|
||||
@@ -54,8 +56,11 @@ import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.text.TextFormatting;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
|
||||
import appeng.api.storage.data.IAEFluidStack;
|
||||
import appeng.api.storage.data.IAEItemStack;
|
||||
import appeng.client.gui.widgets.GuiCustomSlot;
|
||||
import appeng.client.gui.widgets.GuiScrollbar;
|
||||
import appeng.client.gui.widgets.ITooltip;
|
||||
import appeng.client.me.InternalSlotME;
|
||||
@@ -66,7 +71,7 @@ import appeng.container.AEBaseContainer;
|
||||
import appeng.container.slot.AppEngCraftingSlot;
|
||||
import appeng.container.slot.AppEngSlot;
|
||||
import appeng.container.slot.AppEngSlot.hasCalculatedValidness;
|
||||
import appeng.container.slot.OptionalSlotFake;
|
||||
import appeng.container.slot.IOptionalSlot;
|
||||
import appeng.container.slot.SlotCraftingTerm;
|
||||
import appeng.container.slot.SlotDisabled;
|
||||
import appeng.container.slot.SlotFake;
|
||||
@@ -79,20 +84,24 @@ import appeng.core.AppEng;
|
||||
import appeng.core.sync.network.NetworkHandler;
|
||||
import appeng.core.sync.packets.PacketInventoryAction;
|
||||
import appeng.core.sync.packets.PacketSwapSlots;
|
||||
import appeng.fluids.client.render.FluidStackSizeRenderer;
|
||||
import appeng.fluids.container.slots.IMEFluidSlot;
|
||||
import appeng.helpers.InventoryAction;
|
||||
|
||||
|
||||
public abstract class AEBaseGui extends GuiContainer
|
||||
{
|
||||
private final List<InternalSlotME> meSlots = new LinkedList<>();
|
||||
private final List<InternalSlotME> meSlots = new ArrayList<>();
|
||||
// drag y
|
||||
private final Set<Slot> drag_click = new HashSet<>();
|
||||
private final StackSizeRenderer stackSizeRenderer = new StackSizeRenderer();
|
||||
private final FluidStackSizeRenderer fluidStackSizeRenderer = new FluidStackSizeRenderer();
|
||||
private GuiScrollbar myScrollBar = null;
|
||||
private boolean disableShiftClick = false;
|
||||
private Stopwatch dbl_clickTimer = Stopwatch.createStarted();
|
||||
private ItemStack dbl_whichItem = ItemStack.EMPTY;
|
||||
private Slot bl_clicked;
|
||||
protected final List<GuiCustomSlot> guiSlots = new ArrayList<>();
|
||||
|
||||
public AEBaseGui( final Container container )
|
||||
{
|
||||
@@ -146,35 +155,76 @@ public abstract class AEBaseGui extends GuiContainer
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawScreen( final int mouseX, final int mouseY, final float btn )
|
||||
public void drawScreen( final int mouseX, final int mouseY, final float partialTicks )
|
||||
{
|
||||
super.drawDefaultBackground();
|
||||
super.drawScreen( mouseX, mouseY, btn );
|
||||
super.drawScreen( mouseX, mouseY, partialTicks );
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translate( (float) this.guiLeft, (float) this.guiTop, 0.0F );
|
||||
GlStateManager.enableDepth();
|
||||
for( final GuiCustomSlot c : this.guiSlots )
|
||||
{
|
||||
drawGuiSlot( c, mouseX, mouseY, partialTicks );
|
||||
}
|
||||
GlStateManager.disableDepth();
|
||||
for( final GuiCustomSlot c : this.guiSlots )
|
||||
{
|
||||
drawTooltip( c, mouseX - this.guiLeft, mouseY - this.guiTop );
|
||||
}
|
||||
GlStateManager.popMatrix();
|
||||
|
||||
this.renderHoveredToolTip( mouseX, mouseY );
|
||||
|
||||
for( final Object c : this.buttonList )
|
||||
{
|
||||
if( c instanceof ITooltip )
|
||||
{
|
||||
final ITooltip tooltip = (ITooltip) c;
|
||||
final int x = tooltip.xPos(); // ((GuiImgButton) c).x;
|
||||
int y = tooltip.yPos(); // ((GuiImgButton) c).y;
|
||||
drawTooltip( (ITooltip) c, mouseX, mouseY );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( x < mouseX && x + tooltip.getWidth() > mouseX && tooltip.isVisible() )
|
||||
protected void drawGuiSlot( GuiCustomSlot slot, int mouseX, int mouseY, float partialTicks )
|
||||
{
|
||||
if( slot.isSlotEnabled() )
|
||||
{
|
||||
final int left = slot.xPos();
|
||||
final int top = slot.yPos();
|
||||
final int right = left + slot.getWidth();
|
||||
final int bottom = top + slot.getHeight();
|
||||
|
||||
slot.drawContent( this.mc, mouseX, mouseY, partialTicks );
|
||||
|
||||
if( this.isPointInRegion( left, top, slot.getWidth(), slot.getHeight(), mouseX, mouseY ) && slot.canClick( this.mc.player ) )
|
||||
{
|
||||
GlStateManager.disableLighting();
|
||||
GlStateManager.colorMask( true, true, true, false );
|
||||
this.drawGradientRect( left, top, right, bottom, -2130706433, -2130706433 );
|
||||
GlStateManager.colorMask( true, true, true, true );
|
||||
GlStateManager.enableLighting();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void drawTooltip( ITooltip tooltip, int mouseX, int mouseY )
|
||||
{
|
||||
final int x = tooltip.xPos(); // ((GuiImgButton) c).x;
|
||||
int y = tooltip.yPos(); // ((GuiImgButton) c).y;
|
||||
|
||||
if( x < mouseX && x + tooltip.getWidth() > mouseX && tooltip.isVisible() )
|
||||
{
|
||||
if( y < mouseY && y + tooltip.getHeight() > mouseY )
|
||||
{
|
||||
if( y < 15 )
|
||||
{
|
||||
if( y < mouseY && y + tooltip.getHeight() > mouseY )
|
||||
{
|
||||
if( y < 15 )
|
||||
{
|
||||
y = 15;
|
||||
}
|
||||
y = 15;
|
||||
}
|
||||
|
||||
final String msg = tooltip.getMessage();
|
||||
if( msg != null )
|
||||
{
|
||||
this.drawTooltip( x + 11, y + 4, msg );
|
||||
}
|
||||
}
|
||||
final String msg = tooltip.getMessage();
|
||||
if( msg != null )
|
||||
{
|
||||
this.drawTooltip( x + 11, y + 4, msg );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -236,27 +286,36 @@ public abstract class AEBaseGui extends GuiContainer
|
||||
final List<Slot> slots = this.getInventorySlots();
|
||||
for( final Slot slot : slots )
|
||||
{
|
||||
if( slot instanceof OptionalSlotFake )
|
||||
if( slot instanceof IOptionalSlot )
|
||||
{
|
||||
final OptionalSlotFake fs = (OptionalSlotFake) slot;
|
||||
if( fs.renderDisabled() )
|
||||
final IOptionalSlot optionalSlot = (IOptionalSlot) slot;
|
||||
if( optionalSlot.isRenderDisabled() )
|
||||
{
|
||||
if( fs.isSlotEnabled() )
|
||||
final AppEngSlot aeSlot = (AppEngSlot) slot;
|
||||
if( aeSlot.isSlotEnabled() )
|
||||
{
|
||||
this.drawTexturedModalRect( ox + fs.xPos - 1, oy + fs.yPos - 1, fs.getSourceX() - 1, fs.getSourceY() - 1, 18,
|
||||
this.drawTexturedModalRect( ox + aeSlot.xPos - 1, oy + aeSlot.yPos - 1, optionalSlot.getSourceX() - 1, optionalSlot.getSourceY() - 1,
|
||||
18,
|
||||
18 );
|
||||
}
|
||||
else
|
||||
{
|
||||
GlStateManager.color( 1.0F, 1.0F, 1.0F, 0.4F );
|
||||
GlStateManager.enableBlend();
|
||||
this.drawTexturedModalRect( ox + fs.xPos - 1, oy + fs.yPos - 1, fs.getSourceX() - 1, fs.getSourceY() - 1, 18,
|
||||
this.drawTexturedModalRect( ox + aeSlot.xPos - 1, oy + aeSlot.yPos - 1, optionalSlot.getSourceX() - 1, optionalSlot.getSourceY() - 1,
|
||||
18,
|
||||
18 );
|
||||
GlStateManager.color( 1.0F, 1.0F, 1.0F, 1.0F );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for( final GuiCustomSlot slot : this.guiSlots )
|
||||
{
|
||||
slot.drawBackground( ox, oy );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -277,6 +336,14 @@ public abstract class AEBaseGui extends GuiContainer
|
||||
}
|
||||
}
|
||||
|
||||
for( GuiCustomSlot slot : this.guiSlots )
|
||||
{
|
||||
if( this.isPointInRegion( slot.xPos(), slot.yPos(), slot.getWidth(), slot.getHeight(), xCoord, yCoord ) && slot.canClick( this.mc.player ) )
|
||||
{
|
||||
slot.slotClicked( this.mc.player.inventory.getItemStack(), btn );
|
||||
}
|
||||
}
|
||||
|
||||
if( this.getScrollBar() != null )
|
||||
{
|
||||
this.getScrollBar().click( this, xCoord - this.guiLeft, yCoord - this.guiTop );
|
||||
@@ -715,6 +782,39 @@ public abstract class AEBaseGui extends GuiContainer
|
||||
|
||||
return;
|
||||
}
|
||||
else if( s instanceof IMEFluidSlot && ( (IMEFluidSlot) s ).shouldRenderAsFluid() )
|
||||
{
|
||||
final IMEFluidSlot slot = (IMEFluidSlot) s;
|
||||
final IAEFluidStack fs = slot.getAEFluidStack();
|
||||
|
||||
if( fs != null && this.isPowered() )
|
||||
{
|
||||
GlStateManager.disableLighting();
|
||||
GlStateManager.disableBlend();
|
||||
final Fluid fluid = fs.getFluid();
|
||||
Minecraft.getMinecraft().getTextureManager().bindTexture( TextureMap.LOCATION_BLOCKS_TEXTURE );
|
||||
final TextureAtlasSprite sprite = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite( fluid.getStill().toString() );
|
||||
|
||||
// Set color for dynamic fluids
|
||||
// Convert int color to RGB
|
||||
float red = ( fluid.getColor() >> 16 & 255 ) / 255.0F;
|
||||
float green = ( fluid.getColor() >> 8 & 255 ) / 255.0F;
|
||||
float blue = ( fluid.getColor() & 255 ) / 255.0F;
|
||||
GlStateManager.color( red, green, blue );
|
||||
|
||||
this.drawTexturedModalRect( s.xPos, s.yPos, sprite, 16, 16 );
|
||||
GlStateManager.enableLighting();
|
||||
GlStateManager.enableBlend();
|
||||
|
||||
this.fluidStackSizeRenderer.renderStackSize( this.fontRenderer, fs, s.xPos, s.yPos );
|
||||
}
|
||||
else if( !this.isPowered() )
|
||||
{
|
||||
drawRect( s.xPos, s.yPos, 16 + s.xPos, 16 + s.yPos, 0x66111111 );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
|
||||
@@ -23,7 +23,6 @@ import java.io.IOException;
|
||||
import java.text.NumberFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.common.base.Joiner;
|
||||
@@ -238,7 +237,7 @@ public class GuiCraftConfirm extends AEBaseGui
|
||||
final int viewEnd = viewStart + 3 * this.rows;
|
||||
|
||||
String dspToolTip = "";
|
||||
final List<String> lineList = new LinkedList<>();
|
||||
final List<String> lineList = new ArrayList<>();
|
||||
int toolPosX = 0;
|
||||
int toolPosY = 0;
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@ package appeng.client.gui.implementations;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@@ -212,7 +211,7 @@ public class GuiCraftingCPU extends AEBaseGui implements ISortSource
|
||||
final int viewEnd = viewStart + 3 * 6;
|
||||
|
||||
String dspToolTip = "";
|
||||
final List<String> lineList = new LinkedList<>();
|
||||
final List<String> lineList = new ArrayList<>();
|
||||
int toolPosX = 0;
|
||||
int toolPosY = 0;
|
||||
|
||||
|
||||
@@ -82,8 +82,8 @@ public class GuiInterface extends GuiUpgradeable
|
||||
|
||||
this.fontRenderer.drawString( this.getGuiDisplayName( GuiText.Interface.getLocal() ), 8, 6, 4210752 );
|
||||
|
||||
this.fontRenderer.drawString( GuiText.Config.getLocal(), 18, 6 + 11 + 7, 4210752 );
|
||||
this.fontRenderer.drawString( GuiText.StoredItems.getLocal(), 18, 6 + 60 + 7, 4210752 );
|
||||
this.fontRenderer.drawString( GuiText.Config.getLocal(), 8, 6 + 11 + 7, 4210752 );
|
||||
this.fontRenderer.drawString( GuiText.StoredItems.getLocal(), 8, 6 + 60 + 7, 4210752 );
|
||||
this.fontRenderer.drawString( GuiText.Patterns.getLocal(), 8, 6 + 73 + 7, 4210752 );
|
||||
|
||||
this.fontRenderer.drawString( GuiText.inventory.getLocal(), 8, this.ySize - 96 + 3, 4210752 );
|
||||
|
||||
@@ -95,6 +95,9 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
private GuiImgButton SortDirBox;
|
||||
private GuiImgButton searchBoxSettings;
|
||||
private GuiImgButton terminalStyleBox;
|
||||
private boolean isAutoFocus = false;
|
||||
private int currentMouseX = 0;
|
||||
private int currentMouseY = 0;
|
||||
|
||||
public GuiMEMonitorable( final InventoryPlayer inventoryPlayer, final ITerminalHost te )
|
||||
{
|
||||
@@ -224,8 +227,10 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
Keyboard.enableRepeatEvents( true );
|
||||
|
||||
this.maxRows = this.getMaxRows();
|
||||
this.perRow = AEConfig.instance().getConfigManager().getSetting(
|
||||
Settings.TERMINAL_STYLE ) != TerminalStyle.FULL ? 9 : 9 + ( ( this.width - this.standardSize ) / 18 );
|
||||
this.perRow = AEConfig.instance()
|
||||
.getConfigManager()
|
||||
.getSetting(
|
||||
Settings.TERMINAL_STYLE ) != TerminalStyle.FULL ? 9 : 9 + ( ( this.width - this.standardSize ) / 18 );
|
||||
|
||||
final int magicNumber = 114 + 1;
|
||||
final int extraSpace = this.height - magicNumber - this.reservedSpace;
|
||||
@@ -290,8 +295,10 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
offset += 20;
|
||||
|
||||
this.buttonList.add(
|
||||
this.searchBoxSettings = new GuiImgButton( this.guiLeft - 18, offset, Settings.SEARCH_MODE, AEConfig.instance().getConfigManager().getSetting(
|
||||
Settings.SEARCH_MODE ) ) );
|
||||
this.searchBoxSettings = new GuiImgButton( this.guiLeft - 18, offset, Settings.SEARCH_MODE, AEConfig.instance()
|
||||
.getConfigManager()
|
||||
.getSetting(
|
||||
Settings.SEARCH_MODE ) ) );
|
||||
|
||||
offset += 20;
|
||||
|
||||
@@ -306,7 +313,7 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
this.searchField.setEnableBackgroundDrawing( false );
|
||||
this.searchField.setMaxStringLength( 25 );
|
||||
this.searchField.setTextColor( 0xFFFFFF );
|
||||
this.searchField.setSelectionColor( 0xFF99FF99 );
|
||||
this.searchField.setSelectionColor( 0xFF008000 );
|
||||
this.searchField.setVisible( true );
|
||||
|
||||
if( this.viewCell || this instanceof GuiWirelessTerm )
|
||||
@@ -318,13 +325,11 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
|
||||
final Enum searchModeSetting = AEConfig.instance().getConfigManager().getSetting( Settings.SEARCH_MODE );
|
||||
|
||||
final boolean isAutoFocus = SearchBoxMode.AUTOSEARCH == searchModeSetting || SearchBoxMode.JEI_AUTOSEARCH == searchModeSetting || SearchBoxMode.AUTOSEARCH_KEEP == searchModeSetting || SearchBoxMode.JEI_AUTOSEARCH_KEEP == searchModeSetting;
|
||||
final boolean isManualFocus = SearchBoxMode.MANUAL_SEARCH == searchModeSetting || SearchBoxMode.JEI_MANUAL_SEARCH == searchModeSetting || SearchBoxMode.MANUAL_SEARCH_KEEP == searchModeSetting || SearchBoxMode.JEI_MANUAL_SEARCH_KEEP == searchModeSetting;
|
||||
this.isAutoFocus = SearchBoxMode.AUTOSEARCH == searchModeSetting || SearchBoxMode.JEI_AUTOSEARCH == searchModeSetting || SearchBoxMode.AUTOSEARCH_KEEP == searchModeSetting || SearchBoxMode.JEI_AUTOSEARCH_KEEP == searchModeSetting;
|
||||
final boolean isKeepFilter = SearchBoxMode.AUTOSEARCH_KEEP == searchModeSetting || SearchBoxMode.JEI_AUTOSEARCH_KEEP == searchModeSetting || SearchBoxMode.MANUAL_SEARCH_KEEP == searchModeSetting || SearchBoxMode.JEI_MANUAL_SEARCH_KEEP == searchModeSetting;
|
||||
final boolean isJEIEnabled = SearchBoxMode.JEI_AUTOSEARCH == searchModeSetting || SearchBoxMode.JEI_MANUAL_SEARCH == searchModeSetting;
|
||||
|
||||
this.searchField.setFocused( isAutoFocus );
|
||||
this.searchField.setCanLoseFocus( isManualFocus );
|
||||
this.searchField.setFocused( this.isAutoFocus );
|
||||
|
||||
if( isJEIEnabled )
|
||||
{
|
||||
@@ -374,6 +379,9 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
{
|
||||
this.fontRenderer.drawString( this.getGuiDisplayName( this.myName.getLocal() ), 8, 6, 4210752 );
|
||||
this.fontRenderer.drawString( GuiText.inventory.getLocal(), 8, this.ySize - 96 + 3, 4210752 );
|
||||
|
||||
this.currentMouseX = mouseX;
|
||||
this.currentMouseY = mouseY;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -470,18 +478,40 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
@Override
|
||||
protected void keyTyped( final char character, final int key ) throws IOException
|
||||
{
|
||||
|
||||
if( !this.checkHotbarKeys( key ) )
|
||||
{
|
||||
if( key == Keyboard.KEY_TAB )
|
||||
{
|
||||
this.searchField.setFocused( !this.searchField.isFocused() );
|
||||
return;
|
||||
}
|
||||
|
||||
if( this.searchField.isFocused() && ( key == Keyboard.KEY_ESCAPE || key == Keyboard.KEY_RETURN ) )
|
||||
{
|
||||
this.searchField.setFocused( false );
|
||||
return;
|
||||
}
|
||||
|
||||
if( character == ' ' && this.searchField.getText().isEmpty() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final boolean mouseInGui = this.isPointInRegion( 0, 0, this.xSize, this.ySize, this.currentMouseX, this.currentMouseY );
|
||||
|
||||
if( this.isAutoFocus && !this.searchField.isFocused() && mouseInGui )
|
||||
{
|
||||
this.searchField.setFocused( true );
|
||||
}
|
||||
|
||||
if( this.searchField.textboxKeyTyped( character, key ) )
|
||||
{
|
||||
this.repo.setSearchString( this.searchField.getText() );
|
||||
this.repo.updateView();
|
||||
this.setScrollBar();
|
||||
// tell forge the key event is handled and should not be sent out
|
||||
this.keyHandled = mouseInGui;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -25,14 +25,9 @@ import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import appeng.api.AEApi;
|
||||
import appeng.api.definitions.IBlocks;
|
||||
import appeng.api.definitions.IDefinitions;
|
||||
import appeng.api.definitions.IParts;
|
||||
import appeng.client.gui.AEBaseGui;
|
||||
import appeng.client.gui.widgets.GuiNumberBox;
|
||||
import appeng.client.gui.widgets.GuiTabButton;
|
||||
import appeng.container.AEBaseContainer;
|
||||
import appeng.container.implementations.ContainerPriority;
|
||||
import appeng.core.AEConfig;
|
||||
import appeng.core.AELog;
|
||||
@@ -42,12 +37,6 @@ import appeng.core.sync.network.NetworkHandler;
|
||||
import appeng.core.sync.packets.PacketSwitchGuis;
|
||||
import appeng.core.sync.packets.PacketValueConfig;
|
||||
import appeng.helpers.IPriorityHost;
|
||||
import appeng.parts.automation.PartFormationPlane;
|
||||
import appeng.parts.misc.PartInterface;
|
||||
import appeng.parts.misc.PartStorageBus;
|
||||
import appeng.tile.misc.TileInterface;
|
||||
import appeng.tile.storage.TileChest;
|
||||
import appeng.tile.storage.TileDrive;
|
||||
|
||||
|
||||
public class GuiPriority extends AEBaseGui
|
||||
@@ -92,49 +81,11 @@ public class GuiPriority extends AEBaseGui
|
||||
this.buttonList.add( this.minus100 = new GuiButton( 0, this.guiLeft + 82, this.guiTop + 69, 32, 20, "-" + c ) );
|
||||
this.buttonList.add( this.minus1000 = new GuiButton( 0, this.guiLeft + 120, this.guiTop + 69, 38, 20, "-" + d ) );
|
||||
|
||||
ItemStack myIcon = null;
|
||||
final Object target = ( (AEBaseContainer) this.inventorySlots ).getTarget();
|
||||
final IDefinitions definitions = AEApi.instance().definitions();
|
||||
final IParts parts = definitions.parts();
|
||||
final IBlocks blocks = definitions.blocks();
|
||||
final ContainerPriority con = ( (ContainerPriority) this.inventorySlots );
|
||||
final ItemStack myIcon = con.getPriorityHost().getItemStackRepresentation();
|
||||
this.OriginalGui = con.getPriorityHost().getGuiBridge();
|
||||
|
||||
if( target instanceof PartStorageBus )
|
||||
{
|
||||
myIcon = parts.storageBus().maybeStack( 1 ).orElse( myIcon );
|
||||
this.OriginalGui = GuiBridge.GUI_STORAGEBUS;
|
||||
}
|
||||
|
||||
if( target instanceof PartFormationPlane )
|
||||
{
|
||||
myIcon = parts.formationPlane().maybeStack( 1 ).orElse( myIcon );
|
||||
this.OriginalGui = GuiBridge.GUI_FORMATION_PLANE;
|
||||
}
|
||||
|
||||
if( target instanceof TileDrive )
|
||||
{
|
||||
myIcon = blocks.drive().maybeStack( 1 ).orElse( myIcon );
|
||||
this.OriginalGui = GuiBridge.GUI_DRIVE;
|
||||
}
|
||||
|
||||
if( target instanceof TileChest )
|
||||
{
|
||||
myIcon = blocks.chest().maybeStack( 1 ).orElse( myIcon );
|
||||
this.OriginalGui = GuiBridge.GUI_CHEST;
|
||||
}
|
||||
|
||||
if( target instanceof TileInterface )
|
||||
{
|
||||
myIcon = blocks.iface().maybeStack( 1 ).orElse( myIcon );
|
||||
this.OriginalGui = GuiBridge.GUI_INTERFACE;
|
||||
}
|
||||
|
||||
if( target instanceof PartInterface )
|
||||
{
|
||||
myIcon = parts.iface().maybeStack( 1 ).orElse( myIcon );
|
||||
this.OriginalGui = GuiBridge.GUI_INTERFACE;
|
||||
}
|
||||
|
||||
if( this.OriginalGui != null && myIcon != null )
|
||||
if( this.OriginalGui != null && !myIcon.isEmpty() )
|
||||
{
|
||||
this.buttonList.add( this.originalGuiBtn = new GuiTabButton( this.guiLeft + 154, this.guiTop, myIcon, myIcon.getDisplayName(), this.itemRender ) );
|
||||
}
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
|
||||
package appeng.client.gui.widgets;
|
||||
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.Gui;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
|
||||
public abstract class GuiCustomSlot extends Gui implements ITooltip
|
||||
{
|
||||
private final int x;
|
||||
private final int y;
|
||||
private final int id;
|
||||
|
||||
public GuiCustomSlot( final int id, final int x, final int y )
|
||||
{
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
public boolean canClick( final EntityPlayer player )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public void slotClicked( final ItemStack clickStack, final int mouseButton )
|
||||
{
|
||||
}
|
||||
|
||||
public abstract void drawContent( final Minecraft mc, final int mouseX, final int mouseY, final float partialTicks );
|
||||
|
||||
public void drawBackground( int guileft, int guitop )
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int xPos()
|
||||
{
|
||||
return this.x;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int yPos()
|
||||
{
|
||||
return this.y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWidth()
|
||||
{
|
||||
return 16;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getHeight()
|
||||
{
|
||||
return 16;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisible()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isSlotEnabled()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -43,6 +43,7 @@ public class MEGuiTextField extends GuiTextField
|
||||
private final int _yPos;
|
||||
private final int _width;
|
||||
private final int _height;
|
||||
private final int _fontPad;
|
||||
private int selectionColor = 0xFF00FF00;
|
||||
|
||||
/**
|
||||
@@ -59,6 +60,7 @@ public class MEGuiTextField extends GuiTextField
|
||||
{
|
||||
super( 0, fontRenderer, xPos + PADDING, yPos + PADDING, width - 2 * PADDING - fontRenderer.getCharWidth( '_' ), height - 2 * PADDING );
|
||||
|
||||
this._fontPad = fontRenderer.getCharWidth( '_' );
|
||||
this._xPos = xPos;
|
||||
this._yPos = yPos;
|
||||
this._width = width;
|
||||
@@ -106,9 +108,31 @@ public class MEGuiTextField extends GuiTextField
|
||||
this.selectionColor = color;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawTextBox()
|
||||
{
|
||||
if( this.getVisible() )
|
||||
{
|
||||
if( this.isFocused() )
|
||||
{
|
||||
drawRect( this.x - PADDING + 1, this.y - PADDING + 1, this.x + this.width + this._fontPad + PADDING - 1, this.y + this.height + PADDING - 1,
|
||||
0xFF606060 );
|
||||
}
|
||||
else
|
||||
{
|
||||
drawRect( this.x - PADDING + 1, this.y - PADDING + 1, this.x + this.width + this._fontPad + PADDING - 1, this.y + this.height + PADDING - 1,
|
||||
0xFFA8A8A8 );
|
||||
}
|
||||
super.drawTextBox();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawSelectionBox( int startX, int startY, int endX, int endY )
|
||||
{
|
||||
if( !this.isFocused() )
|
||||
return;
|
||||
|
||||
if( startX < endX )
|
||||
{
|
||||
int i = startX;
|
||||
@@ -159,4 +183,5 @@ public class MEGuiTextField extends GuiTextField
|
||||
GlStateManager.disableColorLogic();
|
||||
GlStateManager.enableTexture2D();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,7 +24,6 @@ import javax.annotation.Nonnull;
|
||||
import net.minecraft.util.text.translation.I18n;
|
||||
|
||||
import appeng.tile.inventory.AppEngInternalInventory;
|
||||
import appeng.util.ItemSorters;
|
||||
|
||||
|
||||
public class ClientDCInternalInv implements Comparable<ClientDCInternalInv>
|
||||
@@ -57,7 +56,7 @@ public class ClientDCInternalInv implements Comparable<ClientDCInternalInv>
|
||||
@Override
|
||||
public int compareTo( @Nonnull final ClientDCInternalInv o )
|
||||
{
|
||||
return ItemSorters.compareLong( this.sortBy, o.sortBy );
|
||||
return Long.compare( this.sortBy, o.sortBy );
|
||||
}
|
||||
|
||||
public AppEngInternalInventory getInventory()
|
||||
@@ -69,4 +68,4 @@ public class ClientDCInternalInv implements Comparable<ClientDCInternalInv>
|
||||
{
|
||||
return this.id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,243 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.client.me;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.AEApi;
|
||||
import appeng.api.config.Settings;
|
||||
import appeng.api.config.SortOrder;
|
||||
import appeng.api.config.ViewItems;
|
||||
import appeng.api.config.YesNo;
|
||||
import appeng.api.storage.channels.IFluidStorageChannel;
|
||||
import appeng.api.storage.data.IAEFluidStack;
|
||||
import appeng.api.storage.data.IItemList;
|
||||
import appeng.client.gui.widgets.IScrollSource;
|
||||
import appeng.client.gui.widgets.ISortSource;
|
||||
import appeng.core.AEConfig;
|
||||
import appeng.fluids.util.FluidSorters;
|
||||
import appeng.util.Platform;
|
||||
import appeng.util.prioritylist.IPartitionList;
|
||||
|
||||
|
||||
/**
|
||||
* @author BrockWS
|
||||
* @version rv6 - 22/05/2018
|
||||
* @since rv6 22/05/2018
|
||||
*/
|
||||
public class FluidRepo
|
||||
{
|
||||
private final IItemList<IAEFluidStack> list = AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ).createList();
|
||||
private final ArrayList<IAEFluidStack> view = new ArrayList<>();
|
||||
private final IScrollSource src;
|
||||
private final ISortSource sortSrc;
|
||||
|
||||
private int rowSize = 9;
|
||||
|
||||
private String searchString = "";
|
||||
private IPartitionList<IAEFluidStack> myPartitionList;
|
||||
private boolean hasPower;
|
||||
|
||||
public FluidRepo( final IScrollSource src, final ISortSource sortSrc )
|
||||
{
|
||||
this.src = src;
|
||||
this.sortSrc = sortSrc;
|
||||
}
|
||||
|
||||
public void updateView()
|
||||
{
|
||||
this.view.clear();
|
||||
|
||||
this.view.ensureCapacity( this.list.size() );
|
||||
|
||||
String innerSearch = this.searchString;
|
||||
|
||||
boolean searchMod = false;
|
||||
if( innerSearch.startsWith( "@" ) )
|
||||
{
|
||||
searchMod = true;
|
||||
innerSearch = innerSearch.substring( 1 );
|
||||
}
|
||||
|
||||
Pattern m;
|
||||
try
|
||||
{
|
||||
m = Pattern.compile( innerSearch.toLowerCase(), Pattern.CASE_INSENSITIVE );
|
||||
}
|
||||
catch( final Exception ignore1 )
|
||||
{
|
||||
try
|
||||
{
|
||||
m = Pattern.compile( Pattern.quote( innerSearch.toLowerCase() ), Pattern.CASE_INSENSITIVE );
|
||||
}
|
||||
catch( final Exception ignore2 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
final Enum viewMode = this.sortSrc.getSortDisplay();
|
||||
final boolean needsZeroCopy = viewMode == ViewItems.CRAFTABLE;
|
||||
final boolean terminalSearchToolTips = AEConfig.instance().getConfigManager().getSetting( Settings.SEARCH_TOOLTIPS ) != YesNo.NO;
|
||||
|
||||
boolean notDone = false;
|
||||
for( IAEFluidStack fs : this.list )
|
||||
{
|
||||
if( this.myPartitionList != null && !this.myPartitionList.isListed( fs ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if( viewMode == ViewItems.CRAFTABLE && !fs.isCraftable() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if( viewMode == ViewItems.STORED && fs.getStackSize() == 0 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
final String dspName = searchMod ? Platform.getModId( fs ) : Platform.getFluidDisplayName( fs );
|
||||
boolean foundMatchingFluidStack = false;
|
||||
notDone = true;
|
||||
|
||||
if( m.matcher( dspName.toLowerCase() ).find() )
|
||||
{
|
||||
notDone = false;
|
||||
foundMatchingFluidStack = true;
|
||||
}
|
||||
|
||||
if( terminalSearchToolTips && notDone && !searchMod )
|
||||
{
|
||||
final List<String> tooltip = Platform.getTooltip( fs );
|
||||
|
||||
for( final String line : tooltip )
|
||||
{
|
||||
if( m.matcher( line ).find() )
|
||||
{
|
||||
foundMatchingFluidStack = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( foundMatchingFluidStack )
|
||||
{
|
||||
if( needsZeroCopy )
|
||||
{
|
||||
fs = fs.copy();
|
||||
fs.setStackSize( 0 );
|
||||
}
|
||||
|
||||
this.view.add( fs );
|
||||
}
|
||||
}
|
||||
|
||||
final Enum sortBy = this.sortSrc.getSortBy();
|
||||
final Enum sortDir = this.sortSrc.getSortDir();
|
||||
|
||||
FluidSorters.setDirection( (appeng.api.config.SortDir) sortDir );
|
||||
|
||||
if( sortBy == SortOrder.MOD )
|
||||
{
|
||||
Collections.sort( this.view, FluidSorters.CONFIG_BASED_SORT_BY_MOD );
|
||||
}
|
||||
else if( sortBy == SortOrder.AMOUNT )
|
||||
{
|
||||
Collections.sort( this.view, FluidSorters.CONFIG_BASED_SORT_BY_SIZE );
|
||||
}
|
||||
else
|
||||
{
|
||||
Collections.sort( this.view, FluidSorters.CONFIG_BASED_SORT_BY_NAME );
|
||||
}
|
||||
}
|
||||
|
||||
public void postUpdate( final IAEFluidStack is )
|
||||
{
|
||||
final IAEFluidStack st = this.list.findPrecise( is );
|
||||
|
||||
if( st != null )
|
||||
{
|
||||
st.reset();
|
||||
st.add( is );
|
||||
}
|
||||
else
|
||||
{
|
||||
this.list.add( is );
|
||||
}
|
||||
}
|
||||
|
||||
public IAEFluidStack getReferenceFluid( int idx )
|
||||
{
|
||||
idx += this.src.getCurrentScroll() * this.rowSize;
|
||||
|
||||
if( idx >= this.view.size() )
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return this.view.get( idx );
|
||||
}
|
||||
|
||||
public int size()
|
||||
{
|
||||
return this.view.size();
|
||||
}
|
||||
|
||||
public void clear()
|
||||
{
|
||||
this.list.resetStatus();
|
||||
}
|
||||
|
||||
public boolean hasPower()
|
||||
{
|
||||
return this.hasPower;
|
||||
}
|
||||
|
||||
public void setPower( final boolean hasPower )
|
||||
{
|
||||
this.hasPower = hasPower;
|
||||
}
|
||||
|
||||
public int getRowSize()
|
||||
{
|
||||
return this.rowSize;
|
||||
}
|
||||
|
||||
public void setRowSize( final int rowSize )
|
||||
{
|
||||
this.rowSize = rowSize;
|
||||
}
|
||||
|
||||
public String getSearchString()
|
||||
{
|
||||
return this.searchString;
|
||||
}
|
||||
|
||||
public void setSearchString( @Nonnull final String searchString )
|
||||
{
|
||||
this.searchString = searchString;
|
||||
}
|
||||
}
|
||||
+34
-19
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
|
||||
* Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
@@ -16,35 +16,50 @@
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.recipes;
|
||||
package appeng.client.me;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import appeng.api.storage.data.IAEFluidStack;
|
||||
|
||||
|
||||
/**
|
||||
* @author thatsIch
|
||||
* @version rv3 - 23.08.2015
|
||||
* @since rv3 23.08.2015
|
||||
* @author BrockWS
|
||||
* @version rv6 - 22/05/2018
|
||||
* @since rv6 22/05/2018
|
||||
*/
|
||||
public class CustomRecipeForgeConfiguration implements CustomRecipeConfig
|
||||
public class InternalFluidSlotME
|
||||
{
|
||||
private final boolean isEnabled;
|
||||
|
||||
public CustomRecipeForgeConfiguration( @Nonnull final Configuration config )
|
||||
private final int offset;
|
||||
private final int xPos;
|
||||
private final int yPos;
|
||||
private final FluidRepo repo;
|
||||
|
||||
public InternalFluidSlotME( final FluidRepo def, final int offset, final int displayX, final int displayY )
|
||||
{
|
||||
Preconditions.checkNotNull( config );
|
||||
|
||||
this.isEnabled = config.getBoolean( "enabled", "general", true, "If true, the custom recipes are enabled. Acts as a master switch." );
|
||||
this.repo = def;
|
||||
this.offset = offset;
|
||||
this.xPos = displayX;
|
||||
this.yPos = displayY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final boolean isEnabled()
|
||||
IAEFluidStack getAEStack()
|
||||
{
|
||||
return this.isEnabled;
|
||||
return this.repo.getReferenceFluid( this.offset );
|
||||
}
|
||||
|
||||
boolean hasPower()
|
||||
{
|
||||
return this.repo.hasPower();
|
||||
}
|
||||
|
||||
int getxPosition()
|
||||
{
|
||||
return this.xPos;
|
||||
}
|
||||
|
||||
int getyPosition()
|
||||
{
|
||||
return this.yPos;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.client.me;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.items.SlotItemHandler;
|
||||
|
||||
import appeng.api.storage.data.IAEFluidStack;
|
||||
import appeng.fluids.container.slots.IMEFluidSlot;
|
||||
|
||||
|
||||
/**
|
||||
* @author BrockWS
|
||||
* @version rv6 - 22/05/2018
|
||||
* @since rv6 22/05/2018
|
||||
*/
|
||||
public class SlotFluidME extends SlotItemHandler implements IMEFluidSlot
|
||||
{
|
||||
|
||||
private InternalFluidSlotME slot;
|
||||
|
||||
public SlotFluidME( InternalFluidSlotME slot )
|
||||
{
|
||||
super( null, 0, slot.getxPosition(), slot.getyPosition() );
|
||||
this.slot = slot;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IAEFluidStack getAEFluidStack()
|
||||
{
|
||||
if( this.slot.hasPower() )
|
||||
{
|
||||
return this.slot.getAEStack();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isItemValid( final ItemStack par1ItemStack )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public ItemStack getStack()
|
||||
{
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getHasStack()
|
||||
{
|
||||
if( this.slot.hasPower() )
|
||||
{
|
||||
return this.getAEFluidStack() != null;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void putStack( final ItemStack par1ItemStack )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSlotStackLimit()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public ItemStack decrStackSize( final int par1 )
|
||||
{
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHere( final IInventory inv, final int slotIn )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canTakeStack( final EntityPlayer par1EntityPlayer )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.client.render;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.client.renderer.block.model.BakedQuad;
|
||||
import net.minecraft.client.renderer.block.model.IBakedModel;
|
||||
import net.minecraft.client.renderer.block.model.ItemOverrideList;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
|
||||
/**
|
||||
* @author DrummerMC
|
||||
* @version rv6 - 2018-01-22
|
||||
* @since rv6 2018-01-22
|
||||
*/
|
||||
public class DummyFluidBakedModel implements IBakedModel
|
||||
{
|
||||
private final ImmutableList<BakedQuad> quads;
|
||||
public DummyFluidBakedModel( ImmutableList<BakedQuad> quads )
|
||||
{
|
||||
this.quads = quads;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BakedQuad> getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand )
|
||||
{
|
||||
return quads;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAmbientOcclusion()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isGui3d()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBuiltInRenderer()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TextureAtlasSprite getParticleTexture()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemOverrideList getOverrides()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.client.render;
|
||||
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.client.renderer.block.model.BakedQuad;
|
||||
import net.minecraft.client.renderer.block.model.IBakedModel;
|
||||
import net.minecraft.client.renderer.block.model.ItemOverrideList;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.client.renderer.vertex.VertexFormat;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.client.model.ItemLayerModel;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
|
||||
import appeng.fluids.items.FluidDummyItem;
|
||||
|
||||
|
||||
/**
|
||||
* This baked model class is used as a dispatcher to redirect the renderer to the *real* model that should be used based
|
||||
* on the item stack.
|
||||
* A custom Item Override List is used to accomplish this.
|
||||
*/
|
||||
public class DummyFluidDispatcherBakedModel extends DelegateBakedModel
|
||||
{
|
||||
private final VertexFormat format;
|
||||
private final Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter;
|
||||
|
||||
public DummyFluidDispatcherBakedModel( IBakedModel baseModel, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
|
||||
{
|
||||
super( baseModel );
|
||||
this.format = format;
|
||||
this.bakedTextureGetter = bakedTextureGetter;
|
||||
}
|
||||
|
||||
// This is never used. See the item override list below.
|
||||
@Override
|
||||
public List<BakedQuad> getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand )
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isGui3d()
|
||||
{
|
||||
return this.getBaseModel().isGui3d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBuiltInRenderer()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemOverrideList getOverrides()
|
||||
{
|
||||
return new ItemOverrideList( Collections.emptyList() )
|
||||
{
|
||||
@Override
|
||||
public IBakedModel handleItemState( IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity )
|
||||
{
|
||||
if( !( stack.getItem() instanceof FluidDummyItem ) )
|
||||
{
|
||||
return originalModel;
|
||||
}
|
||||
|
||||
FluidDummyItem itemFacade = (FluidDummyItem) stack.getItem();
|
||||
|
||||
FluidStack fluidStack = itemFacade.getFluidStack( stack );
|
||||
if( fluidStack == null )
|
||||
{
|
||||
fluidStack = new FluidStack( FluidRegistry.WATER, Fluid.BUCKET_VOLUME );
|
||||
}
|
||||
|
||||
TextureAtlasSprite sprite = bakedTextureGetter.apply( fluidStack.getFluid().getStill( fluidStack ) );
|
||||
if( sprite == null )
|
||||
{
|
||||
return new DummyFluidBakedModel( ImmutableList.of() );
|
||||
}
|
||||
|
||||
return new DummyFluidBakedModel( ItemLayerModel.getQuadsForSprite( 0, sprite, format, Optional.empty() ) );
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.client.render;
|
||||
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.function.Function;
|
||||
|
||||
import net.minecraft.client.renderer.block.model.IBakedModel;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.client.renderer.vertex.VertexFormat;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.client.model.IModel;
|
||||
import net.minecraftforge.client.model.ModelLoaderRegistry;
|
||||
import net.minecraftforge.common.model.IModelState;
|
||||
|
||||
import appeng.core.AppEng;
|
||||
|
||||
|
||||
/**
|
||||
* The model class for facades. Since facades wrap existing models, they don't declare any dependencies here other
|
||||
* than the cable anchor.
|
||||
*/
|
||||
public class DummyFluidItemModel implements IModel
|
||||
{
|
||||
// We use this to get the default item transforms and make our lives easier
|
||||
private static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "item/dummy_fluid_item_base" );
|
||||
|
||||
private IModel baseModel = null;
|
||||
|
||||
private IModel getBaseModel()
|
||||
{
|
||||
if( this.baseModel == null )
|
||||
{
|
||||
try
|
||||
{
|
||||
baseModel = ModelLoaderRegistry.getModel( MODEL_BASE );
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
}
|
||||
return this.baseModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ResourceLocation> getDependencies()
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ResourceLocation> getTextures()
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBakedModel bake( IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
|
||||
{
|
||||
IBakedModel bakedBaseModel = this.getBaseModel().bake( state, format, bakedTextureGetter );
|
||||
|
||||
return new DummyFluidDispatcherBakedModel( bakedBaseModel, format, bakedTextureGetter );
|
||||
}
|
||||
|
||||
@Override
|
||||
public IModelState getDefaultState()
|
||||
{
|
||||
return getBaseModel().getDefaultState();
|
||||
}
|
||||
}
|
||||
@@ -132,7 +132,7 @@ class CableBuilder
|
||||
break;
|
||||
case DENSE_COVERED:
|
||||
case DENSE_SMART:
|
||||
this.addCableCore( CableCoreType.DENSE_SMART, color, quadsOut );
|
||||
this.addCableCore( CableCoreType.DENSE, color, quadsOut );
|
||||
break;
|
||||
default:
|
||||
}
|
||||
@@ -153,7 +153,7 @@ class CableBuilder
|
||||
case COVERED:
|
||||
cubeBuilder.addCube( 5, 5, 5, 11, 11, 11 );
|
||||
break;
|
||||
case DENSE_SMART:
|
||||
case DENSE:
|
||||
cubeBuilder.addCube( 3, 3, 3, 13, 13, 13 );
|
||||
break;
|
||||
}
|
||||
@@ -329,7 +329,6 @@ class CableBuilder
|
||||
|
||||
public void addConstrainedCoveredConnection( EnumFacing facing, AEColor cableColor, int distanceFromEdge, List<BakedQuad> quadsOut )
|
||||
{
|
||||
|
||||
// The core of a covered cable reaches up to 5 voxels from the block edge, so
|
||||
// drawing a connection can only occur from there onwards
|
||||
if( distanceFromEdge >= 5 )
|
||||
@@ -348,6 +347,11 @@ class CableBuilder
|
||||
|
||||
public void addSmartConnection( EnumFacing facing, AEColor cableColor, AECableType connectionType, boolean cableBusAdjacent, int channels, List<BakedQuad> quadsOut )
|
||||
{
|
||||
if( connectionType == AECableType.COVERED || connectionType == AECableType.GLASS )
|
||||
{
|
||||
this.addCoveredConnection( facing, cableColor, connectionType, cableBusAdjacent, quadsOut );
|
||||
return;
|
||||
}
|
||||
|
||||
CubeBuilder cubeBuilder = new CubeBuilder( this.format, quadsOut );
|
||||
|
||||
|
||||
@@ -169,20 +169,7 @@ public class CableBusBakedModel implements IBakedModel
|
||||
|
||||
final AECableType secondType = sides.get( firstSide.getOpposite() );
|
||||
|
||||
// Certain cable types have restrictions on when they're rendered as a straight connection
|
||||
switch( cableType )
|
||||
{
|
||||
case GLASS:
|
||||
return firstType == AECableType.GLASS && secondType == AECableType.GLASS;
|
||||
case DENSE_COVERED:
|
||||
return firstType == AECableType.DENSE_COVERED && secondType == AECableType.DENSE_COVERED;
|
||||
case DENSE_SMART:
|
||||
return firstType == AECableType.DENSE_SMART && secondType == AECableType.DENSE_SMART;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
return firstType == secondType;
|
||||
}
|
||||
|
||||
private void addCableQuads( CableBusRenderState renderState, List<BakedQuad> quadsOut )
|
||||
|
||||
@@ -40,7 +40,7 @@ import appeng.core.AppEng;
|
||||
*/
|
||||
public enum CableCoreType
|
||||
{
|
||||
GLASS( "parts/cable/core/glass" ), COVERED( "parts/cable/core/covered" ), DENSE_SMART( "parts/cable/core/dense_smart" );
|
||||
GLASS( "parts/cable/core/glass" ), COVERED( "parts/cable/core/covered" ), DENSE( "parts/cable/core/dense_smart" );
|
||||
|
||||
private static final Map<AECableType, CableCoreType> cableMapping = generateCableMapping();
|
||||
|
||||
@@ -55,8 +55,8 @@ public enum CableCoreType
|
||||
result.put( AECableType.GLASS, CableCoreType.GLASS );
|
||||
result.put( AECableType.COVERED, CableCoreType.COVERED );
|
||||
result.put( AECableType.SMART, CableCoreType.COVERED );
|
||||
result.put( AECableType.DENSE_COVERED, CableCoreType.DENSE_SMART );
|
||||
result.put( AECableType.DENSE_SMART, CableCoreType.DENSE_SMART );
|
||||
result.put( AECableType.DENSE_COVERED, CableCoreType.DENSE );
|
||||
result.put( AECableType.DENSE_SMART, CableCoreType.DENSE );
|
||||
|
||||
return ImmutableMap.copyOf( result );
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ public class CubeBuilder
|
||||
builder.setQuadOrientation( face );
|
||||
builder.setQuadTint( -1 );
|
||||
builder.setApplyDiffuseLighting( true );
|
||||
|
||||
|
||||
UvVector uv = new UvVector();
|
||||
|
||||
// The user might have set specific UV coordinates for this face
|
||||
|
||||
@@ -53,7 +53,6 @@ import appeng.api.parts.IPart;
|
||||
import appeng.api.storage.IMEInventoryHandler;
|
||||
import appeng.api.storage.channels.IItemStorageChannel;
|
||||
import appeng.api.storage.data.IAEItemStack;
|
||||
import appeng.client.me.InternalSlotME;
|
||||
import appeng.client.me.SlotME;
|
||||
import appeng.container.guisync.GuiSync;
|
||||
import appeng.container.guisync.SyncData;
|
||||
@@ -356,6 +355,11 @@ public abstract class AEBaseContainer extends Container
|
||||
|
||||
if( Platform.isServer() )
|
||||
{
|
||||
if( this.tileEntity != null && this.tileEntity.getWorld().getTileEntity( this.tileEntity.getPos() ) != this.tileEntity )
|
||||
{
|
||||
this.setValidContainer( false );
|
||||
}
|
||||
|
||||
for( final IContainerListener listener : this.listeners )
|
||||
{
|
||||
for( final SyncData sd : this.syncData.values() )
|
||||
@@ -376,21 +380,6 @@ public abstract class AEBaseContainer extends Container
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
boolean hasMETiles = false;
|
||||
for( final Object is : this.inventorySlots )
|
||||
{
|
||||
if( is instanceof InternalSlotME )
|
||||
{
|
||||
hasMETiles = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( hasMETiles && Platform.isClient() )
|
||||
{
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
final AppEngSlot clickSlot = (AppEngSlot) this.inventorySlots.get( idx ); // require AE SLots!
|
||||
|
||||
if( clickSlot instanceof SlotDisabled || clickSlot instanceof SlotInaccessible )
|
||||
@@ -413,24 +402,29 @@ public abstract class AEBaseContainer extends Container
|
||||
*/
|
||||
if( clickSlot.isPlayerSide() )
|
||||
{
|
||||
tis = this.shiftStoreItem( tis );
|
||||
tis = this.transferStackToContainer( tis );
|
||||
|
||||
// target slots in the container...
|
||||
for( final Object inventorySlot : this.inventorySlots )
|
||||
if( !tis.isEmpty() )
|
||||
{
|
||||
final AppEngSlot cs = (AppEngSlot) inventorySlot;
|
||||
|
||||
if( !( cs.isPlayerSide() ) && !( cs instanceof SlotFake ) && !( cs instanceof SlotCraftingMatrix ) )
|
||||
// target slots in the container...
|
||||
for( final Object inventorySlot : this.inventorySlots )
|
||||
{
|
||||
if( cs.isItemValid( tis ) )
|
||||
final AppEngSlot cs = (AppEngSlot) inventorySlot;
|
||||
|
||||
if( !( cs.isPlayerSide() ) && !( cs instanceof SlotFake ) && !( cs instanceof SlotCraftingMatrix ) )
|
||||
{
|
||||
selectedSlots.add( cs );
|
||||
if( cs.isItemValid( tis ) )
|
||||
{
|
||||
selectedSlots.add( cs );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
tis = tis.copy();
|
||||
|
||||
// target slots in the container...
|
||||
for( final Object inventorySlot : this.inventorySlots )
|
||||
{
|
||||
@@ -491,7 +485,7 @@ public abstract class AEBaseContainer extends Container
|
||||
{
|
||||
if( d.getHasStack() )
|
||||
{
|
||||
final ItemStack t = d.getStack();
|
||||
final ItemStack t = d.getStack().copy();
|
||||
|
||||
if( Platform.itemComparisons().isSameItem( tis, t ) ) // t.isItemEqual(tis))
|
||||
{
|
||||
@@ -511,6 +505,8 @@ public abstract class AEBaseContainer extends Container
|
||||
t.setCount( t.getCount() + placeAble );
|
||||
tis.setCount( tis.getCount() - placeAble );
|
||||
|
||||
d.putStack( t );
|
||||
|
||||
if( tis.getCount() <= 0 )
|
||||
{
|
||||
clickSlot.putStack( ItemStack.EMPTY );
|
||||
@@ -543,7 +539,7 @@ public abstract class AEBaseContainer extends Container
|
||||
{
|
||||
if( d.getHasStack() )
|
||||
{
|
||||
final ItemStack t = d.getStack();
|
||||
final ItemStack t = d.getStack().copy();
|
||||
|
||||
if( Platform.itemComparisons().isSameItem( t, tis ) )
|
||||
{
|
||||
@@ -563,6 +559,8 @@ public abstract class AEBaseContainer extends Container
|
||||
t.setCount( t.getCount() + placeAble );
|
||||
tis.setCount( tis.getCount() - placeAble );
|
||||
|
||||
d.putStack( t );
|
||||
|
||||
if( tis.getCount() <= 0 )
|
||||
{
|
||||
clickSlot.putStack( ItemStack.EMPTY );
|
||||
@@ -621,7 +619,7 @@ public abstract class AEBaseContainer extends Container
|
||||
}
|
||||
}
|
||||
|
||||
clickSlot.putStack( !tis.isEmpty() ? tis.copy() : ItemStack.EMPTY );
|
||||
clickSlot.putStack( !tis.isEmpty() ? tis : ItemStack.EMPTY );
|
||||
}
|
||||
|
||||
this.updateSlot( clickSlot );
|
||||
@@ -1021,9 +1019,10 @@ public abstract class AEBaseContainer extends Container
|
||||
{
|
||||
try
|
||||
{
|
||||
NetworkHandler.instance().sendTo(
|
||||
new PacketInventoryAction( InventoryAction.UPDATE_HAND, 0, AEItemStack.fromItemStack( p.inventory.getItemStack() ) ),
|
||||
p );
|
||||
NetworkHandler.instance()
|
||||
.sendTo(
|
||||
new PacketInventoryAction( InventoryAction.UPDATE_HAND, 0, AEItemStack.fromItemStack( p.inventory.getItemStack() ) ),
|
||||
p );
|
||||
}
|
||||
catch( final IOException e )
|
||||
{
|
||||
@@ -1032,6 +1031,11 @@ public abstract class AEBaseContainer extends Container
|
||||
}
|
||||
}
|
||||
|
||||
protected ItemStack transferStackToContainer( final ItemStack input )
|
||||
{
|
||||
return shiftStoreItem( input );
|
||||
}
|
||||
|
||||
private ItemStack shiftStoreItem( final ItemStack input )
|
||||
{
|
||||
if( this.getPowerSource() == null || this.getCellInventory() == null )
|
||||
@@ -1094,8 +1098,9 @@ public abstract class AEBaseContainer extends Container
|
||||
{
|
||||
try
|
||||
{
|
||||
NetworkHandler.instance().sendTo( new PacketValueConfig( "CustomName", this.getCustomName() ),
|
||||
(EntityPlayerMP) this.getInventoryPlayer().player );
|
||||
NetworkHandler.instance()
|
||||
.sendTo( new PacketValueConfig( "CustomName", this.getCustomName() ),
|
||||
(EntityPlayerMP) this.getInventoryPlayer().player );
|
||||
}
|
||||
catch( final IOException e )
|
||||
{
|
||||
|
||||
@@ -33,10 +33,12 @@ import appeng.api.AEApi;
|
||||
import appeng.api.config.CopyMode;
|
||||
import appeng.api.config.FuzzyMode;
|
||||
import appeng.api.config.Settings;
|
||||
import appeng.api.implementations.items.IStorageCell;
|
||||
import appeng.api.storage.ICellWorkbenchItem;
|
||||
import appeng.api.storage.IMEInventory;
|
||||
import appeng.api.storage.IStorageChannel;
|
||||
import appeng.api.storage.channels.IItemStorageChannel;
|
||||
import appeng.api.storage.data.IAEItemStack;
|
||||
import appeng.api.storage.data.IAEStack;
|
||||
import appeng.api.storage.data.IItemList;
|
||||
import appeng.container.guisync.GuiSync;
|
||||
import appeng.container.slot.OptionalSlotRestrictedInput;
|
||||
@@ -148,11 +150,6 @@ public class ContainerCellWorkbench extends ContainerUpgradeable
|
||||
final ItemStack is = this.workBench.getInventoryByName( "cell" ).getStackInSlot( 0 );
|
||||
if( Platform.isServer() )
|
||||
{
|
||||
if( this.workBench.getWorld().getTileEntity( this.workBench.getPos() ) != this.workBench )
|
||||
{
|
||||
this.setValidContainer( false );
|
||||
}
|
||||
|
||||
for( final IContainerListener listener : this.listeners )
|
||||
{
|
||||
if( this.prevStack != is )
|
||||
@@ -224,17 +221,20 @@ public class ContainerCellWorkbench extends ContainerUpgradeable
|
||||
|
||||
public void partition()
|
||||
{
|
||||
|
||||
final IItemHandler inv = this.getUpgradeable().getInventoryByName( "config" );
|
||||
|
||||
final IMEInventory<IAEItemStack> cellInv = AEApi.instance().registries().cell().getCellInventory(
|
||||
this.getUpgradeable().getInventoryByName( "cell" ).getStackInSlot( 0 ), null,
|
||||
AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||
final ItemStack is = this.getUpgradeable().getInventoryByName( "cell" ).getStackInSlot( 0 );
|
||||
final IStorageChannel channel = is.getItem() instanceof IStorageCell ? ( (IStorageCell) is.getItem() ).getChannel() : AEApi.instance()
|
||||
.storage()
|
||||
.getStorageChannel( IItemStorageChannel.class );
|
||||
|
||||
Iterator<IAEItemStack> i = new NullIterator<>();
|
||||
final IMEInventory cellInv = AEApi.instance().registries().cell().getCellInventory( is, null, channel );
|
||||
|
||||
Iterator<IAEStack> i = new NullIterator<>();
|
||||
if( cellInv != null )
|
||||
{
|
||||
final IItemList<IAEItemStack> list = cellInv
|
||||
.getAvailableItems( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList() );
|
||||
final IItemList list = cellInv.getAvailableItems( channel.createList() );
|
||||
i = list.iterator();
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.nbt.NBTBase;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.wrapper.PlayerInvWrapper;
|
||||
|
||||
@@ -82,6 +83,8 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
||||
private final SlotPatternTerm craftSlot;
|
||||
private final SlotRestrictedInput patternSlotIN;
|
||||
private final SlotRestrictedInput patternSlotOUT;
|
||||
|
||||
private IRecipe currentRecipe;
|
||||
@GuiSync( 97 )
|
||||
public boolean craftingMode = true;
|
||||
@GuiSync( 96 )
|
||||
@@ -160,6 +163,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
||||
|
||||
private ItemStack getAndUpdateOutput()
|
||||
{
|
||||
final World world = this.getPlayerInv().player.world;
|
||||
final InventoryCrafting ic = new InventoryCrafting( this, 3, 3 );
|
||||
|
||||
for( int x = 0; x < ic.getSizeInventory(); x++ )
|
||||
@@ -167,7 +171,22 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
||||
ic.setInventorySlotContents( x, this.crafting.getStackInSlot( x ) );
|
||||
}
|
||||
|
||||
final ItemStack is = CraftingManager.findMatchingResult( ic, this.getPlayerInv().player.world );
|
||||
if( this.currentRecipe == null || !this.currentRecipe.matches( ic, world ) )
|
||||
{
|
||||
this.currentRecipe = CraftingManager.findMatchingRecipe( ic, world );
|
||||
}
|
||||
|
||||
final ItemStack is;
|
||||
|
||||
if( this.currentRecipe == null )
|
||||
{
|
||||
is = ItemStack.EMPTY;
|
||||
}
|
||||
else
|
||||
{
|
||||
is = this.currentRecipe.getCraftingResult( ic );
|
||||
}
|
||||
|
||||
this.cOut.setStackInSlot( 0, is );
|
||||
return is;
|
||||
}
|
||||
|
||||
@@ -88,4 +88,9 @@ public class ContainerPriority extends AEBaseContainer
|
||||
|
||||
super.onUpdate( field, oldValue, newValue );
|
||||
}
|
||||
|
||||
public IPriorityHost getPriorityHost()
|
||||
{
|
||||
return this.priHost;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -235,7 +235,7 @@ public class ContainerUpgradeable extends AEBaseContainer implements IOptionalSl
|
||||
}
|
||||
}
|
||||
|
||||
private void checkToolbox()
|
||||
protected void checkToolbox()
|
||||
{
|
||||
if( this.hasToolbox() )
|
||||
{
|
||||
@@ -289,7 +289,7 @@ public class ContainerUpgradeable extends AEBaseContainer implements IOptionalSl
|
||||
return this.fzMode;
|
||||
}
|
||||
|
||||
void setFuzzyMode( final FuzzyMode fzMode )
|
||||
public void setFuzzyMode( final FuzzyMode fzMode )
|
||||
{
|
||||
this.fzMode = fzMode;
|
||||
}
|
||||
@@ -309,7 +309,7 @@ public class ContainerUpgradeable extends AEBaseContainer implements IOptionalSl
|
||||
return this.rsMode;
|
||||
}
|
||||
|
||||
void setRedStoneMode( final RedstoneMode rsMode )
|
||||
public void setRedStoneMode( final RedstoneMode rsMode )
|
||||
{
|
||||
this.rsMode = rsMode;
|
||||
}
|
||||
@@ -324,7 +324,7 @@ public class ContainerUpgradeable extends AEBaseContainer implements IOptionalSl
|
||||
this.schedulingMode = schedulingMode;
|
||||
}
|
||||
|
||||
IUpgradeableHost getUpgradeable()
|
||||
protected IUpgradeableHost getUpgradeable()
|
||||
{
|
||||
return this.upgradeable;
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ package appeng.container.implementations;
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import appeng.api.networking.crafting.ICraftingCPU;
|
||||
import appeng.util.ItemSorters;
|
||||
|
||||
|
||||
public class CraftingCPURecord implements Comparable<CraftingCPURecord>
|
||||
@@ -44,12 +43,12 @@ public class CraftingCPURecord implements Comparable<CraftingCPURecord>
|
||||
@Override
|
||||
public int compareTo( @Nonnull final CraftingCPURecord o )
|
||||
{
|
||||
final int a = ItemSorters.compareLong( o.getProcessors(), this.getProcessors() );
|
||||
final int a = Long.compare( o.getProcessors(), this.getProcessors() );
|
||||
if( a != 0 )
|
||||
{
|
||||
return a;
|
||||
}
|
||||
return ItemSorters.compareLong( o.getSize(), this.getSize() );
|
||||
return Long.compare( o.getSize(), this.getSize() );
|
||||
}
|
||||
|
||||
ICraftingCPU getCpu()
|
||||
@@ -71,4 +70,4 @@ public class CraftingCPURecord implements Comparable<CraftingCPURecord>
|
||||
{
|
||||
return this.size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -274,7 +274,7 @@ public class AppEngSlot extends Slot
|
||||
this.isValid = isValid;
|
||||
}
|
||||
|
||||
AEBaseContainer getContainer()
|
||||
protected AEBaseContainer getContainer()
|
||||
{
|
||||
return this.myContainer;
|
||||
}
|
||||
|
||||
+14
-7
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
|
||||
* Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
@@ -16,15 +16,22 @@
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.recipes;
|
||||
package appeng.container.slot;
|
||||
|
||||
|
||||
/**
|
||||
* @author thatsIch
|
||||
* @version rv3 - 22.08.2015
|
||||
* @since rv3 22.08.2015
|
||||
* @author BrockWS
|
||||
* @version rv6 - 2/05/2018
|
||||
* @since rv6 2/05/2018
|
||||
*/
|
||||
public interface CustomRecipeConfig
|
||||
public interface IOptionalSlot
|
||||
{
|
||||
boolean isEnabled();
|
||||
default boolean isRenderDisabled()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int getSourceX();
|
||||
|
||||
int getSourceY();
|
||||
}
|
||||
@@ -25,7 +25,7 @@ import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
|
||||
public class OptionalSlotFake extends SlotFake
|
||||
public class OptionalSlotFake extends SlotFake implements IOptionalSlot
|
||||
{
|
||||
|
||||
private final int srcX;
|
||||
@@ -69,12 +69,8 @@ public class OptionalSlotFake extends SlotFake
|
||||
return this.host.isSlotEnabled( this.groupNum );
|
||||
}
|
||||
|
||||
public boolean renderDisabled()
|
||||
{
|
||||
return this.isRenderDisabled();
|
||||
}
|
||||
|
||||
private boolean isRenderDisabled()
|
||||
@Override
|
||||
public boolean isRenderDisabled()
|
||||
{
|
||||
return this.renderDisabled;
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ package appeng.container.slot;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
|
||||
public class OptionalSlotNormal extends AppEngSlot
|
||||
public class OptionalSlotNormal extends AppEngSlot implements IOptionalSlot
|
||||
{
|
||||
|
||||
private final int groupNum;
|
||||
@@ -45,4 +45,16 @@ public class OptionalSlotNormal extends AppEngSlot
|
||||
|
||||
return this.host.isSlotEnabled( this.groupNum );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSourceX()
|
||||
{
|
||||
return this.xPos;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSourceY()
|
||||
{
|
||||
return this.yPos;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,6 +93,7 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
private final int[] craftByStacks = { 1, 10, 100, 1000 };
|
||||
private final int[] priorityByStacks = { 1, 10, 100, 1000 };
|
||||
private final int[] levelByStacks = { 1, 10, 100, 1000 };
|
||||
private final int[] levelByMillibuckets = { 10, 100, 1000, 10000 };
|
||||
|
||||
// Spatial IO/Dimension
|
||||
private int storageProviderID = -1;
|
||||
@@ -172,12 +173,14 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
this.settings.registerSetting( Settings.TERMINAL_STYLE, TerminalStyle.TALL );
|
||||
this.settings.registerSetting( Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH );
|
||||
|
||||
this.spawnChargedChance = (float) ( 1.0 - this.get( "worldGen", "spawnChargedChance", 1.0 - this.spawnChargedChance ).getDouble(
|
||||
1.0 - this.spawnChargedChance ) );
|
||||
this.spawnChargedChance = (float) ( 1.0 - this.get( "worldGen", "spawnChargedChance", 1.0 - this.spawnChargedChance )
|
||||
.getDouble(
|
||||
1.0 - this.spawnChargedChance ) );
|
||||
this.minMeteoriteDistance = this.get( "worldGen", "minMeteoriteDistance", this.minMeteoriteDistance ).getInt( this.minMeteoriteDistance );
|
||||
this.meteoriteClusterChance = this.get( "worldGen", "meteoriteClusterChance", this.meteoriteClusterChance ).getDouble( this.meteoriteClusterChance );
|
||||
this.meteoriteMaximumSpawnHeight = this.get( "worldGen", "meteoriteMaximumSpawnHeight", this.meteoriteMaximumSpawnHeight ).getInt(
|
||||
this.meteoriteMaximumSpawnHeight );
|
||||
this.meteoriteMaximumSpawnHeight = this.get( "worldGen", "meteoriteMaximumSpawnHeight", this.meteoriteMaximumSpawnHeight )
|
||||
.getInt(
|
||||
this.meteoriteMaximumSpawnHeight );
|
||||
this.meteoriteDimensionWhitelist = this.get( "worldGen", "meteoriteDimensionWhitelist", this.meteoriteDimensionWhitelist ).getIntList();
|
||||
|
||||
this.quartzOresPerCluster = this.get( "worldGen", "quartzOresPerCluster", this.quartzOresPerCluster ).getInt( this.quartzOresPerCluster );
|
||||
@@ -191,14 +194,17 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
this.wirelessBaseCost = this.get( "wireless", "wirelessBaseCost", this.wirelessBaseCost ).getDouble( this.wirelessBaseCost );
|
||||
this.wirelessCostMultiplier = this.get( "wireless", "wirelessCostMultiplier", this.wirelessCostMultiplier ).getDouble( this.wirelessCostMultiplier );
|
||||
this.wirelessBaseRange = this.get( "wireless", "wirelessBaseRange", this.wirelessBaseRange ).getDouble( this.wirelessBaseRange );
|
||||
this.wirelessBoosterRangeMultiplier = this.get( "wireless", "wirelessBoosterRangeMultiplier", this.wirelessBoosterRangeMultiplier ).getDouble(
|
||||
this.wirelessBoosterRangeMultiplier );
|
||||
this.wirelessBoosterRangeMultiplier = this.get( "wireless", "wirelessBoosterRangeMultiplier", this.wirelessBoosterRangeMultiplier )
|
||||
.getDouble(
|
||||
this.wirelessBoosterRangeMultiplier );
|
||||
this.wirelessBoosterExp = this.get( "wireless", "wirelessBoosterExp", this.wirelessBoosterExp ).getDouble( this.wirelessBoosterExp );
|
||||
this.wirelessTerminalDrainMultiplier = this.get( "wireless", "wirelessTerminalDrainMultiplier", this.wirelessTerminalDrainMultiplier ).getDouble(
|
||||
this.wirelessTerminalDrainMultiplier );
|
||||
this.wirelessTerminalDrainMultiplier = this.get( "wireless", "wirelessTerminalDrainMultiplier", this.wirelessTerminalDrainMultiplier )
|
||||
.getDouble(
|
||||
this.wirelessTerminalDrainMultiplier );
|
||||
|
||||
this.formationPlaneEntityLimit = this.get( "automation", "formationPlaneEntityLimit", this.formationPlaneEntityLimit ).getInt(
|
||||
this.formationPlaneEntityLimit );
|
||||
this.formationPlaneEntityLimit = this.get( "automation", "formationPlaneEntityLimit", this.formationPlaneEntityLimit )
|
||||
.getInt(
|
||||
this.formationPlaneEntityLimit );
|
||||
|
||||
this.wirelessTerminalBattery = this.get( "battery", "wirelessTerminal", this.wirelessTerminalBattery ).getInt( this.wirelessTerminalBattery );
|
||||
this.chargedStaffBattery = this.get( "battery", "chargedStaff", this.chargedStaffBattery ).getInt( this.chargedStaffBattery );
|
||||
@@ -255,15 +261,17 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
{
|
||||
this.storageProviderID = this.get( "spatialio", "storageProviderID", this.storageProviderID ).getInt( this.storageProviderID );
|
||||
this.storageDimensionID = this.get( "spatialio", "storageDimensionID", this.storageDimensionID ).getInt( this.storageDimensionID );
|
||||
this.spatialPowerMultiplier = this.get( "spatialio", "spatialPowerMultiplier", this.spatialPowerMultiplier ).getDouble(
|
||||
this.spatialPowerMultiplier );
|
||||
this.spatialPowerMultiplier = this.get( "spatialio", "spatialPowerMultiplier", this.spatialPowerMultiplier )
|
||||
.getDouble(
|
||||
this.spatialPowerMultiplier );
|
||||
this.spatialPowerExponent = this.get( "spatialio", "spatialPowerExponent", this.spatialPowerExponent ).getDouble( this.spatialPowerExponent );
|
||||
}
|
||||
|
||||
if( this.isFeatureEnabled( AEFeature.CRAFTING_CPU ) )
|
||||
{
|
||||
this.craftingCalculationTimePerTick = this.get( "craftingCPU", "craftingCalculationTimePerTick", this.craftingCalculationTimePerTick ).getInt(
|
||||
this.craftingCalculationTimePerTick );
|
||||
this.craftingCalculationTimePerTick = this.get( "craftingCPU", "craftingCalculationTimePerTick", this.craftingCalculationTimePerTick )
|
||||
.getInt(
|
||||
this.craftingCalculationTimePerTick );
|
||||
}
|
||||
|
||||
this.updatable = true;
|
||||
@@ -530,6 +538,11 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
return this.levelByStacks[i];
|
||||
}
|
||||
|
||||
public int levelByMillyBuckets( final int i )
|
||||
{
|
||||
return this.levelByMillibuckets[i];
|
||||
}
|
||||
|
||||
public Enum getSetting( final String category, final Class<? extends Enum> class1, final Enum myDefault )
|
||||
{
|
||||
final String name = class1.getSimpleName();
|
||||
|
||||
@@ -58,8 +58,6 @@ import appeng.core.worlddata.WorldData;
|
||||
import appeng.hooks.TickHandler;
|
||||
import appeng.integration.IntegrationRegistry;
|
||||
import appeng.integration.IntegrationType;
|
||||
import appeng.recipes.CustomRecipeConfig;
|
||||
import appeng.recipes.CustomRecipeForgeConfiguration;
|
||||
import appeng.server.AECommand;
|
||||
import appeng.services.VersionChecker;
|
||||
import appeng.services.export.ExportConfig;
|
||||
@@ -98,14 +96,6 @@ public final class AppEng
|
||||
private final Registration registration;
|
||||
|
||||
private File configDirectory;
|
||||
private CustomRecipeConfig customRecipeConfig;
|
||||
|
||||
/**
|
||||
* Folder for recipes
|
||||
*
|
||||
* used for CSV item names and the recipes
|
||||
*/
|
||||
private File recipeDirectory;
|
||||
|
||||
/**
|
||||
* determined in pre-init but used in init
|
||||
@@ -152,7 +142,6 @@ public final class AppEng
|
||||
{
|
||||
final Stopwatch watch = Stopwatch.createStarted();
|
||||
this.configDirectory = new File( event.getModConfigurationDirectory().getPath(), "AppliedEnergistics2" );
|
||||
this.recipeDirectory = new File( this.configDirectory, "aerecipes" );
|
||||
|
||||
final File configFile = new File( this.configDirectory, "AppliedEnergistics2.cfg" );
|
||||
final File facadeFile = new File( this.configDirectory, "Facades.cfg" );
|
||||
@@ -164,11 +153,8 @@ public final class AppEng
|
||||
FacadeConfig.init( facadeFile );
|
||||
|
||||
final VersionCheckerConfig versionCheckerConfig = new VersionCheckerConfig( versionFile );
|
||||
this.customRecipeConfig = new CustomRecipeForgeConfiguration( recipeConfiguration );
|
||||
this.exportConfig = new ForgeExportConfig( recipeConfiguration );
|
||||
|
||||
this.registration.setRecipeInformation( this.recipeDirectory, this.customRecipeConfig );
|
||||
|
||||
AELog.info( "Pre Initialization ( started )" );
|
||||
|
||||
CreativeTab.init();
|
||||
@@ -226,7 +212,7 @@ public final class AppEng
|
||||
{
|
||||
if( FMLCommonHandler.instance().getSide().isClient() )
|
||||
{
|
||||
final ExportProcess process = new ExportProcess( this.recipeDirectory, this.exportConfig );
|
||||
final ExportProcess process = new ExportProcess( this.configDirectory, this.exportConfig );
|
||||
final Thread exportProcessThread = new Thread( process );
|
||||
|
||||
this.startService( "AE2 CSV Export", exportProcessThread );
|
||||
@@ -237,7 +223,7 @@ public final class AppEng
|
||||
}
|
||||
}
|
||||
|
||||
this.registration.initialize( event, this.recipeDirectory, this.customRecipeConfig );
|
||||
this.registration.initialize( event, this.configDirectory );
|
||||
IntegrationRegistry.INSTANCE.init();
|
||||
|
||||
AELog.info( "Initialization ( ended after " + start.elapsed( TimeUnit.MILLISECONDS ) + "ms )" );
|
||||
|
||||
@@ -1,118 +0,0 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.core;
|
||||
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
|
||||
import appeng.api.recipes.IRecipeHandler;
|
||||
import appeng.recipes.CustomRecipeConfig;
|
||||
import appeng.recipes.loader.ConfigLoader;
|
||||
import appeng.recipes.loader.JarLoader;
|
||||
import appeng.recipes.loader.RecipeResourceCopier;
|
||||
|
||||
|
||||
/**
|
||||
* handles the decision if recipes should be loaded from jar, loaded from file system or force copied from jar
|
||||
*
|
||||
* @author thatsIch
|
||||
* @version rv3 - 12.05.2015
|
||||
* @since rv3 12.05.2015
|
||||
*/
|
||||
public class RecipeLoader implements Runnable
|
||||
{
|
||||
/**
|
||||
* recipe path in the jar
|
||||
*/
|
||||
private static final String ASSETS_RECIPE_PATH = "/assets/appliedenergistics2/recipes/";
|
||||
|
||||
@Nonnull
|
||||
private final IRecipeHandler handler;
|
||||
@Nonnull
|
||||
private final CustomRecipeConfig config;
|
||||
@Nonnull
|
||||
private final File recipeDirectory;
|
||||
|
||||
/**
|
||||
* @param config configuration for the knowledge how to handle the loading process
|
||||
* @param handler handler to load the recipes
|
||||
*
|
||||
* @throws NullPointerException if handler is <tt>null</tt>
|
||||
*/
|
||||
public RecipeLoader( @Nonnull final File recipeDirectory, @Nonnull final CustomRecipeConfig config, @Nonnull final IRecipeHandler handler )
|
||||
{
|
||||
this.recipeDirectory = Preconditions.checkNotNull( recipeDirectory );
|
||||
Preconditions.checkArgument( !recipeDirectory.isFile() );
|
||||
this.config = Preconditions.checkNotNull( config );
|
||||
this.handler = Preconditions.checkNotNull( handler );
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void run()
|
||||
{
|
||||
if( this.config.isEnabled() )
|
||||
{
|
||||
// setup copying
|
||||
final RecipeResourceCopier copier = new RecipeResourceCopier( "assets/appliedenergistics2/aerecipes/" );
|
||||
|
||||
final File generatedRecipesDir = new File( this.recipeDirectory, "generated" );
|
||||
final File userRecipesDir = new File( this.recipeDirectory, "user" );
|
||||
|
||||
// generates generated and user recipes dir
|
||||
// will clean the generated every time to keep it up to date
|
||||
// copies over the recipes in the jar over to the generated folder
|
||||
// copies over the readmes
|
||||
try
|
||||
{
|
||||
FileUtils.forceMkdir( generatedRecipesDir );
|
||||
FileUtils.forceMkdir( userRecipesDir );
|
||||
FileUtils.cleanDirectory( generatedRecipesDir );
|
||||
|
||||
copier.copyTo( ".recipe", generatedRecipesDir );
|
||||
copier.copyTo( ".html", this.recipeDirectory );
|
||||
|
||||
// parse recipes prioritising the user scripts by using the generated as template
|
||||
this.handler.parseRecipes( new ConfigLoader( generatedRecipesDir, userRecipesDir ), "index.recipe" );
|
||||
}
|
||||
// on failure use jar parsing
|
||||
catch( final IOException e )
|
||||
{
|
||||
AELog.debug( e );
|
||||
this.handler.parseRecipes( new JarLoader( ASSETS_RECIPE_PATH ), "index.recipe" );
|
||||
}
|
||||
catch( final URISyntaxException e )
|
||||
{
|
||||
AELog.debug( e );
|
||||
this.handler.parseRecipes( new JarLoader( ASSETS_RECIPE_PATH ), "index.recipe" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this.handler.parseRecipes( new JarLoader( ASSETS_RECIPE_PATH ), "index.recipe" );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -77,7 +77,6 @@ import appeng.api.networking.spatial.ISpatialCache;
|
||||
import appeng.api.networking.storage.IStorageGrid;
|
||||
import appeng.api.networking.ticking.ITickManager;
|
||||
import appeng.api.parts.IPartHelper;
|
||||
import appeng.api.recipes.IRecipeHandler;
|
||||
import appeng.bootstrap.ICriterionTriggerRegistry;
|
||||
import appeng.bootstrap.IModelRegistry;
|
||||
import appeng.bootstrap.components.IBlockRegistrationComponent;
|
||||
@@ -91,7 +90,7 @@ import appeng.bootstrap.components.IRecipeRegistrationComponent;
|
||||
import appeng.capabilities.Capabilities;
|
||||
import appeng.core.features.AEFeature;
|
||||
import appeng.core.features.registries.P2PTunnelRegistry;
|
||||
import appeng.core.features.registries.cell.BasicCellHandler;
|
||||
import appeng.core.features.registries.cell.BasicItemCellHandler;
|
||||
import appeng.core.features.registries.cell.CreativeCellHandler;
|
||||
import appeng.core.localization.GuiText;
|
||||
import appeng.core.localization.PlayerMessages;
|
||||
@@ -99,9 +98,11 @@ import appeng.core.stats.AdvancementTriggers;
|
||||
import appeng.core.stats.PartItemPredicate;
|
||||
import appeng.core.stats.Stats;
|
||||
import appeng.core.worlddata.SpatialDimensionManager;
|
||||
import appeng.fluids.registries.BasicFluidCellHandler;
|
||||
import appeng.hooks.TickHandler;
|
||||
import appeng.items.materials.ItemMaterial;
|
||||
import appeng.items.parts.ItemFacade;
|
||||
import appeng.items.parts.ItemPart;
|
||||
import appeng.loot.ChestLoot;
|
||||
import appeng.me.cache.CraftingGridCache;
|
||||
import appeng.me.cache.EnergyGridCache;
|
||||
@@ -113,20 +114,9 @@ import appeng.me.cache.SpatialPylonCache;
|
||||
import appeng.me.cache.TickManagerCache;
|
||||
import appeng.parts.PartPlacement;
|
||||
import appeng.recipes.AEItemResolver;
|
||||
import appeng.recipes.CustomRecipeConfig;
|
||||
import appeng.recipes.RecipeHandler;
|
||||
import appeng.recipes.AERecipeLoader;
|
||||
import appeng.recipes.game.DisassembleRecipe;
|
||||
import appeng.recipes.game.FacadeRecipe;
|
||||
import appeng.recipes.handlers.Crusher;
|
||||
import appeng.recipes.handlers.Grind;
|
||||
import appeng.recipes.handlers.HCCrusher;
|
||||
import appeng.recipes.handlers.Inscribe;
|
||||
import appeng.recipes.handlers.Macerator;
|
||||
import appeng.recipes.handlers.MekCrusher;
|
||||
import appeng.recipes.handlers.MekEnrichment;
|
||||
import appeng.recipes.handlers.Press;
|
||||
import appeng.recipes.handlers.Pulverizer;
|
||||
import appeng.recipes.handlers.Smelt;
|
||||
import appeng.recipes.ores.OreDictionaryHandler;
|
||||
import appeng.spatial.BiomeGenStorage;
|
||||
import appeng.spatial.StorageWorldProvider;
|
||||
@@ -142,15 +132,6 @@ final class Registration
|
||||
Biome storageBiome;
|
||||
AdvancementTriggers advancementTriggers;
|
||||
|
||||
private File recipeDirectory;
|
||||
private CustomRecipeConfig customRecipeConfig;
|
||||
|
||||
public void setRecipeInformation( File f, CustomRecipeConfig f2 )
|
||||
{
|
||||
this.recipeDirectory = f;
|
||||
this.customRecipeConfig = f2;
|
||||
}
|
||||
|
||||
void preInitialize( final FMLPreInitializationEvent event )
|
||||
{
|
||||
Capabilities.register();
|
||||
@@ -159,10 +140,6 @@ final class Registration
|
||||
final IRecipeHandlerRegistry recipeRegistry = api.registries().recipes();
|
||||
this.registerCraftHandlers( recipeRegistry );
|
||||
|
||||
// RecipeSorter.register( "AE2-Facade", FacadeRecipe.class, Category.SHAPED, "" );
|
||||
// RecipeSorter.register( "AE2-Shaped", ShapedRecipe.class, Category.SHAPED, "" );
|
||||
// RecipeSorter.register( "AE2-Shapeless", ShapelessRecipe.class, Category.SHAPELESS, "" );
|
||||
|
||||
MinecraftForge.EVENT_BUS.register( OreDictionaryHandler.INSTANCE );
|
||||
|
||||
ApiDefinitions definitions = api.definitions();
|
||||
@@ -225,26 +202,13 @@ final class Registration
|
||||
private void registerCraftHandlers( final IRecipeHandlerRegistry registry )
|
||||
{
|
||||
registry.addNewSubItemResolver( new AEItemResolver() );
|
||||
|
||||
registry.addNewCraftHandler( "hccrusher", HCCrusher.class );
|
||||
registry.addNewCraftHandler( "mekcrusher", MekCrusher.class );
|
||||
registry.addNewCraftHandler( "mekechamber", MekEnrichment.class );
|
||||
registry.addNewCraftHandler( "grind", Grind.class );
|
||||
registry.addNewCraftHandler( "crusher", Crusher.class );
|
||||
registry.addNewCraftHandler( "pulverizer", Pulverizer.class );
|
||||
registry.addNewCraftHandler( "macerator", Macerator.class );
|
||||
|
||||
registry.addNewCraftHandler( "smelt", Smelt.class );
|
||||
registry.addNewCraftHandler( "inscribe", Inscribe.class );
|
||||
registry.addNewCraftHandler( "press", Press.class );
|
||||
}
|
||||
|
||||
public void initialize( @Nonnull final FMLInitializationEvent event, @Nonnull final File recipeDirectory, @Nonnull final CustomRecipeConfig customRecipeConfig )
|
||||
public void initialize( @Nonnull final FMLInitializationEvent event, @Nonnull final File recipeDirectory )
|
||||
{
|
||||
Preconditions.checkNotNull( event );
|
||||
Preconditions.checkNotNull( recipeDirectory );
|
||||
Preconditions.checkArgument( !recipeDirectory.isFile() );
|
||||
Preconditions.checkNotNull( customRecipeConfig );
|
||||
|
||||
final Api api = Api.INSTANCE;
|
||||
final IPartHelper partHelper = api.partHelper();
|
||||
@@ -254,19 +218,6 @@ final class Registration
|
||||
definitions.getRegistry().getBootstrapComponents( IOreDictComponent.class ).forEachRemaining( b -> b.oreRegistration( event.getSide() ) );
|
||||
definitions.getRegistry().getBootstrapComponents( IInitComponent.class ).forEachRemaining( b -> b.initialize( event.getSide() ) );
|
||||
|
||||
//
|
||||
// // Perform ore camouflage!
|
||||
// ItemMaterial.instance.makeUnique();
|
||||
|
||||
// final Runnable recipeLoader = new RecipeLoader( recipeDirectory, customRecipeConfig, this.recipeHandler );
|
||||
// recipeLoader.run();
|
||||
|
||||
// if( IntegrationRegistry.INSTANCE.isEnabled( IntegrationType.OpenComputers ) )
|
||||
// {
|
||||
// partHelper.registerNewLayer( "appeng.parts.layers.LayerSidedEnvironment",
|
||||
// "li.cil.oc.api.network.SidedEnvironment" );
|
||||
// }
|
||||
|
||||
MinecraftForge.EVENT_BUS.register( TickHandler.INSTANCE );
|
||||
|
||||
MinecraftForge.EVENT_BUS.register( new PartPlacement() );
|
||||
@@ -286,8 +237,9 @@ final class Registration
|
||||
gcr.registerGridCache( ISecurityGrid.class, SecurityCache.class );
|
||||
gcr.registerGridCache( ICraftingGrid.class, CraftingGridCache.class );
|
||||
|
||||
registries.cell().addCellHandler( new BasicCellHandler() );
|
||||
registries.cell().addCellHandler( new BasicItemCellHandler() );
|
||||
registries.cell().addCellHandler( new CreativeCellHandler() );
|
||||
registries.cell().addCellHandler( new BasicFluidCellHandler() );
|
||||
|
||||
api.definitions().materials().matterBall().maybeStack( 1 ).ifPresent( ammoStack ->
|
||||
{
|
||||
@@ -347,13 +299,12 @@ final class Registration
|
||||
|
||||
// Perform ore camouflage!
|
||||
ItemMaterial.instance.makeUnique();
|
||||
ItemPart.instance.registerOreDicts();
|
||||
|
||||
if( AEConfig.instance().isFeatureEnabled( AEFeature.ENABLE_DISASSEMBLY_CRAFTING ) )
|
||||
{
|
||||
DisassembleRecipe r = new DisassembleRecipe();
|
||||
registry.register( r.setRegistryName( AppEng.MOD_ID.toLowerCase(), "disassemble" ) );
|
||||
// RecipeSorter.register( "appliedenergistics2:disassemble", DisassembleRecipe.class, Category.SHAPELESS,
|
||||
// "after:minecraft:shapeless" );
|
||||
}
|
||||
|
||||
if( AEConfig.instance().isFeatureEnabled( AEFeature.ENABLE_FACADE_CRAFTING ) )
|
||||
@@ -362,18 +313,13 @@ final class Registration
|
||||
{
|
||||
FacadeRecipe f = new FacadeRecipe( (ItemFacade) facadeItem );
|
||||
registry.register( f.setRegistryName( AppEng.MOD_ID.toLowerCase(), "facade" ) );
|
||||
// RecipeSorter.register( "appliedenergistics2:facade", FacadeRecipe.class, Category.SHAPED,
|
||||
// "after:minecraft:shaped" );
|
||||
} );
|
||||
}
|
||||
|
||||
definitions.getRegistry().getBootstrapComponents( IRecipeRegistrationComponent.class ).forEachRemaining( b -> b.recipeRegistration( side, registry ) );
|
||||
|
||||
// load machine recipes
|
||||
final IRecipeHandler recipeHandler = new RecipeHandler();
|
||||
final Runnable recipeLoader = new RecipeLoader( this.recipeDirectory, this.customRecipeConfig, recipeHandler );
|
||||
recipeLoader.run();
|
||||
recipeHandler.injectRecipes();
|
||||
final AERecipeLoader ldr = new AERecipeLoader();
|
||||
ldr.loadProcessingRecipes();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
@@ -423,6 +369,11 @@ final class Registration
|
||||
Upgrades.CAPACITY.registerItem( parts.importBus(), 2 );
|
||||
Upgrades.SPEED.registerItem( parts.importBus(), 4 );
|
||||
|
||||
// Fluid Import Bus
|
||||
Upgrades.CAPACITY.registerItem( parts.fluidImportBus(), 2 );
|
||||
Upgrades.REDSTONE.registerItem( parts.fluidImportBus(), 1 );
|
||||
Upgrades.SPEED.registerItem( parts.fluidImportBus(), 4 );
|
||||
|
||||
// Export Bus
|
||||
Upgrades.FUZZY.registerItem( parts.exportBus(), 1 );
|
||||
Upgrades.REDSTONE.registerItem( parts.exportBus(), 1 );
|
||||
@@ -430,6 +381,11 @@ final class Registration
|
||||
Upgrades.SPEED.registerItem( parts.exportBus(), 4 );
|
||||
Upgrades.CRAFTING.registerItem( parts.exportBus(), 1 );
|
||||
|
||||
// Fluid Export Bus
|
||||
Upgrades.CAPACITY.registerItem( parts.fluidExportBus(), 2 );
|
||||
Upgrades.REDSTONE.registerItem( parts.fluidExportBus(), 1 );
|
||||
Upgrades.SPEED.registerItem( parts.fluidExportBus(), 4 );
|
||||
|
||||
// Storage Cells
|
||||
Upgrades.FUZZY.registerItem( items.cell1k(), 1 );
|
||||
Upgrades.INVERTER.registerItem( items.cell1k(), 1 );
|
||||
@@ -454,6 +410,10 @@ final class Registration
|
||||
Upgrades.INVERTER.registerItem( parts.storageBus(), 1 );
|
||||
Upgrades.CAPACITY.registerItem( parts.storageBus(), 5 );
|
||||
|
||||
// Storage Bus Fluids
|
||||
Upgrades.INVERTER.registerItem( parts.fluidStorageBus(), 1 );
|
||||
Upgrades.CAPACITY.registerItem( parts.fluidStorageBus(), 5 );
|
||||
|
||||
// Formation Plane
|
||||
Upgrades.FUZZY.registerItem( parts.formationPlane(), 1 );
|
||||
Upgrades.INVERTER.registerItem( parts.formationPlane(), 1 );
|
||||
@@ -556,11 +516,6 @@ final class Registration
|
||||
{
|
||||
registries.worldgen().enableWorldGenForDimension( WorldGenType.METEORITES, dimension );
|
||||
}
|
||||
|
||||
/*
|
||||
* initial recipe bake, if ore dictionary changes after this it re-bakes.
|
||||
*/
|
||||
OreDictionaryHandler.INSTANCE.bakeRecipes();
|
||||
}
|
||||
|
||||
private static class ModelLoaderWrapper implements IModelRegistry
|
||||
|
||||
@@ -22,9 +22,9 @@ package appeng.core.api;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -75,7 +75,7 @@ public class ApiPart implements IPartHelper
|
||||
} );
|
||||
|
||||
private final Map<Class<?>, String> interfaces2Layer = new HashMap<>();
|
||||
private final List<String> desc = new LinkedList<>();
|
||||
private final List<String> desc = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Conceptually this method will build a new class hierarchy that is rooted at the given base class, and includes a
|
||||
|
||||
@@ -47,10 +47,10 @@ import appeng.api.storage.data.IAEItemStack;
|
||||
import appeng.api.storage.data.IAEStack;
|
||||
import appeng.api.storage.data.IItemList;
|
||||
import appeng.crafting.CraftingLink;
|
||||
import appeng.fluids.util.AEFluidStack;
|
||||
import appeng.fluids.util.FluidList;
|
||||
import appeng.util.Platform;
|
||||
import appeng.util.item.AEFluidStack;
|
||||
import appeng.util.item.AEItemStack;
|
||||
import appeng.util.item.FluidList;
|
||||
import appeng.util.item.ItemList;
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@ public class ApiStorage implements IStorageHelper
|
||||
@Override
|
||||
public int transferFactor()
|
||||
{
|
||||
return 1000;
|
||||
return 125;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -126,6 +126,8 @@ import appeng.decorative.solid.BlockQuartzPillar;
|
||||
import appeng.decorative.solid.BlockSkyStone;
|
||||
import appeng.decorative.solid.BlockSkyStone.SkystoneType;
|
||||
import appeng.decorative.stair.BlockStairCommon;
|
||||
import appeng.fluids.block.BlockFluidInterface;
|
||||
import appeng.fluids.tile.TileFluidInterface;
|
||||
import appeng.hooks.DispenserBehaviorTinyTNT;
|
||||
import appeng.tile.crafting.TileCraftingMonitorTile;
|
||||
import appeng.tile.crafting.TileCraftingStorageTile;
|
||||
@@ -197,6 +199,7 @@ public final class ApiBlocks implements IBlocks
|
||||
private final ITileDefinition drive;
|
||||
private final ITileDefinition chest;
|
||||
private final ITileDefinition iface;
|
||||
private final ITileDefinition fluidIface;
|
||||
private final ITileDefinition cellWorkbench;
|
||||
private final ITileDefinition iOPort;
|
||||
private final ITileDefinition condenser;
|
||||
@@ -250,7 +253,11 @@ public final class ApiBlocks implements IBlocks
|
||||
this.quartzOreCharged = registry.block( "charged_quartz_ore", BlockChargedQuartzOre::new )
|
||||
.features( AEFeature.CERTUS_ORE, AEFeature.CHARGED_CERTUS_ORE )
|
||||
.useCustomItemModel()
|
||||
.bootstrap( ( block, item ) -> (IOreDictComponent) side -> OreDictionary.registerOre( "oreCertusQuartz", new ItemStack( block ) ) )
|
||||
.bootstrap( ( block, item ) -> (IOreDictComponent) side ->
|
||||
{
|
||||
OreDictionary.registerOre( "oreCertusQuartz", new ItemStack( block ) );
|
||||
OreDictionary.registerOre( "oreChargedCertusQuartz", new ItemStack( block ) );
|
||||
} )
|
||||
.build();
|
||||
this.matrixFrame = registry.block( "matrix_frame", BlockMatrixFrame::new ).features( AEFeature.SPATIAL_IO ).build();
|
||||
|
||||
@@ -386,6 +393,10 @@ public final class ApiBlocks implements IBlocks
|
||||
.features( AEFeature.INTERFACE )
|
||||
.tileEntity( new TileEntityDefinition( TileInterface.class ) )
|
||||
.build();
|
||||
this.fluidIface = registry.block( "fluid_interface", BlockFluidInterface::new )
|
||||
.features( AEFeature.FLUID_INTERFACE )
|
||||
.tileEntity( new TileEntityDefinition( TileFluidInterface.class ) )
|
||||
.build();
|
||||
this.cellWorkbench = registry.block( "cell_workbench", BlockCellWorkbench::new )
|
||||
.features( AEFeature.STORAGE_CELLS )
|
||||
.tileEntity( new TileEntityDefinition( TileCellWorkbench.class ) )
|
||||
@@ -889,6 +900,12 @@ public final class ApiBlocks implements IBlocks
|
||||
return this.iface;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITileDefinition fluidIface()
|
||||
{
|
||||
return this.fluidIface;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ITileDefinition cellWorkbench()
|
||||
{
|
||||
|
||||
@@ -30,6 +30,9 @@ import appeng.debug.ToolDebugCard;
|
||||
import appeng.debug.ToolEraser;
|
||||
import appeng.debug.ToolMeteoritePlacer;
|
||||
import appeng.debug.ToolReplicatorCard;
|
||||
import appeng.fluids.items.BasicFluidStorageCell;
|
||||
import appeng.fluids.items.FluidDummyItem;
|
||||
import appeng.fluids.items.FluidDummyItemRendering;
|
||||
import appeng.hooks.DispenserBlockTool;
|
||||
import appeng.hooks.DispenserMatterCannon;
|
||||
import appeng.items.materials.MaterialType;
|
||||
@@ -40,7 +43,7 @@ import appeng.items.misc.ItemPaintBall;
|
||||
import appeng.items.misc.ItemPaintBallRendering;
|
||||
import appeng.items.parts.FacadeRendering;
|
||||
import appeng.items.parts.ItemFacade;
|
||||
import appeng.items.storage.ItemBasicStorageCell;
|
||||
import appeng.items.storage.BasicItemStorageCell;
|
||||
import appeng.items.storage.ItemCreativeStorageCell;
|
||||
import appeng.items.storage.ItemSpatialStorageCell;
|
||||
import appeng.items.storage.ItemViewCell;
|
||||
@@ -102,6 +105,11 @@ public final class ApiItems implements IItems
|
||||
private final IItemDefinition cell16k;
|
||||
private final IItemDefinition cell64k;
|
||||
|
||||
private final IItemDefinition fluidCell1k;
|
||||
private final IItemDefinition fluidCell4k;
|
||||
private final IItemDefinition fluidCell16k;
|
||||
private final IItemDefinition fluidCell64k;
|
||||
|
||||
private final IItemDefinition spatialCell2;
|
||||
private final IItemDefinition spatialCell16;
|
||||
private final IItemDefinition spatialCell128;
|
||||
@@ -123,6 +131,8 @@ public final class ApiItems implements IItems
|
||||
private final IItemDefinition toolDebugCard;
|
||||
private final IItemDefinition toolReplicatorCard;
|
||||
|
||||
private final IItemDefinition dummyFluidItem;
|
||||
|
||||
public ApiItems( FeatureFactory registry )
|
||||
{
|
||||
FeatureFactory certusTools = registry.features( AEFeature.CERTUS_QUARTZ_TOOLS );
|
||||
@@ -198,10 +208,15 @@ public final class ApiItems implements IItems
|
||||
this.viewCell = registry.item( "view_cell", ItemViewCell::new ).features( AEFeature.VIEW_CELL ).build();
|
||||
|
||||
FeatureFactory storageCells = registry.features( AEFeature.STORAGE_CELLS );
|
||||
this.cell1k = storageCells.item( "storage_cell_1k", () -> new ItemBasicStorageCell( MaterialType.CELL1K_PART, 1 ) ).build();
|
||||
this.cell4k = storageCells.item( "storage_cell_4k", () -> new ItemBasicStorageCell( MaterialType.CELL4K_PART, 4 ) ).build();
|
||||
this.cell16k = storageCells.item( "storage_cell_16k", () -> new ItemBasicStorageCell( MaterialType.CELL16K_PART, 16 ) ).build();
|
||||
this.cell64k = storageCells.item( "storage_cell_64k", () -> new ItemBasicStorageCell( MaterialType.CELL64K_PART, 64 ) ).build();
|
||||
this.cell1k = storageCells.item( "storage_cell_1k", () -> new BasicItemStorageCell( MaterialType.CELL1K_PART, 1 ) ).build();
|
||||
this.cell4k = storageCells.item( "storage_cell_4k", () -> new BasicItemStorageCell( MaterialType.CELL4K_PART, 4 ) ).build();
|
||||
this.cell16k = storageCells.item( "storage_cell_16k", () -> new BasicItemStorageCell( MaterialType.CELL16K_PART, 16 ) ).build();
|
||||
this.cell64k = storageCells.item( "storage_cell_64k", () -> new BasicItemStorageCell( MaterialType.CELL64K_PART, 64 ) ).build();
|
||||
|
||||
this.fluidCell1k = storageCells.item( "fluid_storage_cell_1k", () -> new BasicFluidStorageCell( MaterialType.FLUID_CELL1K_PART, 1 ) ).build();
|
||||
this.fluidCell4k = storageCells.item( "fluid_storage_cell_4k", () -> new BasicFluidStorageCell( MaterialType.FLUID_CELL4K_PART, 4 ) ).build();
|
||||
this.fluidCell16k = storageCells.item( "fluid_storage_cell_16k", () -> new BasicFluidStorageCell( MaterialType.FLUID_CELL16K_PART, 16 ) ).build();
|
||||
this.fluidCell64k = storageCells.item( "fluid_storage_cell_64k", () -> new BasicFluidStorageCell( MaterialType.FLUID_CELL64K_PART, 64 ) ).build();
|
||||
|
||||
FeatureFactory spatialCells = registry.features( AEFeature.SPATIAL_IO );
|
||||
this.spatialCell2 = spatialCells.item( "spatial_storage_cell_2_cubed", () -> new ItemSpatialStorageCell( 2 ) ).build();
|
||||
@@ -236,6 +251,8 @@ public final class ApiItems implements IItems
|
||||
this.toolMeteoritePlacer = debugTools.item( "debug_meteorite_placer", ToolMeteoritePlacer::new ).build();
|
||||
this.toolDebugCard = debugTools.item( "debug_card", ToolDebugCard::new ).build();
|
||||
this.toolReplicatorCard = debugTools.item( "debug_replicator_card", ToolReplicatorCard::new ).build();
|
||||
|
||||
this.dummyFluidItem = registry.item( "dummy_fluid_item", FluidDummyItem::new ).rendering( new FluidDummyItemRendering() ).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -406,6 +423,30 @@ public final class ApiItems implements IItems
|
||||
return this.cell64k;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidCell1k()
|
||||
{
|
||||
return this.fluidCell1k;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidCell4k()
|
||||
{
|
||||
return this.fluidCell4k;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidCell16k()
|
||||
{
|
||||
return this.fluidCell16k;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidCell64k()
|
||||
{
|
||||
return this.fluidCell64k;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition spatialCell2()
|
||||
{
|
||||
@@ -484,4 +525,9 @@ public final class ApiItems implements IItems
|
||||
{
|
||||
return this.toolReplicatorCard;
|
||||
}
|
||||
|
||||
public IItemDefinition dummyFluidItem()
|
||||
{
|
||||
return this.dummyFluidItem;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,6 +111,11 @@ public final class ApiMaterials implements IMaterials
|
||||
private final IItemDefinition qESingularity;
|
||||
private final IItemDefinition blankPattern;
|
||||
|
||||
private final IItemDefinition fluidCell1kPart;
|
||||
private final IItemDefinition fluidCell4kPart;
|
||||
private final IItemDefinition fluidCell16kPart;
|
||||
private final IItemDefinition fluidCell64kPart;
|
||||
|
||||
public ApiMaterials( FeatureFactory registry )
|
||||
{
|
||||
final ItemMaterial materials = new ItemMaterial();
|
||||
@@ -210,6 +215,11 @@ public final class ApiMaterials implements IMaterials
|
||||
this.qESingularity = new DamagedItemDefinition( "material.singularity.entangled.quantum", materials
|
||||
.createMaterial( MaterialType.QUANTUM_ENTANGLED_SINGULARITY ) );
|
||||
this.blankPattern = new DamagedItemDefinition( "material.pattern.blank", materials.createMaterial( MaterialType.BLANK_PATTERN ) );
|
||||
|
||||
this.fluidCell1kPart = new DamagedItemDefinition( "material.cell.storage.1k", materials.createMaterial( MaterialType.FLUID_CELL1K_PART ) );
|
||||
this.fluidCell4kPart = new DamagedItemDefinition( "material.cell.storage.4k", materials.createMaterial( MaterialType.FLUID_CELL4K_PART ) );
|
||||
this.fluidCell16kPart = new DamagedItemDefinition( "material.cell.storage.16k", materials.createMaterial( MaterialType.FLUID_CELL16K_PART ) );
|
||||
this.fluidCell64kPart = new DamagedItemDefinition( "material.cell.storage.64k", materials.createMaterial( MaterialType.FLUID_CELL64K_PART ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -529,4 +539,28 @@ public final class ApiMaterials implements IMaterials
|
||||
{
|
||||
return this.blankPattern;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidCell1kPart()
|
||||
{
|
||||
return this.fluidCell1kPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidCell4kPart()
|
||||
{
|
||||
return this.fluidCell4kPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidCell16kPart()
|
||||
{
|
||||
return this.fluidCell16kPart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidCell64kPart()
|
||||
{
|
||||
return this.fluidCell64kPart;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,10 +55,14 @@ public final class ApiParts implements IParts
|
||||
private final IItemDefinition importBus;
|
||||
private final IItemDefinition exportBus;
|
||||
private final IItemDefinition iface;
|
||||
private final IItemDefinition fluidIface;
|
||||
private final IItemDefinition levelEmitter;
|
||||
private final IItemDefinition fluidLevelEmitter;
|
||||
private final IItemDefinition annihilationPlane;
|
||||
private final IItemDefinition identityAnnihilationPlane;
|
||||
private final IItemDefinition fluidAnnihilationPlane;
|
||||
private final IItemDefinition formationPlane;
|
||||
private final IItemDefinition fluidFormationPlane;
|
||||
private final IItemDefinition p2PTunnelME;
|
||||
private final IItemDefinition p2PTunnelRedstone;
|
||||
private final IItemDefinition p2PTunnelItems;
|
||||
@@ -77,6 +81,10 @@ public final class ApiParts implements IParts
|
||||
private final IItemDefinition terminal;
|
||||
private final IItemDefinition storageMonitor;
|
||||
private final IItemDefinition conversionMonitor;
|
||||
private final IItemDefinition fluidImportBus;
|
||||
private final IItemDefinition fluidExportBus;
|
||||
private final IItemDefinition fluidTerminal;
|
||||
private final IItemDefinition fluidStorageBus;
|
||||
|
||||
public ApiParts( FeatureFactory registry, PartModels partModels )
|
||||
{
|
||||
@@ -107,11 +115,15 @@ public final class ApiParts implements IParts
|
||||
this.importBus = new DamagedItemDefinition( "part.bus.import", itemPart.createPart( PartType.IMPORT_BUS ) );
|
||||
this.exportBus = new DamagedItemDefinition( "part.bus.export", itemPart.createPart( PartType.EXPORT_BUS ) );
|
||||
this.iface = new DamagedItemDefinition( "part.interface", itemPart.createPart( PartType.INTERFACE ) );
|
||||
this.fluidIface = new DamagedItemDefinition( "part.fluid_interface", itemPart.createPart( PartType.FLUID_INTERFACE ) );
|
||||
this.levelEmitter = new DamagedItemDefinition( "part.level_emitter", itemPart.createPart( PartType.LEVEL_EMITTER ) );
|
||||
this.fluidLevelEmitter = new DamagedItemDefinition( "part.fluid_level_emitter", itemPart.createPart( PartType.FLUID_LEVEL_EMITTER ) );
|
||||
this.annihilationPlane = new DamagedItemDefinition( "part.plane.annihilation", itemPart.createPart( PartType.ANNIHILATION_PLANE ) );
|
||||
this.identityAnnihilationPlane = new DamagedItemDefinition( "part.plane.annihiliation.identity", itemPart
|
||||
.createPart( PartType.IDENTITY_ANNIHILATION_PLANE ) );
|
||||
this.fluidAnnihilationPlane = new DamagedItemDefinition( "part.plane.fluid_annihilation", itemPart.createPart( PartType.FLUID_ANNIHILATION_PLANE ) );
|
||||
this.formationPlane = new DamagedItemDefinition( "part.plane.formation", itemPart.createPart( PartType.FORMATION_PLANE ) );
|
||||
this.fluidFormationPlane = new DamagedItemDefinition( "part.plane.fluid_formation", itemPart.createPart( PartType.FLUID_FORMATION_PLANE ) );
|
||||
this.p2PTunnelME = new DamagedItemDefinition( "part.tunnel.me", itemPart.createPart( PartType.P2P_TUNNEL_ME ) );
|
||||
this.p2PTunnelRedstone = new DamagedItemDefinition( "part.tunnel.redstone", itemPart.createPart( PartType.P2P_TUNNEL_REDSTONE ) );
|
||||
this.p2PTunnelItems = new DamagedItemDefinition( "part.tunnel.item", itemPart.createPart( PartType.P2P_TUNNEL_ITEMS ) );
|
||||
@@ -131,6 +143,10 @@ public final class ApiParts implements IParts
|
||||
this.terminal = new DamagedItemDefinition( "part.terminal", itemPart.createPart( PartType.TERMINAL ) );
|
||||
this.storageMonitor = new DamagedItemDefinition( "part.monitor.storage", itemPart.createPart( PartType.STORAGE_MONITOR ) );
|
||||
this.conversionMonitor = new DamagedItemDefinition( "part.monitor.conversion", itemPart.createPart( PartType.CONVERSION_MONITOR ) );
|
||||
this.fluidImportBus = new DamagedItemDefinition( "part.bus.import.fluid", itemPart.createPart( PartType.FLUID_IMPORT_BUS ) );
|
||||
this.fluidExportBus = new DamagedItemDefinition( "part.bus.export.fluid", itemPart.createPart( PartType.FLUID_EXPORT_BUS ) );
|
||||
this.fluidTerminal = new DamagedItemDefinition( "part.terminal.fluid", itemPart.createPart( PartType.FLUID_TERMINAL ) );
|
||||
this.fluidStorageBus = new DamagedItemDefinition( "part.bus.storage.fluid", itemPart.createPart( PartType.FLUID_STORAGE_BUS ) );
|
||||
}
|
||||
|
||||
private static AEColoredItemDefinition constructColoredDefinition( final ItemPart target, final PartType type )
|
||||
@@ -247,6 +263,12 @@ public final class ApiParts implements IParts
|
||||
return this.iface;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidIface()
|
||||
{
|
||||
return this.fluidIface;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition levelEmitter()
|
||||
{
|
||||
@@ -380,4 +402,46 @@ public final class ApiParts implements IParts
|
||||
{
|
||||
return this.conversionMonitor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidTerminal()
|
||||
{
|
||||
return this.fluidTerminal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidImportBus()
|
||||
{
|
||||
return this.fluidImportBus;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidExportBus()
|
||||
{
|
||||
return this.fluidExportBus;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidStorageBus()
|
||||
{
|
||||
return this.fluidStorageBus;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidLevelEmitter()
|
||||
{
|
||||
return this.fluidLevelEmitter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidAnnihilationPlane()
|
||||
{
|
||||
return this.fluidAnnihilationPlane;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemDefinition fluidFormationnPlane()
|
||||
{
|
||||
return this.fluidFormationPlane;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
|
||||
* Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
@@ -75,17 +75,25 @@ public enum AEFeature
|
||||
CHANNELS( "Channels", Constants.CATEGORY_NETWORK_FEATURES ),
|
||||
|
||||
INTERFACE( "Interface", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
FLUID_INTERFACE( "FluidInterface", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
LEVEL_EMITTER( "LevelEmitter", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
FLUID_LEVEL_EMITTER( "FluidLevelEmitter", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
FLUID_TERMINAL( "FluidTerminal", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
CRAFTING_TERMINAL( "CraftingTerminal", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
TERMINAL( "Terminal", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
STORAGE_MONITOR( "StorageMonitor", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
P2P_TUNNEL( "P2PTunnel", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
FORMATION_PLANE( "FormationPlane", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
FLUID_FORMATION_PLANE( "FluidFormationPlane", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
ANNIHILATION_PLANE( "AnnihilationPlane", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
IDENTITY_ANNIHILATION_PLANE( "IdentityAnnihilationPlane", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
FLUID_ANNIHILATION_PLANE( "FluidAnnihilationPlane", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
IMPORT_BUS( "ImportBus", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
FLUID_IMPORT_BUS( "FluidImportBus", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
EXPORT_BUS( "ExportBus", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
FLUID_EXPORT_BUS( "FluidExportBus", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
STORAGE_BUS( "StorageBus", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
FLUID_STORAGE_BUS( "FluidStorageBus", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
PART_CONVERSION_MONITOR( "PartConversionMonitor", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
TOGGLE_BUS( "ToggleBus", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
PANELS( "Panels", Constants.CATEGORY_NETWORK_BUSES ),
|
||||
|
||||
@@ -19,9 +19,10 @@
|
||||
package appeng.core.features.registries;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
@@ -39,8 +40,8 @@ public class MovableTileRegistry implements IMovableRegistry
|
||||
private final HashSet<Block> blacklisted = new HashSet<>();
|
||||
|
||||
private final HashMap<Class<? extends TileEntity>, IMovableHandler> Valid = new HashMap<>();
|
||||
private final LinkedList<Class<? extends TileEntity>> test = new LinkedList<>();
|
||||
private final LinkedList<IMovableHandler> handlers = new LinkedList<>();
|
||||
private final List<Class<? extends TileEntity>> test = new ArrayList<>();
|
||||
private final List<IMovableHandler> handlers = new ArrayList<>();
|
||||
private final DefaultSpatialHandler dsh = new DefaultSpatialHandler();
|
||||
|
||||
private final IMovableHandler nullHandler = new DefaultSpatialHandler();
|
||||
|
||||
@@ -19,9 +19,9 @@
|
||||
package appeng.core.features.registries;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -44,7 +44,7 @@ import appeng.recipes.RecipeHandler;
|
||||
public class RecipeHandlerRegistry implements IRecipeHandlerRegistry
|
||||
{
|
||||
private final Map<String, Class<? extends ICraftHandler>> handlers = new HashMap<>( 20 );
|
||||
private final Collection<ISubItemResolver> resolvers = new LinkedList<>();
|
||||
private final Collection<ISubItemResolver> resolvers = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public void addNewCraftHandler( final String name, final Class<? extends ICraftHandler> handler )
|
||||
|
||||
+12
-8
@@ -36,18 +36,18 @@ import appeng.api.storage.channels.IItemStorageChannel;
|
||||
import appeng.api.storage.data.IAEStack;
|
||||
import appeng.api.util.AEPartLocation;
|
||||
import appeng.core.sync.GuiBridge;
|
||||
import appeng.me.storage.CellInventory;
|
||||
import appeng.me.storage.CellInventoryHandler;
|
||||
import appeng.me.storage.ItemCellInventory;
|
||||
import appeng.me.storage.ItemCellInventoryHandler;
|
||||
import appeng.util.Platform;
|
||||
|
||||
|
||||
public class BasicCellHandler implements ICellHandler
|
||||
public class BasicItemCellHandler implements ICellHandler
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean isCell( final ItemStack is )
|
||||
{
|
||||
return CellInventory.isCell( is );
|
||||
return ItemCellInventory.isCell( is );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -55,23 +55,27 @@ public class BasicCellHandler implements ICellHandler
|
||||
{
|
||||
if( channel == AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) )
|
||||
{
|
||||
return CellInventory.getCell( is, container );
|
||||
return ItemCellInventory.getCell( is, container );
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openChestGui( final EntityPlayer player, final IChestOrDrive chest, final ICellHandler cellHandler, final IMEInventoryHandler inv, final ItemStack is, final IStorageChannel chan )
|
||||
{
|
||||
Platform.openGUI( player, (TileEntity) chest, AEPartLocation.fromFacing( chest.getUp() ), GuiBridge.GUI_ME );
|
||||
if( chan == AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) )
|
||||
{
|
||||
Platform.openGUI( player, (TileEntity) chest, AEPartLocation.fromFacing( chest.getUp() ), GuiBridge.GUI_ME );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getStatusForCell( final ItemStack is, final IMEInventory handler )
|
||||
{
|
||||
if( handler instanceof CellInventoryHandler )
|
||||
if( handler instanceof ItemCellInventoryHandler )
|
||||
{
|
||||
final CellInventoryHandler ci = (CellInventoryHandler) handler;
|
||||
final ItemCellInventoryHandler ci = (ItemCellInventoryHandler) handler;
|
||||
return ci.getStatusForCell();
|
||||
}
|
||||
return 0;
|
||||
@@ -22,6 +22,9 @@ package appeng.core.features.registries.cell;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.base.Verify;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import appeng.api.storage.ICellHandler;
|
||||
@@ -43,12 +46,15 @@ public class CellRegistry implements ICellRegistry
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCellHandler( final ICellHandler h )
|
||||
public void addCellHandler( final ICellHandler handler )
|
||||
{
|
||||
if( h != null )
|
||||
{
|
||||
this.handlers.add( h );
|
||||
}
|
||||
Preconditions.checkNotNull( handler, "Called before FMLInitializationEvent." );
|
||||
Preconditions.checkArgument( !this.handlers.contains( handler ), "Tried to register the same handler instance twice." );
|
||||
|
||||
this.handlers.add( handler );
|
||||
|
||||
// Verify that the first entry is always our own handler.
|
||||
Verify.verify( this.handlers.get( 0 ) instanceof BasicItemCellHandler );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -38,7 +38,7 @@ import appeng.me.storage.CreativeCellInventory;
|
||||
import appeng.util.Platform;
|
||||
|
||||
|
||||
public class CreativeCellHandler implements ICellHandler
|
||||
public final class CreativeCellHandler implements ICellHandler
|
||||
{
|
||||
|
||||
@Override
|
||||
|
||||
@@ -129,6 +129,9 @@ public enum ButtonToolTips
|
||||
ReportInaccessibleItems,
|
||||
ReportInaccessibleItemsYes,
|
||||
ReportInaccessibleItemsNo,
|
||||
ReportInaccessibleFluids,
|
||||
ReportInaccessibleFluidsYes,
|
||||
ReportInaccessibleFluidsNo,
|
||||
|
||||
BlockPlacement,
|
||||
BlockPlacementYes,
|
||||
|
||||
@@ -37,19 +37,25 @@ public enum GuiText
|
||||
VibrationChamber,
|
||||
SpatialIOPort,
|
||||
LevelEmitter,
|
||||
FluidLevelEmitter,
|
||||
Terminal,
|
||||
|
||||
Interface,
|
||||
FluidInterface,
|
||||
Config,
|
||||
StoredItems,
|
||||
StoredFluids,
|
||||
Patterns,
|
||||
ImportBus,
|
||||
ImportBusFluids,
|
||||
ExportBus,
|
||||
ExportBusFluids,
|
||||
|
||||
CellWorkbench,
|
||||
NetworkDetails,
|
||||
StorageCells,
|
||||
IOBuses,
|
||||
IOBusesFluids,
|
||||
|
||||
IOPort,
|
||||
BytesUsed,
|
||||
@@ -64,6 +70,7 @@ public enum GuiText
|
||||
EnergyDrain,
|
||||
|
||||
StorageBus,
|
||||
StorageBusFluids,
|
||||
Priority,
|
||||
Security,
|
||||
Encoded,
|
||||
@@ -78,6 +85,7 @@ public enum GuiText
|
||||
|
||||
CraftingTerminal,
|
||||
FormationPlane,
|
||||
FluidFormationPlane,
|
||||
Inscriber,
|
||||
QuartzCuttingKnife,
|
||||
|
||||
|
||||
@@ -29,8 +29,12 @@ public enum TickRates
|
||||
|
||||
ImportBus( 5, 40 ),
|
||||
|
||||
FluidImportBus( 5, 40 ),
|
||||
|
||||
ExportBus( 5, 60 ),
|
||||
|
||||
FluidExportBus( 5, 60 ),
|
||||
|
||||
AnnihilationPlane( 2, 120 ),
|
||||
|
||||
METunnel( 5, 20 ),
|
||||
@@ -45,6 +49,8 @@ public enum TickRates
|
||||
|
||||
StorageBus( 5, 60 ),
|
||||
|
||||
FluidStorageBus( 5, 60 ),
|
||||
|
||||
ItemTunnel( 5, 60 ),
|
||||
|
||||
LightTunnel( 5, 60 ),
|
||||
|
||||
@@ -39,8 +39,6 @@ import appeng.core.sync.network.NetworkHandler;
|
||||
|
||||
public abstract class AppEngPacket implements Packet
|
||||
{
|
||||
|
||||
private AppEngPacketHandlerBase.PacketTypes id;
|
||||
private PacketBuffer p;
|
||||
private PacketCallState caller;
|
||||
|
||||
|
||||
@@ -33,9 +33,11 @@ import appeng.core.sync.packets.PacketCompassResponse;
|
||||
import appeng.core.sync.packets.PacketCompressedNBT;
|
||||
import appeng.core.sync.packets.PacketConfigButton;
|
||||
import appeng.core.sync.packets.PacketCraftRequest;
|
||||
import appeng.core.sync.packets.PacketFluidSlot;
|
||||
import appeng.core.sync.packets.PacketInventoryAction;
|
||||
import appeng.core.sync.packets.PacketJEIRecipe;
|
||||
import appeng.core.sync.packets.PacketLightning;
|
||||
import appeng.core.sync.packets.PacketMEFluidInventoryUpdate;
|
||||
import appeng.core.sync.packets.PacketMEInventoryUpdate;
|
||||
import appeng.core.sync.packets.PacketMatterCannon;
|
||||
import appeng.core.sync.packets.PacketMockExplosion;
|
||||
@@ -45,6 +47,7 @@ import appeng.core.sync.packets.PacketPatternSlot;
|
||||
import appeng.core.sync.packets.PacketProgressBar;
|
||||
import appeng.core.sync.packets.PacketSwapSlots;
|
||||
import appeng.core.sync.packets.PacketSwitchGuis;
|
||||
import appeng.core.sync.packets.PacketTargetFluidStack;
|
||||
import appeng.core.sync.packets.PacketTargetItemStack;
|
||||
import appeng.core.sync.packets.PacketTransitionEffect;
|
||||
import appeng.core.sync.packets.PacketValueConfig;
|
||||
@@ -64,6 +67,8 @@ public class AppEngPacketHandlerBase
|
||||
|
||||
PACKET_ME_INVENTORY_UPDATE( PacketMEInventoryUpdate.class ),
|
||||
|
||||
PACKET_ME_FLUID_INVENTORY_UPDATE( PacketMEFluidInventoryUpdate.class ),
|
||||
|
||||
PACKET_CONFIG_BUTTON( PacketConfigButton.class ),
|
||||
|
||||
PACKET_PART_PLACEMENT( PacketPartPlacement.class ),
|
||||
@@ -92,13 +97,17 @@ public class AppEngPacketHandlerBase
|
||||
|
||||
PACKET_TARGET_ITEM( PacketTargetItemStack.class ),
|
||||
|
||||
PACKET_TARGET_FLUID( PacketTargetFluidStack.class ),
|
||||
|
||||
PACKET_CRAFTING_REQUEST( PacketCraftRequest.class ),
|
||||
|
||||
PACKET_ASSEMBLER_ANIMATION( PacketAssemblerAnimation.class ),
|
||||
|
||||
PACKET_COMPRESSED_NBT( PacketCompressedNBT.class ),
|
||||
|
||||
PACKET_PAINTED_ENTITY( PacketPaintedEntity.class );
|
||||
PACKET_PAINTED_ENTITY( PacketPaintedEntity.class ),
|
||||
|
||||
PACKET_FLUID_TANK( PacketFluidSlot.class );
|
||||
|
||||
private final Class<? extends AppEngPacket> packetClass;
|
||||
private final Constructor<? extends AppEngPacket> packetConstructor;
|
||||
|
||||
@@ -86,6 +86,17 @@ import appeng.container.implementations.ContainerUpgradeable;
|
||||
import appeng.container.implementations.ContainerVibrationChamber;
|
||||
import appeng.container.implementations.ContainerWireless;
|
||||
import appeng.container.implementations.ContainerWirelessTerm;
|
||||
import appeng.fluids.container.ContainerFluidFormationPlane;
|
||||
import appeng.fluids.container.ContainerFluidIO;
|
||||
import appeng.fluids.container.ContainerFluidInterface;
|
||||
import appeng.fluids.container.ContainerFluidLevelEmitter;
|
||||
import appeng.fluids.container.ContainerFluidStorageBus;
|
||||
import appeng.fluids.container.ContainerFluidTerminal;
|
||||
import appeng.fluids.helper.IFluidInterfaceHost;
|
||||
import appeng.fluids.parts.PartFluidFormationPlane;
|
||||
import appeng.fluids.parts.PartFluidLevelEmitter;
|
||||
import appeng.fluids.parts.PartFluidStorageBus;
|
||||
import appeng.fluids.parts.PartSharedFluidBus;
|
||||
import appeng.helpers.IInterfaceHost;
|
||||
import appeng.helpers.IPriorityHost;
|
||||
import appeng.helpers.WirelessTerminalGuiObject;
|
||||
@@ -150,14 +161,22 @@ public enum GuiBridge implements IGuiHandler
|
||||
|
||||
GUI_INTERFACE( ContainerInterface.class, IInterfaceHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_FLUID_INTERFACE( ContainerFluidInterface.class, IFluidInterfaceHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_BUS( ContainerUpgradeable.class, IUpgradeableHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_BUS_FLUID( ContainerFluidIO.class, PartSharedFluidBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_IOPORT( ContainerIOPort.class, TileIOPort.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_STORAGEBUS( ContainerStorageBus.class, PartStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_STORAGEBUS_FLUID( ContainerFluidStorageBus.class, PartFluidStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_FORMATION_PLANE( ContainerFormationPlane.class, PartFormationPlane.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_FLUID_FORMATION_PLANE( ContainerFluidFormationPlane.class, PartFluidFormationPlane.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_PRIORITY( ContainerPriority.class, IPriorityHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_SECURITY( ContainerSecurityStation.class, TileSecurityStation.class, GuiHostType.WORLD, SecurityPermissions.SECURITY ),
|
||||
@@ -166,9 +185,13 @@ public enum GuiBridge implements IGuiHandler
|
||||
|
||||
GUI_PATTERN_TERMINAL( ContainerPatternTerm.class, PartPatternTerminal.class, GuiHostType.WORLD, SecurityPermissions.CRAFT ),
|
||||
|
||||
GUI_FLUID_TERMINAL( ContainerFluidTerminal.class, ITerminalHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
// extends (Container/Gui) + Bus
|
||||
GUI_LEVEL_EMITTER( ContainerLevelEmitter.class, PartLevelEmitter.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_FLUID_LEVEL_EMITTER( ContainerFluidLevelEmitter.class, PartFluidLevelEmitter.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_SPATIAL_IO_PORT( ContainerSpatialIOPort.class, TileSpatialIOPort.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_INSCRIBER( ContainerInscriber.class, TileInscriber.class, GuiHostType.WORLD, null ),
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.core.sync.packets;
|
||||
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraftforge.fml.common.network.ByteBufUtils;
|
||||
|
||||
import appeng.api.storage.data.IAEFluidStack;
|
||||
import appeng.core.sync.AppEngPacket;
|
||||
import appeng.core.sync.network.INetworkInfo;
|
||||
import appeng.fluids.container.IFluidSyncContainer;
|
||||
import appeng.fluids.util.AEFluidStack;
|
||||
|
||||
|
||||
public class PacketFluidSlot extends AppEngPacket
|
||||
{
|
||||
private final Map<Integer, IAEFluidStack> list;
|
||||
|
||||
public PacketFluidSlot( final ByteBuf stream )
|
||||
{
|
||||
this.list = new HashMap<>();
|
||||
NBTTagCompound tag = ByteBufUtils.readTag( stream );
|
||||
|
||||
for( final String key : tag.getKeySet() )
|
||||
{
|
||||
this.list.put( Integer.parseInt( key ), AEFluidStack.fromNBT( tag.getCompoundTag( key ) ) );
|
||||
}
|
||||
}
|
||||
|
||||
// api
|
||||
public PacketFluidSlot( final Map<Integer, IAEFluidStack> list )
|
||||
{
|
||||
this.list = list;
|
||||
final NBTTagCompound sendTag = new NBTTagCompound();
|
||||
for( Map.Entry<Integer, IAEFluidStack> fs : list.entrySet() )
|
||||
{
|
||||
final NBTTagCompound tag = new NBTTagCompound();
|
||||
if( fs.getValue() != null )
|
||||
{
|
||||
fs.getValue().writeToNBT( tag );
|
||||
}
|
||||
sendTag.setTag( fs.getKey().toString(), tag );
|
||||
}
|
||||
|
||||
final ByteBuf data = Unpooled.buffer();
|
||||
data.writeInt( this.getPacketID() );
|
||||
ByteBufUtils.writeTag( data, sendTag );
|
||||
this.configureWrite( data );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clientPacketData( final INetworkInfo manager, final AppEngPacket packet, final EntityPlayer player )
|
||||
{
|
||||
final Container c = player.openContainer;
|
||||
if( c instanceof IFluidSyncContainer )
|
||||
{
|
||||
( (IFluidSyncContainer) c ).receiveFluidSlots( this.list );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serverPacketData( INetworkInfo manager, AppEngPacket packet, EntityPlayer player )
|
||||
{
|
||||
final Container c = player.openContainer;
|
||||
if( c instanceof IFluidSyncContainer )
|
||||
{
|
||||
( (IFluidSyncContainer) c ).receiveFluidSlots( this.list );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,207 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.core.sync.packets;
|
||||
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.BufferOverflowException;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraftforge.fml.common.network.internal.FMLProxyPacket;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
import appeng.api.storage.data.IAEFluidStack;
|
||||
import appeng.core.AELog;
|
||||
import appeng.core.sync.AppEngPacket;
|
||||
import appeng.core.sync.network.INetworkInfo;
|
||||
import appeng.fluids.client.gui.GuiFluidTerminal;
|
||||
import appeng.fluids.util.AEFluidStack;
|
||||
|
||||
|
||||
/**
|
||||
* @author BrockWS
|
||||
* @version rv6 - 22/05/2018
|
||||
* @since rv6 22/05/2018
|
||||
*/
|
||||
public class PacketMEFluidInventoryUpdate extends AppEngPacket
|
||||
{
|
||||
private static final int UNCOMPRESSED_PACKET_BYTE_LIMIT = 16 * 1024 * 1024;
|
||||
private static final int OPERATION_BYTE_LIMIT = 2 * 1024;
|
||||
private static final int TEMP_BUFFER_SIZE = 1024;
|
||||
private static final int STREAM_MASK = 0xff;
|
||||
|
||||
// input.
|
||||
@Nullable
|
||||
private final List<IAEFluidStack> list;
|
||||
// output...
|
||||
private final byte ref;
|
||||
|
||||
@Nullable
|
||||
private final ByteBuf data;
|
||||
@Nullable
|
||||
private final GZIPOutputStream compressFrame;
|
||||
|
||||
private int writtenBytes = 0;
|
||||
private boolean empty = true;
|
||||
|
||||
// automatic.
|
||||
public PacketMEFluidInventoryUpdate( final ByteBuf stream ) throws IOException
|
||||
{
|
||||
this.data = null;
|
||||
this.compressFrame = null;
|
||||
this.list = new LinkedList<>();
|
||||
this.ref = stream.readByte();
|
||||
|
||||
// int originalBytes = stream.readableBytes();
|
||||
|
||||
final GZIPInputStream gzReader = new GZIPInputStream( new InputStream()
|
||||
{
|
||||
@Override
|
||||
public int read() throws IOException
|
||||
{
|
||||
if( stream.readableBytes() <= 0 )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return stream.readByte() & STREAM_MASK;
|
||||
}
|
||||
} );
|
||||
|
||||
final ByteBuf uncompressed = Unpooled.buffer( stream.readableBytes() );
|
||||
final byte[] tmp = new byte[TEMP_BUFFER_SIZE];
|
||||
while( gzReader.available() != 0 )
|
||||
{
|
||||
final int bytes = gzReader.read( tmp );
|
||||
if( bytes > 0 )
|
||||
{
|
||||
uncompressed.writeBytes( tmp, 0, bytes );
|
||||
}
|
||||
}
|
||||
gzReader.close();
|
||||
|
||||
// int uncompressedBytes = uncompressed.readableBytes();
|
||||
// AELog.info( "Receiver: " + originalBytes + " -> " + uncompressedBytes );
|
||||
|
||||
while( uncompressed.readableBytes() > 0 )
|
||||
{
|
||||
this.list.add( AEFluidStack.fromPacket( uncompressed ) );
|
||||
}
|
||||
|
||||
this.empty = this.list.isEmpty();
|
||||
}
|
||||
|
||||
// api
|
||||
public PacketMEFluidInventoryUpdate() throws IOException
|
||||
{
|
||||
this( (byte) 0 );
|
||||
}
|
||||
|
||||
// api
|
||||
public PacketMEFluidInventoryUpdate( final byte ref ) throws IOException
|
||||
{
|
||||
this.ref = ref;
|
||||
this.data = Unpooled.buffer( OPERATION_BYTE_LIMIT );
|
||||
this.data.writeInt( this.getPacketID() );
|
||||
this.data.writeByte( this.ref );
|
||||
|
||||
this.compressFrame = new GZIPOutputStream( new OutputStream()
|
||||
{
|
||||
@Override
|
||||
public void write( final int value ) throws IOException
|
||||
{
|
||||
PacketMEFluidInventoryUpdate.this.data.writeByte( value );
|
||||
}
|
||||
} );
|
||||
|
||||
this.list = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly( Side.CLIENT )
|
||||
public void clientPacketData( final INetworkInfo network, final AppEngPacket packet, final EntityPlayer player )
|
||||
{
|
||||
final GuiScreen gs = Minecraft.getMinecraft().currentScreen;
|
||||
|
||||
if( gs instanceof GuiFluidTerminal )
|
||||
{
|
||||
( (GuiFluidTerminal) gs ).postUpdate( this.list );
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public FMLProxyPacket getProxy()
|
||||
{
|
||||
try
|
||||
{
|
||||
this.compressFrame.close();
|
||||
|
||||
this.configureWrite( this.data );
|
||||
return super.getProxy();
|
||||
}
|
||||
catch( final IOException e )
|
||||
{
|
||||
AELog.debug( e );
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void appendFluid( final IAEFluidStack fs ) throws IOException, BufferOverflowException
|
||||
{
|
||||
final ByteBuf tmp = Unpooled.buffer( OPERATION_BYTE_LIMIT );
|
||||
fs.writeToPacket( tmp );
|
||||
|
||||
this.compressFrame.flush();
|
||||
if( this.writtenBytes + tmp.readableBytes() > UNCOMPRESSED_PACKET_BYTE_LIMIT )
|
||||
{
|
||||
throw new BufferOverflowException();
|
||||
}
|
||||
else
|
||||
{
|
||||
this.writtenBytes += tmp.readableBytes();
|
||||
this.compressFrame.write( tmp.array(), 0, tmp.readableBytes() );
|
||||
this.empty = false;
|
||||
}
|
||||
}
|
||||
|
||||
public int getLength()
|
||||
{
|
||||
return this.data.readableBytes();
|
||||
}
|
||||
|
||||
public boolean isEmpty()
|
||||
{
|
||||
return this.empty;
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,7 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.BufferOverflowException;
|
||||
import java.util.LinkedList;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
@@ -77,7 +77,7 @@ public class PacketMEInventoryUpdate extends AppEngPacket
|
||||
{
|
||||
this.data = null;
|
||||
this.compressFrame = null;
|
||||
this.list = new LinkedList<>();
|
||||
this.list = new ArrayList<>();
|
||||
this.ref = stream.readByte();
|
||||
|
||||
// int originalBytes = stream.readableBytes();
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved.
|
||||
*
|
||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
||||
*/
|
||||
|
||||
package appeng.core.sync.packets;
|
||||
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
|
||||
import appeng.core.AELog;
|
||||
import appeng.core.sync.AppEngPacket;
|
||||
import appeng.core.sync.network.INetworkInfo;
|
||||
import appeng.fluids.container.ContainerFluidTerminal;
|
||||
import appeng.fluids.util.AEFluidStack;
|
||||
|
||||
|
||||
/**
|
||||
* @author BrockWS
|
||||
* @version rv6 - 23/05/2018
|
||||
* @since rv6 23/05/2018
|
||||
*/
|
||||
public class PacketTargetFluidStack extends AppEngPacket
|
||||
{
|
||||
private AEFluidStack stack;
|
||||
|
||||
// automatic.
|
||||
public PacketTargetFluidStack( final ByteBuf stream )
|
||||
{
|
||||
try
|
||||
{
|
||||
if( stream.readableBytes() > 0 )
|
||||
{
|
||||
this.stack = (AEFluidStack) AEFluidStack.fromPacket( stream );
|
||||
}
|
||||
else
|
||||
{
|
||||
this.stack = null;
|
||||
}
|
||||
}
|
||||
catch( Exception ex )
|
||||
{
|
||||
AELog.debug( ex );
|
||||
this.stack = null;
|
||||
}
|
||||
}
|
||||
|
||||
// api
|
||||
public PacketTargetFluidStack( AEFluidStack stack )
|
||||
{
|
||||
|
||||
this.stack = stack;
|
||||
|
||||
final ByteBuf data = Unpooled.buffer();
|
||||
data.writeInt( this.getPacketID() );
|
||||
if( stack != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
stack.writeToPacket( data );
|
||||
}
|
||||
catch( Exception ex )
|
||||
{
|
||||
AELog.debug( ex );
|
||||
}
|
||||
}
|
||||
this.configureWrite( data );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serverPacketData( final INetworkInfo manager, final AppEngPacket packet, final EntityPlayer player )
|
||||
{
|
||||
if( player.openContainer instanceof ContainerFluidTerminal )
|
||||
{
|
||||
( (ContainerFluidTerminal) player.openContainer ).setTargetStack( this.stack );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -53,6 +53,8 @@ import appeng.container.implementations.ContainerSecurityStation;
|
||||
import appeng.container.implementations.ContainerStorageBus;
|
||||
import appeng.core.sync.AppEngPacket;
|
||||
import appeng.core.sync.network.INetworkInfo;
|
||||
import appeng.fluids.container.ContainerFluidLevelEmitter;
|
||||
import appeng.fluids.container.ContainerFluidStorageBus;
|
||||
import appeng.helpers.IMouseWheelItem;
|
||||
|
||||
|
||||
@@ -159,6 +161,11 @@ public class PacketValueConfig extends AppEngPacket
|
||||
final ContainerLevelEmitter lvc = (ContainerLevelEmitter) c;
|
||||
lvc.setLevel( Long.parseLong( this.Value ), player );
|
||||
}
|
||||
else if( this.Name.equals( "FluidLevelEmitter.Value" ) && c instanceof ContainerFluidLevelEmitter )
|
||||
{
|
||||
final ContainerFluidLevelEmitter lvc = (ContainerFluidLevelEmitter) c;
|
||||
lvc.setLevel( Long.parseLong( this.Value ), player );
|
||||
}
|
||||
else if( this.Name.startsWith( "PatternTerminal." ) && c instanceof ContainerPatternTerm )
|
||||
{
|
||||
final ContainerPatternTerm cpt = (ContainerPatternTerm) c;
|
||||
@@ -179,18 +186,31 @@ public class PacketValueConfig extends AppEngPacket
|
||||
cpt.getPatternTerminal().setSubstitution( this.Value.equals( "1" ) );
|
||||
}
|
||||
}
|
||||
else if( this.Name.startsWith( "StorageBus." ) && c instanceof ContainerStorageBus )
|
||||
else if( this.Name.startsWith( "StorageBus." ) )
|
||||
{
|
||||
final ContainerStorageBus ccw = (ContainerStorageBus) c;
|
||||
if( this.Name.equals( "StorageBus.Action" ) )
|
||||
{
|
||||
if( this.Value.equals( "Partition" ) )
|
||||
{
|
||||
ccw.partition();
|
||||
if( c instanceof ContainerStorageBus )
|
||||
{
|
||||
( (ContainerStorageBus) c ).partition();
|
||||
}
|
||||
else if( c instanceof ContainerFluidStorageBus )
|
||||
{
|
||||
( (ContainerFluidStorageBus) c ).partition();
|
||||
}
|
||||
}
|
||||
else if( this.Value.equals( "Clear" ) )
|
||||
{
|
||||
ccw.clear();
|
||||
if( c instanceof ContainerStorageBus )
|
||||
{
|
||||
( (ContainerStorageBus) c ).clear();
|
||||
}
|
||||
else if( c instanceof ContainerFluidStorageBus )
|
||||
{
|
||||
( (ContainerFluidStorageBus) c ).clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,8 +23,8 @@ import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedList;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
@@ -101,7 +101,7 @@ final class SpawnData implements IWorldSpawnData
|
||||
@Override
|
||||
public Collection<NBTTagCompound> getNearByMeteorites( final int dim, final int chunkX, final int chunkZ )
|
||||
{
|
||||
final Collection<NBTTagCompound> ll = new LinkedList<>();
|
||||
final Collection<NBTTagCompound> ll = new ArrayList<>();
|
||||
|
||||
synchronized( SpawnData.class )
|
||||
{
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user