From 879e754332e5722a41a9d7653453c64077521e42 Mon Sep 17 00:00:00 2001 From: reobf <2215595288@qq.com> Date: Sun, 7 Jul 2024 23:07:56 +0800 Subject: [PATCH] update --- build.gradle | 2 +- .../gt/metatileentity/SuperChestME.java | 49 +++++- .../gt/metatileentity/SuperTankME.java | 61 +++++++- .../multi/IngredientDistributor.java | 68 +++++++-- .../metatileentity/util/MappingFluidTank.java | 143 ++++++++++++++++++ .../java/reobf/proghatches/main/MyMod.java | 2 +- .../assets/proghatches/lang/en_US.lang | 1 + .../assets/proghatches/lang/zh_CN.lang | 1 + 8 files changed, 313 insertions(+), 14 deletions(-) create mode 100644 src/main/java/reobf/proghatches/gt/metatileentity/util/MappingFluidTank.java diff --git a/build.gradle b/build.gradle index aff0d30..a23efc1 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.17p5' +String versionOverride = '0.0.17p6' 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/gt/metatileentity/SuperChestME.java b/src/main/java/reobf/proghatches/gt/metatileentity/SuperChestME.java index 724b4a5..f17192e 100644 --- a/src/main/java/reobf/proghatches/gt/metatileentity/SuperChestME.java +++ b/src/main/java/reobf/proghatches/gt/metatileentity/SuperChestME.java @@ -28,6 +28,7 @@ import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot; import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget; import com.gtnewhorizons.modularui.common.widget.DrawableWidget; +import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget; import com.gtnewhorizons.modularui.common.widget.SlotWidget; import com.gtnewhorizons.modularui.common.widget.textfield.BaseTextFieldWidget; import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; @@ -63,8 +64,11 @@ import appeng.me.storage.MEInventoryHandler; import appeng.util.InventoryAdaptor; import appeng.util.Platform; +import appeng.util.item.AEFluidStack; import appeng.util.item.AEItemStack; +import appeng.util.item.FluidList; import appeng.util.item.ItemList; +import appeng.util.prioitylist.PrecisePriorityList; import gregtech.api.GregTech_API; import gregtech.api.gui.modularui.GT_UIInfos; import gregtech.api.gui.modularui.GT_UITextures; @@ -88,7 +92,9 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; import reobf.proghatches.gt.metatileentity.util.BaseSlotPatched; +import reobf.proghatches.gt.metatileentity.util.MappingFluidTank; import reobf.proghatches.lang.LangManager; import reobf.proghatches.main.registration.Registration; import reobf.proghatches.util.IIconTexture; @@ -258,6 +264,17 @@ public DimensionalCoord getLocation() { return new DimensionalCoord((TileEntity)this.getBaseMetaTileEntity()); } + public Consumer updateFilter; + ItemStack[] cachedFilter=new ItemStack[1]; + public void updateFilter(ItemStack fs){ + cachedFilter[0]=fs; + ItemList fl = new ItemList(); + fl.add(AEItemStack.create(fs)); + updateFilter.accept(fl); + post(); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) IMEInventoryHandler handler @@ -265,6 +282,10 @@ public DimensionalCoord getLocation() { , StorageChannel .ITEMS){ public boolean getSticky() {return sticky&&!suppressSticky;}; public int getPriority() {return piority;}; + { + updateFilter=s-> + this.setPartitionList(new PrecisePriorityList(s)); + } }; boolean sticky; int piority; @@ -562,6 +583,9 @@ public void addUIWidgets(Builder builder, UIBuildContext buildContext) { builder.widget(createButton(() -> autoUnlock , val -> { + + cachedFilter[0]=null; + updateFilter(cachedFilter[0]); autoUnlock = val;post(); //updateSlots(); }, GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED, @@ -575,7 +599,20 @@ public void addUIWidgets(Builder builder, UIBuildContext buildContext) { , 0) .setPos( 3+18,3+18*2)); - + builder.widget(SlotWidget.phantom( + + new ItemStackHandler(cachedFilter){ + public void setStackInSlot(int slot, ItemStack stack) { + super.setStackInSlot(slot, stack); + updateFilter(cachedFilter[0]); + autoUnlock=false; + post(); + }; + }, 0 + + ).setPos( 3+18*2,3+18*2).addTooltip(StatCollector.translateToLocal("programmable_hatches.gt.phantom.filter")) + + ); @@ -614,6 +651,11 @@ public void loadNBTData(NBTTagCompound aNBT) { sticky= aNBT.getBoolean("sticky"); autoUnlock=aNBT.getBoolean("autoUnlock"); suppressSticky=aNBT.getBoolean("suppressSticky"); + NBTTagCompound tag=(NBTTagCompound) aNBT.getTag("cahcedFilter"); + if(tag!=null){ + cachedFilter[0]=ItemStack.loadItemStackFromNBT(tag); + updateFilter(cachedFilter[0]); + } } @Override @@ -633,6 +675,11 @@ public void saveNBTData(NBTTagCompound aNBT) { aNBT.setBoolean("sticky", sticky); aNBT.setBoolean("autoUnlock",autoUnlock); aNBT.setBoolean("suppressSticky",suppressSticky); + if(cachedFilter[0]!=null){ + NBTTagCompound tag=new NBTTagCompound(); + cachedFilter[0].writeToNBT(tag); + aNBT.setTag("cahcedFilter", tag); + } }@Override public void onFacingChange() { diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/SuperTankME.java b/src/main/java/reobf/proghatches/gt/metatileentity/SuperTankME.java index 48474d4..8617f2a 100644 --- a/src/main/java/reobf/proghatches/gt/metatileentity/SuperTankME.java +++ b/src/main/java/reobf/proghatches/gt/metatileentity/SuperTankME.java @@ -35,6 +35,7 @@ import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget; import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder; +import appeng.api.AEApi; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.implementations.tiles.IColorableTile; @@ -67,7 +68,10 @@ import appeng.util.Platform; import appeng.util.item.AEFluidStack; import appeng.util.item.AEItemStack; +import appeng.util.item.FluidList; import appeng.util.item.ItemList; +import appeng.util.prioitylist.IPartitionList; +import appeng.util.prioitylist.PrecisePriorityList; import gregtech.api.GregTech_API; import gregtech.api.gui.modularui.GT_UIInfos; import gregtech.api.gui.modularui.GT_UITextures; @@ -92,9 +96,13 @@ import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.Fluid; 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.IFluidTank; import reobf.proghatches.gt.metatileentity.util.BaseSlotPatched; +import reobf.proghatches.gt.metatileentity.util.MappingFluidTank; import reobf.proghatches.lang.LangManager; import reobf.proghatches.main.registration.Registration; import reobf.proghatches.util.IIconTexture; @@ -247,13 +255,33 @@ public DimensionalCoord getLocation() { return new DimensionalCoord((TileEntity)this.getBaseMetaTileEntity()); } + + //final FluidList filterList=new FluidList();//new FluidStack(FluidRegistry.WATER,1); + public Consumer updateFilter; + FluidStack cachedFilter; + public void updateFilter(FluidStack fs){ + cachedFilter=fs; + FluidList fl = new FluidList(); + fl.add(AEFluidStack.create(fs)); + updateFilter.accept(fl); + post(); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) IMEInventoryHandler handler =new MEInventoryHandler(new UnlimitedWrapper() , StorageChannel .FLUIDS){ public boolean getSticky() {return sticky&&!suppressSticky;}; public int getPriority() {return piority;}; - }; + { + updateFilter=s-> + this.setPartitionList(new PrecisePriorityList(s)); + } + }; + + + + boolean sticky; int piority; @Override @@ -525,7 +553,9 @@ public void addUIWidgets(Builder builder, UIBuildContext buildContext) { builder.widget(createButton(() -> autoUnlock , val -> { - autoUnlock = val;post(); + autoUnlock = val; + cachedFilter=null; + updateFilter(cachedFilter);post(); //updateSlots(); }, GT_UITextures.OVERLAY_BUTTON_RECIPE_UNLOCKED, @@ -538,6 +568,16 @@ public void addUIWidgets(Builder builder, UIBuildContext buildContext) { , 0) .setPos( 3+18,3+18*2)); + + + builder.widget(FluidSlotWidget.phantom(new MappingFluidTank(s->{cachedFilter=s==null?null:s.copy();if(s!=null){autoUnlock=false;}updateFilter(cachedFilter);}, ()->cachedFilter), + false + ).setPos( 3+18*2,3+18*2).addTooltip(StatCollector.translateToLocal("programmable_hatches.gt.phantom.filter")) + + ); + + + builder.widget(new TextFieldWidget() .setPattern(BaseTextFieldWidget.NATURAL_NUMS) .setGetter(()->piority+"") @@ -575,6 +615,14 @@ public void loadNBTData(NBTTagCompound aNBT) { autoUnlock=aNBT.getBoolean("autoUnlock"); suppressSticky=aNBT.getBoolean("suppressSticky"); content.readFromNBT(aNBT); + + NBTTagCompound tag=(NBTTagCompound) aNBT.getTag("cahcedFilter"); + if(tag!=null){ + cachedFilter=FluidStack.loadFluidStackFromNBT(tag); + updateFilter(cachedFilter); + } + + } protected static int commonSizeCompute(int tier) { switch (tier) { @@ -601,6 +649,15 @@ public void saveNBTData(NBTTagCompound aNBT) { aNBT.setBoolean("sticky", sticky); aNBT.setBoolean("autoUnlock",autoUnlock); aNBT.setBoolean("suppressSticky",suppressSticky); + if(cachedFilter!=null){ + NBTTagCompound tag=new NBTTagCompound(); + cachedFilter.writeToNBT(tag); + aNBT.setTag("cahcedFilter", tag); + } + + + + } @Override public void setItemNBT(NBTTagCompound aNBT) { diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/multi/IngredientDistributor.java b/src/main/java/reobf/proghatches/gt/metatileentity/multi/IngredientDistributor.java index 73eefc4..b13aa2d 100644 --- a/src/main/java/reobf/proghatches/gt/metatileentity/multi/IngredientDistributor.java +++ b/src/main/java/reobf/proghatches/gt/metatileentity/multi/IngredientDistributor.java @@ -59,6 +59,7 @@ import gregtech.api.render.TextureFactory; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; import gregtech.api.util.GT_StructureUtility; +import gregtech.api.util.GT_Utility; import gregtech.api.util.IGT_HatchAdder; import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_OutputBus_ME; import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_Output_ME; @@ -439,6 +440,7 @@ private boolean distribute() { } if(possibleSource==null&&mInputHatches.size()==1){ ArrayList fluid = getStoredFluids(); + fluid.removeIf(s->s==null||s.amount<=0); if(fluid.size()>0){ possibleSource=ImmutableList.of( new IDualInputInventory(){ @@ -461,6 +463,7 @@ public FluidStack[] getFluidInputs() { if(possibleSource==null&&mInputBusses.size()==1){ ArrayList items =getStoredInputs(); + items.removeIf(s->s==null||s.stackSize<=0); if(items.size()>0){ possibleSource=ImmutableList.of( new IDualInputInventory(){ @@ -498,7 +501,7 @@ public FluidStack[] getFluidInputs() { return false; } while(itr.hasNext()){ - if(moveToOutpus(itr.next())){ + if(moveToOutpus(itr.next(),true)){ return true; }; @@ -643,12 +646,14 @@ private static boolean sameType(IAEFluidStack a,FluidStack b){ } -private boolean moveToOutpus(IDualInputInventory opt) { +private boolean moveToOutpus(IDualInputInventory opt,boolean checkSpace) { ItemStack[] i = opt.getItemInputs(); FluidStack[] f = opt.getFluidInputs(); - + boolean anyDiff=false; if(i.length>mOutputBusses.size())return false; if(f.length>mOutputHatches.size())return false; + + if(checkSpace){ for(int index=0;index0)anyDiff=true; + i[index].stackSize-=diff; } for(int index=0;index0)anyDiff=true; + f[index].amount-=diff; } mInputBusses.forEach(s->s.updateSlots()); mInputHatches.forEach(s->s.updateSlots()); - return true; + return anyDiff; } +private static int storeAll(GT_MetaTileEntity_Hatch_OutputBus bus,ItemStack aStack) { + bus.markDirty(); + int consumed=0; + for (int i = 0, mInventoryLength = bus.mInventory.length; i < mInventoryLength && aStack.stackSize > 0; i++) { + ItemStack tSlot = bus.mInventory[i]; + if (GT_Utility.isStackInvalid(tSlot)) { + int tRealStackLimit = Math.min(bus.getInventoryStackLimit(), aStack.getMaxStackSize()); + if (aStack.stackSize <= tRealStackLimit) { + bus.mInventory[i] = aStack; + consumed+=aStack.stackSize; + return consumed; + } + bus.mInventory[i] = aStack.splitStack(tRealStackLimit); + consumed+=tRealStackLimit; + } else { + int tRealStackLimit = Math.min(bus.getInventoryStackLimit(), tSlot.getMaxStackSize()); + if (tSlot.stackSize < tRealStackLimit && tSlot.isItemEqual(aStack) + && ItemStack.areItemStackTagsEqual(tSlot, aStack)) { + if (aStack.stackSize + tSlot.stackSize <= tRealStackLimit) { + bus.mInventory[i].stackSize += aStack.stackSize; + consumed+=aStack.stackSize; + return consumed; + } else { + // more to serve + consumed+=tRealStackLimit - tSlot.stackSize; + aStack.stackSize -= tRealStackLimit - tSlot.stackSize; + bus.mInventory[i].stackSize = tRealStackLimit; + + } + } + } + } + return consumed; +} + private static int space(FluidStack in,IFluidStore store){ return store.fill(in, false); diff --git a/src/main/java/reobf/proghatches/gt/metatileentity/util/MappingFluidTank.java b/src/main/java/reobf/proghatches/gt/metatileentity/util/MappingFluidTank.java new file mode 100644 index 0000000..001535e --- /dev/null +++ b/src/main/java/reobf/proghatches/gt/metatileentity/util/MappingFluidTank.java @@ -0,0 +1,143 @@ +package reobf.proghatches.gt.metatileentity.util; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidTank; + +public class MappingFluidTank implements IFluidTank{ +public Consumer set; +public Supplier get; + +public +MappingFluidTank( + Consumer set, + Supplier get + ){this.set=set; + this.get=get; + +} + + + + + public void setFluid(FluidStack fluid) + { + set.accept(fluid); + } + + public void setCapacity(int capacity) + { + + } + + /* IFluidTank */ + @Override + public FluidStack getFluid() + { + return get.get(); + } + + @Override + public int getFluidAmount() + { + if (get.get() == null) + { + return 0; + } + return get.get().amount; + } + + @Override + public int getCapacity() + { + return 1; + } + + @Override + public FluidTankInfo getInfo() + { + return new FluidTankInfo(this); + } + + @Override + public int fill(FluidStack resource, boolean doFill) + { + if (resource == null) + { + return 0; + } + doFill=true; + if (!doFill) + { + if (get.get() == null) + { + return Math.min(1, resource.amount); + } + + if (!get.get().isFluidEqual(resource)) + { + return 0; + } + + return Math.min(1 - get.get().amount, resource.amount); + } + + if (get.get() == null) + { + set.accept( new FluidStack(resource, Math.min(1, resource.amount))); + + + return get.get().amount; + } + + if (!get.get().isFluidEqual(resource)) + { + return 0; + } + int filled = 1 - get.get().amount; + + if (resource.amount < filled) + { + get.get().amount += resource.amount; + filled = resource.amount; + } + else + { + get.get().amount = 1; + } + + + return filled; + } + + @Override + public FluidStack drain(int maxDrain, boolean doDrain) + { + if (get.get() == null) + { + return null; + } + doDrain=true; + int drained = maxDrain; + if (get.get().amount < drained) + { + drained = get.get().amount; + } + + FluidStack stack = new FluidStack(get.get(), drained); + if (doDrain) + { + get.get().amount -= drained; + if (get.get().amount <= 0) + { + set.accept(null); + } + + + } + return stack; + } +} \ No newline at end of file diff --git a/src/main/java/reobf/proghatches/main/MyMod.java b/src/main/java/reobf/proghatches/main/MyMod.java index 6b42d01..87256a1 100644 --- a/src/main/java/reobf/proghatches/main/MyMod.java +++ b/src/main/java/reobf/proghatches/main/MyMod.java @@ -117,7 +117,7 @@ public class MyMod { public static MyMod instance; { - BaseMetaPipeEntity.class.getDeclaredFields(); + // BaseMetaPipeEntity.class.getDeclaredFields(); instance = this; } public static Deque scheduled=new ArrayDeque(); diff --git a/src/main/resources/assets/proghatches/lang/en_US.lang b/src/main/resources/assets/proghatches/lang/en_US.lang index d8c1c80..cedb761 100644 --- a/src/main/resources/assets/proghatches/lang/en_US.lang +++ b/src/main/resources/assets/proghatches/lang/en_US.lang @@ -382,3 +382,4 @@ proghatches.eu.interface.waila.pass.p2p=Network Refund Check:%s item.proghatches.part.eu.source.superconduct.name=EU Source(%s Superconducting) item.proghatches.part.eu.source.normal.name=EU Source(%s) programmable_hatches.gt.sticky.autounlock=Auto disable sticky mode when empty. +programmable_hatches.gt.phantom.filter=Filter diff --git a/src/main/resources/assets/proghatches/lang/zh_CN.lang b/src/main/resources/assets/proghatches/lang/zh_CN.lang index e416bdc..9c38382 100644 --- a/src/main/resources/assets/proghatches/lang/zh_CN.lang +++ b/src/main/resources/assets/proghatches/lang/zh_CN.lang @@ -419,3 +419,4 @@ proghatches.eu.interface.waila.pass.p2p=网络归还检查:%s item.proghatches.part.eu.source.superconduct.name=EU源(%s超导) item.proghatches.part.eu.source.normal.name=EU源(%s) programmable_hatches.gt.sticky.autounlock=容器为空时自动禁用粘性模式 +programmable_hatches.gt.phantom.filter=过滤