Compare commits

...

28 Commits

Author SHA1 Message Date
yueh c345826641 Reset the lastUsedChannels on a gridstorage change 2015-07-06 09:59:45 +02:00
yueh 9c3ca0e3d7 Splitted channeldata into two ints
Previously it did encode the current and previous used channels into the
same as well as mask it with 0xFF. Which lead to an overflow every 256
gridnodes requiring a channel. This will not happen at > 2^31

Also removes the need to bitshift them for every access.

Fixes #1510
2015-06-16 18:11:46 +02:00
thatsIch 52d62b8202 Merge pull request #1591 from thatsIch/e-update-to-bc-7
Updates BC to 7.0.9 for rv2
2015-06-14 18:19:03 +02:00
thatsIch 643f559186 Fixes #1559: Level Emitter with P:R alloy wire does not crash anymore
Required to implement a more advanced interface, if not done that way, the parts will update themselves recursively
2015-06-14 10:10:51 +02:00
thatsIch 09ed06e47f Fixes #1588: Charged Certus Quartz Ore has its own oredictionary entry 2015-06-14 10:10:36 +02:00
thatsIch 741b5bee1f Updates BC to 7.0.9
Fixes disabling of BC integration
2015-06-13 22:53:57 +02:00
Uristqwerty c1c3655db6 Cleaned up CraftGuide Integration
A NPE caused to open CraftGuide very slowly (several seconds)

Added Grinder recipes
Added Inscriber recipes

Conflicts:
	src/main/java/appeng/integration/modules/CraftGuide.java
2015-06-09 23:42:03 +02:00
yueh b05796e62b No longer invalidate the cache of MEMonitorIInventory on simulate.
Should fix #1036
2015-06-05 23:06:57 +02:00
thatsIch 200e56a509 Fixes #1536: Checking for all required BC classes 2015-06-01 20:47:04 +02:00
thatsIch 9540bbce49 Merge pull request #1499 from TheJulianJES/patch-5
Changed version from PartStack provider to rv2 (rv3)
2015-05-23 13:52:58 +02:00
TheJulianJES c6d932da04 Changed version from PartStack provider to rv2 (rv3)
because @thatsIch merged it also to rv2
2015-05-23 13:49:52 +02:00
yueh 6e7100361c Fixes #1465 faulty item comparison 2015-05-19 21:16:30 +02:00
TheJulianJES ca50ee0762 Removes default RF tooltip
Removed tab

Did something
2015-05-19 21:16:10 +02:00
TheJulianJES f00d5c297f Parts display correctly in WAILA
Register an method that can be overidden

Register the same method in the interface

New class that picks the item and displays it to WAILA

Register the new class and call the other class method

Import in PartWailaDataProvider

Fixed errors

Renamed all Display -> Stack

Stuff
2015-05-19 21:15:50 +02:00
yueh b13f5ced01 Fixes #1389 Enabled repeatable keyboard events 2015-05-19 21:14:49 +02:00
thatsIch 1c0f1ea243 Merge branch 'rv2' of https://github.com/AppliedEnergistics/Applied-Energistics-2 into rv2 2015-05-19 21:11:26 +02:00
Jeremiah Winsley b612ff47a3 Test with V6e of RotaryCraft
Conflicts:
	gradle.properties
2015-05-19 21:10:08 +02:00
Jeremiah Winsley e8a68cc531 Fixes #1384 - implement AdvancedShaftPowerReceiver for RotaryCraft powersink 2015-05-19 21:08:37 +02:00
thatsIch d9f362270b Merge pull request #1454 from TheJulianJES/doublePlayerInvInscriber
Don't add the player inventory two times (rv2)
2015-05-14 12:43:21 +02:00
TheJulianJES 37aef15a02 Don't add the player inventory two times (rv2) 2015-05-14 12:38:44 +02:00
thatsIch 2d8728f0e1 Merge pull request #1437 from TheJulianJES/GermanLang
Changed things in de_DE.lang (rv2)
2015-05-10 12:12:08 +02:00
thatsIch 3498a0902b Merge pull request #1434 from plumpudding/errorEclipse
Error eclipse for rv2 branch
2015-05-10 12:11:58 +02:00
TheJulianJES bb4b6719fe Changed things in de_DE.lang 2015-05-10 10:34:54 +02:00
TheJulianJES 34f78a7ce4 Fix warnings in eclipse
Close scanner instead of doing it with a warning

Make the scanner final..
2015-05-10 00:14:56 +02:00
thatsIch 064acc21ee Fixes #1411: Adds recipes for stairs 2015-05-08 18:36:42 +02:00
Lorenzo Dalla Costa Cervelin deeb67f07d Update pt_BR.lang 2015-05-08 17:59:55 +02:00
thatsIch 2eeaa80b59 Merge pull request #1380 from thatsIch/e-fix-javadoc
Fixed missing Javadoc parameter
2015-05-03 21:48:53 +02:00
thatsIch 7cb485aa48 Fixed missing Javadoc parameter
Reworked the instantiation a bit
Added some additional checks due to the new nonnullability.
2015-05-03 16:45:27 +02:00
30 changed files with 552 additions and 260 deletions

View File

@ -1,5 +1,5 @@
aeversion=rv2 aeversion=rv2
aechannel=beta aechannel=stable
aebuild=0 aebuild=0
aegroup=appeng aegroup=appeng
aebasename=appliedenergistics2 aebasename=appliedenergistics2
@ -33,13 +33,13 @@ fmp_version=1.1.1.324
code_chicken_lib_version=1.1.3.127 code_chicken_lib_version=1.1.3.127
code_chicken_core_version=1.0.4.35 code_chicken_core_version=1.0.4.35
nei_version=1.0.4.90 nei_version=1.0.4.90
bc_version=6.4.6 bc_version=7.0.9
######################################################### #########################################################
# Self Compiled APIs # # Self Compiled APIs #
######################################################### #########################################################
mekansim_version=8.0.1.198 mekansim_version=8.0.1.198
rotarycraft_version=V5c rotarycraft_version=V6e
######################################################### #########################################################

View File

@ -45,10 +45,16 @@ repositories {
url = "http://maven.tterrag.com/" url = "http://maven.tterrag.com/"
} }
maven { maven {
name = "RX14 Proxy" name = "RX14 Proxy"
url = "http://mvn.rx14.co.uk/repo/" url = "http://mvn.rx14.co.uk/repo/"
} }
ivy {
name "BuildCraft"
artifactPattern "http://www.mod-buildcraft.com/releases/BuildCraft/[revision]/[module]-[revision]-[classifier].[ext]"
}
// CurseForge DNS for TE is not available or I am just being unlucky, code part can stay since this is applicable to any other curseforge mod though // CurseForge DNS for TE is not available or I am just being unlucky, code part can stay since this is applicable to any other curseforge mod though
// ivy { // ivy {
// name = "CoFHLib" // name = "CoFHLib"

View File

@ -1,6 +1,6 @@
/* /*
* This file is part of Applied Energistics 2. * This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
* *
* Applied Energistics 2 is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU Lesser General Public License as published by
@ -29,7 +29,6 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.MathHelper; import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.oredict.OreDictionary;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.api.exceptions.MissingDefinition; import appeng.api.exceptions.MissingDefinition;
@ -67,12 +66,6 @@ public class OreQuartz extends AEBaseBlock
return RenderQuartzOre.class; return RenderQuartzOre.class;
} }
@Override
public void postInit()
{
OreDictionary.registerOre( "oreCertusQuartz", new ItemStack( this ) );
}
@Override @Override
public int getMixedBrightnessForBlock( IBlockAccess par1iBlockAccess, int par2, int par3, int par4 ) public int getMixedBrightnessForBlock( IBlockAccess par1iBlockAccess, int par2, int par3, int par4 )
{ {

View File

@ -22,6 +22,7 @@ package appeng.client.gui.implementations;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse; import org.lwjgl.input.Mouse;
import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiButton;
@ -218,6 +219,8 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
@Override @Override
public void initGui() public void initGui()
{ {
Keyboard.enableRepeatEvents( true );
this.maxRows = this.getMaxRows(); this.maxRows = this.getMaxRows();
this.perRow = AEConfig.instance.getConfigManager().getSetting( Settings.TERMINAL_STYLE ) != TerminalStyle.FULL ? 9 : 9 + ( ( this.width - this.standardSize ) / 18 ); this.perRow = AEConfig.instance.getConfigManager().getSetting( Settings.TERMINAL_STYLE ) != TerminalStyle.FULL ? 9 : 9 + ( ( this.width - this.standardSize ) / 18 );
@ -383,6 +386,7 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
public void onGuiClosed() public void onGuiClosed()
{ {
super.onGuiClosed(); super.onGuiClosed();
Keyboard.enableRepeatEvents( false );
memoryText = this.searchField.getText(); memoryText = this.searchField.getText();
} }

View File

@ -65,8 +65,6 @@ public class ContainerInscriber extends ContainerUpgradeable implements IProgres
this.addSlotToContainer( this.middle = new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.INSCRIBER_INPUT, this.ti, 2, 63, 39, this.invPlayer ) ); this.addSlotToContainer( this.middle = new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.INSCRIBER_INPUT, this.ti, 2, 63, 39, this.invPlayer ) );
this.addSlotToContainer( new SlotOutput( this.ti, 3, 113, 40, -1 ) ); this.addSlotToContainer( new SlotOutput( this.ti, 3, 113, 40, -1 ) );
this.bindPlayerInventory( ip, 0, this.getHeight() - /* height of player inventory */82 );
} }
@Override @Override

View File

