Compare commits

..

17 Commits

Author SHA1 Message Date
thatsIch f7323289a5 Merge pull request #625 from thatsIch/b-624-pickaxe
Fixes #624 Missing check to disable features
2014-12-27 19:05:37 +01:00
thatsIch 366d1a0a5d Merge pull request #629 from 61352151511/patch-1
Fix grammatical error
2014-12-25 14:17:29 +01:00
Mitchell 0cf33c4ea3 Fix grammatical error
Than = Comparison
2014-12-25 09:16:22 -04:00
thatsIch 21b70d0dda Fixes #624 Missing check to disable features 2014-12-24 11:32:24 +01:00
thatsIch 608d58277f Merge pull request #605 from thatsIch/b-604-craftingcrash
Fixes #604 Crash on crafting
2014-12-22 15:24:41 +01:00
thatsIch c790f69b90 Merge pull request #616 from thatsIch/e-572-valid-inventory
Fixes #572 Enable inventory validation for any kind of Player
2014-12-22 15:24:07 +01:00
thatsIch 72b3be0062 Fixes #572 Enable inventory validation for any kind of Player 2014-12-21 23:42:28 +01:00
thatsIch 9bd33b58e1 Merge pull request #610 from TheJulianJES/Sound-Material-Fix
Changed Sound and Material, also aligned some to vanilla
2014-12-21 13:44:03 +01:00
thatsIch b069fa0fec Merge pull request #575 from riking/recipe-pull-player
Use player's inventory to handle NEI fills
2014-12-21 12:18:14 +01:00
TheJulianJES 689eddcba3 Changed Sounds + Materials + aligned to vanilla
Aligned it to Quartz
2014-12-21 12:05:45 +01:00
riking 60569ac221 Also use the player's inventory to handle NEI fills
If the items for a recipe are not available in the ME network when you
shift-left-click the NEI question mark, also try to pull from the
player's inventory.

The 'ic' local variable was renamed to 'testInv', as it's used to test
the IRecipe on various crafting propositions to see if the item
satisfies the recipe.

Closes #564, "Shift clicking "?" on NEI recipe ignores items in the
player's inventory".
2014-12-20 23:30:39 -08:00
thatsIch 1fc2ddedec Merge pull request #562 from thatsIch/e-561-mcversion
Solves #561 "The coremod does not have a MCVersion annotation" message
2014-12-20 23:05:30 +01:00
thatsIch ee4f323977 More precise javadoc of IStorageCell
Reflects the internal implementation of StorageCells
2014-12-19 23:54:09 +01:00
thatsIch 48f9ca1fcb Fixes #604 Crash on crafting
The AE2 has in the contract that the item field in an IAEItemDefinition can be null due to the fact, if a special item is deactivated. This needs to be checked.

