Compare commits
99 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7d1c502b41 | |||
| 63653c1833 | |||
| 6cadfbdcdc | |||
| d054c6ab91 | |||
| 234b1c5dc6 | |||
| 8cc29734a2 | |||
| 1e9e8d2639 | |||
| 19c6e2ff2d | |||
| 4f25c1551b | |||
| 3b94e9420d | |||
| f30f334a23 | |||
| 706e577dab | |||
| ccc8486571 | |||
| 3e8440644e | |||
| 50f4e08b64 | |||
| cfa9fa2843 | |||
| 47f819e021 | |||
| 6d151bb890 | |||
| 3305270a71 | |||
| f824bfd2e1 | |||
| 036f4e1c5b | |||
| 146d3f5628 | |||
| 9c821cb015 | |||
| 3a83c99b1f | |||
| 447c6debab | |||
| 50470ae3cf | |||
| 993be652c9 | |||
| b3bfbd0b58 | |||
| 49b3dc8b60 | |||
| 71ffcfb839 | |||
| 73f76a6654 | |||
| 645de1d868 | |||
| 8f40478695 | |||
| 056fcc3818 | |||
| 0ed0eb9d5f | |||
| 3ddc846648 | |||
| f98f6ef852 | |||
| 4192d721a0 | |||
| a0f3ef9d86 | |||
| 6b29288de6 | |||
| 285fc6314c | |||
| 50fd83e96b | |||
| cc51138a6a | |||
| 918df0bf7f | |||
| c852199901 | |||
| fd95d3de47 | |||
| c3dd6dabe1 | |||
| b0e81ac2d1 | |||
| 30f4cdf545 | |||
| ee9441474e | |||
| 8846202270 | |||
| 17a900ae9a | |||
| 66bc243b41 | |||
| a2bda8f449 | |||
| a2c2a4df0f | |||
| b4e237244a | |||
| b541ad8d18 | |||
| 64f29a7dba | |||
| 6d25b7ef3c | |||
| c3a608ef59 | |||
| af1f5c34d2 | |||
| f5378e060e | |||
| 47407acc42 | |||
| d7f3428824 | |||
| 63e339b88b | |||
| 98761809fd | |||
| 8cb013b686 | |||
| f2fe376982 | |||
| 603452de1f | |||
| 40bd96d21c | |||
| a14d160a07 | |||
| df28a5520f | |||
| 0d096944cc | |||
| 963d3414d8 | |||
| 4414451f5e | |||
| e0ddb92b81 | |||
| 6f551ad67f | |||
| fd3349614d | |||
| 903f211044 | |||
| 78e1e26a11 | |||
| 2a6de11597 | |||
| cd2b53af85 | |||
| 1c5565491a | |||
| 311cc5c6f6 | |||
| 41796449ed | |||
| 9eef9d3840 | |||
| 13afa6908a | |||
| 103438f805 | |||
| eaa01f7648 | |||
| e81fb09599 | |||
| 94d73aec7c | |||
| b51af43dba | |||
| 85dc8ae7c1 | |||
| c34176f392 | |||
| 76fe2175a0 | |||
| c5d33ed892 | |||
| b423d99879 | |||
| 81156b411d | |||
| 6be1660d41 |
+1
-1
@@ -57,7 +57,7 @@ tasks.withType(JavaCompile) {
|
|||||||
options.encoding = 'UTF-8'
|
options.encoding = 'UTF-8'
|
||||||
}
|
}
|
||||||
|
|
||||||
version = aeversion + "-" + aechannel + "-" + aebuild + " " + trousers
|
version = aeversion + "-" + aechannel + "-" + aebuild + "-" + extended + "-" + extendedversion
|
||||||
group = aegroup
|
group = aegroup
|
||||||
archivesBaseName = aebasename
|
archivesBaseName = aebasename
|
||||||
|
|
||||||
|
|||||||
+3
-5
@@ -3,20 +3,18 @@ aechannel=stable
|
|||||||
aebuild=7
|
aebuild=7
|
||||||
aegroup=appeng
|
aegroup=appeng
|
||||||
aebasename=appliedenergistics2
|
aebasename=appliedenergistics2
|
||||||
trousers=omni-fixes-v49b
|
extended=extended_life
|
||||||
|
extendedversion=v52b
|
||||||
#########################################################
|
#########################################################
|
||||||
# Versions #
|
# Versions #
|
||||||
#########################################################
|
#########################################################
|
||||||
minecraft_version=1.12.2
|
minecraft_version=1.12.2
|
||||||
mcp_mappings=snapshot_20171003
|
mcp_mappings=snapshot_20171003
|
||||||
forge_version=14.23.5.2847
|
forge_version=14.23.5.2847
|
||||||
|
|
||||||
#########################################################
|
#########################################################
|
||||||
# Installable #
|
# Installable #
|
||||||
#########################################################
|
#########################################################
|
||||||
hwyla_version=1.8.26-B41_1.12.2
|
hwyla_version=1.8.26-B41_1.12.2
|
||||||
|
|
||||||
#########################################################
|
#########################################################
|
||||||
# Provided APIs #
|
# Provided APIs #
|
||||||
#########################################################
|
#########################################################
|
||||||
@@ -28,7 +26,7 @@ cofhcore_version=1.12.2-4.5.2.19
|
|||||||
crafttweaker_version=4.1.8.9
|
crafttweaker_version=4.1.8.9
|
||||||
inventorytweaks_version=1.63
|
inventorytweaks_version=1.63
|
||||||
ctm_version=MC1.12.2-0.3.1.16
|
ctm_version=MC1.12.2-0.3.1.16
|
||||||
|
forestry_version=5.8.2.387
|
||||||
#########################################################
|
#########################################################
|
||||||
# Deployment #
|
# Deployment #
|
||||||
#########################################################
|
#########################################################
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ repositories {
|
|||||||
|
|
||||||
maven {
|
maven {
|
||||||
name = "Tesla repo"
|
name = "Tesla repo"
|
||||||
url "http://maven.mcmoddev.com"
|
url "https://maven.mcmoddev.com"
|
||||||
}
|
}
|
||||||
|
|
||||||
maven {
|
maven {
|
||||||
@@ -80,8 +80,7 @@ configurations {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly "gregtechce:gregtech:1.12.2:1.15.1.735"
|
deobfCompile "gregtechce:gregtech:1.12.2:1.15.1.735"
|
||||||
|
|
||||||
// installable runtime dependencies
|
// installable runtime dependencies
|
||||||
mods "mcp.mobius.waila:Hwyla:${hwyla_version}"
|
mods "mcp.mobius.waila:Hwyla:${hwyla_version}"
|
||||||
mods "net.industrial-craft:industrialcraft-2:${ic2_version}:dev"
|
mods "net.industrial-craft:industrialcraft-2:${ic2_version}:dev"
|
||||||
@@ -98,6 +97,8 @@ dependencies {
|
|||||||
compileOnly "inventory-tweaks:InventoryTweaks:${inventorytweaks_version}:api"
|
compileOnly "inventory-tweaks:InventoryTweaks:${inventorytweaks_version}:api"
|
||||||
compileOnly "team.chisel.ctm:CTM:${ctm_version}"
|
compileOnly "team.chisel.ctm:CTM:${ctm_version}"
|
||||||
compileOnly "de.ellpeck.actuallyadditions:ActuallyAdditions:1.12.2-r152.16:api"
|
compileOnly "de.ellpeck.actuallyadditions:ActuallyAdditions:1.12.2-r152.16:api"
|
||||||
|
deobfCompile "net.sengir.forestry:forestry_${minecraft_version}:$forestry_version"
|
||||||
|
|
||||||
|
|
||||||
// at runtime, use the full JEI jar
|
// at runtime, use the full JEI jar
|
||||||
runtime "mezz.jei:jei_${minecraft_version}:${jei_version}"
|
runtime "mezz.jei:jei_${minecraft_version}:${jei_version}"
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ public enum PowerUnits
|
|||||||
{
|
{
|
||||||
AE( "gui.appliedenergistics2.units.appliedenergstics" ), // Native Units - AE Energy
|
AE( "gui.appliedenergistics2.units.appliedenergstics" ), // Native Units - AE Energy
|
||||||
EU( "gui.appliedenergistics2.units.ic2" ), // IndustrialCraft 2 - Energy Units
|
EU( "gui.appliedenergistics2.units.ic2" ), // IndustrialCraft 2 - Energy Units
|
||||||
RF( "gui.appliedenergistics2.units.rf" ); // RF - Redstone Flux
|
RF( "gui.appliedenergistics2.units.rf" ), // RF - Redstone Flux
|
||||||
|
GTEU( "gui.appliedenergistics2.units.gteu" ); // RF - Redstone Flux
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* unlocalized name for the power unit.
|
* unlocalized name for the power unit.
|
||||||
@@ -46,14 +47,13 @@ public enum PowerUnits
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* do power conversion using AE's conversion rates.
|
* do power conversion using AE's conversion rates.
|
||||||
*
|
* <p>
|
||||||
* Example: PowerUnits.EU.convertTo( PowerUnits.AE, 32 );
|
* Example: PowerUnits.EU.convertTo( PowerUnits.AE, 32 );
|
||||||
*
|
* <p>
|
||||||
* will normally returns 64, as it will convert the EU, to AE with AE's power settings.
|
* will normally returns 64, as it will convert the EU, to AE with AE's power settings.
|
||||||
*
|
*
|
||||||
* @param target target power unit
|
* @param target target power unit
|
||||||
* @param value value
|
* @param value value
|
||||||
*
|
|
||||||
* @return value converted to target units, from this units.
|
* @return value converted to target units, from this units.
|
||||||
*/
|
*/
|
||||||
public double convertTo( final PowerUnits target, final double value )
|
public double convertTo( final PowerUnits target, final double value )
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ public enum TunnelType
|
|||||||
ME, // Network Tunnel
|
ME, // Network Tunnel
|
||||||
IC2_POWER, // EU Tunnel
|
IC2_POWER, // EU Tunnel
|
||||||
FE_POWER, // Forge Energy tunnel
|
FE_POWER, // Forge Energy tunnel
|
||||||
|
GTEU_POWER, // Forge Energy tunnel
|
||||||
REDSTONE, // Redstone Tunnel
|
REDSTONE, // Redstone Tunnel
|
||||||
FLUID, // Fluid Tunnel
|
FLUID, // Fluid Tunnel
|
||||||
ITEM, // Item Tunnel
|
ITEM, // Item Tunnel
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ public interface IParts
|
|||||||
|
|
||||||
IItemDefinition storageBus();
|
IItemDefinition storageBus();
|
||||||
|
|
||||||
|
IItemDefinition oreDictStorageBus();
|
||||||
|
|
||||||
IItemDefinition importBus();
|
IItemDefinition importBus();
|
||||||
|
|
||||||
IItemDefinition exportBus();
|
IItemDefinition exportBus();
|
||||||
@@ -86,6 +88,8 @@ public interface IParts
|
|||||||
|
|
||||||
IItemDefinition p2PTunnelFE();
|
IItemDefinition p2PTunnelFE();
|
||||||
|
|
||||||
|
IItemDefinition p2PTunnelGTEU();
|
||||||
|
|
||||||
IItemDefinition p2PTunnelLight();
|
IItemDefinition p2PTunnelLight();
|
||||||
|
|
||||||
// IItemDefinition p2PTunnelOpenComputers();
|
// IItemDefinition p2PTunnelOpenComputers();
|
||||||
@@ -102,6 +106,8 @@ public interface IParts
|
|||||||
|
|
||||||
IItemDefinition patternTerminal();
|
IItemDefinition patternTerminal();
|
||||||
|
|
||||||
|
IItemDefinition expandedProcessingPatternTerminal();
|
||||||
|
|
||||||
IItemDefinition craftingTerminal();
|
IItemDefinition craftingTerminal();
|
||||||
|
|
||||||
IItemDefinition terminal();
|
IItemDefinition terminal();
|
||||||
|
|||||||
@@ -119,6 +119,10 @@ public interface IAEItemStack extends IAEStack<IAEItemStack>
|
|||||||
*
|
*
|
||||||
* @param is An item stack
|
* @param is An item stack
|
||||||
*/
|
*/
|
||||||
boolean equals(ItemStack is);
|
boolean equals( ItemStack is );
|
||||||
|
|
||||||
|
ItemStack getCachedItemStack( long stackSize );
|
||||||
|
|
||||||
|
void setCachedItemStack( ItemStack is );
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -56,7 +56,7 @@ public class BlockMolecularAssembler extends AEBaseTileBlock
|
|||||||
@Override
|
@Override
|
||||||
protected IProperty[] getAEStates()
|
protected IProperty[] getAEStates()
|
||||||
{
|
{
|
||||||
return new IProperty[] { POWERED };
|
return new IProperty[]{POWERED};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -108,4 +108,14 @@ public class BlockMolecularAssembler extends AEBaseTileBlock
|
|||||||
|
|
||||||
return super.onBlockActivated( w, pos, state, p, hand, side, hitX, hitY, hitZ );
|
return super.onBlockActivated( w, pos, state, p, hand, side, hitX, hitY, hitZ );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNeighborChange( IBlockAccess world, BlockPos pos, BlockPos neighbor )
|
||||||
|
{
|
||||||
|
final TileMolecularAssembler tg = this.getTileEntity( world, pos );
|
||||||
|
if( tg != null )
|
||||||
|
{
|
||||||
|
tg.updateNeighbors( world, pos, neighbor );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ package appeng.capabilities;
|
|||||||
|
|
||||||
|
|
||||||
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
||||||
|
import gregtech.api.capability.IEnergyContainer;
|
||||||
import net.darkhax.tesla.api.ITeslaConsumer;
|
import net.darkhax.tesla.api.ITeslaConsumer;
|
||||||
import net.darkhax.tesla.api.ITeslaHolder;
|
import net.darkhax.tesla.api.ITeslaHolder;
|
||||||
import net.minecraft.nbt.NBTBase;
|
import net.minecraft.nbt.NBTBase;
|
||||||
@@ -57,6 +58,8 @@ public final class Capabilities
|
|||||||
|
|
||||||
public static Capability<IItemRepository> ITEM_REPOSITORY_CAPABILITY;
|
public static Capability<IItemRepository> ITEM_REPOSITORY_CAPABILITY;
|
||||||
|
|
||||||
|
public static Capability<IEnergyContainer> GTCE_ENERGY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register AE2 provided capabilities.
|
* Register AE2 provided capabilities.
|
||||||
*/
|
*/
|
||||||
@@ -103,7 +106,19 @@ public final class Capabilities
|
|||||||
}
|
}
|
||||||
|
|
||||||
@CapabilityInject( IItemRepository.class )
|
@CapabilityInject( IItemRepository.class )
|
||||||
private static void capIItemRepositoryRegistered( Capability<IItemRepository> cap ) { ITEM_REPOSITORY_CAPABILITY = cap; }
|
private static void capIItemRepositoryRegistered( Capability<IItemRepository> cap )
|
||||||
|
{
|
||||||
|
ITEM_REPOSITORY_CAPABILITY = cap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@CapabilityInject( IEnergyContainer.class )
|
||||||
|
private static void capIEnergyContainerRegistered( Capability<IEnergyContainer> cap )
|
||||||
|
{
|
||||||
|
if( IntegrationRegistry.INSTANCE.isEnabled( IntegrationType.GTCE ) )
|
||||||
|
{
|
||||||
|
GTCE_ENERGY = cap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Create a storage implementation that does not do anything
|
// Create a storage implementation that does not do anything
|
||||||
private static <T> Capability.IStorage<T> createNullStorage()
|
private static <T> Capability.IStorage<T> createNullStorage()
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import java.util.Set;
|
|||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import appeng.container.slot.*;
|
import appeng.container.slot.*;
|
||||||
|
import appeng.util.Platform;
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
import com.google.common.base.Stopwatch;
|
import com.google.common.base.Stopwatch;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
@@ -159,7 +160,7 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
|
|
||||||
final List<Slot> slots = this.getInventorySlots();
|
final List<Slot> slots = this.getInventorySlots();
|
||||||
final Iterator<Slot> i = slots.iterator();
|
final Iterator<Slot> i = slots.iterator();
|
||||||
while( i.hasNext() )
|
while ( i.hasNext() )
|
||||||
{
|
{
|
||||||
if( i.next() instanceof SlotME )
|
if( i.next() instanceof SlotME )
|
||||||
{
|
{
|
||||||
@@ -208,13 +209,17 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
GlStateManager.enableDepth();
|
GlStateManager.enableDepth();
|
||||||
bookmarkedJEIghostItem(mouseX,mouseY);
|
if( Platform.isModLoaded( "jei" ) )
|
||||||
|
{
|
||||||
|
bookmarkedJEIghostItem( mouseX, mouseY );
|
||||||
|
}
|
||||||
GlStateManager.disableDepth();
|
GlStateManager.disableDepth();
|
||||||
}
|
}
|
||||||
|
|
||||||
void bookmarkedJEIghostItem(final int mouseX, final int mouseY) {
|
@Optional.Method( modid = "jei" )
|
||||||
|
void bookmarkedJEIghostItem( final int mouseX, final int mouseY )
|
||||||
if (!isJeiGhostItem)
|
{
|
||||||
|
if( !isJeiGhostItem )
|
||||||
{
|
{
|
||||||
bookmarkedIngredient = runtime.getBookmarkOverlay().getIngredientUnderMouse();
|
bookmarkedIngredient = runtime.getBookmarkOverlay().getIngredientUnderMouse();
|
||||||
}
|
}
|
||||||
@@ -248,7 +253,9 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void drawTargets(int mouseX, int mouseY) {
|
|
||||||
|
private void drawTargets( int mouseX, int mouseY )
|
||||||
|
{
|
||||||
GlStateManager.disableLighting();
|
GlStateManager.disableLighting();
|
||||||
for( IGhostIngredientHandler.Target target : hoveredIngredientTargets )
|
for( IGhostIngredientHandler.Target target : hoveredIngredientTargets )
|
||||||
{
|
{
|
||||||
@@ -377,17 +384,13 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
final AppEngSlot aeSlot = (AppEngSlot) slot;
|
final AppEngSlot aeSlot = (AppEngSlot) slot;
|
||||||
if( aeSlot.isSlotEnabled() )
|
if( aeSlot.isSlotEnabled() )
|
||||||
{
|
{
|
||||||
this.drawTexturedModalRect( ox + aeSlot.xPos - 1, oy + aeSlot.yPos - 1, optionalSlot.getSourceX() - 1, optionalSlot.getSourceY() - 1,
|
this.drawTexturedModalRect( ox + aeSlot.xPos - 1, oy + aeSlot.yPos - 1, optionalSlot.getSourceX() - 1, optionalSlot.getSourceY() - 1, 18, 18 );
|
||||||
18,
|
|
||||||
18 );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GlStateManager.color( 1.0F, 1.0F, 1.0F, 0.4F );
|
GlStateManager.color( 1.0F, 1.0F, 1.0F, 0.4F );
|
||||||
GlStateManager.enableBlend();
|
GlStateManager.enableBlend();
|
||||||
this.drawTexturedModalRect( ox + aeSlot.xPos - 1, oy + aeSlot.yPos - 1, optionalSlot.getSourceX() - 1, optionalSlot.getSourceY() - 1,
|
this.drawTexturedModalRect( ox + aeSlot.xPos - 1, oy + aeSlot.yPos - 1, optionalSlot.getSourceX() - 1, optionalSlot.getSourceY() - 1, 18, 18 );
|
||||||
18,
|
|
||||||
18 );
|
|
||||||
GlStateManager.color( 1.0F, 1.0F, 1.0F, 1.0F );
|
GlStateManager.color( 1.0F, 1.0F, 1.0F, 1.0F );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -506,7 +509,7 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
{
|
{
|
||||||
final EntityPlayer player = Minecraft.getMinecraft().player;
|
final EntityPlayer player = Minecraft.getMinecraft().player;
|
||||||
|
|
||||||
if( this.isJeiGhostItem && isDraggingJeiGhostItem)
|
if( this.isJeiGhostItem && isDraggingJeiGhostItem )
|
||||||
{
|
{
|
||||||
for( IGhostIngredientHandler.Target target : hoveredIngredientTargets )
|
for( IGhostIngredientHandler.Target target : hoveredIngredientTargets )
|
||||||
{
|
{
|
||||||
@@ -759,7 +762,8 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
this.disableShiftClick = false;
|
this.disableShiftClick = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clickType == ClickType.PICKUP && isJeiGhostItem && !isDraggingJeiGhostItem) {
|
if( clickType == ClickType.PICKUP && isJeiGhostItem && !isDraggingJeiGhostItem )
|
||||||
|
{
|
||||||
this.isDraggingJeiGhostItem = true;
|
this.isDraggingJeiGhostItem = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -879,7 +883,7 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
if( stack != ItemStack.EMPTY )
|
if( stack != ItemStack.EMPTY )
|
||||||
{
|
{
|
||||||
InventoryAction direction = wheel > 0 ? InventoryAction.PLACE_SINGLE : InventoryAction.PICKUP_SINGLE;
|
InventoryAction direction = wheel > 0 ? InventoryAction.PLACE_SINGLE : InventoryAction.PICKUP_SINGLE;
|
||||||
final PacketInventoryAction p = new PacketInventoryAction( direction , slot.slotNumber , 0);
|
final PacketInventoryAction p = new PacketInventoryAction( direction, slot.slotNumber, 0 );
|
||||||
NetworkHandler.instance().sendToServer( p );
|
NetworkHandler.instance().sendToServer( p );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1032,27 +1036,11 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
final float f1 = 0.00390625F;
|
final float f1 = 0.00390625F;
|
||||||
final float f = 0.00390625F;
|
final float f = 0.00390625F;
|
||||||
final float par6 = 16;
|
final float par6 = 16;
|
||||||
vb.pos( par1 + 0, par2 + par6, this.zLevel )
|
vb.pos( par1 + 0, par2 + par6, this.zLevel ).tex( ( par3 + 0 ) * f, ( par4 + par6 ) * f1 ).color( 1.0f, 1.0f, 1.0f, aes.getOpacityOfIcon() ).endVertex();
|
||||||
.tex( ( par3 + 0 ) * f, ( par4 + par6 ) * f1 )
|
|
||||||
.color( 1.0f, 1.0f, 1.0f,
|
|
||||||
aes.getOpacityOfIcon() )
|
|
||||||
.endVertex();
|
|
||||||
final float par5 = 16;
|
final float par5 = 16;
|
||||||
vb.pos( par1 + par5, par2 + par6, this.zLevel )
|
vb.pos( par1 + par5, par2 + par6, this.zLevel ).tex( ( par3 + par5 ) * f, ( par4 + par6 ) * f1 ).color( 1.0f, 1.0f, 1.0f, aes.getOpacityOfIcon() ).endVertex();
|
||||||
.tex( ( par3 + par5 ) * f, ( par4 + par6 ) * f1 )
|
vb.pos( par1 + par5, par2 + 0, this.zLevel ).tex( ( par3 + par5 ) * f, ( par4 + 0 ) * f1 ).color( 1.0f, 1.0f, 1.0f, aes.getOpacityOfIcon() ).endVertex();
|
||||||
.color( 1.0f, 1.0f, 1.0f,
|
vb.pos( par1 + 0, par2 + 0, this.zLevel ).tex( ( par3 + 0 ) * f, ( par4 + 0 ) * f1 ).color( 1.0f, 1.0f, 1.0f, aes.getOpacityOfIcon() ).endVertex();
|
||||||
aes.getOpacityOfIcon() )
|
|
||||||
.endVertex();
|
|
||||||
vb.pos( par1 + par5, par2 + 0, this.zLevel )
|
|
||||||
.tex( ( par3 + par5 ) * f, ( par4 + 0 ) * f1 )
|
|
||||||
.color( 1.0f, 1.0f, 1.0f,
|
|
||||||
aes.getOpacityOfIcon() )
|
|
||||||
.endVertex();
|
|
||||||
vb.pos( par1 + 0, par2 + 0, this.zLevel )
|
|
||||||
.tex( ( par3 + 0 ) * f, ( par4 + 0 ) * f1 )
|
|
||||||
.color( 1.0f, 1.0f, 1.0f,
|
|
||||||
aes.getOpacityOfIcon() )
|
|
||||||
.endVertex();
|
|
||||||
tessellator.draw();
|
tessellator.draw();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1066,8 +1054,7 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
{
|
{
|
||||||
if( ( (AppEngSlot) s ).getIsValid() == hasCalculatedValidness.NotAvailable )
|
if( ( (AppEngSlot) s ).getIsValid() == hasCalculatedValidness.NotAvailable )
|
||||||
{
|
{
|
||||||
boolean isValid = s.isItemValid(
|
boolean isValid = s.isItemValid( is ) || s instanceof SlotOutput || s instanceof AppEngCraftingSlot || s instanceof SlotDisabled || s instanceof SlotInaccessible || s instanceof SlotFake || s instanceof SlotRestrictedInput || s instanceof SlotDisconnected;
|
||||||
is ) || s instanceof SlotOutput || s instanceof AppEngCraftingSlot || s instanceof SlotDisabled || s instanceof SlotInaccessible || s instanceof SlotFake || s instanceof SlotRestrictedInput || s instanceof SlotDisconnected;
|
|
||||||
if( isValid && s instanceof SlotRestrictedInput )
|
if( isValid && s instanceof SlotRestrictedInput )
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public class AEGuiHandler implements IAdvancedGuiHandler<AEBaseGui>, IGhostIngre
|
|||||||
}
|
}
|
||||||
if( doStart && GuiScreen.isShiftKeyDown() && Mouse.isButtonDown( 0 ) )
|
if( doStart && GuiScreen.isShiftKeyDown() && Mouse.isButtonDown( 0 ) )
|
||||||
{
|
{
|
||||||
if( gui instanceof GuiUpgradeable || gui instanceof GuiPatternTerm )
|
if( gui instanceof GuiUpgradeable || gui instanceof GuiPatternTerm || gui instanceof GuiExpandedProcessingPatternTerm )
|
||||||
{
|
{
|
||||||
IJEIGhostIngredients ghostGui = ( (IJEIGhostIngredients) gui );
|
IJEIGhostIngredients ghostGui = ( (IJEIGhostIngredients) gui );
|
||||||
for( Target<I> target : targets )
|
for( Target<I> target : targets )
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ package appeng.client.gui.implementations;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
import net.minecraft.client.gui.GuiButton;
|
import net.minecraft.client.gui.GuiButton;
|
||||||
import net.minecraft.entity.player.InventoryPlayer;
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -123,6 +124,12 @@ public class GuiCraftAmount extends AEBaseGui
|
|||||||
this.originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
this.originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( target instanceof PartExpandedProcessingPatternTerminal )
|
||||||
|
{
|
||||||
|
myIcon = parts.expandedProcessingPatternTerminal().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
||||||
|
this.originalGui = GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL;
|
||||||
|
}
|
||||||
|
|
||||||
if( this.originalGui != null && !myIcon.isEmpty() )
|
if( this.originalGui != null && !myIcon.isEmpty() )
|
||||||
{
|
{
|
||||||
this.buttonList.add( this.originalGuiBtn = new GuiTabButton( this.guiLeft + 154, this.guiTop, myIcon, myIcon.getDisplayName(), this.itemRender ) );
|
this.buttonList.add( this.originalGuiBtn = new GuiTabButton( this.guiLeft + 154, this.guiTop, myIcon, myIcon.getDisplayName(), this.itemRender ) );
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
|
|
||||||
import org.lwjgl.input.Mouse;
|
import org.lwjgl.input.Mouse;
|
||||||
@@ -104,6 +105,11 @@ public class GuiCraftConfirm extends AEBaseGui
|
|||||||
{
|
{
|
||||||
this.OriginalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
this.OriginalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( te instanceof PartExpandedProcessingPatternTerminal )
|
||||||
|
{
|
||||||
|
this.OriginalGui = GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isAutoStart()
|
boolean isAutoStart()
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ package appeng.client.gui.implementations;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
import org.lwjgl.input.Mouse;
|
import org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
import net.minecraft.client.gui.GuiButton;
|
import net.minecraft.client.gui.GuiButton;
|
||||||
@@ -95,6 +96,12 @@ public class GuiCraftingStatus extends GuiCraftingCPU
|
|||||||
|
|
||||||
this.originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
this.originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( target instanceof PartExpandedProcessingPatternTerminal )
|
||||||
|
{
|
||||||
|
myIcon = parts.expandedProcessingPatternTerminal().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
||||||
|
this.originalGui = GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+277
@@ -0,0 +1,277 @@
|
|||||||
|
package appeng.client.gui.implementations;
|
||||||
|
|
||||||
|
import appeng.api.config.ActionItems;
|
||||||
|
import appeng.api.config.ItemSubstitution;
|
||||||
|
import appeng.api.config.Settings;
|
||||||
|
import appeng.api.storage.ITerminalHost;
|
||||||
|
import appeng.client.gui.widgets.GuiImgButton;
|
||||||
|
import appeng.client.gui.widgets.GuiTabButton;
|
||||||
|
import appeng.container.implementations.ContainerExpandedProcessingPatternTerm;
|
||||||
|
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||||
|
import appeng.container.slot.AppEngSlot;
|
||||||
|
import appeng.container.slot.SlotFake;
|
||||||
|
import appeng.core.AELog;
|
||||||
|
import appeng.core.localization.GuiText;
|
||||||
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
|
import appeng.core.sync.packets.PacketInventoryAction;
|
||||||
|
import appeng.core.sync.packets.PacketValueConfig;
|
||||||
|
import appeng.helpers.InventoryAction;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
import mezz.jei.api.gui.IGhostIngredientHandler;
|
||||||
|
import net.minecraft.client.gui.GuiButton;
|
||||||
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
|
import net.minecraft.init.Blocks;
|
||||||
|
import net.minecraft.inventory.Slot;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
public class GuiExpandedProcessingPatternTerm extends GuiMEMonitorable implements IJEIGhostIngredients
|
||||||
|
{
|
||||||
|
private static final String BACKGROUND_EXPANDED_PROCESSING_MODE = "guis/pattern_processing_expanded.png";
|
||||||
|
|
||||||
|
private static final String SUBSITUTION_DISABLE = "0";
|
||||||
|
private static final String SUBSITUTION_ENABLE = "1";
|
||||||
|
|
||||||
|
private static final String CRAFTMODE_CRFTING = "1";
|
||||||
|
private static final String CRAFTMODE_PROCESSING = "0";
|
||||||
|
|
||||||
|
private GuiTabButton tabCraftButton;
|
||||||
|
private GuiTabButton tabProcessButton;
|
||||||
|
private GuiImgButton substitutionsEnabledBtn;
|
||||||
|
private GuiImgButton substitutionsDisabledBtn;
|
||||||
|
private GuiImgButton encodeBtn;
|
||||||
|
private GuiImgButton clearBtn;
|
||||||
|
private GuiImgButton x2Btn;
|
||||||
|
private GuiImgButton x3Btn;
|
||||||
|
private GuiImgButton plusOneBtn;
|
||||||
|
private GuiImgButton divTwoBtn;
|
||||||
|
private GuiImgButton divThreeBtn;
|
||||||
|
private GuiImgButton minusOneBtn;
|
||||||
|
private GuiImgButton maxCountBtn;
|
||||||
|
public Map<IGhostIngredientHandler.Target<?>, Object> mapTargetSlot = new HashMap<>();
|
||||||
|
|
||||||
|
public GuiExpandedProcessingPatternTerm( final InventoryPlayer inventoryPlayer, final ITerminalHost te )
|
||||||
|
{
|
||||||
|
super( inventoryPlayer, te, new ContainerExpandedProcessingPatternTerm( inventoryPlayer, te ) );
|
||||||
|
this.setReservedSpace( 81 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void actionPerformed( final GuiButton btn )
|
||||||
|
{
|
||||||
|
super.actionPerformed( btn );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
if( this.tabCraftButton == btn || this.tabProcessButton == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.CraftMode", this.tabProcessButton == btn ? CRAFTMODE_CRFTING : CRAFTMODE_PROCESSING ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.encodeBtn == btn )
|
||||||
|
{
|
||||||
|
if( isShiftKeyDown() )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Encode", "2" ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Encode", "1" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.clearBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Clear", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.x2Btn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.MultiplyByTwo", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.x3Btn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.MultiplyByThree", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.divTwoBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.DivideByTwo", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.divThreeBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.DivideByThree", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.plusOneBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.IncreaseByOne", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.minusOneBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.DecreaseByOne", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.maxCountBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.MaximizeCount", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.substitutionsEnabledBtn == btn || this.substitutionsDisabledBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Substitute", this.substitutionsEnabledBtn == btn ? SUBSITUTION_DISABLE : SUBSITUTION_ENABLE ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( final IOException e )
|
||||||
|
{
|
||||||
|
AELog.error( e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initGui()
|
||||||
|
{
|
||||||
|
super.initGui();
|
||||||
|
|
||||||
|
this.tabCraftButton = new GuiTabButton( this.guiLeft + 173, this.guiTop + this.ySize - 177, new ItemStack( Blocks.CRAFTING_TABLE ), GuiText.CraftingPattern.getLocal(), this.itemRender );
|
||||||
|
this.buttonList.add( this.tabCraftButton );
|
||||||
|
|
||||||
|
this.tabProcessButton = new GuiTabButton( this.guiLeft + 173, this.guiTop + this.ySize - 177, new ItemStack( Blocks.FURNACE ), GuiText.ProcessingPattern.getLocal(), this.itemRender );
|
||||||
|
this.buttonList.add( this.tabProcessButton );
|
||||||
|
|
||||||
|
this.substitutionsEnabledBtn = new GuiImgButton( this.guiLeft + 84, this.guiTop + this.ySize - 163, Settings.ACTIONS, ItemSubstitution.ENABLED );
|
||||||
|
this.substitutionsEnabledBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.substitutionsEnabledBtn );
|
||||||
|
|
||||||
|
this.substitutionsDisabledBtn = new GuiImgButton( this.guiLeft + 84, this.guiTop + this.ySize - 163, Settings.ACTIONS, ItemSubstitution.DISABLED );
|
||||||
|
this.substitutionsDisabledBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.substitutionsDisabledBtn );
|
||||||
|
|
||||||
|
this.clearBtn = new GuiImgButton( this.guiLeft + 74, this.guiTop + this.ySize - 163, Settings.ACTIONS, ActionItems.CLOSE );
|
||||||
|
this.clearBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.clearBtn );
|
||||||
|
|
||||||
|
this.x3Btn = new GuiImgButton( this.guiLeft + 131, this.guiTop + this.ySize - 158, Settings.ACTIONS, ActionItems.MULTIPLY_BY_THREE );
|
||||||
|
this.x3Btn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.x3Btn );
|
||||||
|
|
||||||
|
this.x2Btn = new GuiImgButton( this.guiLeft + 131, this.guiTop + this.ySize - 148, Settings.ACTIONS, ActionItems.MULTIPLY_BY_TWO );
|
||||||
|
this.x2Btn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.x2Btn );
|
||||||
|
|
||||||
|
this.plusOneBtn = new GuiImgButton( this.guiLeft + 131, this.guiTop + this.ySize - 110, Settings.ACTIONS, ActionItems.INCREASE_BY_ONE );
|
||||||
|
this.plusOneBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.plusOneBtn );
|
||||||
|
|
||||||
|
this.divThreeBtn = new GuiImgButton( this.guiLeft + 87, this.guiTop + this.ySize - 158, Settings.ACTIONS, ActionItems.DIVIDE_BY_THREE );
|
||||||
|
this.divThreeBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.divThreeBtn );
|
||||||
|
|
||||||
|
this.divTwoBtn = new GuiImgButton( this.guiLeft + 87, this.guiTop + this.ySize - 148, Settings.ACTIONS, ActionItems.DIVIDE_BY_TWO );
|
||||||
|
this.divTwoBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.divTwoBtn );
|
||||||
|
|
||||||
|
this.minusOneBtn = new GuiImgButton( this.guiLeft + 87, this.guiTop + this.ySize - 110, Settings.ACTIONS, ActionItems.DECREASE_BY_ONE );
|
||||||
|
this.minusOneBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.minusOneBtn );
|
||||||
|
|
||||||
|
//this.maxCountBtn = new GuiImgButton( this.guiLeft + 128, this.guiTop + this.ySize - 108, Settings.ACTIONS, ActionItems.MAX_COUNT );
|
||||||
|
//this.maxCountBtn.setHalfSize( true );
|
||||||
|
//this.buttonList.add( this.maxCountBtn );
|
||||||
|
|
||||||
|
this.encodeBtn = new GuiImgButton( this.guiLeft + 147, this.guiTop + this.ySize - 142, Settings.ACTIONS, ActionItems.ENCODE );
|
||||||
|
this.buttonList.add( this.encodeBtn );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawFG( final int offsetX, final int offsetY, final int mouseX, final int mouseY )
|
||||||
|
{
|
||||||
|
this.tabCraftButton.visible = false;
|
||||||
|
this.tabProcessButton.visible = true;
|
||||||
|
this.substitutionsEnabledBtn.visible = false;
|
||||||
|
this.substitutionsDisabledBtn.visible = false;
|
||||||
|
this.x2Btn.visible = true;
|
||||||
|
this.x3Btn.visible = true;
|
||||||
|
this.divTwoBtn.visible = true;
|
||||||
|
this.divThreeBtn.visible = true;
|
||||||
|
this.plusOneBtn.visible = true;
|
||||||
|
this.minusOneBtn.visible = true;
|
||||||
|
//this.maxCountBtn.visible = true;
|
||||||
|
|
||||||
|
super.drawFG( offsetX, offsetY, mouseX, mouseY );
|
||||||
|
this.fontRenderer.drawString( GuiText.PatternTerminal.getLocal(), 8, this.ySize - 96 + 2 - this.getReservedSpace(), 4210752 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getBackground()
|
||||||
|
{
|
||||||
|
return BACKGROUND_EXPANDED_PROCESSING_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void repositionSlot( final AppEngSlot s )
|
||||||
|
{
|
||||||
|
final int offsetPlayerSide = s.isPlayerSide() ? 5 : 3;
|
||||||
|
|
||||||
|
s.yPos = s.getY() + this.ySize - 78 - offsetPlayerSide;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<IGhostIngredientHandler.Target<?>> getPhantomTargets( Object ingredient )
|
||||||
|
{
|
||||||
|
if( !( ingredient instanceof ItemStack ) )
|
||||||
|
{
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
List<IGhostIngredientHandler.Target<?>> targets = new ArrayList<>();
|
||||||
|
for( Slot slot : this.inventorySlots.inventorySlots )
|
||||||
|
{
|
||||||
|
if( slot instanceof SlotFake )
|
||||||
|
{
|
||||||
|
ItemStack itemStack = (ItemStack) ingredient;
|
||||||
|
IGhostIngredientHandler.Target<Object> target = new IGhostIngredientHandler.Target<Object>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Rectangle getArea()
|
||||||
|
{
|
||||||
|
return new Rectangle( getGuiLeft() + slot.xPos, getGuiTop() + slot.yPos, 16, 16 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept( Object ingredient )
|
||||||
|
{
|
||||||
|
final PacketInventoryAction p;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
p = new PacketInventoryAction( InventoryAction.PLACE_JEI_GHOST_ITEM, (SlotFake) slot, AEItemStack.fromItemStack( itemStack ) );
|
||||||
|
NetworkHandler.instance().sendToServer( p );
|
||||||
|
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
targets.add( target );
|
||||||
|
mapTargetSlot.putIfAbsent( target, slot );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return targets;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<IGhostIngredientHandler.Target<?>, Object> getFakeSlotTargetMap()
|
||||||
|
{
|
||||||
|
return mapTargetSlot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
package appeng.client.gui.implementations;
|
||||||
|
|
||||||
|
import appeng.api.config.AccessRestriction;
|
||||||
|
import appeng.api.config.ActionItems;
|
||||||
|
import appeng.api.config.Settings;
|
||||||
|
import appeng.api.config.StorageFilter;
|
||||||
|
import appeng.client.gui.AEBaseGui;
|
||||||
|
import appeng.client.gui.widgets.GuiImgButton;
|
||||||
|
import appeng.client.gui.widgets.GuiTabButton;
|
||||||
|
import appeng.client.gui.widgets.MEGuiTextField;
|
||||||
|
import appeng.container.implementations.ContainerOreDictStorageBus;
|
||||||
|
import appeng.core.AELog;
|
||||||
|
import appeng.core.localization.GuiText;
|
||||||
|
import appeng.core.sync.GuiBridge;
|
||||||
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
|
import appeng.core.sync.packets.PacketConfigButton;
|
||||||
|
import appeng.core.sync.packets.PacketSwitchGuis;
|
||||||
|
import appeng.core.sync.packets.PacketValueConfig;
|
||||||
|
import appeng.parts.misc.PartOreDicStorageBus;
|
||||||
|
import appeng.util.item.OreDictFilterMatcher;
|
||||||
|
import net.minecraft.client.gui.GuiButton;
|
||||||
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
|
import org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
|
||||||
|
public class GuiOreDictStorageBus extends AEBaseGui
|
||||||
|
{
|
||||||
|
private final ContainerOreDictStorageBus container;
|
||||||
|
PartOreDicStorageBus part;
|
||||||
|
private GuiTabButton priority;
|
||||||
|
private GuiImgButton partition;
|
||||||
|
private GuiImgButton storageFilter;
|
||||||
|
private GuiImgButton rwMode;
|
||||||
|
private static final Pattern ORE_DICTIONARY_FILTER = Pattern.compile( "[(!]* *[0-9a-zA-Z*]* *\\)*( *[&|^]? *[(!]* *[0-9a-zA-Z*]* *\\)*)*" );
|
||||||
|
private MEGuiTextField searchFieldInputs;
|
||||||
|
|
||||||
|
public GuiOreDictStorageBus( final InventoryPlayer inventoryPlayer, final PartOreDicStorageBus te )
|
||||||
|
{
|
||||||
|
super( new ContainerOreDictStorageBus( inventoryPlayer, te ) );
|
||||||
|
this.container = (ContainerOreDictStorageBus) super.inventorySlots;
|
||||||
|
part = te;
|
||||||
|
this.ySize = 84;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initGui()
|
||||||
|
{
|
||||||
|
super.initGui();
|
||||||
|
|
||||||
|
this.searchFieldInputs = new MEGuiTextField( this.fontRenderer, this.guiLeft + 3, this.guiTop + 22, 170, 12 );
|
||||||
|
this.searchFieldInputs.setEnableBackgroundDrawing( false );
|
||||||
|
this.searchFieldInputs.setMaxStringLength( 512 );
|
||||||
|
this.searchFieldInputs.setTextColor( 0xFFFFFF );
|
||||||
|
this.searchFieldInputs.setVisible( true );
|
||||||
|
this.searchFieldInputs.setFocused( false );
|
||||||
|
this.searchFieldInputs.setValidator( str -> ORE_DICTIONARY_FILTER.matcher( str ).matches() );
|
||||||
|
|
||||||
|
this.buttonList.add( this.priority = new GuiTabButton( this.guiLeft + 154, this.guiTop, 2 + 4 * 16, GuiText.Priority.getLocal(), this.itemRender ) );
|
||||||
|
this.buttonList.add( this.partition = new GuiImgButton( this.guiLeft - 18, this.guiTop + 28, Settings.ACTIONS, ActionItems.WRENCH ) );
|
||||||
|
this.buttonList.add( this.rwMode = new GuiImgButton( this.guiLeft - 18, this.guiTop + 48, Settings.ACCESS, AccessRestriction.READ_WRITE ) );
|
||||||
|
this.buttonList.add( this.storageFilter = new GuiImgButton( this.guiLeft - 18, this.guiTop + 68, Settings.STORAGE_FILTER, StorageFilter.EXTRACTABLE_ONLY ) );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "OreDictStorageBus.getRegex", "1" ) );
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fillRegex( String regex )
|
||||||
|
{
|
||||||
|
this.searchFieldInputs.setText( regex );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void actionPerformed( final GuiButton btn ) throws IOException
|
||||||
|
{
|
||||||
|
super.actionPerformed( btn );
|
||||||
|
|
||||||
|
final boolean backwards = Mouse.isButtonDown( 1 );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if( btn == this.priority )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketSwitchGuis( GuiBridge.GUI_PRIORITY ) );
|
||||||
|
}
|
||||||
|
else if( btn == this.partition )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "StorageBus.Action", "Partition" ) );
|
||||||
|
}
|
||||||
|
else if( btn == this.rwMode )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketConfigButton( this.rwMode.getSetting(), backwards ) );
|
||||||
|
}
|
||||||
|
else if( btn == this.storageFilter )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketConfigButton( this.storageFilter.getSetting(), backwards ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( final IOException e )
|
||||||
|
{
|
||||||
|
AELog.debug( e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void mouseClicked( final int xCoord, final int yCoord, final int btn ) throws IOException
|
||||||
|
{
|
||||||
|
boolean wasFocused = this.searchFieldInputs.isFocused();
|
||||||
|
this.searchFieldInputs.mouseClicked( xCoord, yCoord, btn );
|
||||||
|
|
||||||
|
if( btn == 1 && this.searchFieldInputs.isMouseIn( xCoord, yCoord ) )
|
||||||
|
{
|
||||||
|
this.searchFieldInputs.setText( "" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !searchFieldInputs.isFocused() && wasFocused )
|
||||||
|
{
|
||||||
|
searchFieldInputs.setText( OreDictFilterMatcher.validateExp( searchFieldInputs.getText() ) );
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "OreDictStorageBus.save", searchFieldInputs.getText() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
super.mouseClicked( xCoord, yCoord, btn );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void keyTyped( final char character, final int key ) throws IOException
|
||||||
|
{
|
||||||
|
if( !this.checkHotbarKeys( key ) )
|
||||||
|
{
|
||||||
|
if( !this.searchFieldInputs.textboxKeyTyped( character, key ) )
|
||||||
|
{
|
||||||
|
super.keyTyped( character, key );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawFG( int offsetX, int offsetY, int mouseX, int mouseY )
|
||||||
|
{
|
||||||
|
this.fontRenderer.drawString( this.getGuiDisplayName( GuiText.OreDictStorageBus.getLocal() ), 8, 6, 4210752 );
|
||||||
|
this.fontRenderer.drawString( this.searchFieldInputs.getText().length() + " / " + this.searchFieldInputs.getMaxStringLength(), 120, 36, 4210752 );
|
||||||
|
this.fontRenderer.drawString( "& = AND " + "| = OR", 8, 36, 4210752 );
|
||||||
|
this.fontRenderer.drawString( "^ = XOR " + "! = NOT", 8, 48, 4210752 );
|
||||||
|
this.fontRenderer.drawString( "() for priority " + "* for wildcard", 8, 60, 4210752 );
|
||||||
|
this.fontRenderer.drawString( "Ex.: *Redstone*&!dustRedstone", 8, 72, 4210752 );
|
||||||
|
|
||||||
|
if( this.storageFilter != null )
|
||||||
|
{
|
||||||
|
this.storageFilter.set( container.getStorageFilter() );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.rwMode != null )
|
||||||
|
{
|
||||||
|
this.rwMode.set( container.getReadWriteMode() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawBG( int offsetX, int offsetY, int mouseX, int mouseY )
|
||||||
|
{
|
||||||
|
this.bindTexture( "guis/oredictstoragebus.png" );
|
||||||
|
this.drawTexturedModalRect( offsetX, offsetY, 0, 0, 175, 85 );
|
||||||
|
|
||||||
|
if( this.searchFieldInputs != null )
|
||||||
|
{
|
||||||
|
this.searchFieldInputs.drawTextBox();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -87,6 +87,7 @@ public class GuiImgButton extends GuiButton implements ITooltip
|
|||||||
this.registerApp( 16 * 10, Settings.POWER_UNITS, PowerUnits.AE, ButtonToolTips.PowerUnits, PowerUnits.AE.unlocalizedName );
|
this.registerApp( 16 * 10, Settings.POWER_UNITS, PowerUnits.AE, ButtonToolTips.PowerUnits, PowerUnits.AE.unlocalizedName );
|
||||||
this.registerApp( 16 * 10 + 1, Settings.POWER_UNITS, PowerUnits.EU, ButtonToolTips.PowerUnits, PowerUnits.EU.unlocalizedName );
|
this.registerApp( 16 * 10 + 1, Settings.POWER_UNITS, PowerUnits.EU, ButtonToolTips.PowerUnits, PowerUnits.EU.unlocalizedName );
|
||||||
this.registerApp( 16 * 10 + 4, Settings.POWER_UNITS, PowerUnits.RF, ButtonToolTips.PowerUnits, PowerUnits.RF.unlocalizedName );
|
this.registerApp( 16 * 10 + 4, Settings.POWER_UNITS, PowerUnits.RF, ButtonToolTips.PowerUnits, PowerUnits.RF.unlocalizedName );
|
||||||
|
this.registerApp( 16 * 10 + 1, Settings.POWER_UNITS, PowerUnits.GTEU, ButtonToolTips.PowerUnits, PowerUnits.EU.unlocalizedName );
|
||||||
|
|
||||||
this.registerApp( 3, Settings.REDSTONE_CONTROLLED, RedstoneMode.IGNORE, ButtonToolTips.RedstoneMode, ButtonToolTips.AlwaysActive );
|
this.registerApp( 3, Settings.REDSTONE_CONTROLLED, RedstoneMode.IGNORE, ButtonToolTips.RedstoneMode, ButtonToolTips.AlwaysActive );
|
||||||
this.registerApp( 0, Settings.REDSTONE_CONTROLLED, RedstoneMode.LOW_SIGNAL, ButtonToolTips.RedstoneMode, ButtonToolTips.ActiveWithoutSignal );
|
this.registerApp( 0, Settings.REDSTONE_CONTROLLED, RedstoneMode.LOW_SIGNAL, ButtonToolTips.RedstoneMode, ButtonToolTips.ActiveWithoutSignal );
|
||||||
@@ -108,15 +109,11 @@ public class GuiImgButton extends GuiButton implements ITooltip
|
|||||||
this.registerApp( 16 * 2 + 3, Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_Auto );
|
this.registerApp( 16 * 2 + 3, Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_Auto );
|
||||||
this.registerApp( 16 * 2 + 4, Settings.SEARCH_MODE, SearchBoxMode.MANUAL_SEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_Standard );
|
this.registerApp( 16 * 2 + 4, Settings.SEARCH_MODE, SearchBoxMode.MANUAL_SEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_Standard );
|
||||||
this.registerApp( 16 * 2 + 5, Settings.SEARCH_MODE, SearchBoxMode.JEI_AUTOSEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_JEIAuto );
|
this.registerApp( 16 * 2 + 5, Settings.SEARCH_MODE, SearchBoxMode.JEI_AUTOSEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_JEIAuto );
|
||||||
this.registerApp( 16 * 2 + 6, Settings.SEARCH_MODE, SearchBoxMode.JEI_MANUAL_SEARCH, ButtonToolTips.SearchMode,
|
this.registerApp( 16 * 2 + 6, Settings.SEARCH_MODE, SearchBoxMode.JEI_MANUAL_SEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_JEIStandard );
|
||||||
ButtonToolTips.SearchMode_JEIStandard );
|
|
||||||
this.registerApp( 16 * 2 + 7, Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH_KEEP, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_AutoKeep );
|
this.registerApp( 16 * 2 + 7, Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH_KEEP, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_AutoKeep );
|
||||||
this.registerApp( 16 * 2 + 8, Settings.SEARCH_MODE, SearchBoxMode.MANUAL_SEARCH_KEEP, ButtonToolTips.SearchMode,
|
this.registerApp( 16 * 2 + 8, Settings.SEARCH_MODE, SearchBoxMode.MANUAL_SEARCH_KEEP, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_StandardKeep );
|
||||||
ButtonToolTips.SearchMode_StandardKeep );
|
this.registerApp( 16 * 2 + 9, Settings.SEARCH_MODE, SearchBoxMode.JEI_AUTOSEARCH_KEEP, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_JEIAutoKeep );
|
||||||
this.registerApp( 16 * 2 + 9, Settings.SEARCH_MODE, SearchBoxMode.JEI_AUTOSEARCH_KEEP, ButtonToolTips.SearchMode,
|
this.registerApp( 16 * 2 + 10, Settings.SEARCH_MODE, SearchBoxMode.JEI_MANUAL_SEARCH_KEEP, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_JEIStandardKeep );
|
||||||
ButtonToolTips.SearchMode_JEIAutoKeep );
|
|
||||||
this.registerApp( 16 * 2 + 10, Settings.SEARCH_MODE, SearchBoxMode.JEI_MANUAL_SEARCH_KEEP, ButtonToolTips.SearchMode,
|
|
||||||
ButtonToolTips.SearchMode_JEIStandardKeep );
|
|
||||||
|
|
||||||
this.registerApp( 16 * 5 + 3, Settings.LEVEL_TYPE, LevelType.ENERGY_LEVEL, ButtonToolTips.LevelType, ButtonToolTips.LevelType_Energy );
|
this.registerApp( 16 * 5 + 3, Settings.LEVEL_TYPE, LevelType.ENERGY_LEVEL, ButtonToolTips.LevelType, ButtonToolTips.LevelType_Energy );
|
||||||
this.registerApp( 16 * 4 + 3, Settings.LEVEL_TYPE, LevelType.ITEM_LEVEL, ButtonToolTips.LevelType, ButtonToolTips.LevelType_Item );
|
this.registerApp( 16 * 4 + 3, Settings.LEVEL_TYPE, LevelType.ITEM_LEVEL, ButtonToolTips.LevelType, ButtonToolTips.LevelType_Item );
|
||||||
@@ -174,19 +171,15 @@ public class GuiImgButton extends GuiButton implements ITooltip
|
|||||||
this.registerApp( 16 * 11 + 2, Settings.CRAFT_VIA_REDSTONE, YesNo.YES, ButtonToolTips.EmitterMode, ButtonToolTips.CraftViaRedstone );
|
this.registerApp( 16 * 11 + 2, Settings.CRAFT_VIA_REDSTONE, YesNo.YES, ButtonToolTips.EmitterMode, ButtonToolTips.CraftViaRedstone );
|
||||||
this.registerApp( 16 * 11 + 1, Settings.CRAFT_VIA_REDSTONE, YesNo.NO, ButtonToolTips.EmitterMode, ButtonToolTips.EmitWhenCrafting );
|
this.registerApp( 16 * 11 + 1, Settings.CRAFT_VIA_REDSTONE, YesNo.NO, ButtonToolTips.EmitterMode, ButtonToolTips.EmitWhenCrafting );
|
||||||
|
|
||||||
this.registerApp( 16 * 3 + 5, Settings.STORAGE_FILTER, StorageFilter.EXTRACTABLE_ONLY, ButtonToolTips.ReportInaccessibleItems,
|
this.registerApp( 16 * 3 + 5, Settings.STORAGE_FILTER, StorageFilter.EXTRACTABLE_ONLY, ButtonToolTips.ReportInaccessibleItems, ButtonToolTips.ReportInaccessibleItemsNo );
|
||||||
ButtonToolTips.ReportInaccessibleItemsNo );
|
this.registerApp( 16 * 3 + 6, Settings.STORAGE_FILTER, StorageFilter.NONE, ButtonToolTips.ReportInaccessibleItems, ButtonToolTips.ReportInaccessibleItemsYes );
|
||||||
this.registerApp( 16 * 3 + 6, Settings.STORAGE_FILTER, StorageFilter.NONE, ButtonToolTips.ReportInaccessibleItems,
|
|
||||||
ButtonToolTips.ReportInaccessibleItemsYes );
|
|
||||||
|
|
||||||
this.registerApp( 16 * 14, Settings.PLACE_BLOCK, YesNo.YES, ButtonToolTips.BlockPlacement, ButtonToolTips.BlockPlacementYes );
|
this.registerApp( 16 * 14, Settings.PLACE_BLOCK, YesNo.YES, ButtonToolTips.BlockPlacement, ButtonToolTips.BlockPlacementYes );
|
||||||
this.registerApp( 16 * 14 + 1, Settings.PLACE_BLOCK, YesNo.NO, ButtonToolTips.BlockPlacement, ButtonToolTips.BlockPlacementNo );
|
this.registerApp( 16 * 14 + 1, Settings.PLACE_BLOCK, YesNo.NO, ButtonToolTips.BlockPlacement, ButtonToolTips.BlockPlacementNo );
|
||||||
|
|
||||||
this.registerApp( 16 * 15, Settings.SCHEDULING_MODE, SchedulingMode.DEFAULT, ButtonToolTips.SchedulingMode, ButtonToolTips.SchedulingModeDefault );
|
this.registerApp( 16 * 15, Settings.SCHEDULING_MODE, SchedulingMode.DEFAULT, ButtonToolTips.SchedulingMode, ButtonToolTips.SchedulingModeDefault );
|
||||||
this.registerApp( 16 * 15 + 1, Settings.SCHEDULING_MODE, SchedulingMode.ROUNDROBIN, ButtonToolTips.SchedulingMode,
|
this.registerApp( 16 * 15 + 1, Settings.SCHEDULING_MODE, SchedulingMode.ROUNDROBIN, ButtonToolTips.SchedulingMode, ButtonToolTips.SchedulingModeRoundRobin );
|
||||||
ButtonToolTips.SchedulingModeRoundRobin );
|
this.registerApp( 16 * 15 + 2, Settings.SCHEDULING_MODE, SchedulingMode.RANDOM, ButtonToolTips.SchedulingMode, ButtonToolTips.SchedulingModeRandom );
|
||||||
this.registerApp( 16 * 15 + 2, Settings.SCHEDULING_MODE, SchedulingMode.RANDOM, ButtonToolTips.SchedulingMode,
|
|
||||||
ButtonToolTips.SchedulingModeRandom );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,7 +329,7 @@ public class GuiImgButton extends GuiButton implements ITooltip
|
|||||||
{
|
{
|
||||||
i = 0;
|
i = 0;
|
||||||
}
|
}
|
||||||
while( i + 30 < sb.length() && ( i = sb.lastIndexOf( " ", i + 30 ) ) != -1 )
|
while ( i + 30 < sb.length() && ( i = sb.lastIndexOf( " ", i + 30 ) ) != -1 )
|
||||||
{
|
{
|
||||||
sb.replace( i, i + 1, "\n" );
|
sb.replace( i, i + 1, "\n" );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,14 +19,9 @@
|
|||||||
package appeng.client.render.model;
|
package appeng.client.render.model;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import appeng.block.storage.BlockDrive;
|
||||||
import java.util.List;
|
import appeng.block.storage.DriveSlotState;
|
||||||
import java.util.Map;
|
import appeng.block.storage.DriveSlotsState;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import javax.vecmath.Matrix4f;
|
|
||||||
import javax.vecmath.Vector3f;
|
|
||||||
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.client.renderer.block.model.BakedQuad;
|
import net.minecraft.client.renderer.block.model.BakedQuad;
|
||||||
import net.minecraft.client.renderer.block.model.IBakedModel;
|
import net.minecraft.client.renderer.block.model.IBakedModel;
|
||||||
@@ -37,9 +32,12 @@ import net.minecraft.util.EnumFacing;
|
|||||||
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
|
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
|
||||||
import net.minecraftforge.common.property.IExtendedBlockState;
|
import net.minecraftforge.common.property.IExtendedBlockState;
|
||||||
|
|
||||||
import appeng.block.storage.BlockDrive;
|
import javax.annotation.Nullable;
|
||||||
import appeng.block.storage.DriveSlotState;
|
import javax.vecmath.Matrix4f;
|
||||||
import appeng.block.storage.DriveSlotsState;
|
import javax.vecmath.Vector3f;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
public class DriveBakedModel implements IBakedModel
|
public class DriveBakedModel implements IBakedModel
|
||||||
@@ -57,13 +55,17 @@ public class DriveBakedModel implements IBakedModel
|
|||||||
public List<BakedQuad> getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand )
|
public List<BakedQuad> getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand )
|
||||||
{
|
{
|
||||||
|
|
||||||
List<BakedQuad> result = new ArrayList<>();
|
List<BakedQuad> result = new ArrayList<>( this.bakedBase.getQuads( state, side, rand ) );
|
||||||
|
|
||||||
result.addAll( this.bakedBase.getQuads( state, side, rand ) );
|
|
||||||
|
|
||||||
if( side == null && state instanceof IExtendedBlockState )
|
if( side == null && state instanceof IExtendedBlockState )
|
||||||
{
|
{
|
||||||
IExtendedBlockState extState = (IExtendedBlockState) state;
|
IExtendedBlockState extState = (IExtendedBlockState) state;
|
||||||
|
|
||||||
|
if (!extState.getUnlistedNames().contains( BlockDrive.SLOTS_STATE ))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
DriveSlotsState slotsState = extState.getValue( BlockDrive.SLOTS_STATE );
|
DriveSlotsState slotsState = extState.getValue( BlockDrive.SLOTS_STATE );
|
||||||
|
|
||||||
for( int row = 0; row < 5; row++ )
|
for( int row = 0; row < 5; row++ )
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import java.util.concurrent.Future;
|
|||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
@@ -149,6 +150,7 @@ public class ContainerCraftConfirm extends AEBaseContainer
|
|||||||
if( ccr.getCpu() == c )
|
if( ccr.getCpu() == c )
|
||||||
{
|
{
|
||||||
found = true;
|
found = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -345,11 +347,15 @@ public class ContainerCraftConfirm extends AEBaseContainer
|
|||||||
originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( ah instanceof PartExpandedProcessingPatternTerminal )
|
||||||
|
{
|
||||||
|
originalGui = GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL;
|
||||||
|
}
|
||||||
|
|
||||||
if( this.result != null && !this.isSimulation() )
|
if( this.result != null && !this.isSimulation() )
|
||||||
{
|
{
|
||||||
final ICraftingGrid cc = this.getGrid().getCache( ICraftingGrid.class );
|
final ICraftingGrid cc = this.getGrid().getCache( ICraftingGrid.class );
|
||||||
final ICraftingLink g = cc.submitJob( this.result, null, this.getSelectedCpu() == -1 ? null : this.cpus.get( this.getSelectedCpu() ).getCpu(), true,
|
final ICraftingLink g = cc.submitJob( this.result, null, this.getSelectedCpu() == -1 ? null : this.cpus.get( this.getSelectedCpu() ).getCpu(), true, this.getActionSrc() );
|
||||||
this.getActionSrc() );
|
|
||||||
this.setAutoStart( false );
|
this.setAutoStart( false );
|
||||||
if( g != null && originalGui != null && this.getOpenContext() != null )
|
if( g != null && originalGui != null && this.getOpenContext() != null )
|
||||||
{
|
{
|
||||||
|
|||||||
+528
@@ -0,0 +1,528 @@
|
|||||||
|
package appeng.container.implementations;
|
||||||
|
|
||||||
|
import appeng.api.AEApi;
|
||||||
|
import appeng.api.definitions.IDefinitions;
|
||||||
|
import appeng.api.storage.ITerminalHost;
|
||||||
|
import appeng.container.slot.*;
|
||||||
|
import appeng.helpers.IContainerCraftingPacket;
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import appeng.util.inv.IAEAppEngInventory;
|
||||||
|
import appeng.util.inv.InvOperation;
|
||||||
|
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.nbt.NBTBase;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
import net.minecraftforge.items.wrapper.PlayerInvWrapper;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static appeng.helpers.PatternHelper.PROCESSING_INPUT_LIMIT;
|
||||||
|
import static appeng.helpers.PatternHelper.PROCESSING_OUTPUT_LIMIT;
|
||||||
|
|
||||||
|
|
||||||
|
public class ContainerExpandedProcessingPatternTerm extends ContainerMEMonitorable implements IAEAppEngInventory, IOptionalSlotHost, IContainerCraftingPacket
|
||||||
|
{
|
||||||
|
private final IItemHandler crafting;
|
||||||
|
private final SlotFakeCraftingMatrix[] gridSlots = new SlotFakeCraftingMatrix[PROCESSING_INPUT_LIMIT];
|
||||||
|
private final OptionalSlotFake[] outputSlots = new OptionalSlotFake[PROCESSING_OUTPUT_LIMIT];
|
||||||
|
private final SlotRestrictedInput patternSlotIN;
|
||||||
|
private final SlotRestrictedInput patternSlotOUT;
|
||||||
|
private final PartExpandedProcessingPatternTerminal expandedProcessingPatternTerminal;
|
||||||
|
|
||||||
|
public ContainerExpandedProcessingPatternTerm( InventoryPlayer ip, ITerminalHost monitorable )
|
||||||
|
{
|
||||||
|
super( ip, monitorable, false );
|
||||||
|
|
||||||
|
this.expandedProcessingPatternTerminal = (PartExpandedProcessingPatternTerminal) monitorable;
|
||||||
|
|
||||||
|
final IItemHandler patternInv = this.getExpandedPatternTerminal().getInventoryByName( "pattern" );
|
||||||
|
final IItemHandler output = this.getExpandedPatternTerminal().getInventoryByName( "output" );
|
||||||
|
|
||||||
|
this.crafting = this.getExpandedPatternTerminal().getInventoryByName( "crafting" );
|
||||||
|
|
||||||
|
for( int y = 0; y < 4; y++ )
|
||||||
|
{
|
||||||
|
for( int x = 0; x < 4; x++ )
|
||||||
|
{
|
||||||
|
this.addSlotToContainer( this.gridSlots[x + y * 4] = new SlotFakeCraftingMatrix( this.crafting, x + y * 4, 4 + x * 18, -85 + y * 18 ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for( int y = 0; y < 3; y++ )
|
||||||
|
{
|
||||||
|
for( int x = 0; x < 2; x++ )
|
||||||
|
{
|
||||||
|
this.addSlotToContainer( this.outputSlots[x + y * 2] = new SlotPatternOutputs( output, this, x + y * 2, 96 + x * 18, -76 + y * 18, 0, 0, 1 ) );
|
||||||
|
this.outputSlots[x + y * 2].setRenderDisabled( false );
|
||||||
|
this.outputSlots[x + y * 2].setIIcon( -1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.addSlotToContainer( this.patternSlotIN = new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.BLANK_PATTERN, patternInv, 0, 147, -72 - 9, this.getInventoryPlayer() ) );
|
||||||
|
this.addSlotToContainer( this.patternSlotOUT = new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.ENCODED_PATTERN, patternInv, 1, 147, -72 + 34, this.getInventoryPlayer() ) );
|
||||||
|
|
||||||
|
this.patternSlotOUT.setStackLimit( 1 );
|
||||||
|
|
||||||
|
this.bindPlayerInventory( ip, 0, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack transferStackInSlot( final EntityPlayer p, final int idx )
|
||||||
|
{
|
||||||
|
if( Platform.isClient() )
|
||||||
|
{
|
||||||
|
return ItemStack.EMPTY;
|
||||||
|
}
|
||||||
|
if( this.inventorySlots.get( idx ) instanceof SlotPlayerInv || this.inventorySlots.get( idx ) instanceof SlotPlayerHotBar )
|
||||||
|
{
|
||||||
|
final AppEngSlot clickSlot = (AppEngSlot) this.inventorySlots.get( idx ); // require AE SLots!
|
||||||
|
ItemStack itemStack = clickSlot.getStack();
|
||||||
|
if( AEApi.instance().definitions().materials().blankPattern().isSameAs( itemStack ) )
|
||||||
|
{
|
||||||
|
IItemHandler patternInv = this.getExpandedPatternTerminal().getInventoryByName( "pattern" );
|
||||||
|
ItemStack remainder = patternInv.insertItem( 0, itemStack, false );
|
||||||
|
clickSlot.putStack( remainder );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.transferStackInSlot( p, idx );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveChanges()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onChangeInventory( final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removedStack, final ItemStack newStack )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void encodeAndMoveToInventory()
|
||||||
|
{
|
||||||
|
encode();
|
||||||
|
ItemStack output = this.patternSlotOUT.getStack();
|
||||||
|
if( !output.isEmpty() )
|
||||||
|
{
|
||||||
|
if( !getPlayerInv().addItemStackToInventory( output ) )
|
||||||
|
{
|
||||||
|
getPlayerInv().player.dropItem( output, false );
|
||||||
|
}
|
||||||
|
this.patternSlotOUT.putStack( ItemStack.EMPTY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void encode()
|
||||||
|
{
|
||||||
|
ItemStack output = this.patternSlotOUT.getStack();
|
||||||
|
|
||||||
|
final ItemStack[] in = this.getInputs();
|
||||||
|
final ItemStack[] out = this.getOutputs();
|
||||||
|
|
||||||
|
// if there is no input, this would be silly.
|
||||||
|
if( in == null || out == null )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// first check the output slots, should either be null, or a pattern
|
||||||
|
if( !output.isEmpty() && !this.isPattern( output ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
} // if nothing is there we should snag a new pattern.
|
||||||
|
else if( output.isEmpty() )
|
||||||
|
{
|
||||||
|
output = this.patternSlotIN.getStack();
|
||||||
|
if( output.isEmpty() || !this.isPattern( output ) )
|
||||||
|
{
|
||||||
|
return; // no blanks.
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove one, and clear the input slot.
|
||||||
|
output.setCount( output.getCount() - 1 );
|
||||||
|
if( output.getCount() == 0 )
|
||||||
|
{
|
||||||
|
this.patternSlotIN.putStack( ItemStack.EMPTY );
|
||||||
|
}
|
||||||
|
|
||||||
|
// add a new encoded pattern.
|
||||||
|
Optional<ItemStack> maybePattern = AEApi.instance().definitions().items().encodedPattern().maybeStack( 1 );
|
||||||
|
if( maybePattern.isPresent() )
|
||||||
|
{
|
||||||
|
output = maybePattern.get();
|
||||||
|
this.patternSlotOUT.putStack( output );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// encode the slot.
|
||||||
|
final NBTTagCompound encodedValue = new NBTTagCompound();
|
||||||
|
|
||||||
|
final NBTTagList tagIn = new NBTTagList();
|
||||||
|
final NBTTagList tagOut = new NBTTagList();
|
||||||
|
|
||||||
|
for( final ItemStack i : in )
|
||||||
|
{
|
||||||
|
tagIn.appendTag( this.createItemTag( i ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( final ItemStack i : out )
|
||||||
|
{
|
||||||
|
tagOut.appendTag( this.createItemTag( i ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
encodedValue.setTag( "in", tagIn );
|
||||||
|
encodedValue.setTag( "out", tagOut );
|
||||||
|
encodedValue.setBoolean( "crafting", false );
|
||||||
|
encodedValue.setBoolean( "substitute", false );
|
||||||
|
|
||||||
|
output.setTagCompound( encodedValue );
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isPattern( final ItemStack output )
|
||||||
|
{
|
||||||
|
if( output.isEmpty() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final IDefinitions definitions = AEApi.instance().definitions();
|
||||||
|
|
||||||
|
boolean isPattern = definitions.items().encodedPattern().isSameAs( output );
|
||||||
|
isPattern |= definitions.materials().blankPattern().isSameAs( output );
|
||||||
|
|
||||||
|
return isPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
NBTBase createItemTag( final ItemStack i )
|
||||||
|
{
|
||||||
|
final NBTTagCompound c = new NBTTagCompound();
|
||||||
|
|
||||||
|
if( !i.isEmpty() )
|
||||||
|
{
|
||||||
|
i.writeToNBT( c );
|
||||||
|
}
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSlotEnabled( final int idx )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ItemStack[] getInputs()
|
||||||
|
{
|
||||||
|
final ItemStack[] input = new ItemStack[16];
|
||||||
|
boolean hasValue = false;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() )
|
||||||
|
{
|
||||||
|
hasValue = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( hasValue )
|
||||||
|
{
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ItemStack[] getOutputs()
|
||||||
|
{
|
||||||
|
final List<ItemStack> list = new ArrayList<>( 3 );
|
||||||
|
boolean hasValue = false;
|
||||||
|
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
|
||||||
|
if( !out.isEmpty() && out.getCount() > 0 )
|
||||||
|
{
|
||||||
|
list.add( out );
|
||||||
|
hasValue = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( hasValue )
|
||||||
|
{
|
||||||
|
return list.toArray( new ItemStack[0] );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear()
|
||||||
|
{
|
||||||
|
for( final Slot s : this.gridSlots )
|
||||||
|
{
|
||||||
|
s.putStack( ItemStack.EMPTY );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( final Slot s : this.outputSlots )
|
||||||
|
{
|
||||||
|
s.putStack( ItemStack.EMPTY );
|
||||||
|
}
|
||||||
|
|
||||||
|
this.detectAndSendChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IItemHandler getInventoryByName( final String name )
|
||||||
|
{
|
||||||
|
if( name.equals( "player" ) )
|
||||||
|
{
|
||||||
|
return new PlayerInvWrapper( this.getInventoryPlayer() );
|
||||||
|
}
|
||||||
|
return this.getExpandedPatternTerminal().getInventoryByName( name );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useRealItems()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PartExpandedProcessingPatternTerminal getExpandedPatternTerminal()
|
||||||
|
{
|
||||||
|
return this.expandedProcessingPatternTerminal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void multiply( int multiple )
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[gridSlots.length];
|
||||||
|
boolean canMultiplyInputs = true;
|
||||||
|
boolean canMultiplyOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() * multiple > input[x].getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canMultiplyInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() * multiple > out.getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canMultiplyOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canMultiplyInputs && canMultiplyOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.gridSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() * multiple );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() * multiple );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void divide( int divide )
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[gridSlots.length];
|
||||||
|
boolean canDivideInputs = true;
|
||||||
|
boolean canDivideOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() % divide != 0 )
|
||||||
|
{
|
||||||
|
canDivideInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() % divide != 0 )
|
||||||
|
{
|
||||||
|
canDivideOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canDivideInputs && canDivideOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.gridSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() / divide );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() / divide );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void increase( int increase )
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[gridSlots.length];
|
||||||
|
boolean canIncreaseInputs = true;
|
||||||
|
boolean canIncreaseOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() + increase > input[x].getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canIncreaseInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() + increase > out.getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canIncreaseOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canIncreaseInputs && canIncreaseOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.gridSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() + increase );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() + increase );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void decrease( int decrease )
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[gridSlots.length];
|
||||||
|
boolean canDecreaseInputs = true;
|
||||||
|
boolean canDecreaseOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() - decrease < 1 )
|
||||||
|
{
|
||||||
|
canDecreaseInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() - decrease < 1 )
|
||||||
|
{
|
||||||
|
canDecreaseOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canDecreaseInputs && canDecreaseOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.gridSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() - decrease );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() - decrease );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void maximizeCount()
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[gridSlots.length];
|
||||||
|
boolean canGrowInputs = true;
|
||||||
|
boolean canGrowOutputs = true;
|
||||||
|
int maxInputStackGrowth = 0;
|
||||||
|
int maxOutputStackGrowth = 0;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getMaxStackSize() - input[x].getCount() > maxInputStackGrowth )
|
||||||
|
{
|
||||||
|
maxInputStackGrowth = input[x].getMaxStackSize() - input[x].getCount();
|
||||||
|
}
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() + maxInputStackGrowth > input[x].getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canGrowInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
{
|
||||||
|
maxOutputStackGrowth = out.getMaxStackSize() - out.getCount();
|
||||||
|
}
|
||||||
|
if( !out.isEmpty() && out.getCount() + maxOutputStackGrowth > out.getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canGrowOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canGrowInputs && canGrowOutputs )
|
||||||
|
{
|
||||||
|
int maxStackGrowth = Math.min( maxInputStackGrowth, maxOutputStackGrowth );
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.gridSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() + maxStackGrowth );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() + maxStackGrowth );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,140 @@
|
|||||||
|
package appeng.container.implementations;
|
||||||
|
|
||||||
|
import appeng.api.AEApi;
|
||||||
|
import appeng.api.config.*;
|
||||||
|
import appeng.api.storage.IMEInventory;
|
||||||
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
|
import appeng.container.AEBaseContainer;
|
||||||
|
import appeng.container.guisync.GuiSync;
|
||||||
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
|
import appeng.core.sync.packets.PacketValueConfig;
|
||||||
|
import appeng.parts.misc.PartOreDicStorageBus;
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
import appeng.util.item.OreReference;
|
||||||
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
|
import net.minecraftforge.oredict.OreDictionary;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
|
public class ContainerOreDictStorageBus extends AEBaseContainer
|
||||||
|
{
|
||||||
|
private final PartOreDicStorageBus part;
|
||||||
|
|
||||||
|
@GuiSync( 3 )
|
||||||
|
public AccessRestriction rwMode = AccessRestriction.READ_WRITE;
|
||||||
|
|
||||||
|
@GuiSync( 4 )
|
||||||
|
public StorageFilter storageFilter = StorageFilter.EXTRACTABLE_ONLY;
|
||||||
|
|
||||||
|
public ContainerOreDictStorageBus( final InventoryPlayer ip, final PartOreDicStorageBus anchor )
|
||||||
|
{
|
||||||
|
super( ip, anchor );
|
||||||
|
this.part = anchor;
|
||||||
|
|
||||||
|
this.bindPlayerInventory( ip, 14, 256 - /* height of player inventory */82 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void detectAndSendChanges()
|
||||||
|
{
|
||||||
|
this.verifyPermissions( SecurityPermissions.BUILD, false );
|
||||||
|
|
||||||
|
if( Platform.isServer() )
|
||||||
|
{
|
||||||
|
this.setReadWriteMode( (AccessRestriction) part.getConfigManager().getSetting( Settings.ACCESS ) );
|
||||||
|
this.setStorageFilter( (StorageFilter) part.getConfigManager().getSetting( Settings.STORAGE_FILTER ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
super.detectAndSendChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void partition()
|
||||||
|
{
|
||||||
|
final IMEInventory<IAEItemStack> cellInv = this.part.getInternalHandler();
|
||||||
|
|
||||||
|
if( cellInv == null )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Integer> oreIDs = new HashSet<>();
|
||||||
|
|
||||||
|
for( IAEItemStack itemStack : cellInv.getAvailableItems( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList() ) )
|
||||||
|
{
|
||||||
|
OreReference ref = ( (AEItemStack) itemStack ).getOre().orElse( null );
|
||||||
|
if( ref != null )
|
||||||
|
{
|
||||||
|
oreIDs.addAll( ref.getOres() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String oreMatch = "(";
|
||||||
|
String append = "";
|
||||||
|
|
||||||
|
for( Iterator<Integer> it = oreIDs.iterator(); it.hasNext(); )
|
||||||
|
{
|
||||||
|
int oreID = it.next();
|
||||||
|
if( it.hasNext() )
|
||||||
|
{
|
||||||
|
append = ")|(";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
append = ")";
|
||||||
|
}
|
||||||
|
oreMatch = oreMatch.concat( OreDictionary.getOreName( oreID ) + append );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( oreMatch.equals( "(" ) )
|
||||||
|
{
|
||||||
|
oreMatch = "";
|
||||||
|
}
|
||||||
|
part.saveOreMatch( oreMatch );
|
||||||
|
|
||||||
|
this.detectAndSendChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveOreMatch( String value )
|
||||||
|
{
|
||||||
|
part.saveOreMatch( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendRegex()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendTo( new PacketValueConfig( "OreDictStorageBus.sendRegex", part.getOreExp() ), (EntityPlayerMP) getInventoryPlayer().player );
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessRestriction getReadWriteMode()
|
||||||
|
{
|
||||||
|
return this.rwMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setReadWriteMode( final AccessRestriction rwMode )
|
||||||
|
{
|
||||||
|
this.rwMode = rwMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageFilter getStorageFilter()
|
||||||
|
{
|
||||||
|
return this.storageFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setStorageFilter( final StorageFilter storageFilter )
|
||||||
|
{
|
||||||
|
this.storageFilter = storageFilter;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -178,7 +178,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
this.getAndUpdateOutput();
|
this.getAndUpdateOutput();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemStack getAndUpdateOutput()
|
protected ItemStack getAndUpdateOutput()
|
||||||
{
|
{
|
||||||
final World world = this.getPlayerInv().player.world;
|
final World world = this.getPlayerInv().player.world;
|
||||||
final InventoryCrafting ic = new InventoryCrafting( this, 3, 3 );
|
final InventoryCrafting ic = new InventoryCrafting( this, 3, 3 );
|
||||||
@@ -505,7 +505,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemStack[] getInputs()
|
protected ItemStack[] getInputs()
|
||||||
{
|
{
|
||||||
final ItemStack[] input = new ItemStack[9];
|
final ItemStack[] input = new ItemStack[9];
|
||||||
boolean hasValue = false;
|
boolean hasValue = false;
|
||||||
@@ -527,7 +527,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemStack[] getOutputs()
|
protected ItemStack[] getOutputs()
|
||||||
{
|
{
|
||||||
if( this.isCraftingMode() )
|
if( this.isCraftingMode() )
|
||||||
{
|
{
|
||||||
@@ -535,7 +535,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
|
|
||||||
if( !out.isEmpty() && out.getCount() > 0 )
|
if( !out.isEmpty() && out.getCount() > 0 )
|
||||||
{
|
{
|
||||||
return new ItemStack[] { out };
|
return new ItemStack[]{out};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -563,7 +563,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isPattern( final ItemStack output )
|
boolean isPattern( final ItemStack output )
|
||||||
{
|
{
|
||||||
if( output.isEmpty() )
|
if( output.isEmpty() )
|
||||||
{
|
{
|
||||||
@@ -578,7 +578,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
return isPattern;
|
return isPattern;
|
||||||
}
|
}
|
||||||
|
|
||||||
private NBTBase createItemTag( final ItemStack i )
|
NBTBase createItemTag( final ItemStack i )
|
||||||
{
|
{
|
||||||
final NBTTagCompound c = new NBTTagCompound();
|
final NBTTagCompound c = new NBTTagCompound();
|
||||||
|
|
||||||
@@ -824,7 +824,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
return this.patternTerminal;
|
return this.patternTerminal;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSubstitute()
|
boolean isSubstitute()
|
||||||
{
|
{
|
||||||
return this.substitute;
|
return this.substitute;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,11 +20,7 @@ package appeng.core;
|
|||||||
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Arrays;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
@@ -64,13 +60,67 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
|||||||
private static AEConfig instance;
|
private static AEConfig instance;
|
||||||
|
|
||||||
// Default Grindstone ores
|
// Default Grindstone ores
|
||||||
private static final String[] ORES_VANILLA = { "Obsidian", "Ender", "EnderPearl", "Coal", "Iron", "Gold", "Charcoal", "NetherQuartz" };
|
private static final String[] ORES_VANILLA = {
|
||||||
private static final String[] ORES_AE = { "CertusQuartz", "Wheat", "Fluix" };
|
"Obsidian", "Ender", "EnderPearl", "Coal", "Iron", "Gold",
|
||||||
private static final String[] ORES_COMMON = { "Copper", "Tin", "Silver", "Lead", "Bronze" };
|
"Charcoal", "NetherQuartz"
|
||||||
private static final String[] ORES_MISC = { "Brass", "Platinum", "Nickel", "Invar", "Aluminium", "Electrum", "Osmium", "Zinc" };
|
};
|
||||||
|
private static final String[] ORES_AE = {"CertusQuartz", "Wheat", "Fluix"};
|
||||||
|
private static final String[] ORES_COMMON = {
|
||||||
|
"Copper", "Tin", "Silver", "Lead", "Bronze"
|
||||||
|
};
|
||||||
|
private static final String[] ORES_MISC = {
|
||||||
|
"Brass", "Platinum", "Nickel", "Invar", "Aluminium", "Electrum",
|
||||||
|
"Osmium", "Zinc"
|
||||||
|
};
|
||||||
|
|
||||||
|
private String[] nonBlockingItems = {
|
||||||
|
"[gregtech|actuallyadditions]", "gregtech:circuit.integrated",
|
||||||
|
"gregtech:shape.mold.plate", "gregtech:shape.mold.gear",
|
||||||
|
"gregtech:shape.mold.credit", "gregtech:shape.mold.bottle",
|
||||||
|
"gregtech:shape.mold.ingot", "gregtech:shape.mold.ball",
|
||||||
|
"gregtech:shape.mold.block", "gregtech:shape.mold.nugget",
|
||||||
|
"gregtech:shape.mold.cylinder", "gregtech:shape.mold.anvil",
|
||||||
|
"gregtech:shape.mold.name", "gregtech:shape.mold.gear.small",
|
||||||
|
"gregtech:shape.mold.rotor", "gregtech:shape.extruder.plate",
|
||||||
|
"gregtech:shape.extruder.rod", "gregtech:shape.extruder.bolt",
|
||||||
|
"gregtech:shape.extruder.ring", "gregtech:shape.extruder.cell",
|
||||||
|
"gregtech:shape.extruder.ingot", "gregtech:shape.extruder.wire",
|
||||||
|
"gregtech:shape.extruder.pipe.tiny",
|
||||||
|
"gregtech:shape.extruder.pipe.small",
|
||||||
|
"gregtech:shape.extruder.pipe.medium",
|
||||||
|
"gregtech:shape.extruder.pipe.normal",
|
||||||
|
"gregtech:shape.extruder.pipe.large",
|
||||||
|
"gregtech:shape.extruder.pipe.huge",
|
||||||
|
"gregtech:shape.extruder.block", "gregtech:shape.extruder.sword",
|
||||||
|
"gregtech:shape.extruder.pickaxe", "gregtech:shape.extruder.shovel",
|
||||||
|
"gregtech:shape.extruder.axe", "gregtech:shape.extruder.hoe",
|
||||||
|
"gregtech:shape.extruder.hammer", "gregtech:shape.extruder.file",
|
||||||
|
"gregtech:shape.extruder.saw", "gregtech:shape.extruder.gear",
|
||||||
|
"gregtech:shape.extruder.bottle", "gregtech:shape.extruder.foil",
|
||||||
|
"gregtech:shape.extruder.gear_small",
|
||||||
|
"gregtech:shape.extruder.rod_long", "gregtech:shape.extruder.rotor",
|
||||||
|
"gregtech:glass_lens.white", "gregtech:glass_lens.orange",
|
||||||
|
"gregtech:glass_lens.magenta", "gregtech:glass_lens.light_blue",
|
||||||
|
"gregtech:glass_lens.yellow", "gregtech:glass_lens.lime",
|
||||||
|
"gregtech:glass_lens.pink", "gregtech:glass_lens.gray",
|
||||||
|
"gregtech:glass_lens.light_gray", "gregtech:glass_lens.cyan",
|
||||||
|
"gregtech:glass_lens.purple", "gregtech:glass_lens.blue",
|
||||||
|
"gregtech:glass_lens.brown", "gregtech:glass_lens.green",
|
||||||
|
"gregtech:glass_lens.red", "gregtech:glass_lens.black",
|
||||||
|
"contenttweaker:smallgearextrudershape",
|
||||||
|
"contenttweaker:creativeportabletankmold", "ore:lensAlmandine",
|
||||||
|
"ore:lensBlueTopaz", "ore:lensDiamond", "ore:lensEmerald",
|
||||||
|
"ore:lensGreenSapphire", "ore:lensRutile", "ore:lensRuby",
|
||||||
|
"ore:lensSapphire", "ore:lensTopaz", "ore:lensJasper",
|
||||||
|
"ore:lensGlass", "ore:lensOlivine", "ore:lensOpal",
|
||||||
|
"ore:lensAmethyst", "ore:lensLapis", "ore:lensEnderPearl",
|
||||||
|
"ore:lensEnderEye", "ore:lensGarnetRed", "ore:lensGarnetYellow",
|
||||||
|
"ore:lensVinteum", "ore:lensNetherStar",
|
||||||
|
};
|
||||||
|
|
||||||
// Default Energy Conversion Rates
|
// Default Energy Conversion Rates
|
||||||
private static final double DEFAULT_IC2_EXCHANGE = 2.0;
|
private static final double DEFAULT_IC2_EXCHANGE = 2.0;
|
||||||
|
private static final double DEFAULT_GTEU_EXCHANGE = 2.0;
|
||||||
private static final double DEFAULT_RF_EXCHANGE = 0.5;
|
private static final double DEFAULT_RF_EXCHANGE = 0.5;
|
||||||
|
|
||||||
private final IConfigManager settings = new ConfigManager( this );
|
private final IConfigManager settings = new ConfigManager( this );
|
||||||
@@ -90,10 +140,10 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
|||||||
private PowerUnits selectedPowerUnit = PowerUnits.AE;
|
private PowerUnits selectedPowerUnit = PowerUnits.AE;
|
||||||
|
|
||||||
// GUI Buttons
|
// GUI Buttons
|
||||||
private final int[] craftByStacks = { 1, 10, 100, 1000 };
|
private final int[] craftByStacks = {1, 10, 100, 1000};
|
||||||
private final int[] priorityByStacks = { 1, 10, 100, 1000 };
|
private final int[] priorityByStacks = {1, 10, 100, 1000};
|
||||||
private final int[] levelByStacks = { 1, 10, 100, 1000 };
|
private final int[] levelByStacks = {1, 10, 100, 1000};
|
||||||
private final int[] levelByMillibuckets = { 10, 100, 1000, 10000 };
|
private final int[] levelByMillibuckets = {10, 100, 1000, 10000};
|
||||||
|
|
||||||
// Spatial IO/Dimension
|
// Spatial IO/Dimension
|
||||||
private int storageProviderID = -1;
|
private int storageProviderID = -1;
|
||||||
@@ -125,7 +175,7 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
|||||||
private int minMeteoriteDistanceSq = this.minMeteoriteDistance * this.minMeteoriteDistance;
|
private int minMeteoriteDistanceSq = this.minMeteoriteDistance * this.minMeteoriteDistance;
|
||||||
private double meteoriteClusterChance = 0.1;
|
private double meteoriteClusterChance = 0.1;
|
||||||
private int meteoriteMaximumSpawnHeight = 180;
|
private int meteoriteMaximumSpawnHeight = 180;
|
||||||
private int[] meteoriteDimensionWhitelist = { 0 };
|
private int[] meteoriteDimensionWhitelist = {0};
|
||||||
|
|
||||||
// Wireless
|
// Wireless
|
||||||
private double wirelessBaseCost = 8;
|
private double wirelessBaseCost = 8;
|
||||||
@@ -148,6 +198,7 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
|||||||
|
|
||||||
PowerUnits.EU.conversionRatio = this.get( "PowerRatios", "IC2", DEFAULT_IC2_EXCHANGE ).getDouble( DEFAULT_IC2_EXCHANGE );
|
PowerUnits.EU.conversionRatio = this.get( "PowerRatios", "IC2", DEFAULT_IC2_EXCHANGE ).getDouble( DEFAULT_IC2_EXCHANGE );
|
||||||
PowerUnits.RF.conversionRatio = this.get( "PowerRatios", "ForgeEnergy", DEFAULT_RF_EXCHANGE ).getDouble( DEFAULT_RF_EXCHANGE );
|
PowerUnits.RF.conversionRatio = this.get( "PowerRatios", "ForgeEnergy", DEFAULT_RF_EXCHANGE ).getDouble( DEFAULT_RF_EXCHANGE );
|
||||||
|
PowerUnits.GTEU.conversionRatio = this.get( "PowerRatios", "GTEU", DEFAULT_GTEU_EXCHANGE ).getDouble( DEFAULT_GTEU_EXCHANGE );
|
||||||
|
|
||||||
final double usageEffective = this.get( "PowerRatios", "UsageMultiplier", 1.0 ).getDouble( 1.0 );
|
final double usageEffective = this.get( "PowerRatios", "UsageMultiplier", 1.0 ).getDouble( 1.0 );
|
||||||
PowerMultiplier.CONFIG.multiplier = Math.max( 0.01, usageEffective );
|
PowerMultiplier.CONFIG.multiplier = Math.max( 0.01, usageEffective );
|
||||||
@@ -155,32 +206,24 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
|||||||
CondenserOutput.MATTER_BALLS.requiredPower = this.get( "Condenser", "MatterBalls", 256 ).getInt( 256 );
|
CondenserOutput.MATTER_BALLS.requiredPower = this.get( "Condenser", "MatterBalls", 256 ).getInt( 256 );
|
||||||
CondenserOutput.SINGULARITY.requiredPower = this.get( "Condenser", "Singularity", 256000 ).getInt( 256000 );
|
CondenserOutput.SINGULARITY.requiredPower = this.get( "Condenser", "Singularity", 256000 ).getInt( 256000 );
|
||||||
|
|
||||||
this.removeCrashingItemsOnLoad = this.get( "general", "removeCrashingItemsOnLoad", false,
|
this.removeCrashingItemsOnLoad = this.get( "general", "removeCrashingItemsOnLoad", false, "Will auto-remove items that crash when being loaded from storage. This will destroy those items instead of crashing the game!" ).getBoolean();
|
||||||
"Will auto-remove items that crash when being loaded from storage. This will destroy those items instead of crashing the game!" ).getBoolean();
|
|
||||||
|
|
||||||
this.setCategoryComment( "GrindStone",
|
this.setCategoryComment( "BlockingMode", "Map of items to not block when blockingmode is enabled.\n[modid]\nmodid:item:metadata(optional,default:0)\nSupports more than one modid, so you can block different things between, for example, gregtech or enderio" );
|
||||||
"Creates recipe of the following pattern automatically: '1 oreTYPE => 2 dustTYPE' and '(1 ingotTYPE or 1 crystalTYPE or 1 gemTYPE) => 1 dustTYPE'" );
|
this.nonBlockingItems = this.get( "BlockingMode", "nonBlockingItems", nonBlockingItems, "NonBlockingItems" ).getStringList();
|
||||||
this.grinderOres = this.get( "GrindStone", "grinderOres", this.grinderOres, "The list of types to handle. Specify without a prefix like ore or dust." )
|
|
||||||
.getStringList();
|
this.setCategoryComment( "GrindStone", "Creates recipe of the following pattern automatically: '1 oreTYPE => 2 dustTYPE' and '(1 ingotTYPE or 1 crystalTYPE or 1 gemTYPE) => 1 dustTYPE'" );
|
||||||
this.grinderBlackList = Sets.newHashSet(
|
this.grinderOres = this.get( "GrindStone", "grinderOres", this.grinderOres, "The list of types to handle. Specify without a prefix like ore or dust." ).getStringList();
|
||||||
this.get( "GrindStone", "blacklist", new String[] {}, "Blacklists the exact oredict name from being handled by any recipe." )
|
this.grinderBlackList = Sets.newHashSet( this.get( "GrindStone", "blacklist", new String[]{}, "Blacklists the exact oredict name from being handled by any recipe." ).getStringList() );
|
||||||
.getStringList() );
|
this.oreDoublePercentage = this.get( "GrindStone", "oreDoublePercentage", this.oreDoublePercentage, "Chance to actually get an output with stacksize > 1." ).getDouble( this.oreDoublePercentage );
|
||||||
this.oreDoublePercentage = this
|
|
||||||
.get( "GrindStone", "oreDoublePercentage", this.oreDoublePercentage, "Chance to actually get an output with stacksize > 1." )
|
|
||||||
.getDouble( this.oreDoublePercentage );
|
|
||||||
|
|
||||||
this.settings.registerSetting( Settings.SEARCH_TOOLTIPS, YesNo.YES );
|
this.settings.registerSetting( Settings.SEARCH_TOOLTIPS, YesNo.YES );
|
||||||
this.settings.registerSetting( Settings.TERMINAL_STYLE, TerminalStyle.TALL );
|
this.settings.registerSetting( Settings.TERMINAL_STYLE, TerminalStyle.TALL );
|
||||||
this.settings.registerSetting( Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH );
|
this.settings.registerSetting( Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH );
|
||||||
|
|
||||||
this.spawnChargedChance = (float) ( 1.0 - this.get( "worldGen", "spawnChargedChance", 1.0 - this.spawnChargedChance )
|
this.spawnChargedChance = (float) ( 1.0 - this.get( "worldGen", "spawnChargedChance", 1.0 - this.spawnChargedChance ).getDouble( 1.0 - this.spawnChargedChance ) );
|
||||||
.getDouble(
|
|
||||||
1.0 - this.spawnChargedChance ) );
|
|
||||||
this.minMeteoriteDistance = this.get( "worldGen", "minMeteoriteDistance", this.minMeteoriteDistance ).getInt( this.minMeteoriteDistance );
|
this.minMeteoriteDistance = this.get( "worldGen", "minMeteoriteDistance", this.minMeteoriteDistance ).getInt( this.minMeteoriteDistance );
|
||||||
this.meteoriteClusterChance = this.get( "worldGen", "meteoriteClusterChance", this.meteoriteClusterChance ).getDouble( this.meteoriteClusterChance );
|
this.meteoriteClusterChance = this.get( "worldGen", "meteoriteClusterChance", this.meteoriteClusterChance ).getDouble( this.meteoriteClusterChance );
|
||||||
this.meteoriteMaximumSpawnHeight = this.get( "worldGen", "meteoriteMaximumSpawnHeight", this.meteoriteMaximumSpawnHeight )
|
this.meteoriteMaximumSpawnHeight = this.get( "worldGen", "meteoriteMaximumSpawnHeight", this.meteoriteMaximumSpawnHeight ).getInt( this.meteoriteMaximumSpawnHeight );
|
||||||
.getInt(
|
|
||||||
this.meteoriteMaximumSpawnHeight );
|
|
||||||
this.meteoriteDimensionWhitelist = this.get( "worldGen", "meteoriteDimensionWhitelist", this.meteoriteDimensionWhitelist ).getIntList();
|
this.meteoriteDimensionWhitelist = this.get( "worldGen", "meteoriteDimensionWhitelist", this.meteoriteDimensionWhitelist ).getIntList();
|
||||||
|
|
||||||
this.quartzOresPerCluster = this.get( "worldGen", "quartzOresPerCluster", this.quartzOresPerCluster ).getInt( this.quartzOresPerCluster );
|
this.quartzOresPerCluster = this.get( "worldGen", "quartzOresPerCluster", this.quartzOresPerCluster ).getInt( this.quartzOresPerCluster );
|
||||||
@@ -188,23 +231,16 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
|||||||
|
|
||||||
this.minMeteoriteDistanceSq = this.minMeteoriteDistance * this.minMeteoriteDistance;
|
this.minMeteoriteDistanceSq = this.minMeteoriteDistance * this.minMeteoriteDistance;
|
||||||
|
|
||||||
this.addCustomCategoryComment( "wireless",
|
this.addCustomCategoryComment( "wireless", "Range= wirelessBaseRange + wirelessBoosterRangeMultiplier * Math.pow( boosters, wirelessBoosterExp )\nPowerDrain= wirelessBaseCost + wirelessCostMultiplier * Math.pow( boosters, 1 + boosters / wirelessHighWirelessCount )" );
|
||||||
"Range= wirelessBaseRange + wirelessBoosterRangeMultiplier * Math.pow( boosters, wirelessBoosterExp )\nPowerDrain= wirelessBaseCost + wirelessCostMultiplier * Math.pow( boosters, 1 + boosters / wirelessHighWirelessCount )" );
|
|
||||||
|
|
||||||
this.wirelessBaseCost = this.get( "wireless", "wirelessBaseCost", this.wirelessBaseCost ).getDouble( this.wirelessBaseCost );
|
this.wirelessBaseCost = this.get( "wireless", "wirelessBaseCost", this.wirelessBaseCost ).getDouble( this.wirelessBaseCost );
|
||||||
this.wirelessCostMultiplier = this.get( "wireless", "wirelessCostMultiplier", this.wirelessCostMultiplier ).getDouble( this.wirelessCostMultiplier );
|
this.wirelessCostMultiplier = this.get( "wireless", "wirelessCostMultiplier", this.wirelessCostMultiplier ).getDouble( this.wirelessCostMultiplier );
|
||||||
this.wirelessBaseRange = this.get( "wireless", "wirelessBaseRange", this.wirelessBaseRange ).getDouble( this.wirelessBaseRange );
|
this.wirelessBaseRange = this.get( "wireless", "wirelessBaseRange", this.wirelessBaseRange ).getDouble( this.wirelessBaseRange );
|
||||||
this.wirelessBoosterRangeMultiplier = this.get( "wireless", "wirelessBoosterRangeMultiplier", this.wirelessBoosterRangeMultiplier )
|
this.wirelessBoosterRangeMultiplier = this.get( "wireless", "wirelessBoosterRangeMultiplier", this.wirelessBoosterRangeMultiplier ).getDouble( this.wirelessBoosterRangeMultiplier );
|
||||||
.getDouble(
|
|
||||||
this.wirelessBoosterRangeMultiplier );
|
|
||||||
this.wirelessBoosterExp = this.get( "wireless", "wirelessBoosterExp", this.wirelessBoosterExp ).getDouble( this.wirelessBoosterExp );
|
this.wirelessBoosterExp = this.get( "wireless", "wirelessBoosterExp", this.wirelessBoosterExp ).getDouble( this.wirelessBoosterExp );
|
||||||
this.wirelessTerminalDrainMultiplier = this.get( "wireless", "wirelessTerminalDrainMultiplier", this.wirelessTerminalDrainMultiplier )
|
this.wirelessTerminalDrainMultiplier = this.get( "wireless", "wirelessTerminalDrainMultiplier", this.wirelessTerminalDrainMultiplier ).getDouble( this.wirelessTerminalDrainMultiplier );
|
||||||
.getDouble(
|
|
||||||
this.wirelessTerminalDrainMultiplier );
|
|
||||||
|
|
||||||
this.formationPlaneEntityLimit = this.get( "automation", "formationPlaneEntityLimit", this.formationPlaneEntityLimit )
|
this.formationPlaneEntityLimit = this.get( "automation", "formationPlaneEntityLimit", this.formationPlaneEntityLimit ).getInt( this.formationPlaneEntityLimit );
|
||||||
.getInt(
|
|
||||||
this.formationPlaneEntityLimit );
|
|
||||||
|
|
||||||
this.wirelessTerminalBattery = this.get( "battery", "wirelessTerminal", this.wirelessTerminalBattery ).getInt( this.wirelessTerminalBattery );
|
this.wirelessTerminalBattery = this.get( "battery", "wirelessTerminal", this.wirelessTerminalBattery ).getInt( this.wirelessTerminalBattery );
|
||||||
this.chargedStaffBattery = this.get( "battery", "chargedStaff", this.chargedStaffBattery ).getInt( this.chargedStaffBattery );
|
this.chargedStaffBattery = this.get( "battery", "chargedStaff", this.chargedStaffBattery ).getInt( this.chargedStaffBattery );
|
||||||
@@ -245,8 +281,7 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.selectedPowerUnit = PowerUnits.valueOf(
|
this.selectedPowerUnit = PowerUnits.valueOf( this.get( "Client", "PowerUnit", this.selectedPowerUnit.name(), this.getListComment( this.selectedPowerUnit ) ).getString() );
|
||||||
this.get( "Client", "PowerUnit", this.selectedPowerUnit.name(), this.getListComment( this.selectedPowerUnit ) ).getString() );
|
|
||||||
}
|
}
|
||||||
catch( final Throwable t )
|
catch( final Throwable t )
|
||||||
{
|
{
|
||||||
@@ -262,17 +297,13 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
|||||||
{
|
{
|
||||||
this.storageProviderID = this.get( "spatialio", "storageProviderID", this.storageProviderID ).getInt( this.storageProviderID );
|
this.storageProviderID = this.get( "spatialio", "storageProviderID", this.storageProviderID ).getInt( this.storageProviderID );
|
||||||
this.storageDimensionID = this.get( "spatialio", "storageDimensionID", this.storageDimensionID ).getInt( this.storageDimensionID );
|
this.storageDimensionID = this.get( "spatialio", "storageDimensionID", this.storageDimensionID ).getInt( this.storageDimensionID );
|
||||||
this.spatialPowerMultiplier = this.get( "spatialio", "spatialPowerMultiplier", this.spatialPowerMultiplier )
|
this.spatialPowerMultiplier = this.get( "spatialio", "spatialPowerMultiplier", this.spatialPowerMultiplier ).getDouble( this.spatialPowerMultiplier );
|
||||||
.getDouble(
|
|
||||||
this.spatialPowerMultiplier );
|
|
||||||
this.spatialPowerExponent = this.get( "spatialio", "spatialPowerExponent", this.spatialPowerExponent ).getDouble( this.spatialPowerExponent );
|
this.spatialPowerExponent = this.get( "spatialio", "spatialPowerExponent", this.spatialPowerExponent ).getDouble( this.spatialPowerExponent );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.isFeatureEnabled( AEFeature.CRAFTING_CPU ) )
|
if( this.isFeatureEnabled( AEFeature.CRAFTING_CPU ) )
|
||||||
{
|
{
|
||||||
this.craftingCalculationTimePerTick = this.get( "craftingCPU", "craftingCalculationTimePerTick", this.craftingCalculationTimePerTick )
|
this.craftingCalculationTimePerTick = this.get( "craftingCPU", "craftingCalculationTimePerTick", this.craftingCalculationTimePerTick ).getInt( this.craftingCalculationTimePerTick );
|
||||||
.getInt(
|
|
||||||
this.craftingCalculationTimePerTick );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.updatable = true;
|
this.updatable = true;
|
||||||
@@ -446,8 +477,7 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setCategoryComment( "OreCamouflage",
|
this.setCategoryComment( "OreCamouflage", "AE2 Automatically uses alternative ores present in your instance of MC to blend better with its surroundings, if you prefer you can disable this selectively using these flags; Its important to note, that some if these items even if enabled may not be craftable in game because other items are overriding their recipes." );
|
||||||
"AE2 Automatically uses alternative ores present in your instance of MC to blend better with its surroundings, if you prefer you can disable this selectively using these flags; Its important to note, that some if these items even if enabled may not be craftable in game because other items are overriding their recipes." );
|
|
||||||
final Property p = this.get( "OreCamouflage", mt.name(), true );
|
final Property p = this.get( "OreCamouflage", mt.name(), true );
|
||||||
p.setComment( "OreDictionary Names: " + mt.getOreName() );
|
p.setComment( "OreDictionary Names: " + mt.getOreName() );
|
||||||
|
|
||||||
@@ -715,6 +745,11 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
|||||||
return this.quartzOresClusterAmount;
|
return this.quartzOresClusterAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String[] getNonBlockingItems()
|
||||||
|
{
|
||||||
|
return nonBlockingItems;
|
||||||
|
}
|
||||||
|
|
||||||
public int getChargedChange()
|
public int getChargedChange()
|
||||||
{
|
{
|
||||||
return this.chargedChange;
|
return this.chargedChange;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import java.util.concurrent.TimeUnit;
|
|||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import appeng.helpers.NonBlockingItems;
|
||||||
import com.google.common.base.Stopwatch;
|
import com.google.common.base.Stopwatch;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
@@ -183,8 +184,7 @@ public final class AppEng
|
|||||||
AELog.info( "Pre Initialization ( ended after " + watch.elapsed( TimeUnit.MILLISECONDS ) + "ms )" );
|
AELog.info( "Pre Initialization ( ended after " + watch.elapsed( TimeUnit.MILLISECONDS ) + "ms )" );
|
||||||
|
|
||||||
// Instantiate all Plugins
|
// Instantiate all Plugins
|
||||||
List<Object> injectables = Lists.newArrayList(
|
List<Object> injectables = Lists.newArrayList( AEApi.instance() );
|
||||||
AEApi.instance() );
|
|
||||||
new PluginLoader().loadPlugins( injectables, event.getAsmData() );
|
new PluginLoader().loadPlugins( injectables, event.getAsmData() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,6 +239,8 @@ public final class AppEng
|
|||||||
AppEng.proxy.postInit();
|
AppEng.proxy.postInit();
|
||||||
AEConfig.instance().save();
|
AEConfig.instance().save();
|
||||||
|
|
||||||
|
NonBlockingItems.INSTANCE.init();
|
||||||
|
|
||||||
NetworkRegistry.INSTANCE.registerGuiHandler( this, GuiBridge.GUI_Handler );
|
NetworkRegistry.INSTANCE.registerGuiHandler( this, GuiBridge.GUI_Handler );
|
||||||
NetworkHandler.init( "AE2" );
|
NetworkHandler.init( "AE2" );
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ public final class ApiParts implements IParts
|
|||||||
private final IItemDefinition toggleBus;
|
private final IItemDefinition toggleBus;
|
||||||
private final IItemDefinition invertedToggleBus;
|
private final IItemDefinition invertedToggleBus;
|
||||||
private final IItemDefinition storageBus;
|
private final IItemDefinition storageBus;
|
||||||
|
private final IItemDefinition oreDictStorageBus;
|
||||||
private final IItemDefinition importBus;
|
private final IItemDefinition importBus;
|
||||||
private final IItemDefinition exportBus;
|
private final IItemDefinition exportBus;
|
||||||
private final IItemDefinition iface;
|
private final IItemDefinition iface;
|
||||||
@@ -69,6 +70,7 @@ public final class ApiParts implements IParts
|
|||||||
private final IItemDefinition p2PTunnelFluids;
|
private final IItemDefinition p2PTunnelFluids;
|
||||||
private final IItemDefinition p2PTunnelEU;
|
private final IItemDefinition p2PTunnelEU;
|
||||||
private final IItemDefinition p2PTunnelFE;
|
private final IItemDefinition p2PTunnelFE;
|
||||||
|
private final IItemDefinition p2PTunnelGTEU;
|
||||||
private final IItemDefinition p2PTunnelLight;
|
private final IItemDefinition p2PTunnelLight;
|
||||||
// private final IItemDefinition p2PTunnelOpenComputers;
|
// private final IItemDefinition p2PTunnelOpenComputers;
|
||||||
private final IItemDefinition cableAnchor;
|
private final IItemDefinition cableAnchor;
|
||||||
@@ -77,6 +79,7 @@ public final class ApiParts implements IParts
|
|||||||
private final IItemDefinition darkMonitor;
|
private final IItemDefinition darkMonitor;
|
||||||
private final IItemDefinition interfaceTerminal;
|
private final IItemDefinition interfaceTerminal;
|
||||||
private final IItemDefinition patternTerminal;
|
private final IItemDefinition patternTerminal;
|
||||||
|
private final IItemDefinition expandedProcessingPatternTerminal;
|
||||||
private final IItemDefinition craftingTerminal;
|
private final IItemDefinition craftingTerminal;
|
||||||
private final IItemDefinition terminal;
|
private final IItemDefinition terminal;
|
||||||
private final IItemDefinition storageMonitor;
|
private final IItemDefinition storageMonitor;
|
||||||
@@ -89,9 +92,7 @@ public final class ApiParts implements IParts
|
|||||||
public ApiParts( FeatureFactory registry, PartModels partModels )
|
public ApiParts( FeatureFactory registry, PartModels partModels )
|
||||||
{
|
{
|
||||||
final ItemPart itemPart = new ItemPart();
|
final ItemPart itemPart = new ItemPart();
|
||||||
registry.item( "part", () -> itemPart )
|
registry.item( "part", () -> itemPart ).rendering( new ItemPartRendering( partModels, itemPart ) ).build();
|
||||||
.rendering( new ItemPartRendering( partModels, itemPart ) )
|
|
||||||
.build();
|
|
||||||
|
|
||||||
// Register all part models
|
// Register all part models
|
||||||
for( PartType partType : PartType.values() )
|
for( PartType partType : PartType.values() )
|
||||||
@@ -112,6 +113,7 @@ public final class ApiParts implements IParts
|
|||||||
this.toggleBus = new DamagedItemDefinition( "part.toggle_bus", itemPart.createPart( PartType.TOGGLE_BUS ) );
|
this.toggleBus = new DamagedItemDefinition( "part.toggle_bus", itemPart.createPart( PartType.TOGGLE_BUS ) );
|
||||||
this.invertedToggleBus = new DamagedItemDefinition( "part.toggle_bus.inverted", itemPart.createPart( PartType.INVERTED_TOGGLE_BUS ) );
|
this.invertedToggleBus = new DamagedItemDefinition( "part.toggle_bus.inverted", itemPart.createPart( PartType.INVERTED_TOGGLE_BUS ) );
|
||||||
this.storageBus = new DamagedItemDefinition( "part.bus.storage", itemPart.createPart( PartType.STORAGE_BUS ) );
|
this.storageBus = new DamagedItemDefinition( "part.bus.storage", itemPart.createPart( PartType.STORAGE_BUS ) );
|
||||||
|
this.oreDictStorageBus = new DamagedItemDefinition( "part.bus.oredict_storage", itemPart.createPart( PartType.OREDICT_STORAGE_BUS ) );
|
||||||
this.importBus = new DamagedItemDefinition( "part.bus.import", itemPart.createPart( PartType.IMPORT_BUS ) );
|
this.importBus = new DamagedItemDefinition( "part.bus.import", itemPart.createPart( PartType.IMPORT_BUS ) );
|
||||||
this.exportBus = new DamagedItemDefinition( "part.bus.export", itemPart.createPart( PartType.EXPORT_BUS ) );
|
this.exportBus = new DamagedItemDefinition( "part.bus.export", itemPart.createPart( PartType.EXPORT_BUS ) );
|
||||||
this.iface = new DamagedItemDefinition( "part.interface", itemPart.createPart( PartType.INTERFACE ) );
|
this.iface = new DamagedItemDefinition( "part.interface", itemPart.createPart( PartType.INTERFACE ) );
|
||||||
@@ -119,8 +121,7 @@ public final class ApiParts implements IParts
|
|||||||
this.levelEmitter = new DamagedItemDefinition( "part.level_emitter", itemPart.createPart( PartType.LEVEL_EMITTER ) );
|
this.levelEmitter = new DamagedItemDefinition( "part.level_emitter", itemPart.createPart( PartType.LEVEL_EMITTER ) );
|
||||||
this.fluidLevelEmitter = new DamagedItemDefinition( "part.fluid_level_emitter", itemPart.createPart( PartType.FLUID_LEVEL_EMITTER ) );
|
this.fluidLevelEmitter = new DamagedItemDefinition( "part.fluid_level_emitter", itemPart.createPart( PartType.FLUID_LEVEL_EMITTER ) );
|
||||||
this.annihilationPlane = new DamagedItemDefinition( "part.plane.annihilation", itemPart.createPart( PartType.ANNIHILATION_PLANE ) );
|
this.annihilationPlane = new DamagedItemDefinition( "part.plane.annihilation", itemPart.createPart( PartType.ANNIHILATION_PLANE ) );
|
||||||
this.identityAnnihilationPlane = new DamagedItemDefinition( "part.plane.annihiliation.identity", itemPart
|
this.identityAnnihilationPlane = new DamagedItemDefinition( "part.plane.annihiliation.identity", itemPart.createPart( PartType.IDENTITY_ANNIHILATION_PLANE ) );
|
||||||
.createPart( PartType.IDENTITY_ANNIHILATION_PLANE ) );
|
|
||||||
this.fluidAnnihilationPlane = new DamagedItemDefinition( "part.plane.fluid_annihilation", itemPart.createPart( PartType.FLUID_ANNIHILATION_PLANE ) );
|
this.fluidAnnihilationPlane = new DamagedItemDefinition( "part.plane.fluid_annihilation", itemPart.createPart( PartType.FLUID_ANNIHILATION_PLANE ) );
|
||||||
this.formationPlane = new DamagedItemDefinition( "part.plane.formation", itemPart.createPart( PartType.FORMATION_PLANE ) );
|
this.formationPlane = new DamagedItemDefinition( "part.plane.formation", itemPart.createPart( PartType.FORMATION_PLANE ) );
|
||||||
this.fluidFormationPlane = new DamagedItemDefinition( "part.plane.fluid_formation", itemPart.createPart( PartType.FLUID_FORMATION_PLANE ) );
|
this.fluidFormationPlane = new DamagedItemDefinition( "part.plane.fluid_formation", itemPart.createPart( PartType.FLUID_FORMATION_PLANE ) );
|
||||||
@@ -130,6 +131,7 @@ public final class ApiParts implements IParts
|
|||||||
this.p2PTunnelFluids = new DamagedItemDefinition( "part.tunnel.fluid", itemPart.createPart( PartType.P2P_TUNNEL_FLUIDS ) );
|
this.p2PTunnelFluids = new DamagedItemDefinition( "part.tunnel.fluid", itemPart.createPart( PartType.P2P_TUNNEL_FLUIDS ) );
|
||||||
this.p2PTunnelEU = new DamagedItemDefinition( "part.tunnel.eu", itemPart.createPart( PartType.P2P_TUNNEL_IC2 ) );
|
this.p2PTunnelEU = new DamagedItemDefinition( "part.tunnel.eu", itemPart.createPart( PartType.P2P_TUNNEL_IC2 ) );
|
||||||
this.p2PTunnelFE = new DamagedItemDefinition( "part.tunnel.fe", itemPart.createPart( PartType.P2P_TUNNEL_FE ) );
|
this.p2PTunnelFE = new DamagedItemDefinition( "part.tunnel.fe", itemPart.createPart( PartType.P2P_TUNNEL_FE ) );
|
||||||
|
this.p2PTunnelGTEU = new DamagedItemDefinition( "part.tunnel.gteu", itemPart.createPart( PartType.P2P_TUNNEL_GTEU ) );
|
||||||
this.p2PTunnelLight = new DamagedItemDefinition( "part.tunnel.light", itemPart.createPart( PartType.P2P_TUNNEL_LIGHT ) );
|
this.p2PTunnelLight = new DamagedItemDefinition( "part.tunnel.light", itemPart.createPart( PartType.P2P_TUNNEL_LIGHT ) );
|
||||||
// this.p2PTunnelOpenComputers = new DamagedItemDefinition( itemMultiPart.createPart(
|
// this.p2PTunnelOpenComputers = new DamagedItemDefinition( itemMultiPart.createPart(
|
||||||
// PartType.P2PTunnelOpenComputers ) );
|
// PartType.P2PTunnelOpenComputers ) );
|
||||||
@@ -139,6 +141,7 @@ public final class ApiParts implements IParts
|
|||||||
this.darkMonitor = new DamagedItemDefinition( "part.monitor.dark", itemPart.createPart( PartType.DARK_MONITOR ) );
|
this.darkMonitor = new DamagedItemDefinition( "part.monitor.dark", itemPart.createPart( PartType.DARK_MONITOR ) );
|
||||||
this.interfaceTerminal = new DamagedItemDefinition( "part.terminal.interface", itemPart.createPart( PartType.INTERFACE_TERMINAL ) );
|
this.interfaceTerminal = new DamagedItemDefinition( "part.terminal.interface", itemPart.createPart( PartType.INTERFACE_TERMINAL ) );
|
||||||
this.patternTerminal = new DamagedItemDefinition( "part.terminal.pattern", itemPart.createPart( PartType.PATTERN_TERMINAL ) );
|
this.patternTerminal = new DamagedItemDefinition( "part.terminal.pattern", itemPart.createPart( PartType.PATTERN_TERMINAL ) );
|
||||||
|
this.expandedProcessingPatternTerminal = new DamagedItemDefinition( "part.terminal.expanded_processing_pattern", itemPart.createPart( PartType.EXPANDED_PROCESSING_PATTERN_TERMINAL ) );
|
||||||
this.craftingTerminal = new DamagedItemDefinition( "part.terminal.crafting", itemPart.createPart( PartType.CRAFTING_TERMINAL ) );
|
this.craftingTerminal = new DamagedItemDefinition( "part.terminal.crafting", itemPart.createPart( PartType.CRAFTING_TERMINAL ) );
|
||||||
this.terminal = new DamagedItemDefinition( "part.terminal", itemPart.createPart( PartType.TERMINAL ) );
|
this.terminal = new DamagedItemDefinition( "part.terminal", itemPart.createPart( PartType.TERMINAL ) );
|
||||||
this.storageMonitor = new DamagedItemDefinition( "part.monitor.storage", itemPart.createPart( PartType.STORAGE_MONITOR ) );
|
this.storageMonitor = new DamagedItemDefinition( "part.monitor.storage", itemPart.createPart( PartType.STORAGE_MONITOR ) );
|
||||||
@@ -245,6 +248,12 @@ public final class ApiParts implements IParts
|
|||||||
return this.storageBus;
|
return this.storageBus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IItemDefinition oreDictStorageBus()
|
||||||
|
{
|
||||||
|
return this.oreDictStorageBus;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IItemDefinition importBus()
|
public IItemDefinition importBus()
|
||||||
{
|
{
|
||||||
@@ -329,6 +338,11 @@ public final class ApiParts implements IParts
|
|||||||
return this.p2PTunnelFE;
|
return this.p2PTunnelFE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IItemDefinition p2PTunnelGTEU()
|
||||||
|
{
|
||||||
|
return this.p2PTunnelGTEU;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IItemDefinition p2PTunnelLight()
|
public IItemDefinition p2PTunnelLight()
|
||||||
{
|
{
|
||||||
@@ -379,6 +393,12 @@ public final class ApiParts implements IParts
|
|||||||
return this.patternTerminal;
|
return this.patternTerminal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IItemDefinition expandedProcessingPatternTerminal()
|
||||||
|
{
|
||||||
|
return this.expandedProcessingPatternTerminal;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IItemDefinition craftingTerminal()
|
public IItemDefinition craftingTerminal()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ public enum AEFeature
|
|||||||
P2P_TUNNEL_REDSTONE( "P2PTunnelRedstone", Constants.CATEGORY_P2P_TUNNELS ),
|
P2P_TUNNEL_REDSTONE( "P2PTunnelRedstone", Constants.CATEGORY_P2P_TUNNELS ),
|
||||||
P2P_TUNNEL_EU( "P2PTunnelEU", Constants.CATEGORY_P2P_TUNNELS ),
|
P2P_TUNNEL_EU( "P2PTunnelEU", Constants.CATEGORY_P2P_TUNNELS ),
|
||||||
P2P_TUNNEL_FE( "P2PTunnelFE", Constants.CATEGORY_P2P_TUNNELS ),
|
P2P_TUNNEL_FE( "P2PTunnelFE", Constants.CATEGORY_P2P_TUNNELS ),
|
||||||
|
P2P_TUNNEL_GTEU( "P2PTunnelGTEU", Constants.CATEGORY_P2P_TUNNELS ),
|
||||||
P2P_TUNNEL_FLUIDS( "P2PTunnelFluids", Constants.CATEGORY_P2P_TUNNELS ),
|
P2P_TUNNEL_FLUIDS( "P2PTunnelFluids", Constants.CATEGORY_P2P_TUNNELS ),
|
||||||
P2P_TUNNEL_LIGHT( "P2PTunnelLight", Constants.CATEGORY_P2P_TUNNELS ),
|
P2P_TUNNEL_LIGHT( "P2PTunnelLight", Constants.CATEGORY_P2P_TUNNELS ),
|
||||||
P2P_TUNNEL_OPEN_COMPUTERS( "P2PTunnelOpenComputers", Constants.CATEGORY_P2P_TUNNELS ),
|
P2P_TUNNEL_OPEN_COMPUTERS( "P2PTunnelOpenComputers", Constants.CATEGORY_P2P_TUNNELS ),
|
||||||
@@ -163,7 +164,6 @@ public enum AEFeature
|
|||||||
MOLECULAR_ASSEMBLER( "MolecularAssembler", Constants.CATEGORY_CRAFTING_FEATURES ),
|
MOLECULAR_ASSEMBLER( "MolecularAssembler", Constants.CATEGORY_CRAFTING_FEATURES ),
|
||||||
PATTERNS( "Patterns", Constants.CATEGORY_CRAFTING_FEATURES ),
|
PATTERNS( "Patterns", Constants.CATEGORY_CRAFTING_FEATURES ),
|
||||||
CRAFTING_CPU( "CraftingCPU", Constants.CATEGORY_CRAFTING_FEATURES ),
|
CRAFTING_CPU( "CraftingCPU", Constants.CATEGORY_CRAFTING_FEATURES ),
|
||||||
CRAFTING_MANAGER_FALLBACK( "CraftingManagerFallback", Constants.CATEGORY_CRAFTING_FEATURES, "Use CraftingManager to find an alternative recipe, after a pattern rejected an ingredient. Should be enabled to avoid issues, but can have a minor performance impact." ),
|
|
||||||
|
|
||||||
BASIC_CARDS( "BasicCards", Constants.CATEGORY_UPGRADES ),
|
BASIC_CARDS( "BasicCards", Constants.CATEGORY_UPGRADES ),
|
||||||
ADVANCED_CARDS( "AdvancedCards", Constants.CATEGORY_UPGRADES ),
|
ADVANCED_CARDS( "AdvancedCards", Constants.CATEGORY_UPGRADES ),
|
||||||
|
|||||||
@@ -19,13 +19,14 @@
|
|||||||
package appeng.core.features.registries;
|
package appeng.core.features.registries;
|
||||||
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import appeng.core.AELog;
|
||||||
|
import appeng.util.item.OreHelper;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.init.Items;
|
import net.minecraft.init.Items;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
@@ -67,6 +68,25 @@ public final class P2PTunnelRegistry implements IP2PTunnelRegistry
|
|||||||
this.addNewAttunement( new ItemStack( Blocks.TORCH ), TunnelType.LIGHT );
|
this.addNewAttunement( new ItemStack( Blocks.TORCH ), TunnelType.LIGHT );
|
||||||
this.addNewAttunement( new ItemStack( Blocks.GLOWSTONE ), TunnelType.LIGHT );
|
this.addNewAttunement( new ItemStack( Blocks.GLOWSTONE ), TunnelType.LIGHT );
|
||||||
|
|
||||||
|
List<String> gtceOreDict = new ArrayList<>();
|
||||||
|
gtceOreDict.add( "wireGtHex" );
|
||||||
|
gtceOreDict.add( "wireGtOctal" );
|
||||||
|
gtceOreDict.add( "wireGtQuadruple" );
|
||||||
|
gtceOreDict.add( "wireGtDouble" );
|
||||||
|
gtceOreDict.add( "wireGtSingle" );
|
||||||
|
gtceOreDict.add( "cableGtHex" );
|
||||||
|
gtceOreDict.add( "cableGtOctal" );
|
||||||
|
gtceOreDict.add( "cableGtQuadruple" );
|
||||||
|
gtceOreDict.add( "cableGtDouble" );
|
||||||
|
gtceOreDict.add( "cableGtSingle" );
|
||||||
|
|
||||||
|
for( String oreDict : gtceOreDict )
|
||||||
|
{
|
||||||
|
Arrays.stream( OreDictionary.getOreNames() ).filter( oreName -> oreName.startsWith( oreDict ) ).forEach( oreName -> {
|
||||||
|
OreHelper.INSTANCE.getCachedOres( oreName ).forEach( stack -> this.addNewAttunement( stack, TunnelType.GTEU_POWER ) );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Forge energy tunnel items
|
* Forge energy tunnel items
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ public enum GuiText
|
|||||||
EnergyDrain,
|
EnergyDrain,
|
||||||
|
|
||||||
StorageBus,
|
StorageBus,
|
||||||
|
OreDictStorageBus,
|
||||||
StorageBusFluids,
|
StorageBusFluids,
|
||||||
Priority,
|
Priority,
|
||||||
Security,
|
Security,
|
||||||
@@ -98,6 +99,7 @@ public enum GuiText
|
|||||||
OCTunnel,
|
OCTunnel,
|
||||||
LightTunnel,
|
LightTunnel,
|
||||||
FETunnel,
|
FETunnel,
|
||||||
|
GTEUTunnel,
|
||||||
PressureTunnel,
|
PressureTunnel,
|
||||||
|
|
||||||
// spatial
|
// spatial
|
||||||
|
|||||||
@@ -24,34 +24,9 @@ import java.lang.reflect.InvocationTargetException;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import appeng.core.sync.packets.*;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
import appeng.core.sync.packets.PacketAssemblerAnimation;
|
|
||||||
import appeng.core.sync.packets.PacketClick;
|
|
||||||
import appeng.core.sync.packets.PacketCompassRequest;
|
|
||||||
import appeng.core.sync.packets.PacketCompassResponse;
|
|
||||||
import appeng.core.sync.packets.PacketCompressedNBT;
|
|
||||||
import appeng.core.sync.packets.PacketConfigButton;
|
|
||||||
import appeng.core.sync.packets.PacketCraftRequest;
|
|
||||||
import appeng.core.sync.packets.PacketFluidSlot;
|
|
||||||
import appeng.core.sync.packets.PacketInventoryAction;
|
|
||||||
import appeng.core.sync.packets.PacketJEIRecipe;
|
|
||||||
import appeng.core.sync.packets.PacketLightning;
|
|
||||||
import appeng.core.sync.packets.PacketMEFluidInventoryUpdate;
|
|
||||||
import appeng.core.sync.packets.PacketMEInventoryUpdate;
|
|
||||||
import appeng.core.sync.packets.PacketMatterCannon;
|
|
||||||
import appeng.core.sync.packets.PacketMockExplosion;
|
|
||||||
import appeng.core.sync.packets.PacketPaintedEntity;
|
|
||||||
import appeng.core.sync.packets.PacketPartPlacement;
|
|
||||||
import appeng.core.sync.packets.PacketPatternSlot;
|
|
||||||
import appeng.core.sync.packets.PacketProgressBar;
|
|
||||||
import appeng.core.sync.packets.PacketSwapSlots;
|
|
||||||
import appeng.core.sync.packets.PacketSwitchGuis;
|
|
||||||
import appeng.core.sync.packets.PacketTargetFluidStack;
|
|
||||||
import appeng.core.sync.packets.PacketTargetItemStack;
|
|
||||||
import appeng.core.sync.packets.PacketTransitionEffect;
|
|
||||||
import appeng.core.sync.packets.PacketValueConfig;
|
|
||||||
|
|
||||||
|
|
||||||
public class AppEngPacketHandlerBase
|
public class AppEngPacketHandlerBase
|
||||||
{
|
{
|
||||||
@@ -107,7 +82,10 @@ public class AppEngPacketHandlerBase
|
|||||||
|
|
||||||
PACKET_PAINTED_ENTITY( PacketPaintedEntity.class ),
|
PACKET_PAINTED_ENTITY( PacketPaintedEntity.class ),
|
||||||
|
|
||||||
PACKET_FLUID_TANK( PacketFluidSlot.class );
|
PACKET_FLUID_TANK( PacketFluidSlot.class ),
|
||||||
|
|
||||||
|
PACKET_INFORM_PLAYER( PacketInformPlayer.class );
|
||||||
|
|
||||||
|
|
||||||
private final Class<? extends AppEngPacket> packetClass;
|
private final Class<? extends AppEngPacket> packetClass;
|
||||||
private final Constructor<? extends AppEngPacket> packetConstructor;
|
private final Constructor<? extends AppEngPacket> packetConstructor;
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ package appeng.core.sync;
|
|||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
|
|
||||||
|
import appeng.container.implementations.*;
|
||||||
|
import appeng.parts.misc.PartOreDicStorageBus;
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.entity.player.InventoryPlayer;
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -53,39 +56,6 @@ import appeng.client.gui.GuiNull;
|
|||||||
import appeng.container.AEBaseContainer;
|
import appeng.container.AEBaseContainer;
|
||||||
import appeng.container.ContainerNull;
|
import appeng.container.ContainerNull;
|
||||||
import appeng.container.ContainerOpenContext;
|
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;
|
|
||||||
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.fluids.container.ContainerFluidFormationPlane;
|
import appeng.fluids.container.ContainerFluidFormationPlane;
|
||||||
import appeng.fluids.container.ContainerFluidIO;
|
import appeng.fluids.container.ContainerFluidIO;
|
||||||
import appeng.fluids.container.ContainerFluidInterface;
|
import appeng.fluids.container.ContainerFluidInterface;
|
||||||
@@ -171,6 +141,8 @@ public enum GuiBridge implements IGuiHandler
|
|||||||
|
|
||||||
GUI_STORAGEBUS( ContainerStorageBus.class, PartStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
GUI_STORAGEBUS( ContainerStorageBus.class, PartStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||||
|
|
||||||
|
GUI_OREDICTSTORAGEBUS( ContainerOreDictStorageBus.class, PartOreDicStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||||
|
|
||||||
GUI_STORAGEBUS_FLUID( ContainerFluidStorageBus.class, PartFluidStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
GUI_STORAGEBUS_FLUID( ContainerFluidStorageBus.class, PartFluidStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||||
|
|
||||||
GUI_FORMATION_PLANE( ContainerFormationPlane.class, PartFormationPlane.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
GUI_FORMATION_PLANE( ContainerFormationPlane.class, PartFormationPlane.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||||
@@ -185,6 +157,8 @@ public enum GuiBridge implements IGuiHandler
|
|||||||
|
|
||||||
GUI_PATTERN_TERMINAL( ContainerPatternTerm.class, PartPatternTerminal.class, GuiHostType.WORLD, SecurityPermissions.CRAFT ),
|
GUI_PATTERN_TERMINAL( ContainerPatternTerm.class, PartPatternTerminal.class, GuiHostType.WORLD, SecurityPermissions.CRAFT ),
|
||||||
|
|
||||||
|
GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL( ContainerExpandedProcessingPatternTerm.class, PartExpandedProcessingPatternTerminal.class, GuiHostType.WORLD, SecurityPermissions.CRAFT ),
|
||||||
|
|
||||||
GUI_FLUID_TERMINAL( ContainerFluidTerminal.class, ITerminalHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
GUI_FLUID_TERMINAL( ContainerFluidTerminal.class, ITerminalHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||||
|
|
||||||
// extends (Container/Gui) + Bus
|
// extends (Container/Gui) + Bus
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
package appeng.core.sync.packets;
|
||||||
|
|
||||||
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
|
import appeng.core.AppEng;
|
||||||
|
import appeng.core.sync.AppEngPacket;
|
||||||
|
import appeng.core.sync.network.INetworkInfo;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.buffer.Unpooled;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.util.text.TextComponentString;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class PacketInformPlayer extends AppEngPacket
|
||||||
|
{
|
||||||
|
private IAEItemStack actualItem = null;
|
||||||
|
private IAEItemStack reportedItem = null;
|
||||||
|
private final InfoType type;
|
||||||
|
|
||||||
|
public PacketInformPlayer( ByteBuf stream ) throws IOException
|
||||||
|
{
|
||||||
|
this.type = InfoType.values()[stream.readInt()];
|
||||||
|
if( type == InfoType.PARTIAL_ITEM_EXTRACTION )
|
||||||
|
{
|
||||||
|
this.reportedItem = AEItemStack.fromPacket( stream );
|
||||||
|
this.actualItem = AEItemStack.fromPacket( stream );
|
||||||
|
}
|
||||||
|
else if( type == InfoType.NO_ITEMS_EXTRACTED )
|
||||||
|
{
|
||||||
|
this.reportedItem = AEItemStack.fromPacket( stream );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public PacketInformPlayer( final IAEItemStack iaeItemStack ) throws IOException
|
||||||
|
{
|
||||||
|
this( iaeItemStack, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
public PacketInformPlayer( IAEItemStack extra, IAEItemStack result ) throws IOException
|
||||||
|
{
|
||||||
|
this.reportedItem = extra;
|
||||||
|
this.actualItem = result;
|
||||||
|
if( actualItem == null )
|
||||||
|
{
|
||||||
|
this.type = InfoType.NO_ITEMS_EXTRACTED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.type = InfoType.PARTIAL_ITEM_EXTRACTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
final ByteBuf data = Unpooled.buffer();
|
||||||
|
|
||||||
|
data.writeInt( this.getPacketID() );
|
||||||
|
|
||||||
|
data.writeInt( type.ordinal() );
|
||||||
|
|
||||||
|
reportedItem.writeToPacket( data );
|
||||||
|
if( actualItem != null )
|
||||||
|
{
|
||||||
|
actualItem.writeToPacket( data );
|
||||||
|
}
|
||||||
|
|
||||||
|
this.configureWrite( data );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clientPacketData( final INetworkInfo network, final AppEngPacket packet, final EntityPlayer player )
|
||||||
|
{
|
||||||
|
TextComponentString msg = null;
|
||||||
|
|
||||||
|
if( this.type == InfoType.PARTIAL_ITEM_EXTRACTION )
|
||||||
|
{
|
||||||
|
AppEng.proxy.getPlayers().get( 0 ).sendStatusMessage( new TextComponentString( "System reported " + reportedItem.getStackSize() + " " + reportedItem.getItem().getItemStackDisplayName( reportedItem.getDefinition() ) + " available but could only extract" + actualItem.getStackSize() ), false );
|
||||||
|
}
|
||||||
|
else if( this.type == InfoType.NO_ITEMS_EXTRACTED )
|
||||||
|
{
|
||||||
|
AppEng.proxy.getPlayers().get( 0 ).sendStatusMessage( new TextComponentString( "System reported " + reportedItem.getStackSize() + " " + reportedItem.getItem().getItemStackDisplayName( reportedItem.getDefinition() ) + " available but could not extract anything" ), false );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum InfoType
|
||||||
|
{
|
||||||
|
PARTIAL_ITEM_EXTRACTION,
|
||||||
|
NO_ITEMS_EXTRACTED
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -192,7 +192,20 @@ public class PacketInventoryAction extends AppEngPacket
|
|||||||
}
|
}
|
||||||
else if( this.action == InventoryAction.PLACE_JEI_GHOST_ITEM )
|
else if( this.action == InventoryAction.PLACE_JEI_GHOST_ITEM )
|
||||||
{
|
{
|
||||||
if( sender.openContainer.inventorySlots.get( this.slot ) instanceof SlotFake )
|
if( sender.openContainer instanceof ContainerFluidConfigurable )
|
||||||
|
{
|
||||||
|
if( this.slotItem != null )
|
||||||
|
{
|
||||||
|
IAEFluidStack aefs = AEFluidStack.fromNBT( this.slotItem.getDefinition().getTagCompound() );
|
||||||
|
if( aefs != null )
|
||||||
|
{
|
||||||
|
aefs.setStackSize( 1000 );
|
||||||
|
( (ContainerFluidConfigurable) sender.openContainer ).getFluidConfigInventory().setFluidInSlot( this.slot, aefs );
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketFluidSlot( Collections.singletonMap( this.slot, aefs ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( this.slot < sender.openContainer.inventorySlots.size() && sender.openContainer.inventorySlots.get( this.slot ) instanceof SlotFake )
|
||||||
{
|
{
|
||||||
if( this.slotItem != null )
|
if( this.slotItem != null )
|
||||||
{
|
{
|
||||||
@@ -217,20 +230,6 @@ public class PacketInventoryAction extends AppEngPacket
|
|||||||
AELog.debug( e );
|
AELog.debug( e );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( sender.openContainer instanceof ContainerFluidConfigurable )
|
|
||||||
{
|
|
||||||
if( this.slotItem != null )
|
|
||||||
{
|
|
||||||
IAEFluidStack aefs = AEFluidStack.fromNBT( this.slotItem.getDefinition().getTagCompound() );
|
|
||||||
if( aefs != null )
|
|
||||||
{
|
|
||||||
aefs.setStackSize( 1000 );
|
|
||||||
( (ContainerFluidConfigurable) sender.openContainer ).getFluidConfigInventory().setFluidInSlot( this.slot, aefs );
|
|
||||||
NetworkHandler.instance().sendToServer( new PacketFluidSlot( Collections.singletonMap( this.slot, aefs ) ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,13 +23,13 @@ import java.io.ByteArrayInputStream;
|
|||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.List;
|
||||||
|
|
||||||
import appeng.api.config.FuzzyMode;
|
import appeng.api.config.FuzzyMode;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.container.implementations.ContainerExpandedProcessingPatternTerm;
|
||||||
import appeng.container.implementations.ContainerPatternTerm;
|
import appeng.container.implementations.ContainerPatternTerm;
|
||||||
import gregtech.common.items.MetaTool;
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
|
|
||||||
@@ -40,6 +40,7 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraft.nbt.CompressedStreamTools;
|
import net.minecraft.nbt.CompressedStreamTools;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.nbt.NBTTagList;
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
import net.minecraftforge.fml.common.Optional;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
@@ -69,8 +70,9 @@ import appeng.util.prioritylist.IPartitionList;
|
|||||||
public class PacketJEIRecipe extends AppEngPacket
|
public class PacketJEIRecipe extends AppEngPacket
|
||||||
{
|
{
|
||||||
|
|
||||||
private ItemStack[][] recipe;
|
private List<ItemStack[]> recipe;
|
||||||
private ItemStack[] output;
|
private List<ItemStack> output;
|
||||||
|
static ItemStack[] emptyArray = {ItemStack.EMPTY};
|
||||||
|
|
||||||
|
|
||||||
// automatic.
|
// automatic.
|
||||||
@@ -81,30 +83,37 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
final NBTTagCompound comp = CompressedStreamTools.readCompressed( bytes );
|
final NBTTagCompound comp = CompressedStreamTools.readCompressed( bytes );
|
||||||
if( comp != null )
|
if( comp != null )
|
||||||
{
|
{
|
||||||
this.recipe = new ItemStack[9][];
|
this.recipe = new ArrayList<>();
|
||||||
for( int x = 0; x < this.recipe.length; x++ )
|
|
||||||
|
for( int x = 0; x < comp.getKeySet().size(); x++ )
|
||||||
|
{
|
||||||
|
if( comp.hasKey( "#" + x ) )
|
||||||
{
|
{
|
||||||
final NBTTagList list = comp.getTagList( "#" + x, 10 );
|
final NBTTagList list = comp.getTagList( "#" + x, 10 );
|
||||||
if( list.tagCount() > 0 )
|
if( list.tagCount() > 0 )
|
||||||
{
|
{
|
||||||
this.recipe[x] = new ItemStack[list.tagCount()];
|
this.recipe.add( new ItemStack[list.tagCount()] );
|
||||||
for( int y = 0; y < list.tagCount(); y++ )
|
for( int y = 0; y < list.tagCount(); y++ )
|
||||||
{
|
{
|
||||||
this.recipe[x][y] = new ItemStack( list.getCompoundTagAt( y ) );
|
this.recipe.get( x )[y] = new ItemStack( list.getCompoundTagAt( y ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
if ( comp.hasKey("outputs") ) {
|
|
||||||
final NBTTagList outputList = comp.getTagList("outputs", 10);
|
|
||||||
this.output = new ItemStack[3];
|
|
||||||
for( int x = 0; x < this.output.length; x++ )
|
|
||||||
{
|
{
|
||||||
if( outputList.tagCount() > 0 )
|
this.recipe.add( emptyArray );
|
||||||
{
|
|
||||||
this.output[x] = new ItemStack(outputList.getCompoundTagAt( x ));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( comp.hasKey( "outputs" ) )
|
||||||
|
{
|
||||||
|
final NBTTagList outputList = comp.getTagList( "outputs", 10 );
|
||||||
|
this.output = new ArrayList<>();
|
||||||
|
for( int z = 0; z < outputList.tagCount(); z++ )
|
||||||
|
{
|
||||||
|
this.output.add( new ItemStack( outputList.getCompoundTagAt( z ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -166,15 +175,23 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
{
|
{
|
||||||
ItemStack currentItem = craftMatrix.getStackInSlot( x );
|
ItemStack currentItem = craftMatrix.getStackInSlot( x );
|
||||||
|
|
||||||
|
if( x >= this.recipe.size() )
|
||||||
|
{
|
||||||
|
currentItem = ItemStack.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
// prepare slots
|
// prepare slots
|
||||||
if( !currentItem.isEmpty() )
|
if( !currentItem.isEmpty() )
|
||||||
{
|
{
|
||||||
// already the correct item?
|
// already the correct item?
|
||||||
ItemStack newItem = this.canUseInSlot( x, currentItem );
|
ItemStack newItem = this.canUseInSlot( x, currentItem );
|
||||||
|
|
||||||
if ( !cct.useRealItems() && this.recipe[x] != null ) {
|
if( !cct.useRealItems() && this.recipe.get( x ) != null )
|
||||||
if (this.recipe[x].length > 0 )
|
{
|
||||||
currentItem.setCount( recipe[x][0].getCount() );
|
if( this.recipe.get( x ).length > 0 )
|
||||||
|
{
|
||||||
|
currentItem.setCount( recipe.get( x )[0].getCount() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// put away old item
|
// put away old item
|
||||||
@@ -193,12 +210,12 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( currentItem.isEmpty() && this.recipe[x] != null )
|
if( currentItem.isEmpty() && recipe.size() > x && recipe.get( x ) != null )
|
||||||
{
|
{
|
||||||
// for each variant
|
// for each variant
|
||||||
for( int y = 0; y < this.recipe[x].length && currentItem.isEmpty(); y++ )
|
for( int y = 0; y < this.recipe.get( x ).length && currentItem.isEmpty(); y++ )
|
||||||
{
|
{
|
||||||
final IAEItemStack request = AEItemStack.fromItemStack( this.recipe[x][y] );
|
final IAEItemStack request = AEItemStack.fromItemStack( this.recipe.get( x )[y] );
|
||||||
if( request != null )
|
if( request != null )
|
||||||
{
|
{
|
||||||
// try ae
|
// try ae
|
||||||
@@ -212,7 +229,7 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
out = Platform.poweredExtraction( energy, storage, request, cct.getActionSource() );
|
out = Platform.poweredExtraction( energy, storage, request, cct.getActionSource() );
|
||||||
if( out == null )
|
if( out == null )
|
||||||
{
|
{
|
||||||
if( request.getItem().isDamageable() || ( Platform.isModLoaded( "gregtech" ) && request.getItem() instanceof MetaTool ) )
|
if( request.getItem().isDamageable() || Platform.isGTDamageableItem( request.getItem() ) )
|
||||||
{
|
{
|
||||||
Collection<IAEItemStack> outList = inv.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ).getStorageList().findFuzzy( request, FuzzyMode.IGNORE_ALL );
|
Collection<IAEItemStack> outList = inv.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ).getStorageList().findFuzzy( request, FuzzyMode.IGNORE_ALL );
|
||||||
for( IAEItemStack is : outList )
|
for( IAEItemStack is : outList )
|
||||||
@@ -245,9 +262,9 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
|
|
||||||
if( out != null )
|
if( out != null )
|
||||||
{
|
{
|
||||||
if (!cct.useRealItems())
|
if( !cct.useRealItems() )
|
||||||
{
|
{
|
||||||
out.setStackSize( recipe[x][y].getCount() );
|
out.setStackSize( recipe.get( x )[y].getCount() );
|
||||||
}
|
}
|
||||||
currentItem = out.createItemStack();
|
currentItem = out.createItemStack();
|
||||||
}
|
}
|
||||||
@@ -260,20 +277,20 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
|
|
||||||
if( cct.useRealItems() )
|
if( cct.useRealItems() )
|
||||||
{
|
{
|
||||||
currentItem = ad.removeSimilarItems(1, this.recipe[x][y],FuzzyMode.IGNORE_ALL, null );
|
currentItem = ad.removeSimilarItems( 1, this.recipe.get( x )[y], FuzzyMode.IGNORE_ALL, null );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
currentItem = ad.simulateSimilarRemove(recipe[x][y].getCount(), this.recipe[x][y],FuzzyMode.IGNORE_ALL, null );
|
currentItem = ad.simulateSimilarRemove( recipe.get( x )[y].getCount(), this.recipe.get( x )[y], FuzzyMode.IGNORE_ALL, null );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!cct.useRealItems())
|
if( !cct.useRealItems() )
|
||||||
{
|
{
|
||||||
if( currentItem.isEmpty() && this.recipe[x] != null )
|
if( currentItem.isEmpty() && recipe.size() > x && this.recipe.get( x ) != null )
|
||||||
{
|
{
|
||||||
currentItem = this.recipe[x][0].copy();
|
currentItem = this.recipe.get( x )[0].copy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -282,29 +299,35 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
|
|
||||||
con.onCraftMatrixChanged( new WrapperInvItemHandler( craftMatrix ) );
|
con.onCraftMatrixChanged( new WrapperInvItemHandler( craftMatrix ) );
|
||||||
|
|
||||||
if( this.output != null && con instanceof ContainerPatternTerm && !( (ContainerPatternTerm) con ).isCraftingMode() )
|
if( this.output != null && ( ( con instanceof ContainerPatternTerm && !( (ContainerPatternTerm) con ).isCraftingMode() ) || con instanceof ContainerExpandedProcessingPatternTerm ) )
|
||||||
{
|
{
|
||||||
IItemHandler outputSlots = cct.getInventoryByName( "output" );
|
IItemHandler outputSlots = cct.getInventoryByName( "output" );
|
||||||
for( int i = 0; i < this.output.length; ++i )
|
for( int i = 0; i < outputSlots.getSlots(); ++i )
|
||||||
{
|
{
|
||||||
if( this.output[i] == null ) continue;
|
ItemHandlerUtil.setStackInSlot( outputSlots, i, ItemStack.EMPTY );
|
||||||
ItemHandlerUtil.setStackInSlot( outputSlots, i, this.output[i] );
|
}
|
||||||
|
for( int i = 0; i < this.output.size() && i < outputSlots.getSlots(); ++i )
|
||||||
|
{
|
||||||
|
if( this.output.get( i ) == null || this.output.get( i ) == ItemStack.EMPTY )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ItemHandlerUtil.setStackInSlot( outputSlots, i, this.output.get( i ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @param slot
|
* @param slot
|
||||||
* @param is itemstack
|
* @param is itemstack
|
||||||
* @return is if it can be used, else EMPTY
|
* @return is if it can be used, else EMPTY
|
||||||
*/
|
*/
|
||||||
private ItemStack canUseInSlot( int slot, ItemStack is )
|
private ItemStack canUseInSlot( int slot, ItemStack is )
|
||||||
{
|
{
|
||||||
if( this.recipe[slot] != null )
|
if( this.recipe.get( slot ) != null )
|
||||||
{
|
{
|
||||||
for( ItemStack option : this.recipe[slot] )
|
for( ItemStack option : this.recipe.get( slot ) )
|
||||||
{
|
{
|
||||||
if( ItemStack.areItemStacksEqual( is, option ) )
|
if( ItemStack.areItemStacksEqual( is, option ) )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ import java.io.DataInputStream;
|
|||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import appeng.client.gui.implementations.GuiOreDictStorageBus;
|
||||||
|
import appeng.container.implementations.*;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
|
|
||||||
@@ -40,17 +42,6 @@ import appeng.api.util.IConfigManager;
|
|||||||
import appeng.api.util.IConfigurableObject;
|
import appeng.api.util.IConfigurableObject;
|
||||||
import appeng.client.gui.implementations.GuiCraftingCPU;
|
import appeng.client.gui.implementations.GuiCraftingCPU;
|
||||||
import appeng.container.AEBaseContainer;
|
import appeng.container.AEBaseContainer;
|
||||||
import appeng.container.implementations.ContainerCellWorkbench;
|
|
||||||
import appeng.container.implementations.ContainerCraftConfirm;
|
|
||||||
import appeng.container.implementations.ContainerCraftingCPU;
|
|
||||||
import appeng.container.implementations.ContainerCraftingStatus;
|
|
||||||
import appeng.container.implementations.ContainerLevelEmitter;
|
|
||||||
import appeng.container.implementations.ContainerNetworkTool;
|
|
||||||
import appeng.container.implementations.ContainerPatternTerm;
|
|
||||||
import appeng.container.implementations.ContainerPriority;
|
|
||||||
import appeng.container.implementations.ContainerQuartzKnife;
|
|
||||||
import appeng.container.implementations.ContainerSecurityStation;
|
|
||||||
import appeng.container.implementations.ContainerStorageBus;
|
|
||||||
import appeng.core.sync.AppEngPacket;
|
import appeng.core.sync.AppEngPacket;
|
||||||
import appeng.core.sync.network.INetworkInfo;
|
import appeng.core.sync.network.INetworkInfo;
|
||||||
import appeng.fluids.container.ContainerFluidLevelEmitter;
|
import appeng.fluids.container.ContainerFluidLevelEmitter;
|
||||||
@@ -166,7 +157,9 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
final ContainerFluidLevelEmitter lvc = (ContainerFluidLevelEmitter) c;
|
final ContainerFluidLevelEmitter lvc = (ContainerFluidLevelEmitter) c;
|
||||||
lvc.setLevel( Long.parseLong( this.Value ), player );
|
lvc.setLevel( Long.parseLong( this.Value ), player );
|
||||||
}
|
}
|
||||||
else if( this.Name.startsWith( "PatternTerminal." ) && c instanceof ContainerPatternTerm )
|
else if( this.Name.startsWith( "PatternTerminal." ) )
|
||||||
|
{
|
||||||
|
if( c instanceof ContainerPatternTerm )
|
||||||
{
|
{
|
||||||
final ContainerPatternTerm cpt = (ContainerPatternTerm) c;
|
final ContainerPatternTerm cpt = (ContainerPatternTerm) c;
|
||||||
if( this.Name.equals( "PatternTerminal.CraftMode" ) )
|
if( this.Name.equals( "PatternTerminal.CraftMode" ) )
|
||||||
@@ -175,7 +168,8 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
}
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.Encode" ) )
|
else if( this.Name.equals( "PatternTerminal.Encode" ) )
|
||||||
{
|
{
|
||||||
if (this.Value.equals( "2" )) {
|
if( this.Value.equals( "2" ) )
|
||||||
|
{
|
||||||
cpt.encodeAndMoveToInventory();
|
cpt.encodeAndMoveToInventory();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -189,27 +183,27 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
}
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.MultiplyByTwo" ) )
|
else if( this.Name.equals( "PatternTerminal.MultiplyByTwo" ) )
|
||||||
{
|
{
|
||||||
cpt.multiply(2);
|
cpt.multiply( 2 );
|
||||||
}
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.MultiplyByThree" ) )
|
else if( this.Name.equals( "PatternTerminal.MultiplyByThree" ) )
|
||||||
{
|
{
|
||||||
cpt.multiply(3);
|
cpt.multiply( 3 );
|
||||||
}
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.DivideByTwo" ) )
|
else if( this.Name.equals( "PatternTerminal.DivideByTwo" ) )
|
||||||
{
|
{
|
||||||
cpt.divide(2);
|
cpt.divide( 2 );
|
||||||
}
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.DivideByThree" ) )
|
else if( this.Name.equals( "PatternTerminal.DivideByThree" ) )
|
||||||
{
|
{
|
||||||
cpt.divide(3);
|
cpt.divide( 3 );
|
||||||
}
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.IncreaseByOne" ) )
|
else if( this.Name.equals( "PatternTerminal.IncreaseByOne" ) )
|
||||||
{
|
{
|
||||||
cpt.increase(1);
|
cpt.increase( 1 );
|
||||||
}
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.DecreaseByOne" ) )
|
else if( this.Name.equals( "PatternTerminal.DecreaseByOne" ) )
|
||||||
{
|
{
|
||||||
cpt.decrease(1);
|
cpt.decrease( 1 );
|
||||||
}
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.MaximizeCount" ) )
|
else if( this.Name.equals( "PatternTerminal.MaximizeCount" ) )
|
||||||
{
|
{
|
||||||
@@ -220,6 +214,54 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
cpt.getPatternTerminal().setSubstitution( this.Value.equals( "1" ) );
|
cpt.getPatternTerminal().setSubstitution( this.Value.equals( "1" ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( c instanceof ContainerExpandedProcessingPatternTerm )
|
||||||
|
{
|
||||||
|
final ContainerExpandedProcessingPatternTerm cept = (ContainerExpandedProcessingPatternTerm) c;
|
||||||
|
if( this.Name.equals( "PatternTerminal.Encode" ) )
|
||||||
|
{
|
||||||
|
if( this.Value.equals( "2" ) )
|
||||||
|
{
|
||||||
|
cept.encodeAndMoveToInventory();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cept.encode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.Clear" ) )
|
||||||
|
{
|
||||||
|
cept.clear();
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.MultiplyByTwo" ) )
|
||||||
|
{
|
||||||
|
cept.multiply( 2 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.MultiplyByThree" ) )
|
||||||
|
{
|
||||||
|
cept.multiply( 3 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.DivideByTwo" ) )
|
||||||
|
{
|
||||||
|
cept.divide( 2 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.DivideByThree" ) )
|
||||||
|
{
|
||||||
|
cept.divide( 3 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.IncreaseByOne" ) )
|
||||||
|
{
|
||||||
|
cept.increase( 1 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.DecreaseByOne" ) )
|
||||||
|
{
|
||||||
|
cept.decrease( 1 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.MaximizeCount" ) )
|
||||||
|
{
|
||||||
|
cept.maximizeCount();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else if( this.Name.startsWith( "StorageBus." ) )
|
else if( this.Name.startsWith( "StorageBus." ) )
|
||||||
{
|
{
|
||||||
if( this.Name.equals( "StorageBus.Action" ) )
|
if( this.Name.equals( "StorageBus.Action" ) )
|
||||||
@@ -234,6 +276,11 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
{
|
{
|
||||||
( (ContainerFluidStorageBus) c ).partition();
|
( (ContainerFluidStorageBus) c ).partition();
|
||||||
}
|
}
|
||||||
|
else if( c instanceof ContainerOreDictStorageBus )
|
||||||
|
{
|
||||||
|
( (ContainerOreDictStorageBus) c ).partition();
|
||||||
|
( (ContainerOreDictStorageBus) c ).sendRegex();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if( this.Value.equals( "Clear" ) )
|
else if( this.Value.equals( "Clear" ) )
|
||||||
{
|
{
|
||||||
@@ -248,6 +295,20 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( this.Name.startsWith( "OreDictStorageBus" ) )
|
||||||
|
{
|
||||||
|
if( c instanceof ContainerOreDictStorageBus )
|
||||||
|
{
|
||||||
|
if( this.Name.equals( "OreDictStorageBus.save" ) )
|
||||||
|
{
|
||||||
|
( (ContainerOreDictStorageBus) c ).saveOreMatch( this.Value );
|
||||||
|
}
|
||||||
|
if( this.Name.equals( "OreDictStorageBus.getRegex" ) )
|
||||||
|
{
|
||||||
|
( (ContainerOreDictStorageBus) c ).sendRegex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else if( this.Name.startsWith( "CellWorkbench." ) && c instanceof ContainerCellWorkbench )
|
else if( this.Name.startsWith( "CellWorkbench." ) && c instanceof ContainerCellWorkbench )
|
||||||
{
|
{
|
||||||
final ContainerCellWorkbench ccw = (ContainerCellWorkbench) c;
|
final ContainerCellWorkbench ccw = (ContainerCellWorkbench) c;
|
||||||
@@ -324,6 +385,14 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
( (GuiCraftingCPU) gs ).clearItems();
|
( (GuiCraftingCPU) gs ).clearItems();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( this.Name.equals( "OreDictStorageBus.sendRegex" ) )
|
||||||
|
{
|
||||||
|
final GuiScreen gs = Minecraft.getMinecraft().currentScreen;
|
||||||
|
if( gs instanceof GuiOreDictStorageBus )
|
||||||
|
{
|
||||||
|
( (GuiOreDictStorageBus) gs ).fillRegex( this.Value );
|
||||||
|
}
|
||||||
|
}
|
||||||
else if( c instanceof IConfigurableObject )
|
else if( c instanceof IConfigurableObject )
|
||||||
{
|
{
|
||||||
final IConfigManager cm = ( (IConfigurableObject) c ).getConfigManager();
|
final IConfigManager cm = ( (IConfigurableObject) c ).getConfigManager();
|
||||||
|
|||||||
@@ -19,15 +19,6 @@
|
|||||||
package appeng.crafting;
|
package appeng.crafting;
|
||||||
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import com.google.common.base.Stopwatch;
|
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
import appeng.api.networking.IGrid;
|
import appeng.api.networking.IGrid;
|
||||||
@@ -36,7 +27,6 @@ import appeng.api.networking.IGridNode;
|
|||||||
import appeng.api.networking.crafting.ICraftingCallback;
|
import appeng.api.networking.crafting.ICraftingCallback;
|
||||||
import appeng.api.networking.crafting.ICraftingGrid;
|
import appeng.api.networking.crafting.ICraftingGrid;
|
||||||
import appeng.api.networking.crafting.ICraftingJob;
|
import appeng.api.networking.crafting.ICraftingJob;
|
||||||
import appeng.api.networking.crafting.ICraftingPatternDetails;
|
|
||||||
import appeng.api.networking.security.IActionHost;
|
import appeng.api.networking.security.IActionHost;
|
||||||
import appeng.api.networking.security.IActionSource;
|
import appeng.api.networking.security.IActionSource;
|
||||||
import appeng.api.networking.storage.IStorageGrid;
|
import appeng.api.networking.storage.IStorageGrid;
|
||||||
@@ -46,56 +36,64 @@ import appeng.api.storage.data.IItemList;
|
|||||||
import appeng.api.util.DimensionalCoord;
|
import appeng.api.util.DimensionalCoord;
|
||||||
import appeng.core.AELog;
|
import appeng.core.AELog;
|
||||||
import appeng.hooks.TickHandler;
|
import appeng.hooks.TickHandler;
|
||||||
|
import appeng.me.cache.GridStorageCache;
|
||||||
|
import com.google.common.base.Stopwatch;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
|
||||||
public class CraftingJob implements Runnable, ICraftingJob
|
public class CraftingJob implements Runnable, ICraftingJob
|
||||||
{
|
{
|
||||||
private static final String LOG_CRAFTING_JOB = "CraftingJob (%s) issued by %s requesting [%s] using %s bytes took %s ms";
|
private static final String LOG_CRAFTING_JOB = "CraftingJob (%s) issued by %s requesting [%s] using %s bytes took %s us";
|
||||||
private static final String LOG_MACHINE_SOURCE_DETAILS = "Machine[object=%s, %s]";
|
private static final String LOG_MACHINE_SOURCE_DETAILS = "Machine[object=%s, %s]";
|
||||||
|
|
||||||
private final MECraftingInventory original;
|
private final MECraftingInventory original;
|
||||||
private final World world;
|
private final World world;
|
||||||
private final IItemList<IAEItemStack> crafting = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
private final IItemList<IAEItemStack> crafting = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||||
private final IItemList<IAEItemStack> missing = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
private final IItemList<IAEItemStack> missing = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||||
|
private final IItemList<IAEItemStack> neededForLoop = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||||
|
private final Object2ObjectOpenHashMap<CraftingTreeNode, IAEItemStack> reserved = new Object2ObjectOpenHashMap<>();
|
||||||
|
|
||||||
private final HashMap<String, TwoIntegers> opsAndMultiplier = new HashMap<>();
|
private final HashMap<String, TwoIntegers> opsAndMultiplier = new HashMap<>();
|
||||||
private final Object monitor = new Object();
|
private final Object monitor = new Object();
|
||||||
private final Stopwatch watch = Stopwatch.createUnstarted();
|
private final Stopwatch tickSpreadingWatch = Stopwatch.createUnstarted();
|
||||||
private CraftingTreeNode tree;
|
private final Stopwatch craftingTreeWatch = Stopwatch.createUnstarted();
|
||||||
private final IAEItemStack output;
|
private final IAEItemStack output;
|
||||||
|
private final IActionSource actionSrc;
|
||||||
|
private final ICraftingCallback callback;
|
||||||
|
private CraftingTreeNode tree;
|
||||||
private boolean simulate = false;
|
private boolean simulate = false;
|
||||||
private MECraftingInventory availableCheck;
|
private MECraftingInventory availableCheck;
|
||||||
private long bytes = 0;
|
private long bytes = 0;
|
||||||
private final IActionSource actionSrc;
|
|
||||||
private final ICraftingCallback callback;
|
|
||||||
private boolean running = false;
|
private boolean running = false;
|
||||||
private boolean done = false;
|
private boolean done = false;
|
||||||
private int time;
|
private int time;
|
||||||
private int incTime;
|
private int incTime;
|
||||||
|
|
||||||
private World wrapWorld( final World w )
|
|
||||||
{
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
public CraftingJob( final World w, final IGrid grid, final IActionSource actionSrc, final IAEItemStack what, final ICraftingCallback callback )
|
public CraftingJob( final World w, final IGrid grid, final IActionSource actionSrc, final IAEItemStack what, final ICraftingCallback callback )
|
||||||
{
|
{
|
||||||
this.world = this.wrapWorld( w );
|
this.world = w;
|
||||||
this.output = what.copy();
|
this.output = what.copy();
|
||||||
this.actionSrc = actionSrc;
|
this.actionSrc = actionSrc;
|
||||||
|
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
final ICraftingGrid cc = grid.getCache( ICraftingGrid.class );
|
|
||||||
final IStorageGrid sg = grid.getCache( IStorageGrid.class );
|
|
||||||
this.original = new MECraftingInventory( sg
|
|
||||||
.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ), actionSrc, false, false, false );
|
|
||||||
|
|
||||||
|
ICraftingGrid cc = grid.getCache( ICraftingGrid.class );
|
||||||
|
final GridStorageCache sg = grid.getCache( IStorageGrid.class );
|
||||||
|
this.original = sg.getExtractableList( actionSrc );
|
||||||
|
|
||||||
|
this.availableCheck = new MECraftingInventory( this.original, false, false, false );
|
||||||
this.setTree( this.getCraftingTree( cc, what ) );
|
this.setTree( this.getCraftingTree( cc, what ) );
|
||||||
this.availableCheck = null;
|
this.availableCheck = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private CraftingTreeNode getCraftingTree( final ICraftingGrid cc, final IAEItemStack what )
|
private CraftingTreeNode getCraftingTree( final ICraftingGrid cc, final IAEItemStack what )
|
||||||
{
|
{
|
||||||
return new CraftingTreeNode( cc, this, what, null, -1, 0 );
|
return new CraftingTreeNode( cc, this, what, what.getStackSize(), null, -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void refund( final IAEItemStack o )
|
void refund( final IAEItemStack o )
|
||||||
@@ -108,12 +106,12 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
return this.availableCheck.extractItems( available, Actionable.MODULATE, this.actionSrc );
|
return this.availableCheck.extractItems( available, Actionable.MODULATE, this.actionSrc );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeToNBT( final NBTTagCompound out )
|
IAEItemStack checkAvailable( final IAEItemStack available )
|
||||||
{
|
{
|
||||||
|
return this.availableCheck.extractItems( available, Actionable.SIMULATE, this.actionSrc );
|
||||||
}
|
}
|
||||||
|
|
||||||
void addTask( IAEItemStack what, final long crafts, final ICraftingPatternDetails details, final int depth )
|
void addTask( IAEItemStack what, final long crafts )
|
||||||
{
|
{
|
||||||
if( crafts > 0 )
|
if( crafts > 0 )
|
||||||
{
|
{
|
||||||
@@ -129,6 +127,22 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
this.missing.add( what );
|
this.missing.add( what );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void reserve( CraftingTreeNode node, IAEItemStack stack )
|
||||||
|
{
|
||||||
|
this.checkUse( stack );
|
||||||
|
reserved.put( node, stack );
|
||||||
|
}
|
||||||
|
|
||||||
|
public IItemList<IAEItemStack> getNeededForLoop()
|
||||||
|
{
|
||||||
|
return neededForLoop;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object2ObjectOpenHashMap<CraftingTreeNode, IAEItemStack> getReserved()
|
||||||
|
{
|
||||||
|
return reserved;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
@@ -139,13 +153,15 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
TickHandler.INSTANCE.registerCraftingSimulation( this.world, this );
|
TickHandler.INSTANCE.registerCraftingSimulation( this.world, this );
|
||||||
this.handlePausing();
|
this.handlePausing();
|
||||||
|
|
||||||
final Stopwatch timer = Stopwatch.createStarted();
|
|
||||||
|
|
||||||
final MECraftingInventory craftingInventory = new MECraftingInventory( this.original, true, false, true );
|
final MECraftingInventory craftingInventory = new MECraftingInventory( this.original, true, false, true );
|
||||||
craftingInventory.ignore( this.output );
|
|
||||||
|
|
||||||
this.availableCheck = new MECraftingInventory( this.original, false, false, false );
|
this.availableCheck = new MECraftingInventory( this.original, false, false, false );
|
||||||
|
this.reserved.values().forEach( availableCheck::reserve );
|
||||||
|
this.reserved.values().forEach( craftingInventory::reserve );
|
||||||
|
|
||||||
|
craftingTreeWatch.start();
|
||||||
this.getTree().request( craftingInventory, this.output.getStackSize(), this.actionSrc );
|
this.getTree().request( craftingInventory, this.output.getStackSize(), this.actionSrc );
|
||||||
|
craftingTreeWatch.stop();
|
||||||
this.getTree().dive( this );
|
this.getTree().dive( this );
|
||||||
|
|
||||||
for( final String s : this.opsAndMultiplier.keySet() )
|
for( final String s : this.opsAndMultiplier.keySet() )
|
||||||
@@ -154,9 +170,14 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
AELog.crafting( s + " * " + ti.times + " = " + ( ti.perOp * ti.times ) );
|
AELog.crafting( s + " * " + ti.times + " = " + ( ti.perOp * ti.times ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logCraftingJob( "real", timer );
|
if( actionSrc.player().isPresent() )
|
||||||
// if ( mode == Actionable.MODULATE )
|
{
|
||||||
// craftingInventory.moveItemsToStorage( storage );
|
this.logCraftingJob( "simulated, success", craftingTreeWatch );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.logCraftingJob( "real, success", craftingTreeWatch );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch( final CraftBranchFailure e )
|
catch( final CraftBranchFailure e )
|
||||||
{
|
{
|
||||||
@@ -164,14 +185,18 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
final Stopwatch timer = Stopwatch.createStarted();
|
if( actionSrc.player().isPresent() )
|
||||||
|
{
|
||||||
final MECraftingInventory craftingInventory = new MECraftingInventory( this.original, true, false, true );
|
final MECraftingInventory craftingInventory = new MECraftingInventory( this.original, true, false, true );
|
||||||
craftingInventory.ignore( this.output );
|
this.getTree().setSimulate();
|
||||||
|
|
||||||
this.availableCheck = new MECraftingInventory( this.original, false, false, false );
|
this.availableCheck = new MECraftingInventory( this.original, false, false, false );
|
||||||
|
this.reserved.values().forEach( availableCheck::reserve );
|
||||||
|
this.reserved.values().forEach( craftingInventory::reserve );
|
||||||
|
|
||||||
this.getTree().setSimulate();
|
craftingTreeWatch.reset().start();
|
||||||
this.getTree().request( craftingInventory, this.output.getStackSize(), this.actionSrc );
|
this.getTree().request( craftingInventory, this.output.getStackSize(), this.actionSrc );
|
||||||
|
craftingTreeWatch.stop();
|
||||||
this.getTree().dive( this );
|
this.getTree().dive( this );
|
||||||
|
|
||||||
for( final String s : this.opsAndMultiplier.keySet() )
|
for( final String s : this.opsAndMultiplier.keySet() )
|
||||||
@@ -180,7 +205,12 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
AELog.crafting( s + " * " + ti.times + " = " + ( ti.perOp * ti.times ) );
|
AELog.crafting( s + " * " + ti.times + " = " + ( ti.perOp * ti.times ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logCraftingJob( "simulate", timer );
|
this.logCraftingJob( "simulated, failed", craftingTreeWatch );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.logCraftingJob( "real, failed", craftingTreeWatch );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch( final CraftBranchFailure e1 )
|
catch( final CraftBranchFailure e1 )
|
||||||
{
|
{
|
||||||
@@ -226,10 +256,11 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
this.incTime = 0;
|
this.incTime = 0;
|
||||||
synchronized ( this.monitor )
|
synchronized ( this.monitor )
|
||||||
{
|
{
|
||||||
if( this.watch.elapsed( TimeUnit.MICROSECONDS ) > this.time )
|
if( this.tickSpreadingWatch.elapsed( TimeUnit.MICROSECONDS ) > this.time )
|
||||||
{
|
{
|
||||||
this.running = false;
|
this.running = false;
|
||||||
this.watch.stop();
|
this.craftingTreeWatch.stop();
|
||||||
|
this.tickSpreadingWatch.stop();
|
||||||
this.monitor.notify();
|
this.monitor.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,12 +276,13 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
AELog.craftingDebug( "crafting job now active" );
|
AELog.craftingDebug( "crafting job now active" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( Thread.interrupted() )
|
if( Thread.interrupted() )
|
||||||
{
|
{
|
||||||
throw new InterruptedException();
|
throw new InterruptedException();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
this.incTime++;
|
this.incTime++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -263,7 +295,7 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
|
|
||||||
this.availableCheck = null;
|
this.availableCheck = null;
|
||||||
|
|
||||||
synchronized( this.monitor )
|
synchronized ( this.monitor )
|
||||||
{
|
{
|
||||||
this.running = false;
|
this.running = false;
|
||||||
this.done = true;
|
this.done = true;
|
||||||
@@ -311,7 +343,7 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
/**
|
/**
|
||||||
* @return true if this needs more simulation
|
* @return true if this needs more simulation
|
||||||
*/
|
*/
|
||||||
public boolean simulateFor(final int milli)
|
public boolean simulateFor( final int milli )
|
||||||
{
|
{
|
||||||
this.time = milli;
|
this.time = milli;
|
||||||
|
|
||||||
@@ -323,8 +355,8 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
}
|
}
|
||||||
if( !this.actionSrc.player().isPresent() )
|
if( !this.actionSrc.player().isPresent() )
|
||||||
{
|
{
|
||||||
this.watch.reset();
|
this.tickSpreadingWatch.reset();
|
||||||
this.watch.start();
|
this.tickSpreadingWatch.start();
|
||||||
this.monitor.notify();
|
this.monitor.notify();
|
||||||
}
|
}
|
||||||
this.running = true;
|
this.running = true;
|
||||||
@@ -353,7 +385,7 @@ public class CraftingJob implements Runnable, ICraftingJob
|
|||||||
if( AELog.isCraftingLogEnabled() )
|
if( AELog.isCraftingLogEnabled() )
|
||||||
{
|
{
|
||||||
final String itemToOutput = this.output.toString();
|
final String itemToOutput = this.output.toString();
|
||||||
final long elapsedTime = timer.elapsed( TimeUnit.MILLISECONDS );
|
final long elapsedTime = timer.elapsed( TimeUnit.MICROSECONDS );
|
||||||
final String actionSource;
|
final String actionSource;
|
||||||
|
|
||||||
if( this.actionSrc.player().isPresent() )
|
if( this.actionSrc.player().isPresent() )
|
||||||
|
|||||||
@@ -19,15 +19,6 @@
|
|||||||
package appeng.crafting;
|
package appeng.crafting;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
|
|
||||||
import net.minecraft.util.text.TextComponentString;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
import appeng.api.config.FuzzyMode;
|
import appeng.api.config.FuzzyMode;
|
||||||
@@ -37,9 +28,22 @@ import appeng.api.networking.security.IActionSource;
|
|||||||
import appeng.api.storage.channels.IItemStorageChannel;
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
|
import appeng.core.sync.packets.PacketInformPlayer;
|
||||||
import appeng.me.cluster.implementations.CraftingCPUCluster;
|
import appeng.me.cluster.implementations.CraftingCPUCluster;
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.fml.common.Optional;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
@Optional.Interface( iface = "gregtech.api.items.IToolItem", modid = "gregtech" )
|
||||||
public class CraftingTreeNode
|
public class CraftingTreeNode
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -54,22 +58,20 @@ public class CraftingTreeNode
|
|||||||
private final IAEItemStack what;
|
private final IAEItemStack what;
|
||||||
// what are the crafting patterns for this?
|
// what are the crafting patterns for this?
|
||||||
private final ArrayList<CraftingTreeProcess> nodes = new ArrayList<>();
|
private final ArrayList<CraftingTreeProcess> nodes = new ArrayList<>();
|
||||||
|
private final boolean canEmit;
|
||||||
|
private CraftingTreeNode loopHead;
|
||||||
private int bytes = 0;
|
private int bytes = 0;
|
||||||
private boolean canEmit = false;
|
|
||||||
private long missing = 0;
|
private long missing = 0;
|
||||||
private long howManyEmitted = 0;
|
private long howManyEmitted = 0;
|
||||||
private boolean exhausted = false;
|
private boolean exhausted = false;
|
||||||
|
|
||||||
private boolean sim;
|
public CraftingTreeNode( final ICraftingGrid cc, final CraftingJob job, final IAEItemStack wat, long amount, final CraftingTreeProcess par, final int slot )
|
||||||
|
|
||||||
public CraftingTreeNode( final ICraftingGrid cc, final CraftingJob job, final IAEItemStack wat, final CraftingTreeProcess par, final int slot, final int depth )
|
|
||||||
{
|
{
|
||||||
this.what = wat;
|
this.what = wat;
|
||||||
this.parent = par;
|
this.parent = par;
|
||||||
this.slot = slot;
|
this.slot = slot;
|
||||||
this.world = job.getWorld();
|
this.world = job.getWorld();
|
||||||
this.job = job;
|
this.job = job;
|
||||||
this.sim = false;
|
|
||||||
|
|
||||||
this.canEmit = cc.canEmitFor( this.what );
|
this.canEmit = cc.canEmitFor( this.what );
|
||||||
|
|
||||||
@@ -81,134 +83,56 @@ public class CraftingTreeNode
|
|||||||
for( final ICraftingPatternDetails details : cc.getCraftingFor( this.what, this.parent == null ? null : this.parent.details, slot, this.world ) )// in
|
for( final ICraftingPatternDetails details : cc.getCraftingFor( this.what, this.parent == null ? null : this.parent.details, slot, this.world ) )// in
|
||||||
// order.
|
// order.
|
||||||
{
|
{
|
||||||
if( this.parent == null || this.parent.notRecursive( details ) )
|
int times = 1;
|
||||||
|
for( IAEItemStack o : details.getCondensedOutputs() )
|
||||||
{
|
{
|
||||||
this.nodes.add( new CraftingTreeProcess( cc, job, details, this, depth + 1 ) );
|
if( what.equals( o ) )
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean notRecursive( final ICraftingPatternDetails details )
|
|
||||||
{
|
{
|
||||||
IAEItemStack[] o = details.getCondensedOutputs();
|
times = (int) ( amount / o.getStackSize() + ( amount % o.getStackSize() != 0 ? 1 : 0 ) );
|
||||||
|
|
||||||
for( final IAEItemStack i : o )
|
|
||||||
{
|
|
||||||
if( i.equals( this.what ) )
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
o = details.getCondensedInputs();
|
|
||||||
|
|
||||||
for( final IAEItemStack i : o )
|
|
||||||
{
|
|
||||||
if( i.equals( this.what ) )
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.parent == null )
|
if( this.parent == null )
|
||||||
{
|
{
|
||||||
return true;
|
this.nodes.add( new CraftingTreeProcess( cc, job, details, times, this ) );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if( details == parent.details )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
CraftingTreeNode recursive = recursiveNode( this );
|
||||||
|
if( recursive == null )
|
||||||
|
{
|
||||||
|
this.nodes.add( new CraftingTreeProcess( cc, job, details, times, this ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reserveForNode();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.parent.notRecursive( details );
|
void reserveForNode()
|
||||||
|
{
|
||||||
|
if( this.equals( loopHead ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IAEItemStack available = job.checkAvailable( this.what );
|
||||||
|
if( available != null && available.getStackSize() >= this.what.getStackSize() )
|
||||||
|
{
|
||||||
|
this.job.reserve( this, this.what.copy() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
parent.reserveForNode();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IAEItemStack request( final MECraftingInventory inv, long l, final IActionSource src ) throws CraftBranchFailure, InterruptedException
|
IAEItemStack request( final MECraftingInventory inv, long l, final IActionSource src ) throws CraftBranchFailure, InterruptedException
|
||||||
{
|
{
|
||||||
this.job.handlePausing();
|
this.job.handlePausing();
|
||||||
final List<IAEItemStack> thingsUsed = new ArrayList<>();
|
|
||||||
|
|
||||||
this.what.setStackSize( l );
|
|
||||||
IAEItemStack available = inv.extractItems( this.what, Actionable.MODULATE, src );
|
|
||||||
|
|
||||||
if( available != null )
|
|
||||||
{
|
|
||||||
if( !this.exhausted )
|
|
||||||
{
|
|
||||||
final IAEItemStack is = this.job.checkUse( available );
|
|
||||||
|
|
||||||
if( is != null )
|
|
||||||
{
|
|
||||||
thingsUsed.add( is.copy() );
|
|
||||||
this.used.add( is );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.bytes += available.getStackSize();
|
|
||||||
l -= available.getStackSize();
|
|
||||||
|
|
||||||
if( l == 0 )
|
|
||||||
{
|
|
||||||
return available;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if( this.getSlot() >= 0 && this.parent != null && this.parent.details.isCraftable() )
|
|
||||||
{
|
|
||||||
final Collection<IAEItemStack> itemList;
|
|
||||||
final IItemList<IAEItemStack> inventoryList = inv.getItemList();
|
|
||||||
|
|
||||||
if( this.parent.details.canSubstitute() )
|
|
||||||
{
|
|
||||||
final List<IAEItemStack> substitutes = this.parent.details.getSubstituteInputs( this.slot );
|
|
||||||
itemList = new ArrayList<>( substitutes.size() );
|
|
||||||
|
|
||||||
for( IAEItemStack stack : substitutes )
|
|
||||||
{
|
|
||||||
itemList.addAll( inventoryList.findFuzzy( stack, FuzzyMode.IGNORE_ALL ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
itemList = Lists.newArrayList();
|
|
||||||
|
|
||||||
final IAEItemStack item = inventoryList.findPrecise( this.what );
|
|
||||||
|
|
||||||
if( item != null )
|
|
||||||
{
|
|
||||||
itemList.add( item );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for( IAEItemStack fuzz : itemList )
|
|
||||||
{
|
|
||||||
if( this.parent.details.isValidItemForSlot( this.getSlot(), fuzz.copy().setStackSize( 1 ).createItemStack(), this.world ) )
|
|
||||||
{
|
|
||||||
fuzz = fuzz.copy();
|
|
||||||
fuzz.setStackSize( l );
|
|
||||||
|
|
||||||
available = inv.extractItems( fuzz, Actionable.MODULATE, src );
|
|
||||||
|
|
||||||
if( available != null )
|
|
||||||
{
|
|
||||||
if( !this.exhausted )
|
|
||||||
{
|
|
||||||
final IAEItemStack is = this.job.checkUse( available );
|
|
||||||
|
|
||||||
if( is != null )
|
|
||||||
{
|
|
||||||
thingsUsed.add( is.copy() );
|
|
||||||
this.used.add( is );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.bytes += available.getStackSize();
|
|
||||||
l -= available.getStackSize();
|
|
||||||
|
|
||||||
if( l == 0 )
|
|
||||||
{
|
|
||||||
return available;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( this.canEmit )
|
if( this.canEmit )
|
||||||
{
|
{
|
||||||
final IAEItemStack wat = this.what.copy();
|
final IAEItemStack wat = this.what.copy();
|
||||||
@@ -220,6 +144,150 @@ public class CraftingTreeNode
|
|||||||
return wat;
|
return wat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final IItemList<IAEItemStack> inventoryList = inv.getItemList();
|
||||||
|
|
||||||
|
IAEItemStack reserved = job.getReserved().get( this );
|
||||||
|
|
||||||
|
final List<IAEItemStack> thingsUsed = new ArrayList<>();
|
||||||
|
|
||||||
|
this.what.setStackSize( l );
|
||||||
|
|
||||||
|
if( this.getSlot() >= 0 && this.parent != null && this.parent.details.isCraftable() )
|
||||||
|
{
|
||||||
|
Collection<IAEItemStack> itemList = new HashSet<>();
|
||||||
|
|
||||||
|
if( this.what.getItem().isDamageable() || Platform.isGTDamageableItem( this.what.getItem() ) )
|
||||||
|
{
|
||||||
|
itemList.addAll( inventoryList.findFuzzy( this.what, FuzzyMode.IGNORE_ALL ) );
|
||||||
|
|
||||||
|
if( this.parent.details.canSubstitute() )
|
||||||
|
{
|
||||||
|
for( IAEItemStack is : inventoryList )
|
||||||
|
{
|
||||||
|
if( is.fuzzyComparison( this.what, FuzzyMode.IGNORE_ALL ) )
|
||||||
|
{
|
||||||
|
itemList.add( is );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
final IAEItemStack item = inventoryList.findPrecise( this.what );
|
||||||
|
if( item != null )
|
||||||
|
{
|
||||||
|
itemList.add( item );
|
||||||
|
}
|
||||||
|
if( this.parent.details.canSubstitute() )
|
||||||
|
{
|
||||||
|
for( IAEItemStack s : parent.details.getSubstituteInputs( this.slot ) )
|
||||||
|
{
|
||||||
|
if( s != null )
|
||||||
|
{
|
||||||
|
for( IAEItemStack ss : inventoryList.findFuzzy( s, FuzzyMode.IGNORE_ALL ) )
|
||||||
|
{
|
||||||
|
if( ss != null )
|
||||||
|
{
|
||||||
|
itemList.add( ss );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for( IAEItemStack fuzz : itemList )
|
||||||
|
{
|
||||||
|
if( this.parent.details.isValidItemForSlot( this.getSlot(), fuzz.getDefinition(), this.world ) )
|
||||||
|
{
|
||||||
|
fuzz = fuzz.copy();
|
||||||
|
fuzz.setStackSize( l );
|
||||||
|
|
||||||
|
final IAEItemStack available;
|
||||||
|
|
||||||
|
if( reserved != null )
|
||||||
|
{
|
||||||
|
available = reserved;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
available = inv.extractItems( fuzz, Actionable.MODULATE, src );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( available != null )
|
||||||
|
{
|
||||||
|
if( !this.exhausted )
|
||||||
|
{
|
||||||
|
final IAEItemStack is = this.job.checkUse( available );
|
||||||
|
|
||||||
|
if( is != null )
|
||||||
|
{
|
||||||
|
thingsUsed.add( is.copy() );
|
||||||
|
this.used.add( is );
|
||||||
|
}
|
||||||
|
else if( reserved != null )
|
||||||
|
{
|
||||||
|
thingsUsed.add( reserved.copy() );
|
||||||
|
this.used.add( reserved );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.bytes += available.getStackSize();
|
||||||
|
l -= available.getStackSize();
|
||||||
|
|
||||||
|
if( l == 0 )
|
||||||
|
{
|
||||||
|
return available;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
final IAEItemStack available;
|
||||||
|
|
||||||
|
if( parent == null && this.what.equals( job.getOutput() ) )
|
||||||
|
{
|
||||||
|
available = null;
|
||||||
|
}
|
||||||
|
else if( reserved != null )
|
||||||
|
{
|
||||||
|
available = reserved;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
available = inv.extractItems( this.what, Actionable.MODULATE, src );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( available != null )
|
||||||
|
{
|
||||||
|
if( !this.exhausted )
|
||||||
|
{
|
||||||
|
final IAEItemStack is = this.job.checkUse( available );
|
||||||
|
|
||||||
|
if( is != null )
|
||||||
|
{
|
||||||
|
thingsUsed.add( is.copy() );
|
||||||
|
this.used.add( is );
|
||||||
|
}
|
||||||
|
else if( reserved != null )
|
||||||
|
{
|
||||||
|
thingsUsed.add( reserved.copy() );
|
||||||
|
this.used.add( reserved );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.bytes += available.getStackSize();
|
||||||
|
l -= available.getStackSize();
|
||||||
|
|
||||||
|
if( l == 0 )
|
||||||
|
{
|
||||||
|
return available;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.exhausted = true;
|
this.exhausted = true;
|
||||||
|
|
||||||
if( this.nodes.size() == 1 )
|
if( this.nodes.size() == 1 )
|
||||||
@@ -233,8 +301,7 @@ public class CraftingTreeNode
|
|||||||
pro.request( inv, pro.getTimes( l, madeWhat.getStackSize() ), src );
|
pro.request( inv, pro.getTimes( l, madeWhat.getStackSize() ), src );
|
||||||
|
|
||||||
madeWhat.setStackSize( l );
|
madeWhat.setStackSize( l );
|
||||||
|
final IAEItemStack available = inv.extractItems( madeWhat, Actionable.MODULATE, src );
|
||||||
available = inv.extractItems( madeWhat, Actionable.MODULATE, src );
|
|
||||||
|
|
||||||
if( available != null )
|
if( available != null )
|
||||||
{
|
{
|
||||||
@@ -261,10 +328,12 @@ public class CraftingTreeNode
|
|||||||
while ( pro.possible && l > 0 )
|
while ( pro.possible && l > 0 )
|
||||||
{
|
{
|
||||||
final MECraftingInventory subInv = new MECraftingInventory( inv, true, true, true );
|
final MECraftingInventory subInv = new MECraftingInventory( inv, true, true, true );
|
||||||
pro.request( subInv, 1, src );
|
final IAEItemStack madeWhat = pro.getAmountCrafted( this.what );
|
||||||
|
|
||||||
|
pro.request( subInv, pro.getTimes( l, madeWhat.getStackSize() ), src );
|
||||||
|
|
||||||
this.what.setStackSize( l );
|
this.what.setStackSize( l );
|
||||||
available = subInv.extractItems( this.what, Actionable.MODULATE, src );
|
final IAEItemStack available = subInv.extractItems( this.what, Actionable.MODULATE, src );
|
||||||
|
|
||||||
if( available != null )
|
if( available != null )
|
||||||
{
|
{
|
||||||
@@ -294,10 +363,10 @@ public class CraftingTreeNode
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.sim )
|
if( job.isSimulation() )
|
||||||
{
|
{
|
||||||
this.missing += l;
|
|
||||||
this.bytes += l;
|
this.bytes += l;
|
||||||
|
this.missing += l;
|
||||||
final IAEItemStack rv = this.what.copy();
|
final IAEItemStack rv = this.what.copy();
|
||||||
rv.setStackSize( l );
|
rv.setStackSize( l );
|
||||||
return rv;
|
return rv;
|
||||||
@@ -313,6 +382,26 @@ public class CraftingTreeNode
|
|||||||
throw new CraftBranchFailure( this.what, l );
|
throw new CraftBranchFailure( this.what, l );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CraftingTreeNode recursiveNode( CraftingTreeNode node )
|
||||||
|
{
|
||||||
|
if( this.parent == null )
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if( node != this )
|
||||||
|
{
|
||||||
|
if( node.what.equals( this.what ) )
|
||||||
|
{
|
||||||
|
if( node.what.getStackSize() == this.what.getStackSize() )
|
||||||
|
{
|
||||||
|
loopHead = this;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.parent.notRecursive( node );
|
||||||
|
}
|
||||||
|
|
||||||
void dive( final CraftingJob job )
|
void dive( final CraftingJob job )
|
||||||
{
|
{
|
||||||
if( this.missing > 0 )
|
if( this.missing > 0 )
|
||||||
@@ -338,7 +427,6 @@ public class CraftingTreeNode
|
|||||||
|
|
||||||
void setSimulate()
|
void setSimulate()
|
||||||
{
|
{
|
||||||
this.sim = true;
|
|
||||||
this.missing = 0;
|
this.missing = 0;
|
||||||
this.bytes = 0;
|
this.bytes = 0;
|
||||||
this.used.resetStatus();
|
this.used.resetStatus();
|
||||||
@@ -360,7 +448,21 @@ public class CraftingTreeNode
|
|||||||
{
|
{
|
||||||
if( src.player().isPresent() )
|
if( src.player().isPresent() )
|
||||||
{
|
{
|
||||||
src.player().get().sendStatusMessage( new TextComponentString( "System reported " + i.getStackSize() + " " + i.getDefinition().getItem().getItemStackDisplayName( i.getDefinition() ) + " available but could not extract anything" ), false );
|
try
|
||||||
|
{
|
||||||
|
if( ex == null )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendTo( new PacketInformPlayer( i ), (EntityPlayerMP) src.player().get() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendTo( new PacketInformPlayer( ex, i ), (EntityPlayerMP) src.player().get() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
throw new CraftBranchFailure( i, i.getStackSize() );
|
throw new CraftBranchFailure( i, i.getStackSize() );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,237 +19,205 @@
|
|||||||
package appeng.crafting;
|
package appeng.crafting;
|
||||||
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
import net.minecraft.inventory.InventoryCrafting;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
import net.minecraft.world.WorldServer;
|
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
|
import appeng.api.config.FuzzyMode;
|
||||||
import appeng.api.networking.crafting.ICraftingGrid;
|
import appeng.api.networking.crafting.ICraftingGrid;
|
||||||
import appeng.api.networking.crafting.ICraftingPatternDetails;
|
import appeng.api.networking.crafting.ICraftingPatternDetails;
|
||||||
import appeng.api.networking.security.IActionSource;
|
import appeng.api.networking.security.IActionSource;
|
||||||
import appeng.api.storage.channels.IItemStorageChannel;
|
|
||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
import appeng.container.ContainerNull;
|
|
||||||
import appeng.me.cluster.implementations.CraftingCPUCluster;
|
import appeng.me.cluster.implementations.CraftingCPUCluster;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
import com.google.common.collect.ImmutableCollection;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2LongArrayMap;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
|
||||||
public class CraftingTreeProcess
|
public class CraftingTreeProcess
|
||||||
{
|
{
|
||||||
|
|
||||||
private final CraftingTreeNode parent;
|
|
||||||
final ICraftingPatternDetails details;
|
final ICraftingPatternDetails details;
|
||||||
|
private final CraftingTreeNode parent;
|
||||||
private final CraftingJob job;
|
private final CraftingJob job;
|
||||||
private final Map<CraftingTreeNode, Long> nodes = new HashMap<>();
|
private final Object2LongArrayMap<CraftingTreeNode> nodes = new Object2LongArrayMap<>();
|
||||||
private final int depth;
|
|
||||||
boolean possible = true;
|
boolean possible = true;
|
||||||
private World world;
|
|
||||||
private long crafts = 0;
|
private long crafts = 0;
|
||||||
private boolean containerItems;
|
|
||||||
private boolean limitQty;
|
|
||||||
private boolean fullSimulation;
|
|
||||||
private long bytes = 0;
|
private long bytes = 0;
|
||||||
|
private boolean hasContainerItem = false;
|
||||||
|
|
||||||
public CraftingTreeProcess( final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, final CraftingTreeNode craftingTreeNode, final int depth )
|
public CraftingTreeProcess( final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, int times, final CraftingTreeNode craftingTreeNode )
|
||||||
{
|
{
|
||||||
this.parent = craftingTreeNode;
|
this.parent = craftingTreeNode;
|
||||||
this.details = details;
|
this.details = details;
|
||||||
this.job = job;
|
this.job = job;
|
||||||
this.depth = depth;
|
World world = job.getWorld();
|
||||||
final World world = job.getWorld();
|
|
||||||
|
|
||||||
if( details.isCraftable() )
|
|
||||||
{
|
|
||||||
final IAEItemStack[] list = details.getInputs();
|
final IAEItemStack[] list = details.getInputs();
|
||||||
|
|
||||||
final InventoryCrafting ic = new InventoryCrafting( new ContainerNull(), 3, 3 );
|
|
||||||
final IAEItemStack[] is = details.getInputs();
|
|
||||||
for( int x = 0; x < ic.getSizeInventory(); x++ )
|
|
||||||
{
|
|
||||||
ic.setInventorySlotContents( x, is[x] == null ? ItemStack.EMPTY : is[x].createItemStack() );
|
|
||||||
}
|
|
||||||
|
|
||||||
for( int x = 0; x < ic.getSizeInventory(); x++ )
|
|
||||||
{
|
|
||||||
final ItemStack g = ic.getStackInSlot( x );
|
|
||||||
if( !g.isEmpty() && g.getCount() > 1 )
|
|
||||||
{
|
|
||||||
this.fullSimulation = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for( final IAEItemStack part : details.getCondensedInputs() )
|
|
||||||
{
|
|
||||||
final ItemStack g = part.createItemStack();
|
|
||||||
|
|
||||||
boolean isAnInput = false;
|
|
||||||
for( final IAEItemStack a : details.getCondensedOutputs() )
|
|
||||||
{
|
|
||||||
if( !g.isEmpty() && a != null && a.equals( g ) )
|
|
||||||
{
|
|
||||||
isAnInput = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( isAnInput )
|
|
||||||
{
|
|
||||||
this.limitQty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( g.getItem().hasContainerItem( g ) )
|
|
||||||
{
|
|
||||||
this.limitQty = this.containerItems = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final boolean complicated = false;
|
|
||||||
|
|
||||||
if( this.containerItems || complicated )
|
|
||||||
{
|
|
||||||
for( int x = 0; x < list.length; x++ )
|
|
||||||
{
|
|
||||||
final IAEItemStack part = list[x];
|
|
||||||
if( part != null )
|
|
||||||
{
|
|
||||||
this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, x, depth + 1 ), part.getStackSize() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// this is minor different then below, this slot uses the pattern, but kinda fudges it.
|
// this is minor different then below, this slot uses the pattern, but kinda fudges it.
|
||||||
for( final IAEItemStack part : details.getCondensedInputs() )
|
for( IAEItemStack part : details.getCondensedInputs() )
|
||||||
{
|
{
|
||||||
|
if( part == null )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
for( int x = 0; x < list.length; x++ )
|
for( int x = 0; x < list.length; x++ )
|
||||||
{
|
{
|
||||||
final IAEItemStack comparePart = list[x];
|
final IAEItemStack comparePart = list[x];
|
||||||
if( part != null && part.equals( comparePart ) )
|
if( part.equals( comparePart ) )
|
||||||
{
|
{
|
||||||
|
boolean isPartContainer = false;
|
||||||
|
if( part.getItem().hasContainerItem( part.getDefinition() ) )
|
||||||
|
{
|
||||||
|
part = list[x];
|
||||||
|
isPartContainer = true;
|
||||||
|
this.hasContainerItem = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
long wantedSize = isPartContainer ? part.getStackSize() : part.getStackSize() * times;
|
||||||
|
|
||||||
|
if( details.canSubstitute() && cc.getCraftingFor( part, details, x, world ).isEmpty() )
|
||||||
|
{
|
||||||
|
for( IAEItemStack subs : details.getSubstituteInputs( x ) )
|
||||||
|
{
|
||||||
|
if( subs.fuzzyComparison( part, FuzzyMode.IGNORE_ALL ) )
|
||||||
|
{
|
||||||
|
this.nodes.put( new CraftingTreeNode( cc, job, subs.copy(), wantedSize, this, x ), part.getStackSize() / times );
|
||||||
|
wantedSize = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//try to order the crafting of a substitute
|
||||||
|
ICraftingPatternDetails prioritizedPattern = null;
|
||||||
|
IAEItemStack prioritizedIAE = null;
|
||||||
|
for( IAEItemStack subs : details.getSubstituteInputs( x ) )
|
||||||
|
{
|
||||||
|
if( subs.equals( part ) )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ImmutableCollection<ICraftingPatternDetails> detailCollection = cc.getCraftingFor( subs, details, x, world );
|
||||||
|
|
||||||
|
for( ICraftingPatternDetails sp : detailCollection )
|
||||||
|
{
|
||||||
|
if( prioritizedPattern == null )
|
||||||
|
{
|
||||||
|
prioritizedPattern = sp;
|
||||||
|
prioritizedIAE = subs;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( sp.getPriority() > prioritizedPattern.getPriority() )
|
||||||
|
{
|
||||||
|
prioritizedPattern = sp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( prioritizedIAE != null )
|
||||||
|
{
|
||||||
|
this.nodes.put( new CraftingTreeNode( cc, job, prioritizedIAE.copy(), wantedSize, this, x ), part.getStackSize() / times );
|
||||||
|
wantedSize = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( wantedSize > 0 )
|
||||||
|
{
|
||||||
|
part = part.copy().setStackSize( wantedSize );
|
||||||
// use the first slot...
|
// use the first slot...
|
||||||
this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, x, depth + 1 ), part.getStackSize() );
|
this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), wantedSize, this, x ), part.getStackSize() / times );
|
||||||
|
wantedSize = 0;
|
||||||
|
}
|
||||||
|
if( !isPartContainer && wantedSize == 0 )
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
for( final IAEItemStack part : details.getCondensedInputs() )
|
|
||||||
{
|
|
||||||
final ItemStack g = part.createItemStack();
|
|
||||||
|
|
||||||
boolean isAnInput = false;
|
CraftingTreeNode notRecursive( CraftingTreeNode node )
|
||||||
for( final IAEItemStack a : details.getCondensedOutputs() )
|
|
||||||
{
|
{
|
||||||
if( !g.isEmpty() && a != null && a.equals( g ) )
|
if( parent == null )
|
||||||
{
|
{
|
||||||
isAnInput = true;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
return this.parent.recursiveNode( node );
|
||||||
|
|
||||||
if( isAnInput )
|
|
||||||
{
|
|
||||||
this.limitQty = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for( final IAEItemStack part : details.getCondensedInputs() )
|
|
||||||
{
|
|
||||||
this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, -1, depth + 1 ), part.getStackSize() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean notRecursive( final ICraftingPatternDetails details )
|
|
||||||
{
|
|
||||||
return this.parent == null || this.parent.notRecursive( details );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
long getTimes( final long remaining, final long stackSize )
|
long getTimes( final long remaining, final long stackSize )
|
||||||
{
|
{
|
||||||
if( this.limitQty || this.fullSimulation )
|
if( hasContainerItem )
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return ( remaining / stackSize ) + ( remaining % stackSize != 0 ? 1 : 0 );
|
return ( remaining / stackSize ) + ( remaining % stackSize != 0 ? 1 : 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void request( final MECraftingInventory inv, final long i, final IActionSource src ) throws CraftBranchFailure, InterruptedException
|
void request( final MECraftingInventory inv, final long amountOfTimes, final IActionSource src ) throws CraftBranchFailure, InterruptedException
|
||||||
{
|
{
|
||||||
this.job.handlePausing();
|
this.job.handlePausing();
|
||||||
if( this.fullSimulation )
|
List<IAEItemStack> containerItems = null;
|
||||||
{
|
|
||||||
final InventoryCrafting ic = new InventoryCrafting( new ContainerNull(), 3, 3 );
|
|
||||||
|
|
||||||
for( final Entry<CraftingTreeNode, Long> entry : this.nodes.entrySet() )
|
|
||||||
{
|
|
||||||
final IAEItemStack item = entry.getKey().getStack( entry.getValue() );
|
|
||||||
final IAEItemStack stack = entry.getKey().request( inv, item.getStackSize(), src );
|
|
||||||
|
|
||||||
ic.setInventorySlotContents( entry.getKey().getSlot(), stack.createItemStack() );
|
|
||||||
}
|
|
||||||
|
|
||||||
for( int x = 0; x < ic.getSizeInventory(); x++ )
|
|
||||||
{
|
|
||||||
ItemStack is = ic.getStackInSlot( x );
|
|
||||||
is = Platform.getContainerItem( is );
|
|
||||||
|
|
||||||
final IAEItemStack o = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createStack( is );
|
|
||||||
if( o != null )
|
|
||||||
{
|
|
||||||
this.bytes++;
|
|
||||||
inv.injectItems( o, Actionable.MODULATE, src );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// request and remove inputs...
|
// request and remove inputs...
|
||||||
for( final Entry<CraftingTreeNode, Long> entry : this.nodes.entrySet() )
|
for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
|
||||||
{
|
{
|
||||||
final IAEItemStack item = entry.getKey().getStack( entry.getValue() );
|
final IAEItemStack stack = entry.getKey().request( inv, details.isCraftable() && hasContainerItem ? 1 : entry.getValue() * amountOfTimes, src );
|
||||||
final IAEItemStack stack = entry.getKey().request( inv, item.getStackSize() * i, src );
|
|
||||||
|
|
||||||
if( this.containerItems )
|
if( stack.equals( job.getOutput() ) )
|
||||||
|
{
|
||||||
|
job.getNeededForLoop().add( stack.copy() );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( details.isCraftable() && stack.getItem().hasContainerItem( stack.getDefinition() ) )
|
||||||
{
|
{
|
||||||
final ItemStack is = Platform.getContainerItem( stack.createItemStack() );
|
final ItemStack is = Platform.getContainerItem( stack.createItemStack() );
|
||||||
final IAEItemStack o = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createStack( is );
|
final IAEItemStack o = AEItemStack.fromItemStack( is );
|
||||||
if( o != null )
|
if( o != null )
|
||||||
{
|
{
|
||||||
|
if( containerItems == null )
|
||||||
|
{
|
||||||
|
containerItems = new ArrayList<>();
|
||||||
|
}
|
||||||
this.bytes++;
|
this.bytes++;
|
||||||
inv.injectItems( o, Actionable.MODULATE, src );
|
o.setCachedItemStack( is );
|
||||||
|
containerItems.add( o );
|
||||||
|
}
|
||||||
|
if( containerItems != null )
|
||||||
|
{
|
||||||
|
for( IAEItemStack i : containerItems )
|
||||||
|
{
|
||||||
|
inv.injectItems( i, Actionable.MODULATE, src );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// assume its possible.
|
// assume its possible.
|
||||||
|
|
||||||
// add crafting results..
|
// add crafting results..
|
||||||
for( final IAEItemStack out : this.details.getCondensedOutputs() )
|
for( final IAEItemStack out : this.details.getCondensedOutputs() )
|
||||||
{
|
{
|
||||||
final IAEItemStack o = out.copy();
|
final IAEItemStack o = out.copy();
|
||||||
o.setStackSize( o.getStackSize() * i );
|
o.setStackSize( o.getStackSize() * amountOfTimes );
|
||||||
inv.injectItems( o, Actionable.MODULATE, src );
|
inv.injectItems( o, Actionable.MODULATE, src );
|
||||||
}
|
}
|
||||||
this.crafts += i;
|
this.crafts += amountOfTimes;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dive( final CraftingJob job )
|
void dive( final CraftingJob job )
|
||||||
{
|
{
|
||||||
job.addTask( this.getAmountCrafted( this.parent.getStack( 1 ) ), this.crafts, this.details, this.depth );
|
job.addTask( this.getAmountCrafted( this.parent.getStack( 1 ) ), this.crafts );
|
||||||
for( final CraftingTreeNode pro : this.nodes.keySet() )
|
for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
|
||||||
{
|
{
|
||||||
pro.dive( job );
|
entry.getKey().dive( job );
|
||||||
}
|
}
|
||||||
|
|
||||||
job.addBytes( this.crafts * 8 + this.bytes );
|
job.addBytes( this.crafts * 8 + this.bytes );
|
||||||
@@ -286,9 +254,9 @@ public class CraftingTreeProcess
|
|||||||
this.crafts = 0;
|
this.crafts = 0;
|
||||||
this.bytes = 0;
|
this.bytes = 0;
|
||||||
|
|
||||||
for( final CraftingTreeNode pro : this.nodes.keySet() )
|
for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
|
||||||
{
|
{
|
||||||
pro.setSimulate();
|
entry.getKey().setSimulate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -296,9 +264,9 @@ public class CraftingTreeProcess
|
|||||||
{
|
{
|
||||||
craftingCPUCluster.addCrafting( this.details, this.crafts );
|
craftingCPUCluster.addCrafting( this.details, this.crafts );
|
||||||
|
|
||||||
for( final CraftingTreeNode pro : this.nodes.keySet() )
|
for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
|
||||||
{
|
{
|
||||||
pro.setJob( storage, craftingCPUCluster, src );
|
entry.getKey().setJob( storage, craftingCPUCluster, src );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,9 +279,14 @@ public class CraftingTreeProcess
|
|||||||
plan.addRequestable( i );
|
plan.addRequestable( i );
|
||||||
}
|
}
|
||||||
|
|
||||||
for( final CraftingTreeNode pro : this.nodes.keySet() )
|
for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
|
||||||
{
|
{
|
||||||
pro.getPlan( plan );
|
entry.getKey().getPlan( plan );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void reserveForNode()
|
||||||
|
{
|
||||||
|
parent.reserveForNode();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,10 +28,14 @@ import appeng.api.storage.IStorageChannel;
|
|||||||
import appeng.api.storage.channels.IItemStorageChannel;
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
import appeng.me.helpers.PlayerSource;
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
|
import appeng.core.sync.packets.PacketInformPlayer;
|
||||||
import appeng.util.inv.ItemListIgnoreCrafting;
|
import appeng.util.inv.ItemListIgnoreCrafting;
|
||||||
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
import net.minecraft.util.text.TextComponentString;
|
import net.minecraft.util.text.TextComponentString;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
|
||||||
public class MECraftingInventory implements IMEInventory<IAEItemStack>
|
public class MECraftingInventory implements IMEInventory<IAEItemStack>
|
||||||
{
|
{
|
||||||
@@ -97,8 +101,7 @@ public class MECraftingInventory implements IMEInventory<IAEItemStack>
|
|||||||
this.injectedCache = null;
|
this.injectedCache = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.localCache = this.target
|
this.localCache = this.target.getAvailableItems( new ItemListIgnoreCrafting<>( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList() ) );
|
||||||
.getAvailableItems( new ItemListIgnoreCrafting<>( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList() ) );
|
|
||||||
|
|
||||||
this.par = parent;
|
this.par = parent;
|
||||||
}
|
}
|
||||||
@@ -310,18 +313,24 @@ public class MECraftingInventory implements IMEInventory<IAEItemStack>
|
|||||||
if( result == null || result.getStackSize() != extra.getStackSize() )
|
if( result == null || result.getStackSize() != extra.getStackSize() )
|
||||||
{
|
{
|
||||||
if( src.player().isPresent() )
|
if( src.player().isPresent() )
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
if( result == null )
|
if( result == null )
|
||||||
{
|
{
|
||||||
src.player().get().sendStatusMessage( new TextComponentString( "System reported " + extra.getStackSize() + " " + extra.getDefinition().getItem().getItemStackDisplayName( extra.getDefinition() ) + " available but could not extract anything" ), false );
|
NetworkHandler.instance().sendTo( new PacketInformPlayer( extra ), (EntityPlayerMP) src.player().get() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
src.player().get().sendStatusMessage( new TextComponentString( "System reported " + extra.getStackSize() + " " + extra.getDefinition().getItem().getItemStackDisplayName( extra.getDefinition() ) + " available but could only extract " + result.getStackSize() ), false );
|
NetworkHandler.instance().sendTo( new PacketInformPlayer( extra, result ), (EntityPlayerMP) src.player().get() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failed = true;
|
failed = true;
|
||||||
if( !src.player().isPresent() ) break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -352,11 +361,6 @@ public class MECraftingInventory implements IMEInventory<IAEItemStack>
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addMissing( final IAEItemStack extra )
|
|
||||||
{
|
|
||||||
this.missingCache.add( extra );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ignore( final IAEItemStack what )
|
void ignore( final IAEItemStack what )
|
||||||
{
|
{
|
||||||
final IAEItemStack list = this.localCache.findPrecise( what );
|
final IAEItemStack list = this.localCache.findPrecise( what );
|
||||||
@@ -365,4 +369,18 @@ public class MECraftingInventory implements IMEInventory<IAEItemStack>
|
|||||||
list.setStackSize( 0 );
|
list.setStackSize( 0 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reserve( final IAEItemStack what )
|
||||||
|
{
|
||||||
|
final IAEItemStack list = this.localCache.findPrecise( what );
|
||||||
|
if( list != null )
|
||||||
|
{
|
||||||
|
list.decStackSize( what.getStackSize() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addMissing( final IAEItemStack extra )
|
||||||
|
{
|
||||||
|
this.missingCache.add( extra );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class GuiFluidInterface extends GuiUpgradeable implements IConfigManagerH
|
|||||||
|
|
||||||
for( int i = 0; i < DualityFluidInterface.NUMBER_OF_TANKS; ++i )
|
for( int i = 0; i < DualityFluidInterface.NUMBER_OF_TANKS; ++i )
|
||||||
{
|
{
|
||||||
this.guiSlots.add( new GuiFluidTank( fluidTank, i, DualityFluidInterface.NUMBER_OF_TANKS + i, 36 + 18 * i, 53, 16, 68 ) );
|
this.guiSlots.add( new GuiFluidTank( fluidTank, i, DualityFluidInterface.NUMBER_OF_TANKS + i, 36 + 18 * i, 57, 16, 64 ) );
|
||||||
this.guiSlots.add( new GuiFluidSlot( configFluids, i, i, 35 + 18 * i, 35 ) );
|
this.guiSlots.add( new GuiFluidSlot( configFluids, i, i, 35 + 18 * i, 35 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,14 +77,14 @@ public class GuiFluidTank extends GuiCustomSlot implements ITooltip
|
|||||||
TextureAtlasSprite sprite = mc.getTextureMapBlocks().getAtlasSprite( fluid.getFluid().getStill().toString() );
|
TextureAtlasSprite sprite = mc.getTextureMapBlocks().getAtlasSprite( fluid.getFluid().getStill().toString() );
|
||||||
final int scaledHeight = (int) ( this.height * ( (float) fluid.getStackSize() / this.tank.getTankProperties()[this.slot].getCapacity() ) );
|
final int scaledHeight = (int) ( this.height * ( (float) fluid.getStackSize() / this.tank.getTankProperties()[this.slot].getCapacity() ) );
|
||||||
|
|
||||||
int iconHeightRemainder = scaledHeight % this.getHeight();
|
int iconHeightRemainder = scaledHeight % 16;
|
||||||
if( iconHeightRemainder > 0 )
|
if( iconHeightRemainder > 0 )
|
||||||
{
|
{
|
||||||
this.drawTexturedModalRect( this.xPos(), this.yPos() + this.getHeight() - iconHeightRemainder, sprite, this.getWidth(), iconHeightRemainder );
|
this.drawTexturedModalRect( this.xPos(), this.yPos() + this.getHeight() - iconHeightRemainder, sprite, 16, iconHeightRemainder );
|
||||||
}
|
}
|
||||||
for( int i = 0; i < scaledHeight / this.getHeight(); i++ )
|
for( int i = 0; i < scaledHeight / 16; i++ )
|
||||||
{
|
{
|
||||||
this.drawTexturedModalRect( this.xPos(), this.yPos() + this.getHeight() - iconHeightRemainder - ( i + 1 ) * 16, sprite, this.getWidth(), this.getHeight() );
|
this.drawTexturedModalRect( this.xPos(), this.yPos() + this.getHeight() - iconHeightRemainder - ( i + 1 ) * 16, sprite, 16, 16 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -113,7 +113,7 @@ public class GuiFluidTank extends GuiCustomSlot implements ITooltip
|
|||||||
@Override
|
@Override
|
||||||
public int yPos()
|
public int yPos()
|
||||||
{
|
{
|
||||||
return this.y - 1;
|
return this.y - 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -125,7 +125,7 @@ public class GuiFluidTank extends GuiCustomSlot implements ITooltip
|
|||||||
@Override
|
@Override
|
||||||
public int getHeight()
|
public int getHeight()
|
||||||
{
|
{
|
||||||
return this.height + 1;
|
return this.height + 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -414,7 +414,7 @@ public class ContainerFluidTerminal extends AEBaseContainer implements IConfigMa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( notInserted == null )
|
if( notInserted == null || notInserted.getStackSize() == 0 )
|
||||||
{
|
{
|
||||||
if( !player.inventory.addItemStackToInventory( fh.getContainer() ) )
|
if( !player.inventory.addItemStackToInventory( fh.getContainer() ) )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable
|
|||||||
|
|
||||||
private final MEMonitorPassThrough<IAEItemStack> items = new MEMonitorPassThrough<>( new NullInventory<IAEItemStack>(), AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
private final MEMonitorPassThrough<IAEItemStack> items = new MEMonitorPassThrough<>( new NullInventory<IAEItemStack>(), AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||||
private final MEMonitorPassThrough<IAEFluidStack> fluids = new MEMonitorPassThrough<>( new NullInventory<IAEFluidStack>(), AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
private final MEMonitorPassThrough<IAEFluidStack> fluids = new MEMonitorPassThrough<>( new NullInventory<IAEFluidStack>(), AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
||||||
private boolean resetConfigCache;
|
private boolean resetConfigCache = true;
|
||||||
private IMEMonitor<IAEFluidStack> configCachedHandler;
|
private IMEMonitor<IAEFluidStack> configCachedHandler;
|
||||||
|
|
||||||
public DualityFluidInterface( final AENetworkProxy networkProxy, final IFluidInterfaceHost ih )
|
public DualityFluidInterface( final AENetworkProxy networkProxy, final IFluidInterfaceHost ih )
|
||||||
@@ -116,17 +116,9 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable
|
|||||||
}
|
}
|
||||||
|
|
||||||
public IUpgradeableHost getHost()
|
public IUpgradeableHost getHost()
|
||||||
{
|
|
||||||
if( this.iHost instanceof IUpgradeableHost )
|
|
||||||
{
|
{
|
||||||
return this.iHost;
|
return this.iHost;
|
||||||
}
|
}
|
||||||
if( this.iHost instanceof IUpgradeableHost )
|
|
||||||
{
|
|
||||||
return this.iHost;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T extends IAEStack<T>> IMEMonitor<T> getInventory( IStorageChannel<T> channel )
|
public <T extends IAEStack<T>> IMEMonitor<T> getInventory( IStorageChannel<T> channel )
|
||||||
@@ -458,6 +450,7 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable
|
|||||||
if( cfg != hasConfig )
|
if( cfg != hasConfig )
|
||||||
{
|
{
|
||||||
resetConfigCache = true;
|
resetConfigCache = true;
|
||||||
|
this.notifyNeighbors();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( inventory == this.tanks )
|
else if( inventory == this.tanks )
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ public class PartFluidLevelEmitter extends PartUpgradeable implements IStackWatc
|
|||||||
@Override
|
@Override
|
||||||
public void onStackChange( IItemList<?> o, IAEStack<?> fullStack, IAEStack<?> diffStack, IActionSource src, IStorageChannel<?> chan )
|
public void onStackChange( IItemList<?> o, IAEStack<?> fullStack, IAEStack<?> diffStack, IActionSource src, IStorageChannel<?> chan )
|
||||||
{
|
{
|
||||||
if( chan == AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) && diffStack.equals( this.config.getFluidInSlot( 0 ) ) )
|
if( chan == AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) && fullStack.equals( this.config.getFluidInSlot( 0 ) ) )
|
||||||
{
|
{
|
||||||
this.lastReportedValue = fullStack.getStackSize();
|
this.lastReportedValue = fullStack.getStackSize();
|
||||||
this.updateState();
|
this.updateState();
|
||||||
|
|||||||
@@ -19,17 +19,54 @@
|
|||||||
package appeng.fluids.parts;
|
package appeng.fluids.parts;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import appeng.api.AEApi;
|
||||||
|
import appeng.api.config.*;
|
||||||
|
import appeng.api.networking.IGridNode;
|
||||||
|
import appeng.api.networking.events.MENetworkCellArrayUpdate;
|
||||||
|
import appeng.api.networking.events.MENetworkChannelsChanged;
|
||||||
|
import appeng.api.networking.events.MENetworkEventSubscribe;
|
||||||
|
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
||||||
|
import appeng.api.networking.security.IActionSource;
|
||||||
|
import appeng.api.networking.storage.IBaseMonitor;
|
||||||
import appeng.api.networking.storage.IStorageGrid;
|
import appeng.api.networking.storage.IStorageGrid;
|
||||||
import appeng.api.storage.channels.IItemStorageChannel;
|
import appeng.api.networking.ticking.IGridTickable;
|
||||||
|
import appeng.api.networking.ticking.ITickManager;
|
||||||
|
import appeng.api.networking.ticking.TickRateModulation;
|
||||||
|
import appeng.api.networking.ticking.TickingRequest;
|
||||||
|
import appeng.api.parts.IPart;
|
||||||
|
import appeng.api.parts.IPartCollisionHelper;
|
||||||
|
import appeng.api.parts.IPartModel;
|
||||||
|
import appeng.api.storage.*;
|
||||||
|
import appeng.api.storage.channels.IFluidStorageChannel;
|
||||||
|
import appeng.api.storage.data.IAEFluidStack;
|
||||||
|
import appeng.api.storage.data.IItemList;
|
||||||
|
import appeng.api.util.AECableType;
|
||||||
|
import appeng.api.util.IConfigManager;
|
||||||
|
import appeng.capabilities.Capabilities;
|
||||||
|
import appeng.core.AppEng;
|
||||||
|
import appeng.core.settings.TickRates;
|
||||||
|
import appeng.core.sync.GuiBridge;
|
||||||
import appeng.fluids.helper.IConfigurableFluidInventory;
|
import appeng.fluids.helper.IConfigurableFluidInventory;
|
||||||
|
import appeng.fluids.tile.TileFluidInterface;
|
||||||
|
import appeng.fluids.util.AEFluidInventory;
|
||||||
|
import appeng.fluids.util.IAEFluidInventory;
|
||||||
|
import appeng.fluids.util.IAEFluidTank;
|
||||||
|
import appeng.helpers.IPriorityHost;
|
||||||
|
import appeng.items.parts.PartModels;
|
||||||
|
import appeng.me.GridAccessException;
|
||||||
import appeng.me.cache.GridStorageCache;
|
import appeng.me.cache.GridStorageCache;
|
||||||
|
import appeng.me.helpers.MachineSource;
|
||||||
|
import appeng.me.storage.ITickingMonitor;
|
||||||
|
import appeng.me.storage.MEInventoryHandler;
|
||||||
|
import appeng.parts.PartModel;
|
||||||
|
import appeng.parts.automation.PartUpgradeable;
|
||||||
|
import appeng.tile.networking.TileCableBus;
|
||||||
import appeng.util.ConfigManager;
|
import appeng.util.ConfigManager;
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import appeng.util.prioritylist.FuzzyPriorityList;
|
||||||
|
import appeng.util.prioritylist.PrecisePriorityList;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
@@ -37,54 +74,15 @@ import net.minecraft.tileentity.TileEntity;
|
|||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.world.IBlockAccess;
|
||||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import java.util.Collections;
|
||||||
import appeng.api.config.AccessRestriction;
|
import java.util.List;
|
||||||
import appeng.api.config.FuzzyMode;
|
import java.util.Objects;
|
||||||
import appeng.api.config.IncludeExclude;
|
|
||||||
import appeng.api.config.Settings;
|
|
||||||
import appeng.api.config.StorageFilter;
|
|
||||||
import appeng.api.config.Upgrades;
|
|
||||||
import appeng.api.networking.IGridNode;
|
|
||||||
import appeng.api.networking.events.MENetworkCellArrayUpdate;
|
|
||||||
import appeng.api.networking.security.IActionSource;
|
|
||||||
import appeng.api.networking.storage.IBaseMonitor;
|
|
||||||
import appeng.api.networking.ticking.ITickManager;
|
|
||||||
import appeng.api.networking.ticking.TickRateModulation;
|
|
||||||
import appeng.api.networking.ticking.TickingRequest;
|
|
||||||
import appeng.api.parts.IPartHost;
|
|
||||||
import appeng.api.parts.IPartModel;
|
|
||||||
import appeng.api.storage.IMEInventory;
|
|
||||||
import appeng.api.storage.IMEInventoryHandler;
|
|
||||||
import appeng.api.storage.IMEMonitorHandlerReceiver;
|
|
||||||
import appeng.api.storage.IStorageChannel;
|
|
||||||
import appeng.api.storage.IStorageMonitorable;
|
|
||||||
import appeng.api.storage.IStorageMonitorableAccessor;
|
|
||||||
import appeng.api.storage.channels.IFluidStorageChannel;
|
|
||||||
import appeng.api.storage.data.IAEFluidStack;
|
|
||||||
import appeng.api.storage.data.IItemList;
|
|
||||||
import appeng.api.util.AEPartLocation;
|
|
||||||
import appeng.capabilities.Capabilities;
|
|
||||||
import appeng.core.AppEng;
|
|
||||||
import appeng.core.settings.TickRates;
|
|
||||||
import appeng.core.sync.GuiBridge;
|
|
||||||
import appeng.fluids.util.AEFluidInventory;
|
|
||||||
import appeng.fluids.util.IAEFluidInventory;
|
|
||||||
import appeng.fluids.util.IAEFluidTank;
|
|
||||||
import appeng.helpers.IInterfaceHost;
|
|
||||||
import appeng.items.parts.PartModels;
|
|
||||||
import appeng.me.GridAccessException;
|
|
||||||
import appeng.me.helpers.MachineSource;
|
|
||||||
import appeng.me.storage.ITickingMonitor;
|
|
||||||
import appeng.me.storage.MEInventoryHandler;
|
|
||||||
import appeng.parts.PartModel;
|
|
||||||
import appeng.parts.misc.PartSharedStorageBus;
|
|
||||||
import appeng.util.Platform;
|
|
||||||
import appeng.util.prioritylist.FuzzyPriorityList;
|
|
||||||
import appeng.util.prioritylist.PrecisePriorityList;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -92,7 +90,7 @@ import appeng.util.prioritylist.PrecisePriorityList;
|
|||||||
* @version rv6 - 22/05/2018
|
* @version rv6 - 22/05/2018
|
||||||
* @since rv6 22/05/2018
|
* @since rv6 22/05/2018
|
||||||
*/
|
*/
|
||||||
public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMonitorHandlerReceiver<IAEFluidStack>, IAEFluidInventory, IConfigurableFluidInventory
|
public class PartFluidStorageBus extends PartUpgradeable implements IGridTickable, ICellContainer, IMEMonitorHandlerReceiver<IAEFluidStack>, IAEFluidInventory, IConfigurableFluidInventory, IPriorityHost
|
||||||
{
|
{
|
||||||
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/fluid_storage_bus_base" );
|
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/fluid_storage_bus_base" );
|
||||||
@PartModels
|
@PartModels
|
||||||
@@ -104,11 +102,15 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
|
|
||||||
private final IActionSource source;
|
private final IActionSource source;
|
||||||
private final AEFluidInventory config = new AEFluidInventory( this, 63 );
|
private final AEFluidInventory config = new AEFluidInventory( this, 63 );
|
||||||
|
private int priority = 0;
|
||||||
private boolean cached = false;
|
private boolean cached = false;
|
||||||
private ITickingMonitor monitor = null;
|
private ITickingMonitor monitor = null;
|
||||||
private MEInventoryHandler<IAEFluidStack> handler = null;
|
private MEInventoryHandler<IAEFluidStack> handler = null;
|
||||||
private int handlerHash = 0;
|
private int handlerHash = 0;
|
||||||
|
private boolean wasActive = false;
|
||||||
private byte resetCacheLogic = 0;
|
private byte resetCacheLogic = 0;
|
||||||
|
private boolean accessChanged;
|
||||||
|
private boolean readOncePass;
|
||||||
|
|
||||||
public PartFluidStorageBus( ItemStack is )
|
public PartFluidStorageBus( ItemStack is )
|
||||||
{
|
{
|
||||||
@@ -119,34 +121,228 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
this.source = new MachineSource( this );
|
this.source = new MachineSource( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
private IMEInventory<IAEFluidStack> getInventoryWrapper( TileEntity target )
|
@Override
|
||||||
|
@MENetworkEventSubscribe
|
||||||
|
public void powerRender( final MENetworkPowerStatusChange c )
|
||||||
{
|
{
|
||||||
EnumFacing targetSide = this.getSide().getFacing().getOpposite();
|
this.updateStatus();
|
||||||
// Prioritize a handler to directly link to another ME network
|
|
||||||
IStorageMonitorableAccessor accessor = target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide );
|
|
||||||
if( accessor != null )
|
|
||||||
{
|
|
||||||
IStorageMonitorable inventory = accessor.getInventory( this.source );
|
|
||||||
if( inventory != null )
|
|
||||||
{
|
|
||||||
return inventory.getInventory( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// So this could / can be a design decision. If the tile does support our custom capability,
|
protected void updateStatus()
|
||||||
// but it does not return an inventory for the action source, we do NOT fall back to using
|
{
|
||||||
// IItemHandler's, as that might circumvent the security setings, and might also cause
|
final boolean currentActive = this.getProxy().isActive();
|
||||||
// performance issues.
|
if( this.wasActive != currentActive )
|
||||||
|
{
|
||||||
|
this.wasActive = currentActive;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.getProxy().getGrid().postEvent( new MENetworkCellArrayUpdate() );
|
||||||
|
this.getHost().markForUpdate();
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :P
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@MENetworkEventSubscribe
|
||||||
|
public void chanRender( final MENetworkChannelsChanged changedChannels )
|
||||||
|
{
|
||||||
|
this.updateStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getUpgradeSlots()
|
||||||
|
{
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateSetting( final IConfigManager manager, final Enum settingName, final Enum newValue )
|
||||||
|
{
|
||||||
|
if( settingName.name().equals( "ACCESS" ) )
|
||||||
|
{
|
||||||
|
this.accessChanged = true;
|
||||||
|
}
|
||||||
|
this.resetCache( true );
|
||||||
|
this.getHost().markForSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFluidInventoryChanged( IAEFluidTank inv, int slot )
|
||||||
|
{
|
||||||
|
if( inv == this.config )
|
||||||
|
{
|
||||||
|
this.resetCache( true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void upgradesChanged()
|
||||||
|
{
|
||||||
|
super.upgradesChanged();
|
||||||
|
this.resetCache( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readFromNBT( final NBTTagCompound data )
|
||||||
|
{
|
||||||
|
super.readFromNBT( data );
|
||||||
|
this.config.readFromNBT( data, "config" );
|
||||||
|
this.priority = data.getInteger( "priority" );
|
||||||
|
this.accessChanged = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToNBT( final NBTTagCompound data )
|
||||||
|
{
|
||||||
|
super.writeToNBT( data );
|
||||||
|
this.config.writeToNBT( data, "config" );
|
||||||
|
data.setInteger( "priority", this.priority );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFluidHandler getFluidInventoryByName( final String name )
|
||||||
|
{
|
||||||
|
if( name.equals( "config" ) )
|
||||||
|
{
|
||||||
|
return this.config;
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check via cap for IItemHandler
|
protected void resetCache( final boolean fullReset )
|
||||||
IFluidHandler handlerExt = target.getCapability( CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, targetSide );
|
|
||||||
if( handlerExt != null )
|
|
||||||
{
|
{
|
||||||
return new FluidHandlerAdapter( handlerExt, this );
|
if( this.getHost() == null || this.getHost().getTile() == null || this.getHost().getTile().getWorld() == null || this.getHost().getTile().getWorld().isRemote )
|
||||||
|
{
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
if( fullReset )
|
||||||
|
{
|
||||||
|
this.resetCacheLogic = 2;
|
||||||
|
}
|
||||||
|
else if( this.resetCacheLogic < 2 )
|
||||||
|
{
|
||||||
|
this.resetCacheLogic = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.getProxy().getTick().alertDevice( this.getProxy().getNode() );
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :P
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isValid( final Object verificationToken )
|
||||||
|
{
|
||||||
|
return this.handler == verificationToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void postChange( final IBaseMonitor<IAEFluidStack> monitor, final Iterable<IAEFluidStack> change, final IActionSource source )
|
||||||
|
{
|
||||||
|
if( this.getProxy().isActive() )
|
||||||
|
{
|
||||||
|
AccessRestriction currentAccess = (AccessRestriction) ( (ConfigManager) this.getConfigManager() ).getSetting( Settings.ACCESS );
|
||||||
|
if( readOncePass )
|
||||||
|
{
|
||||||
|
readOncePass = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.getProxy().getStorage().postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ), change, this.source );
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :(
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( !currentAccess.hasPermission( AccessRestriction.READ ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.getProxy().getStorage().postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ), change, source );
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :(
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onListUpdate()
|
||||||
|
{
|
||||||
|
// not used here.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getBoxes( final IPartCollisionHelper bch )
|
||||||
|
{
|
||||||
|
bch.addBox( 3, 3, 15, 13, 13, 16 );
|
||||||
|
bch.addBox( 2, 2, 14, 14, 14, 15 );
|
||||||
|
bch.addBox( 5, 5, 12, 11, 11, 14 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNeighborChanged( IBlockAccess w, BlockPos pos, BlockPos neighbor )
|
||||||
|
{
|
||||||
|
if( pos.offset( this.getSide().getFacing() ).equals( neighbor ) )
|
||||||
|
{
|
||||||
|
|
||||||
|
final TileEntity te = w.getTileEntity( neighbor );
|
||||||
|
|
||||||
|
// In case the TE was destroyed, we have to do a full reset immediately.
|
||||||
|
if( te instanceof TileCableBus )
|
||||||
|
{
|
||||||
|
IPart iPart = ( (TileCableBus) te ).getPart( this.getSide().getOpposite() );
|
||||||
|
if( iPart == null || iPart instanceof PartFluidInterface )
|
||||||
|
{
|
||||||
|
this.resetCache( true );
|
||||||
|
this.resetCache();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( te == null || te instanceof TileFluidInterface )
|
||||||
|
{
|
||||||
|
this.resetCache( true );
|
||||||
|
this.resetCache();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.resetCache( false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getCableConnectionLength( AECableType cable )
|
||||||
|
{
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onPartActivate( final EntityPlayer player, final EnumHand hand, final Vec3d pos )
|
||||||
|
{
|
||||||
|
if( Platform.isServer() )
|
||||||
|
{
|
||||||
|
Platform.openGUI( player, this.getHost().getTile(), this.getSide(), GuiBridge.GUI_STORAGEBUS_FLUID );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TickingRequest getTickingRequest( IGridNode node )
|
||||||
|
{
|
||||||
|
return new TickingRequest( TickRates.FluidStorageBus.getMin(), TickRates.FluidStorageBus.getMax(), monitor == null, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -165,7 +361,6 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
return TickRateModulation.SLEEP;
|
return TickRateModulation.SLEEP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void resetCache()
|
protected void resetCache()
|
||||||
{
|
{
|
||||||
final boolean fullReset = this.resetCacheLogic == 2;
|
final boolean fullReset = this.resetCacheLogic == 2;
|
||||||
@@ -213,106 +408,58 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private IMEInventory<IAEFluidStack> getInventoryWrapper( TileEntity target )
|
||||||
protected void resetCache( final boolean fullReset )
|
|
||||||
{
|
{
|
||||||
if( this.getHost() == null || this.getHost().getTile() == null || this.getHost().getTile().getWorld() == null || this.getHost()
|
EnumFacing targetSide = this.getSide().getFacing().getOpposite();
|
||||||
.getTile()
|
// Prioritize a handler to directly link to another ME network
|
||||||
.getWorld().isRemote )
|
IStorageMonitorableAccessor accessor = target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide );
|
||||||
|
if( accessor != null )
|
||||||
{
|
{
|
||||||
return;
|
IStorageMonitorable inventory = accessor.getInventory( this.source );
|
||||||
|
if( inventory != null )
|
||||||
|
{
|
||||||
|
return inventory.getInventory( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( fullReset )
|
// So this could / can be a design decision. If the tile does support our custom capability,
|
||||||
{
|
// but it does not return an inventory for the action source, we do NOT fall back to using
|
||||||
this.resetCacheLogic = 2;
|
// IItemHandler's, as that might circumvent the security setings, and might also cause
|
||||||
}
|
// performance issues.
|
||||||
else if( this.resetCacheLogic < 2 )
|
return null;
|
||||||
{
|
|
||||||
this.resetCacheLogic = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
// Check via cap for IItemHandler
|
||||||
|
IFluidHandler handlerExt = target.getCapability( CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, targetSide );
|
||||||
|
if( handlerExt != null )
|
||||||
{
|
{
|
||||||
this.getProxy().getTick().alertDevice( this.getProxy().getNode() );
|
return new FluidHandlerAdapter( handlerExt, this );
|
||||||
}
|
|
||||||
catch( final GridAccessException e )
|
|
||||||
{
|
|
||||||
// :P
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
return null;
|
||||||
public boolean onPartActivate( final EntityPlayer player, final EnumHand hand, final Vec3d pos )
|
|
||||||
{
|
|
||||||
if( Platform.isServer() )
|
|
||||||
{
|
|
||||||
Platform.openGUI( player, this.getHost().getTile(), this.getSide(), GuiBridge.GUI_STORAGEBUS_FLUID );
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private int createHandlerHash( TileEntity target )
|
||||||
public void onFluidInventoryChanged( IAEFluidTank inv, int slot )
|
|
||||||
{
|
{
|
||||||
if( inv == this.config )
|
if( target == null )
|
||||||
{
|
{
|
||||||
this.resetCache( true );
|
return 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
final EnumFacing targetSide = this.getSide().getFacing().getOpposite();
|
||||||
public void readFromNBT( final NBTTagCompound data )
|
|
||||||
|
if( target.hasCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) )
|
||||||
{
|
{
|
||||||
super.readFromNBT( data );
|
return Objects.hash( target, target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) );
|
||||||
this.config.readFromNBT( data, "config" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
final IFluidHandler fluidHandler = target.getCapability( CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, targetSide );
|
||||||
public void writeToNBT( final NBTTagCompound data )
|
|
||||||
|
if( fluidHandler != null )
|
||||||
{
|
{
|
||||||
super.writeToNBT( data );
|
return Objects.hash( target, fluidHandler, fluidHandler.getTankProperties().length );
|
||||||
this.config.writeToNBT( data, "config" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
return 0;
|
||||||
public boolean isValid( final Object verificationToken )
|
|
||||||
{
|
|
||||||
return this.handler == verificationToken;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void postChange( final IBaseMonitor<IAEFluidStack> monitor, final Iterable<IAEFluidStack> change, final IActionSource source )
|
|
||||||
{
|
|
||||||
if( this.getProxy().isActive() )
|
|
||||||
{
|
|
||||||
AccessRestriction currentAccess = (AccessRestriction) ( (ConfigManager) this.getConfigManager() ).getSetting( Settings.ACCESS );
|
|
||||||
if( readOncePass )
|
|
||||||
{
|
|
||||||
readOncePass = false;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
this.getProxy().getStorage().postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ), change, source );
|
|
||||||
}
|
|
||||||
catch( final GridAccessException e )
|
|
||||||
{
|
|
||||||
// :(
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if( !currentAccess.hasPermission( AccessRestriction.READ ) )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
this.getProxy().getStorage().postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ), change, source );
|
|
||||||
}
|
|
||||||
catch( final GridAccessException e )
|
|
||||||
{
|
|
||||||
// :(
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MEInventoryHandler<IAEFluidStack> getInternalHandler()
|
public MEInventoryHandler<IAEFluidStack> getInternalHandler()
|
||||||
@@ -353,8 +500,6 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
|
|
||||||
if( inv != null )
|
if( inv != null )
|
||||||
{
|
{
|
||||||
this.checkInterfaceVsStorageBus( target, this.getSide().getOpposite() );
|
|
||||||
|
|
||||||
this.handler = new MEInventoryHandler<>( inv, AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
this.handler = new MEInventoryHandler<>( inv, AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
||||||
|
|
||||||
this.handler.setBaseAccess( (AccessRestriction) this.getConfigManager().getSetting( Settings.ACCESS ) );
|
this.handler.setBaseAccess( (AccessRestriction) this.getConfigManager().getSetting( Settings.ACCESS ) );
|
||||||
@@ -375,8 +520,7 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
|
|
||||||
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
||||||
{
|
{
|
||||||
this.handler.setPartitionList(
|
this.handler.setPartitionList( new FuzzyPriorityList<IAEFluidStack>( priorityList, (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE ) ) );
|
||||||
new FuzzyPriorityList<IAEFluidStack>( priorityList, (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE ) ) );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -417,9 +561,9 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// force grid to update handlers...
|
// force grid to update handlers...
|
||||||
(( GridStorageCache ) this.getProxy().getGrid().getCache( IStorageGrid.class )).cellUpdate( null );
|
( (GridStorageCache) this.getProxy().getGrid().getCache( IStorageGrid.class ) ).cellUpdate( null );
|
||||||
}
|
}
|
||||||
catch( final GridAccessException ignore )
|
catch( final GridAccessException e )
|
||||||
{
|
{
|
||||||
// :3
|
// :3
|
||||||
}
|
}
|
||||||
@@ -427,36 +571,10 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
return this.handler;
|
return this.handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkInterfaceVsStorageBus( final TileEntity target, final AEPartLocation side )
|
|
||||||
{
|
|
||||||
IInterfaceHost achievement = null;
|
|
||||||
|
|
||||||
if( target instanceof IInterfaceHost )
|
|
||||||
{
|
|
||||||
achievement = (IInterfaceHost) target;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( target instanceof IPartHost )
|
|
||||||
{
|
|
||||||
final Object part = ( (IPartHost) target ).getPart( side );
|
|
||||||
if( part instanceof IInterfaceHost )
|
|
||||||
{
|
|
||||||
achievement = (IInterfaceHost) part;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( achievement != null && achievement.getActionableNode() != null )
|
|
||||||
{
|
|
||||||
// Platform.addStat( achievement.getActionableNode().getPlayerID(), Achievements.Recursive.getAchievement()
|
|
||||||
// );
|
|
||||||
// Platform.addStat( getActionableNode().getPlayerID(), Achievements.Recursive.getAchievement() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<IMEInventoryHandler> getCellArray( final IStorageChannel channel )
|
public List<IMEInventoryHandler> getCellArray( final IStorageChannel channel )
|
||||||
{
|
{
|
||||||
if( channel == this.getStorageChannel() )
|
if( channel == AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) )
|
||||||
{
|
{
|
||||||
final IMEInventoryHandler<IAEFluidStack> out = this.getInternalHandler();
|
final IMEInventoryHandler<IAEFluidStack> out = this.getInternalHandler();
|
||||||
if( out != null )
|
if( out != null )
|
||||||
@@ -464,49 +582,33 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
return Collections.singletonList( out );
|
return Collections.singletonList( out );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return super.getCellArray( channel );
|
return Collections.emptyList();
|
||||||
}
|
|
||||||
|
|
||||||
private int createHandlerHash( TileEntity target )
|
|
||||||
{
|
|
||||||
if( target == null )
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
final EnumFacing targetSide = this.getSide().getFacing().getOpposite();
|
|
||||||
|
|
||||||
if( target.hasCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) )
|
|
||||||
{
|
|
||||||
return Objects.hash( target, target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
final IFluidHandler fluidHandler = target.getCapability( CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, targetSide );
|
|
||||||
|
|
||||||
if( fluidHandler != null )
|
|
||||||
{
|
|
||||||
return Objects.hash( target, fluidHandler, fluidHandler.getTankProperties().length );
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TickingRequest getTickingRequest( IGridNode node )
|
public int getPriority()
|
||||||
{
|
{
|
||||||
return new TickingRequest( TickRates.FluidStorageBus.getMin(), TickRates.FluidStorageBus.getMax(), this.isSleeping(), true );
|
return this.priority;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onListUpdate()
|
public void setPriority( int newValue )
|
||||||
{
|
{
|
||||||
// not used here.
|
this.priority = newValue;
|
||||||
|
this.getHost().markForSave();
|
||||||
|
this.resetCache( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IStorageChannel getStorageChannel()
|
public void blinkCell( int slot )
|
||||||
{
|
{
|
||||||
return AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class );
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveChanges( @Nullable ICellInventory<?> cellInventory )
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IAEFluidTank getConfig()
|
public IAEFluidTank getConfig()
|
||||||
@@ -514,14 +616,6 @@ public class PartFluidStorageBus extends PartSharedStorageBus implements IMEMoni
|
|||||||
return this.config;
|
return this.config;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public IFluidHandler getFluidInventoryByName(final String name) {
|
|
||||||
if (name.equals("config")) {
|
|
||||||
return this.config;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
public IPartModel getStaticModels()
|
public IPartModel getStaticModels()
|
||||||
|
|||||||
@@ -19,39 +19,6 @@
|
|||||||
package appeng.helpers;
|
package appeng.helpers;
|
||||||
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import appeng.integration.modules.gregtech.GTCEInventoryAdaptor;
|
|
||||||
import appeng.util.*;
|
|
||||||
import appeng.util.inv.*;
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
|
||||||
|
|
||||||
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;
|
|
||||||
import net.minecraft.inventory.InventoryCrafting;
|
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
|
||||||
import net.minecraft.nbt.NBTTagList;
|
|
||||||
import net.minecraft.tileentity.TileEntity;
|
|
||||||
import net.minecraft.util.EnumFacing;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.math.RayTraceResult;
|
|
||||||
import net.minecraft.util.math.Vec3d;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
import net.minecraftforge.common.capabilities.Capability;
|
|
||||||
import net.minecraftforge.fml.common.Loader;
|
|
||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
|
||||||
import net.minecraftforge.items.IItemHandler;
|
|
||||||
import net.minecraftforge.items.wrapper.RangedWrapper;
|
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
import appeng.api.config.Settings;
|
import appeng.api.config.Settings;
|
||||||
@@ -75,11 +42,7 @@ import appeng.api.networking.ticking.IGridTickable;
|
|||||||
import appeng.api.networking.ticking.TickRateModulation;
|
import appeng.api.networking.ticking.TickRateModulation;
|
||||||
import appeng.api.networking.ticking.TickingRequest;
|
import appeng.api.networking.ticking.TickingRequest;
|
||||||
import appeng.api.parts.IPart;
|
import appeng.api.parts.IPart;
|
||||||
import appeng.api.storage.IMEInventory;
|
import appeng.api.storage.*;
|
||||||
import appeng.api.storage.IMEMonitor;
|
|
||||||
import appeng.api.storage.IStorageChannel;
|
|
||||||
import appeng.api.storage.IStorageMonitorable;
|
|
||||||
import appeng.api.storage.IStorageMonitorableAccessor;
|
|
||||||
import appeng.api.storage.channels.IFluidStorageChannel;
|
import appeng.api.storage.channels.IFluidStorageChannel;
|
||||||
import appeng.api.storage.channels.IItemStorageChannel;
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
import appeng.api.storage.data.IAEFluidStack;
|
import appeng.api.storage.data.IAEFluidStack;
|
||||||
@@ -101,21 +64,51 @@ import appeng.parts.automation.StackUpgradeInventory;
|
|||||||
import appeng.parts.automation.UpgradeInventory;
|
import appeng.parts.automation.UpgradeInventory;
|
||||||
import appeng.tile.inventory.AppEngInternalAEInventory;
|
import appeng.tile.inventory.AppEngInternalAEInventory;
|
||||||
import appeng.tile.inventory.AppEngInternalInventory;
|
import appeng.tile.inventory.AppEngInternalInventory;
|
||||||
|
import appeng.util.ConfigManager;
|
||||||
|
import appeng.util.IConfigManagerHost;
|
||||||
|
import appeng.util.InventoryAdaptor;
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import appeng.util.inv.*;
|
||||||
import appeng.util.item.AEItemStack;
|
import appeng.util.item.AEItemStack;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
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 net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.init.Items;
|
||||||
|
import net.minecraft.inventory.InventoryCrafting;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.common.capabilities.Capability;
|
||||||
|
import net.minecraftforge.fml.common.Loader;
|
||||||
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
import net.minecraftforge.items.wrapper.RangedWrapper;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
import static gregtech.api.block.machines.BlockMachine.getMetaTileEntity;
|
import static gregtech.api.block.machines.BlockMachine.getMetaTileEntity;
|
||||||
|
|
||||||
|
|
||||||
public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost
|
public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost
|
||||||
{
|
{
|
||||||
private int[] failedCraftTriesSlot = {0,0,0,0,0,0,0,0,0};
|
|
||||||
|
|
||||||
public static final int NUMBER_OF_STORAGE_SLOTS = 9;
|
public static final int NUMBER_OF_STORAGE_SLOTS = 9;
|
||||||
public static final int NUMBER_OF_CONFIG_SLOTS = 9;
|
public static final int NUMBER_OF_CONFIG_SLOTS = 9;
|
||||||
public static final int NUMBER_OF_PATTERN_SLOTS = 36;
|
public static final int NUMBER_OF_PATTERN_SLOTS = 36;
|
||||||
|
|
||||||
private static final Collection<Block> BAD_BLOCKS = new HashSet<>( 100 );
|
private static final Collection<Block> BAD_BLOCKS = new HashSet<>( 100 );
|
||||||
private final IAEItemStack[] requireWork = { null, null, null, null, null, null, null, null, null };
|
private final IAEItemStack[] requireWork = {null, null, null, null, null, null, null, null, null};
|
||||||
private final MultiCraftingTracker craftingTracker;
|
private final MultiCraftingTracker craftingTracker;
|
||||||
private final AENetworkProxy gridProxy;
|
private final AENetworkProxy gridProxy;
|
||||||
private final IInterfaceHost iHost;
|
private final IInterfaceHost iHost;
|
||||||
@@ -125,23 +118,18 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
private final AppEngInternalAEInventory config = new AppEngInternalAEInventory( this, NUMBER_OF_CONFIG_SLOTS );
|
private final AppEngInternalAEInventory config = new AppEngInternalAEInventory( this, NUMBER_OF_CONFIG_SLOTS );
|
||||||
private final AppEngInternalInventory storage = new AppEngInternalInventory( this, NUMBER_OF_STORAGE_SLOTS );
|
private final AppEngInternalInventory storage = new AppEngInternalInventory( this, NUMBER_OF_STORAGE_SLOTS );
|
||||||
private final AppEngInternalInventory patterns = new AppEngInternalInventory( this, NUMBER_OF_PATTERN_SLOTS );
|
private final AppEngInternalInventory patterns = new AppEngInternalInventory( this, NUMBER_OF_PATTERN_SLOTS );
|
||||||
private final MEMonitorPassThrough<IAEItemStack> items = new MEMonitorPassThrough<>( new NullInventory<IAEItemStack>(), AEApi.instance()
|
private final MEMonitorPassThrough<IAEItemStack> items = new MEMonitorPassThrough<>( new NullInventory<IAEItemStack>(), AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||||
.storage()
|
private final MEMonitorPassThrough<IAEFluidStack> fluids = new MEMonitorPassThrough<>( new NullInventory<IAEFluidStack>(), AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
||||||
.getStorageChannel( IItemStorageChannel.class ) );
|
|
||||||
private final MEMonitorPassThrough<IAEFluidStack> fluids = new MEMonitorPassThrough<>( new NullInventory<IAEFluidStack>(), AEApi.instance()
|
|
||||||
.storage()
|
|
||||||
.getStorageChannel( IFluidStorageChannel.class ) );
|
|
||||||
private final UpgradeInventory upgrades;
|
private final UpgradeInventory upgrades;
|
||||||
|
private final Accessor accessor = new Accessor();
|
||||||
private boolean hasConfig = false;
|
private boolean hasConfig = false;
|
||||||
private int priority;
|
private int priority;
|
||||||
private List<ICraftingPatternDetails> craftingList = null;
|
private List<ICraftingPatternDetails> craftingList = null;
|
||||||
private List<ItemStack> waitingToSend = null;
|
private List<ItemStack> waitingToSend = null;
|
||||||
private IMEInventory<IAEItemStack> destination;
|
private IMEInventory<IAEItemStack> destination;
|
||||||
private int isWorking = -1;
|
private int isWorking = -1;
|
||||||
private final Accessor accessor = new Accessor();
|
|
||||||
private EnumSet<EnumFacing> visitedFaces = EnumSet.noneOf( EnumFacing.class );
|
private EnumSet<EnumFacing> visitedFaces = EnumSet.noneOf( EnumFacing.class );
|
||||||
private EnumMap<EnumFacing, List<ItemStack>> waitingToSendFacing = new EnumMap<>( EnumFacing.class );
|
private EnumMap<EnumFacing, List<ItemStack>> waitingToSendFacing = new EnumMap<>( EnumFacing.class );
|
||||||
private GTCEInventoryAdaptor GTad;
|
|
||||||
private boolean resetConfigCache = true;
|
private boolean resetConfigCache = true;
|
||||||
private IMEMonitor<IAEItemStack> configCachedHandler;
|
private IMEMonitor<IAEItemStack> configCachedHandler;
|
||||||
|
|
||||||
@@ -165,6 +153,11 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
this.interfaceRequestSource = new InterfaceRequestSource( this.iHost );
|
this.interfaceRequestSource = new InterfaceRequestSource( this.iHost );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean invIsCustomBlocking( BlockingInventoryAdaptor inv )
|
||||||
|
{
|
||||||
|
return ( inv.containsBlockingItems() );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void saveChanges()
|
public void saveChanges()
|
||||||
{
|
{
|
||||||
@@ -185,6 +178,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
if( cfg != hasConfig )
|
if( cfg != hasConfig )
|
||||||
{
|
{
|
||||||
resetConfigCache = true;
|
resetConfigCache = true;
|
||||||
|
this.notifyNeighbors();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( inv == this.patterns && ( !removed.isEmpty() || !added.isEmpty() ) )
|
else if( inv == this.patterns && ( !removed.isEmpty() || !added.isEmpty() ) )
|
||||||
@@ -244,12 +238,12 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
|
|
||||||
NBTTagCompound sidedWaitList = new NBTTagCompound();
|
NBTTagCompound sidedWaitList = new NBTTagCompound();
|
||||||
|
|
||||||
if (this.waitingToSendFacing != null)
|
if( this.waitingToSendFacing != null )
|
||||||
{
|
{
|
||||||
for( EnumFacing s : this.iHost.getTargets() )
|
for( EnumFacing s : this.iHost.getTargets() )
|
||||||
{
|
{
|
||||||
NBTTagList waitingListSided = new NBTTagList();
|
NBTTagList waitingListSided = new NBTTagList();
|
||||||
if (this.waitingToSendFacing.containsKey( s ))
|
if( this.waitingToSendFacing.containsKey( s ) )
|
||||||
{
|
{
|
||||||
for( final ItemStack is : this.waitingToSendFacing.get( s ) )
|
for( final ItemStack is : this.waitingToSendFacing.get( s ) )
|
||||||
{
|
{
|
||||||
@@ -285,6 +279,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
final NBTTagCompound waitingListSided = data.getCompoundTag( "sidedWaitList" );
|
final NBTTagCompound waitingListSided = data.getCompoundTag( "sidedWaitList" );
|
||||||
|
|
||||||
for( EnumFacing s : EnumFacing.values() )
|
for( EnumFacing s : EnumFacing.values() )
|
||||||
|
{
|
||||||
if( waitingListSided.hasKey( s.name() ) )
|
if( waitingListSided.hasKey( s.name() ) )
|
||||||
{
|
{
|
||||||
NBTTagList w = waitingListSided.getTagList( s.name(), 10 );
|
NBTTagList w = waitingListSided.getTagList( s.name(), 10 );
|
||||||
@@ -298,6 +293,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.craftingTracker.readFromNBT( data );
|
this.craftingTracker.readFromNBT( data );
|
||||||
|
|
||||||
@@ -357,8 +353,9 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.waitingToSendFacing == null){
|
if( this.waitingToSendFacing == null )
|
||||||
this.waitingToSendFacing = new EnumMap<>(EnumFacing.class);
|
{
|
||||||
|
this.waitingToSendFacing = new EnumMap<>( EnumFacing.class );
|
||||||
}
|
}
|
||||||
|
|
||||||
this.waitingToSendFacing.computeIfAbsent( f, k -> new ArrayList<>() );
|
this.waitingToSendFacing.computeIfAbsent( f, k -> new ArrayList<>() );
|
||||||
@@ -415,7 +412,6 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
// :P
|
// :P
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.notifyNeighbors();
|
this.notifyNeighbors();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -429,15 +425,17 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean removed = false;
|
||||||
|
|
||||||
if( this.craftingList != null )
|
if( this.craftingList != null )
|
||||||
{
|
{
|
||||||
final Iterator<ICraftingPatternDetails> i = this.craftingList.iterator();
|
final Iterator<ICraftingPatternDetails> i = this.craftingList.iterator();
|
||||||
while( i.hasNext() )
|
while ( i.hasNext() )
|
||||||
{
|
{
|
||||||
final ICraftingPatternDetails details = i.next();
|
final ICraftingPatternDetails details = i.next();
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
|
|
||||||
for( int x = 0; x < accountedFor.length ; x++ )
|
for( int x = 0; x < accountedFor.length; x++ )
|
||||||
{
|
{
|
||||||
final ItemStack is = this.patterns.getStackInSlot( x );
|
final ItemStack is = this.patterns.getStackInSlot( x );
|
||||||
if( details.getPattern() == is )
|
if( details.getPattern() == is )
|
||||||
@@ -448,41 +446,49 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
|
|
||||||
if( !found )
|
if( !found )
|
||||||
{
|
{
|
||||||
|
removed = true;
|
||||||
i.remove();
|
i.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for( int x = 0; x < accountedFor.length ; x++ )
|
boolean newPattern = false;
|
||||||
|
|
||||||
|
for( int x = 0; x < accountedFor.length; x++ )
|
||||||
{
|
{
|
||||||
if( !accountedFor[x] )
|
if( !accountedFor[x] )
|
||||||
{
|
{
|
||||||
|
newPattern = true;
|
||||||
this.addToCraftingList( this.patterns.getStackInSlot( x ) );
|
this.addToCraftingList( this.patterns.getStackInSlot( x ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.gridProxy.getGrid().postEvent( new MENetworkCraftingPatternChange( this, this.gridProxy.getNode() ) );
|
this.gridProxy.getGrid().postEvent( new MENetworkCraftingPatternChange( this, this.gridProxy.getNode() ) );
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( GridAccessException e )
|
||||||
{
|
{
|
||||||
// :P
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasWorkToDo() {
|
private boolean hasWorkToDo()
|
||||||
|
{
|
||||||
|
|
||||||
if (hasItemsToSend()){
|
if( hasItemsToSend() )
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(hasItemsToSendFacing()){
|
if( hasItemsToSendFacing() )
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (final IAEItemStack requiredWork : this.requireWork) {
|
for( final IAEItemStack requiredWork : this.requireWork )
|
||||||
if (requiredWork != null) {
|
{
|
||||||
|
if( requiredWork != null )
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -593,7 +599,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
|
|
||||||
private boolean hasItemsToSendFacing()
|
private boolean hasItemsToSendFacing()
|
||||||
{
|
{
|
||||||
if (waitingToSendFacing != null)
|
if( waitingToSendFacing != null )
|
||||||
{
|
{
|
||||||
for( EnumFacing enumFacing : waitingToSendFacing.keySet() )
|
for( EnumFacing enumFacing : waitingToSendFacing.keySet() )
|
||||||
{
|
{
|
||||||
@@ -616,7 +622,10 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
if( invSlot > 8 + this.getInstalledUpgrades( Upgrades.PATTERN_EXPANSION ) * 9 )
|
if( invSlot > 8 + this.getInstalledUpgrades( Upgrades.PATTERN_EXPANSION ) * 9 )
|
||||||
{
|
{
|
||||||
ItemStack is = patterns.getStackInSlot( invSlot );
|
ItemStack is = patterns.getStackInSlot( invSlot );
|
||||||
if( is.isEmpty() ) continue;
|
if( is.isEmpty() )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
dropList.add( patterns.extractItem( invSlot, Integer.MAX_VALUE, false ) );
|
dropList.add( patterns.extractItem( invSlot, Integer.MAX_VALUE, false ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -633,8 +642,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
@Override
|
@Override
|
||||||
public boolean canInsert( final ItemStack stack )
|
public boolean canInsert( final ItemStack stack )
|
||||||
{
|
{
|
||||||
final IAEItemStack out = this.destination.injectItems( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createStack( stack ),
|
final IAEItemStack out = this.destination.injectItems( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createStack( stack ), Actionable.SIMULATE, null );
|
||||||
Actionable.SIMULATE, null );
|
|
||||||
if( out == null )
|
if( out == null )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
@@ -708,7 +716,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
this.pushItemsOut( this.iHost.getTargets() );
|
this.pushItemsOut( this.iHost.getTargets() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasItemsToSendFacing())
|
if( hasItemsToSendFacing() )
|
||||||
{
|
{
|
||||||
for( EnumFacing enumFacing : waitingToSendFacing.keySet() )
|
for( EnumFacing enumFacing : waitingToSendFacing.keySet() )
|
||||||
{
|
{
|
||||||
@@ -731,7 +739,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
final World w = tile.getWorld();
|
final World w = tile.getWorld();
|
||||||
|
|
||||||
final Iterator<ItemStack> i = this.waitingToSend.iterator();
|
final Iterator<ItemStack> i = this.waitingToSend.iterator();
|
||||||
while( i.hasNext() )
|
while ( i.hasNext() )
|
||||||
{
|
{
|
||||||
ItemStack whatToSend = i.next();
|
ItemStack whatToSend = i.next();
|
||||||
|
|
||||||
@@ -778,8 +786,8 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
|
|
||||||
private void pushItemsOut( final EnumFacing s )
|
private void pushItemsOut( final EnumFacing s )
|
||||||
{
|
{
|
||||||
if (!this.waitingToSendFacing.containsKey(s) ||
|
if( !this.waitingToSendFacing.containsKey( s ) || ( this.waitingToSendFacing.containsKey( s ) && this.waitingToSendFacing.get( s ).isEmpty() ) )
|
||||||
(this.waitingToSendFacing.containsKey(s) && this.waitingToSendFacing.get( s ).isEmpty())) {
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -792,17 +800,18 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||||
|
|
||||||
final Iterator<ItemStack> i = this.waitingToSendFacing.get( s ).iterator();
|
final Iterator<ItemStack> i = this.waitingToSendFacing.get( s ).iterator();
|
||||||
while ( i.hasNext() )
|
while ( i.hasNext() )
|
||||||
{
|
{
|
||||||
ItemStack whatToSend = i.next();
|
ItemStack whatToSend = i.next();
|
||||||
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
|
||||||
if( ad != null )
|
if( ad != null )
|
||||||
{
|
{
|
||||||
final ItemStack result = ad.addItems( whatToSend );
|
final ItemStack result = ad.addItems( whatToSend );
|
||||||
if( !result.isEmpty() )
|
if( !result.isEmpty() )
|
||||||
{
|
{
|
||||||
whatToSend.setCount( whatToSend.getCount() - ( whatToSend.getCount() - result.getCount() ) );
|
whatToSend.setCount( result.getCount() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -843,42 +852,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
this.destination = this.gridProxy.getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
this.destination = this.gridProxy.getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||||
final IEnergySource src = this.gridProxy.getEnergy();
|
final IEnergySource src = this.gridProxy.getEnergy();
|
||||||
|
|
||||||
if( this.craftingTracker.isBusy( x ) )
|
if( itemStack.getStackSize() < 0 )
|
||||||
{
|
|
||||||
changed = this.handleCrafting( x, adaptor, itemStack ) || changed;
|
|
||||||
}
|
|
||||||
else if( itemStack.getStackSize() > 0 )
|
|
||||||
{
|
|
||||||
// make sure strange things didn't happen...
|
|
||||||
if( !adaptor.simulateAdd( itemStack.createItemStack() ).isEmpty() )
|
|
||||||
{
|
|
||||||
changed = true;
|
|
||||||
throw new GridAccessException();
|
|
||||||
}
|
|
||||||
|
|
||||||
IAEItemStack storedStack = this.gridProxy.getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ).getStorageList().findPrecise( itemStack );
|
|
||||||
if( storedStack != null )
|
|
||||||
{
|
|
||||||
if( storedStack.getStackSize() > 0 )
|
|
||||||
{
|
|
||||||
final IAEItemStack acquired = Platform.poweredExtraction( src, this.destination, itemStack, this.interfaceRequestSource );
|
|
||||||
if( acquired != null )
|
|
||||||
{
|
|
||||||
changed = true;
|
|
||||||
final ItemStack issue = adaptor.addItems( acquired.createItemStack() );
|
|
||||||
if( !issue.isEmpty() )
|
|
||||||
{
|
|
||||||
throw new IllegalStateException( "bad attempt at managing inventory. ( addItems )" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( storedStack.isCraftable() )
|
|
||||||
{
|
|
||||||
changed = this.handleCrafting( x, adaptor, itemStack ) || changed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( itemStack.getStackSize() < 0 )
|
|
||||||
{
|
{
|
||||||
IAEItemStack toStore = itemStack.copy();
|
IAEItemStack toStore = itemStack.copy();
|
||||||
toStore.setStackSize( -toStore.getStackSize() );
|
toStore.setStackSize( -toStore.getStackSize() );
|
||||||
@@ -916,6 +890,51 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( this.craftingTracker.isBusy( x ) )
|
||||||
|
{
|
||||||
|
changed = this.handleCrafting( x, adaptor, itemStack ) || changed;
|
||||||
|
}
|
||||||
|
else if( itemStack.getStackSize() > 0 )
|
||||||
|
{
|
||||||
|
// make sure strange things didn't happen...
|
||||||
|
|
||||||
|
ItemStack inputStack = itemStack.getCachedItemStack( itemStack.getStackSize() );
|
||||||
|
|
||||||
|
ItemStack remaining = adaptor.simulateAdd( inputStack );
|
||||||
|
|
||||||
|
if( !remaining.isEmpty() )
|
||||||
|
{
|
||||||
|
itemStack.setCachedItemStack( remaining );
|
||||||
|
changed = true;
|
||||||
|
throw new GridAccessException();
|
||||||
|
}
|
||||||
|
|
||||||
|
IAEItemStack storedStack = this.gridProxy.getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ).getStorageList().findPrecise( itemStack );
|
||||||
|
if( storedStack != null )
|
||||||
|
{
|
||||||
|
final IAEItemStack acquired = Platform.poweredExtraction( src, this.destination, itemStack, this.interfaceRequestSource );
|
||||||
|
if( acquired != null )
|
||||||
|
{
|
||||||
|
changed = true;
|
||||||
|
inputStack.setCount( Ints.saturatedCast( acquired.getStackSize() ) );
|
||||||
|
final ItemStack issue = adaptor.addItems( inputStack );
|
||||||
|
if( !issue.isEmpty() )
|
||||||
|
{
|
||||||
|
throw new IllegalStateException( "bad attempt at managing inventory. ( addItems )" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( storedStack.isCraftable() )
|
||||||
|
{
|
||||||
|
itemStack.setCachedItemStack( inputStack );
|
||||||
|
changed = this.handleCrafting( x, adaptor, itemStack ) || changed;
|
||||||
|
}
|
||||||
|
if( acquired == null )
|
||||||
|
{
|
||||||
|
itemStack.setCachedItemStack( inputStack );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// else wtf?
|
// else wtf?
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
@@ -943,17 +962,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
{
|
{
|
||||||
if( this.getInstalledUpgrades( Upgrades.CRAFTING ) > 0 && itemStack != null )
|
if( this.getInstalledUpgrades( Upgrades.CRAFTING ) > 0 && itemStack != null )
|
||||||
{
|
{
|
||||||
if (this.failedCraftTriesSlot[x] <= 0)
|
return this.craftingTracker.handleCrafting( x, itemStack.getStackSize(), itemStack, d, this.iHost.getTileEntity().getWorld(), this.gridProxy.getGrid(), this.gridProxy.getCrafting(), this.mySource );
|
||||||
{
|
|
||||||
boolean crafted = this.craftingTracker.handleCrafting( x, itemStack.getStackSize(), itemStack, d, this.iHost.getTileEntity().getWorld(),
|
|
||||||
this.gridProxy.getGrid(), this.gridProxy.getCrafting(), this.mySource );
|
|
||||||
|
|
||||||
if (crafted) this.failedCraftTriesSlot[x] = 0;
|
|
||||||
else{
|
|
||||||
this.failedCraftTriesSlot[x] += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.failedCraftTriesSlot[x] -= 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
@@ -1093,12 +1102,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
|
|
||||||
private boolean invIsBlocked( InventoryAdaptor inv )
|
private boolean invIsBlocked( InventoryAdaptor inv )
|
||||||
{
|
{
|
||||||
return (inv.containsItems());
|
return ( inv.containsItems() );
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean invIsBlockedGTCE( GTCEInventoryAdaptor inv )
|
|
||||||
{
|
|
||||||
return ( !inv.canRemoveAllExceptCircuits() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1150,35 +1154,36 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||||
if( ad != null )
|
if( ad != null )
|
||||||
{
|
{
|
||||||
if( this.isBlocking() )
|
if( this.isBlocking() )
|
||||||
{
|
{
|
||||||
IPhantomTile phantomTE = null;
|
IPhantomTile phantomTE;
|
||||||
if( Loader.isModLoaded( "actuallyadditions" ) && Loader.isModLoaded( "gregtech" ) && te instanceof IPhantomTile )
|
if( Loader.isModLoaded( "actuallyadditions" ) && te instanceof IPhantomTile )
|
||||||
{
|
{
|
||||||
phantomTE = ( (IPhantomTile) te );
|
phantomTE = ( (IPhantomTile) te );
|
||||||
if( phantomTE.hasBoundPosition() )
|
if( phantomTE.hasBoundPosition() )
|
||||||
{
|
{
|
||||||
TileEntity phantom = w.getTileEntity( phantomTE.getBoundPosition() );
|
TileEntity phantom = w.getTileEntity( phantomTE.getBoundPosition() );
|
||||||
if( phantom instanceof MetaTileEntityHolder && isGTCEblocked( phantom, s ) )
|
if( NonBlockingItems.INSTANCE.getMap().containsKey( w.getBlockState( phantomTE.getBoundPosition() ).getBlock().getRegistryName().getResourceDomain() ) )
|
||||||
|
{
|
||||||
|
if( isCustomInvBlocking( phantom, s ) )
|
||||||
{
|
{
|
||||||
visitedFaces.remove( s );
|
visitedFaces.remove( s );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if( Loader.isModLoaded( "gregtech" ) && te instanceof MetaTileEntityHolder )
|
else if( NonBlockingItems.INSTANCE.getMap().containsKey( w.getBlockState( tile.getPos().offset( s ) ).getBlock().getRegistryName().getResourceDomain() ) )
|
||||||
{
|
{
|
||||||
if( isGTCEblocked( te, s ) )
|
if( isCustomInvBlocking( te, s ) )
|
||||||
{
|
{
|
||||||
visitedFaces.remove( s );
|
visitedFaces.remove( s );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if( invIsBlocked( ad ) )
|
else if( invIsBlocked( ad ) )
|
||||||
{
|
{
|
||||||
visitedFaces.remove( s );
|
visitedFaces.remove( s );
|
||||||
@@ -1227,50 +1232,54 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
for( final EnumFacing s : possibleDirections )
|
for( final EnumFacing s : possibleDirections )
|
||||||
{
|
{
|
||||||
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
||||||
IPhantomTile phantomTE = null;
|
IPhantomTile phantomTE;
|
||||||
|
|
||||||
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||||
if( ad != null )
|
if( ad != null )
|
||||||
{
|
{
|
||||||
if( Loader.isModLoaded( "actuallyadditions") && Loader.isModLoaded( "gregtech" ) && te instanceof IPhantomTile )
|
if( Loader.isModLoaded( "actuallyadditions" ) && Loader.isModLoaded( "gregtech" ) && te instanceof IPhantomTile )
|
||||||
{
|
{
|
||||||
phantomTE = ( (IPhantomTile) te );
|
phantomTE = ( (IPhantomTile) te );
|
||||||
if( phantomTE.hasBoundPosition() )
|
if( phantomTE.hasBoundPosition() )
|
||||||
{
|
{
|
||||||
TileEntity phantom = w.getTileEntity( phantomTE.getBoundPosition() );
|
TileEntity phantom = w.getTileEntity( phantomTE.getBoundPosition() );
|
||||||
if( phantom instanceof MetaTileEntityHolder && !isGTCEblocked( phantom, s ) )
|
if( NonBlockingItems.INSTANCE.getMap().containsKey( w.getBlockState( phantomTE.getBoundPosition() ).getBlock().getRegistryName().getResourceDomain() ) )
|
||||||
|
{
|
||||||
|
if( !isCustomInvBlocking( phantom, s ) )
|
||||||
{
|
{
|
||||||
allAreBusy = false;
|
allAreBusy = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if( Loader.isModLoaded( "gregtech" ) && te instanceof MetaTileEntityHolder )
|
else if( NonBlockingItems.INSTANCE.getMap().containsKey( w.getBlockState( tile.getPos().offset( s ) ).getBlock().getRegistryName().getResourceDomain() ) )
|
||||||
{
|
{
|
||||||
if( !isGTCEblocked( te, s ) )
|
if( !isCustomInvBlocking( te, s ) )
|
||||||
{
|
{
|
||||||
allAreBusy = false;
|
allAreBusy = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
else if( !invIsBlocked( ad ) )
|
{
|
||||||
|
if( !invIsBlocked( ad ) )
|
||||||
{
|
{
|
||||||
allAreBusy = false;
|
allAreBusy = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
busy = allAreBusy;
|
busy = allAreBusy;
|
||||||
}
|
}
|
||||||
return busy;
|
return busy;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isGTCEblocked(TileEntity te, EnumFacing s)
|
boolean isCustomInvBlocking( TileEntity te, EnumFacing s )
|
||||||
{
|
{
|
||||||
GTad = GTCEInventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
BlockingInventoryAdaptor blockingInventoryAdaptor = BlockingInventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||||
return invIsBlockedGTCE( GTad );
|
return invIsCustomBlocking( blockingInventoryAdaptor );
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean sameGrid( final IGrid grid ) throws GridAccessException
|
private boolean sameGrid( final IGrid grid ) throws GridAccessException
|
||||||
@@ -1293,7 +1302,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !ad.simulateAdd( is.copy() ).isEmpty() )
|
if( !ad.simulateAdd( is ).isEmpty() )
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1330,13 +1339,13 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
|
|
||||||
if( this.waitingToSendFacing != null )
|
if( this.waitingToSendFacing != null )
|
||||||
{
|
{
|
||||||
for (List<ItemStack> itemList : waitingToSendFacing.values())
|
for( List<ItemStack> itemList : waitingToSendFacing.values() )
|
||||||
{
|
{
|
||||||
for (final ItemStack is : itemList)
|
for( final ItemStack is : itemList )
|
||||||
{
|
{
|
||||||
if (!is.isEmpty())
|
if( !is.isEmpty() )
|
||||||
{
|
{
|
||||||
drops.add(is);
|
drops.add( is );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1466,9 +1475,9 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
final Block directedBlock = directedBlockState.getBlock();
|
final Block directedBlock = directedBlockState.getBlock();
|
||||||
ItemStack what = new ItemStack( directedBlock, 1, directedBlock.getMetaFromState( directedBlockState ) );
|
ItemStack what = new ItemStack( directedBlock, 1, directedBlock.getMetaFromState( directedBlockState ) );
|
||||||
|
|
||||||
if ( Loader.isModLoaded("gregtech") && directedBlock instanceof BlockMachine )
|
if( Loader.isModLoaded( "gregtech" ) && directedBlock instanceof BlockMachine )
|
||||||
{
|
{
|
||||||
MetaTileEntity metaTileEntity = getMetaTileEntity(hostWorld, targ);
|
MetaTileEntity metaTileEntity = getMetaTileEntity( hostWorld, targ );
|
||||||
return metaTileEntity.getMetaFullName();
|
return metaTileEntity.getMetaFullName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1584,6 +1593,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private class InterfaceRequestContext implements Comparable<Integer>
|
private class InterfaceRequestContext implements Comparable<Integer>
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -1594,6 +1604,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private class InterfaceInventory extends MEMonitorIInventory
|
private class InterfaceInventory extends MEMonitorIInventory
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -1631,6 +1642,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private class Accessor implements IStorageMonitorableAccessor
|
private class Accessor implements IStorageMonitorableAccessor
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import java.util.concurrent.Future;
|
|||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
@@ -83,8 +84,16 @@ public class MultiCraftingTracker
|
|||||||
|
|
||||||
public boolean handleCrafting( final int x, final long itemToCraft, final IAEItemStack ais, final InventoryAdaptor d, final World w, final IGrid g, final ICraftingGrid cg, final IActionSource mySrc )
|
public boolean handleCrafting( final int x, final long itemToCraft, final IAEItemStack ais, final InventoryAdaptor d, final World w, final IGrid g, final ICraftingGrid cg, final IActionSource mySrc )
|
||||||
{
|
{
|
||||||
if( ais != null && d.simulateAdd( ais.createItemStack() ).isEmpty() )
|
if( ais != null )
|
||||||
{
|
{
|
||||||
|
ItemStack inputStack = ais.getCachedItemStack( ais.getStackSize() );
|
||||||
|
|
||||||
|
ItemStack remaining = d.simulateAdd( inputStack );
|
||||||
|
|
||||||
|
if( remaining.isEmpty() )
|
||||||
|
{
|
||||||
|
ais.setCachedItemStack( inputStack );
|
||||||
|
|
||||||
final Future<ICraftingJob> craftingJob = this.getJob( x );
|
final Future<ICraftingJob> craftingJob = this.getJob( x );
|
||||||
|
|
||||||
if( this.getLink( x ) != null )
|
if( this.getLink( x ) != null )
|
||||||
@@ -136,6 +145,11 @@ public class MultiCraftingTracker
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ais.setCachedItemStack( remaining );
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,133 @@
|
|||||||
|
package appeng.helpers;
|
||||||
|
|
||||||
|
import appeng.core.AEConfig;
|
||||||
|
import appeng.core.AELog;
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import gregtech.api.items.metaitem.MetaItem;
|
||||||
|
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
|
||||||
|
import it.unimi.dsi.fastutil.ints.IntSet;
|
||||||
|
import it.unimi.dsi.fastutil.objects.*;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraftforge.fml.common.Loader;
|
||||||
|
import net.minecraftforge.fml.common.registry.GameRegistry;
|
||||||
|
import net.minecraftforge.oredict.OreDictionary;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
public class NonBlockingItems
|
||||||
|
{
|
||||||
|
public static Map<String, Object2ObjectOpenHashMap<Item, IntSet>> NON_BLOCKING_MAP = new HashMap<>();
|
||||||
|
public static NonBlockingItems INSTANCE = new NonBlockingItems();
|
||||||
|
|
||||||
|
private NonBlockingItems()
|
||||||
|
{
|
||||||
|
String[] strings = AEConfig.instance().getNonBlockingItems();
|
||||||
|
String[] modids = new String[0];
|
||||||
|
if( strings.length > 0 )
|
||||||
|
{
|
||||||
|
for( String s : strings )
|
||||||
|
{
|
||||||
|
if( s.startsWith( "[" ) && s.endsWith( "]" ) )
|
||||||
|
{
|
||||||
|
modids = s.substring( 1, s.length() - 1 ).split( "\\|" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for( String modid : modids )
|
||||||
|
{
|
||||||
|
if( !Loader.isModLoaded( modid ) )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
NON_BLOCKING_MAP.putIfAbsent( modid, new Object2ObjectOpenHashMap<>() );
|
||||||
|
|
||||||
|
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" ) && Platform.isModLoaded( "gregtech" ) )
|
||||||
|
{
|
||||||
|
boolean found = false;
|
||||||
|
for( MetaItem<?> metaItem : MetaItem.getMetaItems() )
|
||||||
|
{
|
||||||
|
MetaItem<?>.MetaValueItem metaItem2 = metaItem.getItem( ModItemMeta[1] );
|
||||||
|
if( metaItem.getItem( ModItemMeta[1] ) != null )
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
ItemStack itemStack = metaItem2.getStackForm();
|
||||||
|
NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() );
|
||||||
|
NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) ->
|
||||||
|
{
|
||||||
|
intSet.add( itemStack.getItemDamage() );
|
||||||
|
return intSet;
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ItemStack itemStack = GameRegistry.makeItemStack( ModItemMeta[0] + ":" + ModItemMeta[1], ModItemMeta.length == 3 ? Integer.parseInt( ModItemMeta[2] ) : 0, 1, null );
|
||||||
|
if( !itemStack.isEmpty() )
|
||||||
|
{
|
||||||
|
NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() );
|
||||||
|
NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) ->
|
||||||
|
{
|
||||||
|
intSet.add( itemStack.getItemDamage() );
|
||||||
|
return intSet;
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( !found )
|
||||||
|
{
|
||||||
|
AELog.error( "Item not found on nonBlocking config: " + s );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( ModItemMeta[0].equals( "ore" ) )
|
||||||
|
{
|
||||||
|
OreDictionary.getOres( ModItemMeta[1] ).forEach( itemStack ->
|
||||||
|
{
|
||||||
|
NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() );
|
||||||
|
NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) ->
|
||||||
|
{
|
||||||
|
intSet.add( itemStack.getItemDamage() );
|
||||||
|
return intSet;
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ItemStack itemStack = GameRegistry.makeItemStack( ModItemMeta[0] + ":" + ModItemMeta[1], ModItemMeta.length == 3 ? Integer.parseInt( ModItemMeta[2] ) : 0, 1, null );
|
||||||
|
if( !itemStack.isEmpty() )
|
||||||
|
{
|
||||||
|
NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() );
|
||||||
|
NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) ->
|
||||||
|
{
|
||||||
|
intSet.add( itemStack.getItemDamage() );
|
||||||
|
return intSet;
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AELog.error( "Item not found on nonBlocking config: " + s );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Object2ObjectOpenHashMap<Item, IntSet>> getMap()
|
||||||
|
{
|
||||||
|
return NON_BLOCKING_MAP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,7 +20,6 @@ package appeng.helpers;
|
|||||||
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import net.minecraft.inventory.InventoryCrafting;
|
import net.minecraft.inventory.InventoryCrafting;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
@@ -38,25 +37,26 @@ import appeng.api.networking.crafting.ICraftingPatternDetails;
|
|||||||
import appeng.api.storage.channels.IItemStorageChannel;
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.container.ContainerNull;
|
import appeng.container.ContainerNull;
|
||||||
import appeng.core.AEConfig;
|
|
||||||
import appeng.core.AELog;
|
|
||||||
import appeng.core.features.AEFeature;
|
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
import appeng.util.item.AEItemStack;
|
import appeng.util.item.AEItemStack;
|
||||||
import net.minecraftforge.common.crafting.IShapedRecipe;
|
import net.minecraftforge.common.crafting.IShapedRecipe;
|
||||||
|
import net.minecraftforge.fml.common.Optional;
|
||||||
|
|
||||||
|
|
||||||
public class PatternHelper implements ICraftingPatternDetails, Comparable<PatternHelper>
|
public class PatternHelper implements ICraftingPatternDetails, Comparable<PatternHelper>
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final int CRAFTING_GRID_DIMENSION = 3;
|
private static final int CRAFTING_GRID_DIMENSION = 3;
|
||||||
private static final int ALL_INPUT_LIMIT = CRAFTING_GRID_DIMENSION * CRAFTING_GRID_DIMENSION;
|
private static final int CRAFTING_INPUT_LIMIT = CRAFTING_GRID_DIMENSION * CRAFTING_GRID_DIMENSION;
|
||||||
|
public static final int PROCESSING_INPUT_HEIGHT = 4;
|
||||||
|
public static final int PROCESSING_INPUT_WIDTH = 4;
|
||||||
|
public static final int PROCESSING_INPUT_LIMIT = PROCESSING_INPUT_HEIGHT * PROCESSING_INPUT_WIDTH;
|
||||||
private static final int CRAFTING_OUTPUT_LIMIT = 1;
|
private static final int CRAFTING_OUTPUT_LIMIT = 1;
|
||||||
private static final int PROCESSING_OUTPUT_LIMIT = 3;
|
public static final int PROCESSING_OUTPUT_LIMIT = 6;
|
||||||
|
|
||||||
private final ItemStack patternItem;
|
private final ItemStack patternItem;
|
||||||
private final InventoryCrafting crafting = new InventoryCrafting( new ContainerNull(), 3, 3 );
|
private final InventoryCrafting crafting;
|
||||||
private final InventoryCrafting testFrame = new InventoryCrafting( new ContainerNull(), 3, 3 );
|
private final InventoryCrafting testFrame;
|
||||||
private final ItemStack correctOutput;
|
private final ItemStack correctOutput;
|
||||||
private final IRecipe standardRecipe;
|
private final IRecipe standardRecipe;
|
||||||
private final IAEItemStack[] condensedInputs;
|
private final IAEItemStack[] condensedInputs;
|
||||||
@@ -84,6 +84,9 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable<Patter
|
|||||||
final NBTTagList outTag = encodedValue.getTagList( "out", 10 );
|
final NBTTagList outTag = encodedValue.getTagList( "out", 10 );
|
||||||
this.isCrafting = encodedValue.getBoolean( "crafting" );
|
this.isCrafting = encodedValue.getBoolean( "crafting" );
|
||||||
|
|
||||||
|
crafting = new InventoryCrafting( new ContainerNull(), isCrafting ? 3 : 4, isCrafting ? 3 : 4 );
|
||||||
|
testFrame = new InventoryCrafting( new ContainerNull(), isCrafting ? 3 : 4, isCrafting ? 3 : 4 );
|
||||||
|
|
||||||
this.canSubstitute = this.isCrafting && encodedValue.getBoolean( "substitute" );
|
this.canSubstitute = this.isCrafting && encodedValue.getBoolean( "substitute" );
|
||||||
this.patternItem = is;
|
this.patternItem = is;
|
||||||
this.pattern = AEItemStack.fromItemStack( is );
|
this.pattern = AEItemStack.fromItemStack( is );
|
||||||
@@ -149,9 +152,9 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable<Patter
|
|||||||
}
|
}
|
||||||
final int outputLength = out.size();
|
final int outputLength = out.size();
|
||||||
|
|
||||||
this.inputs = in.toArray(new IAEItemStack[ALL_INPUT_LIMIT]);
|
this.inputs = in.toArray( new IAEItemStack[isCrafting ? CRAFTING_INPUT_LIMIT : PROCESSING_INPUT_LIMIT] );
|
||||||
this.outputs = out.toArray(new IAEItemStack[outputLength]);
|
this.outputs = out.toArray( new IAEItemStack[outputLength] );
|
||||||
this.substituteInputs = new HashMap<>(ALL_INPUT_LIMIT);
|
this.substituteInputs = new HashMap<>( CRAFTING_INPUT_LIMIT );
|
||||||
|
|
||||||
final Map<IAEItemStack, IAEItemStack> tmpOutputs = new HashMap<>();
|
final Map<IAEItemStack, IAEItemStack> tmpOutputs = new HashMap<>();
|
||||||
|
|
||||||
@@ -245,7 +248,7 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable<Patter
|
|||||||
|
|
||||||
final TestStatus result = this.getStatus( slotIndex, i );
|
final TestStatus result = this.getStatus( slotIndex, i );
|
||||||
|
|
||||||
switch( result )
|
switch ( result )
|
||||||
{
|
{
|
||||||
case ACCEPT:
|
case ACCEPT:
|
||||||
return true;
|
return true;
|
||||||
@@ -264,9 +267,11 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable<Patter
|
|||||||
this.testFrame.setInventorySlotContents( slotIndex, i );
|
this.testFrame.setInventorySlotContents( slotIndex, i );
|
||||||
|
|
||||||
// If we cannot substitute, the items must match exactly
|
// If we cannot substitute, the items must match exactly
|
||||||
if (!canSubstitute && slotIndex < inputs.length) {
|
if( ( !( i.getItem().isDamageable() || Platform.isGTDamageableItem( i.getItem() ) ) && !canSubstitute ) && slotIndex < inputs.length )
|
||||||
if (!inputs[slotIndex].isSameType(i)) {
|
{
|
||||||
this.markItemAs(slotIndex, i, TestStatus.DECLINE);
|
if( !inputs[slotIndex].isSameType( i ) )
|
||||||
|
{
|
||||||
|
this.markItemAs( slotIndex, i, TestStatus.DECLINE );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -324,23 +329,26 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable<Patter
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<IAEItemStack> getSubstituteInputs(int slot) {
|
public List<IAEItemStack> getSubstituteInputs( int slot )
|
||||||
if (this.inputs[slot] == null) {
|
{
|
||||||
|
if( this.inputs[slot] == null )
|
||||||
|
{
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.substituteInputs.computeIfAbsent(slot, value -> {
|
return this.substituteInputs.computeIfAbsent( slot, value -> {
|
||||||
ItemStack[] matchingStacks = getRecipeIngredient(slot).getMatchingStacks();
|
ItemStack[] matchingStacks = getRecipeIngredient( slot ).getMatchingStacks();
|
||||||
List<IAEItemStack> itemList = new ArrayList<>(matchingStacks.length + 1);
|
List<IAEItemStack> itemList = new ArrayList<>( matchingStacks.length + 1 );
|
||||||
for (ItemStack matchingStack : matchingStacks) {
|
for( ItemStack matchingStack : matchingStacks )
|
||||||
itemList.add(AEItemStack.fromItemStack(matchingStack));
|
{
|
||||||
|
itemList.add( AEItemStack.fromItemStack( matchingStack ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that the specific item put in by the user is at the beginning,
|
// Ensure that the specific item put in by the user is at the beginning,
|
||||||
// so that it takes precedence over substitutions
|
// so that it takes precedence over substitutions
|
||||||
itemList.add(0, this.inputs[slot]);
|
itemList.add( 0, this.inputs[slot] );
|
||||||
return itemList;
|
return itemList;
|
||||||
});
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -350,31 +358,40 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable<Patter
|
|||||||
* ingredient list will be condensed to the actual recipe's grid size. In addition, in our 3x3 grid, the user can
|
* ingredient list will be condensed to the actual recipe's grid size. In addition, in our 3x3 grid, the user can
|
||||||
* shift the actual recipe input to the right and down.
|
* shift the actual recipe input to the right and down.
|
||||||
*/
|
*/
|
||||||
private Ingredient getRecipeIngredient(int slot) {
|
private Ingredient getRecipeIngredient( int slot )
|
||||||
|
{
|
||||||
|
|
||||||
if (standardRecipe instanceof IShapedRecipe ) {
|
if( standardRecipe instanceof IShapedRecipe )
|
||||||
|
{
|
||||||
IShapedRecipe shapedRecipe = (IShapedRecipe) standardRecipe;
|
IShapedRecipe shapedRecipe = (IShapedRecipe) standardRecipe;
|
||||||
|
|
||||||
return getShapedRecipeIngredient(slot, shapedRecipe.getRecipeWidth());
|
return getShapedRecipeIngredient( slot, shapedRecipe.getRecipeWidth() );
|
||||||
} else {
|
}
|
||||||
return getShapelessRecipeIngredient(slot);
|
else
|
||||||
|
{
|
||||||
|
return getShapelessRecipeIngredient( slot );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Ingredient getShapedRecipeIngredient(int slot, int recipeWidth) {
|
private Ingredient getShapedRecipeIngredient( int slot, int recipeWidth )
|
||||||
|
{
|
||||||
// Compute the offset of the user's input vs. crafting grid origin
|
// Compute the offset of the user's input vs. crafting grid origin
|
||||||
// Which is >0 if they have empty rows above or to the left of their input
|
// Which is >0 if they have empty rows above or to the left of their input
|
||||||
int topOffset = 0;
|
int topOffset = 0;
|
||||||
if (inputs[0] == null && inputs[1] == null && inputs[2] == null) {
|
if( inputs[0] == null && inputs[1] == null && inputs[2] == null )
|
||||||
|
{
|
||||||
topOffset++; // First row is fully empty
|
topOffset++; // First row is fully empty
|
||||||
if (inputs[3] == null && inputs[4] == null && inputs[5] == null) {
|
if( inputs[3] == null && inputs[4] == null && inputs[5] == null )
|
||||||
|
{
|
||||||
topOffset++; // Second row is fully empty
|
topOffset++; // Second row is fully empty
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int leftOffset = 0;
|
int leftOffset = 0;
|
||||||
if (inputs[0] == null && inputs[3] == null && inputs[6] == null) {
|
if( inputs[0] == null && inputs[3] == null && inputs[6] == null )
|
||||||
|
{
|
||||||
leftOffset++; // First column is fully empty
|
leftOffset++; // First column is fully empty
|
||||||
if (inputs[1] == null && inputs[4] == null && inputs[7] == null) {
|
if( inputs[1] == null && inputs[4] == null && inputs[7] == null )
|
||||||
|
{
|
||||||
leftOffset++; // Second column is fully empty
|
leftOffset++; // Second column is fully empty
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -388,27 +405,32 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable<Patter
|
|||||||
|
|
||||||
NonNullList<Ingredient> ingredients = standardRecipe.getIngredients();
|
NonNullList<Ingredient> ingredients = standardRecipe.getIngredients();
|
||||||
|
|
||||||
if (ingredientIndex < 0 || ingredientIndex > ingredients.size()) {
|
if( ingredientIndex < 0 || ingredientIndex > ingredients.size() )
|
||||||
|
{
|
||||||
return Ingredient.EMPTY;
|
return Ingredient.EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ingredients.get(ingredientIndex);
|
return ingredients.get( ingredientIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
private Ingredient getShapelessRecipeIngredient(int slot) {
|
private Ingredient getShapelessRecipeIngredient( int slot )
|
||||||
|
{
|
||||||
// We map the list of *filled* sparse inputs to the shapeless (ergo unordered)
|
// We map the list of *filled* sparse inputs to the shapeless (ergo unordered)
|
||||||
// ingredients. While these do not actually correspond to each other,
|
// ingredients. While these do not actually correspond to each other,
|
||||||
// since both lists have the same length, the mapping is at least stable.
|
// since both lists have the same length, the mapping is at least stable.
|
||||||
int ingredientIndex = 0;
|
int ingredientIndex = 0;
|
||||||
for (int i = 0; i < slot; i++) {
|
for( int i = 0; i < slot; i++ )
|
||||||
if (inputs[i] != null) {
|
{
|
||||||
|
if( inputs[i] != null )
|
||||||
|
{
|
||||||
ingredientIndex++;
|
ingredientIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NonNullList<Ingredient> ingredients = standardRecipe.getIngredients();
|
NonNullList<Ingredient> ingredients = standardRecipe.getIngredients();
|
||||||
if (ingredientIndex < ingredients.size()) {
|
if( ingredientIndex < ingredients.size() )
|
||||||
return ingredients.get(ingredientIndex);
|
{
|
||||||
|
return ingredients.get( ingredientIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ingredient.EMPTY;
|
return Ingredient.EMPTY;
|
||||||
@@ -515,7 +537,9 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable<Patter
|
|||||||
|
|
||||||
private enum TestStatus
|
private enum TestStatus
|
||||||
{
|
{
|
||||||
ACCEPT, DECLINE, TEST
|
ACCEPT,
|
||||||
|
DECLINE,
|
||||||
|
TEST
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class TestLookup
|
private static final class TestLookup
|
||||||
|
|||||||
@@ -190,10 +190,11 @@ public class TickHandler
|
|||||||
synchronized ( this.craftingJobs )
|
synchronized ( this.craftingJobs )
|
||||||
{
|
{
|
||||||
final Collection<CraftingJob> jobSet = this.craftingJobs.get( wte.world );
|
final Collection<CraftingJob> jobSet = this.craftingJobs.get( wte.world );
|
||||||
if (!jobSet.isEmpty()) {
|
if( !jobSet.isEmpty() )
|
||||||
|
{
|
||||||
final int jobSize = jobSet.size();
|
final int jobSize = jobSet.size();
|
||||||
final int microSecondsPerTick = AEConfig.instance().getCraftingCalculationTimePerTick() * 1000;
|
final int microSecondsPerTick = AEConfig.instance().getCraftingCalculationTimePerTick() * 1000;
|
||||||
final int simTime = Math.max(1, microSecondsPerTick / jobSize);
|
final int simTime = Math.max( 1, microSecondsPerTick / jobSize );
|
||||||
|
|
||||||
jobSet.removeIf( cj -> !cj.simulateFor( simTime ) );
|
jobSet.removeIf( cj -> !cj.simulateFor( simTime ) );
|
||||||
}
|
}
|
||||||
@@ -206,7 +207,7 @@ public class TickHandler
|
|||||||
this.tickColors( this.srvPlayerColors );
|
this.tickColors( this.srvPlayerColors );
|
||||||
// ready tiles.
|
// ready tiles.
|
||||||
final HandlerRep repo = this.getRepo();
|
final HandlerRep repo = this.getRepo();
|
||||||
while( !repo.tiles.isEmpty() )
|
while ( !repo.tiles.isEmpty() )
|
||||||
{
|
{
|
||||||
final AEBaseTile bt = repo.tiles.poll();
|
final AEBaseTile bt = repo.tiles.poll();
|
||||||
if( !bt.isInvalid() )
|
if( !bt.isInvalid() )
|
||||||
@@ -238,7 +239,7 @@ public class TickHandler
|
|||||||
private void tickColors( final HashMap<Integer, PlayerColor> playerSet )
|
private void tickColors( final HashMap<Integer, PlayerColor> playerSet )
|
||||||
{
|
{
|
||||||
final Iterator<PlayerColor> i = playerSet.values().iterator();
|
final Iterator<PlayerColor> i = playerSet.values().iterator();
|
||||||
while( i.hasNext() )
|
while ( i.hasNext() )
|
||||||
{
|
{
|
||||||
final PlayerColor pc = i.next();
|
final PlayerColor pc = i.next();
|
||||||
if( pc.ticksLeft <= 0 )
|
if( pc.ticksLeft <= 0 )
|
||||||
@@ -259,7 +260,7 @@ public class TickHandler
|
|||||||
final Stopwatch sw = Stopwatch.createStarted();
|
final Stopwatch sw = Stopwatch.createStarted();
|
||||||
|
|
||||||
IWorldCallable<?> c = null;
|
IWorldCallable<?> c = null;
|
||||||
while( ( c = queue.poll() ) != null )
|
while ( ( c = queue.poll() ) != null )
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -275,15 +276,11 @@ public class TickHandler
|
|||||||
AELog.debug( e );
|
AELog.debug( e );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// long time = sw.elapsed( TimeUnit.MILLISECONDS );
|
|
||||||
// if ( time > 0 )
|
|
||||||
// AELog.info( "processQueue Time: " + time + "ms" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerCraftingSimulation( final World world, final CraftingJob craftingJob )
|
public void registerCraftingSimulation( final World world, final CraftingJob craftingJob )
|
||||||
{
|
{
|
||||||
synchronized( this.craftingJobs )
|
synchronized ( this.craftingJobs )
|
||||||
{
|
{
|
||||||
this.craftingJobs.put( world, craftingJob );
|
this.craftingJobs.put( world, craftingJob );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ public enum IntegrationType
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
GTCE( IntegrationSide.BOTH, "GregTech", "gregtech" ),
|
||||||
|
|
||||||
RC( IntegrationSide.BOTH, "Railcraft", "railcraft" ),
|
RC( IntegrationSide.BOTH, "Railcraft", "railcraft" ),
|
||||||
|
|
||||||
MFR( IntegrationSide.BOTH, "Mine Factory Reloaded", "minefactoryreloaded" ),
|
MFR( IntegrationSide.BOTH, "Mine Factory Reloaded", "minefactoryreloaded" ),
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
package appeng.integration.modules.gregtech;
|
|
||||||
|
|
||||||
import appeng.util.inv.ItemSlot;
|
|
||||||
import net.minecraft.tileentity.TileEntity;
|
|
||||||
import net.minecraft.util.EnumFacing;
|
|
||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
|
||||||
import net.minecraftforge.items.IItemHandler;
|
|
||||||
|
|
||||||
public abstract class GTCEInventoryAdaptor implements Iterable<ItemSlot>
|
|
||||||
{
|
|
||||||
public static GTCEInventoryAdaptor getAdaptor(final TileEntity te, final EnumFacing d)
|
|
||||||
{
|
|
||||||
if (te != null && te.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d))
|
|
||||||
{
|
|
||||||
// Attempt getting an IItemHandler for the given side via caps
|
|
||||||
IItemHandler itemHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d);
|
|
||||||
if (itemHandler != null)
|
|
||||||
{
|
|
||||||
return new GTCEItemHandler(itemHandler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract boolean canRemoveAllExceptCircuits();
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
package appeng.integration.modules.gregtech;
|
|
||||||
|
|
||||||
import appeng.util.inv.ItemHandlerIterator;
|
|
||||||
import appeng.util.inv.ItemSlot;
|
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraftforge.items.IItemHandler;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
public class GTCEItemHandler extends GTCEInventoryAdaptor
|
|
||||||
{
|
|
||||||
ArrayList<Integer> GTCElenses = new ArrayList<>(Arrays.asList(15085,15214,15092,15111,15113,15219,15218,15243,15244,15209,15117,15206,15216,15331,15212,15213,15154,15122,15157,15190,15247));
|
|
||||||
ArrayList<Integer> GTCEmolds = new ArrayList<>(Arrays.asList(32301,32303,32304,32305,32306,32307,32308,32309,32313,32314,32315,32317,32350,32351,32352,32353,32354,32355,32356,32358,32359,32360,32361,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373));
|
|
||||||
Item smallGearExtruderShape = Item.getByNameOrId("contenttweaker:smallgearextrudershape");
|
|
||||||
Item creativePortableTankMold = Item.getByNameOrId("contenttweaker:creativeportabletankmold");
|
|
||||||
|
|
||||||
protected final IItemHandler itemHandler;
|
|
||||||
|
|
||||||
public GTCEItemHandler(IItemHandler itemHandler)
|
|
||||||
{
|
|
||||||
this.itemHandler = itemHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isBlockableItem(ItemStack stack)
|
|
||||||
{
|
|
||||||
if ( stack.getItem() == Item.getByNameOrId("gregtech:meta_item_1") ) {
|
|
||||||
int metadata = stack.getItemDamage();
|
|
||||||
if ( metadata == 32766 || GTCElenses.contains(metadata) || GTCEmolds.contains(metadata)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( stack.getItem() == smallGearExtruderShape ) return false;
|
|
||||||
if ( stack.getItem() == creativePortableTankMold) return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canRemoveAllExceptCircuits()
|
|
||||||
{
|
|
||||||
int slots = this.itemHandler.getSlots();
|
|
||||||
for ( int slot = 0; slot < slots; slot++ ) {
|
|
||||||
ItemStack is = this.itemHandler.getStackInSlot(slot);
|
|
||||||
if ( is.isEmpty() || !isBlockableItem(is) ) continue;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterator<ItemSlot> iterator()
|
|
||||||
{
|
|
||||||
return new ItemHandlerIterator( this.itemHandler );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -26,6 +26,7 @@ import java.util.List;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import appeng.client.gui.AEGuiHandler;
|
import appeng.client.gui.AEGuiHandler;
|
||||||
|
import appeng.container.implementations.ContainerExpandedProcessingPatternTerm;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
@@ -90,16 +91,13 @@ public class JEIPlugin implements IModPlugin
|
|||||||
this.registerDescriptions( definitions, registry );
|
this.registerDescriptions( definitions, registry );
|
||||||
|
|
||||||
// Allow recipe transfer from JEI to crafting and pattern terminal
|
// Allow recipe transfer from JEI to crafting and pattern terminal
|
||||||
registry.getRecipeTransferRegistry()
|
registry.getRecipeTransferRegistry().addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerCraftingTerm.class ), VanillaRecipeCategoryUid.CRAFTING );
|
||||||
.addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerCraftingTerm.class ),
|
registry.getRecipeTransferRegistry().addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerPatternTerm.class ), Constants.UNIVERSAL_RECIPE_TRANSFER_UID );
|
||||||
VanillaRecipeCategoryUid.CRAFTING );
|
registry.getRecipeTransferRegistry().addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerExpandedProcessingPatternTerm.class ), Constants.UNIVERSAL_RECIPE_TRANSFER_UID );
|
||||||
registry.getRecipeTransferRegistry()
|
|
||||||
.addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerPatternTerm.class ),
|
|
||||||
Constants.UNIVERSAL_RECIPE_TRANSFER_UID );
|
|
||||||
|
|
||||||
aeGuiHandler = new AEGuiHandler();
|
aeGuiHandler = new AEGuiHandler();
|
||||||
registry.addAdvancedGuiHandlers(aeGuiHandler);
|
registry.addAdvancedGuiHandlers( aeGuiHandler );
|
||||||
registry.addGhostIngredientHandler( aeGuiHandler.getGuiContainerClass(), aeGuiHandler);
|
registry.addGhostIngredientHandler( aeGuiHandler.getGuiContainerClass(), aeGuiHandler );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerDescriptions( IDefinitions definitions, IModRegistry registry )
|
private void registerDescriptions( IDefinitions definitions, IModRegistry registry )
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import appeng.parts.misc.*;
|
||||||
|
import appeng.parts.p2p.*;
|
||||||
|
import appeng.parts.reporting.*;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
|
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
|
||||||
@@ -57,33 +60,12 @@ import appeng.parts.automation.PartFormationPlane;
|
|||||||
import appeng.parts.automation.PartIdentityAnnihilationPlane;
|
import appeng.parts.automation.PartIdentityAnnihilationPlane;
|
||||||
import appeng.parts.automation.PartImportBus;
|
import appeng.parts.automation.PartImportBus;
|
||||||
import appeng.parts.automation.PartLevelEmitter;
|
import appeng.parts.automation.PartLevelEmitter;
|
||||||
import appeng.parts.misc.PartCableAnchor;
|
|
||||||
import appeng.parts.misc.PartInterface;
|
|
||||||
import appeng.parts.misc.PartInvertedToggleBus;
|
|
||||||
import appeng.parts.misc.PartStorageBus;
|
|
||||||
import appeng.parts.misc.PartToggleBus;
|
|
||||||
import appeng.parts.networking.PartCableCovered;
|
import appeng.parts.networking.PartCableCovered;
|
||||||
import appeng.parts.networking.PartCableGlass;
|
import appeng.parts.networking.PartCableGlass;
|
||||||
import appeng.parts.networking.PartCableSmart;
|
import appeng.parts.networking.PartCableSmart;
|
||||||
import appeng.parts.networking.PartDenseCableCovered;
|
import appeng.parts.networking.PartDenseCableCovered;
|
||||||
import appeng.parts.networking.PartDenseCableSmart;
|
import appeng.parts.networking.PartDenseCableSmart;
|
||||||
import appeng.parts.networking.PartQuartzFiber;
|
import appeng.parts.networking.PartQuartzFiber;
|
||||||
import appeng.parts.p2p.PartP2PFEPower;
|
|
||||||
import appeng.parts.p2p.PartP2PFluids;
|
|
||||||
import appeng.parts.p2p.PartP2PIC2Power;
|
|
||||||
import appeng.parts.p2p.PartP2PItems;
|
|
||||||
import appeng.parts.p2p.PartP2PLight;
|
|
||||||
import appeng.parts.p2p.PartP2PRedstone;
|
|
||||||
import appeng.parts.p2p.PartP2PTunnelME;
|
|
||||||
import appeng.parts.reporting.PartConversionMonitor;
|
|
||||||
import appeng.parts.reporting.PartCraftingTerminal;
|
|
||||||
import appeng.parts.reporting.PartDarkPanel;
|
|
||||||
import appeng.parts.reporting.PartInterfaceTerminal;
|
|
||||||
import appeng.parts.reporting.PartPanel;
|
|
||||||
import appeng.parts.reporting.PartPatternTerminal;
|
|
||||||
import appeng.parts.reporting.PartSemiDarkPanel;
|
|
||||||
import appeng.parts.reporting.PartStorageMonitor;
|
|
||||||
import appeng.parts.reporting.PartTerminal;
|
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
|
||||||
|
|
||||||
@@ -103,9 +85,7 @@ public enum PartType
|
|||||||
@SideOnly( Side.CLIENT )
|
@SideOnly( Side.CLIENT )
|
||||||
protected List<ModelResourceLocation> createItemModels( String baseName )
|
protected List<ModelResourceLocation> createItemModels( String baseName )
|
||||||
{
|
{
|
||||||
return Arrays.stream( AEColor.values() )
|
return Arrays.stream( AEColor.values() ).map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) ).collect( Collectors.toList() );
|
||||||
.map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) )
|
|
||||||
.collect( Collectors.toList() );
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -121,9 +101,7 @@ public enum PartType
|
|||||||
@SideOnly( Side.CLIENT )
|
@SideOnly( Side.CLIENT )
|
||||||
protected List<ModelResourceLocation> createItemModels( String baseName )
|
protected List<ModelResourceLocation> createItemModels( String baseName )
|
||||||
{
|
{
|
||||||
return Arrays.stream( AEColor.values() )
|
return Arrays.stream( AEColor.values() ).map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) ).collect( Collectors.toList() );
|
||||||
.map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) )
|
|
||||||
.collect( Collectors.toList() );
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -139,14 +117,11 @@ public enum PartType
|
|||||||
@SideOnly( Side.CLIENT )
|
@SideOnly( Side.CLIENT )
|
||||||
protected List<ModelResourceLocation> createItemModels( String baseName )
|
protected List<ModelResourceLocation> createItemModels( String baseName )
|
||||||
{
|
{
|
||||||
return Arrays.stream( AEColor.values() )
|
return Arrays.stream( AEColor.values() ).map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) ).collect( Collectors.toList() );
|
||||||
.map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) )
|
|
||||||
.collect( Collectors.toList() );
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
CABLE_DENSE_SMART( 60, "cable_dense_smart", EnumSet.of( AEFeature.CHANNELS, AEFeature.DENSE_CABLES ), EnumSet
|
CABLE_DENSE_SMART( 60, "cable_dense_smart", EnumSet.of( AEFeature.CHANNELS, AEFeature.DENSE_CABLES ), EnumSet.noneOf( IntegrationType.class ), PartDenseCableSmart.class )
|
||||||
.noneOf( IntegrationType.class ), PartDenseCableSmart.class )
|
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
public boolean isCable()
|
public boolean isCable()
|
||||||
@@ -158,14 +133,11 @@ public enum PartType
|
|||||||
@SideOnly( Side.CLIENT )
|
@SideOnly( Side.CLIENT )
|
||||||
protected List<ModelResourceLocation> createItemModels( String baseName )
|
protected List<ModelResourceLocation> createItemModels( String baseName )
|
||||||
{
|
{
|
||||||
return Arrays.stream( AEColor.values() )
|
return Arrays.stream( AEColor.values() ).map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) ).collect( Collectors.toList() );
|
||||||
.map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) )
|
|
||||||
.collect( Collectors.toList() );
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
CABLE_DENSE_COVERED( 500, "cable_dense_covered", EnumSet.of( AEFeature.CHANNELS, AEFeature.DENSE_CABLES ), EnumSet
|
CABLE_DENSE_COVERED( 500, "cable_dense_covered", EnumSet.of( AEFeature.CHANNELS, AEFeature.DENSE_CABLES ), EnumSet.noneOf( IntegrationType.class ), PartDenseCableCovered.class )
|
||||||
.noneOf( IntegrationType.class ), PartDenseCableCovered.class )
|
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
public boolean isCable()
|
public boolean isCable()
|
||||||
@@ -177,9 +149,7 @@ public enum PartType
|
|||||||
@SideOnly( Side.CLIENT )
|
@SideOnly( Side.CLIENT )
|
||||||
protected List<ModelResourceLocation> createItemModels( String baseName )
|
protected List<ModelResourceLocation> createItemModels( String baseName )
|
||||||
{
|
{
|
||||||
return Arrays.stream( AEColor.values() )
|
return Arrays.stream( AEColor.values() ).map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) ).collect( Collectors.toList() );
|
||||||
.map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) )
|
|
||||||
.collect( Collectors.toList() );
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -193,14 +163,13 @@ public enum PartType
|
|||||||
|
|
||||||
MONITOR( 160, "monitor", EnumSet.of( AEFeature.PANELS ), EnumSet.noneOf( IntegrationType.class ), PartPanel.class, "itemIlluminatedPanel" ),
|
MONITOR( 160, "monitor", EnumSet.of( AEFeature.PANELS ), EnumSet.noneOf( IntegrationType.class ), PartPanel.class, "itemIlluminatedPanel" ),
|
||||||
|
|
||||||
SEMI_DARK_MONITOR( 180, "semi_dark_monitor", EnumSet.of( AEFeature.PANELS ), EnumSet
|
SEMI_DARK_MONITOR( 180, "semi_dark_monitor", EnumSet.of( AEFeature.PANELS ), EnumSet.noneOf( IntegrationType.class ), PartSemiDarkPanel.class, "itemIlluminatedPanel" ),
|
||||||
.noneOf( IntegrationType.class ), PartSemiDarkPanel.class, "itemIlluminatedPanel" ),
|
|
||||||
|
|
||||||
DARK_MONITOR( 200, "dark_monitor", EnumSet.of( AEFeature.PANELS ), EnumSet.noneOf( IntegrationType.class ), PartDarkPanel.class, "itemIlluminatedPanel" ),
|
DARK_MONITOR( 200, "dark_monitor", EnumSet.of( AEFeature.PANELS ), EnumSet.noneOf( IntegrationType.class ), PartDarkPanel.class, "itemIlluminatedPanel" ),
|
||||||
|
|
||||||
STORAGE_BUS( 220, "storage_bus", EnumSet.of( AEFeature.STORAGE_BUS ), EnumSet.noneOf( IntegrationType.class ), PartStorageBus.class ),
|
STORAGE_BUS( 220, "storage_bus", EnumSet.of( AEFeature.STORAGE_BUS ), EnumSet.noneOf( IntegrationType.class ), PartStorageBus.class ),
|
||||||
FLUID_STORAGE_BUS( 221, "fluid_storage_bus", EnumSet.of( AEFeature.FLUID_STORAGE_BUS ), EnumSet
|
FLUID_STORAGE_BUS( 221, "fluid_storage_bus", EnumSet.of( AEFeature.FLUID_STORAGE_BUS ), EnumSet.noneOf( IntegrationType.class ), PartFluidStorageBus.class ),
|
||||||
.noneOf( IntegrationType.class ), PartFluidStorageBus.class ),
|
OREDICT_STORAGE_BUS( 222, "oredict_storage_bus", EnumSet.of( AEFeature.STORAGE_BUS ), EnumSet.noneOf( IntegrationType.class ), PartOreDicStorageBus.class ),
|
||||||
|
|
||||||
IMPORT_BUS( 240, "import_bus", EnumSet.of( AEFeature.IMPORT_BUS ), EnumSet.noneOf( IntegrationType.class ), PartImportBus.class ),
|
IMPORT_BUS( 240, "import_bus", EnumSet.of( AEFeature.IMPORT_BUS ), EnumSet.noneOf( IntegrationType.class ), PartImportBus.class ),
|
||||||
|
|
||||||
@@ -211,40 +180,34 @@ public enum PartType
|
|||||||
FLUID_EXPORT_BUS( 261, "fluid_export_bus", EnumSet.of( AEFeature.FLUID_EXPORT_BUS ), EnumSet.noneOf( IntegrationType.class ), PartFluidExportBus.class ),
|
FLUID_EXPORT_BUS( 261, "fluid_export_bus", EnumSet.of( AEFeature.FLUID_EXPORT_BUS ), EnumSet.noneOf( IntegrationType.class ), PartFluidExportBus.class ),
|
||||||
|
|
||||||
LEVEL_EMITTER( 280, "level_emitter", EnumSet.of( AEFeature.LEVEL_EMITTER ), EnumSet.noneOf( IntegrationType.class ), PartLevelEmitter.class ),
|
LEVEL_EMITTER( 280, "level_emitter", EnumSet.of( AEFeature.LEVEL_EMITTER ), EnumSet.noneOf( IntegrationType.class ), PartLevelEmitter.class ),
|
||||||
FLUID_LEVEL_EMITTER( 281, "fluid_level_emitter", EnumSet.of( AEFeature.FLUID_LEVEL_EMITTER ), EnumSet
|
FLUID_LEVEL_EMITTER( 281, "fluid_level_emitter", EnumSet.of( AEFeature.FLUID_LEVEL_EMITTER ), EnumSet.noneOf( IntegrationType.class ), PartFluidLevelEmitter.class ),
|
||||||
.noneOf( IntegrationType.class ), PartFluidLevelEmitter.class ),
|
|
||||||
|
|
||||||
ANNIHILATION_PLANE( 300, "annihilation_plane", EnumSet.of( AEFeature.ANNIHILATION_PLANE ), EnumSet
|
ANNIHILATION_PLANE( 300, "annihilation_plane", EnumSet.of( AEFeature.ANNIHILATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartAnnihilationPlane.class ),
|
||||||
.noneOf( IntegrationType.class ), PartAnnihilationPlane.class ),
|
|
||||||
|
|
||||||
IDENTITY_ANNIHILATION_PLANE( 301, "identity_annihilation_plane", EnumSet.of( AEFeature.ANNIHILATION_PLANE, AEFeature.IDENTITY_ANNIHILATION_PLANE ), EnumSet
|
IDENTITY_ANNIHILATION_PLANE( 301, "identity_annihilation_plane", EnumSet.of( AEFeature.ANNIHILATION_PLANE, AEFeature.IDENTITY_ANNIHILATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartIdentityAnnihilationPlane.class ),
|
||||||
.noneOf( IntegrationType.class ), PartIdentityAnnihilationPlane.class ),
|
|
||||||
|
|
||||||
FLUID_ANNIHILATION_PLANE( 302, "fluid_annihilation_plane", EnumSet.of( AEFeature.FLUID_ANNIHILATION_PLANE ), EnumSet
|
FLUID_ANNIHILATION_PLANE( 302, "fluid_annihilation_plane", EnumSet.of( AEFeature.FLUID_ANNIHILATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartFluidAnnihilationPlane.class ),
|
||||||
.noneOf( IntegrationType.class ), PartFluidAnnihilationPlane.class ),
|
|
||||||
|
|
||||||
FORMATION_PLANE( 320, "formation_plane", EnumSet.of( AEFeature.FORMATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartFormationPlane.class ),
|
FORMATION_PLANE( 320, "formation_plane", EnumSet.of( AEFeature.FORMATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartFormationPlane.class ),
|
||||||
|
|
||||||
FLUID_FORMATION_PLANE( 321, "fluid_formation_plane", EnumSet.of( AEFeature.FLUID_FORMATION_PLANE ), EnumSet
|
FLUID_FORMATION_PLANE( 321, "fluid_formation_plane", EnumSet.of( AEFeature.FLUID_FORMATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartFluidFormationPlane.class ),
|
||||||
.noneOf( IntegrationType.class ), PartFluidFormationPlane.class ),
|
|
||||||
|
|
||||||
PATTERN_TERMINAL( 340, "pattern_terminal", EnumSet.of( AEFeature.PATTERNS ), EnumSet.noneOf( IntegrationType.class ), PartPatternTerminal.class ),
|
PATTERN_TERMINAL( 340, "pattern_terminal", EnumSet.of( AEFeature.PATTERNS ), EnumSet.noneOf( IntegrationType.class ), PartPatternTerminal.class ),
|
||||||
|
|
||||||
CRAFTING_TERMINAL( 360, "crafting_terminal", EnumSet.of( AEFeature.CRAFTING_TERMINAL ), EnumSet
|
EXPANDED_PROCESSING_PATTERN_TERMINAL( 341, "expanded_processing_pattern_terminal", EnumSet.of( AEFeature.PATTERNS ), EnumSet.noneOf( IntegrationType.class ), PartExpandedProcessingPatternTerminal.class ),
|
||||||
.noneOf( IntegrationType.class ), PartCraftingTerminal.class ),
|
|
||||||
|
CRAFTING_TERMINAL( 360, "crafting_terminal", EnumSet.of( AEFeature.CRAFTING_TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartCraftingTerminal.class ),
|
||||||
|
|
||||||
TERMINAL( 380, "terminal", EnumSet.of( AEFeature.TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartTerminal.class ),
|
TERMINAL( 380, "terminal", EnumSet.of( AEFeature.TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartTerminal.class ),
|
||||||
|
|
||||||
STORAGE_MONITOR( 400, "storage_monitor", EnumSet.of( AEFeature.STORAGE_MONITOR ), EnumSet.noneOf( IntegrationType.class ), PartStorageMonitor.class ),
|
STORAGE_MONITOR( 400, "storage_monitor", EnumSet.of( AEFeature.STORAGE_MONITOR ), EnumSet.noneOf( IntegrationType.class ), PartStorageMonitor.class ),
|
||||||
|
|
||||||
CONVERSION_MONITOR( 420, "conversion_monitor", EnumSet.of( AEFeature.PART_CONVERSION_MONITOR ), EnumSet
|
CONVERSION_MONITOR( 420, "conversion_monitor", EnumSet.of( AEFeature.PART_CONVERSION_MONITOR ), EnumSet.noneOf( IntegrationType.class ), PartConversionMonitor.class ),
|
||||||
.noneOf( IntegrationType.class ), PartConversionMonitor.class ),
|
|
||||||
|
|
||||||
INTERFACE( 440, "interface", EnumSet.of( AEFeature.INTERFACE ), EnumSet.noneOf( IntegrationType.class ), PartInterface.class ),
|
INTERFACE( 440, "interface", EnumSet.of( AEFeature.INTERFACE ), EnumSet.noneOf( IntegrationType.class ), PartInterface.class ),
|
||||||
FLUID_INTERFACE( 441, "fluid_interface", EnumSet.of( AEFeature.FLUID_INTERFACE ), EnumSet.noneOf( IntegrationType.class ), PartFluidInterface.class ),
|
FLUID_INTERFACE( 441, "fluid_interface", EnumSet.of( AEFeature.FLUID_INTERFACE ), EnumSet.noneOf( IntegrationType.class ), PartFluidInterface.class ),
|
||||||
|
|
||||||
P2P_TUNNEL_ME( 460, "p2p_tunnel_me", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_ME ), EnumSet
|
P2P_TUNNEL_ME( 460, "p2p_tunnel_me", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_ME ), EnumSet.noneOf( IntegrationType.class ), PartP2PTunnelME.class, GuiText.METunnel )
|
||||||
.noneOf( IntegrationType.class ), PartP2PTunnelME.class, GuiText.METunnel )
|
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
String getUnlocalizedName()
|
String getUnlocalizedName()
|
||||||
@@ -253,8 +216,7 @@ public enum PartType
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
P2P_TUNNEL_REDSTONE( 461, "p2p_tunnel_redstone", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_REDSTONE ), EnumSet
|
P2P_TUNNEL_REDSTONE( 461, "p2p_tunnel_redstone", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_REDSTONE ), EnumSet.noneOf( IntegrationType.class ), PartP2PRedstone.class, GuiText.RedstoneTunnel )
|
||||||
.noneOf( IntegrationType.class ), PartP2PRedstone.class, GuiText.RedstoneTunnel )
|
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
String getUnlocalizedName()
|
String getUnlocalizedName()
|
||||||
@@ -263,8 +225,7 @@ public enum PartType
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
P2P_TUNNEL_ITEMS( 462, "p2p_tunnel_items", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_ITEMS ), EnumSet
|
P2P_TUNNEL_ITEMS( 462, "p2p_tunnel_items", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_ITEMS ), EnumSet.noneOf( IntegrationType.class ), PartP2PItems.class, GuiText.ItemTunnel )
|
||||||
.noneOf( IntegrationType.class ), PartP2PItems.class, GuiText.ItemTunnel )
|
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
String getUnlocalizedName()
|
String getUnlocalizedName()
|
||||||
@@ -273,8 +234,7 @@ public enum PartType
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
P2P_TUNNEL_FLUIDS( 463, "p2p_tunnel_fluids", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_FLUIDS ), EnumSet
|
P2P_TUNNEL_FLUIDS( 463, "p2p_tunnel_fluids", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_FLUIDS ), EnumSet.noneOf( IntegrationType.class ), PartP2PFluids.class, GuiText.FluidTunnel )
|
||||||
.noneOf( IntegrationType.class ), PartP2PFluids.class, GuiText.FluidTunnel )
|
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
String getUnlocalizedName()
|
String getUnlocalizedName()
|
||||||
@@ -283,8 +243,7 @@ public enum PartType
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
P2P_TUNNEL_IC2( 465, "p2p_tunnel_ic2", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_EU ), EnumSet
|
P2P_TUNNEL_IC2( 465, "p2p_tunnel_ic2", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_EU ), EnumSet.of( IntegrationType.IC2 ), PartP2PIC2Power.class, GuiText.EUTunnel )
|
||||||
.of( IntegrationType.IC2 ), PartP2PIC2Power.class, GuiText.EUTunnel )
|
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
String getUnlocalizedName()
|
String getUnlocalizedName()
|
||||||
@@ -293,8 +252,7 @@ public enum PartType
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
P2P_TUNNEL_LIGHT( 467, "p2p_tunnel_light", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_LIGHT ), EnumSet
|
P2P_TUNNEL_LIGHT( 467, "p2p_tunnel_light", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_LIGHT ), EnumSet.noneOf( IntegrationType.class ), PartP2PLight.class, GuiText.LightTunnel )
|
||||||
.noneOf( IntegrationType.class ), PartP2PLight.class, GuiText.LightTunnel )
|
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
String getUnlocalizedName()
|
String getUnlocalizedName()
|
||||||
@@ -303,8 +261,16 @@ public enum PartType
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
P2P_TUNNEL_FE( 469, "p2p_tunnel_fe", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_FE ), EnumSet
|
P2P_TUNNEL_FE( 469, "p2p_tunnel_fe", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_FE ), EnumSet.noneOf( IntegrationType.class ), PartP2PFEPower.class, GuiText.FETunnel )
|
||||||
.noneOf( IntegrationType.class ), PartP2PFEPower.class, GuiText.FETunnel )
|
{
|
||||||
|
@Override
|
||||||
|
String getUnlocalizedName()
|
||||||
|
{
|
||||||
|
return "p2p_tunnel";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
P2P_TUNNEL_GTEU( 470, "p2p_tunnel_gteu", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_GTEU ), EnumSet.of( IntegrationType.GTCE ), PartP2PGTCEPower.class, GuiText.GTEUTunnel )
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
String getUnlocalizedName()
|
String getUnlocalizedName()
|
||||||
@@ -316,8 +282,7 @@ public enum PartType
|
|||||||
// P2PTunnelOpenComputers( 468, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelOpenComputers ), EnumSet.of(
|
// P2PTunnelOpenComputers( 468, EnumSet.of( AEFeature.P2PTunnel, AEFeature.P2PTunnelOpenComputers ), EnumSet.of(
|
||||||
// IntegrationType.OpenComputers ), PartP2POpenComputers.class, GuiText.OCTunnel ),
|
// IntegrationType.OpenComputers ), PartP2POpenComputers.class, GuiText.OCTunnel ),
|
||||||
|
|
||||||
INTERFACE_TERMINAL( 480, "interface_terminal", EnumSet.of( AEFeature.INTERFACE_TERMINAL ), EnumSet
|
INTERFACE_TERMINAL( 480, "interface_terminal", EnumSet.of( AEFeature.INTERFACE_TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartInterfaceTerminal.class ),
|
||||||
.noneOf( IntegrationType.class ), PartInterfaceTerminal.class ),
|
|
||||||
|
|
||||||
FLUID_TERMINAL( 520, "fluid_terminal", EnumSet.of( AEFeature.FLUID_TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartFluidTerminal.class );
|
FLUID_TERMINAL( 520, "fluid_terminal", EnumSet.of( AEFeature.FLUID_TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartFluidTerminal.class );
|
||||||
|
|
||||||
@@ -358,8 +323,7 @@ public enum PartType
|
|||||||
this.oreName = oreDict;
|
this.oreName = oreDict;
|
||||||
|
|
||||||
// The part is enabled if all features + integrations it needs are enabled
|
// The part is enabled if all features + integrations it needs are enabled
|
||||||
this.enabled = features.stream().allMatch( AEConfig.instance()::isFeatureEnabled ) && integrations.stream()
|
this.enabled = features.stream().allMatch( AEConfig.instance()::isFeatureEnabled ) && integrations.stream().allMatch( IntegrationRegistry.INSTANCE::isEnabled );
|
||||||
.allMatch( IntegrationRegistry.INSTANCE::isEnabled );
|
|
||||||
|
|
||||||
if( this.enabled )
|
if( this.enabled )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,12 +19,8 @@
|
|||||||
package appeng.me;
|
package appeng.me;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
import appeng.api.networking.IGrid;
|
import appeng.api.networking.IGrid;
|
||||||
@@ -220,9 +216,7 @@ public class Grid implements IGrid
|
|||||||
@Override
|
@Override
|
||||||
public MENetworkEvent postEvent( final MENetworkEvent ev )
|
public MENetworkEvent postEvent( final MENetworkEvent ev )
|
||||||
{
|
{
|
||||||
CraftingGridCache.pauseRebuilds();
|
|
||||||
final MENetworkEvent ret = this.eventBus.postEvent( this, ev );
|
final MENetworkEvent ret = this.eventBus.postEvent( this, ev );
|
||||||
CraftingGridCache.unpauseRebuilds();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,12 +59,13 @@ import appeng.me.cache.CraftingGridCache;
|
|||||||
import appeng.me.pathfinding.IPathItem;
|
import appeng.me.pathfinding.IPathItem;
|
||||||
import appeng.util.IWorldCallable;
|
import appeng.util.IWorldCallable;
|
||||||
import appeng.util.ReadOnlyCollection;
|
import appeng.util.ReadOnlyCollection;
|
||||||
|
import net.minecraftforge.common.util.Constants;
|
||||||
|
|
||||||
|
|
||||||
public class GridNode implements IGridNode, IPathItem
|
public class GridNode implements IGridNode, IPathItem
|
||||||
{
|
{
|
||||||
private static final MENetworkChannelsChanged EVENT = new MENetworkChannelsChanged();
|
private static final MENetworkChannelsChanged EVENT = new MENetworkChannelsChanged();
|
||||||
private static final int[] CHANNEL_COUNT = { 0, 8, 32 };
|
private static final int[] CHANNEL_COUNT = {0, 8, 32};
|
||||||
|
|
||||||
private final List<IGridConnection> connections = new ArrayList<>();
|
private final List<IGridConnection> connections = new ArrayList<>();
|
||||||
private final IGridBlock gridProxy;
|
private final IGridBlock gridProxy;
|
||||||
@@ -165,8 +166,6 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
{
|
{
|
||||||
final Object tracker = new Object();
|
final Object tracker = new Object();
|
||||||
|
|
||||||
CraftingGridCache.pauseRebuilds();
|
|
||||||
|
|
||||||
Deque<GridNode> nextRun = new ArrayDeque<>();
|
Deque<GridNode> nextRun = new ArrayDeque<>();
|
||||||
nextRun.add( this );
|
nextRun.add( this );
|
||||||
|
|
||||||
@@ -177,9 +176,9 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
final Deque<IGridConnection> nextConn = new ArrayDeque<>();
|
final Deque<IGridConnection> nextConn = new ArrayDeque<>();
|
||||||
final IGridConnectionVisitor gcv = (IGridConnectionVisitor) g;
|
final IGridConnectionVisitor gcv = (IGridConnectionVisitor) g;
|
||||||
|
|
||||||
while( !nextRun.isEmpty() )
|
while ( !nextRun.isEmpty() )
|
||||||
{
|
{
|
||||||
while( !nextConn.isEmpty() )
|
while ( !nextConn.isEmpty() )
|
||||||
{
|
{
|
||||||
gcv.visitConnection( nextConn.poll() );
|
gcv.visitConnection( nextConn.poll() );
|
||||||
}
|
}
|
||||||
@@ -195,7 +194,7 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while( !nextRun.isEmpty() )
|
while ( !nextRun.isEmpty() )
|
||||||
{
|
{
|
||||||
final Iterable<GridNode> thisRun = nextRun;
|
final Iterable<GridNode> thisRun = nextRun;
|
||||||
nextRun = new ArrayDeque<>();
|
nextRun = new ArrayDeque<>();
|
||||||
@@ -206,7 +205,6 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CraftingGridCache.unpauseRebuilds();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -268,7 +266,7 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
@Override
|
@Override
|
||||||
public void destroy()
|
public void destroy()
|
||||||
{
|
{
|
||||||
while( !this.connections.isEmpty() )
|
while ( !this.connections.isEmpty() )
|
||||||
{
|
{
|
||||||
// not part of this network for real anymore.
|
// not part of this network for real anymore.
|
||||||
if( this.connections.size() == 1 )
|
if( this.connections.size() == 1 )
|
||||||
@@ -333,7 +331,11 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
@Override
|
@Override
|
||||||
public void loadFromNBT( final String name, final NBTTagCompound nodeData )
|
public void loadFromNBT( final String name, final NBTTagCompound nodeData )
|
||||||
{
|
{
|
||||||
if( this.myGrid == null )
|
if( this.myGrid != null )
|
||||||
|
{
|
||||||
|
throw new IllegalStateException( "Loading data after part of a grid, this is invalid." );
|
||||||
|
}
|
||||||
|
if( nodeData.hasKey( name, 10 ) )
|
||||||
{
|
{
|
||||||
final NBTTagCompound node = nodeData.getCompoundTag( name );
|
final NBTTagCompound node = nodeData.getCompoundTag( name );
|
||||||
this.playerID = node.getInteger( "p" );
|
this.playerID = node.getInteger( "p" );
|
||||||
@@ -345,7 +347,9 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new IllegalStateException( "Loading data after part of a grid, this is invalid." );
|
this.playerID = -1; // Unknown owner
|
||||||
|
setLastSecurityKey( -1 );
|
||||||
|
setGridStorage( null );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -371,7 +375,7 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
@Override
|
@Override
|
||||||
public boolean meetsChannelRequirements()
|
public boolean meetsChannelRequirements()
|
||||||
{
|
{
|
||||||
return( !this.gridProxy.getFlags().contains( GridFlags.REQUIRE_CHANNEL ) || this.getUsedChannels() > 0 );
|
return ( !this.gridProxy.getFlags().contains( GridFlags.REQUIRE_CHANNEL ) || this.getUsedChannels() > 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+33
-62
@@ -113,9 +113,9 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
private final GenericInterestManager<CraftingWatcher> interestManager = new GenericInterestManager<>( this.interests );
|
private final GenericInterestManager<CraftingWatcher> interestManager = new GenericInterestManager<>( this.interests );
|
||||||
private IStorageGrid storageGrid;
|
private IStorageGrid storageGrid;
|
||||||
private IEnergyGrid energyGrid;
|
private IEnergyGrid energyGrid;
|
||||||
|
int i;
|
||||||
private boolean updateList = false;
|
private boolean updateList = false;
|
||||||
private static int pauseRebuilds = 0;
|
private boolean updatePatterns = false;
|
||||||
private static Set<CraftingGridCache> rebuildNeeded = new HashSet<>();
|
|
||||||
|
|
||||||
public CraftingGridCache( final IGrid grid )
|
public CraftingGridCache( final IGrid grid )
|
||||||
{
|
{
|
||||||
@@ -140,8 +140,14 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
this.updateCPUClusters();
|
this.updateCPUClusters();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( updatePatterns )
|
||||||
|
{
|
||||||
|
this.recalculateCraftingPatterns();
|
||||||
|
this.updatePatterns = false;
|
||||||
|
}
|
||||||
|
|
||||||
final Iterator<CraftingLinkNexus> craftingLinkIterator = this.craftingLinks.values().iterator();
|
final Iterator<CraftingLinkNexus> craftingLinkIterator = this.craftingLinks.values().iterator();
|
||||||
while( craftingLinkIterator.hasNext() )
|
while ( craftingLinkIterator.hasNext() )
|
||||||
{
|
{
|
||||||
if( craftingLinkIterator.next().isDead( this.grid, this ) )
|
if( craftingLinkIterator.next().isDead( this.grid, this ) )
|
||||||
{
|
{
|
||||||
@@ -187,7 +193,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
if( machine instanceof ICraftingProvider )
|
if( machine instanceof ICraftingProvider )
|
||||||
{
|
{
|
||||||
this.craftingProviders.remove( machine );
|
this.craftingProviders.remove( machine );
|
||||||
this.updatePatterns();
|
this.updatePatterns = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,7 +227,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
if( machine instanceof ICraftingProvider )
|
if( machine instanceof ICraftingProvider )
|
||||||
{
|
{
|
||||||
this.craftingProviders.add( (ICraftingProvider) machine );
|
this.craftingProviders.add( (ICraftingProvider) machine );
|
||||||
this.updatePatterns();
|
this.updatePatterns = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,36 +248,15 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
// nothing!
|
// nothing!
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void pauseRebuilds()
|
|
||||||
{
|
|
||||||
pauseRebuilds++;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void unpauseRebuilds()
|
|
||||||
{
|
|
||||||
pauseRebuilds--;
|
|
||||||
if (pauseRebuilds == 0 && rebuildNeeded.size() > 0)
|
|
||||||
{
|
|
||||||
ImmutableSet<CraftingGridCache> needed = ImmutableSet.copyOf(rebuildNeeded);
|
|
||||||
rebuildNeeded.clear();
|
|
||||||
for ( CraftingGridCache cache: needed )
|
|
||||||
{
|
|
||||||
cache.updatePatterns();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updatePatterns()
|
private void updatePatterns()
|
||||||
{
|
{
|
||||||
// coalesce change events during a grid traversal to a single rebuild
|
this.updatePatterns = true;
|
||||||
if (pauseRebuilds != 0)
|
|
||||||
{
|
|
||||||
rebuildNeeded.add(this);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final Object2ObjectMap<IAEItemStack, ImmutableList<ICraftingPatternDetails>> oldItems = new Object2ObjectOpenHashMap<>(this.craftableItems);
|
private void recalculateCraftingPatterns()
|
||||||
final Set<IAEItemStack> oldEmitableItems = new HashSet<>(this.emitableItems);
|
{
|
||||||
|
final Object2ObjectMap<IAEItemStack, ImmutableList<ICraftingPatternDetails>> oldItems = new Object2ObjectOpenHashMap<>( this.craftableItems );
|
||||||
|
final Set<IAEItemStack> oldEmitableItems = new HashSet<>( this.emitableItems );
|
||||||
|
|
||||||
// erase list.
|
// erase list.
|
||||||
this.craftingMethods.clear();
|
this.craftingMethods.clear();
|
||||||
@@ -312,25 +297,29 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
this.craftableItems.put( e.getKey(), ImmutableList.copyOf( e.getValue() ) );
|
this.craftableItems.put( e.getKey(), ImmutableList.copyOf( e.getValue() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
Object2ObjectMap<IAEItemStack, ImmutableList<ICraftingPatternDetails>> craftablesChanged = new Object2ObjectArrayMap<>();
|
List<IAEItemStack> craftablesChanged = new ArrayList<>();
|
||||||
|
|
||||||
ObjectSet<Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>>> i = oldItems.entrySet();
|
ObjectSet<Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>>> i = oldItems.entrySet();
|
||||||
for ( Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>> ais : i) {
|
for( Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>> ais : i )
|
||||||
if (!this.craftableItems.containsKey( ais.getKey() )) {
|
{
|
||||||
|
if( !this.craftableItems.containsKey( ais.getKey() ) )
|
||||||
|
{
|
||||||
IAEItemStack changedStack = ais.getKey().copy();
|
IAEItemStack changedStack = ais.getKey().copy();
|
||||||
changedStack.reset();
|
changedStack.reset();
|
||||||
changedStack.setCraftable( false );
|
changedStack.setCraftable( false );
|
||||||
craftablesChanged.put( changedStack, ais.getValue() );
|
craftablesChanged.add( changedStack );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectSet<Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>>> j = this.craftableItems.entrySet();
|
ObjectSet<Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>>> j = this.craftableItems.entrySet();
|
||||||
for ( Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>> ais : j) {
|
for( Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>> ais : j )
|
||||||
if (!oldItems.containsKey( ais )){
|
{
|
||||||
|
if( !oldItems.containsKey( ais ) )
|
||||||
|
{
|
||||||
IAEItemStack changedStack = ais.getKey().copy();
|
IAEItemStack changedStack = ais.getKey().copy();
|
||||||
changedStack.reset();
|
changedStack.reset();
|
||||||
changedStack.setCraftable( true );
|
changedStack.setCraftable( true );
|
||||||
craftablesChanged.put( changedStack, ais.getValue() );
|
craftablesChanged.add( changedStack );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -341,7 +330,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
IAEItemStack changedStack = st.copy();
|
IAEItemStack changedStack = st.copy();
|
||||||
changedStack.reset();
|
changedStack.reset();
|
||||||
changedStack.setCraftable( false );
|
changedStack.setCraftable( false );
|
||||||
craftablesChanged.put( changedStack, null );
|
craftablesChanged.add( changedStack );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -352,12 +341,11 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
IAEItemStack changedStack = st.copy();
|
IAEItemStack changedStack = st.copy();
|
||||||
changedStack.reset();
|
changedStack.reset();
|
||||||
changedStack.setCraftable( true );
|
changedStack.setCraftable( true );
|
||||||
craftablesChanged.put( changedStack, null );
|
craftablesChanged.add( changedStack );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.storageGrid.postCraftablesChanges( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ), craftablesChanged.keySet(),
|
this.storageGrid.postCraftablesChanges( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ), craftablesChanged, new BaseActionSource() );
|
||||||
new BaseActionSource() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateCPUClusters()
|
private void updateCPUClusters()
|
||||||
@@ -535,22 +523,6 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
|
|
||||||
if( res == null )
|
if( res == null )
|
||||||
{
|
{
|
||||||
if( details != null && details.isCraftable() )
|
|
||||||
{
|
|
||||||
for( final IAEItemStack ais : this.craftableItems.keySet() )
|
|
||||||
{
|
|
||||||
if( ais.getItem() == whatToCraft.getItem() && ( !ais.getItem().getHasSubtypes() || ais.getItemDamage() == whatToCraft.getItemDamage() ) )
|
|
||||||
{
|
|
||||||
// TODO: check if OK
|
|
||||||
// TODO: this is slightly hacky, but fine as long as we only deal with itemstacks
|
|
||||||
if( details.isValidItemForSlot( slotIndex, ais.asItemStackRepresentation(), world ) )
|
|
||||||
{
|
|
||||||
return this.craftableItems.get( ais );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ImmutableSet.of();
|
return ImmutableSet.of();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -596,8 +568,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Collections.sort( validCpusClusters, ( firstCluster, nextCluster ) ->
|
Collections.sort( validCpusClusters, ( firstCluster, nextCluster ) -> {
|
||||||
{
|
|
||||||
if( prioritizePower )
|
if( prioritizePower )
|
||||||
{
|
{
|
||||||
final int comparison1 = Long.compare( nextCluster.getCoProcessors(), firstCluster.getCoProcessors() );
|
final int comparison1 = Long.compare( nextCluster.getCoProcessors(), firstCluster.getCoProcessors() );
|
||||||
@@ -676,7 +647,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
|
|
||||||
public boolean hasCpu( final ICraftingCPU cpu )
|
public boolean hasCpu( final ICraftingCPU cpu )
|
||||||
{
|
{
|
||||||
if (cpu instanceof CraftingCPUCluster)
|
if( cpu instanceof CraftingCPUCluster )
|
||||||
{
|
{
|
||||||
return this.craftingCPUClusters.contains( (CraftingCPUCluster) cpu );
|
return this.craftingCPUClusters.contains( (CraftingCPUCluster) cpu );
|
||||||
}
|
}
|
||||||
@@ -710,7 +681,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
|||||||
|
|
||||||
private void findNext()
|
private void findNext()
|
||||||
{
|
{
|
||||||
while( this.iterator.hasNext() && this.cpuCluster == null )
|
while ( this.iterator.hasNext() && this.cpuCluster == null )
|
||||||
{
|
{
|
||||||
this.cpuCluster = this.iterator.next();
|
this.cpuCluster = this.iterator.next();
|
||||||
if( !this.cpuCluster.isActive() || this.cpuCluster.isDestroyed() )
|
if( !this.cpuCluster.isActive() || this.cpuCluster.isDestroyed() )
|
||||||
|
|||||||
+46
-14
@@ -19,13 +19,12 @@
|
|||||||
package appeng.me.cache;
|
package appeng.me.cache;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.IdentityHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
|
import appeng.crafting.MECraftingInventory;
|
||||||
|
import appeng.helpers.IInterfaceHost;
|
||||||
|
import appeng.helpers.IPriorityHost;
|
||||||
import com.google.common.collect.HashMultimap;
|
import com.google.common.collect.HashMultimap;
|
||||||
import com.google.common.collect.SetMultimap;
|
import com.google.common.collect.SetMultimap;
|
||||||
|
|
||||||
@@ -55,6 +54,8 @@ import appeng.me.helpers.GenericInterestManager;
|
|||||||
import appeng.me.helpers.MachineSource;
|
import appeng.me.helpers.MachineSource;
|
||||||
import appeng.me.storage.ItemWatcher;
|
import appeng.me.storage.ItemWatcher;
|
||||||
import appeng.me.storage.NetworkInventoryHandler;
|
import appeng.me.storage.NetworkInventoryHandler;
|
||||||
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||||
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
|
|
||||||
|
|
||||||
public class GridStorageCache implements IStorageGrid
|
public class GridStorageCache implements IStorageGrid
|
||||||
@@ -66,8 +67,11 @@ public class GridStorageCache implements IStorageGrid
|
|||||||
private final SetMultimap<IAEStack, ItemWatcher> interests = HashMultimap.create();
|
private final SetMultimap<IAEStack, ItemWatcher> interests = HashMultimap.create();
|
||||||
private final GenericInterestManager<ItemWatcher> interestManager = new GenericInterestManager<>( this.interests );
|
private final GenericInterestManager<ItemWatcher> interestManager = new GenericInterestManager<>( this.interests );
|
||||||
private final HashMap<IGridNode, IStackWatcher> watchers = new HashMap<>();
|
private final HashMap<IGridNode, IStackWatcher> watchers = new HashMap<>();
|
||||||
private Map<IStorageChannel<? extends IAEStack>, NetworkInventoryHandler<?>> storageNetworks;
|
private final Map<IStorageChannel<? extends IAEStack>, NetworkInventoryHandler<?>> storageNetworks;
|
||||||
private Map<IStorageChannel<? extends IAEStack>, NetworkMonitor<?>> storageMonitors;
|
private final Map<IStorageChannel<? extends IAEStack>, NetworkMonitor<?>> storageMonitors;
|
||||||
|
private MECraftingInventory localCache = null;
|
||||||
|
private final Int2ObjectMap<MECraftingInventory> extractableItemPriorityMap = new Int2ObjectOpenHashMap<>();
|
||||||
|
private int localDepth;
|
||||||
|
|
||||||
public GridStorageCache( final IGrid g )
|
public GridStorageCache( final IGrid g )
|
||||||
{
|
{
|
||||||
@@ -81,6 +85,8 @@ public class GridStorageCache implements IStorageGrid
|
|||||||
@Override
|
@Override
|
||||||
public void onUpdateTick()
|
public void onUpdateTick()
|
||||||
{
|
{
|
||||||
|
this.localCache = null;
|
||||||
|
this.extractableItemPriorityMap.clear();
|
||||||
this.storageMonitors.forEach( ( channel, monitor ) -> monitor.onTick() );
|
this.storageMonitors.forEach( ( channel, monitor ) -> monitor.onTick() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,17 +174,38 @@ public class GridStorageCache implements IStorageGrid
|
|||||||
return (IMEMonitor<T>) this.storageMonitors.get( channel );
|
return (IMEMonitor<T>) this.storageMonitors.get( channel );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MECraftingInventory getExtractableList( IActionSource src )
|
||||||
|
{
|
||||||
|
if( src instanceof MachineSource )
|
||||||
|
{
|
||||||
|
if( src.machine().isPresent() )
|
||||||
|
{
|
||||||
|
IActionHost machine = src.machine().get();
|
||||||
|
if( machine instanceof IInterfaceHost )
|
||||||
|
{
|
||||||
|
extractableItemPriorityMap.putIfAbsent( ( (IPriorityHost) machine ).getPriority(), new MECraftingInventory( getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ), src, false, false, false ) );
|
||||||
|
return extractableItemPriorityMap.get( ( (IPriorityHost) machine ).getPriority() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( localCache == null )
|
||||||
|
{
|
||||||
|
localCache = new MECraftingInventory( getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ), src, false, false, false );
|
||||||
|
}
|
||||||
|
return localCache;
|
||||||
|
}
|
||||||
|
|
||||||
private CellChangeTracker addCellProvider( final ICellProvider cc, final CellChangeTracker tracker )
|
private CellChangeTracker addCellProvider( final ICellProvider cc, final CellChangeTracker tracker )
|
||||||
{
|
{
|
||||||
if( this.inactiveCellProviders.contains( cc ) && !this.activeCellProviders.contains( cc ))
|
if( this.inactiveCellProviders.contains( cc ) )
|
||||||
{
|
{
|
||||||
this.inactiveCellProviders.remove( cc );
|
this.inactiveCellProviders.remove( cc );
|
||||||
this.activeCellProviders.add( cc );
|
this.activeCellProviders.add( cc );
|
||||||
|
|
||||||
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource( (IActionHost) cc ) : new BaseActionSource();
|
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource( (IActionHost) cc ) : new BaseActionSource();
|
||||||
|
|
||||||
this.storageMonitors.forEach( ( channel, monitor ) ->
|
this.storageMonitors.forEach( ( channel, monitor ) -> {
|
||||||
{
|
|
||||||
for( final IMEInventoryHandler<?> h : cc.getCellArray( channel ) )
|
for( final IMEInventoryHandler<?> h : cc.getCellArray( channel ) )
|
||||||
{
|
{
|
||||||
tracker.postChanges( channel, 1, h, actionSrc );
|
tracker.postChanges( channel, 1, h, actionSrc );
|
||||||
@@ -198,8 +225,7 @@ public class GridStorageCache implements IStorageGrid
|
|||||||
|
|
||||||
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource( (IActionHost) cc ) : new BaseActionSource();
|
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource( (IActionHost) cc ) : new BaseActionSource();
|
||||||
|
|
||||||
this.storageMonitors.forEach( ( channel, monitor ) ->
|
this.storageMonitors.forEach( ( channel, monitor ) -> {
|
||||||
{
|
|
||||||
for( final IMEInventoryHandler<IAEItemStack> h : cc.getCellArray( channel ) )
|
for( final IMEInventoryHandler<IAEItemStack> h : cc.getCellArray( channel ) )
|
||||||
{
|
{
|
||||||
tracker.postChanges( channel, -1, h, actionSrc );
|
tracker.postChanges( channel, -1, h, actionSrc );
|
||||||
@@ -213,6 +239,11 @@ public class GridStorageCache implements IStorageGrid
|
|||||||
@MENetworkEventSubscribe
|
@MENetworkEventSubscribe
|
||||||
public void cellUpdate( final MENetworkCellArrayUpdate ev )
|
public void cellUpdate( final MENetworkCellArrayUpdate ev )
|
||||||
{
|
{
|
||||||
|
if( localDepth > 0 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
localDepth++;
|
||||||
this.storageNetworks.clear();
|
this.storageNetworks.clear();
|
||||||
|
|
||||||
final List<ICellProvider> ll = new ArrayList<ICellProvider>();
|
final List<ICellProvider> ll = new ArrayList<ICellProvider>();
|
||||||
@@ -247,8 +278,9 @@ public class GridStorageCache implements IStorageGrid
|
|||||||
this.removeCellProvider( cc, tracker );
|
this.removeCellProvider( cc, tracker );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tracker.applyChanges();
|
tracker.applyChanges();
|
||||||
|
localDepth--;
|
||||||
|
this.storageMonitors.forEach( ( channel, monitor ) -> monitor.setForceUpdate( true ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T extends IAEStack<T>, C extends IStorageChannel<T>> void postChangesToNetwork( final C chan, final int upOrDown, final IItemList<T> availableItems, final IActionSource src )
|
private <T extends IAEStack<T>, C extends IStorageChannel<T>> void postChangesToNetwork( final C chan, final int upOrDown, final IItemList<T> availableItems, final IActionSource src )
|
||||||
|
|||||||
+25
-31
@@ -19,7 +19,6 @@
|
|||||||
package appeng.me.cache;
|
package appeng.me.cache;
|
||||||
|
|
||||||
|
|
||||||
import javax.annotation.Nonnegative;
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
@@ -36,7 +35,6 @@ import appeng.api.storage.channels.IItemStorageChannel;
|
|||||||
import appeng.api.storage.data.IAEStack;
|
import appeng.api.storage.data.IAEStack;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
import appeng.me.storage.ItemWatcher;
|
import appeng.me.storage.ItemWatcher;
|
||||||
import com.google.common.collect.Queues;
|
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
|
|
||||||
@@ -47,9 +45,10 @@ import java.util.Map.Entry;
|
|||||||
public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
||||||
{
|
{
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private static final Set<NetworkMonitor<?>> NESTED_MONITORS = new HashSet<>();
|
private static final HashMap<IActionSource, LinkedList<NetworkMonitor<?>>> src2MonitorsMap = new HashMap<>();
|
||||||
private static final HashMap<IActionSource, Set<NetworkMonitor<?>>> sourceSetHashMap = new HashMap<>();
|
private static final Set<IActionSource> nestingSources = new HashSet<>();
|
||||||
protected static boolean nested = false;
|
|
||||||
|
protected boolean wasNested = false;
|
||||||
protected boolean isNested = false;
|
protected boolean isNested = false;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@@ -62,11 +61,9 @@ public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
|||||||
private final Object2ObjectMap<IMEMonitorHandlerReceiver<T>, Object> listeners;
|
private final Object2ObjectMap<IMEMonitorHandlerReceiver<T>, Object> listeners;
|
||||||
|
|
||||||
private boolean sendEvent = false;
|
private boolean sendEvent = false;
|
||||||
private boolean forceUpdate = false;
|
|
||||||
@Nonnegative
|
|
||||||
private int localDepthSemaphore = 0;
|
|
||||||
private long gridItemCount;
|
private long gridItemCount;
|
||||||
private long gridFluidCount;
|
private long gridFluidCount;
|
||||||
|
public boolean forceUpdate;
|
||||||
|
|
||||||
public NetworkMonitor( final GridStorageCache cache, final IStorageChannel<T> chan )
|
public NetworkMonitor( final GridStorageCache cache, final IStorageChannel<T> chan )
|
||||||
{
|
{
|
||||||
@@ -229,16 +226,13 @@ public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
|||||||
|
|
||||||
protected void postChange( final boolean add, final Iterable<T> changes, final IActionSource src )
|
protected void postChange( final boolean add, final Iterable<T> changes, final IActionSource src )
|
||||||
{
|
{
|
||||||
|
src2MonitorsMap.putIfAbsent( src, new LinkedList<>() );
|
||||||
if( sourceSetHashMap.get( src ) != null && sourceSetHashMap.get( src ).contains( this ) )
|
if( src2MonitorsMap.get( src ).contains( this ) )
|
||||||
{
|
{
|
||||||
NESTED_MONITORS.add( this );
|
nestingSources.add( src );
|
||||||
nested = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
src2MonitorsMap.get( src ).add( this );
|
||||||
sourceSetHashMap.putIfAbsent( src, new HashSet<>() );
|
|
||||||
sourceSetHashMap.get( src ).add( this );
|
|
||||||
|
|
||||||
this.sendEvent = true;
|
this.sendEvent = true;
|
||||||
|
|
||||||
@@ -282,30 +276,26 @@ public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
|||||||
|
|
||||||
this.notifyListenersOfChange( changes, src );
|
this.notifyListenersOfChange( changes, src );
|
||||||
|
|
||||||
sourceSetHashMap.get( src ).remove( this );
|
if( src2MonitorsMap.get( src ).getFirst() == this )
|
||||||
if( sourceSetHashMap.get( src ).isEmpty() )
|
|
||||||
{
|
{
|
||||||
sourceSetHashMap.remove( src );
|
boolean nested = nestingSources.contains( src );
|
||||||
}
|
src2MonitorsMap.get( src ).forEach( networkMonitor -> networkMonitor.isNested = nested );
|
||||||
|
|
||||||
if( sourceSetHashMap.isEmpty() )
|
src2MonitorsMap.get( src ).forEach( networkMonitor -> {
|
||||||
|
if( networkMonitor.isNested != networkMonitor.wasNested )
|
||||||
{
|
{
|
||||||
for( NetworkMonitor<?> nm : NESTED_MONITORS )
|
networkMonitor.wasNested = networkMonitor.isNested;
|
||||||
{
|
networkMonitor.setForceUpdate( true );
|
||||||
nm.setupForceUpdate();
|
|
||||||
}
|
}
|
||||||
nested = false;
|
} );
|
||||||
NESTED_MONITORS.clear();
|
src2MonitorsMap.remove( src );
|
||||||
|
nestingSources.remove( src );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupForceUpdate()
|
public void setForceUpdate( boolean forceUpdate )
|
||||||
{
|
{
|
||||||
if( nested != isNested )
|
this.forceUpdate = forceUpdate;
|
||||||
{
|
|
||||||
isNested = nested;
|
|
||||||
forceUpdate();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void forceUpdate()
|
void forceUpdate()
|
||||||
@@ -373,6 +363,10 @@ public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
|||||||
|
|
||||||
void onTick()
|
void onTick()
|
||||||
{
|
{
|
||||||
|
if( forceUpdate )
|
||||||
|
{
|
||||||
|
forceUpdate();
|
||||||
|
}
|
||||||
if( this.sendEvent )
|
if( this.sendEvent )
|
||||||
{
|
{
|
||||||
this.sendEvent = false;
|
this.sendEvent = false;
|
||||||
|
|||||||
@@ -19,21 +19,6 @@
|
|||||||
package appeng.me.cluster.implementations;
|
package appeng.me.cluster.implementations;
|
||||||
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import appeng.api.config.Upgrades;
|
|
||||||
import appeng.helpers.DualityInterface;
|
|
||||||
import com.google.common.base.Preconditions;
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
|
|
||||||
import net.minecraft.inventory.InventoryCrafting;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
|
||||||
import net.minecraft.nbt.NBTTagList;
|
|
||||||
import net.minecraft.world.World;
|
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
import appeng.api.config.FuzzyMode;
|
import appeng.api.config.FuzzyMode;
|
||||||
@@ -42,14 +27,7 @@ import appeng.api.implementations.ICraftingPatternItem;
|
|||||||
import appeng.api.networking.IGrid;
|
import appeng.api.networking.IGrid;
|
||||||
import appeng.api.networking.IGridHost;
|
import appeng.api.networking.IGridHost;
|
||||||
import appeng.api.networking.IGridNode;
|
import appeng.api.networking.IGridNode;
|
||||||
import appeng.api.networking.crafting.CraftingItemList;
|
import appeng.api.networking.crafting.*;
|
||||||
import appeng.api.networking.crafting.ICraftingCPU;
|
|
||||||
import appeng.api.networking.crafting.ICraftingGrid;
|
|
||||||
import appeng.api.networking.crafting.ICraftingJob;
|
|
||||||
import appeng.api.networking.crafting.ICraftingLink;
|
|
||||||
import appeng.api.networking.crafting.ICraftingMedium;
|
|
||||||
import appeng.api.networking.crafting.ICraftingPatternDetails;
|
|
||||||
import appeng.api.networking.crafting.ICraftingRequester;
|
|
||||||
import appeng.api.networking.energy.IEnergyGrid;
|
import appeng.api.networking.energy.IEnergyGrid;
|
||||||
import appeng.api.networking.events.MENetworkCraftingCpuChange;
|
import appeng.api.networking.events.MENetworkCraftingCpuChange;
|
||||||
import appeng.api.networking.security.IActionSource;
|
import appeng.api.networking.security.IActionSource;
|
||||||
@@ -62,11 +40,8 @@ import appeng.api.storage.data.IItemList;
|
|||||||
import appeng.api.util.WorldCoord;
|
import appeng.api.util.WorldCoord;
|
||||||
import appeng.container.ContainerNull;
|
import appeng.container.ContainerNull;
|
||||||
import appeng.core.AELog;
|
import appeng.core.AELog;
|
||||||
import appeng.crafting.CraftBranchFailure;
|
import appeng.crafting.*;
|
||||||
import appeng.crafting.CraftingJob;
|
import appeng.helpers.PatternHelper;
|
||||||
import appeng.crafting.CraftingLink;
|
|
||||||
import appeng.crafting.CraftingWatcher;
|
|
||||||
import appeng.crafting.MECraftingInventory;
|
|
||||||
import appeng.me.cache.CraftingGridCache;
|
import appeng.me.cache.CraftingGridCache;
|
||||||
import appeng.me.cluster.IAECluster;
|
import appeng.me.cluster.IAECluster;
|
||||||
import appeng.me.helpers.MachineSource;
|
import appeng.me.helpers.MachineSource;
|
||||||
@@ -74,6 +49,17 @@ import appeng.tile.crafting.TileCraftingMonitorTile;
|
|||||||
import appeng.tile.crafting.TileCraftingTile;
|
import appeng.tile.crafting.TileCraftingTile;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
import appeng.util.item.AEItemStack;
|
import appeng.util.item.AEItemStack;
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import net.minecraft.inventory.InventoryCrafting;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
||||||
@@ -101,6 +87,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
private IAEItemStack finalOutput;
|
private IAEItemStack finalOutput;
|
||||||
private boolean waiting = false;
|
private boolean waiting = false;
|
||||||
private IItemList<IAEItemStack> waitingFor = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
private IItemList<IAEItemStack> waitingFor = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||||
|
private IItemList<IAEItemStack> neededForLoop = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||||
private long availableStorage = 0;
|
private long availableStorage = 0;
|
||||||
private MachineSource machineSrc = null;
|
private MachineSource machineSrc = null;
|
||||||
private int accelerator = 0;
|
private int accelerator = 0;
|
||||||
@@ -223,13 +210,10 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
|
|
||||||
public boolean canAccept( final IAEItemStack input )
|
public boolean canAccept( final IAEItemStack input )
|
||||||
{
|
{
|
||||||
if( input instanceof IAEItemStack )
|
if( input != null )
|
||||||
{
|
{
|
||||||
final IAEItemStack is = this.waitingFor.findPrecise( input );
|
final IAEItemStack is = this.waitingFor.findPrecise( input );
|
||||||
if( is != null && is.getStackSize() > 0 )
|
return is != null && is.getStackSize() > 0;
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -238,7 +222,8 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
// also stop accepting items when the job is complete, i.e. to prevent re-insertion when pushing out
|
// also stop accepting items when the job is complete, i.e. to prevent re-insertion when pushing out
|
||||||
// items during storeItems
|
// items during storeItems
|
||||||
if (input == null || isComplete) {
|
if( input == null || isComplete )
|
||||||
|
{
|
||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,9 +287,28 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
|
|
||||||
if( this.finalOutput.equals( what ) )
|
if( this.finalOutput.equals( what ) )
|
||||||
{
|
{
|
||||||
|
IAEItemStack isLoop = neededForLoop.findPrecise( finalOutput );
|
||||||
IAEItemStack leftover = what;
|
IAEItemStack leftover = what;
|
||||||
|
|
||||||
this.finalOutput.decStackSize( what.getStackSize() );
|
if( isLoop != null && isLoop.getStackSize() > 0 )
|
||||||
|
{
|
||||||
|
if( isLoop.getStackSize() >= what.getStackSize() )
|
||||||
|
{
|
||||||
|
leftover = this.inventory.injectItems( what.copy(), type, src );
|
||||||
|
isLoop.decStackSize( what.getStackSize() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
leftover = this.inventory.injectItems( what.copy().setStackSize( what.getStackSize() - isLoop.getStackSize() ), type, src );
|
||||||
|
isLoop.decStackSize( what.getStackSize() - isLoop.getStackSize() );
|
||||||
|
}
|
||||||
|
if( leftover == null )
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.finalOutput.decStackSize( leftover.getStackSize() );
|
||||||
|
|
||||||
if( this.myLastLink != null )
|
if( this.myLastLink != null )
|
||||||
{
|
{
|
||||||
@@ -334,9 +338,28 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
|
|
||||||
if( this.finalOutput.equals( insert ) )
|
if( this.finalOutput.equals( insert ) )
|
||||||
{
|
{
|
||||||
|
IAEItemStack isLoop = neededForLoop.findPrecise( finalOutput );
|
||||||
IAEItemStack leftover = input;
|
IAEItemStack leftover = input;
|
||||||
|
|
||||||
this.finalOutput.decStackSize( insert.getStackSize() );
|
if( isLoop != null && isLoop.getStackSize() > 0 )
|
||||||
|
{
|
||||||
|
if( isLoop.getStackSize() >= insert.getStackSize() )
|
||||||
|
{
|
||||||
|
leftover = this.inventory.injectItems( insert.copy(), type, src );
|
||||||
|
isLoop.decStackSize( insert.getStackSize() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
leftover = this.inventory.injectItems( insert.copy().setStackSize( insert.getStackSize() - isLoop.getStackSize() ), type, src );
|
||||||
|
isLoop.decStackSize( insert.getStackSize() - isLoop.getStackSize() );
|
||||||
|
}
|
||||||
|
if( leftover == null )
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.finalOutput.decStackSize( leftover.getStackSize() );
|
||||||
|
|
||||||
if( this.myLastLink != null )
|
if( this.myLastLink != null )
|
||||||
{
|
{
|
||||||
@@ -374,7 +397,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
final ImmutableList<IAEItemStack> single = ImmutableList.of( diff.copy() );
|
final ImmutableList<IAEItemStack> single = ImmutableList.of( diff.copy() );
|
||||||
|
|
||||||
while( i.hasNext() )
|
while ( i.hasNext() )
|
||||||
{
|
{
|
||||||
final Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object> o = i.next();
|
final Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object> o = i.next();
|
||||||
final IMEMonitorHandlerReceiver<IAEItemStack> receiver = o.getKey();
|
final IMEMonitorHandlerReceiver<IAEItemStack> receiver = o.getKey();
|
||||||
@@ -494,15 +517,14 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean canCraft(final ICraftingPatternDetails details, final IAEItemStack[] condensedInputs)
|
private boolean canCraft( final ICraftingPatternDetails details, final IAEItemStack[] condensedInputs )
|
||||||
{
|
{
|
||||||
if( !details.isCraftable() )
|
if( !details.isCraftable() )
|
||||||
{
|
{
|
||||||
// Processing patterns are relatively easy
|
// Processing patterns are relatively easy
|
||||||
for ( IAEItemStack input : condensedInputs )
|
for( IAEItemStack input : condensedInputs )
|
||||||
{
|
{
|
||||||
final IAEItemStack ais = this.inventory.extractItems( input.copy(), Actionable.SIMULATE,
|
final IAEItemStack ais = this.inventory.extractItems( input.copy(), Actionable.SIMULATE, this.machineSrc );
|
||||||
this.machineSrc );
|
|
||||||
|
|
||||||
if( ais == null || ais.getStackSize() < input.getStackSize() )
|
if( ais == null || ais.getStackSize() < input.getStackSize() )
|
||||||
{
|
{
|
||||||
@@ -515,7 +537,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
// When substitutions are allowed, we have to keep track of which items we've reserved
|
// When substitutions are allowed, we have to keep track of which items we've reserved
|
||||||
IAEItemStack[] inputs = details.getInputs();
|
IAEItemStack[] inputs = details.getInputs();
|
||||||
Map<IAEItemStack, Integer> consumedCount = new HashMap<>();
|
Map<IAEItemStack, Integer> consumedCount = new HashMap<>();
|
||||||
for ( int i = 0; i < inputs.length; i++ )
|
for( int i = 0; i < inputs.length; i++ )
|
||||||
{
|
{
|
||||||
List<IAEItemStack> substitutes = details.getSubstituteInputs( i );
|
List<IAEItemStack> substitutes = details.getSubstituteInputs( i );
|
||||||
if( substitutes.isEmpty() )
|
if( substitutes.isEmpty() )
|
||||||
@@ -524,9 +546,9 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for ( IAEItemStack substitute : substitutes )
|
for( IAEItemStack substitute : substitutes )
|
||||||
{
|
{
|
||||||
for ( IAEItemStack fuzz : this.inventory.getItemList().findFuzzy( substitute, FuzzyMode.IGNORE_ALL ) )
|
for( IAEItemStack fuzz : this.inventory.getItemList().findFuzzy( substitute, FuzzyMode.IGNORE_ALL ) )
|
||||||
{
|
{
|
||||||
int alreadyConsumed = consumedCount.getOrDefault( fuzz, 0 );
|
int alreadyConsumed = consumedCount.getOrDefault( fuzz, 0 );
|
||||||
if( fuzz.getStackSize() - alreadyConsumed <= 0 )
|
if( fuzz.getStackSize() - alreadyConsumed <= 0 )
|
||||||
@@ -536,8 +558,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
|
|
||||||
fuzz = fuzz.copy();
|
fuzz = fuzz.copy();
|
||||||
fuzz.setStackSize( 1 ); // We're iterating over non condensed inputs which means there's 1 of each needed
|
fuzz.setStackSize( 1 ); // We're iterating over non condensed inputs which means there's 1 of each needed
|
||||||
final IAEItemStack ais = this.inventory.extractItems( fuzz, Actionable.SIMULATE,
|
final IAEItemStack ais = this.inventory.extractItems( fuzz, Actionable.SIMULATE, this.machineSrc );
|
||||||
this.machineSrc );
|
|
||||||
|
|
||||||
if( ais != null && ais.getStackSize() > 0 )
|
if( ais != null && ais.getStackSize() > 0 )
|
||||||
{
|
{
|
||||||
@@ -564,11 +585,11 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
// When no substitutions can occur, we can simply check that all items are accounted since
|
// When no substitutions can occur, we can simply check that all items are accounted since
|
||||||
// each type of item should only occur once
|
// each type of item should only occur once
|
||||||
for ( IAEItemStack g : condensedInputs )
|
for( IAEItemStack g : condensedInputs )
|
||||||
{
|
{
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
|
|
||||||
for ( IAEItemStack fuzz : this.inventory.getItemList().findFuzzy( g, FuzzyMode.IGNORE_ALL ) )
|
for( IAEItemStack fuzz : this.inventory.getItemList().findFuzzy( g, FuzzyMode.IGNORE_ALL ) )
|
||||||
{
|
{
|
||||||
fuzz = fuzz.copy();
|
fuzz = fuzz.copy();
|
||||||
fuzz.setStackSize( g.getStackSize() );
|
fuzz.setStackSize( g.getStackSize() );
|
||||||
@@ -674,8 +695,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
this.somethingChanged = false;
|
this.somethingChanged = false;
|
||||||
this.executeCrafting( eg, cc );
|
this.executeCrafting( eg, cc );
|
||||||
}
|
} while ( this.somethingChanged && this.remainingOperations > 0 );
|
||||||
while( this.somethingChanged && this.remainingOperations > 0 );
|
|
||||||
}
|
}
|
||||||
this.usedOps[2] = this.usedOps[1];
|
this.usedOps[2] = this.usedOps[1];
|
||||||
this.usedOps[1] = this.usedOps[0];
|
this.usedOps[1] = this.usedOps[0];
|
||||||
@@ -691,7 +711,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
final Iterator<Entry<ICraftingPatternDetails, TaskProgress>> i = this.tasks.entrySet().iterator();
|
final Iterator<Entry<ICraftingPatternDetails, TaskProgress>> i = this.tasks.entrySet().iterator();
|
||||||
|
|
||||||
while( i.hasNext() )
|
while ( i.hasNext() )
|
||||||
{
|
{
|
||||||
final Entry<ICraftingPatternDetails, TaskProgress> e = i.next();
|
final Entry<ICraftingPatternDetails, TaskProgress> e = i.next();
|
||||||
|
|
||||||
@@ -707,12 +727,12 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
InventoryCrafting ic = null;
|
InventoryCrafting ic = null;
|
||||||
|
|
||||||
if (!visitedMediums.containsKey( details ) || visitedMediums.get( details ).isEmpty())
|
if( !visitedMediums.containsKey( details ) || visitedMediums.get( details ).isEmpty() )
|
||||||
{
|
{
|
||||||
visitedMediums.put( details, new ArrayDeque<>( cc.getMediums( details ).stream().filter( Objects::nonNull ).collect( Collectors.toList()) ) );
|
visitedMediums.put( details, new ArrayDeque<>( cc.getMediums( details ).stream().filter( Objects::nonNull ).collect( Collectors.toList() ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!visitedMediums.get( details ).isEmpty())
|
while ( !visitedMediums.get( details ).isEmpty() )
|
||||||
{
|
{
|
||||||
|
|
||||||
ICraftingMedium m = visitedMediums.get( details ).poll();
|
ICraftingMedium m = visitedMediums.get( details ).poll();
|
||||||
@@ -742,71 +762,88 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if( details.isCraftable() )
|
||||||
|
{
|
||||||
ic = new InventoryCrafting( new ContainerNull(), 3, 3 );
|
ic = new InventoryCrafting( new ContainerNull(), 3, 3 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ic = new InventoryCrafting( new ContainerNull(), PatternHelper.PROCESSING_INPUT_WIDTH, PatternHelper.PROCESSING_INPUT_HEIGHT );
|
||||||
|
}
|
||||||
|
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
|
|
||||||
for (int x = 0; x < input.length; x++) {
|
for( int x = 0; x < input.length; x++ )
|
||||||
if (input[x] != null) {
|
{
|
||||||
|
if( input[x] != null )
|
||||||
|
{
|
||||||
found = false;
|
found = false;
|
||||||
|
|
||||||
if (details.isCraftable()) {
|
if( details.isCraftable() )
|
||||||
|
{
|
||||||
final Collection<IAEItemStack> itemList;
|
final Collection<IAEItemStack> itemList;
|
||||||
|
|
||||||
if (details.canSubstitute()) {
|
if( details.canSubstitute() )
|
||||||
final List<IAEItemStack> substitutes = details.getSubstituteInputs(x);
|
{
|
||||||
itemList = new ArrayList<>(substitutes.size());
|
final List<IAEItemStack> substitutes = details.getSubstituteInputs( x );
|
||||||
|
itemList = new ArrayList<>( substitutes.size() );
|
||||||
|
|
||||||
for (IAEItemStack stack : substitutes) {
|
for( IAEItemStack stack : substitutes )
|
||||||
itemList.addAll(this.inventory.getItemList().findFuzzy(stack,
|
{
|
||||||
FuzzyMode.IGNORE_ALL));
|
itemList.addAll( this.inventory.getItemList().findFuzzy( stack, FuzzyMode.IGNORE_ALL ) );
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
itemList = new ArrayList<>(1);
|
else
|
||||||
|
{
|
||||||
|
itemList = new ArrayList<>( 1 );
|
||||||
|
|
||||||
final IAEItemStack item = this.inventory.getItemList()
|
final IAEItemStack item = this.inventory.getItemList().findPrecise( input[x] );
|
||||||
.findPrecise(input[x]);
|
|
||||||
|
|
||||||
if (item != null) {
|
if( item != null )
|
||||||
itemList.add(item);
|
{
|
||||||
|
itemList.add( item );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (IAEItemStack fuzz : itemList) {
|
for( IAEItemStack fuzz : itemList )
|
||||||
|
{
|
||||||
fuzz = fuzz.copy();
|
fuzz = fuzz.copy();
|
||||||
fuzz.setStackSize(input[x].getStackSize());
|
fuzz.setStackSize( input[x].getStackSize() );
|
||||||
|
|
||||||
if (details.isValidItemForSlot(x, fuzz.createItemStack(),
|
if( details.isValidItemForSlot( x, fuzz.createItemStack(), this.getWorld() ) )
|
||||||
this.getWorld())) {
|
{
|
||||||
final IAEItemStack ais = this.inventory.extractItems(fuzz,
|
final IAEItemStack ais = this.inventory.extractItems( fuzz, Actionable.MODULATE, this.machineSrc );
|
||||||
Actionable.MODULATE, this.machineSrc);
|
final ItemStack is = ais == null ? ItemStack.EMPTY : ais.createItemStack();
|
||||||
final ItemStack is = ais == null ? ItemStack.EMPTY
|
|
||||||
: ais.createItemStack();
|
|
||||||
|
|
||||||
if (!is.isEmpty()) {
|
if( !is.isEmpty() )
|
||||||
this.postChange(AEItemStack.fromItemStack(is), this.machineSrc);
|
{
|
||||||
ic.setInventorySlotContents(x, is);
|
this.postChange( AEItemStack.fromItemStack( is ), this.machineSrc );
|
||||||
|
ic.setInventorySlotContents( x, is );
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
final IAEItemStack ais = this.inventory.extractItems(input[x].copy(),
|
else
|
||||||
Actionable.MODULATE, this.machineSrc);
|
{
|
||||||
|
final IAEItemStack ais = this.inventory.extractItems( input[x].copy(), Actionable.MODULATE, this.machineSrc );
|
||||||
final ItemStack is = ais == null ? ItemStack.EMPTY : ais.createItemStack();
|
final ItemStack is = ais == null ? ItemStack.EMPTY : ais.createItemStack();
|
||||||
|
|
||||||
if (!is.isEmpty()) {
|
if( !is.isEmpty() )
|
||||||
this.postChange(input[x], this.machineSrc);
|
{
|
||||||
ic.setInventorySlotContents(x, is);
|
this.postChange( input[x], this.machineSrc );
|
||||||
if (is.getCount() == input[x].getStackSize()) {
|
ic.setInventorySlotContents( x, is );
|
||||||
|
if( is.getCount() == input[x].getStackSize() )
|
||||||
|
{
|
||||||
found = true;
|
found = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
if( !found )
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -890,7 +927,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
|
|
||||||
private void storeItems()
|
private void storeItems()
|
||||||
{
|
{
|
||||||
Preconditions.checkState(isComplete, "CPU should be complete to prevent re-insertion when dumping items");
|
Preconditions.checkState( isComplete, "CPU should be complete to prevent re-insertion when dumping items" );
|
||||||
final IGrid g = this.getGrid();
|
final IGrid g = this.getGrid();
|
||||||
|
|
||||||
if( g == null )
|
if( g == null )
|
||||||
@@ -950,10 +987,12 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.waitingFor.resetStatus();
|
this.waitingFor.resetStatus();
|
||||||
|
this.neededForLoop.resetStatus();
|
||||||
( (CraftingJob) job ).getTree().setJob( ci, this, src );
|
( (CraftingJob) job ).getTree().setJob( ci, this, src );
|
||||||
if( ci.commit( src ) )
|
if( ci.commit( src ) )
|
||||||
{
|
{
|
||||||
this.finalOutput = job.getOutput();
|
this.finalOutput = job.getOutput();
|
||||||
|
this.neededForLoop = ( (CraftingJob) job ).getNeededForLoop();
|
||||||
this.waiting = false;
|
this.waiting = false;
|
||||||
this.isComplete = false;
|
this.isComplete = false;
|
||||||
this.markDirty();
|
this.markDirty();
|
||||||
@@ -1004,8 +1043,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
public boolean isBusy()
|
public boolean isBusy()
|
||||||
{
|
{
|
||||||
|
|
||||||
this.tasks.entrySet().removeIf(
|
this.tasks.entrySet().removeIf( taskProgressEntry -> taskProgressEntry.getValue().value <= 0 );
|
||||||
taskProgressEntry -> taskProgressEntry.getValue().value <= 0 );
|
|
||||||
|
|
||||||
if( !this.waitingFor.isEmpty() || !this.tasks.isEmpty() )
|
if( !this.waitingFor.isEmpty() || !this.tasks.isEmpty() )
|
||||||
{
|
{
|
||||||
@@ -1063,8 +1101,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
final int hash = System.identityHashCode( this );
|
final int hash = System.identityHashCode( this );
|
||||||
final int hmm = this.finalOutput == null ? 0 : this.finalOutput.hashCode();
|
final int hmm = this.finalOutput == null ? 0 : this.finalOutput.hashCode();
|
||||||
|
|
||||||
return Long.toString( now, Character.MAX_RADIX ) + '-' + Integer.toString( hash, Character.MAX_RADIX ) + '-' + Integer.toString( hmm,
|
return Long.toString( now, Character.MAX_RADIX ) + '-' + Integer.toString( hash, Character.MAX_RADIX ) + '-' + Integer.toString( hmm, Character.MAX_RADIX );
|
||||||
Character.MAX_RADIX );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private NBTTagCompound generateLinkData( final String craftingID, final boolean standalone, final boolean req )
|
private NBTTagCompound generateLinkData( final String craftingID, final boolean standalone, final boolean req )
|
||||||
@@ -1091,7 +1128,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
|
|
||||||
public void getListOfItem( final IItemList<IAEItemStack> list, final CraftingItemList whichList )
|
public void getListOfItem( final IItemList<IAEItemStack> list, final CraftingItemList whichList )
|
||||||
{
|
{
|
||||||
switch( whichList )
|
switch ( whichList )
|
||||||
{
|
{
|
||||||
case ACTIVE:
|
case ACTIVE:
|
||||||
for( final IAEItemStack ais : this.waitingFor )
|
for( final IAEItemStack ais : this.waitingFor )
|
||||||
@@ -1162,7 +1199,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
IAEItemStack is;
|
IAEItemStack is;
|
||||||
|
|
||||||
switch( storage2 )
|
switch ( storage2 )
|
||||||
{
|
{
|
||||||
case STORAGE:
|
case STORAGE:
|
||||||
is = this.inventory.getItemList().findPrecise( what );
|
is = this.inventory.getItemList().findPrecise( what );
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import net.minecraft.item.ItemStack;
|
|||||||
|
|
||||||
import appeng.api.implementations.IPowerChannelState;
|
import appeng.api.implementations.IPowerChannelState;
|
||||||
import appeng.api.networking.GridFlags;
|
import appeng.api.networking.GridFlags;
|
||||||
|
import appeng.api.networking.events.MENetworkBootingStatusChange;
|
||||||
import appeng.api.networking.events.MENetworkChannelsChanged;
|
import appeng.api.networking.events.MENetworkChannelsChanged;
|
||||||
import appeng.api.networking.events.MENetworkEventSubscribe;
|
import appeng.api.networking.events.MENetworkEventSubscribe;
|
||||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
||||||
@@ -59,6 +60,12 @@ public abstract class PartBasicState extends AEBasePart implements IPowerChannel
|
|||||||
this.getHost().markForUpdate();
|
this.getHost().markForUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@MENetworkEventSubscribe
|
||||||
|
public void bootingRender( final MENetworkBootingStatusChange bs )
|
||||||
|
{
|
||||||
|
this.getHost().markForUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeToStream( final ByteBuf data ) throws IOException
|
public void writeToStream( final ByteBuf data ) throws IOException
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ package appeng.parts.automation;
|
|||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
import com.google.common.primitives.Ints;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
@@ -70,8 +71,6 @@ import appeng.util.item.AEItemStack;
|
|||||||
|
|
||||||
public class PartExportBus extends PartSharedItemBus implements ICraftingRequester
|
public class PartExportBus extends PartSharedItemBus implements ICraftingRequester
|
||||||
{
|
{
|
||||||
private final int[] failedCraftTriesSlot = {0,0,0,0,0,0,0,0,0};
|
|
||||||
|
|
||||||
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/export_bus_base" );
|
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/export_bus_base" );
|
||||||
|
|
||||||
@PartModels
|
@PartModels
|
||||||
@@ -131,10 +130,7 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
final InventoryAdaptor destination = this.getHandler();
|
final InventoryAdaptor destination = this.getHandler();
|
||||||
final IMEMonitor<IAEItemStack> inv = this.getProxy()
|
final IMEMonitor<IAEItemStack> inv = this.getProxy().getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||||
.getStorage()
|
|
||||||
.getInventory(
|
|
||||||
AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
|
||||||
final IEnergyGrid energy = this.getProxy().getEnergy();
|
final IEnergyGrid energy = this.getProxy().getEnergy();
|
||||||
final ICraftingGrid cg = this.getProxy().getCrafting();
|
final ICraftingGrid cg = this.getProxy().getCrafting();
|
||||||
final FuzzyMode fzMode = (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE );
|
final FuzzyMode fzMode = (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE );
|
||||||
@@ -150,21 +146,17 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
|||||||
|
|
||||||
final IAEItemStack ais = this.getConfig().getAEStackInSlot( slotToExport );
|
final IAEItemStack ais = this.getConfig().getAEStackInSlot( slotToExport );
|
||||||
|
|
||||||
if( ais == null || this.itemToSend <= 0 ) continue;
|
if( ais == null || this.itemToSend <= 0 )
|
||||||
|
{
|
||||||
if ( this.craftOnly() ) {
|
|
||||||
if (this.failedCraftTriesSlot[x] <= 0) {
|
|
||||||
|
|
||||||
this.didSomething = this.craftingTracker.handleCrafting(slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(),
|
|
||||||
this.getProxy().getGrid(), cg, this.mySrc) || this.didSomething;
|
|
||||||
|
|
||||||
if (this.didSomething) this.failedCraftTriesSlot[x] = 0;
|
|
||||||
else this.failedCraftTriesSlot[x] += 2;
|
|
||||||
}
|
|
||||||
this.failedCraftTriesSlot[x] -= 1;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( this.craftOnly() )
|
||||||
|
{
|
||||||
|
this.didSomething = this.craftingTracker.handleCrafting( slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(), this.getProxy().getGrid(), cg, this.mySrc ) || this.didSomething;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
final long before = this.itemToSend;
|
final long before = this.itemToSend;
|
||||||
|
|
||||||
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
||||||
@@ -188,15 +180,7 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
|||||||
|
|
||||||
if( this.itemToSend == before && this.isCraftingEnabled() )
|
if( this.itemToSend == before && this.isCraftingEnabled() )
|
||||||
{
|
{
|
||||||
if (this.failedCraftTriesSlot[x] <= 0) {
|
this.didSomething = this.craftingTracker.handleCrafting( slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(), this.getProxy().getGrid(), cg, this.mySrc ) || this.didSomething;
|
||||||
|
|
||||||
this.didSomething = this.craftingTracker.handleCrafting(slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(),
|
|
||||||
this.getProxy().getGrid(), cg, this.mySrc) || this.didSomething;
|
|
||||||
|
|
||||||
if (this.didSomething) this.failedCraftTriesSlot[x] = 0;
|
|
||||||
else this.failedCraftTriesSlot[x] += 2;
|
|
||||||
}
|
|
||||||
this.failedCraftTriesSlot[x] -= 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,11 +262,30 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
|||||||
|
|
||||||
if( energy.extractAEPower( power, mode, PowerMultiplier.CONFIG ) > power - 0.01 )
|
if( energy.extractAEPower( power, mode, PowerMultiplier.CONFIG ) > power - 0.01 )
|
||||||
{
|
{
|
||||||
if( mode == Actionable.MODULATE )
|
ItemStack inputStack = items.getCachedItemStack( items.getStackSize() );
|
||||||
|
|
||||||
|
ItemStack remaining;
|
||||||
|
|
||||||
|
if( mode == Actionable.SIMULATE )
|
||||||
{
|
{
|
||||||
return AEItemStack.fromItemStack( d.addItems( items.createItemStack() ) );
|
remaining = d.simulateAdd( inputStack );
|
||||||
|
items.setCachedItemStack( inputStack );
|
||||||
}
|
}
|
||||||
return AEItemStack.fromItemStack( d.simulateAdd( items.createItemStack() ) );
|
else
|
||||||
|
{
|
||||||
|
remaining = d.addItems( inputStack );
|
||||||
|
if( !remaining.isEmpty() )
|
||||||
|
{
|
||||||
|
items.setCachedItemStack( remaining );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( remaining == inputStack )
|
||||||
|
{
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
return AEItemStack.fromItemStack( remaining );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -318,11 +321,21 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
|||||||
|
|
||||||
private void pushItemIntoTarget( final InventoryAdaptor d, final IEnergyGrid energy, final IMEInventory<IAEItemStack> inv, IAEItemStack ais )
|
private void pushItemIntoTarget( final InventoryAdaptor d, final IEnergyGrid energy, final IMEInventory<IAEItemStack> inv, IAEItemStack ais )
|
||||||
{
|
{
|
||||||
final ItemStack is = ais.createItemStack();
|
ItemStack inputStack = ais.getCachedItemStack( ais.getStackSize() );
|
||||||
is.setCount( (int) this.itemToSend );
|
|
||||||
|
|
||||||
final ItemStack o = d.simulateAdd( is );
|
ItemStack remaining = d.simulateAdd( inputStack );
|
||||||
final long canFit = o.isEmpty() ? this.itemToSend : this.itemToSend - o.getCount();
|
|
||||||
|
// Store the stack in the cache for next time.
|
||||||
|
if( !remaining.isEmpty() )
|
||||||
|
{
|
||||||
|
ais.setCachedItemStack( remaining );
|
||||||
|
if( remaining == inputStack )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final long canFit = remaining.isEmpty() ? this.itemToSend : this.itemToSend - remaining.getCount();
|
||||||
|
|
||||||
if( canFit > 0 )
|
if( canFit > 0 )
|
||||||
{
|
{
|
||||||
@@ -334,7 +347,9 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
|||||||
{
|
{
|
||||||
this.itemToSend -= itemsToAdd.getStackSize();
|
this.itemToSend -= itemsToAdd.getStackSize();
|
||||||
|
|
||||||
final ItemStack failed = d.addItems( itemsToAdd.createItemStack() );
|
inputStack.setCount( Ints.saturatedCast( itemsToAdd.getStackSize() ) );
|
||||||
|
|
||||||
|
final ItemStack failed = d.addItems( inputStack );
|
||||||
if( !failed.isEmpty() )
|
if( !failed.isEmpty() )
|
||||||
{
|
{
|
||||||
ais.setStackSize( failed.getCount() );
|
ais.setStackSize( failed.getCount() );
|
||||||
|
|||||||
@@ -352,23 +352,11 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStackChange( IItemList<?> o, IAEStack<?> fullStack, IAEStack<?> diffStack, IActionSource src, IStorageChannel<?> chan )
|
public void onStackChange( final IItemList o, final IAEStack fullStack, final IAEStack diffStack, final IActionSource src, final IStorageChannel chan )
|
||||||
{
|
{
|
||||||
if( chan == AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) )
|
if( chan == AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) && fullStack.equals( this.config.getAEStackInSlot( 0 ) ) && this.getInstalledUpgrades( Upgrades.FUZZY ) == 0 )
|
||||||
{
|
{
|
||||||
IAEItemStack myStack = this.config.getAEStackInSlot( 0 );
|
this.lastReportedValue = fullStack.getStackSize();
|
||||||
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
|
||||||
{
|
|
||||||
final FuzzyMode fzMode = (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE );
|
|
||||||
if( Platform.itemComparisons().isFuzzyEqualItem( myStack.getDefinition(), ( (IAEItemStack) diffStack ).getDefinition(), fzMode ) )
|
|
||||||
{
|
|
||||||
this.lastReportedValue += diffStack.getStackSize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( diffStack.equals( myStack ) )
|
|
||||||
{
|
|
||||||
this.lastReportedValue += diffStack.getStackSize();
|
|
||||||
}
|
|
||||||
this.updateState();
|
this.updateState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
package appeng.parts.misc;
|
package appeng.parts.misc;
|
||||||
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
import appeng.api.config.AccessRestriction;
|
import appeng.api.config.AccessRestriction;
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
@@ -62,8 +61,6 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
private StorageFilter mode;
|
private StorageFilter mode;
|
||||||
private AccessRestriction access;
|
private AccessRestriction access;
|
||||||
|
|
||||||
private ItemStack stackCache = null;
|
|
||||||
|
|
||||||
ItemHandlerAdapter( IItemHandler itemHandler, IGridProxyable proxy )
|
ItemHandlerAdapter( IItemHandler itemHandler, IGridProxyable proxy )
|
||||||
{
|
{
|
||||||
this.itemHandler = itemHandler;
|
this.itemHandler = itemHandler;
|
||||||
@@ -82,39 +79,31 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
public IAEItemStack injectItems( IAEItemStack iox, Actionable type, IActionSource src )
|
public IAEItemStack injectItems( IAEItemStack iox, Actionable type, IActionSource src )
|
||||||
{
|
{
|
||||||
// Try to reuse the cached stack
|
// Try to reuse the cached stack
|
||||||
@Nullable ItemStack currentCached = stackCache;
|
ItemStack inputStack = iox.getCachedItemStack( iox.getStackSize() );
|
||||||
stackCache = null;
|
|
||||||
|
ItemStack remaining = inputStack;
|
||||||
|
|
||||||
ItemStack orgInput;
|
|
||||||
int slotCount = this.itemHandler.getSlots();
|
int slotCount = this.itemHandler.getSlots();
|
||||||
|
|
||||||
if( currentCached != null && iox.isSameType( currentCached ) )
|
|
||||||
{
|
|
||||||
// Cache is suitable, just update the count
|
|
||||||
orgInput = currentCached;
|
|
||||||
currentCached.setCount( Ints.saturatedCast( iox.getStackSize() ) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// We need a new stack :-(
|
|
||||||
orgInput = iox.createItemStack();
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemStack remaining = orgInput;
|
|
||||||
|
|
||||||
for( int i = 0; i < slotCount && !remaining.isEmpty(); i++ )
|
for( int i = 0; i < slotCount && !remaining.isEmpty(); i++ )
|
||||||
{
|
{
|
||||||
remaining = this.itemHandler.insertItem( i, remaining, type == Actionable.SIMULATE );
|
remaining = this.itemHandler.insertItem( i, remaining, type == Actionable.SIMULATE );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store the stack in the cache for next time.
|
// Store the stack in the cache for next time.
|
||||||
if( !remaining.isEmpty() && remaining != orgInput )
|
if( type == Actionable.SIMULATE )
|
||||||
{
|
{
|
||||||
stackCache = remaining;
|
iox.setCachedItemStack( inputStack );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( !remaining.isEmpty() )
|
||||||
|
{
|
||||||
|
iox.setCachedItemStack( remaining );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// At this point, we still have some items left...
|
// At this point, we still have some items left...
|
||||||
if( remaining == orgInput )
|
if( remaining == inputStack )
|
||||||
{
|
{
|
||||||
// The stack remained unmodified, target inventory is full
|
// The stack remained unmodified, target inventory is full
|
||||||
return iox;
|
return iox;
|
||||||
@@ -147,7 +136,7 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
ItemStack gathered = ItemStack.EMPTY;
|
ItemStack gathered = ItemStack.EMPTY;
|
||||||
|
|
||||||
final boolean simulate = ( mode == Actionable.SIMULATE );
|
final boolean simulate = ( mode == Actionable.SIMULATE );
|
||||||
for ( int i = 0; i < this.itemHandler.getSlots(); i++ )
|
for( int i = 0; i < this.itemHandler.getSlots(); i++ )
|
||||||
{
|
{
|
||||||
ItemStack stackInInventorySlot = this.itemHandler.getStackInSlot( i );
|
ItemStack stackInInventorySlot = this.itemHandler.getStackInSlot( i );
|
||||||
|
|
||||||
@@ -157,6 +146,7 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
}
|
}
|
||||||
|
|
||||||
ItemStack extracted;
|
ItemStack extracted;
|
||||||
|
|
||||||
int stackSizeCurrentSlot = stackInInventorySlot.getCount();
|
int stackSizeCurrentSlot = stackInInventorySlot.getCount();
|
||||||
int remainingCurrentSlot = Math.min( remainingSize, stackSizeCurrentSlot );
|
int remainingCurrentSlot = Math.min( remainingSize, stackSizeCurrentSlot );
|
||||||
|
|
||||||
@@ -165,24 +155,36 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
extracted = this.itemHandler.extractItem( i, remainingCurrentSlot, simulate );
|
extracted = this.itemHandler.extractItem( i, remainingCurrentSlot, simulate );
|
||||||
|
|
||||||
if( !extracted.isEmpty() )
|
if( !extracted.isEmpty() )
|
||||||
{
|
{
|
||||||
|
// In order to guard against broken IItemHandler implementations, we'll try to guess if the returned
|
||||||
|
// stack (especially in simulate mode) is the same that was returned by getStackInSlot. This is
|
||||||
|
// obviously not a precise science, but it would catch the previous Forge bug:
|
||||||
|
// https://github.com/MinecraftForge/MinecraftForge/pull/6580
|
||||||
|
if( extracted == stackInInventorySlot )
|
||||||
|
{
|
||||||
|
extracted = extracted.copy();
|
||||||
|
}
|
||||||
|
|
||||||
if( extracted.getCount() > remainingCurrentSlot )
|
if( extracted.getCount() > remainingCurrentSlot )
|
||||||
{
|
{
|
||||||
// Something broke. It should never return more than we requested...
|
// Something broke. It should never return more than we requested...
|
||||||
// We're going to silently eat the remainder
|
// We're going to silently eat the remainder
|
||||||
AELog.warn( "Mod that provided item handler %s is broken. Returned %s items while only requesting %d.",
|
AELog.warn( "Mod that provided item handler %s is broken. Returned %s items while only requesting %d.", this.itemHandler.getClass().getName(), extracted.toString(), remainingCurrentSlot );
|
||||||
this.itemHandler.getClass().getName(), extracted.toString(), remainingCurrentSlot );
|
extracted.setCount( remainingCurrentSlot );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Heuristic for simulation: looping in case of simulations is pointless, since the state of the
|
||||||
|
// underlying inventory does not change after a simulated extraction. To still support inventories
|
||||||
|
// that report stacks that are larger than maxStackSize, we use this heuristic
|
||||||
|
if( simulate && extracted.getCount() == extracted.getMaxStackSize() && remainingCurrentSlot > extracted.getMaxStackSize() )
|
||||||
|
{
|
||||||
extracted.setCount( remainingCurrentSlot );
|
extracted.setCount( remainingCurrentSlot );
|
||||||
}
|
}
|
||||||
|
|
||||||
// We're just gonna use the first stack we get our hands on as the template for the rest.
|
|
||||||
// In case some stupid itemhandler (aka forge) returns an internal state we have to do a second
|
|
||||||
// expensive copy again.
|
|
||||||
if( gathered.isEmpty() )
|
if( gathered.isEmpty() )
|
||||||
{
|
{
|
||||||
gathered = extracted.copy();
|
gathered = extracted;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -190,11 +192,9 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
}
|
}
|
||||||
remainingCurrentSlot -= extracted.getCount();
|
remainingCurrentSlot -= extracted.getCount();
|
||||||
}
|
}
|
||||||
} while ( !extracted.isEmpty() && remainingCurrentSlot > 0 );
|
} while ( !simulate && !extracted.isEmpty() && remainingCurrentSlot > 0 );
|
||||||
|
|
||||||
remainingSize -= stackSizeCurrentSlot - remainingCurrentSlot;
|
remainingSize -= stackSizeCurrentSlot - remainingCurrentSlot;
|
||||||
|
|
||||||
// Done?
|
|
||||||
if( remainingSize <= 0 )
|
if( remainingSize <= 0 )
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@@ -329,17 +329,17 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
currentlyOnStorage.add( is.getAEItemStack() );
|
currentlyOnStorage.add( is.getAEItemStack() );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( final IAEItemStack is : currentlyCached )
|
for( final IAEItemStack is : currentlyCached )
|
||||||
{
|
{
|
||||||
is.setStackSize( -is.getStackSize() );
|
is.setStackSize( -is.getStackSize() );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( final IAEItemStack is : currentlyOnStorage )
|
for( final IAEItemStack is : currentlyOnStorage )
|
||||||
{
|
{
|
||||||
currentlyCached.add( is );
|
currentlyCached.add( is );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( final IAEItemStack is : currentlyCached )
|
for( final IAEItemStack is : currentlyCached )
|
||||||
{
|
{
|
||||||
if( is.getStackSize() != 0 )
|
if( is.getStackSize() != 0 )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -42,8 +42,6 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
|
|||||||
private final InventoryCache cache;
|
private final InventoryCache cache;
|
||||||
private AccessRestriction access;
|
private AccessRestriction access;
|
||||||
|
|
||||||
private ItemStack stackCache;
|
|
||||||
|
|
||||||
ItemRepositoryAdapter( IItemRepository itemRepository, IGridProxyable proxy )
|
ItemRepositoryAdapter( IItemRepository itemRepository, IGridProxyable proxy )
|
||||||
{
|
{
|
||||||
this.itemRepository = itemRepository;
|
this.itemRepository = itemRepository;
|
||||||
@@ -61,31 +59,27 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
|
|||||||
public IAEItemStack injectItems( IAEItemStack iox, Actionable type, IActionSource src )
|
public IAEItemStack injectItems( IAEItemStack iox, Actionable type, IActionSource src )
|
||||||
{
|
{
|
||||||
// Try to reuse the cached stack
|
// Try to reuse the cached stack
|
||||||
@Nullable ItemStack currentCached = stackCache;
|
ItemStack inputStack = iox.getCachedItemStack( iox.getStackSize() );
|
||||||
stackCache = null;
|
|
||||||
|
|
||||||
ItemStack orgInput;
|
ItemStack remaining;
|
||||||
if( currentCached != null && iox.isSameType( currentCached ) )
|
|
||||||
|
remaining = this.itemRepository.insertItem( inputStack, type == Actionable.SIMULATE );
|
||||||
|
|
||||||
|
// Store the stack in the cache for next time.
|
||||||
|
if( type == Actionable.SIMULATE )
|
||||||
{
|
{
|
||||||
// Cache is suitable, just update the count
|
iox.setCachedItemStack( inputStack );
|
||||||
orgInput = currentCached;
|
|
||||||
currentCached.setCount( Ints.saturatedCast( iox.getStackSize() ) );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// We need a new stack :-(
|
if( !remaining.isEmpty() )
|
||||||
orgInput = iox.createItemStack();
|
|
||||||
}
|
|
||||||
ItemStack remaining = this.itemRepository.insertItem( orgInput, type == Actionable.SIMULATE );
|
|
||||||
|
|
||||||
// Store the stack in the cache for next time.
|
|
||||||
if( !remaining.isEmpty() && remaining != orgInput )
|
|
||||||
{
|
{
|
||||||
stackCache = remaining;
|
iox.setCachedItemStack( remaining );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// At this point, we still have some items left...
|
// At this point, we still have some items left...
|
||||||
if( remaining == orgInput )
|
if( remaining == inputStack )
|
||||||
{
|
{
|
||||||
// The stack remained unmodified, target inventory is full
|
// The stack remained unmodified, target inventory is full
|
||||||
return iox;
|
return iox;
|
||||||
@@ -123,8 +117,7 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
|
|||||||
{
|
{
|
||||||
// Something broke. It should never return more than we requested...
|
// Something broke. It should never return more than we requested...
|
||||||
// We're going to silently eat the remainder
|
// We're going to silently eat the remainder
|
||||||
AELog.warn( "Mod that provided item handler %s is broken. Returned %s items while only requesting %d.",
|
AELog.warn( "Mod that provided item handler %s is broken. Returned %s items while only requesting %d.", this.itemRepository.getClass().getName(), extracted.toString(), remainingSize );
|
||||||
this.itemRepository.getClass().getName(), extracted.toString(), remainingSize );
|
|
||||||
extracted.setCount( remainingSize );
|
extracted.setCount( remainingSize );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,7 +127,7 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
|
|||||||
if( mode == Actionable.MODULATE )
|
if( mode == Actionable.MODULATE )
|
||||||
{
|
{
|
||||||
IAEItemStack cachedStack = this.cache.currentlyCached.findPrecise( request );
|
IAEItemStack cachedStack = this.cache.currentlyCached.findPrecise( request );
|
||||||
if (cachedStack != null)
|
if( cachedStack != null )
|
||||||
{
|
{
|
||||||
cachedStack.decStackSize( extractedAEItemStack.getStackSize() );
|
cachedStack.decStackSize( extractedAEItemStack.getStackSize() );
|
||||||
this.postDifference( Collections.singletonList( extractedAEItemStack.copy().setStackSize( -extractedAEItemStack.getStackSize() ) ) );
|
this.postDifference( Collections.singletonList( extractedAEItemStack.copy().setStackSize( -extractedAEItemStack.getStackSize() ) ) );
|
||||||
@@ -239,17 +232,17 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
|
|||||||
IItemList<IAEItemStack> currentlyOnStorage = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
IItemList<IAEItemStack> currentlyOnStorage = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||||
this.iItemRepository.getAllItems().stream().map( s -> AEItemStack.fromItemStack( s.itemPrototype ).setStackSize( s.count ) ).forEach( currentlyOnStorage::add );
|
this.iItemRepository.getAllItems().stream().map( s -> AEItemStack.fromItemStack( s.itemPrototype ).setStackSize( s.count ) ).forEach( currentlyOnStorage::add );
|
||||||
|
|
||||||
for ( final IAEItemStack is : currentlyCached )
|
for( final IAEItemStack is : currentlyCached )
|
||||||
{
|
{
|
||||||
is.setStackSize( -is.getStackSize() );
|
is.setStackSize( -is.getStackSize() );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( final IAEItemStack is : currentlyOnStorage )
|
for( final IAEItemStack is : currentlyOnStorage )
|
||||||
{
|
{
|
||||||
currentlyCached.add( is );
|
currentlyCached.add( is );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( final IAEItemStack is : currentlyCached )
|
for( final IAEItemStack is : currentlyCached )
|
||||||
{
|
{
|
||||||
if( is.getStackSize() != 0 )
|
if( is.getStackSize() != 0 )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,225 @@
|
|||||||
|
package appeng.parts.misc;
|
||||||
|
|
||||||
|
import appeng.api.AEApi;
|
||||||
|
import appeng.api.config.*;
|
||||||
|
import appeng.api.networking.storage.IBaseMonitor;
|
||||||
|
import appeng.api.networking.storage.IStorageGrid;
|
||||||
|
import appeng.api.networking.ticking.ITickManager;
|
||||||
|
import appeng.api.parts.IPartModel;
|
||||||
|
import appeng.api.storage.IMEInventory;
|
||||||
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
|
import appeng.core.AppEng;
|
||||||
|
import appeng.core.sync.GuiBridge;
|
||||||
|
import appeng.items.parts.PartModels;
|
||||||
|
import appeng.me.GridAccessException;
|
||||||
|
import appeng.me.cache.GridStorageCache;
|
||||||
|
import appeng.me.storage.ITickingMonitor;
|
||||||
|
import appeng.me.storage.MEInventoryHandler;
|
||||||
|
import appeng.parts.PartModel;
|
||||||
|
import appeng.util.ConfigManager;
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import appeng.util.item.OreHelper;
|
||||||
|
import appeng.util.prioritylist.IPartitionList;
|
||||||
|
import appeng.util.prioritylist.OreDictPriorityList;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.EnumHand;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
|
||||||
|
|
||||||
|
public class PartOreDicStorageBus extends PartStorageBus
|
||||||
|
{
|
||||||
|
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/oredict_storage_bus_base" );
|
||||||
|
@PartModels
|
||||||
|
public static final IPartModel MODELS_OFF = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_off" ) );
|
||||||
|
@PartModels
|
||||||
|
public static final IPartModel MODELS_ON = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_on" ) );
|
||||||
|
@PartModels
|
||||||
|
public static final IPartModel MODELS_HAS_CHANNEL = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_has_channel" ) );
|
||||||
|
|
||||||
|
public String oreExp = "";
|
||||||
|
OreDictPriorityList<IAEItemStack> priorityList;
|
||||||
|
|
||||||
|
public PartOreDicStorageBus( ItemStack is )
|
||||||
|
{
|
||||||
|
super( is );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readFromNBT( NBTTagCompound data )
|
||||||
|
{
|
||||||
|
super.readFromNBT( data );
|
||||||
|
this.oreExp = data.getString( "oreMatch" );
|
||||||
|
this.priorityList = new OreDictPriorityList<>( OreHelper.INSTANCE.getMatchingOre( oreExp ), oreExp );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToNBT( NBTTagCompound data )
|
||||||
|
{
|
||||||
|
super.writeToNBT( data );
|
||||||
|
data.setString( "oreMatch", getOreExp() );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onPartActivate( final EntityPlayer player, final EnumHand hand, final Vec3d pos )
|
||||||
|
{
|
||||||
|
if( Platform.isServer() )
|
||||||
|
{
|
||||||
|
Platform.openGUI( player, this.getHost().getTile(), this.getSide(), GuiBridge.GUI_OREDICTSTORAGEBUS );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GuiBridge getGuiBridge()
|
||||||
|
{
|
||||||
|
return GuiBridge.GUI_OREDICTSTORAGEBUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MEInventoryHandler<IAEItemStack> getInternalHandler()
|
||||||
|
{
|
||||||
|
if( this.cached )
|
||||||
|
{
|
||||||
|
return this.handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
final boolean wasSleeping = this.monitor == null;
|
||||||
|
|
||||||
|
this.cached = true;
|
||||||
|
final TileEntity self = this.getHost().getTile();
|
||||||
|
final TileEntity target = self.getWorld().getTileEntity( self.getPos().offset( this.getSide().getFacing() ) );
|
||||||
|
final int newHandlerHash = this.createHandlerHash( target );
|
||||||
|
|
||||||
|
if( newHandlerHash != 0 && newHandlerHash == this.handlerHash )
|
||||||
|
{
|
||||||
|
return this.handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.handlerHash = newHandlerHash;
|
||||||
|
this.handler = null;
|
||||||
|
if( this.monitor != null )
|
||||||
|
{
|
||||||
|
( (IBaseMonitor<IAEItemStack>) monitor ).removeListener( this );
|
||||||
|
}
|
||||||
|
this.monitor = null;
|
||||||
|
if( target != null )
|
||||||
|
{
|
||||||
|
IMEInventory<IAEItemStack> inv = this.getInventoryWrapper( target );
|
||||||
|
|
||||||
|
if( inv instanceof ITickingMonitor )
|
||||||
|
{
|
||||||
|
this.monitor = (ITickingMonitor) inv;
|
||||||
|
this.monitor.setActionSource( mySrc );
|
||||||
|
this.monitor.setMode( (StorageFilter) this.getConfigManager().getSetting( Settings.STORAGE_FILTER ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( inv != null )
|
||||||
|
{
|
||||||
|
this.handler = new MEInventoryHandler<>( inv, AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||||
|
|
||||||
|
this.handler.setBaseAccess( (AccessRestriction) this.getConfigManager().getSetting( Settings.ACCESS ) );
|
||||||
|
this.handler.setWhitelist( this.getInstalledUpgrades( Upgrades.INVERTER ) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST );
|
||||||
|
this.handler.setPriority( this.priority );
|
||||||
|
|
||||||
|
this.handler.setPartitionList( this.getPriorityList() );
|
||||||
|
|
||||||
|
if( inv instanceof IBaseMonitor )
|
||||||
|
{
|
||||||
|
if( ( (AccessRestriction) ( (ConfigManager) this.getConfigManager() ).getSetting( Settings.ACCESS ) ).hasPermission( AccessRestriction.READ ) )
|
||||||
|
{
|
||||||
|
( (IBaseMonitor<IAEItemStack>) inv ).addListener( this, this.handler );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// update sleep state...
|
||||||
|
if( wasSleeping != ( this.monitor == null ) )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
final ITickManager tm = this.getProxy().getTick();
|
||||||
|
if( this.monitor == null )
|
||||||
|
{
|
||||||
|
tm.sleepDevice( this.getProxy().getNode() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tm.wakeDevice( this.getProxy().getNode() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :(
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// force grid to update handlers...
|
||||||
|
( (GridStorageCache) this.getProxy().getGrid().getCache( IStorageGrid.class ) ).cellUpdate( null );
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :3
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IPartitionList<IAEItemStack> getPriorityList()
|
||||||
|
{
|
||||||
|
if( priorityList == null )
|
||||||
|
{
|
||||||
|
this.priorityList = new OreDictPriorityList<>( OreHelper.INSTANCE.getMatchingOre( oreExp ), oreExp );
|
||||||
|
}
|
||||||
|
return priorityList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOreExp()
|
||||||
|
{
|
||||||
|
if( this.oreExp == null )
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return oreExp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveOreMatch( String oreMatch )
|
||||||
|
{
|
||||||
|
if( !this.oreExp.equals( oreMatch ) )
|
||||||
|
{
|
||||||
|
this.oreExp = oreMatch;
|
||||||
|
|
||||||
|
this.priorityList = new OreDictPriorityList<>( OreHelper.INSTANCE.getMatchingOre( oreExp ), oreExp );
|
||||||
|
if( this.handler != null )
|
||||||
|
{
|
||||||
|
handler.setPartitionList( this.priorityList );
|
||||||
|
}
|
||||||
|
this.getHost().markForSave();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPartModel getStaticModels()
|
||||||
|
{
|
||||||
|
if( this.isActive() && this.isPowered() )
|
||||||
|
{
|
||||||
|
return MODELS_HAS_CHANNEL;
|
||||||
|
}
|
||||||
|
else if( this.isPowered() )
|
||||||
|
{
|
||||||
|
return MODELS_ON;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MODELS_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,229 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of Applied Energistics 2.
|
|
||||||
* Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved.
|
|
||||||
*
|
|
||||||
* 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>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package appeng.parts.misc;
|
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import appeng.api.config.AccessRestriction;
|
|
||||||
import appeng.fluids.parts.PartFluidInterface;
|
|
||||||
import appeng.fluids.tile.TileFluidInterface;
|
|
||||||
import appeng.tile.misc.TileInterface;
|
|
||||||
import appeng.tile.networking.TileCableBus;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
|
||||||
import net.minecraft.tileentity.TileEntity;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.world.IBlockAccess;
|
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
|
||||||
import appeng.api.networking.events.MENetworkCellArrayUpdate;
|
|
||||||
import appeng.api.networking.events.MENetworkChannelsChanged;
|
|
||||||
import appeng.api.networking.events.MENetworkEventSubscribe;
|
|
||||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
|
||||||
import appeng.api.networking.ticking.IGridTickable;
|
|
||||||
import appeng.api.parts.IPartCollisionHelper;
|
|
||||||
import appeng.api.storage.ICellContainer;
|
|
||||||
import appeng.api.storage.ICellInventory;
|
|
||||||
import appeng.api.storage.IMEInventoryHandler;
|
|
||||||
import appeng.api.storage.IStorageChannel;
|
|
||||||
import appeng.api.storage.channels.IItemStorageChannel;
|
|
||||||
import appeng.api.util.AECableType;
|
|
||||||
import appeng.api.util.IConfigManager;
|
|
||||||
import appeng.helpers.IPriorityHost;
|
|
||||||
import appeng.me.GridAccessException;
|
|
||||||
import appeng.parts.automation.PartUpgradeable;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author BrockWS
|
|
||||||
* @version rv6 - 22/05/2018
|
|
||||||
* @since rv6 22/05/2018
|
|
||||||
*/
|
|
||||||
public abstract class PartSharedStorageBus extends PartUpgradeable implements IGridTickable, ICellContainer, IPriorityHost
|
|
||||||
{
|
|
||||||
private boolean wasActive = false;
|
|
||||||
private int priority = 0;
|
|
||||||
protected boolean accessChanged;
|
|
||||||
protected boolean readOncePass;
|
|
||||||
|
|
||||||
public PartSharedStorageBus( ItemStack is )
|
|
||||||
{
|
|
||||||
super( is );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void updateStatus()
|
|
||||||
{
|
|
||||||
final boolean currentActive = this.getProxy().isActive();
|
|
||||||
if( this.wasActive != currentActive )
|
|
||||||
{
|
|
||||||
this.wasActive = currentActive;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
this.getProxy().getGrid().postEvent( new MENetworkCellArrayUpdate() );
|
|
||||||
this.getHost().markForUpdate();
|
|
||||||
}
|
|
||||||
catch( final GridAccessException ignore )
|
|
||||||
{
|
|
||||||
// :P
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void chanRender( final MENetworkChannelsChanged changedChannels )
|
|
||||||
{
|
|
||||||
this.updateStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper method to get this parts storage channel
|
|
||||||
*
|
|
||||||
* @return Storage channel
|
|
||||||
*/
|
|
||||||
public IStorageChannel getStorageChannel()
|
|
||||||
{
|
|
||||||
return AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract void resetCache();
|
|
||||||
|
|
||||||
protected abstract void resetCache( boolean fullReset );
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<IMEInventoryHandler> getCellArray( final IStorageChannel channel )
|
|
||||||
{
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void blinkCell( int slot )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void saveChanges( ICellInventory<?> cellInventory )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority()
|
|
||||||
{
|
|
||||||
return this.priority;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPriority( final int newValue )
|
|
||||||
{
|
|
||||||
this.priority = newValue;
|
|
||||||
this.getHost().markForSave();
|
|
||||||
this.resetCache( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void powerRender( final MENetworkPowerStatusChange c )
|
|
||||||
{
|
|
||||||
this.updateStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void upgradesChanged()
|
|
||||||
{
|
|
||||||
super.upgradesChanged();
|
|
||||||
this.resetCache( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateSetting( final IConfigManager manager, final Enum settingName, final Enum newValue )
|
|
||||||
{
|
|
||||||
if( settingName.name().equals( "ACCESS" ) )
|
|
||||||
{
|
|
||||||
this.accessChanged = true;
|
|
||||||
}
|
|
||||||
this.resetCache( true );
|
|
||||||
this.getHost().markForSave();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onNeighborChanged( IBlockAccess w, BlockPos pos, BlockPos neighbor )
|
|
||||||
{
|
|
||||||
if( pos.offset( this.getSide().getFacing() ).equals( neighbor ) )
|
|
||||||
{
|
|
||||||
|
|
||||||
final TileEntity te = w.getTileEntity( neighbor );
|
|
||||||
|
|
||||||
// In case the TE was destroyed, we have to do a full reset immediately.
|
|
||||||
if( te instanceof TileCableBus )
|
|
||||||
{
|
|
||||||
if( ( (TileCableBus) te ).getPart( this.getSide().getOpposite() ) instanceof PartFluidInterface )
|
|
||||||
{
|
|
||||||
this.resetCache( true );
|
|
||||||
this.resetCache();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( te == null || te instanceof TileFluidInterface )
|
|
||||||
{
|
|
||||||
this.resetCache( true );
|
|
||||||
this.resetCache();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.resetCache( false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void readFromNBT( final NBTTagCompound data )
|
|
||||||
{
|
|
||||||
super.readFromNBT( data );
|
|
||||||
this.priority = data.getInteger( "priority" );
|
|
||||||
this.accessChanged = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToNBT( final NBTTagCompound data )
|
|
||||||
{
|
|
||||||
super.writeToNBT( data );
|
|
||||||
data.setInteger( "priority", this.priority );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void getBoxes( final IPartCollisionHelper bch )
|
|
||||||
{
|
|
||||||
bch.addBox( 3, 3, 15, 13, 13, 16 );
|
|
||||||
bch.addBox( 2, 2, 14, 14, 14, 15 );
|
|
||||||
bch.addBox( 5, 5, 12, 11, 11, 14 );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getUpgradeSlots()
|
|
||||||
{
|
|
||||||
return 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public float getCableConnectionLength( AECableType cable )
|
|
||||||
{
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -19,15 +19,51 @@
|
|||||||
package appeng.parts.misc;
|
package appeng.parts.misc;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collections;
|
import appeng.api.AEApi;
|
||||||
import java.util.List;
|
import appeng.api.config.*;
|
||||||
import java.util.Objects;
|
import appeng.api.networking.IGridNode;
|
||||||
|
import appeng.api.networking.events.MENetworkCellArrayUpdate;
|
||||||
|
import appeng.api.networking.events.MENetworkChannelsChanged;
|
||||||
|
import appeng.api.networking.events.MENetworkEventSubscribe;
|
||||||
|
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
||||||
|
import appeng.api.networking.security.IActionSource;
|
||||||
|
import appeng.api.networking.storage.IBaseMonitor;
|
||||||
import appeng.api.networking.storage.IStorageGrid;
|
import appeng.api.networking.storage.IStorageGrid;
|
||||||
|
import appeng.api.networking.ticking.IGridTickable;
|
||||||
|
import appeng.api.networking.ticking.ITickManager;
|
||||||
|
import appeng.api.networking.ticking.TickRateModulation;
|
||||||
|
import appeng.api.networking.ticking.TickingRequest;
|
||||||
|
import appeng.api.parts.IPart;
|
||||||
|
import appeng.api.parts.IPartCollisionHelper;
|
||||||
|
import appeng.api.parts.IPartModel;
|
||||||
|
import appeng.api.storage.*;
|
||||||
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
|
import appeng.api.storage.data.IItemList;
|
||||||
|
import appeng.api.util.AECableType;
|
||||||
|
import appeng.api.util.IConfigManager;
|
||||||
|
import appeng.capabilities.Capabilities;
|
||||||
|
import appeng.core.AppEng;
|
||||||
|
import appeng.core.settings.TickRates;
|
||||||
|
import appeng.core.sync.GuiBridge;
|
||||||
|
import appeng.helpers.IPriorityHost;
|
||||||
|
import appeng.helpers.Reflected;
|
||||||
|
import appeng.items.parts.PartModels;
|
||||||
|
import appeng.me.GridAccessException;
|
||||||
import appeng.me.cache.GridStorageCache;
|
import appeng.me.cache.GridStorageCache;
|
||||||
|
import appeng.me.helpers.MachineSource;
|
||||||
|
import appeng.me.storage.ITickingMonitor;
|
||||||
|
import appeng.me.storage.MEInventoryHandler;
|
||||||
|
import appeng.parts.PartModel;
|
||||||
|
import appeng.parts.automation.PartUpgradeable;
|
||||||
|
import appeng.tile.inventory.AppEngInternalAEInventory;
|
||||||
import appeng.tile.misc.TileInterface;
|
import appeng.tile.misc.TileInterface;
|
||||||
import appeng.tile.networking.TileCableBus;
|
import appeng.tile.networking.TileCableBus;
|
||||||
import appeng.util.ConfigManager;
|
import appeng.util.ConfigManager;
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import appeng.util.inv.InvOperation;
|
||||||
|
import appeng.util.prioritylist.FuzzyPriorityList;
|
||||||
|
import appeng.util.prioritylist.PrecisePriorityList;
|
||||||
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -44,85 +80,29 @@ import net.minecraftforge.common.capabilities.CapabilityInject;
|
|||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import java.util.Collections;
|
||||||
import appeng.api.config.AccessRestriction;
|
import java.util.List;
|
||||||
import appeng.api.config.FuzzyMode;
|
import java.util.Objects;
|
||||||
import appeng.api.config.IncludeExclude;
|
|
||||||
import appeng.api.config.Settings;
|
|
||||||
import appeng.api.config.StorageFilter;
|
|
||||||
import appeng.api.config.Upgrades;
|
|
||||||
import appeng.api.networking.IGridNode;
|
|
||||||
import appeng.api.networking.events.MENetworkCellArrayUpdate;
|
|
||||||
import appeng.api.networking.events.MENetworkChannelsChanged;
|
|
||||||
import appeng.api.networking.events.MENetworkEventSubscribe;
|
|
||||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
|
||||||
import appeng.api.networking.security.IActionSource;
|
|
||||||
import appeng.api.networking.storage.IBaseMonitor;
|
|
||||||
import appeng.api.networking.ticking.IGridTickable;
|
|
||||||
import appeng.api.networking.ticking.ITickManager;
|
|
||||||
import appeng.api.networking.ticking.TickRateModulation;
|
|
||||||
import appeng.api.networking.ticking.TickingRequest;
|
|
||||||
import appeng.api.parts.IPartCollisionHelper;
|
|
||||||
import appeng.api.parts.IPartHost;
|
|
||||||
import appeng.api.parts.IPartModel;
|
|
||||||
import appeng.api.storage.ICellContainer;
|
|
||||||
import appeng.api.storage.ICellInventory;
|
|
||||||
import appeng.api.storage.IMEInventory;
|
|
||||||
import appeng.api.storage.IMEInventoryHandler;
|
|
||||||
import appeng.api.storage.IMEMonitorHandlerReceiver;
|
|
||||||
import appeng.api.storage.IStorageChannel;
|
|
||||||
import appeng.api.storage.IStorageMonitorable;
|
|
||||||
import appeng.api.storage.IStorageMonitorableAccessor;
|
|
||||||
import appeng.api.storage.channels.IItemStorageChannel;
|
|
||||||
import appeng.api.storage.data.IAEItemStack;
|
|
||||||
import appeng.api.storage.data.IItemList;
|
|
||||||
import appeng.api.util.AECableType;
|
|
||||||
import appeng.api.util.AEPartLocation;
|
|
||||||
import appeng.api.util.IConfigManager;
|
|
||||||
import appeng.capabilities.Capabilities;
|
|
||||||
import appeng.core.AppEng;
|
|
||||||
import appeng.core.settings.TickRates;
|
|
||||||
import appeng.core.sync.GuiBridge;
|
|
||||||
import appeng.helpers.IInterfaceHost;
|
|
||||||
import appeng.helpers.IPriorityHost;
|
|
||||||
import appeng.helpers.Reflected;
|
|
||||||
import appeng.items.parts.PartModels;
|
|
||||||
import appeng.me.GridAccessException;
|
|
||||||
import appeng.me.helpers.MachineSource;
|
|
||||||
import appeng.me.storage.ITickingMonitor;
|
|
||||||
import appeng.me.storage.MEInventoryHandler;
|
|
||||||
import appeng.parts.PartModel;
|
|
||||||
import appeng.parts.automation.PartUpgradeable;
|
|
||||||
import appeng.tile.inventory.AppEngInternalAEInventory;
|
|
||||||
import appeng.util.Platform;
|
|
||||||
import appeng.util.inv.InvOperation;
|
|
||||||
import appeng.util.prioritylist.FuzzyPriorityList;
|
|
||||||
import appeng.util.prioritylist.PrecisePriorityList;
|
|
||||||
|
|
||||||
|
|
||||||
public class PartStorageBus extends PartUpgradeable implements IGridTickable, ICellContainer, IMEMonitorHandlerReceiver<IAEItemStack>, IPriorityHost
|
public class PartStorageBus extends PartUpgradeable implements IGridTickable, ICellContainer, IMEMonitorHandlerReceiver<IAEItemStack>, IPriorityHost
|
||||||
{
|
{
|
||||||
@CapabilityInject(IItemRepository.class)
|
|
||||||
public static Capability<IItemRepository> ITEM_REPOSITORY_CAPABILITY = null;
|
|
||||||
|
|
||||||
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_base" );
|
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_base" );
|
||||||
|
|
||||||
@PartModels
|
@PartModels
|
||||||
public static final IPartModel MODELS_OFF = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_off" ) );
|
public static final IPartModel MODELS_OFF = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_off" ) );
|
||||||
|
|
||||||
@PartModels
|
@PartModels
|
||||||
public static final IPartModel MODELS_ON = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_on" ) );
|
public static final IPartModel MODELS_ON = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_on" ) );
|
||||||
|
|
||||||
@PartModels
|
@PartModels
|
||||||
public static final IPartModel MODELS_HAS_CHANNEL = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_has_channel" ) );
|
public static final IPartModel MODELS_HAS_CHANNEL = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_has_channel" ) );
|
||||||
|
@CapabilityInject( IItemRepository.class )
|
||||||
private final IActionSource mySrc;
|
public static Capability<IItemRepository> ITEM_REPOSITORY_CAPABILITY = null;
|
||||||
private final AppEngInternalAEInventory Config = new AppEngInternalAEInventory( this, 63 );
|
protected final IActionSource mySrc;
|
||||||
private int priority = 0;
|
protected final AppEngInternalAEInventory Config = new AppEngInternalAEInventory( this, 63 );
|
||||||
private boolean cached = false;
|
protected int priority = 0;
|
||||||
private ITickingMonitor monitor = null;
|
protected boolean cached = false;
|
||||||
private MEInventoryHandler<IAEItemStack> handler = null;
|
protected ITickingMonitor monitor = null;
|
||||||
private int handlerHash = 0;
|
protected MEInventoryHandler<IAEItemStack> handler = null;
|
||||||
|
protected int handlerHash = 0;
|
||||||
private boolean wasActive = false;
|
private boolean wasActive = false;
|
||||||
private byte resetCacheLogic = 0;
|
private byte resetCacheLogic = 0;
|
||||||
private boolean accessChanged;
|
private boolean accessChanged;
|
||||||
@@ -235,9 +215,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
|
|
||||||
private void resetCache( final boolean fullReset )
|
private void resetCache( final boolean fullReset )
|
||||||
{
|
{
|
||||||
if( this.getHost() == null || this.getHost().getTile() == null || this.getHost().getTile().getWorld() == null || this.getHost()
|
if( this.getHost() == null || this.getHost().getTile() == null || this.getHost().getTile().getWorld() == null || this.getHost().getTile().getWorld().isRemote )
|
||||||
.getTile()
|
|
||||||
.getWorld().isRemote )
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -278,7 +256,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
readOncePass = false;
|
readOncePass = false;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.getProxy().getStorage().postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ), change, source );
|
this.getProxy().getStorage().postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ), change, mySrc );
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
{
|
{
|
||||||
@@ -320,23 +298,39 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
{
|
{
|
||||||
if( pos.offset( this.getSide().getFacing() ).equals( neighbor ) )
|
if( pos.offset( this.getSide().getFacing() ).equals( neighbor ) )
|
||||||
{
|
{
|
||||||
|
|
||||||
final TileEntity te = w.getTileEntity( neighbor );
|
final TileEntity te = w.getTileEntity( neighbor );
|
||||||
|
|
||||||
// In case the TE was destroyed, we have to do a full reset immediately.
|
// In case the TE was destroyed, we have to do a full reset immediately.
|
||||||
if( te instanceof TileCableBus )
|
if( te instanceof TileCableBus )
|
||||||
{
|
{
|
||||||
if( ( (TileCableBus) te ).getPart( this.getSide().getOpposite() ) instanceof PartInterface )
|
IPart iPart = ( (TileCableBus) te ).getPart( this.getSide().getOpposite() );
|
||||||
|
if( iPart == null )
|
||||||
|
{
|
||||||
|
this.resetCache( true );
|
||||||
|
this.resetCache();
|
||||||
|
}
|
||||||
|
else if( iPart instanceof PartInterface )
|
||||||
|
{
|
||||||
|
if( createHandlerHash( te ) != handlerHash )
|
||||||
{
|
{
|
||||||
this.resetCache( true );
|
this.resetCache( true );
|
||||||
this.resetCache();
|
this.resetCache();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( te == null || te instanceof TileInterface )
|
}
|
||||||
|
else if( te == null )
|
||||||
{
|
{
|
||||||
this.resetCache( true );
|
this.resetCache( true );
|
||||||
this.resetCache();
|
this.resetCache();
|
||||||
}
|
}
|
||||||
|
else if( te instanceof TileInterface )
|
||||||
|
{
|
||||||
|
if( createHandlerHash( te ) != handlerHash )
|
||||||
|
{
|
||||||
|
this.resetCache( true );
|
||||||
|
this.resetCache();
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.resetCache( false );
|
this.resetCache( false );
|
||||||
@@ -431,7 +425,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private IMEInventory<IAEItemStack> getInventoryWrapper( TileEntity target )
|
IMEInventory<IAEItemStack> getInventoryWrapper( TileEntity target )
|
||||||
{
|
{
|
||||||
|
|
||||||
EnumFacing targetSide = this.getSide().getFacing().getOpposite();
|
EnumFacing targetSide = this.getSide().getFacing().getOpposite();
|
||||||
@@ -455,7 +449,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check via cap for IItemRepository
|
// Check via cap for IItemRepository
|
||||||
if (ITEM_REPOSITORY_CAPABILITY != null && target.hasCapability( ITEM_REPOSITORY_CAPABILITY, targetSide ))
|
if( ITEM_REPOSITORY_CAPABILITY != null && target.hasCapability( ITEM_REPOSITORY_CAPABILITY, targetSide ) )
|
||||||
{
|
{
|
||||||
IItemRepository handlerRepo = target.getCapability( ITEM_REPOSITORY_CAPABILITY, targetSide );
|
IItemRepository handlerRepo = target.getCapability( ITEM_REPOSITORY_CAPABILITY, targetSide );
|
||||||
if( handlerRepo != null )
|
if( handlerRepo != null )
|
||||||
@@ -474,7 +468,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private int createHandlerHash( TileEntity target )
|
int createHandlerHash( TileEntity target )
|
||||||
{
|
{
|
||||||
if( target == null )
|
if( target == null )
|
||||||
{
|
{
|
||||||
@@ -485,6 +479,15 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
|
|
||||||
if( target.hasCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) )
|
if( target.hasCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) )
|
||||||
{
|
{
|
||||||
|
IStorageMonitorableAccessor accessor = target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide );
|
||||||
|
if( accessor != null )
|
||||||
|
{
|
||||||
|
IStorageMonitorable inventory = accessor.getInventory( this.mySrc );
|
||||||
|
if( inventory != null )
|
||||||
|
{
|
||||||
|
return Objects.hash( target, inventory.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
return Objects.hash( target, target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) );
|
return Objects.hash( target, target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -537,9 +540,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
|
|
||||||
if( inv != null )
|
if( inv != null )
|
||||||
{
|
{
|
||||||
this.checkInterfaceVsStorageBus( target, this.getSide().getOpposite() );
|
this.handler = new MEInventoryHandler<>( inv, AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||||
|
|
||||||
this.handler = new MEInventoryHandler<IAEItemStack>( inv, AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
|
||||||
|
|
||||||
this.handler.setBaseAccess( (AccessRestriction) this.getConfigManager().getSetting( Settings.ACCESS ) );
|
this.handler.setBaseAccess( (AccessRestriction) this.getConfigManager().getSetting( Settings.ACCESS ) );
|
||||||
this.handler.setWhitelist( this.getInstalledUpgrades( Upgrades.INVERTER ) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST );
|
this.handler.setWhitelist( this.getInstalledUpgrades( Upgrades.INVERTER ) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST );
|
||||||
@@ -559,13 +560,11 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
|
|
||||||
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
||||||
{
|
{
|
||||||
this.handler
|
this.handler.setPartitionList( new FuzzyPriorityList<>( priorityList, (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE ) ) );
|
||||||
.setPartitionList( new FuzzyPriorityList<IAEItemStack>( priorityList, (FuzzyMode) this.getConfigManager()
|
|
||||||
.getSetting( Settings.FUZZY_MODE ) ) );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.handler.setPartitionList( new PrecisePriorityList<IAEItemStack>( priorityList ) );
|
this.handler.setPartitionList( new PrecisePriorityList<>( priorityList ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( inv instanceof IBaseMonitor )
|
if( inv instanceof IBaseMonitor )
|
||||||
@@ -602,7 +601,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// force grid to update handlers...
|
// force grid to update handlers...
|
||||||
(( GridStorageCache ) this.getProxy().getGrid().getCache( IStorageGrid.class )).cellUpdate( null );
|
( (GridStorageCache) this.getProxy().getGrid().getCache( IStorageGrid.class ) ).cellUpdate( null );
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
{
|
{
|
||||||
@@ -612,32 +611,6 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
return this.handler;
|
return this.handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkInterfaceVsStorageBus( final TileEntity target, final AEPartLocation side )
|
|
||||||
{
|
|
||||||
IInterfaceHost achievement = null;
|
|
||||||
|
|
||||||
if( target instanceof IInterfaceHost )
|
|
||||||
{
|
|
||||||
achievement = (IInterfaceHost) target;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( target instanceof IPartHost )
|
|
||||||
{
|
|
||||||
final Object part = ( (IPartHost) target ).getPart( side );
|
|
||||||
if( part instanceof IInterfaceHost )
|
|
||||||
{
|
|
||||||
achievement = (IInterfaceHost) part;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( achievement != null && achievement.getActionableNode() != null )
|
|
||||||
{
|
|
||||||
// Platform.addStat( achievement.getActionableNode().getPlayerID(), Achievements.Recursive.getAchievement()
|
|
||||||
// );
|
|
||||||
// Platform.addStat( getActionableNode().getPlayerID(), Achievements.Recursive.getAchievement() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<IMEInventoryHandler> getCellArray( final IStorageChannel channel )
|
public List<IMEInventoryHandler> getCellArray( final IStorageChannel channel )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,308 @@
|
|||||||
|
package appeng.parts.p2p;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import appeng.api.parts.IPartModel;
|
||||||
|
import appeng.items.parts.PartModels;
|
||||||
|
import appeng.me.GridAccessException;
|
||||||
|
import gregtech.api.capability.GregtechCapabilities;
|
||||||
|
import gregtech.api.capability.IEnergyContainer;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraftforge.common.capabilities.Capability;
|
||||||
|
import net.minecraftforge.fml.common.Optional;
|
||||||
|
|
||||||
|
import java.util.ArrayDeque;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Queue;
|
||||||
|
|
||||||
|
|
||||||
|
public class PartP2PGTCEPower extends PartP2PTunnel<PartP2PGTCEPower>
|
||||||
|
{
|
||||||
|
private static final P2PModels MODELS = new P2PModels( "part/p2p/p2p_tunnel_gteu" );
|
||||||
|
private static final IEnergyContainer NULL_ENERGY_STORAGE = new NullEnergyStorage();
|
||||||
|
private final IEnergyContainer inputHandler = new InputEnergyStorage();
|
||||||
|
private final IEnergyContainer outputHandler = new OutputEnergyStorage();
|
||||||
|
private final Queue<PartP2PGTCEPower> outputs = new ArrayDeque<>();
|
||||||
|
|
||||||
|
public PartP2PGTCEPower( ItemStack is )
|
||||||
|
{
|
||||||
|
super( is );
|
||||||
|
}
|
||||||
|
|
||||||
|
@PartModels
|
||||||
|
public static List<IPartModel> getModels()
|
||||||
|
{
|
||||||
|
return MODELS.getModels();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPartModel getStaticModels()
|
||||||
|
{
|
||||||
|
return MODELS.getModel( this.isPowered(), this.isActive() );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTunnelNetworkChange()
|
||||||
|
{
|
||||||
|
this.getHost().notifyNeighbors();
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnergyContainer getAttachedEnergyStorage()
|
||||||
|
{
|
||||||
|
if( this.isActive() )
|
||||||
|
{
|
||||||
|
final TileEntity self = this.getTile();
|
||||||
|
final TileEntity te = self.getWorld().getTileEntity( self.getPos().offset( this.getSide().getFacing() ) );
|
||||||
|
|
||||||
|
if( te != null && te.hasCapability( GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER, this.getSide().getOpposite().getFacing() ) )
|
||||||
|
{
|
||||||
|
return te.getCapability( GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER, this.getSide().getOpposite().getFacing() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL_ENERGY_STORAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasCapability( @Nonnull Capability<?> capability )
|
||||||
|
{
|
||||||
|
if( capability == GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.hasCapability( capability );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public <T> T getCapability( @Nonnull Capability<T> capability )
|
||||||
|
{
|
||||||
|
if( capability == GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER )
|
||||||
|
{
|
||||||
|
if( this.isOutput() )
|
||||||
|
{
|
||||||
|
return (T) this.outputHandler;
|
||||||
|
}
|
||||||
|
return (T) this.inputHandler;
|
||||||
|
}
|
||||||
|
return super.getCapability( capability );
|
||||||
|
}
|
||||||
|
|
||||||
|
class InputEnergyStorage implements IEnergyContainer
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public long getEnergyCanBeInserted()
|
||||||
|
{
|
||||||
|
long canInsert = 0;
|
||||||
|
if( outputs.isEmpty() )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for( PartP2PGTCEPower o : PartP2PGTCEPower.this.getOutputs() )
|
||||||
|
outputs.add( o );
|
||||||
|
}
|
||||||
|
catch( GridAccessException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while ( !outputs.isEmpty() )
|
||||||
|
{
|
||||||
|
PartP2PGTCEPower target = outputs.poll();
|
||||||
|
final IEnergyContainer output = target.getAttachedEnergyStorage();
|
||||||
|
|
||||||
|
if( output == null || output.getEnergyCanBeInserted() <= 0 )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
canInsert += output.getEnergyCanBeInserted();
|
||||||
|
}
|
||||||
|
return canInsert;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long acceptEnergyFromNetwork( EnumFacing facing, long voltage, long amperage )
|
||||||
|
{
|
||||||
|
long amperesUsed = 0L;
|
||||||
|
|
||||||
|
if( outputs.isEmpty() )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for( PartP2PGTCEPower o : PartP2PGTCEPower.this.getOutputs() )
|
||||||
|
outputs.add( o );
|
||||||
|
}
|
||||||
|
catch( GridAccessException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while ( !outputs.isEmpty() )
|
||||||
|
{
|
||||||
|
PartP2PGTCEPower target = outputs.poll();
|
||||||
|
final IEnergyContainer output = target.getAttachedEnergyStorage();
|
||||||
|
|
||||||
|
if( output == null || !output.inputsEnergy( facing ) || output.getEnergyCanBeInserted() <= 0 )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( voltage > 0 )
|
||||||
|
{
|
||||||
|
amperesUsed += output.acceptEnergyFromNetwork( facing, voltage, amperage - amperesUsed );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( amperage == amperesUsed )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return amperesUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean inputsEnergy( EnumFacing enumFacing )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long changeEnergy( long l )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEnergyStored()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEnergyCapacity()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getInputAmperage()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getInputVoltage()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class OutputEnergyStorage implements IEnergyContainer
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public long acceptEnergyFromNetwork( EnumFacing facing, long voltage, long amperage )
|
||||||
|
{
|
||||||
|
if( facing == getSide().getFacing() )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
final IEnergyContainer output = getAttachedEnergyStorage();
|
||||||
|
voltage *= 0.95;
|
||||||
|
if( voltage > 0 )
|
||||||
|
{
|
||||||
|
return output.acceptEnergyFromNetwork( facing, voltage, amperage );
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean inputsEnergy( EnumFacing enumFacing )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean outputsEnergy( EnumFacing side )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long changeEnergy( long l )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEnergyStored()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEnergyCapacity()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getInputAmperage()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getInputVoltage()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class NullEnergyStorage implements IEnergyContainer
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public long acceptEnergyFromNetwork( EnumFacing enumFacing, long l, long l1 )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean inputsEnergy( EnumFacing enumFacing )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long changeEnergy( long l )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEnergyStored()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEnergyCapacity()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getInputAmperage()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getInputVoltage()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,10 +33,6 @@ import net.minecraftforge.items.IItemHandler;
|
|||||||
import net.minecraftforge.items.wrapper.EmptyHandler;
|
import net.minecraftforge.items.wrapper.EmptyHandler;
|
||||||
|
|
||||||
import appeng.api.networking.IGridNode;
|
import appeng.api.networking.IGridNode;
|
||||||
import appeng.api.networking.events.MENetworkBootingStatusChange;
|
|
||||||
import appeng.api.networking.events.MENetworkChannelsChanged;
|
|
||||||
import appeng.api.networking.events.MENetworkEventSubscribe;
|
|
||||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
|
||||||
import appeng.api.networking.ticking.IGridTickable;
|
import appeng.api.networking.ticking.IGridTickable;
|
||||||
import appeng.api.networking.ticking.TickRateModulation;
|
import appeng.api.networking.ticking.TickRateModulation;
|
||||||
import appeng.api.networking.ticking.TickingRequest;
|
import appeng.api.networking.ticking.TickingRequest;
|
||||||
@@ -75,15 +71,18 @@ public class PartP2PItems extends PartP2PTunnel<PartP2PItems> implements IItemHa
|
|||||||
{
|
{
|
||||||
this.cachedInv = null;
|
this.cachedInv = null;
|
||||||
try
|
try
|
||||||
|
{
|
||||||
|
if( this.isOutput() )
|
||||||
{
|
{
|
||||||
for( PartP2PItems input : this.getInputs() )
|
for( PartP2PItems input : this.getInputs() )
|
||||||
{
|
{
|
||||||
if( input != null && this.isOutput() )
|
if( input != null )
|
||||||
{
|
{
|
||||||
input.onTunnelNetworkChange();
|
input.onTunnelNetworkChange();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
catch( GridAccessException e )
|
catch( GridAccessException e )
|
||||||
{
|
{
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -171,51 +170,6 @@ public class PartP2PItems extends PartP2PTunnel<PartP2PItems> implements IItemHa
|
|||||||
return wasReq ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
|
return wasReq ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateA( final MENetworkBootingStatusChange bs )
|
|
||||||
{
|
|
||||||
if( !this.isOutput() )
|
|
||||||
{
|
|
||||||
this.cachedInv = null;
|
|
||||||
final int olderSize = this.oldSize;
|
|
||||||
this.oldSize = this.getDestination().getSlots();
|
|
||||||
if( olderSize != this.oldSize )
|
|
||||||
{
|
|
||||||
this.getHost().notifyNeighbors();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateB( final MENetworkChannelsChanged bs )
|
|
||||||
{
|
|
||||||
if( !this.isOutput() )
|
|
||||||
{
|
|
||||||
this.cachedInv = null;
|
|
||||||
final int olderSize = this.oldSize;
|
|
||||||
this.oldSize = this.getDestination().getSlots();
|
|
||||||
if( olderSize != this.oldSize )
|
|
||||||
{
|
|
||||||
this.getHost().notifyNeighbors();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateC( final MENetworkPowerStatusChange bs )
|
|
||||||
{
|
|
||||||
if( !this.isOutput() )
|
|
||||||
{
|
|
||||||
this.cachedInv = null;
|
|
||||||
final int olderSize = this.oldSize;
|
|
||||||
this.oldSize = this.getDestination().getSlots();
|
|
||||||
if( olderSize != this.oldSize )
|
|
||||||
{
|
|
||||||
this.getHost().notifyNeighbors();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTunnelNetworkChange()
|
public void onTunnelNetworkChange()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ import net.minecraft.world.IBlockAccess;
|
|||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import appeng.api.networking.IGridNode;
|
import appeng.api.networking.IGridNode;
|
||||||
import appeng.api.networking.events.MENetworkChannelsChanged;
|
|
||||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
|
||||||
import appeng.api.networking.ticking.IGridTickable;
|
import appeng.api.networking.ticking.IGridTickable;
|
||||||
import appeng.api.networking.ticking.TickRateModulation;
|
import appeng.api.networking.ticking.TickRateModulation;
|
||||||
import appeng.api.networking.ticking.TickingRequest;
|
import appeng.api.networking.ticking.TickingRequest;
|
||||||
@@ -62,20 +60,6 @@ public class PartP2PLight extends PartP2PTunnel<PartP2PLight> implements IGridTi
|
|||||||
super( is );
|
super( is );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void chanRender( final MENetworkChannelsChanged c )
|
|
||||||
{
|
|
||||||
this.onTunnelNetworkChange();
|
|
||||||
super.chanRender( c );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void powerRender( final MENetworkPowerStatusChange c )
|
|
||||||
{
|
|
||||||
this.onTunnelNetworkChange();
|
|
||||||
super.powerRender( c );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeToStream( final ByteBuf data ) throws IOException
|
public void writeToStream( final ByteBuf data ) throws IOException
|
||||||
{
|
{
|
||||||
@@ -115,9 +99,17 @@ public class PartP2PLight extends PartP2PTunnel<PartP2PLight> implements IGridTi
|
|||||||
this.lastValue = newLevel;
|
this.lastValue = newLevel;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
int light = 0;
|
||||||
|
for( PartP2PLight src : this.getInputs() )
|
||||||
|
{
|
||||||
|
if( src != null && src.getProxy().isActive() )
|
||||||
|
{
|
||||||
|
light = Math.max( light, src.lastValue );
|
||||||
|
}
|
||||||
|
}
|
||||||
for( final PartP2PLight out : this.getOutputs() )
|
for( final PartP2PLight out : this.getOutputs() )
|
||||||
{
|
{
|
||||||
out.setLightLevel( this.lastValue );
|
out.setLightLevel( light );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
@@ -198,18 +190,17 @@ public class PartP2PLight extends PartP2PTunnel<PartP2PLight> implements IGridTi
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
int light = 0;
|
||||||
for( PartP2PLight src : this.getInputs() )
|
for( PartP2PLight src : this.getInputs() )
|
||||||
{
|
{
|
||||||
if( src != null && src.getProxy().isActive() )
|
if( src != null && src.getProxy().isActive() )
|
||||||
{
|
{
|
||||||
this.setLightLevel( src.lastValue );
|
light = Math.max( light, src.lastValue );
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
{
|
this.setLightLevel( light );
|
||||||
this.getHost().markForUpdate();
|
this.getHost().markForUpdate();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
catch( GridAccessException e )
|
catch( GridAccessException e )
|
||||||
{
|
{
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
@@ -31,10 +31,6 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
import net.minecraft.world.IBlockAccess;
|
import net.minecraft.world.IBlockAccess;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import appeng.api.networking.events.MENetworkBootingStatusChange;
|
|
||||||
import appeng.api.networking.events.MENetworkChannelsChanged;
|
|
||||||
import appeng.api.networking.events.MENetworkEventSubscribe;
|
|
||||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
|
||||||
import appeng.api.parts.IPartModel;
|
import appeng.api.parts.IPartModel;
|
||||||
import appeng.items.parts.PartModels;
|
import appeng.items.parts.PartModels;
|
||||||
import appeng.me.GridAccessException;
|
import appeng.me.GridAccessException;
|
||||||
@@ -60,25 +56,21 @@ public class PartP2PRedstone extends PartP2PTunnel<PartP2PRedstone>
|
|||||||
super( is );
|
super( is );
|
||||||
}
|
}
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateA( final MENetworkBootingStatusChange bs )
|
|
||||||
{
|
|
||||||
this.setNetworkReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setNetworkReady()
|
private void setNetworkReady()
|
||||||
{
|
{
|
||||||
if( this.isOutput() )
|
if( this.isOutput() )
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
int power = 0;
|
||||||
for( PartP2PRedstone in : this.getInputs() )
|
for( PartP2PRedstone in : this.getInputs() )
|
||||||
{
|
{
|
||||||
if( in != null )
|
if( in != null )
|
||||||
{
|
{
|
||||||
this.putInput( in.power );
|
power = Math.max( power, in.power );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.putInput( power );
|
||||||
}
|
}
|
||||||
catch( GridAccessException e )
|
catch( GridAccessException e )
|
||||||
{
|
{
|
||||||
@@ -95,7 +87,9 @@ public class PartP2PRedstone extends PartP2PTunnel<PartP2PRedstone>
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.recursive = true;
|
this.recursive = true;
|
||||||
if( this.isOutput() && this.getProxy().isActive() )
|
if( this.isOutput() )
|
||||||
|
{
|
||||||
|
if( this.getProxy().isActive() )
|
||||||
{
|
{
|
||||||
final int newPower = (Integer) o;
|
final int newPower = (Integer) o;
|
||||||
if( this.power != newPower )
|
if( this.power != newPower )
|
||||||
@@ -104,6 +98,12 @@ public class PartP2PRedstone extends PartP2PTunnel<PartP2PRedstone>
|
|||||||
this.notifyNeighbors();
|
this.notifyNeighbors();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.power = 0;
|
||||||
|
this.notifyNeighbors();
|
||||||
|
}
|
||||||
|
}
|
||||||
this.recursive = false;
|
this.recursive = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,18 +120,6 @@ public class PartP2PRedstone extends PartP2PTunnel<PartP2PRedstone>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateB( final MENetworkChannelsChanged bs )
|
|
||||||
{
|
|
||||||
this.setNetworkReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateC( final MENetworkPowerStatusChange bs )
|
|
||||||
{
|
|
||||||
this.setNetworkReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readFromNBT( final NBTTagCompound tag )
|
public void readFromNBT( final NBTTagCompound tag )
|
||||||
{
|
{
|
||||||
@@ -176,7 +164,22 @@ public class PartP2PRedstone extends PartP2PTunnel<PartP2PRedstone>
|
|||||||
|
|
||||||
this.power = b.getWeakPower( state, this.getTile().getWorld(), target, srcSide );
|
this.power = b.getWeakPower( state, this.getTile().getWorld(), target, srcSide );
|
||||||
this.power = Math.max( this.power, b.getWeakPower( state, this.getTile().getWorld(), target, srcSide ) );
|
this.power = Math.max( this.power, b.getWeakPower( state, this.getTile().getWorld(), target, srcSide ) );
|
||||||
this.sendToOutput( this.power );
|
int powerOut = this.power;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for( PartP2PRedstone in : this.getInputs() )
|
||||||
|
{
|
||||||
|
if( in != null )
|
||||||
|
{
|
||||||
|
powerOut = Math.max( in.power, powerOut );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( GridAccessException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
this.sendToOutput( powerOut );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import appeng.api.networking.events.MENetworkBootingStatusChange;
|
||||||
|
import appeng.api.networking.events.MENetworkChannelsChanged;
|
||||||
|
import appeng.api.networking.events.MENetworkEventSubscribe;
|
||||||
|
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
@@ -153,6 +157,30 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
|
|||||||
data.writeShort( this.getFrequency() );
|
data.writeShort( this.getFrequency() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@MENetworkEventSubscribe
|
||||||
|
public void chanRender( final MENetworkChannelsChanged c )
|
||||||
|
{
|
||||||
|
this.onTunnelNetworkChange();
|
||||||
|
super.chanRender( c );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@MENetworkEventSubscribe
|
||||||
|
public void powerRender( final MENetworkPowerStatusChange c )
|
||||||
|
{
|
||||||
|
this.onTunnelNetworkChange();
|
||||||
|
super.powerRender( c );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@MENetworkEventSubscribe
|
||||||
|
public void bootingRender( final MENetworkBootingStatusChange bs )
|
||||||
|
{
|
||||||
|
this.onTunnelNetworkChange();
|
||||||
|
super.bootingRender( bs );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getCableConnectionLength( AECableType cable )
|
public float getCableConnectionLength( AECableType cable )
|
||||||
{
|
{
|
||||||
@@ -178,7 +206,13 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ItemStack is = player.getHeldItem( hand );
|
boolean pasteAsOutput = true;
|
||||||
|
ItemStack is = player.getHeldItem( hand );
|
||||||
|
if( is.isEmpty() )
|
||||||
|
{
|
||||||
|
pasteAsOutput = false;
|
||||||
|
is = player.getHeldItemOffhand();
|
||||||
|
}
|
||||||
|
|
||||||
// UniqueIdentifier id = GameRegistry.findUniqueIdentifierFor( is.getItem() );
|
// UniqueIdentifier id = GameRegistry.findUniqueIdentifierFor( is.getItem() );
|
||||||
// AELog.info( "ID:" + id.toString() + " : " + is.getItemDamage() );
|
// AELog.info( "ID:" + id.toString() + " : " + is.getItemDamage() );
|
||||||
@@ -217,7 +251,8 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
|
|||||||
if( newBus instanceof PartP2PTunnel )
|
if( newBus instanceof PartP2PTunnel )
|
||||||
{
|
{
|
||||||
final PartP2PTunnel newTunnel = (PartP2PTunnel) newBus;
|
final PartP2PTunnel newTunnel = (PartP2PTunnel) newBus;
|
||||||
if( !Keyboard.isKeyDown( Keyboard.KEY_LCONTROL ) && !Keyboard.isKeyDown( Keyboard.KEY_RCONTROL ) )
|
|
||||||
|
if( pasteAsOutput )
|
||||||
{
|
{
|
||||||
newTunnel.setOutput( true );
|
newTunnel.setOutput( true );
|
||||||
}
|
}
|
||||||
@@ -248,7 +283,7 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
|
|||||||
|
|
||||||
final IParts parts = AEApi.instance().definitions().parts();
|
final IParts parts = AEApi.instance().definitions().parts();
|
||||||
|
|
||||||
switch( tt )
|
switch ( tt )
|
||||||
{
|
{
|
||||||
case LIGHT:
|
case LIGHT:
|
||||||
newType = parts.p2PTunnelLight().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
newType = parts.p2PTunnelLight().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
||||||
@@ -258,6 +293,10 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
|
|||||||
newType = parts.p2PTunnelFE().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
newType = parts.p2PTunnelFE().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GTEU_POWER:
|
||||||
|
newType = parts.p2PTunnelGTEU().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
||||||
|
break;
|
||||||
|
|
||||||
case FLUID:
|
case FLUID:
|
||||||
newType = parts.p2PTunnelFluids().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
newType = parts.p2PTunnelFluids().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
||||||
break;
|
break;
|
||||||
@@ -417,8 +456,10 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
|
|||||||
|
|
||||||
final AEColor[] colors = Platform.p2p().toColors( this.getFrequency() );
|
final AEColor[] colors = Platform.p2p().toColors( this.getFrequency() );
|
||||||
final int[] colorCode = new int[]{
|
final int[] colorCode = new int[]{
|
||||||
colors[0].ordinal(), colors[0].ordinal(), colors[1].ordinal(), colors[1].ordinal(),
|
colors[0].ordinal(), colors[0].ordinal(),
|
||||||
colors[2].ordinal(), colors[2].ordinal(), colors[3].ordinal(), colors[3].ordinal(),
|
colors[1].ordinal(), colors[1].ordinal(),
|
||||||
|
colors[2].ordinal(), colors[2].ordinal(),
|
||||||
|
colors[3].ordinal(), colors[3].ordinal(),
|
||||||
};
|
};
|
||||||
|
|
||||||
data.setIntArray( "colorCode", colorCode );
|
data.setIntArray( "colorCode", colorCode );
|
||||||
|
|||||||
@@ -0,0 +1,152 @@
|
|||||||
|
package appeng.parts.reporting;
|
||||||
|
|
||||||
|
import appeng.api.implementations.ICraftingPatternItem;
|
||||||
|
import appeng.api.networking.crafting.ICraftingPatternDetails;
|
||||||
|
import appeng.api.parts.IPartModel;
|
||||||
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
|
import appeng.core.AppEng;
|
||||||
|
import appeng.core.sync.GuiBridge;
|
||||||
|
import appeng.helpers.Reflected;
|
||||||
|
import appeng.items.parts.PartModels;
|
||||||
|
import appeng.parts.PartModel;
|
||||||
|
import appeng.tile.inventory.AppEngInternalInventory;
|
||||||
|
import appeng.util.inv.InvOperation;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static appeng.helpers.PatternHelper.PROCESSING_INPUT_LIMIT;
|
||||||
|
import static appeng.helpers.PatternHelper.PROCESSING_OUTPUT_LIMIT;
|
||||||
|
|
||||||
|
|
||||||
|
public class PartExpandedProcessingPatternTerminal extends AbstractPartTerminal
|
||||||
|
{
|
||||||
|
@PartModels
|
||||||
|
public static final ResourceLocation MODEL_OFF = new ResourceLocation( AppEng.MOD_ID, "part/expanded_processing_pattern_terminal_off" );
|
||||||
|
@PartModels
|
||||||
|
public static final ResourceLocation MODEL_ON = new ResourceLocation( AppEng.MOD_ID, "part/expanded_processing_pattern_terminal_on" );
|
||||||
|
|
||||||
|
public static final IPartModel MODELS_OFF = new PartModel( MODEL_BASE, MODEL_OFF, MODEL_STATUS_OFF );
|
||||||
|
public static final IPartModel MODELS_ON = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_ON );
|
||||||
|
public static final IPartModel MODELS_HAS_CHANNEL = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_HAS_CHANNEL );
|
||||||
|
|
||||||
|
private final AppEngInternalInventory crafting = new AppEngInternalInventory( this, PROCESSING_INPUT_LIMIT );
|
||||||
|
|
||||||
|
private final AppEngInternalInventory output = new AppEngInternalInventory( this, PROCESSING_OUTPUT_LIMIT );
|
||||||
|
private final AppEngInternalInventory pattern = new AppEngInternalInventory( this, 2 );
|
||||||
|
|
||||||
|
@Reflected
|
||||||
|
public PartExpandedProcessingPatternTerminal( final ItemStack is )
|
||||||
|
{
|
||||||
|
super( is );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getDrops( final List<ItemStack> drops, final boolean wrenched )
|
||||||
|
{
|
||||||
|
for( final ItemStack is : this.pattern )
|
||||||
|
{
|
||||||
|
if( !is.isEmpty() )
|
||||||
|
{
|
||||||
|
drops.add( is );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readFromNBT( NBTTagCompound data )
|
||||||
|
{
|
||||||
|
super.readFromNBT( data );
|
||||||
|
this.crafting.readFromNBT( data, "processingGrid" );
|
||||||
|
this.pattern.readFromNBT( data, "pattern" );
|
||||||
|
this.output.readFromNBT( data, "outputList" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToNBT( NBTTagCompound data )
|
||||||
|
{
|
||||||
|
super.writeToNBT( data );
|
||||||
|
this.crafting.writeToNBT( data, "processingGrid" );
|
||||||
|
this.pattern.writeToNBT( data, "pattern" );
|
||||||
|
this.output.writeToNBT( data, "outputList" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GuiBridge getGui( final EntityPlayer p )
|
||||||
|
{
|
||||||
|
int x = (int) p.posX;
|
||||||
|
int y = (int) p.posY;
|
||||||
|
int z = (int) p.posZ;
|
||||||
|
if( this.getHost().getTile() != null )
|
||||||
|
{
|
||||||
|
x = this.getTile().getPos().getX();
|
||||||
|
y = this.getTile().getPos().getY();
|
||||||
|
z = this.getTile().getPos().getZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL.hasPermissions( this.getHost().getTile(), x, y, z, this.getSide(), p ) )
|
||||||
|
{
|
||||||
|
return GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL;
|
||||||
|
}
|
||||||
|
return GuiBridge.GUI_ME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onChangeInventory( final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removedStack, final ItemStack newStack )
|
||||||
|
{
|
||||||
|
if( inv == this.pattern && slot == 1 )
|
||||||
|
{
|
||||||
|
final ItemStack is = this.pattern.getStackInSlot( 1 );
|
||||||
|
if( !is.isEmpty() && is.getItem() instanceof ICraftingPatternItem )
|
||||||
|
{
|
||||||
|
final ICraftingPatternItem pattern = (ICraftingPatternItem) is.getItem();
|
||||||
|
final ICraftingPatternDetails details = pattern.getPatternForItem( is, this.getHost().getTile().getWorld() );
|
||||||
|
if( details != null )
|
||||||
|
{
|
||||||
|
for( int x = 0; x < this.crafting.getSlots() && x < details.getInputs().length; x++ )
|
||||||
|
{
|
||||||
|
final IAEItemStack item = details.getInputs()[x];
|
||||||
|
this.crafting.setStackInSlot( x, item == null ? ItemStack.EMPTY : item.createItemStack() );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( int x = 0; x < this.output.getSlots() && x < details.getOutputs().length; x++ )
|
||||||
|
{
|
||||||
|
final IAEItemStack item = details.getOutputs()[x];
|
||||||
|
this.output.setStackInSlot( x, item == null ? ItemStack.EMPTY : item.createItemStack() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getHost().markForSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IItemHandler getInventoryByName( final String name )
|
||||||
|
{
|
||||||
|
if( name.equals( "crafting" ) )
|
||||||
|
{
|
||||||
|
return this.crafting;
|
||||||
|
}
|
||||||
|
if( name.equals( "output" ) )
|
||||||
|
{
|
||||||
|
return this.output;
|
||||||
|
}
|
||||||
|
if( name.equals( "pattern" ) )
|
||||||
|
{
|
||||||
|
return this.pattern;
|
||||||
|
}
|
||||||
|
return super.getInventoryByName( name );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPartModel getStaticModels()
|
||||||
|
{
|
||||||
|
return this.selectModel( MODELS_OFF, MODELS_ON, MODELS_HAS_CHANNEL );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -20,8 +20,18 @@ package appeng.tile.crafting;
|
|||||||
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.EnumMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import appeng.api.networking.security.IActionSource;
|
||||||
|
import appeng.api.storage.IMEMonitor;
|
||||||
|
import appeng.api.storage.IStorageMonitorable;
|
||||||
|
import appeng.api.storage.IStorageMonitorableAccessor;
|
||||||
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
|
import appeng.capabilities.Capabilities;
|
||||||
|
import appeng.helpers.PatternHelper;
|
||||||
|
import appeng.me.helpers.MachineSource;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
import net.minecraft.inventory.InventoryCrafting;
|
import net.minecraft.inventory.InventoryCrafting;
|
||||||
@@ -30,6 +40,7 @@ import net.minecraft.nbt.NBTTagCompound;
|
|||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.IBlockAccess;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.WorldServer;
|
import net.minecraft.world.WorldServer;
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||||
@@ -86,6 +97,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
private final AppEngInternalInventory patternInv = new AppEngInternalInventory( this, 1, 1 );
|
private final AppEngInternalInventory patternInv = new AppEngInternalInventory( this, 1, 1 );
|
||||||
private final IItemHandler gridInvExt = new WrapperFilteredItemHandler( this.gridInv, new CraftingGridFilter() );
|
private final IItemHandler gridInvExt = new WrapperFilteredItemHandler( this.gridInv, new CraftingGridFilter() );
|
||||||
private final IItemHandler internalInv = new WrapperChainedItemHandler( this.gridInv, this.patternInv );
|
private final IItemHandler internalInv = new WrapperChainedItemHandler( this.gridInv, this.patternInv );
|
||||||
|
private final EnumMap<EnumFacing, Object> neighbors = new EnumMap<>( EnumFacing.class );
|
||||||
private final IConfigManager settings;
|
private final IConfigManager settings;
|
||||||
private final UpgradeInventory upgrades;
|
private final UpgradeInventory upgrades;
|
||||||
private boolean isPowered = false;
|
private boolean isPowered = false;
|
||||||
@@ -96,6 +108,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
private boolean isAwake = false;
|
private boolean isAwake = false;
|
||||||
private boolean forcePlan = false;
|
private boolean forcePlan = false;
|
||||||
private boolean reboot = true;
|
private boolean reboot = true;
|
||||||
|
private final IActionSource mySrc = new MachineSource( this );
|
||||||
|
|
||||||
public TileMolecularAssembler()
|
public TileMolecularAssembler()
|
||||||
{
|
{
|
||||||
@@ -114,6 +127,126 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateNeighbors()
|
||||||
|
{
|
||||||
|
for( EnumFacing f : EnumFacing.VALUES )
|
||||||
|
{
|
||||||
|
TileEntity te = world.getTileEntity( pos.offset( f ) );
|
||||||
|
Object capability = null;
|
||||||
|
if( te != null )
|
||||||
|
{
|
||||||
|
// Prioritize a handler to directly link to another ME network
|
||||||
|
IStorageMonitorableAccessor accessor = te.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, f.getOpposite() );
|
||||||
|
|
||||||
|
if( accessor != null )
|
||||||
|
{
|
||||||
|
IStorageMonitorable inventory = accessor.getInventory( this.mySrc );
|
||||||
|
if( inventory != null )
|
||||||
|
{
|
||||||
|
capability = inventory;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( capability == null )
|
||||||
|
{
|
||||||
|
capability = InventoryAdaptor.getAdaptor( te, f.getOpposite() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( capability != null )
|
||||||
|
{
|
||||||
|
neighbors.put( f, capability );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
neighbors.remove( f );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReady()
|
||||||
|
{
|
||||||
|
super.onReady();
|
||||||
|
updateNeighbors();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateNeighbors( IBlockAccess w, BlockPos pos, BlockPos neighbor )
|
||||||
|
{
|
||||||
|
EnumFacing updateFromFacing;
|
||||||
|
if( pos.getX() != neighbor.getX() )
|
||||||
|
{
|
||||||
|
if( pos.getX() > neighbor.getX() )
|
||||||
|
{
|
||||||
|
updateFromFacing = EnumFacing.WEST;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
updateFromFacing = EnumFacing.EAST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( pos.getY() != neighbor.getY() )
|
||||||
|
{
|
||||||
|
if( pos.getY() > neighbor.getY() )
|
||||||
|
{
|
||||||
|
updateFromFacing = EnumFacing.DOWN;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
updateFromFacing = EnumFacing.UP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( pos.getZ() != neighbor.getZ() )
|
||||||
|
{
|
||||||
|
if( pos.getZ() > neighbor.getZ() )
|
||||||
|
{
|
||||||
|
updateFromFacing = EnumFacing.NORTH;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
updateFromFacing = EnumFacing.SOUTH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( pos.offset( updateFromFacing ).equals( neighbor ) )
|
||||||
|
{
|
||||||
|
TileEntity te = w.getTileEntity( neighbor );
|
||||||
|
Object capability = null;
|
||||||
|
if( te != null )
|
||||||
|
{
|
||||||
|
// Prioritize a handler to directly link to another ME network
|
||||||
|
IStorageMonitorableAccessor accessor = te.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, updateFromFacing.getOpposite() );
|
||||||
|
|
||||||
|
if( accessor != null )
|
||||||
|
{
|
||||||
|
IStorageMonitorable inventory = accessor.getInventory( this.mySrc );
|
||||||
|
if( inventory != null )
|
||||||
|
{
|
||||||
|
capability = inventory;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( capability == null )
|
||||||
|
{
|
||||||
|
capability = InventoryAdaptor.getAdaptor( te, updateFromFacing.getOpposite() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( capability != null )
|
||||||
|
{
|
||||||
|
neighbors.put( updateFromFacing, capability );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
neighbors.remove( updateFromFacing );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean pushPattern( final ICraftingPatternDetails patternDetails, final InventoryCrafting table, final EnumFacing where )
|
public boolean pushPattern( final ICraftingPatternDetails patternDetails, final InventoryCrafting table, final EnumFacing where )
|
||||||
{
|
{
|
||||||
@@ -143,7 +276,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
private void updateSleepiness()
|
private void updateSleepiness()
|
||||||
{
|
{
|
||||||
final boolean wasEnabled = this.isAwake;
|
final boolean wasEnabled = this.isAwake;
|
||||||
this.isAwake = this.myPlan != null && this.hasMats() || this.canPush();
|
this.isAwake = this.canPush() || this.myPlan != null && this.hasMats();
|
||||||
if( wasEnabled != this.isAwake )
|
if( wasEnabled != this.isAwake )
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -179,9 +312,13 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
for( int x = 0; x < this.craftingInv.getSizeInventory(); x++ )
|
for( int x = 0; x < this.craftingInv.getSizeInventory(); x++ )
|
||||||
{
|
{
|
||||||
this.craftingInv.setInventorySlotContents( x, this.gridInv.getStackInSlot( x ) );
|
this.craftingInv.setInventorySlotContents( x, this.gridInv.getStackInSlot( x ) );
|
||||||
|
if( !myPlan.isValidItemForSlot( x, craftingInv.getStackInSlot( x ), world ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return !this.myPlan.getOutput( this.craftingInv, this.getWorld() ).isEmpty();
|
return this.myPlan.getOutputs().length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -425,7 +562,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
|
|
||||||
this.reboot = false;
|
this.reboot = false;
|
||||||
int speed = 10;
|
int speed = 10;
|
||||||
switch( this.upgrades.getInstalledUpgrades( Upgrades.SPEED ) )
|
switch ( this.upgrades.getInstalledUpgrades( Upgrades.SPEED ) )
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
this.progress += this.userPower( ticksSinceLastCall, speed = 10, 1.0 );
|
this.progress += this.userPower( ticksSinceLastCall, speed = 10, 1.0 );
|
||||||
@@ -458,7 +595,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
final ItemStack output = this.myPlan.getOutput( this.craftingInv, this.getWorld() );
|
final ItemStack output = this.myPlan.getOutput( this.craftingInv, this.getWorld() );
|
||||||
if( !output.isEmpty() )
|
if( !output.isEmpty() )
|
||||||
{
|
{
|
||||||
this.pushOut( output.copy() );
|
this.pushOut( output );
|
||||||
|
|
||||||
for( int x = 0; x < this.craftingInv.getSizeInventory(); x++ )
|
for( int x = 0; x < this.craftingInv.getSizeInventory(); x++ )
|
||||||
{
|
{
|
||||||
@@ -519,10 +656,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return (int) ( this.getProxy()
|
return (int) ( this.getProxy().getEnergy().extractAEPower( ticksPassed * bonusValue * acceleratorTax, Actionable.MODULATE, PowerMultiplier.CONFIG ) / acceleratorTax );
|
||||||
.getEnergy()
|
|
||||||
.extractAEPower( ticksPassed * bonusValue * acceleratorTax, Actionable.MODULATE,
|
|
||||||
PowerMultiplier.CONFIG ) / acceleratorTax );
|
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
{
|
{
|
||||||
@@ -534,9 +668,13 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
{
|
{
|
||||||
if( this.pushDirection == AEPartLocation.INTERNAL )
|
if( this.pushDirection == AEPartLocation.INTERNAL )
|
||||||
{
|
{
|
||||||
for( final EnumFacing d : EnumFacing.VALUES )
|
for( final Map.Entry<EnumFacing, Object> d : neighbors.entrySet() )
|
||||||
{
|
{
|
||||||
output = this.pushTo( output, d );
|
output = this.pushTo( output, d.getKey() );
|
||||||
|
if( output.isEmpty() )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -560,19 +698,33 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
final TileEntity te = this.getWorld().getTileEntity( this.pos.offset( d ) );
|
Object capability = neighbors.get( d );
|
||||||
|
if( capability instanceof IStorageMonitorable )
|
||||||
if( te == null )
|
{
|
||||||
|
// Prioritize a handler to directly link to another ME network
|
||||||
|
IStorageMonitorable inventory = (IStorageMonitorable) capability;
|
||||||
|
IAEItemStack toInsert = AEItemStack.fromItemStack( output );
|
||||||
|
IMEMonitor<IAEItemStack> inv = inventory.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||||
|
IAEItemStack remainder = inv.injectItems( toInsert, Actionable.SIMULATE, this.mySrc );
|
||||||
|
if( remainder == null )
|
||||||
|
{
|
||||||
|
inv.injectItems( toInsert, Actionable.MODULATE, this.mySrc );
|
||||||
|
return ItemStack.EMPTY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( remainder.getStackSize() == toInsert.getStackSize() )
|
||||||
{
|
{
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
inv.injectItems( toInsert.setStackSize( toInsert.getStackSize() - remainder.getStackSize() ), Actionable.MODULATE, this.mySrc );
|
||||||
final InventoryAdaptor adaptor = InventoryAdaptor.getAdaptor( te, d.getOpposite() );
|
this.saveChanges();
|
||||||
|
return remainder.createItemStack();
|
||||||
if( adaptor == null )
|
|
||||||
{
|
|
||||||
return output;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else if( capability instanceof InventoryAdaptor )
|
||||||
|
{
|
||||||
|
InventoryAdaptor adaptor = (InventoryAdaptor) capability;
|
||||||
|
|
||||||
final int size = output.getCount();
|
final int size = output.getCount();
|
||||||
output = adaptor.addItems( output );
|
output = adaptor.addItems( output );
|
||||||
@@ -582,6 +734,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
|
|||||||
{
|
{
|
||||||
this.saveChanges();
|
this.saveChanges();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,6 +77,10 @@ public class AppEngInternalInventory extends ItemStackHandler implements Iterabl
|
|||||||
@Override
|
@Override
|
||||||
public void setStackInSlot( int slot, @Nonnull ItemStack stack )
|
public void setStackInSlot( int slot, @Nonnull ItemStack stack )
|
||||||
{
|
{
|
||||||
|
if( stack == this.getStackInSlot( slot ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.previousStack = this.getStackInSlot( slot ).copy();
|
this.previousStack = this.getStackInSlot( slot ).copy();
|
||||||
super.setStackInSlot( slot, stack );
|
super.setStackInSlot( slot, stack );
|
||||||
}
|
}
|
||||||
@@ -119,14 +123,15 @@ public class AppEngInternalInventory extends ItemStackHandler implements Iterabl
|
|||||||
if( this.getTileEntity() != null && this.eventsEnabled() && !this.dirtyFlag )
|
if( this.getTileEntity() != null && this.eventsEnabled() && !this.dirtyFlag )
|
||||||
{
|
{
|
||||||
this.dirtyFlag = true;
|
this.dirtyFlag = true;
|
||||||
ItemStack newStack = this.getStackInSlot( slot ).copy();
|
ItemStack newStack = this.getStackInSlot( slot );
|
||||||
ItemStack oldStack = this.previousStack;
|
ItemStack oldStack = this.previousStack;
|
||||||
InvOperation op = InvOperation.SET;
|
InvOperation op = InvOperation.SET;
|
||||||
|
|
||||||
if( newStack.isEmpty() || oldStack.isEmpty() || ( oldStack.getCount() < oldStack.getMaxStackSize() && oldStack.getCount() < this.getSlotLimit( slot ) && ItemStack.areItemsEqual( newStack, oldStack ) ) )
|
if( newStack.isEmpty() || oldStack.isEmpty() || oldStack.getCount() != newStack.getCount() && ItemStack.areItemsEqual( newStack, oldStack ) )
|
||||||
{
|
{
|
||||||
if( newStack.getCount() > oldStack.getCount() )
|
if( newStack.getCount() > oldStack.getCount() )
|
||||||
{
|
{
|
||||||
|
newStack = newStack.copy();
|
||||||
newStack.shrink( oldStack.getCount() );
|
newStack.shrink( oldStack.getCount() );
|
||||||
oldStack = ItemStack.EMPTY;
|
oldStack = ItemStack.EMPTY;
|
||||||
op = InvOperation.INSERT;
|
op = InvOperation.INSERT;
|
||||||
|
|||||||
@@ -57,10 +57,16 @@ public class TileEnergyAcceptor extends AENetworkPowerTile
|
|||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
{
|
{
|
||||||
return this.getInternalMaxPower();
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getInternalMaxPower()
|
||||||
|
{
|
||||||
|
return getFunnelPowerDemand( Long.MAX_VALUE );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected double funnelPowerIntoStorage( final double power, final Actionable mode )
|
protected double funnelPowerIntoStorage( final double power, final Actionable mode )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ public abstract class AEBasePoweredTile extends AEBaseInvTile implements IAEPowe
|
|||||||
private EnumSet<EnumFacing> internalPowerSides = EnumSet.allOf( EnumFacing.class );
|
private EnumSet<EnumFacing> internalPowerSides = EnumSet.allOf( EnumFacing.class );
|
||||||
private final IEnergyStorage forgeEnergyAdapter;
|
private final IEnergyStorage forgeEnergyAdapter;
|
||||||
private Object teslaEnergyAdapter;
|
private Object teslaEnergyAdapter;
|
||||||
|
private GTCEEnergyAdapter gtceEnergyAdapter = null;
|
||||||
private IC2PowerSink ic2Sink;
|
private IC2PowerSink ic2Sink;
|
||||||
|
|
||||||
public AEBasePoweredTile()
|
public AEBasePoweredTile()
|
||||||
@@ -63,6 +63,11 @@ public abstract class AEBasePoweredTile extends AEBaseInvTile implements IAEPowe
|
|||||||
{
|
{
|
||||||
this.teslaEnergyAdapter = new TeslaEnergyAdapter( this );
|
this.teslaEnergyAdapter = new TeslaEnergyAdapter( this );
|
||||||
}
|
}
|
||||||
|
if( Capabilities.GTCE_ENERGY != null )
|
||||||
|
{
|
||||||
|
this.gtceEnergyAdapter = new GTCEEnergyAdapter( this );
|
||||||
|
}
|
||||||
|
|
||||||
this.ic2Sink = Integrations.ic2().createPowerSink( this, this );
|
this.ic2Sink = Integrations.ic2().createPowerSink( this, this );
|
||||||
this.ic2Sink.setValidFaces( this.internalPowerSides );
|
this.ic2Sink.setValidFaces( this.internalPowerSides );
|
||||||
}
|
}
|
||||||
@@ -284,6 +289,13 @@ public abstract class AEBasePoweredTile extends AEBaseInvTile implements IAEPowe
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( capability == Capabilities.GTCE_ENERGY )
|
||||||
|
{
|
||||||
|
if( this.getPowerSides().contains( facing ) )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return super.hasCapability( capability, facing );
|
return super.hasCapability( capability, facing );
|
||||||
}
|
}
|
||||||
@@ -306,6 +318,13 @@ public abstract class AEBasePoweredTile extends AEBaseInvTile implements IAEPowe
|
|||||||
return (T) this.teslaEnergyAdapter;
|
return (T) this.teslaEnergyAdapter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( capability == Capabilities.GTCE_ENERGY )
|
||||||
|
{
|
||||||
|
if( this.getPowerSides().contains( facing ) )
|
||||||
|
{
|
||||||
|
return (T) this.gtceEnergyAdapter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return super.getCapability( capability, facing );
|
return super.getCapability( capability, facing );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
package appeng.tile.powersink;
|
||||||
|
|
||||||
|
import appeng.api.config.Actionable;
|
||||||
|
import appeng.api.config.PowerUnits;
|
||||||
|
import gregtech.api.capability.IEnergyContainer;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
|
||||||
|
|
||||||
|
public class GTCEEnergyAdapter implements IEnergyContainer
|
||||||
|
{
|
||||||
|
private final IExternalPowerSink sink;
|
||||||
|
|
||||||
|
double EUBuffer;
|
||||||
|
|
||||||
|
GTCEEnergyAdapter( IExternalPowerSink sink )
|
||||||
|
{
|
||||||
|
this.sink = sink;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long acceptEnergyFromNetwork( EnumFacing enumFacing, long voltage, long amperage )
|
||||||
|
{
|
||||||
|
final double power = voltage * amperage;
|
||||||
|
final double oldBuffer = EUBuffer;
|
||||||
|
|
||||||
|
EUBuffer = this.sink.injectExternalPower( PowerUnits.GTEU, power + EUBuffer, Actionable.MODULATE );
|
||||||
|
|
||||||
|
// if the overflow went down, all inputs were consumed
|
||||||
|
if( EUBuffer <= oldBuffer )
|
||||||
|
{
|
||||||
|
return amperage;
|
||||||
|
}
|
||||||
|
// if overflow is greater than the inputs, nothing was consumed
|
||||||
|
if( EUBuffer >= power )
|
||||||
|
{
|
||||||
|
EUBuffer -= power;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// determine how many amps are being used
|
||||||
|
final double usedEU = power + oldBuffer - EUBuffer;
|
||||||
|
final long ampsUsed = (long) Math.ceil( usedEU / ( (double) voltage ) );
|
||||||
|
// adjust the overflow
|
||||||
|
EUBuffer += usedEU % voltage;
|
||||||
|
|
||||||
|
return ampsUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean inputsEnergy( EnumFacing enumFacing )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long changeEnergy( long l )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEnergyStored()
|
||||||
|
{
|
||||||
|
return (long) Math.floor( PowerUnits.AE.convertTo( PowerUnits.GTEU, this.sink.getAECurrentPower() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEnergyCapacity()
|
||||||
|
{
|
||||||
|
return (long) Math.floor( PowerUnits.AE.convertTo( PowerUnits.GTEU, this.sink.getAEMaxPower() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getInputAmperage()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getInputVoltage()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEnergyCanBeInserted()
|
||||||
|
{
|
||||||
|
return this.getEnergyCapacity() - this.getEnergyStored();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -128,7 +128,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, ITerminal
|
|||||||
|
|
||||||
public TileChest()
|
public TileChest()
|
||||||
{
|
{
|
||||||
this.setInternalMaxPower( PowerMultiplier.CONFIG.multiply( 40 ) );
|
this.setInternalMaxPower( PowerMultiplier.CONFIG.multiply( 128 ) );
|
||||||
this.getProxy().setFlags( GridFlags.REQUIRE_CHANNEL );
|
this.getProxy().setFlags( GridFlags.REQUIRE_CHANNEL );
|
||||||
this.config.registerSetting( Settings.SORT_BY, SortOrder.NAME );
|
this.config.registerSetting( Settings.SORT_BY, SortOrder.NAME );
|
||||||
this.config.registerSetting( Settings.VIEW_MODE, ViewItems.ALL );
|
this.config.registerSetting( Settings.VIEW_MODE, ViewItems.ALL );
|
||||||
@@ -495,12 +495,12 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, ITerminal
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.getProxy().getGrid().postEvent( new MENetworkCellArrayUpdate() );
|
|
||||||
if( this.getProxy().isActive() )
|
if( this.getProxy().isActive() )
|
||||||
{
|
{
|
||||||
final IStorageGrid gs = this.getProxy().getStorage();
|
final IStorageGrid gs = this.getProxy().getStorage();
|
||||||
Platform.postChanges( gs, removed, added, this.mySrc );
|
Platform.postChanges( gs, removed, added, this.mySrc );
|
||||||
}
|
}
|
||||||
|
this.getProxy().getGrid().postEvent( new MENetworkCellArrayUpdate() );
|
||||||
}
|
}
|
||||||
catch( final GridAccessException ignored )
|
catch( final GridAccessException ignored )
|
||||||
{
|
{
|
||||||
@@ -698,7 +698,8 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, ITerminal
|
|||||||
{
|
{
|
||||||
TileChest.this.getProxy().getStorage().postAlterationOfStoredItems( this.chan, change, TileChest.this.mySrc );
|
TileChest.this.getProxy().getStorage().postAlterationOfStoredItems( this.chan, change, TileChest.this.mySrc );
|
||||||
}
|
}
|
||||||
} catch ( final GridAccessException e )
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
{
|
{
|
||||||
// :(
|
// :(
|
||||||
}
|
}
|
||||||
@@ -738,11 +739,11 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, ITerminal
|
|||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
T injected = super.injectItems( input, mode, src );
|
T injected = super.injectItems( input, mode, src );
|
||||||
if (mode == Actionable.MODULATE && ( injected == null || injected.getStackSize() != input.getStackSize() ))
|
if( mode == Actionable.MODULATE && ( injected == null || injected.getStackSize() != input.getStackSize() ) )
|
||||||
{
|
{
|
||||||
if( TileChest.this.getProxy().isActive() && this.getInternalHandler().getCellInv() != null )
|
if( TileChest.this.isPowered() && this.getInternalHandler().getCellInv() != null )
|
||||||
{
|
{
|
||||||
TileChest.this.cellHandler.postChangesToListeners(Collections.singletonList( input.copy().setStackSize( input.getStackSize() - ( injected == null ? 0 : injected.getStackSize() ) ) ), TileChest.this.mySrc );
|
TileChest.this.cellHandler.postChangesToListeners( Collections.singletonList( input.copy().setStackSize( input.getStackSize() - ( injected == null ? 0 : injected.getStackSize() ) ) ), TileChest.this.mySrc );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return injected;
|
return injected;
|
||||||
@@ -792,9 +793,9 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, ITerminal
|
|||||||
T extracted = super.extractItems( request, mode, src );
|
T extracted = super.extractItems( request, mode, src );
|
||||||
if( mode == Actionable.MODULATE && extracted != null )
|
if( mode == Actionable.MODULATE && extracted != null )
|
||||||
{
|
{
|
||||||
if( TileChest.this.getProxy().isActive() && this.getInternalHandler().getCellInv() != null )
|
if( TileChest.this.isPowered() && this.getInternalHandler().getCellInv() != null )
|
||||||
{
|
{
|
||||||
TileChest.this.cellHandler.postChangesToListeners(Collections.singletonList( request.copy().setStackSize( -extracted.getStackSize() ) ), TileChest.this.mySrc );
|
TileChest.this.cellHandler.postChangesToListeners( Collections.singletonList( request.copy().setStackSize( -extracted.getStackSize() ) ), TileChest.this.mySrc );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return extracted;
|
return extracted;
|
||||||
@@ -848,7 +849,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, ITerminal
|
|||||||
|
|
||||||
private class FluidHandler implements IFluidHandler
|
private class FluidHandler implements IFluidHandler
|
||||||
{
|
{
|
||||||
private final IFluidTankProperties[] TANK_PROPS = new IFluidTankProperties[] { new FluidTankProperties( null, Fluid.BUCKET_VOLUME ) };
|
private final IFluidTankProperties[] TANK_PROPS = new IFluidTankProperties[]{new FluidTankProperties( null, Fluid.BUCKET_VOLUME )};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int fill( final FluidStack resource, final boolean doFill )
|
public int fill( final FluidStack resource, final boolean doFill )
|
||||||
|
|||||||
@@ -263,12 +263,12 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.getProxy().getGrid().postEvent( new MENetworkCellArrayUpdate() );
|
|
||||||
if( this.getProxy().isActive() )
|
if( this.getProxy().isActive() )
|
||||||
{
|
{
|
||||||
final IStorageGrid gs = this.getProxy().getStorage();
|
final IStorageGrid gs = this.getProxy().getStorage();
|
||||||
Platform.postChanges( gs, removed, added, this.mySrc );
|
Platform.postChanges( gs, removed, added, this.mySrc );
|
||||||
}
|
}
|
||||||
|
this.getProxy().getGrid().postEvent( new MENetworkCellArrayUpdate() );
|
||||||
}
|
}
|
||||||
catch( final GridAccessException ignored )
|
catch( final GridAccessException ignored )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ import com.google.common.base.Preconditions;
|
|||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
|
import gregtech.api.items.IToolItem;
|
||||||
|
import ic2.api.item.IC2Items;
|
||||||
|
import ic2.api.item.ICustomDamageItem;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
@@ -73,6 +76,7 @@ import net.minecraftforge.fluids.FluidStack;
|
|||||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||||
import net.minecraftforge.fml.common.Loader;
|
import net.minecraftforge.fml.common.Loader;
|
||||||
import net.minecraftforge.fml.common.ModContainer;
|
import net.minecraftforge.fml.common.ModContainer;
|
||||||
|
import net.minecraftforge.fml.common.Optional;
|
||||||
import net.minecraftforge.fml.relauncher.Side;
|
import net.minecraftforge.fml.relauncher.Side;
|
||||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||||
import net.minecraftforge.oredict.OreDictionary;
|
import net.minecraftforge.oredict.OreDictionary;
|
||||||
@@ -134,6 +138,8 @@ import appeng.util.prioritylist.IPartitionList;
|
|||||||
* @version rv2
|
* @version rv2
|
||||||
* @since rv0
|
* @since rv0
|
||||||
*/
|
*/
|
||||||
|
@Optional.Interface( iface = "gregtech.api.items.IToolItem", modid = "gregtech" )
|
||||||
|
@Optional.Interface( iface = "ic2.api.item.ICustomDamageItem", modid = "IC2" )
|
||||||
public class Platform
|
public class Platform
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -178,7 +184,6 @@ public class Platform
|
|||||||
*
|
*
|
||||||
* @param n to be formatted long value
|
* @param n to be formatted long value
|
||||||
* @param isRate if true it adds a /t to the formatted string
|
* @param isRate if true it adds a /t to the formatted string
|
||||||
*
|
|
||||||
* @return formatted long value
|
* @return formatted long value
|
||||||
*/
|
*/
|
||||||
public static String formatPowerLong( final long n, final boolean isRate )
|
public static String formatPowerLong( final long n, final boolean isRate )
|
||||||
@@ -188,12 +193,14 @@ public class Platform
|
|||||||
final PowerUnits displayUnits = AEConfig.instance().selectedPowerUnit();
|
final PowerUnits displayUnits = AEConfig.instance().selectedPowerUnit();
|
||||||
p = PowerUnits.AE.convertTo( displayUnits, p );
|
p = PowerUnits.AE.convertTo( displayUnits, p );
|
||||||
|
|
||||||
final String[] preFixes = { "k", "M", "G", "T", "P", "T", "P", "E", "Z", "Y" };
|
final String[] preFixes = {
|
||||||
|
"k", "M", "G", "T", "P", "T", "P", "E", "Z", "Y"
|
||||||
|
};
|
||||||
String unitName = displayUnits.name();
|
String unitName = displayUnits.name();
|
||||||
|
|
||||||
String level = "";
|
String level = "";
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
while( p > 1000 && offset < preFixes.length )
|
while ( p > 1000 && offset < preFixes.length )
|
||||||
{
|
{
|
||||||
p /= 1000;
|
p /= 1000;
|
||||||
level = preFixes[offset];
|
level = preFixes[offset];
|
||||||
@@ -210,7 +217,7 @@ public class Platform
|
|||||||
final int west_y = forward.zOffset * up.xOffset - forward.xOffset * up.zOffset;
|
final int west_y = forward.zOffset * up.xOffset - forward.xOffset * up.zOffset;
|
||||||
final int west_z = forward.xOffset * up.yOffset - forward.yOffset * up.xOffset;
|
final int west_z = forward.xOffset * up.yOffset - forward.yOffset * up.xOffset;
|
||||||
|
|
||||||
switch( west_x + west_y * 2 + west_z * 3 )
|
switch ( west_x + west_y * 2 + west_z * 3 )
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
return AEPartLocation.EAST;
|
return AEPartLocation.EAST;
|
||||||
@@ -237,7 +244,7 @@ public class Platform
|
|||||||
final int west_y = forward.getFrontOffsetZ() * up.getFrontOffsetX() - forward.getFrontOffsetX() * up.getFrontOffsetZ();
|
final int west_y = forward.getFrontOffsetZ() * up.getFrontOffsetX() - forward.getFrontOffsetX() * up.getFrontOffsetZ();
|
||||||
final int west_z = forward.getFrontOffsetX() * up.getFrontOffsetY() - forward.getFrontOffsetY() * up.getFrontOffsetX();
|
final int west_z = forward.getFrontOffsetX() * up.getFrontOffsetY() - forward.getFrontOffsetY() * up.getFrontOffsetX();
|
||||||
|
|
||||||
switch( west_x + west_y * 2 + west_z * 3 )
|
switch ( west_x + west_y * 2 + west_z * 3 )
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
return EnumFacing.EAST;
|
return EnumFacing.EAST;
|
||||||
@@ -271,8 +278,7 @@ public class Platform
|
|||||||
{
|
{
|
||||||
ce = nextEnum( ce );
|
ce = nextEnum( ce );
|
||||||
}
|
}
|
||||||
}
|
} while ( !validOptions.contains( ce ) || isNotValidSetting( ce ) );
|
||||||
while( !validOptions.contains( ce ) || isNotValidSetting( ce ) );
|
|
||||||
|
|
||||||
return ce;
|
return ce;
|
||||||
}
|
}
|
||||||
@@ -446,7 +452,7 @@ public class Platform
|
|||||||
{
|
{
|
||||||
if( upAndDown )
|
if( upAndDown )
|
||||||
{
|
{
|
||||||
switch( dir )
|
switch ( dir )
|
||||||
{
|
{
|
||||||
case NORTH:
|
case NORTH:
|
||||||
return AEPartLocation.SOUTH;
|
return AEPartLocation.SOUTH;
|
||||||
@@ -466,7 +472,7 @@ public class Platform
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch( dir )
|
switch ( dir )
|
||||||
{
|
{
|
||||||
case UP:
|
case UP:
|
||||||
return AEPartLocation.DOWN;
|
return AEPartLocation.DOWN;
|
||||||
@@ -519,8 +525,7 @@ public class Platform
|
|||||||
final double offset_x = ( getRandomInt() % 32 - 16 ) / 82;
|
final double offset_x = ( getRandomInt() % 32 - 16 ) / 82;
|
||||||
final double offset_y = ( getRandomInt() % 32 - 16 ) / 82;
|
final double offset_y = ( getRandomInt() % 32 - 16 ) / 82;
|
||||||
final double offset_z = ( getRandomInt() % 32 - 16 ) / 82;
|
final double offset_z = ( getRandomInt() % 32 - 16 ) / 82;
|
||||||
final EntityItem ei = new EntityItem( w, 0.5 + offset_x + pos.getX(), 0.5 + offset_y + pos.getY(), 0.2 + offset_z + pos.getZ(), i
|
final EntityItem ei = new EntityItem( w, 0.5 + offset_x + pos.getX(), 0.5 + offset_y + pos.getY(), 0.2 + offset_z + pos.getZ(), i.copy() );
|
||||||
.copy() );
|
|
||||||
w.spawnEntity( ei );
|
w.spawnEntity( ei );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -592,8 +597,7 @@ public class Platform
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ITooltipFlag.TooltipFlags tooltipFlag = Minecraft
|
ITooltipFlag.TooltipFlags tooltipFlag = Minecraft.getMinecraft().gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL;
|
||||||
.getMinecraft().gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL;
|
|
||||||
return itemStack.getTooltip( Minecraft.getMinecraft().player, tooltipFlag );
|
return itemStack.getTooltip( Minecraft.getMinecraft().player, tooltipFlag );
|
||||||
}
|
}
|
||||||
catch( final Exception errB )
|
catch( final Exception errB )
|
||||||
@@ -764,7 +768,7 @@ public class Platform
|
|||||||
|
|
||||||
public static int MC2MEColor( final int color )
|
public static int MC2MEColor( final int color )
|
||||||
{
|
{
|
||||||
switch( color )
|
switch ( color )
|
||||||
{
|
{
|
||||||
case 4: // "blue"
|
case 4: // "blue"
|
||||||
return 0;
|
return 0;
|
||||||
@@ -842,10 +846,10 @@ public class Platform
|
|||||||
return forward;
|
return forward;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( forward )
|
switch ( forward )
|
||||||
{
|
{
|
||||||
case DOWN:
|
case DOWN:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case DOWN:
|
case DOWN:
|
||||||
return forward;
|
return forward;
|
||||||
@@ -864,7 +868,7 @@ public class Platform
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UP:
|
case UP:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case NORTH:
|
case NORTH:
|
||||||
return AEPartLocation.WEST;
|
return AEPartLocation.WEST;
|
||||||
@@ -879,7 +883,7 @@ public class Platform
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NORTH:
|
case NORTH:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case UP:
|
case UP:
|
||||||
return AEPartLocation.WEST;
|
return AEPartLocation.WEST;
|
||||||
@@ -894,7 +898,7 @@ public class Platform
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SOUTH:
|
case SOUTH:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case UP:
|
case UP:
|
||||||
return AEPartLocation.EAST;
|
return AEPartLocation.EAST;
|
||||||
@@ -909,7 +913,7 @@ public class Platform
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EAST:
|
case EAST:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case UP:
|
case UP:
|
||||||
return AEPartLocation.NORTH;
|
return AEPartLocation.NORTH;
|
||||||
@@ -923,7 +927,7 @@ public class Platform
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WEST:
|
case WEST:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case UP:
|
case UP:
|
||||||
return AEPartLocation.SOUTH;
|
return AEPartLocation.SOUTH;
|
||||||
@@ -944,10 +948,10 @@ public class Platform
|
|||||||
|
|
||||||
public static EnumFacing rotateAround( final EnumFacing forward, final EnumFacing axis )
|
public static EnumFacing rotateAround( final EnumFacing forward, final EnumFacing axis )
|
||||||
{
|
{
|
||||||
switch( forward )
|
switch ( forward )
|
||||||
{
|
{
|
||||||
case DOWN:
|
case DOWN:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case DOWN:
|
case DOWN:
|
||||||
return forward;
|
return forward;
|
||||||
@@ -966,7 +970,7 @@ public class Platform
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case UP:
|
case UP:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case NORTH:
|
case NORTH:
|
||||||
return EnumFacing.WEST;
|
return EnumFacing.WEST;
|
||||||
@@ -981,7 +985,7 @@ public class Platform
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NORTH:
|
case NORTH:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case UP:
|
case UP:
|
||||||
return EnumFacing.WEST;
|
return EnumFacing.WEST;
|
||||||
@@ -996,7 +1000,7 @@ public class Platform
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SOUTH:
|
case SOUTH:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case UP:
|
case UP:
|
||||||
return EnumFacing.EAST;
|
return EnumFacing.EAST;
|
||||||
@@ -1011,7 +1015,7 @@ public class Platform
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EAST:
|
case EAST:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case UP:
|
case UP:
|
||||||
return EnumFacing.NORTH;
|
return EnumFacing.NORTH;
|
||||||
@@ -1025,7 +1029,7 @@ public class Platform
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WEST:
|
case WEST:
|
||||||
switch( axis )
|
switch ( axis )
|
||||||
{
|
{
|
||||||
case UP:
|
case UP:
|
||||||
return EnumFacing.SOUTH;
|
return EnumFacing.SOUTH;
|
||||||
@@ -1101,9 +1105,7 @@ public class Platform
|
|||||||
|
|
||||||
final Vec3d vec31 = vec3.addVector( f7 * d3, f6 * d3, f8 * d3 );
|
final Vec3d vec31 = vec3.addVector( f7 * d3, f6 * d3, f8 * d3 );
|
||||||
|
|
||||||
final AxisAlignedBB bb = new AxisAlignedBB( Math.min( vec3.x, vec31.x ), Math.min( vec3.y, vec31.y ), Math.min( vec3.z,
|
final AxisAlignedBB bb = new AxisAlignedBB( Math.min( vec3.x, vec31.x ), Math.min( vec3.y, vec31.y ), Math.min( vec3.z, vec31.z ), Math.max( vec3.x, vec31.x ), Math.max( vec3.y, vec31.y ), Math.max( vec3.z, vec31.z ) ).grow( 16, 16, 16 );
|
||||||
vec31.z ), Math.max( vec3.x, vec31.x ), Math.max( vec3.y, vec31.y ), Math.max( vec3.z, vec31.z ) ).grow(
|
|
||||||
16, 16, 16 );
|
|
||||||
|
|
||||||
Entity entity = null;
|
Entity entity = null;
|
||||||
double closest = 9999999.0D;
|
double closest = 9999999.0D;
|
||||||
@@ -1226,7 +1228,7 @@ public class Platform
|
|||||||
Preconditions.checkNotNull( src );
|
Preconditions.checkNotNull( src );
|
||||||
Preconditions.checkNotNull( mode );
|
Preconditions.checkNotNull( mode );
|
||||||
|
|
||||||
final T possible = cell.injectItems( input.copy(), Actionable.SIMULATE, src );
|
final T possible = cell.injectItems( input, Actionable.SIMULATE, src );
|
||||||
|
|
||||||
long stored = input.getStackSize();
|
long stored = input.getStackSize();
|
||||||
if( possible != null )
|
if( possible != null )
|
||||||
@@ -1249,9 +1251,9 @@ public class Platform
|
|||||||
final T leftover = input.copy();
|
final T leftover = input.copy();
|
||||||
final T split = input.copy();
|
final T split = input.copy();
|
||||||
|
|
||||||
leftover.decStackSize(itemToAdd);
|
leftover.decStackSize( itemToAdd );
|
||||||
split.setStackSize(itemToAdd);
|
split.setStackSize( itemToAdd );
|
||||||
leftover.add(cell.injectItems(split, Actionable.MODULATE, src));
|
leftover.add( cell.injectItems( split, Actionable.MODULATE, src ) );
|
||||||
|
|
||||||
src.player().ifPresent( player ->
|
src.player().ifPresent( player ->
|
||||||
{
|
{
|
||||||
@@ -1282,7 +1284,7 @@ public class Platform
|
|||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings( { "rawtypes", "unchecked" } )
|
@SuppressWarnings( {"rawtypes", "unchecked"} )
|
||||||
public static void postChanges( final IStorageGrid gs, final ItemStack removed, final ItemStack added, final IActionSource src )
|
public static void postChanges( final IStorageGrid gs, final ItemStack removed, final ItemStack added, final IActionSource src )
|
||||||
{
|
{
|
||||||
for( final IStorageChannel<?> chan : AEApi.instance().storage().storageChannels() )
|
for( final IStorageChannel<?> chan : AEApi.instance().storage().storageChannels() )
|
||||||
@@ -1361,8 +1363,7 @@ public class Platform
|
|||||||
final String locationA = a.getGridBlock().isWorldAccessible() ? a.getGridBlock().getLocation().toString() : "notInWorld";
|
final String locationA = a.getGridBlock().isWorldAccessible() ? a.getGridBlock().getLocation().toString() : "notInWorld";
|
||||||
final String locationB = b.getGridBlock().isWorldAccessible() ? b.getGridBlock().getLocation().toString() : "notInWorld";
|
final String locationB = b.getGridBlock().isWorldAccessible() ? b.getGridBlock().getLocation().toString() : "notInWorld";
|
||||||
|
|
||||||
AELog.info( "Audit: Node A [isSecure=%b, key=%d, playerID=%d, location={%s}] vs Node B[isSecure=%b, key=%d, playerID=%d, location={%s}]",
|
AELog.info( "Audit: Node A [isSecure=%b, key=%d, playerID=%d, location={%s}] vs Node B[isSecure=%b, key=%d, playerID=%d, location={%s}]", a_isSecure, a.getLastSecurityKey(), a.getPlayerID(), locationA, b_isSecure, b.getLastSecurityKey(), b.getPlayerID(), locationB );
|
||||||
a_isSecure, a.getLastSecurityKey(), a.getPlayerID(), locationA, b_isSecure, b.getLastSecurityKey(), b.getPlayerID(), locationB );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// can't do that son...
|
// can't do that son...
|
||||||
@@ -1423,7 +1424,7 @@ public class Platform
|
|||||||
float yaw = 0.0f;
|
float yaw = 0.0f;
|
||||||
// player.yOffset = 1.8f;
|
// player.yOffset = 1.8f;
|
||||||
|
|
||||||
switch( side )
|
switch ( side )
|
||||||
{
|
{
|
||||||
case DOWN:
|
case DOWN:
|
||||||
pitch = 90.0f;
|
pitch = 90.0f;
|
||||||
@@ -1513,16 +1514,14 @@ public class Platform
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean checkFuzzy = ae_req.getOre().isPresent() || providedTemplate.getItemDamage() == OreDictionary.WILDCARD_VALUE || providedTemplate
|
final boolean checkFuzzy = ae_req.getOre().isPresent() || providedTemplate.getItemDamage() == OreDictionary.WILDCARD_VALUE || providedTemplate.hasTagCompound() || providedTemplate.isItemStackDamageable();
|
||||||
.hasTagCompound() || providedTemplate.isItemStackDamageable();
|
|
||||||
|
|
||||||
if( items != null && checkFuzzy )
|
if( items != null && checkFuzzy )
|
||||||
{
|
{
|
||||||
for( final IAEItemStack x : items )
|
for( final IAEItemStack x : items )
|
||||||
{
|
{
|
||||||
final ItemStack sh = x.getDefinition();
|
final ItemStack sh = x.getDefinition();
|
||||||
if( ( Platform.itemComparisons().isEqualItemType( providedTemplate, sh ) || ae_req.sameOre( x ) ) && !ItemStack.areItemsEqual( sh,
|
if( ( Platform.itemComparisons().isEqualItemType( providedTemplate, sh ) || ae_req.sameOre( x ) ) && !ItemStack.areItemsEqual( sh, output ) )
|
||||||
output ) )
|
|
||||||
{ // Platform.isSameItemType( sh, providedTemplate )
|
{ // Platform.isSameItemType( sh, providedTemplate )
|
||||||
final ItemStack cp = sh.copy();
|
final ItemStack cp = sh.copy();
|
||||||
cp.setCount( 1 );
|
cp.setCount( 1 );
|
||||||
@@ -1681,4 +1680,14 @@ public class Platform
|
|||||||
|
|
||||||
return isPurified;
|
return isPurified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isGTDamageableItem( Item item )
|
||||||
|
{
|
||||||
|
return ( isModLoaded( "gregtech" ) && item instanceof IToolItem );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isIC2DamageableItem( Item item )
|
||||||
|
{
|
||||||
|
return ( isModLoaded( "IC2" ) && item instanceof ICustomDamageItem );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -223,26 +223,28 @@ public class AdaptorItemHandler extends InventoryAdaptor
|
|||||||
return this.addItems( toBeSimulated, true );
|
return this.addItems( toBeSimulated, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ItemStack addItems( final ItemStack itemsToAdd, final boolean simulate )
|
protected ItemStack addItems( ItemStack itemsToAdd, final boolean simulate )
|
||||||
{
|
{
|
||||||
if( itemsToAdd.isEmpty() )
|
if( itemsToAdd.isEmpty() )
|
||||||
{
|
{
|
||||||
return ItemStack.EMPTY;
|
return ItemStack.EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack left = itemsToAdd.copy();
|
|
||||||
|
|
||||||
for( int slot = 0; slot < this.itemHandler.getSlots(); slot++ )
|
for( int slot = 0; slot < this.itemHandler.getSlots(); slot++ )
|
||||||
{
|
{
|
||||||
left = this.itemHandler.insertItem( slot, left, simulate );
|
if( !simulate )
|
||||||
|
{
|
||||||
|
itemsToAdd = itemsToAdd.copy();
|
||||||
|
}
|
||||||
|
itemsToAdd = this.itemHandler.insertItem( slot, itemsToAdd, simulate );
|
||||||
|
|
||||||
if( left.isEmpty() )
|
if( itemsToAdd.isEmpty() )
|
||||||
{
|
{
|
||||||
return ItemStack.EMPTY;
|
return ItemStack.EMPTY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return left;
|
return itemsToAdd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ public class AdaptorItemRepository extends InventoryAdaptor
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extracted = this.itemRepository.extractItem( filter, amount, false );
|
extracted = this.itemRepository.extractItem( filter.isEmpty() ? extracted : filter, amount, false );
|
||||||
|
|
||||||
return extracted;
|
return extracted;
|
||||||
}
|
}
|
||||||
@@ -163,23 +163,26 @@ public class AdaptorItemRepository extends InventoryAdaptor
|
|||||||
return this.addItems( toBeAdded, false );
|
return this.addItems( toBeAdded, false );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ItemStack addItems( final ItemStack itemsToAdd, final boolean simulate )
|
protected ItemStack addItems( ItemStack itemsToAdd, final boolean simulate )
|
||||||
{
|
{
|
||||||
if( itemsToAdd.isEmpty() )
|
if( itemsToAdd.isEmpty() )
|
||||||
{
|
{
|
||||||
return ItemStack.EMPTY;
|
return ItemStack.EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack left = itemsToAdd.copy();
|
if( !simulate )
|
||||||
|
{
|
||||||
|
itemsToAdd = itemsToAdd.copy();
|
||||||
|
}
|
||||||
|
|
||||||
left = this.itemRepository.insertItem( left, simulate );
|
itemsToAdd = this.itemRepository.insertItem( itemsToAdd, simulate );
|
||||||
|
|
||||||
if( left.isEmpty() )
|
if( itemsToAdd.isEmpty() )
|
||||||
{
|
{
|
||||||
return ItemStack.EMPTY;
|
return ItemStack.EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
return left;
|
return itemsToAdd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package appeng.util.inv;
|
||||||
|
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class BlockingInventoryAdaptor implements Iterable<ItemSlot>
|
||||||
|
{
|
||||||
|
public static BlockingInventoryAdaptor getAdaptor( final TileEntity te, final EnumFacing d )
|
||||||
|
{
|
||||||
|
if( te != null && te.hasCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d ) )
|
||||||
|
{
|
||||||
|
// Attempt getting an IItemHandler for the given side via caps
|
||||||
|
IItemHandler itemHandler = te.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d );
|
||||||
|
if( itemHandler != null )
|
||||||
|
{
|
||||||
|
return new BlockingItemHandler( itemHandler, te.getBlockType().getRegistryName().getResourceDomain() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean containsBlockingItems();
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package appeng.util.inv;
|
||||||
|
|
||||||
|
import appeng.helpers.NonBlockingItems;
|
||||||
|
import it.unimi.dsi.fastutil.ints.IntSet;
|
||||||
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
|
||||||
|
public class BlockingItemHandler extends BlockingInventoryAdaptor
|
||||||
|
{
|
||||||
|
protected final IItemHandler itemHandler;
|
||||||
|
private final String domain;
|
||||||
|
|
||||||
|
public BlockingItemHandler( IItemHandler itemHandler, String domain )
|
||||||
|
{
|
||||||
|
this.itemHandler = itemHandler;
|
||||||
|
this.domain = domain;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isBlockableItem( ItemStack stack )
|
||||||
|
{
|
||||||
|
Object2ObjectOpenHashMap<Item, IntSet> map = NonBlockingItems.INSTANCE.getMap().get( domain );
|
||||||
|
if( map.get( stack.getItem() ) != null )
|
||||||
|
{
|
||||||
|
return !map.get( stack.getItem() ).contains( stack.getItemDamage() );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean containsBlockingItems()
|
||||||
|
{
|
||||||
|
int slots = this.itemHandler.getSlots();
|
||||||
|
for( int slot = 0; slot < slots; slot++ )
|
||||||
|
{
|
||||||
|
ItemStack is = this.itemHandler.getStackInSlot( slot );
|
||||||
|
if( !is.isEmpty() && isBlockableItem( is ) )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<ItemSlot> iterator()
|
||||||
|
{
|
||||||
|
return new ItemHandlerIterator( this.itemHandler );
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,6 +25,9 @@ import java.util.Optional;
|
|||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.google.common.primitives.Ints;
|
||||||
|
import gregtech.api.items.IToolItem;
|
||||||
|
import ic2.api.item.ICustomDamageItem;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -41,7 +44,9 @@ import appeng.api.storage.data.IAEItemStack;
|
|||||||
import appeng.core.Api;
|
import appeng.core.Api;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
|
||||||
public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemStack {
|
|
||||||
|
public class AEItemStack extends AEStack<IAEItemStack> implements IAEItemStack
|
||||||
|
{
|
||||||
private static final String NBT_STACKSIZE = "Cnt";
|
private static final String NBT_STACKSIZE = "Cnt";
|
||||||
private static final String NBT_REQUESTABLE = "Req";
|
private static final String NBT_REQUESTABLE = "Req";
|
||||||
private static final String NBT_CRAFTABLE = "Craft";
|
private static final String NBT_CRAFTABLE = "Craft";
|
||||||
@@ -49,34 +54,40 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
|
|||||||
private final AESharedItemStack sharedStack;
|
private final AESharedItemStack sharedStack;
|
||||||
private Optional<OreReference> oreReference;
|
private Optional<OreReference> oreReference;
|
||||||
|
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly( Side.CLIENT )
|
||||||
private String displayName;
|
private String displayName;
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly( Side.CLIENT )
|
||||||
private List<String> tooltip;
|
private List<String> tooltip;
|
||||||
|
private ItemStack cachedItemStack;
|
||||||
|
|
||||||
private AEItemStack(final AEItemStack is) {
|
private AEItemStack( final AEItemStack is )
|
||||||
this.setStackSize(is.getStackSize());
|
{
|
||||||
this.setCraftable(is.isCraftable());
|
this.setStackSize( is.getStackSize() );
|
||||||
this.setCountRequestable(is.getCountRequestable());
|
this.setCraftable( is.isCraftable() );
|
||||||
|
this.setCountRequestable( is.getCountRequestable() );
|
||||||
this.sharedStack = is.sharedStack;
|
this.sharedStack = is.sharedStack;
|
||||||
this.oreReference = is.oreReference;
|
this.oreReference = is.oreReference;
|
||||||
|
this.cachedItemStack = is.cachedItemStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
private AEItemStack(final AESharedItemStack is, long size) {
|
private AEItemStack( final AESharedItemStack is, long size )
|
||||||
|
{
|
||||||
this.sharedStack = is;
|
this.sharedStack = is;
|
||||||
this.setStackSize(size);
|
this.setStackSize( size );
|
||||||
this.setCraftable(false);
|
this.setCraftable( false );
|
||||||
this.setCountRequestable(0);
|
this.setCountRequestable( 0 );
|
||||||
this.oreReference = OreHelper.INSTANCE.getOre( is.getDefinition() );
|
this.oreReference = OreHelper.INSTANCE.getOre( is.getDefinition() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public static AEItemStack fromItemStack(@Nonnull final ItemStack stack) {
|
public static AEItemStack fromItemStack( @Nonnull final ItemStack stack )
|
||||||
if (stack.isEmpty()) {
|
{
|
||||||
|
if( stack.isEmpty() )
|
||||||
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new AEItemStack(AEItemStackRegistry.getRegisteredStack(stack), stack.getCount());
|
return new AEItemStack( AEItemStackRegistry.getRegisteredStack( stack ), stack.getCount() );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IAEItemStack fromNBT( final NBTTagCompound i )
|
public static IAEItemStack fromNBT( final NBTTagCompound i )
|
||||||
@@ -94,19 +105,20 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
|
|||||||
|
|
||||||
final AEItemStack item = AEItemStack.fromItemStack( itemstack );
|
final AEItemStack item = AEItemStack.fromItemStack( itemstack );
|
||||||
|
|
||||||
item.setStackSize(i.getLong(NBT_STACKSIZE));
|
item.setStackSize( i.getLong( NBT_STACKSIZE ) );
|
||||||
item.setCountRequestable(i.getLong(NBT_REQUESTABLE));
|
item.setCountRequestable( i.getLong( NBT_REQUESTABLE ) );
|
||||||
item.setCraftable(i.getBoolean(NBT_CRAFTABLE));
|
item.setCraftable( i.getBoolean( NBT_CRAFTABLE ) );
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeToNBT(final NBTTagCompound i) {
|
public void writeToNBT( final NBTTagCompound i )
|
||||||
|
{
|
||||||
this.getDefinition().writeToNBT( i );
|
this.getDefinition().writeToNBT( i );
|
||||||
|
|
||||||
i.setLong(NBT_STACKSIZE, this.getStackSize());
|
i.setLong( NBT_STACKSIZE, this.getStackSize() );
|
||||||
i.setLong(NBT_REQUESTABLE, this.getCountRequestable());
|
i.setLong( NBT_REQUESTABLE, this.getCountRequestable() );
|
||||||
i.setBoolean(NBT_CRAFTABLE, this.isCraftable());
|
i.setBoolean( NBT_CRAFTABLE, this.isCraftable() );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AEItemStack fromPacket( final ByteBuf data )
|
public static AEItemStack fromPacket( final ByteBuf data )
|
||||||
@@ -134,8 +146,7 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
|
|||||||
@Override
|
@Override
|
||||||
public void writeToPacket( final ByteBuf i )
|
public void writeToPacket( final ByteBuf i )
|
||||||
{
|
{
|
||||||
final byte mask = (byte) ( ( this.getType( this.getStackSize() ) << 2 ) | ( this
|
final byte mask = (byte) ( ( this.getType( this.getStackSize() ) << 2 ) | ( this.getType( this.getCountRequestable() ) << 4 ) | ( (byte) ( this.isCraftable() ? 1 : 0 ) << 6 ) | ( this.hasTagCompound() ? 1 : 0 ) << 7 );
|
||||||
.getType( this.getCountRequestable() ) << 4 ) | ( (byte) ( this.isCraftable() ? 1 : 0 ) << 6 ) | ( this.hasTagCompound() ? 1 : 0 ) << 7 );
|
|
||||||
|
|
||||||
i.writeByte( mask );
|
i.writeByte( mask );
|
||||||
ByteBufUtils.writeTag( i, this.getDefinition().serializeNBT() );
|
ByteBufUtils.writeTag( i, this.getDefinition().serializeNBT() );
|
||||||
@@ -144,27 +155,31 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(final IAEItemStack option) {
|
public void add( final IAEItemStack option )
|
||||||
if (option == null) {
|
{
|
||||||
|
if( option == null )
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.incStackSize(option.getStackSize());
|
this.incStackSize( option.getStackSize() );
|
||||||
this.setCountRequestable(this.getCountRequestable() + option.getCountRequestable());
|
this.setCountRequestable( this.getCountRequestable() + option.getCountRequestable() );
|
||||||
this.setCraftable(this.isCraftable() || option.isCraftable());
|
this.setCraftable( this.isCraftable() || option.isCraftable() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean fuzzyComparison(final IAEItemStack other, final FuzzyMode mode) {
|
public boolean fuzzyComparison( final IAEItemStack other, final FuzzyMode mode )
|
||||||
|
{
|
||||||
final ItemStack itemStack = this.getDefinition();
|
final ItemStack itemStack = this.getDefinition();
|
||||||
final ItemStack otherStack = other.getDefinition();
|
final ItemStack otherStack = other.getDefinition();
|
||||||
|
|
||||||
return this.fuzzyItemStackComparison(itemStack, otherStack, mode);
|
return this.fuzzyItemStackComparison( itemStack, otherStack, mode );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IAEItemStack copy() {
|
public IAEItemStack copy()
|
||||||
return new AEItemStack(this);
|
{
|
||||||
|
return new AEItemStack( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -180,23 +195,26 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IStorageChannel<IAEItemStack> getChannel() {
|
public IStorageChannel<IAEItemStack> getChannel()
|
||||||
return Api.INSTANCE.storage().getStorageChannel(IItemStorageChannel.class);
|
{
|
||||||
|
return Api.INSTANCE.storage().getStorageChannel( IItemStorageChannel.class );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack createItemStack() {
|
public ItemStack createItemStack()
|
||||||
return ItemHandlerHelper.copyStackWithSize(this.getDefinition(),
|
{
|
||||||
(int) Math.min(Integer.MAX_VALUE, this.getStackSize()));
|
return ItemHandlerHelper.copyStackWithSize( this.getDefinition(), (int) Math.min( Integer.MAX_VALUE, this.getStackSize() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Item getItem() {
|
public Item getItem()
|
||||||
|
{
|
||||||
return this.getDefinition().getItem();
|
return this.getDefinition().getItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemDamage() {
|
public int getItemDamage()
|
||||||
|
{
|
||||||
return this.sharedStack.getItemDamage();
|
return this.sharedStack.getItemDamage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,72 +225,110 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isSameType(final IAEItemStack otherStack) {
|
public boolean isSameType( final IAEItemStack otherStack )
|
||||||
if (otherStack == null) {
|
{
|
||||||
|
if( otherStack == null )
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Objects.equals(this.sharedStack, ((AEItemStack) otherStack).sharedStack);
|
return Objects.equals( this.sharedStack, ( (AEItemStack) otherStack ).sharedStack );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isSameType(final ItemStack otherStack) {
|
public boolean isSameType( final ItemStack otherStack )
|
||||||
if (otherStack.isEmpty()) {
|
{
|
||||||
|
if( otherStack.isEmpty() )
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int oldSize = otherStack.getCount();
|
int oldSize = otherStack.getCount();
|
||||||
|
|
||||||
otherStack.setCount(1);
|
otherStack.setCount( 1 );
|
||||||
boolean ret = ItemStack.areItemStacksEqual(this.getDefinition(), otherStack);
|
boolean ret = ItemStack.areItemStacksEqual( this.getDefinition(), otherStack );
|
||||||
otherStack.setCount(oldSize);
|
otherStack.setCount( oldSize );
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode()
|
||||||
|
{
|
||||||
return this.sharedStack.hashCode();
|
return this.sharedStack.hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(final Object ia) {
|
public boolean equals( final Object ia )
|
||||||
if (ia instanceof AEItemStack) {
|
{
|
||||||
return this.isSameType((AEItemStack) ia);
|
if( ia instanceof AEItemStack )
|
||||||
} else if (ia instanceof ItemStack) {
|
{
|
||||||
|
return this.isSameType( (AEItemStack) ia );
|
||||||
|
}
|
||||||
|
else if( ia instanceof ItemStack )
|
||||||
|
{
|
||||||
// this actually breaks the equals contract (being equals to unrelated classes)
|
// this actually breaks the equals contract (being equals to unrelated classes)
|
||||||
return equals((ItemStack) ia);
|
return equals( (ItemStack) ia );
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(final ItemStack is) {
|
public boolean equals( final ItemStack is )
|
||||||
return this.isSameType(is);
|
{
|
||||||
|
return this.isSameType( is );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public ItemStack getCachedItemStack( long stackSize )
|
||||||
|
{
|
||||||
|
if( this.cachedItemStack != null )
|
||||||
|
{
|
||||||
|
if( Platform.itemComparisons().isSameItem( this.getDefinition(), this.cachedItemStack ) )
|
||||||
|
{
|
||||||
|
ItemStack currentCached = this.cachedItemStack;
|
||||||
|
this.cachedItemStack = null;
|
||||||
|
currentCached.setCount( Ints.saturatedCast( stackSize ) );
|
||||||
|
return currentCached;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ItemHandlerHelper.copyStackWithSize( this.getDefinition(), Ints.saturatedCast( stackSize ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCachedItemStack( ItemStack itemStack )
|
||||||
|
{
|
||||||
|
this.cachedItemStack = itemStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
return this.getStackSize() + "x" + this.getDefinition().getItem().getRegistryName();
|
return this.getStackSize() + "x" + this.getDefinition().getItem().getRegistryName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly( Side.CLIENT )
|
||||||
public List<String> getToolTip() {
|
public List<String> getToolTip()
|
||||||
if (this.tooltip == null) {
|
{
|
||||||
this.tooltip = Platform.getTooltip(this.asItemStackRepresentation());
|
if( this.tooltip == null )
|
||||||
|
{
|
||||||
|
this.tooltip = Platform.getTooltip( this.asItemStackRepresentation() );
|
||||||
}
|
}
|
||||||
return this.tooltip;
|
return this.tooltip;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly( Side.CLIENT )
|
||||||
public String getDisplayName() {
|
public String getDisplayName()
|
||||||
if (this.displayName == null) {
|
{
|
||||||
this.displayName = Platform.getItemDisplayName(this.asItemStackRepresentation());
|
if( this.displayName == null )
|
||||||
|
{
|
||||||
|
this.displayName = Platform.getItemDisplayName( this.asItemStackRepresentation() );
|
||||||
}
|
}
|
||||||
return this.displayName;
|
return this.displayName;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly( Side.CLIENT )
|
||||||
public String getModID() {
|
public String getModID()
|
||||||
|
{
|
||||||
return this.getDefinition().getItem().getRegistryName().getResourceDomain();
|
return this.getDefinition().getItem().getRegistryName().getResourceDomain();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,33 +338,77 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasTagCompound() {
|
public boolean hasTagCompound()
|
||||||
|
{
|
||||||
return this.getDefinition().hasTagCompound();
|
return this.getDefinition().hasTagCompound();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack asItemStackRepresentation() {
|
public ItemStack asItemStackRepresentation()
|
||||||
|
{
|
||||||
return this.getDefinition().copy();
|
return this.getDefinition().copy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getDefinition() {
|
public ItemStack getDefinition()
|
||||||
|
{
|
||||||
return this.sharedStack.getDefinition();
|
return this.sharedStack.getDefinition();
|
||||||
}
|
}
|
||||||
|
|
||||||
AESharedItemStack getSharedStack() {
|
AESharedItemStack getSharedStack()
|
||||||
|
{
|
||||||
return this.sharedStack;
|
return this.sharedStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean fuzzyItemStackComparison(ItemStack a, ItemStack b, FuzzyMode mode) {
|
private boolean fuzzyItemStackComparison( ItemStack a, ItemStack b, FuzzyMode mode )
|
||||||
if (a.getItem() == b.getItem() && a.getItem().isDamageable()) {
|
{
|
||||||
if (mode == FuzzyMode.IGNORE_ALL) {
|
if( a.getItem() == b.getItem() && ( a.getItem().isDamageable() || Platform.isGTDamageableItem( a.getItem() ) ) )
|
||||||
|
{
|
||||||
|
if( mode == FuzzyMode.IGNORE_ALL )
|
||||||
|
{
|
||||||
|
if( a.getItem().isDamageable() )
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
} else if (mode == FuzzyMode.PERCENT_99) {
|
}
|
||||||
|
else if( Platform.isGTDamageableItem( a.getItem() ) )
|
||||||
|
{
|
||||||
|
return a.getItemDamage() == b.getItemDamage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( mode == FuzzyMode.PERCENT_99 )
|
||||||
|
{
|
||||||
|
if( Platform.isIC2DamageableItem( a.getItem() ) )
|
||||||
|
{
|
||||||
|
return ( (ICustomDamageItem) a.getItem() ).getCustomDamage( a ) > 1 == ( (ICustomDamageItem) b.getItem() ).getCustomDamage( b ) > 1;
|
||||||
|
}
|
||||||
|
else if( a.getItem().isDamageable() )
|
||||||
|
{
|
||||||
return a.getItemDamage() > 1 == b.getItemDamage() > 1;
|
return a.getItemDamage() > 1 == b.getItemDamage() > 1;
|
||||||
} else {
|
}
|
||||||
final float percentDamageOfA = (float) a.getItemDamage() / a.getMaxDamage();
|
else if( Platform.isGTDamageableItem( a.getItem() ) )
|
||||||
final float percentDamageOfB = (float) b.getItemDamage() / b.getMaxDamage();
|
{
|
||||||
|
return ( (IToolItem) a.getItem() ).getItemDamage( a ) > 1 == ( (IToolItem) b.getItem() ).getItemDamage( b ) > 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float percentDamageOfA = 0;
|
||||||
|
float percentDamageOfB = 0;
|
||||||
|
if( Platform.isIC2DamageableItem( a.getItem() ) )
|
||||||
|
{
|
||||||
|
percentDamageOfA = (float) ( (ICustomDamageItem) a.getItem() ).getCustomDamage( a ) / ( (ICustomDamageItem) a.getItem() ).getMaxCustomDamage( a );
|
||||||
|
percentDamageOfB = (float) ( (ICustomDamageItem) b.getItem() ).getCustomDamage( b ) / ( (ICustomDamageItem) b.getItem() ).getMaxCustomDamage( b );
|
||||||
|
}
|
||||||
|
else if( a.getItem().isDamageable() )
|
||||||
|
{
|
||||||
|
percentDamageOfA = (float) a.getItemDamage() / a.getMaxDamage();
|
||||||
|
percentDamageOfB = (float) b.getItemDamage() / b.getMaxDamage();
|
||||||
|
}
|
||||||
|
else if( Platform.isGTDamageableItem( a.getItem() ) )
|
||||||
|
{
|
||||||
|
percentDamageOfA = (float) ( (IToolItem) a.getItem() ).getItemDamage( a ) / ( (IToolItem) a.getItem() ).getMaxItemDamage( a );
|
||||||
|
percentDamageOfB = (float) ( (IToolItem) b.getItem() ).getItemDamage( b ) / ( (IToolItem) b.getItem() ).getMaxItemDamage( b );
|
||||||
|
}
|
||||||
|
|
||||||
return percentDamageOfA > mode.breakPoint == percentDamageOfB > mode.breakPoint;
|
return percentDamageOfA > mode.breakPoint == percentDamageOfB > mode.breakPoint;
|
||||||
}
|
}
|
||||||
@@ -316,4 +416,5 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,18 +22,19 @@ import java.util.Objects;
|
|||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
|
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
final class AESharedItemStack {
|
|
||||||
|
final class AESharedItemStack
|
||||||
|
{
|
||||||
|
|
||||||
private final ItemStack itemStack;
|
private final ItemStack itemStack;
|
||||||
private final int itemId;
|
|
||||||
private final int itemDamage;
|
private final int itemDamage;
|
||||||
private final int hashCode;
|
private final int hashCode;
|
||||||
|
|
||||||
public AESharedItemStack(final ItemStack itemStack) {
|
public AESharedItemStack( final ItemStack itemStack )
|
||||||
this(itemStack, itemStack.getItemDamage());
|
{
|
||||||
|
this( itemStack, itemStack.getItemDamage() );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -42,52 +43,57 @@ final class AESharedItemStack {
|
|||||||
* @param itemStack The {@link ItemStack} to filter
|
* @param itemStack The {@link ItemStack} to filter
|
||||||
* @param damage The damage of the item
|
* @param damage The damage of the item
|
||||||
*/
|
*/
|
||||||
private AESharedItemStack(ItemStack itemStack, int damage) {
|
private AESharedItemStack( ItemStack itemStack, int damage )
|
||||||
|
{
|
||||||
this.itemStack = itemStack;
|
this.itemStack = itemStack;
|
||||||
this.itemId = Item.getIdFromItem(itemStack.getItem());
|
|
||||||
this.itemDamage = damage;
|
this.itemDamage = damage;
|
||||||
|
|
||||||
// Ensure this is always called last.
|
// Ensure this is always called last.
|
||||||
this.hashCode = this.makeHashCode();
|
this.hashCode = this.makeHashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack getDefinition() {
|
ItemStack getDefinition()
|
||||||
|
{
|
||||||
return this.itemStack;
|
return this.itemStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getItemDamage() {
|
int getItemDamage()
|
||||||
|
{
|
||||||
return this.itemDamage;
|
return this.itemDamage;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode()
|
||||||
|
{
|
||||||
return this.hashCode;
|
return this.hashCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(final Object obj) {
|
public boolean equals( final Object obj )
|
||||||
if (this == obj) {
|
{
|
||||||
|
if( this == obj )
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!(obj instanceof AESharedItemStack)) {
|
if( !( obj instanceof AESharedItemStack ) )
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final AESharedItemStack other = (AESharedItemStack) obj;
|
final AESharedItemStack other = (AESharedItemStack) obj;
|
||||||
Preconditions.checkState(this.itemStack.getCount() == 1, "ItemStack#getCount() has to be 1");
|
Preconditions.checkState( this.itemStack.getCount() == 1, "ItemStack#getCount() has to be 1" );
|
||||||
Preconditions.checkArgument(other.getDefinition().getCount() == 1, "ItemStack#getCount() has to be 1");
|
Preconditions.checkArgument( other.getDefinition().getCount() == 1, "ItemStack#getCount() has to be 1" );
|
||||||
|
|
||||||
if (this.itemStack == other.itemStack) {
|
if( this.itemStack == other.itemStack )
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return ItemStack.areItemStacksEqual(this.itemStack, other.itemStack);
|
return ItemStack.areItemStacksEqual( this.itemStack, other.itemStack );
|
||||||
}
|
}
|
||||||
|
|
||||||
private int makeHashCode() {
|
private int makeHashCode()
|
||||||
return Objects.hash(
|
{
|
||||||
this.itemId,
|
return Objects.hash( this.itemStack.getItem(), this.itemDamage, this.itemStack.hasTagCompound() ? this.itemStack.getTagCompound() : 0 );
|
||||||
this.itemDamage,
|
|
||||||
this.itemStack.hasTagCompound() ? this.itemStack.getTagCompound() : 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ import java.util.Map;
|
|||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
|
|
||||||
import gregtech.common.items.MetaTool;
|
import gregtech.api.items.IToolItem;
|
||||||
|
import ic2.api.item.ICustomDamageItem;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectAVLTreeMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectAVLTreeMap;
|
||||||
@@ -34,40 +35,46 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
|||||||
import appeng.api.config.FuzzyMode;
|
import appeng.api.config.FuzzyMode;
|
||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This variant list is optimized for damageable items, and supports selecting durability ranges with
|
* This variant list is optimized for damageable items, and supports selecting durability ranges with
|
||||||
* {@link #findFuzzy(IAEItemStack, FuzzyMode)}.
|
* {@link #findFuzzy(IAEItemStack, FuzzyMode)}.
|
||||||
*/
|
*/
|
||||||
class FuzzyItemVariantList extends ItemVariantList {
|
class FuzzyItemVariantList extends ItemVariantList
|
||||||
|
{
|
||||||
|
|
||||||
static final SharedStackComparator COMPARATOR = new SharedStackComparator();
|
static final SharedStackComparator COMPARATOR = new SharedStackComparator();
|
||||||
|
|
||||||
// NOTE: We only use Object as they key here so we can pass our special DamageBounds to the subMap method.
|
// NOTE: We only use Object as they key here so we can pass our special DamageBounds to the subMap method.
|
||||||
// We NEVER put any keys in this map that are not AESharedItemStacks.
|
// We NEVER put any keys in this map that are not AESharedItemStacks.
|
||||||
private final Object2ObjectSortedMap<Object, IAEItemStack> records = new Object2ObjectAVLTreeMap<>(COMPARATOR);
|
private final Object2ObjectSortedMap<Object, IAEItemStack> records = new Object2ObjectAVLTreeMap<>( COMPARATOR );
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<IAEItemStack> findFuzzy(final IAEItemStack filter, final FuzzyMode fuzzy) {
|
public Collection<IAEItemStack> findFuzzy( final IAEItemStack filter, final FuzzyMode fuzzy )
|
||||||
|
{
|
||||||
ItemStack itemStack = filter.getDefinition();
|
ItemStack itemStack = filter.getDefinition();
|
||||||
|
|
||||||
ItemDamageBound lowerBound = makeLowerBound(itemStack, fuzzy);
|
ItemDamageBound lowerBound = makeLowerBound( itemStack, fuzzy );
|
||||||
ItemDamageBound upperBound = makeUpperBound(itemStack, fuzzy);
|
ItemDamageBound upperBound = makeUpperBound( itemStack, fuzzy );
|
||||||
Preconditions.checkState(lowerBound.itemDamage > upperBound.itemDamage);
|
Preconditions.checkState( lowerBound.itemDamage > upperBound.itemDamage );
|
||||||
|
|
||||||
return this.records.subMap(lowerBound, upperBound).values();
|
return this.records.subMap( lowerBound, upperBound ).values();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings( "unchecked" )
|
||||||
@Override
|
@Override
|
||||||
Map<AESharedItemStack, IAEItemStack> getRecords() {
|
Map<AESharedItemStack, IAEItemStack> getRecords()
|
||||||
|
{
|
||||||
// We ensure on our end that we NEVER use anything but AESharedItemStack as the key in this map
|
// We ensure on our end that we NEVER use anything but AESharedItemStack as the key in this map
|
||||||
return (Map<AESharedItemStack, IAEItemStack>) (Object) this.records;
|
return (Map<AESharedItemStack, IAEItemStack>) (Object) this.records;
|
||||||
}
|
}
|
||||||
|
|
||||||
static class ItemDamageBound {
|
static class ItemDamageBound
|
||||||
|
{
|
||||||
final int itemDamage;
|
final int itemDamage;
|
||||||
|
|
||||||
public ItemDamageBound(int itemDamage) {
|
public ItemDamageBound( int itemDamage )
|
||||||
|
{
|
||||||
this.itemDamage = itemDamage;
|
this.itemDamage = itemDamage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -77,51 +84,62 @@ class FuzzyItemVariantList extends ItemVariantList {
|
|||||||
* support selecting ranges of durability, it is defined for type {@link Object} and also accepts
|
* support selecting ranges of durability, it is defined for type {@link Object} and also accepts
|
||||||
* {@link ItemDamageBound} as an argument to compare against.
|
* {@link ItemDamageBound} as an argument to compare against.
|
||||||
*/
|
*/
|
||||||
static class SharedStackComparator implements Comparator<Object> {
|
static class SharedStackComparator implements Comparator<Object>
|
||||||
|
{
|
||||||
@Override
|
@Override
|
||||||
public int compare(Object a, Object b) {
|
public int compare( Object a, Object b )
|
||||||
|
{
|
||||||
// Either argument can either be a damage bound or a shared item stack
|
// Either argument can either be a damage bound or a shared item stack
|
||||||
// Since we never put damage bounds into the map as keys, only one
|
// Since we never put damage bounds into the map as keys, only one
|
||||||
// of the two arguments can possibly be a bound
|
// of the two arguments can possibly be a bound
|
||||||
ItemDamageBound boundA = null;
|
ItemDamageBound boundA = null;
|
||||||
AESharedItemStack stackA = null;
|
AESharedItemStack stackA = null;
|
||||||
int itemDamageA;
|
int itemDamageA;
|
||||||
if (a instanceof ItemDamageBound) {
|
if( a instanceof ItemDamageBound )
|
||||||
|
{
|
||||||
boundA = (ItemDamageBound) a;
|
boundA = (ItemDamageBound) a;
|
||||||
itemDamageA = boundA.itemDamage;
|
itemDamageA = boundA.itemDamage;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
stackA = (AESharedItemStack) a;
|
stackA = (AESharedItemStack) a;
|
||||||
itemDamageA = stackA.getItemDamage();
|
itemDamageA = stackA.getItemDamage();
|
||||||
}
|
}
|
||||||
ItemDamageBound boundB = null;
|
ItemDamageBound boundB = null;
|
||||||
AESharedItemStack stackB = null;
|
AESharedItemStack stackB = null;
|
||||||
int itemDamageB;
|
int itemDamageB;
|
||||||
if (b instanceof ItemDamageBound) {
|
if( b instanceof ItemDamageBound )
|
||||||
|
{
|
||||||
boundB = (ItemDamageBound) b;
|
boundB = (ItemDamageBound) b;
|
||||||
itemDamageB = boundB.itemDamage;
|
itemDamageB = boundB.itemDamage;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
stackB = (AESharedItemStack) b;
|
stackB = (AESharedItemStack) b;
|
||||||
itemDamageB = stackB.getItemDamage();
|
itemDamageB = stackB.getItemDamage();
|
||||||
}
|
}
|
||||||
|
|
||||||
// When either argument is a damage bound, we just compare the damage values because it is used
|
// When either argument is a damage bound, we just compare the damage values because it is used
|
||||||
// only to get a certain damage range out of the map.
|
// only to get a certain damage range out of the map.
|
||||||
if (boundA != null || boundB != null) {
|
if( boundA != null || boundB != null )
|
||||||
return Integer.compare(itemDamageB, itemDamageA);
|
{
|
||||||
|
return Integer.compare( itemDamageB, itemDamageA );
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack itemStackA = stackA.getDefinition();
|
ItemStack itemStackA = stackA.getDefinition();
|
||||||
ItemStack itemStackB = stackB.getDefinition();
|
ItemStack itemStackB = stackB.getDefinition();
|
||||||
Preconditions.checkState(itemStackA.getCount() == 1, "ItemStack#getCount() has to be 1");
|
Preconditions.checkState( itemStackA.getCount() == 1, "ItemStack#getCount() has to be 1" );
|
||||||
Preconditions.checkArgument(itemStackB.getCount() == 1, "ItemStack#getCount() has to be 1");
|
Preconditions.checkArgument( itemStackB.getCount() == 1, "ItemStack#getCount() has to be 1" );
|
||||||
|
|
||||||
if (itemStackA == itemStackB) {
|
if( itemStackA == itemStackB )
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Damaged items are sorted before undamaged items
|
// Damaged items are sorted before undamaged items
|
||||||
final int damageValue = Integer.compare(itemDamageB, itemDamageA);
|
final int damageValue = Integer.compare( itemDamageB, itemDamageA );
|
||||||
if (damageValue != 0) {
|
if( damageValue != 0 )
|
||||||
|
{
|
||||||
return damageValue;
|
return damageValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,7 +147,7 @@ class FuzzyItemVariantList extends ItemVariantList {
|
|||||||
// While this will order seemingly at random, we only need the order of
|
// While this will order seemingly at random, we only need the order of
|
||||||
// damage values to be predictable, while still having to satisfy the
|
// damage values to be predictable, while still having to satisfy the
|
||||||
// complete order requirements of the sorted map
|
// complete order requirements of the sorted map
|
||||||
return Long.compare(System.identityHashCode(itemStackA), System.identityHashCode(itemStackB));
|
return Long.compare( System.identityHashCode( itemStackA ), System.identityHashCode( itemStackB ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,26 +164,39 @@ class FuzzyItemVariantList extends ItemVariantList {
|
|||||||
* Keep in mind that the stack order is from most damaged to least damaged, so this lower bound will actually be a
|
* Keep in mind that the stack order is from most damaged to least damaged, so this lower bound will actually be a
|
||||||
* higher number than the upper bound.
|
* higher number than the upper bound.
|
||||||
*/
|
*/
|
||||||
static ItemDamageBound makeLowerBound(final ItemStack stack, final FuzzyMode fuzzy)
|
static ItemDamageBound makeLowerBound( final ItemStack stack, final FuzzyMode fuzzy )
|
||||||
{
|
{
|
||||||
Preconditions.checkState( stack.getItem().isDamageable() , "Item#isDamageable() has to be true" );
|
Preconditions.checkState( stack.getItem().isDamageable() || ( Platform.isGTDamageableItem( stack.getItem() ) ), "Item#isDamageable() has to be true" );
|
||||||
|
|
||||||
int damage;
|
int damage;
|
||||||
if( fuzzy == FuzzyMode.IGNORE_ALL )
|
int maxDamage;
|
||||||
|
if( Platform.isIC2DamageableItem( stack.getItem() ) )
|
||||||
{
|
{
|
||||||
if( stack.getMaxDamage() == 0 )
|
maxDamage = ( (ICustomDamageItem) stack.getItem() ).getMaxCustomDamage( stack );
|
||||||
|
damage = ( (ICustomDamageItem) stack.getItem() ).getCustomDamage( stack );
|
||||||
|
}
|
||||||
|
else if( Platform.isGTDamageableItem( stack.getItem() ) )
|
||||||
{
|
{
|
||||||
|
maxDamage = ( (IToolItem) stack.getItem() ).getMaxItemDamage( stack );
|
||||||
|
damage = ( (IToolItem) stack.getItem() ).getItemDamage( stack );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
maxDamage = stack.getMaxDamage();
|
||||||
damage = stack.getItemDamage();
|
damage = stack.getItemDamage();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if( fuzzy == FuzzyMode.IGNORE_ALL )
|
||||||
{
|
{
|
||||||
damage = stack.getMaxDamage();
|
if( maxDamage != 0 )
|
||||||
|
{
|
||||||
|
damage = maxDamage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
final int breakpoint = fuzzy.calculateBreakPoint( stack.getMaxDamage() );
|
final int breakpoint = fuzzy.calculateBreakPoint( maxDamage );
|
||||||
damage = stack.getItemDamage() <= breakpoint ? breakpoint : stack.getMaxDamage();
|
damage = damage <= breakpoint ? breakpoint : maxDamage;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ItemDamageBound( damage );
|
return new ItemDamageBound( damage );
|
||||||
@@ -175,18 +206,39 @@ class FuzzyItemVariantList extends ItemVariantList {
|
|||||||
* Keep in mind that the stack order is from most damaged to least damaged, so this upper bound will actually be a
|
* Keep in mind that the stack order is from most damaged to least damaged, so this upper bound will actually be a
|
||||||
* lower number than the lower bound. It also is exclusive.
|
* lower number than the lower bound. It also is exclusive.
|
||||||
*/
|
*/
|
||||||
static ItemDamageBound makeUpperBound(final ItemStack stack, final FuzzyMode fuzzy) {
|
static ItemDamageBound makeUpperBound( final ItemStack stack, final FuzzyMode fuzzy )
|
||||||
Preconditions.checkState(stack.getItem().isDamageable() , "Item#isDamageable() has to be true");
|
{
|
||||||
|
Preconditions.checkState( stack.getItem().isDamageable() || ( Platform.isGTDamageableItem( stack.getItem() ) ), "Item#isDamageable() has to be true" );
|
||||||
|
|
||||||
int damage;
|
int damage;
|
||||||
if (fuzzy == FuzzyMode.IGNORE_ALL) {
|
if( fuzzy == FuzzyMode.IGNORE_ALL )
|
||||||
|
{
|
||||||
damage = MIN_DAMAGE_VALUE;
|
damage = MIN_DAMAGE_VALUE;
|
||||||
} else {
|
}
|
||||||
final int breakpoint = fuzzy.calculateBreakPoint(stack.getMaxDamage());
|
else
|
||||||
damage = stack.getItemDamage() <= breakpoint ? MIN_DAMAGE_VALUE : breakpoint;
|
{
|
||||||
|
int maxDamage;
|
||||||
|
if( Platform.isIC2DamageableItem( stack.getItem() ) )
|
||||||
|
{
|
||||||
|
maxDamage = ( (ICustomDamageItem) stack.getItem() ).getMaxCustomDamage( stack );
|
||||||
|
damage = ( (ICustomDamageItem) stack.getItem() ).getCustomDamage( stack );
|
||||||
|
}
|
||||||
|
else if( Platform.isGTDamageableItem( stack.getItem() ) )
|
||||||
|
{
|
||||||
|
maxDamage = ( (IToolItem) stack.getItem() ).getMaxItemDamage( stack );
|
||||||
|
damage = ( (IToolItem) stack.getItem() ).getItemDamage( stack );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
maxDamage = stack.getMaxDamage();
|
||||||
|
damage = stack.getItemDamage();
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ItemDamageBound(damage);
|
final int breakpoint = fuzzy.calculateBreakPoint( maxDamage );
|
||||||
|
damage = damage <= breakpoint ? MIN_DAMAGE_VALUE : breakpoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ItemDamageBound( damage );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import java.util.NoSuchElementException;
|
|||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
import gregtech.common.items.MetaTool;
|
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.objects.Reference2ObjectMap;
|
import it.unimi.dsi.fastutil.objects.Reference2ObjectMap;
|
||||||
@@ -36,7 +35,9 @@ import appeng.api.config.FuzzyMode;
|
|||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
|
|
||||||
public final class ItemList implements IItemList<IAEItemStack> {
|
|
||||||
|
public final class ItemList implements IItemList<IAEItemStack>
|
||||||
|
{
|
||||||
|
|
||||||
private final Reference2ObjectMap<Item, ItemVariantList> records = new Reference2ObjectOpenHashMap<>();
|
private final Reference2ObjectMap<Item, ItemVariantList> records = new Reference2ObjectOpenHashMap<>();
|
||||||
/**
|
/**
|
||||||
@@ -44,80 +45,95 @@ public final class ItemList implements IItemList<IAEItemStack> {
|
|||||||
* sub-lists) is made. Iterators will copy the version when they are created and compare it against the current
|
* sub-lists) is made. Iterators will copy the version when they are created and compare it against the current
|
||||||
* version whenever they advance to trigger a {@link ConcurrentModificationException}.
|
* version whenever they advance to trigger a {@link ConcurrentModificationException}.
|
||||||
*/
|
*/
|
||||||
private final AtomicInteger version = new AtomicInteger(0);
|
private final AtomicInteger version = new AtomicInteger( 0 );
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IAEItemStack findPrecise(final IAEItemStack itemStack) {
|
public IAEItemStack findPrecise( final IAEItemStack itemStack )
|
||||||
if (itemStack == null) {
|
{
|
||||||
|
if( itemStack == null )
|
||||||
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemVariantList record = this.records.get(itemStack.getItem());
|
ItemVariantList record = this.records.get( itemStack.getItem() );
|
||||||
return record != null ? record.findPrecise(itemStack) : null;
|
return record != null ? record.findPrecise( itemStack ) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<IAEItemStack> findFuzzy(final IAEItemStack filter, final FuzzyMode fuzzy) {
|
public Collection<IAEItemStack> findFuzzy( final IAEItemStack filter, final FuzzyMode fuzzy )
|
||||||
if (filter == null) {
|
{
|
||||||
|
if( filter == null )
|
||||||
|
{
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemVariantList record = this.records.get(filter.getItem());
|
ItemVariantList record = this.records.get( filter.getItem() );
|
||||||
return record != null ? record.findFuzzy(filter, fuzzy) : Collections.emptyList();
|
return record != null ? record.findFuzzy( filter, fuzzy ) : Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty()
|
||||||
|
{
|
||||||
return !this.iterator().hasNext();
|
return !this.iterator().hasNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(final IAEItemStack itemStack) {
|
public void add( final IAEItemStack itemStack )
|
||||||
|
{
|
||||||
version.incrementAndGet();
|
version.incrementAndGet();
|
||||||
|
|
||||||
if (itemStack == null) {
|
if( itemStack == null )
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getOrCreateRecord(itemStack.getItem()).add(itemStack);
|
this.getOrCreateRecord( itemStack.getItem() ).add( itemStack );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addStorage(final IAEItemStack itemStack) {
|
public void addStorage( final IAEItemStack itemStack )
|
||||||
|
{
|
||||||
version.incrementAndGet();
|
version.incrementAndGet();
|
||||||
|
|
||||||
if (itemStack == null) {
|
if( itemStack == null )
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getOrCreateRecord(itemStack.getItem()).addStorage(itemStack);
|
this.getOrCreateRecord( itemStack.getItem() ).addStorage( itemStack );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addCrafting(final IAEItemStack itemStack) {
|
public void addCrafting( final IAEItemStack itemStack )
|
||||||
|
{
|
||||||
version.incrementAndGet();
|
version.incrementAndGet();
|
||||||
|
|
||||||
if (itemStack == null) {
|
if( itemStack == null )
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getOrCreateRecord(itemStack.getItem()).addCrafting(itemStack);
|
this.getOrCreateRecord( itemStack.getItem() ).addCrafting( itemStack );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addRequestable(final IAEItemStack itemStack) {
|
public void addRequestable( final IAEItemStack itemStack )
|
||||||
|
{
|
||||||
version.incrementAndGet();
|
version.incrementAndGet();
|
||||||
|
|
||||||
if (itemStack == null) {
|
if( itemStack == null )
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getOrCreateRecord(itemStack.getItem()).addRequestable(itemStack);
|
this.getOrCreateRecord( itemStack.getItem() ).addRequestable( itemStack );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IAEItemStack getFirstItem() {
|
public IAEItemStack getFirstItem()
|
||||||
for (final IAEItemStack stackType : this) {
|
{
|
||||||
|
for( final IAEItemStack stackType : this )
|
||||||
|
{
|
||||||
return stackType;
|
return stackType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,9 +141,11 @@ public final class ItemList implements IItemList<IAEItemStack> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int size() {
|
public int size()
|
||||||
|
{
|
||||||
int size = 0;
|
int size = 0;
|
||||||
for (ItemVariantList entry : records.values()) {
|
for( ItemVariantList entry : records.values() )
|
||||||
|
{
|
||||||
size += entry.size();
|
size += entry.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,25 +153,33 @@ public final class ItemList implements IItemList<IAEItemStack> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterator<IAEItemStack> iterator() {
|
public Iterator<IAEItemStack> iterator()
|
||||||
return new ChainedIterator(this.records.values().iterator(), version);
|
{
|
||||||
|
return new ChainedIterator( this.records.values().iterator(), version );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void resetStatus() {
|
public void resetStatus()
|
||||||
for (final IAEItemStack i : this) {
|
{
|
||||||
|
for( final IAEItemStack i : this )
|
||||||
|
{
|
||||||
i.reset();
|
i.reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemVariantList getOrCreateRecord(Item item) {
|
private ItemVariantList getOrCreateRecord( Item item )
|
||||||
return this.records.computeIfAbsent(item, this::makeRecordMap);
|
{
|
||||||
|
return this.records.computeIfAbsent( item, this::makeRecordMap );
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemVariantList makeRecordMap(Item item) {
|
private ItemVariantList makeRecordMap( Item item )
|
||||||
if (item.isDamageable() ) {
|
{
|
||||||
|
if( item.isDamageable() || Platform.isGTDamageableItem( item ) )
|
||||||
|
{
|
||||||
return new FuzzyItemVariantList();
|
return new FuzzyItemVariantList();
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
return new NormalItemVariantList();
|
return new NormalItemVariantList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -161,14 +187,16 @@ public final class ItemList implements IItemList<IAEItemStack> {
|
|||||||
/**
|
/**
|
||||||
* Iterates over multiple item lists as if they were one list.
|
* Iterates over multiple item lists as if they were one list.
|
||||||
*/
|
*/
|
||||||
private static class ChainedIterator implements Iterator<IAEItemStack> {
|
private static class ChainedIterator implements Iterator<IAEItemStack>
|
||||||
|
{
|
||||||
|
|
||||||
private final AtomicInteger parentVersion;
|
private final AtomicInteger parentVersion;
|
||||||
private final int version;
|
private final int version;
|
||||||
private final Iterator<ItemVariantList> parent;
|
private final Iterator<ItemVariantList> parent;
|
||||||
private Iterator<IAEItemStack> next;
|
private Iterator<IAEItemStack> next;
|
||||||
|
|
||||||
public ChainedIterator(Iterator<ItemVariantList> iterator, AtomicInteger parentVersion) {
|
public ChainedIterator( Iterator<ItemVariantList> iterator, AtomicInteger parentVersion )
|
||||||
|
{
|
||||||
this.parent = iterator;
|
this.parent = iterator;
|
||||||
this.parentVersion = parentVersion;
|
this.parentVersion = parentVersion;
|
||||||
this.version = parentVersion.get();
|
this.version = parentVersion.get();
|
||||||
@@ -176,16 +204,20 @@ public final class ItemList implements IItemList<IAEItemStack> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean hasNext()
|
||||||
|
{
|
||||||
return next != null && next.hasNext();
|
return next != null && next.hasNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IAEItemStack next() {
|
public IAEItemStack next()
|
||||||
if (this.next == null) {
|
{
|
||||||
|
if( this.next == null )
|
||||||
|
{
|
||||||
throw new NoSuchElementException();
|
throw new NoSuchElementException();
|
||||||
}
|
}
|
||||||
if (this.version != this.parentVersion.get()) {
|
if( this.version != this.parentVersion.get() )
|
||||||
|
{
|
||||||
throw new ConcurrentModificationException();
|
throw new ConcurrentModificationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,16 +226,20 @@ public final class ItemList implements IItemList<IAEItemStack> {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ensureItems() {
|
private void ensureItems()
|
||||||
if (hasNext()) {
|
{
|
||||||
|
if( hasNext() )
|
||||||
|
{
|
||||||
return; // Still items left in the current one
|
return; // Still items left in the current one
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the next iterator willing to return some items...
|
// Find the next iterator willing to return some items...
|
||||||
while (this.parent.hasNext()) {
|
while ( this.parent.hasNext() )
|
||||||
|
{
|
||||||
this.next = this.parent.next().iterator();
|
this.next = this.parent.next().iterator();
|
||||||
|
|
||||||
if (this.next.hasNext()) {
|
if( this.next.hasNext() )
|
||||||
|
{
|
||||||
return; // Found one!
|
return; // Found one!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,383 @@
|
|||||||
|
package appeng.util.item;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author brachy84
|
||||||
|
* @butcherer PrototypeTrousers
|
||||||
|
*/
|
||||||
|
public class OreDictFilterMatcher
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the given expression and creates a List.
|
||||||
|
*
|
||||||
|
* @param expression expr to parse
|
||||||
|
* @return match rule list
|
||||||
|
*/
|
||||||
|
public static List<MatchRule> parseExpression( String expression )
|
||||||
|
{
|
||||||
|
List<MatchRule> rules = new ArrayList<>();
|
||||||
|
parseExpression( rules, expression );
|
||||||
|
return rules;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the given expression and puts them into the given list.
|
||||||
|
*
|
||||||
|
* @param rules list to fill
|
||||||
|
* @param expression expr to parse
|
||||||
|
* @return the position of the expr. Is only relevant for sub rules
|
||||||
|
*/
|
||||||
|
public static int parseExpression( List<MatchRule> rules, String expression )
|
||||||
|
{
|
||||||
|
rules.clear();
|
||||||
|
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
for( int i = 0; i < expression.length(); i++ )
|
||||||
|
{
|
||||||
|
char c = expression.charAt( i );
|
||||||
|
if( c == ' ' )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if( c == '(' )
|
||||||
|
{
|
||||||
|
List<MatchRule> subRules = new ArrayList<>();
|
||||||
|
i = parseExpression( subRules, expression.substring( i + 1 ) ) + i + 1;
|
||||||
|
rules.add( MatchRule.group( subRules, builder.toString() ) );
|
||||||
|
builder = new StringBuilder();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch ( c )
|
||||||
|
{
|
||||||
|
case '&':
|
||||||
|
rules.add( new MatchRule( builder.toString() ) );
|
||||||
|
rules.add( new MatchRule( MatchLogic.AND ) );
|
||||||
|
builder = new StringBuilder();
|
||||||
|
break;
|
||||||
|
case '|':
|
||||||
|
rules.add( new MatchRule( builder.toString() ) );
|
||||||
|
rules.add( new MatchRule( MatchLogic.OR ) );
|
||||||
|
builder = new StringBuilder();
|
||||||
|
break;
|
||||||
|
case '^':
|
||||||
|
rules.add( new MatchRule( builder.toString() ) );
|
||||||
|
rules.add( new MatchRule( MatchLogic.XOR ) );
|
||||||
|
builder = new StringBuilder();
|
||||||
|
break;
|
||||||
|
case ')':
|
||||||
|
rules.add( new MatchRule( builder.toString() ) );
|
||||||
|
return i + 1;
|
||||||
|
default:
|
||||||
|
builder.append( c );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( builder.length() > 0 )
|
||||||
|
{
|
||||||
|
rules.add( new MatchRule( builder.toString() ) );
|
||||||
|
}
|
||||||
|
return expression.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matches the given string against a list of rules.
|
||||||
|
* The string does not have to be an oreDict.
|
||||||
|
*
|
||||||
|
* @param rules to check against
|
||||||
|
* @param oreDict string to check
|
||||||
|
* @return if the string matches the rules
|
||||||
|
*/
|
||||||
|
public static boolean matches( List<MatchRule> rules, String oreDict )
|
||||||
|
{
|
||||||
|
boolean first = true;
|
||||||
|
boolean lastResult = false;
|
||||||
|
MatchLogic lastLogic = null;
|
||||||
|
for( MatchRule rule : rules )
|
||||||
|
{
|
||||||
|
if( lastLogic == null )
|
||||||
|
{
|
||||||
|
if( rule.logic == MatchLogic.AND || rule.logic == MatchLogic.OR || rule.logic == MatchLogic.XOR )
|
||||||
|
{
|
||||||
|
lastLogic = rule.logic;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( lastLogic != null || first )
|
||||||
|
{
|
||||||
|
if( lastLogic != null )
|
||||||
|
{
|
||||||
|
switch ( lastLogic )
|
||||||
|
{
|
||||||
|
case AND:
|
||||||
|
{
|
||||||
|
if( !lastResult )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OR:
|
||||||
|
{
|
||||||
|
if( lastResult )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean newResult;
|
||||||
|
if( rule.isGroup() )
|
||||||
|
{
|
||||||
|
newResult = rule.logic == MatchLogic.NOT ^ matches( rule.subRules, oreDict );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newResult = matches( rule, oreDict );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( lastLogic == MatchLogic.XOR )
|
||||||
|
{
|
||||||
|
if( lastResult == newResult )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lastLogic = null;
|
||||||
|
lastResult = newResult;
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return lastResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean matches( MatchRule rule, String oreDict )
|
||||||
|
{
|
||||||
|
String filter = rule.expression;
|
||||||
|
|
||||||
|
if( filter.equals( "*" ) )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean startWild = filter.startsWith( "*" ), endWild = filter.endsWith( "*" );
|
||||||
|
if( startWild )
|
||||||
|
{
|
||||||
|
filter = filter.substring( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] parts = filter.split( "\\*+" );
|
||||||
|
|
||||||
|
return ( rule.logic == MatchLogic.NOT ) ^ matches( parts, oreDict, startWild, endWild );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean matches( String[] filter, String oreDict, boolean startWild, boolean endWild )
|
||||||
|
{
|
||||||
|
String lastlastPart = filter[0];
|
||||||
|
String lastPart = filter[0];
|
||||||
|
int index = oreDict.indexOf( lastPart );
|
||||||
|
if( ( !startWild && index != 0 ) || index < 0 )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean didGoBack = false;
|
||||||
|
|
||||||
|
for( int i = 1; i < filter.length; i++ )
|
||||||
|
{
|
||||||
|
String part = filter[i];
|
||||||
|
int newIndex = oreDict.indexOf( part, index + lastPart.length() );
|
||||||
|
if( newIndex < 0 )
|
||||||
|
{
|
||||||
|
if( i > 1 && !didGoBack )
|
||||||
|
{
|
||||||
|
i -= 2;
|
||||||
|
lastPart = lastlastPart;
|
||||||
|
didGoBack = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
lastlastPart = lastPart;
|
||||||
|
lastPart = part;
|
||||||
|
index = newIndex;
|
||||||
|
if( didGoBack )
|
||||||
|
{
|
||||||
|
didGoBack = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( endWild || lastPart.length() + index == oreDict.length() )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for( int i = filter.length - 1; i < filter.length; i++ )
|
||||||
|
{
|
||||||
|
String part = filter[i];
|
||||||
|
int newIndex = oreDict.indexOf( part, index + lastPart.length() );
|
||||||
|
if( newIndex < 0 )
|
||||||
|
{
|
||||||
|
if( i > 1 && !didGoBack )
|
||||||
|
{
|
||||||
|
i -= 2;
|
||||||
|
lastPart = lastlastPart;
|
||||||
|
didGoBack = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
lastlastPart = lastPart;
|
||||||
|
lastPart = part;
|
||||||
|
index = newIndex;
|
||||||
|
if( didGoBack )
|
||||||
|
{
|
||||||
|
didGoBack = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lastPart.length() + index == oreDict.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String validateExp( String input )
|
||||||
|
{
|
||||||
|
// remove all operators that are double
|
||||||
|
input = input.replaceAll( "\\*{2,}", "*" );
|
||||||
|
input = input.replaceAll( "&{2,}", "&" );
|
||||||
|
input = input.replaceAll( "\\|{2,}", "|" );
|
||||||
|
input = input.replaceAll( "!{2,}", "!" );
|
||||||
|
input = input.replaceAll( "\\^{2,}", "^" );
|
||||||
|
input = input.replaceAll( " {2,}", " " );
|
||||||
|
// move ( and ) so it doesn't create invalid expressions f.e. xxx (& yyy) => xxx & (yyy)
|
||||||
|
// append or prepend ( and ) if the amount is not equal
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
int unclosed = 0;
|
||||||
|
char last = ' ';
|
||||||
|
for( int i = 0; i < input.length(); i++ )
|
||||||
|
{
|
||||||
|
char c = input.charAt( i );
|
||||||
|
if( c == ' ' )
|
||||||
|
{
|
||||||
|
if( last != '(' )
|
||||||
|
{
|
||||||
|
builder.append( " " );
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if( c == '(' )
|
||||||
|
{
|
||||||
|
unclosed++;
|
||||||
|
}
|
||||||
|
else if( c == ')' )
|
||||||
|
{
|
||||||
|
unclosed--;
|
||||||
|
if( last == '&' || last == '|' || last == '^' )
|
||||||
|
{
|
||||||
|
int l = builder.lastIndexOf( " " + last );
|
||||||
|
int l2 = builder.lastIndexOf( "" + last );
|
||||||
|
builder.insert( l == l2 - 1 ? l : l2, ")" );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if( i > 0 && builder.charAt( builder.length() - 1 ) == ' ' )
|
||||||
|
{
|
||||||
|
builder.deleteCharAt( builder.length() - 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( ( c == '&' || c == '|' || c == '^' ) && last == '(' )
|
||||||
|
{
|
||||||
|
builder.deleteCharAt( builder.lastIndexOf( "(" ) );
|
||||||
|
builder.append( c ).append( " (" );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.append( c );
|
||||||
|
last = c;
|
||||||
|
}
|
||||||
|
if( unclosed > 0 )
|
||||||
|
{
|
||||||
|
for( int i = 0; i < unclosed; i++ )
|
||||||
|
{
|
||||||
|
builder.append( ")" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( unclosed < 0 )
|
||||||
|
{
|
||||||
|
unclosed = -unclosed;
|
||||||
|
for( int i = 0; i < unclosed; i++ )
|
||||||
|
{
|
||||||
|
builder.insert( 0, "(" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
input = builder.toString();
|
||||||
|
input = input.replaceAll( " {2,}", " " );
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static class MatchRule
|
||||||
|
{
|
||||||
|
public final MatchLogic logic;
|
||||||
|
public final String expression;
|
||||||
|
private final List<MatchRule> subRules;
|
||||||
|
|
||||||
|
private MatchRule( MatchLogic logic, String expression, List<MatchRule> subRules )
|
||||||
|
{
|
||||||
|
if( expression.startsWith( "!" ) )
|
||||||
|
{
|
||||||
|
logic = MatchLogic.NOT;
|
||||||
|
expression = expression.substring( 1 );
|
||||||
|
}
|
||||||
|
this.logic = logic;
|
||||||
|
this.expression = expression;
|
||||||
|
this.subRules = subRules;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MatchRule( MatchLogic logic, String expression )
|
||||||
|
{
|
||||||
|
this( logic, expression, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
public MatchRule( MatchLogic logic )
|
||||||
|
{
|
||||||
|
this( logic, "" );
|
||||||
|
}
|
||||||
|
|
||||||
|
public MatchRule( String expression )
|
||||||
|
{
|
||||||
|
this( MatchLogic.ANY, expression );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MatchRule not( String expression, boolean not )
|
||||||
|
{
|
||||||
|
return new MatchRule( not ? MatchLogic.NOT : MatchLogic.ANY, expression );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MatchRule group( List<MatchRule> subRules, String expression )
|
||||||
|
{
|
||||||
|
MatchLogic logic = expression.startsWith( "!" ) ? MatchLogic.NOT : MatchLogic.ANY;
|
||||||
|
return new MatchRule( logic, "", subRules );
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isGroup()
|
||||||
|
{
|
||||||
|
return subRules != null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public enum MatchLogic
|
||||||
|
{
|
||||||
|
OR,
|
||||||
|
AND,
|
||||||
|
XOR,
|
||||||
|
NOT,
|
||||||
|
ANY
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,23 +19,15 @@
|
|||||||
package appeng.util.item;
|
package appeng.util.item;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collection;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.CacheBuilder;
|
||||||
import com.google.common.cache.CacheLoader;
|
import com.google.common.cache.CacheLoader;
|
||||||
import com.google.common.cache.LoadingCache;
|
import com.google.common.cache.LoadingCache;
|
||||||
|
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.oredict.OreDictionary;
|
import net.minecraftforge.oredict.OreDictionary;
|
||||||
|
|
||||||
import appeng.api.storage.data.IAEItemStack;
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
public class OreHelper
|
public class OreHelper
|
||||||
@@ -61,7 +53,6 @@ public class OreHelper
|
|||||||
* Test if the passed {@link ItemStack} is an ore.
|
* Test if the passed {@link ItemStack} is an ore.
|
||||||
*
|
*
|
||||||
* @param itemStack the itemstack to test
|
* @param itemStack the itemstack to test
|
||||||
*
|
|
||||||
* @return true if an ore entry exists, false otherwise
|
* @return true if an ore entry exists, false otherwise
|
||||||
*/
|
*/
|
||||||
public Optional<OreReference> getOre( final ItemStack itemStack )
|
public Optional<OreReference> getOre( final ItemStack itemStack )
|
||||||
@@ -116,7 +107,7 @@ public class OreHelper
|
|||||||
boolean sameOre( final AEItemStack aeItemStack, final IAEItemStack is )
|
boolean sameOre( final AEItemStack aeItemStack, final IAEItemStack is )
|
||||||
{
|
{
|
||||||
final OreReference a = aeItemStack.getOre().orElse( null );
|
final OreReference a = aeItemStack.getOre().orElse( null );
|
||||||
final OreReference b = aeItemStack.getOre().orElse( null );
|
final OreReference b = ( (AEItemStack) is ).getOre().orElse( null );
|
||||||
|
|
||||||
return this.sameOre( a, b );
|
return this.sameOre( a, b );
|
||||||
}
|
}
|
||||||
@@ -147,8 +138,7 @@ public class OreHelper
|
|||||||
|
|
||||||
boolean sameOre( final AEItemStack aeItemStack, final ItemStack o )
|
boolean sameOre( final AEItemStack aeItemStack, final ItemStack o )
|
||||||
{
|
{
|
||||||
return aeItemStack.getOre().map( a ->
|
return aeItemStack.getOre().map( a -> {
|
||||||
{
|
|
||||||
for( final String oreName : a.getEquivalents() )
|
for( final String oreName : a.getEquivalents() )
|
||||||
{
|
{
|
||||||
for( final ItemStack oreItem : this.oreDictCache.getUnchecked( oreName ) )
|
for( final ItemStack oreItem : this.oreDictCache.getUnchecked( oreName ) )
|
||||||
@@ -160,11 +150,25 @@ public class OreHelper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} )
|
} ).orElse( false );
|
||||||
.orElse( false );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ItemStack> getCachedOres( final String oreName )
|
public Set<Integer> getMatchingOre( String oreExp )
|
||||||
|
{
|
||||||
|
Set<Integer> matchingIds = new HashSet<>();
|
||||||
|
|
||||||
|
List<OreDictFilterMatcher.MatchRule> rulesList = OreDictFilterMatcher.parseExpression( oreExp );
|
||||||
|
for( String ore : OreDictionary.getOreNames() )
|
||||||
|
{
|
||||||
|
if( OreDictFilterMatcher.matches( rulesList, ore ) )
|
||||||
|
{
|
||||||
|
matchingIds.add( OreDictionary.getOreID( ore ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return matchingIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ItemStack> getCachedOres( final String oreName )
|
||||||
{
|
{
|
||||||
return this.oreDictCache.getUnchecked( oreName );
|
return this.oreDictCache.getUnchecked( oreName );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class OreReference
|
|||||||
return this.aeOtherOptions;
|
return this.aeOtherOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
Collection<Integer> getOres()
|
public Collection<Integer> getOres()
|
||||||
{
|
{
|
||||||
return this.ores;
|
return this.ores;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package appeng.util.prioritylist;
|
||||||
|
|
||||||
|
import appeng.api.storage.data.IAEStack;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
import appeng.util.item.OreReference;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
|
public class OreDictPriorityList<T extends IAEStack<T>> implements IPartitionList<T>
|
||||||
|
{
|
||||||
|
private final Set<Integer> oreIDs;
|
||||||
|
private final String oreMatch;
|
||||||
|
|
||||||
|
public OreDictPriorityList( Set<Integer> oreIDs, String oreMatch )
|
||||||
|
{
|
||||||
|
this.oreIDs = oreIDs;
|
||||||
|
this.oreMatch = oreMatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isListed( final T input )
|
||||||
|
{
|
||||||
|
OreReference or = ( (AEItemStack) input ).getOre().orElse( null );
|
||||||
|
if( or != null )
|
||||||
|
{
|
||||||
|
for( Integer oreID : or.getOres() )
|
||||||
|
{
|
||||||
|
if( this.oreIDs.contains( oreID ) )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty()
|
||||||
|
{
|
||||||
|
return oreMatch.equals( "" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<T> getItems()
|
||||||
|
{
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -102,6 +102,7 @@ gui.appliedenergistics2.FluidTunnel=Fluid
|
|||||||
gui.appliedenergistics2.RedstoneTunnel=Redstone
|
gui.appliedenergistics2.RedstoneTunnel=Redstone
|
||||||
gui.appliedenergistics2.EUTunnel=EU
|
gui.appliedenergistics2.EUTunnel=EU
|
||||||
gui.appliedenergistics2.FETunnel=FE
|
gui.appliedenergistics2.FETunnel=FE
|
||||||
|
gui.appliedenergistics2.GTEUTunnel=GTEU
|
||||||
gui.appliedenergistics2.LightTunnel=Light
|
gui.appliedenergistics2.LightTunnel=Light
|
||||||
gui.appliedenergistics2.OCTunnel=OpenComputers
|
gui.appliedenergistics2.OCTunnel=OpenComputers
|
||||||
gui.appliedenergistics2.PressureTunnel=Pressure
|
gui.appliedenergistics2.PressureTunnel=Pressure
|
||||||
@@ -133,6 +134,7 @@ gui.appliedenergistics2.SecurityCardEditor=Biometric Card Editor
|
|||||||
gui.appliedenergistics2.Encoded=Encoded
|
gui.appliedenergistics2.Encoded=Encoded
|
||||||
gui.appliedenergistics2.Priority=Priority
|
gui.appliedenergistics2.Priority=Priority
|
||||||
gui.appliedenergistics2.StorageBus=Storage Bus
|
gui.appliedenergistics2.StorageBus=Storage Bus
|
||||||
|
gui.appliedenergistics2.OreDictStorageBus=Ore Dictionary Storage Bus
|
||||||
gui.appliedenergistics2.StorageBusFluids=Fluid Storage Bus
|
gui.appliedenergistics2.StorageBusFluids=Fluid Storage Bus
|
||||||
gui.appliedenergistics2.EnergyDrain=Passive Drain
|
gui.appliedenergistics2.EnergyDrain=Passive Drain
|
||||||
gui.appliedenergistics2.Installed=Installed
|
gui.appliedenergistics2.Installed=Installed
|
||||||
@@ -374,6 +376,7 @@ gui.tooltips.appliedenergistics2.HighlightInterface=Highlight interface
|
|||||||
gui.appliedenergistics2.units.appliedenergstics=AE
|
gui.appliedenergistics2.units.appliedenergstics=AE
|
||||||
gui.appliedenergistics2.units.ic2=Energy Units
|
gui.appliedenergistics2.units.ic2=Energy Units
|
||||||
gui.appliedenergistics2.units.rf=Redstone Flux
|
gui.appliedenergistics2.units.rf=Redstone Flux
|
||||||
|
gui.appliedenergistics2.units.gteu=GTEU
|
||||||
|
|
||||||
// Colors
|
// Colors
|
||||||
gui.appliedenergistics2.White=White
|
gui.appliedenergistics2.White=White
|
||||||
@@ -535,8 +538,10 @@ item.appliedenergistics2.multi_part.level_emitter.name=ME Level Emitter
|
|||||||
item.appliedenergistics2.multi_part.fluid_level_emitter.name=ME Fluid Level Emitter
|
item.appliedenergistics2.multi_part.fluid_level_emitter.name=ME Fluid Level Emitter
|
||||||
item.appliedenergistics2.multi_part.p2p_tunnel.name=P2P Tunnel
|
item.appliedenergistics2.multi_part.p2p_tunnel.name=P2P Tunnel
|
||||||
item.appliedenergistics2.multi_part.pattern_terminal.name=ME Pattern Terminal
|
item.appliedenergistics2.multi_part.pattern_terminal.name=ME Pattern Terminal
|
||||||
|
item.appliedenergistics2.multi_part.expanded_processing_pattern_terminal.name=ME Extended Processing Pattern Terminal
|
||||||
item.appliedenergistics2.multi_part.quartz_fiber.name=Quartz Fiber
|
item.appliedenergistics2.multi_part.quartz_fiber.name=Quartz Fiber
|
||||||
item.appliedenergistics2.multi_part.storage_bus.name=ME Storage Bus
|
item.appliedenergistics2.multi_part.storage_bus.name=ME Storage Bus
|
||||||
|
item.appliedenergistics2.multi_part.oredict_storage_bus.name=ME OreDict Storage Bus
|
||||||
item.appliedenergistics2.multi_part.fluid_storage_bus.name=ME Fluid Storage Bus
|
item.appliedenergistics2.multi_part.fluid_storage_bus.name=ME Fluid Storage Bus
|
||||||
item.appliedenergistics2.multi_part.terminal.name=ME Terminal
|
item.appliedenergistics2.multi_part.terminal.name=ME Terminal
|
||||||
item.appliedenergistics2.multi_part.inverted_toggle_bus.name=ME Inverted Toggle Bus
|
item.appliedenergistics2.multi_part.inverted_toggle_bus.name=ME Inverted Toggle Bus
|
||||||
|
|||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"parent": "appliedenergistics2:item/part/display",
|
||||||
|
"textures": {
|
||||||
|
"front": "appliedenergistics2:items/part/expanded_processing_pattern_terminal",
|
||||||
|
"front_bright": "appliedenergistics2:parts/expanded_processing_pattern_terminal_bright",
|
||||||
|
"front_medium": "appliedenergistics2:parts/expanded_processing_pattern_terminal_medium",
|
||||||
|
"front_dark": "appliedenergistics2:parts/pattern_terminal_dark"
|
||||||
|
}
|
||||||
|
}
|
||||||
+106
@@ -0,0 +1,106 @@
|
|||||||
|
{
|
||||||
|
"parent": "appliedenergistics2:item/part/part",
|
||||||
|
"textures": {
|
||||||
|
"sides": "appliedenergistics2:parts/storage_bus_sides",
|
||||||
|
"back": "appliedenergistics2:parts/storage_bus_back",
|
||||||
|
"front": "appliedenergistics2:items/part/oredict_storage_bus"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
6
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
13,
|
||||||
|
13,
|
||||||
|
7
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#front"
|
||||||
|
},
|
||||||
|
"south": {
|
||||||
|
"texture": "#back"
|
||||||
|
},
|
||||||
|
"east": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"west": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"up": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"down": {
|
||||||
|
"texture": "#sides"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
7
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
14,
|
||||||
|
14,
|
||||||
|
8
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#front"
|
||||||
|
},
|
||||||
|
"south": {
|
||||||
|
"texture": "#back"
|
||||||
|
},
|
||||||
|
"east": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"west": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"up": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"down": {
|
||||||
|
"texture": "#sides"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
5,
|
||||||
|
5,
|
||||||
|
8
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
11,
|
||||||
|
11,
|
||||||
|
10
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#front"
|
||||||
|
},
|
||||||
|
"south": {
|
||||||
|
"texture": "#back"
|
||||||
|
},
|
||||||
|
"east": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"west": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"up": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"down": {
|
||||||
|
"texture": "#sides"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"parent": "appliedenergistics2:item/part/p2p_tunnel",
|
||||||
|
"textures": {
|
||||||
|
"type": "appliedenergistics2:parts/p2p/power_gteu"
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "appliedenergistics2:part/display_off",
|
||||||
|
"textures": {
|
||||||
|
"lightsBright": "appliedenergistics2:parts/expanded_processing_pattern_terminal_bright",
|
||||||
|
"lightsMedium": "appliedenergistics2:parts/expanded_processing_pattern_terminal_medium",
|
||||||
|
"lightsDark": "appliedenergistics2:parts/pattern_terminal_dark"
|
||||||
|
}
|
||||||
|
}
|
||||||
+76
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"ae2_uvl_marker": true,
|
||||||
|
"textures": {
|
||||||
|
"lightsBright": "appliedenergistics2:parts/expanded_processing_pattern_terminal_bright",
|
||||||
|
"lightsMedium": "appliedenergistics2:parts/expanded_processing_pattern_terminal_medium",
|
||||||
|
"lightsDark": "appliedenergistics2:parts/pattern_terminal_dark"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
14,
|
||||||
|
14,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#lightsBright",
|
||||||
|
"tintindex": 3,
|
||||||
|
"uvlightmap": {
|
||||||
|
"sky": 0.007,
|
||||||
|
"block": 0.007
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
14,
|
||||||
|
14,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#lightsMedium",
|
||||||
|
"tintindex": 2,
|
||||||
|
"uvlightmap": {
|
||||||
|
"sky": 0.007,
|
||||||
|
"block": 0.007
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
14,
|
||||||
|
14,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#lightsDark",
|
||||||
|
"tintindex": 1,
|
||||||
|
"uvlightmap": {
|
||||||
|
"sky": 0.007,
|
||||||
|
"block": 0.007
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user