@ -20,6 +20,11 @@ package appeng.core.features;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import javax.annotation.Nonnull;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.item.Item; import net.minecraft.item.Item;
@ -27,10 +32,6 @@ import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ObjectArrays;
import appeng.api.definitions.IBlockDefinition; import appeng.api.definitions.IBlockDefinition;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
@ -92,13 +93,16 @@ public class BlockDefinition extends ItemDefinition implements IBlockDefinition
/** /**
* Create an {@link ItemBlock} from a {@link Block} to register it later as {@link Item} * Create an {@link ItemBlock} from a {@link Block} to register it later as {@link Item}
* *
* @param block * @param block to be constructed from
* @return *
* @return item from block
*/ */
@Nonnull
private static Item constructItemFromBlock( Block block ) private static Item constructItemFromBlock( Block block )
{ {
final Class<? extends ItemBlock> itemclass = getItemBlockConstructor( block ); final Class<? extends ItemBlock> itemClass = getItemBlockConstructor( block );
return constructItemBlock( block, itemclass );
return constructItemBlock( block, itemClass );
} }
/** /**
@ -110,6 +114,7 @@ public class BlockDefinition extends ItemDefinition implements IBlockDefinition
* @param block the block used to determine the used constructor. * @param block the block used to determine the used constructor.
* @return a {@link Class} extending ItemBlock * @return a {@link Class} extending ItemBlock
*/ */
@Nonnull
private static Class<? extends ItemBlock> getItemBlockConstructor( Block block ) private static Class<? extends ItemBlock> getItemBlockConstructor( Block block )
{ {
if ( block instanceof AEBaseBlock ) if ( block instanceof AEBaseBlock )
@ -124,32 +129,39 @@ public class BlockDefinition extends ItemDefinition implements IBlockDefinition
/** /**
* Actually construct an instance of {@link Item} with the block and earlier determined constructor. * Actually construct an instance of {@link Item} with the block and earlier determined constructor.
* *
* Shamelessly stolen from the forge magic.
*
* TODO: throw an exception instead of returning null? As this could cause issue later on.
*
* @param block the block to create the {@link ItemBlock} from * @param block the block to create the {@link ItemBlock} from
* @param itemclass the class used to construct it. * @param itemClass the class used to construct it.
* @return an {@link Item} for the block. Actually always a sub type of {@link ItemBlock} * @return an {@link Item} for the block. Actually always a sub type of {@link ItemBlock}
*/ */
private static Item constructItemBlock( Block block, Class<? extends ItemBlock> itemclass ) @Nonnull
private static Item constructItemBlock( Block block, Class<? extends ItemBlock> itemClass )
{ {
assert block != null;
assert itemClass != null;
try try
{ {
Object[] itemCtorArgs = new Object[] {}; final Constructor<? extends ItemBlock> itemConstructor = itemClass.getConstructor( Block.class );
Class<?>[] ctorArgClasses = new Class<?>[itemCtorArgs.length + 1];
ctorArgClasses[0] = Block.class;
for ( int idx = 1; idx < ctorArgClasses.length; idx++ )
{
ctorArgClasses[idx] = itemCtorArgs[idx - 1].getClass();
}
Constructor<? extends ItemBlock> itemCtor = itemclass.getConstructor( ctorArgClasses ); return itemConstructor.newInstance( block );
return itemCtor.newInstance( ObjectArrays.concat( block, itemCtorArgs ) );
} }
catch ( Throwable t ) catch( InstantiationException e )
{ {
return null; e.printStackTrace();
} }
catch( IllegalAccessException e )
{
e.printStackTrace();
}
catch( InvocationTargetException e )
{
e.printStackTrace();
}
catch( NoSuchMethodException e )
{
e.printStackTrace();
}
throw new IllegalStateException( "Tried to construct an ItemBlock from Block " + block.getUnlocalizedName() + " and Class<Item>" + itemClass );
} }
} }

View File

@ -19,23 +19,26 @@
package appeng.core.features; package appeng.core.features;
import net.minecraft.item.Item; import javax.annotation.Nonnull;
import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess;
import appeng.api.definitions.IItemDefinition; import appeng.api.definitions.IItemDefinition;
import appeng.util.Platform; import appeng.util.Platform;
public class ItemDefinition implements IItemDefinition public class ItemDefinition implements IItemDefinition
{ {
@Nonnull
private final Item item; private final Item item;
private final boolean enabled; private final boolean enabled;
public ItemDefinition( Item item, ActivityState state ) public ItemDefinition( @Nonnull Item item, @Nonnull ActivityState state )
{ {
Preconditions.checkNotNull( item ); Preconditions.checkNotNull( item );
Preconditions.checkNotNull( state ); Preconditions.checkNotNull( state );

View File

@ -85,7 +85,10 @@ public final class WrappedDamageItemDefinition implements ITileDefinition
return false; return false;
} }
return this.definition.isSameAs( comparableStack ) && comparableStack.getItemDamage() == this.damage; final boolean sameItem = this.definition.isSameAs( new ItemStack( comparableStack.getItem() ) );
final boolean sameDamage = comparableStack.getItemDamage() == this.damage;
return sameItem && sameDamage;
} }
@Override @Override

View File

@ -1,6 +1,6 @@
/* /*
* This file is part of Applied Energistics 2. * This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
* *
* Applied Energistics 2 is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU Lesser General Public License as published by
@ -44,7 +44,7 @@ import codechicken.lib.data.MCDataOutput;
import codechicken.lib.raytracer.IndexedCuboid6; import codechicken.lib.raytracer.IndexedCuboid6;
import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Cuboid6;
import codechicken.lib.vec.Vector3; import codechicken.lib.vec.Vector3;
import codechicken.multipart.IRedstonePart; import codechicken.multipart.IMaskedRedstonePart;
import codechicken.multipart.JCuboidPart; import codechicken.multipart.JCuboidPart;
import codechicken.multipart.JNormalOcclusion; import codechicken.multipart.JNormalOcclusion;
import codechicken.multipart.NormalOcclusionTest; import codechicken.multipart.NormalOcclusionTest;
@ -83,24 +83,41 @@ import appeng.util.Platform;
* *
* TSlottedPart,ISidedHollowConnect * TSlottedPart,ISidedHollowConnect
*/ */
public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IRedstonePart, AEMultiTile public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IMaskedRedstonePart, AEMultiTile
{ {
public static final ThreadLocal<Boolean> DISABLE_FACADE_OCCLUSION = new ThreadLocal<Boolean>(); public static final ThreadLocal<Boolean> DISABLE_FACADE_OCCLUSION = new ThreadLocal<Boolean>();
private static final double SHORTER = 6.0 / 16.0;
private static final double LONGER = 10.0 / 16.0;
private static final double MIN_DIRECTION = 0;
private static final double MAX_DIRECTION = 1.0;
private static final Cuboid6[] SIDE_TESTS = new Cuboid6[] { private static final Cuboid6[] SIDE_TESTS = new Cuboid6[] {
new Cuboid6( 6.0 / 16.0, 0, 6.0 / 16.0, 10.0 / 16.0, 6.0 / 16.0, 10.0 / 16.0 ), // DOWN(0, -1, 0), // DOWN(0, -1, 0),
new Cuboid6( SHORTER, MIN_DIRECTION, SHORTER, LONGER, SHORTER, LONGER ),
new Cuboid6( 6.0 / 16.0, 10.0 / 16.0, 6.0 / 16.0, 10.0 / 16.0, 1.0, 10.0 / 16.0 ), // UP(0, 1, 0), // UP(0, 1, 0),
new Cuboid6( SHORTER, LONGER, SHORTER, LONGER, MAX_DIRECTION, LONGER ),
new Cuboid6( 6.0 / 16.0, 6.0 / 16.0, 0.0, 10.0 / 16.0, 10.0 / 16.0, 6.0 / 16.0 ),// NORTH(0, 0, -1), // NORTH(0, 0, -1),
new Cuboid6( SHORTER, SHORTER, MIN_DIRECTION, LONGER, LONGER, SHORTER ),
new Cuboid6( 6.0 / 16.0, 6.0 / 16.0, 10.0 / 16.0, 10.0 / 16.0, 10.0 / 16.0, 1.0 ),// SOUTH(0, 0, 1), // SOUTH(0, 0, 1),
new Cuboid6( SHORTER, SHORTER, LONGER, LONGER, LONGER, MAX_DIRECTION ),
new Cuboid6( 0.0, 6.0 / 16.0, 6.0 / 16.0, 6.0 / 16.0, 10.0 / 16.0, 10.0 / 16.0 ),// WEST(-1, 0, 0), // WEST(-1, 0, 0),
new Cuboid6( MIN_DIRECTION, SHORTER, SHORTER, SHORTER, LONGER, LONGER ),
new Cuboid6( 10.0 / 16.0, 6.0 / 16.0, 6.0 / 16.0, 1.0, 10.0 / 16.0, 10.0 / 16.0 ),// EAST(1, 0, 0), // EAST(1, 0, 0),
new Cuboid6( LONGER, SHORTER, SHORTER, MAX_DIRECTION, LONGER, LONGER ),
}; };
/**
* Mask for {@link IMaskedRedstonePart#getConnectionMask(int)}
*
* the bits are derived from the rotation, where 4 is the center
*/
private static final int CONNECTION_MASK = 0x000010;
public CableBusContainer cb = new CableBusContainer( this ); public CableBusContainer cb = new CableBusContainer( this );
boolean canUpdate = false; boolean canUpdate = false;
@ -559,15 +576,6 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds
public void clearContainer() public void clearContainer()
{ {
this.cb = new CableBusContainer( this ); this.cb = new CableBusContainer( this );
} @Override
public Iterable<Cuboid6> getCollisionBoxes()
{
LinkedList<Cuboid6> l = new LinkedList<Cuboid6>();
for( AxisAlignedBB b : this.cb.getSelectedBoundingBoxesFromPool( false, true, null, true ) )
{
l.add( new Cuboid6( b.minX, b.minY, b.minZ, b.maxX, b.maxY, b.maxZ ) );
}
return l;
} }
@Override @Override
@ -579,7 +587,11 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds
} }
DISABLE_FACADE_OCCLUSION.set( true ); DISABLE_FACADE_OCCLUSION.set( true );
boolean blocked = !this.tile().canAddPart( new NormallyOccludedPart( SIDE_TESTS[side.ordinal()] ) );
final int ordinal = side.ordinal();
final Cuboid6 sideTest = SIDE_TESTS[ordinal];
final NormallyOccludedPart occludedPart = new NormallyOccludedPart( sideTest );
boolean blocked = !this.tile().canAddPart( occludedPart );
DISABLE_FACADE_OCCLUSION.remove(); DISABLE_FACADE_OCCLUSION.remove();
return blocked; return blocked;
@ -627,15 +639,6 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds
public Set<LayerFlags> getLayerFlags() public Set<LayerFlags> getLayerFlags()
{ {
return this.cb.getLayerFlags(); return this.cb.getLayerFlags();
} @Override
public Iterable<IndexedCuboid6> getSubParts()
{
LinkedList<IndexedCuboid6> l = new LinkedList<IndexedCuboid6>();
for( Cuboid6 c : this.getCollisionBoxes() )
{
l.add( new IndexedCuboid6( 0, c ) );
}
return l;
} }
@Override @Override
@ -664,7 +667,31 @@ public class CableBusPart extends JCuboidPart implements JNormalOcclusion, IReds
return this.cb.isInWorld(); return this.cb.isInWorld();
} }
@Override
public Iterable<Cuboid6> getCollisionBoxes()
{
LinkedList<Cuboid6> l = new LinkedList<Cuboid6>();
for( AxisAlignedBB b : this.cb.getSelectedBoundingBoxesFromPool( false, true, null, true ) )
{
l.add( new Cuboid6( b.minX, b.minY, b.minZ, b.maxX, b.maxY, b.maxZ ) );
}
return l;
}
@Override
public Iterable<IndexedCuboid6> getSubParts()
{
LinkedList<IndexedCuboid6> l = new LinkedList<IndexedCuboid6>();
for( Cuboid6 c : this.getCollisionBoxes() )
{
l.add( new IndexedCuboid6( 0, c ) );
}
return l;
}
@Override
public int getConnectionMask( int side )
{
return CONNECTION_MASK;
}
} }