The base code was enhanced through Javadoc and split in responsibilities
2014-12-19 12:28:41 +01:00
thatsIch fc07acbced Merge pull request #595 from thatsIch/e-593-newrfapi
Closes #593 Updating RF Integration to use version 1.7.10R1.0.2
2014-12-18 18:20:19 +01:00
thatsIch 825567c122 Closes #593 Updating RF Integration to use version 1.7.10R1.0.2
The new update contained a split of the IEnergyHandler into the IEnergyReceiver and IEnergyProvider.
Since all tiles in AE2 are basically IEnergyReceivers we use them and changed the detection of opposing tile entities from IEnergyHandler to IEnergyReceiver
2014-12-15 22:10:26 +01:00
thatsIch aa75482232 #561 Solves "The coremod does not have a MCVersion annotation" message 2014-12-07 23:04:37 +01:00
21 changed files with 510 additions and 277 deletions
+1 -1
View File
@@ -36,6 +36,6 @@ api_mekansim_version=1
api_mfr_version=1
api_railcraft_version=1
api_rblocks_version=1
api_rf_version=1
api_rf_version=2
api_rotarycraft_version=1
dev_buildcraft_version=1
@@ -42,8 +42,8 @@ public interface IStorageCell extends ICellWorkbenchItem
{
/**
* If this returns something where N % 8 != 0 Then you will be shot on
* sight, or your car will explode, something like that least...
* It wont work if the return is not a multiple of 8.
* The limit is ({@link Integer#MAX_VALUE} + 1) / 8.
*
* @param cellItem item
* @return number of bytes
+3 -3
View File
@@ -113,12 +113,12 @@ public class AEBaseBlock extends BlockContainer implements IAEFeature
{
super( mat );
if ( mat == AEGlassMaterial.instance )
setStepSound( Block.soundTypeGlass );
else if ( mat == Material.glass )
if ( mat == AEGlassMaterial.instance || mat == Material.glass )
setStepSound( Block.soundTypeGlass );
else if ( mat == Material.rock )
setStepSound( Block.soundTypeStone );
else if ( mat == Material.wood )
setStepSound( Block.soundTypeWood );
else
setStepSound( Block.soundTypeMetal );
@@ -43,7 +43,6 @@ public class BlockCrank extends AEBaseBlock
public BlockCrank() {
super( BlockCrank.class, Material.wood );
setStepSound( Block.soundTypeWood );
setFeature( EnumSet.of( AEFeature.GrindStone ) );
setTileEntity( TileCrank.class );
setLightOpacity( 0 );
@@ -90,6 +90,10 @@ public class ContainerCraftingTerm extends ContainerMEMonitorable implements IAE
@Override
public IInventory getInventoryByName(String name)
{
if (name.equals("player"))
{
return invPlayer;
}
return ct.getInventoryByName( name );
}
@@ -447,6 +447,10 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
@Override
public IInventory getInventoryByName(String name)
{
if (name.equals("player"))
{
return invPlayer;
}
return ct.getInventoryByName( name );
}
+24 -14
View File
@@ -118,6 +118,7 @@ import appeng.core.features.AEFeature;
import appeng.core.features.ColoredItemDefinition;
import appeng.core.features.DamagedItemDefinition;
import appeng.core.features.IAEFeature;
import appeng.core.features.IFeatureHandler;
import appeng.core.features.IStackSrc;
import appeng.core.features.ItemStackSrc;
import appeng.core.features.NullItemDefinition;
@@ -506,26 +507,33 @@ public class Registration
private AEItemDefinition addFeature( Class<? extends IAEFeature> featureClass, Object... args )
{
ClassInstantiation<IAEFeature> instantiation = new ClassInstantiation<IAEFeature>( featureClass, args );
Optional<IAEFeature> instance = instantiation.get();
final ClassInstantiation<IAEFeature> instantiation = new ClassInstantiation<IAEFeature>( featureClass, args );
final Optional<IAEFeature> instance = instantiation.get();
if ( instance.isPresent() )
{
IAEFeature feature = instance.get();
for ( AEFeature f : feature.handler().getFeatures() )
final IAEFeature feature = instance.get();
final IFeatureHandler handler = feature.handler();
if ( handler.isFeatureAvailable() )
{
this.featuresToEntities.put( f, featureClass );
for ( AEFeature f : handler.getFeatures() )
{
this.featuresToEntities.put( f, featureClass );
}
handler.register();
feature.postInit();
return handler.getDefinition();
}
else
{
return null;
}
feature.handler().register();
feature.postInit();
return feature.handler().getDefinition();
}
else
{
throw new RuntimeException( "Error with Feature: " + featureClass.getName() );
throw new RuntimeException( "Error upon Class Instantiation with Feature: " + featureClass.getName() );
}
}
@@ -560,7 +568,7 @@ public class Registration
ph.registerNewLayer( "appeng.parts.layers.LayerIBatteryProvider", "buildcraft.api.mj.IBatteryProvider" );
if ( AppEng.instance.isIntegrationEnabled( IntegrationType.RF ) )
ph.registerNewLayer( "appeng.parts.layers.LayerIEnergyHandler", "cofh.api.energy.IEnergyHandler" );
ph.registerNewLayer( "appeng.parts.layers.LayerIEnergyHandler", "cofh.api.energy.IEnergyReceiver" );
FMLCommonHandler.instance().bus().register( TickHandler.instance );
MinecraftForge.EVENT_BUS.register( TickHandler.instance );
@@ -588,7 +596,9 @@ public class Registration
recipeHandler.injectRecipes();
PlayerStatsRegistration.instance.init();
final PlayerStatsRegistration registration = new PlayerStatsRegistration( FMLCommonHandler.instance().bus(), AEConfig.instance );
registration.registerAchievementHandlers();
registration.registerAchievements();
if ( AEConfig.instance.isFeatureEnabled( AEFeature.enableDisassemblyCrafting ) )
CraftingManager.getInstance().getRecipeList().add( new DisassembleRecipe() );
@@ -0,0 +1,71 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.core.stats;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent;
import appeng.util.Platform;
/**
* handles the achievement when an {@link net.minecraft.item.Item} is crafted by a player.
* The achievement is only added if its a real {@link net.minecraft.entity.player.EntityPlayer}.
*
* @author thatsIch
* @since rv2
*/
public class AchievementCraftingHandler
{
private final PlayerDifferentiator differentiator;
public AchievementCraftingHandler( PlayerDifferentiator differentiator )
{
this.differentiator = differentiator;
}
@SubscribeEvent
public void onPlayerCraftingEvent( PlayerEvent.ItemCraftedEvent event )
{
if ( this.differentiator.isNoPlayer( event.player ) || event.crafting == null )
return;
for ( Achievements achievement : Achievements.values() )
{
switch ( achievement.type )
{
case Craft:
if ( Platform.isSameItemPrecise( achievement.stack, event.crafting ) )
{
achievement.addToPlayer( event.player );
return;
}
break;
case CraftItem:
if ( achievement.stack != null && achievement.stack.getItem().getClass() == event.crafting.getItem().getClass() )
{
achievement.addToPlayer( event.player );
return;
}
default:
}
}
}
}
@@ -0,0 +1,61 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.core.stats;
/**
* Hierarchy of the AE2 achievements
*
* @author thatsIch
* @since rv2
*/
public class AchievementHierarchy
{
/**
* Setup hierarchy through assigning parents.
*/
public void registerAchievementHierarchy()
{
Achievements.Presses.setParent( Achievements.Compass );
Achievements.Fluix.setParent( Achievements.ChargedQuartz );
Achievements.Charger.setParent( Achievements.Fluix );
Achievements.CrystalGrowthAccelerator.setParent( Achievements.Charger );
Achievements.GlassCable.setParent( Achievements.Charger );
Achievements.SpatialIOExplorer.setParent( Achievements.SpatialIO );
Achievements.IOPort.setParent( Achievements.StorageCell );
Achievements.PatternTerminal.setParent( Achievements.CraftingTerminal );
Achievements.Controller.setParent( Achievements.Networking1 );
Achievements.Networking2.setParent( Achievements.Controller );
Achievements.Networking3.setParent( Achievements.Networking2 );
Achievements.P2P.setParent( Achievements.Controller );
Achievements.Recursive.setParent( Achievements.Controller );
}
}
@@ -0,0 +1,63 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.core.stats;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent;
import appeng.util.Platform;
/**
* handles the achievement when an {@link net.minecraft.item.Item} is picked up by a player.
* The achievement is only added if its a real {@link net.minecraft.entity.player.EntityPlayer}.
*
* @author thatsIch
* @since rv2
*/
public class AchievementPickupHandler
{
private final PlayerDifferentiator differentiator;
public AchievementPickupHandler( PlayerDifferentiator differentiator )
{
this.differentiator = differentiator;
}
@SubscribeEvent
public void onItemPickUp( PlayerEvent.ItemPickupEvent event )
{
if ( this.differentiator.isNoPlayer( event.player ) || event.pickedUp == null || event.pickedUp.getEntityItem() == null )
return;
ItemStack is = event.pickedUp.getEntityItem();
for ( Achievements achievement : Achievements.values() )
{
if ( achievement.type == AchievementType.Pickup && Platform.isSameItemPrecise( achievement.stack, is ) )
{
achievement.addToPlayer( event.player );
return;
}
}
}
}
@@ -0,0 +1,48 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.core.stats;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.common.util.FakePlayer;
/**
* Can differentiate if a {@link net.minecraft.entity.player.EntityPlayer} is a real player or not
*
* @author thatsIch
* @since rv2
*/
public class PlayerDifferentiator
{
/**
* Can determine if an {@link net.minecraft.entity.player.EntityPlayer} is not a real player.
* This is based on if the {@param player} is:
* - null
* - dead
* - fake
*
* @param player to be checked player
* @return true if {@param player} is not a real player
*/
public boolean isNoPlayer( EntityPlayer player )
{
return player == null || player.isDead || player instanceof FakePlayer;
}
}
@@ -18,125 +18,74 @@
package appeng.core.stats;
import java.util.ArrayList;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.stats.Achievement;
import net.minecraftforge.common.AchievementPage;
import net.minecraftforge.common.util.FakePlayer;
import cpw.mods.fml.common.eventhandler.EventBus;
import appeng.core.AEConfig;
import appeng.core.features.AEFeature;
import appeng.util.Platform;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent;
/**
* Registers any items a player is picking up or is crafting.
* Registered items are added to the player stats.
* This will only happen if the {@link AEFeature#Achievements} feature is enabled.
*/
public class PlayerStatsRegistration
{
/**
* {@link cpw.mods.fml.common.eventhandler.EventBus} to which the handlers might get posted to depending if the feature is enabled
*/
private final EventBus bus;
public final static PlayerStatsRegistration instance = new PlayerStatsRegistration();
/**
* is true if the {@link appeng.core.features.AEFeature#Achievements} is enabled in the {@param config}
*/
private final boolean isAchievementFeatureEnabled;
AchievementPage ae2AchievementPage;
@SubscribeEvent
public void onCrafting(PlayerEvent.ItemCraftedEvent event)
/**
* Constructs a {@link appeng.core.stats.PlayerStatsRegistration} with an {@link cpw.mods.fml.common.eventhandler.EventBus} and {@link appeng.core.AEConfig}.
*
* @param bus {@see #bus}
* @param config {@link appeng.core.AEConfig} which is used to determine if the {@link appeng.core.features.AEFeature#Achievements} is enabled
*/
public PlayerStatsRegistration( EventBus bus, AEConfig config )
{
if ( notPlayer( event.player ) || event.crafting == null )
return;
for (Achievements a : Achievements.values())
{
switch (a.type)
{
case Craft:
if ( Platform.isSameItemPrecise( a.stack, event.crafting ) )
{
a.addToPlayer( event.player );
return;
}
break;
case CraftItem:
if ( a.stack.getItem().getClass() == event.crafting.getItem().getClass() )
{
a.addToPlayer( event.player );
return;
}
default:
}
}
}
@SubscribeEvent
public void onCrafting(PlayerEvent.ItemPickupEvent event)
{
if ( notPlayer( event.player ) || event.pickedUp == null || event.pickedUp.getEntityItem() == null )
return;
ItemStack is = event.pickedUp.getEntityItem();
for (Achievements a : Achievements.values())
{
switch (a.type)
{
case Pickup:
if ( Platform.isSameItemPrecise( a.stack, is ) )
{
a.addToPlayer( event.player );
return;
}
default:
}
}
}
private boolean notPlayer(EntityPlayer player)
{
if ( player == null || player.isDead || player instanceof FakePlayer )
return true;
return false;
this.bus = bus;
this.isAchievementFeatureEnabled = config.isFeatureEnabled( AEFeature.Achievements );
}
/**
* Assign Parents and hierarchy.
* Registers the {@link appeng.core.stats.AchievementCraftingHandler} and {@link appeng.core.stats.AchievementPickupHandler} to the {@link #bus} if {@link #isAchievementFeatureEnabled} is true.
*/
private void initHierarchy()
public void registerAchievementHandlers()
{
Achievements.Presses.setParent( Achievements.Compass );
if ( this.isAchievementFeatureEnabled )
{
final PlayerDifferentiator differentiator = new PlayerDifferentiator();
final AchievementCraftingHandler craftingHandler = new AchievementCraftingHandler( differentiator );
final AchievementPickupHandler pickupHandler = new AchievementPickupHandler( differentiator );
Achievements.Fluix.setParent( Achievements.ChargedQuartz );
Achievements.Charger.setParent( Achievements.Fluix );
Achievements.CrystalGrowthAccelerator.setParent( Achievements.Charger );
Achievements.GlassCable.setParent( Achievements.Charger );
Achievements.SpatialIOExplorer.setParent( Achievements.SpatialIO );
Achievements.IOPort.setParent( Achievements.StorageCell );
Achievements.PatternTerminal.setParent( Achievements.CraftingTerminal );
Achievements.Controller.setParent( Achievements.Networking1 );
Achievements.Networking2.setParent( Achievements.Controller );
Achievements.Networking3.setParent( Achievements.Networking2 );
Achievements.P2P.setParent( Achievements.Controller );
Achievements.Recursive.setParent( Achievements.Controller );
this.bus.register( craftingHandler );
this.bus.register( pickupHandler );
}
}
public void init()
/**
* Registers the {@link appeng.core.stats.AchievementHierarchy} and adds all {@link appeng.core.stats.Achievements} to a new {@link net.minecraftforge.common.AchievementPage}.
*/
public void registerAchievements()
{
if ( AEConfig.instance.isFeatureEnabled( AEFeature.Achievements ) )
if ( this.isAchievementFeatureEnabled )
{
FMLCommonHandler.instance().bus().register( this );
initHierarchy();
final AchievementHierarchy hierarchy = new AchievementHierarchy();
hierarchy.registerAchievementHierarchy();
for (Stats s : Stats.values())
for ( Stats s : Stats.values() )
s.getStat();
/**
@@ -144,14 +93,14 @@ public class PlayerStatsRegistration
*/
ArrayList<Achievement> list = new ArrayList<Achievement>();
for (Achievements a : Achievements.values())
for ( Achievements a : Achievements.values() )
{
Achievement ach = a.getAchievement();
if ( ach != null )
list.add( ach );
}
ae2AchievementPage = new AchievementPage( "Applied Energistics 2", list.toArray( new Achievement[list.size()] ) );
AchievementPage ae2AchievementPage = new AchievementPage( "Applied Energistics 2", list.toArray( new Achievement[list.size()] ) );
AchievementPage.registerAchievementPage( ae2AchievementPage );
}
}
@@ -104,25 +104,26 @@ public class PacketNEIRecipe extends AppEngPacket
IEnergyGrid energy = grid.getCache( IEnergyGrid.class );
ISecurityGrid security = grid.getCache( ISecurityGrid.class );
IInventory craftMatrix = cct.getInventoryByName( "crafting" );
IInventory playerInventory = cct.getInventoryByName( "player" );
Actionable realForFake = cct.useRealItems() ? Actionable.MODULATE : Actionable.SIMULATE;
if ( inv != null && recipe != null && security != null )
{
InventoryCrafting ic = new InventoryCrafting( new ContainerNull(), 3, 3 );
InventoryCrafting testInv = new InventoryCrafting( new ContainerNull(), 3, 3 );
for (int x = 0; x < 9; x++)
{
if ( recipe[x] != null && recipe[x].length > 0 )
{
ic.setInventorySlotContents( x, recipe[x][0] );
testInv.setInventorySlotContents(x, recipe[x][0]);
}
}
IRecipe r = Platform.findMatchingRecipe( ic, pmp.worldObj );
IRecipe r = Platform.findMatchingRecipe( testInv, pmp.worldObj );
if ( r != null && security.hasPermission( player, SecurityPermissions.EXTRACT ) )
{
ItemStack is = r.getCraftingResult( ic );
ItemStack is = r.getCraftingResult( testInv );
if ( is != null )
{
@@ -132,14 +133,14 @@ public class PacketNEIRecipe extends AppEngPacket
for (int x = 0; x < craftMatrix.getSizeInventory(); x++)
{
ItemStack PatternItem = ic.getStackInSlot( x );
ItemStack PatternItem = testInv.getStackInSlot( x );
ItemStack currentItem = craftMatrix.getStackInSlot( x );
if ( currentItem != null )
{
ic.setInventorySlotContents( x, currentItem );
ItemStack newItemStack = r.matches( ic, pmp.worldObj ) ? r.getCraftingResult( ic ) : null;
ic.setInventorySlotContents( x, PatternItem );
testInv.setInventorySlotContents(x, currentItem);
ItemStack newItemStack = r.matches( testInv, pmp.worldObj ) ? r.getCraftingResult( testInv ) : null;
testInv.setInventorySlotContents(x, PatternItem);
if ( newItemStack == null || !Platform.isSameItemPrecise( newItemStack, is ) )
{
@@ -158,11 +159,15 @@ public class PacketNEIRecipe extends AppEngPacket
}
}
// True if we need to fetch an item for the recipe
if ( PatternItem != null && currentItem == null )
{
ItemStack whichItem = Platform.extractItemsByRecipe( energy, cct.getSource(), storage, player.worldObj, r, is, ic,
// Grab from network by recipe
ItemStack whichItem = Platform.extractItemsByRecipe( energy, cct.getSource(), storage, player.worldObj, r, is, testInv,
PatternItem, x, all, realForFake, filter );
// If that doesn't get it, grab exact items from network (?)
// TODO see if this code is necessary
if ( whichItem == null )
{
for (int y = 0; y < recipe[x].length; y++)
@@ -184,6 +189,26 @@ public class PacketNEIRecipe extends AppEngPacket
}
}
// If that doesn't work, grab from the player's inventory
if ( whichItem == null && playerInventory != null ) {
for ( int y = 0; y < playerInventory.getSizeInventory(); y++ )
{
// Put the item in the test inventory, and check if the recipe is satisfied
testInv.setInventorySlotContents(x, playerInventory.getStackInSlot(y));
if ( r.matches(testInv, pmp.worldObj) )
{
// Take the item out.
if ( realForFake == Actionable.SIMULATE ) {
whichItem = playerInventory.getStackInSlot(y).copy();
whichItem.stackSize = 1;
} else {
whichItem = playerInventory.decrStackSize(y, 1);
}
break;
}
}
}
craftMatrix.setInventorySlotContents( x, whichItem );
}
}
@@ -31,6 +31,8 @@ public class RF extends BaseModule
public static RF instance;
public RF() {
TestClass( cofh.api.energy.IEnergyReceiver.class );
TestClass( cofh.api.energy.IEnergyProvider.class );
TestClass( cofh.api.energy.IEnergyHandler.class );
TestClass( cofh.api.energy.IEnergyConnection.class );
}
@@ -18,40 +18,36 @@
package appeng.integration.modules.helpers;
import net.minecraftforge.common.util.ForgeDirection;
import cofh.api.energy.IEnergyHandler;
public class NullRFHandler implements IEnergyHandler
import net.minecraftforge.common.util.ForgeDirection;
import cofh.api.energy.IEnergyReceiver;
public class NullRFHandler implements IEnergyReceiver
{
@Override
public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate)
public int receiveEnergy( ForgeDirection from, int maxReceive, boolean simulate )
{
return 0;
}
@Override
public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate)
public int getEnergyStored( ForgeDirection from )
{
return 0;
}
@Override
public int getEnergyStored(ForgeDirection from)
public int getMaxEnergyStored( ForgeDirection from )
{
return 0;
}
@Override
public int getMaxEnergyStored(ForgeDirection from)
{
return 0;
}
@Override
public boolean canConnectEnergy(ForgeDirection from)
public boolean canConnectEnergy( ForgeDirection from )
{
return true;
}
}
@@ -21,7 +21,12 @@ package appeng.parts.layers;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.parts.IPart;
import appeng.api.parts.LayerBase;
import cofh.api.energy.IEnergyConnection;
import cofh.api.energy.IEnergyHandler;
import cofh.api.energy.IEnergyProvider;
import cofh.api.energy.IEnergyReceiver;
public class LayerIEnergyHandler extends LayerBase implements IEnergyHandler
{
@@ -29,9 +34,9 @@ public class LayerIEnergyHandler extends LayerBase implements IEnergyHandler
@Override
public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate)
{
IPart part = getPart( from );
if ( part instanceof IEnergyHandler )
return ((IEnergyHandler) part).receiveEnergy( from, maxReceive, simulate );
IPart part = this.getPart( from );
if ( part instanceof IEnergyReceiver )
return ((IEnergyReceiver) part).receiveEnergy( from, maxReceive, simulate );
return 0;
}
@@ -39,9 +44,9 @@ public class LayerIEnergyHandler extends LayerBase implements IEnergyHandler
@Override
public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate)
{
IPart part = getPart( from );
if ( part instanceof IEnergyHandler )
return ((IEnergyHandler) part).extractEnergy( from, maxExtract, simulate );
IPart part = this.getPart( from );
if ( part instanceof IEnergyProvider )
return ((IEnergyProvider) part).extractEnergy( from, maxExtract, simulate );
return 0;
}
@@ -49,9 +54,9 @@ public class LayerIEnergyHandler extends LayerBase implements IEnergyHandler
@Override
public int getEnergyStored(ForgeDirection from)
{
IPart part = getPart( from );
if ( part instanceof IEnergyHandler )
return ((IEnergyHandler) part).getEnergyStored( from );
IPart part = this.getPart( from );
if ( part instanceof IEnergyProvider )
return ((IEnergyProvider) part).getEnergyStored( from );
return 0;
}
@@ -59,9 +64,9 @@ public class LayerIEnergyHandler extends LayerBase implements IEnergyHandler
@Override
public int getMaxEnergyStored(ForgeDirection from)
{
IPart part = getPart( from );
if ( part instanceof IEnergyHandler )
return ((IEnergyHandler) part).getMaxEnergyStored( from );
IPart part = this.getPart( from );
if ( part instanceof IEnergyProvider )
return ((IEnergyProvider) part).getMaxEnergyStored( from );
return 0;
}
@@ -69,9 +74,9 @@ public class LayerIEnergyHandler extends LayerBase implements IEnergyHandler
@Override
public boolean canConnectEnergy(ForgeDirection from)
{
IPart part = getPart( from );
if ( part instanceof IEnergyHandler )
return ((IEnergyHandler) part).canConnectEnergy( from );
IPart part = this.getPart( from );
if ( part instanceof IEnergyConnection )
return ((IEnergyConnection) part).canConnectEnergy( from );
return false;
}
@@ -18,6 +18,7 @@
package appeng.parts.p2p;
import java.util.Stack;
import net.minecraft.init.Blocks;
@@ -25,6 +26,12 @@ import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import cofh.api.energy.IEnergyReceiver;
import appeng.api.config.PowerUnits;
import appeng.api.config.TunnelType;
import appeng.core.AppEng;
@@ -34,18 +41,28 @@ import appeng.me.GridAccessException;
import appeng.transformer.annotations.integration.Interface;
import appeng.transformer.annotations.integration.InterfaceList;
import appeng.util.Platform;
import cofh.api.energy.IEnergyHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@InterfaceList(value = { @Interface(iface = "cofh.api.energy.IEnergyHandler", iname = "RF") })
public class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements cofh.api.energy.IEnergyHandler
@InterfaceList( value = { @Interface( iface = "cofh.api.energy.IEnergyReceiver", iname = "RF" ) } )
public class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements IEnergyReceiver
{
private static final ThreadLocal<Stack<PartP2PRFPower>> THREAD_STACK = new ThreadLocal<Stack<PartP2PRFPower>>();
/**
* Default element based on the null element pattern
*/
private static final IEnergyReceiver NULL_HANDLER = new NullRFHandler();
private boolean cachedTarget = false;
private IEnergyReceiver outputTarget;
private static final IEnergyHandler myNullHandler = new NullRFHandler();
public PartP2PRFPower( ItemStack is )
{
super( is );
boolean cachedTarget = false;
IEnergyHandler outputTarget;
if ( !AppEng.instance.isIntegrationEnabled( IntegrationType.RF ) )
{
throw new RuntimeException( "RF Not installed!" );
}
}
@Override
public TunnelType getTunnelType()
@@ -53,61 +70,38 @@ public class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements cof
return TunnelType.RF_POWER;
}
public PartP2PRFPower(ItemStack is) {
super( is );
if ( !AppEng.instance.isIntegrationEnabled( IntegrationType.RF ) )
throw new RuntimeException( "RF Not installed!" );
}
@Override
public void onNeighborChanged()
public void onTunnelNetworkChange()
{
super.onNeighborChanged();
cachedTarget = false;
this.getHost().notifyNeighbors();
}
@Override
@SideOnly(Side.CLIENT)
@SideOnly( Side.CLIENT )
public IIcon getTypeTexture()
{
return Blocks.iron_block.getBlockTextureFromSide( 0 );
}
@Override
public void onTunnelNetworkChange()
public void onNeighborChanged()
{
getHost().notifyNeighbors();
}
super.onNeighborChanged();
public float getPowerDrainPerTick()
{
return 0.5f;
}
static final ThreadLocal<Stack<PartP2PRFPower>> depth = new ThreadLocal<Stack<PartP2PRFPower>>();
private Stack<PartP2PRFPower> getDepth()
{
Stack<PartP2PRFPower> s = depth.get();
if ( s == null )
depth.set( s = new Stack<PartP2PRFPower>() );
return s;
this.cachedTarget = false;
}
@Override
public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate)
public int receiveEnergy( ForgeDirection from, int maxReceive, boolean simulate )
{
if ( output )
if ( this.output )
return 0;
if ( isActive() )
if ( this.isActive() )
{
Stack<PartP2PRFPower> stack = getDepth();
Stack<PartP2PRFPower> stack = this.getDepth();
for (PartP2PRFPower t : stack)
for ( PartP2PRFPower t : stack )
if ( t == this )
return 0;
@@ -117,7 +111,7 @@ public class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements cof
try
{
for (PartP2PRFPower t : getOutputs())
for ( PartP2PRFPower t : this.getOutputs() )
{
if ( Platform.getRandomInt() % 2 > 0 )
{
@@ -132,7 +126,7 @@ public class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements cof
if ( maxReceive > 0 )
{
for (PartP2PRFPower t : getOutputs())
for ( PartP2PRFPower t : this.getOutputs() )
{
int receiver = t.getOutput().receiveEnergy( t.side.getOpposite(), maxReceive, simulate );
maxReceive -= receiver;
@@ -143,9 +137,9 @@ public class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements cof
}
}
QueueTunnelDrain( PowerUnits.RF, total );
this.QueueTunnelDrain( PowerUnits.RF, total );
}
catch (GridAccessException ignored)
catch ( GridAccessException ignored )
{
}
@@ -158,23 +152,47 @@ public class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements cof
return 0;
}
@Override
public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate)
private Stack<PartP2PRFPower> getDepth()
{
return 0;
Stack<PartP2PRFPower> s = THREAD_STACK.get();
if ( s == null )
THREAD_STACK.set( s = new Stack<PartP2PRFPower>() );
return s;
}
private IEnergyReceiver getOutput()
{
if ( this.output )
{
if ( !this.cachedTarget )
{
TileEntity self = this.getTile();
TileEntity te = self.getWorldObj().getTileEntity( self.xCoord + this.side.offsetX, self.yCoord + this.side.offsetY, self.zCoord + this.side.offsetZ );
this.outputTarget = te instanceof IEnergyReceiver ? ( IEnergyReceiver ) te : null;
this.cachedTarget = true;
}
if ( this.outputTarget == null || !this.outputTarget.canConnectEnergy( this.side.getOpposite() ) )
return NULL_HANDLER;
return this.outputTarget;
}
return NULL_HANDLER;
}
@Override
public int getEnergyStored(ForgeDirection from)
public int getEnergyStored( ForgeDirection from )
{
if ( output || !isActive() )
if ( this.output || !this.isActive() )
return 0;
int total = 0;
Stack<PartP2PRFPower> stack = getDepth();
Stack<PartP2PRFPower> stack = this.getDepth();
for (PartP2PRFPower t : stack)
for ( PartP2PRFPower t : stack )
if ( t == this )
return 0;
@@ -182,12 +200,12 @@ public class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements cof
try
{
for (PartP2PRFPower t : getOutputs())
for ( PartP2PRFPower t : this.getOutputs() )
{
total += t.getOutput().getEnergyStored( t.side.getOpposite() );
}
}
catch (GridAccessException e)
catch ( GridAccessException e )
{
return 0;
}
@@ -199,16 +217,16 @@ public class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements cof
}
@Override
public int getMaxEnergyStored(ForgeDirection from)
public int getMaxEnergyStored( ForgeDirection from )
{
if ( output || !isActive() )
if ( this.output || !this.isActive() )
return 0;
int total = 0;
Stack<PartP2PRFPower> stack = getDepth();
Stack<PartP2PRFPower> stack = this.getDepth();
for (PartP2PRFPower t : stack)
for ( PartP2PRFPower t : stack )
if ( t == this )
return 0;
@@ -216,12 +234,12 @@ public class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements cof
try
{
for (PartP2PRFPower t : getOutputs())
for ( PartP2PRFPower t : this.getOutputs() )
{
total += t.getOutput().getMaxEnergyStored( t.side.getOpposite() );
}
}
catch (GridAccessException e)
catch ( GridAccessException e )
{
return 0;
}
@@ -232,28 +250,8 @@ public class PartP2PRFPower extends PartP2PTunnel<PartP2PRFPower> implements cof
return total;
}
private IEnergyHandler getOutput()
{
if ( output )
{
if ( !cachedTarget )
{
TileEntity self = getTile();
TileEntity te = self.getWorldObj().getTileEntity( self.xCoord + side.offsetX, self.yCoord + side.offsetY, self.zCoord + side.offsetZ );
outputTarget = te instanceof IEnergyHandler ? (IEnergyHandler) te : null;
cachedTarget = true;
}
if ( outputTarget == null || !outputTarget.canConnectEnergy( side.getOpposite() ) )
return myNullHandler;
return outputTarget;
}
return myNullHandler;
}
@Override
public boolean canConnectEnergy(ForgeDirection from)
public boolean canConnectEnergy( ForgeDirection from )
{
return true;
}
@@ -18,49 +18,47 @@
package appeng.tile.powersink;
import net.minecraftforge.common.util.ForgeDirection;
import cofh.api.energy.IEnergyReceiver;
import appeng.api.config.PowerUnits;
import appeng.transformer.annotations.integration.Interface;
import cofh.api.energy.IEnergyHandler;
@Interface(iname = "RF", iface = "cofh.api.energy.IEnergyHandler")
public abstract class RedstoneFlux extends RotaryCraft implements IEnergyHandler
@Interface( iname = "RF", iface = "cofh.api.energy.IEnergyReceiver" )
public abstract class RedstoneFlux extends RotaryCraft implements IEnergyReceiver
{
@Override
final public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate)
final public int receiveEnergy( ForgeDirection from, int maxReceive, boolean simulate )
{
final int networkRFDemand = (int) Math.floor( this.getExternalPowerDemand( PowerUnits.RF, maxReceive ) );
final int networkRFDemand = ( int ) Math.floor( this.getExternalPowerDemand( PowerUnits.RF, maxReceive ) );
final int usedRF = Math.min( maxReceive, networkRFDemand );
if ( !simulate )
{
this.injectExternalPower( PowerUnits.RF, usedRF );
}
return usedRF;
}
@Override
final public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate)
final public int getEnergyStored( ForgeDirection from )
{
return 0;
return ( int ) Math.floor( PowerUnits.AE.convertTo( PowerUnits.RF, this.getAECurrentPower() ) );
}
@Override
final public boolean canConnectEnergy(ForgeDirection from)
final public int getMaxEnergyStored( ForgeDirection from )
{
return ( int ) Math.floor( PowerUnits.AE.convertTo( PowerUnits.RF, this.getAEMaxPower() ) );
}
@Override
final public boolean canConnectEnergy( ForgeDirection from )
{
return this.getPowerSides().contains( from );
}
@Override
final public int getEnergyStored(ForgeDirection from)
{
return (int) Math.floor( PowerUnits.AE.convertTo( PowerUnits.RF, this.getAECurrentPower() ) );
}
@Override
final public int getMaxEnergyStored(ForgeDirection from)
{
return (int) Math.floor( PowerUnits.AE.convertTo( PowerUnits.RF, this.getAEMaxPower() ) );
}
}
@@ -33,7 +33,7 @@ import cpw.mods.fml.relauncher.FMLRelaunchLog;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion;
@MCVersion()
@MCVersion("1.7.10")
public class AppEngCore extends DummyModContainer implements IFMLLoadingPlugin
{
@@ -33,76 +33,76 @@ public class AdaptorPlayerInventory implements IInventory
{
if ( swap )
src = new WrapperChainedInventory( new WrapperInventoryRange( playerInv, 9, size-9, false ), new WrapperInventoryRange( playerInv, 0, 9, false ) );
this.src = new WrapperChainedInventory( new WrapperInventoryRange( playerInv, 9, this.size -9, false ), new WrapperInventoryRange( playerInv, 0, 9, false ) );
else
src = playerInv;
this.src = playerInv;
}
@Override
public int getSizeInventory()
{
return size;
return this.size;
}
@Override
public ItemStack getStackInSlot(int var1)
{
return src.getStackInSlot( var1 + min );
return this.src.getStackInSlot( var1 + this.min );
}
@Override
public ItemStack decrStackSize(int var1, int var2)
{
return src.decrStackSize( min + var1, var2 );
return this.src.decrStackSize( this.min + var1, var2 );
}
@Override
public ItemStack getStackInSlotOnClosing(int var1)
{
return src.getStackInSlotOnClosing( min + var1 );
return this.src.getStackInSlotOnClosing( this.min + var1 );
}
@Override
public void setInventorySlotContents(int var1, ItemStack var2)
{
src.setInventorySlotContents( var1 + min, var2 );
this.src.setInventorySlotContents( var1 + this.min, var2 );
}
@Override
public String getInventoryName()
{
return src.getInventoryName();
return this.src.getInventoryName();
}
@Override
public int getInventoryStackLimit()
{
return src.getInventoryStackLimit();
return this.src.getInventoryStackLimit();
}
@Override
public void markDirty()
{
src.markDirty();
this.src.markDirty();
}
@Override
public boolean isUseableByPlayer(EntityPlayer var1)
{
return src.isUseableByPlayer( var1 );
return this.src.isUseableByPlayer( var1 );
}
@Override
public void openInventory()
{
src.openInventory();
this.src.openInventory();
}
@Override
public void closeInventory()
{
src.closeInventory();
this.src.closeInventory();
}
@Override
@@ -114,7 +114,7 @@ public class AdaptorPlayerInventory implements IInventory
@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack)
{
return true;
return this.src.isItemValidForSlot( i, itemstack );
}
}
@@ -468,7 +468,7 @@ achievement.ae2.SpatialIO=Spatial Coordination
achievement.ae2.SpatialIO.desc=Craft a Spatial IO Port
achievement.ae2.SpatialIOExplorer=To boldly go
achievement.ae2.SpatialIOExplorer.desc=Get stored in a spatial storage cell
achievement.ae2.StorageCell=Better Then Chests
achievement.ae2.StorageCell=Better Than Chests
achievement.ae2.StorageCell.desc=Craft a Storage Cell
achievement.ae2.IOPort=Storage Cell Shuffle
achievement.ae2.IOPort.desc=Craft a IO Port
@@ -513,4 +513,4 @@ achievement.ae2.QNB.desc=Craft a Quantum Link
stat.ae2.ItemsInserted=Items added to ME Storage
stat.ae2.ItemsExtracted=Items extracted from ME Storage
stat.ae2.TurnedCranks=Turned Cranks
stat.ae2.TurnedCranks=Turned Cranks