From 55b4fec00bd569acd438984c28bbe175996d5ddb Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 5 Dec 2025 14:38:13 +0100 Subject: [PATCH] it wasn't for a lack of trying --- .../hbm/saveddata/AnnihilatorSavedData.java | 165 ++++++++++++++++++ .../gui/processing/gui_annihilator.png | Bin 1437 -> 1601 bytes 2 files changed, 165 insertions(+) create mode 100644 src/main/java/com/hbm/saveddata/AnnihilatorSavedData.java diff --git a/src/main/java/com/hbm/saveddata/AnnihilatorSavedData.java b/src/main/java/com/hbm/saveddata/AnnihilatorSavedData.java new file mode 100644 index 000000000..955b87356 --- /dev/null +++ b/src/main/java/com/hbm/saveddata/AnnihilatorSavedData.java @@ -0,0 +1,165 @@ +package com.hbm.saveddata; + +import java.math.BigInteger; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.util.ItemStackUtil; +import com.hbm.inventory.RecipesCommon.ComparableStack; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagByte; +import net.minecraft.nbt.NBTTagByteArray; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagShort; +import net.minecraft.nbt.NBTTagString; +import net.minecraft.world.World; +import net.minecraft.world.WorldSavedData; + +public class AnnihilatorSavedData extends WorldSavedData { + + public static final String KEY = "annihilator"; + + public HashMap pools = new HashMap(); + + public AnnihilatorSavedData() { + super(KEY); + this.markDirty(); + } + + public AnnihilatorSavedData(String name) { super(name); } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + + //NBTTagList list = nbt.getTagList(p_150295_1_, p_150295_2_) + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + NBTTagList list = new NBTTagList(); + + for(Entry entry : pools.entrySet()) { + list.appendTag(new NBTTagString(entry.getKey())); + NBTTagList poolList = new NBTTagList(); + entry.getValue().serialize(poolList); + list.appendTag(poolList); + } + + nbt.setTag("list", list); + } + + public static AnnihilatorSavedData getData(World worldObj) { + AnnihilatorSavedData data = (AnnihilatorSavedData) worldObj.perWorldStorage.loadData(AnnihilatorSavedData.class, KEY); + if(data == null) { + data = new AnnihilatorSavedData(); + worldObj.perWorldStorage.setData(KEY, data); + } + return data; + } + + public AnnihilatorPool grabPool(String pool) { + AnnihilatorPool poolInstance = pools.get(pool); + if(poolInstance == null) { + poolInstance = new AnnihilatorPool(); + pools.put(pool, poolInstance); + } + return poolInstance; + } + + /** For fluids */ + public void pushToPool(String pool, FluidType type, long amount) { + AnnihilatorPool poolInstance = grabPool(pool); + poolInstance.increment(type, amount); + this.markDirty(); + } + + /** For items (type + meta as well as only type), also handles ore dict */ + public void pushToPool(String pool, ItemStack stack) { + AnnihilatorPool poolInstance = grabPool(pool); + + poolInstance.increment(stack.getItem(), stack.stackSize); + poolInstance.increment(new ComparableStack(stack).makeSingular(), stack.stackSize); + + List oreDict = ItemStackUtil.getOreDictNames(stack); + for(String name : oreDict) poolInstance.increment(name, stack.stackSize); + + // originally a lookup for fluid containers was considered, but no one would use the annihilator like that, and it adds unnecessary overhead + + this.markDirty(); + } + + public static class AnnihilatorPool { + + /** + * Valid keys include: + *
    + *
  • Items, for wildcard
  • + *
  • ComparableStacks, for type + meta
  • + *
  • FluidTypes
  • + *
  • Strings, for ore dict keys
  • + *
