Applied-Energistics-2-tiler.../src/main/java/appeng/core/sync/GuiBridge.java

587 lines
20 KiB
Java
Raw Normal View History

2014-11-14 12:02:52 +01:00
/*
* This file is part of Applied Energistics 2.
2015-05-18 00:34:50 +02:00
* Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
2014-11-14 12:02:52 +01:00
*
* 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>.
*/
2014-09-24 02:26:27 +02:00
package appeng.core.sync;
import java.lang.reflect.Constructor;
import java.util.List;
2014-09-24 02:26:27 +02:00
2015-12-24 02:07:03 +01:00
import com.google.common.collect.Lists;
2014-09-24 02:26:27 +02:00
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
2014-09-24 02:26:27 +02:00
import net.minecraft.world.World;
2015-06-16 02:44:59 +02:00
import net.minecraftforge.fml.common.network.IGuiHandler;
import net.minecraftforge.fml.relauncher.ReflectionHelper;
2015-12-24 02:07:03 +01:00
2014-09-24 02:26:27 +02:00
import appeng.api.AEApi;
import appeng.api.config.SecurityPermissions;
import appeng.api.definitions.IComparableDefinition;
import appeng.api.definitions.IMaterials;
2014-09-24 02:26:27 +02:00
import appeng.api.exceptions.AppEngException;
import appeng.api.features.IWirelessTermHandler;
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.ITerminalHost;
2015-06-16 02:44:59 +02:00
import appeng.api.util.AEPartLocation;
2014-09-24 02:26:27 +02:00
import appeng.api.util.DimensionalCoord;
import appeng.client.gui.AEBaseGui;
2014-09-24 02:26:27 +02:00
import appeng.client.gui.GuiNull;
import appeng.container.AEBaseContainer;
import appeng.container.ContainerNull;
import appeng.container.ContainerOpenContext;
import appeng.container.implementations.ContainerCellWorkbench;
import appeng.container.implementations.ContainerChest;
import appeng.container.implementations.ContainerCondenser;
import appeng.container.implementations.ContainerCraftAmount;
import appeng.container.implementations.ContainerCraftConfirm;
import appeng.container.implementations.ContainerCraftingCPU;
import appeng.container.implementations.ContainerCraftingStatus;
import appeng.container.implementations.ContainerCraftingTerm;
import appeng.container.implementations.ContainerDrive;
import appeng.container.implementations.ContainerFormationPlane;
import appeng.container.implementations.ContainerGrinder;
import appeng.container.implementations.ContainerIOPort;
import appeng.container.implementations.ContainerInscriber;
import appeng.container.implementations.ContainerInterface;
import appeng.container.implementations.ContainerInterfaceTerminal;
import appeng.container.implementations.ContainerLevelEmitter;
import appeng.container.implementations.ContainerMAC;
import appeng.container.implementations.ContainerMEMonitorable;
import appeng.container.implementations.ContainerMEPortableCell;
import appeng.container.implementations.ContainerNetworkStatus;
import appeng.container.implementations.ContainerNetworkTool;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.container.implementations.ContainerPriority;
import appeng.container.implementations.ContainerQNB;
import appeng.container.implementations.ContainerQuartzKnife;
import appeng.container.implementations.ContainerSecurityStation;
2014-09-24 02:26:27 +02:00
import appeng.container.implementations.ContainerSkyChest;
import appeng.container.implementations.ContainerSpatialIOPort;
import appeng.container.implementations.ContainerStorageBus;
import appeng.container.implementations.ContainerUpgradeable;
import appeng.container.implementations.ContainerVibrationChamber;
import appeng.container.implementations.ContainerWireless;
import appeng.container.implementations.ContainerWirelessTerm;
import appeng.core.stats.Achievements;
import appeng.helpers.IInterfaceHost;
import appeng.helpers.IPriorityHost;
import appeng.helpers.WirelessTerminalGuiObject;
import appeng.items.contents.QuartzKnifeObj;
import appeng.parts.automation.PartFormationPlane;
import appeng.parts.automation.PartLevelEmitter;
import appeng.parts.misc.PartStorageBus;
import appeng.parts.reporting.PartCraftingTerminal;
import appeng.parts.reporting.PartInterfaceTerminal;
2014-09-24 02:26:27 +02:00
import appeng.parts.reporting.PartPatternTerminal;
import appeng.tile.crafting.TileCraftingTile;
import appeng.tile.crafting.TileMolecularAssembler;
import appeng.tile.grindstone.TileGrinder;
import appeng.tile.misc.TileCellWorkbench;
import appeng.tile.misc.TileCondenser;
import appeng.tile.misc.TileInscriber;
import appeng.tile.misc.TileStationSecurity;
2014-09-24 02:26:27 +02:00
import appeng.tile.misc.TileVibrationChamber;
import appeng.tile.networking.TileWireless;
import appeng.tile.qnb.TileQuantumBridge;
import appeng.tile.spatial.TileSpatialIOPort;
import appeng.tile.storage.TileChest;
import appeng.tile.storage.TileDrive;
import appeng.tile.storage.TileIOPort;
import appeng.tile.storage.TileSkyChest;
import appeng.util.Platform;
2014-09-24 02:26:27 +02:00
public enum GuiBridge implements IGuiHandler
{
GUI_Handler(),
2015-05-18 00:34:50 +02:00
GUI_GRINDER( ContainerGrinder.class, TileGrinder.class, GuiHostType.WORLD, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_QNB( ContainerQNB.class, TileQuantumBridge.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_SKYCHEST( ContainerSkyChest.class, TileSkyChest.class, GuiHostType.WORLD, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_CHEST( ContainerChest.class, TileChest.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_WIRELESS( ContainerWireless.class, TileWireless.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_ME( ContainerMEMonitorable.class, ITerminalHost.class, GuiHostType.WORLD, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_PORTABLE_CELL( ContainerMEPortableCell.class, IPortableCell.class, GuiHostType.ITEM, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_WIRELESS_TERM( ContainerWirelessTerm.class, WirelessTerminalGuiObject.class, GuiHostType.ITEM, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_NETWORK_STATUS( ContainerNetworkStatus.class, INetworkTool.class, GuiHostType.ITEM, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_CRAFTING_CPU( ContainerCraftingCPU.class, TileCraftingTile.class, GuiHostType.WORLD, SecurityPermissions.CRAFT ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_NETWORK_TOOL( ContainerNetworkTool.class, INetworkTool.class, GuiHostType.ITEM, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_QUARTZ_KNIFE( ContainerQuartzKnife.class, QuartzKnifeObj.class, GuiHostType.ITEM, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_DRIVE( ContainerDrive.class, TileDrive.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_VIBRATION_CHAMBER( ContainerVibrationChamber.class, TileVibrationChamber.class, GuiHostType.WORLD, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_CONDENSER( ContainerCondenser.class, TileCondenser.class, GuiHostType.WORLD, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_INTERFACE( ContainerInterface.class, IInterfaceHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_BUS( ContainerUpgradeable.class, IUpgradeableHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_IOPORT( ContainerIOPort.class, TileIOPort.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_STORAGEBUS( ContainerStorageBus.class, PartStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_FORMATION_PLANE( ContainerFormationPlane.class, PartFormationPlane.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_PRIORITY( ContainerPriority.class, IPriorityHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
GUI_SECURITY( ContainerSecurityStation.class, TileStationSecurity.class, GuiHostType.WORLD, SecurityPermissions.SECURITY ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_CRAFTING_TERMINAL( ContainerCraftingTerm.class, PartCraftingTerminal.class, GuiHostType.WORLD, SecurityPermissions.CRAFT ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_PATTERN_TERMINAL( ContainerPatternTerm.class, PartPatternTerminal.class, GuiHostType.WORLD, SecurityPermissions.CRAFT ),
2014-09-24 02:26:27 +02:00
// extends (Container/Gui) + Bus
2015-05-18 00:34:50 +02:00
GUI_LEVEL_EMITTER( ContainerLevelEmitter.class, PartLevelEmitter.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_SPATIAL_IO_PORT( ContainerSpatialIOPort.class, TileSpatialIOPort.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_INSCRIBER( ContainerInscriber.class, TileInscriber.class, GuiHostType.WORLD, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_CELL_WORKBENCH( ContainerCellWorkbench.class, TileCellWorkbench.class, GuiHostType.WORLD, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_MAC( ContainerMAC.class, TileMolecularAssembler.class, GuiHostType.WORLD, null ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_CRAFTING_AMOUNT( ContainerCraftAmount.class, ITerminalHost.class, GuiHostType.ITEM_OR_WORLD, SecurityPermissions.CRAFT ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_CRAFTING_CONFIRM( ContainerCraftConfirm.class, ITerminalHost.class, GuiHostType.ITEM_OR_WORLD, SecurityPermissions.CRAFT ),
2014-09-24 02:26:27 +02:00
GUI_INTERFACE_TERMINAL( ContainerInterfaceTerminal.class, PartInterfaceTerminal.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
2014-09-24 02:26:27 +02:00
2015-05-18 00:34:50 +02:00
GUI_CRAFTING_STATUS( ContainerCraftingStatus.class, ITerminalHost.class, GuiHostType.ITEM_OR_WORLD, SecurityPermissions.CRAFT );
2014-09-24 02:26:27 +02:00
private final Class tileClass;
private final Class containerClass;
private Class guiClass;
2014-09-24 02:26:27 +02:00
private GuiHostType type;
private SecurityPermissions requiredPermission;
GuiBridge()
{
this.tileClass = null;
this.guiClass = null;
this.containerClass = null;
2014-09-24 02:26:27 +02:00
}
2015-09-30 14:24:40 +02:00
GuiBridge( final Class containerClass, final SecurityPermissions requiredPermission )
{
this.requiredPermission = requiredPermission;
this.containerClass = containerClass;
this.tileClass = null;
this.getGui();
}
2014-09-24 02:26:27 +02:00
/**
* I honestly wish I could just use the GuiClass Names myself, but I can't access them without MC's Server
* Exploding.
*/
private void getGui()
{
if( Platform.isClient() )
2014-09-24 02:26:27 +02:00
{
AEBaseGui.class.getName();
final String start = this.containerClass.getName();
2015-09-30 14:24:40 +02:00
final String guiClass = start.replaceFirst( "container.", "client.gui." ).replace( ".Container", ".Gui" );
if( start.equals( guiClass ) )
2015-04-29 02:30:53 +02:00
{
throw new IllegalStateException( "Unable to find gui class" );
2015-04-29 02:30:53 +02:00
}
this.guiClass = ReflectionHelper.getClass( this.getClass().getClassLoader(), guiClass );
if( this.guiClass == null )
2015-04-29 02:30:53 +02:00
{
throw new IllegalStateException( "Cannot Load class: " + guiClass );
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
}
}
2015-09-30 14:24:40 +02:00
GuiBridge( final Class containerClass, final Class tileClass, final GuiHostType type, final SecurityPermissions requiredPermission )
{
2014-09-24 02:26:27 +02:00
this.requiredPermission = requiredPermission;
this.containerClass = containerClass;
2014-09-24 02:26:27 +02:00
this.type = type;
this.tileClass = tileClass;
2014-12-29 15:13:47 +01:00
this.getGui();
2014-09-24 02:26:27 +02:00
}
@Override
2015-09-30 14:24:40 +02:00
public Object getServerGuiElement( final int ordinal, final EntityPlayer player, final World w, final int x, final int y, final int z )
{
2015-09-30 14:24:40 +02:00
final AEPartLocation side = AEPartLocation.fromOrdinal( ordinal & 0x07 );
final GuiBridge ID = values()[ordinal >> 4];
final boolean stem = ( ( ordinal >> 3 ) & 1 ) == 1;
if( ID.type.isItem() )
{
ItemStack it = null;
if( stem )
{
it = player.inventory.getCurrentItem();
}
else if( x >= 0 && x < player.inventory.mainInventory.length )
{
it = player.inventory.getStackInSlot( x );
}
2015-09-30 14:24:40 +02:00
final Object myItem = this.getGuiObject( it, player, w, x, y, z );
if( myItem != null && ID.CorrectTileOrPart( myItem ) )
2015-04-29 02:30:53 +02:00
{
return this.updateGui( ID.ConstructContainer( player.inventory, side, myItem ), w, x, y, z, side, myItem );
2015-04-29 02:30:53 +02:00
}
}
if( ID.type.isTile() )
{
2015-12-24 02:03:16 +01:00
final TileEntity TE = w.getTileEntity( new BlockPos( x, y, z ) );
if( TE instanceof IPartHost )
{
( (IPartHost) TE ).getPart( side );
2015-09-30 14:24:40 +02:00
final IPart part = ( (IPartHost) TE ).getPart( side );
if( ID.CorrectTileOrPart( part ) )
2015-04-29 02:30:53 +02:00
{
return this.updateGui( ID.ConstructContainer( player.inventory, side, part ), w, x, y, z, side, part );
2015-04-29 02:30:53 +02:00
}
}
else
{
if( ID.CorrectTileOrPart( TE ) )
2015-04-29 02:30:53 +02:00
{
return this.updateGui( ID.ConstructContainer( player.inventory, side, TE ), w, x, y, z, side, TE );
2015-04-29 02:30:53 +02:00
}
}
}
return new ContainerNull();
}
2015-09-30 14:24:40 +02:00
private Object getGuiObject( final ItemStack it, final EntityPlayer player, final World w, final int x, final int y, final int z )
{
if( it != null )
{
if( it.getItem() instanceof IGuiItem )
{
2015-12-24 02:03:16 +01:00
return ( (IGuiItem) it.getItem() ).getGuiObject( it, w, new BlockPos( x, y, z ) );
}
2015-09-30 14:24:40 +02:00
final IWirelessTermHandler wh = AEApi.instance().registries().wireless().getWirelessTerminalHandler( it );
if( wh != null )
2015-04-29 02:30:53 +02:00
{
return new WirelessTerminalGuiObject( wh, it, player, w, x, y, z );
2015-04-29 02:30:53 +02:00
}
}
return null;
}
2015-09-30 14:24:40 +02:00
public boolean CorrectTileOrPart( final Object tE )
2014-09-24 02:26:27 +02:00
{
if( this.tileClass == null )
2015-04-29 02:30:53 +02:00
{
throw new IllegalArgumentException( "This Gui Cannot use the standard Handler." );
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
return this.tileClass.isInstance( tE );
2014-09-24 02:26:27 +02:00
}
2015-09-30 14:24:40 +02:00
private Object updateGui( final Object newContainer, final World w, final int x, final int y, final int z, final AEPartLocation side, final Object myItem )
{
if( newContainer instanceof AEBaseContainer )
{
2015-09-30 14:24:40 +02:00
final AEBaseContainer bc = (AEBaseContainer) newContainer;
bc.setOpenContext( new ContainerOpenContext( myItem ) );
bc.getOpenContext().setWorld( w );
bc.getOpenContext().setX( x );
bc.getOpenContext().setY( y );
bc.getOpenContext().setZ( z );
bc.getOpenContext().setSide( side );
}
return newContainer;
}
2015-09-30 14:24:40 +02:00
public Object ConstructContainer( final InventoryPlayer inventory, final AEPartLocation side, final Object tE )
2014-09-24 02:26:27 +02:00
{
try
{
2015-09-30 14:24:40 +02:00
final Constructor[] c = this.containerClass.getConstructors();
if( c.length == 0 )
2015-04-29 02:30:53 +02:00
{
2014-09-24 02:26:27 +02:00
throw new AppEngException( "Invalid Gui Class" );
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
2015-09-30 14:24:40 +02:00
final Constructor target = this.findConstructor( c, inventory, tE );
2014-09-24 02:26:27 +02:00
if( target == null )
2014-09-24 02:26:27 +02:00
{
throw new IllegalStateException( "Cannot find " + this.containerClass.getName() + "( " + this.typeName( inventory ) + ", " + this.typeName( tE ) + " )" );
2014-09-24 02:26:27 +02:00
}
2015-09-30 14:24:40 +02:00
final Object o = target.newInstance( inventory, tE );
2014-09-24 02:26:27 +02:00
/**
* triggers achievement when the player sees presses.
*/
if( o instanceof AEBaseContainer )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final AEBaseContainer bc = (AEBaseContainer) o;
for( final Object so : bc.inventorySlots )
2014-09-24 02:26:27 +02:00
{
if( so instanceof Slot )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final ItemStack is = ( (Slot) so ).getStack();
2014-09-24 02:26:27 +02:00
final IMaterials materials = AEApi.instance().definitions().materials();
this.addPressAchievementToPlayer( is, materials, inventory.player );
2014-09-24 02:26:27 +02:00
}
}
}
return o;
}
2015-09-30 14:24:40 +02:00
catch( final Throwable t )
2014-09-24 02:26:27 +02:00
{
throw new IllegalStateException( t );
2014-09-24 02:26:27 +02:00
}
}
2015-09-30 14:24:40 +02:00
private Constructor findConstructor( final Constructor[] c, final InventoryPlayer inventory, final Object tE )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
for( final Constructor con : c )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final Class[] types = con.getParameterTypes();
if( types.length == 2 )
2014-09-24 02:26:27 +02:00
{
if( types[0].isAssignableFrom( inventory.getClass() ) && types[1].isAssignableFrom( tE.getClass() ) )
2015-04-29 02:30:53 +02:00
{
return con;
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
}
}
return null;
2014-09-24 02:26:27 +02:00
}
2015-09-30 14:24:40 +02:00
private String typeName( final Object inventory )
2014-09-24 02:26:27 +02:00
{
if( inventory == null )
2015-04-29 02:30:53 +02:00
{
2014-09-24 02:26:27 +02:00
return "NULL";
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
return inventory.getClass().getName();
}
2015-09-30 14:24:40 +02:00
private void addPressAchievementToPlayer( final ItemStack newItem, final IMaterials possibleMaterials, final EntityPlayer player )
2014-09-24 02:26:27 +02:00
{
final IComparableDefinition logic = possibleMaterials.logicProcessorPress();
final IComparableDefinition eng = possibleMaterials.engProcessorPress();
final IComparableDefinition calc = possibleMaterials.calcProcessorPress();
final IComparableDefinition silicon = possibleMaterials.siliconPress();
final List<IComparableDefinition> presses = Lists.newArrayList( logic, eng, calc, silicon );
2015-09-30 14:24:40 +02:00
for( final IComparableDefinition press : presses )
2014-09-24 02:26:27 +02:00
{
if( press.isSameAs( newItem ) )
2014-09-24 02:26:27 +02:00
{
Achievements.Presses.addToPlayer( player );
2014-09-24 02:26:27 +02:00
return;
}
2014-09-24 02:26:27 +02:00
}
}
@Override
2015-09-30 14:24:40 +02:00
public Object getClientGuiElement( final int ordinal, final EntityPlayer player, final World w, final int x, final int y, final int z )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final AEPartLocation side = AEPartLocation.fromOrdinal( ordinal & 0x07 );
final GuiBridge ID = values()[ordinal >> 4];
final boolean stem = ( ( ordinal >> 3 ) & 1 ) == 1;
if( ID.type.isItem() )
2014-09-24 02:26:27 +02:00
{
ItemStack it = null;
if( stem )
{
it = player.inventory.getCurrentItem();
}
else if( x >= 0 && x < player.inventory.mainInventory.length )
{
it = player.inventory.getStackInSlot( x );
}
2015-09-30 14:24:40 +02:00
final Object myItem = this.getGuiObject( it, player, w, x, y, z );
if( myItem != null && ID.CorrectTileOrPart( myItem ) )
2015-04-29 02:30:53 +02:00
{
return ID.ConstructGui( player.inventory, side, myItem );
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
}
if( ID.type.isTile() )
2014-09-24 02:26:27 +02:00
{
2015-12-24 02:03:16 +01:00
final TileEntity TE = w.getTileEntity( new BlockPos( x, y, z ) );
if( TE instanceof IPartHost )
2014-09-24 02:26:27 +02:00
{
( (IPartHost) TE ).getPart( side );
2015-09-30 14:24:40 +02:00
final IPart part = ( (IPartHost) TE ).getPart( side );
if( ID.CorrectTileOrPart( part ) )
2015-04-29 02:30:53 +02:00
{
return ID.ConstructGui( player.inventory, side, part );
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
}
else
{
if( ID.CorrectTileOrPart( TE ) )
2015-04-29 02:30:53 +02:00
{
return ID.ConstructGui( player.inventory, side, TE );
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
}
}
return new GuiNull( new ContainerNull() );
2014-09-24 02:26:27 +02:00
}
2015-09-30 14:24:40 +02:00
public Object ConstructGui( final InventoryPlayer inventory, final AEPartLocation side, final Object tE )
2014-09-24 02:26:27 +02:00
{
try
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final Constructor[] c = this.guiClass.getConstructors();
if( c.length == 0 )
2015-04-29 02:30:53 +02:00
{
throw new AppEngException( "Invalid Gui Class" );
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
2015-09-30 14:24:40 +02:00
final Constructor target = this.findConstructor( c, inventory, tE );
2014-09-24 02:26:27 +02:00
if( target == null )
{
throw new IllegalStateException( "Cannot find " + this.containerClass.getName() + "( " + this.typeName( inventory ) + ", " + this.typeName( tE ) + " )" );
}
2014-09-24 02:26:27 +02:00
return target.newInstance( inventory, tE );
2014-09-24 02:26:27 +02:00
}
2015-09-30 14:24:40 +02:00
catch( final Throwable t )
2014-09-24 02:26:27 +02:00
{
throw new IllegalStateException( t );
2014-09-24 02:26:27 +02:00
}
}
2015-09-30 14:24:40 +02:00
public boolean hasPermissions( final TileEntity te, final int x, final int y, final int z, final AEPartLocation side, final EntityPlayer player )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final World w = player.getEntityWorld();
2015-12-24 02:03:16 +01:00
final BlockPos pos = new BlockPos( x, y, z );
2014-09-24 02:26:27 +02:00
2015-06-16 02:44:59 +02:00
if( Platform.hasPermissions( te != null ? new DimensionalCoord( te ) : new DimensionalCoord( player.worldObj, pos ), player ) )
2014-09-24 02:26:27 +02:00
{
if( this.type.isItem() )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final ItemStack it = player.inventory.getCurrentItem();
if( it != null && it.getItem() instanceof IGuiItem )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final Object myItem = ( (IGuiItem) it.getItem() ).getGuiObject( it, w, pos );
if( this.CorrectTileOrPart( myItem ) )
2014-09-24 02:26:27 +02:00
{
return true;
}
}
}
if( this.type.isTile() )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final TileEntity TE = w.getTileEntity( pos );
if( TE instanceof IPartHost )
2014-09-24 02:26:27 +02:00
{
( (IPartHost) TE ).getPart( side );
2015-09-30 14:24:40 +02:00
final IPart part = ( (IPartHost) TE ).getPart( side );
if( this.CorrectTileOrPart( part ) )
2015-04-29 02:30:53 +02:00
{
2014-12-29 15:13:47 +01:00
return this.securityCheck( part, player );
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
}
else
{
if( this.CorrectTileOrPart( TE ) )
2015-04-29 02:30:53 +02:00
{
2014-12-29 15:13:47 +01:00
return this.securityCheck( TE, player );
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
}
}
}
return false;
}
2015-09-30 14:24:40 +02:00
private boolean securityCheck( final Object te, final EntityPlayer player )
2014-09-24 02:26:27 +02:00
{
if( te instanceof IActionHost && this.requiredPermission != null )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final IGridNode gn = ( (IActionHost) te ).getActionableNode();
if( gn != null )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final IGrid g = gn.getGrid();
if( g != null )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final boolean requirePower = false;
if( requirePower )
2014-09-24 02:26:27 +02:00
{
2015-09-30 14:24:40 +02:00
final IEnergyGrid eg = g.getCache( IEnergyGrid.class );
if( !eg.isNetworkPowered() )
2014-09-24 02:26:27 +02:00
{
return false;
}
}
2015-09-30 14:24:40 +02:00
final ISecurityGrid sg = g.getCache( ISecurityGrid.class );
if( sg.hasPermission( player, this.requiredPermission ) )
2015-04-29 02:30:53 +02:00
{
2014-09-24 02:26:27 +02:00
return true;
2015-04-29 02:30:53 +02:00
}
2014-09-24 02:26:27 +02:00
}
}
return false;
}
return true;
}
public GuiHostType getType()
{
2014-12-29 15:13:47 +01:00
return this.type;
2014-09-24 02:26:27 +02:00
}
}