Applied-Energistics-2-tiler.../tile/misc/TileSecurity.java
AlgorithmX2 af8e356bec Wireless block no uses placed side to orient, this is more natural for it instead of the place based version.
Added Wireless Encoder Gui to the Security Term
Security Term now only accepts Biometric Cards in the config slot.
Added Wireless Block.
Added Wireless Terminal.
Fixed Crash when loading world settings.
Configure slot of Security Block now drops on destruction.
2014-02-02 01:32:10 -06:00

274 lines
6.8 KiB
Java

package appeng.tile.misc;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.common.MinecraftForge;
import appeng.api.AEApi;
import appeng.api.config.SecurityPermissions;
import appeng.api.events.LocatableEventAnnounce;
import appeng.api.events.LocatableEventAnnounce.LocatableEvent;
import appeng.api.features.ILocatable;
import appeng.api.features.IPlayerRegistry;
import appeng.api.implementations.items.IBiometricCard;
import appeng.api.networking.GridFlags;
import appeng.api.networking.events.MENetworkChannelsChanged;
import appeng.api.networking.events.MENetworkEventSubscribe;
import appeng.api.networking.events.MENetworkPowerStatusChange;
import appeng.api.networking.events.MENetworkSecurityChange;
import appeng.api.storage.IMEInventoryHandler;
import appeng.api.storage.IMEMonitor;
import appeng.api.storage.IStorageMonitorable;
import appeng.api.storage.MEMonitorHandler;
import appeng.api.storage.data.IAEFluidStack;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.util.AECableType;
import appeng.api.util.DimensionalCoord;
import appeng.me.GridAccessException;
import appeng.me.storage.SecurityInventory;
import appeng.tile.events.AETileEventHandler;
import appeng.tile.events.TileEventType;
import appeng.tile.grid.AENetworkTile;
import appeng.tile.inventory.AppEngInternalInventory;
import appeng.tile.inventory.IAEAppEngInventory;
import appeng.tile.inventory.InvOperation;
import appeng.util.Platform;
import appeng.util.item.AEItemStack;
public class TileSecurity extends AENetworkTile implements IStorageMonitorable, IAEAppEngInventory, ILocatable
{
private static int diffrence = 0;
private SecurityInventory inventory = new SecurityInventory( this );
private MEMonitorHandler<IAEItemStack> securityMonitor = new MEMonitorHandler<IAEItemStack>( inventory );
private boolean isActive = false;
public long securityKey;
public AppEngInternalInventory configSlot = new AppEngInternalInventory( this, 1 );
@Override
public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack)
{
}
@Override
public void getDrops(World w, int x, int y, int z, ArrayList<ItemStack> drops)
{
if ( !configSlot.isEmpty() )
drops.add( configSlot.getStackInSlot( 0 ) );
for (IAEItemStack ais : inventory.storedItems)
drops.add( ais.getItemStack() );
}
IMEInventoryHandler<IAEItemStack> getSecurityInventory()
{
return inventory;
}
@Override
public void onReady()
{
super.onReady();
if ( Platform.isServer() )
{
isActive = true;
MinecraftForge.EVENT_BUS.post( new LocatableEventAnnounce( this, LocatableEvent.Register ) );
}
}
@Override
public void onChunkUnload()
{
super.onChunkUnload();
MinecraftForge.EVENT_BUS.post( new LocatableEventAnnounce( this, LocatableEvent.Unregister ) );
isActive = false;
}
@Override
public void invalidate()
{
super.invalidate();
MinecraftForge.EVENT_BUS.post( new LocatableEventAnnounce( this, LocatableEvent.Unregister ) );
isActive = false;
}
class SecurityHandler extends AETileEventHandler
{
public SecurityHandler() {
super( TileEventType.WORLD_NBT, TileEventType.NETWORK );
}
@Override
public boolean readFromStream(DataInputStream data) throws IOException
{
boolean wasActive = isActive;
isActive = data.readBoolean();
return wasActive != isActive;
}
@Override
public void writeToStream(DataOutputStream data) throws IOException
{
data.writeBoolean( gridProxy.isActive() );
}
@Override
public void writeToNBT(NBTTagCompound data)
{
data.setLong( "securityKey", securityKey );
configSlot.writeToNBT( data, "config" );
NBTTagCompound storedItems = new NBTTagCompound();
int offset = 0;
for (IAEItemStack ais : inventory.storedItems)
{
NBTTagCompound it = new NBTTagCompound();
ais.getItemStack().writeToNBT( it );
storedItems.setCompoundTag( "" + (offset++), it );
}
data.setCompoundTag( "storedItems", storedItems );
}
@Override
public void readFromNBT(NBTTagCompound data)
{
securityKey = data.getLong( "securityKey" );
configSlot.readFromNBT( data, "config" );
NBTTagCompound storedItems = data.getCompoundTag( "storedItems" );
for (Object obj : storedItems.getTags())
{
if ( obj instanceof NBTTagCompound )
{
inventory.storedItems.add( AEItemStack.create( ItemStack.loadItemStackFromNBT( (NBTTagCompound) obj ) ) );
}
}
}
};
public void inventoryChanged()
{
try
{
saveChanges();
gridProxy.getGrid().postEvent( new MENetworkSecurityChange() );
}
catch (GridAccessException e)
{
// :P
}
}
public void readPermissions(HashMap<Integer, EnumSet<SecurityPermissions>> playerPerms)
{
IPlayerRegistry pr = AEApi.instance().registries().players();
// read permissions
for (IAEItemStack ais : inventory.storedItems)
{
ItemStack is = ais.getItemStack();
Item i = is.getItem();
if ( i instanceof IBiometricCard )
{
IBiometricCard bc = (IBiometricCard) i;
playerPerms.put( pr.getID( bc.getUsername( is ) ), bc.getPermissions( is ) );
}
}
// make sure thea admin is Boss.
playerPerms.put( gridProxy.getNode().getPlayerID(), EnumSet.allOf( SecurityPermissions.class ) );
}
@MENetworkEventSubscribe
public void bootUpdate(MENetworkChannelsChanged changed)
{
markForUpdate();
}
@MENetworkEventSubscribe
public void powerUpdate(MENetworkPowerStatusChange changed)
{
markForUpdate();
}
public boolean isSecurityEnabled()
{
return isActive && gridProxy.isActive();
}
public void updateNodeCount(int nodes)
{
gridProxy.setIdlePowerUsage( 2.0 + ((double) nodes / 0.033) );
}
public TileSecurity() {
addNewHandler( new SecurityHandler() );
gridProxy.setFlags( GridFlags.REQUIRE_CHANNEL );
gridProxy.setIdlePowerUsage( 2.0 );
diffrence++;
securityKey = System.currentTimeMillis() * 10 + diffrence;
if ( diffrence > 10 )
diffrence = 0;
}
public int getOwner()
{
return gridProxy.getNode().getPlayerID();
}
@Override
public AECableType getCableConnectionType(ForgeDirection dir)
{
return AECableType.SMART;
}
@Override
public DimensionalCoord getLocation()
{
return new DimensionalCoord( this );
}
public boolean isActive()
{
return isActive;
}
@Override
public IMEMonitor<IAEItemStack> getItemInventory()
{
return securityMonitor;
}
@Override
public IMEMonitor<IAEFluidStack> getFluidInventory()
{
return null;
}
@Override
public long getLocatableSerial()
{
return securityKey;
}
}