diff --git a/src/main/java/reobf/proghatches/ae/BlockMolecularAssemblerInterface.java b/src/main/java/reobf/proghatches/ae/BlockMolecularAssemblerInterface.java new file mode 100644 index 0000000..f3d7eda --- /dev/null +++ b/src/main/java/reobf/proghatches/ae/BlockMolecularAssemblerInterface.java @@ -0,0 +1,26 @@ +package reobf.proghatches.ae; + +import appeng.tile.networking.TileController; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class BlockMolecularAssemblerInterface extends BlockContainer{ + + public BlockMolecularAssemblerInterface( ) { + super(Material.rock); + setHardness(1); + setHarvestLevel("pickaxe", 1); + setBlockName("proghatch.ma_iface"); + setBlockTextureName("proghatches:me_iface"); + } + + @Override + public TileMolecularAssemblerInterface createNewTileEntity(World worldIn, int meta) { + + return new TileMolecularAssemblerInterface(); + } + + +} diff --git a/src/main/java/reobf/proghatches/ae/BlockStockingCircuitRequestInterceptor.java b/src/main/java/reobf/proghatches/ae/BlockStockingCircuitRequestInterceptor.java new file mode 100644 index 0000000..c005857 --- /dev/null +++ b/src/main/java/reobf/proghatches/ae/BlockStockingCircuitRequestInterceptor.java @@ -0,0 +1,25 @@ +package reobf.proghatches.ae; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class BlockStockingCircuitRequestInterceptor extends BlockContainer{ + + public BlockStockingCircuitRequestInterceptor() { + + super(Material.rock); + setHardness(1); + setHarvestLevel("pickaxe", 1); + setBlockName("proghatches.circuit_interceptor"); + setBlockTextureName("proghatches:circuit_interceptor"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + + return new TileStockingCircuitRequestInterceptor(); + } + +} diff --git a/src/main/java/reobf/proghatches/ae/IIsExtractFromInvAllowed.java b/src/main/java/reobf/proghatches/ae/IIsExtractFromInvAllowed.java new file mode 100644 index 0000000..9624108 --- /dev/null +++ b/src/main/java/reobf/proghatches/ae/IIsExtractFromInvAllowed.java @@ -0,0 +1,5 @@ +package reobf.proghatches.ae; + +public interface IIsExtractFromInvAllowed { +public boolean isAllowed(); +} diff --git a/src/main/java/reobf/proghatches/ae/TileMolecularAssemblerInterface.java b/src/main/java/reobf/proghatches/ae/TileMolecularAssemblerInterface.java new file mode 100644 index 0000000..c84adce --- /dev/null +++ b/src/main/java/reobf/proghatches/ae/TileMolecularAssemblerInterface.java @@ -0,0 +1,193 @@ +package reobf.proghatches.ae; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.stream.IntStream; + +import com.glodblock.github.common.item.ItemFluidPacket; + +import appeng.api.implementations.tiles.ICraftingMachine; +import appeng.api.networking.crafting.ICraftingPatternDetails; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; +import reobf.proghatches.fmp.LayerCraftingMachine.StateHolder; + +public class TileMolecularAssemblerInterface extends TileEntity implements ICraftingMachine { + + @Override + public boolean pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table, + ForgeDirection ejectionDirection) { + + TileEntity te = getTarget(ejectionDirection.getOpposite()); + if(te ==null)return false; + ArrayList item = new ArrayList<>(table.getSizeInventory()); + ArrayList fluid = new ArrayList<>(1); + + for (int i = 0; i < table.getSizeInventory(); i++) { + + ItemStack is = table.getStackInSlot(i); + if (is == null) { + continue; + } + + if (is.getItem() instanceof ItemFluidPacket) { + FluidStack fs = ItemFluidPacket.getFluidStack(is); + if (fs == null) { + continue; + } + fluid.add(fs); + } else { + + item.add(is); + } + + } + + if(itemCheck(te, item, false)>=0)return false; + if(fluidCheck(te, fluid, false)>=0)return false; + + itemCheck(te, item,true); + fluidCheck(te, fluid,true); + + + return true; + } + + @Override + public boolean acceptsPlans() { + /*ForgeDirection dir = StateHolder.state; + TileEntity targ = getTarget(); + if(targ==null)return false; + */ + + + + return true; + } + + private TileEntity getTarget() { + + final TileEntity te = this.getWorldObj().getTileEntity(this.xCoord + this.getSide().offsetX, + this.yCoord + this.getSide().offsetY, this.zCoord + this.getSide().offsetZ); + + return te; + } + private TileEntity getTarget(ForgeDirection d) { + + final TileEntity te = this.getWorldObj().getTileEntity(this.xCoord + d.offsetX, + this.yCoord + d.offsetY, this.zCoord + d.offsetZ); + + return te; + } + interface ISideCheck { + int[] getAccessibleSlotsFromSide(int p_94128_1_); + + boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_); + + public static ISideCheck ofInv(IInventory te) { + + if (te instanceof ISidedInventory) { + ISidedInventory side = (ISidedInventory) te; + return new ISideCheck() { + + @Override + public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + return side.getAccessibleSlotsFromSide(p_94128_1_); + } + + @Override + public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { + + return side.canInsertItem(p_102007_1_, p_102007_2_, p_102007_3_); + } + }; + } + + return new ISideCheck() { + + @Override + public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + return IntStream.range(0, te.getSizeInventory()).toArray(); + } + + @Override + public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { + return true; + } + }; + } + } + + //-1 pass + //>=0 first index in inputs that won't fit + public int itemCheck( TileEntity t, ArrayList item,boolean doInject) { + if(t instanceof IInventory==false){return Integer.MAX_VALUE;} + IInventory te=(IInventory) t; + + ForgeDirection dir=getSide(); + ISideCheck checker=ISideCheck.ofInv(te); + int cnt=0; + next:for(int i=0;i=item.get(i).stackSize + &&item.get(i).stackSize<=item.get(i).getMaxStackSize() + ){ + if(doInject){ + te.setInventorySlotContents(slots[cnt], item.get(i)); + } + + continue next; + }; + cnt++; + if(slots.length<=cnt)return i; + } + + + + } + + + + + + return -1; + } + + public int fluidCheck( TileEntity t, ArrayList fluid,boolean doInject) { + if(t instanceof IFluidHandler==false){return Integer.MAX_VALUE;} + IFluidHandler f=(IFluidHandler) t; + //SPECIAL CHECKS HERE + if(fluid.size()>1){return 0;} + for(int i=0;i getMixins() { retLate.add("part2.MixinEIOGui"); retLate.add("part2.MixinEIOInit"); retLate.add("part2.MixinEIOBundle"); + retLate.add("part2.MixinContextNoCircuitCache"); + retLate.add("part2.MixinExtractIntercept"); + 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/MixinCraftFromPatternTaskPatch.java b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinCraftFromPatternTaskPatch.java index c80adc4..ed8a440 100644 --- a/src/main/java/reobf/proghatches/main/mixin/mixins/MixinCraftFromPatternTaskPatch.java +++ b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinCraftFromPatternTaskPatch.java @@ -39,7 +39,7 @@ private boolean shouldPatch(){ } @Shadow (remap=false) protected IAEItemStack[] patternInputs; - @Inject(method="",at = { @At("RETURN") },remap=false) + @Inject(method="",at = { @At("RETURN") },remap=false, require = 1) public void calculateOneStep(CraftingRequest request, ICraftingPatternDetails pattern, int priority, boolean allowSimulation, boolean isComplex,CallbackInfo xx){ if(shouldPatch()) diff --git a/src/main/java/reobf/proghatches/main/mixin/mixins/MixinFixPipeCoverBug.java b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinFixPipeCoverBug.java index 6297d3f..b2a053d 100644 --- a/src/main/java/reobf/proghatches/main/mixin/mixins/MixinFixPipeCoverBug.java +++ b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinFixPipeCoverBug.java @@ -20,7 +20,7 @@ public class MixinFixPipeCoverBug{ ForgeDirection realSide; @Inject(remap=false,method="onRightclick",at=@At(value="INVOKE",target = - "onPlayerAttach")) + "onPlayerAttach"), require = 1) public void onRightclick0(EntityPlayer aPlayer, ForgeDirection side, float aX, float aY, float aZ,CallbackInfoReturnable cc) { realSide=side; if(((CoverableTileEntity)(Object)this).getCoverIDAtSide(side) == 0) diff --git a/src/main/java/reobf/proghatches/main/mixin/mixins/MixinGolem.java b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinGolem.java index 1033be1..3775c5f 100644 --- a/src/main/java/reobf/proghatches/main/mixin/mixins/MixinGolem.java +++ b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinGolem.java @@ -28,7 +28,7 @@ public MixinGolem(World p_i1686_1_) { super(p_i1686_1_); } - @Inject(method = "setupGolem", at = @At("RETURN"),remap=false) + @Inject(method = "setupGolem", at = @At("RETURN"),remap=false, require = 1) public void setupGolem(CallbackInfoReturnable c) { if(getCore()==120){ diff --git a/src/main/java/reobf/proghatches/main/mixin/mixins/MixinGolemCore.java b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinGolemCore.java index 3f7c6bf..c6d27e0 100644 --- a/src/main/java/reobf/proghatches/main/mixin/mixins/MixinGolemCore.java +++ b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinGolemCore.java @@ -29,7 +29,7 @@ public class MixinGolemCore extends Item{ - @Inject(method = "registerIcons", at = @At("HEAD"),remap=true) + @Inject(method = "registerIcons", at = @At("HEAD"),remap=true, require = 1) @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister ir,CallbackInfo c) { @@ -37,14 +37,14 @@ public void registerIcons(IIconRegister ir,CallbackInfo c) { } - @Inject(method = "addInformation", at = @At("TAIL"),remap=true) + @Inject(method = "addInformation", at = @At("TAIL"),remap=true, require = 1) public void addInformation(ItemStack stack, EntityPlayer par2EntityPlayer, List list, boolean par4,CallbackInfo c) { if(stack.getItemDamage()==damage) { list.add(StatCollector.translateToLocal("proghatches.golemcore.120.hint.0")); list.add(StatCollector.translateToLocal("proghatches.golemcore.120.hint.1")); list.add(StatCollector.translateToLocal("programmable_hatches.addedby")); }} - @Inject(method = "getSubItems", at = @At("HEAD"),remap=true) + @Inject(method = "getSubItems", at = @At("HEAD"),remap=true, require = 1) @SideOnly(Side.CLIENT) public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List,CallbackInfo c) { @@ -52,7 +52,7 @@ public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List, par3List.add(new ItemStack(this, 1, damage)); } - @Inject(method = "getIconFromDamage", at = @At("HEAD"),remap=true,cancellable=true) + @Inject(method = "getIconFromDamage", at = @At("HEAD"),remap=true,cancellable=true, require = 1) @SideOnly(Side.CLIENT) public void getIconFromDamage(int d,CallbackInfoReturnable c) { if(d==damage)c.setReturnValue((Object)iconEx); diff --git a/src/main/java/reobf/proghatches/main/mixin/mixins/MixinNoFuzzyForProgrammingCircuit.java b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinNoFuzzyForProgrammingCircuit.java index 5c78acc..b82e797 100644 --- a/src/main/java/reobf/proghatches/main/mixin/mixins/MixinNoFuzzyForProgrammingCircuit.java +++ b/src/main/java/reobf/proghatches/main/mixin/mixins/MixinNoFuzzyForProgrammingCircuit.java @@ -21,7 +21,7 @@ public abstract class MixinNoFuzzyForProgrammingCircuit implements IItemList { @Inject(cancellable = true, method = "findFuzzy", at = { - @At(value = "INVOKE", target = "Lappeng/util/item/AEItemStack;isOre()Z", shift = Shift.BEFORE) }) + @At(value = "INVOKE", target = "Lappeng/util/item/AEItemStack;isOre()Z", shift = Shift.BEFORE) }, require = 1) public void prevent(final IAEItemStack filter, final FuzzyMode fuzzy, CallbackInfoReturnable> xx) { if ((filter.getItem() == MyMod.progcircuit)) { diff --git a/src/main/java/reobf/proghatches/main/mixin/mixins/eucrafting/MixinWirelessRename.java b/src/main/java/reobf/proghatches/main/mixin/mixins/eucrafting/MixinWirelessRename.java index 604177f..ba05fbb 100644 --- a/src/main/java/reobf/proghatches/main/mixin/mixins/eucrafting/MixinWirelessRename.java +++ b/src/main/java/reobf/proghatches/main/mixin/mixins/eucrafting/MixinWirelessRename.java @@ -4,6 +4,7 @@ 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.Surrogate; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -42,9 +43,9 @@ public void mouseClicked(int mouseX, int mouseY, int btn,CallbackInfoReturnable< c.setReturnValue(true); } } - + @Surrogate @Inject(method = "", at = @At(value = "RETURN"), require = 1) - public void ctor(GuiInterfaceWireless parent,long idx, String name, int rows, int rowSize, boolean online,CallbackInfo x) { + public void ctor(/*GuiInterfaceWireless parent,long idx, String name, int rows, int rowSize, boolean online,*/CallbackInfo x) { if((id&Long.MIN_VALUE)!=0){ isCover=true; diff --git a/src/main/java/reobf/proghatches/main/mixin/mixins/part2/MixinContextNoCircuitCache.java b/src/main/java/reobf/proghatches/main/mixin/mixins/part2/MixinContextNoCircuitCache.java new file mode 100644 index 0000000..be12034 --- /dev/null +++ b/src/main/java/reobf/proghatches/main/mixin/mixins/part2/MixinContextNoCircuitCache.java @@ -0,0 +1,27 @@ +package reobf.proghatches.main.mixin.mixins.part2; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import appeng.api.networking.IGrid; +import appeng.crafting.v2.CraftingContext; +import reobf.proghatches.ae.IIsExtractFromInvAllowed; +import reobf.proghatches.ae.TileStockingCircuitRequestInterceptor; + +@Mixin(value=CraftingContext +.class,remap=false) +public class MixinContextNoCircuitCache implements IIsExtractFromInvAllowed { + + @Override + public boolean isAllowed() { + if(isAllowedCache==null){ + isAllowedCache=meGrid.getMachines(TileStockingCircuitRequestInterceptor.class).isEmpty(); + //isAllowedCache=false; + } + return isAllowedCache; + } + + Boolean isAllowedCache; + @Shadow + public IGrid meGrid; +} diff --git a/src/main/java/reobf/proghatches/main/mixin/mixins/part2/MixinExtractIntercept.java b/src/main/java/reobf/proghatches/main/mixin/mixins/part2/MixinExtractIntercept.java new file mode 100644 index 0000000..f7ac39b --- /dev/null +++ b/src/main/java/reobf/proghatches/main/mixin/mixins/part2/MixinExtractIntercept.java @@ -0,0 +1,45 @@ +package reobf.proghatches.main.mixin.mixins.part2; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import appeng.api.storage.data.IAEItemStack; +import appeng.crafting.MECraftingInventory; +import appeng.crafting.v2.CraftingContext; +import appeng.crafting.v2.CraftingRequest; +import appeng.crafting.v2.resolvers.CraftingTask; +import appeng.crafting.v2.resolvers.ExtractItemResolver; +import appeng.util.item.AEItemStack; +import reobf.proghatches.ae.IIsExtractFromInvAllowed; +import reobf.proghatches.main.MyMod; + +@Mixin(value=ExtractItemResolver.ExtractItemTask.class,remap=false) +public abstract class MixinExtractIntercept extends CraftingTask{ + + + protected MixinExtractIntercept(CraftingRequest request, int priority) { + super(request, priority); + + } + + @Inject(method="extractExact", at = { @At("HEAD") },cancellable=true) + + public void extract(CraftingContext context, MECraftingInventory source, List removedList,CallbackInfo c){ + if( + !((IIsExtractFromInvAllowed)(Object)context).isAllowed()&& + this.request.stack.isItem()&& + ((AEItemStack)this.request.stack).getItem()==MyMod.progcircuit + ){ + + + c.cancel(); + } + + + + } +} diff --git a/src/main/java/reobf/proghatches/main/mixin/mixins/part2/MixinMultiPattern.java b/src/main/java/reobf/proghatches/main/mixin/mixins/part2/MixinMultiPattern.java index e5563d3..443ea93 100644 --- a/src/main/java/reobf/proghatches/main/mixin/mixins/part2/MixinMultiPattern.java +++ b/src/main/java/reobf/proghatches/main/mixin/mixins/part2/MixinMultiPattern.java @@ -143,8 +143,10 @@ public void b(IEnergyGrid eg, CraftingGridCache cc, CallbackInfo ci) { for (int x = 0; x < input.length; x++) { IAEItemStack tmp = input[x].copy().setStackSize(Integer.MAX_VALUE); final IAEItemStack ais = this.inventory.extractItems(tmp, Actionable.MODULATE, this.machineSrc); - if (ais != null) + if (ais != null){ nums[x] = (int) ais.getStackSize(); + this.postChange(ais, this.machineSrc); + } } try { @@ -204,7 +206,7 @@ public void b(IEnergyGrid eg, CraftingGridCache cc, CallbackInfo ci) { //int now = temp1.getOrDefault(detail, 0); final long max = getMaxSkips(); stop:for (int i = 0; i < max; i=(i