reworked blocking mode. now items are configurable per mod

This commit is contained in:
PrototypeTrousers
2022-02-09 20:34:31 -03:00
parent c3a608ef59
commit 6d25b7ef3c
11 changed files with 295 additions and 176 deletions
@@ -23,7 +23,7 @@ import java.util.*;
import javax.annotation.Nullable;
import appeng.integration.modules.gregtech.GTCEInventoryAdaptor;
import appeng.util.inv.BlockingInventoryAdaptor;
import appeng.util.*;
import appeng.util.inv.*;
import com.google.common.collect.ImmutableSet;
@@ -32,7 +32,6 @@ import com.google.common.primitives.Ints;
import de.ellpeck.actuallyadditions.api.tile.IPhantomTile;
import gregtech.api.block.machines.BlockMachine;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.metatileentity.MetaTileEntityHolder;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Items;
@@ -140,7 +139,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
private final Accessor accessor = new Accessor();
private EnumSet<EnumFacing> visitedFaces = EnumSet.noneOf( EnumFacing.class );
private EnumMap<EnumFacing, List<ItemStack>> waitingToSendFacing = new EnumMap<>( EnumFacing.class );
private GTCEInventoryAdaptor GTad;
private BlockingInventoryAdaptor blockingInventoryAdaptor;
private boolean resetConfigCache = true;
private IMEMonitor<IAEItemStack> configCachedHandler;
@@ -887,7 +886,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
}
}
}
if( this.craftingTracker.isBusy( x ) )
{
changed = this.handleCrafting( x, adaptor, itemStack ) || changed;
@@ -1108,9 +1107,9 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
return ( inv.containsItems() );
}
private static boolean invIsBlockedGTCE( GTCEInventoryAdaptor inv )
private static boolean invIsCustomBlocking( BlockingInventoryAdaptor inv )
{
return ( !inv.canRemoveAllExceptCircuits() );
return ( inv.containsBlockingItems() );
}
@Override
@@ -1167,24 +1166,26 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
{
if( this.isBlocking() )
{
IPhantomTile phantomTE = null;
if( Loader.isModLoaded( "actuallyadditions" ) && Loader.isModLoaded( "gregtech" ) && te instanceof IPhantomTile )
IPhantomTile phantomTE;
if( Loader.isModLoaded( "actuallyadditions" ) && te instanceof IPhantomTile )
{
phantomTE = ( (IPhantomTile) te );
if( phantomTE.hasBoundPosition() )
{
TileEntity phantom = w.getTileEntity( phantomTE.getBoundPosition() );
if( phantom instanceof MetaTileEntityHolder && isGTCEblocked( phantom, s ) )
if( NonBlockingItems.INSTANCE.getMap().containsKey( phantom.getBlockType().getRegistryName().getResourceDomain() ) )
{
visitedFaces.remove( s );
continue;
if( isCustomInvBlocking( phantom, s ) )
{
visitedFaces.remove( s );
continue;
}
}
}
}
else if( Loader.isModLoaded( "gregtech" ) && te instanceof MetaTileEntityHolder )
else if( NonBlockingItems.INSTANCE.getMap().containsKey( te.getBlockType().getRegistryName().getResourceDomain() ) )
{
if( isGTCEblocked( te, s ) )
if( isCustomInvBlocking( te, s ) )
{
visitedFaces.remove( s );
continue;
@@ -1239,7 +1240,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
for( final EnumFacing s : possibleDirections )
{
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
IPhantomTile phantomTE = null;
IPhantomTile phantomTE;
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
if( ad != null )
@@ -1250,17 +1251,20 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
if( phantomTE.hasBoundPosition() )
{
TileEntity phantom = w.getTileEntity( phantomTE.getBoundPosition() );
if( phantom instanceof MetaTileEntityHolder && !isGTCEblocked( phantom, s ) )
if( NonBlockingItems.INSTANCE.getMap().containsKey( phantom.getBlockType().getRegistryName().getResourceDomain() ) )
{
allAreBusy = false;
break;
if( !isCustomInvBlocking( phantom, s ) )
{
allAreBusy = false;
break;
}
}
}
}
else if( Loader.isModLoaded( "gregtech" ) && te instanceof MetaTileEntityHolder )
else if( NonBlockingItems.INSTANCE.getMap().containsKey( te.getBlockType().getRegistryName().getResourceDomain() ) )
{
if( !isGTCEblocked( te, s ) )
if( !isCustomInvBlocking( te, s ) )
{
allAreBusy = false;
break;
@@ -1279,10 +1283,10 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
return busy;
}
boolean isGTCEblocked( TileEntity te, EnumFacing s )
boolean isCustomInvBlocking( TileEntity te, EnumFacing s )
{
GTad = GTCEInventoryAdaptor.getAdaptor( te, s.getOpposite() );
return invIsBlockedGTCE( GTad );
blockingInventoryAdaptor = BlockingInventoryAdaptor.getAdaptor( te, s.getOpposite() );
return invIsCustomBlocking( blockingInventoryAdaptor );
}
private boolean sameGrid( final IGrid grid ) throws GridAccessException
@@ -0,0 +1,86 @@
package appeng.helpers;
import appeng.api.AEApi;
import appeng.api.storage.channels.IItemStorageChannel;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
import appeng.core.AEConfig;
import appeng.core.AELog;
import appeng.util.item.AEItemStack;
import gregtech.api.items.metaitem.MetaItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.Loader;
import java.util.*;
public class NonBlockingItems
{
public static final NonBlockingItems INSTANCE = new NonBlockingItems();
public static Map<String, IItemList<IAEItemStack>> NON_BLOCKING_MAP;
NonBlockingItems()
{
NON_BLOCKING_MAP = new HashMap<>();
String[] strings = AEConfig.instance().getNonBlockingItems();
String modid = "";
if( strings.length > 0 )
{
for( String s : strings )
{
if( s.startsWith( "[" ) && s.endsWith( "]" ) )
{
modid = s.substring( 1, s.length() - 1 );
}
else
{
if( !Loader.isModLoaded( modid ) )
{
continue;
}
NON_BLOCKING_MAP.putIfAbsent( modid, AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList() );
String[] ModItemMeta = s.split( ":" );
if( ModItemMeta.length < 2 || ModItemMeta.length > 3 )
{
AELog.error( "Invalid non blocking item entry: " + s );
continue;
}
if( ModItemMeta[0].equals( "gregtech" ) )
{
for( MetaItem<?> metaItem : MetaItem.getMetaItems() )
{
MetaItem<?>.MetaValueItem metaItem2 = metaItem.getItem( ModItemMeta[1] );
if( metaItem.getItem( ModItemMeta[1] ) != null )
{
NON_BLOCKING_MAP.get( modid ).add( AEItemStack.fromItemStack( metaItem2.getStackForm() ) );
break;
}
}
}
else
{
Item item = Item.getByNameOrId( ModItemMeta[0] + ":" + ModItemMeta[1] );
if( item != null )
{
ItemStack itemStack;
itemStack = new ItemStack( item, 1, ModItemMeta.length == 3 ? Integer.parseInt( ModItemMeta[2] ) : 0 );
NON_BLOCKING_MAP.get( modid ).add( AEItemStack.fromItemStack( itemStack ) );
}
else
{
AELog.error( "Item not found on nonBlocking config: " + s );
}
}
}
}
}
}
public Map<String, IItemList<IAEItemStack>> getMap()
{
return NON_BLOCKING_MAP;
}
}