Terminal Fixes + Facades

Fixed name collision with "isUseableByPlayer".
Fixed KnowledgeInscriber not being able to erase patterns.
Fixed bug where Terminals would not properly update during certain
AE-network changes.
Fixed bug where craftable essentia was still present on the network when
it should not be.
Added config option to force some thaumcraft blocks to be turned into
facades.
This commit is contained in:
Chris committed 2016-01-10 09:19:12 -05:00
1 parent 35dc131b2b
commit 73ef506cb8
41 files changed
+781 -542

No files matched your search

+8 -1
View File
@@ -1,4 +1,11 @@
01/02/2016 0.10.0.0
01/10/2016 0.10.0.0 - Beta
Fixed name collision with "isUseableByPlayer".
Fixed KnowledgeInscriber not being able to erase patterns.
Fixed bug where Terminals would not properly update during certain AE-network changes.
Fixed bug where craftable essentia was still present on the network when it should not be.
Added config option to force some thaumcraft blocks to be turned into facades.
01/09/2016 0.10.0.0
Fixed crafting aspect item display name.
More Multiplayer gui sync fixes.
Slightly reduced size of all packets.
@@ -30,6 +30,14 @@ public interface IThEConfig
*/
public int conversionMultiplier();
/**
* When enabled, overwrites the AE2 facade setting for certain Thaumcraft blocks,
* allowing them to become facades.
*
* @return
*/
public boolean forceTCFacades();
/**
* If true the iron and thaumium gearbox's will be rendered as a standard
* block.
@@ -6,6 +6,8 @@ public interface IMEEssentiaMonitorReceiver
{
/**
* Verifies that the receiver is still valid.<br>
* If returning false the receiver will be removed from the monitor
* and the receiver should NOT call removeListener itself.
*
* @param verificationToken
* @return False if the receiver should no longer get updates.
@@ -840,11 +840,11 @@ public class GuiEssentiaCellTerminal
public void onReceiveAspectListChange( final IAspectStack change )
{
// Update the container
if( this.baseContainer.onReceivedAspectListChange( change ) )
{
// Update the gui
this.onListUpdate();
}
this.baseContainer.onReceivedAspectListChange( change );
// Update the gui
this.onListUpdate();
}
/**
@@ -22,7 +22,8 @@ class ConfigurationHandler
DEFAULT_INFUSIONPROVIDER = true,
DEFAULT_QUARTZ = true,
DEFAULT_GEARBOX_DISABLED = false,
DEFAULT_EXTRACELLS_BLIST = true;
DEFAULT_EXTRACELLS_BLIST = true,
DEFAULT_FORCE_TC_FACADES = true;
/**
* Mod configuration
@@ -61,6 +62,11 @@ class ConfigurationHandler
*/
private boolean extracellsBlacklist = DEFAULT_EXTRACELLS_BLIST;
/**
* Allows specific blocks from Thaumcraft to be turned into facades.
*/
private boolean forceTCFacades = DEFAULT_FORCE_TC_FACADES;
private ConfigurationHandler( final Configuration config )
{
this.configSettings = config;
@@ -101,24 +107,28 @@ class ConfigurationHandler
this.conversionMultiplier = (int)Math.pow( 2, Math.min( fluidPow, 11 ) );
// Sync essentia provider
this.allowEssentiaProvider = this.configSettings.getBoolean( "Allow Crafting Essentia Provider", ConfigurationHandler.CATEGORY_CRAFTING,
ConfigurationHandler.DEFAULT_ESSENTIAPROVIDER, "Controls if the Essentia Provider is allowed to be crafted." );
this.allowEssentiaProvider = this.configSettings.getBoolean( "Allow Crafting Essentia Provider", CATEGORY_CRAFTING,
DEFAULT_ESSENTIAPROVIDER, "Controls if the Essentia Provider is allowed to be crafted." );
// Sync essentia provider
this.allowInfusionProvider = this.configSettings.getBoolean( "Allow Crafting Infusion Provider", ConfigurationHandler.CATEGORY_CRAFTING,
ConfigurationHandler.DEFAULT_INFUSIONPROVIDER, "Controls if the Infusion Provider is allowed to be crafted." );
this.allowInfusionProvider = this.configSettings.getBoolean( "Allow Crafting Infusion Provider", CATEGORY_CRAFTING,
DEFAULT_INFUSIONPROVIDER, "Controls if the Infusion Provider is allowed to be crafted." );
// Sync certus dupe
this.allowCertusDupe = this.configSettings.getBoolean( "Certus Quartz Duplication", ConfigurationHandler.CATEGORY_CRAFTING,
ConfigurationHandler.DEFAULT_QUARTZ, "Controls if Certus Quartz can be duplicated in the crucible." );
this.allowCertusDupe = this.configSettings.getBoolean( "Certus Quartz Duplication", CATEGORY_CRAFTING,
DEFAULT_QUARTZ, "Controls if Certus Quartz can be duplicated in the crucible." );
// Gearbox model
this.gearboxModelDisabled = this.configSettings.getBoolean( "Disable Gearbox Model", ConfigurationHandler.CATEGORY_CLIENT,
ConfigurationHandler.DEFAULT_GEARBOX_DISABLED, "The iron and thaumium gearboxes will be rendered as a standard block." );
this.gearboxModelDisabled = this.configSettings.getBoolean( "Disable Gearbox Model", CATEGORY_CLIENT,
DEFAULT_GEARBOX_DISABLED, "The iron and thaumium gearboxes will be rendered as a standard block." );
// Extra cells blacklist
this.extracellsBlacklist = this.configSettings.getBoolean( "ExtraCells Blacklist", ConfigurationHandler.CATEGORY_INTEGRATION,
ConfigurationHandler.DEFAULT_EXTRACELLS_BLIST, "Prevents extra cells from interacting with essentia gas" );
this.extracellsBlacklist = this.configSettings.getBoolean( "ExtraCells Blacklist", CATEGORY_INTEGRATION,
DEFAULT_EXTRACELLS_BLIST, "Prevents extra cells from interacting with essentia gas" );
// Thaumcraft facades
this.forceTCFacades = this.configSettings.getBoolean( "Force TC Facades", CATEGORY_CRAFTING, DEFAULT_FORCE_TC_FACADES,
"When enabled, overwrites the AE2 facade setting for certain Thaumcraft blocks, allowing them to become facades." );
// Has the config file changed?
if( this.configSettings.hasChanged() )
@@ -158,6 +168,12 @@ class ConfigurationHandler
return this.conversionMultiplier;
}
@Override
public boolean forceTCFacades()
{
return this.forceTCFacades;
}
@Override
public boolean gearboxModelDisabled()
{
@@ -265,7 +265,7 @@ public class ThEGuiHandler
public static void launchGui( final ThEPartBase part, final EntityPlayer player, final World world, final int x, final int y, final int z )
{
// Ensure the player is allowed to open the gui
if( part.isUseableByPlayer( player ) )
if( part.isPartUseableByPlayer( player ) )
{
player.openGui( ThaumicEnergistics.INSTANCE, part.getSide().ordinal(), world, x, y, z );
}
@@ -8,6 +8,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import thaumcraft.api.aspects.Aspect;
import thaumicenergistics.api.grid.ICraftingIssuerHost;
import thaumicenergistics.api.grid.IMEEssentiaMonitor;
import thaumicenergistics.api.storage.IAspectStack;
import thaumicenergistics.common.ThaumicEnergistics;
import thaumicenergistics.common.grid.EssentiaMonitor;
@@ -22,6 +23,7 @@ import thaumicenergistics.integration.tc.EssentiaItemContainerHelper;
import thaumicenergistics.integration.tc.EssentiaItemContainerHelper.AspectItemType;
import appeng.api.config.Settings;
import appeng.api.config.ViewItems;
import appeng.api.networking.IGrid;
import appeng.api.networking.security.BaseActionSource;
import appeng.api.networking.security.IActionHost;
import appeng.api.networking.security.PlayerSource;
@@ -45,7 +47,7 @@ public class ContainerEssentiaCell
/**
* The ME chest the cell is stored in.
*/
private TileChest hostChest;
private final TileChest hostChest;
/**
* Network source representing the player who is interacting with the
@@ -96,12 +98,12 @@ public class ContainerEssentiaCell
// Call the super-constructor
super( player );
// Get the tile entity for the chest
this.hostChest = (TileChest)world.getTileEntity( x, y, z );
// Is this server side?
if( EffectiveSide.isServerSide() )
{
// Get the tile entity for the chest
this.hostChest = (TileChest)world.getTileEntity( x, y, z );
/*
* Note: Casting the hostChest to an object is required to prevent the compiler
* from seeing the soft-dependencies of AE2, such a buildcraft, which it attempts
@@ -112,38 +114,11 @@ public class ContainerEssentiaCell
// Create the action source
this.playerSource = new PlayerSource( this.player, (IActionHost)hostObject );
try
{
IMEInventoryHandler<IAEFluidStack> handler = null;
// Get the chest handler
List<IMEInventoryHandler> hostCellArray = this.hostChest.getCellArray( StorageChannel.FLUIDS );
if( hostCellArray.size() > 0 )
{
handler = hostCellArray.get( 0 );
}
// Get the monitor
if( handler != null )
{
// Create the essentia monitor
this.monitor = new EssentiaMonitor( (IMEMonitor<IAEFluidStack>)handler, this.hostChest.getProxy().getEnergy(), this );
// Attach to the monitor
this.attachToMonitor();
}
}
catch( Exception e )
{
e.printStackTrace();
}
}
else
{
// Request a full update from the server
Packet_S_EssentiaCellTerminal.sendFullUpdateRequest( player );
this.hasRequested = true;
}
// Bind our inventory
@@ -183,12 +158,54 @@ public class ContainerEssentiaCell
return this.playerSource;
}
@Override
protected IGrid getHostGrid()
{
try
{
return this.hostChest.getActionableNode().getGrid();
}
catch( Exception e )
{
return null;
}
}
@Override
protected Aspect getHostSelectedAspect()
{
return this.tmpSelectedAspect;
}
@Override
protected IMEEssentiaMonitor getNewMonitor()
{
try
{
IMEInventoryHandler<IAEFluidStack> handler = null;
// Get the chest handler
List<IMEInventoryHandler> hostCellArray = this.hostChest.getCellArray( StorageChannel.FLUIDS );
if( hostCellArray.size() > 0 )
{
handler = hostCellArray.get( 0 );
}
// Get the monitor
if( handler != null )
{
// Create the essentia monitor
return new EssentiaMonitor( (IMEMonitor<IAEFluidStack>)handler, this.hostChest.getProxy().getEnergy(), this );
}
}
catch( Exception e )
{
e.printStackTrace();
}
return null;
}
@Override
protected void setHostSelectedAspect( final Aspect aspect )
{
@@ -246,7 +263,7 @@ public class ContainerEssentiaCell
}
// Send the list
if( ( this.monitor != null ) && ( this.hostChest.isPowered() ) )
if( this.hostChest.isPowered() )
{
Packet_C_EssentiaCellTerminal.sendFullList( this.player, this.repo.getAll() );
}
@@ -303,22 +320,16 @@ public class ContainerEssentiaCell
@Override
public void onContainerClosed( final EntityPlayer player )
{
// Drop anything in the work slots.
if( EffectiveSide.isServerSide() )
{
// Is there a monitor
if( this.monitor != null )
{
// Ensure it gets detached.
( (EssentiaMonitor)this.monitor ).detach();
}
for( int i = 0; i < 2; i++ )
{
this.player.dropPlayerItemWithRandomChoice( ( (Slot)this.inventorySlots.get( i ) ).getStack(), false );
}
}
// Call super
super.onContainerClosed( player );
}
}
@@ -1,8 +1,6 @@
package thaumicenergistics.common.container;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.annotation.Nullable;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
@@ -30,6 +28,7 @@ import thaumicenergistics.integration.tc.EssentiaItemContainerHelper;
import thaumicenergistics.integration.tc.EssentiaItemContainerHelper.AspectItemType;
import appeng.api.config.Actionable;
import appeng.api.config.SecurityPermissions;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridNode;
import appeng.api.networking.security.BaseActionSource;
import appeng.api.networking.security.ISecurityGrid;
@@ -134,12 +133,6 @@ public abstract class ContainerEssentiaCellTerminalBase
*/
private Slot outputSlot;
/**
* Holds a list of changes sent to the gui before the
* full list is sent.
*/
private List<IAspectStack> pendingChanges = new ArrayList<IAspectStack>();
/**
* The aspect the user has selected.
*/
@@ -168,12 +161,7 @@ public abstract class ContainerEssentiaCellTerminalBase
/**
* Essentia network monitor
*/
protected IMEEssentiaMonitor monitor;
/**
* Set to true once a full list request is sent to the server.
*/
protected boolean hasRequested = false;
private IMEEssentiaMonitor essentiaMonitor;
/**
* Create the container and register the owner
@@ -189,15 +177,47 @@ public abstract class ContainerEssentiaCellTerminalBase
// Set the sound time
this.lastSoundPlaytime = System.currentTimeMillis();
}
else
{
this.hasRequested = true;
}
// Create the reop
this.repo = new EssentiaRepo();
}
/**
* Attach this container to the Essentia monitor
*
* @param essentiaMonitor
*/
private boolean attachToMonitor( final IMEEssentiaMonitor eMonitor )
{
if( ( EffectiveSide.isServerSide() ) && ( eMonitor != null ) )
{
// Get the grid
IGrid grid = this.getHostGrid();
if( grid == null )
{
return false;
}
// Detach from any current monitor
if( this.essentiaMonitor != null )
{
this.detachFromMonitor();
}
// Set the monitor
this.essentiaMonitor = eMonitor;
// Listen
this.essentiaMonitor.addListener( this, grid.hashCode() );
// Update our cached list of aspects
this.repo.copyFrom( this.essentiaMonitor.getEssentiaList() );
return true;
}
return false;
}
/**
* Returns true if the specified stack can be merged into the output slot.
*
@@ -319,7 +339,7 @@ public abstract class ContainerEssentiaCellTerminalBase
int proposedDrainAmount = (int)containerEssentia.getStackSize();
// Do a network injection
long rejectedAmount = this.monitor.injectEssentia( containerEssentia.getAspect(), proposedDrainAmount, mode, actionSource,
long rejectedAmount = this.essentiaMonitor.injectEssentia( containerEssentia.getAspect(), proposedDrainAmount, mode, actionSource,
true );
// Was any rejected?
@@ -376,7 +396,7 @@ public abstract class ContainerEssentiaCellTerminalBase
}
// Do an extraction from the network
long extractedAmount = this.monitor.extractEssentia( withAspect, containerCapacity, mode, actionSource, true );
long extractedAmount = this.essentiaMonitor.extractEssentia( withAspect, containerCapacity, mode, actionSource, true );
// Was anything extracted?
if( extractedAmount <= 0 )
@@ -400,21 +420,6 @@ public abstract class ContainerEssentiaCellTerminalBase
new AspectStack( withAspect, proposedFillAmount ) );
}
/**
* Attach this container to the Essentia monitor
*/
protected void attachToMonitor()
{
if( ( EffectiveSide.isServerSide() ) && ( this.monitor != null ) )
{
this.monitor.addListener( this, this.monitor.hashCode() );
// Update our cached list of aspects
this.repo.copyFrom( this.monitor.getEssentiaList() );
}
}
/**
* Binds the container to the specified inventory and the players inventory.
*
@@ -448,13 +453,13 @@ public abstract class ContainerEssentiaCellTerminalBase
{
if( EffectiveSide.isServerSide() )
{
if( this.monitor != null )
if( this.essentiaMonitor != null )
{
// Stop listening
this.monitor.removeListener( this );
this.essentiaMonitor.removeListener( this );
// Null the monitor
this.monitor = null;
this.essentiaMonitor = null;
// Clear the repo
this.repo.clear();
@@ -474,6 +479,14 @@ public abstract class ContainerEssentiaCellTerminalBase
*/
protected abstract BaseActionSource getActionSource();
/**
* Gets the grid for the host.
*
* @return
*/
@Nullable
protected abstract IGrid getHostGrid();
/**
* Return the selected aspect stored in the host.
*
@@ -482,6 +495,14 @@ public abstract class ContainerEssentiaCellTerminalBase
@Nullable
protected abstract Aspect getHostSelectedAspect();
/**
* Attempts to get a new essentia monitor.
*
* @return
*/
@Nullable
protected abstract IMEEssentiaMonitor getNewMonitor();
/**
* Sets the hosts selected aspect.
*
@@ -503,7 +524,7 @@ public abstract class ContainerEssentiaCellTerminalBase
protected ItemStack transferEssentia( final ItemStack stack, final Aspect aspect, final BaseActionSource actionSource, final Actionable mode )
{
// Ensure the stack & monitor are not null
if( ( stack == null ) || ( this.monitor == null ) )
if( ( stack == null ) || ( this.essentiaMonitor == null ) )
{
return stack;
}
@@ -666,16 +687,35 @@ public abstract class ContainerEssentiaCellTerminalBase
// Call super
super.detectAndSendChanges();
// Inc tick tracker
this.tickCounter += 1;
if( this.tickCounter > ContainerEssentiaCellTerminalBase.WORK_TICK_RATE )
if( EffectiveSide.isClientSide() )
{
// Do work
this.doWork( this.tickCounter );
return;
}
// Is there a monitor?
if( this.essentiaMonitor != null )
{
// Inc tick tracker
this.tickCounter += 1;
if( this.tickCounter > ContainerEssentiaCellTerminalBase.WORK_TICK_RATE )
{
// Do work
this.doWork( this.tickCounter );
// Reset the tick counter
this.tickCounter = 0;
}
}
else
{
// Attempt to attach to a monitor
if( this.attachToMonitor( this.getNewMonitor() ) )
{
// Send update
this.onClientRequestFullUpdate();
}
// Reset the tick counter
this.tickCounter = 0;
}
// Compare selected aspects
@@ -727,23 +767,26 @@ public abstract class ContainerEssentiaCellTerminalBase
* from the AE monitor?
*/
@Override
public boolean isValid( final Object verificationToken )
public final boolean isValid( final Object verificationToken )
{
if( this.monitor == null )
// Get the grid
IGrid grid = this.getHostGrid();
if( grid != null )
{
return false;
// Do the hash codes match?
if( grid.hashCode() == (Integer)verificationToken )
{
return true;
}
}
// Do the hash codes match?
if( this.monitor.hashCode() == (Integer)verificationToken )
{
return true;
}
// No longer valid
this.monitor = null;
// No longer valid (Do not call detach, this will happen automatically)
this.essentiaMonitor = null;
this.repo.clear();
// Update the client
this.onClientRequestFullUpdate();
return false;
}
@@ -781,8 +824,10 @@ public abstract class ContainerEssentiaCellTerminalBase
@Override
public void onContainerClosed( final EntityPlayer player )
{
// Call super
super.onContainerClosed( player );
// Detach from the monitor
this.detachFromMonitor();
}
@@ -865,60 +910,29 @@ public abstract class ContainerEssentiaCellTerminalBase
{
// Set the aspect list
this.repo.copyFrom( aspectStackList );
// Check pending changes
if( ( aspectStackList != null ) && ( !this.pendingChanges.isEmpty() ) )
{
// Update list with pending changes
for( int index = 0; index < this.pendingChanges.size(); index++ )
{
this.onReceivedAspectListChange( this.pendingChanges.get( index ) );
}
// Clear pending
this.pendingChanges.clear();
}
}
/**
* Called by the gui when a change arrives.
*
* @param change
* @return True if the repo is prepared to be displayed.
*/
public boolean onReceivedAspectListChange( final IAspectStack change )
public void onReceivedAspectListChange( final IAspectStack change )
{
// Ignored server side
if( EffectiveSide.isServerSide() )
{
return false;
return;
}
// Ensure the change is not null
if( change == null )
{
return false;
}
// Have we requested the full list yet?
if( !this.hasRequested )
{
return false;
}
// Has the full list been received?
if( this.repo.isEmpty() )
{
// Not yet received full list, add to pending
this.pendingChanges.add( change );
return false;
return;
}
// Post the change
this.repo.postChange( change );
// The GUI can update if there are no pending changes
return this.pendingChanges.isEmpty();
}
/**
@@ -5,6 +5,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import thaumcraft.api.aspects.Aspect;
import thaumicenergistics.api.grid.ICraftingIssuerHost;
import thaumicenergistics.api.grid.IMEEssentiaMonitor;
import thaumicenergistics.common.ThEGuiHandler;
import thaumicenergistics.common.items.ItemCraftingAspect;
import thaumicenergistics.common.network.packet.client.Packet_C_EssentiaCellTerminal;
@@ -14,6 +15,7 @@ import thaumicenergistics.common.storage.AspectStackComparator.AspectStackCompar
import thaumicenergistics.common.utils.EffectiveSide;
import appeng.api.AEApi;
import appeng.api.config.ViewItems;
import appeng.api.networking.IGrid;
import appeng.api.networking.security.BaseActionSource;
import appeng.api.networking.security.PlayerSource;
import appeng.api.storage.data.IAEItemStack;
@@ -32,13 +34,14 @@ public class ContainerEssentiaTerminal
/**
* The terminal this is associated with.
*/
private PartEssentiaTerminal terminal = null;
@Nonnull
private final PartEssentiaTerminal terminal;
/**
* Network source representing the player who is interacting with the
* container.
*/
private PlayerSource playerSource = null;
private final PlayerSource playerSource;
/**
* Creates the container
@@ -62,12 +65,6 @@ public class ContainerEssentiaTerminal
// Is this server side?
if( EffectiveSide.isServerSide() )
{
// Get the monitor
this.monitor = terminal.getGridBlock().getEssentiaMonitor();
// Attach to the monitor
this.attachToMonitor();
// Add this container to the terminal's list
terminal.addListener( this );
}
@@ -75,7 +72,6 @@ public class ContainerEssentiaTerminal
{
// Ask for a list update
Packet_S_EssentiaCellTerminal.sendFullUpdateRequest( this.player );
this.hasRequested = true;
}
// Bind our inventory
@@ -88,12 +84,31 @@ public class ContainerEssentiaTerminal
return this.playerSource;
}
@Override
protected IGrid getHostGrid()
{
try
{
return this.terminal.getGridBlock().getGrid();
}
catch( Exception e )
{
return null;
}
}
@Override
protected Aspect getHostSelectedAspect()
{
return this.terminal.selectedAspect;
}
@Override
protected IMEEssentiaMonitor getNewMonitor()
{
return this.terminal.getGridBlock().getEssentiaMonitor();
}
@Override
protected void setHostSelectedAspect( final Aspect aspect )
{
@@ -103,7 +118,7 @@ public class ContainerEssentiaTerminal
@Override
public boolean canInteractWith( final EntityPlayer player )
{
return this.terminal.isUseableByPlayer( player );
return this.terminal.isPartUseableByPlayer( player );
}
/**
@@ -168,10 +183,7 @@ public class ContainerEssentiaTerminal
this.onModeChanged( this.terminal.getSortingMode(), this.terminal.getViewMode() );
// Send the aspect list
if( this.monitor != null )
{
Packet_C_EssentiaCellTerminal.sendFullList( this.player, this.repo.getAll() );
}
Packet_C_EssentiaCellTerminal.sendFullList( this.player, this.repo.getAll() );
}
@Override
@@ -3,6 +3,7 @@ package thaumicenergistics.common.container;
import java.util.ArrayList;
import java.util.Iterator;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
@@ -72,24 +73,24 @@ public class ContainerKnowledgeInscriber
CRAFTING_SLOT_Y = 90, CRAFTING_ROWS = 3, CRAFTING_COLS = 3,
CRAFTING_SLOT_SPACING = 18, CRAFTING_RESULT_SLOT = CRAFTING_MATRIX_SLOT + ( CRAFTING_ROWS * CRAFTING_COLS );
/**
* Handles interaction with the knowledge core.
*/
private final HandlerKnowledgeCore kCoreHandler;
/**
* Slots
*/
private SlotRestrictive kCoreSlot;
private final SlotRestrictive kCoreSlot;
private final SlotFake resultSlot;
private SlotInaccessible[] patternSlots = new SlotInaccessible[MAXIMUM_PATTERNS];
private SlotFakeCraftingMatrix[] craftingSlots = new SlotFakeCraftingMatrix[CRAFTING_ROWS * CRAFTING_COLS];
private SlotFake resultSlot;
/**
* Slot index ranges.
*/
private int patternSlot_first, patternSlot_last, craftingSlot_first, craftingSlot_last;
/**
* Handles interaction with the knowledge core.
*/
private HandlerKnowledgeCore kCoreHandler;
/**
* Player using the inscriber
*/
@@ -100,11 +101,6 @@ public class ContainerKnowledgeInscriber
*/
private IArcaneRecipe activeRecipe = null;
/**
* Tracks changes to the core slot.
*/
private boolean hadCoreLastCheck = false;
/**
* Inscriber tile entity.
*/
@@ -145,26 +141,8 @@ public class ContainerKnowledgeInscriber
this.resultSlot = new SlotFake( this.internalInventory, CRAFTING_RESULT_SLOT, 116, 108 );
this.addSlotToContainer( this.resultSlot );
// Perform server side only setup
if( EffectiveSide.isServerSide() )
{
// Check for a kcore
if( this.kCoreSlot.getHasStack() )
{
// Mark the presence of the core
this.hadCoreLastCheck = true;
// Create the handler
this.kCoreHandler = new HandlerKnowledgeCore( this.kCoreSlot.getStack() );
}
// Update the patterns
this.updatePatternSlots();
// Update the result
this.onCraftMatrixChanged( this.internalInventory );
}
// Create the handler
this.kCoreHandler = new HandlerKnowledgeCore();
}
/**
@@ -177,7 +155,7 @@ public class ContainerKnowledgeInscriber
CoreSaveState saveState;
// Is there a core handler?
if( this.kCoreHandler == null )
if( !this.kCoreHandler.hasCore() )
{
saveState = CoreSaveState.Disabled_MissingCore;
}
@@ -349,7 +327,7 @@ public class ContainerKnowledgeInscriber
Iterator<ItemStack> iterator = null;
// Get the list of stored pattern results
if( this.kCoreHandler != null )
if( this.kCoreHandler.hasCore() )
{
ArrayList<ItemStack> storedResults = this.kCoreHandler.getStoredOutputs();
iterator = storedResults.iterator();
@@ -400,45 +378,34 @@ public class ContainerKnowledgeInscriber
@Override
public void detectAndSendChanges()
{
if( this.player instanceof EntityPlayerMP )
{
// Has a core changed?
if( !this.kCoreHandler.isHandlingCore( this.kCoreSlot.getStack() ) )
{
if( this.kCoreSlot.getHasStack() )
{
// Setup the handler
this.kCoreHandler.open( this.kCoreSlot.getStack() );
}
else
{
// Close the handler
this.kCoreHandler.close();
}
// Update the slots
this.updatePatternSlots();
( (EntityPlayerMP)this.player ).isChangingQuantityOnly = false;
// Update the save state
this.sendSaveState( false );
}
}
// Call super
super.detectAndSendChanges();
// Ignore the rest of client side
if( EffectiveSide.isClientSide() )
{
return;
}
// Check for a kcore
boolean hasCore = this.kCoreSlot.getHasStack();
// Has a core been placed or removed?
if( hasCore != this.hadCoreLastCheck )
{
if( hasCore )
{
// Get the handler
this.kCoreHandler = new HandlerKnowledgeCore( this.kCoreSlot.getStack() );
}
else
{
// Remove the handler
this.kCoreHandler = null;
}
// Update the slots
this.updatePatternSlots();
// Update the save state
this.sendSaveState( false );
// Mark the inscriber as dirty
this.inscriber.markDirty();
}
// Mark the cores presence
this.hadCoreLastCheck = hasCore;
}
public void onClientRequestClearGrid()
@@ -601,58 +568,54 @@ public class ContainerKnowledgeInscriber
@Override
public ItemStack slotClick( final int slotID, final int buttonPressed, final int flag, final EntityPlayer player )
{
if( EffectiveSide.isServerSide() )
if( EffectiveSide.isClientSide() )
{
try
return null;
}
// Get the clicked slot
Slot clickedSlot = this.getSlot( slotID );
// Get the itemstack the player is holding with the mouse
ItemStack draggingStack = player.inventory.getItemStack();
// Was the clicked slot a crafting slot?
if( ( clickedSlot.slotNumber >= this.craftingSlot_first ) && ( clickedSlot.slotNumber <= this.craftingSlot_last ) )
{
// Is the player holding anything?
if( draggingStack != null )
{
// Get the clicked slot
Slot clickedSlot = this.getSlot( slotID );
ItemStack copiedStack = draggingStack.copy();
copiedStack.stackSize = 1;
// Get the itemstack the player is holding with the mouse
ItemStack draggingStack = player.inventory.getItemStack();
// Was the clicked slot a crafting slot?
if( ( clickedSlot.slotNumber >= this.craftingSlot_first ) && ( clickedSlot.slotNumber <= this.craftingSlot_last ) )
{
// Is the player holding anything?
if( draggingStack != null )
{
ItemStack copiedStack = draggingStack.copy();
copiedStack.stackSize = 1;
// Place a copy of the stack into the clicked slot
clickedSlot.putStack( copiedStack );
}
else
{
// Clear the slot
clickedSlot.putStack( null );
}
// Update the matrix
this.onCraftMatrixChanged( clickedSlot.inventory );
return draggingStack;
}
// Was the clicked slot a pattern slot?
else if( ( clickedSlot.slotNumber >= this.patternSlot_first ) && ( clickedSlot.slotNumber <= this.patternSlot_last ) )
{
// Does the slot correspond to a stored pattern?
if( clickedSlot.getHasStack() )
{
// Load the pattern
this.loadPattern( this.kCoreHandler.getPatternForItem( clickedSlot.getStack() ) );
// Update the matrix
this.onCraftMatrixChanged( clickedSlot.inventory );
}
return draggingStack;
}
// Place a copy of the stack into the clicked slot
clickedSlot.putStack( copiedStack );
}
catch( Exception e )
else
{
// Clear the slot
clickedSlot.putStack( null );
}
// Update the matrix
this.onCraftMatrixChanged( clickedSlot.inventory );
return draggingStack;
}
// Was the clicked slot a pattern slot?
else if( ( clickedSlot.slotNumber >= this.patternSlot_first ) && ( clickedSlot.slotNumber <= this.patternSlot_last ) )
{
// Does the slot correspond to a stored pattern?
if( clickedSlot.getHasStack() )
{
// Load the pattern
this.loadPattern( this.kCoreHandler.getPatternForItem( clickedSlot.getStack() ) );
// Update the matrix
this.onCraftMatrixChanged( clickedSlot.inventory );
}
return draggingStack;
}
// Pass to super
@@ -35,6 +35,7 @@ import appeng.api.config.Actionable;
import appeng.api.config.SortDir;
import appeng.api.config.SortOrder;
import appeng.api.config.ViewItems;
import appeng.api.networking.IGrid;
import appeng.api.networking.security.BaseActionSource;
import appeng.api.networking.security.PlayerSource;
import appeng.api.networking.storage.IBaseMonitor;
@@ -140,17 +141,17 @@ public class ContainerPartArcaneCraftingTerminal
*/
private final EntityPlayer player;
/**
* The AE network item monitor we are attached to.
*/
private final IMEMonitor<IAEItemStack> monitor;
/**
* Network source representing the player who is interacting with the
* container.
*/
private final PlayerSource playerSource;
/**
* The AE network item monitor we are attached to.
*/
private IMEMonitor<IAEItemStack> monitor;
/**
* Slot number of the first and last crafting slots.
*/
@@ -328,26 +329,51 @@ public class ContainerPartArcaneCraftingTerminal
}
// Is this server side?
if( EffectiveSide.isServerSide() )
{
// Register with part
// Register with terminal
this.registerForUpdates();
}
// Attach to the monitor
this.attachToMonitor();
}
/**
* Attempts to attach to the item monitor.
*
* @return
*/
private boolean attachToMonitor()
{
// Is this server side?
if( EffectiveSide.isClientSide() )
{
return false;
}
// Clear any existing
if( this.monitor != null )
{
this.monitor.removeListener( this );
}
// Get the grid
IGrid grid = this.terminal.getGridBlock().getGrid();
if( grid != null )
{
// Get the AE monitor
this.monitor = terminal.getItemInventory();
// Did we get a monitor?
this.monitor = this.terminal.getItemInventory();
if( this.monitor != null )
{
// Register with the monitor.
this.monitor.addListener( this, null );
this.monitor.addListener( this, grid.hashCode() );
return true;
}
}
else
{
this.monitor = null;
}
return false;
}
/**
@@ -906,6 +932,17 @@ public class ContainerPartArcaneCraftingTerminal
Packet_C_ArcaneCraftingTerminal.sendModeChange( this.player,
this.cachedSortOrder, this.cachedSortDirection, this.cachedViewMode );
}
// Is the monitor null?
if( this.monitor == null )
{
// Attempt to re-attach
if( this.attachToMonitor() )
{
// Update the client
this.onClientRequestFullUpdate( this.player );
}
}
}
/**
@@ -944,9 +981,36 @@ public class ContainerPartArcaneCraftingTerminal
@Override
public boolean isValid( final Object authToken )
{
return true;
if( this.monitor == null )
{
return false;
}
// Get the grid
IGrid grid = this.terminal.getGridBlock().getGrid();
if( grid != null )
{
if( grid.hashCode() == (Integer)authToken )
{
return true;
}
}
// Monitor no longer valid
this.monitor = null;
// Update client
this.onClientRequestFullUpdate( this.player );
return false;
}
/**
* Called when a client is setting up the crafting grid via NEI
*
* @param player
* @param gridItems
*/
public void onClientNEIRequestSetCraftingGrid( final EntityPlayer player, final IAEItemStack[] gridItems )
{
// Attempt to clear the crafting grid
@@ -1035,8 +1099,8 @@ public class ContainerPartArcaneCraftingTerminal
*/
public void onClientRequestDeposit( final EntityPlayer player, final int mouseButton )
{
// Ensure there is a player
if( player == null )
// Ensure there is a player & monitor
if( ( player == null ) || ( this.monitor == null ) )
{
return;
}
@@ -1176,8 +1240,8 @@ public class ContainerPartArcaneCraftingTerminal
*/
public void onClientRequestExtract( final EntityPlayer player, final IAEItemStack requestedStack, final int mouseButton, final boolean isShiftHeld )
{
// Ensure there is a player
if( player == null )
// Ensure there is a player and monitor
if( ( player == null ) || ( this.monitor == null ) )
{
return;
}
@@ -1326,6 +1390,11 @@ public class ContainerPartArcaneCraftingTerminal
// Send to the client
Packet_C_ArcaneCraftingTerminal.sendAllNetworkItems( player, fullList );
}
else
{
// Send empty list
Packet_C_ArcaneCraftingTerminal.sendAllNetworkItems( player, AEApi.instance().storage().createItemList() );
}
}
/**
@@ -1446,6 +1515,11 @@ public class ContainerPartArcaneCraftingTerminal
@Override
public void postChange( final IBaseMonitor<IAEItemStack> monitor, final Iterable<IAEItemStack> changes, final BaseActionSource actionSource )
{
if( this.monitor == null )
{
return;
}
for( IAEItemStack change : changes )
{
// Get the total amount of the item in the network
@@ -1484,6 +1558,11 @@ public class ContainerPartArcaneCraftingTerminal
*/
public ItemStack requestCraftingReplenishment( final ItemStack itemStack )
{
if( this.monitor == null )
{
return null;
}
// Create the request stack
IAEItemStack requestStack = AEApi.instance().storage().createItemStack( itemStack );
@@ -96,7 +96,7 @@ public class ContainerPartEssentiaIOBus
{
if( this.bus != null )
{
return this.bus.isUseableByPlayer( player );
return this.bus.isPartUseableByPlayer( player );
}
return false;
}
@@ -79,7 +79,7 @@ public class ContainerPartEssentiaLevelEmitter
{
if( this.emitter != null )
{
return this.emitter.isUseableByPlayer( player );
return this.emitter.isPartUseableByPlayer( player );
}
return false;
}
@@ -86,7 +86,7 @@ public class ContainerPartEssentiaStorageBus
{
if( this.storageBus != null )
{
return this.storageBus.isUseableByPlayer( player );
return this.storageBus.isPartUseableByPlayer( player );
}
return false;
}
@@ -50,7 +50,7 @@ public class ContainerPriority
}
else if( this.host instanceof ThEPartBase )
{
return ( (ThEPartBase)this.host ).isUseableByPlayer( player );
return ( (ThEPartBase)this.host ).isPartUseableByPlayer( player );
}
else if( this.host instanceof TileEntity )
{
@@ -1,10 +1,12 @@
package thaumicenergistics.common.container;
import javax.annotation.Nonnull;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import thaumcraft.api.aspects.Aspect;
import thaumicenergistics.api.grid.ICraftingIssuerHost;
import thaumicenergistics.api.grid.IMEEssentiaMonitor;
import thaumicenergistics.common.ThEGuiHandler;
import thaumicenergistics.common.ThaumicEnergistics;
import thaumicenergistics.common.inventory.HandlerWirelessEssentiaTerminal;
@@ -20,6 +22,7 @@ import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.config.Settings;
import appeng.api.config.ViewItems;
import appeng.api.networking.IGrid;
import appeng.api.networking.security.BaseActionSource;
import appeng.api.storage.data.IAEItemStack;
import appeng.container.ContainerOpenContext;
@@ -39,6 +42,7 @@ public class ContainerWirelessEssentiaTerminal
/**
* Handler used to interact with the wireless terminal.
*/
@Nonnull
private final HandlerWirelessEssentiaTerminal handler;
private Aspect tmpSelectedAspect;
@@ -74,7 +78,7 @@ public class ContainerWirelessEssentiaTerminal
* @param player
* @param handler
*/
public ContainerWirelessEssentiaTerminal( final EntityPlayer player, final HandlerWirelessEssentiaTerminal handler )
public ContainerWirelessEssentiaTerminal( final EntityPlayer player, final @Nonnull HandlerWirelessEssentiaTerminal handler )
{
// Call super
super( player );
@@ -88,20 +92,11 @@ public class ContainerWirelessEssentiaTerminal
// Set the handler
this.handler = handler;
// Server side?
if( EffectiveSide.isServerSide() )
{
// Set the monitor
this.monitor = this.handler.getEssentiaMonitor();
// Attach to the monitor
this.attachToMonitor();
}
else
// Client side?
if( EffectiveSide.isClientSide() )
{
// Request a full update from the server
Packet_S_EssentiaCellTerminal.sendFullUpdateRequest( player );
this.hasRequested = true;
}
}
@@ -111,12 +106,31 @@ public class ContainerWirelessEssentiaTerminal
return this.handler.getActionHost();
}
@Override
protected IGrid getHostGrid()
{
try
{
return this.handler.getActionableNode().getGrid();
}
catch( Exception e )
{
return null;
}
}
@Override
protected Aspect getHostSelectedAspect()
{
return this.tmpSelectedAspect;
}
@Override
protected IMEEssentiaMonitor getNewMonitor()
{
return this.handler.getEssentiaMonitor();
}
@Override
protected void setHostSelectedAspect( final Aspect aspect )
{
@@ -6,10 +6,7 @@ import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.research.ResearchPage;
import thaumicenergistics.api.ThEApi;
import thaumicenergistics.common.registries.AEPartsEnum;
import thaumicenergistics.common.registries.FeatureRegistry;
import thaumicenergistics.common.registries.RecipeRegistry;
import thaumicenergistics.common.registries.ResearchRegistry;
import thaumicenergistics.common.registries.*;
import thaumicenergistics.common.registries.ResearchRegistry.ResearchTypes;
import appeng.core.AEConfig;
import appeng.core.features.AEFeature;
@@ -37,11 +34,8 @@ public class FeatureACT
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// My items
ItemStack ArcaneCraftingTerminal = ThEApi.instance().parts().ArcaneCrafting_Terminal.getStack();
@@ -60,7 +54,8 @@ public class FeatureACT
Object[] actRecipe = new Object[] { cdi.METerminal, cdi.ArcaneWorkTable, cdi.CalculationProcessor };
// Register
RecipeRegistry.PART_ARCANE_TERMINAL = ThaumcraftApi.addShapelessArcaneCraftingRecipe( ResearchRegistry.ResearchTypes.ARCANE_TERMINAL.getKey(),
RecipeRegistry.PART_ARCANE_TERMINAL = ThaumcraftApi.addShapelessArcaneCraftingRecipe(
ResearchRegistry.ResearchTypes.ARCANE_TERMINAL.getKey(),
ArcaneCraftingTerminal, actAspectList, actRecipe );
}
@@ -44,11 +44,8 @@ public class FeatureAutocrafting_Arcane
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// Thaumcraft items
ItemStack CraftingScepter = VisCraftingHelper.INSTANCE.getCraftingScepter();
@@ -36,11 +36,8 @@ public class FeatureAutocrafting_Essentia
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// My items
ItemStack dpeStack = ThEApi.instance().blocks().DistillationPatternEncoder.getStack();
@@ -15,9 +15,7 @@ import thaumcraft.api.research.ResearchPage;
import thaumcraft.common.config.Config;
import thaumicenergistics.api.IThEItems;
import thaumicenergistics.api.ThEApi;
import thaumicenergistics.common.registries.FeatureRegistry;
import thaumicenergistics.common.registries.RecipeRegistry;
import thaumicenergistics.common.registries.ResearchRegistry;
import thaumicenergistics.common.registries.*;
import thaumicenergistics.common.registries.ResearchRegistry.PseudoResearchTypes;
import thaumicenergistics.common.registries.ResearchRegistry.ResearchTypes;
import appeng.core.AEConfig;
@@ -78,11 +76,8 @@ public class FeatureCells
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// My items
IThEItems theItems = ThEApi.instance().items();
ItemStack EssentiaStorageComponent_1k = theItems.EssentiaStorageComponent_1k.getStack();
@@ -8,9 +8,7 @@ import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.research.ResearchPage;
import thaumicenergistics.api.ThEApi;
import thaumicenergistics.common.items.ItemMaterial;
import thaumicenergistics.common.registries.FeatureRegistry;
import thaumicenergistics.common.registries.RecipeRegistry;
import thaumicenergistics.common.registries.ResearchRegistry;
import thaumicenergistics.common.registries.*;
import thaumicenergistics.common.registries.ResearchRegistry.PseudoResearchTypes;
import thaumicenergistics.common.registries.ResearchRegistry.ResearchTypes;
@@ -31,12 +29,8 @@ public class FeatureConversionCores
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// My items
ItemStack DiffusionCore = ThEApi.instance().items().DiffusionCore.getStack();
ItemStack CoalescenceCore = ThEApi.instance().items().CoalescenceCore.getStack();
@@ -8,10 +8,7 @@ import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.research.ResearchPage;
import thaumicenergistics.api.ThEApi;
import thaumicenergistics.common.registries.AEPartsEnum;
import thaumicenergistics.common.registries.FeatureRegistry;
import thaumicenergistics.common.registries.RecipeRegistry;
import thaumicenergistics.common.registries.ResearchRegistry;
import thaumicenergistics.common.registries.*;
import thaumicenergistics.common.registries.ResearchRegistry.PseudoResearchTypes;
import thaumicenergistics.common.registries.ResearchRegistry.ResearchTypes;
import appeng.core.AEConfig;
@@ -39,11 +36,8 @@ public class FeatureEssentiaIOBuses
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// My items
ItemStack DiffusionCore = ThEApi.instance().items().DiffusionCore.getStack();
ItemStack CoalescenceCore = ThEApi.instance().items().CoalescenceCore.getStack();
@@ -39,11 +39,8 @@ public class FeatureEssentiaMonitoring
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// My items
IThEItems theItems = ThEApi.instance().items();
IThEParts theParts = ThEApi.instance().parts();
@@ -6,10 +6,7 @@ import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.research.ResearchPage;
import thaumicenergistics.api.ThEApi;
import thaumicenergistics.common.registries.BlockEnum;
import thaumicenergistics.common.registries.FeatureRegistry;
import thaumicenergistics.common.registries.RecipeRegistry;
import thaumicenergistics.common.registries.ResearchRegistry;
import thaumicenergistics.common.registries.*;
import thaumicenergistics.common.registries.ResearchRegistry.ResearchTypes;
public class FeatureEssentiaProvider
@@ -34,12 +31,8 @@ public class FeatureEssentiaProvider
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// My items
ItemStack DiffusionCore = ThEApi.instance().items().DiffusionCore.getStack();
ItemStack CoalescenceCore = ThEApi.instance().items().CoalescenceCore.getStack();
@@ -36,11 +36,8 @@ public class FeatureEssentiaVibrationChamber
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// My Items
ItemStack EssVibrationChamber = ThEApi.instance().blocks().EssentiaVibrationChamber.getStack();
ItemStack DiffusionCore = ThEApi.instance().items().DiffusionCore.getStack();
@@ -54,7 +51,8 @@ public class FeatureEssentiaVibrationChamber
// Register Chamber
RecipeRegistry.BLOCK_ESSENTIA_VIBRATION_CHAMBER = ThaumcraftApi.addShapelessArcaneCraftingRecipe(
ResearchTypes.ESSENTIA_VIBRATION_CHAMBER.getKey(), EssVibrationChamber, chamberAspects, cdi.VibrationChamber, DiffusionCore, cdi.WardedJar );
ResearchTypes.ESSENTIA_VIBRATION_CHAMBER.getKey(), EssVibrationChamber, chamberAspects, cdi.VibrationChamber, DiffusionCore,
cdi.WardedJar );
}
@Override
@@ -9,7 +9,6 @@ import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.research.ResearchPage;
import thaumicenergistics.api.ThEApi;
import thaumicenergistics.common.registries.FeatureRegistry;
import thaumicenergistics.common.registries.RecipeRegistry;
import thaumicenergistics.common.registries.ResearchRegistry;
import thaumicenergistics.common.registries.ResearchRegistry.PseudoResearchTypes;
@@ -25,11 +24,8 @@ public class FeatureGearbox
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// Ore dictionary items
Object WoodGear = "gearWood";
String IronGear = "gearIron";
@@ -8,10 +8,7 @@ import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.research.ResearchPage;
import thaumcraft.common.config.Config;
import thaumicenergistics.api.ThEApi;
import thaumicenergistics.common.registries.BlockEnum;
import thaumicenergistics.common.registries.FeatureRegistry;
import thaumicenergistics.common.registries.RecipeRegistry;
import thaumicenergistics.common.registries.ResearchRegistry;
import thaumicenergistics.common.registries.*;
import thaumicenergistics.common.registries.ResearchRegistry.PseudoResearchTypes;
import thaumicenergistics.common.registries.ResearchRegistry.ResearchTypes;
@@ -37,11 +34,8 @@ public class FeatureInfusionProvider
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// My items
ItemStack CoalescenceCore = ThEApi.instance().items().CoalescenceCore.getStack();
ItemStack InfusionProvider = ThEApi.instance().blocks().InfusionProvider.getStack();
@@ -8,9 +8,7 @@ import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.research.ResearchPage;
import thaumicenergistics.api.ThEApi;
import thaumicenergistics.common.registries.FeatureRegistry;
import thaumicenergistics.common.registries.RecipeRegistry;
import thaumicenergistics.common.registries.ResearchRegistry;
import thaumicenergistics.common.registries.*;
import thaumicenergistics.common.registries.ResearchRegistry.PseudoResearchTypes;
import thaumicenergistics.common.registries.ResearchRegistry.ResearchTypes;
import appeng.api.AEApi;
@@ -36,7 +34,7 @@ public class FeatureQuartzDupe
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Certus
String Certus1 = "crystalCertusQuartz";
@@ -1,5 +1,6 @@
package thaumicenergistics.common.features;
import java.util.ArrayList;
import net.minecraft.util.ResourceLocation;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.research.ResearchCategories;
@@ -58,7 +59,7 @@ public class FeatureResearchSetup
*
* @param featureList
*/
public void finalizeRegistration( final ThEFeatureBase[] featureList )
public void finalizeRegistration( final ArrayList<ThEFeatureBase> featureList )
{
if( this.hasFinalizedResearch )
{
@@ -0,0 +1,125 @@
package thaumicenergistics.common.features;
import java.util.regex.Pattern;
import net.minecraft.block.Block;
import net.minecraftforge.common.config.Property;
import thaumcraft.common.config.Config;
import thaumcraft.common.config.ConfigBlocks;
import thaumicenergistics.api.ThEApi;
import appeng.core.FacadeConfig;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier;
public class FeatureThaumcraftFacades
extends ThEDependencyFeatureBase
{
/**
* Ensures the blocks name is clean
*/
private final Pattern sanitizer;
public FeatureThaumcraftFacades()
{
// Set the pattern
this.sanitizer = Pattern.compile( "[^a-zA-Z0-9]" );
}
/**
* Forces the specified stack to have a facade if possible.
*
* @param block
* @param meta
*/
private void forceEnabled( final Block block, final int meta )
{
// Sanity check
if( block == null )
{
return;
}
// Get the uid for the block
UniqueIdentifier uid = GameRegistry.findUniqueIdentifierFor( block );
if( uid == null )
{
return;
}
// Get the mod and block names
String modName = this.sanitizer.matcher( uid.modId ).replaceAll( "" );
String blockName = this.sanitizer.matcher( uid.name ).replaceAll( "" );
// Get the property
Property prop = FacadeConfig.instance.get( modName, blockName + ( meta == 0 ? "" : "." + meta ), true );
// Set it to true
prop.set( true );
}
@Override
protected boolean checkConfigs()
{
return ThEApi.instance().config().forceTCFacades();
}
@Override
protected Object[] getItemReqs( final CommonDependantItems cdi )
{
return null;
}
@Override
protected void registerCrafting( final CommonDependantItems cdi )
{
// Amber block
this.forceEnabled( ConfigBlocks.blockCosmeticOpaque, 0 );
// Amber brick
this.forceEnabled( ConfigBlocks.blockCosmeticOpaque, 1 );
// Warded glass
if( Config.allowMirrors )
{
this.forceEnabled( ConfigBlocks.blockCosmeticOpaque, 2 );
}
// Obsidian tile
this.forceEnabled( ConfigBlocks.blockCosmeticSolid, 1 );
// Thaumium block
this.forceEnabled( ConfigBlocks.blockCosmeticSolid, 4 );
// Tallow block
this.forceEnabled( ConfigBlocks.blockCosmeticSolid, 5 );
// Arcane stone block
this.forceEnabled( ConfigBlocks.blockCosmeticSolid, 6 );
// Arcane stone brick
this.forceEnabled( ConfigBlocks.blockCosmeticSolid, 7 );
// Ancient stone
this.forceEnabled( ConfigBlocks.blockCosmeticSolid, 11 );
// Ancient rock
this.forceEnabled( ConfigBlocks.blockCosmeticSolid, 12 );
// Crusted stone
this.forceEnabled( ConfigBlocks.blockCosmeticSolid, 14 );
// Greatwood planks
this.forceEnabled( ConfigBlocks.blockWoodenDevice, 6 );
// Silverwood planks
this.forceEnabled( ConfigBlocks.blockWoodenDevice, 7 );
// Crusted taint
this.forceEnabled( ConfigBlocks.blockTaint, 0 );
// Flesh block :<
this.forceEnabled( ConfigBlocks.blockTaint, 2 );
}
}
@@ -7,10 +7,7 @@ import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.research.ResearchPage;
import thaumicenergistics.api.ThEApi;
import thaumicenergistics.common.registries.AEPartsEnum;
import thaumicenergistics.common.registries.FeatureRegistry;
import thaumicenergistics.common.registries.RecipeRegistry;
import thaumicenergistics.common.registries.ResearchRegistry;
import thaumicenergistics.common.registries.*;
import thaumicenergistics.common.registries.ResearchRegistry.PseudoResearchTypes;
import thaumicenergistics.common.registries.ResearchRegistry.ResearchTypes;
import appeng.core.AEConfig;
@@ -38,11 +35,8 @@ public class FeatureVisRelayInterface
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// My items
ItemStack VisInterface = ThEApi.instance().parts().VisRelay_Interface.getStack();
@@ -54,7 +48,8 @@ public class FeatureVisRelayInterface
visInterfaceAspectList.add( Aspect.FIRE, 2 );
visInterfaceAspectList.add( Aspect.ORDER, 2 );
visInterfaceAspectList.add( Aspect.WATER, 2 );
RecipeRegistry.PART_VIS_INTERFACE = ThaumcraftApi.addShapelessArcaneCraftingRecipe( ResearchRegistry.ResearchTypes.VIS_RELAY_INTERFACE.getKey(),
RecipeRegistry.PART_VIS_INTERFACE = ThaumcraftApi.addShapelessArcaneCraftingRecipe(
ResearchRegistry.ResearchTypes.VIS_RELAY_INTERFACE.getKey(),
VisInterface, visInterfaceAspectList, cdi.BallanceShard, cdi.MEP2P );
}
@@ -73,7 +68,8 @@ public class FeatureVisRelayInterface
// Set the pages
ResearchPage[] vriPages = new ResearchPage[] { new ResearchPage( ResearchTypes.VIS_RELAY_INTERFACE.getPageName( 1 ) ),
new ResearchPage( RecipeRegistry.PART_VIS_INTERFACE ), new ResearchPage( ResearchTypes.VIS_RELAY_INTERFACE.getPageName( 2 ) ),
new ResearchPage( RecipeRegistry.PART_VIS_INTERFACE ),
new ResearchPage( ResearchTypes.VIS_RELAY_INTERFACE.getPageName( 2 ) ),
new ResearchPage( ResearchTypes.VIS_RELAY_INTERFACE.getPageName( 3 ) ) };
// Create the vis relay interface research
@@ -7,7 +7,6 @@ import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.research.ResearchPage;
import thaumicenergistics.api.ThEApi;
import thaumicenergistics.common.registries.FeatureRegistry;
import thaumicenergistics.common.registries.RecipeRegistry;
import thaumicenergistics.common.registries.ResearchRegistry;
import thaumicenergistics.common.registries.ResearchRegistry.PseudoResearchTypes;
@@ -43,11 +42,8 @@ public class FeatureWrenchFocus
}
@Override
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
// Common items
CommonDependantItems cdi = FeatureRegistry.instance().getCommonItems();
// My items
ItemStack WrenchFocus = ThEApi.instance().items().WandFocusAEWrench.getStack();
@@ -1,6 +1,5 @@
package thaumicenergistics.common.features;
import thaumicenergistics.common.registries.FeatureRegistry;
/**
* Defines a feature that depends on a configuration setting and/or specific
@@ -60,12 +59,12 @@ public abstract class ThEDependencyFeatureBase
/**
* Evaluates the dependencies of the feature and enables it if possible.
*
* @param fr
* @param cdi
*/
public final void evaluateDependencies( final FeatureRegistry fr )
public final void evaluateDependencies( final CommonDependantItems cdi )
{
// Ask for the features config settings and required items
this.setAvailable( this.checkConfigs() && this.checkItemReqs( this.getItemReqs( fr.getCommonItems() ) ) );
this.setAvailable( this.checkConfigs() && this.checkItemReqs( this.getItemReqs( cdi ) ) );
}
}
@@ -34,8 +34,10 @@ public abstract class ThEFeatureBase
/**
* Registers the features crafting recipes, if it has any.
*
* @param cdi
*/
protected void registerCrafting()
protected void registerCrafting( final CommonDependantItems cdi )
{
}
@@ -94,14 +96,16 @@ public abstract class ThEFeatureBase
/**
* Asks the feature to register itself.
*
* @param cdi
*/
public final void registerFeature()
public final void registerFeature( final CommonDependantItems cdi )
{
// Is the feature enabled and has not yet been registered?
if( this.isAvailable() && !this.hasRegistered )
{
// Register crafting recipe(s)
this.registerCrafting();
this.registerCrafting( cdi );
// Register Thaumcraft research.
this.registerResearch();
@@ -276,16 +276,6 @@ public class EssentiaMonitor
@SuppressWarnings("null")
protected void updateCacheToMatchNetwork()
{
// Get the list of fluids in the network
IItemList<IAEFluidStack> fluidStackList;
// Validate the list
if( ( fluidStackList = this.fluidMonitor.getStorageList() ) == null )
{
// Invalid list
return;
}
// Changes made to the cache
List<IAspectStack> aspectChanges = null;
@@ -307,38 +297,46 @@ public class EssentiaMonitor
this.cache.clear();
}
// Loop over all fluids
for( IAEFluidStack fluidStack : fluidStackList )
// Is the network powerd?
if( this.energyGrid.isNetworkPowered() )
{
// Ensure the fluid is an essentia gas
if( !( fluidStack.getFluid() instanceof GaseousEssentia ) )
// Get the list of fluids in the network
IItemList<IAEFluidStack> fluidStackList = this.fluidMonitor.getStorageList();
// Loop over all fluids
for( IAEFluidStack fluidStack : fluidStackList )
{
// Not an essentia gas.
continue;
}
// Get the gas aspect
Aspect aspect = ( (GaseousEssentia)fluidStack.getFluid() ).getAspect();
// Calculate the new amount
Long newAmount = EssentiaConversionHelper.INSTANCE.convertFluidAmountToEssentiaAmount( fluidStack.getStackSize() );
// Update the cache
IAspectStack prevStack = this.cache.setAspect( aspect, newAmount, false );
// Are there any listeners?
if( hasListeners )
{
// Remove from the previous mapping
previousAspects.remove( aspect );
// Calculate the difference
long diff = ( newAmount - ( prevStack != null ? prevStack.getStackSize() : 0 ) );
if( diff != 0 )
// Ensure the fluid is an essentia gas
if( !( fluidStack.getFluid() instanceof GaseousEssentia ) )
{
// Add to the changes
aspectChanges.add( new AspectStack( aspect, diff ) );
// Not an essentia gas.
continue;
}
// Get the gas aspect
Aspect aspect = ( (GaseousEssentia)fluidStack.getFluid() ).getAspect();
// Calculate the new amount
Long newAmount = EssentiaConversionHelper.INSTANCE.convertFluidAmountToEssentiaAmount( fluidStack.getStackSize() );
// Update the cache
IAspectStack prevStack = this.cache.setAspect( aspect, newAmount, false );
// Are there any listeners?
if( hasListeners )
{
// Remove from the previous mapping
previousAspects.remove( aspect );
// Calculate the difference
long diff = ( newAmount - ( prevStack != null ? prevStack.getStackSize() : 0 ) );
if( diff != 0 )
{
// Add to the changes
aspectChanges.add( new AspectStack( aspect, diff ) );
}
}
}
}
@@ -349,7 +347,7 @@ public class EssentiaMonitor
// Anything left in the previous mapping is no longer present in the network
for( Aspect aspect : previousAspects )
{
aspectChanges.add( new AspectStack( aspect, -this.cache.remove( aspect ).getStackSize() ) );
aspectChanges.add( new AspectStack( aspect, -this.cache.remove( aspect ).getStackSize(), false ) );
}
// Notify listeners
@@ -295,6 +295,12 @@ public class GridEssentiaCache
// Call super
super.updateCacheToMatchNetwork();
// Is the network powered?
if( !this.energyGrid.isNetworkPowered() )
{
return;
}
// Get the item monitor
IStorageGrid storage = (IStorageGrid)this.internalGrid.getCache( IStorageGrid.class );
IMEMonitor<IAEItemStack> itemMonitor = storage.getItemInventory();
@@ -23,20 +23,29 @@ public class HandlerKnowledgeCore
/**
* Array of stored patterns.
*/
private ArrayList<ArcaneCraftingPattern> patterns = new ArrayList<ArcaneCraftingPattern>( HandlerKnowledgeCore.MAXIMUM_STORED_PATTERNS );
private final ArrayList<ArcaneCraftingPattern> patterns = new ArrayList<ArcaneCraftingPattern>( MAXIMUM_STORED_PATTERNS );
/**
* Knowledge core being handled.
*/
private ItemStack kCore;
/**
* Creates a handler without a core.
* Use open() to set the core in the future.
*/
public HandlerKnowledgeCore()
{
}
/**
* Creates the handler with the specified core.
*
* @param kCore
*/
public HandlerKnowledgeCore( final ItemStack kCore )
{
// Set the kCore
this.kCore = kCore;
// Load
this.loadKCoreData();
this.open( kCore );
}
/**
@@ -66,10 +75,10 @@ public class HandlerKnowledgeCore
NBTTagCompound data = this.getOrCreateNBT();
// Are there saved patterns?
if( data.hasKey( HandlerKnowledgeCore.NBTKEY_PATTERNS ) )
if( data.hasKey( NBTKEY_PATTERNS ) )
{
// Get the list
NBTTagList plist = data.getTagList( HandlerKnowledgeCore.NBTKEY_PATTERNS, Constants.NBT.TAG_COMPOUND );
NBTTagList plist = data.getTagList( NBTKEY_PATTERNS, Constants.NBT.TAG_COMPOUND );
// Read in each pattern
for( int index = 0; index < plist.tagCount(); index++ )
@@ -122,7 +131,7 @@ public class HandlerKnowledgeCore
// Write the list to the data
if( plist.tagCount() > 0 )
{
data.setTag( HandlerKnowledgeCore.NBTKEY_PATTERNS, plist );
data.setTag( NBTKEY_PATTERNS, plist );
}
}
@@ -226,6 +235,16 @@ public class HandlerKnowledgeCore
return results;
}
/**
* Returns true if the handler has a core.
*
* @return
*/
public boolean hasCore()
{
return this.kCore != null;
}
/**
* Returns true if there is a pattern stored that produces the specified
* result.
@@ -280,6 +299,23 @@ public class HandlerKnowledgeCore
return( ItemStack.areItemStacksEqual( kCore, this.kCore ) && ( ItemStack.areItemStackTagsEqual( kCore, this.kCore ) ) );
}
/**
* Closes the previous core, and opens the new core.
*
* @param kCore
*/
public void open( final ItemStack kCore )
{
// Close any existing core
this.close();
// Set the kCore
this.kCore = kCore;
// Load
this.loadKCoreData();
}
/**
* Removes the specified pattern from the core.
*
@@ -531,6 +531,12 @@ public class PartArcaneCraftingTerminal
return false;
}
@Override
public boolean isUseableByPlayer( final EntityPlayer player )
{
return this.isPartUseableByPlayer( player );
}
@Override
public void launchGUI( final EntityPlayer player )
{
@@ -448,6 +448,56 @@ public abstract class ThEPartBase
return false;
}
/**
* Called the player interact with this part?
*
* @param player
* @return
*/
public final boolean isPartUseableByPlayer( final EntityPlayer player )
{
// Null check host
if( ( this.hostTile == null ) || ( this.host == null ) )
{
return false;
}
// Does the host still exist in the world and the player in range of it?
if( !ThEUtils.canPlayerInteractWith( player, this.hostTile ) )
{
return false;
}
// Is the part still attached?
if( this.host.getPart( this.cableSide ) != this )
{
return false;
}
// Are there any permissions to check?
if( this.interactionPermissions != null )
{
// Get the security grid
ISecurityGrid sGrid = this.gridBlock.getSecurityGrid();
if( sGrid == null )
{
// Security grid was unaccessible.
return false;
}
// Check each permission
for( SecurityPermissions perm : this.interactionPermissions )
{
if( !sGrid.hasPermission( player, perm ) )
{
return false;
}
}
}
return true;
}
@Override
public boolean isPowered()
{
@@ -497,56 +547,6 @@ public abstract class ThEPartBase
return false;
}
/**
* Called the player interact with this part?
*
* @param player
* @return
*/
public final boolean isUseableByPlayer( final EntityPlayer player )
{
// Null check host
if( ( this.hostTile == null ) || ( this.host == null ) )
{
return false;
}
// Does the host still exist in the world and the player in range of it?
if( !ThEUtils.canPlayerInteractWith( player, this.hostTile ) )
{
return false;
}
// Is the part still attached?
if( this.host.getPart( this.cableSide ) != this )
{
return false;
}
// Are there any permissions to check?
if( this.interactionPermissions != null )
{
// Get the security grid
ISecurityGrid sGrid = this.gridBlock.getSecurityGrid();
if( sGrid == null )
{
// Security grid was unaccessible.
return false;
}
// Check each permission
for( SecurityPermissions perm : this.interactionPermissions )
{
if( !sGrid.hasPermission( player, perm ) )
{
return false;
}
}
}
return true;
}
/**
* Marks that the host tile needs to be saved to disk.
*/
@@ -1,5 +1,6 @@
package thaumicenergistics.common.registries;
import java.util.ArrayList;
import thaumicenergistics.common.features.*;
/**
@@ -23,9 +24,9 @@ public class FeatureRegistry
private final CommonDependantItems commonItems;
/**
* All features in a nice compact array.
* All features.
*/
private final ThEFeatureBase[] featuresList;
private final ArrayList<ThEFeatureBase> featuresList = new ArrayList<ThEFeatureBase>( 20 );
/**
* Set to true when registerFeatures() is called.
@@ -107,6 +108,11 @@ public class FeatureRegistry
*/
public final FeatureAutocrafting_Essentia featureAutocrafting_Essentia;
/**
* Thaumcraft facades.
*/
public final FeatureThaumcraftFacades featureTCFacades;
/**
* Private constructor
*/
@@ -119,52 +125,49 @@ public class FeatureRegistry
this.featureResearchSetup = new FeatureResearchSetup();
// Build autocrafting
this.featureAutoCrafting_Arcane = new FeatureAutocrafting_Arcane();
this.featuresList.add( this.featureAutoCrafting_Arcane = new FeatureAutocrafting_Arcane() );
// Build cells
this.featureCells = new FeatureCells();
this.featuresList.add( this.featureCells = new FeatureCells() );
// Build ACT
this.featureACT = new FeatureACT();
this.featuresList.add( this.featureACT = new FeatureACT() );
// Build VRI
this.featureVRI = new FeatureVisRelayInterface();
this.featuresList.add( this.featureVRI = new FeatureVisRelayInterface() );
// Build IO buses
this.featureEssentiaIOBuses = new FeatureEssentiaIOBuses();
this.featuresList.add( this.featureEssentiaIOBuses = new FeatureEssentiaIOBuses() );
// Build infusion provider
this.featureInfusionProvider = new FeatureInfusionProvider();
this.featuresList.add( this.featureInfusionProvider = new FeatureInfusionProvider() );
// Build essentia provider
this.featureEssentiaProvider = new FeatureEssentiaProvider();
this.featuresList.add( this.featureEssentiaProvider = new FeatureEssentiaProvider() );
// Build monitoring
this.featureEssentiaMonitoring = new FeatureEssentiaMonitoring();
this.featuresList.add( this.featureEssentiaMonitoring = new FeatureEssentiaMonitoring() );
// Build conversion cores
this.featureConversionCores = new FeatureConversionCores();
this.featuresList.add( this.featureConversionCores = new FeatureConversionCores() );
// Build gearboxes
this.featureGearbox = new FeatureGearbox();
this.featuresList.add( this.featureGearbox = new FeatureGearbox() );
// Build wrench focus
this.featureWrenchFocus = new FeatureWrenchFocus();
this.featuresList.add( this.featureWrenchFocus = new FeatureWrenchFocus() );
// Build quartz dupe
this.featureQuartzDupe = new FeatureQuartzDupe();
this.featuresList.add( this.featureQuartzDupe = new FeatureQuartzDupe() );
// Build essentia vibration chamber
this.featureEssentiaVibrationChamber = new FeatureEssentiaVibrationChamber();
this.featuresList.add( this.featureEssentiaVibrationChamber = new FeatureEssentiaVibrationChamber() );
// Build distillation pattern encoder
this.featureAutocrafting_Essentia = new FeatureAutocrafting_Essentia();
this.featuresList.add( this.featureAutocrafting_Essentia = new FeatureAutocrafting_Essentia() );
// Build array of features
this.featuresList = new ThEFeatureBase[] { this.featureAutoCrafting_Arcane, this.featureCells, this.featureACT, this.featureVRI,
this.featureEssentiaIOBuses, this.featureInfusionProvider, this.featureEssentiaProvider, this.featureEssentiaMonitoring,
this.featureConversionCores, this.featureGearbox, this.featureWrenchFocus, this.featureQuartzDupe,
this.featureEssentiaVibrationChamber, this.featureAutocrafting_Essentia };
// Build TC facades
this.featuresList.add( this.featureTCFacades = new FeatureThaumcraftFacades() );
}
/**
@@ -214,18 +217,18 @@ public class FeatureRegistry
if( feature instanceof ThEDependencyFeatureBase )
{
// Evaluate the dependencies
( (ThEDependencyFeatureBase)feature ).evaluateDependencies( this );
( (ThEDependencyFeatureBase)feature ).evaluateDependencies( this.commonItems );
}
}
// Start with the setup
this.featureResearchSetup.registerFeature();
this.featureResearchSetup.registerFeature( this.commonItems );
// Register each feature
for( ThEFeatureBase feature : this.featuresList )
{
// Attempt to register the feature
feature.registerFeature();
feature.registerFeature( this.commonItems );
}
// Finish the registration
@@ -9,11 +9,6 @@ public class TileKnowledgeInscriber
extends ThETileInventory
{
public static final int KCORE_SLOT = 0;
/*
public static final int PATTERN_SLOT = KCORE_SLOT + 1;
public static final int CRAFTING_MATRIX_SLOT = HandlerKnowledgeCore.MAXIMUM_STORED_PATTERNS + PATTERN_SLOT;
public static final int CRAFTING_RESULT_SLOT = CRAFTING_MATRIX_SLOT + 9;
*/
private static final String NBTKEY_KCORE = "kcore";