From 97eaf35f6a60c7620f6bb92d8624e2db5db54522 Mon Sep 17 00:00:00 2001 From: AlgorithmX2 Date: Fri, 31 Jan 2014 23:37:27 -0600 Subject: [PATCH] Security Block Fully Functional. --- .../gui/implementations/GuiMEMonitorable.java | 15 +- client/gui/implementations/GuiSecurity.java | 75 +++++++++- client/gui/widgets/GuiToggleButton.java | 132 ++++++++++++++++++ .../ContainerMEMonitorable.java | 9 +- .../implementations/ContainerSecurity.java | 73 +++++++++- core/localization/GuiText.java | 2 + core/sync/GuiBridge.java | 120 +++++++++++++--- core/sync/packets/PacketValueConfig.java | 9 +- items/tools/ToolBiometricCard.java | 53 ++++++- me/storage/NetworkInventoryHandler.java | 6 +- me/storage/SecurityInventory.java | 23 ++- parts/BusCollisionHelper.java | 8 ++ tile/misc/TileCharger.java | 2 +- tile/misc/TileSecurity.java | 29 +++- util/Platform.java | 29 ++-- 15 files changed, 524 insertions(+), 61 deletions(-) create mode 100644 client/gui/widgets/GuiToggleButton.java diff --git a/client/gui/implementations/GuiMEMonitorable.java b/client/gui/implementations/GuiMEMonitorable.java index 437fcfcf..27a53081 100644 --- a/client/gui/implementations/GuiMEMonitorable.java +++ b/client/gui/implementations/GuiMEMonitorable.java @@ -33,12 +33,18 @@ public class GuiMEMonitorable extends AEBaseMEGui int xoffset = 9; int perRow = 9; + int reservedSpace = 0; int rows = 0; int maxRows = Integer.MAX_VALUE; public GuiMEMonitorable(InventoryPlayer inventoryPlayer, IStorageMonitorable te) { - super( new ContainerMEMonitorable( inventoryPlayer, null ) ); + this( inventoryPlayer, te, new ContainerMEMonitorable( inventoryPlayer, null ) ); + } + + public GuiMEMonitorable(InventoryPlayer inventoryPlayer, IStorageMonitorable te, ContainerMEMonitorable c) { + + super( c ); myScrollBar = new GuiScrollbar(); repo = new ItemRepo( myScrollBar ); xSize = 195; @@ -74,7 +80,7 @@ public class GuiMEMonitorable extends AEBaseMEGui { int NEI = 0; int top = 4; - int extraSpace = height - 114 - NEI - top; + int extraSpace = height - 114 - NEI - top - reservedSpace; rows = (int) Math.floor( extraSpace / 18 ); if ( rows > maxRows ) @@ -97,7 +103,7 @@ public class GuiMEMonitorable extends AEBaseMEGui // extra slots : 72 // slot 18 - this.ySize = 114 + rows * 18; + this.ySize = 114 + rows * 18 + reservedSpace; this.guiTop = top; buttonList.add( new GuiImgButton( this.guiLeft - 18, guiTop + 8, Settings.SORT_BY, Configuration.instance.settings.getSetting( Settings.SORT_BY ) ) ); @@ -163,7 +169,7 @@ public class GuiMEMonitorable extends AEBaseMEGui for (int x = 0; x < rows; x++) this.drawTexturedModalRect( offsetX, offsetY + 18 + x * 18, 0, 18, xSize, 18 ); - this.drawTexturedModalRect( offsetX, offsetY + 16 + rows * 18, 0, 106, xSize, 98 ); + this.drawTexturedModalRect( offsetX, offsetY + 16 + rows * 18, 0, 106, xSize, 98 + reservedSpace ); searchField.drawTextBox(); } @@ -178,6 +184,7 @@ public class GuiMEMonitorable extends AEBaseMEGui { fontRenderer.drawString( myName.getLocal(), 8, 6, 4210752 ); fontRenderer.drawString( GuiText.inventory.getLocal(), 8, ySize - 96 + 3, 4210752 ); + fontRenderer.drawString( GuiText.SecurityCardEditor.getLocal(), 8, ySize - 96 + 3 - reservedSpace, 4210752 ); } } diff --git a/client/gui/implementations/GuiSecurity.java b/client/gui/implementations/GuiSecurity.java index b51ebd2f..83d53e39 100644 --- a/client/gui/implementations/GuiSecurity.java +++ b/client/gui/implementations/GuiSecurity.java @@ -1,19 +1,88 @@ package appeng.client.gui.implementations; +import java.io.IOException; + import net.minecraft.entity.player.InventoryPlayer; +import appeng.api.config.SecurityPermissions; import appeng.api.storage.IStorageMonitorable; +import appeng.client.gui.widgets.GuiToggleButton; +import appeng.container.implementations.ContainerSecurity; +import appeng.core.sync.packets.PacketValueConfig; +import cpw.mods.fml.common.network.PacketDispatcher; public class GuiSecurity extends GuiMEMonitorable { public GuiSecurity(InventoryPlayer inventoryPlayer, IStorageMonitorable te) { - super( inventoryPlayer, te ); - perRow = 5; - xoffset = 81; + super( inventoryPlayer, te, new ContainerSecurity( inventoryPlayer, te ) ); + reservedSpace = 32; } + GuiToggleButton inject, extract, craft, build, security; + + @Override + public void initGui() + { + super.initGui(); + + int top = this.guiTop + this.ySize - 114; + buttonList.add( inject = new GuiToggleButton( this.guiLeft + 56 + 18 * 0, top, 11 * 16 + 0, 12 * 16 + 0, SecurityPermissions.INJECT + .getUnlocalizedName(), SecurityPermissions.INJECT.getUnlocalizedTip() ) ); + + buttonList.add( extract = new GuiToggleButton( this.guiLeft + 56 + 18 * 1, top, 11 * 16 + 1, 12 * 16 + 1, SecurityPermissions.EXTRACT + .getUnlocalizedName(), SecurityPermissions.EXTRACT.getUnlocalizedTip() ) ); + + buttonList.add( craft = new GuiToggleButton( this.guiLeft + 56 + 18 * 2, top, 11 * 16 + 2, 12 * 16 + 2, SecurityPermissions.CRAFT.getUnlocalizedName(), + SecurityPermissions.CRAFT.getUnlocalizedTip() ) ); + + buttonList.add( build = new GuiToggleButton( this.guiLeft + 56 + 18 * 3, top, 11 * 16 + 3, 12 * 16 + 3, SecurityPermissions.BUILD.getUnlocalizedName(), + SecurityPermissions.BUILD.getUnlocalizedTip() ) ); + + buttonList.add( security = new GuiToggleButton( this.guiLeft + 56 + 18 * 4, top, 11 * 16 + 4, 12 * 16 + 4, SecurityPermissions.SECURITY + .getUnlocalizedName(), SecurityPermissions.SECURITY.getUnlocalizedTip() ) ); + } + + protected void actionPerformed(net.minecraft.client.gui.GuiButton btn) + { + super.actionPerformed( btn ); + + SecurityPermissions toggleSetting = null; + + if ( btn == inject ) + toggleSetting = SecurityPermissions.INJECT; + if ( btn == extract ) + toggleSetting = SecurityPermissions.EXTRACT; + if ( btn == craft ) + toggleSetting = SecurityPermissions.CRAFT; + if ( btn == build ) + toggleSetting = SecurityPermissions.BUILD; + if ( btn == security ) + toggleSetting = SecurityPermissions.SECURITY; + + if ( toggleSetting != null ) + { + try + { + PacketDispatcher.sendPacketToServer( (new PacketValueConfig( "TileSecurity.ToggleOption", toggleSetting.name() )).getPacket() ); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + }; + protected String getBackground() { + ContainerSecurity cs = (ContainerSecurity) inventorySlots; + + inject.setState( (cs.security & (1 << SecurityPermissions.INJECT.ordinal())) > 0 ); + extract.setState( (cs.security & (1 << SecurityPermissions.EXTRACT.ordinal())) > 0 ); + craft.setState( (cs.security & (1 << SecurityPermissions.CRAFT.ordinal())) > 0 ); + build.setState( (cs.security & (1 << SecurityPermissions.BUILD.ordinal())) > 0 ); + security.setState( (cs.security & (1 << SecurityPermissions.SECURITY.ordinal())) > 0 ); + return "guis/security.png"; } diff --git a/client/gui/widgets/GuiToggleButton.java b/client/gui/widgets/GuiToggleButton.java new file mode 100644 index 00000000..a2b4d110 --- /dev/null +++ b/client/gui/widgets/GuiToggleButton.java @@ -0,0 +1,132 @@ +package appeng.client.gui.widgets; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.util.StatCollector; + +import org.lwjgl.opengl.GL11; + +import appeng.client.texture.ExtraTextures; + +public class GuiToggleButton extends GuiButton implements ITooltip +{ + + int iconIdxOn; + int iconIdxOff; + + String Name; + String Hint; + + boolean on; + + public void setState(boolean isOn) + { + on = isOn; + } + + public void setVisibility(boolean vis) + { + drawButton = vis; + enabled = vis; + } + + public GuiToggleButton(int x, int y, int on, int off, String Name, String Hint) { + super( 0, 0, 16, "" ); + iconIdxOn = on; + iconIdxOff = off; + this.Name = Name; + this.Hint = Hint; + xPosition = x; + yPosition = y; + width = 16; + height = 16; + } + + @Override + public boolean isVisible() + { + return drawButton; + } + + @Override + public void drawButton(Minecraft par1Minecraft, int par2, int par3) + { + if ( this.drawButton ) + { + int iconIndex = getIconIndex(); + + GL11.glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); + par1Minecraft.renderEngine.bindTexture( ExtraTextures.GuiTexture( "guis/states.png" ) ); + this.field_82253_i = par2 >= this.xPosition && par3 >= this.yPosition && par2 < this.xPosition + this.width && par3 < this.yPosition + this.height; + + int uv_y = (int) Math.floor( iconIndex / 16 ); + int uv_x = iconIndex - uv_y * 16; + + this.drawTexturedModalRect( this.xPosition, this.yPosition, 256 - 16, 256 - 16, 16, 16 ); + this.drawTexturedModalRect( this.xPosition, this.yPosition, uv_x * 16, uv_y * 16, 16, 16 ); + this.mouseDragged( par1Minecraft, par2, par3 ); + } + } + + private int getIconIndex() + { + return on ? iconIdxOn : iconIdxOff; + } + + @Override + public String getMsg() + { + String DisplayName = Name; + String DisplayValue = Hint; + + if ( DisplayName != null ) + { + String Name = StatCollector.translateToLocal( DisplayName ); + String Value = StatCollector.translateToLocal( DisplayValue ); + + if ( Name == null || Name.equals( "" ) ) + Name = DisplayName; + if ( Value == null || Value.equals( "" ) ) + Value = DisplayValue; + + Value = Value.replace( "\\n", "\n" ); + StringBuilder sb = new StringBuilder( Value ); + + int i = sb.lastIndexOf( "\n" ); + if ( i <= 0 ) + i = 0; + while (i + 30 < sb.length() && (i = sb.lastIndexOf( " ", i + 30 )) != -1) + { + sb.replace( i, i + 1, "\n" ); + } + + return Name + "\n" + sb.toString(); + } + return null; + } + + @Override + public int xPos() + { + return xPosition; + } + + @Override + public int yPos() + { + return yPosition; + } + + @Override + public int getWidth() + { + return 16; + } + + @Override + public int getHeight() + { + return 16; + } + +} diff --git a/container/implementations/ContainerMEMonitorable.java b/container/implementations/ContainerMEMonitorable.java index 2dbca0c7..919ea68d 100644 --- a/container/implementations/ContainerMEMonitorable.java +++ b/container/implementations/ContainerMEMonitorable.java @@ -34,10 +34,10 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IMEMonito final IMEMonitor monitor; final IItemList items = new ItemList(); - protected ContainerMEMonitorable(InventoryPlayer ip, IStorageMonitorable montiorable, boolean isServer) { + protected ContainerMEMonitorable(InventoryPlayer ip, IStorageMonitorable montiorable, boolean bindInventory) { super( ip, montiorable instanceof TileEntity ? (TileEntity) montiorable : null, montiorable instanceof IPart ? (IPart) montiorable : null ); - if ( isServer ) + if ( Platform.isServer() ) { monitor = montiorable.getItemInventory(); monitor.addListener( this, null ); @@ -62,11 +62,12 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IMEMonito else monitor = null; - bindPlayerInventory( ip, 0, 0 ); + if ( bindInventory ) + bindPlayerInventory( ip, 0, 0 ); } public ContainerMEMonitorable(InventoryPlayer ip, IStorageMonitorable montiorable) { - this( ip, montiorable, Platform.isServer() ); + this( ip, montiorable, true ); } @Override diff --git a/container/implementations/ContainerSecurity.java b/container/implementations/ContainerSecurity.java index d5fd7e17..52a4f548 100644 --- a/container/implementations/ContainerSecurity.java +++ b/container/implementations/ContainerSecurity.java @@ -1,14 +1,58 @@ package appeng.container.implementations; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.ICrafting; +import net.minecraft.item.ItemStack; import appeng.api.config.SecurityPermissions; +import appeng.api.implementations.items.IBiometricCard; import appeng.api.storage.IStorageMonitorable; +import appeng.container.slot.SlotNormal; +import appeng.tile.misc.TileSecurity; +import appeng.util.Platform; public class ContainerSecurity extends ContainerMEMonitorable { + SlotNormal configSlot; + public ContainerSecurity(InventoryPlayer ip, IStorageMonitorable montiorable) { - super( ip, montiorable ); + super( ip, montiorable, false ); + + addSlotToContainer( configSlot = new SlotNormal( ((TileSecurity) montiorable).configSlot, 0, 37, -32 ) ); + + bindPlayerInventory( ip, 0, 0 ); + } + + public int security = 0; + + public void toggleSetting(String value, EntityPlayer player) + { + try + { + SecurityPermissions permission = SecurityPermissions.valueOf( value ); + + ItemStack a = configSlot.getStack(); + if ( a != null && a.getItem() instanceof IBiometricCard ) + { + IBiometricCard bc = (IBiometricCard) a.getItem(); + if ( bc.hasPermission( a, permission ) ) + bc.removePermission( a, permission ); + else + bc.addPermission( a, permission ); + } + } + catch (EnumConstantNotPresentException ex) + { + // :( + } + } + + @Override + public void updateProgressBar(int key, int value) + { + if ( key == 0 ) + security = value; } @Override @@ -16,6 +60,33 @@ public class ContainerSecurity extends ContainerMEMonitorable { verifyPermissions( SecurityPermissions.SECURITY, true ); + int newSecurity = 0; + + ItemStack a = configSlot.getStack(); + if ( a != null && a.getItem() instanceof IBiometricCard ) + { + IBiometricCard bc = (IBiometricCard) a.getItem(); + + for (SecurityPermissions sp : bc.getPermissions( a )) + newSecurity = newSecurity | (1 << sp.ordinal()); + } + + if ( newSecurity != security ) + { + if ( Platform.isServer() ) + { + for (int i = 0; i < this.crafters.size(); ++i) + { + ICrafting icrafting = (ICrafting) this.crafters.get( i ); + + icrafting.sendProgressBarUpdate( this, 0, newSecurity ); + } + } + + security = newSecurity; + } + super.detectAndSendChanges(); } + } diff --git a/core/localization/GuiText.java b/core/localization/GuiText.java index 6af02be1..0a9682f1 100644 --- a/core/localization/GuiText.java +++ b/core/localization/GuiText.java @@ -21,6 +21,8 @@ public enum GuiText StorageBus, Priority, Security, Encoded, Blank, Unlinked, Linked, + SecurityCardEditor, NoPermissions, + METunnel, ItemTunnel, RedstoneTunnel, MJTunnel, EUTunnel, FluidTunnel; String root; diff --git a/core/sync/GuiBridge.java b/core/sync/GuiBridge.java index 60455566..a8607d55 100644 --- a/core/sync/GuiBridge.java +++ b/core/sync/GuiBridge.java @@ -8,11 +8,17 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import appeng.api.config.SecurityPermissions; import appeng.api.exceptions.AppEngException; import appeng.api.implementations.IUpgradeableHost; import appeng.api.implementations.guiobjects.IGuiItem; import appeng.api.implementations.guiobjects.INetworkTool; import appeng.api.implementations.guiobjects.IPortableCell; +import appeng.api.networking.IGrid; +import appeng.api.networking.IGridNode; +import appeng.api.networking.energy.IEnergyGrid; +import appeng.api.networking.security.IActionHost; +import appeng.api.networking.security.ISecurityGrid; import appeng.api.parts.IPart; import appeng.api.parts.IPartHost; import appeng.api.storage.IStorageMonitorable; @@ -42,6 +48,7 @@ import appeng.helpers.IInterfaceHost; import appeng.helpers.IPriorityHost; import appeng.parts.automation.PartLevelEmitter; import appeng.parts.misc.PartStorageBus; +import appeng.server.AccessType; import appeng.tile.grindstone.TileGrinder; import appeng.tile.misc.TileCellWorkbench; import appeng.tile.misc.TileCondenser; @@ -59,47 +66,48 @@ public enum GuiBridge implements IGuiHandler { GUI_Handler(), - GUI_GRINDER(ContainerGrinder.class, TileGrinder.class, false), + GUI_GRINDER(ContainerGrinder.class, TileGrinder.class, false, null), - GUI_QNB(ContainerQNB.class, TileQuantumBridge.class, false), + GUI_QNB(ContainerQNB.class, TileQuantumBridge.class, false, SecurityPermissions.BUILD), - GUI_CHEST(ContainerChest.class, TileChest.class, false), + GUI_CHEST(ContainerChest.class, TileChest.class, false, SecurityPermissions.BUILD), - GUI_ME(ContainerMEMonitorable.class, IStorageMonitorable.class, false), + GUI_ME(ContainerMEMonitorable.class, IStorageMonitorable.class, false, null), - GUI_PORTABLE_CELL(ContainerMEPortableCell.class, IPortableCell.class, true), + GUI_PORTABLE_CELL(ContainerMEPortableCell.class, IPortableCell.class, true, null), - GUI_NETWORK_STATUS(ContainerNetworkStatus.class, INetworkTool.class, true), + GUI_NETWORK_STATUS(ContainerNetworkStatus.class, INetworkTool.class, true, null), - GUI_NETWORK_TOOL(ContainerNetworkTool.class, INetworkTool.class, true), + GUI_NETWORK_TOOL(ContainerNetworkTool.class, INetworkTool.class, true, null), - GUI_DRIVE(ContainerDrive.class, TileDrive.class, false), + GUI_DRIVE(ContainerDrive.class, TileDrive.class, false, SecurityPermissions.BUILD), - GUI_VIBRATIONCHAMBER(ContainerVibrationChamber.class, TileVibrationChamber.class, false), + GUI_VIBRATIONCHAMBER(ContainerVibrationChamber.class, TileVibrationChamber.class, false, null), - GUI_CONDENSER(ContainerCondenser.class, TileCondenser.class, false), + GUI_CONDENSER(ContainerCondenser.class, TileCondenser.class, false, null), - GUI_INTERFACE(ContainerInterface.class, IInterfaceHost.class, false), + GUI_INTERFACE(ContainerInterface.class, IInterfaceHost.class, false, SecurityPermissions.BUILD), - GUI_BUS(ContainerUpgradeable.class, IUpgradeableHost.class, false), + GUI_BUS(ContainerUpgradeable.class, IUpgradeableHost.class, false, SecurityPermissions.BUILD), - GUI_IOPORT(ContainerIOPort.class, TileIOPort.class, false), + GUI_IOPORT(ContainerIOPort.class, TileIOPort.class, false, SecurityPermissions.BUILD), - GUI_STORAGEBUS(ContainerStorageBus.class, PartStorageBus.class, false), + GUI_STORAGEBUS(ContainerStorageBus.class, PartStorageBus.class, false, SecurityPermissions.BUILD), - GUI_PRIORITY(ContainerPriority.class, IPriorityHost.class, false), + GUI_PRIORITY(ContainerPriority.class, IPriorityHost.class, false, SecurityPermissions.BUILD), - GUI_SECURITY(ContainerSecurity.class, TileSecurity.class, false), + GUI_SECURITY(ContainerSecurity.class, TileSecurity.class, false, SecurityPermissions.SECURITY), // extends (Container/Gui) + Bus - GUI_LEVELEMITTER(ContainerLevelEmitter.class, PartLevelEmitter.class, false), + GUI_LEVELEMITTER(ContainerLevelEmitter.class, PartLevelEmitter.class, false, SecurityPermissions.BUILD), - GUI_CELLWORKBENCH(ContainerCellWorkbench.class, TileCellWorkbench.class, false); + GUI_CELLWORKBENCH(ContainerCellWorkbench.class, TileCellWorkbench.class, false, null); private Class Tile; private Class Gui; private Class Container; private boolean isItem; + private SecurityPermissions requiredPermission; private GuiBridge() { Tile = null; @@ -125,13 +133,15 @@ public enum GuiBridge implements IGuiHandler } } - private GuiBridge(Class _Container) { + private GuiBridge(Class _Container, SecurityPermissions requiredPermission) { + this.requiredPermission = requiredPermission; Container = _Container; Tile = null; getGui(); } - private GuiBridge(Class _Container, Class _Tile, boolean isItem) { + private GuiBridge(Class _Container, Class _Tile, boolean isItem, SecurityPermissions requiredPermission) { + this.requiredPermission = requiredPermission; Container = _Container; this.isItem = isItem; Tile = _Tile; @@ -270,4 +280,74 @@ public enum GuiBridge implements IGuiHandler return new GuiNull( new ContainerNull() ); } + public boolean hasPermissions(TileEntity te, int x, int y, int z, ForgeDirection side, EntityPlayer player) + { + World w = player.getEntityWorld(); + + if ( Platform.hasPermissions( x, y, z, player, AccessType.BLOCK_ACCESS ) ) + { + if ( isItem() ) + { + ItemStack it = player.inventory.getCurrentItem(); + if ( it != null && it.getItem() instanceof IGuiItem ) + { + Object myItem = ((IGuiItem) it.getItem()).getGuiObject( it, w, x, y, z ); + if ( CorrectTileOrPart( myItem ) ) + { + return true; + } + } + } + else + { + TileEntity TE = w.getBlockTileEntity( x, y, z ); + if ( TE instanceof IPartHost ) + { + ((IPartHost) TE).getPart( side ); + IPart part = ((IPartHost) TE).getPart( side ); + if ( CorrectTileOrPart( part ) ) + return securityCheck( part, player ); + } + else + { + if ( CorrectTileOrPart( TE ) ) + return securityCheck( TE, player ); + } + } + } + return false; + } + + private boolean securityCheck(Object te, EntityPlayer player) + { + if ( te instanceof IActionHost && requiredPermission != null ) + { + boolean requirePower = false; + + IGridNode gn = ((IActionHost) te).getActionableNode(); + if ( gn != null ) + { + IGrid g = gn.getGrid(); + if ( g != null ) + { + if ( requirePower ) + { + IEnergyGrid eg = g.getCache( IEnergyGrid.class ); + if ( !eg.isNetworkPowered() ) + { + return false; + } + } + + ISecurityGrid sg = g.getCache( ISecurityGrid.class ); + if ( sg.hasPermission( player, requiredPermission ) ) + return true; + } + } + + return false; + } + return true; + } + } diff --git a/core/sync/packets/PacketValueConfig.java b/core/sync/packets/PacketValueConfig.java index 84fa82c3..725c2b92 100644 --- a/core/sync/packets/PacketValueConfig.java +++ b/core/sync/packets/PacketValueConfig.java @@ -12,6 +12,7 @@ import appeng.api.config.FuzzyMode; import appeng.container.implementations.ContainerCellWorkbench; import appeng.container.implementations.ContainerLevelEmitter; import appeng.container.implementations.ContainerPriority; +import appeng.container.implementations.ContainerSecurity; import appeng.core.sync.AppEngPacket; public class PacketValueConfig extends AppEngPacket @@ -31,7 +32,13 @@ public class PacketValueConfig extends AppEngPacket { Container c = player.openContainer; - if ( Name.equals( "PriorityHost.Priority" ) && c instanceof ContainerPriority ) + if ( Name.equals( "TileSecurity.ToggleOption" ) && c instanceof ContainerSecurity ) + { + ContainerSecurity sc = (ContainerSecurity) c; + sc.toggleSetting( Value, player ); + return; + } + else if ( Name.equals( "PriorityHost.Priority" ) && c instanceof ContainerPriority ) { ContainerPriority pc = (ContainerPriority) c; pc.setPriority( Integer.parseInt( Value ), player ); diff --git a/items/tools/ToolBiometricCard.java b/items/tools/ToolBiometricCard.java index 8bafd132..319bd69f 100644 --- a/items/tools/ToolBiometricCard.java +++ b/items/tools/ToolBiometricCard.java @@ -31,7 +31,7 @@ public class ToolBiometricCard extends AEBaseItem implements IBiometricCard @Override public String getItemDisplayName(ItemStack is) { - String username = getUserName( is ); + String username = getUsername( is ); return username.length() > 0 ? super.getItemDisplayName( is ) + " - " + GuiText.Encoded.getLocal() : super.getItemDisplayName( is ); } @@ -64,24 +64,41 @@ public class ToolBiometricCard extends AEBaseItem implements IBiometricCard private void encode(ItemStack is, EntityPlayer p) { - NBTTagCompound tag = Platform.openNbtData( is ); - String username = tag.getString( "username" ); + String username = getUsername( is ); if ( p.username.equals( username ) ) - is.setTagCompound( null ); + setUsername( is, "" ); else - tag.setString( "username", p.username ); + setUsername( is, p.username ); } @Override public void addInformation(ItemStack is, EntityPlayer p, List l, boolean b) { - String username = getUserName( is ); + String username = getUsername( is ); if ( username.length() > 0 ) l.add( username ); + + EnumSet perms = getPermissions( is ); + if ( perms.isEmpty() ) + l.add( GuiText.NoPermissions.getLocal() ); + else + { + String msg = null; + + for (SecurityPermissions sp : perms) + { + if ( msg == null ) + msg = Platform.gui_localize( sp.getUnlocalizedName() ); + else + msg = msg + ", " + Platform.gui_localize( sp.getUnlocalizedName() ); + } + l.add( msg ); + } + } @Override - public String getUserName(ItemStack is) + public String getUsername(ItemStack is) { NBTTagCompound tag = Platform.openNbtData( is ); return tag.getString( "username" ); @@ -109,4 +126,26 @@ public class ToolBiometricCard extends AEBaseItem implements IBiometricCard return tag.getBoolean( permission.name() ); } + @Override + public void setUsername(ItemStack itemStack, String username) + { + NBTTagCompound tag = Platform.openNbtData( itemStack ); + tag.setString( "username", username ); + } + + @Override + public void removePermission(ItemStack itemStack, SecurityPermissions permission) + { + NBTTagCompound tag = Platform.openNbtData( itemStack ); + if ( tag.hasKey( permission.name() ) ) + tag.removeTag( permission.name() ); + } + + @Override + public void addPermission(ItemStack itemStack, SecurityPermissions permission) + { + NBTTagCompound tag = Platform.openNbtData( itemStack ); + tag.setBoolean( permission.name(), true ); + } + } diff --git a/me/storage/NetworkInventoryHandler.java b/me/storage/NetworkInventoryHandler.java index ba746e48..fc20055f 100644 --- a/me/storage/NetworkInventoryHandler.java +++ b/me/storage/NetworkInventoryHandler.java @@ -96,11 +96,11 @@ public class NetworkInventoryHandler> implements IMEInvent throw new RuntimeException( "Invalid Access to Networked Storage API detected." ); } - private boolean testPermission(BaseActionSource src, SecurityPermissions inject) + private boolean testPermission(BaseActionSource src, SecurityPermissions permission) { if ( src.isPlayer() ) { - if ( !security.hasPermission( ((PlayerSource) src).player, SecurityPermissions.INJECT ) ) + if ( !security.hasPermission( ((PlayerSource) src).player, permission ) ) return true; } else if ( src.isMachine() ) @@ -119,7 +119,7 @@ public class NetworkInventoryHandler> implements IMEInvent ISecurityGrid sg = gn.getCache( ISecurityGrid.class ); playerID = sg.getOwner(); - if ( !security.hasPermission( playerID, SecurityPermissions.INJECT ) ) + if ( !security.hasPermission( playerID, permission ) ) return true; } } diff --git a/me/storage/SecurityInventory.java b/me/storage/SecurityInventory.java index cb90e830..ea34e1f8 100644 --- a/me/storage/SecurityInventory.java +++ b/me/storage/SecurityInventory.java @@ -4,6 +4,7 @@ import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.SecurityPermissions; +import appeng.api.implementations.items.IBiometricCard; import appeng.api.networking.security.BaseActionSource; import appeng.api.networking.security.PlayerSource; import appeng.api.storage.IMEInventoryHandler; @@ -45,8 +46,7 @@ public class SecurityInventory implements IMEInventoryHandler { if ( hasPermission( src ) && AEApi.instance().items().itemBiometricCard.sameAs( input.getItemStack() ) ) { - IAEItemStack stored = storedItems.findPrecise( input ); - if ( stored == null || !stored.isMeaninful() ) + if ( canAccept( input ) ) { if ( type == Actionable.SIMULATE ) return null; @@ -110,7 +110,24 @@ public class SecurityInventory implements IMEInventoryHandler @Override public boolean canAccept(IAEItemStack input) { - return AEApi.instance().items().itemBiometricCard.sameAs( input.getItemStack() ); + if ( input.getItem() instanceof IBiometricCard ) + { + IBiometricCard tbc = (IBiometricCard) input.getItem(); + String newUser = tbc.getUsername( input.getItemStack() ); + + for (IAEItemStack ais : storedItems) + { + if ( ais.isMeaninful() ) + { + String thisUser = tbc.getUsername( ais.getItemStack() ); + if ( thisUser.equals( newUser ) ) + return false; + } + } + + return true; + } + return false; } @Override diff --git a/parts/BusCollisionHelper.java b/parts/BusCollisionHelper.java index e5276e92..33896f59 100644 --- a/parts/BusCollisionHelper.java +++ b/parts/BusCollisionHelper.java @@ -80,6 +80,14 @@ public class BusCollisionHelper implements IPartCollsionHelper return !isVisual; } + /** + * pretty much useless... + */ + public Entity getEntity() + { + return entity; + } + @Override public void addBox(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { diff --git a/tile/misc/TileCharger.java b/tile/misc/TileCharger.java index 2fc5fca3..d19b9a86 100644 --- a/tile/misc/TileCharger.java +++ b/tile/misc/TileCharger.java @@ -225,7 +225,7 @@ public class TileCharger extends AENetworkPowerTile implements ICrankable public void activate(EntityPlayer player) { - if ( !Platform.hasPermissions( this, player, AccessType.BLOCK_ACCESS ) ) + if ( !Platform.hasPermissions( xCoord, yCoord, zCoord, player, AccessType.BLOCK_ACCESS ) ) return; ItemStack myItem = getStackInSlot( 0 ); diff --git a/tile/misc/TileSecurity.java b/tile/misc/TileSecurity.java index e6ab38b4..3a863b41 100644 --- a/tile/misc/TileSecurity.java +++ b/tile/misc/TileSecurity.java @@ -3,12 +3,15 @@ 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 appeng.api.AEApi; import appeng.api.config.SecurityPermissions; @@ -32,10 +35,13 @@ 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 +public class TileSecurity extends AENetworkTile implements IStorageMonitorable, IAEAppEngInventory { private static int diffrence = 0; @@ -47,6 +53,21 @@ public class TileSecurity extends AENetworkTile implements IStorageMonitorable 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 drops) + { + for (IAEItemStack ais : inventory.storedItems) + drops.add( ais.getItemStack() ); + } + IMEInventoryHandler getSecurityInventory() { return inventory; @@ -100,6 +121,8 @@ public class TileSecurity extends AENetworkTile implements IStorageMonitorable public void writeToNBT(NBTTagCompound data) { data.setLong( "securityKey", securityKey ); + configSlot.writeToNBT( data, "config" ); + NBTTagCompound storedItems = new NBTTagCompound(); int offset = 0; @@ -117,6 +140,8 @@ public class TileSecurity extends AENetworkTile implements IStorageMonitorable public void readFromNBT(NBTTagCompound data) { securityKey = data.getLong( "securityKey" ); + configSlot.readFromNBT( data, "config" ); + NBTTagCompound storedItems = data.getCompoundTag( "storedItems" ); for (Object obj : storedItems.getTags()) { @@ -153,7 +178,7 @@ public class TileSecurity extends AENetworkTile implements IStorageMonitorable if ( i instanceof IBiometricCard ) { IBiometricCard bc = (IBiometricCard) i; - playerPerms.put( pr.getID( bc.getUserName( is ) ), bc.getPermissions( is ) ); + playerPerms.put( pr.getID( bc.getUsername( is ) ), bc.getPermissions( is ) ); } } diff --git a/util/Platform.java b/util/Platform.java index dfeb0c23..05a41fc6 100644 --- a/util/Platform.java +++ b/util/Platform.java @@ -278,29 +278,33 @@ public class Platform return FMLCommonHandler.instance().getEffectiveSide().isServer(); } - public static boolean hasPermissions(TileEntity myTile, EntityPlayer player, AccessType blockAccess) - { - return true; - } - public static void openGUI(EntityPlayer p, TileEntity tile, ForgeDirection side, GuiBridge type) { if ( isClient() ) return; - if ( type.isItem() || hasPermissions( tile, p, AccessType.BLOCK_ACCESS ) ) + int x = (int) p.posX, y = (int) p.posY, z = (int) p.posZ; + if ( tile != null ) + { + x = tile.xCoord; + y = tile.yCoord; + z = tile.zCoord; + } + + if ( type.isItem() || type.hasPermissions( tile, x, y, z, side, p ) ) { if ( tile == null ) - { - p.openGui( AppEng.instance, type.ordinal() << 3, p.getEntityWorld(), (int) p.posX, (int) p.posY, (int) p.posZ ); - } + p.openGui( AppEng.instance, type.ordinal() << 3, p.getEntityWorld(), x, y, z ); else - { - p.openGui( AppEng.instance, type.ordinal() << 3 | (side.ordinal()), tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord ); - } + p.openGui( AppEng.instance, type.ordinal() << 3 | (side.ordinal()), tile.worldObj, x, y, z ); } } + public static boolean hasPermissions(int x, int y, int z, EntityPlayer player, AccessType blockAccess) + { + return true; + } + /* * Checks to see if a block is air? */ @@ -1468,4 +1472,5 @@ public class Platform return !gs.hasPermission( playerID, SecurityPermissions.BUILD ); } + }