From 3a1a80962c27e77cf39778eb4e9cf80d845a9245 Mon Sep 17 00:00:00 2001 From: reobf <2215595288@qq.com> Date: Sun, 2 Feb 2025 23:58:26 +0800 Subject: [PATCH] update --- .../proghatches/ae/ItemEmitterPattern.java | 10 +- .../proghatches/ae/TileRequestTunnel.java | 563 +++----------- .../ae/part2/ItemPartRequestTunnel.java | 94 +++ .../ae/part2/PartRequestTunnel.java | 482 ++++++++++++ .../proghatches/ae/part2/RequestTunnel.java | 708 ++++++++++++++++++ ...ogrammingCircuitProviderPrefabricated.java | 10 +- .../reobf/proghatches/item/DummySuper2.java | 23 + .../reobf/proghatches/main/CommonProxy.java | 3 + .../java/reobf/proghatches/main/MyMod.java | 1 + .../main/asm/AEItemTransformer2.java | 58 ++ .../reobf/proghatches/main/asm/FMLPlugin.java | 1 + .../mixins/eucrafting/MixinWailaProvider.java | 3 + .../main/registration/PHRecipes.java | 15 + .../assets/proghatches/lang/en_US.lang | 11 +- .../assets/proghatches/lang/en_US/DIBME.lang | 44 +- .../assets/proghatches/lang/zh_CN.lang | 23 +- .../proghatches/textures/items/tunnel.png | Bin 0 -> 211 bytes 17 files changed, 1531 insertions(+), 518 deletions(-) create mode 100644 src/main/java/reobf/proghatches/ae/part2/ItemPartRequestTunnel.java create mode 100644 src/main/java/reobf/proghatches/ae/part2/PartRequestTunnel.java create mode 100644 src/main/java/reobf/proghatches/ae/part2/RequestTunnel.java create mode 100644 src/main/java/reobf/proghatches/item/DummySuper2.java create mode 100644 src/main/java/reobf/proghatches/main/asm/AEItemTransformer2.java create mode 100644 src/main/resources/assets/proghatches/textures/items/tunnel.png diff --git a/src/main/java/reobf/proghatches/ae/ItemEmitterPattern.java b/src/main/java/reobf/proghatches/ae/ItemEmitterPattern.java index 86cd5bc..57e52d9 100644 --- a/src/main/java/reobf/proghatches/ae/ItemEmitterPattern.java +++ b/src/main/java/reobf/proghatches/ae/ItemEmitterPattern.java @@ -26,8 +26,7 @@ import appeng.api.implementations.ICraftingPatternItem; import appeng.api.networking.crafting.ICraftingPatternDetails; - - +import appeng.items.misc.ItemEncodedPattern; import appeng.util.Platform; import appeng.util.item.AEItemStack; import gregtech.api.gui.modularui.GTUIInfos; @@ -49,16 +48,17 @@ import net.minecraftforge.client.IItemRenderer.ItemRenderType; import net.minecraftforge.client.IItemRenderer.ItemRendererHelper; import net.minecraftforge.fluids.FluidStack; +import reobf.proghatches.item.DummySuper2; import reobf.proghatches.item.ItemProgrammingCircuit; import reobf.proghatches.lang.LangManager; import reobf.proghatches.main.MyMod; import reobf.proghatches.util.ProghatchesUtil; -public class ItemEmitterPattern extends Item implements ICraftingPatternItem,IItemWithModularUI{ +public class ItemEmitterPattern extends DummySuper2 implements ICraftingPatternItem,IItemWithModularUI{ public ItemEmitterPattern() { - //super(target); + super(); if (Platform.isClient()) { MinecraftForgeClient.registerItemRenderer(this, new ItemEmitterPatternRenderer()); } @@ -338,7 +338,7 @@ protected int getTextColorOrDefault(String textType, int defaultColor) { protected final Supplier COLOR_TEXT_WARN = () -> getTextColorOrDefault("text_warn", 0xff0000); } @Override - public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List p_77624_3_, boolean p_77624_4_) { + public void addCheckedInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List p_77624_3_, boolean p_77624_4_) { p_77624_3_.add(StatCollector.translateToLocal("item.emitterpattern.name.tooltip.0")); p_77624_3_.add(StatCollector.translateToLocal("item.emitterpattern.name.tooltip.1")); p_77624_3_.add(StatCollector.translateToLocal("item.emitterpattern.name.tooltip.2")); diff --git a/src/main/java/reobf/proghatches/ae/TileRequestTunnel.java b/src/main/java/reobf/proghatches/ae/TileRequestTunnel.java index 4392431..e01452a 100644 --- a/src/main/java/reobf/proghatches/ae/TileRequestTunnel.java +++ b/src/main/java/reobf/proghatches/ae/TileRequestTunnel.java @@ -26,6 +26,7 @@ import appeng.api.implementations.ICraftingPatternItem; import appeng.api.implementations.tiles.ICraftingMachine; import appeng.api.networking.GridFlags; +import appeng.api.networking.IGridNode; import appeng.api.networking.crafting.ICraftingJob; import appeng.api.networking.crafting.ICraftingLink; import appeng.api.networking.crafting.ICraftingPatternDetails; @@ -38,10 +39,12 @@ import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; +import appeng.api.util.AECableType; import appeng.api.util.IOrientable; import appeng.crafting.CraftingLink; import appeng.me.GridAccessException; import appeng.me.cluster.implementations.CraftingCPUCluster; +import appeng.me.helpers.AENetworkProxy; import appeng.tile.TileEvent; import appeng.tile.events.TileEventType; import appeng.tile.grid.AENetworkTile; @@ -68,12 +71,62 @@ import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; +import reobf.proghatches.ae.part2.RequestTunnel; public class TileRequestTunnel extends AENetworkTile implements ICraftingMachine,ICraftingRequester,IOrientable ,ISidedInventory,IFluidHandler +{ + RequestTunnel internal=new RequestTunnel(){ + public TileRequestTunnel getThis(){ + return TileRequestTunnel.this; + } + @Override + public IGridNode getActionableNode() { + + return getThis().getActionableNode(); + } + @Override + public IGridNode getGridNode(ForgeDirection dir) { + + return getThis().getGridNode(dir); + } -{ + @Override + public AECableType getCableConnectionType(ForgeDirection dir) { + + return getThis().getCableConnectionType(dir); + } + + @Override + public void securityBreak() { + getThis().securityBreak(); + + } + + @Override + public void markDirty() { + getThis().markDirty(); + + } + + @Override + public AENetworkProxy getProxy() { + + return getThis().getProxy(); + } + + @Override + public World getWorldObj() { + + return getThis().getWorldObj(); + } + @Override + public IMEInventory getInv(StorageChannel ch) { + + return getThis().getInv(ch); + }}; + public static IWailaDataProvider provider=new IWailaDataProvider(){ @Override @@ -174,18 +227,18 @@ public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCom TileRequestTunnel thiz= (TileRequestTunnel) te; { NBTTagList listR=new NBTTagList(); - thiz. cacheR.stream().map(s-> + thiz.internal. cacheR.stream().map(s-> s.writeToNBT(new NBTTagCompound()) ).forEach(s->listR.appendTag(s)); data.setTag("cacheR", listR); NBTTagList listFR=new NBTTagList(); - thiz. cacheFR.stream().map(s-> + thiz.internal. cacheFR.stream().map(s-> s.writeToNBT(new NBTTagCompound()) ).forEach(s->listFR.appendTag(s)); data.setTag("cacheFR", listFR); } NBTTagList listR=new NBTTagList(); - thiz.waiting.entrySet().stream().map(s-> + thiz.internal.waiting.entrySet().stream().map(s-> { NBTTagCompound t=new NBTTagCompound(); NBTTagCompound k=new NBTTagCompound(); @@ -199,163 +252,32 @@ public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCom data.setTag("waiting", listR);; return data; }}; + + + public TileRequestTunnel() { this.getProxy().setFlags(GridFlags.REQUIRE_CHANNEL); } - ArrayList cache=new ArrayList<>(); - ArrayList cacheF=new ArrayList<>(); - HashMap waiting=new HashMap<>(); - ArrayList cacheR=new ArrayList<>(); - ArrayList cacheFR=new ArrayList<>(); + @Override public boolean pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table, ForgeDirection ejectionDirection) { - for(int i=0;i - s.writeToNBT(new NBTTagCompound()) - ).forEach(s->list.appendTag(s)); - data.setTag("cache", list); - NBTTagList listF=new NBTTagList(); - cacheF.stream().map(s-> - s.writeToNBT(new NBTTagCompound()) - ).forEach(s->listF.appendTag(s)); - data.setTag("cacheF", listF); - { - NBTTagList listR=new NBTTagList(); - cacheR.stream().map(s-> - s.writeToNBT(new NBTTagCompound()) - ).forEach(s->listR.appendTag(s)); - data.setTag("cacheR", listR); - NBTTagList listFR=new NBTTagList(); - cacheFR.stream().map(s-> - s.writeToNBT(new NBTTagCompound()) - ).forEach(s->listFR.appendTag(s)); - data.setTag("cacheFR", listFR); - } - - - - - - NBTTagList listR=new NBTTagList(); - waiting.entrySet().stream().map(s-> - { - NBTTagCompound t=new NBTTagCompound(); - NBTTagCompound k=new NBTTagCompound(); - s.getKey().writeToNBT(k); - t.setTag("key", k); - t.setLong("value", s.getValue()); - - return t; - } - ).forEach(s->listR.appendTag(s)); - data.setTag("waiting", listR); - if(last!=null){ - NBTTagCompound tag=new NBTTagCompound(); - last.writeToNBT(tag); - data.setTag("link", tag); - } - + internal.writeToNBT_AENetworkX(data); } - public void dump(){ - try { - IMEMonitor i = getProxy().getStorage().getItemInventory(); - cache.removeIf(s->{ - IAEItemStack left = i.injectItems(AEItemStack.create(s), Actionable.MODULATE, new MachineSource(this)); - if(left==null||left.getStackSize()<=0){return true;} - s.stackSize=(int) left.getStackSize(); - return false; - }); - } catch (GridAccessException e) { - - } - - try { - IMEMonitor i = getProxy().getStorage().getFluidInventory(); - cacheF.removeIf(s->{ - IAEFluidStack left = i.injectItems(AEFluidStack.create(s), Actionable.MODULATE, new MachineSource(this)); - if(left==null||left.getStackSize()<=0){return true;} - s.amount=(int) left.getStackSize(); - return false; - }); - } catch (GridAccessException e) { - - } - - } + @@ -363,77 +285,25 @@ public void dump(){ @Override public boolean acceptsPlans() { - return true; + return internal.acceptsPlans(); } - ICraftingLink last; + @Override public ImmutableSet getRequestedJobs() { - return last==null?ImmutableSet.of():ImmutableSet.of(last); + return internal.getRequestedJobs(); } @Override public IAEItemStack injectCraftedItems(ICraftingLink link, IAEItemStack items, Actionable mode) { - if(mode==Actionable.SIMULATE){ - - return null; - } - /*Long l=waiting.get(items); - if(l!=null){ - long todo=Math.min(l, items.getStackSize()); - IAEItemStack t = items.copy().setStackSize(todo); - t=complete(t); - todo=todo-((t==null)?0:t.getStackSize()); - waiting.put((AEItemStack) items, l-todo); - items.decStackSize(todo); - if(l-todo<=0){ - waiting.remove(items); - } - if(items.getStackSize()<=0)items=null; - - - }*/ - AEItemStack left=null; - - Long get = waiting.get((items)); - if(get!=null){ - long tmp; - waiting.put((AEItemStack) items,tmp=Math.max(0,get-items.getStackSize())); - if(tmp<=0)waiting.remove(items); - - if((this.mode&1)!=0){ - if(get inv=new HashMap(); HashMap handlerHash=new HashMap(); - public ItemStack[] mark=new ItemStack[1]; + //public ItemStack[] mark=new ItemStack[1]; private BaseActionSource source=new MachineSource(this); @@ -471,236 +341,25 @@ private ForgeDirection getSide() { return getUp().getOpposite(); } -/* @SuppressWarnings("unchecked") - public IAEItemStack complete(IAEItemStack todo){ - - try{ - todo=(IAEItemStack) getInv(StorageChannel.ITEMS).injectItems(todo, Actionable.MODULATE, source); - - }catch(NullPointerException e){} - - - return todo; - } - */ - + @Override public void jobStateChange(ICraftingLink link) { - + internal.jobStateChange(link); } - int cd; - int tick; - Future job; + @TileEvent(TileEventType.TICK) - public void update(){tick++; - if(getWorldObj().isRemote)return; - - if(dirty){ - dirty=false; - cacheR.removeIf(s->s.stackSize<=0); - } - if(dirtyF){ - dirtyF=false; - cacheFR.removeIf(s->s.amount<=0); - } - boolean clear=false; - - IMEInventory ch = getInv(StorageChannel.ITEMS); - if(ch!=null) - for(ItemStack todo:cacheR){ - AEItemStack itodo=(AEItemStack)ch .injectItems(AEItemStack.create(todo), Actionable.MODULATE, source); - todo.stackSize=(int) (itodo==null?0:itodo.getStackSize()); - if(todo.stackSize==0)clear=true; - } - if(clear)cacheR.removeIf(s->s.stackSize==0); - - ch = getInv(StorageChannel.FLUIDS); - clear=false; - if(ch!=null) - for(FluidStack todo:cacheFR){ - AEFluidStack itodo=(AEFluidStack) getInv(StorageChannel.FLUIDS).injectItems(AEFluidStack.create(todo), Actionable.MODULATE, source); - todo.amount=(int) (itodo==null?0:itodo.getStackSize()); - if(todo.amount==0)clear=true; - } - if(clear)cacheFR.removeIf(s->s.amount==0); - - - - - - IAEItemStack req = null; - - if(waiting.isEmpty()==false){ - - - - if((mode&2)==0||last==null) - useExisting(); - } - if(this.tick%40==2){ - - fillStacksIntoFirstSlots(cacheR); - fillStacksIntoFirstSlotsF(cacheFR); - fillStacksIntoFirstSlots(cache); - fillStacksIntoFirstSlotsF(cacheF); - - } - if(waiting.isEmpty()==false&&job==null){ - Entry ent = waiting.entrySet().iterator().next(); - req= ent.getKey().copy().setStackSize(ent.getValue()); - } - - - - - - - - - try{ - if(last!=null){ - if(last.isDone()||last.isCanceled()){ - last=null; - - } - } - if(last==null){ - if(job==null){ - if(req!=null){ - if(cd--<=0){ - job = getProxy().getCrafting().beginCraftingJob(this.getTile().getWorldObj(), getProxy().getGrid(), new MachineSource(this), req, null); - cd=40; - }} - } - else if(job.isDone()&&!job.isCancelled()){ - last=getProxy().getCrafting().submitJob(job.get(), this, null, true, new MachineSource(this)); - job=null; - }else if(job.isCancelled()){last=null;} - - }else{ - - - } - }catch(Exception e){} + public void update(){ + internal.update(); } - protected void fillStacksIntoFirstSlotsF( ArrayList mInventory) { - final int L = mInventory.size(); - HashMap slots = new HashMap<>(L); - HashMap stacks = new HashMap<>(L); - List order = new ArrayList<>(L); - List validSlots = new ArrayList<>(L); - for (int i = 0; i < L; i++) { - - validSlots.add(i); - FluidStack s = mInventory.get(i); - if (s == null) continue; - Fluid sID =s.getFluid(); - slots.merge(sID, s.amount, Integer::sum); - if (!stacks.containsKey(sID)) stacks.put(sID, s); - order.add(sID); - mInventory.set(i, null); - } - int slotindex = 0; - for (Fluid sID : order) { - int toSet = slots.get(sID); - if (toSet == 0) continue; - int slot = validSlots.get(slotindex); - slotindex++; - mInventory.set( slot,stacks.get(sID).copy()) - ; - // toSet = Math.min(toSet, mInventory[slot].getMaxStackSize()); - mInventory.get(slot).amount = toSet; - slots.merge(sID, toSet, (a, b) -> a - b); - } - while(mInventory.size()>=1&&mInventory.get(mInventory.size()-1)==null){ - mInventory.remove(mInventory.size()-1); - } - - } - protected void fillStacksIntoFirstSlots( ArrayList mInventory) { - final int L = mInventory.size() ; - HashMap slots = new HashMap<>(L); - HashMap stacks = new HashMap<>(L); - List order = new ArrayList<>(L); - List validSlots = new ArrayList<>(L); - for (int i = 0; i < L; i++) { - - validSlots.add(i); - ItemStack s = mInventory.get(i); - if (s == null) continue; - GTUtility.ItemId sID = GTUtility.ItemId.createNoCopy(s); - slots.merge(sID, s.stackSize, Integer::sum); - if (!stacks.containsKey(sID)) stacks.put(sID, s); - order.add(sID); - mInventory.set(i, null); - } - int slotindex = 0; - for (GTUtility.ItemId sID : order) { - int toSet = slots.get(sID); - if (toSet == 0) continue; - int slot = validSlots.get(slotindex); - slotindex++; - mInventory.set( slot,stacks.get(sID).copy()) - ; - // toSet = Math.min(toSet, mInventory[slot].getMaxStackSize()); - mInventory.get(slot).stackSize = toSet; - slots.merge(sID, toSet, (a, b) -> a - b); - } - while(mInventory.size()>=1&&mInventory.get(mInventory.size()-1)==null){ - mInventory.remove(mInventory.size()-1); - } - - } + int mode; - private void useExisting() { - for(Iterator> itr = waiting.entrySet().iterator();itr.hasNext();){ - - Entry e=itr.next(); - if(e.getValue()<=0){itr.remove();continue;} - - IAEItemStack val = e.getKey().copy().setStackSize(e.getValue()); - - if(val.getItem() instanceof ItemFluidDrop) - try { - IAEFluidStack ext = getProxy().getStorage().getFluidInventory().extractItems(ItemFluidDrop.getAeFluidStack(val), Actionable.MODULATE, source); - if(ext!=null){ - e.setValue(e.getValue()-ext.getStackSize()); - cacheFR.add(ext.copy().getFluidStack()); - if(e.getValue()<=0){itr.remove();} - } - - } catch (GridAccessException e1) { - } - - - else - try { - IAEItemStack ext = getProxy().getStorage().getItemInventory().extractItems(val, Actionable.MODULATE, source); - if(ext!=null){ - e.setValue(e.getValue()-ext.getStackSize()); - cacheR.add(ext.copy().getItemStack()); - if(e.getValue()<=0){itr.remove();} - } - - } catch (GridAccessException e1) { - } - - - - - } - - - - - - } + public boolean canBeRotated() { return true; } @@ -749,23 +408,16 @@ public void setOrientation(ForgeDirection Forward, ForgeDirection Up) { @Override public int getSizeInventory() { - return cacheR.size()+1; + return internal.getSizeInventory(); } @Override public ItemStack getStackInSlot(int slotIn) { - if(slotIn==cacheR.size())return null; - dirty=true; - return cacheR.get(slotIn); + + return internal.getStackInSlot(slotIn); } @Override public ItemStack decrStackSize(int index, int count) { - if(index==cacheR.size())return null; - dirty=true; - if(cacheR.get(index)==null){return null;} - cacheR.get(index).stackSize-=count; - ItemStack ret = cacheR.get(index).copy(); - ret.stackSize=count; - return ret; + return internal.decrStackSize(index, count); } @Override public ItemStack getStackInSlotOnClosing(int index) { @@ -773,13 +425,7 @@ public ItemStack getStackInSlotOnClosing(int index) { } @Override public void setInventorySlotContents(int index, ItemStack stack) { - if(index==cacheR.size())return ; - dirty=true; - if(stack==null||stack.stackSize==0){ - cacheR.get(index).stackSize=0; - }else{ - cacheR.set(index,stack); - } + internal.setInventorySlotContents(index, stack); } @@ -816,72 +462,51 @@ public void closeInventory() { @Override public boolean isItemValidForSlot(int index, ItemStack stack) { - return false; + return internal.isItemValidForSlot(index, stack); } @Override public int[] getAccessibleSlotsFromSide(int p_94128_1_) { - // ForgeDirection pointAt =getUp().getOpposite(); - //if(pointAt.ordinal()==p_94128_1_){ - return IntStream.range(0, cacheR.size()+1).toArray(); -//} - // return new int[0]; + return internal.getAccessibleSlotsFromSide(p_94128_1_); } @Override public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { - return false; + return internal.canInsertItem(p_102007_1_, p_102007_2_, p_102007_3_); } @Override public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { - return true; + return internal.canExtractItem(p_102008_1_, p_102008_2_, p_102008_3_); } @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { - return 0; + return internal.fill(from, resource, doFill); } @Override public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { - int all=cacheFR.stream().filter(s->s.getFluid()==resource.getFluid()) - .mapToInt(s->s.amount).sum(); - if(doDrain){ - dirtyF=true; - int[] todo=new int[]{all}; - cacheFR.stream().filter(s->s.getFluid()==resource.getFluid()).forEach(s->{ - int real=Math.min(todo[0], s.amount); - s.amount-=real; - todo[0]-=real; - }); - - } - FluidStack cp = resource.copy(); - cp.amount=all; - if(cp.amount==0)cp=null; - return cp; + return internal.drain(from, resource, doDrain); } @Override public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { - if(cacheFR.size()==0){return null;} - FluidStack cp = cacheFR.get(0).copy(); - cp.amount=maxDrain; - return drain(from,cp , doDrain); + + return internal.drain(from, maxDrain, doDrain); } @Override public boolean canFill(ForgeDirection from, Fluid fluid) { - return false; + return internal.canFill(from, fluid); } @Override public boolean canDrain(ForgeDirection from, Fluid fluid) { - return true; + return internal.canDrain(from, fluid); } @Override public FluidTankInfo[] getTankInfo(ForgeDirection from) { - return cacheFR.stream().map(s->new FluidTank(s, 1)).toArray(FluidTankInfo[]::new); + return internal.getTankInfo(from); } - boolean dirty,dirtyF; + } diff --git a/src/main/java/reobf/proghatches/ae/part2/ItemPartRequestTunnel.java b/src/main/java/reobf/proghatches/ae/part2/ItemPartRequestTunnel.java new file mode 100644 index 0000000..b3b772b --- /dev/null +++ b/src/main/java/reobf/proghatches/ae/part2/ItemPartRequestTunnel.java @@ -0,0 +1,94 @@ +package reobf.proghatches.ae.part2; + +import java.util.List; + +import javax.annotation.Nullable; + +import appeng.api.AEApi; +import appeng.api.parts.IPart; +import appeng.api.parts.IPartItem; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import reobf.proghatches.ae.PartMAP2P; + +public class ItemPartRequestTunnel extends Item implements IPartItem{ + @SideOnly(Side.CLIENT) + private IIcon icon; + + + public ItemPartRequestTunnel() { + this.setMaxStackSize(64); + + AEApi.instance().partHelper().setItemBusRenderer(this); + setHasSubtypes(true); + } + + @Nullable + @Override + public IPart createPartFromItemStack(ItemStack is) { + return new PartRequestTunnel(is); + } + @Override + public String getItemStackDisplayName(ItemStack stack) { + /*int damage=stack.getItemDamage(); + if(damage>=1&&damage<=15){ + return StatCollector.translateToLocalFormatted("item.proghatches.part.eu.source.superconduct.name",GTValues.VN[damage-1]); + } + if(damage>=16&&damage<=30){ + return StatCollector.translateToLocalFormatted("item.proghatches.part.eu.source.normal.name",GTValues.VN[damage-16]); + } */ + return super.getItemStackDisplayName(stack); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, + float xOffset, float yOffset, float zOffset) { + return AEApi.instance().partHelper().placeBus(player.getHeldItem(), x, y, z, side, player, world); + } + + /* + * public ItemPartEUSource register() { //if (!Config.fluidIOBus) return + * null; GameRegistry.registerItem(this, NameConst.ITEM_PART_FLUID_EXPORT, + * FluidCraft.MODID); //setCreativeTab(FluidCraftingTabs.INSTANCE); return + * this; } + */ + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IIconRegister register) { + + this.icon = register.registerIcon("proghatches:tunnel_back"); + } + @SideOnly(Side.CLIENT) + @Override + public IIcon getIconFromDamage(int dmg) { + return icon; + } + /* +@Override +public IIcon getIconIndex(ItemStack p_77650_1_) { + + return PartEUSource.a; +}*/ + @Override + @SideOnly(Side.CLIENT) + public int getSpriteNumber() { + return 0; + } +@SideOnly(value=Side.CLIENT) +@Override +public void addInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List p_77624_3_, boolean p_77624_4_) { + //p_77624_3_.add(StatCollector.translateToLocal("item.proghatches.part.ma.p2p.tooltips.0")); + //p_77624_3_.add(StatCollector.translateToLocal("item.proghatches.part.ma.p2p.tooltips.1")); + //p_77624_3_.add(StatCollector.translateToLocal("item.proghatches.part.ma.p2p.tooltips.2")); + // + super.addInformation(p_77624_1_, p_77624_2_, p_77624_3_, p_77624_4_); +} + +} diff --git a/src/main/java/reobf/proghatches/ae/part2/PartRequestTunnel.java b/src/main/java/reobf/proghatches/ae/part2/PartRequestTunnel.java new file mode 100644 index 0000000..3e28d5d --- /dev/null +++ b/src/main/java/reobf/proghatches/ae/part2/PartRequestTunnel.java @@ -0,0 +1,482 @@ +package reobf.proghatches.ae.part2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.NavigableMap; +import java.util.TreeMap; + +import com.glodblock.github.util.BlockPos; + +import appeng.api.AEApi; +import appeng.api.implementations.tiles.ICraftingMachine; +import appeng.api.networking.IGridNode; +import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; +import appeng.api.networking.ticking.IGridTickable; +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.IPartRenderHelper; +import appeng.api.storage.IExternalStorageHandler; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.api.util.AECableType; +import appeng.client.texture.CableBusTextures; +import appeng.integration.modules.waila.part.IPartWailaDataProvider; +import appeng.me.helpers.AENetworkProxy; +import appeng.parts.PartBasicState; +import appeng.util.Platform; +import appeng.util.item.AEItemStack; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; +import reobf.proghatches.ae.TileRequestTunnel; +import reobf.proghatches.fmp.ICraftingMachinePart; + +public class PartRequestTunnel extends PartBasicState implements ICraftingMachinePart,ISidedInventory,IFluidHandler,IGridTickable{ + + public static class WailaDataProvider implements IPartWailaDataProvider { + + @Override + public ItemStack getWailaStack(IPart part, IWailaConfigHandler config, ItemStack partStack) { + // TODO Auto-generated method stub + return null; + } + + @Override + public List getWailaHead(IPart part, List currentToolTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + // TODO Auto-generated method stub + return null; + } + + @Override + public List getWailaBody(IPart part, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + try{ + /*if( accessor.getSide()==((TileRequestTunnel)accessor.getTileEntity()).getUp().getOpposite()){ + + currenttip.add("Auto-output to this side"); + + }; + */ + + + + NBTTagCompound data = accessor.getNBTData(); + + ArrayList cacheR=new ArrayList<>(); + { NBTTagList t= (NBTTagList) data.getTag("cacheR"); + for(int i=0;i cacheFR=new ArrayList<>(); + { NBTTagList t= (NBTTagList) data.getTag("cacheFR"); + for(int i=0;i ret=currenttip; + + + + if(cacheR.isEmpty()==false||cacheFR.isEmpty()==false) + ret.add("Sending:"); + + cacheR.forEach(s->{ + + ret.add(""+s.getDisplayName()+" x"+s.stackSize); + + }); + + cacheFR.forEach(s->{ + + ret.add(""+s.getFluid().getLocalizedName(s)+" x"+s.amount+"mB"); + + }); + NavigableMap waiting=new TreeMap<>(); + NBTTagList t= (NBTTagList) data.getTag("waiting"); + for(int i=0;i{ + + ret.add(""+s.getKey().getDisplayName()+" x"+s.getValue()); + + + }); + + + + + return ret;}catch(Exception e){e.printStackTrace();} + return currenttip; + } + + @Override + public List getWailaTail(IPart part, List currentToolTip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + // TODO Auto-generated method stub + return null; + } + + @Override + public NBTTagCompound getNBTData(EntityPlayerMP player, IPart part, TileEntity te, NBTTagCompound data, + World world, int x, int y, int z) { + PartRequestTunnel thiz= (PartRequestTunnel) part; + { + NBTTagList listR=new NBTTagList(); + thiz.internal. cacheR.stream().map(s-> + s.writeToNBT(new NBTTagCompound()) + ).forEach(s->listR.appendTag(s)); + data.setTag("cacheR", listR); + NBTTagList listFR=new NBTTagList(); + thiz.internal. cacheFR.stream().map(s-> + s.writeToNBT(new NBTTagCompound()) + ).forEach(s->listFR.appendTag(s)); + data.setTag("cacheFR", listFR); + } + NBTTagList listR=new NBTTagList(); + thiz.internal.waiting.entrySet().stream().map(s-> + { + NBTTagCompound t=new NBTTagCompound(); + NBTTagCompound k=new NBTTagCompound(); + s.getKey().writeToNBT(k); + t.setTag("key", k); + t.setLong("value", s.getValue()); + + return t; + } + ).forEach(s->listR.appendTag(s)) ; + data.setTag("waiting", listR);; + return data; + } + + } + public PartRequestTunnel(ItemStack is) { + super(is); + + } + RequestTunnel internal=new RequestTunnel(){ + public PartRequestTunnel getThis(){ + return PartRequestTunnel.this; + } + @Override + public IGridNode getActionableNode() { + // TODO Auto-generated method stub + return getThis().getActionableNode(); + } + + @Override + public IGridNode getGridNode(ForgeDirection dir) { + + return getThis().getGridNode(dir); + } + + @Override + public AECableType getCableConnectionType(ForgeDirection dir) { + // TODO Auto-generated method stub + return getThis().getCableConnectionType(dir); + } + + @Override + public void securityBreak() { + getThis().securityBreak(); + + } + + @Override + public void markDirty() { + getThis().markDirty(); + + } + + @Override + public IMEInventory getInv(StorageChannel ch) { + // TODO Auto-generated method stub + return getThis().getInv( ch); + } + + @Override + public AENetworkProxy getProxy() { + // TODO Auto-generated method stub + return getThis().getProxy(); + } + + @Override + public World getWorldObj() { + // TODO Auto-generated method stub + return getThis().getHost().getTile().getWorldObj(); + }}; + + @Override + public boolean pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table, + ForgeDirection ejectionDirection) { + + return internal.pushPattern(patternDetails, table, ejectionDirection); + } + + + HashMap inv=new HashMap(); + HashMap handlerHash=new HashMap(); + private BaseActionSource source=new MachineSource(this); + + protected IMEInventory getInv(StorageChannel ch) { + if(getSide()==ForgeDirection.UNKNOWN)return null; + final TileEntity self = this.getTile(); + final TileEntity target = new BlockPos(self).getOffSet(this.getSide()).getTileEntity(); + + final int newHandlerHash = Platform.generateTileHash(target); + if (newHandlerHash != 0 && newHandlerHash == this.handlerHash.getOrDefault(ch, 0)) { + return this.inv.get(ch); + } + + final IExternalStorageHandler esh = AEApi.instance().registries().externalStorage() + .getHandler(target, this.getSide().getOpposite(), ch, this.source); + if (esh != null) { + final IMEInventory inv = esh + .getInventory(target, this.getSide().getOpposite(), ch, this.source); + this.inv.put(ch,inv); + handlerHash.put(ch, newHandlerHash); + return inv; + }else{ + + handlerHash.put(ch, 0); + } + return null; + } + + public void markDirty() { + + + } + + @Override + public boolean acceptsPlans(ForgeDirection ejectionDirection) { + + return true; + } + // + @Override + public int getSizeInventory() { + + return internal.getSizeInventory(); + } + @Override + public ItemStack getStackInSlot(int slotIn) { + + return internal.getStackInSlot(slotIn); + } + @Override + public ItemStack decrStackSize(int index, int count) { + return internal.decrStackSize(index, count); + } + @Override + public ItemStack getStackInSlotOnClosing(int index) { + return null; + } + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + internal.setInventorySlotContents(index, stack); + + + } + @Override + public String getInventoryName() { + + return ""; + } + @Override + public boolean hasCustomInventoryName() { + + return false; + } + @Override + public int getInventoryStackLimit() { + + return Integer.MAX_VALUE; + } + @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 internal.isItemValidForSlot(index, stack); + } + @Override + public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + return internal.getAccessibleSlotsFromSide(p_94128_1_); + } + @Override + public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { + + return internal.canInsertItem(p_102007_1_, p_102007_2_, p_102007_3_); + } + @Override + public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { + + return internal.canExtractItem(p_102008_1_, p_102008_2_, p_102008_3_); + } + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + + return internal.fill(from, resource, doFill); + } + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + + return internal.drain(from, resource, doDrain); + } + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + + return internal.drain(from, maxDrain, doDrain); + } + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + + return internal.canFill(from, fluid); + } + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + + return internal.canDrain(from, fluid); + } + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + + return internal.getTankInfo(from); + } + + + + @Override + public TickingRequest getTickingRequest(IGridNode node) { + + return new TickingRequest(1, 1, false, false); + } + + + + @Override + public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall) { + internal.update(); + return TickRateModulation.SAME; + } +// + + @Override + public void readFromNBT(NBTTagCompound data) { + internal.readFromNBT_AENetworkX(data); + super.readFromNBT(data); + } + @Override + public void writeToNBT(NBTTagCompound data) { + internal.writeToNBT_AENetworkX(data); + super.writeToNBT(data); + } + @Override + public void getBoxes(final IPartCollisionHelper bch) { + bch.addBox(2, 2, 14, 14, 14, 16); + bch.addBox(5, 5, 12, 11, 11, 14); + } @Override + @SideOnly(Side.CLIENT) + public void renderInventory(final IPartRenderHelper rh, final RenderBlocks renderer) { + rh.setTexture( + CableBusTextures.PartMonitorSides.getIcon(), + CableBusTextures.PartMonitorSides.getIcon(), + CableBusTextures.PartMonitorBack.getIcon(), + this.getItemStack().getIconIndex(), + CableBusTextures.PartMonitorSides.getIcon(), + CableBusTextures.PartMonitorSides.getIcon()); + + rh.setBounds(2, 2, 14, 14, 14, 16); + rh.renderInventoryBox(renderer); + + rh.setBounds(5, 5, 12, 11, 11, 13); + rh.renderInventoryBox(renderer); + + rh.setBounds(5, 5, 13, 11, 11, 14); + rh.renderInventoryBox(renderer); + } @Override + @SideOnly(Side.CLIENT) + public void renderStatic(final int x, final int y, final int z, final IPartRenderHelper rh, + final RenderBlocks renderer) { + this.setRenderCache(rh.useSimplifiedRendering(x, y, z, this, this.getRenderCache())); + rh.setTexture( + CableBusTextures.PartMonitorSides.getIcon(), + CableBusTextures.PartMonitorSides.getIcon(), + CableBusTextures.PartMonitorBack.getIcon(), + this.getItemStack().getIconIndex(), + CableBusTextures.PartMonitorSides.getIcon(), + CableBusTextures.PartMonitorSides.getIcon()); + + rh.setBounds(2, 2, 14, 14, 14, 16); + rh.renderBlock(x, y, z, renderer); + + rh.setTexture( + CableBusTextures.PartMonitorSides.getIcon(), + CableBusTextures.PartMonitorSides.getIcon(), + CableBusTextures.PartMonitorBack.getIcon(), + this.getItemStack().getIconIndex(), + CableBusTextures.PartMonitorSides.getIcon(), + CableBusTextures.PartMonitorSides.getIcon()); + + rh.setBounds(5, 5, 12, 11, 11, 13); + rh.renderBlock(x, y, z, renderer); + + rh.setTexture( + CableBusTextures.PartMonitorSidesStatus.getIcon(), + CableBusTextures.PartMonitorSidesStatus.getIcon(), + CableBusTextures.PartMonitorBack.getIcon(), + this.getItemStack().getIconIndex(), + CableBusTextures.PartMonitorSidesStatus.getIcon(), + CableBusTextures.PartMonitorSidesStatus.getIcon()); + + rh.setBounds(5, 5, 13, 11, 11, 14); + rh.renderBlock(x, y, z, renderer); + + //this.renderLights(x, y, z, rh, renderer); + } + + +} diff --git a/src/main/java/reobf/proghatches/ae/part2/RequestTunnel.java b/src/main/java/reobf/proghatches/ae/part2/RequestTunnel.java new file mode 100644 index 0000000..f4033d2 --- /dev/null +++ b/src/main/java/reobf/proghatches/ae/part2/RequestTunnel.java @@ -0,0 +1,708 @@ +package reobf.proghatches.ae.part2; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.NavigableMap; +import java.util.TreeMap; +import java.util.concurrent.Future; +import java.util.stream.IntStream; + +import org.apache.commons.io.output.NullOutputStream; + +import com.glodblock.github.common.item.ItemFluidDrop; +import com.glodblock.github.common.item.ItemFluidPacket; +import com.glodblock.github.inventory.FluidConvertingInventoryAdaptor; +import com.glodblock.github.util.BlockPos; +import com.glodblock.github.util.Util; +import com.google.common.collect.ImmutableSet; + +import appeng.api.AEApi; +import appeng.api.config.Actionable; +import appeng.api.implementations.ICraftingPatternItem; +import appeng.api.implementations.tiles.ICraftingMachine; +import appeng.api.networking.GridFlags; +import appeng.api.networking.IGridHost; +import appeng.api.networking.IGridNode; +import appeng.api.networking.crafting.ICraftingJob; +import appeng.api.networking.crafting.ICraftingLink; +import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.networking.crafting.ICraftingRequester; +import appeng.api.networking.security.BaseActionSource; +import appeng.api.networking.security.MachineSource; +import appeng.api.storage.IExternalStorageHandler; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.util.AECableType; +import appeng.api.util.IOrientable; +import appeng.crafting.CraftingLink; +import appeng.me.GridAccessException; +import appeng.me.cluster.implementations.CraftingCPUCluster; +import appeng.me.helpers.AENetworkProxy; +import appeng.tile.TileEvent; +import appeng.tile.events.TileEventType; +import appeng.tile.grid.AENetworkTile; +import appeng.util.InventoryAdaptor; +import appeng.util.Platform; +import appeng.util.item.AEFluidStack; +import appeng.util.item.AEItemStack; +import gregtech.api.util.GTUtility; +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import mcp.mobius.waila.api.IWailaDataProvider; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; + +public abstract class RequestTunnel implements ICraftingMachine,ICraftingRequester +,ISidedInventory,IFluidHandler +{ + + public RequestTunnel() { + + } + public ArrayList cache=new ArrayList<>(); + public ArrayList cacheF=new ArrayList<>(); + public HashMap waiting=new HashMap<>(); + public ArrayList cacheR=new ArrayList<>(); + public ArrayList cacheFR=new ArrayList<>(); + @Override + public boolean pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table, + ForgeDirection ejectionDirection) { + for(int i=0;i + s.writeToNBT(new NBTTagCompound()) + ).forEach(s->list.appendTag(s)); + data.setTag("cache", list); + NBTTagList listF=new NBTTagList(); + cacheF.stream().map(s-> + s.writeToNBT(new NBTTagCompound()) + ).forEach(s->listF.appendTag(s)); + data.setTag("cacheF", listF); + { + NBTTagList listR=new NBTTagList(); + cacheR.stream().map(s-> + s.writeToNBT(new NBTTagCompound()) + ).forEach(s->listR.appendTag(s)); + data.setTag("cacheR", listR); + NBTTagList listFR=new NBTTagList(); + cacheFR.stream().map(s-> + s.writeToNBT(new NBTTagCompound()) + ).forEach(s->listFR.appendTag(s)); + data.setTag("cacheFR", listFR); + } + + + + + + NBTTagList listR=new NBTTagList(); + waiting.entrySet().stream().map(s-> + { + NBTTagCompound t=new NBTTagCompound(); + NBTTagCompound k=new NBTTagCompound(); + s.getKey().writeToNBT(k); + t.setTag("key", k); + t.setLong("value", s.getValue()); + + return t; + } + ).forEach(s->listR.appendTag(s)); + data.setTag("waiting", listR); + if(last!=null){ + NBTTagCompound tag=new NBTTagCompound(); + last.writeToNBT(tag); + data.setTag("link", tag); + } + + } + + + + + private void dump(){ + try { + IMEMonitor i = getProxy().getStorage().getItemInventory(); + cache.removeIf(s->{ + IAEItemStack left = i.injectItems(AEItemStack.create(s), Actionable.MODULATE, new MachineSource(this)); + if(left==null||left.getStackSize()<=0){return true;} + s.stackSize=(int) left.getStackSize(); + return false; + }); + } catch (GridAccessException e) { + + } + + try { + IMEMonitor i = getProxy().getStorage().getFluidInventory(); + cacheF.removeIf(s->{ + IAEFluidStack left = i.injectItems(AEFluidStack.create(s), Actionable.MODULATE, new MachineSource(this)); + if(left==null||left.getStackSize()<=0){return true;} + s.amount=(int) left.getStackSize(); + return false; + }); + } catch (GridAccessException e) { + + } + + } + + + + + + + @Override + public boolean acceptsPlans() { + + return true; + } + + ICraftingLink last; + @Override + public ImmutableSet getRequestedJobs() { + return last==null?ImmutableSet.of():ImmutableSet.of(last); + } + @Override + public IAEItemStack injectCraftedItems(ICraftingLink link, IAEItemStack items, Actionable mode) { + if(mode==Actionable.SIMULATE){ + + return null; + } + /*Long l=waiting.get(items); + if(l!=null){ + long todo=Math.min(l, items.getStackSize()); + IAEItemStack t = items.copy().setStackSize(todo); + t=complete(t); + todo=todo-((t==null)?0:t.getStackSize()); + waiting.put((AEItemStack) items, l-todo); + items.decStackSize(todo); + if(l-todo<=0){ + waiting.remove(items); + } + if(items.getStackSize()<=0)items=null; + + + }*/ + AEItemStack left=null; + + Long get = waiting.get((items)); + if(get!=null){ + long tmp; + waiting.put((AEItemStack) items,tmp=Math.max(0,get-items.getStackSize())); + if(tmp<=0)waiting.remove(items); + + if((this.mode&1)!=0){ + if(get inv=new HashMap(); + HashMap handlerHash=new HashMap(); + public ItemStack[] mark=new ItemStack[1]; + private BaseActionSource source=new MachineSource(this); + + + ForgeDirection prevDir; +public abstract IMEInventory getInv(StorageChannel ch); + +/* @SuppressWarnings("unchecked") + public IAEItemStack complete(IAEItemStack todo){ + + try{ + todo=(IAEItemStack) getInv(StorageChannel.ITEMS).injectItems(todo, Actionable.MODULATE, source); + + }catch(NullPointerException e){} + + + return todo; + } + */ + + + + @Override + public void jobStateChange(ICraftingLink link) { + + + } + int cd; + int tick; + Future job; + + + + //@TileEvent(TileEventType.TICK) + public void update(){tick++; + if(getWorldObj().isRemote)return; + + if(dirty){ + dirty=false; + cacheR.removeIf(s->s.stackSize<=0); + } + if(dirtyF){ + dirtyF=false; + cacheFR.removeIf(s->s.amount<=0); + } + boolean clear=false; + + IMEInventory ch = getInv(StorageChannel.ITEMS); + if(ch!=null) + for(ItemStack todo:cacheR){ + AEItemStack itodo=(AEItemStack)ch .injectItems(AEItemStack.create(todo), Actionable.MODULATE, source); + todo.stackSize=(int) (itodo==null?0:itodo.getStackSize()); + if(todo.stackSize==0)clear=true; + } + if(clear)cacheR.removeIf(s->s.stackSize==0); + + ch = getInv(StorageChannel.FLUIDS); + clear=false; + if(ch!=null) + for(FluidStack todo:cacheFR){ + AEFluidStack itodo=(AEFluidStack) getInv(StorageChannel.FLUIDS).injectItems(AEFluidStack.create(todo), Actionable.MODULATE, source); + todo.amount=(int) (itodo==null?0:itodo.getStackSize()); + if(todo.amount==0)clear=true; + } + if(clear)cacheFR.removeIf(s->s.amount==0); + + + + + + IAEItemStack req = null; + + if(waiting.isEmpty()==false){ + + + + if((mode&2)==0||last==null) + useExisting(); + } + if(this.tick%40==2){ + + fillStacksIntoFirstSlots(cacheR); + fillStacksIntoFirstSlotsF(cacheFR); + fillStacksIntoFirstSlots(cache); + fillStacksIntoFirstSlotsF(cacheF); + + } + if(waiting.isEmpty()==false&&job==null){ + Entry ent = waiting.entrySet().iterator().next(); + req= ent.getKey().copy().setStackSize(ent.getValue()); + } + + + + + + + + + try{ + if(last!=null){ + if(last.isDone()||last.isCanceled()){ + last=null; + + } + } + if(last==null){ + if(job==null){ + if(req!=null){ + if(cd--<=0){ + job = getProxy().getCrafting().beginCraftingJob(getWorldObj(), getProxy().getGrid(), new MachineSource(this), req, null); + cd=40; + }} + } + else if(job.isDone()&&!job.isCancelled()){ + last=getProxy().getCrafting().submitJob(job.get(), this, null, true, new MachineSource(this)); + job=null; + }else if(job.isCancelled()){last=null;} + + }else{ + + + } + }catch(Exception e){} + + + } + + + protected void fillStacksIntoFirstSlotsF( ArrayList mInventory) { + final int L = mInventory.size(); + HashMap slots = new HashMap<>(L); + HashMap stacks = new HashMap<>(L); + List order = new ArrayList<>(L); + List validSlots = new ArrayList<>(L); + for (int i = 0; i < L; i++) { + + validSlots.add(i); + FluidStack s = mInventory.get(i); + if (s == null) continue; + Fluid sID =s.getFluid(); + slots.merge(sID, s.amount, Integer::sum); + if (!stacks.containsKey(sID)) stacks.put(sID, s); + order.add(sID); + mInventory.set(i, null); + } + int slotindex = 0; + for (Fluid sID : order) { + int toSet = slots.get(sID); + if (toSet == 0) continue; + int slot = validSlots.get(slotindex); + slotindex++; + mInventory.set( slot,stacks.get(sID).copy()) + ; + // toSet = Math.min(toSet, mInventory[slot].getMaxStackSize()); + mInventory.get(slot).amount = toSet; + slots.merge(sID, toSet, (a, b) -> a - b); + } + while(mInventory.size()>=1&&mInventory.get(mInventory.size()-1)==null){ + mInventory.remove(mInventory.size()-1); + } + + } + protected void fillStacksIntoFirstSlots( ArrayList mInventory) { + final int L = mInventory.size() ; + HashMap slots = new HashMap<>(L); + HashMap stacks = new HashMap<>(L); + List order = new ArrayList<>(L); + List validSlots = new ArrayList<>(L); + for (int i = 0; i < L; i++) { + + validSlots.add(i); + ItemStack s = mInventory.get(i); + if (s == null) continue; + GTUtility.ItemId sID = GTUtility.ItemId.createNoCopy(s); + slots.merge(sID, s.stackSize, Integer::sum); + if (!stacks.containsKey(sID)) stacks.put(sID, s); + order.add(sID); + mInventory.set(i, null); + } + int slotindex = 0; + for (GTUtility.ItemId sID : order) { + int toSet = slots.get(sID); + if (toSet == 0) continue; + int slot = validSlots.get(slotindex); + slotindex++; + mInventory.set( slot,stacks.get(sID).copy()) + ; + // toSet = Math.min(toSet, mInventory[slot].getMaxStackSize()); + mInventory.get(slot).stackSize = toSet; + slots.merge(sID, toSet, (a, b) -> a - b); + } + while(mInventory.size()>=1&&mInventory.get(mInventory.size()-1)==null){ + mInventory.remove(mInventory.size()-1); + } + + } + + int mode; + private void useExisting() { + for(Iterator> itr = waiting.entrySet().iterator();itr.hasNext();){ + + Entry e=itr.next(); + if(e.getValue()<=0){itr.remove();continue;} + + IAEItemStack val = e.getKey().copy().setStackSize(e.getValue()); + + if(val.getItem() instanceof ItemFluidDrop) + try { + IAEFluidStack ext = getProxy().getStorage().getFluidInventory().extractItems(ItemFluidDrop.getAeFluidStack(val), Actionable.MODULATE, source); + if(ext!=null){ + e.setValue(e.getValue()-ext.getStackSize()); + cacheFR.add(ext.copy().getFluidStack()); + if(e.getValue()<=0){itr.remove();} + } + + } catch (GridAccessException e1) { + } + + + else + try { + IAEItemStack ext = getProxy().getStorage().getItemInventory().extractItems(val, Actionable.MODULATE, source); + if(ext!=null){ + e.setValue(e.getValue()-ext.getStackSize()); + cacheR.add(ext.copy().getItemStack()); + if(e.getValue()<=0){itr.remove();} + } + + } catch (GridAccessException e1) { + } + + + + + } + + + + + + } + + + + + @Override + public int getSizeInventory() { + + return cacheR.size()+1; + } + @Override + public ItemStack getStackInSlot(int slotIn) { + if(slotIn==cacheR.size())return null; + dirty=true; + return cacheR.get(slotIn); + } + @Override + public ItemStack decrStackSize(int index, int count) { + if(index==cacheR.size())return null; + dirty=true; + if(cacheR.get(index)==null){return null;} + cacheR.get(index).stackSize-=count; + ItemStack ret = cacheR.get(index).copy(); + ret.stackSize=count; + return ret; + } + @Override + public ItemStack getStackInSlotOnClosing(int index) { + return null; + } + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + if(index==cacheR.size())return ; + dirty=true; + if(stack==null||stack.stackSize==0){ + cacheR.get(index).stackSize=0; + }else{ + cacheR.set(index,stack); + } + + + } + @Override + public String getInventoryName() { + + return ""; + } + @Override + public boolean hasCustomInventoryName() { + + return false; + } + @Override + public int getInventoryStackLimit() { + + return Integer.MAX_VALUE; + } + @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 false; + } + @Override + public int[] getAccessibleSlotsFromSide(int p_94128_1_) { + // ForgeDirection pointAt =getUp().getOpposite(); + //if(pointAt.ordinal()==p_94128_1_){ + return IntStream.range(0, cacheR.size()+1).toArray(); +//} + // return new int[0]; + } + @Override + public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { + + return false; + } + @Override + public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { + + return true; + } + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + + return 0; + } + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + int all=cacheFR.stream().filter(s->s.getFluid()==resource.getFluid()) + .mapToInt(s->s.amount).sum(); + if(doDrain){ + dirtyF=true; + int[] todo=new int[]{all}; + cacheFR.stream().filter(s->s.getFluid()==resource.getFluid()).forEach(s->{ + int real=Math.min(todo[0], s.amount); + s.amount-=real; + todo[0]-=real; + }); + + } + + FluidStack cp = resource.copy(); + cp.amount=all; + if(cp.amount==0)cp=null; + return cp; + } + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + if(cacheFR.size()==0){return null;} + FluidStack cp = cacheFR.get(0).copy(); + cp.amount=maxDrain; + return drain(from,cp , doDrain); + } + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + + return false; + } + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + + return true; + } + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + + return cacheFR.stream().map(s->new FluidTank(s, 1)).toArray(FluidTankInfo[]::new); + } + boolean dirty,dirtyF; + + public abstract AENetworkProxy getProxy(); + public abstract World getWorldObj(); + +} diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/ProgrammingCircuitProviderPrefabricated.java b/src/main/java/reobf/proghatches/gt/metatileentity/ProgrammingCircuitProviderPrefabricated.java index 20af90e..4533669 100644 --- a/src/main/java/reobf/proghatches/gt/metatileentity/ProgrammingCircuitProviderPrefabricated.java +++ b/src/main/java/reobf/proghatches/gt/metatileentity/ProgrammingCircuitProviderPrefabricated.java @@ -29,6 +29,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; import reobf.proghatches.block.BlockIOHub; import reobf.proghatches.gt.metatileentity.util.ICircuitProvider; import reobf.proghatches.item.ItemProgrammingCircuit; @@ -226,10 +227,13 @@ static void init(){ } for(Werkstoff mat:Werkstoff.werkstoffHashSet){ - ItemStack opt= WerkstoffLoader.getCorrespondingItemStackUnsafe(OrePrefixes.lens, mat, i); - if(opt!=null)is.add(opt); + + ItemStack opt= WerkstoffLoader.getCorrespondingItemStackUnsafe(OrePrefixes.lens, mat, 1); + if(opt!=null&& + OreDictionary.getOreIDs(opt).length>0 + )is.add(opt); } - System.out.println(is);System.out.println("TTTTTTTTTTTTT"); + //System.out.println(is);System.out.println("TTTTTTTTTTTTT"); reg(5,is); diff --git a/src/main/java/reobf/proghatches/item/DummySuper2.java b/src/main/java/reobf/proghatches/item/DummySuper2.java new file mode 100644 index 0000000..85ba240 --- /dev/null +++ b/src/main/java/reobf/proghatches/item/DummySuper2.java @@ -0,0 +1,23 @@ +package reobf.proghatches.item; + +import java.util.List; + +import com.google.common.base.Optional; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class DummySuper2 extends Item{ + + public DummySuper2() { + + } + + protected void addCheckedInformation(ItemStack p_77624_1_, EntityPlayer p_77624_2_, List p_77624_3_, + boolean p_77624_4_) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/reobf/proghatches/main/CommonProxy.java b/src/main/java/reobf/proghatches/main/CommonProxy.java index 055a9ac..659b426 100644 --- a/src/main/java/reobf/proghatches/main/CommonProxy.java +++ b/src/main/java/reobf/proghatches/main/CommonProxy.java @@ -43,6 +43,7 @@ import reobf.proghatches.ae.TileRequestTunnel; import reobf.proghatches.ae.TileStockingCircuitRequestInterceptor; import reobf.proghatches.ae.TileStorageProxy; +import reobf.proghatches.ae.part2.ItemPartRequestTunnel; import reobf.proghatches.block.BlockAnchorAlert; import reobf.proghatches.block.BlockIOHub; import reobf.proghatches.block.BlockReactorSyncer; @@ -202,6 +203,8 @@ public void preInit(FMLPreInitializationEvent event) { .setUnlocalizedName("proghatches.part.lazer.p2p").setTextureName("?"), "proghatches.part.lazer.p2p"); GameRegistry.registerItem(MyMod.ma_p2p_part = new ItemPartMAP2P() .setUnlocalizedName("proghatches.part.ma.p2p").setTextureName("?"), "proghatches.part.ma.p2p"); + GameRegistry.registerItem(MyMod.part_tunnel = new ItemPartRequestTunnel() + .setUnlocalizedName("proghatches.part.tunnel").setTextureName("?"), "proghatches.part.tunnel"); GameRegistry .registerItem( diff --git a/src/main/java/reobf/proghatches/main/MyMod.java b/src/main/java/reobf/proghatches/main/MyMod.java index 2903226..4f78015 100644 --- a/src/main/java/reobf/proghatches/main/MyMod.java +++ b/src/main/java/reobf/proghatches/main/MyMod.java @@ -812,6 +812,7 @@ public void init(Entity entity, World world) { public static BlockRequestTunnel request_tunnel; public static Item emitterpattern; public static boolean newGTCache; + public static Item part_tunnel; @SubscribeEvent(priority = EventPriority.HIGH, receiveCanceled = false) public void pretick(final TickEvent.ServerTickEvent event) { diff --git a/src/main/java/reobf/proghatches/main/asm/AEItemTransformer2.java b/src/main/java/reobf/proghatches/main/asm/AEItemTransformer2.java new file mode 100644 index 0000000..b258fb7 --- /dev/null +++ b/src/main/java/reobf/proghatches/main/asm/AEItemTransformer2.java @@ -0,0 +1,58 @@ +package reobf.proghatches.main.asm; + + + + + +import java.io.File; +import java.io.FileOutputStream; + + + + +import net.minecraft.launchwrapper.IClassTransformer; +import reobf.proghatches.main.asm.repack.objectwebasm.ClassReader; +import reobf.proghatches.main.asm.repack.objectwebasm.ClassWriter; + +public class AEItemTransformer2 implements IClassTransformer { + boolean done; + + @SuppressWarnings("unused") + @Override + public byte[] transform(String name, String transformedName, byte[] basicClass) { + + if ((!done) && name.equals("reobf.proghatches.ae.ItemEmitterPattern")) { + done = true; + + + + //asm for java17 is not working(for me)! + //so I packed one copy of asm for java8 + ClassReader cr = null; + cr = new ClassReader(basicClass); + cr.getSuperName(); + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) { + + + @Override + public int newUTF8(String value) { + + if (value.contains("reobf/proghatches/item/DummySuper2")) { + return super.newUTF8(value.replace( + "reobf/proghatches/item/DummySuper2", + + "appeng/items/misc/ItemEncodedPattern")); + } + return super.newUTF8(value); + } + + }; + + cr.accept(cw, 0); + + return cw.toByteArray(); + + } + return basicClass; + } +} diff --git a/src/main/java/reobf/proghatches/main/asm/FMLPlugin.java b/src/main/java/reobf/proghatches/main/asm/FMLPlugin.java index 6398837..f043a7b 100644 --- a/src/main/java/reobf/proghatches/main/asm/FMLPlugin.java +++ b/src/main/java/reobf/proghatches/main/asm/FMLPlugin.java @@ -18,6 +18,7 @@ public String[] getASMTransformerClass() { return new String[] { EUInterfaceTransformer.class.getName() , AEItemTransformer.class.getName() , + AEItemTransformer2.class.getName() , MUITransformer.class.getName(), DataCopyableTransformer.class.getName(), MFUTransformer.class.getName() diff --git a/src/main/java/reobf/proghatches/main/mixin/mixins/eucrafting/MixinWailaProvider.java b/src/main/java/reobf/proghatches/main/mixin/mixins/eucrafting/MixinWailaProvider.java index 2de0d6b..51ce707 100644 --- a/src/main/java/reobf/proghatches/main/mixin/mixins/eucrafting/MixinWailaProvider.java +++ b/src/main/java/reobf/proghatches/main/mixin/mixins/eucrafting/MixinWailaProvider.java @@ -10,6 +10,7 @@ import appeng.integration.modules.waila.PartWailaDataProvider; import appeng.integration.modules.waila.part.IPartWailaDataProvider; +import reobf.proghatches.ae.part2.PartRequestTunnel; import reobf.proghatches.eucrafting.PartEUP2PInterface; import reobf.proghatches.eucrafting.PartEUSource; @@ -23,6 +24,8 @@ public void constructor(CallbackInfo a) { providers.add(new PartEUP2PInterface.WailaDataProvider()); providers.add(new PartEUSource.WailaDataProvider()); + providers.add(new PartRequestTunnel.WailaDataProvider()); + } } diff --git a/src/main/java/reobf/proghatches/main/registration/PHRecipes.java b/src/main/java/reobf/proghatches/main/registration/PHRecipes.java index 33b27c1..2e2cacc 100644 --- a/src/main/java/reobf/proghatches/main/registration/PHRecipes.java +++ b/src/main/java/reobf/proghatches/main/registration/PHRecipes.java @@ -2024,6 +2024,21 @@ bb,new ItemStack(MyMod.smartarm, 4,i+5) .duration(1 * SECONDS) .eut(30) .addTo(RecipeMaps.assemblerRecipes); + + + IRecipe recx = new ShapedOreRecipe(new ItemStack(MyMod.part_tunnel,1,0),"C",'C', + new ItemStack(MyMod.request_tunnel,1,0) + ); + CraftingManager.getInstance().getRecipeList().add(recx); + recx = new ShapedOreRecipe(new ItemStack(MyMod.request_tunnel,1,0),"C",'C', + new ItemStack(MyMod.part_tunnel,1,0) + ); + CraftingManager.getInstance().getRecipeList().add(recx); + + + + + /* rec = new ShapelessOreRecipe( new ItemStack( MyMod.plunger,1,1), ItemEnum.BOOSTER_CARD.getStack(0), new ItemStack( MyMod.plunger) diff --git a/src/main/resources/assets/proghatches/lang/en_US.lang b/src/main/resources/assets/proghatches/lang/en_US.lang index 4930482..abc68f9 100644 --- a/src/main/resources/assets/proghatches/lang/en_US.lang +++ b/src/main/resources/assets/proghatches/lang/en_US.lang @@ -739,9 +739,10 @@ proghatch.request_tunnel.tooltip.1=When accepting patterns, it stores inputs int proghatch.request_tunnel.tooltip.2=Outputs will be cached in inventory, use pipes to send them back, or use wrench to specify the auto-output direction. proghatch.request_tunnel.tooltip.3=Please use ME Interface (even if pattern contains fluids), ME Dual Interface does not work fine! programmable_hatches.gt.newcrib.0=Compatibility for new GT recipe cahces -programmable_hatches.gt.newcrib.1=When on, GT Multi will cache possible recipes of a buffer thus might search recipe from this hatch faster. When off, no bad things will happen. -programmable_hatches.gt.newcrib.2=Do not work well with Stocking Upgrades. -programmable_hatches.gt.newcrib.3=Once GT Multi cache the recipe, it will not update. So when stocking changes, GT Multi might not recognize it. -programmable_hatches.gt.newcrib.4=Turning off this mode will clear all the caches. -programmable_hatches.gt.newcrib.5=When merge mode(the button on left side) is on, this mode is ignored. +programmable_hatches.gt.newcrib.1=When on, GT Multi will cache possible recipes of a buffer thus might search recipe from this hatch faster. +programmable_hatches.gt.newcrib.2=GT Multi only caches once for each buffer, then never updates it. +programmable_hatches.gt.newcrib.3=So if you're using a Stocking Upgrade, cached recipes will not change when stocking amount changes. +programmable_hatches.gt.newcrib.4=Turning off this mode will clear all the caches (can be used to force-update the cache recipes). +programmable_hatches.gt.newcrib.5=When off, GT Multi is not allowed to cache recipes for this hatch. programmable_hatches.gt.newcrib.nosupport=§cNot supported on current GT5u +item.proghatches.part.tunnel.name=Crafting Request Tunnel diff --git a/src/main/resources/assets/proghatches/lang/en_US/DIBME.lang b/src/main/resources/assets/proghatches/lang/en_US/DIBME.lang index 75e42f8..301cffe 100644 --- a/src/main/resources/assets/proghatches/lang/en_US/DIBME.lang +++ b/src/main/resources/assets/proghatches/lang/en_US/DIBME.lang @@ -1,26 +1,20 @@ Item Input for Multiblocks -Use to solve Assline refusing to work if handling recipe with duplicated items -and you are using independent ME network for each Advanced ME Input Bus. -You don't need this Bus if: Your all 16 ME Input Buses share the same network -or there's no duplicated items in the Assline recipe you handles. -You may choose to rename the duplicated items to workaround this bug(?) of course. -Why the Assline refuses to work: -Assline will check type of the first item in ME Bus, but check number and consume from the LAST ME Bus that contains the same item. -e.g. For recipe {screw x1,plate x1,plate x1,plate x1}, Assline will check the 4th ME Bus to see if there's 3 plates. -Assline will not work, because there's only 1 plate in last Bus' ME network regardless of the 2nd nad 3rd ME Bus. -Even if x3 the recipe to pass the check, Assline will extract only from the 4th ME Bus and exhaust the ME storage -leaving the remaining 2 recipes unfinished or stuck. -How to use: -First 15 ME storages connect to corresponding Advanced ME Input Bus, do not connect the 16th ME storage. -Use this ME Bus as the last Bus, and access the first 15 ME storages and the 16th ME storage via Storage Bus. -Set priority acsending with the index of the ME network. -Finally enable 'Auto Pull'. ----------------------------------------------------------------------------------------------------------------------------------------- -This ME Bus disguises as if 'all 16 ME Input Buses share the same network' to trick Assline into working, -and extract items via Storage Bus in a more resonable order. -This ME Bus will always auto-pull items in ME network with higher priority, to make sure the items in 16th ME storage will always -be in the first slot. -And since it's the last ME Bus and is accessible to all 16 networks, it will always be the ME Bus to be checked and extracted from. -So a valid recipe will always pass the check. When consuming items, it will do it in order of reserved priority, -that is, Bus of lower index gets consumed first, just like normal Buses. -Shift+Screwdriver RMB to toggle reserve first slot if storage of highest priority is empty \ No newline at end of file +When GT Multiblock has several ME Input Buses with same item inputs. +It only sees the inputs in the last one and ignore all same items in previous ME Input Buses. +So if you got Assline recipe like{Screw x1,Plate x1,Plate x1,Plate x1} +and try to input them to an Assline with 4 independent ME Network via 4 ME Input Buses, +Assline will only see one Plate in the #4 ME Input Bus and refuse to work since one is less than all 3 plates. +Even if you input x3 the inputs, Assline will work but exhaust the #4 ME Storage first, not extracting evenly from #2~4. +Then stuck your crafting process, with the rest 2 batches unfinished. +This specialized ME Bus is to workaround this bug/feature. +-------------------------------------------------------------------------------------- +Assline use all Advanced ME Input Bus, 16 independent ME Network, Auto-pull on. +Replace the last Advanced ME Input Bus with this, accessing 16 independent ME Network with ME Storage Bus. +This Bus will collect all ingredients from all networks, +then GT Multiblock will always see items in this Bus because it's the last one. +This bus will evenly dispatch the extraction behaviour, to avoid the case that one Network is exhausted too early. +-------------------------------------------------------------------------------------- +Set ME Storage Buses that access all 16 Networks with acsending priority (the 16th one is the highest) +to make sure that Decoy Bus will show items in the 16th Network in the first slot. +Screwdriver+RMB to toggle if to reserve the first slot for the ME Network of highest priority. +Hint: Renaming the duplicated items is also a valid way to workaround. \ No newline at end of file diff --git a/src/main/resources/assets/proghatches/lang/zh_CN.lang b/src/main/resources/assets/proghatches/lang/zh_CN.lang index 2187cc9..20176ac 100644 --- a/src/main/resources/assets/proghatches/lang/zh_CN.lang +++ b/src/main/resources/assets/proghatches/lang/zh_CN.lang @@ -682,11 +682,11 @@ proghatch.circuit_interceptor.tooltip.0=阻止合成CPU使用库存的编程器 proghatch.circuit_interceptor.tooltip.1=从而迫使其从提供器合成 programmable_hatches.gt.holder.max=用物品点击按钮以记录,最多%s个 programmable_hatches.gt.holder.apply=左击覆写电路槽 右击擦除 -item.proghatch.cover.dedicated.90=Basic Circuit Holder -item.proghatch.cover.dedicated.91=Good Circuit Holder -item.proghatch.cover.dedicated.92=Advanced Circuit Holder -item.proghatch.cover.dedicated.93=Elite Circuit Holder -item.proghatch.cover.dedicated.94=Master Circuit Holder +item.proghatch.cover.dedicated.90=基础电路拓展 +item.proghatch.cover.dedicated.91=优质电路拓展 +item.proghatch.cover.dedicated.92=高级电路拓展 +item.proghatch.cover.dedicated.93=精英电路拓展 +item.proghatch.cover.dedicated.94=大师电路拓展 item.proghatch.cover.dedicated.tooltips.90=1 item.proghatch.cover.dedicated.tooltips.90.0=记录9种物品 以便在机器GUI中覆写电路槽 item.proghatch.cover.dedicated.tooltips.91=1 @@ -737,9 +737,10 @@ proghatch.request_tunnel.tooltip.1=接受样板后输入材料存入当前网络 proghatch.request_tunnel.tooltip.2=这些输出材料会缓存在内部,使用物流管道将其送回下单网络,或者使用扳手指定输出方向 proghatch.request_tunnel.tooltip.3=请用普通ME接口(即使样板含有流体),ME二合一接口可能会进入常规模式而非MA模式从而卡单 programmable_hatches.gt.newcrib.0=开启兼容GT新版样板配方缓存 -programmable_hatches.gt.newcrib.1=开启时GT会记录每个缓冲区可能的配方 所以搜索配方会变快,关掉也不会有什么问题 -programmable_hatches.gt.newcrib.2=和库存升级的协作有点问题 -programmable_hatches.gt.newcrib.3=多方块机器缓存配方后不会再变动,所以如果在没有库存不足时可能少配方 -programmable_hatches.gt.newcrib.4=关闭此模式时,会清理所有缓存(改库存升级配置时可能会需要关+开一次) -programmable_hatches.gt.newcrib.5=开启合并模式(左边那个)时,这个模式会被忽略 -programmable_hatches.gt.newcrib.nosupport=§c不支持当前版本GT5u +programmable_hatches.gt.newcrib.1=开启时GT多方块会记录每个缓冲区可能的配方以加速运行 +programmable_hatches.gt.newcrib.2=多方块机器缓存配方后不会再主动更新,所以如果库存升级拉取的材料不足时时机器缓存了配方 +programmable_hatches.gt.newcrib.3=材料充足后机器可能无法识别到部分配方 +programmable_hatches.gt.newcrib.4=关闭此模式的瞬间,会同时清除GT多方块缓存的配方(可用于强制刷新缓存配方) +programmable_hatches.gt.newcrib.5=此模式关闭时,会阻止GT多方块缓存这个仓的配方 +programmable_hatches.gt.newcrib.nosupport=§c当前版本GT5u没有缓存机制 这个选项没有意义 +item.proghatches.part.tunnel.name=合成请求隧道 diff --git a/src/main/resources/assets/proghatches/textures/items/tunnel.png b/src/main/resources/assets/proghatches/textures/items/tunnel.png new file mode 100644 index 0000000000000000000000000000000000000000..f970fa0ffb7244b5a33209b7155f0a7613d2f716 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`iFvHWuF~q_@*@w&I-+2c{2I+u^AnvD=*nU;d zl8ji8({{YwdV$WPhBdjYGuosXnD~D_Ua0fO;ooB?jqb)qPOr(l8>AREF-jj}%XrKb zbfCbLVT#;_#GHmC@dZm