Closes #1344 Added a silk touch annihilation plane

This commit is contained in:
yueh 2015-05-19 00:45:45 +02:00
parent 98fe4680c1
commit 4befdecd25
12 changed files with 289 additions and 109 deletions

View file

@ -66,6 +66,8 @@ public interface IParts
IItemDefinition annihilationPlane(); IItemDefinition annihilationPlane();
IItemDefinition identityAnnihilationPlane();
IItemDefinition formationPlane(); IItemDefinition formationPlane();
IItemDefinition p2PTunnelME(); IItemDefinition p2PTunnelME();

View file

@ -69,6 +69,8 @@ public enum CableBusTextures
BlockFormPlaneOn( "BlockFormPlaneOn" ), BlockFormPlaneOn( "BlockFormPlaneOn" ),
BlockIdentityAnnihilationPlaneOn( "BlockIdentityAnnihilationPlaneOn" ),
ItemPartLevelEmitterOn( "ItemPart.LevelEmitterOn" ), PartTransitionPlaneBack( "PartTransitionPlaneBack" ), ItemPartLevelEmitterOn( "ItemPart.LevelEmitterOn" ), PartTransitionPlaneBack( "PartTransitionPlaneBack" ),
PartTunnelSides( "PartTunnelSides" ), PartPlaneSides( "PartPlaneSides" ), PartExportSides( "PartExportSides" ), PartImportSides( "PartImportSides" ), PartTunnelSides( "PartTunnelSides" ), PartPlaneSides( "PartPlaneSides" ), PartExportSides( "PartExportSides" ), PartImportSides( "PartImportSides" ),

View file

