From f7d2038f7eef2eca6cfe1a210aee92c221a4ca8f Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 10 Nov 2025 15:37:35 +0100 Subject: [PATCH] some AStack crap, fusion torus struct block --- changelog | 2 + src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../machine/BlockFusionTorusStruct.java | 16 ++ .../java/com/hbm/crafting/ToolRecipes.java | 6 - .../hbm/handler/nei/BookRecipeHandler.java | 2 +- .../java/com/hbm/inventory/RecipesCommon.java | 233 ++++++++++-------- .../recipes/AssemblyMachineRecipes.java | 5 + .../inventory/recipes/CentrifugeRecipes.java | 2 +- .../inventory/recipes/CyclotronRecipes.java | 8 +- .../hbm/inventory/recipes/HadronRecipes.java | 4 +- .../hbm/inventory/recipes/MagicRecipes.java | 3 +- .../recipes/loader/SerializableRecipe.java | 30 ++- src/main/java/com/hbm/items/BrokenItem.java | 64 +++++ src/main/java/com/hbm/items/ModItems.java | 25 +- src/main/java/com/hbm/main/ClientProxy.java | 1 + src/main/java/com/hbm/main/MainRegistry.java | 5 + .../RenderFusionTorusMultiblock.java | 39 +++ .../java/com/hbm/tileentity/TileMappings.java | 1 + .../machine/TileEntityFusionTorusStruct.java | 82 ++++++ src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../hbm/textures/blocks/struct_torus_core.png | Bin 0 -> 514 bytes .../textures/gui/processing/gui_precass.png | Bin 0 -> 3422 bytes .../hbm/textures/items/bob_assembly.png | Bin 295 -> 0 bytes .../hbm/textures/items/bob_chemistry.png | Bin 255 -> 0 bytes .../hbm/textures/items/bob_metalworks.png | Bin 248 -> 0 bytes .../assets/hbm/textures/items/bob_nuclear.png | Bin 306 -> 0 bytes .../assets/hbm/textures/items/bob_oil.png | Bin 193 -> 0 bytes .../assets/hbm/textures/items/broken_item.png | Bin 0 -> 192 bytes .../{assembly_machine_alt.png => precass.png} | Bin 30 files changed, 384 insertions(+), 151 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/BlockFusionTorusStruct.java create mode 100644 src/main/java/com/hbm/items/BrokenItem.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderFusionTorusMultiblock.java create mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityFusionTorusStruct.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/struct_torus_core.png create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_precass.png delete mode 100644 src/main/resources/assets/hbm/textures/items/bob_assembly.png delete mode 100644 src/main/resources/assets/hbm/textures/items/bob_chemistry.png delete mode 100644 src/main/resources/assets/hbm/textures/items/bob_metalworks.png delete mode 100644 src/main/resources/assets/hbm/textures/items/bob_nuclear.png delete mode 100644 src/main/resources/assets/hbm/textures/items/bob_oil.png create mode 100644 src/main/resources/assets/hbm/textures/items/broken_item.png rename src/main/resources/assets/hbm/textures/models/machines/{assembly_machine_alt.png => precass.png} (100%) diff --git a/changelog b/changelog index bf2ab4458..62e7761eb 100644 --- a/changelog +++ b/changelog @@ -31,6 +31,7 @@ * Defusing creepers now also works if the creeper hasn't lit its fuse yet * Defused creepers are now permanently harmless, they can no longer be manually re-ignited at all * Manual defusers now also affect big man johnson + * Defusing only works if the timer is active * The glpyhid will explode instantly, but only about as powerful as a conventional rocket, not destroying blocks * Doing so will also drop one usable demolition mini nuke * The painsaw ability no longer plays the blood splash particle effect @@ -43,6 +44,7 @@ * The old NITAN powder chests have been removed * In their place, there's now a different, more useful structure with similar but not identical spawn rules * ROR controller torches can now set the threshold of particle accelerator dipoles +* Removed the legacy recipes from the terra drills ## Fixed * Fixed arc furnace only allowing electrodes to be inserted when the lid is down instead of up diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 287405541..9437356db 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -866,6 +866,7 @@ public class ModBlocks { public static Block struct_soyuz_core; public static Block struct_iter_core; public static Block struct_plasma_core; + public static Block struct_torus_core; public static Block struct_watz_core; public static Block struct_icf_core; @@ -2009,6 +2010,7 @@ public class ModBlocks { struct_soyuz_core = new BlockSoyuzStruct(Material.iron).setBlockName("struct_soyuz_core").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":struct_soyuz_core"); struct_iter_core = new BlockITERStruct(Material.iron).setBlockName("struct_iter_core").setLightLevel(1F).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":struct_iter_core"); struct_plasma_core = new BlockPlasmaStruct(Material.iron).setBlockName("struct_plasma_core").setLightLevel(1F).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":struct_plasma_core"); + struct_torus_core = new BlockFusionTorusStruct(Material.iron).setBlockName("struct_torus_core").setLightLevel(1F).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":struct_torus_core"); struct_watz_core = new BlockWatzStruct(Material.iron).setBlockName("struct_watz_core").setLightLevel(1F).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":struct_watz_core"); struct_icf_core = new BlockICFStruct(Material.iron).setBlockName("struct_icf_core").setLightLevel(1F).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":struct_icf_core"); @@ -3378,6 +3380,7 @@ public class ModBlocks { GameRegistry.registerBlock(struct_soyuz_core, struct_soyuz_core.getUnlocalizedName()); GameRegistry.registerBlock(struct_iter_core, struct_iter_core.getUnlocalizedName()); GameRegistry.registerBlock(struct_plasma_core, struct_plasma_core.getUnlocalizedName()); + register(struct_torus_core); GameRegistry.registerBlock(struct_watz_core, struct_watz_core.getUnlocalizedName()); GameRegistry.registerBlock(struct_icf_core, struct_icf_core.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/BlockFusionTorusStruct.java b/src/main/java/com/hbm/blocks/machine/BlockFusionTorusStruct.java new file mode 100644 index 000000000..0a3233bbc --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/BlockFusionTorusStruct.java @@ -0,0 +1,16 @@ +package com.hbm.blocks.machine; + +import com.hbm.tileentity.machine.TileEntityFusionTorusStruct; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class BlockFusionTorusStruct extends BlockContainer { + + public BlockFusionTorusStruct(Material mat) { super(mat); } + + @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityFusionTorusStruct(); } + @Override public boolean isOpaqueCube() { return false; } +} diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 45ad0922c..1fd1539b2 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -9,7 +9,6 @@ import static com.hbm.inventory.OreDictManager.*; import com.hbm.items.ItemEnums.EnumPlantType; import com.hbm.items.ItemGenericPart.EnumPartType; import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemBattery; import com.hbm.items.machine.ItemCircuit.EnumCircuitType; import com.hbm.items.tool.ItemBlowtorch; import com.hbm.items.tool.ItemModMinecart; @@ -72,11 +71,6 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.meteorite_sword, 1), new Object[] { " B", "GB ", "SG ", 'B', ModItems.blade_meteorite, 'G', GOLD.plate(), 'S', KEY_STICK }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.dwarven_pickaxe, 1), new Object[] { "CIC", " S ", " S ", 'C', CU.ingot(), 'I', IRON.ingot(), 'S', KEY_STICK }); - //Drax - CraftingManager.addRecipeAuto(new ItemStack(ModItems.drax, 1), new Object[] { "BDS", "CDC", "FMF", 'B', ModItems.starmetal_pickaxe, 'S', ModItems.starmetal_shovel, 'C', CO.ingot(), 'F', ModItems.fusion_core, 'D', DESH.ingot(), 'M', ModItems.motor_desh }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.drax_mk2, 1), new Object[] { "SCS", "IDI", "FEF", 'S', STAR.ingot(), 'C', ModItems.crystal_trixite, 'I', BIGMT.ingot(), 'D', ModItems.drax, 'F', ModItems.fusion_core, 'E', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.drax_mk3, 1), new Object[] { "ECE", "CDC", "SBS", 'E', ModBlocks.block_euphemium_cluster, 'C', ModItems.crystal_schrabidium, 'D', ModItems.drax_mk2, 'S', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID), 'B', ItemBattery.getFullBattery(ModItems.battery_spark) }); - //Super pickaxes CraftingManager.addRecipeAuto(new ItemStack(ModItems.bismuth_pickaxe, 1), new Object[] { " BM", "BPB", "TB ", 'B', ModItems.ingot_bismuth, 'M', ModItems.ingot_meteorite, 'P', ModItems.starmetal_pickaxe, 'T', W.bolt() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.volcanic_pickaxe, 1), new Object[] { " BM", "BPB", "TB ", 'B', ModItems.gem_volcanic, 'M', ModItems.ingot_meteorite, 'P', ModItems.starmetal_pickaxe, 'T', W.bolt() }); diff --git a/src/main/java/com/hbm/handler/nei/BookRecipeHandler.java b/src/main/java/com/hbm/handler/nei/BookRecipeHandler.java index d77b5ac74..4e3b73dca 100644 --- a/src/main/java/com/hbm/handler/nei/BookRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/BookRecipeHandler.java @@ -141,7 +141,7 @@ public class BookRecipeHandler extends TemplateRecipeHandler implements ICompatN for(AStack astack : recipe.in) { - if(astack.isApplicable(ingredient)) { + if(astack.matchesRecipe(ingredient, true)) { List input = new ArrayList(); diff --git a/src/main/java/com/hbm/inventory/RecipesCommon.java b/src/main/java/com/hbm/inventory/RecipesCommon.java index d13ca1dcf..433735f9d 100644 --- a/src/main/java/com/hbm/inventory/RecipesCommon.java +++ b/src/main/java/com/hbm/inventory/RecipesCommon.java @@ -3,6 +3,7 @@ package com.hbm.inventory; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Set; import com.hbm.config.GeneralConfig; import com.hbm.items.ModItems; @@ -11,6 +12,7 @@ import com.hbm.main.MainRegistry; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.oredict.OreDictionary; @@ -35,6 +37,7 @@ public class RecipesCommon { public static ItemStack[] objectToStackArray(Object[] array) { if(array == null) + return null; ItemStack[] clone = new ItemStack[array.length]; @@ -52,34 +55,6 @@ public class RecipesCommon { public int stacksize; - public boolean isApplicable(ItemStack stack) { - return isApplicable(new ComparableStack(stack)); - } - - /* - * Is it unprofessional to pool around in child classes from an abstract superclass? Do I look like I give a shit? - * - * Major fuckup: comparablestacks need EQUAL stacksize but the oredictstack ignores stack size entirely - */ - public boolean isApplicable(ComparableStack comp) { - - if(this instanceof ComparableStack) { - return ((ComparableStack)this).equals(comp); - } - - if(this instanceof OreDictStack) { - - List ores = OreDictionary.getOres(((OreDictStack)this).name); - - for(ItemStack stack : ores) { - if(stack.getItem() == comp.item && stack.getItemDamage() == comp.meta) - return true; - } - } - - return false; - } - /** * Whether the supplied itemstack is applicable for a recipe (e.g. anvils). Slightly different from {@code isApplicable}. * @param stack the ItemStack to check @@ -87,8 +62,9 @@ public class RecipesCommon { * @return */ public abstract boolean matchesRecipe(ItemStack stack, boolean ignoreSize); - + public abstract AStack copy(); + public abstract AStack copy(int stacksize); /** * Generates either an ItemStack or an ArrayList of ItemStacks @@ -230,28 +206,27 @@ public class RecipesCommon { @Override public boolean equals(Object obj) { - if(this == obj) - return true; - if(obj == null) - return false; - if(getClass() != obj.getClass()) - return false; + if(this == obj) return true; + if(obj == null) return false; + if(getClass() != obj.getClass()) return false; ComparableStack other = (ComparableStack) obj; if(item == null) { - if(other.item != null) - return false; + if(other.item != null) return false; } else if(!item.equals(other.item)) return false; - if(meta != OreDictionary.WILDCARD_VALUE && other.meta != OreDictionary.WILDCARD_VALUE && meta != other.meta) - return false; - if(stacksize != other.stacksize) - return false; + if(meta != OreDictionary.WILDCARD_VALUE && other.meta != OreDictionary.WILDCARD_VALUE && meta != other.meta) return false; + if(stacksize != other.stacksize) return false; return true; } @Override public int compareTo(AStack stack) { + //if compared with a NBTStack, the CStack will yield + if(stack instanceof NBTStack) return -1; + //if compared with an ODStack, the CStack will take priority + if(stack instanceof OreDictStack) return 1; + if(stack instanceof ComparableStack) { ComparableStack comp = (ComparableStack) stack; @@ -259,31 +234,24 @@ public class RecipesCommon { int thisID = Item.getIdFromItem(item); int thatID = Item.getIdFromItem(comp.item); - if(thisID > thatID) - return 1; - if(thatID > thisID) - return -1; + if(thisID > thatID) return 1; + if(thatID > thisID) return -1; - if(meta > comp.meta) - return 1; - if(comp.meta > meta) - return -1; + if(meta > comp.meta) return 1; + if(comp.meta > meta) return -1; return 0; } - - //if compared with an ODStack, the CStack will take priority - if(stack instanceof OreDictStack) - return 1; return 0; } @Override - public AStack copy() { + public ComparableStack copy() { return new ComparableStack(item, stacksize, meta); } - + + @Override public ComparableStack copy(int stacksize) { return new ComparableStack(item, stacksize, meta); } @@ -291,17 +259,10 @@ public class RecipesCommon { @Override public boolean matchesRecipe(ItemStack stack, boolean ignoreSize) { - if(stack == null) - return false; - - if(stack.getItem() != this.item) - return false; - - if(this.meta != OreDictionary.WILDCARD_VALUE && stack.getItemDamage() != this.meta) - return false; - - if(!ignoreSize && stack.stackSize < this.stacksize) - return false; + if(stack == null) return false; + if(stack.getItem() != this.item) return false; + if(this.meta != OreDictionary.WILDCARD_VALUE && stack.getItemDamage() != this.meta) return false; + if(!ignoreSize && stack.stackSize < this.stacksize) return false; return true; } @@ -312,53 +273,107 @@ public class RecipesCommon { } } - /* - * This implementation does not override the compare function, which effectively makes it ignore stack data. - * This is still in line with the use-case of the ComparableNBTStack holding machine output stack information, - * since the compare function is not needed. In case the compare function is required, make a new child class. - */ - public static class ComparableNBTStack extends ComparableStack { + public static class NBTStack extends ComparableStack { - NBTTagCompound nbt; + public NBTTagCompound nbt; - public ComparableNBTStack(ItemStack stack) { - super(stack); - } - - public ComparableNBTStack(Item item) { - super(item); - } - - public ComparableNBTStack(Block item) { - super(item); - } - - public ComparableNBTStack(Block item, int stacksize) { - super(item, stacksize); - } - - public ComparableNBTStack(Block item, int stacksize, int meta) { - super(item, stacksize, meta); - } - - public ComparableNBTStack(Item item, int stacksize) { - super(item, stacksize); - } - - public ComparableNBTStack(Item item, int stacksize, int meta) { - super(item, stacksize, meta); - } - - public ComparableNBTStack addNBT(NBTTagCompound nbt) { + public NBTStack(Item item) { super(item); } + public NBTStack(Block item) { super(item); } + public NBTStack(Block item, int stacksize) { super(item, stacksize); } + public NBTStack(Block item, int stacksize, int meta) { super(item, stacksize, meta); } + public NBTStack(Block item, int stacksize, Enum meta) { super(item, stacksize, meta); } + public NBTStack(Item item, int stacksize) { super(item, stacksize); } + public NBTStack(Item item, int stacksize, int meta) { super(item, stacksize, meta); } + public NBTStack(Item item, int stacksize, Enum meta) { super(item, stacksize, meta); } + public NBTStack(ItemStack stack) { super(stack.getItem(), stack.stackSize, stack.getItemDamage()); this.withNBT(stack.stackTagCompound); } + + public NBTStack withNBT(NBTTagCompound nbt) { this.nbt = nbt; return this; } + public NBTStack initNBT() { + if(this.nbt == null) this.nbt = new NBTTagCompound(); + return this; + } + + public NBTStack setInt(String key, int value) { + initNBT().nbt.setInteger(key, value); + return this; + } + + @Override public ItemStack toStack() { - ItemStack stack = super.toStack(); - stack.stackTagCompound = this.nbt; + ItemStack stack = new ItemStack(item == null ? ModItems.nothing : item, stacksize, meta); + if(this.nbt != null) stack.stackTagCompound = (NBTTagCompound) nbt.copy(); return stack; } + + /** + * For an ItemStack to match an NBTStack, all the rules from ComparableStack apply, with the added condition that all + * tags in the NBTStack's NBTTagCompound need to be present and equal the tags of the ItemStack. Any additional tags + * the ItemStack has are ignored. + */ + @Override + public boolean matchesRecipe(ItemStack stack, boolean ignoreSize) { + + if(stack == null) return false; + if(stack.getItem() != this.item) return false; + if(this.meta != OreDictionary.WILDCARD_VALUE && stack.getItemDamage() != this.meta) return false; + if(!ignoreSize && stack.stackSize < this.stacksize) return false; + if(this.nbt != null && !this.nbt.hasNoTags() && stack.stackTagCompound == null) return false; + + if(this.nbt != null && stack.stackTagCompound != null) { + Set neededKeys = this.nbt.func_150296_c(); + for(String key : neededKeys) { + NBTBase tag = stack.stackTagCompound.getTag(key); + if(tag == null) return false; + if(!this.nbt.getTag(key).equals(tag)) return false; + } + } + + return true; + } + + @Override + public NBTStack copy() { + return new NBTStack(item, stacksize, meta).withNBT(nbt != null ? (NBTTagCompound) nbt.copy() : null); + } + + @Override + public NBTStack copy(int stacksize) { + return new NBTStack(item, stacksize, meta).withNBT(nbt != null ? (NBTTagCompound) nbt.copy() : null); + } + + @Override + public int compareTo(AStack stack) { + + if(stack instanceof NBTStack) { + + NBTStack comp = (NBTStack) stack; + + int thisID = Item.getIdFromItem(item); + int thatID = Item.getIdFromItem(comp.item); + + if(thisID > thatID) return 1; + if(thatID > thisID) return -1; + + if(meta > comp.meta) return 1; + if(comp.meta > meta) return -1; + + if(nbt != null && comp.nbt == null) return 1; + if(nbt == null && comp.nbt != null) return -1; + + return 0; + } + + //if compared with a CStack, the NBTStack will take priority + if(stack instanceof ComparableStack) return 1; + //if compared with an ODStack, the NBTStack will take priority + if(stack instanceof OreDictStack) return 1; + + return 0; + } } public static class OreDictStack extends AStack { @@ -387,19 +402,19 @@ public class RecipesCommon { OreDictStack comp = (OreDictStack) stack; return name.compareTo(comp.name); } - + //if compared with a CStack, the ODStack will yield - if(stack instanceof ComparableStack) - return -1; + if(stack instanceof ComparableStack) return -1; return 0; } @Override - public AStack copy() { + public OreDictStack copy() { return new OreDictStack(name, stacksize); } - + + @Override public OreDictStack copy(int stacksize) { return new OreDictStack(name, stacksize); } diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java index 3fab919ca..79e8a9dcb 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblyMachineRecipes.java @@ -56,6 +56,11 @@ public class AssemblyMachineRecipes extends GenericRecipes { @Override public void registerDefaults() { + // NBTStack test + // this.register(new GenericRecipe("demo1").setup(20, 100).outputItems(BrokenItem.make(ModItems.plate_iron)).inputItems(new OreDictStack(IRON.ingot()))); + // this.register(new GenericRecipe("demo2").setup(20, 100).outputItems(BrokenItem.make(ModItems.plate_gold)).inputItems(new OreDictStack(IRON.ingot()))); + // this.register(new GenericRecipe("demo3").setup(20, 100).outputItems(new ItemStack(Items.iron_ingot)).inputItems(new NBTStack(BrokenItem.make(ModItems.plate_iron)))); + // plates and ingots String autoPlate = "autoswitch.plates"; this.register(new GenericRecipe("ass.plateiron").setup(60, 100).outputItems(new ItemStack(ModItems.plate_iron, 1)).inputItems(new OreDictStack(IRON.ingot())).setPools(GenericRecipes.POOL_PREFIX_ALT + "plates").setGroup(autoPlate, this)); diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index 2a48a04f7..b8b9b5e43 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -353,7 +353,7 @@ public class CentrifugeRecipes extends SerializableRecipe { return RecipesCommon.copyStackArray(recipes.get(comp)); for(Entry entry : recipes.entrySet()) { - if(entry.getKey().isApplicable(stack)) { + if(entry.getKey().matchesRecipe(stack, true)) { return RecipesCommon.copyStackArray(entry.getValue()); } } diff --git a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java index 734c24b5c..cdce21d3d 100644 --- a/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CyclotronRecipes.java @@ -103,16 +103,12 @@ public class CyclotronRecipes extends SerializableRecipe { public static Object[] getOutput(ItemStack stack, ItemStack box) { - if(stack == null || stack.getItem() == null || box == null) - return null; + if(stack == null || stack.getItem() == null || box == null) return null; - ComparableStack boxStack = new ComparableStack(box).makeSingular(); - ComparableStack comp = new ComparableStack(stack).makeSingular(); - //boo hoo we iterate over a hash map, cry me a river for(Entry, Pair> entry : recipes.entrySet()) { - if(entry.getKey().getKey().isApplicable(boxStack) && entry.getKey().getValue().isApplicable(comp)) { + if(entry.getKey().getKey().matchesRecipe(box, true) && entry.getKey().getValue().matchesRecipe(stack, true)) { return new Object[] { entry.getValue().getKey().copy(), entry.getValue().getValue() }; } } diff --git a/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java b/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java index d2cccc339..95d8b56cf 100644 --- a/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java @@ -133,8 +133,8 @@ import net.minecraft.item.ItemStack; for(HadronRecipe r : recipes) { - if((r.in1.isApplicable(in1) && r.in2.isApplicable(in2)) || - (r.in1.isApplicable(in2) && r.in2.isApplicable(in1))) { + if((r.in1.matchesRecipe(in1, false) && r.in2.matchesRecipe(in2, false)) || + (r.in1.matchesRecipe(in2, false) && r.in2.matchesRecipe(in1, false))) { if(analysisOnly && !r.analysisOnly) returnCode = EnumHadronState.NORESULT_WRONG_MODE; if(momentum < r.momentum) returnCode = EnumHadronState.NORESULT_TOO_SLOW; diff --git a/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java b/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java index 863f76c25..51cedb994 100644 --- a/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/MagicRecipes.java @@ -79,8 +79,7 @@ public class MagicRecipes { for(int i = 0; i < in.size(); i++) { - if(!in.get(i).isApplicable(comps.get(i))) - return false; + if(!in.get(i).matchesRecipe(comps.get(i).toStack(), false)) return false; } return true; diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index 2770da7c7..e128c4736 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -16,6 +16,7 @@ import com.google.gson.stream.JsonWriter; import com.hbm.inventory.FluidStack; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.RecipesCommon.NBTStack; import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; @@ -29,6 +30,9 @@ import com.hbm.util.Tuple.Pair; import api.hbm.recipe.IRecipeRegisterListener; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.JsonToNBT; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; //the anti-spaghetti. this class provides so much functionality and saves so much time, i just love you, SerializableRecipe <3 public abstract class SerializableRecipe { @@ -253,6 +257,12 @@ public abstract class SerializableRecipe { try { String type = array.get(0).getAsString(); int stacksize = array.size() > 2 ? array.get(2).getAsInt() : 1; + if("nbt".equals(type)) { + Item item = (Item) Item.itemRegistry.getObject(array.get(1).getAsString()); + int meta = array.size() > 3 ? array.get(3).getAsInt() : 0; + NBTBase nbt = JsonToNBT.func_150315_a(array.get(array.size() - 1).getAsString()); + return new NBTStack(item, stacksize, meta).withNBT(nbt instanceof NBTTagCompound ? (NBTTagCompound) nbt : null); + } if("item".equals(type)) { Item item = (Item) Item.itemRegistry.getObject(array.get(1).getAsString()); int meta = array.size() > 3 ? array.get(3).getAsInt() : 0; @@ -280,18 +290,24 @@ public abstract class SerializableRecipe { public static void writeAStack(AStack astack, JsonWriter writer) throws IOException { writer.beginArray(); writer.setIndent(""); - if(astack instanceof ComparableStack) { + if(astack instanceof NBTStack) { + NBTStack comp = (NBTStack) astack; + writer.value(comp.nbt != null ? "nbt" : "item"); //NBT identifier + writer.value(Item.itemRegistry.getNameForObject(comp.toStack().getItem())); //item name + if(comp.stacksize != 1 || comp.meta > 0) writer.value(comp.stacksize); //stack size + if(comp.meta > 0) writer.value(comp.meta); //metadata + if(comp.nbt != null) writer.value(comp.nbt.toString()); //NBT + } else if(astack instanceof ComparableStack) { ComparableStack comp = (ComparableStack) astack; writer.value("item"); //ITEM identifier writer.value(Item.itemRegistry.getNameForObject(comp.toStack().getItem())); //item name - if(comp.stacksize != 1 || comp.meta > 0) writer.value(comp.stacksize); //stack size + if(comp.stacksize != 1 || comp.meta > 0) writer.value(comp.stacksize); //stack size if(comp.meta > 0) writer.value(comp.meta); //metadata - } - if(astack instanceof OreDictStack) { + } else if(astack instanceof OreDictStack) { OreDictStack ore = (OreDictStack) astack; - writer.value("dict"); //DICT identifier - writer.value(ore.name); //dict name - if(ore.stacksize != 1) writer.value(ore.stacksize); //stacksize + writer.value("dict"); //DICT identifier + writer.value(ore.name); //dict name + if(ore.stacksize != 1) writer.value(ore.stacksize); //stacksize } writer.endArray(); writer.setIndent(" "); diff --git a/src/main/java/com/hbm/items/BrokenItem.java b/src/main/java/com/hbm/items/BrokenItem.java new file mode 100644 index 000000000..83af6b7d7 --- /dev/null +++ b/src/main/java/com/hbm/items/BrokenItem.java @@ -0,0 +1,64 @@ +package com.hbm.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; + +public class BrokenItem extends Item { + + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() { + return true; + } + + @Override + public int getRenderPasses(int meta) { + return 2; + } + + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack stack, int pass) { + if(pass == 1) return this.itemIcon; + if(stack.stackTagCompound == null) return this.itemIcon; + + String id = stack.stackTagCompound.getString("itemID"); + int meta = stack.stackTagCompound.getInteger("itemMeta"); + + Item item = (Item) Item.itemRegistry.getObject(id); + if(item == null) return this.itemIcon; + + return item.getIconFromDamage(meta); + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + if(stack.stackTagCompound == null) return super.getItemStackDisplayName(stack); + + String id = stack.stackTagCompound.getString("itemID"); + int meta = stack.stackTagCompound.getInteger("itemMeta"); + + Item item = (Item) Item.itemRegistry.getObject(id); + if(item == null) return super.getItemStackDisplayName(stack); + + ItemStack sta = new ItemStack(item, 1, meta); + return StatCollector.translateToLocalFormatted(this.getUnlocalizedNameInefficiently(stack) + ".prefix", sta.getDisplayName()); + } + + public static ItemStack make(ItemStack stack) { return make(stack.getItem(), stack.stackSize, stack.getItemDamage()); } + public static ItemStack make(Item item) { return make(item, 1, 0); } + public static ItemStack make(Item item, int meta) { return make(item, 1, meta); } + + public static ItemStack make(Item item, int stacksize, int meta) { + ItemStack stack = new ItemStack(ModItems.broken_item, stacksize); + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("itemID", Item.itemRegistry.getNameForObject(item)); + nbt.setInteger("itemMeta", meta); + stack.stackTagCompound = nbt; + return stack; + } +} diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 8b85f9fef..05b0ed3a6 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -2223,14 +2223,11 @@ public class ModItems { public static Item orange6; public static Item orange7; public static Item orange8; + public static Item nothing; + public static Item broken_item; public static Item achievement_icon; - public static Item bob_metalworks; - public static Item bob_assembly; - public static Item bob_chemistry; - public static Item bob_oil; - public static Item bob_nuclear; public static Item mysteryshovel; public static Item memory; @@ -4963,15 +4960,11 @@ public class ModItems { orange6 = new Item().setUnlocalizedName("orange6").setTextureName(RefStrings.MODID + ":orange6"); orange7 = new Item().setUnlocalizedName("orange7").setTextureName(RefStrings.MODID + ":orange7"); orange8 = new Item().setUnlocalizedName("orange8").setTextureName(RefStrings.MODID + ":orange8"); + nothing = new Item().setUnlocalizedName("nothing").setTextureName(RefStrings.MODID + ":nothing"); - + broken_item = new BrokenItem().setUnlocalizedName("broken_item").setTextureName(RefStrings.MODID + ":broken_item"); achievement_icon = new ItemEnumMulti(ItemEnums.EnumAchievementType.class, true, true).setUnlocalizedName("achievement_icon"); - bob_metalworks = new Item().setUnlocalizedName("bob_metalworks").setTextureName(RefStrings.MODID + ":bob_metalworks"); - bob_assembly = new Item().setUnlocalizedName("bob_assembly").setTextureName(RefStrings.MODID + ":bob_assembly"); - bob_chemistry = new Item().setUnlocalizedName("bob_chemistry").setTextureName(RefStrings.MODID + ":bob_chemistry"); - bob_oil = new Item().setUnlocalizedName("bob_oil").setTextureName(RefStrings.MODID + ":bob_oil"); - bob_nuclear = new Item().setUnlocalizedName("bob_nuclear").setTextureName(RefStrings.MODID + ":bob_nuclear"); mysteryshovel = new ItemMS().setUnlocalizedName("mysteryshovel").setFull3D().setMaxStackSize(1).setTextureName(RefStrings.MODID + ":cursed_shovel"); memory = new ItemBattery(Long.MAX_VALUE / 100L, 100000000000000L, 100000000000000L).setUnlocalizedName("memory").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":mo8_anim"); @@ -7169,16 +7162,14 @@ public class ModItems { GameRegistry.registerItem(orange6, orange6.getUnlocalizedName()); GameRegistry.registerItem(orange7, orange7.getUnlocalizedName()); GameRegistry.registerItem(orange8, orange8.getUnlocalizedName()); - GameRegistry.registerItem(nothing, nothing.getUnlocalizedName()); GameRegistry.registerItem(achievement_icon, achievement_icon.getUnlocalizedName()); - GameRegistry.registerItem(bob_metalworks, bob_metalworks.getUnlocalizedName()); - GameRegistry.registerItem(bob_assembly, bob_assembly.getUnlocalizedName()); - GameRegistry.registerItem(bob_chemistry, bob_chemistry.getUnlocalizedName()); - GameRegistry.registerItem(bob_oil, bob_oil.getUnlocalizedName()); - GameRegistry.registerItem(bob_nuclear, bob_nuclear.getUnlocalizedName()); + GameRegistry.registerItem(mysteryshovel, mysteryshovel.getUnlocalizedName()); GameRegistry.registerItem(memory, memory.getUnlocalizedName()); GameRegistry.registerItem(conveyor_wand, conveyor_wand.getUnlocalizedName()); + + GameRegistry.registerItem(nothing, nothing.getUnlocalizedName()); + GameRegistry.registerItem(broken_item, broken_item.getUnlocalizedName()); } public static void addRemap(String unloc, Item item, Enum sub) { diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index f87d3a4ef..5c76f64d0 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -424,6 +424,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityICF.class, new RenderICF()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityICFController.class, new RenderICFController()); //Fusion + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFusionTorusStruct.class, new RenderFusionTorusMultiblock()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFusionTorus.class, new RenderFusionTorus()); //Watz ClientRegistry.bindTileEntitySpecialRenderer(TileEntityWatz.class, new RenderWatz()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index e8c951ae4..89881dc6e 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1442,6 +1442,11 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.hadron_power_100m"); ignoreMappings.add("hbm:tile.hadron_power_1g"); ignoreMappings.add("hbm:tile.hadron_power_10g"); + ignoreMappings.add("hbm:item.bob_metalworks"); + ignoreMappings.add("hbm:item.bob_assembly"); + ignoreMappings.add("hbm:item.bob_chemistry"); + ignoreMappings.add("hbm:item.bob_oil"); + ignoreMappings.add("hbm:item.bob_nuclear"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/render/tileentity/RenderFusionTorusMultiblock.java b/src/main/java/com/hbm/render/tileentity/RenderFusionTorusMultiblock.java new file mode 100644 index 000000000..95768a264 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderFusionTorusMultiblock.java @@ -0,0 +1,39 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.fusion.MachineFusionTorus; +import com.hbm.render.util.SmallBlockPronter; + +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +public class RenderFusionTorusMultiblock extends TileEntitySpecialRenderer { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + + bindTexture(TextureMap.locationBlocksTexture); + SmallBlockPronter.startDrawing(); + + for(int iy = 0; iy < 5; iy++) { + for(int ix = 0; ix < MachineFusionTorus.layout[0].length; ix++) { + for(int iz = 0; iz < MachineFusionTorus.layout[0][0].length; iz++) { + + int ly = iy > 2 ? 4 - iy : iy; + int i = MachineFusionTorus.layout[ly][ix][iz]; + if(i == 0) continue; + SmallBlockPronter.drawSmolBlockAt(ModBlocks.fusion_component, i, ix - 7, iy, iz - 7); + } + } + } + + SmallBlockPronter.draw(); + + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 0b425e1b8..7878059f4 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -413,6 +413,7 @@ public class TileMappings { } private static void putFusion() { + put(TileEntityFusionTorusStruct.class, "tileentity_fusion_torus_struct"); put(TileEntityFusionTorus.class, "tileentity_fusion_torus"); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFusionTorusStruct.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFusionTorusStruct.java new file mode 100644 index 000000000..e794018be --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFusionTorusStruct.java @@ -0,0 +1,82 @@ +package com.hbm.tileentity.machine; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.machine.fusion.MachineFusionTorus; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityFusionTorusStruct extends TileEntity { + + @Override + public void updateEntity() { + + if(worldObj.isRemote) return; + if(worldObj.getTotalWorldTime() % 20 != 0) return; + + for(int y = 0; y < 5; y++) { + for(int x = 0; x < MachineFusionTorus.layout[0].length; x++) { + for(int z = 0; z < MachineFusionTorus.layout[0][0].length; z++) { + + int ly = y > 2 ? 4 - y : y; + int i = MachineFusionTorus.layout[ly][x][z]; + + if(i == 0) continue; // ignore air + if(x == 7 && y == 0 && z == 7) continue; // ignore core component position + if(!cbr(ModBlocks.fusion_component, i, x - 7, y, z - 7)) return; + } + } + } + + MachineFusionTorus block = (MachineFusionTorus) ModBlocks.fusion_torus; + BlockDummyable.safeRem = true; + worldObj.setBlock(xCoord, yCoord, zCoord, ModBlocks.fusion_torus, 12, 3); + block.fillSpace(worldObj, xCoord, yCoord, zCoord, ForgeDirection.NORTH, 0); + BlockDummyable.safeRem = false; + } + + /** [G]et [B]lock at [R]elative position */ + private Block gbr(int x, int y, int z) { + return worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z); + } + + /** [G]et [M]eta at [R]elative position */ + private int gmr(int x, int y, int z) { + return worldObj.getBlockMetadata(xCoord + x, yCoord + y, zCoord + z); + } + + /** [C]heck [B]lock at [R]elative position */ + private boolean cbr(Block b, int meta, int x, int y, int z) { + return b == gbr(x, y, z) && meta == gmr(x, y, z); + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 7, + yCoord, + zCoord - 7, + xCoord + 8, + yCoord + 5, + zCoord + 8 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 4c5787a06..dd8ba0192 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1484,6 +1484,8 @@ item.boy_target.name=Unterkritischer U235 Hohlkörper item.briquette.coal.name=Kohlebrikett item.briquette.lignite.name=Braunkohlebrikett item.briquette.wood.name=Holzbrikett +item.broken_item.name=Defekter Gegenstand +item.broken_item.prefix=%s (Defekt) item.bucket_acid.name=Säureeimer item.bucket_mud.name=Eimer mit giftigem Schlamm item.bucket_schrabidic_acid.name=Eimer mit Schrabidischer Säure diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 1e20ec8e8..2d31d14b6 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2257,6 +2257,8 @@ item.boy_target.name=Subcritical U235 Target item.briquette.coal.name=Coal Briquette item.briquette.lignite.name=Lignite Briquette item.briquette.wood.name=Sawdust Briquette +item.broken_item.name=Broken Item +item.broken_item.prefix=Broken %s item.bucket_acid.name=Bucket of Acid item.bucket_mud.name=Bucket of Poisonous Mud item.bucket_schrabidic_acid.name=Bucket of Schrabidic Acid diff --git a/src/main/resources/assets/hbm/textures/blocks/struct_torus_core.png b/src/main/resources/assets/hbm/textures/blocks/struct_torus_core.png new file mode 100644 index 0000000000000000000000000000000000000000..8c1807450e3d15af8fdfa1b07a32a8d066e377b5 GIT binary patch literal 514 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/bob_assembly.png b/src/main/resources/assets/hbm/textures/items/bob_assembly.png deleted file mode 100644 index 94a997f526e87bbed432288ad79993d31a34aa9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfp4u1mh1-w1%s!npUXO@geCw=R&hQ6 diff --git a/src/main/resources/assets/hbm/textures/items/bob_chemistry.png b/src/main/resources/assets/hbm/textures/items/bob_chemistry.png deleted file mode 100644 index 5bb88fd3c5f7573bbc821a80e2c6f0ed14f20aba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf_t(CI@rJ{{b*DA{bmr}fxN7+DQp*~~nZ0=i!kdn` zn8)(4z7SimIuWE%UX0Cv^~k34d;hm*G3@efIkJIG$>(9uF?pk;5|eiK z+=}-f@2!p7q;nyv{QONGoAbg90!|GU0 uD$nmQpL?(_Vd<-o5B?H@2dnq%{$RLL7O(4*cKs#L=?tE(elF{r5}E*N=wZ|V diff --git a/src/main/resources/assets/hbm/textures/items/bob_nuclear.png b/src/main/resources/assets/hbm/textures/items/bob_nuclear.png deleted file mode 100644 index 6bd0225d7ff2ef6373ce37096a6c9278a3dd7f26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmV-20nPr2P)@c`Q82d|75Gq-M-^b>{v2z2Z`+|yq85RaJ%vlNHvb~kl#G{N(g2CrB*Os z>!=xEoWo+Rsa20atw3uHz+|Q)0mo?_ieypckI3Y7fXl(Wrn-2hI#kP5~9b;{X5v07*qoM6N<$ Ef*0R=ssI20 diff --git a/src/main/resources/assets/hbm/textures/items/bob_oil.png b/src/main/resources/assets/hbm/textures/items/bob_oil.png deleted file mode 100644 index e2e71f831782d5f26e8949d31b7ccb6f5a6522aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf#1%x><3?9<{3#p;}blFM%FZw=e~+ay8D@qeAMxBi#Em-yW$ o@Mx+0d~O_C?(U+)$nb#S#|EEkKX>Z90J?#})78&qol`;+0ByfVfB*mh diff --git a/src/main/resources/assets/hbm/textures/items/broken_item.png b/src/main/resources/assets/hbm/textures/items/broken_item.png new file mode 100644 index 0000000000000000000000000000000000000000..838d4a23d9541de7815223d9edc65b0c3d9f157d GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf