Compare commits

..

36 Commits

Author SHA1 Message Date
yueh bcba2329b7 Merge pull request #1902 from yueh/fix-1896
Fixes 1896: Only update a monitor if the text would change
2015-09-23 23:46:43 +02:00
yueh 597e17b52b Fixes 1896: Only update a monitor if the text would change 2015-09-23 22:28:50 +02:00
yueh 4b055a7f21 Merge pull request #1894 from yueh/update-readme
Updated README.md and CONTRIBIBUTING.md
2015-09-23 15:28:23 +02:00
yueh 759b6daa59 Merge pull request #1893 from yueh/fix-1892
Fixes incorrect handling of prioritized inventories
2015-09-23 15:28:13 +02:00
yueh e1f03db7b3 Updated README.md and CONTRIBIBUTING.md 2015-09-23 14:27:11 +02:00
yueh 72518ad977 Merge pull request #1772 from yueh/feature-1569
Feature 1569 Typesafe Integration Modules
2015-09-23 00:20:00 +02:00
yueh 21fa2718f8 Merge pull request #1879 from yueh/fix-1878
Fixes #1878: Now saves the dimensionlist correctly
2015-09-23 00:15:36 +02:00
yueh 777bec184a Fixes 1878: Now saves worlddata more reliable. 2015-09-23 00:12:53 +02:00
yueh b9d615c4ba Fixes incorrect handling of prioritized inventories
Prioritized inventories are not longer used twice for storing leftover
items and thus finally reporting twice the amount of storable items when
they are the only possible option to store something.

Also fixes import buses now respecting the amount of storable items inside
the network instead of trying to place the exported items back and failing
on any restricted inventory, potentially voiding the overflow.

Fixes #1892
2015-09-23 00:09:27 +02:00
yueh 40d339e173 Merge pull request #1888 from asd0210a/patch-3
zh_tw.lang Updated
2015-09-22 19:39:56 +02:00
asd0210a 20c1c4529a zh_tw.lang Updated 2015-09-21 10:15:20 +08:00
yueh 72399e5789 Merge pull request #1866 from yueh/fix-1865
Fixes #1865: Spawn overflow items into the world
2015-09-16 20:41:57 +02:00
yueh f303c17ae0 First iteration of making integrations typesafe 2015-09-16 15:59:33 +02:00
yueh 26f13d4109 Fixes #1865: Spawn overflow items into the world 2015-09-11 20:05:17 +02:00
yueh 0df445c6a8 Merge pull request #1862 from yueh/feature-interface-9-slots
Changed the interface to 9 slots to be consistent with every other machine
2015-09-11 20:04:29 +02:00
thatsIch 8c817b2f85 Merge pull request #1851 from thatsIch/b-1850-add-second-optional-to-grindstone
Fixes #1850: Fixed support for second optional output of the AE2 Grindstone
2015-09-10 19:15:29 +02:00
yueh 7bd8cf3f59 Changed the interface to 9 slots to be consistent with every other machine 2015-09-08 00:19:05 +02:00
yueh 3ab6758e6c Merge pull request #1839 from yueh/fix-1833
Fixed the order craftinglinks are notified for the last item.
2015-09-05 18:00:41 +02:00
yueh 3dd948e4a4 Merge pull request #1854 from yueh/feature-recipes-refactoring
Added a missing whitespace and removed duplicate ones.
2015-09-05 18:00:22 +02:00
thatsIch 3bb9e4df97 Merge pull request #1634 from thatsIch/b-1588-wrong-oredict-name
Fixes #1588: Charged Certus Quartz Ore was given a wrong name
2015-09-03 23:50:53 +02:00
thatsIch d17f045339 Merge pull request #1852 from Mazdallier/patch-1
Update fr_FR.lang
2015-09-02 17:03:16 +02:00
yueh 5817cde56b Added a missing whitespace and removed duplicate ones. 2015-09-02 16:51:37 +02:00
Mazdallier 45d94d4c2c Update fr_FR.lang 2015-09-02 10:00:16 +02:00
thatsIch d893e52eb0 Fixes #1850: Fixed support for second optional output of the AE2 Grindstone 2015-09-01 23:58:40 +02:00
thatsIch 464a56ffc5 Fixes #1588: Charged Certus Quartz Ore was given a wrong name 2015-08-31 16:54:29 +02:00
yueh 40dcf711f6 Fixed the order craftinglinks are notified for the last item.
Fixes #1833
2015-08-28 13:29:24 +02:00
yueh 5dfca5eb93 Merge pull request #1776 from yueh/feature-1283
Closes #1283: Add custom Callable to prevent memory leaks
2015-08-22 23:22:17 +02:00
yueh 26daaf2232 Merge pull request #1805 from yueh/feature-recipes-refactoring
Reorganizes the recipes in a more reasonable way.
2015-08-22 23:21:14 +02:00
yueh c2022a7208 Reorganizes the recipes in a more reasonable way.
The recipes are now structured into multipe subfolder and split into more
distinct files, so the names are more appropriate and are better at
hinting which items the actually contain.

It also extends the RecipeResourceCopier to now handle the folder
recursively and extract all subdirectories and their files.

"import=" is currently requiring a relative path to the root directory
of the recipes. This would require a larger rewrite/refactoring, thus it
is kept for now until a potentially later changer.

This reverts splitting the oredict entries into their own directory and
moves them back into the recipes folder, as it currently is causing a
couple of issues like not being able to resolve the aliases or is not
working indev. But to keep it seperate it is now its own recipe file.

Fixes #1791
Reverts #1635
2015-08-21 12:23:20 +02:00
yueh 74c2e1fab9 Merge pull request #1823 from yueh/fix-1810
Fixes #1810: Removes a CompassReader once the world is unloaded.
2015-08-20 23:05:58 +02:00
yueh 0de7a2d83a Closes #1283: Add custom Callable to prevent memory leaks 2015-08-20 21:04:06 +02:00
yueh 517a832ac1 Fixes #1810: Removes a CompassReader once the world is unloaded.
This should no longer keep a reference to a World around and potentially
keep them loaded.
Also added a finalize() to CompassRegion to ensure the file is closed on a
GC.