@ -51,6 +51,7 @@ public final class ApiParts implements IParts
private final IItemDefinition iface; private final IItemDefinition iface;
private final IItemDefinition levelEmitter; private final IItemDefinition levelEmitter;
private final IItemDefinition annihilationPlane; private final IItemDefinition annihilationPlane;
private final IItemDefinition identityAnnihilationPlane;
private final IItemDefinition formationPlane; private final IItemDefinition formationPlane;
private final IItemDefinition p2PTunnelME; private final IItemDefinition p2PTunnelME;
private final IItemDefinition p2PTunnelRedstone; private final IItemDefinition p2PTunnelRedstone;
@ -93,6 +94,7 @@ public final class ApiParts implements IParts
this.iface = new DamagedItemDefinition( itemMultiPart.createPart( PartType.Interface ) ); this.iface = new DamagedItemDefinition( itemMultiPart.createPart( PartType.Interface ) );
this.levelEmitter = new DamagedItemDefinition( itemMultiPart.createPart( PartType.LevelEmitter ) ); this.levelEmitter = new DamagedItemDefinition( itemMultiPart.createPart( PartType.LevelEmitter ) );
this.annihilationPlane = new DamagedItemDefinition( itemMultiPart.createPart( PartType.AnnihilationPlane ) ); this.annihilationPlane = new DamagedItemDefinition( itemMultiPart.createPart( PartType.AnnihilationPlane ) );
this.identityAnnihilationPlane = new DamagedItemDefinition( itemMultiPart.createPart( PartType.IdentityAnnihilationPlane ) );
this.formationPlane = new DamagedItemDefinition( itemMultiPart.createPart( PartType.FormationPlane ) ); this.formationPlane = new DamagedItemDefinition( itemMultiPart.createPart( PartType.FormationPlane ) );
this.p2PTunnelME = new DamagedItemDefinition( itemMultiPart.createPart( PartType.P2PTunnelME ) ); this.p2PTunnelME = new DamagedItemDefinition( itemMultiPart.createPart( PartType.P2PTunnelME ) );
this.p2PTunnelRedstone = new DamagedItemDefinition( itemMultiPart.createPart( PartType.P2PTunnelRedstone ) ); this.p2PTunnelRedstone = new DamagedItemDefinition( itemMultiPart.createPart( PartType.P2PTunnelRedstone ) );
@ -220,6 +222,12 @@ public final class ApiParts implements IParts
return this.annihilationPlane; return this.annihilationPlane;
} }
@Override
public IItemDefinition identityAnnihilationPlane()
{
return this.identityAnnihilationPlane;
}
@Override @Override
public IItemDefinition formationPlane() public IItemDefinition formationPlane()
{ {

View file

@ -49,7 +49,7 @@ public enum AEFeature
SpatialIO( "NetworkFeatures" ), QuantumNetworkBridge( "NetworkFeatures" ), Channels( "NetworkFeatures" ), SpatialIO( "NetworkFeatures" ), QuantumNetworkBridge( "NetworkFeatures" ), Channels( "NetworkFeatures" ),
LevelEmitter( "NetworkBuses" ), CraftingTerminal( "NetworkBuses" ), StorageMonitor( "NetworkBuses" ), P2PTunnel( "NetworkBuses" ), FormationPlane( "NetworkBuses" ), AnnihilationPlane( "NetworkBuses" ), ImportBus( "NetworkBuses" ), ExportBus( "NetworkBuses" ), StorageBus( "NetworkBuses" ), PartConversionMonitor( "NetworkBuses" ), LevelEmitter( "NetworkBuses" ), CraftingTerminal( "NetworkBuses" ), StorageMonitor( "NetworkBuses" ), P2PTunnel( "NetworkBuses" ), FormationPlane( "NetworkBuses" ), AnnihilationPlane( "NetworkBuses" ), IdentityAnnihilationPlane( "NetworkBuses" ), ImportBus( "NetworkBuses" ), ExportBus( "NetworkBuses" ), StorageBus( "NetworkBuses" ), PartConversionMonitor( "NetworkBuses" ),
StorageCells( "Storage" ), PortableCell( "PortableCell" ), MEChest( "Storage" ), MEDrive( "Storage" ), IOPort( "Storage" ), StorageCells( "Storage" ), PortableCell( "PortableCell" ), MEChest( "Storage" ), MEDrive( "Storage" ), IOPort( "Storage" ),

View file

@ -33,6 +33,7 @@ import appeng.parts.automation.PartExportBus;
import appeng.parts.automation.PartFormationPlane; import appeng.parts.automation.PartFormationPlane;
import appeng.parts.automation.PartImportBus; import appeng.parts.automation.PartImportBus;
import appeng.parts.automation.PartLevelEmitter; import appeng.parts.automation.PartLevelEmitter;
import appeng.parts.automation.PartIdentityAnnihilationPlane;
import appeng.parts.misc.PartCableAnchor; import appeng.parts.misc.PartCableAnchor;
import appeng.parts.misc.PartInterface; import appeng.parts.misc.PartInterface;
import appeng.parts.misc.PartInvertedToggleBus; import appeng.parts.misc.PartInvertedToggleBus;
@ -126,6 +127,8 @@ public enum PartType
AnnihilationPlane( 300, EnumSet.of( AEFeature.AnnihilationPlane ), EnumSet.noneOf( IntegrationType.class ), PartAnnihilationPlane.class ), AnnihilationPlane( 300, EnumSet.of( AEFeature.AnnihilationPlane ), EnumSet.noneOf( IntegrationType.class ), PartAnnihilationPlane.class ),
IdentityAnnihilationPlane( 301, EnumSet.of( AEFeature.AnnihilationPlane, AEFeature.IdentityAnnihilationPlane ), EnumSet.noneOf( IntegrationType.class ), PartIdentityAnnihilationPlane.class ),
FormationPlane( 320, EnumSet.of( AEFeature.FormationPlane ), EnumSet.noneOf( IntegrationType.class ), PartFormationPlane.class ), FormationPlane( 320, EnumSet.of( AEFeature.FormationPlane ), EnumSet.noneOf( IntegrationType.class ), PartFormationPlane.class ),
PatternTerminal( 340, EnumSet.of( AEFeature.Patterns ), EnumSet.noneOf( IntegrationType.class ), PartPatternTerminal.class ), PatternTerminal( 340, EnumSet.of( AEFeature.Patterns ), EnumSet.noneOf( IntegrationType.class ), PartPatternTerminal.class ),
@ -154,7 +157,7 @@ public enum PartType
P2PTunnelLight( 467, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelLight ), EnumSet.noneOf( IntegrationType.class ), PartP2PLight.class, GuiText.LightTunnel ), P2PTunnelLight( 467, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelLight ), EnumSet.noneOf( IntegrationType.class ), PartP2PLight.class, GuiText.LightTunnel ),
P2PTunnelOpenComputers(468, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelOpenComputers ), EnumSet.of( IntegrationType.OpenComputers ), PartP2POpenComputers.class, GuiText.OCTunnel ), P2PTunnelOpenComputers( 468, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelOpenComputers ), EnumSet.of( IntegrationType.OpenComputers ), PartP2POpenComputers.class, GuiText.OCTunnel ),
InterfaceTerminal( 480, EnumSet.of( AEFeature.InterfaceTerminal ), EnumSet.noneOf( IntegrationType.class ), PartInterfaceTerminal.class ); InterfaceTerminal( 480, EnumSet.of( AEFeature.InterfaceTerminal ), EnumSet.noneOf( IntegrationType.class ), PartInterfaceTerminal.class );
@ -172,7 +175,7 @@ public enum PartType
PartType( int baseMetaValue, Set<AEFeature> features, Set<IntegrationType> integrations, Class<? extends IPart> c, GuiText en ) PartType( int baseMetaValue, Set<AEFeature> features, Set<IntegrationType> integrations, Class<? extends IPart> c, GuiText en )
{ {
this.features = Collections.unmodifiableSet( features ) ; this.features = Collections.unmodifiableSet( features );
this.integrations = Collections.unmodifiableSet( integrations ); this.integrations = Collections.unmodifiableSet( integrations );
this.myPart = c; this.myPart = c;
this.extraName = en; this.extraName = en;

View file

@ -19,6 +19,7 @@
package appeng.parts.automation; package appeng.parts.automation;
import java.util.List;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@ -32,6 +33,7 @@ import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.world.WorldServer; import net.minecraft.world.WorldServer;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
@ -69,6 +71,11 @@ import appeng.util.item.AEItemStack;
public class PartAnnihilationPlane extends PartBasicState implements IGridTickable, Callable<TickRateModulation> public class PartAnnihilationPlane extends PartBasicState implements IGridTickable, Callable<TickRateModulation>
{ {
private final static IIcon SIDE_ICON = CableBusTextures.PartPlaneSides.getIcon();
private final static IIcon BACK_ICON = CableBusTextures.PartTransitionPlaneBack.getIcon();
private final static IIcon STATUS_ICON = CableBusTextures.PartMonitorSidesStatus.getIcon();
private final static IIcon ACTIVE_ICON = CableBusTextures.BlockAnnihilationPlaneOn.getIcon();
private final BaseActionSource mySrc = new MachineSource( this ); private final BaseActionSource mySrc = new MachineSource( this );
private boolean isAccepting = true; private boolean isAccepting = true;
private boolean breaking = false; private boolean breaking = false;
@ -134,7 +141,7 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void renderInventory( IPartRenderHelper rh, RenderBlocks renderer ) public void renderInventory( IPartRenderHelper rh, RenderBlocks renderer )
{ {
rh.setTexture( CableBusTextures.PartPlaneSides.getIcon(), CableBusTextures.PartPlaneSides.getIcon(), CableBusTextures.PartTransitionPlaneBack.getIcon(), this.is.getIconIndex(), CableBusTextures.PartPlaneSides.getIcon(), CableBusTextures.PartPlaneSides.getIcon() ); rh.setTexture( SIDE_ICON, SIDE_ICON, BACK_ICON, this.is.getIconIndex(), SIDE_ICON, SIDE_ICON );
rh.setBounds( 1, 1, 15, 15, 15, 16 ); rh.setBounds( 1, 1, 15, 15, 15, 16 );
rh.renderInventoryBox( renderer ); rh.renderInventoryBox( renderer );
@ -146,6 +153,11 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void renderStatic( int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer ) public void renderStatic( int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer )
{
this.renderStaticWithIcon( x, y, z, rh, renderer, ACTIVE_ICON );
}
protected void renderStaticWithIcon( int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer, IIcon activeIcon )
{ {
int minX = 1; int minX = 1;
int minY = 1; int minY = 1;
@ -177,15 +189,15 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
maxY = 16; maxY = 16;
} }
final boolean isActive = ( this.clientFlags & ( this.POWERED_FLAG | this.CHANNEL_FLAG ) ) == ( this.POWERED_FLAG | this.CHANNEL_FLAG ); final boolean isActive = ( this.clientFlags & ( PartBasicState.POWERED_FLAG | PartBasicState.CHANNEL_FLAG ) ) == ( PartBasicState.POWERED_FLAG | PartBasicState.CHANNEL_FLAG );
this.renderCache = rh.useSimplifiedRendering( x, y, z, this, this.renderCache ); this.renderCache = rh.useSimplifiedRendering( x, y, z, this, this.renderCache );
rh.setTexture( CableBusTextures.PartPlaneSides.getIcon(), CableBusTextures.PartPlaneSides.getIcon(), CableBusTextures.PartTransitionPlaneBack.getIcon(), isActive ? CableBusTextures.BlockAnnihilationPlaneOn.getIcon() : this.is.getIconIndex(), CableBusTextures.PartPlaneSides.getIcon(), CableBusTextures.PartPlaneSides.getIcon() ); rh.setTexture( SIDE_ICON, SIDE_ICON, BACK_ICON, isActive ? activeIcon : this.is.getIconIndex(), SIDE_ICON, SIDE_ICON );
rh.setBounds( minX, minY, 15, maxX, maxY, 16 ); rh.setBounds( minX, minY, 15, maxX, maxY, 16 );
rh.renderBlock( x, y, z, renderer ); rh.renderBlock( x, y, z, renderer );
rh.setTexture( CableBusTextures.PartMonitorSidesStatus.getIcon(), CableBusTextures.PartMonitorSidesStatus.getIcon(), CableBusTextures.PartTransitionPlaneBack.getIcon(), isActive ? CableBusTextures.BlockAnnihilationPlaneOn.getIcon() : this.is.getIconIndex(), CableBusTextures.PartMonitorSidesStatus.getIcon(), CableBusTextures.PartMonitorSidesStatus.getIcon() ); rh.setTexture( STATUS_ICON, STATUS_ICON, BACK_ICON, isActive ? activeIcon : this.is.getIconIndex(), STATUS_ICON, STATUS_ICON );
rh.setBounds( 5, 5, 14, 11, 11, 15 ); rh.setBounds( 5, 5, 14, 11, 11, 15 );
rh.renderBlock( x, y, z, renderer ); rh.renderBlock( x, y, z, renderer );
@ -329,28 +341,16 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
Platform.spawnDrops( world, x, y, z, Lists.newArrayList( overflow.getItemStack() ) ); Platform.spawnDrops( world, x, y, z, Lists.newArrayList( overflow.getItemStack() ) );
} }
private boolean isAnnihilationPlane( TileEntity blockTileEntity, ForgeDirection side ) protected boolean isAnnihilationPlane( TileEntity blockTileEntity, ForgeDirection side )
{ {
if( blockTileEntity instanceof IPartHost ) if( blockTileEntity instanceof IPartHost )
{ {
final IPart p = ( (IPartHost) blockTileEntity ).getPart( side ); final IPart p = ( (IPartHost) blockTileEntity ).getPart( side );
return p instanceof PartAnnihilationPlane; return p != null && p.getClass() == this.getClass();
} }
return false; return false;
} }
/**
* If the plane is accepting items.
*
* This might be improved if a performance problem shows up.
*
* @return true if planes accepts items.
*/
private boolean isAccepting()
{
return this.isAccepting;
}
@Override @Override
@MENetworkEventSubscribe @MENetworkEventSubscribe
public void chanRender( MENetworkChannelsChanged c ) public void chanRender( MENetworkChannelsChanged c )
@ -380,52 +380,22 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
final int y = te.yCoord + this.side.offsetY; final int y = te.yCoord + this.side.offsetY;
final int z = te.zCoord + this.side.offsetZ; final int z = te.zCoord + this.side.offsetZ;
final Block blk = w.getBlock( x, y, z );
final IEnergyGrid energy = this.proxy.getEnergy(); final IEnergyGrid energy = this.proxy.getEnergy();
final Material mat = blk.getMaterial(); if( this.canHandleBlock( w, x, y, z ) )
final boolean ignore = mat == Material.air || mat == Material.lava || mat == Material.water || mat.isLiquid() || blk == Blocks.bedrock || blk == Blocks.end_portal || blk == Blocks.end_portal_frame || blk == Blocks.command_block;
if( !ignore && !w.isAirBlock( x, y, z ) && w.blockExists( x, y, z ) && w.canMineBlock( Platform.getPlayer( w ), x, y, z ) )
{ {
final float hardness = blk.getBlockHardness( w, x, y, z ); final List<ItemStack> items = this.obtainBlockDrops( w, x, y, z );
final float requiredPower = this.calculateEnergyUsage( w, x, y, z, items );
if( hardness >= 0.0 ) final boolean hasPower = energy.extractAEPower( requiredPower, Actionable.SIMULATE, PowerMultiplier.CONFIG ) > requiredPower - 0.1;
{ final boolean canStore = this.canStoreItemStacks( items );
final ItemStack[] out = Platform.getBlockDrops( w, x, y, z );
float total = 1 + hardness;
for( final ItemStack is : out )
{
total += is.stackSize;
}
final boolean hasPower = energy.extractAEPower( total, Actionable.SIMULATE, PowerMultiplier.CONFIG ) > total - 0.1;
final boolean canStore = this.canStoreItemStacks( out );
if( hasPower && canStore ) if( hasPower && canStore )
{ {
if( modulate ) if( modulate )
{ {
w.setBlock( x, y, z, Platform.AIR_BLOCK, 0, 3 ); energy.extractAEPower( requiredPower, Actionable.MODULATE, PowerMultiplier.CONFIG );
energy.extractAEPower( total, Actionable.MODULATE, PowerMultiplier.CONFIG ); this.breakBlockAndStoreItems( w, x, y, z, items );
final AxisAlignedBB box = AxisAlignedBB.getBoundingBox( x - 0.2, y - 0.2, z - 0.2, x + 1.2, y + 1.2, z + 1.2 );
for( final Object ei : w.getEntitiesWithinAABB( EntityItem.class, box ) )
{
if( ei instanceof EntityItem )
{
final EntityItem entityItem = (EntityItem) ei;
this.storeEntityItem( entityItem );
}
}
for( final ItemStack snaggedItem : out )
{
this.storeItemStack( snaggedItem );
}
ServerHelper.proxy.sendToAllNearExcept( null, x, y, z, 64, w, new PacketTransitionEffect( x, y, z, this.side, true ) ); ServerHelper.proxy.sendToAllNearExcept( null, x, y, z, 64, w, new PacketTransitionEffect( x, y, z, this.side, true ) );
} }
else else
@ -437,7 +407,6 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
} }
} }
} }
}
catch( final GridAccessException e1 ) catch( final GridAccessException e1 )
{ {
// :P // :P
@ -466,6 +435,43 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
return this.breakBlock( false ); return this.breakBlock( false );
} }
/**
* Checks if this plane can handle the block at the specific coordinates.
*/
protected boolean canHandleBlock( WorldServer w, int x, int y, int z )
{
final Block block = w.getBlock( x, y, z );
final Material material = block.getMaterial();
final float hardness = block.getBlockHardness( w, x, y, z );
final boolean ignoreMaterials = material == Material.air || material == Material.lava || material == Material.water || material.isLiquid();
final boolean ignoreBlocks = block == Blocks.bedrock || block == Blocks.end_portal || block == Blocks.end_portal_frame || block == Blocks.command_block;
return !ignoreMaterials && !ignoreBlocks && !w.isAirBlock( x, y, z ) && w.blockExists( x, y, z ) && w.canMineBlock( Platform.getPlayer( w ), x, y, z ) && hardness >= 0f;
}
protected List<ItemStack> obtainBlockDrops( WorldServer w, int x, int y, int z )
{
final ItemStack[] out = Platform.getBlockDrops( w, x, y, z );
return Lists.newArrayList( out );
}
/**
* Checks if this plane can handle the block at the specific coordinates.
*/
protected float calculateEnergyUsage( WorldServer w, int x, int y, int z, List<ItemStack> items )
{
final Block block = w.getBlock( x, y, z );
final float hardness = block.getBlockHardness( w, x, y, z );
float requiredEnergy = 1 + hardness;
for( final ItemStack is : items )
{
requiredEnergy += is.stackSize;
}
return requiredEnergy;
}
/** /**
* Checks if the network can store the possible drops. * Checks if the network can store the possible drops.
* *
@ -475,9 +481,9 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
* *
* @return true, if the network can store at least a single item of all drops or no drops are reported * @return true, if the network can store at least a single item of all drops or no drops are reported
*/ */
private boolean canStoreItemStacks( ItemStack[] itemStacks ) protected boolean canStoreItemStacks( List<ItemStack> itemStacks )
{ {
boolean canStore = itemStacks.length == 0; boolean canStore = itemStacks.isEmpty();
try try
{ {
@ -501,4 +507,24 @@ public class PartAnnihilationPlane extends PartBasicState implements IGridTickab
this.isAccepting = canStore; this.isAccepting = canStore;
return canStore; return canStore;
} }
protected void breakBlockAndStoreItems( WorldServer w, int x, int y, int z, List<ItemStack> items )
{
w.setBlock( x, y, z, Platform.AIR_BLOCK, 0, 3 );
final AxisAlignedBB box = AxisAlignedBB.getBoundingBox( x - 0.2, y - 0.2, z - 0.2, x + 1.2, y + 1.2, z + 1.2 );
for( final Object ei : w.getEntitiesWithinAABB( EntityItem.class, box ) )
{
if( ei instanceof EntityItem )
{
final EntityItem entityItem = (EntityItem) ei;
this.storeEntityItem( entityItem );
}
}
for( final ItemStack snaggedItem : items )
{
this.storeItemStack( snaggedItem );
}
}
} }

View file

@ -0,0 +1,111 @@
/*
* 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.parts.automation;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.WorldServer;
import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.common.util.FakePlayerFactory;
import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import appeng.api.parts.IPart;
import appeng.api.parts.IPartHost;
import appeng.api.parts.IPartRenderHelper;
import appeng.client.texture.CableBusTextures;
public class PartIdentityAnnihilationPlane extends PartAnnihilationPlane
{
private final static IIcon ACTIVE_ICON = CableBusTextures.BlockIdentityAnnihilationPlaneOn.getIcon();
private static final float SILK_TOUCH_FACTOR = 16;
public PartIdentityAnnihilationPlane( ItemStack is )
{
super( is );
}
@Override
@SideOnly( Side.CLIENT )
public void renderStatic( int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer )
{
this.renderStaticWithIcon( x, y, z, rh, renderer, ACTIVE_ICON );
}
@Override
protected boolean isAnnihilationPlane( TileEntity blockTileEntity, ForgeDirection side )
{
if( blockTileEntity instanceof IPartHost )
{
final IPart p = ( (IPartHost) blockTileEntity ).getPart( side );
return p != null && p.getClass() == this.getClass();
}
return false;
}
@Override
protected float calculateEnergyUsage( WorldServer w, int x, int y, int z, List<ItemStack> items )
{
final float requiredEnergy = super.calculateEnergyUsage( w, x, y, z, items );
return requiredEnergy * SILK_TOUCH_FACTOR;
}
@Override
protected List<ItemStack> obtainBlockDrops( WorldServer w, int x, int y, int z )
{
final FakePlayer fakePlayer = FakePlayerFactory.getMinecraft( w );
final Block block = w.getBlock( x, y, z );
final int blockMeta = w.getBlockMetadata( x, y, z );
if( block.canSilkHarvest( w, fakePlayer, x, y, z, blockMeta ) )
{
final List<ItemStack> out = new ArrayList<ItemStack>( 1 );
final Item item = Item.getItemFromBlock( block );
if( item != null )
{
int meta = 0;
if( item.getHasSubtypes() )
{
meta = blockMeta;
}
ItemStack itemstack = new ItemStack( item, 1, meta );
out.add( itemstack );
}
return out;
}
else
{
return super.obtainBlockDrops( w, x, y, z );
}
}
}

View file

@ -423,6 +423,7 @@ item.appliedenergistics2.ItemMaterial.SkyDust.name=Sky Stone Dust
item.appliedenergistics2.ItemMaterial.CardCrafting.name=Crafting Card item.appliedenergistics2.ItemMaterial.CardCrafting.name=Crafting Card
item.appliedenergistics2.ItemPart.AnnihilationPlane.name=ME Annihilation Plane item.appliedenergistics2.ItemPart.AnnihilationPlane.name=ME Annihilation Plane
item.appliedenergistics2.ItemPart.IdentityAnnihilationPlane.name=ME Identity Annihilation Plane
item.appliedenergistics2.ItemPart.CableAnchor.name=Cable Anchor item.appliedenergistics2.ItemPart.CableAnchor.name=Cable Anchor
item.appliedenergistics2.ItemPart.CableCovered.name=ME Covered Cable item.appliedenergistics2.ItemPart.CableCovered.name=ME Covered Cable
item.appliedenergistics2.ItemPart.CableGlass.name=ME Glass Cable item.appliedenergistics2.ItemPart.CableGlass.name=ME Glass Cable

View file

@ -57,6 +57,10 @@ shaped=
mc:iron_ingot ae2:ItemMaterial.AnnihilationCore mc:iron_ingot mc:iron_ingot ae2:ItemMaterial.AnnihilationCore mc:iron_ingot
-> ae2:ItemPart.AnnihilationPlane -> ae2:ItemPart.AnnihilationPlane
shapeless=
ae2:ItemPart.AnnihilationPlane ae2:ItemMaterial.FluixPearl
-> ae2:ItemPart.IdentityAnnihilationPlane
shaped= shaped=
glass ae2:ItemPart.Terminal glass, glass ae2:ItemPart.Terminal glass,
cable _ cable, cable _ cable,

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

View file

@ -0,0 +1,23 @@
{
"animation": {
"frametime": 2,
"frames": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 B