+ * ItemStacks should be analyzed for all matching types and added accordingly. Any additions need to be added for (de)serializing + */ + public HashMap items = new HashMap(); + + public void increment(Object type, long amount) { + BigInteger counter = items.get(type); + if(counter == null) { + counter = BigInteger.valueOf(amount); + } else { + counter.add(BigInteger.valueOf(amount)); + } + items.put(type, counter); + } + + public void serialize(NBTTagList nbt) { + for(Entry entry : items.entrySet()) { + NBTTagList list = new NBTTagList(); + serializeKey(list, entry.getKey()); + list.appendTag(new NBTTagByteArray(entry.getValue().toByteArray())); + nbt.appendTag(list); + } + } + + /* + * this absolutely will not work because it was written under the assumption that NBTTagList can support arbitrary NBTTagBase + * even though an NBTTagList can only hold tags of a single type. this fucking sucks and implementing it better would have + * been easy, but we work with what we are given. + * + * alternative: keep the lists, but change all types to NBTTagByteArray since we can effectively reduce all other data + * types down into byte arrays anyway. if we can avoid NBTTagCompounds, we will. so much named tag crap we don't need just + * bloats the file size. + */ + public void serializeKey(NBTTagList list, Object key) { + if(key instanceof Item) { // 0 + Item item = (Item) key; + list.appendTag(new NBTTagByte((byte) 0)); + list.appendTag(new NBTTagString(Item.itemRegistry.getNameForObject(item))); + } + + if(key instanceof ComparableStack) { // 1 + ComparableStack item = (ComparableStack) key; + list.appendTag(new NBTTagByte((byte) 1)); + list.appendTag(new NBTTagString(Item.itemRegistry.getNameForObject(item.item))); + list.appendTag(new NBTTagShort((short) item.meta)); + } + + if(key instanceof FluidType) { // 2 + FluidType item = (FluidType) key; + list.appendTag(new NBTTagByte((byte) 2)); + list.appendTag(new NBTTagString(item.getUnlocalizedName())); + } + + if(key instanceof String) { // 3 + String item = (String) key; + list.appendTag(new NBTTagByte((byte)3)); + list.appendTag(new NBTTagString(item)); + } + } + } +} diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_annihilator.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_annihilator.png index ace5467c1e82d01164003ecf42809b9eb2bf37bd..0ee357a8ed0e4a0d5e55655c4ad6b4f4454127fd 100644 GIT binary patch literal 1601 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIE+9tUo+m z978JRyuEAaCmkts{Nr-yU(n|=m3hfig=J4!JX}`Bz7aDi zU|4mxYFora)xO6Ye(-)ytDEnC{=Ra;zCDut@|%O=uOIeVmT2~c@x$I*_7mQHetv$c zyOHR8yIL(*mRX+`J8!1G6{|~TRq`#k zcGy79uJL%b8pF~nl@iZ3^3Ts-|ckfA-GP}jEEe{vr$$Ddi4adquXF~iBI+b56rIasnRVB9L# zl$Fc(wwM!FbS|zEc=7uBdS`j3mhJiX`D!_ACI_-Em=YAXx61U3qR+J&JN@g|uRF`L zozEy?)L1&j{{O$^7tS-5+`nHV&|t8b=fIoo3;P+CB~D>{@lWa(M}m}_B!f1?isUJb z8<-lbDBzSZ&N%=4>DfPrFSIjGHrT}w6CeNkgjR^rDux>?*6QO?A9Mctp;&VK_;K5wRIWLHa$mk?zxdT;`p4o=%)o5Q zU^BhFJmv1rbe%nu15W-m-}Kt*x&32<*=M~38@1v@)a{jvOG`t$M6*RVZxU?KkKe~r zZt{U6Jw1J?h`;Ey4|m%e=lq#)bUC9U5t*gzU;cr9dHZ*NnNC05G-v+&*~#Z7Ki^aT zzwW(d&iB*xe7j=wzE?F~zI?f;t}d_7(tqCL;8lMMamE+ce7RxnZ$_Qzr;Dnpc75-j zk<6DnYiiK0b+5fN?f+F5SToJMd}z*D*~W9{&UtArT@$uC=-*%2XPs|2Qv5y_zu~wd z|DCj4pXRPmJZrvlJ;DHx6@O%`nZ6#kC9N2_DR^Sev*#D)&$VW9?0&-$((et^f8*Tj zhB8*O<*k;pcQXa|$2OkLtm~V7nbeRm*v&K>=(JzS;R$ZX*B$t}g9TEwH3aUA{}+7x zbkM0Bv)QHL;oh4X+MS65Xc(3Bqo&T{y9*ZKK*l`F)i{2XiW)6>&fqnW9fml~HkJ3Fh@YSou3fhG)j z1@JG2ALe0{008qKlko%?lkfx?lkfx$Fr%#n=i~0~?slHBSS)J2UN<%8;NW2AIgCpH z8nIX`cKY`xCnvRDubY}_@9XgJ@LL{B1ZYK6 z0Ds=T@=tjcP$dGiVK46ioSvT6-QC@{+y~g@AU{7p`&l`Yin#*V_KH9CRRBzFFRuW; z>i+)z)4vb!*;nwlR}5bLnOe*hz_zyoQ~s#X;im}-Uw>;s3tEn|Hl z`jO@`e-1wY0002McX@k9)}4Fi!cP(g^7 zU2Oy#;PLTsx@Q9)aC380Req~*2)}(8$l-@9J`D(w@FO?&?%xKyxVYH)0hY^U-QM1s zW6qc793LO=JcsT6`o}?+%jHfFaCv!Ix3{8aJ&V8U;+Ta1OS4)dlS%BU~^iSv$++R;n)gnPV;lzoF0$2 zlko%?lkfxCEqS