diff --git a/build.gradle b/build.gradle index 28fd5ac..f0f3383 100644 --- a/build.gradle +++ b/build.gradle @@ -373,7 +373,7 @@ catch (Exception ignored) { // Pulls version first from the VERSION env and then git tag String identifiedVersion = null -String versionOverride = '0.0.18p8' +String versionOverride = '0.0.18p9' try { // Produce a version based on the tag, or for branches something like 0.2.2-configurable-maven-and-extras.38+43090270b6-dirty if (versionOverride == null) { diff --git a/src/main/java/reobf/proghatches/eucrafting/IEUManager.java b/src/main/java/reobf/proghatches/eucrafting/IEUManager.java index 4efa8fd..7fe4069 100644 --- a/src/main/java/reobf/proghatches/eucrafting/IEUManager.java +++ b/src/main/java/reobf/proghatches/eucrafting/IEUManager.java @@ -35,7 +35,7 @@ public interface IDrain { public default boolean isP2POut() { return false; } - + public boolean allowOvercommit(); public long getVoltage(); public default long inject(long a, long v) { diff --git a/src/main/java/reobf/proghatches/eucrafting/PartEUP2PInterface.java b/src/main/java/reobf/proghatches/eucrafting/PartEUP2PInterface.java index f454aa6..3598ab9 100644 --- a/src/main/java/reobf/proghatches/eucrafting/PartEUP2PInterface.java +++ b/src/main/java/reobf/proghatches/eucrafting/PartEUP2PInterface.java @@ -39,6 +39,8 @@ import reobf.proghatches.eucrafting.IEUManager.IDrain; import reobf.proghatches.eucrafting.TileFluidInterface_EU.SISOPatternDetail; import reobf.proghatches.eucrafting.TileFluidInterface_EU.WrappedPatternDetail; +import reobf.proghatches.gt.metatileentity.util.IInputStateProvider; +import reobf.proghatches.gt.metatileentity.util.IRecipeProcessingAwareDualHatch; import reobf.proghatches.lang.LangManager; import reobf.proghatches.main.MyMod; import reobf.proghatches.util.ProghatchesUtil; @@ -132,6 +134,7 @@ import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_Utility; import gregtech.common.gui.modularui.widget.CoverCycleButtonWidget; +import gregtech.common.tileentities.machines.IDualInputHatch; import ic2.api.energy.tile.IEnergySink; import ic2.api.item.IC2Items; import ic2.core.Ic2Items; @@ -559,6 +562,31 @@ public TileEntity getTargetInv(){ return te; } + public IMetaTileEntity getTargetTile0(){ + if((duty&0b100)>0){return null;} + TileEntity te; + if(data!=null){ + DimensionalCoord pos = data.getPos(); + te= data.getTile().getWorldObj().getTileEntity(pos.x,pos.y,pos.z); + }else{ + int x=this.host.getTile().xCoord; + int y=this.host.getTile().yCoord; + int z=this.host.getTile().zCoord; + ForgeDirection fd = this.getSide(); + te=this.host.getTile().getWorldObj().getTileEntity( + x+fd.offsetX,y+fd.offsetY,z+fd.offsetZ); + } + if(te==null) + return null; + + if(te instanceof IGregTechTileEntity){ + IMetaTileEntity mte = ((IGregTechTileEntity) te).getMetaTileEntity(); + return mte; + } + return null; + + } + @Deprecated public IMetaTileEntity getTargetTile(){ if((duty&0b100)>0){return null;} TileEntity te; @@ -621,64 +649,58 @@ public TickRateModulation tickingRequest(IGridNode node, int ticksSinceLastCall) try { this.getOutputs().forEach(all::add); } catch (GridAccessException e) {} - //phase0 - for(PartEUP2PInterface part:all){ - boolean order=part.pushtick==getTick(); - if(part.pass==-1&&!order){ - part.pass=0; - } - - if(part.pass==0){ - IMetaTileEntity t = part.getTargetTile(); - if(t!=null&&t instanceof IIdleStateProvider){ - if(((IIdleStateProvider) t).failThisTick()){ - if(part.fails++==0){part.pass=1;if(part.passReason==0)part.passReason=2;};//fail 1 time, assume no valid inputs, just pass it + + /*if(pass<=0){ + ok=true; + for(PartEUP2PInterface t:all){ + IMetaTileEntity te = t.getTargetTile0(); + if(te instanceof IDualInputHatch){ + if(((IDualInputHatch) te).getFirstNonEmptyInventory().isPresent()){ + ok=false; } - }else{ - dummy.add(part); + if(te instanceof IInputStateProvider){ + if(false==((IInputStateProvider) te).isInputEmpty()) + ok=false; + } + } } - } - //phase1 - boolean allok=all.stream().filter(s->!dummy.contains(s)).map(s->s.pass==1).reduce(Boolean::logicalAnd).orElse(false); - if(allok){ - ok=true; - all.forEach(s->s.pass=2); + if(ok)pass=2; } + */ - - } - - - /*if (!this.isOutput()) { - boolean[] hasFail=new boolean[1]; - - - all.add(this); - try { - this.getOutputs().forEach(all::add); - } catch (GridAccessException e) {} - all.forEach(s->{ - IMetaTileEntity t = s.getTargetTile(); - if(t!=null&&t instanceof IIdleStateProvider){ - - - if(((IIdleStateProvider) t).failThisTick()){ - if(s.fails++==0){s.pass=true;};//fail 2 times, so assume no valid inputs, just pass it + if(2>1){ + //phase0 + for(PartEUP2PInterface part:all){ + boolean order=part.pushtick==getTick(); + if(part.pass==-1&&!order){ + part.pass=0; + } + + if(part.pass==0){ + IMetaTileEntity t = part.getTargetTile(); + if(t!=null&&t instanceof IIdleStateProvider){ + if(((IIdleStateProvider) t).failThisTick()){ + if(part.fails++==0){part.pass=1;if(part.passReason==0)part.passReason=2;};//fail 1 time, assume no valid inputs, just pass it + } + }else{ + dummy.add(part); + } + } + } + //phase1 + boolean allok=all.stream().filter(s->!dummy.contains(s)).map(s->s.pass==1).reduce(Boolean::logicalAnd).orElse(false); + if(allok){ + ok=true; + all.forEach(s->s.pass=2); } - //if(!(!prev_pass&&pass)) - if(!pass) - {hasFail[0]=true;} - } - - }); + } + - if(!hasFail[0]&&>0){ok=true;} - } - */ + } @@ -1011,7 +1033,7 @@ public void addCraftingOption(ICraftingMedium medium, ICraftingPatternDetails ap TileFluidInterface_EU.wrap(api, a, b, Integer.MAX_VALUE - 1)); } else { - craftingTracker.addCraftingOption(medium, api); + craftingTracker.addCraftingOption(PartEUP2PInterface.this/*medium*/, api); } } @@ -1898,4 +1920,7 @@ public void complete() { } public long getAmp(){return this.amp;}; + public boolean allowOvercommit() { + return true; + } } diff --git a/src/main/java/reobf/proghatches/eucrafting/PartEUSource.java b/src/main/java/reobf/proghatches/eucrafting/PartEUSource.java index ec20f93..ecc4a23 100644 --- a/src/main/java/reobf/proghatches/eucrafting/PartEUSource.java +++ b/src/main/java/reobf/proghatches/eucrafting/PartEUSource.java @@ -39,6 +39,7 @@ import appeng.api.parts.IPartRenderHelper; import appeng.api.storage.IMEMonitor; import appeng.api.storage.data.IAEItemStack; +import appeng.api.util.IInterfaceViewable; import appeng.block.AEBaseBlock; import appeng.client.render.BaseBlockRender; import appeng.client.render.BusRenderHelper; @@ -66,6 +67,7 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -76,13 +78,16 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import reobf.proghatches.eucrafting.IEUManager.ISource; +import reobf.proghatches.gt.metatileentity.ProgrammingCircuitProvider; import reobf.proghatches.gt.metatileentity.ProgrammingCircuitProvider.CircuitProviderPatternDetial; +import reobf.proghatches.gt.metatileentity.util.ArrayListInv; +import reobf.proghatches.gt.metatileentity.util.FakePatternInv; import reobf.proghatches.lang.LangManager; import reobf.proghatches.main.MyMod; import reobf.proghatches.util.ProghatchesUtil; public class PartEUSource extends AEBasePart - implements IGuiProvidingPart, ICraftingProvider, IGridTickable, IInstantCompletable, IPartGT5Power, ISource,ILazer { + implements IGuiProvidingPart, ICraftingProvider, IGridTickable, IInstantCompletable, IPartGT5Power, ISource,ILazer,IInterfaceViewable { public static class WailaDataProvider extends BasePartWailaDataProvider { @@ -984,5 +989,44 @@ public ForgeDirection getLazerDir() { public List getLazerP2POuts() { return null; } + + @Override + public int rows() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int rowSize() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public IInventory getPatterns() { + + return ProgrammingCircuitProvider.EMPTY;//new ArrayListInv(ImmutableList.of(buildToken(1))); + } + + + + @Override + public boolean shouldDisplay() { + + return false; + } + + + @Override + public TileEntity getTileEntity() { + + return getTile(); + } + + @Override + public String getName() { + + return ""; + } } diff --git a/src/main/java/reobf/proghatches/eucrafting/TileFluidInterface_EU.java b/src/main/java/reobf/proghatches/eucrafting/TileFluidInterface_EU.java index 4088541..a39c5a3 100644 --- a/src/main/java/reobf/proghatches/eucrafting/TileFluidInterface_EU.java +++ b/src/main/java/reobf/proghatches/eucrafting/TileFluidInterface_EU.java @@ -73,6 +73,7 @@ import reobf.proghatches.eucrafting.IEUManager.IDrain; import reobf.proghatches.eucrafting.TileFluidInterface_EU.SISOPatternDetail; import reobf.proghatches.eucrafting.TileFluidInterface_EU.WrappedPatternDetail; +import reobf.proghatches.gt.metatileentity.util.IDisallowOptimize; import reobf.proghatches.lang.LangManager; import reobf.proghatches.main.MyMod; import reobf.proghatches.util.ProghatchesUtil; @@ -558,7 +559,7 @@ public static ICraftingPatternDetails wrap(ICraftingPatternDetails d, ItemStack return new WrappedPatternDetail(d, extraIn, extraOut, priority); } - public static class WrappedPatternDetail implements ICraftingPatternDetails { + public static class WrappedPatternDetail implements ICraftingPatternDetails,IDisallowOptimize { @Override public boolean equals(Object obj) { if (obj == null) { @@ -694,7 +695,7 @@ public void setPriority(int priority) { } } - public static class SISOPatternDetail implements ICraftingPatternDetails { + public static class SISOPatternDetail implements ICraftingPatternDetails,IDisallowOptimize { public SISOPatternDetail(ItemStack in, ItemStack out) { Objects.requireNonNull(in); @@ -830,7 +831,7 @@ public void addCraftingOption(ICraftingMedium medium, ICraftingPatternDetails ap wrap(api, a, b, Integer.MAX_VALUE - 1)); } else { - craftingTracker.addCraftingOption(medium, api); + craftingTracker.addCraftingOption(TileFluidInterface_EU.this/*medium*/, api); } } @@ -1202,4 +1203,7 @@ protected ItemStack getItemFromTile(Object obj) { return getCrafterIcon(); } public long getAmp(){return this.amp;}; + public boolean allowOvercommit() { + return false; + } } diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/BufferedDualInputHatch.java b/src/main/java/reobf/proghatches/gt/metatileentity/BufferedDualInputHatch.java index 3cb47c7..6464d00 100644 --- a/src/main/java/reobf/proghatches/gt/metatileentity/BufferedDualInputHatch.java +++ b/src/main/java/reobf/proghatches/gt/metatileentity/BufferedDualInputHatch.java @@ -103,6 +103,7 @@ import mcp.mobius.waila.api.IWailaDataAccessor; import reobf.proghatches.gt.metatileentity.util.BaseSlotPatched; import reobf.proghatches.gt.metatileentity.util.FirstObjectHolder; +import reobf.proghatches.gt.metatileentity.util.IInputStateProvider; import reobf.proghatches.gt.metatileentity.util.IRecipeProcessingAwareDualHatch; import reobf.proghatches.gt.metatileentity.util.ListeningFluidTank; import reobf.proghatches.gt.metatileentity.util.MappingItemHandler; @@ -112,7 +113,7 @@ import reobf.proghatches.main.MyMod; import reobf.proghatches.util.ProghatchesUtil; -public class BufferedDualInputHatch extends DualInputHatch implements IRecipeProcessingAwareDualHatch { +public class BufferedDualInputHatch extends DualInputHatch implements IRecipeProcessingAwareDualHatch,IInputStateProvider { public Deque scheduled=new LinkedList<>();//no randomaccess, LinkedList will work fine diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/DataHatchME.java b/src/main/java/reobf/proghatches/gt/metatileentity/DataHatchME.java index b8c94a3..58cb279 100644 --- a/src/main/java/reobf/proghatches/gt/metatileentity/DataHatchME.java +++ b/src/main/java/reobf/proghatches/gt/metatileentity/DataHatchME.java @@ -4,6 +4,7 @@ import static net.minecraft.util.StatCollector.translateToLocal; import java.util.ArrayList; +import java.util.Arrays; import java.util.EnumSet; import java.util.List; @@ -41,7 +42,7 @@ import net.minecraftforge.fluids.FluidStack; import reobf.proghatches.gt.metatileentity.util.IMEStorageChangeAwareness; import reobf.proghatches.main.registration.Registration; -import scala.actors.threadpool.Arrays; + public class DataHatchME extends GT_MetaTileEntity_Hatch_DataAccess implements IPowerChannelState,IGridProxyable,IMEStorageChangeAwareness{ public DataHatchME(int aID, String aName, String aNameRegional) { diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/PatternDualInputHatch.java b/src/main/java/reobf/proghatches/gt/metatileentity/PatternDualInputHatch.java index a718512..254c775 100644 --- a/src/main/java/reobf/proghatches/gt/metatileentity/PatternDualInputHatch.java +++ b/src/main/java/reobf/proghatches/gt/metatileentity/PatternDualInputHatch.java @@ -863,4 +863,9 @@ public IGridNode getActionableNode() { return this.getGridNode(ForgeDirection.UP); } public Object getTile(){return this.getBaseMetaTileEntity();} + @Override + public boolean allowsPatternOptimization() { + // TODO Auto-generated method stub + return IInterfaceViewable.super.allowsPatternOptimization(); + } } diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/ProgrammingCircuitProvider.java b/src/main/java/reobf/proghatches/gt/metatileentity/ProgrammingCircuitProvider.java index 7fceab6..ec3b513 100644 --- a/src/main/java/reobf/proghatches/gt/metatileentity/ProgrammingCircuitProvider.java +++ b/src/main/java/reobf/proghatches/gt/metatileentity/ProgrammingCircuitProvider.java @@ -73,7 +73,9 @@ import reobf.proghatches.block.BlockIOHub; import reobf.proghatches.eucrafting.IInputMightBeEmptyPattern; import reobf.proghatches.eucrafting.IInstantCompletable; +import reobf.proghatches.gt.metatileentity.util.FakePatternInv; import reobf.proghatches.gt.metatileentity.util.ICircuitProvider; +import reobf.proghatches.gt.metatileentity.util.IDisallowOptimize; import reobf.proghatches.gt.metatileentity.util.MappingItemHandler; import reobf.proghatches.item.ItemProgrammingCircuit; import reobf.proghatches.main.MyMod; @@ -343,7 +345,7 @@ public void provideCrafting(ICraftingProviderHelper craftingTracker) { } - public static class CircuitProviderPatternDetial implements ICraftingPatternDetails,IInputMightBeEmptyPattern { + public static class CircuitProviderPatternDetial implements ICraftingPatternDetails,IInputMightBeEmptyPattern,IDisallowOptimize { @Nonnull final public ItemStack out; @Nonnull @@ -738,7 +740,7 @@ public int rowSize() { } -static IInventory EMPTY=new IInventory(){ +public static IInventory EMPTY=new IInventory(){ @Override public int getSizeInventory() { @@ -817,11 +819,18 @@ public boolean isItemValidForSlot(int index, ItemStack stack) { return false; }};; + @Override public IInventory getPatterns() { + + + + - return EMPTY; +return EMPTY;//new FakePatternInv(mInventory); } + + @Override public String getName() { @@ -838,4 +847,9 @@ public boolean shouldDisplay() { return false; } +@Override +public boolean allowsPatternOptimization() { + + return false; +} } diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/SuperChestME.java b/src/main/java/reobf/proghatches/gt/metatileentity/SuperChestME.java index 019fe83..bc3e48f 100644 --- a/src/main/java/reobf/proghatches/gt/metatileentity/SuperChestME.java +++ b/src/main/java/reobf/proghatches/gt/metatileentity/SuperChestME.java @@ -407,16 +407,14 @@ public boolean isItemValidForSlot(int aIndex, ItemStack aStack) { public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, ItemStack aStack) { - return aBaseMetaTileEntity.getFrontFacing()==side - &&aIndex==0 + return true ; } @Override public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, ItemStack aStack) { - return aBaseMetaTileEntity.getFrontFacing()==side - &&aIndex!=0 + return true ; } protected void fillStacksIntoFirstSlots() { diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/SuperTankME.java b/src/main/java/reobf/proghatches/gt/metatileentity/SuperTankME.java index 6d594e4..4c9b66f 100644 --- a/src/main/java/reobf/proghatches/gt/metatileentity/SuperTankME.java +++ b/src/main/java/reobf/proghatches/gt/metatileentity/SuperTankME.java @@ -47,6 +47,7 @@ import appeng.api.networking.events.MENetworkPowerStatusChange; import appeng.api.networking.security.BaseActionSource; import appeng.api.networking.security.IActionHost; +import appeng.api.networking.security.MachineSource; import appeng.api.storage.ICellContainer; import appeng.api.storage.IMEInventory; import appeng.api.storage.IMEInventoryHandler; @@ -78,10 +79,12 @@ import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.BaseMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_InputBus; import gregtech.api.util.GT_Utility; +import li.cil.oc.server.machine.Machine; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -95,11 +98,14 @@ import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidEvent; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidContainerItem; +import net.minecraftforge.fluids.IFluidHandler; import net.minecraftforge.fluids.IFluidTank; import reobf.proghatches.gt.metatileentity.util.BaseSlotPatched; import reobf.proghatches.gt.metatileentity.util.MappingFluidTank; @@ -180,7 +186,7 @@ public List getCellArray(StorageChannel channel) { @Override public int getPriority() { - + return piority; } private ItemStack visualStack() { @@ -381,7 +387,15 @@ public boolean isAccessAllowed(EntityPlayer aPlayer) { } @Override public boolean isItemValidForSlot(int aIndex, ItemStack aStack) { - return(aStack.getItem() instanceof ItemFluidPacket); + return + + (aStack.getItem() instanceof ItemFluidPacket)|| + + GT_Utility.getFluidForFilledItem(aStack, true)!=null + ; + + + } @Override public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, @@ -393,7 +407,7 @@ public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aInde public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, ForgeDirection side, ItemStack aStack) { - return true; + return isItemValidForSlot(aIndex, aStack); } @Override @@ -413,13 +427,23 @@ public boolean canTankBeEmptied() { return true; } @Override + public FluidTankInfo[] getTankInfo(ForgeDirection side) { + + return new FluidTankInfo[]{new FluidTankInfo(this.fluidTank)}; + } + @Override public boolean canDrain(ForgeDirection side, Fluid aFluid) { - if(side!=this.getBaseMetaTileEntity().getFrontFacing())return false; + //if(side!=this.getBaseMetaTileEntity().getFrontFacing())return false; return super.canDrain(side, aFluid); } @Override + public int getCapacity() { + + return content.getCapacity(); + } + @Override public boolean canFill(ForgeDirection side, Fluid aFluid) { - if(side!=this.getBaseMetaTileEntity().getFrontFacing())return false; + //if(side!=this.getBaseMetaTileEntity().getFrontFacing())return false; return super.canFill(side, aFluid); } @Override @@ -434,6 +458,7 @@ public int fill(ForgeDirection side, FluidStack aFluid, boolean doFill) { } boolean autoUnlock; boolean suppressSticky; + @Override public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { if(!aBaseMetaTileEntity.getWorld().isRemote&&(aTick&16)!=0){ @@ -459,14 +484,56 @@ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { super.onPostTick(aBaseMetaTileEntity, aTick); boolean needToSort=false; for(int i=0;i patternCache) { + + list=patternCache; + if(list==null)list=ImmutableList.of(); + } + List list; + @Override + public int getSizeInventory() { + + return list.size(); + } + + @Override + public ItemStack getStackInSlot(int slotIn) { + + return list.get(slotIn); + } + + @Override + public ItemStack decrStackSize(int index, int count) { + // TODO Auto-generated method stub + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + // TODO Auto-generated method stub + + } + + @Override + public String getInventoryName() { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean hasCustomInventoryName() { + // TODO Auto-generated method stub + return false; + } + + @Override + public int getInventoryStackLimit() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public void markDirty() { + // TODO Auto-generated method stub + + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void openInventory() { + // TODO Auto-generated method stub + + } + + @Override + public void closeInventory() { + // TODO Auto-generated method stub + + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + // TODO Auto-generated method stub + return false; + } + +} diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/util/FakePatternInv.java b/src/main/java/reobf/proghatches/gt/metatileentity/util/FakePatternInv.java new file mode 100644 index 0000000..44cba63 --- /dev/null +++ b/src/main/java/reobf/proghatches/gt/metatileentity/util/FakePatternInv.java @@ -0,0 +1,106 @@ +package reobf.proghatches.gt.metatileentity.util; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import reobf.proghatches.gt.metatileentity.ProgrammingCircuitProvider.CircuitProviderPatternDetial; +import reobf.proghatches.item.ItemProgrammingCircuit; + +public class FakePatternInv implements IInventory { + ItemStack[] inv; + public FakePatternInv(ItemStack[] mInventory) { + inv = mInventory; + } + public FakePatternInv(ItemStack[] mInventory,int mul) { + inv = mInventory; + this.mul=mul; + } + int mul=1; + @Override + public int getSizeInventory() { + + return inv.length; + } + + + + + + @Override + public ItemStack getStackInSlot(int slotIn) { + + return new CircuitProviderPatternDetial(ItemProgrammingCircuit.wrap(inv[slotIn],mul,false)).getPattern(); + + + + + + } + + @Override + public ItemStack decrStackSize(int index, int count) { + + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) { + + return null; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + + + } + + @Override + public String getInventoryName() { + + return ""; + } + + @Override + public boolean hasCustomInventoryName() { + + return false; + } + + @Override + public int getInventoryStackLimit() { + + return 1; + } + + @Override + public void markDirty() { + + + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + + return true; + } + + @Override + public void openInventory() { + + + } + + @Override + public void closeInventory() { + + + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + + return true; + } + +} diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/util/IDisallowOptimize.java b/src/main/java/reobf/proghatches/gt/metatileentity/util/IDisallowOptimize.java new file mode 100644 index 0000000..1bb516c --- /dev/null +++ b/src/main/java/reobf/proghatches/gt/metatileentity/util/IDisallowOptimize.java @@ -0,0 +1,5 @@ +package reobf.proghatches.gt.metatileentity.util; + +public interface IDisallowOptimize { + +} diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/util/IInputStateProvider.java b/src/main/java/reobf/proghatches/gt/metatileentity/util/IInputStateProvider.java new file mode 100644 index 0000000..09e8321 --- /dev/null +++ b/src/main/java/reobf/proghatches/gt/metatileentity/util/IInputStateProvider.java @@ -0,0 +1,5 @@ +package reobf.proghatches.gt.metatileentity.util; + +public interface IInputStateProvider { + boolean isInputEmpty(); +} diff --git a/src/main/java/reobf/proghatches/main/MyMod.java b/src/main/java/reobf/proghatches/main/MyMod.java index 789367e..c0960f4 100644 --- a/src/main/java/reobf/proghatches/main/MyMod.java +++ b/src/main/java/reobf/proghatches/main/MyMod.java @@ -50,6 +50,7 @@ import appeng.api.implementations.IUpgradeableHost; import appeng.client.gui.implementations.GuiPriority; import appeng.client.gui.widgets.ITooltip; +import appeng.container.implementations.ContainerOptimizePatterns; import appeng.container.implementations.ContainerPriority; import appeng.container.slot.AppEngSlot; import appeng.container.slot.SlotDisabled; @@ -110,7 +111,9 @@ import reobf.proghatches.eucrafting.TileFluidInterface_EU; import reobf.proghatches.gt.metatileentity.PatternDualInputHatch; +import reobf.proghatches.gt.metatileentity.ProgrammingCircuitProvider; import reobf.proghatches.gt.metatileentity.ProgrammingCircuitProviderPrefabricated; +import reobf.proghatches.gt.metatileentity.multi.LargeProgrammingCircuitProvider; import reobf.proghatches.item.ItemBookTutorial; import reobf.proghatches.item.ItemProgrammingCircuit; import reobf.proghatches.lang.LangManager; @@ -133,7 +136,7 @@ ) public class MyMod { public static MyMod instance; - {ItemGolemCore.class.getDeclaredFields(); + {ContainerOptimizePatterns.class.getDeclaredFields(); // BaseMetaPipeEntity.class.getDeclaredFields(); instance = this; } @@ -273,6 +276,13 @@ public void postInit(FMLPostInitializationEvent event) { InterfaceTerminalRegistry.instance().register(TileFluidInterface_EU.class); InterfaceTerminalRegistry.instance().register(PatternDualInputHatch.Inst.class); + //these are not viewable, but has to be registered to respect overridden allowsPatternOptimization() + //why not just check all machines? What can be the loss? + InterfaceTerminalRegistry.instance().register(ProgrammingCircuitProvider.class); + InterfaceTerminalRegistry.instance().register(LargeProgrammingCircuitProvider.class); + + + // ItemList list=new ItemList(); // list.add(AEItemStack.create(ItemProgrammingCircuit.wrap(new ItemStack(Blocks.cactus)))); // list.findFuzzy(AEItemStack.create(ItemProgrammingCircuit.wrap(new ItemStack(Blocks.bed))), FuzzyMode.IGNORE_ALL); diff --git a/src/main/java/reobf/proghatches/main/mixin/MixinCallback.java b/src/main/java/reobf/proghatches/main/mixin/MixinCallback.java index 7e150e5..ac78bd3 100644 --- a/src/main/java/reobf/proghatches/main/mixin/MixinCallback.java +++ b/src/main/java/reobf/proghatches/main/mixin/MixinCallback.java @@ -188,7 +188,7 @@ public static void cb(final IEnergyGrid eg, final CraftingGridCache cc, Callback .stream().filter(sp->sp.getUUID().equals(ProghatchesUtil.deser(s.getKey().getTagCompound().getNBTTagCompoundCopy(), "EUFI"))) .findFirst(); if(!opt.isPresent())break a; - if(opt.get().getAmp()>0){break a;} + if((!opt.get().allowOvercommit())&&opt.get().getAmp()>0){break a;} long get = man.request(s.getKey().getTagCompound().getNBTTagCompoundCopy().getLong("voltage"), missing); if(get>0){ diff --git a/src/main/java/reobf/proghatches/main/mixin/MixinPlugin.java b/src/main/java/reobf/proghatches/main/mixin/MixinPlugin.java index bd19ce6..efb6eb8 100644 --- a/src/main/java/reobf/proghatches/main/mixin/MixinPlugin.java +++ b/src/main/java/reobf/proghatches/main/mixin/MixinPlugin.java @@ -178,6 +178,8 @@ public List getMixins() { retLate.add("MixinGolemCore"); retLate.add("MixinGolem"); retLate.add("MixinStorageChangeEvent"); + retLate.add("MixinOptimize"); + if (FMLLaunchHandler.side().isClient()) { if (!"true".equals(pp.get("noAEItemSortMixins"))) if(ff)retLate.add("MixinAEItemStackCompare"); diff --git a/src/main/java/reobf/proghatches/main/mixin/mixins/MixinOptimize.java b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinOptimize.java new file mode 100644 index 0000000..e8078b3 --- /dev/null +++ b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinOptimize.java @@ -0,0 +1,58 @@ +package reobf.proghatches.main.mixin.mixins; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.HashSet; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.At.Shift; + +import appeng.api.networking.crafting.ICraftingJob; +import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.storage.data.IAEItemStack; +import reobf.proghatches.gt.metatileentity.util.IDisallowOptimize; + + +@Mixin(targets="appeng.container.implementations.ContainerOptimizePatterns",remap=false) +public class MixinOptimize { + + private Field f ; + private HashSet patternDetails(Object pt){ + if(f==null){ + + try { + f = pt.getClass().getDeclaredField("patternDetails");f.setAccessible(true); + } catch (Exception e) {e.printStackTrace(); + throw new AssertionError("cannot continue",e); + } + + } + + try { + return (HashSet) f.get(pt); + } catch (Exception e) { + e.printStackTrace(); + throw new AssertionError("cannot continue",e); + } + + + } + + + + @Shadow(remap=false) + HashMap patterns = new HashMap<>(); + @Inject( method = "setResult", at = { + @At(value = "NEW", target = "appeng/core/sync/packets/PacketMEInventoryUpdate", shift = Shift.BEFORE) },remap=false) + public void setResult(ICraftingJob result,CallbackInfo ci) { + + this.patterns.entrySet().removeIf(entry -> patternDetails(entry.getValue()).stream() + .filter(s->s instanceof IDisallowOptimize).count()>0 + ); + } + +} diff --git a/src/main/resources/assets/proghatches/lang/zh_CN.lang b/src/main/resources/assets/proghatches/lang/zh_CN.lang index cea438a..e4624fe 100644 --- a/src/main/resources/assets/proghatches/lang/zh_CN.lang +++ b/src/main/resources/assets/proghatches/lang/zh_CN.lang @@ -485,6 +485,12 @@ proghatches.eucreafting.duty.all=功能: 所有 proghatches.eucreafting.duty.io=功能: 仅物品/流体输出 proghatches.eucreafting.duty.eu=功能: 仅GTEU输出 proghatches.eucreafting.duty.machine=功能: 仅监视GT机器 +proghatches.eucreafting.duty.0.0=允许: 物品/流体输出 +proghatches.eucreafting.duty.1.0=禁止: 物品/流体输出 +proghatches.eucreafting.duty.0.1=允许: EU输出 +proghatches.eucreafting.duty.1.1=禁止: EU输出 +proghatches.eucreafting.duty.0.2=允许: 监视GT机器 +proghatches.eucreafting.duty.1.2=禁止: 监视GT机器 data.input.me.name=数据访问仓 (ME) item.ItemGolemCore.120.name=傀儡核心: 维护 proghatches.golemcore.120.hint.0=使用傀儡使铃铛绑定多方块结构的§c主方块§7