From e6ac26abd016ea5ca54e728c5e7033fca02e0043 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 11 May 2026 16:41:20 +0200 Subject: [PATCH] i'll be shitting blood tonight --- changelog | 3 +- .../java/api/hbm/ntl/EnumStorageType.java | 7 -- .../api/hbm/ntl/ISlotMonitorProvider.java | 5 +- .../java/api/hbm/ntl/IStorageComponent.java | 30 -------- src/main/java/api/hbm/ntl/SlotMonitor.java | 12 +++ src/main/java/api/hbm/ntl/StackCache.java | 29 ++++++++ .../java/api/hbm/ntl/StorageManifest.java | 70 ------------------ src/main/java/api/hbm/ntl/StorageStack.java | 54 -------------- .../java/com/hbm/config/GeneralConfig.java | 3 +- .../ContainerPneumoStorageAccess.java | 6 ++ .../hbm/tileentity/TileEntityLoadedBase.java | 9 +-- .../machine/TileEntityReactorZirnox.java | 2 +- .../machine/fusion/TileEntityFusionTorus.java | 2 +- .../oil/TileEntityMachineGasFlare.java | 2 +- .../oil/TileEntityMachineRefinery.java | 2 +- .../storage/TileEntityBatterySocket.java | 6 +- .../TileEntityPneumoStorageAccess.java | 8 +- .../TileEntityPneumoStorageClutter.java | 1 + .../hbm/textures/items/ammo_standard.gyro.png | Bin 0 -> 301 bytes .../items/ammo_standard.gyro_explosive.png | Bin 0 -> 356 bytes 20 files changed, 74 insertions(+), 177 deletions(-) delete mode 100644 src/main/java/api/hbm/ntl/EnumStorageType.java delete mode 100644 src/main/java/api/hbm/ntl/IStorageComponent.java create mode 100644 src/main/java/api/hbm/ntl/StackCache.java delete mode 100644 src/main/java/api/hbm/ntl/StorageManifest.java delete mode 100644 src/main/java/api/hbm/ntl/StorageStack.java create mode 100644 src/main/resources/assets/hbm/textures/items/ammo_standard.gyro.png create mode 100644 src/main/resources/assets/hbm/textures/items/ammo_standard.gyro_explosive.png diff --git a/changelog b/changelog index 3e375c3f5..bc7c1f902 100644 --- a/changelog +++ b/changelog @@ -26,4 +26,5 @@ * Fixed polling option in RoR controllers reading dead signals * Fixed state change in RoR controllers not allowing repeat commands * Fixed blast furnace NEI handler not cycling through all valid material shapes -* Fixed RoR transmitter sending empty signals when unused mappings apply \ No newline at end of file +* Fixed RoR transmitter sending empty signals when unused mappings apply +* Fixed hopper IO for battery sockets being entirely broken \ No newline at end of file diff --git a/src/main/java/api/hbm/ntl/EnumStorageType.java b/src/main/java/api/hbm/ntl/EnumStorageType.java deleted file mode 100644 index bbde53f61..000000000 --- a/src/main/java/api/hbm/ntl/EnumStorageType.java +++ /dev/null @@ -1,7 +0,0 @@ -package api.hbm.ntl; - -@Deprecated -public enum EnumStorageType { - CLUTTER, //potentially unsorted storage (like crates) with many slots that have low capacity - MASS //storage with very few lots (usually 1) and very high capacity -} diff --git a/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java b/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java index 380a6c69f..19de13029 100644 --- a/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java +++ b/src/main/java/api/hbm/ntl/ISlotMonitorProvider.java @@ -8,9 +8,12 @@ public interface ISlotMonitorProvider { /** Returns an array of available slot monitors, which should ideally mirror the available slots of that container */ public SlotMonitor[] getMonitors(); - /** Returns the slot contents of that index, so that the monitors cna detect changes */ + /** Returns the slot contents of that index, so that the monitors can detect changes */ public ItemStack getSlotAt(int index); + /** Returns the amount of that slot at that index. Some storages may use int64 datatypes so we have to account for those too somehow, since ItemStacks cannot handle that. */ + public long getAmountAt(int index); + /** Whether this storage unit is reachable by the access point on the provided location */ public boolean isAvailableToTerminal(int termX, int termY, int termZ); } diff --git a/src/main/java/api/hbm/ntl/IStorageComponent.java b/src/main/java/api/hbm/ntl/IStorageComponent.java deleted file mode 100644 index 13b7ea669..000000000 --- a/src/main/java/api/hbm/ntl/IStorageComponent.java +++ /dev/null @@ -1,30 +0,0 @@ -package api.hbm.ntl; - -import net.minecraft.item.ItemStack; - -@Deprecated -public interface IStorageComponent { - - /** - * @return The type of storage this tile entity represents. - */ - public EnumStorageType getType(); - - /** - * @return A StorageManifest instance containing all managed stacks - */ - public StorageManifest getManifest(); - - /** - * @return An integer representing the version of the manifest. The higher the numberm, the more recent the manifest - * (i.e. always count up), the version has to change every time the manifest updates. - */ - public int getManifestVersion(); - - /** - * @param stack The stack to be stored - * @param simulate Whether the changes should actually be written or if the operation is only for checking - * @return The remainder of the stack after being stored, null if nothing remains - */ - public ItemStack storeStack(ItemStack stack, boolean simulate); -} diff --git a/src/main/java/api/hbm/ntl/SlotMonitor.java b/src/main/java/api/hbm/ntl/SlotMonitor.java index 99c5c1e28..81284d08d 100644 --- a/src/main/java/api/hbm/ntl/SlotMonitor.java +++ b/src/main/java/api/hbm/ntl/SlotMonitor.java @@ -1,13 +1,21 @@ package api.hbm.ntl; +import java.util.HashSet; + +import api.hbm.ntl.StackCache.CacheSlot; import net.minecraft.item.Item; import net.minecraft.nbt.NBTTagCompound; public class SlotMonitor { + /** The index of the slot in the inventory this monitor....monitors */ public final int index; + /** The inventory */ public final ISlotMonitorProvider parent; + /** If this monitor detects a change, all cache slots need to be notified */ + public HashSet viewedBy = new HashSet(); + public Item item; public long stacksize; public int meta; @@ -17,4 +25,8 @@ public class SlotMonitor { this.index = index; this.parent = parent; } + + public void checkUpdate() { + + } } diff --git a/src/main/java/api/hbm/ntl/StackCache.java b/src/main/java/api/hbm/ntl/StackCache.java new file mode 100644 index 000000000..bb67d9933 --- /dev/null +++ b/src/main/java/api/hbm/ntl/StackCache.java @@ -0,0 +1,29 @@ +package api.hbm.ntl; + +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; + +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; + +public class StackCache { + + public LinkedHashMap cacheSlots = new LinkedHashMap(); + + public class CacheSlot { + + public Item item; + public long stacksize; + public int meta; + public NBTTagCompound nbt; + + public LinkedHashSet monitors = new LinkedHashSet(); + } + + public static int getStackIdentity(Item item, int meta, NBTTagCompound nbt) { + int identity = Item.getIdFromItem(item) * 27644437; + identity += meta * 27644437; + if(nbt != null) identity += nbt.toString().hashCode(); + return identity; + } +} diff --git a/src/main/java/api/hbm/ntl/StorageManifest.java b/src/main/java/api/hbm/ntl/StorageManifest.java deleted file mode 100644 index 0d58df702..000000000 --- a/src/main/java/api/hbm/ntl/StorageManifest.java +++ /dev/null @@ -1,70 +0,0 @@ -package api.hbm.ntl; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map.Entry; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -@Deprecated -public class StorageManifest { - - public LinkedHashMap itemMeta = new LinkedHashMap(); - - public void writeStack(ItemStack stack) { - int id = Item.getIdFromItem(stack.getItem()); - - MetaNode meta = itemMeta.get(id); - - if(meta == null) { - meta = new MetaNode(); - itemMeta.put(id, meta); - } - - NBTNode nbt = meta.metaNBT.get(stack.getItemDamage()); - - if(nbt == null) { - nbt = new NBTNode(); - meta.metaNBT.put(stack.getItemDamage(), nbt); - } - - NBTTagCompound compound = stack.hasTagCompound() ? (NBTTagCompound) stack.stackTagCompound.copy() : null; - long amount = nbt.nbtAmount.containsKey(compound) ? nbt.nbtAmount.get(compound) : 0; - - amount += stack.stackSize; - - nbt.nbtAmount.put(compound, amount); - } - - public List getStacks(boolean sorted) { - List stacks = new ArrayList(); - - for(Entry itemNode : itemMeta.entrySet()) { - for(Entry metaNode : itemNode.getValue().metaNBT.entrySet()) { - for(Entry nbtNode : metaNode.getValue().nbtAmount.entrySet()) { - - ItemStack itemStack = new ItemStack(Item.getItemById(itemNode.getKey()), 1, metaNode.getKey()); - itemStack.stackTagCompound = nbtNode.getKey(); - StorageStack stack = new StorageStack(itemStack, nbtNode.getValue()); - stacks.add(stack); - } - } - } - - if(sorted) Collections.sort(stacks); - - return stacks; - } - - public class MetaNode { - public LinkedHashMap metaNBT = new LinkedHashMap(); - } - - public class NBTNode { - public LinkedHashMap nbtAmount = new LinkedHashMap(); - } -} diff --git a/src/main/java/api/hbm/ntl/StorageStack.java b/src/main/java/api/hbm/ntl/StorageStack.java deleted file mode 100644 index 4980bdcbf..000000000 --- a/src/main/java/api/hbm/ntl/StorageStack.java +++ /dev/null @@ -1,54 +0,0 @@ -package api.hbm.ntl; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -@Deprecated -public class StorageStack implements Comparable { - - private int cachedItemId; - private ItemStack type; - private long amount; - - public StorageStack(ItemStack type) { - this(type, type.stackSize); - this.cachedItemId = Item.getIdFromItem(type.getItem()); - } - - public StorageStack(ItemStack type, long amount) { - this.type = type.copy(); - this.amount = amount; - this.type.stackSize = 0; - } - - public ItemStack getType() { - return this.type.copy(); - } - - public long getAmount() { - return this.amount; - } - - @Override - public int compareTo(Object o) { - StorageStack other = (StorageStack) o; - - if(this.cachedItemId < other.cachedItemId) return -1; - if(this.cachedItemId > other.cachedItemId) return 1; - if(this.type.getItemDamage() < other.type.getItemDamage()) return -1; - if(this.type.getItemDamage() > other.type.getItemDamage()) return 1; - if(this.type.hasTagCompound() && !other.type.hasTagCompound()) return -1; - if(!this.type.hasTagCompound() && other.type.hasTagCompound()) return 1; - if(this.type.hasTagCompound() && other.type.hasTagCompound()) { - // keyset size comparison should hopefully catch most of the larger NBT cases - if(this.type.stackTagCompound.func_150296_c().size() < other.type.stackTagCompound.func_150296_c().size()) return -1; - if(this.type.stackTagCompound.func_150296_c().size() > other.type.stackTagCompound.func_150296_c().size()) return 1; - int comp = this.type.stackTagCompound.toString().compareTo(other.type.stackTagCompound.toString()); // not terribly performant but hopefully not that common - if(comp != 0) return comp; - } - if(this.type.stackSize < other.type.stackSize) return -1; - if(this.type.stackSize > other.type.stackSize) return 1; - - return 0; - } -} diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index a05408321..a4a37e7e9 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -129,7 +129,7 @@ public class GeneralConfig { preferredOutputMod = CommonConfig.createConfigStringList(config,CATEGORY_GENERAL,"1.42_preferredOutputMod", "The mod which is preferred as output when certain machines autogenerate recipes. Currently used for the shredder", new String[] {RefStrings.MODID}); enableLoadScreenReplacement = config.get(CATEGORY_GENERAL, "1.43_enableLoadScreenReplacement", true, "Tries to replace the vanilla load screen with the 'tip of the day' one, may clash with other mods trying to do the same.").getBoolean(true); - enableMachineGravity = config.get(CATEGORY_GENERAL, "1.44_enableMachineGravity", true, "Requires some large machines to have a proper foundation, or else they tilt and break.").getBoolean(false); + enableMachineGravity = config.get(CATEGORY_GENERAL, "1.44_enableMachineGravity", true, "Requires large large machines to have a proper foundation, or else they tilt and break. Independent from the 528 version of this config, which does the same, but only works with 528 enabled.").getBoolean(false); enableExpensiveMode = config.get(CATEGORY_GENERAL, "1.99_enableExpensiveMode", false, "It does what the name implies.").getBoolean(false); final String CATEGORY_528 = CommonConfig.CATEGORY_528; @@ -180,6 +180,7 @@ public class GeneralConfig { enable528NetherBurn = false; enable528PressurizedRecipes = false; enable528ExplosiveEnergistics = false; + enable528MachineGravity = false; } } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java index ad9d1a58d..728769312 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java +++ b/src/main/java/com/hbm/inventory/container/ContainerPneumoStorageAccess.java @@ -17,6 +17,12 @@ public class ContainerPneumoStorageAccess extends Container { public ContainerPneumoStorageAccess(InventoryPlayer invPlayer, TileEntityPneumoStorageAccess access) { this.access = access; + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 8; j++) { + this.addSlotToContainer(new SlotNonRetarded(inventory, j + i * 8, 8 + j * 18, 17 + i * 18)); + } + } + for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { this.addSlotToContainer(new SlotNonRetarded(invPlayer, j + i * 9 + 9, 8 + j * 18, 169 + i * 18)); diff --git a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java index 9a5efec8f..2c701ed27 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java @@ -106,19 +106,18 @@ public class TileEntityLoadedBase extends TileEntity implements ILoadedTile, IBu } public static enum TiltType { - UNAVOIDABLE, CONFIG_NORMAL, CONFIG_528 + UNAVOIDABLE, CONFIG; } public void checkTilt(TiltType cfg, boolean extraHeavy) { boolean doesTilt = false; if(cfg == TiltType.UNAVOIDABLE) doesTilt = true; - if(cfg == TiltType.CONFIG_NORMAL && GeneralConfig.enableMachineGravity) doesTilt = true; - if(cfg == TiltType.CONFIG_NORMAL && GeneralConfig.enable528MachineGravity) doesTilt = true; - if(cfg == TiltType.CONFIG_528 && GeneralConfig.enable528MachineGravity) doesTilt = true; + if(cfg == TiltType.CONFIG && GeneralConfig.enableMachineGravity) doesTilt = true; + if(cfg == TiltType.CONFIG && GeneralConfig.enable528MachineGravity) doesTilt = true; if(!doesTilt) { this.tilted = false; return; } if(this.getFloorCount() <= 0) { this.tilted = false; return; } - if(this.worldObj.getTotalWorldTime() % 20 != 0) return; + if(this.worldObj.getTotalWorldTime() + BlockPos.getIdentity(xCoord, yCoord, zCoord) % 20 != 0) return; if(this.tiltBlocksChecked >= this.getFloorCount()) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java index 4e52eea94..51a4a8e11 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java @@ -188,7 +188,7 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IC public void updateEntity() { if(!worldObj.isRemote) { - this.checkTilt(TiltType.CONFIG_NORMAL, true); + this.checkTilt(TiltType.CONFIG, true); if (redstonePowered) { isOn = true; diff --git a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java index 8acf1b033..9208fab1f 100644 --- a/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java +++ b/src/main/java/com/hbm/tileentity/machine/fusion/TileEntityFusionTorus.java @@ -98,7 +98,7 @@ public class TileEntityFusionTorus extends TileEntityCooledBase implements IGUIP public void updateEntity() { if(!worldObj.isRemote) { - this.checkTilt(TiltType.CONFIG_NORMAL, true); + this.checkTilt(TiltType.CONFIG, true); for(int i = 0; i < 4; i++) { if(klystronNodes[i] == null || klystronNodes[i].expired) klystronNodes[i] = createNode(KlystronNetworkProvider.THE_PROVIDER, ForgeDirection.getOrientation(i + 2)); diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java index 06547e4ab..9ff7a6cee 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java @@ -105,7 +105,7 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements public void updateEntity() { if(!worldObj.isRemote) { - this.checkTilt(TiltType.CONFIG_528, false); + this.checkTilt(TiltType.CONFIG, false); this.fluidUsed = 0; this.output = 0; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java index 960cd6873..22debb280 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java @@ -133,7 +133,7 @@ public class TileEntityMachineRefinery extends TileEntityMachineBase implements public void updateEntity() { if(!worldObj.isRemote) { - this.checkTilt(TiltType.CONFIG_528, false); + this.checkTilt(TiltType.CONFIG, false); this.isOn = false; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBatterySocket.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBatterySocket.java index cc9b9b75f..46ab76084 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBatterySocket.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBatterySocket.java @@ -210,12 +210,14 @@ public class TileEntityBatterySocket extends TileEntityBatteryBase implements IR @Override public boolean canExtractItem(int i, ItemStack stack, int j) { if(stack.getItem() instanceof IBatteryItem) { - if(i == mode_input && ((IBatteryItem)stack.getItem()).getCharge(stack) == 0) return true; - if(i == mode_output && ((IBatteryItem)stack.getItem()).getCharge(stack) == ((IBatteryItem)stack.getItem()).getMaxCharge(stack)) return true; + if(i == mode_output && ((IBatteryItem)stack.getItem()).getCharge(stack) == 0) return true; + if(i == mode_input && ((IBatteryItem)stack.getItem()).getCharge(stack) == ((IBatteryItem)stack.getItem()).getMaxCharge(stack)) return true; } return false; } + @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return stack.getItem() instanceof IBatteryItem; } + @Override public int[] getAccessibleSlotsFromSide(int side) { return new int[] {0}; } @Override public long getPower() { diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java index 3cb5e2969..785e4302e 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageAccess.java @@ -11,17 +11,21 @@ import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.ntl.IPneumaticConnector; +import api.hbm.ntl.StackCache; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -// throwing the towel - for now. there's a test i could run, but it's a lot of work and will likely just confirm my suspicions about performance -// this demands another sidequest: fucking multi threading public class TileEntityPneumoStorageAccess extends TileEntity implements IPneumaticConnector, IGUIProvider { protected PneumaticNode node; + public StackCache cache; + + public TileEntityPneumoStorageAccess() { + this.cache = new StackCache(); + } @Override public void updateEntity() { diff --git a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java index 854fe86b8..156aa6ca8 100644 --- a/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java +++ b/src/main/java/com/hbm/tileentity/network/pneumatic/TileEntityPneumoStorageClutter.java @@ -106,6 +106,7 @@ public class TileEntityPneumoStorageClutter extends TileEntityMachineBase implem @Override public SlotMonitor[] getMonitors() { return monitors; } @Override public ItemStack getSlotAt(int index) { return this.getStackInSlot(index); } + @Override public long getAmountAt(int index) { ItemStack stack = getSlotAt(index); return stack != null ? stack.stackSize : 0; } @Override public boolean isAvailableToTerminal(int termX, int termY, int termZ) { diff --git a/src/main/resources/assets/hbm/textures/items/ammo_standard.gyro.png b/src/main/resources/assets/hbm/textures/items/ammo_standard.gyro.png new file mode 100644 index 0000000000000000000000000000000000000000..4036198c1fb703bc18ae28666dadf3bb6e5de40a GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf#&1>>;4}92Zz3flyO)!9lX5DPjya`{siS6981pf2CevDyCvZQYs`{DLxCpg z<}Ak}{#%c2Te86SF+cbG#_u<7vc8+EGUadDnG5k{+!gO9=RL7n9N^b3@AFJ}Pra>k z=)*aW;}g6Y7+&|gcbxdiGjR^b!i3`6{pHGTl5WTUBQJUrRlu;W@GK{%y_IMyjh- xzt1*&ZIn7uF-|B?h_&2v(L?W(`ycN6!!)s`nc1l=c^S~Z44$rjF6*2UngFgyd=>xz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/ammo_standard.gyro_explosive.png b/src/main/resources/assets/hbm/textures/items/ammo_standard.gyro_explosive.png new file mode 100644 index 0000000000000000000000000000000000000000..018bafa1567edc9ff0d7c1b2f33a40fe35785758 GIT binary patch literal 356 zcmV-q0h|7bP)LMJ1E$aPAHX;O`g2OeDR<$Rp`F8sF|X)zjTlGfc}@@+Ox z&9r!XPH1nm>0K^knkGsqnP;2<0Icl4qU(D0u1~gpgydt2QVLzy0k}JB;Z5H0#}T_n z50&c_2cneX_EZ7TSzW~HM+8AY7>1<~tq45WTM&O7vA)*A>PJ~3K*}J^V&nMSZ+Mdr zb`C=Tf*{ELB!8)@6=v2+6I^WH)9G#E-8|79Ccipy3K7RfWNL|gK1%EwQkJArj*Yxr zElKPeB2!C715IMr5XYuIBu!GwTn4Fa&O`oeuF@C3M0oDIBw82%0000> literal 0 HcmV?d00001