View File

@ -1,6 +1,6 @@
/* /*
* This file is part of Applied Energistics 2. * This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
* *
* Applied Energistics 2 is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU Lesser General Public License as published by
@ -27,7 +27,7 @@ public enum IntegrationType
RC( IntegrationSide.BOTH, "Railcraft", "Railcraft" ), RC( IntegrationSide.BOTH, "Railcraft", "Railcraft" ),
BC( IntegrationSide.BOTH, "BuildCraft", "BuildCraft|Silicon" ), BC( IntegrationSide.BOTH, "BuildCraft", "BuildCraft|Core" ),
RF( IntegrationSide.BOTH, "RedstoneFlux Power - Tiles", "CoFHAPI" ), RF( IntegrationSide.BOTH, "RedstoneFlux Power - Tiles", "CoFHAPI" ),

View File

@ -1,6 +1,6 @@
/* /*
* This file is part of Applied Energistics 2. * This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
* *
* Applied Energistics 2 is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU Lesser General Public License as published by
@ -31,10 +31,14 @@ import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.event.FMLInterModComms;
import buildcraft.BuildCraftCore;
import buildcraft.BuildCraftEnergy; import buildcraft.BuildCraftEnergy;
import buildcraft.BuildCraftTransport; import buildcraft.BuildCraftTransport;
import buildcraft.api.blueprints.BuilderAPI; import buildcraft.api.blueprints.BuilderAPI;
import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.ISchematicRegistry; import buildcraft.api.blueprints.ISchematicRegistry;
import buildcraft.api.blueprints.SchematicBlock;
import buildcraft.api.blueprints.SchematicTile;
import buildcraft.api.facades.IFacadeItem; import buildcraft.api.facades.IFacadeItem;
import buildcraft.api.tools.IToolWrench; import buildcraft.api.tools.IToolWrench;
import buildcraft.api.transport.IInjectable; import buildcraft.api.transport.IInjectable;
@ -68,9 +72,21 @@ public final class BC extends BaseModule implements IBC
public BC() public BC()
{ {
this.testClassExistence( IPipeConnection.class ); this.testClassExistence( BuildCraftEnergy.class );
this.testClassExistence( ItemFacade.class ); this.testClassExistence( BuildCraftTransport.class );
this.testClassExistence( BuilderAPI.class );
this.testClassExistence( IBuilderContext.class );
this.testClassExistence( ISchematicRegistry.class );
this.testClassExistence( IFacadeItem.class );
this.testClassExistence( IToolWrench.class ); this.testClassExistence( IToolWrench.class );
this.testClassExistence( IInjectable.class );
this.testClassExistence( IPipeConnection.class );
this.testClassExistence( IPipeTile.class );
this.testClassExistence( ItemFacade.class );
this.testClassExistence( PipeIconProvider.class );
this.testClassExistence( SchematicTile.class );
this.testClassExistence( SchematicBlock.class );
this.testClassExistence( IPipeTile.PipeType.class );
} }
@Override @Override
@ -166,9 +182,9 @@ public final class BC extends BaseModule implements IBC
public void registerPowerP2P() public void registerPowerP2P()
{ {
IP2PTunnelRegistry reg = AEApi.instance().registries().p2pTunnel(); IP2PTunnelRegistry reg = AEApi.instance().registries().p2pTunnel();
reg.addNewAttunement( new ItemStack( BuildCraftEnergy.engineBlock, 1, 0 ), TunnelType.RF_POWER ); reg.addNewAttunement( new ItemStack( BuildCraftCore.engineBlock, 1, 0 ), TunnelType.RF_POWER );
reg.addNewAttunement( new ItemStack( BuildCraftEnergy.engineBlock, 1, 1 ), TunnelType.RF_POWER ); reg.addNewAttunement( new ItemStack( BuildCraftCore.engineBlock, 1, 1 ), TunnelType.RF_POWER );
reg.addNewAttunement( new ItemStack( BuildCraftEnergy.engineBlock, 1, 2 ), TunnelType.RF_POWER ); reg.addNewAttunement( new ItemStack( BuildCraftCore.engineBlock, 1, 2 ), TunnelType.RF_POWER );
reg.addNewAttunement( new ItemStack( BuildCraftTransport.pipePowerCobblestone ), TunnelType.RF_POWER ); reg.addNewAttunement( new ItemStack( BuildCraftTransport.pipePowerCobblestone ), TunnelType.RF_POWER );
reg.addNewAttunement( new ItemStack( BuildCraftTransport.pipePowerDiamond ), TunnelType.RF_POWER ); reg.addNewAttunement( new ItemStack( BuildCraftTransport.pipePowerDiamond ), TunnelType.RF_POWER );
reg.addNewAttunement( new ItemStack( BuildCraftTransport.pipePowerGold ), TunnelType.RF_POWER ); reg.addNewAttunement( new ItemStack( BuildCraftTransport.pipePowerGold ), TunnelType.RF_POWER );

View File

@ -1,6 +1,6 @@
/* /*
* This file is part of Applied Energistics 2. * This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
* *
* Applied Energistics 2 is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU Lesser General Public License as published by
@ -21,8 +21,10 @@ package appeng.integration.modules;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import javax.annotation.Nullable;
import com.google.common.base.Optional;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipe;
@ -32,95 +34,173 @@ import cpw.mods.fml.relauncher.ReflectionHelper;
import uristqwerty.CraftGuide.CraftGuideLog; import uristqwerty.CraftGuide.CraftGuideLog;
import uristqwerty.CraftGuide.DefaultRecipeTemplate; import uristqwerty.CraftGuide.DefaultRecipeTemplate;
import uristqwerty.CraftGuide.RecipeGeneratorImplementation; import uristqwerty.CraftGuide.RecipeGeneratorImplementation;
import uristqwerty.CraftGuide.api.ChanceSlot;
import uristqwerty.CraftGuide.api.CraftGuideAPIObject; import uristqwerty.CraftGuide.api.CraftGuideAPIObject;
import uristqwerty.CraftGuide.api.CraftGuideRecipe;
import uristqwerty.CraftGuide.api.ItemSlot; import uristqwerty.CraftGuide.api.ItemSlot;
import uristqwerty.CraftGuide.api.RecipeGenerator; import uristqwerty.CraftGuide.api.RecipeGenerator;
import uristqwerty.CraftGuide.api.RecipeProvider; import uristqwerty.CraftGuide.api.RecipeProvider;
import uristqwerty.CraftGuide.api.RecipeTemplate; import uristqwerty.CraftGuide.api.RecipeTemplate;
import uristqwerty.CraftGuide.api.Slot; import uristqwerty.CraftGuide.api.Slot;
import uristqwerty.CraftGuide.api.SlotType; import uristqwerty.CraftGuide.api.SlotType;
import uristqwerty.CraftGuide.api.StackInfo;
import uristqwerty.CraftGuide.api.StackInfoSource;
import uristqwerty.gui_craftguide.texture.DynamicTexture; import uristqwerty.gui_craftguide.texture.DynamicTexture;
import uristqwerty.gui_craftguide.texture.TextureClip; import uristqwerty.gui_craftguide.texture.TextureClip;
import appeng.api.AEApi;
import appeng.api.IAppEngApi;
import appeng.api.definitions.IBlocks;
import appeng.api.exceptions.MissingIngredientError; import appeng.api.exceptions.MissingIngredientError;
import appeng.api.exceptions.RegistrationError; import appeng.api.exceptions.RegistrationError;
import appeng.api.features.IGrinderEntry;
import appeng.api.features.IInscriberRecipe;
import appeng.api.recipes.IIngredient; import appeng.api.recipes.IIngredient;
import appeng.helpers.Reflected;
import appeng.integration.IIntegrationModule; import appeng.integration.IIntegrationModule;
import appeng.recipes.game.ShapedRecipe; import appeng.recipes.game.ShapedRecipe;
import appeng.recipes.game.ShapelessRecipe; import appeng.recipes.game.ShapelessRecipe;
public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModule, RecipeProvider, StackInfoSource, RecipeGenerator public final class CraftGuide extends CraftGuideAPIObject implements IIntegrationModule, RecipeProvider
{ {
private static final int SLOT_SIZE = 16;
private static final int TEXTURE_WIDTH = 79;
private static final int TEXTURE_HEIGHT = 58;
private static final int GRINDER_RATIO = 10000;
private static final Slot[] GRINDER_SLOTS = new ItemSlot[] {
new ItemSlot( 3, 21, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 41, 21, SLOT_SIZE, SLOT_SIZE, true ).drawOwnBackground().setSlotType( SlotType.OUTPUT_SLOT ),
new ChanceSlot( 59, 12, SLOT_SIZE, SLOT_SIZE, true ).setRatio( GRINDER_RATIO ).setFormatString( " (%1$.2f%% chance)" ).drawOwnBackground().setSlotType( SlotType.OUTPUT_SLOT ),
new ChanceSlot( 59, 30, SLOT_SIZE, SLOT_SIZE, true ).setRatio( GRINDER_RATIO ).setFormatString( " (%1$.2f%% chance)" ).drawOwnBackground().setSlotType( SlotType.OUTPUT_SLOT ),
new ItemSlot( 22, 12, SLOT_SIZE, SLOT_SIZE ).setSlotType( SlotType.MACHINE_SLOT ),
new ItemSlot( 22, 30, SLOT_SIZE, SLOT_SIZE ).setSlotType( SlotType.MACHINE_SLOT )
};
private static final Slot[] INSCRIBER_SLOTS = new ItemSlot[] {
new ItemSlot( 12, 21, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 21, 3, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 21, 39, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 50, 21, SLOT_SIZE, SLOT_SIZE, true ).drawOwnBackground().setSlotType( SlotType.OUTPUT_SLOT ),
new ItemSlot( 31, 21, SLOT_SIZE, SLOT_SIZE ).setSlotType( SlotType.MACHINE_SLOT )
};
private static final Slot[] SHAPELESS_CRAFTING_SLOTS = new ItemSlot[] {
new ItemSlot( 3, 3, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 21, 3, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 39, 3, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 3, 21, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 21, 21, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 39, 21, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 3, 39, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 21, 39, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 39, 39, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 59, 21, SLOT_SIZE, SLOT_SIZE, true ).setSlotType( SlotType.OUTPUT_SLOT ),
};
private static final Slot[] CRAFTING_SLOTS_OWN_BG = new ItemSlot[] {
new ItemSlot( 3, 3, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 21, 3, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 39, 3, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 3, 21, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 21, 21, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 39, 21, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 3, 39, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 21, 39, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 39, 39, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 59, 21, SLOT_SIZE, SLOT_SIZE, true ).setSlotType( SlotType.OUTPUT_SLOT ).drawOwnBackground(),
};
private static final Slot[] SMALL_CRAFTING_SLOTS_OWN_BG = new ItemSlot[] {
new ItemSlot( 12, 12, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 30, 12, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 12, 30, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 30, 30, SLOT_SIZE, SLOT_SIZE ).drawOwnBackground(),
new ItemSlot( 59, 21, SLOT_SIZE, SLOT_SIZE, true ).setSlotType( SlotType.OUTPUT_SLOT ).drawOwnBackground(),
};
private static final Slot[] CRTAFTING_SLOTS = new ItemSlot[] {
new ItemSlot( 3, 3, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 21, 3, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 39, 3, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 3, 21, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 21, 21, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 39, 21, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 3, 39, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 21, 39, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 39, 39, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 59, 21, SLOT_SIZE, SLOT_SIZE, true ).setSlotType( SlotType.OUTPUT_SLOT ),
};
private static final Slot[] SMALL_CRAFTING_SLOTS = new ItemSlot[] {
new ItemSlot( 12, 12, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 30, 12, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 12, 30, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 30, 30, SLOT_SIZE, SLOT_SIZE ),
new ItemSlot( 59, 21, SLOT_SIZE, SLOT_SIZE, true ).setSlotType( SlotType.OUTPUT_SLOT ),
};
@Reflected
public static CraftGuide instance; public static CraftGuide instance;
private final Slot[] shapelessCraftingSlots = new ItemSlot[] { new ItemSlot( 3, 3, 16, 16 ), new ItemSlot( 21, 3, 16, 16 ), new ItemSlot( 39, 3, 16, 16 ), new ItemSlot( 3, 21, 16, 16 ), new ItemSlot( 21, 21, 16, 16 ), new ItemSlot( 39, 21, 16, 16 ), new ItemSlot( 3, 39, 16, 16 ), new ItemSlot( 21, 39, 16, 16 ), new ItemSlot( 39, 39, 16, 16 ), new ItemSlot( 59, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ), };
private final Slot[] craftingSlotsOwnBackground = new ItemSlot[] { new ItemSlot( 3, 3, 16, 16 ).drawOwnBackground(), new ItemSlot( 21, 3, 16, 16 ).drawOwnBackground(), new ItemSlot( 39, 3, 16, 16 ).drawOwnBackground(), new ItemSlot( 3, 21, 16, 16 ).drawOwnBackground(), new ItemSlot( 21, 21, 16, 16 ).drawOwnBackground(), new ItemSlot( 39, 21, 16, 16 ).drawOwnBackground(), new ItemSlot( 3, 39, 16, 16 ).drawOwnBackground(), new ItemSlot( 21, 39, 16, 16 ).drawOwnBackground(), new ItemSlot( 39, 39, 16, 16 ).drawOwnBackground(), new ItemSlot( 59, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ).drawOwnBackground(), };
private final Slot[] smallCraftingSlotsOwnBackground = new ItemSlot[] { new ItemSlot( 12, 12, 16, 16 ).drawOwnBackground(), new ItemSlot( 30, 12, 16, 16 ).drawOwnBackground(), new ItemSlot( 12, 30, 16, 16 ).drawOwnBackground(), new ItemSlot( 30, 30, 16, 16 ).drawOwnBackground(), new ItemSlot( 59, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ).drawOwnBackground(), };
private final Slot[] craftingSlots = new ItemSlot[] { new ItemSlot( 3, 3, 16, 16 ), new ItemSlot( 21, 3, 16, 16 ), new ItemSlot( 39, 3, 16, 16 ), new ItemSlot( 3, 21, 16, 16 ), new ItemSlot( 21, 21, 16, 16 ), new ItemSlot( 39, 21, 16, 16 ), new ItemSlot( 3, 39, 16, 16 ), new ItemSlot( 21, 39, 16, 16 ), new ItemSlot( 39, 39, 16, 16 ), new ItemSlot( 59, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ), };
private final Slot[] smallCraftingSlots = new ItemSlot[] { new ItemSlot( 12, 12, 16, 16 ), new ItemSlot( 30, 12, 16, 16 ), new ItemSlot( 12, 30, 16, 16 ), new ItemSlot( 30, 30, 16, 16 ), new ItemSlot( 59, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ), };
private final Slot[] furnaceSlots = new ItemSlot[] { new ItemSlot( 13, 21, 16, 16 ), new ItemSlot( 50, 21, 16, 16, true ).setSlotType( SlotType.OUTPUT_SLOT ), };
RecipeGenerator parent;
@Override
public String getInfo( ItemStack itemStack )
{
// :P
return null;
}
@Override @Override
public void generateRecipes( RecipeGenerator generator ) public void generateRecipes( RecipeGenerator generator )
{ {
this.parent = generator; final RecipeTemplate craftingTemplate;
final RecipeTemplate smallTemplate;
RecipeTemplate craftingTemplate;
RecipeTemplate smallCraftingTemplate;
if( uristqwerty.CraftGuide.CraftGuide.newerBackgroundStyle ) if( uristqwerty.CraftGuide.CraftGuide.newerBackgroundStyle )
{ {
craftingTemplate = generator.createRecipeTemplate( this.craftingSlotsOwnBackground, null ); craftingTemplate = generator.createRecipeTemplate( CRAFTING_SLOTS_OWN_BG, null );
smallCraftingTemplate = generator.createRecipeTemplate( this.smallCraftingSlotsOwnBackground, null ); smallTemplate = generator.createRecipeTemplate( SMALL_CRAFTING_SLOTS_OWN_BG, null );
} }
else else
{ {
craftingTemplate = new DefaultRecipeTemplate( this.craftingSlots, RecipeGeneratorImplementation.workbench, new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 1, 79, 58 ), new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 1, 79, 58 ) ); final TextureClip craftingBG = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 1, TEXTURE_WIDTH, TEXTURE_HEIGHT );
final TextureClip craftingSelected = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 1, TEXTURE_WIDTH, TEXTURE_HEIGHT );
craftingTemplate = new DefaultRecipeTemplate( CRTAFTING_SLOTS, RecipeGeneratorImplementation.workbench, craftingBG, craftingSelected );
smallCraftingTemplate = new DefaultRecipeTemplate( this.smallCraftingSlots, RecipeGeneratorImplementation.workbench, new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 61, 79, 58 ), new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 61, 79, 58 ) ); final TextureClip smallBG = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 61, TEXTURE_WIDTH, TEXTURE_HEIGHT );
final TextureClip smallSelected = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 61, TEXTURE_WIDTH, TEXTURE_HEIGHT );
smallTemplate = new DefaultRecipeTemplate( SMALL_CRAFTING_SLOTS, RecipeGeneratorImplementation.workbench, smallBG, smallSelected );
} }
RecipeTemplate shapelessTemplate = new DefaultRecipeTemplate( this.shapelessCraftingSlots, RecipeGeneratorImplementation.workbench, new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 121, 79, 58 ), new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 121, 79, 58 ) ); final TextureClip shapelessBG = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 121, TEXTURE_WIDTH, TEXTURE_HEIGHT );
final TextureClip shapelessSelected = new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 121, TEXTURE_WIDTH, TEXTURE_HEIGHT );
final RecipeTemplate shapelessTemplate = new DefaultRecipeTemplate( SHAPELESS_CRAFTING_SLOTS, RecipeGeneratorImplementation.workbench, shapelessBG, shapelessSelected );
RecipeTemplate furnaceTemplate = new DefaultRecipeTemplate( this.furnaceSlots, new ItemStack( Blocks.furnace ), new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 1, 181, 79, 58 ), new TextureClip( DynamicTexture.instance( "recipe_backgrounds" ), 82, 181, 79, 58 ) ); this.addCraftingRecipes( craftingTemplate, smallTemplate, shapelessTemplate, generator );
this.addCraftingRecipes( craftingTemplate, smallCraftingTemplate, shapelessTemplate, this ); final IAppEngApi api = AEApi.instance();
this.addGrinderRecipes( furnaceTemplate, this ); final IBlocks aeBlocks = api.definitions().blocks();
this.addInscriberRecipes( furnaceTemplate, this ); final Optional<ItemStack> grindstone = aeBlocks.grindStone().maybeStack( 1 );
final Optional<ItemStack> inscriber = aeBlocks.inscriber().maybeStack( 1 );
if( grindstone.isPresent() )
{
this.addGrinderRecipes( api, grindstone.get(), generator );
}
if( inscriber.isPresent() )
{
this.addInscriberRecipes( api, inscriber.get(), generator );
}
}
@SuppressWarnings( "unchecked" )
private List<IRecipe> getUncheckedRecipes()
{
return (List<IRecipe>) CraftingManager.getInstance().getRecipeList();
} }
private void addCraftingRecipes( RecipeTemplate template, RecipeTemplate templateSmall, RecipeTemplate templateShapeless, RecipeGenerator generator ) private void addCraftingRecipes( RecipeTemplate template, RecipeTemplate templateSmall, RecipeTemplate templateShapeless, RecipeGenerator generator )
{ {
List recipes = CraftingManager.getInstance().getRecipeList(); final List<IRecipe> recipes = this.getUncheckedRecipes();
int errCount = 0; int errCount = 0;
for( Object o : recipes ) for( IRecipe recipe : recipes )
{ {
try try
{ {
IRecipe recipe = (IRecipe) o; final Object[] items = this.getCraftingRecipe( recipe, true );
Object[] items = generator.getCraftingRecipe( recipe, true );
if( items == null )
{
continue;
}
if( items.length == 5 ) if( items.length == 5 )
{ {
generator.addRecipe( templateSmall, items ); generator.addRecipe( templateSmall, items );
@ -138,8 +218,7 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
{ {
if( errCount >= 5 ) if( errCount >= 5 )
{ {
CraftGuideLog.log( "CraftGuide DefaultRecipeProvider: Stack trace limit reached, further stack traces from this invocation will not be logged to the console. They will still be logged to (.minecraft)/config/CraftGuide/CraftGuide.log", true ); CraftGuideLog.log( "AppEng CraftGuide integration: Stack trace limit reached, further stack traces from this invocation will not be logged to the console. They will still be logged to (.minecraft)/config/CraftGuide/CraftGuide.log", true );
errCount = -1;
} }
else else
{ {
@ -152,61 +231,49 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
} }
} }
private void addGrinderRecipes( RecipeTemplate template, RecipeGenerator generator ) private void addGrinderRecipes( IAppEngApi api, ItemStack grindstone, RecipeGenerator generator )
{ {
final ItemStack handle = api.definitions().blocks().crankHandle().maybeStack( 1 ).orNull();
final RecipeTemplate grinderTemplate = generator.createRecipeTemplate( GRINDER_SLOTS, grindstone );
for( IGrinderEntry recipe : api.registries().grinder().getRecipes() )
{
generator.addRecipe( grinderTemplate, new Object[] {
recipe.getInput(),
recipe.getOutput(),
new Object[] {
recipe.getOptionalOutput(),
(int) ( recipe.getOptionalChance() * GRINDER_RATIO )
},
new Object[] {
recipe.getSecondOptionalOutput(),
(int) ( recipe.getOptionalChance() * GRINDER_RATIO )
},
handle,
grindstone
} );
}
} }
private void addInscriberRecipes( RecipeTemplate template, RecipeGenerator generator ) private void addInscriberRecipes( IAppEngApi api, ItemStack inscriber, RecipeGenerator generator )
{ {
final RecipeTemplate inscriberTemplate = generator.createRecipeTemplate( INSCRIBER_SLOTS, inscriber );
for( IInscriberRecipe recipe : api.registries().inscriber().getRecipes() )
{
generator.addRecipe( inscriberTemplate, new Object[] {
recipe.getInputs(),
recipe.getTopOptional().orNull(),
recipe.getBottomOptional().orNull(),
recipe.getOutput(),
inscriber
} );
}
} }
@Override private Object[] getCraftingShapelessRecipe( List<?> items, ItemStack recipeOutput )
public RecipeTemplate createRecipeTemplate( Slot[] slots, ItemStack craftingType )
{ {
return this.parent.createRecipeTemplate( slots, craftingType ); final Object[] output = new Object[10];
}
@Override
public RecipeTemplate createRecipeTemplate( Slot[] slots, ItemStack craftingType, String backgroundTexture, int backgroundX, int backgroundY, int backgroundSelectedX, int backgroundSelectedY )
{
return this.parent.createRecipeTemplate( slots, craftingType, backgroundTexture, backgroundX, backgroundY, backgroundSelectedX, backgroundSelectedY );
}
@Override
public RecipeTemplate createRecipeTemplate( Slot[] slots, ItemStack craftingType, String backgroundTexture, int backgroundX, int backgroundY, String backgroundSelectedTexture, int backgroundSelectedX, int backgroundSelectedY )
{
return this.parent.createRecipeTemplate( slots, craftingType, backgroundTexture, backgroundX, backgroundY, backgroundSelectedTexture, backgroundSelectedX, backgroundSelectedY );
}
@Override
public void addRecipe( RecipeTemplate template, Object[] crafting )
{
this.parent.addRecipe( template, crafting );
}
@Override
public void addRecipe( CraftGuideRecipe recipe, ItemStack craftingType )
{
this.parent.addRecipe( recipe, craftingType );
}
@Override
public void setDefaultTypeVisibility( ItemStack type, boolean visible )
{
this.parent.setDefaultTypeVisibility( type, visible );
}
@Override
public Object[] getCraftingRecipe( IRecipe recipe )
{
return this.getCraftingRecipe( recipe, true );
}
Object[] getCraftingShapelessRecipe( List items, ItemStack recipeOutput )
{
Object[] output = new Object[10];
for( int i = 0; i < items.size(); i++ ) for( int i = 0; i < items.size(); i++ )
{ {
@ -235,18 +302,19 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
} }
output[9] = recipeOutput; output[9] = recipeOutput;
return output; return output;
} }
Object[] getSmallShapedRecipe( int width, int height, Object[] items, ItemStack recipeOutput ) private Object[] getSmallShapedRecipe( int width, int height, Object[] items, ItemStack recipeOutput )
{ {
Object[] output = new Object[5]; final Object[] output = new Object[5];
for( int y = 0; y < height; y++ ) for( int y = 0; y < height; y++ )
{ {
for( int x = 0; x < width; x++ ) for( int x = 0; x < width; x++ )
{ {
int i = y * 2 + x; final int i = y * 2 + x;
output[i] = items[y * width + x]; output[i] = items[y * width + x];
if( output[i] instanceof ItemStack[] ) if( output[i] instanceof ItemStack[] )
@ -273,18 +341,19 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
} }
output[4] = recipeOutput; output[4] = recipeOutput;
return output; return output;
} }
Object[] getCraftingShapedRecipe( int width, int height, Object[] items, ItemStack recipeOutput ) private Object[] getCraftingShapedRecipe( int width, int height, Object[] items, ItemStack recipeOutput )
{ {
Object[] output = new Object[10]; final Object[] output = new Object[10];
for( int y = 0; y < height; y++ ) for( int y = 0; y < height; y++ )
{ {
for( int x = 0; x < width; x++ ) for( int x = 0; x < width; x++ )
{ {
int i = y * 3 + x; final int i = y * 3 + x;
output[i] = items[y * width + x]; output[i] = items[y * width + x];
if( output[i] instanceof ItemStack[] ) if( output[i] instanceof ItemStack[] )
@ -311,12 +380,13 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
} }
output[9] = recipeOutput; output[9] = recipeOutput;
return output; return output;
} }
private Object toCG( ItemStack[] itemStackSet ) private Object toCG( ItemStack[] itemStackSet )
{ {
List<ItemStack> list = Arrays.asList( itemStackSet ); final List<ItemStack> list = Arrays.asList( itemStackSet );
for( int x = 0; x < list.size(); x++ ) for( int x = 0; x < list.size(); x++ )
{ {
@ -330,19 +400,20 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
return list; return list;
} }
@Override @Nullable
public Object[] getCraftingRecipe( IRecipe recipe, boolean allowSmallGrid ) private Object[] getCraftingRecipe( IRecipe recipe, boolean allowSmallGrid )
{ {
if( recipe instanceof ShapelessRecipe ) if( recipe instanceof ShapelessRecipe )
{ {
List items = ReflectionHelper.getPrivateValue( ShapelessRecipe.class, (ShapelessRecipe) recipe, "input" ); final List<Object> items = ReflectionHelper.getPrivateValue( ShapelessRecipe.class, (ShapelessRecipe) recipe, "input" );
return this.getCraftingShapelessRecipe( items, recipe.getRecipeOutput() ); return this.getCraftingShapelessRecipe( items, recipe.getRecipeOutput() );
} }
else if( recipe instanceof ShapedRecipe ) else if( recipe instanceof ShapedRecipe )
{ {
int width = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "width" ); final int width = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "width" );
int height = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "height" ); final int height = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "height" );
Object[] items = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "input" ); final Object[] items = ReflectionHelper.getPrivateValue( ShapedRecipe.class, (ShapedRecipe) recipe, "input" );
if( allowSmallGrid && width < 3 && height < 3 ) if( allowSmallGrid && width < 3 && height < 3 )
{ {
@ -360,7 +431,6 @@ public class CraftGuide extends CraftGuideAPIObject implements IIntegrationModul
@Override @Override
public void init() throws Throwable public void init() throws Throwable
{ {
StackInfo.addSource( this );
} }
@Override @Override

View File

@ -28,7 +28,8 @@ public class RotaryCraft extends BaseModule
public RotaryCraft() public RotaryCraft()
{ {
this.testClassExistence( Reika.RotaryCraft.API.Power.ShaftPowerReceiver.class ); this.testClassExistence( Reika.RotaryCraft.API.Power.AdvancedShaftPowerReceiver.class );
this.testClassExistence( Reika.RotaryCraft.API.Interfaces.Transducerable.class );
} }
@Override @Override

View File

@ -38,6 +38,7 @@ public class Waila extends BaseModule
{ {
final IWailaDataProvider partHost = new PartWailaDataProvider(); final IWailaDataProvider partHost = new PartWailaDataProvider();
registrar.registerStackProvider( partHost, AEBaseTile.class );
registrar.registerBodyProvider( partHost, AEBaseTile.class ); registrar.registerBodyProvider( partHost, AEBaseTile.class );
registrar.registerNBTProvider( partHost, AEBaseTile.class ); registrar.registerNBTProvider( partHost, AEBaseTile.class );

View File

@ -38,6 +38,7 @@ import appeng.api.parts.IPart;
import appeng.integration.modules.waila.part.ChannelWailaDataProvider; import appeng.integration.modules.waila.part.ChannelWailaDataProvider;
import appeng.integration.modules.waila.part.IPartWailaDataProvider; import appeng.integration.modules.waila.part.IPartWailaDataProvider;
import appeng.integration.modules.waila.part.PartAccessor; import appeng.integration.modules.waila.part.PartAccessor;
import appeng.integration.modules.waila.part.PartStackWailaDataProvider;
import appeng.integration.modules.waila.part.PowerStateWailaDataProvider; import appeng.integration.modules.waila.part.PowerStateWailaDataProvider;
import appeng.integration.modules.waila.part.StorageMonitorWailaDataProvider; import appeng.integration.modules.waila.part.StorageMonitorWailaDataProvider;
import appeng.integration.modules.waila.part.Tracer; import appeng.integration.modules.waila.part.Tracer;
@ -75,13 +76,32 @@ public final class PartWailaDataProvider implements IWailaDataProvider
final IPartWailaDataProvider channel = new ChannelWailaDataProvider(); final IPartWailaDataProvider channel = new ChannelWailaDataProvider();
final IPartWailaDataProvider storageMonitor = new StorageMonitorWailaDataProvider(); final IPartWailaDataProvider storageMonitor = new StorageMonitorWailaDataProvider();
final IPartWailaDataProvider powerState = new PowerStateWailaDataProvider(); final IPartWailaDataProvider powerState = new PowerStateWailaDataProvider();
final IPartWailaDataProvider partStack = new PartStackWailaDataProvider();
this.providers = Lists.newArrayList( channel, storageMonitor, powerState ); this.providers = Lists.newArrayList( channel, storageMonitor, powerState, partStack );
} }
@Override @Override
public ItemStack getWailaStack( IWailaDataAccessor accessor, IWailaConfigHandler config ) public ItemStack getWailaStack( IWailaDataAccessor accessor, IWailaConfigHandler config )
{ {
final TileEntity te = accessor.getTileEntity();
final MovingObjectPosition mop = accessor.getPosition();
final Optional<IPart> maybePart = this.accessor.getMaybePart( te, mop );
if( maybePart.isPresent() )
{
final IPart part = maybePart.get();
ItemStack wailaStack = null;
for( IPartWailaDataProvider provider : this.providers )
{
wailaStack = provider.getWailaStack( part, config, wailaStack );
}
return wailaStack;
}
return null; return null;
} }

View File

@ -22,6 +22,7 @@ package appeng.integration.modules.waila.part;
import java.util.List; import java.util.List;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -41,6 +42,12 @@ import appeng.api.parts.IPart;
*/ */
public abstract class BasePartWailaDataProvider implements IPartWailaDataProvider public abstract class BasePartWailaDataProvider implements IPartWailaDataProvider
{ {
@Override
public ItemStack getWailaStack( IPart part, IWailaConfigHandler config, ItemStack partStack )
{
return null;
}
@Override @Override
public List<String> getWailaHead( IPart part, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config ) public List<String> getWailaHead( IPart part, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config )
{ {

View File

@ -22,6 +22,7 @@ package appeng.integration.modules.waila.part;
import java.util.List; import java.util.List;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -41,6 +42,8 @@ import appeng.api.parts.IPart;
*/ */
public interface IPartWailaDataProvider public interface IPartWailaDataProvider
{ {
ItemStack getWailaStack( IPart part, IWailaConfigHandler config, ItemStack partStack );
List<String> getWailaHead( IPart part, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config ); List<String> getWailaHead( IPart part, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config );
List<String> getWailaBody( IPart part, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config ); List<String> getWailaBody( IPart part, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config );

View File

@ -0,0 +1,42 @@
/*
* 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.modules.waila.part;
import appeng.api.parts.IPart;
import appeng.api.parts.PartItemStack;
import mcp.mobius.waila.api.IWailaConfigHandler;
import net.minecraft.item.ItemStack;
/**
* Part ItemStack provider for WAILA
*
* @author TheJulianJES
* @version rv2
* @since rv2
*/
public class PartStackWailaDataProvider extends BasePartWailaDataProvider {
@Override
public ItemStack getWailaStack( IPart part, IWailaConfigHandler config, ItemStack partStack )
{
partStack = part.getItemStack( PartItemStack.Pick );
return partStack;
}
}

View File

@ -29,6 +29,7 @@ import net.minecraft.world.World;
import gnu.trove.map.TObjectLongMap; import gnu.trove.map.TObjectLongMap;
import gnu.trove.map.hash.TObjectLongHashMap; import gnu.trove.map.hash.TObjectLongHashMap;
import mcp.mobius.waila.api.ITaggedList;
import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor; import mcp.mobius.waila.api.IWailaDataAccessor;
@ -76,6 +77,9 @@ public final class PowerStorageWailaDataProvider extends BaseWailaDataProvider
@Override @Override
public List<String> getWailaBody( ItemStack itemStack, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config ) public List<String> getWailaBody( ItemStack itemStack, List<String> currentToolTip, IWailaDataAccessor accessor, IWailaConfigHandler config )
{ {
//Removes RF tooltip on WAILA 1.5.9+
((ITaggedList<String, String>) currentToolTip).removeEntries("RFEnergyStorage");
final TileEntity te = accessor.getTileEntity(); final TileEntity te = accessor.getTileEntity();
if( te instanceof IAEPowerStorage ) if( te instanceof IAEPowerStorage )
{ {

View File

@ -71,7 +71,8 @@ public class GridNode implements IGridNode, IPathItem
private Object visitorIterationNumber = null; private Object visitorIterationNumber = null;
// connection criteria // connection criteria
private int compressedData = 0; private int compressedData = 0;
private int channelData = 0; private int usedChannels = 0;
private int lastUsedChannels = 0;
public GridNode( IGridBlock what ) public GridNode( IGridBlock what )
{ {
@ -90,7 +91,7 @@ public class GridNode implements IGridNode, IPathItem
public int usedChannels() public int usedChannels()
{ {
return this.channelData >> 8; return this.lastUsedChannels;
} }
public Class<? extends IGridHost> getMachineClass() public Class<? extends IGridHost> getMachineClass()
@ -358,7 +359,7 @@ public class GridNode implements IGridNode, IPathItem
@Override @Override
public boolean meetsChannelRequirements() public boolean meetsChannelRequirements()
{ {
return ( !this.gridProxy.getFlags().contains( GridFlags.REQUIRE_CHANNEL ) || this.getUsedChannels() > 0 ); return( !this.gridProxy.getFlags().contains( GridFlags.REQUIRE_CHANNEL ) || this.getUsedChannels() > 0 );
} }
@Override @Override
@ -384,7 +385,7 @@ public class GridNode implements IGridNode, IPathItem
public int getUsedChannels() public int getUsedChannels()
{ {
return this.channelData & 0xff; return this.usedChannels;
} }
public void FindConnections() public void FindConnections()
@ -581,7 +582,8 @@ public class GridNode implements IGridNode, IPathItem
public void setGridStorage( GridStorage s ) public void setGridStorage( GridStorage s )
{ {
this.myStorage = s; this.myStorage = s;
this.channelData = 0; this.usedChannels = 0;
this.lastUsedChannels = 0;
} }
@Override @Override
@ -600,7 +602,7 @@ public class GridNode implements IGridNode, IPathItem
{ {
if( zeroOut ) if( zeroOut )
{ {
this.channelData &= ~0xff; this.usedChannels = 0;
} }
int idx = this.connections.indexOf( fast ); int idx = this.connections.indexOf( fast );
@ -631,7 +633,7 @@ public class GridNode implements IGridNode, IPathItem
@Override @Override
public void incrementChannelCount( int usedChannels ) public void incrementChannelCount( int usedChannels )
{ {
this.channelData += usedChannels; this.usedChannels += usedChannels;
} }
@Override @Override
@ -650,8 +652,7 @@ public class GridNode implements IGridNode, IPathItem
if( this.getLastUsedChannels() != this.getUsedChannels() ) if( this.getLastUsedChannels() != this.getUsedChannels() )
{ {
this.channelData &= 0xff; this.lastUsedChannels = this.usedChannels;
this.channelData |= this.channelData << 8;
if( this.getInternalGrid() != null ) if( this.getInternalGrid() != null )
{ {
@ -662,7 +663,7 @@ public class GridNode implements IGridNode, IPathItem
public int getLastUsedChannels() public int getLastUsedChannels()
{ {
return ( this.channelData >> 8 ) & 0xff; return lastUsedChannels;
} }
private static class MachineSecurityBreak implements Callable<Void> private static class MachineSecurityBreak implements Callable<Void>
@ -683,7 +684,6 @@ public class GridNode implements IGridNode, IPathItem
} }
} }
private static class ConnectionComparator implements Comparator<IGridConnection> private static class ConnectionComparator implements Comparator<IGridConnection>
{ {
private final IGridNode gn; private final IGridNode gn;

View File

@ -86,7 +86,10 @@ public class MEMonitorIInventory implements IMEMonitor<IAEItemStack>
out = this.adaptor.addItems( input.getItemStack() ); out = this.adaptor.addItems( input.getItemStack() );
} }
this.onTick(); if( type == Actionable.MODULATE )
{
this.onTick();
}
if( out == null ) if( out == null )
{ {
@ -122,7 +125,10 @@ public class MEMonitorIInventory implements IMEMonitor<IAEItemStack>
IAEItemStack o = request.copy(); IAEItemStack o = request.copy();
o.setStackSize( out.stackSize ); o.setStackSize( out.stackSize );
this.onTick(); if( type == Actionable.MODULATE )
{
this.onTick();
}
return o; return o;
} }

View File

@ -92,7 +92,7 @@ public final class DisassembleRecipe implements IRecipe
{ {
// needs a single input in the recipe // needs a single input in the recipe
itemCount++; itemCount++;
if ( itemCount > 1 ) if( itemCount > 1 )
{ {
return MISMATCHED_STACK; return MISMATCHED_STACK;
} }

View File

@ -86,7 +86,11 @@ public final class VersionParser
{ {
assert PATTERN_VALID_REVISION.matcher( rawRevision ).matches(); assert PATTERN_VALID_REVISION.matcher( rawRevision ).matches();
final int revision = new Scanner( rawRevision ).useDelimiter( PATTERN_REVISION ).nextInt(); final Scanner scanner = new Scanner( rawRevision );
final int revision = scanner.useDelimiter( PATTERN_REVISION ).nextInt();
scanner.close();
return revision; return revision;
} }
@ -124,7 +128,11 @@ public final class VersionParser
{ {
assert PATTERN_NATURAL.matcher( rawBuild ).matches(); assert PATTERN_NATURAL.matcher( rawBuild ).matches();
final int build = new Scanner( rawBuild ).useDelimiter( PATTERN_BUILD ).nextInt(); final Scanner scanner = new Scanner( rawBuild );
final int build = scanner.useDelimiter( PATTERN_BUILD ).nextInt();
scanner.close();
return build; return build;
} }

View File

@ -4,7 +4,7 @@ package appeng.services.version.github;
/** /**
* Template class for Gson to write values from the Json Object into an actual class * Template class for Gson to write values from the Json Object into an actual class
*/ */
@SuppressWarnings( "ALL" ) @SuppressWarnings( "all" )
public class Release public class Release
{ {
/** /**

View File

@ -19,20 +19,25 @@
package appeng.tile.powersink; package appeng.tile.powersink;
import appeng.transformer.annotations.Integration;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import Reika.RotaryCraft.API.Power.ShaftPowerReceiver; import Reika.RotaryCraft.API.Interfaces.Transducerable;
import Reika.RotaryCraft.API.Power.AdvancedShaftPowerReceiver;
import appeng.api.config.PowerUnits; import appeng.api.config.PowerUnits;
import appeng.tile.TileEvent; import appeng.tile.TileEvent;
import appeng.tile.events.TileEventType; import appeng.tile.events.TileEventType;
import appeng.transformer.annotations.Integration.Interface; import appeng.transformer.annotations.Integration.Interface;
import appeng.transformer.annotations.Integration.InterfaceList;
import appeng.transformer.annotations.Integration.Method; import appeng.transformer.annotations.Integration.Method;
import appeng.util.Platform; import appeng.util.Platform;
import java.util.ArrayList;
@Interface( iname = "RotaryCraft", iface = "Reika.RotaryCraft.API.Power.ShaftPowerReceiver" ) @InterfaceList( value = { @Interface( iname = "RotaryCraft", iface = "Reika.RotaryCraft.API.Power.AdvancedShaftPowerReceiver" ), @Interface( iname = "RotaryCraft", iface = "Reika.RotaryCraft.API.Interfaces.Transducerable") } )
public abstract class RotaryCraft extends IC2 implements ShaftPowerReceiver public abstract class RotaryCraft extends IC2 implements AdvancedShaftPowerReceiver, Transducerable
{ {
private int omega = 0; private int omega = 0;
@ -40,16 +45,32 @@ public abstract class RotaryCraft extends IC2 implements ShaftPowerReceiver
private long power = 0; private long power = 0;
private int alpha = 0; private int alpha = 0;
private long currentPower = 0;
@TileEvent( TileEventType.TICK ) @TileEvent( TileEventType.TICK )
@Method( iname = "RotaryCraft" ) @Method( iname = "RotaryCraft" )
public void Tick_RotaryCraft() public void Tick_RotaryCraft()
{ {
if( this.worldObj != null && !this.worldObj.isRemote && this.power > 0 ) if( this.worldObj != null && !this.worldObj.isRemote && this.currentPower > 0 )
{ {
this.injectExternalPower( PowerUnits.WA, this.power ); this.injectExternalPower( PowerUnits.WA, this.currentPower );
this.currentPower = 0;
} }
} }
@Override
public final boolean addPower( int torque, int omega, long power, ForgeDirection side )
{
this.omega = omega;
this.torque = torque;
this.power = power;
this.currentPower += power;
return true;
}
@Override @Override
public final int getOmega() public final int getOmega()
{ {
@ -86,37 +107,6 @@ public abstract class RotaryCraft extends IC2 implements ShaftPowerReceiver
this.alpha = io; this.alpha = io;
} }
@Override
public final void setPower( long p )
{
if( Platform.isClient() )
{
return;
}
this.power = p;
}
@Override
public final void noInputMachine()
{
this.power = 0;
this.torque = 0;
this.omega = 0;
}
@Override
public final void setTorque( int t )
{
this.torque = t;
}
@Override
public final void setOmega( int o )
{
this.omega = o;
}
public final boolean canReadFromBlock( int x, int y, int z ) public final boolean canReadFromBlock( int x, int y, int z )
{ {
ForgeDirection side = ForgeDirection.UNKNOWN; ForgeDirection side = ForgeDirection.UNKNOWN;
@ -164,6 +154,33 @@ public abstract class RotaryCraft extends IC2 implements ShaftPowerReceiver
@Override @Override
public final int getMinTorque( int available ) public final int getMinTorque( int available )
{ {
return 0; return 1;
}
@Override
public final ArrayList<String> getMessages( World world, int x, int y, int z, int side )
{
String out;
if( power >= 1000000000 )
{
out = String.format( "Receiving %.3f GW @ %d rad/s.", power / 1000000000.0D, omega );
}
else if( power >= 1000000 )
{
out = String.format( "Receiving %.3f MW @ %d rad/s.", power / 1000000.0D, omega );
}
else if( power >= 1000 )
{
out = String.format( "Receiving %.3f kW @ %d rad/s.", power / 1000.0D, omega );
}
else
{
out = String.format( "Receiving %d W @ %d rad/s.", power, omega );
}
ArrayList<String> messages = new ArrayList<String>( 1 );
messages.add( out );
return messages;
} }
} }

View File

@ -1863,15 +1863,15 @@ public class Platform
return null; return null;
} }
public static boolean isSameItemType( ItemStack ol, ItemStack op ) public static boolean isSameItemType( ItemStack that, ItemStack other )
{ {
if( ol != null && op != null && ol.getItem() == op.getItem() ) if( that != null && other != null && that.getItem() == other.getItem() )
{ {
if( ol.isItemStackDamageable() ) if( that.isItemStackDamageable() )
{ {
return true; return true;
} }
return ol.getItemDamage() == ol.getItemDamage(); return that.getItemDamage() == other.getItemDamage();
} }
return false; return false;
} }

View File

@ -1,5 +1,5 @@
tile.appliedenergistics2.BlockCableBus.name=AE2-Kabel und/oder Bus tile.appliedenergistics2.BlockCableBus.name=AE2-Kabel und/oder Bus
tile.appliedenergistics2.BlockCellWorkbench.name=Zellenwerkbank tile.appliedenergistics2.BlockCellWorkbench.name=Speicherzellenwerkbank
tile.appliedenergistics2.BlockCharger.name=Ladegerät tile.appliedenergistics2.BlockCharger.name=Ladegerät
tile.appliedenergistics2.BlockChest.name=ME-Truhe tile.appliedenergistics2.BlockChest.name=ME-Truhe
tile.appliedenergistics2.BlockCondenser.name=Materiekondensator tile.appliedenergistics2.BlockCondenser.name=Materiekondensator
@ -17,7 +17,7 @@ tile.appliedenergistics2.BlockInscriber.name=Gravurmaschine
tile.appliedenergistics2.BlockInterface.name=ME-Schnittstelle tile.appliedenergistics2.BlockInterface.name=ME-Schnittstelle
tile.appliedenergistics2.BlockQuantumLinkChamber.name=ME-Quantentunnelkammer tile.appliedenergistics2.BlockQuantumLinkChamber.name=ME-Quantentunnelkammer
tile.appliedenergistics2.BlockQuantumRing.name=ME-Quantentunnelring tile.appliedenergistics2.BlockQuantumRing.name=ME-Quantentunnelring
tile.appliedenergistics2.BlockFluix.name=Fluix-Block tile.appliedenergistics2.BlockFluix.name=Fluixblock
tile.appliedenergistics2.BlockQuartz.name=Certusquarzblock tile.appliedenergistics2.BlockQuartz.name=Certusquarzblock
tile.appliedenergistics2.BlockQuartzChiseled.name=Gemeißelter Certusquarzblock tile.appliedenergistics2.BlockQuartzChiseled.name=Gemeißelter Certusquarzblock
tile.appliedenergistics2.BlockQuartzGlass.name=Quarzglas tile.appliedenergistics2.BlockQuartzGlass.name=Quarzglas
@ -50,7 +50,7 @@ tile.appliedenergistics2.BlockCraftingAccelerator.name=Fertigungs-Prozessoreinhe
tile.appliedenergistics2.BlockCraftingUnit.name=Fertigungseinheit tile.appliedenergistics2.BlockCraftingUnit.name=Fertigungseinheit
tile.appliedenergistics2.BlockMolecularAssembler.name=Molekularassembler tile.appliedenergistics2.BlockMolecularAssembler.name=Molekularassembler
chat.appliedenergistics2.ChestCannotReadStorageCell=ME-Truhe kann Speicherzelle nicht einlesen. chat.appliedenergistics2.ChestCannotReadStorageCell=ME-Truhe kann die Speicherzelle nicht einlesen.
chat.appliedenergistics2.SettingCleared=Einstellung gelöscht. chat.appliedenergistics2.SettingCleared=Einstellung gelöscht.
chat.appliedenergistics2.OutOfRange=Drahtloser Zugangspunkt außer Reichweite. chat.appliedenergistics2.OutOfRange=Drahtloser Zugangspunkt außer Reichweite.
chat.appliedenergistics2.InvalidMachine=Ungültige Maschine. chat.appliedenergistics2.InvalidMachine=Ungültige Maschine.
@ -148,11 +148,11 @@ gui.appliedenergistics2.Crafts=Fertigt
gui.appliedenergistics2.And=und gui.appliedenergistics2.And=und
gui.appliedenergistics2.Creates=Kreiert gui.appliedenergistics2.Creates=Kreiert
gui.appliedenergistics2.With=mit gui.appliedenergistics2.With=mit
gui.appliedenergistics2.InWorldCrafting=AE2 In-World-Fertigung gui.appliedenergistics2.InWorldCrafting=AE2 In-Welt-Fertigung
gui.appliedenergistics2.inWorldFluix=Wirf 1 Geladenes Certusquarzstück + 1 Netherquarz + Redstone-Staub nebeneinander in eine Pfütze und warte einen Moment. gui.appliedenergistics2.inWorldFluix=Wirf 1 Geladenes Certusquarzstück + 1 Netherquarz + Redstone-Staub nebeneinander in eine Pfütze und warte einen Moment.
gui.appliedenergistics2.inWorldPurificationCertus=Wirf einen Certusquarzkeim, gemacht aus Certusquarzstaub und Sand, in eine Pfütze Wasser; um den Prozess zu beschleunigen, füge Kristallwachstumsbeschleuniger hinzu. gui.appliedenergistics2.inWorldPurificationCertus=Wirf einen Certusquarzkeim, gemacht aus Certusquarzstaub und Sand, in eine Pfütze Wasser; um den Prozess zu beschleunigen, füge Kristallwachstumsbeschleuniger hinzu.
gui.appliedenergistics2.inWorldPurificationNether=Wirf einen Netherquarzkeim, gemacht aus Netherquarzstaub und Sand, in eine Pfütze Wasser; um den Prozess zu beschleunigen, füge Kristallwachstumsbeschleuniger hinzu. gui.appliedenergistics2.inWorldPurificationNether=Wirf einen Netherquarzkeim, gemacht aus Netherquarzstaub und Sand, in eine Pfütze Wasser; um den Prozess zu beschleunigen, füge Kristallwachstumsbeschleuniger hinzu.
gui.appliedenergistics2.inWorldPurificationFluix=Wirf einen Fluix-Keim, gemacht aus Fluix-Staub und Sand, in eine Pfütze Wasser; um den Prozess zu beschleunigen, füge Kristallwachstumsbeschleuniger hinzu. gui.appliedenergistics2.inWorldPurificationFluix=Wirf einen Fluixkeim, gemacht aus Fluixstaub und Sand, in eine Pfütze Wasser; um den Prozess zu beschleunigen, füge Kristallwachstumsbeschleuniger hinzu.
gui.appliedenergistics2.inWorldSingularity=Wirf zum Erschaffen 1 Singularität und 1 Enderstaub zusammen und erzeuge in Reichweite der Items eine Explosion. gui.appliedenergistics2.inWorldSingularity=Wirf zum Erschaffen 1 Singularität und 1 Enderstaub zusammen und erzeuge in Reichweite der Items eine Explosion.
gui.appliedenergistics2.ChargedQuartz=Geladener Certusquarz entsteht durch Einfügen eines Ungeladenen Certusquarzkristalls in ein Ladegerät, das Energie erhält. gui.appliedenergistics2.ChargedQuartz=Geladener Certusquarz entsteht durch Einfügen eines Ungeladenen Certusquarzkristalls in ein Ladegerät, das Energie erhält.
gui.appliedenergistics2.ChargedQuartzFind=Geladener Certusquarz kann relativ selten in der Welt gefunden werden, er sieht aus wie gewöhnlicher Certusquarz, aber er funkelt. gui.appliedenergistics2.ChargedQuartzFind=Geladener Certusquarz kann relativ selten in der Welt gefunden werden, er sieht aus wie gewöhnlicher Certusquarz, aber er funkelt.
@ -309,7 +309,7 @@ waila.appliedenergistics2.Locked=Gesperrt
waila.appliedenergistics2.Unlocked=Entsperrt waila.appliedenergistics2.Unlocked=Entsperrt
waila.appliedenergistics2.Showing=Zeigt waila.appliedenergistics2.Showing=Zeigt
waila.appliedenergistics2.Contains=Enthält waila.appliedenergistics2.Contains=Enthält
waila.appliedenergistics2.Channels=%1$d of %2$d Kanäle waila.appliedenergistics2.Channels=%1$d von %2$d Kanälen
item.appliedenergistics2.ItemBasicStorageCell.1k.name=1k-ME-Speicherzelle item.appliedenergistics2.ItemBasicStorageCell.1k.name=1k-ME-Speicherzelle
item.appliedenergistics2.ItemBasicStorageCell.4k.name=4k-ME-Speicherzelle item.appliedenergistics2.ItemBasicStorageCell.4k.name=4k-ME-Speicherzelle
@ -322,7 +322,7 @@ item.appliedenergistics2.ItemFacade.name=Kabelfassade
item.appliedenergistics2.ItemCrystalSeed.Certus.name=Certusquarzkeim item.appliedenergistics2.ItemCrystalSeed.Certus.name=Certusquarzkeim
item.appliedenergistics2.ItemCrystalSeed.Nether.name=Netherquarzkeim item.appliedenergistics2.ItemCrystalSeed.Nether.name=Netherquarzkeim
item.appliedenergistics2.ItemCrystalSeed.Fluix.name=Fluix-Keim item.appliedenergistics2.ItemCrystalSeed.Fluix.name=Fluixkeim
item.appliedenergistics2.ItemMaterial.InvalidType.name=Dieses Item ist deaktiviert. item.appliedenergistics2.ItemMaterial.InvalidType.name=Dieses Item ist deaktiviert.
item.appliedenergistics2.ItemMaterial.AdvCard.name=Fortgeschrittene Karte item.appliedenergistics2.ItemMaterial.AdvCard.name=Fortgeschrittene Karte
item.appliedenergistics2.ItemMaterial.AnnihilationCore.name=Annihilationskern item.appliedenergistics2.ItemMaterial.AnnihilationCore.name=Annihilationskern

View File

@ -1,3 +1,4 @@
//Blocos
tile.appliedenergistics2.BlockCableBus.name=Cabos e/ou Barramentos do AE2 tile.appliedenergistics2.BlockCableBus.name=Cabos e/ou Barramentos do AE2
tile.appliedenergistics2.BlockCellWorkbench.name=Bancada de Células tile.appliedenergistics2.BlockCellWorkbench.name=Bancada de Células
tile.appliedenergistics2.BlockCharger.name=Carregador tile.appliedenergistics2.BlockCharger.name=Carregador
@ -19,7 +20,7 @@ tile.appliedenergistics2.BlockQuantumLinkChamber.name=Câmara de Ligação Quân
tile.appliedenergistics2.BlockQuantumRing.name=Anel Quântico ME tile.appliedenergistics2.BlockQuantumRing.name=Anel Quântico ME
tile.appliedenergistics2.BlockFluix.name=Bloco de Fluix tile.appliedenergistics2.BlockFluix.name=Bloco de Fluix
tile.appliedenergistics2.BlockQuartz.name=Bloco de Quartzo Certus tile.appliedenergistics2.BlockQuartz.name=Bloco de Quartzo Certus
tile.appliedenergistics2.BlockQuartzChiseled.name=Bloco de Quartzo Certus Cinzelado tile.appliedenergistics2.BlockQuartzChiseled.name=Bloco de Quartzo Certus Talhado
tile.appliedenergistics2.BlockQuartzGlass.name=Vidro de Quartzo tile.appliedenergistics2.BlockQuartzGlass.name=Vidro de Quartzo
tile.appliedenergistics2.BlockQuartzLamp.name=Vidro Vibrante de Quartzo tile.appliedenergistics2.BlockQuartzLamp.name=Vidro Vibrante de Quartzo
tile.appliedenergistics2.BlockQuartzPillar.name=Pilar de Quartzo Certus tile.appliedenergistics2.BlockQuartzPillar.name=Pilar de Quartzo Certus
@ -50,8 +51,8 @@ tile.appliedenergistics2.BlockCraftingAccelerator.name=Unidade de Co-Processamen
tile.appliedenergistics2.BlockCraftingUnit.name=Unidade de Fabricação tile.appliedenergistics2.BlockCraftingUnit.name=Unidade de Fabricação
tile.appliedenergistics2.BlockMolecularAssembler.name=Montador Molecular tile.appliedenergistics2.BlockMolecularAssembler.name=Montador Molecular
// Stairs // Escadas
tile.appliedenergistics2.ChiseledQuartzStairBlock.name=Escadas de Quartzo Certus Cinzelado tile.appliedenergistics2.ChiseledQuartzStairBlock.name=Escadas de Quartzo Certus Talhadas
tile.appliedenergistics2.FluixStairBlock.name=Escadas de Fluix tile.appliedenergistics2.FluixStairBlock.name=Escadas de Fluix
tile.appliedenergistics2.QuartzPillarStairBlock.name=Escadas de Pilar de Quartzo Certus tile.appliedenergistics2.QuartzPillarStairBlock.name=Escadas de Pilar de Quartzo Certus
tile.appliedenergistics2.QuartzStairBlock.name=Escadas de Quartzo Certus tile.appliedenergistics2.QuartzStairBlock.name=Escadas de Quartzo Certus
@ -472,7 +473,7 @@ achievement.ae2.IOPort=Embaralhamento de Células de Armazenamentos
achievement.ae2.IOPort.desc=Faça uma Porta de ES achievement.ae2.IOPort.desc=Faça uma Porta de ES
achievement.ae2.CraftingTerminal=Uma Bancada (Muito) Maior achievement.ae2.CraftingTerminal=Uma Bancada (Muito) Maior
achievement.ae2.CraftingTerminal.desc=Faça um Terminal de Fabricação achievement.ae2.CraftingTerminal.desc=Faça um Terminal de Fabricação
achievement.ae2.PatternTerminal=Maestro de Fabricação achievement.ae2.PatternTerminal=Maestro da Fabricação
achievement.ae2.PatternTerminal.desc=Faça um Terminal de Padrões achievement.ae2.PatternTerminal.desc=Faça um Terminal de Padrões
achievement.ae2.ChargedQuartz=Chocante achievement.ae2.ChargedQuartz=Chocante
achievement.ae2.ChargedQuartz.desc=Ache Quartzo Carregado achievement.ae2.ChargedQuartz.desc=Ache Quartzo Carregado
@ -502,7 +503,7 @@ achievement.ae2.Facade=Estética de Rede
achievement.ae2.Facade.desc=Faça uma Fachada de Cabo achievement.ae2.Facade.desc=Faça uma Fachada de Cabo
achievement.ae2.NetworkTool=Diagnóstico de Rede achievement.ae2.NetworkTool=Diagnóstico de Rede
achievement.ae2.NetworkTool.desc=Faça uma Ferramenta de Rede achievement.ae2.NetworkTool.desc=Faça uma Ferramenta de Rede
achievement.ae2.PortableCell=Armazenamento Portátil achievement.ae2.PortableCell=Armazenamento Nômade
achievement.ae2.PortableCell.desc=Faça uma Célula Portátil achievement.ae2.PortableCell.desc=Faça uma Célula Portátil
achievement.ae2.StorageBus=Potencial Sem Limites achievement.ae2.StorageBus=Potencial Sem Limites
achievement.ae2.StorageBus.desc=Faça um Barramento de Armazenamento achievement.ae2.StorageBus.desc=Faça um Barramento de Armazenamento

View File

@ -18,6 +18,8 @@ ore=mc:stained_hardened_clay:* -> blockStainedHardenedClay
ore=ae2:ItemMaterial.NetherQuartzDust -> dustNetherQuartz ore=ae2:ItemMaterial.NetherQuartzDust -> dustNetherQuartz
ore=ae2:ItemMaterial.CertusQuartzDust -> dustCertusQuartz ore=ae2:ItemMaterial.CertusQuartzDust -> dustCertusQuartz
ore=ae2:ItemMaterial.FluixDust -> dustFluix ore=ae2:ItemMaterial.FluixDust -> dustFluix
ore=ae2:tile.OreQuartz -> oreCertusQuartz
ore=ae2:tile.OreQuartzCharged -> oreCertusQuartz
group= mc:iron_ingot oredictionary:ingotCopper oredictionary:ingotTin oredictionary:ingotSilver oredictionary:ingotLead oredictionary:ingotBronze oredictionary:ingotBrass oredictionary:ingotNickel oredictionary:ingotInvar oredictionary:ingotAluminium -> metalIngots 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:dustEnder oredictionary:dustEnderPearl -> dustEnder
@ -66,3 +68,4 @@ import=dyes_dense.recipe
import=paint_balls.recipe import=paint_balls.recipe
import=crafting.recipe import=crafting.recipe
import=vanilla_enhance.recipe import=vanilla_enhance.recipe
import=stairs.recipe

View File

@ -0,0 +1,47 @@
shaped=
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
-> 4 ae2:FluixStairBlock
shaped=
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
-> 4 ae2:QuartzStairBlock
shaped=
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
-> 4 ae2:SkyStoneBlockStairBlock
shaped=
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
-> 4 ae2:SkyStoneSmallBrickStairBlock