Some cleanup regarding member order, final, etc
2015-08-20 19:04:33 +02:00
yueh 1ecc811559 Merge pull request #1813 from yueh/fix-1481
Fixes #1481: Not using the right itemcount in a few cases
2015-08-16 15:39:33 +02:00
yueh 7dd283cf9f Fixes 1481: Not using the right itemcount in a few cases 2015-08-16 15:32:58 +02:00
yueh a12ef1e534 Merge pull request #1807 from yueh/fix-1806
Wrong culling direction when rendering inscriber
2015-08-15 21:25:29 +02:00
yueh a567dcc026 Wrong culling direction when rendering inscriber
Fixes #1806
2015-08-15 19:48:12 +02:00
183 changed files with 2686 additions and 2296 deletions
+29 -16
View File
@@ -11,20 +11,32 @@ top of things.
Applied Energistics 2 crashing, have a suggestion, found a bug? Create an issue now!
1. Make sure your issue hasn't already been answered or fixed. Also think about whether your issue is a valid one before submitting it.
2. Go to [the issues page](https://github.com/AppliedEnergistics/Applied-Energistics-2/issues)
3. Click new issue
4. Enter your Issue's title (something that summarizes your issue), and then create a detailed description of the issue.
* To help in resolving your issues please try to include the follow if applicable:
* The problem that is happening?
* What was expected?
* How to reproduce the problem?
* Server or Single Player?
* Mod Pack using and version?
* Crash log (Please make sure to use [pastebin](http://pastebin.com/) for the log file)
* Screen shots or Pictures of the problem
1. Make sure your issue has not already been answered or fixed and you are using the latest version. Also think about whether your issue is a valid one before submitting it.
2. Go to [the issues page](https://github.com/AppliedEnergistics/Applied-Energistics-2/issues) and click [new issue](https://github.com/AppliedEnergistics/Applied-Energistics-2/issues/new)
3. Enter your a title of your issue (something that summarizes your issue), and then create a detailed description of the issue.
* Do not tag it with something like `[Feature]` or `[Bug]`. When it is applicable, we will take care of it.
* The following details are required. Not including them can cause the issue to be closed.
* Forge version
* AE2 version
* Crash log, when reporting a crash (Please make sure to use [pastebin](http://pastebin.com/))
* Do not post an excerpt of what you consider important, instead:
* Post the full log
* Other mods and their version, when reporting an issue between AE and another mod
* Also consider updating these before submitting a new issue, it might be already fixed
* A detailed description of the bug or feature
* To further help in resolving your issues please try to include the follow if applicable:
* What was expected?
* How to reproduce the problem?
* This is usually a great detail and allows us to fix it way faster
* Server or Single Player?
* Screen shots or Pictures of the problem
* Mod Pack using and version?
* Keep in mind that some mods might use an outdated version of AE2
* If so you should report it to your modpack
5. Click `Submit New Issue`, and wait for feedback!
Providing as many details as possible does help us to find and resolve the issue faster and also you getting a fixed version as fast as possible.
### Submitting Changes
* Submit an issue to the github project, assuming one does not already exist.
@@ -55,10 +67,8 @@ Applied Energistics 2 crashing, have a suggestion, found a bug? Create an issue
from our issue tracker. The body describes the behavior without the patch,
why this is a problem, and how the patch fixes the problem when applied.
````
* Always fully test your changes. If they are large engouh in scope, then fully
test AE2.
* Describing the process you used to test your changes in detail will help speed
up this process.
* Always fully test your changes. If they are large engouh in scope, then fully test AE2.
* Describing the process you used to test your changes in detail will help speed up this process.
## Making Trivial Changes
@@ -97,6 +107,9 @@ the styling guidelines used by AE.
PRs that do not conform to these standards will be rejected.
You can find presets for Eclipse and IntelliJ IDEA in the `codeformat` folder.
We try to keep them up to date, but in case you find them not formatting it correctly, then please report it
### Whitespace
#### Tabs or spaces
+27 -13
View File
@@ -54,20 +54,32 @@ You install this mod by putting it into the `minecraft/mods/` folder. It has no
Applied Energistics 2 crashing, have a suggestion, found a bug? Create an issue now!
1. Make sure your issue hasn't already been answered or fixed. Also think about whether your issue is a valid one before submitting it.
2. Go to [the issues page](https://github.com/AppliedEnergistics/Applied-Energistics-2/issues)
3. Click new issue
4. Enter your Issue's title (something that summarizes your issue), and then create a detailed description of the issue.
* To help in resolving your issues please try to include the follow if applicable:
* The problem that is happening?
* What was expected?
* How to reproduce the problem?
* Server or Single Player?
* Mod Pack using and version?
* Crash log (Please make sure to use [pastebin](http://pastebin.com/) for the log file)
* Screen shots or Pictures of the problem
1. Make sure your issue has not already been answered or fixed and you are using the latest version. Also think about whether your issue is a valid one before submitting it.
2. Go to [the issues page](https://github.com/AppliedEnergistics/Applied-Energistics-2/issues) and click [new issue](https://github.com/AppliedEnergistics/Applied-Energistics-2/issues/new)
3. Enter your a title of your issue (something that summarizes your issue), and then create a detailed description of the issue.
* Do not tag it with something like `[Feature]` or `[Bug]`. When it is applicable, we will take care of it.
* The following details are required. Not including them can cause the issue to be closed.
* Forge version
* AE2 version
* Crash log, when reporting a crash (Please make sure to use [pastebin](http://pastebin.com/))
* Do not post an excerpt of what you consider important, instead:
* Post the full log
* Other mods and their version, when reporting an issue between AE and another mod
* Also consider updating these before submitting a new issue, it might be already fixed
* A detailed description of the bug or feature
* To further help in resolving your issues please try to include the follow if applicable:
* What was expected?
* How to reproduce the problem?
* This is usually a great detail and allows us to fix it way faster
* Server or Single Player?
* Screen shots or Pictures of the problem
* Mod Pack using and version?
* Keep in mind that some mods might use an outdated version of AE2
* If so you should report it to your modpack
5. Click `Submit New Issue`, and wait for feedback!
Providing as many details as possible does help us to find and resolve the issue faster and also you getting a fixed version as fast as possible.
## Building
1. Clone this repository via
@@ -90,6 +102,8 @@ Applied Energistics 2 crashing, have a suggestion, found a bug? Create an issue
Before you want to add major changes, you might want to discuss them with us first, before wasting your time.
If you are still willing to contribute to this project, you can contribute via [Pull-Request](https://help.github.com/articles/creating-a-pull-request).
The [guidelines for contributing](https://github.com/AppliedEnergistics/Applied-Energistics-2/blob/master/CONTRIBUTING.md) contain more detailed information about topics like the used code style and should also be considered.
Here are a few things to keep in mind that will help get your PR approved.
* A PR should be focused on content. Any PRs where the changes are only syntax will be rejected.
@@ -127,7 +141,7 @@ Development and standard builds can be obtained [Here](http://ae2.ae-mod.info/Do
When compiling against the AE2 API you can use gradle dependencies, just add
dependencies {
compile "appeng:appliedenergistics2:rv_-_____-__:dev"
compile "appeng:appliedenergistics2:rv_-_____-__:dev"
}
or add the compile line to your existing dependencies task to your build.gradle
+1 -2
View File
@@ -98,9 +98,8 @@ sourceSets {
resources {
srcDir "src/main/resources/"
include "assets/appliedenergistics2/recipes/*.recipe",
include "assets/appliedenergistics2/recipes/**/*.recipe",
"assets/appliedenergistics2/recipes/README.html",
"assets/appliedenergistics2/oredict/*.oredict",
"assets/appliedenergistics2/lang/*.lang",
"assets/appliedenergistics2/textures/blocks/*",
"assets/appliedenergistics2/textures/guis/*",
+2 -2
View File
@@ -1,6 +1,6 @@
#Sat May 16 13:19:14 CEST 2015
#Mon Aug 31 16:41:19 CEST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
@@ -77,7 +77,7 @@ import appeng.transformer.annotations.Integration.Method;
import appeng.util.Platform;
@Interface( iface = "powercrystals.minefactoryreloaded.api.rednet.connectivity.IRedNetConnection", iname = "MFR" )
@Interface( iface = "powercrystals.minefactoryreloaded.api.rednet.connectivity.IRedNetConnection", iname = IntegrationType.MFR )
public class BlockCableBus extends AEBaseTileBlock implements IRedNetConnection
{
@@ -506,7 +506,7 @@ public class BlockCableBus extends AEBaseTileBlock implements IRedNetConnection
}
@Override
@Method( iname = "MFR" )
@Method( iname = IntegrationType.MFR )
public RedNetConnectionType getConnectionType( World world, int x, int y, int z, ForgeDirection side )
{
return this.cb( world, x, y, z ).canConnectRedstone( EnumSet.allOf( ForgeDirection.class ) ) ? RedNetConnectionType.CableSingle : RedNetConnectionType.None;
@@ -159,6 +159,7 @@ public class RenderBlockInscriber extends BaseBlockRender<BlockInscriber, TileIn
GL11.glColor4f( 1.0F, 1.0F, 1.0F, 1.0F );
GL11.glDisable( GL11.GL_LIGHTING );
GL11.glDisable( GL12.GL_RESCALE_NORMAL );
GL11.glCullFace( GL11.GL_FRONT );
Minecraft mc = Minecraft.getMinecraft();
mc.renderEngine.bindTexture( TextureMap.locationBlocksTexture );
@@ -224,6 +225,9 @@ public class RenderBlockInscriber extends BaseBlockRender<BlockInscriber, TileIn
tess.draw();
GL11.glCullFace( GL11.GL_BACK );
GL11.glEnable( GL11.GL_LIGHTING );
GL11.glEnable( GL12.GL_RESCALE_NORMAL );
GL11.glPopMatrix();
int items = 0;
@@ -50,19 +50,19 @@ public class ContainerInterface extends ContainerUpgradeable
this.myDuality = te.getInterfaceDuality();
for( int x = 0; x < 9; x++ )
for( int x = 0; x < DualityInterface.NUMBER_OF_PATTERN_SLOTS; x++ )
{
this.addSlotToContainer( new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.ENCODED_PATTERN, this.myDuality.getPatterns(), x, 8 + 18 * x, 90 + 7, this.invPlayer ) );
}
for( int x = 0; x < 8; x++ )
for( int x = 0; x < DualityInterface.NUMBER_OF_CONFIG_SLOTS; x++ )
{
this.addSlotToContainer( new SlotFake( this.myDuality.getConfig(), x, 17 + 18 * x, 35 ) );
this.addSlotToContainer( new SlotFake( this.myDuality.getConfig(), x, 8 + 18 * x, 35 ) );
}
for( int x = 0; x < 8; x++ )
for( int x = 0; x < DualityInterface.NUMBER_OF_STORAGE_SLOTS; x++ )
{
this.addSlotToContainer( new SlotNormal( this.myDuality.getStorage(), x, 17 + 18 * x, 35 + 18 ) );
this.addSlotToContainer( new SlotNormal( this.myDuality.getStorage(), x, 8 + 18 * x, 35 + 18 ) );
}
}
+2 -6
View File
@@ -22,6 +22,7 @@ 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;
@@ -29,7 +30,6 @@ import com.google.common.base.Preconditions;
import org.apache.commons.io.FileUtils;
import appeng.api.recipes.IRecipeHandler;
import appeng.api.recipes.IRecipeLoader;
import appeng.recipes.loader.ConfigLoader;
import appeng.recipes.loader.JarLoader;
import appeng.recipes.loader.RecipeResourceCopier;
@@ -69,11 +69,7 @@ public class RecipeLoader implements Runnable
final File readmeGenDest = new File( generatedRecipesDir, "README.html" );
final File readmeUserDest = new File( userRecipesDir, "README.html" );
final IRecipeLoader oreDictLoader = new JarLoader( "/assets/appliedenergistics2/oredict/" );
this.handler.parseRecipes( oreDictLoader, "vanilla.oredict" );
this.handler.parseRecipes( oreDictLoader, "ae2.oredict" );
// generates generated and user recipes dir
// 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
@@ -521,22 +521,6 @@ public final class Registration
partHelper.registerNewLayer( "appeng.parts.layers.LayerIFluidHandler", "net.minecraftforge.fluids.IFluidHandler" );
partHelper.registerNewLayer( "appeng.parts.layers.LayerITileStorageMonitorable", "appeng.api.implementations.tiles.ITileStorageMonitorable" );
if( IntegrationRegistry.INSTANCE.isEnabled( IntegrationType.IC2 ) )
{
partHelper.registerNewLayer( "appeng.parts.layers.LayerIEnergySink", "ic2.api.energy.tile.IEnergySink" );
partHelper.registerNewLayer( "appeng.parts.layers.LayerIEnergySource", "ic2.api.energy.tile.IEnergySource" );
}
if( IntegrationRegistry.INSTANCE.isEnabled( IntegrationType.RF ) )
{
partHelper.registerNewLayer( "appeng.parts.layers.LayerIEnergyHandler", "cofh.api.energy.IEnergyReceiver" );
}
if( IntegrationRegistry.INSTANCE.isEnabled( IntegrationType.OpenComputers ) )
{
partHelper.registerNewLayer( "appeng.parts.layers.LayerSidedEnvironment", "li.cil.oc.api.network.SidedEnvironment" );
}
FMLCommonHandler.instance().bus().register( TickHandler.INSTANCE );
MinecraftForge.EVENT_BUS.register( TickHandler.INSTANCE );
@@ -118,7 +118,7 @@ public final class GrinderRecipeManager implements IGrinderRegistry, IOreListene
}
this.log( "Allow Grinding of " + Platform.getItemDisplayName( in ) + " to " + Platform.getItemDisplayName( out ) + " with optional " + Platform.getItemDisplayName( optional ) + " for " + cost );
this.injectRecipe( new AppEngGrinderRecipe( this.copy( in ), this.copy( out ), this.copy( optional ), chance, cost ) );
this.injectRecipe( new AppEngGrinderRecipe( this.copy( in ), this.copy( out ), this.copy( optional ), this.copy( optional2 ), chance, chance2, cost ) );
}
private void injectRecipe( AppEngGrinderRecipe appEngGrinderRecipe )
@@ -55,9 +55,13 @@ public enum GuiText
inWorldFluix, inWorldPurificationCertus, inWorldPurificationNether,
inWorldPurificationFluix, inWorldSingularity, ChargedQuartz, OfSecondOutput,
inWorldPurificationFluix, inWorldSingularity, ChargedQuartz,
NoSecondOutput, Stores, Next, SelectAmount, Lumen, Empty,
NoSecondOutput,
OfSecondOutput,
MultipleOutputs,
Stores, Next, SelectAmount, Lumen, Empty,
ConfirmCrafting, Stored, Crafting, Scheduled, CraftingStatus, Cancel, ETA, ETAFormat,
@@ -19,7 +19,6 @@
package appeng.core.worlddata;
import java.io.File;
import java.util.List;
import javax.annotation.Nonnull;
@@ -64,13 +63,11 @@ final class DimensionData implements IWorldDimensionData, IOnWorldStartable, IOn
private final Configuration config;
private final List<Integer> storageCellDimensionIDs;
DimensionData( @Nonnull final File parentFile, @Nonnull final String configVersion )
DimensionData( @Nonnull final Configuration parentFile )
{
Preconditions.checkNotNull( parentFile );
Preconditions.checkNotNull( configVersion );
Preconditions.checkArgument( !configVersion.isEmpty() );
this.config = new Configuration( parentFile, configVersion );
this.config = parentFile;
final int[] storageCellIDs = this.storageCellIDsProperty().getIntList();
@@ -19,7 +19,6 @@
package appeng.core.worlddata;
import java.io.File;
import java.util.UUID;
import javax.annotation.Nonnull;
@@ -58,13 +57,11 @@ final class PlayerData implements IWorldPlayerData, IOnWorldStartable, IOnWorldS
private int lastPlayerID;
public PlayerData( @Nonnull final File configFile, @Nonnull final String configVersion )
public PlayerData( @Nonnull final Configuration configFile )
{
Preconditions.checkNotNull( configFile );
Preconditions.checkNotNull( configVersion );
Preconditions.checkArgument( !configVersion.isEmpty() );
this.config = new Configuration( configFile, configVersion );
this.config = configFile;
final ConfigCategory playerList = this.config.getCategory( "players" );
this.playerMapping = new PlayerMapping( playerList, AELog.INSTANCE );
@@ -19,7 +19,6 @@
package appeng.core.worlddata;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.WeakHashMap;
@@ -55,13 +54,11 @@ final class StorageData implements IWorldGridStorageData, IOnWorldStartable, IOn
private long lastGridStorage;
public StorageData( @Nonnull final File settingsFile, @Nonnull final String version )
public StorageData( @Nonnull final Configuration settingsFile )
{
Preconditions.checkNotNull( settingsFile );
Preconditions.checkNotNull( version );
Preconditions.checkArgument( !version.isEmpty() );
this.config = new Configuration( settingsFile, version );
this.config = settingsFile;
}
/**
@@ -30,6 +30,7 @@ import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.config.Configuration;
import appeng.core.AEConfig;
import appeng.services.CompassService;
@@ -39,7 +40,8 @@ import appeng.services.compass.CompassThreadFactory;
/**
* Singleton access to anything related to world-based data.
*
* Data will change depending which world is loaded. Will probably not affect SMP at all since only one world is loaded, but SSP more, cause they play on
* Data will change depending which world is loaded. Will probably not affect SMP at all since only one world is loaded,
* but SSP more, cause they play on
* different worlds.
*
* @author thatsIch
@@ -69,6 +71,8 @@ public final class WorldData implements IWorldData
private final File spawnDirectory;
private final File compassDirectory;
private final Configuration sharedConfig;
private WorldData( @Nonnull final File worldDirectory )
{
Preconditions.checkNotNull( worldDirectory );
@@ -79,10 +83,11 @@ public final class WorldData implements IWorldData
this.compassDirectory = new File( this.ae2directory, COMPASS_DIR_NAME );
final File settingsFile = new File( this.ae2directory, SETTING_FILE_NAME );
this.sharedConfig = new Configuration( settingsFile, AEConfig.VERSION );
final PlayerData playerData = new PlayerData( settingsFile, AEConfig.VERSION );
final DimensionData dimensionData = new DimensionData( settingsFile, AEConfig.VERSION );
final StorageData storageData = new StorageData( settingsFile, AEConfig.VERSION );
final PlayerData playerData = new PlayerData( this.sharedConfig );
final DimensionData dimensionData = new DimensionData( this.sharedConfig );
final StorageData storageData = new StorageData( this.sharedConfig );
final ThreadFactory compassThreadFactory = new CompassThreadFactory();
final CompassService compassService = new CompassService( this.compassDirectory, compassThreadFactory );
@@ -100,18 +100,22 @@ import appeng.util.item.AEItemStack;
public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost, IPriorityHost
{
public static final int NUMBER_OF_STORAGE_SLOTS = 9;
public static final int NUMBER_OF_CONFIG_SLOTS = 9;
public static final int NUMBER_OF_PATTERN_SLOTS = 9;
private static final Collection<Block> BAD_BLOCKS = new HashSet<Block>( 100 );
final int[] sides = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
final IAEItemStack[] requireWork = new IAEItemStack[] { null, null, null, null, null, null, null, null };
final int[] sides = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
final IAEItemStack[] requireWork = new IAEItemStack[] { null, null, null, null, null, null, null, null, null };
final MultiCraftingTracker craftingTracker;
final AENetworkProxy gridProxy;
final IInterfaceHost iHost;
final BaseActionSource mySource;
final BaseActionSource interfaceRequestSource;
final ConfigManager cm = new ConfigManager( this );
final AppEngInternalAEInventory config = new AppEngInternalAEInventory( this, 8 );
final AppEngInternalInventory storage = new AppEngInternalInventory( this, 8 );
final AppEngInternalInventory patterns = new AppEngInternalInventory( this, 9 );
final AppEngInternalAEInventory config = new AppEngInternalAEInventory( this, NUMBER_OF_CONFIG_SLOTS );
final AppEngInternalInventory storage = new AppEngInternalInventory( this, NUMBER_OF_STORAGE_SLOTS );
final AppEngInternalInventory patterns = new AppEngInternalInventory( this, NUMBER_OF_PATTERN_SLOTS );
final WrapperInvSlot slotInv = new WrapperInvSlot( this.storage );
final MEMonitorPassThrough<IAEItemStack> items = new MEMonitorPassThrough<IAEItemStack>( new NullInventory<IAEItemStack>(), StorageChannel.ITEMS );
final MEMonitorPassThrough<IAEFluidStack> fluids = new MEMonitorPassThrough<IAEFluidStack>( new NullInventory<IAEFluidStack>(), StorageChannel.FLUIDS );
@@ -279,7 +283,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
boolean had = this.hasWorkToDo();
for( int x = 0; x < 8; x++ )
for( int x = 0; x < NUMBER_OF_CONFIG_SLOTS; x++ )
{
this.updatePlan( x );
}
@@ -616,7 +620,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
{
boolean didSomething = false;
for( int x = 0; x < 8; x++ )
for( int x = 0; x < NUMBER_OF_STORAGE_SLOTS; x++ )
{
if( this.requireWork[x] != null )
{
+14 -11
View File
@@ -25,7 +25,6 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.WeakHashMap;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import com.google.common.base.Stopwatch;
@@ -55,6 +54,7 @@ import appeng.entity.EntityFloatingItem;
import appeng.me.Grid;
import appeng.me.NetworkList;
import appeng.tile.AEBaseTile;
import appeng.util.IWorldCallable;
import appeng.util.Platform;
@@ -62,9 +62,9 @@ public class TickHandler
{
public static final TickHandler INSTANCE = new TickHandler();
final Queue<Callable> serverQueue = new LinkedList<Callable>();
final Queue<IWorldCallable<?>> serverQueue = new LinkedList<IWorldCallable<?>>();
final Multimap<World, CraftingJob> craftingJobs = LinkedListMultimap.create();
private final WeakHashMap<World, Queue<Callable>> callQueue = new WeakHashMap<World, Queue<Callable>>();
private final WeakHashMap<World, Queue<IWorldCallable<?>>> callQueue = new WeakHashMap<World, Queue<IWorldCallable<?>>>();
private final HandlerRep server = new HandlerRep();
private final HandlerRep client = new HandlerRep();
private final HashMap<Integer, PlayerColor> cliPlayerColors = new HashMap<Integer, PlayerColor>();
@@ -80,7 +80,7 @@ public class TickHandler
return this.cliPlayerColors;
}
public void addCallable( World w, Callable c )
public void addCallable( World w, IWorldCallable<?> c )
{
if( w == null )
{
@@ -88,11 +88,12 @@ public class TickHandler
}
else
{
Queue<Callable> queue = this.callQueue.get( w );
Queue<IWorldCallable<?>> queue = this.callQueue.get( w );
if( queue == null )
{
this.callQueue.put( w, queue = new LinkedList<Callable>() );
queue = new LinkedList<IWorldCallable<?>>();
this.callQueue.put( w, queue );
}
queue.add( c );
@@ -239,13 +240,15 @@ public class TickHandler
}
// cross world queue.
this.processQueue( this.serverQueue );
this.processQueue( this.serverQueue, null );
}
// world synced queue(s)
if( ev.type == Type.WORLD && ev.phase == Phase.START )
{
this.processQueue( this.callQueue.get( ( (WorldTickEvent) ev ).world ) );
final World world = ( (WorldTickEvent) ev ).world;
final Queue<IWorldCallable<?>> queue = this.callQueue.get( world );
this.processQueue( queue, world );
}
}
@@ -263,7 +266,7 @@ public class TickHandler
}
}
private void processQueue( Queue<Callable> queue )
private void processQueue( Queue<IWorldCallable<?>> queue, World world )
{
if( queue == null )
{
@@ -272,12 +275,12 @@ public class TickHandler
Stopwatch sw = Stopwatch.createStarted();
Callable c = null;
IWorldCallable<?> c = null;
while( ( c = queue.poll() ) != null )
{
try
{
c.call();
c.call( world );
if( sw.elapsed( TimeUnit.MILLISECONDS ) > 50 )
{
@@ -21,12 +21,6 @@ package appeng.integration;
public abstract class BaseModule implements IIntegrationModule
{
protected void testClassExistence( Class<?> clz )
{
clz.isInstance( this );
}
@Override
public abstract void init() throws Throwable;
@@ -0,0 +1,29 @@
/*
* 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.integration;
public class IntegrationHelper
{
public static void testClassExistence( Object o, Class<?> clz )
{
clz.isInstance( o );
}
}
@@ -39,7 +39,7 @@ public final class IntegrationNode
IntegrationStage failedStage = IntegrationStage.PRE_INIT;
Throwable exception = null;
String name = null;
Class classValue = null;
Class<?> classValue = null;
Object instance;
IIntegrationModule mod = null;
@@ -32,6 +32,8 @@ public enum IntegrationRegistry
{
INSTANCE;
private static final String PACKAGE_PREFIX = "appeng.integration.modules.";
private final Collection<IntegrationNode> modules = new LinkedList<IntegrationNode>();
public void add( IntegrationType type )
@@ -46,7 +48,7 @@ public enum IntegrationRegistry
return;
}
this.modules.add( new IntegrationNode( type.dspName, type.modID, type, "appeng.integration.modules." + type.name() ) );
this.modules.add( new IntegrationNode( type.dspName, type.modID, type, PACKAGE_PREFIX + type.name() ) );
}
public void init()
@@ -23,8 +23,10 @@ import net.mcft.copy.betterstorage.api.crate.ICrateStorage;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IIntegrationModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.abstraction.IBetterStorage;
import appeng.integration.modules.helpers.BSCrateHandler;
import appeng.integration.modules.helpers.BSCrateStorageAdaptor;
@@ -33,12 +35,13 @@ import appeng.util.InventoryAdaptor;
public class BetterStorage extends BaseModule implements IIntegrationModule, IBetterStorage
{
@Reflected
public static BetterStorage instance;
@Reflected
public BetterStorage()
{
this.testClassExistence( net.mcft.copy.betterstorage.api.crate.ICrateStorage.class );
IntegrationHelper.testClassExistence( this, net.mcft.copy.betterstorage.api.crate.ICrateStorage.class );
}
@Override
@@ -60,7 +63,6 @@ public class BetterStorage extends BaseModule implements IIntegrationModule, IBe
@Override
public void init()
{
}
@Override
@@ -28,10 +28,7 @@ import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.BuilderAPI;
import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.ISchematicRegistry;
import buildcraft.api.blueprints.SchematicBlock;
import buildcraft.api.blueprints.SchematicTile;
import appeng.api.AEApi;
import appeng.api.definitions.IBlockDefinition;
@@ -41,6 +38,7 @@ import appeng.api.util.IOrientableBlock;
import appeng.core.AELog;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.modules.BCHelpers.AECableSchematicTile;
import appeng.integration.modules.BCHelpers.AEGenericSchematicTile;
import appeng.integration.modules.BCHelpers.AERotatableBlockSchematic;
@@ -62,11 +60,11 @@ public class BuildCraftBuilder extends BaseModule
@Reflected
public BuildCraftBuilder()
{
this.testClassExistence( BuilderAPI.class );
this.testClassExistence( IBuilderContext.class );
this.testClassExistence( ISchematicRegistry.class );
this.testClassExistence( SchematicTile.class );
this.testClassExistence( SchematicBlock.class );
IntegrationHelper.testClassExistence( this, buildcraft.api.blueprints.BuilderAPI.class );
IntegrationHelper.testClassExistence( this, buildcraft.api.blueprints.IBuilderContext.class );
IntegrationHelper.testClassExistence( this, buildcraft.api.blueprints.ISchematicRegistry.class );
IntegrationHelper.testClassExistence( this, buildcraft.api.blueprints.SchematicTile.class );
IntegrationHelper.testClassExistence( this, buildcraft.api.blueprints.SchematicBlock.class );
}
@Override
@@ -85,7 +83,6 @@ public class BuildCraftBuilder extends BaseModule
@Override
public void postInit()
{
}
private void initBuilderSupport()
@@ -25,7 +25,6 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import buildcraft.BuildCraftTransport;
import buildcraft.api.tools.IToolWrench;
import appeng.api.AEApi;
@@ -33,6 +32,7 @@ import appeng.api.config.TunnelType;
import appeng.api.features.IP2PTunnelRegistry;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.abstraction.IBuildCraftCore;
@@ -45,9 +45,9 @@ public final class BuildCraftCore extends BaseModule implements IBuildCraftCore
@Reflected
public BuildCraftCore()
{
this.testClassExistence( buildcraft.BuildCraftCore.class );
this.testClassExistence( BuildCraftTransport.class );
this.testClassExistence( IToolWrench.class );
IntegrationHelper.testClassExistence( this, buildcraft.BuildCraftCore.class );
IntegrationHelper.testClassExistence( this, buildcraft.BuildCraftTransport.class );
IntegrationHelper.testClassExistence( this, buildcraft.api.tools.IToolWrench.class );
}
@Override
@@ -71,7 +71,6 @@ public final class BuildCraftCore extends BaseModule implements IBuildCraftCore
@Override
public void init()
{
}
@Override
@@ -33,7 +33,6 @@ import cpw.mods.fml.common.event.FMLInterModComms;
import buildcraft.api.facades.IFacadeItem;
import buildcraft.api.transport.IInjectable;
import buildcraft.api.transport.IPipeConnection;
import buildcraft.api.transport.IPipeTile;
import buildcraft.transport.ItemFacade;
import buildcraft.transport.PipeIconProvider;
@@ -48,6 +47,7 @@ import appeng.api.parts.IFacadePart;
import appeng.facade.FacadePart;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.abstraction.IBuildCraftTransport;
import appeng.integration.modules.BCHelpers.BCPipeHandler;
@@ -66,14 +66,14 @@ public class BuildCraftTransport extends BaseModule implements IBuildCraftTransp
@Reflected
public BuildCraftTransport()
{
this.testClassExistence( buildcraft.BuildCraftTransport.class );
this.testClassExistence( IFacadeItem.class );
this.testClassExistence( IInjectable.class );
this.testClassExistence( IPipeConnection.class );
this.testClassExistence( IPipeTile.class );
this.testClassExistence( ItemFacade.class );
this.testClassExistence( PipeIconProvider.class );
this.testClassExistence( IPipeTile.PipeType.class );
IntegrationHelper.testClassExistence( this, buildcraft.BuildCraftTransport.class );
IntegrationHelper.testClassExistence( this, buildcraft.api.facades.IFacadeItem.class );
IntegrationHelper.testClassExistence( this, buildcraft.api.transport.IInjectable.class );
IntegrationHelper.testClassExistence( this, buildcraft.api.transport.IPipeConnection.class );
IntegrationHelper.testClassExistence( this, buildcraft.api.transport.IPipeTile.class );
IntegrationHelper.testClassExistence( this, buildcraft.api.transport.IPipeTile.PipeType.class );
IntegrationHelper.testClassExistence( this, buildcraft.transport.ItemFacade.class );
IntegrationHelper.testClassExistence( this, buildcraft.transport.PipeIconProvider.class );
}
@Override
@@ -20,19 +20,26 @@ package appeng.integration.modules;
import appeng.api.util.AEColor;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.abstraction.ICLApi;
public class CLApi extends BaseModule implements ICLApi
{
@Reflected
public static CLApi instance;
@Reflected
public CLApi()
{
IntegrationHelper.testClassExistence( this, coloredlightscore.src.api.CLApi.class );
}
@Override
public void init() throws Throwable
{
this.testClassExistence( coloredlightscore.src.api.CLApi.class );
}
@Override
@@ -56,6 +56,7 @@ import appeng.api.features.IInscriberRecipe;
import appeng.api.recipes.IIngredient;
import appeng.helpers.Reflected;
import appeng.integration.IIntegrationModule;
import appeng.integration.IntegrationHelper;
import appeng.recipes.game.ShapedRecipe;
import appeng.recipes.game.ShapelessRecipe;
@@ -136,6 +137,33 @@ public final class CraftGuide extends CraftGuideAPIObject implements IIntegratio
@Reflected
public static CraftGuide instance;
public CraftGuide()
{
IntegrationHelper.testClassExistence( this, uristqwerty.CraftGuide.CraftGuideLog.class );
IntegrationHelper.testClassExistence( this, uristqwerty.CraftGuide.DefaultRecipeTemplate.class );
IntegrationHelper.testClassExistence( this, uristqwerty.CraftGuide.RecipeGeneratorImplementation.class );
IntegrationHelper.testClassExistence( this, uristqwerty.CraftGuide.api.ChanceSlot.class );
IntegrationHelper.testClassExistence( this, uristqwerty.CraftGuide.api.CraftGuideAPIObject.class );
IntegrationHelper.testClassExistence( this, uristqwerty.CraftGuide.api.ItemSlot.class );
IntegrationHelper.testClassExistence( this, uristqwerty.CraftGuide.api.RecipeGenerator.class );
IntegrationHelper.testClassExistence( this, uristqwerty.CraftGuide.api.RecipeProvider.class );
IntegrationHelper.testClassExistence( this, uristqwerty.CraftGuide.api.RecipeTemplate.class );
IntegrationHelper.testClassExistence( this, uristqwerty.CraftGuide.api.Slot.class );
IntegrationHelper.testClassExistence( this, uristqwerty.CraftGuide.api.SlotType.class );
IntegrationHelper.testClassExistence( this, uristqwerty.gui_craftguide.texture.DynamicTexture.class );
IntegrationHelper.testClassExistence( this, uristqwerty.gui_craftguide.texture.TextureClip.class );
}
@Override
public void init() throws Throwable
{
}
@Override
public void postInit()
{
}
@Override
public void generateRecipes( RecipeGenerator generator )
{
@@ -428,15 +456,4 @@ public final class CraftGuide extends CraftGuideAPIObject implements IIntegratio
return null;
}
@Override
public void init() throws Throwable
{
}
@Override
public void postInit()
{
}
}
@@ -25,7 +25,9 @@ import powercrystals.minefactoryreloaded.api.IDeepStorageUnit;
import appeng.api.AEApi;
import appeng.api.storage.IMEInventory;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.abstraction.IDSU;
import appeng.integration.modules.helpers.MFRDSUHandler;
import appeng.integration.modules.helpers.MinefactoryReloadedDeepStorageUnit;
@@ -33,8 +35,15 @@ import appeng.integration.modules.helpers.MinefactoryReloadedDeepStorageUnit;
public class DSU extends BaseModule implements IDSU
{
@Reflected
public static DSU instance;
@Reflected
public DSU()
{
IntegrationHelper.testClassExistence( this, powercrystals.minefactoryreloaded.api.IDeepStorageUnit.class );
}
@Override
public IMEInventory getDSU( TileEntity te )
{
@@ -50,7 +59,6 @@ public class DSU extends BaseModule implements IDSU
@Override
public void init()
{
this.testClassExistence( IDeepStorageUnit.class );
}
@Override
@@ -50,6 +50,7 @@ import appeng.fmp.CableBusPart;
import appeng.fmp.FMPEvent;
import appeng.fmp.FMPPlacementHelper;
import appeng.fmp.PartRegistry;
import appeng.helpers.Reflected;
import appeng.integration.IIntegrationModule;
import appeng.integration.abstraction.IFMP;
import appeng.integration.modules.helpers.FMPPacketEvent;
@@ -58,7 +59,7 @@ import appeng.parts.CableBusContainer;
public class FMP implements IIntegrationModule, IPartFactory, IPartConverter, IFMP
{
@Reflected
public static FMP instance;
@Override
@@ -28,6 +28,8 @@ import net.minecraft.tileentity.TileEntity;
import appeng.api.AEApi;
import appeng.api.storage.IMEInventory;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IIntegrationModule;
import appeng.integration.abstraction.IFZ;
import appeng.integration.modules.helpers.FactorizationBarrel;
@@ -38,9 +40,9 @@ import appeng.util.Platform;
/**
* 100% Hacks.
*/
public class FZ implements IFZ, IIntegrationModule
public class FZ extends BaseModule implements IFZ, IIntegrationModule
{
@Reflected
public static FZ instance;
private static Class<?> day_BarrelClass;
@@ -27,25 +27,41 @@ import ic2.api.energy.tile.IEnergyTile;
import ic2.api.recipe.RecipeInputItemStack;
import appeng.api.AEApi;
import appeng.api.IAppEngApi;
import appeng.api.config.TunnelType;
import appeng.api.features.IP2PTunnelRegistry;
import appeng.api.parts.IPartHelper;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.IntegrationRegistry;
import appeng.integration.IntegrationType;
import appeng.integration.abstraction.IIC2;
public class IC2 extends BaseModule implements IIC2
{
@Reflected
public static IC2 instance;
@Reflected
public IC2()
{
this.testClassExistence( IEnergyTile.class );
IntegrationHelper.testClassExistence( this, ic2.api.energy.tile.IEnergyTile.class );
IntegrationHelper.testClassExistence( this, ic2.api.recipe.RecipeInputItemStack.class );
}
@Override
public void init()
{
final IAppEngApi api = AEApi.instance();
final IPartHelper partHelper = api.partHelper();
if( IntegrationRegistry.INSTANCE.isEnabled( IntegrationType.IC2 ) )
{
partHelper.registerNewLayer( "appeng.parts.layers.LayerIEnergySink", "ic2.api.energy.tile.IEnergySink" );
partHelper.registerNewLayer( "appeng.parts.layers.LayerIEnergySource", "ic2.api.energy.tile.IEnergySource" );
}
}
@Override
@@ -31,7 +31,6 @@ import net.minecraft.world.World;
import mods.immibis.core.api.multipart.ICoverSystem;
import mods.immibis.core.api.multipart.IMultipartTile;
import mods.immibis.core.api.multipart.IPartContainer;
import appeng.api.AEApi;
import appeng.api.definitions.IBlockDefinition;
@@ -40,6 +39,7 @@ import appeng.api.parts.IPartItem;
import appeng.core.AELog;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.abstraction.IImmibisMicroblocks;
@@ -53,13 +53,17 @@ public class ImmibisMicroblocks extends BaseModule implements IImmibisMicroblock
private Class<?> MicroblockAPIUtils;
private Method mergeIntoMicroblockContainer;
@Reflected
public ImmibisMicroblocks()
{
IntegrationHelper.testClassExistence( this, mods.immibis.core.api.multipart.IMultipartTile.class );
IntegrationHelper.testClassExistence( this, mods.immibis.core.api.multipart.ICoverSystem.class );
IntegrationHelper.testClassExistence( this, mods.immibis.core.api.multipart.IPartContainer.class );
}
@Override
public void init() throws Throwable
{
this.testClassExistence( IMultipartTile.class );
this.testClassExistence( ICoverSystem.class );
this.testClassExistence( IPartContainer.class );
try
{
this.MicroblockAPIUtils = Class.forName( "mods.immibis.microblocks.api.MicroblockAPIUtils" );
@@ -25,17 +25,25 @@ import cpw.mods.fml.common.Loader;
import invtweaks.api.InvTweaksAPI;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.abstraction.IInvTweaks;
public class InvTweaks extends BaseModule implements IInvTweaks
{
@Reflected
public static InvTweaks instance;
static InvTweaksAPI api;
@Reflected
public InvTweaks()
{
IntegrationHelper.testClassExistence( this, invtweaks.api.InvTweaksAPI.class );
}
@Override
public void init()
{
@@ -19,30 +19,29 @@
package appeng.integration.modules;
import powercrystals.minefactoryreloaded.api.rednet.connectivity.IRedNetConnection;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
public class MFR extends BaseModule
{
@Reflected
public static MFR instance;
@Reflected
public MFR()
{
this.testClassExistence( IRedNetConnection.class );
IntegrationHelper.testClassExistence( this, powercrystals.minefactoryreloaded.api.rednet.connectivity.IRedNetConnection.class );
}
@Override
public void init() throws Throwable
{
}
@Override
public void postInit()
{
}
}
@@ -24,25 +24,31 @@ import net.minecraft.nbt.NBTTagCompound;
import cpw.mods.fml.common.event.FMLInterModComms;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.abstraction.IMekanism;
public final class Mekanism extends BaseModule implements IMekanism
{
@Reflected
public static Mekanism instance;
@Reflected
public Mekanism()
{
IntegrationHelper.testClassExistence( this, mekanism.api.energy.IStrictEnergyAcceptor.class );
}
@Override
public void init() throws Throwable
{
this.testClassExistence( mekanism.api.energy.IStrictEnergyAcceptor.class );
}
@Override
public void postInit()
{
}
@Override
@@ -42,6 +42,7 @@ import appeng.core.AEConfig;
import appeng.core.features.AEFeature;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.abstraction.INEI;
import appeng.integration.modules.NEIHelpers.NEIAEShapedRecipeHandler;
import appeng.integration.modules.NEIHelpers.NEIAEShapelessRecipeHandler;
@@ -61,15 +62,19 @@ public class NEI extends BaseModule implements INEI, IContainerTooltipHandler
private final Class<?> apiClass;
// recipe handler...
Method registerRecipeHandler;
Method registerUsageHandler;
private Method registerRecipeHandler;
private Method registerUsageHandler;
@Reflected
public NEI() throws ClassNotFoundException
{
this.testClassExistence( GuiContainerManager.class );
this.testClassExistence( codechicken.nei.recipe.ICraftingHandler.class );
this.testClassExistence( codechicken.nei.recipe.IUsageHandler.class );
IntegrationHelper.testClassExistence( this, codechicken.nei.api.API.class );
IntegrationHelper.testClassExistence( this, codechicken.nei.api.IStackPositioner.class );
IntegrationHelper.testClassExistence( this, codechicken.nei.guihook.GuiContainerManager.class );
IntegrationHelper.testClassExistence( this, codechicken.nei.guihook.IContainerTooltipHandler.class );
IntegrationHelper.testClassExistence( this, codechicken.nei.recipe.ICraftingHandler.class );
IntegrationHelper.testClassExistence( this, codechicken.nei.recipe.IUsageHandler.class );
this.apiClass = Class.forName( "codechicken.nei.api.API" );
}
@@ -96,7 +101,7 @@ public class NEI extends BaseModule implements INEI, IContainerTooltipHandler
// crafting terminal...
Method registerGuiOverlay = this.apiClass.getDeclaredMethod( "registerGuiOverlay", Class.class, String.class, IStackPositioner.class );
Class overlayHandler = Class.forName( "codechicken.nei.api.IOverlayHandler" );
Class defaultHandler = NEICraftingHandler.class;
Class<NEICraftingHandler> defaultHandler = NEICraftingHandler.class;
Method registrar = this.apiClass.getDeclaredMethod( "registerGuiOverlayHandler", Class.class, overlayHandler, String.class );
registerGuiOverlay.invoke( this.apiClass, GuiCraftingTerm.class, "crafting", new TerminalCraftingSlotFinder() );
@@ -109,6 +109,7 @@ public class NEIGrinderRecipeHandler extends TemplateRecipeHandler
public String getGuiTexture()
{
ResourceLocation loc = new ResourceLocation( "appliedenergistics2", "textures/guis/grinder.png" );
return loc.toString();
}
@@ -194,13 +195,22 @@ public class NEIGrinderRecipeHandler extends TemplateRecipeHandler
this.result = new PositionedStack( recipe.getOutput(), -30 + 107, 47 );
this.ingredients = new ArrayList<PositionedStack>();
if( recipe.getOptionalOutput() != null )
final ItemStack optionalOutput = recipe.getOptionalOutput();
final int optionalChancePercent = (int) ( recipe.getOptionalChance() * 100 );
if( optionalOutput != null )
{
final int chancePercent = (int) ( recipe.getOptionalChance() * 100 );
this.hasOptional = true;
this.displayChance = String.format( GuiText.OfSecondOutput.getLocal(), chancePercent );
this.ingredients.add( new PositionedStack( recipe.getOptionalOutput(), -30 + 107 + 18, 47 ) );
this.displayChance = String.format( GuiText.OfSecondOutput.getLocal(), optionalChancePercent );
this.ingredients.add( new PositionedStack( optionalOutput, -30 + 107 + 18, 47 ) );
}
final ItemStack secondOptionalOutput = recipe.getSecondOptionalOutput();
final int secondOptionalChancePercent = (int) ( recipe.getSecondOptionalChance() * 100 );
if( secondOptionalOutput != null )
{
this.hasOptional = true;
this.displayChance = String.format( GuiText.MultipleOutputs.getLocal(), optionalChancePercent, secondOptionalChancePercent );
this.ingredients.add( new PositionedStack( secondOptionalOutput, -30 + 107 + 18 + 18, 47 ) );
}
if( recipe.getInput() != null )
@@ -22,28 +22,44 @@ package appeng.integration.modules;
import li.cil.oc.api.Items;
import appeng.api.AEApi;
import appeng.api.IAppEngApi;
import appeng.api.config.TunnelType;
import appeng.api.features.IP2PTunnelRegistry;
import appeng.api.parts.IPartHelper;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.IntegrationRegistry;
import appeng.integration.IntegrationType;
public class OpenComputers extends BaseModule
{
@Reflected
public static OpenComputers instance;
@Reflected
public OpenComputers()
{
this.testClassExistence( li.cil.oc.api.Items.class );
this.testClassExistence( li.cil.oc.api.Network.class );
this.testClassExistence( li.cil.oc.api.network.Environment.class );
this.testClassExistence( li.cil.oc.api.network.SidedEnvironment.class );
this.testClassExistence( li.cil.oc.api.network.Node.class );
this.testClassExistence( li.cil.oc.api.network.Message.class );
IntegrationHelper.testClassExistence( this, li.cil.oc.api.Items.class );
IntegrationHelper.testClassExistence( this, li.cil.oc.api.Network.class );
IntegrationHelper.testClassExistence( this, li.cil.oc.api.network.Environment.class );
IntegrationHelper.testClassExistence( this, li.cil.oc.api.network.SidedEnvironment.class );
IntegrationHelper.testClassExistence( this, li.cil.oc.api.network.Node.class );
IntegrationHelper.testClassExistence( this, li.cil.oc.api.network.Message.class );
}
@Override
public void init()
{
final IAppEngApi api = AEApi.instance();
final IPartHelper partHelper = api.partHelper();
if( IntegrationRegistry.INSTANCE.isEnabled( IntegrationType.OpenComputers ) )
{
partHelper.registerNewLayer( "appeng.parts.layers.LayerSidedEnvironment", "li.cil.oc.api.network.SidedEnvironment" );
}
}
@Override
@@ -31,6 +31,7 @@ import appeng.api.features.IP2PTunnelRegistry;
import appeng.api.parts.IPartHelper;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.IntegrationRegistry;
import appeng.integration.IntegrationType;
@@ -45,10 +46,10 @@ public class PneumaticCraft extends BaseModule
@Reflected
public PneumaticCraft()
{
this.testClassExistence( pneumaticCraft.api.block.BlockSupplier.class );
this.testClassExistence( pneumaticCraft.api.tileentity.ISidedPneumaticMachine.class );
this.testClassExistence( pneumaticCraft.api.tileentity.AirHandlerSupplier.class );
this.testClassExistence( pneumaticCraft.api.tileentity.IAirHandler.class );
IntegrationHelper.testClassExistence( this, pneumaticCraft.api.block.BlockSupplier.class );
IntegrationHelper.testClassExistence( this, pneumaticCraft.api.tileentity.ISidedPneumaticMachine.class );
IntegrationHelper.testClassExistence( this, pneumaticCraft.api.tileentity.AirHandlerSupplier.class );
IntegrationHelper.testClassExistence( this, pneumaticCraft.api.tileentity.IAirHandler.class );
}
@Override
@@ -24,19 +24,22 @@ import net.minecraft.item.ItemStack;
import mods.railcraft.api.crafting.IRockCrusherRecipe;
import mods.railcraft.api.crafting.RailcraftCraftingManager;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.abstraction.IRC;
public class RC extends BaseModule implements IRC
{
@Reflected
public static RC instance;
@Reflected
public RC()
{
this.testClassExistence( RailcraftCraftingManager.class );
this.testClassExistence( IRockCrusherRecipe.class );
IntegrationHelper.testClassExistence( this, mods.railcraft.api.crafting.RailcraftCraftingManager.class );
IntegrationHelper.testClassExistence( this, mods.railcraft.api.crafting.IRockCrusherRecipe.class );
}
@Override
@@ -49,13 +52,10 @@ public class RC extends BaseModule implements IRC
@Override
public void init()
{
// TODO Auto-generated method stub
}
@Override
public void postInit()
{
}
}
@@ -25,9 +25,14 @@ import net.minecraftforge.oredict.OreDictionary;
import cpw.mods.fml.common.registry.GameRegistry;
import appeng.api.AEApi;
import appeng.api.IAppEngApi;
import appeng.api.config.TunnelType;
import appeng.api.parts.IPartHelper;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.IntegrationRegistry;
import appeng.integration.IntegrationType;
public final class RF extends BaseModule
@@ -35,17 +40,25 @@ public final class RF extends BaseModule
@Reflected
public static RF instance;
@Reflected
public RF()
{
this.testClassExistence( cofh.api.energy.IEnergyReceiver.class );
this.testClassExistence( cofh.api.energy.IEnergyProvider.class );
this.testClassExistence( cofh.api.energy.IEnergyHandler.class );
this.testClassExistence( cofh.api.energy.IEnergyConnection.class );
IntegrationHelper.testClassExistence( this, cofh.api.energy.IEnergyReceiver.class );
IntegrationHelper.testClassExistence( this, cofh.api.energy.IEnergyProvider.class );
IntegrationHelper.testClassExistence( this, cofh.api.energy.IEnergyHandler.class );
IntegrationHelper.testClassExistence( this, cofh.api.energy.IEnergyConnection.class );
}
@Override
public void init()
{
final IAppEngApi api = AEApi.instance();
final IPartHelper partHelper = api.partHelper();
if( IntegrationRegistry.INSTANCE.isEnabled( IntegrationType.RF ) )
{
partHelper.registerNewLayer( "appeng.parts.layers.LayerIEnergyHandler", "cofh.api.energy.IEnergyReceiver" );
}
}
@Override
@@ -19,28 +19,29 @@
package appeng.integration.modules;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
public class RFItem extends BaseModule
{
@Reflected
public static RFItem instance;
@Reflected
public RFItem()
{
this.testClassExistence( cofh.api.energy.IEnergyContainerItem.class );
IntegrationHelper.testClassExistence( this, cofh.api.energy.IEnergyContainerItem.class );
}
@Override
public void init()
{
}
@Override
public void postInit()
{
}
}
@@ -19,28 +19,30 @@
package appeng.integration.modules;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
public class RotaryCraft extends BaseModule
{
@Reflected
public static RotaryCraft instance;
@Reflected
public RotaryCraft()
{
this.testClassExistence( Reika.RotaryCraft.API.Power.AdvancedShaftPowerReceiver.class );
this.testClassExistence( Reika.RotaryCraft.API.Interfaces.Transducerable.class );
IntegrationHelper.testClassExistence( this, Reika.RotaryCraft.API.Power.AdvancedShaftPowerReceiver.class );
IntegrationHelper.testClassExistence( this, Reika.RotaryCraft.API.Interfaces.Transducerable.class );
}
@Override
public void init() throws Throwable
{
}
@Override
public void postInit()
{
}
}
@@ -24,7 +24,9 @@ import cpw.mods.fml.common.event.FMLInterModComms;
import mcp.mobius.waila.api.IWailaDataProvider;
import mcp.mobius.waila.api.IWailaRegistrar;
import appeng.helpers.Reflected;
import appeng.integration.BaseModule;
import appeng.integration.IntegrationHelper;
import appeng.integration.modules.waila.PartWailaDataProvider;
import appeng.integration.modules.waila.TileWailaDataProvider;
import appeng.tile.AEBaseTile;
@@ -32,8 +34,19 @@ import appeng.tile.AEBaseTile;
public class Waila extends BaseModule
{
@Reflected
public static Waila instance;
@Reflected
public Waila()
{
IntegrationHelper.testClassExistence( this, mcp.mobius.waila.api.IWailaDataProvider.class );
IntegrationHelper.testClassExistence( this, mcp.mobius.waila.api.IWailaRegistrar.class );
IntegrationHelper.testClassExistence( this, mcp.mobius.waila.api.IWailaConfigHandler.class );
IntegrationHelper.testClassExistence( this, mcp.mobius.waila.api.IWailaDataAccessor.class );
IntegrationHelper.testClassExistence( this, mcp.mobius.waila.api.ITaggedList.class );
}
public static void register( IWailaRegistrar registrar )
{
final IWailaDataProvider partHost = new PartWailaDataProvider();
@@ -51,15 +64,11 @@ public class Waila extends BaseModule
@Override
public void init() throws Throwable
{
this.testClassExistence( IWailaDataProvider.class );
this.testClassExistence( IWailaRegistrar.class );
FMLInterModComms.sendMessage( "Waila", "register", this.getClass().getName() + ".register" );
}
@Override
public void postInit()
{
// :P
}
}
@@ -48,13 +48,14 @@ import appeng.core.features.AEFeature;
import appeng.core.sync.GuiBridge;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketClick;
import appeng.integration.IntegrationType;
import appeng.items.AEBaseItem;
import appeng.items.contents.NetworkToolViewer;
import appeng.transformer.annotations.Integration.Interface;
import appeng.util.Platform;
@Interface( iface = "buildcraft.api.tools.IToolWrench", iname = "BuildCraftCore" )
@Interface( iface = "buildcraft.api.tools.IToolWrench", iname = IntegrationType.BuildCraftCore )
public class ToolNetworkTool extends AEBaseItem implements IGuiItem, IAEWrench, IToolWrench
{
@@ -29,12 +29,13 @@ import ic2.api.item.IElectricItemManager;
import ic2.api.item.ISpecialElectricItem;
import appeng.api.config.PowerUnits;
import appeng.integration.IntegrationType;
import appeng.transformer.annotations.Integration.Interface;
import appeng.transformer.annotations.Integration.InterfaceList;
import appeng.transformer.annotations.Integration.Method;
@InterfaceList( value = { @Interface( iface = "ic2.api.item.ISpecialElectricItem", iname = "IC2" ), @Interface( iface = "ic2.api.item.IElectricItemManager", iname = "IC2" ) } )
@InterfaceList( value = { @Interface( iface = "ic2.api.item.ISpecialElectricItem", iname = IntegrationType.IC2 ), @Interface( iface = "ic2.api.item.IElectricItemManager", iname = IntegrationType.IC2 ) } )
public abstract class IC2 extends AERootPoweredItem implements IElectricItemManager, ISpecialElectricItem
{
public IC2( double powerCapacity, Optional<String> subName )
@@ -135,7 +136,7 @@ public abstract class IC2 extends AERootPoweredItem implements IElectricItemMana
}
@Override
@Method( iname = "IC2" )
@Method( iname = IntegrationType.IC2 )
public IElectricItemManager getManager( ItemStack itemStack )
{
return this;
@@ -26,10 +26,11 @@ import net.minecraft.item.ItemStack;
import cofh.api.energy.IEnergyContainerItem;
import appeng.api.config.PowerUnits;
import appeng.integration.IntegrationType;
import appeng.transformer.annotations.Integration.Interface;
@Interface( iface = "cofh.api.energy.IEnergyContainerItem", iname = "RFItem" )
@Interface( iface = "cofh.api.energy.IEnergyContainerItem", iname = IntegrationType.RFItem )
public abstract class RedstoneFlux extends IC2 implements IEnergyContainerItem
{
public RedstoneFlux( double powerCapacity, Optional<String> subName )
@@ -34,12 +34,13 @@ import buildcraft.api.tools.IToolWrench;
import appeng.api.implementations.items.IAEWrench;
import appeng.api.util.DimensionalCoord;
import appeng.core.features.AEFeature;
import appeng.integration.IntegrationType;
import appeng.items.AEBaseItem;
import appeng.transformer.annotations.Integration.Interface;
import appeng.util.Platform;
@Interface( iface = "buildcraft.api.tools.IToolWrench", iname = "BuildCraftCore" )
@Interface( iface = "buildcraft.api.tools.IToolWrench", iname = IntegrationType.BuildCraftCore )
public class ToolQuartzWrench extends AEBaseItem implements IAEWrench, IToolWrench
{
+3 -3
View File
@@ -25,7 +25,6 @@ import java.util.Deque;
import java.util.EnumSet;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Callable;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
@@ -52,6 +51,7 @@ import appeng.api.util.IReadOnlyCollection;
import appeng.core.worlddata.WorldData;
import appeng.hooks.TickHandler;
import appeng.me.pathfinding.IPathItem;
import appeng.util.IWorldCallable;
import appeng.util.ReadOnlyCollection;
@@ -669,7 +669,7 @@ public class GridNode implements IGridNode, IPathItem
return this.lastUsedChannels;
}
private static class MachineSecurityBreak implements Callable<Void>
private static class MachineSecurityBreak implements IWorldCallable<Void>
{
private final GridNode node;
@@ -679,7 +679,7 @@ public class GridNode implements IGridNode, IPathItem
}
@Override
public Void call() throws Exception
public Void call(World world) throws Exception
{
this.node.getMachine().securityBreak();
+3 -3
View File
@@ -314,9 +314,9 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
{
this.craftingCPUClusters.add( cluster );
if( cluster.myLastLink != null )
if( cluster.getLastCraftingLink() != null )
{
this.addLink( (CraftingLink) cluster.myLastLink );
this.addLink( (CraftingLink) cluster.getLastCraftingLink() );
}
}
}
@@ -641,7 +641,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
while( this.iterator.hasNext() && this.cpuCluster == null )
{
this.cpuCluster = this.iterator.next();
if( !this.cpuCluster.isActive() || this.cpuCluster.isDestroyed )
if( !this.cpuCluster.isActive() || this.cpuCluster.isDestroyed() )
{
this.cpuCluster = null;
}
+5 -3
View File
@@ -20,13 +20,15 @@ package appeng.me.cache.helpers;
import java.util.HashMap;
import java.util.concurrent.Callable;
import net.minecraft.world.World;
import appeng.api.networking.IGridNode;
import appeng.parts.p2p.PartP2PTunnelME;
import appeng.util.IWorldCallable;
public class Connections implements Callable
public class Connections implements IWorldCallable<Void>
{
public final HashMap<IGridNode, TunnelConnection> connections = new HashMap<IGridNode, TunnelConnection>();
@@ -40,7 +42,7 @@ public class Connections implements Callable
}
@Override
public Object call() throws Exception
public Void call( World world ) throws Exception
{
this.me.updateConnections( this );
@@ -80,31 +80,31 @@ import appeng.util.Platform;
import appeng.util.item.AEItemStack;
public class CraftingCPUCluster implements IAECluster, ICraftingCPU
public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
{
public final WorldCoord min;
public final WorldCoord max;
final int[] usedOps = new int[3];
final Map<ICraftingPatternDetails, TaskProgress> tasks = new HashMap<ICraftingPatternDetails, TaskProgress>();
private final WorldCoord min;
private final WorldCoord max;
private final int[] usedOps = new int[3];
private final Map<ICraftingPatternDetails, TaskProgress> tasks = new HashMap<ICraftingPatternDetails, TaskProgress>();
// INSTANCE sate
private final LinkedList<TileCraftingTile> tiles = new LinkedList<TileCraftingTile>();
private final LinkedList<TileCraftingTile> storage = new LinkedList<TileCraftingTile>();
private final LinkedList<TileCraftingMonitorTile> status = new LinkedList<TileCraftingMonitorTile>();
private final HashMap<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new HashMap<IMEMonitorHandlerReceiver<IAEItemStack>, Object>();
public ICraftingLink myLastLink;
public String myName = "";
public boolean isDestroyed = false;
private ICraftingLink myLastLink;
private String myName = "";
private boolean isDestroyed = false;
/**
* crafting job info
*/
MECraftingInventory inventory = new MECraftingInventory();
IAEItemStack finalOutput;
boolean waiting = false;
IItemList<IAEItemStack> waitingFor = AEApi.instance().storage().createItemList();
long availableStorage = 0;
MachineSource machineSrc = null;
int accelerator = 0;
private MECraftingInventory inventory = new MECraftingInventory();
private IAEItemStack finalOutput;
private boolean waiting = false;
private IItemList<IAEItemStack> waitingFor = AEApi.instance().storage().createItemList();
private long availableStorage = 0;
private MachineSource machineSrc = null;
private int accelerator = 0;
private boolean isComplete = true;
private int remainingOperations;
private boolean somethingChanged;
@@ -120,6 +120,16 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
this.max = max;
}
public boolean isDestroyed()
{
return this.isDestroyed;
}
public ICraftingLink getLastCraftingLink()
{
return this.myLastLink;
}
/**
* add a new Listener to the monitor, be sure to properly remove yourself when your done.
*/
@@ -165,10 +175,10 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
for( TileCraftingTile r : this.tiles )
{
IGridNode n = r.getActionableNode();
final IGridNode n = r.getActionableNode();
if( n != null && !posted )
{
IGrid g = n.getGrid();
final IGrid g = n.getGrid();
if( g != null )
{
g.postEvent( new MENetworkCraftingCpuChange( n ) );
@@ -216,7 +226,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
{
if( input instanceof IAEItemStack )
{
IAEItemStack is = this.waitingFor.findPrecise( (IAEItemStack) input );
final IAEItemStack is = this.waitingFor.findPrecise( (IAEItemStack) input );
if( is != null && is.getStackSize() > 0 )
{
return true;
@@ -227,11 +237,16 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
public IAEStack injectItems( IAEStack input, Actionable type, BaseActionSource src )
{
if( input instanceof IAEItemStack && type == Actionable.SIMULATE )// causes crafting to lock up?
if( !( input instanceof IAEItemStack ) )
{
IAEItemStack what = (IAEItemStack) input.copy();
IAEItemStack is = this.waitingFor.findPrecise( what );
return input;
}
final IAEItemStack what = (IAEItemStack) input.copy();
final IAEItemStack is = this.waitingFor.findPrecise( what );
if( type == Actionable.SIMULATE )// causes crafting to lock up?
{
if( is != null && is.getStackSize() > 0 )
{
if( is.getStackSize() >= what.getStackSize() )
@@ -249,10 +264,10 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
return null;
}
IAEItemStack leftOver = what.copy();
final IAEItemStack leftOver = what.copy();
leftOver.decStackSize( is.getStackSize() );
IAEItemStack used = what.copy();
final IAEItemStack used = what.copy();
used.setStackSize( is.getStackSize() );
if( this.finalOutput.equals( what ) )
@@ -269,27 +284,33 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
return leftOver;
}
}
else if( input instanceof IAEItemStack && type == Actionable.MODULATE )
else if( type == Actionable.MODULATE )
{
IAEItemStack what = (IAEItemStack) input;
IAEItemStack is = this.waitingFor.findPrecise( what );
if( is != null && is.getStackSize() > 0 )
{
this.waiting = false;
this.postChange( (IAEItemStack) input, src );
this.postChange( what, src );
if( is.getStackSize() >= input.getStackSize() )
if( is.getStackSize() >= what.getStackSize() )
{
is.decStackSize( input.getStackSize() );
this.updateElapsedTime( (IAEItemStack) input );
is.decStackSize( what.getStackSize() );
this.updateElapsedTime( what );
this.markDirty();
this.postCraftingStatusChange( is );
if( this.finalOutput.equals( input ) )
if( this.finalOutput.equals( what ) )
{
this.finalOutput.decStackSize( input.getStackSize() );
IAEStack leftover = what;
this.finalOutput.decStackSize( what.getStackSize() );
if( this.myLastLink != null )
{
leftover = ( (CraftingLink) this.myLastLink ).injectItems( what, type );
}
if( this.finalOutput.getStackSize() <= 0 )
{
this.completeJob();
@@ -297,19 +318,14 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
this.updateCPU();
if( this.myLastLink != null )
{
return ( (CraftingLink) this.myLastLink ).injectItems( (IAEItemStack) input, type );
}
return input; // ignore it.
return leftover; // ignore it.
}
// 2000
return this.inventory.injectItems( what, type, src );
}
IAEItemStack insert = what.copy();
final IAEItemStack insert = what.copy();
insert.setStackSize( is.getStackSize() );
what.decStackSize( is.getStackSize() );
@@ -317,26 +333,25 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
if( this.finalOutput.equals( insert ) )
{
IAEStack leftover = input;
this.finalOutput.decStackSize( insert.getStackSize() );
if( this.myLastLink != null )
{
what.add( ( (CraftingLink) this.myLastLink ).injectItems( insert.copy(), type ) );
leftover = what;
}
if( this.finalOutput.getStackSize() <= 0 )
{
this.completeJob();
}
this.updateCPU();
this.markDirty();
if( this.myLastLink != null )
{
what.add( ( (CraftingLink) this.myLastLink ).injectItems( insert.copy(), type ) );
return what;
}
if( this.myLastLink != null )
{
return ( (CraftingLink) this.myLastLink ).injectItems( (IAEItemStack) input, type );
}
return input; // ignore it.
return leftover; // ignore it.
}
this.inventory.injectItems( insert, type, src );
@@ -351,29 +366,29 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
protected void postChange( IAEItemStack diff, BaseActionSource src )
{
Iterator<Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object>> i = this.getListeners();
ImmutableList<IAEItemStack> single = null;
final Iterator<Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object>> i = this.getListeners();
// protect integrity
if( i.hasNext() )
{
single = ImmutableList.of( diff.copy() );
final ImmutableList<IAEItemStack> single = ImmutableList.of( diff.copy() );
while( i.hasNext() )
{
final Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object> o = i.next();
final IMEMonitorHandlerReceiver<IAEItemStack> receiver = o.getKey();
if( receiver.isValid( o.getValue() ) )
{
receiver.postChange( null, single, src );
}
else
{
i.remove();
}
}
}
while( i.hasNext() )
{
Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object> o = i.next();
IMEMonitorHandlerReceiver<IAEItemStack> receiver = o.getKey();
if( receiver.isValid( o.getValue() ) )
{
receiver.postChange( null, single, src );
}
else
{
i.remove();
}
}
}
private void markDirty()
@@ -388,11 +403,11 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
return;
}
CraftingGridCache sg = this.getGrid().getCache( ICraftingGrid.class );
final CraftingGridCache sg = this.getGrid().getCache( ICraftingGrid.class );
if( sg.interestManager.containsKey( diff ) )
{
Collection<CraftingWatcher> list = sg.interestManager.get( diff );
final Collection<CraftingWatcher> list = sg.interestManager.get( diff );
if( !list.isEmpty() )
{
@@ -449,10 +464,10 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
{
for( TileCraftingTile r : this.tiles )
{
IGridNode gn = r.getActionableNode();
final IGridNode gn = r.getActionableNode();
if( gn != null )
{
IGrid g = gn.getGrid();
final IGrid g = gn.getGrid();
if( g != null )
{
return r.getActionableNode().getGrid();
@@ -476,8 +491,8 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
{
fuzz = fuzz.copy();
fuzz.setStackSize( g.getStackSize() );
IAEItemStack ais = this.inventory.extractItems( fuzz, Actionable.SIMULATE, this.machineSrc );
ItemStack is = ais == null ? null : ais.getItemStack();
final IAEItemStack ais = this.inventory.extractItems( fuzz, Actionable.SIMULATE, this.machineSrc );
final ItemStack is = ais == null ? null : ais.getItemStack();
if( is != null && is.stackSize == g.getStackSize() )
{
@@ -498,8 +513,8 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
}
else
{
IAEItemStack ais = this.inventory.extractItems( g.copy(), Actionable.SIMULATE, this.machineSrc );
ItemStack is = ais == null ? null : ais.getItemStack();
final IAEItemStack ais = this.inventory.extractItems( g.copy(), Actionable.SIMULATE, this.machineSrc );
final ItemStack is = ais == null ? null : ais.getItemStack();
if( is == null || is.stackSize < g.getStackSize() )
{
@@ -529,7 +544,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
this.myLastLink = null;
this.tasks.clear();
ImmutableSet<IAEItemStack> items = ImmutableSet.copyOf( this.waitingFor );
final ImmutableSet<IAEItemStack> items = ImmutableSet.copyOf( this.waitingFor );
this.waitingFor.resetStatus();
@@ -578,7 +593,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
}
this.remainingOperations = this.accelerator + 1 - ( this.usedOps[0] + this.usedOps[1] + this.usedOps[2] );
int started = this.remainingOperations;
final int started = this.remainingOperations;
if( this.remainingOperations > 0 )
{
@@ -601,17 +616,20 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
private void executeCrafting( IEnergyGrid eg, CraftingGridCache cc )
{
Iterator<Entry<ICraftingPatternDetails, TaskProgress>> i = this.tasks.entrySet().iterator();
final Iterator<Entry<ICraftingPatternDetails, TaskProgress>> i = this.tasks.entrySet().iterator();
while( i.hasNext() )
{
Entry<ICraftingPatternDetails, TaskProgress> e = i.next();
final Entry<ICraftingPatternDetails, TaskProgress> e = i.next();
if( e.getValue().value <= 0 )
{
i.remove();
continue;
}
ICraftingPatternDetails details = e.getKey();
final ICraftingPatternDetails details = e.getKey();
if( this.canCraft( details, details.getCondensedInputs() ) )
{
InventoryCrafting ic = null;
@@ -627,9 +645,9 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
{
if( ic == null )
{
IAEItemStack[] input = details.getInputs();
final IAEItemStack[] input = details.getInputs();
double sum = 0;
for( IAEItemStack anInput : input )
{
if( anInput != null )
@@ -649,10 +667,10 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
for( int x = 0; x < input.length; x++ )
{
if( input[x] != null )
{
found = false;
if( details.isCraftable() )
{
for( IAEItemStack fuzz : this.inventory.getItemList().findFuzzy( input[x], FuzzyMode.IGNORE_ALL ) )
@@ -662,8 +680,8 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
if( details.isValidItemForSlot( x, fuzz.getItemStack(), this.getWorld() ) )
{
IAEItemStack ais = this.inventory.extractItems( fuzz, Actionable.MODULATE, this.machineSrc );
ItemStack is = ais == null ? null : ais.getItemStack();
final IAEItemStack ais = this.inventory.extractItems( fuzz, Actionable.MODULATE, this.machineSrc );
final ItemStack is = ais == null ? null : ais.getItemStack();
if( is != null )
{
@@ -677,8 +695,8 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
}
else
{
IAEItemStack ais = this.inventory.extractItems( input[x].copy(), Actionable.MODULATE, this.machineSrc );
ItemStack is = ais == null ? null : ais.getItemStack();
final IAEItemStack ais = this.inventory.extractItems( input[x].copy(), Actionable.MODULATE, this.machineSrc );
final ItemStack is = ais == null ? null : ais.getItemStack();
if( is != null )
{
@@ -704,7 +722,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
// put stuff back..
for( int x = 0; x < ic.getSizeInventory(); x++ )
{
ItemStack is = ic.getStackInSlot( x );
final ItemStack is = ic.getStackInSlot( x );
if( is != null )
{
this.inventory.injectItems( AEItemStack.create( is ), Actionable.MODULATE, this.machineSrc );
@@ -733,10 +751,10 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
for( int x = 0; x < ic.getSizeInventory(); x++ )
{
ItemStack output = Platform.getContainerItem( ic.getStackInSlot( x ) );
final ItemStack output = Platform.getContainerItem( ic.getStackInSlot( x ) );
if( output != null )
{
IAEItemStack cItem = AEItemStack.create( output );
final IAEItemStack cItem = AEItemStack.create( output );
this.postChange( cItem, this.machineSrc );
this.waitingFor.add( cItem );
this.postCraftingStatusChange( cItem );
@@ -766,7 +784,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
// put stuff back..
for( int x = 0; x < ic.getSizeInventory(); x++ )
{
ItemStack is = ic.getStackInSlot( x );
final ItemStack is = ic.getStackInSlot( x );
if( is != null )
{
this.inventory.injectItems( AEItemStack.create( is ), Actionable.MODULATE, this.machineSrc );
@@ -779,14 +797,15 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
private void storeItems()
{
IGrid g = this.getGrid();
final IGrid g = this.getGrid();
if( g == null )
{
return;
}
IStorageGrid sg = g.getCache( IStorageGrid.class );
IMEInventory<IAEItemStack> ii = sg.getItemInventory();
final IStorageGrid sg = g.getCache( IStorageGrid.class );
final IMEInventory<IAEItemStack> ii = sg.getItemInventory();
for( IAEItemStack is : this.inventory.getItemList() )
{
@@ -829,9 +848,9 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
return null;
}
IStorageGrid sg = g.getCache( IStorageGrid.class );
IMEInventory<IAEItemStack> storage = sg.getItemInventory();
MECraftingInventory ci = new MECraftingInventory( storage, true, false, false );
final IStorageGrid sg = g.getCache( IStorageGrid.class );
final IMEInventory<IAEItemStack> storage = sg.getItemInventory();
final MECraftingInventory ci = new MECraftingInventory( storage, true, false, false );
try
{
@@ -845,7 +864,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
this.markDirty();
this.updateCPU();
String craftID = this.generateCraftingID();
final String craftID = this.generateCraftingID();
this.myLastLink = new CraftingLink( this.generateLinkData( craftID, requestingMachine == null, false ), this );
@@ -856,12 +875,12 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
return this.myLastLink;
}
ICraftingLink whatLink = new CraftingLink( this.generateLinkData( craftID, false, true ), requestingMachine );
final ICraftingLink whatLink = new CraftingLink( this.generateLinkData( craftID, false, true ), requestingMachine );
this.submitLink( this.myLastLink );
this.submitLink( whatLink );
IItemList<IAEItemStack> list = AEApi.instance().storage().createItemList();
final IItemList<IAEItemStack> list = AEApi.instance().storage().createItemList();
this.getListOfItem( list, CraftingItemList.ALL );
for( IAEItemStack ge : list )
{
@@ -889,7 +908,8 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
@Override
public boolean isBusy()
{
Iterator<Entry<ICraftingPatternDetails, TaskProgress>> i = this.tasks.entrySet().iterator();
final Iterator<Entry<ICraftingPatternDetails, TaskProgress>> i = this.tasks.entrySet().iterator();
while( i.hasNext() )
{
if( i.next().getValue().value <= 0 )
@@ -927,13 +947,14 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
public boolean isActive()
{
TileCraftingTile core = this.getCore();
final TileCraftingTile core = this.getCore();
if( core == null )
{
return false;
}
IGridNode node = core.getActionableNode();
final IGridNode node = core.getActionableNode();
if( node == null )
{
return false;
@@ -944,16 +965,16 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
private String generateCraftingID()
{
long now = System.currentTimeMillis();
int hash = System.identityHashCode( this );
int hmm = this.finalOutput == null ? 0 : this.finalOutput.hashCode();
final long now = System.currentTimeMillis();
final int hash = System.identityHashCode( this );
final int hmm = this.finalOutput == null ? 0 : this.finalOutput.hashCode();
return Long.toString( now, Character.MAX_RADIX ) + '-' + Integer.toString( hash, Character.MAX_RADIX ) + '-' + Integer.toString( hmm, Character.MAX_RADIX );
}
private NBTTagCompound generateLinkData( String craftingID, boolean standalone, boolean req )
{
NBTTagCompound tag = new NBTTagCompound();
final NBTTagCompound tag = new NBTTagCompound();
tag.setString( "CraftID", craftingID );
tag.setBoolean( "canceled", false );
@@ -968,7 +989,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
{
if( this.getGrid() != null )
{
CraftingGridCache cc = this.getGrid().getCache( ICraftingGrid.class );
final CraftingGridCache cc = this.getGrid().getCache( ICraftingGrid.class );
cc.addLink( (CraftingLink) myLastLink2 );
}
}
@@ -1045,6 +1066,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
public IAEItemStack getItemStack( IAEItemStack what, CraftingItemList storage2 )
{
IAEItemStack is;
switch( storage2 )
{
case STORAGE:
@@ -1094,15 +1116,15 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
if( this.myLastLink != null )
{
NBTTagCompound link = new NBTTagCompound();
final NBTTagCompound link = new NBTTagCompound();
this.myLastLink.writeToNBT( link );
data.setTag( "link", link );
}
NBTTagList list = new NBTTagList();
final NBTTagList list = new NBTTagList();
for( Entry<ICraftingPatternDetails, TaskProgress> e : this.tasks.entrySet() )
{
NBTTagCompound item = this.writeItem( AEItemStack.create( e.getKey().getPattern() ) );
final NBTTagCompound item = this.writeItem( AEItemStack.create( e.getKey().getPattern() ) );
item.setLong( "craftingProgress", e.getValue().value );
list.appendTag( item );
}
@@ -1117,7 +1139,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
private NBTTagCompound writeItem( IAEItemStack finalOutput2 )
{
NBTTagCompound out = new NBTTagCompound();
final NBTTagCompound out = new NBTTagCompound();
if( finalOutput2 != null )
{
@@ -1129,7 +1151,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
private NBTTagList writeList( IItemList<IAEItemStack> myList )
{
NBTTagList out = new NBTTagList();
final NBTTagList out = new NBTTagList();
for( IAEItemStack ais : myList )
{
@@ -1141,7 +1163,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
public void done()
{
TileCraftingTile core = this.getCore();
final TileCraftingTile core = this.getCore();
core.isCoreBlock = true;
@@ -1168,23 +1190,23 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
if( data.hasKey( "link" ) )
{
NBTTagCompound link = data.getCompoundTag( "link" );
final NBTTagCompound link = data.getCompoundTag( "link" );
this.myLastLink = new CraftingLink( link, this );
this.submitLink( this.myLastLink );
}
NBTTagList list = data.getTagList( "tasks", 10 );
final NBTTagList list = data.getTagList( "tasks", 10 );
for( int x = 0; x < list.tagCount(); x++ )
{
NBTTagCompound item = list.getCompoundTagAt( x );
IAEItemStack pattern = AEItemStack.loadItemStackFromNBT( item );
final NBTTagCompound item = list.getCompoundTagAt( x );
final IAEItemStack pattern = AEItemStack.loadItemStackFromNBT( item );
if( pattern != null && pattern.getItem() instanceof ICraftingPatternItem )
{
ICraftingPatternItem cpi = (ICraftingPatternItem) pattern.getItem();
ICraftingPatternDetails details = cpi.getPatternForItem( pattern.getItemStack(), this.getWorld() );
final ICraftingPatternItem cpi = (ICraftingPatternItem) pattern.getItem();
final ICraftingPatternDetails details = cpi.getPatternForItem( pattern.getItemStack(), this.getWorld() );
if( details != null )
{
TaskProgress tp = new TaskProgress();
final TaskProgress tp = new TaskProgress();
tp.value = item.getLong( "craftingProgress" );
this.tasks.put( details, tp );
}
@@ -1225,7 +1247,8 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
private IItemList<IAEItemStack> readList( NBTTagList tag )
{
IItemList<IAEItemStack> out = AEApi.instance().storage().createItemList();
final IItemList<IAEItemStack> out = AEApi.instance().storage().createItemList();
if( tag == null )
{
return out;
@@ -1233,7 +1256,7 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
for( int x = 0; x < tag.tagCount(); x++ )
{
IAEItemStack ais = AEItemStack.loadItemStackFromNBT( tag.getCompoundTagAt( x ) );
final IAEItemStack ais = AEItemStack.loadItemStackFromNBT( tag.getCompoundTagAt( x ) );
if( ais != null )
{
out.add( ais );
@@ -1250,13 +1273,14 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
public boolean isMaking( IAEItemStack what )
{
IAEItemStack wat = this.waitingFor.findPrecise( what );
final IAEItemStack wat = this.waitingFor.findPrecise( what );
return wat != null && wat.getStackSize() > 0;
}
public void breakCluster()
{
TileCraftingTile t = this.getCore();
final TileCraftingTile t = this.getCore();
if( t != null )
{
t.breakCluster();
@@ -1267,9 +1291,10 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
{
this.lastTime = System.nanoTime();
this.elapsedTime = 0;
int itemCount = 0;
IItemList<IAEItemStack> list = AEApi.instance().storage().createItemList();
int itemCount = 0;
final IItemList<IAEItemStack> list = AEApi.instance().storage().createItemList();
this.getListOfItem( list, CraftingItemList.ACTIVE );
this.getListOfItem( list, CraftingItemList.PENDING );
@@ -1307,7 +1332,6 @@ public class CraftingCPUCluster implements IAECluster, ICraftingCPU
static class TaskProgress
{
long value;
}
}
@@ -395,6 +395,7 @@ public class CellInventory implements ICellInventory
* if ( tagType instanceof NBTTagShort ) ((NBTTagShort) tagType).data = storedItems = (short) cellItems.size();
* else
*/
this.storedItems = (short) this.cellItems.size();
if( this.cellItems.isEmpty() )
{
this.tagCompound.removeTag( ITEM_TYPE_TAG );
@@ -403,11 +404,11 @@ public class CellInventory implements ICellInventory
{
this.tagCompound.setShort( ITEM_TYPE_TAG, this.storedItems );
}
this.storedItems = (short) this.cellItems.size();
/*
* if ( tagCount instanceof NBTTagInt ) ((NBTTagInt) tagCount).data = storedItemCount = itemCount; else
*/
this.storedItemCount = itemCount;
if( itemCount == 0 )
{
this.tagCompound.removeTag( ITEM_COUNT_TAG );
@@ -416,7 +417,6 @@ public class CellInventory implements ICellInventory
{
this.tagCompound.setInteger( ITEM_COUNT_TAG, itemCount );
}
this.storedItemCount = itemCount;
// clean any old crusty stuff...
for( ; x < oldStoredItems && x < this.maxItemTypes; x++ )
@@ -113,11 +113,16 @@ public class NetworkInventoryHandler<T extends IAEStack<T>> implements IMEInvent
}
}
// We need to ignore prioritized inventories in the second pass. If they were not able to store everything
// during the first pass, they will do so in the second, but as this is stateless we will just report twice
// the amount of storable items.
// ignores craftingcache on the second pass.
ii = invList.iterator();
while( ii.hasNext() && input != null )
{
IMEInventoryHandler<T> inv = ii.next();
if( inv.validForPass( 2 ) && inv.canAccept( input ) )// ignore crafting on the second pass.
if( inv.validForPass( 2 ) && inv.canAccept( input ) && !inv.isPrioritized( input ) )
{
input = inv.injectItems( input, type, src );
}
@@ -20,7 +20,6 @@ package appeng.parts.automation;
import java.util.List;
import java.util.concurrent.Callable;
import com.google.common.collect.Lists;
@@ -34,6 +33,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraftforge.common.util.ForgeDirection;
@@ -65,11 +65,12 @@ import appeng.hooks.TickHandler;
import appeng.me.GridAccessException;
import appeng.parts.PartBasicState;
import appeng.server.ServerHelper;
import appeng.util.IWorldCallable;
import appeng.util.Platform;
import appeng.util.item.AEItemStack;
public class PartAnnihilationPlane extends PartBasicState implements IGridTickable, Callable<TickRateModulation>
public class PartAnnihilationPlane extends PartBasicState implements IGridTickable, IWorldCallable<TickRateModulation>
{
private final static IIcon SIDE_ICON = CableBusTextures.PartPlaneSides.getIcon();
private final static IIcon BACK_ICON = CableBusTextures.PartTransitionPlaneBack.getIcon();
@@ -86,7 +87,7 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
}
@Override
public TickRateModulation call() throws Exception
public TickRateModulation call( World world ) throws Exception
{
this.breaking = false;
return this.breakBlock( true );
@@ -358,7 +359,36 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
entityItem.getEntityItem().stackSize = newStackSize;
return changed;
}
/**
* Spawns an overflow item as new {@link EntityItem} into the {@link World}
*
* @param w the world to spawn it
* @param x x coordinate
* @param y y coordinate
* @param z coordinate
* @param overflow the item to spawn
*/
private void spawnOverflow( IAEItemStack overflow )
{
if( overflow == null )
{
return;
}
final TileEntity te = this.getTile();
final WorldServer w = (WorldServer) te.getWorldObj();
final double x = te.xCoord + this.side.offsetX + .5d;
final double y = te.yCoord + this.side.offsetY + .5d;
final double z = te.zCoord + this.side.offsetZ + .5d;
final EntityItem overflowEntity = new EntityItem( w, x, y, z, overflow.getItemStack() );
overflowEntity.motionX = 0;
overflowEntity.motionY = 0;
overflowEntity.motionZ = 0;
w.spawnEntityInWorld( overflowEntity );
}
protected boolean isAnnihilationPlane( TileEntity blockTileEntity, ForgeDirection side )
@@ -544,7 +574,8 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
for( final ItemStack snaggedItem : items )
{
this.storeItemStack( snaggedItem );
final IAEItemStack overflow = this.storeItemStack( snaggedItem );
this.spawnOverflow( overflow );
}
}
}
@@ -54,6 +54,7 @@ import appeng.me.GridAccessException;
import appeng.util.InventoryAdaptor;
import appeng.util.Platform;
import appeng.util.inv.IInventoryDestination;
import appeng.util.item.AEItemStack;
public class PartImportBus extends PartSharedItemBus implements IInventoryDestination
@@ -238,8 +239,8 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin
private boolean importStuff( InventoryAdaptor myAdaptor, IAEItemStack whatToImport, IMEMonitor<IAEItemStack> inv, IEnergySource energy, FuzzyMode fzMode )
{
final int toSend = Math.min( this.itemToSend, 64 );
ItemStack newItems;
final int toSend = this.calculateMaximumAmountToImport( myAdaptor, whatToImport, inv, fzMode );
final ItemStack newItems;
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
{
@@ -264,8 +265,8 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin
this.lastItemChecked.setStackSize( newItems.stackSize );
}
IAEItemStack failed = Platform.poweredInsert( energy, this.destination, this.lastItemChecked, this.source );
// destination.injectItems( lastItemChecked, Actionable.MODULATE );
final IAEItemStack failed = Platform.poweredInsert( energy, this.destination, this.lastItemChecked, this.source );
if( failed != null )
{
myAdaptor.addItems( failed.getItemStack() );
@@ -284,6 +285,41 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin
return false;
}
private int calculateMaximumAmountToImport( InventoryAdaptor myAdaptor, IAEItemStack whatToImport, IMEMonitor<IAEItemStack> inv, FuzzyMode fzMode )
{
final int toSend = Math.min( this.itemToSend, 64 );
final ItemStack simResult;
final IAEItemStack itemAmountNotStorable;
final ItemStack itemStackToImport;
if( whatToImport == null )
{
itemStackToImport = null;
}
else
{
itemStackToImport = whatToImport.getItemStack();
}
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
{
simResult = myAdaptor.simulateSimilarRemove( toSend, itemStackToImport, fzMode, this.configDestination( inv ) );
itemAmountNotStorable = this.destination.injectItems( AEItemStack.create( simResult ), Actionable.SIMULATE, this.source );
}
else
{
simResult = myAdaptor.simulateRemove( toSend, itemStackToImport, this.configDestination( inv ) );
itemAmountNotStorable = this.destination.injectItems( AEItemStack.create( simResult ), Actionable.SIMULATE, this.source );
}
if( itemAmountNotStorable != null )
{
return (int) Math.min( simResult.stackSize - itemAmountNotStorable.getStackSize(), toSend );
}
return toSend;
}
private IInventoryDestination configDestination( IMEMonitor<IAEItemStack> itemInventory )
{
this.destination = itemInventory;
@@ -77,6 +77,7 @@ import appeng.core.sync.GuiBridge;
import appeng.helpers.IInterfaceHost;
import appeng.helpers.IPriorityHost;
import appeng.helpers.Reflected;
import appeng.integration.IntegrationType;
import appeng.me.GridAccessException;
import appeng.me.storage.MEInventoryHandler;
import appeng.me.storage.MEMonitorIInventory;
@@ -90,7 +91,7 @@ import appeng.util.prioitylist.FuzzyPriorityList;
import appeng.util.prioitylist.PrecisePriorityList;
@Interface( iname = "BuildCraftTransport", iface = "buildcraft.api.transport.IPipeConnection" )
@Interface( iname = IntegrationType.BuildCraftTransport, iface = "buildcraft.api.transport.IPipeConnection" )
public class PartStorageBus extends PartUpgradeable implements IGridTickable, ICellContainer, IMEMonitorHandlerReceiver<IAEItemStack>, IPipeConnection, IPriorityHost
{
final BaseActionSource mySrc;
@@ -565,7 +566,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
}
@Override
@Method( iname = "BuildCraftTransport" )
@Method( iname = IntegrationType.BuildCraftTransport )
public ConnectOverride overridePipeConnection( PipeType type, ForgeDirection with )
{
return type == PipeType.ITEM && with == this.side ? ConnectOverride.CONNECT : ConnectOverride.DISCONNECT;
@@ -32,6 +32,7 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import appeng.api.config.PowerUnits;
import appeng.integration.IntegrationType;
import appeng.me.GridAccessException;
import appeng.me.cache.helpers.TunnelCollection;
import appeng.transformer.annotations.Integration.Interface;
@@ -39,7 +40,7 @@ import appeng.transformer.annotations.Integration.InterfaceList;
import appeng.util.Platform;
@InterfaceList( value = { @Interface( iface = "ic2.api.energy.tile.IEnergySink", iname = "IC2" ), @Interface( iface = "ic2.api.energy.tile.IEnergySource", iname = "IC2" ) } )
@InterfaceList( value = { @Interface( iface = "ic2.api.energy.tile.IEnergySink", iname = IntegrationType.IC2 ), @Interface( iface = "ic2.api.energy.tile.IEnergySource", iname = IntegrationType.IC2 ) } )
public class PartP2PIC2Power extends PartP2PTunnel<PartP2PIC2Power> implements ic2.api.energy.tile.IEnergySink, ic2.api.energy.tile.IEnergySource
{
@@ -61,7 +61,7 @@ import appeng.util.inv.WrapperChainedInventory;
import appeng.util.inv.WrapperMCISidedInventory;
@Interface( iface = "buildcraft.api.transport.IPipeConnection", iname = "BuildCraftTransport" )
@Interface( iface = "buildcraft.api.transport.IPipeConnection", iname = IntegrationType.BuildCraftTransport )
public class PartP2PItems extends PartP2PTunnel<PartP2PItems> implements IPipeConnection, ISidedInventory, IGridTickable
{
@@ -384,7 +384,7 @@ public class PartP2PItems extends PartP2PTunnel<PartP2PItems> implements IPipeCo
}
@Override
@Method( iname = "BuildCraftTransport" )
@Method( iname = IntegrationType.BuildCraftTransport )
public ConnectOverride overridePipeConnection( PipeType type, ForgeDirection with )
{
return this.side == with && type == PipeType.ITEM ? ConnectOverride.CONNECT : ConnectOverride.DEFAULT;
@@ -19,13 +19,12 @@
package appeng.parts.p2p;
import java.util.concurrent.Callable;
import javax.annotation.Nullable;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.relauncher.Side;
@@ -52,15 +51,16 @@ import appeng.integration.IntegrationType;
import appeng.me.GridAccessException;
import appeng.transformer.annotations.Integration.Interface;
import appeng.transformer.annotations.Integration.InterfaceList;
import appeng.util.IWorldCallable;
@InterfaceList( value = { @Interface( iface = "li.cil.oc.api.network.Environment", iname = "OpenComputers" ), @Interface( iface = "li.cil.oc.api.network.SidedEnvironment", iname = "OpenComputers" ) } )
@InterfaceList( value = { @Interface( iface = "li.cil.oc.api.network.Environment", iname = IntegrationType.OpenComputers ), @Interface( iface = "li.cil.oc.api.network.SidedEnvironment", iname = IntegrationType.OpenComputers ) } )
public final class PartP2POpenComputers extends PartP2PTunnel<PartP2POpenComputers> implements IGridTickable, Environment, SidedEnvironment
{
@Nullable
private final Node node;
private final Callable<Void> updateCallback;
private final IWorldCallable<Void> updateCallback;
public PartP2POpenComputers( ItemStack is )
{
@@ -239,11 +239,11 @@ public final class PartP2POpenComputers extends PartP2PTunnel<PartP2POpenCompute
return side == this.side;
}
private final class UpdateCallback implements Callable<Void>
private final class UpdateCallback implements IWorldCallable<Void>
{
@Nullable
@Override
public Void call() throws Exception
public Void call( World world ) throws Exception
{
PartP2POpenComputers.this.updateConnections();
@@ -38,11 +38,12 @@ import appeng.api.networking.ticking.IGridTickable;
import appeng.api.networking.ticking.TickRateModulation;
import appeng.api.networking.ticking.TickingRequest;
import appeng.core.settings.TickRates;
import appeng.integration.IntegrationType;
import appeng.transformer.annotations.Integration.Interface;
import appeng.util.Platform;
@Interface( iface = "pneumaticCraft.api.tileentity.ISidedPneumaticMachine", iname = "PneumaticCraft" )
@Interface( iface = "pneumaticCraft.api.tileentity.ISidedPneumaticMachine", iname = IntegrationType.PneumaticCraft )
public final class PartP2PPressure extends PartP2PTunnel<PartP2PPressure> implements ISidedPneumaticMachine, IGridTickable
{
private static final String PRESSURE_NBT_TAG = "pneumaticCraft";
@@ -33,6 +33,7 @@ import cpw.mods.fml.relauncher.SideOnly;
import cofh.api.energy.IEnergyReceiver;
import appeng.api.config.PowerUnits;
import appeng.integration.IntegrationType;
import appeng.integration.modules.helpers.NullRFHandler;
import appeng.me.GridAccessException;
import appeng.transformer.annotations.Integration.Interface;
@@ -40,7 +41,7 @@ import appeng.transformer.annotations.Integration.InterfaceList;
import appeng.util.Platform;
@InterfaceList( value = { @Interface( iface = "cofh.api.energy.IEnergyReceiver", iname = "RF" ) } )
@InterfaceList( value = { @Interface( iface = "cofh.api.energy.IEnergyReceiver", iname = IntegrationType.RF ) } )
public final class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements IEnergyReceiver
{
private static final ThreadLocal<Stack<PartP2PRFPower>> THREAD_STACK = new ThreadLocal<Stack<PartP2PRFPower>>();
@@ -79,6 +79,7 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
{
private static final IWideReadableNumberConverter NUMBER_CONVERTER = ReadableNumberConverter.INSTANCE;
private IAEItemStack configuredItem;
private String lastHumanReadableText;
private boolean isLocked;
private IStackWatcher myWatcher;
@SideOnly( Side.CLIENT )
@@ -177,6 +178,7 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
final TileEntity te = this.tile;
final ItemStack eq = player.getCurrentEquippedItem();
if( Platform.isWrench( player, eq, te.xCoord, te.yCoord, te.zCoord ) )
{
this.isLocked = !this.isLocked;
@@ -249,6 +251,7 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
protected void finalize() throws Throwable
{
super.finalize();
if( this.dspList != null )
{
GLAllocation.deleteDisplayLists( this.dspList );
@@ -272,6 +275,7 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
}
final IAEItemStack ais = (IAEItemStack) this.getDisplayed();
if( ais != null )
{
GL11.glPushMatrix();
@@ -310,46 +314,41 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
// GL11.glPushAttrib( GL11.GL_ALL_ATTRIB_BITS );
final ForgeDirection d = this.side;
GL11.glTranslated( d.offsetX * 0.77, d.offsetY * 0.77, d.offsetZ * 0.77 );
if( d == ForgeDirection.UP )
switch( d )
{
GL11.glScalef( 1.0f, -1.0f, 1.0f );
GL11.glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
GL11.glRotatef( this.getSpin() * 90.0F, 0, 0, 1 );
case UP:
GL11.glScalef( 1.0f, -1.0f, 1.0f );
GL11.glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
GL11.glRotatef( this.getSpin() * 90.0F, 0, 0, 1 );
break;
case DOWN:
GL11.glScalef( 1.0f, -1.0f, 1.0f );
GL11.glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
GL11.glRotatef( this.getSpin() * -90.0F, 0, 0, 1 );
break;
case EAST:
GL11.glScalef( -1.0f, -1.0f, -1.0f );
GL11.glRotatef( -90.0f, 0.0f, 1.0f, 0.0f );
break;
case WEST:
GL11.glScalef( -1.0f, -1.0f, -1.0f );
GL11.glRotatef( 90.0f, 0.0f, 1.0f, 0.0f );
break;
case NORTH:
GL11.glScalef( -1.0f, -1.0f, -1.0f );
break;
case SOUTH:
GL11.glScalef( -1.0f, -1.0f, -1.0f );
GL11.glRotatef( 180.0f, 0.0f, 1.0f, 0.0f );
break;
default:
break;
}
if( d == ForgeDirection.DOWN )
{
GL11.glScalef( 1.0f, -1.0f, 1.0f );
GL11.glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
GL11.glRotatef( this.getSpin() * -90.0F, 0, 0, 1 );
}
if( d == ForgeDirection.EAST )
{
GL11.glScalef( -1.0f, -1.0f, -1.0f );
GL11.glRotatef( -90.0f, 0.0f, 1.0f, 0.0f );
}
if( d == ForgeDirection.WEST )
{
GL11.glScalef( -1.0f, -1.0f, -1.0f );
GL11.glRotatef( 90.0f, 0.0f, 1.0f, 0.0f );
}
if( d == ForgeDirection.NORTH )
{
GL11.glScalef( -1.0f, -1.0f, -1.0f );
}
if( d == ForgeDirection.SOUTH )
{
GL11.glScalef( -1.0f, -1.0f, -1.0f );
GL11.glRotatef( 180.0f, 0.0f, 1.0f, 0.0f );
}
// GL11.glPushMatrix();
try
{
final ItemStack sis = ais.getItemStack();
@@ -379,8 +378,6 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
GL11.glEnable( GL12.GL_RESCALE_NORMAL );
}
// GL11.glPopMatrix();
GL11.glTranslatef( 0.0f, 0.14f, -0.24f );
GL11.glScalef( 1.0f / 62.0f, 1.0f / 62.0f, 1.0f / 62.0f );
@@ -422,7 +419,14 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
this.configuredItem.setStackSize( fullStack.getStackSize() );
}
this.getHost().markForUpdate();
final long stackSize = this.configuredItem.getStackSize();
final String humanReadableText = NUMBER_CONVERTER.toWideReadableForm( stackSize );
if( !humanReadableText.equals( this.lastHumanReadableText ) )
{
this.lastHumanReadableText = humanReadableText;
this.getHost().markForUpdate();
}
}
}
@@ -88,22 +88,60 @@ public class RecipeResourceCopier
Preconditions.checkNotNull( destination );
Preconditions.checkArgument( destination.isDirectory() );
final String[] listing = this.getResourceListing( this.getClass(), this.root );
this.copyTo( destination, this.root );
}
/**
* @see {RecipeResourceCopier#copyTo(File)}
*
* @param destination destination folder to which the recipes are copied to
* @param directory the folder to copy.
*
* @throws URISyntaxException {@see #getResourceListing}
* @throws IOException {@see #getResourceListing} and if copying the detected resource to file is not possible
*/
private void copyTo( File destination, String directory ) throws URISyntaxException, IOException
{
assert destination != null;
assert directory != null;
final String[] listing = this.getResourceListing( this.getClass(), directory );
for( String list : listing )
{
if( list.endsWith( ".recipe" ) || list.endsWith( ".html" ) )
{
final InputStream inStream = this.getClass().getResourceAsStream( '/' + this.root + list );
final File outFile = new File( destination, list );
if( !outFile.exists() )
{
if( inStream != null )
{
FileUtils.copyInputStreamToFile( inStream, outFile );
inStream.close();
}
}
this.copyFile( destination, directory, list );
}
else if( !list.contains( "." ) )
{
final File subDirectory = new File( destination, list );
FileUtils.forceMkdir( subDirectory );
this.copyTo( subDirectory, directory + list + "/" );
}
}
}
/**
* Copies a single file inside a folder to the destination.
*
* @param destination folder to which the file is copied to
* @param directory the directory containing the file
* @param fileName the fily to copy
*
* @throws IOException if copying the file is not possible
*/
private void copyFile( File destination, String directory, String fileName ) throws IOException
{
assert destination != null;
assert fileName != null;
final InputStream inStream = this.getClass().getResourceAsStream( '/' + directory + fileName );
final File outFile = new File( destination, fileName );
if( !outFile.exists() && inStream != null )
{
FileUtils.copyInputStreamToFile( inStream, outFile );
inStream.close();
}
}
@@ -35,11 +35,15 @@ import com.google.common.base.Preconditions;
import net.minecraft.block.Block;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.event.world.WorldEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import appeng.api.AEApi;
import appeng.api.util.DimensionalCoord;
import appeng.services.compass.CompassReader;
import appeng.services.compass.ICompassCallback;
import appeng.util.Platform;
public final class CompassService
@@ -71,6 +75,22 @@ public final class CompassService
return this.executor.submit( new CMDirectionRequest( coord, maxRange, cc ) );
}
/**
* Ensure the a compass service is removed once a world gets unloaded by forge.
*
* @param event the event containing the unloaded world.
*/
@SubscribeEvent
public void unloadWorld( WorldEvent.Unload event )
{
if( Platform.isServer() && this.worldSet.containsKey( event.world ) )
{
final CompassReader compassReader = this.worldSet.remove( event.world );
compassReader.close();
}
}
public int jobSize()
{
return this.jobSize;
@@ -78,7 +98,7 @@ public final class CompassService
public void cleanUp()
{
for( CompassReader cr : this.worldSet.values() )
for( final CompassReader cr : this.worldSet.values() )
{
cr.close();
}
@@ -86,8 +106,8 @@ public final class CompassService
public void updateArea( World w, int chunkX, int chunkZ )
{
int x = chunkX << 4;
int z = chunkZ << 4;
final int x = chunkX << 4;
final int z = chunkZ << 4;
this.updateArea( w, x, CHUNK_SIZE, z );
this.updateArea( w, x, CHUNK_SIZE + 32, z );
@@ -104,17 +124,17 @@ public final class CompassService
{
this.jobSize++;
int cx = x >> 4;
int cdy = y >> 5;
int cz = z >> 4;
final int cx = x >> 4;
final int cdy = y >> 5;
final int cz = z >> 4;
int low_y = cdy << 5;
int hi_y = low_y + 32;
final int low_y = cdy << 5;
final int hi_y = low_y + 32;
// lower level...
Chunk c = w.getChunkFromBlockCoords( x, z );
final Chunk c = w.getChunkFromBlockCoords( x, z );
for( Block skyStoneBlock : AEApi.instance().definitions().blocks().skyStone().maybeBlock().asSet() )
for( final Block skyStoneBlock : AEApi.instance().definitions().blocks().skyStone().maybeBlock().asSet() )
{
for( int i = 0; i < CHUNK_SIZE; i++ )
{
@@ -122,7 +142,7 @@ public final class CompassService
{
for( int k = low_y; k < hi_y; k++ )
{
Block blk = c.getBlock( i, k, j );
final Block blk = c.getBlock( i, k, j );
if( blk == skyStoneBlock && c.getBlockMetadata( i, k, j ) == 0 )
{
return this.executor.submit( new CMUpdatePost( w, cx, cz, cdy, true ) );
@@ -135,6 +155,28 @@ public final class CompassService
return this.executor.submit( new CMUpdatePost( w, cx, cz, cdy, false ) );
}
public void kill()
{
this.executor.shutdown();
try
{
this.executor.awaitTermination( 6, TimeUnit.MINUTES );
this.jobSize = 0;
for( final CompassReader cr : this.worldSet.values() )
{
cr.close();
}
this.worldSet.clear();
}
catch( final InterruptedException e )
{
// wrap this up..
}
}
private CompassReader getReader( World w )
{
CompassReader cr = this.worldSet.get( w );
@@ -150,42 +192,20 @@ public final class CompassService
private int dist( int ax, int az, int bx, int bz )
{
int up = ( bz - az ) * CHUNK_SIZE;
int side = ( bx - ax ) * CHUNK_SIZE;
final int up = ( bz - az ) * CHUNK_SIZE;
final int side = ( bx - ax ) * CHUNK_SIZE;
return up * up + side * side;
}
private double rad( int ax, int az, int bx, int bz )
{
int up = bz - az;
int side = bx - ax;
final int up = bz - az;
final int side = bx - ax;
return Math.atan2( -up, side ) - Math.PI / 2.0;
}
public void kill()
{
this.executor.shutdown();
try
{
this.executor.awaitTermination( 6, TimeUnit.MINUTES );
this.jobSize = 0;
for( CompassReader cr : this.worldSet.values() )
{
cr.close();
}
this.worldSet.clear();
}
catch( InterruptedException e )
{
// wrap this up..
}
}
private class CMUpdatePost implements Runnable
{
@@ -210,7 +230,7 @@ public final class CompassService
{
CompassService.this.jobSize--;
CompassReader cr = CompassService.this.getReader( this.world );
final CompassReader cr = CompassService.this.getReader( this.world );
cr.setHasBeacon( this.chunkX, this.chunkZ, this.doubleChunkY, this.value );
if( CompassService.this.jobSize() < 2 )
@@ -239,10 +259,10 @@ public final class CompassService
{
CompassService.this.jobSize--;
int cx = this.coord.x >> 4;
int cz = this.coord.z >> 4;
final int cx = this.coord.x >> 4;
final int cz = this.coord.z >> 4;
CompassReader cr = CompassService.this.getReader( this.coord.getWorld() );
final CompassReader cr = CompassService.this.getReader( this.coord.getWorld() );
// Am I standing on it?
if( cr.hasBeacon( cx, cz ) )
@@ -260,10 +280,10 @@ public final class CompassService
// spiral outward...
for( int offset = 1; offset < this.maxRange; offset++ )
{
int minX = cx - offset;
int minZ = cz - offset;
int maxX = cx + offset;
int maxZ = cz + offset;
final int minX = cx - offset;
final int minZ = cz - offset;
final int maxX = cx + offset;
final int maxZ = cz + offset;
int closest = Integer.MAX_VALUE;
int chosen_x = cx;
@@ -273,7 +293,7 @@ public final class CompassService
{
if( cr.hasBeacon( minX, z ) )
{
int closeness = CompassService.this.dist( cx, cz, minX, z );
final int closeness = CompassService.this.dist( cx, cz, minX, z );
if( closeness < closest )
{
closest = closeness;
@@ -284,7 +304,7 @@ public final class CompassService
if( cr.hasBeacon( maxX, z ) )
{
int closeness = CompassService.this.dist( cx, cz, maxX, z );
final int closeness = CompassService.this.dist( cx, cz, maxX, z );
if( closeness < closest )
{
closest = closeness;
@@ -298,7 +318,7 @@ public final class CompassService
{
if( cr.hasBeacon( x, minZ ) )
{
int closeness = CompassService.this.dist( cx, cz, x, minZ );
final int closeness = CompassService.this.dist( cx, cz, x, minZ );
if( closeness < closest )
{
closest = closeness;
@@ -309,7 +329,7 @@ public final class CompassService
if( cr.hasBeacon( x, maxZ ) )
{
int closeness = CompassService.this.dist( cx, cz, x, maxZ );
final int closeness = CompassService.this.dist( cx, cz, x, maxZ );
if( closeness < closest )
{
closest = closeness;
@@ -55,10 +55,18 @@ public final class CompassReader
public void setHasBeacon( int cx, int cz, int cdy, boolean hasBeacon )
{
CompassRegion r = this.getRegion( cx, cz );
final CompassRegion r = this.getRegion( cx, cz );
r.setHasBeacon( cx, cz, cdy, hasBeacon );
}
public boolean hasBeacon( int cx, int cz )
{
final CompassRegion r = this.getRegion( cx, cz );
return r.hasBeacon( cx, cz );
}
private CompassRegion getRegion( int cx, int cz )
{
long pos = cx >> 10;
@@ -66,6 +74,7 @@ public final class CompassReader
pos |= ( cz >> 10 );
CompassRegion cr = this.regions.get( pos );
if( cr == null )
{
cr = new CompassRegion( cx, cz, this.dimensionId, this.worldCompassFolder );
@@ -74,10 +83,4 @@ public final class CompassReader
return cr;
}
public boolean hasBeacon( int cx, int cz )
{
CompassRegion r = this.getRegion( cx, cz );
return r.hasBeacon( cx, cz );
}
}
@@ -52,8 +52,8 @@ public final class CompassRegion
this.worldCompassFolder = worldCompassFolder;
this.encoder = new MeteorDataNameEncoder( 0 );
int region_x = cx >> 10;
int region_z = cz >> 10;
final int region_x = cx >> 10;
final int region_z = cz >> 10;
this.lowX = region_x << 10;
this.lowZ = region_z << 10;
@@ -61,42 +61,6 @@ public final class CompassRegion
this.openFile( false );
}
private void openFile( boolean create )
{
if( this.hasFile )
{
return;
}
final File file = this.getFile();
if( create || this.isFileExistent( file ) )
{
try
{
this.raf = new RandomAccessFile( file, "rw" );
FileChannel fc = this.raf.getChannel();
this.buffer = fc.map( FileChannel.MapMode.READ_WRITE, 0, 0x400 * 0x400 );// fc.size() );
this.hasFile = true;
}
catch( Throwable t )
{
throw new CompassException( t );
}
}
}
private File getFile()
{
final String fileName = this.encoder.encode( this.world, this.lowX, this.lowZ );
return new File( this.worldCompassFolder, fileName );
}
private boolean isFileExistent( File file )
{
return file.exists() && file.isFile();
}
public void close()
{
try
@@ -122,7 +86,7 @@ public final class CompassRegion
cx &= 0x3FF;
cz &= 0x3FF;
int val = this.read( cx, cz );
final int val = this.read( cx, cz );
if( val != 0 )
{
return true;
@@ -132,6 +96,87 @@ public final class CompassRegion
return false;
}
public void setHasBeacon( int cx, int cz, int cdy, boolean hasBeacon )
{
cx &= 0x3FF;
cz &= 0x3FF;
this.openFile( hasBeacon );
if( this.hasFile )
{
int val = this.read( cx, cz );
final int originalVal = val;
if( hasBeacon )
{
val |= 1 << cdy;
}
else
{
val &= ~( 1 << cdy );
}
if( originalVal != val )
{
this.write( cx, cz, val );
}
}
}
@Override
protected void finalize() throws Throwable
{
try
{
if( this.raf != null )
{
this.raf.close();
}
}
finally
{
super.finalize();
}
}
private void openFile( boolean create )
{
if( this.hasFile )
{
return;
}
final File file = this.getFile();
if( create || this.isFileExistent( file ) )
{
try
{
this.raf = new RandomAccessFile( file, "rw" );
final FileChannel fc = this.raf.getChannel();
this.buffer = fc.map( FileChannel.MapMode.READ_WRITE, 0, 0x400 * 0x400 );// fc.size() );
this.hasFile = true;
}
catch( final Throwable t )
{
throw new CompassException( t );
}
}
}
private File getFile()
{
final String fileName = this.encoder.encode( this.world, this.lowX, this.lowZ );
return new File( this.worldCompassFolder, fileName );
}
private boolean isFileExistent( File file )
{
return file.exists() && file.isFile();
}
private int read( int cx, int cz )
{
try
@@ -150,34 +195,6 @@ public final class CompassRegion
}
}
public void setHasBeacon( int cx, int cz, int cdy, boolean hasBeacon )
{
cx &= 0x3FF;
cz &= 0x3FF;
this.openFile( hasBeacon );
if( this.hasFile )
{
int val = this.read( cx, cz );
int originalVal = val;
if( hasBeacon )
{
val |= 1 << cdy;
}
else
{
val &= ~( 1 << cdy );
}
if( originalVal != val )
{
this.write( cx, cz, val );
}
}
}
private void write( int cx, int cz, int val )
{
try
+1 -1
View File
@@ -34,7 +34,7 @@ import appeng.transformer.annotations.Integration.Interface;
import appeng.util.Platform;
@Interface( iname = "IC2", iface = "ic2.api.energy.tile.IEnergySink" )
@Interface( iname = IntegrationType.IC2, iface = "ic2.api.energy.tile.IEnergySink" )
public abstract class IC2 extends AERootPoweredTile implements IEnergySink
{
@@ -24,10 +24,11 @@ import net.minecraftforge.common.util.ForgeDirection;
import mekanism.api.energy.IStrictEnergyAcceptor;
import appeng.api.config.PowerUnits;
import appeng.integration.IntegrationType;
import appeng.transformer.annotations.Integration.Interface;
@Interface( iname = "Mekanism", iface = "mekanism.api.energy.IStrictEnergyAcceptor" )
@Interface( iname = IntegrationType.Mekanism, iface = "mekanism.api.energy.IStrictEnergyAcceptor" )
public abstract class MekJoules extends RedstoneFlux implements IStrictEnergyAcceptor
{
@@ -24,10 +24,11 @@ import net.minecraftforge.common.util.ForgeDirection;
import cofh.api.energy.IEnergyReceiver;
import appeng.api.config.PowerUnits;
import appeng.integration.IntegrationType;
import appeng.transformer.annotations.Integration.Interface;
@Interface( iname = "RF", iface = "cofh.api.energy.IEnergyReceiver" )
@Interface( iname = IntegrationType.RF, iface = "cofh.api.energy.IEnergyReceiver" )
public abstract class RedstoneFlux extends RotaryCraft implements IEnergyReceiver
{
@Override
@@ -28,6 +28,7 @@ import Reika.RotaryCraft.API.Interfaces.Transducerable;
import Reika.RotaryCraft.API.Power.AdvancedShaftPowerReceiver;
import appeng.api.config.PowerUnits;
import appeng.integration.IntegrationType;
import appeng.tile.TileEvent;
import appeng.tile.events.TileEventType;
import appeng.transformer.annotations.Integration.Interface;
@@ -35,7 +36,7 @@ import appeng.transformer.annotations.Integration.InterfaceList;
import appeng.transformer.annotations.Integration.Method;
@InterfaceList( value = { @Interface( iname = "RotaryCraft", iface = "Reika.RotaryCraft.API.Power.AdvancedShaftPowerReceiver" ), @Interface( iname = "RotaryCraft", iface = "Reika.RotaryCraft.API.Interfaces.Transducerable" ) } )
@InterfaceList( value = { @Interface( iname = IntegrationType.RotaryCraft, iface = "Reika.RotaryCraft.API.Power.AdvancedShaftPowerReceiver" ), @Interface( iname = IntegrationType.RotaryCraft, iface = "Reika.RotaryCraft.API.Interfaces.Transducerable" ) } )
public abstract class RotaryCraft extends IC2 implements AdvancedShaftPowerReceiver, Transducerable
{
@@ -47,7 +48,7 @@ public abstract class RotaryCraft extends IC2 implements AdvancedShaftPowerRecei
private long currentPower = 0;
@TileEvent( TileEventType.TICK )
@Method( iname = "RotaryCraft" )
@Method( iname = IntegrationType.RotaryCraft )
public void Tick_RotaryCraft()
{
if( this.worldObj != null && !this.worldObj.isRemote && this.currentPower > 0 )
@@ -19,11 +19,10 @@
package appeng.tile.spatial;
import java.util.concurrent.Callable;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.config.Actionable;
@@ -46,10 +45,11 @@ import appeng.tile.events.TileEventType;
import appeng.tile.grid.AENetworkInvTile;
import appeng.tile.inventory.AppEngInternalInventory;
import appeng.tile.inventory.InvOperation;
import appeng.util.IWorldCallable;
import appeng.util.Platform;
public class TileSpatialIOPort extends AENetworkInvTile implements Callable
public class TileSpatialIOPort extends AENetworkInvTile implements IWorldCallable<Void>
{
final int[] sides = { 0, 1 };
@@ -122,9 +122,8 @@ public class TileSpatialIOPort extends AENetworkInvTile implements Callable
}
@Override
public Object call() throws Exception
public Void call( World world ) throws Exception
{
ItemStack cell = this.getStackInSlot( 0 );
if( this.isSpatialCell( cell ) && this.getStackInSlot( 1 ) == null )
{
@@ -24,6 +24,8 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import appeng.integration.IntegrationType;
public @interface Integration
{
@@ -40,13 +42,13 @@ public @interface Integration
{
String iface();
String iname();
IntegrationType iname();
}
@Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.METHOD )
@interface Method
{
String iname();
IntegrationType iname();
}
}
@@ -184,11 +184,11 @@ public final class ASMIntegration implements IClassTransformer
if( an.values.get( 0 ).equals( "iname" ) )
{
iName = (String) an.values.get( 1 );
iName = ( (String[]) an.values.get( 1 ) )[1];
}
else if( an.values.get( 2 ).equals( "iname" ) )
{
iName = (String) an.values.get( 3 );
iName = ( (String[]) an.values.get( 3 ) )[1];
}
if( iName != null && iFace != null )
@@ -224,7 +224,7 @@ public final class ASMIntegration implements IClassTransformer
if( an.values.get( 0 ).equals( "iname" ) )
{
iName = (String) an.values.get( 1 );
iName = ( (String[]) an.values.get( 1 ) )[1];
}
if( iName != null )
+5 -9
View File
@@ -19,33 +19,29 @@
package appeng.util;
import java.util.concurrent.Callable;
import net.minecraft.world.World;
public class BlockUpdate implements Callable
public class BlockUpdate implements IWorldCallable<Boolean>
{
final World w;
final int x;
final int y;
final int z;
public BlockUpdate( World w, int x, int y, int z )
public BlockUpdate( int x, int y, int z )
{
this.w = w;
this.x = x;
this.y = y;
this.z = z;
}
@Override
public Object call() throws Exception
public Boolean call( World world ) throws Exception
{
if( this.w.blockExists( this.x, this.y, this.z ) )
if( world.blockExists( this.x, this.y, this.z ) )
{
this.w.notifyBlocksOfNeighborChange( this.x, this.y, this.z, Platform.AIR_BLOCK );
world.notifyBlocksOfNeighborChange( this.x, this.y, this.z, Platform.AIR_BLOCK );
}
return true;
@@ -0,0 +1,49 @@
/*
* 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.util;
import java.util.concurrent.Callable;
import javax.annotation.Nullable;
import net.minecraft.world.World;
/**
* An interface similar to {@link Callable}, but allowing to pass the {@link World} when calling.
*
* @see Callable
* @author yueh
* @version rv3
* @since rv3
*/
public interface IWorldCallable<T>
{
/**
* Similar to {@link Callable#call()}
*
* @see Callable#call()
* @param world
* @return
* @throws Exception
*/
@Nullable
T call( @Nullable World world ) throws Exception;
}
+1 -1
View File
@@ -1911,7 +1911,7 @@ public class Platform
{
if( !worldObj.isRemote )
{
TickHandler.INSTANCE.addCallable( worldObj, new BlockUpdate( worldObj, xCoord, yCoord, zCoord ) );
TickHandler.INSTANCE.addCallable( worldObj, new BlockUpdate( xCoord, yCoord, zCoord ) );
}
}
@@ -20,7 +20,6 @@ package appeng.worldgen;
import java.util.Random;
import java.util.concurrent.Callable;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
@@ -33,6 +32,7 @@ import appeng.core.AEConfig;
import appeng.core.features.registries.WorldGenRegistry;
import appeng.core.worlddata.WorldData;
import appeng.hooks.TickHandler;
import appeng.util.IWorldCallable;
import appeng.util.Platform;
import appeng.worldgen.meteorite.ChunkOnly;
@@ -51,11 +51,11 @@ public final class MeteoriteWorldGen implements IWorldGenerator
int z = r.nextInt( 16 ) + ( chunkZ << 4 );
int depth = 180 + r.nextInt( 20 );
TickHandler.INSTANCE.addCallable( w, new MeteoriteSpawn( x, depth, z, w ) );
TickHandler.INSTANCE.addCallable( w, new MeteoriteSpawn( x, depth, z ) );
}
else
{
TickHandler.INSTANCE.addCallable( w, new MeteoriteSpawn( chunkX << 4, 128, chunkZ << 4, w ) );
TickHandler.INSTANCE.addCallable( w, new MeteoriteSpawn( chunkX << 4, 128, chunkZ << 4 ) );
}
}
else
@@ -113,24 +113,22 @@ public final class MeteoriteWorldGen implements IWorldGenerator
return WorldData.instance().spawnData().getNearByMeteorites( w.provider.dimensionId, chunkX, chunkZ );
}
class MeteoriteSpawn implements Callable
class MeteoriteSpawn implements IWorldCallable<Object>
{
final int x;
final int z;
final World w;
final int depth;
public MeteoriteSpawn( int x, int depth, int z, World w )
public MeteoriteSpawn( int x, int depth, int z )
{
this.x = x;
this.z = z;
this.w = w;
this.depth = depth;
}
@Override
public Object call() throws Exception
public Object call( World world ) throws Exception
{
int chunkX = this.x >> 4;
int chunkZ = this.z >> 4;
@@ -138,10 +136,10 @@ public final class MeteoriteWorldGen implements IWorldGenerator
double minSqDist = Double.MAX_VALUE;
// near by meteorites!
for( NBTTagCompound data : MeteoriteWorldGen.this.getNearByMeteorites( this.w, chunkX, chunkZ ) )
for( NBTTagCompound data : MeteoriteWorldGen.this.getNearByMeteorites( world, chunkX, chunkZ ) )
{
MeteoritePlacer mp = new MeteoritePlacer();
mp.spawnMeteorite( new ChunkOnly( this.w, chunkX, chunkZ ), data );
mp.spawnMeteorite( new ChunkOnly( world, chunkX, chunkZ ), data );
minSqDist = Math.min( minSqDist, mp.getSqDistance( this.x, this.z ) );
}
@@ -150,11 +148,11 @@ public final class MeteoriteWorldGen implements IWorldGenerator
if( minSqDist > AEConfig.instance.minMeteoriteDistanceSq || isCluster )
{
MeteoriteWorldGen.this.tryMeteorite( this.w, this.depth, this.x, this.z );
MeteoriteWorldGen.this.tryMeteorite( world, this.depth, this.x, this.z );
}
WorldData.instance().spawnData().setGenerated( this.w.provider.dimensionId, chunkX, chunkZ );
WorldData.instance().compassData().service().updateArea( this.w, chunkX, chunkZ );
WorldData.instance().spawnData().setGenerated( world.provider.dimensionId, chunkX, chunkZ );
WorldData.instance().compassData().service().updateArea( world, chunkX, chunkZ );
return null;
}
@@ -185,8 +185,9 @@ gui.appliedenergistics2.inWorldPurificationFluix=Drop a Fluix Seed made from Flu
gui.appliedenergistics2.inWorldSingularity=To create drop 1 Singularity and 1 Ender Dust and cause an explosion within range of the items.
gui.appliedenergistics2.ChargedQuartz=Charged Certus Quartz is crafted by inserting an uncharged Certus Quartz Crystal into the Charger, and powering it.
gui.appliedenergistics2.ChargedQuartzFind=Charged Certus Quartz can be found in world semi rarely, it appears similar to normal Certus Quartz, except it sparkles.
gui.appliedenergistics2.OfSecondOutput=%1$d%% Chance for second output.
gui.appliedenergistics2.NoSecondOutput=No Secondary Output
gui.appliedenergistics2.OfSecondOutput=%1$d%% Chance for second output.
gui.appliedenergistics2.MultipleOutputs=%1$d%% second, %2$d%% third output.
gui.appliedenergistics2.SelectAmount=Select Amount
gui.appliedenergistics2.CopyMode=Copy Mode
gui.appliedenergistics2.CopyModeDesc=Controls if the contents of the configuration pane are cleared when you remove the cell.
@@ -42,13 +42,13 @@ tile.appliedenergistics2.BlockSkyStone.SmallBrick.name=Briquettes de pierre de c
tile.appliedenergistics2.BlockSkyChest.name=Coffre de pierre de ciel
tile.appliedenergistics2.BlockSkyChest.Block.name=Coffre de bloc de pierre de ciel
tile.appliedenergistics2.BlockSkyCompass.name=Boussole à météorite
tile.appliedenergistics2.BlockCraftingMonitor.name=Moniteur de craft
tile.appliedenergistics2.BlockCraftingStorage.name=Disque 1k pour le craft
tile.appliedenergistics2.BlockCraftingStorage4k.name=Disque 4k pour le craft
tile.appliedenergistics2.BlockCraftingStorage16k.name=Disque 16k pour le craft
tile.appliedenergistics2.BlockCraftingStorage64k.name=Disque 64k pour le craft
tile.appliedenergistics2.BlockCraftingMonitor.name=Moniteur de fabrication
tile.appliedenergistics2.BlockCraftingStorage.name=Disque 1k pour la fabrication
tile.appliedenergistics2.BlockCraftingStorage4k.name=Disque 4k pour la fabrication
tile.appliedenergistics2.BlockCraftingStorage16k.name=Disque 16k pour la fabrication
tile.appliedenergistics2.BlockCraftingStorage64k.name=Disque 64k pour la fabrication
tile.appliedenergistics2.BlockCraftingAccelerator.name=Unité de co-traitement
tile.appliedenergistics2.BlockCraftingUnit.name=Unité de craft
tile.appliedenergistics2.BlockCraftingUnit.name=Unité de fabrication
tile.appliedenergistics2.BlockMolecularAssembler.name=Assembleur moléculaire
// Stairs
@@ -61,6 +61,16 @@ tile.appliedenergistics2.SkyStoneBrickStairBlock.name=Escaliers de briques de pi
tile.appliedenergistics2.SkyStoneSmallBrickStairBlock.name=Escaliers de petites briques de pierre de ciel
tile.appliedenergistics2.SkyStoneStairBlock.name=Escaliers de pierre de ciel
// Slabs
tile.appliedenergistics2.ChiseledQuartzSlabBlock.name=Dalle de Quartz Certus ciselé
tile.appliedenergistics2.FluixSlabBlock.name=Dalle de Fluix
tile.appliedenergistics2.QuartzPillarSlabBlock.name=Dalle de pilier de Quartz Certus
tile.appliedenergistics2.QuartzSlabBlock.name=Dalle de Quartz Certus
tile.appliedenergistics2.SkyStoneBlockSlabBlock.name=Dalle de bloc de pierre de ciel
tile.appliedenergistics2.SkyStoneBrickSlabBlock.name=Dalle de briques de pierre de ciel
tile.appliedenergistics2.SkyStoneSmallBrickSlabBlock.name=Dalle de petites briques de pierre de ciel
tile.appliedenergistics2.SkyStoneSlabBlock.name=Dalle de pierre de ciel
// Chat Messages
chat.appliedenergistics2.ChestCannotReadStorageCell=Le coffre ME Chest ne peut pas lire la cellule de stockage.
chat.appliedenergistics2.SettingCleared=Paramètres effacés.
@@ -83,7 +93,7 @@ itemGroup.appliedenergistics2=Applied Energistics 2
itemGroup.appliedenergistics2.facades=Façades Applied Energistics 2
// GUI
gui.appliedenergistics2.CraftingTerminal=Terminal de craft
gui.appliedenergistics2.CraftingTerminal=Terminal de fabrication
gui.appliedenergistics2.METunnel=ME
gui.appliedenergistics2.ItemTunnel=Objet
gui.appliedenergistics2.FluidTunnel=Fluide
@@ -91,16 +101,18 @@ gui.appliedenergistics2.RedstoneTunnel=Redstone
gui.appliedenergistics2.EUTunnel=EU
gui.appliedenergistics2.RFTunnel=RF
gui.appliedenergistics2.LightTunnel=Lumière
gui.appliedenergistics2.OCTunnel=OpenComputers
gui.appliedenergistics2.PressureTunnel=Pression
gui.appliedenergistics2.security.extract.name=Retrait
gui.appliedenergistics2.security.inject.name=Dépôt
gui.appliedenergistics2.security.craft.name=Craft
gui.appliedenergistics2.security.craft.name=Fabrication
gui.appliedenergistics2.security.build.name=Construction
gui.appliedenergistics2.security.security.name=Sécurité
gui.appliedenergistics2.security.extract.tip=L'utilisateur est autorisé à retirer un élément du stockage.
gui.appliedenergistics2.security.inject.tip=L'utilisateur est autorisé à déposer un élément dans le stockage.
gui.appliedenergistics2.security.craft.tip=L'utilisateur peut lancer de nouveaux crafts.
gui.appliedenergistics2.security.craft.tip=L'utilisateur peut lancer de nouvelles fabrications.
gui.appliedenergistics2.security.build.tip=L'utilisateur peut modifier la structure physique du réseau et faire des changement de configuration.
gui.appliedenergistics2.security.security.tip=L'utilisateur peut accéder et modifier le terminal de sécurité du réseau.
@@ -149,7 +161,7 @@ gui.appliedenergistics2.VibrationChamber=Chambre de vibration
gui.appliedenergistics2.NetworkDetails=Détails du réseau
gui.appliedenergistics2.StorageCells=Cellules de stockage ME
gui.appliedenergistics2.IOBuses=Bus d'import/export ME
gui.appliedenergistics2.Stores=Stocke
gui.appliedenergistics2.Stores=Stocks
gui.appliedenergistics2.BytesUsed=Octets utilisés
gui.appliedenergistics2.Types=Types
gui.appliedenergistics2.Blank=Vide
@@ -158,10 +170,10 @@ gui.appliedenergistics2.Linked=Lié
gui.appliedenergistics2.StoredSize=Quantité stockée
gui.appliedenergistics2.SkyChest=Coffre de pierre du ciel
gui.appliedenergistics2.PatternTerminal=Terminal des modèles
gui.appliedenergistics2.CraftingPattern=Modèle de craft
gui.appliedenergistics2.CraftingPattern=Modèle de fabrication
gui.appliedenergistics2.MolecularAssembler=Assembleur moléculaire
gui.appliedenergistics2.ProcessingPattern=Modèle de traitement
gui.appliedenergistics2.Crafts=Crafts
gui.appliedenergistics2.Crafts=Fabrications
gui.appliedenergistics2.And=et
gui.appliedenergistics2.Creates=Crée
gui.appliedenergistics2.With=avec
@@ -183,20 +195,21 @@ gui.appliedenergistics2.Lumen=Lumen
gui.appliedenergistics2.Empty=Vide
gui.appliedenergistics2.Stored=Stocké
gui.appliedenergistics2.Cancel=Annuler
gui.appliedenergistics2.Crafting=Craft
gui.appliedenergistics2.ETAFormat=HH:mm:ss
gui.appliedenergistics2.Crafting=Fabrication
gui.appliedenergistics2.Scheduled=Prévu
gui.appliedenergistics2.CraftingStatus=Etat du craft
gui.appliedenergistics2.CraftingStatus=Etat de fabrication
gui.appliedenergistics2.FromStorage=Disponible
gui.appliedenergistics2.ToCraft=A crafter
gui.appliedenergistics2.CraftingPlan=Plan de craft
gui.appliedenergistics2.ToCraft=A fabriquer
gui.appliedenergistics2.CraftingPlan=Plan de fabrication
gui.appliedenergistics2.Automatic=Automatique
gui.appliedenergistics2.Start=Départ
gui.appliedenergistics2.Missing=Manquant
gui.appliedenergistics2.Bytes=Stockage
gui.appliedenergistics2.Simulation=Simulation
gui.appliedenergistics2.CoProcessors=Co-traitements
gui.appliedenergistics2.CraftingCPU=Unité de craft
gui.appliedenergistics2.NoCraftingCPUs=Aucune unité de craft n'est disponible
gui.appliedenergistics2.CraftingCPU=Unité de fabrication
gui.appliedenergistics2.NoCraftingCPUs=Aucune unité de fabrication n'est disponible
gui.appliedenergistics2.CalculatingWait=En cours de calcul, veuillez patienter...
gui.appliedenergistics2.Clean=Effacer
gui.appliedenergistics2.InvalidPattern=Modèle non valide
@@ -204,21 +217,21 @@ gui.appliedenergistics2.Range=Portée
gui.appliedenergistics2.TransparentFacades=Façades transparentes
gui.appliedenergistics2.TransparentFacadesHint=Contrôle la visibilité des façades avec l'outil réseau dans votre main.
gui.appliedenergistics2.CPUs=Unités
gui.appliedenergistics2.NoCraftingJobs=Aucun craft actif
gui.appliedenergistics2.FacadeCrafting=Craft de façade
gui.appliedenergistics2.NoCraftingJobs=Aucune fabrication d'active
gui.appliedenergistics2.FacadeCrafting=Fabrication de façade
gui.appliedenergistics2.inWorldCraftingPresses=Les plaques de gravure se trouvent au centre des météorites qui peuvent être trouvées dans le monde, elles peuvent être localisées en utilisant une boussole à météorite.
gui.appliedenergistics2.Included=Inclus
gui.appliedenergistics2.Excluded=Exclus
gui.appliedenergistics2.Partitioned=Partitionné
gui.appliedenergistics2.Precise=Précis
gui.appliedenergistics2.Fuzzy=Brouillon
gui.appliedenergistics2.SmallFontCraft=Craft
gui.appliedenergistics2.SmallFontCraft=Fabrication
gui.appliedenergistics2.LargeFontCraft=+
gui.appliedenergistics2.Nothing=Rien
// GUI Tooltips
gui.tooltips.appliedenergistics2.Stash=Stocke des objets
gui.tooltips.appliedenergistics2.StashDesc=Renvoie les objets de la grille de craft dans le réseau.
gui.tooltips.appliedenergistics2.StashDesc=Renvoie les objets de la grille de fabrication dans le réseau.
gui.tooltips.appliedenergistics2.Substitutions=Remplacements du Ore-Dictionnary
gui.tooltips.appliedenergistics2.SubstitutionsDesc=Editez les options de remplacement pour les composants en entrée.
gui.tooltips.appliedenergistics2.SubstitutionsOn=Remplacements activés
@@ -238,7 +251,7 @@ gui.tooltips.appliedenergistics2.TransferToNetwork=Transférer les données au r
gui.tooltips.appliedenergistics2.TransferToStorageCell=Transférer les données à la cellule de stockage
gui.tooltips.appliedenergistics2.ToggleSortDirection=Basculer la direction de tri
gui.tooltips.appliedenergistics2.StoredItems=Objets stockés
gui.tooltips.appliedenergistics2.StoredCraftable=Stock / Craft
gui.tooltips.appliedenergistics2.StoredCraftable=Stock / Fabriquer
gui.tooltips.appliedenergistics2.View=Vue
gui.tooltips.appliedenergistics2.RedstoneMode=Mode redstone
gui.tooltips.appliedenergistics2.OperationMode=Mode opération
@@ -251,7 +264,7 @@ gui.tooltips.appliedenergistics2.PartitionStorage=Partionner le stockage
gui.tooltips.appliedenergistics2.Clear=Effacer
gui.tooltips.appliedenergistics2.TrashController=Effacement par Maj. / Espace-Clic.
gui.tooltips.appliedenergistics2.InterfaceBlockingMode=Mode bloquant
gui.tooltips.appliedenergistics2.InterfaceCraftingMode=Mode craft
gui.tooltips.appliedenergistics2.InterfaceCraftingMode=Mode fabrication
gui.tooltips.appliedenergistics2.Trash=Détruire les éléments
gui.tooltips.appliedenergistics2.MatterBalls=Condenser en billes de matière\n%s par élément
gui.tooltips.appliedenergistics2.Singularity=Condenser en singularités\n%s par élément
@@ -271,17 +284,17 @@ gui.tooltips.appliedenergistics2.SearchMode_NEIStandard=Synchronisation NEI stan
gui.tooltips.appliedenergistics2.SearchMode=Mode de la boite de recherche
gui.tooltips.appliedenergistics2.PartitionStorageHint=Configure la partition par rapport aux objets actuellement stockés.
gui.tooltips.appliedenergistics2.ClearSettings=Efface les paramètres
gui.tooltips.appliedenergistics2.Craftable=Craftable
gui.tooltips.appliedenergistics2.Craftable=Fabricable
gui.tooltips.appliedenergistics2.MoveWhenEmpty=Déplace vers la sortie dès que c'est vide.
gui.tooltips.appliedenergistics2.MoveWhenWorkIsDone=Déplace vers la sortie quand le travail est fini.
gui.tooltips.appliedenergistics2.MoveWhenFull=Déplace vers la sortie quand c'est plein.
gui.tooltips.appliedenergistics2.Disabled=Désactivé
gui.tooltips.appliedenergistics2.Enable=Activé
gui.tooltips.appliedenergistics2.Blocking=Ne pas insérer d'objets de craft si l'inventaire contient des objets.
gui.tooltips.appliedenergistics2.Blocking=Ne pas fabriquer d'objets si l'inventaire contient ces objets.
gui.tooltips.appliedenergistics2.NonBlocking=Ignorer le contenu de l'inventaire cible.
gui.tooltips.appliedenergistics2.Craft=Comportement de craft
gui.tooltips.appliedenergistics2.CraftOnly=Ne pas utiliser les objets stockés; préférer le craft pour l'export.
gui.tooltips.appliedenergistics2.CraftEither=Utiliser les éléments stockés, ou les crafter lors de l'export.
gui.tooltips.appliedenergistics2.Craft=Comportement de fabrication
gui.tooltips.appliedenergistics2.CraftOnly=Ne pas utiliser les objets stockés; préférer les fabriquer pour l'export.
gui.tooltips.appliedenergistics2.CraftEither=Utiliser les éléments stockés, ou les fabriquer lors de l'export.
gui.tooltips.appliedenergistics2.LevelType=Type de niveau
gui.tooltips.appliedenergistics2.LevelType_Energy=Energie
gui.tooltips.appliedenergistics2.LevelType_Item=Objet
@@ -292,15 +305,19 @@ gui.tooltips.appliedenergistics2.TerminalStyle_Full=Terminal plein écran
gui.tooltips.appliedenergistics2.TerminalStyle_Tall=Grand terminal centré
gui.tooltips.appliedenergistics2.TerminalStyle_Small=Petit terminal centré
gui.tooltips.appliedenergistics2.DoesntDespawn=Cet élément ne disparaitra pas.
gui.tooltips.appliedenergistics2.EmitterMode=Mode d'émission du craft
gui.tooltips.appliedenergistics2.CraftViaRedstone=Emettre un signal Redstone pour crafter l'objet.
gui.tooltips.appliedenergistics2.EmitWhenCrafting=Emettre un signal Redstone quand l'objet est en cours de craft.
gui.tooltips.appliedenergistics2.EmitterMode=Mode d'émission de la fabrication
gui.tooltips.appliedenergistics2.CraftViaRedstone=Emettre un signal Redstone pour fabriquer l'objet.
gui.tooltips.appliedenergistics2.EmitWhenCrafting=Emettre un signal Redstone quand l'objet est en cours de fabrication.
gui.tooltips.appliedenergistics2.ReportInaccessibleItems=Rapport d'éléments inaccessibles
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes=Oui: Les éléments ne pouvant pas être extraits seront visibles.
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsNo=Non: Seuls les éléments extractibles seront visibles.
gui.tooltips.appliedenergistics2.BlockPlacement=Placement de bloc
gui.tooltips.appliedenergistics2.BlockPlacementYes=Les blocs seront placés comme un bloc.
gui.tooltips.appliedenergistics2.BlockPlacementNo=Les blocs seront jettés comme un élément.
gui.tooltips.appliedenergistics2.SchedulingMode=Mode de planification
gui.tooltips.appliedenergistics2.SchedulingModeDefault=Exporte le premier élément jusqu'à ce que le réseau soit vide, puis essaye les suivants.
gui.tooltips.appliedenergistics2.SchedulingModeRoundRobin=Exporte les éléments l'un après l'autre.
gui.tooltips.appliedenergistics2.SchedulingModeRandom=Exporte les éléments aléatoirement.
gui.tooltips.appliedenergistics2.ItemsStored=Eléments stockés: %s
gui.tooltips.appliedenergistics2.ItemsRequestable=Eléments recherchable: %s
@@ -412,6 +429,7 @@ item.appliedenergistics2.ItemMaterial.SkyDust.name=Poussière de pierre du ciel
item.appliedenergistics2.ItemMaterial.CardCrafting.name=Carte de fabrication
item.appliedenergistics2.ItemPart.AnnihilationPlane.name=Plan de dématérialisation ME
item.appliedenergistics2.ItemPart.IdentityAnnihilationPlane.name=Plan de dématérialisation d'identité ME
item.appliedenergistics2.ItemPart.CableAnchor.name=Ancre de câble
item.appliedenergistics2.ItemPart.CableCovered.name=Câble couvert ME
item.appliedenergistics2.ItemPart.CableGlass.name=Câble de verre ME
@@ -419,7 +437,7 @@ item.appliedenergistics2.ItemPart.CableSmart.name=Câble intelligent ME
item.appliedenergistics2.ItemPart.CableDense.name=Câble dense ME
item.appliedenergistics2.ItemPart.StorageMonitor.name=Moniteur de stockage ME
item.appliedenergistics2.ItemPart.ConversionMonitor.name=Moniteur de conversion ME
item.appliedenergistics2.ItemPart.CraftingTerminal.name=Terminal de craft ME
item.appliedenergistics2.ItemPart.CraftingTerminal.name=Terminal de fabrication ME
item.appliedenergistics2.ItemPart.SemiDarkMonitor.name=Panneau illuminé
item.appliedenergistics2.ItemPart.Monitor.name=Panneau illuminé éclairé
item.appliedenergistics2.ItemPart.DarkMonitor.name=Panneau illuminé sombre
@@ -435,8 +453,9 @@ item.appliedenergistics2.ItemPart.StorageBus.name=Bus de stockage ME
item.appliedenergistics2.ItemPart.Terminal.name=Terminal ME
item.appliedenergistics2.ItemPart.InvertedToggleBus.name=Bus levier inversé ME
item.appliedenergistics2.ItemPart.ToggleBus.name=Bus levier ME
item.appliedenergistics2.ItemPart.CraftingMonitor.name=Moniteur des crafts ME
item.appliedenergistics2.ItemPart.CraftingMonitor.name=Moniteur des fabrications ME
item.appliedenergistics2.ItemPart.InterfaceTerminal.name=Terminal d'interface ME
item.appliedenergistics2.ItemPart.InvalidType.name=Éléments désactivés
item.appliedenergistics2.ItemSpatialStorageCell.128Cubed.name=Disque spatiale de 128³
item.appliedenergistics2.ItemSpatialStorageCell.16Cubed.name=Disque spatiale de 16³
@@ -482,55 +501,55 @@ commands.ae2.Supporters=Affiche une liste des supporters de AE2
// Achievements
achievement.ae2.Compass=Chasseur de météorites
achievement.ae2.Compass.desc=Crafter une boussole à météorite.
achievement.ae2.Compass.desc=Fabriquer une boussole à météorite.
achievement.ae2.Presses=Technologie inconnue
achievement.ae2.Presses.desc=Trouver une matrice de presse à processeur.
achievement.ae2.SpatialIO=Coordination spatiale
achievement.ae2.SpatialIO.desc=Crafter un port d'E/S spatial.
achievement.ae2.SpatialIO.desc=Fabriquer un port d'E/S spatial.
achievement.ae2.SpatialIOExplorer=A coeur vaillant...
achievement.ae2.SpatialIOExplorer.desc=Etre stocké dans un disque spatial.
achievement.ae2.StorageCell=Mieux que des coffres
achievement.ae2.StorageCell.desc=Crafter une cellule de stockage.
achievement.ae2.StorageCell.desc=Fabriquer une cellule de stockage.
achievement.ae2.IOPort=Mélange de disque
achievement.ae2.IOPort.desc=Crafter un port d'E/S.
achievement.ae2.IOPort.desc=Fabriquer un port d'E/S.
achievement.ae2.CraftingTerminal=Une table (bien) plus grande
achievement.ae2.CraftingTerminal.desc=Crafter un terminal de craft.
achievement.ae2.PatternTerminal=Maitre crafteur
achievement.ae2.PatternTerminal.desc=Crafter un terminal de modèles.
achievement.ae2.CraftingTerminal.desc=Fabriquer un terminal de fabrication.
achievement.ae2.PatternTerminal=Maitre fabricateur
achievement.ae2.PatternTerminal.desc=Fabriquer un terminal de modèles.
achievement.ae2.ChargedQuartz=Electrifiant
achievement.ae2.ChargedQuartz.desc=Trouver du Quartz chargé.
achievement.ae2.Fluix=Artificiel
achievement.ae2.Fluix.desc=Créer des critaux de Fluix.
achievement.ae2.Charger=Production de Fluix
achievement.ae2.Charger.desc=Crafter un chargeur.
achievement.ae2.Charger.desc=Fabriquer un chargeur.
achievement.ae2.CrystalGrowthAccelerator=Accélérateur est un euphémisme
achievement.ae2.CrystalGrowthAccelerator.desc=Crafter un accélérateur de croissance de cristal.
achievement.ae2.CrystalGrowthAccelerator.desc=Fabriquer un accélérateur de croissance de cristal.
achievement.ae2.GlassCable=Connexion d'énergie Fluix
achievement.ae2.GlassCable.desc=Crafter un câble de verre ME.
achievement.ae2.GlassCable.desc=Fabriquer un câble de verre ME.
achievement.ae2.Networking1=Apprenti réseau
achievement.ae2.Networking1.desc=Atteindre 8 canaux en utilisant des dispositifs sur un réseau.
achievement.ae2.Controller=Tableau de distribution du réseau
achievement.ae2.Controller.desc=Crafter un contrôleur.
achievement.ae2.Controller.desc=Fabriquer un contrôleur.
achievement.ae2.Networking2=Ingénieur réseau
achievement.ae2.Networking2.desc=Atteindre 128 canaux en utilisant des dispositifs sur un réseau.
achievement.ae2.Networking3=Administrateur réseau
achievement.ae2.Networking3.desc=Atteindre 2048 canaux en utilisant des dispositifs sur un réseau.
achievement.ae2.P2P=Réseau point à point
achievement.ae2.P2P.desc=Crafter un tunnel P2P.
achievement.ae2.P2P.desc=Fabriquer un tunnel P2P.
achievement.ae2.Recursive=Réseau récursif
achievement.ae2.Recursive.desc=Placer une interface sur un bus de stockage.
achievement.ae2.CraftingCPU=Crafting nouvelle génération
achievement.ae2.CraftingCPU.desc=Crafter une unité de craft.
achievement.ae2.CraftingCPU=Fabrication de nouvelle génération
achievement.ae2.CraftingCPU.desc=Fabriquer une unité de fabrication.
achievement.ae2.Facade=Esthétique du réseau
achievement.ae2.Facade.desc=Crafter des façades de câbles.
achievement.ae2.Facade.desc=Fabriquer des façades de câbles.
achievement.ae2.NetworkTool=Diagnostics réseau
achievement.ae2.NetworkTool.desc=Crafter un outil réseau.
achievement.ae2.NetworkTool.desc=Fabriquer un outil réseau.
achievement.ae2.PortableCell=Stockage nomade
achievement.ae2.PortableCell.desc=Crafter un disque portable.
achievement.ae2.PortableCell.desc=Fabriquer un disque portable.
achievement.ae2.StorageBus=Potentiel illimité
achievement.ae2.StorageBus.desc=Crafter un bus de stockage.
achievement.ae2.StorageBus.desc=Fabriquer un bus de stockage.
achievement.ae2.QNB=Ouvrir un tunnel quantique
achievement.ae2.QNB.desc=Crafter un lien quantique.
achievement.ae2.QNB.desc=Fabriquer un lien quantique.
// Stats
stat.ae2.ItemsInserted=Eléments ajoutés aux disques ME
@@ -417,3 +417,54 @@ item.appliedenergistics2.ToolBiometricCard.name=身份卡
item.appliedenergistics2.ToolDebugCard.name=Dev.調試卡
item.appliedenergistics2.ToolReplicatorCard.name=Dev.復制卡
achievement.ae2.Compass=隕石追跡者
achievement.ae2.Compass.desc=合成一個隕石羅盤
achievement.ae2.Presses=這是什麼東西啊!?
achievement.ae2.Presses.desc=找到一塊壓印模板
achievement.ae2.SpatialIO=空間操弄者
achievement.ae2.SpatialIO.desc=合成一個空間IO端口
achievement.ae2.SpatialIOExplorer=大膽地去吧!
achievement.ae2.SpatialIOExplorer.desc=被儲存在空間硬碟裡
achievement.ae2.StorageCell=勝過箱子
achievement.ae2.StorageCell.desc=合成一個存儲元件
achievement.ae2.IOPort=物品操弄者
achievement.ae2.IOPort.desc=合成一個ME-IO端口
achievement.ae2.CraftingTerminal=好一個"大"桌子
achievement.ae2.CraftingTerminal.desc=合成一個ME合成終端
achievement.ae2.PatternTerminal=合成大師
achievement.ae2.PatternTerminal.desc=合成一個ME樣板終端
achievement.ae2.ChargedQuartz=哇!閃耀!!
achievement.ae2.ChargedQuartz.desc=找到充能賽特斯石英水晶
achievement.ae2.Fluix=這不是天然的!
achievement.ae2.Fluix.desc=製作福魯伊克斯水晶
achievement.ae2.Charger=水晶量產者
achievement.ae2.Charger.desc=合成一個充能器
achievement.ae2.CrystalGrowthAccelerator=時間只是浮雲
achievement.ae2.CrystalGrowthAccelerator.desc=合成一個晶體催生器
achievement.ae2.GlassCable=能量連接
achievement.ae2.GlassCable.desc=合成ME玻璃線纜
achievement.ae2.Networking1=初學者
achievement.ae2.Networking1.desc=在你的網路中連接8台可互聯機器
achievement.ae2.Controller=交通樞紐
achievement.ae2.Controller.desc=合成一個控制器
achievement.ae2.Networking2=工程師
achievement.ae2.Networking2.desc=在你的網路中連接128台可互聯機器
achievement.ae2.Networking3=萬里長"程"
achievement.ae2.Networking3.desc=在你的網路中連接2048台可互聯機器
achievement.ae2.P2P=雙向溝通
achievement.ae2.P2P.desc=合成一個P2P通道
achievement.ae2.Recursive=遞廻線路
achievement.ae2.Recursive.desc=在儲存總線上放置一個接口
achievement.ae2.CraftingCPU=近代科技
achievement.ae2.CraftingCPU.desc=合成一個合成處理器
achievement.ae2.Facade=線路美學
achievement.ae2.Facade.desc=合成線路偽裝版
achievement.ae2.NetworkTool=診斷線路
achievement.ae2.NetworkTool.desc=合成一個網路工具
achievement.ae2.PortableCell=百寶袋
achievement.ae2.PortableCell.desc=合成一個便攜元件
achievement.ae2.StorageBus=無窮潛力
achievement.ae2.StorageBus.desc=合成一個存儲總線
achievement.ae2.QNB=看!牛郎和織女牽手了!
achievement.ae2.QNB.desc=合成一個量子環
@@ -1,17 +0,0 @@
# AE2 Ore Dictionary
# Materials for processing in other machines
ore=ae2:ItemMaterial.CertusQuartzCrystal -> crystalCertusQuartz
ore=ae2:ItemMaterial.FluixCrystal -> crystalFluix
ore=ae2:ItemMaterial.PurifiedFluixCrystal -> crystalPureFluix
ore=ae2:ItemMaterial.NetherQuartzDust -> dustNetherQuartz
ore=ae2:ItemMaterial.CertusQuartzDust -> dustCertusQuartz
ore=ae2:ItemMaterial.FluixDust -> dustFluix
# Ores of AE2
ore=ae2:tile.OreQuartz -> oreCertusQuartz
ore=ae2:tile.OreQuartzCharged -> oreCertusQuartz
# Parts to be used
ore= ae2:ItemPart.SemiDarkMonitor -> itemIlluminatedPanel
ore= ae2:ItemPart.Monitor -> itemIlluminatedPanel
ore= ae2:ItemPart.DarkMonitor -> itemIlluminatedPanel
@@ -1,11 +0,0 @@
# Forge Ore Dictionary
# logWood, slabWood, stairWood, treeSapling, treeLeaves,
# oreGold, oreIron, oreLapis, oreDiamond, oreRedstone, oreEmerald, oreQuartz, oreCoal,
# stone, cobblestone, record, stickWood, plankWood,
# dyeBlack, dyeRed, dyeGreen, dyeBrown, dyeBlue, dyePurple, dyeCyan, dyeLightGray, dyeGray, dyePink, dyeLime, dyeYellow, dyeLightBlue, dyeMagenta, dyeOrange, dyeWhite
# Minecraft Ore Dict Entries
# Renamed for less clashing
ore=mc:quartz -> crystalNetherQuartz
ore=mc:wool:* -> blockWool
ore=mc:stained_hardened_clay:* -> blockStainedHardenedClay
@@ -328,6 +328,7 @@
<h4 id="import">Import</h4>
<ul>
<li>lets you load an additional recipe file</li>
<li>this works with subdirectories, but the path needs to be always a relative path to the root recipe directory</li>
<li>
AE2: import all recipes for stairs<br />
<code>import = stairs.recipe</code>
@@ -0,0 +1,2 @@
alias=mc -> minecraft
alias=ae2 -> appliedenergistics2
@@ -1,69 +0,0 @@
shaped=
ae2:BlockQuartzGlass mc:glowstone_dust ae2:BlockQuartzGlass,
mc:glowstone_dust certusCrystal mc:glowstone_dust,
mc:iron_ingot mc:iron_ingot mc:iron_ingot
-> ae2:ItemMaterial.BlankPattern
shapeless=
ae2:ItemMaterial.BasicCard mc:crafting_table
-> ae2:ItemMaterial.CardCrafting
shaped=
ae2:ItemMaterial.FormationCore mc:iron_ingot _,
mc:iron_ingot ae2:ItemMaterial.Cell4kPart _,
_ _ ae2:BlockEnergyCell
-> ae2:ToolColorApplicator
shapeless=
monitor interface ae2:ItemMaterial.EngProcessor
-> ae2:ItemPart.InterfaceTerminal
shapeless=
ae2:ItemPart.CraftingTerminal ae2:ItemMaterial.EngProcessor
-> ae2:ItemPart.PatternTerminal
shaped=
mc:iron_ingot ae2:BlockQuartzGlass mc:iron_ingot,
ae2:ItemMaterial.AnnihilationCore mc:crafting_table ae2:ItemMaterial.FormationCore,
mc:iron_ingot ae2:BlockQuartzGlass mc:iron_ingot
-> ae2:BlockMolecularAssembler
shaped=
mc:iron_ingot ae2:ItemMaterial.CalcProcessor mc:iron_ingot,
cable ae2:ItemMaterial.LogicProcessor cable,
mc:iron_ingot ae2:ItemMaterial.CalcProcessor mc:iron_ingot
-> ae2:BlockCraftingUnit:0
# co processor
shapeless=
ae2:BlockCraftingUnit:0
ae2:ItemMaterial.EngProcessor
-> ae2:BlockCraftingUnit:1
shapeless=
ae2:BlockCraftingUnit:0
ae2:ItemPart.StorageMonitor
-> ae2:BlockCraftingMonitor
# various storage sizes
shapeless=
ae2:BlockCraftingUnit:0
ae2:ItemMaterial.Cell1kPart
-> ae2:BlockCraftingStorage:0
shapeless=
ae2:BlockCraftingUnit:0
ae2:ItemMaterial.Cell4kPart
-> ae2:BlockCraftingStorage:1
shapeless=
ae2:BlockCraftingUnit:0
ae2:ItemMaterial.Cell16kPart
-> ae2:BlockCraftingStorage:2
shapeless=
ae2:BlockCraftingUnit:0
ae2:ItemMaterial.Cell64kPart
-> ae2:BlockCraftingStorage:3
@@ -0,0 +1,8 @@
shaped=
ae2:BlockQuartz,
ae2:BlockQuartz
-> 2 ae2:BlockQuartzPillar
shaped=
ae2:BlockQuartz ae2:BlockQuartz
-> 2 ae2:BlockQuartzChiseled
@@ -0,0 +1,30 @@
# Raw Storage Blocks
shaped=
oredictionary:crystalCertusQuartz oredictionary:crystalCertusQuartz,
oredictionary:crystalCertusQuartz oredictionary:crystalCertusQuartz
-> ae2:BlockQuartz
shaped=
oredictionary:crystalFluix oredictionary:crystalFluix,
oredictionary:crystalFluix oredictionary:crystalFluix
-> ae2:BlockFluix
# Pure Storage Blocks
shaped=
ae2:ItemMaterial.PurifiedNetherQuartzCrystal ae2:ItemMaterial.PurifiedNetherQuartzCrystal ae2:ItemMaterial.PurifiedNetherQuartzCrystal,
ae2:ItemMaterial.PurifiedNetherQuartzCrystal _ ae2:ItemMaterial.PurifiedNetherQuartzCrystal,
ae2:ItemMaterial.PurifiedNetherQuartzCrystal ae2:ItemMaterial.PurifiedNetherQuartzCrystal ae2:ItemMaterial.PurifiedNetherQuartzCrystal
-> mc:quartz_block
shaped=
ae2:ItemMaterial.PurifiedCertusQuartzCrystal ae2:ItemMaterial.PurifiedCertusQuartzCrystal ae2:ItemMaterial.PurifiedCertusQuartzCrystal,
ae2:ItemMaterial.PurifiedCertusQuartzCrystal _ ae2:ItemMaterial.PurifiedCertusQuartzCrystal,
ae2:ItemMaterial.PurifiedCertusQuartzCrystal ae2:ItemMaterial.PurifiedCertusQuartzCrystal ae2:ItemMaterial.PurifiedCertusQuartzCrystal
-> ae2:BlockQuartz
shaped=
ae2:ItemMaterial.PurifiedFluixCrystal ae2:ItemMaterial.PurifiedFluixCrystal ae2:ItemMaterial.PurifiedFluixCrystal,
ae2:ItemMaterial.PurifiedFluixCrystal _ ae2:ItemMaterial.PurifiedFluixCrystal,
ae2:ItemMaterial.PurifiedFluixCrystal ae2:ItemMaterial.PurifiedFluixCrystal ae2:ItemMaterial.PurifiedFluixCrystal
-> ae2:BlockFluix
@@ -0,0 +1,7 @@
shaped=
ae2:ItemMaterial.CertusQuartzCrystalCharged mc:iron_ingot
-> 2 ae2:BlockQuartzTorch
shaped=
netherCrystal mc:iron_ingot
-> ae2:BlockLightDetector
@@ -0,0 +1,7 @@
import=decorative/certus.recipe
import=decorative/crystals.recipe
import=decorative/fixtures.recipe
import=decorative/quartzglass.recipe
import=decorative/skystone.recipe
import=decorative/slabs.recipe
import=decorative/stairs.recipe
@@ -0,0 +1,9 @@
shaped=
dustQuartz glass dustQuartz,
glass dustQuartz glass,
dustQuartz glass dustQuartz
-> 4 ae2:BlockQuartzGlass
shaped=
mc:glowstone_dust ae2:BlockQuartzGlass mc:glowstone_dust
-> ae2:BlockQuartzLamp
@@ -0,0 +1,11 @@
smelt=
ae2:BlockSkyStone -> ae2:BlockSkyStone:1
shapeless=
ae2:BlockSkyStone:1 -> ae2:BlockSkyStone:2
shapeless=
ae2:BlockSkyStone:2 -> ae2:BlockSkyStone:3
shapeless=
ae2:BlockSkyStone:3 -> ae2:BlockSkyStone:1
@@ -1,47 +1,47 @@
shaped=
ae2:BlockQuartzChiseled _ _,
ae2:BlockQuartzChiseled _ _,
ae2:BlockQuartzChiseled ae2:BlockQuartzChiseled _,
ae2:BlockQuartzChiseled ae2:BlockQuartzChiseled ae2:BlockQuartzChiseled
-> 4 ae2:ChiseledQuartzStairBlock
shaped=
ae2:BlockFluix _ _,
ae2:BlockFluix _ _,
ae2:BlockFluix ae2:BlockFluix _,
ae2:BlockFluix ae2:BlockFluix ae2:BlockFluix
-> 4 ae2:FluixStairBlock
shaped=
ae2:BlockQuartzPillar _ _,
ae2:BlockQuartzPillar _ _,
ae2:BlockQuartzPillar ae2:BlockQuartzPillar _,
ae2:BlockQuartzPillar ae2:BlockQuartzPillar ae2:BlockQuartzPillar
-> 4 ae2:QuartzPillarStairBlock
shaped=
ae2:BlockQuartz _ _,
ae2:BlockQuartz _ _,
ae2:BlockQuartz ae2:BlockQuartz _,
ae2:BlockQuartz ae2:BlockQuartz ae2:BlockQuartz
-> 4 ae2:QuartzStairBlock
shaped=
ae2:BlockSkyStone _ _,
ae2:BlockSkyStone _ _,
ae2:BlockSkyStone ae2:BlockSkyStone _,
ae2:BlockSkyStone ae2:BlockSkyStone ae2:BlockSkyStone
-> 4 ae2:SkyStoneStairBlock
shaped=
ae2:BlockSkyStone:1 _ _,
ae2:BlockSkyStone:1 _ _,
ae2:BlockSkyStone:1 ae2:BlockSkyStone:1 _,
ae2:BlockSkyStone:1 ae2:BlockSkyStone:1 ae2:BlockSkyStone:1
-> 4 ae2:SkyStoneBlockStairBlock
shaped=
ae2:BlockSkyStone:2 _ _,
ae2:BlockSkyStone:2 _ _,
ae2:BlockSkyStone:2 ae2:BlockSkyStone:2 _,
ae2:BlockSkyStone:2 ae2:BlockSkyStone:2 ae2:BlockSkyStone:2
-> 4 ae2:SkyStoneBrickStairBlock
shaped=
ae2:BlockSkyStone:3 _ _,
ae2:BlockSkyStone:3 _ _,
ae2:BlockSkyStone:3 ae2:BlockSkyStone:3 _,
ae2:BlockSkyStone:3 ae2:BlockSkyStone:3 ae2:BlockSkyStone:3
-> 4 ae2:SkyStoneSmallBrickStairBlock
@@ -1,96 +0,0 @@
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeWhite ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.White
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeBlack ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Black
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeRed ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Red
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeGreen ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Green
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeBrown ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Brown
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeBlue ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Blue
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyePurple ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Purple
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeCyan ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Cyan
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeLightGray ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.LightGray
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeGray ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Gray
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyePink ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Pink
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeLime ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Lime
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeYellow ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Yellow
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeLightBlue ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.LightBlue
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeMagenta ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Magenta
shaped=
ae2:CableCovered ae2:CableCovered ae2:CableCovered,
ae2:CableCovered oredictionary:dyeOrange ae2:CableCovered,
ae2:CableCovered ae2:CableCovered ae2:CableCovered
-> 8 ae2:CableCovered.Orange
@@ -1,96 +0,0 @@
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeWhite ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.White
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeBlack ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Black
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeRed ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Red
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeGreen ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Green
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeBrown ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Brown
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeBlue ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Blue
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyePurple ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Purple
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeCyan ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Cyan
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeLightGray ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.LightGray
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeGray ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Gray
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyePink ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Pink
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeLime ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Lime
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeYellow ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Yellow
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeLightBlue ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.LightBlue
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeMagenta ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Magenta
shaped=
ae2:CableDense ae2:CableDense ae2:CableDense,
ae2:CableDense oredictionary:dyeOrange ae2:CableDense,
ae2:CableDense ae2:CableDense ae2:CableDense
-> 8 ae2:CableDense.Orange
@@ -1,96 +0,0 @@
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeWhite ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.White
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeBlack ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Black
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeRed ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Red
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeGreen ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Green
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeBrown ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Brown
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeBlue ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Blue
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyePurple ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Purple
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeCyan ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Cyan
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeLightGray ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.LightGray
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeGray ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Gray
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyePink ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Pink
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeLime ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Lime
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeYellow ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Yellow
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeLightBlue ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.LightBlue
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeMagenta ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Magenta
shaped=
ae2:CableGlass ae2:CableGlass ae2:CableGlass,
ae2:CableGlass oredictionary:dyeOrange ae2:CableGlass,
ae2:CableGlass ae2:CableGlass ae2:CableGlass
-> 8 ae2:CableGlass.Orange
@@ -1,96 +0,0 @@
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeWhite ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.White
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeBlack ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Black
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeRed ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Red
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeGreen ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Green
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeBrown ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Brown
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeBlue ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Blue
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyePurple ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Purple
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeCyan ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Cyan
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeLightGray ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.LightGray
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeGray ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Gray
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyePink ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Pink
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeLime ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Lime
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeYellow ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Yellow
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeLightBlue ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.LightBlue
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeMagenta ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Magenta
shaped=
ae2:CableSmart ae2:CableSmart ae2:CableSmart,
ae2:CableSmart oredictionary:dyeOrange ae2:CableSmart,
ae2:CableSmart ae2:CableSmart ae2:CableSmart
-> 8 ae2:CableSmart.Orange
@@ -0,0 +1,21 @@
group= oredictionary:itemIlluminatedPanel -> monitor
group= ae2:BlockInterface ae2:ItemPart.Interface -> interface
group= ae2:ToolCertusQuartzCuttingKnife:* ae2:ToolNetherQuartzCuttingKnife:* -> knife
group= ae2:ToolCertusQuartzWrench ae2:ToolNetherQuartzWrench -> wrench
group= ae2:CableGlass ae2:CableCovered ae2:CableSmart -> cable
group= ae2:CableDense -> densecable
group= mc:iron_ingot oredictionary:ingotCopper oredictionary:ingotTin oredictionary:ingotSilver oredictionary:ingotLead oredictionary:ingotBronze oredictionary:ingotBrass oredictionary:ingotNickel oredictionary:ingotInvar oredictionary:ingotAluminium -> metalIngots
group= oredictionary:dustEnder oredictionary:dustEnderPearl -> dustEnder
group=oredictionary:blockGlass oredictionary:glass mc:glass -> glass
group=oredictionary:wool mc:wool:* -> wool
group=oredictionary:crystalCertusQuartz oredictionary:crystalNetherQuartz ae2:ItemMaterial.CertusQuartzCrystalCharged -> crystalQuartz
group=oredictionary:dustCertusQuartz oredictionary:dustNetherQuartz -> dustQuartz
group=oredictionary:crystalCertusQuartz ae2:ItemMaterial.CertusQuartzCrystalCharged ae2:ItemMaterial.PurifiedCertusQuartzCrystal -> certusCrystal
group=oredictionary:crystalNetherQuartz ae2:ItemMaterial.PurifiedNetherQuartzCrystal -> netherCrystal
group=oredictionary:crystalFluix ae2:ItemMaterial.PurifiedFluixCrystal -> fluixCrystal
@@ -1,14 +0,0 @@
# Quantum Link Chamber
shaped=
ae2:BlockQuartzGlass ae2:ItemMaterial.FluixPearl ae2:BlockQuartzGlass,
ae2:ItemMaterial.FluixPearl _ ae2:ItemMaterial.FluixPearl,
ae2:BlockQuartzGlass ae2:ItemMaterial.FluixPearl ae2:BlockQuartzGlass,
-> ae2:BlockQuantumLinkChamber
# Quantum Ring
shaped=
mc:iron_ingot ae2:ItemMaterial.LogicProcessor mc:iron_ingot,
ae2:ItemMaterial.EngProcessor ae2:BlockEnergyCell densecable,
mc:iron_ingot ae2:ItemMaterial.LogicProcessor mc:iron_ingot,
-> ae2:BlockQuantumRing

Some files were not shown because too many files have changed in this diff Show More