From d13d0679b773dc4f07944eaa9dcd8ff5615e43a2 Mon Sep 17 00:00:00 2001 From: Toshayo Date: Sun, 2 Mar 2025 21:50:50 +0100 Subject: [PATCH 1/8] Added OpenComputers integration for redstone-over-radio receiver/transmitter --- .../network/TileEntityRadioTorchBase.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java index e63a5b6e3..921ddd245 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityRadioTorchBase.java @@ -1,17 +1,24 @@ package com.hbm.tileentity.network; +import com.hbm.handler.CompatHandler; import com.hbm.interfaces.IControlReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BufferUtil; +import cpw.mods.fml.common.Optional; import io.netty.buffer.ByteBuf; +import li.cil.oc.api.machine.Arguments; +import li.cil.oc.api.machine.Callback; +import li.cil.oc.api.machine.Context; +import li.cil.oc.api.network.SimpleComponent; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; -public class TileEntityRadioTorchBase extends TileEntityLoadedBase implements IControlReceiver { +@Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) +public class TileEntityRadioTorchBase extends TileEntityLoadedBase implements IControlReceiver, SimpleComponent, CompatHandler.OCComponent { /** channel we're broadcasting on/listening to */ public String channel = ""; @@ -103,4 +110,31 @@ public class TileEntityRadioTorchBase extends TileEntityLoadedBase implements IC this.markDirty(); } + + @Override + @Optional.Method(modid = "OpenComputers") + public String getComponentName() { + return "radio_torch"; + } + + @Callback(direct = true, limit = 4, doc = "setChannle(channel: string) -- Set the channel the torch is listening/broadcasting to") + @Optional.Method(modid = "OpenComputers") + public Object[] setChannel(Context context, Arguments args) { + channel = args.checkString(0); + return new Object[] {}; + } + + @Callback(direct = true, limit = 4, doc = "setPolling(value: boolean) -- Switches state change mode to tick-based polling") + @Optional.Method(modid = "OpenComputers") + public Object[] setPolling(Context context, Arguments args) { + polling = args.checkBoolean(0); + return new Object[] {}; + } + + @Callback(direct = true, limit = 4, doc = "setCustomMap(value: boolean) -- Switches redstone passthrough to custom signal mapping") + @Optional.Method(modid = "OpenComputers") + public Object[] setCustomMap(Context context, Arguments args) { + customMap = args.checkBoolean(0); + return new Object[] {}; + } } From 228fbf506d5b3837242e1fa96ea959c616f97066 Mon Sep 17 00:00:00 2001 From: Toshayo Date: Sun, 2 Mar 2025 23:26:01 +0100 Subject: [PATCH 2/8] Added satellite NEI handler --- .../com/hbm/handler/nei/SatelliteHandler.java | 189 ++++++++++++++++++ src/main/java/com/hbm/main/NEIRegistry.java | 1 + .../saveddata/satellites/SatelliteMiner.java | 17 +- 3 files changed, 204 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/hbm/handler/nei/SatelliteHandler.java diff --git a/src/main/java/com/hbm/handler/nei/SatelliteHandler.java b/src/main/java/com/hbm/handler/nei/SatelliteHandler.java new file mode 100644 index 000000000..77e0c3cb4 --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/SatelliteHandler.java @@ -0,0 +1,189 @@ +package com.hbm.handler.nei; + +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; +import com.hbm.blocks.ModBlocks; +import com.hbm.handler.imc.ICompatNHNEI; +import com.hbm.itempool.ItemPool; +import com.hbm.itempool.ItemPoolsSatellite; +import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; +import com.hbm.saveddata.satellites.SatelliteMiner; +import com.hbm.util.ItemStackUtil; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.util.WeightedRandomChestContent; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; + +public class SatelliteHandler extends TemplateRecipeHandler implements ICompatNHNEI { + @Override + public ItemStack[] getMachinesForRecipe() { + return new ItemStack[] { + new ItemStack(ModBlocks.sat_dock) + }; + } + + @Override + public String getRecipeID() { + return "ntmSatellite"; + } + + @Override + public String getRecipeName() { + return "Satellite"; + } + + @Override + public String getGuiTexture() { + return RefStrings.MODID + ":textures/gui/nei/gui_nei_anvil.png"; + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if(outputId.equals("ntmSatellite")) { + for(Item satelliteItem : new Item[]{ModItems.sat_miner, ModItems.sat_lunar_miner}) { + String poolName = SatelliteMiner.getCargoForItem(satelliteItem); + if(poolName == null) { + continue; + } + this.addRecipeToList(satelliteItem, ItemPool.getPool(poolName)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for(Item satelliteItem : new Item[]{ModItems.sat_miner, ModItems.sat_lunar_miner}) { + String poolName = SatelliteMiner.getCargoForItem(satelliteItem); + if(poolName == null) { + continue; + } + WeightedRandomChestContent[] pool = ItemPool.getPool(poolName); + for(WeightedRandomChestContent poolEntry : pool) { + if(NEIServerUtils.areStacksSameTypeCrafting(poolEntry.theItemId, result)) { + this.addRecipeToList(satelliteItem, pool); + break; + } + } + } + } + + @Override + public void loadUsageRecipes(String inputId, Object... ingredients) { + if(inputId.equals("ntmSatellite")) { + loadCraftingRecipes("ntmSatellite"); + } else { + super.loadUsageRecipes(inputId, ingredients); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + if(ingredient.getItem() == ModItems.sat_miner) { + this.addRecipeToList(ModItems.sat_miner, ItemPool.getPool(ItemPoolsSatellite.POOL_SAT_MINER)); + } else if(ingredient.getItem() == ModItems.sat_lunar_miner) { + this.addRecipeToList(ModItems.sat_lunar_miner, ItemPool.getPool(ItemPoolsSatellite.POOL_SAT_LUNAR)); + } + } + + + private void addRecipeToList(Item poolItem, WeightedRandomChestContent[] poolEntries) { + List outs = new ArrayList<>(); + int weight = Arrays.stream(poolEntries).mapToInt(poolEntry -> poolEntry.itemWeight).sum(); + + for(WeightedRandomChestContent poolEntry : poolEntries) { + ItemStack stack = poolEntry.theItemId.copy(); + + float chance = 100F * poolEntry.itemWeight / weight; + ItemStackUtil.addTooltipToStack(stack, EnumChatFormatting.RED + "" + ((int)(chance * 10F) / 10F) + "%"); + + outs.add(stack); + } + + this.arecipes.add(new RecipeSet(new ItemStack(poolItem), outs)); + } + + @Override + public void drawBackground(int recipe) { + super.drawBackground(recipe); + + drawTexturedModalRect(11, 23, 113, 105, 18, 18); //in + drawTexturedModalRect(47, 5, 5, 87, 108, 54); //out + drawTexturedModalRect(29, 14, 131, 96, 18, 36); //operation + } + + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + List input = new ArrayList<>(); + List output = new ArrayList<>(); + PositionedStack satelliteDock; + + public RecipeSet(Object in, List out) { + //not the prettiest of solutions but certainly the most pleasant to work with + int inLine = 1; + int outLine = 1; + int inOX = 0; + int inOY = 0; + int outOX = 0; + int outOY = 0; + int anvX = 0; + int anvY = 31; + + outLine = 6; + inOX = 12; + inOY = 24; + outOX = 48; + outOY = 6; + anvX = 30; + + this.input.add(new PositionedStack(in, inOX, inOY)); + + int overflowCount = out.size() / 18; + for(int i = 0; i < Math.min(out.size(), 18); i++) { + ItemStack[] stacks = new ItemStack[overflowCount + 1]; + for(int j = 0; j < overflowCount + 1 && j * 18 + i < out.size(); j++) { + stacks[j] = out.get(j * 18 + i); + } + this.output.add(new PositionedStack(stacks, outOX + 18 * (i % outLine), outOY + 18 * (i / outLine))); + } + + this.satelliteDock = new PositionedStack(new ItemStack(ModBlocks.sat_dock), anvX, anvY); + } + + @Override + public List getIngredients() { + return getCycledIngredients(cycleticks / 20, input); + } + + @Override + public PositionedStack getResult() { + return output.get(0); + } + + @Override + public List getOtherStacks() { + ArrayList stacks = new ArrayList<>(output); + stacks.add(satelliteDock); + return getCycledIngredients(cycleticks / 20, stacks); + } + } + + private static HashMap getRecipeMap() { + HashMap recipeMap = new HashMap<>(); + ItemStack minerStack = new ItemStack(ModItems.sat_miner); + ItemStack lunarMinerStack = new ItemStack(ModItems.sat_lunar_miner); + Arrays.stream(ItemPool.getPool(ItemPoolsSatellite.POOL_SAT_MINER)).forEach(poolEntry -> recipeMap.put(minerStack, poolEntry.theItemId)); + Arrays.stream(ItemPool.getPool(ItemPoolsSatellite.POOL_SAT_LUNAR)).forEach(poolEntry -> recipeMap.put(lunarMinerStack, poolEntry.theItemId)); + return recipeMap; + } +} diff --git a/src/main/java/com/hbm/main/NEIRegistry.java b/src/main/java/com/hbm/main/NEIRegistry.java index 79c495534..12d7101c7 100644 --- a/src/main/java/com/hbm/main/NEIRegistry.java +++ b/src/main/java/com/hbm/main/NEIRegistry.java @@ -43,6 +43,7 @@ public class NEIRegistry { handlers.add(new CrucibleCastingHandler()); handlers.add(new ToolingHandler()); handlers.add(new ConstructionHandler()); + handlers.add(new SatelliteHandler()); //universal boyes handlers.add(new ZirnoxRecipeHandler()); diff --git a/src/main/java/com/hbm/saveddata/satellites/SatelliteMiner.java b/src/main/java/com/hbm/saveddata/satellites/SatelliteMiner.java index 8481a54e9..daca3b22d 100644 --- a/src/main/java/com/hbm/saveddata/satellites/SatelliteMiner.java +++ b/src/main/java/com/hbm/saveddata/satellites/SatelliteMiner.java @@ -2,6 +2,7 @@ package com.hbm.saveddata.satellites; import com.hbm.itempool.ItemPoolsSatellite; import com.hbm.util.WeightedRandomObject; +import net.minecraft.item.Item; import net.minecraft.nbt.NBTTagCompound; import java.util.HashMap; @@ -13,15 +14,15 @@ public class SatelliteMiner extends Satellite { private static final HashMap, String> CARGO = new HashMap<>(); public long lastOp; - + public SatelliteMiner() { this.satIface = Interfaces.NONE; } - + public void writeToNBT(NBTTagCompound nbt) { nbt.setLong("lastOp", lastOp); } - + public void readFromNBT(NBTTagCompound nbt) { lastOp = nbt.getLong("lastOp"); } @@ -42,6 +43,16 @@ public class SatelliteMiner extends Satellite { return CARGO.get(getClass()); } + /** + * Gets the cargo key for the satellite item. If the item is not a miner satellite null is returned. + * @param satelliteItem - Satellite item + * @return - Returns {@link com.hbm.itempool.ItemPool} key or null if the item is not a mining satellite. + */ + public static String getCargoForItem(Item satelliteItem) { + Class satelliteClass = itemToClass.getOrDefault(satelliteItem, null); + return satelliteClass != null ? CARGO.getOrDefault(satelliteClass, null) : null; + } + static { registerCargo(SatelliteMiner.class, ItemPoolsSatellite.POOL_SAT_MINER); } From 00cacbbadc1bff2ca28da24dadd6b2df63a9fdb0 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 3 Mar 2025 16:05:28 +0100 Subject: [PATCH 3/8] damage fix, mas36 anim error, server config command --- changelog | 33 ++--- .../java/com/hbm/blocks/bomb/Landmine.java | 29 ++++- .../com/hbm/commands/CommandReloadClient.java | 123 ++++-------------- .../com/hbm/commands/CommandReloadConfig.java | 102 +++++++++++++++ .../com/hbm/commands/CommandReloadServer.java | 45 +++++++ .../java/com/hbm/config/ClientConfig.java | 96 +------------- .../java/com/hbm/config/RunningConfig.java | 110 ++++++++++++++++ .../java/com/hbm/config/ServerConfig.java | 58 +++++++++ .../com/hbm/explosion/ExplosionNukeSmall.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 3 +- .../weapon/sedna/factory/XFactory762mm.java | 2 +- src/main/java/com/hbm/main/MainRegistry.java | 3 + .../java/com/hbm/main/ModEventHandler.java | 13 ++ .../hbm/render/anim/BusAnimationSequence.java | 1 + .../java/com/hbm/util/EntityDamageUtil.java | 57 +++++++- .../hbm/textures/blocks/glass_polarized.png | Bin 0 -> 205 bytes .../textures/blocks/glass_polarized_ct.png | Bin 0 -> 260 bytes .../hbm/textures/items/ingot_metal_sheet.png | Bin 6159 -> 6157 bytes 18 files changed, 446 insertions(+), 231 deletions(-) create mode 100644 src/main/java/com/hbm/commands/CommandReloadConfig.java create mode 100644 src/main/java/com/hbm/commands/CommandReloadServer.java create mode 100644 src/main/java/com/hbm/config/RunningConfig.java create mode 100644 src/main/java/com/hbm/config/ServerConfig.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/glass_polarized.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/glass_polarized_ct.png diff --git a/changelog b/changelog index c410ab62a..96cce6458 100644 --- a/changelog +++ b/changelog @@ -1,29 +1,14 @@ ## Added -* A new legendary weapon +* `/ntmserver` + * Functions like `/ntmclient` but for common settings + * Can toggle `DAMAGE_COMPATIBILITY_MODE`, off by default, enables a more compatible (but slightly jankier) version of the bullet damage code + * `MINE__DAMAGE` can be used to adjust landmine damage ## Changed -* Updated russian localization -* Large deposits (hematite, malachite, bauxite) and caves (sulfur, asbestos) can now be toggled in the config -* Removed recipes for most old particle accelerator parts -* Dense coils no longer have recipes either for the most part, all coils with no recipes can be recycled back into dense wires -* Natural gas can now be processed in a pyrolysis oven, 12k of gas yields 8k hydrogen and one graphite ingot -* Saturnite now has an alternate recipe, adding one pile of borax for doubled output -* All mass storage units (except wood) are now substantially cheaper -* Reduced base spread for all 12 and 10 gauge buckshot shells from 0.05 to 0.035 -* Reduced legendary 12 lever action's spread multiplier from x1.35 to x1.15 -* Bullet casings now spawn with randomized angular velocity -* Bullet casings now correctly bounce off walls, and change angles when bouncing -* Two previously unobtainable legendaries are now in the red room loot pool (about 10x less common than most other items) +* Fat mines now use the standardized mini nuke code + * Fat mines now have a base damage of exactly 100, being identical to demolition mini nukes + * Fat mines now gib affected entities +* IV bags now use `setHealth` operations instead of dealing damage, preventing health duplication by just avoiding the damage ## Fixed -* Fixed an issue where `/ntmreload` would load fluids after recipes, meaning that recipes using newly added fluids would not work correctly, as the fluids don't exist by the time the recipe is loaded -* Fixed bedrock coltan being way too common, drowning out almost all other bedrock ores -* Fixed rotary furnace not saving its output stack -* Fixed strand caster water check being incorrect, creating negative water by allowing operations with insufficient cooling -* Fixed radar not using the small remaining amount of power, causing the animation getting stuck -* Fixed the new system structures being way too common -* Fixed RBMKs losing all their flux when reloading the world -* Fixed issue where DODD fuel item stats would only update when the GUI was open -* Fixed muzzle flashes not being fullbright -* Fixed guns having their name permanently visible over the toolbar -* Fixed hangman being absolutely gigantic when dropped \ No newline at end of file +* Fixed animation error on the MAS-36 \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/bomb/Landmine.java b/src/main/java/com/hbm/blocks/bomb/Landmine.java index 03a505e55..ec75235b6 100644 --- a/src/main/java/com/hbm/blocks/bomb/Landmine.java +++ b/src/main/java/com/hbm/blocks/bomb/Landmine.java @@ -3,8 +3,8 @@ package com.hbm.blocks.bomb; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.config.ServerConfig; import com.hbm.explosion.ExplosionLarge; -import com.hbm.explosion.ExplosionNukeSmall; import com.hbm.explosion.vanillant.ExplosionVNT; import com.hbm.explosion.vanillant.standard.BlockAllocatorStandard; import com.hbm.explosion.vanillant.standard.BlockProcessorStandard; @@ -13,8 +13,13 @@ import com.hbm.explosion.vanillant.standard.ExplosionEffectWeapon; import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; import com.hbm.interfaces.IBomb; import com.hbm.items.ModItems; +import com.hbm.items.weapon.sedna.factory.XFactoryCatapult; +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.tileentity.bomb.TileEntityLandmine; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.BlockFence; @@ -23,6 +28,7 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; @@ -138,7 +144,7 @@ public class Landmine extends BlockContainer implements IBomb { if(this == ModBlocks.mine_ap) { ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 3F); - vnt.setEntityProcessor(new EntityProcessorCrossSmooth(0.5, 10F).setupPiercing(5F, 0.2F)); + vnt.setEntityProcessor(new EntityProcessorCrossSmooth(0.5, ServerConfig.MINE_AP_DAMAGE.get()).setupPiercing(5F, 0.2F)); vnt.setPlayerProcessor(new PlayerProcessorStandard()); vnt.setSFX(new ExplosionEffectWeapon(5, 1F, 0.5F)); vnt.explode(); @@ -146,13 +152,13 @@ public class Landmine extends BlockContainer implements IBomb { ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 4F); vnt.setBlockAllocator(new BlockAllocatorStandard()); vnt.setBlockProcessor(new BlockProcessorStandard()); - vnt.setEntityProcessor(new EntityProcessorCrossSmooth(1, 35).setupPiercing(15F, 0.2F)); + vnt.setEntityProcessor(new EntityProcessorCrossSmooth(1, ServerConfig.MINE_HE_DAMAGE.get()).setupPiercing(15F, 0.2F)); vnt.setPlayerProcessor(new PlayerProcessorStandard()); vnt.setSFX(new ExplosionEffectWeapon(15, 3.5F, 1.25F)); vnt.explode(); } else if(this == ModBlocks.mine_shrap) { ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 3F); - vnt.setEntityProcessor(new EntityProcessorCrossSmooth(0.5, 7.5F)); + vnt.setEntityProcessor(new EntityProcessorCrossSmooth(0.5, ServerConfig.MINE_SHRAP_DAMAGE.get())); vnt.setPlayerProcessor(new PlayerProcessorStandard()); vnt.setSFX(new ExplosionEffectWeapon(5, 1F, 0.5F)); vnt.explode(); @@ -160,7 +166,20 @@ public class Landmine extends BlockContainer implements IBomb { ExplosionLarge.spawnShrapnelShower(world, x + 0.5, y + 0.5, z + 0.5, 0, 1D, 0, 45, 0.2D); ExplosionLarge.spawnShrapnels(world, x + 0.5, y + 0.5, z + 0.5, 5); } else if(this == ModBlocks.mine_fat) { - ExplosionNukeSmall.explode(world, x + 0.5, y + 0.5, z + 0.5, ExplosionNukeSmall.PARAMS_MEDIUM); + + ExplosionVNT vnt = new ExplosionVNT(world, x + 0.5, y + 0.5, z + 0.5, 10); + vnt.setBlockAllocator(new BlockAllocatorStandard(64)); + vnt.setBlockProcessor(new BlockProcessorStandard()); + vnt.setEntityProcessor(new EntityProcessorCrossSmooth(2, ServerConfig.MINE_NUKE_DAMAGE.get()).withRangeMod(1.5F)); + vnt.setPlayerProcessor(new PlayerProcessorStandard()); + vnt.explode(); + + XFactoryCatapult.incrementRad(world, x, y, z, 1.5F); + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "muke"); + data.setBoolean("balefire", MainRegistry.polaroidID == 11 || world.rand.nextInt(100) == 0); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, x + 0.5, y + 0.5, z + 0.5), new TargetPoint(world.provider.dimensionId, x + 0.5, y + 0.5, z + 0.5, 250)); + } } diff --git a/src/main/java/com/hbm/commands/CommandReloadClient.java b/src/main/java/com/hbm/commands/CommandReloadClient.java index 6f0c9672a..84f21988b 100644 --- a/src/main/java/com/hbm/commands/CommandReloadClient.java +++ b/src/main/java/com/hbm/commands/CommandReloadClient.java @@ -1,24 +1,18 @@ package com.hbm.commands; -import java.util.Collections; -import java.util.List; -import java.util.Map.Entry; -import java.util.stream.Collectors; +import java.util.HashMap; import com.hbm.config.ClientConfig; -import com.hbm.config.ClientConfig.ConfigWrapper; +import com.hbm.config.RunningConfig.ConfigWrapper; import cpw.mods.fml.relauncher.FMLLaunchHandler; import cpw.mods.fml.relauncher.Side; -import net.minecraft.command.CommandBase; -import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.client.ClientCommandHandler; -public class CommandReloadClient extends CommandBase { +public class CommandReloadClient extends CommandReloadConfig { public static void register() { if(FMLLaunchHandler.side() != Side.CLIENT) return; @@ -34,95 +28,26 @@ public class CommandReloadClient extends CommandBase { public String getCommandUsage(ICommandSender sender) { return "/ntmclient help"; } - - @Override - public boolean canCommandSenderUseCommand(ICommandSender sender) { - return sender instanceof EntityPlayer; - } - - @Override - public void processCommand(ICommandSender sender, String[] args) { - - if(args.length < 1) throw new CommandException(getCommandUsage(sender)); - - String operator = args[0]; - - if("help".equals(operator)) { - - if(args.length >= 2) { - String command = args[1]; - if("help".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Shows usage for /ntmclient subcommands.")); - if("list".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Shows all client variable names and values.")); - if("reload".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Reads client variables from the config file.")); - if("get".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Shows value for the specified variable name.")); - if("set".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Sets a variable's value and saves it to the config file.")); - } else { - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmclient " + EnumChatFormatting.GOLD + "help " + EnumChatFormatting.RED + "")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmclient " + EnumChatFormatting.GOLD + "list")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmclient " + EnumChatFormatting.GOLD + "reload")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmclient " + EnumChatFormatting.GOLD + "get " + EnumChatFormatting.RED + "")); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmclient " + EnumChatFormatting.GOLD + "set " + EnumChatFormatting.RED + " ")); - } - return; - } - - if("list".equals(operator)) { - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "CLIENT VARIABLES:")); - for(Entry line : ClientConfig.configMap.entrySet()) { - sender.addChatMessage(new ChatComponentText(" " + EnumChatFormatting.GOLD + line.getKey() + ": " + EnumChatFormatting.YELLOW + line.getValue().value)); - } - return; - } - - if("reload".equals(operator)) { - ClientConfig.reload(); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Variables loaded from config file.")); - return; - } - - if(args.length < 2) throw new CommandException(getCommandUsage(sender)); - - String key = args[1]; - - if("get".equals(operator)) { - ConfigWrapper wrapper = ClientConfig.configMap.get(key); - if(wrapper == null) throw new CommandException("Key does not exist."); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + key + ": " + EnumChatFormatting.YELLOW + wrapper.value)); - return; - } - - if(args.length < 3) throw new CommandException(getCommandUsage(sender)); - - String value = args[2]; - - if("set".equals(operator)) { - ConfigWrapper wrapper = ClientConfig.configMap.get(key); - if(wrapper == null) throw new CommandException("Key does not exist."); - - try { - wrapper.update(value); - ClientConfig.refresh(); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Value updated.")); - } catch(Exception ex) { - throw new CommandException("Error parsing type for " + wrapper.value.getClass().getSimpleName() + ": " + ex.getLocalizedMessage()); - } - - return; - } - - throw new CommandException(getCommandUsage(sender)); - } - - @SuppressWarnings("rawtypes") - @Override - public List addTabCompletionOptions(ICommandSender sender, String[] args) { - if(!(sender instanceof EntityPlayer)) return Collections.emptyList(); - if(args.length < 1) return Collections.emptyList(); - if(args.length == 1) return getListOfStringsMatchingLastWord(args, "list", "reload", "get", "set"); - String operator = args[0]; - if(args.length == 2 && ("get".equals(operator) || "set".equals(operator))) { - return getListOfStringsFromIterableMatchingLastWord(args, ClientConfig.configMap.keySet().stream().map(String::valueOf).collect(Collectors.toList())); - } - return Collections.emptyList(); + + @Override public void help(ICommandSender sender, String[] args) { + if(args.length >= 2) { + String command = args[1]; + if("help".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Shows usage for /ntmclient subcommands.")); + if("list".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Shows all client variable names and values.")); + if("reload".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Reads client variables from the config file.")); + if("get".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Shows value for the specified variable name.")); + if("set".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Sets a variable's value and saves it to the config file.")); + } else { + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmclient " + EnumChatFormatting.GOLD + "help " + EnumChatFormatting.RED + "")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmclient " + EnumChatFormatting.GOLD + "list")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmclient " + EnumChatFormatting.GOLD + "reload")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmclient " + EnumChatFormatting.GOLD + "get " + EnumChatFormatting.RED + "")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmclient " + EnumChatFormatting.GOLD + "set " + EnumChatFormatting.RED + " ")); + } } + + @Override public HashMap getConfigMap() { return ClientConfig.configMap; } + @Override public void refresh() { ClientConfig.refresh(); } + @Override public void reload() { ClientConfig.reload(); } + @Override public String getTitle() { return "CLIENT VARIABLES:"; } } diff --git a/src/main/java/com/hbm/commands/CommandReloadConfig.java b/src/main/java/com/hbm/commands/CommandReloadConfig.java new file mode 100644 index 000000000..fbe35111a --- /dev/null +++ b/src/main/java/com/hbm/commands/CommandReloadConfig.java @@ -0,0 +1,102 @@ +package com.hbm.commands; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import com.hbm.config.RunningConfig.ConfigWrapper; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; + +public abstract class CommandReloadConfig extends CommandBase { + + @Override + public boolean canCommandSenderUseCommand(ICommandSender sender) { + return sender instanceof EntityPlayer; + } + + public abstract void help(ICommandSender sender, String[] args); + public abstract HashMap getConfigMap(); + public abstract void refresh(); + public abstract void reload(); + public abstract String getTitle(); + + @Override + public void processCommand(ICommandSender sender, String[] args) { + + if(args.length < 1) throw new CommandException(getCommandUsage(sender)); + + String operator = args[0]; + + if("help".equals(operator)) { + help(sender, args); + return; + } + + if("list".equals(operator)) { + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + getTitle())); + for(Entry line : getConfigMap().entrySet()) { + sender.addChatMessage(new ChatComponentText(" " + EnumChatFormatting.GOLD + line.getKey() + ": " + EnumChatFormatting.YELLOW + line.getValue().value)); + } + return; + } + + if("reload".equals(operator)) { + reload(); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Variables loaded from config file.")); + return; + } + + if(args.length < 2) throw new CommandException(getCommandUsage(sender)); + + String key = args[1]; + + if("get".equals(operator)) { + ConfigWrapper wrapper = getConfigMap().get(key); + if(wrapper == null) throw new CommandException("Key does not exist."); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + key + ": " + EnumChatFormatting.YELLOW + wrapper.value)); + return; + } + + if(args.length < 3) throw new CommandException(getCommandUsage(sender)); + + String value = args[2]; + + if("set".equals(operator)) { + ConfigWrapper wrapper = getConfigMap().get(key); + if(wrapper == null) throw new CommandException("Key does not exist."); + + try { + wrapper.update(value); + refresh(); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Value updated.")); + } catch(Exception ex) { + throw new CommandException("Error parsing type for " + wrapper.value.getClass().getSimpleName() + ": " + ex.getLocalizedMessage()); + } + + return; + } + + throw new CommandException(getCommandUsage(sender)); + } + + @SuppressWarnings("rawtypes") + @Override + public List addTabCompletionOptions(ICommandSender sender, String[] args) { + if(!(sender instanceof EntityPlayer)) return Collections.emptyList(); + if(args.length < 1) return Collections.emptyList(); + if(args.length == 1) return getListOfStringsMatchingLastWord(args, "list", "reload", "get", "set"); + String operator = args[0]; + if(args.length == 2 && ("get".equals(operator) || "set".equals(operator))) { + return getListOfStringsFromIterableMatchingLastWord(args, getConfigMap().keySet().stream().map(String::valueOf).collect(Collectors.toList())); + } + return Collections.emptyList(); + } +} diff --git a/src/main/java/com/hbm/commands/CommandReloadServer.java b/src/main/java/com/hbm/commands/CommandReloadServer.java new file mode 100644 index 000000000..33c572141 --- /dev/null +++ b/src/main/java/com/hbm/commands/CommandReloadServer.java @@ -0,0 +1,45 @@ +package com.hbm.commands; + +import java.util.HashMap; + +import com.hbm.config.RunningConfig.ConfigWrapper; +import com.hbm.config.ServerConfig; + +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; + +public class CommandReloadServer extends CommandReloadConfig { + + @Override + public String getCommandName() { + return "ntmserver"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/ntmserver help"; + } + + @Override public void help(ICommandSender sender, String[] args) { + if(args.length >= 2) { + String command = args[1]; + if("help".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Shows usage for /ntmserver subcommands.")); + if("list".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Shows all server variable names and values.")); + if("reload".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Reads server variables from the config file.")); + if("get".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Shows value for the specified variable name.")); + if("set".equals(command)) sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Sets a variable's value and saves it to the config file.")); + } else { + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmserver " + EnumChatFormatting.GOLD + "help " + EnumChatFormatting.RED + "")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmserver " + EnumChatFormatting.GOLD + "list")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmserver " + EnumChatFormatting.GOLD + "reload")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmserver " + EnumChatFormatting.GOLD + "get " + EnumChatFormatting.RED + "")); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "/ntmserver " + EnumChatFormatting.GOLD + "set " + EnumChatFormatting.RED + " ")); + } + } + + @Override public HashMap getConfigMap() { return ServerConfig.configMap; } + @Override public void refresh() { ServerConfig.refresh(); } + @Override public void reload() { ServerConfig.reload(); } + @Override public String getTitle() { return "SERVER VARIABLES:"; } +} diff --git a/src/main/java/com/hbm/config/ClientConfig.java b/src/main/java/com/hbm/config/ClientConfig.java index 4d171cad7..2f5cec902 100644 --- a/src/main/java/com/hbm/config/ClientConfig.java +++ b/src/main/java/com/hbm/config/ClientConfig.java @@ -1,21 +1,12 @@ package com.hbm.config; import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.stream.JsonWriter; +import com.hbm.config.RunningConfig.ConfigWrapper; import com.hbm.main.MainRegistry; import com.hbm.util.Compat; import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; // https://youtube.com/shorts/XTHZWqZt_AI public class ClientConfig { @@ -86,91 +77,10 @@ public class ClientConfig { } private static void readConfig(File config) { - - try { - JsonObject json = gson.fromJson(new FileReader(config), JsonObject.class); - - for(Entry line : configMap.entrySet()) { - - if(json.has(line.getKey())) { - JsonElement value = json.get(line.getKey()); - - try { - - //world's shittiest dynamic type parser - if(configMap.containsKey(line.getKey())) { - if(line.getValue().value instanceof String) configMap.get(line.getKey()).set(value.getAsString()); - if(line.getValue().value instanceof Float) configMap.get(line.getKey()).set(value.getAsFloat()); - if(line.getValue().value instanceof Double) configMap.get(line.getKey()).set(value.getAsDouble()); - if(line.getValue().value instanceof Integer) configMap.get(line.getKey()).set(value.getAsInt()); - if(line.getValue().value instanceof Boolean) configMap.get(line.getKey()).set(value.getAsBoolean()); - } - - //gson doesn't give me the option to read the raw value of a JsonPrimitive so we have to this shit effectively twice - //once to make sure that the parsed data matches with what's determined by the default, - //and a second time in the ConfigWrapper to add ease of reading the data without needing manual casts - - } catch(Exception ex) { - ex.printStackTrace(); - } - } - } - - } catch(Exception ex) { - ex.printStackTrace(); - } + RunningConfig.readConfig(config, configMap); } private static void writeConfig(File config) { - - try { - JsonWriter writer = new JsonWriter(new FileWriter(config)); - writer.setIndent(" "); - writer.beginObject(); - - writer.name("info").value("This file can be edited ingame using the /ntmclient command."); - - List keys = new ArrayList(); - keys.addAll(configMap.keySet()); - Collections.sort(keys); //readability is cool - - for(String key : keys) { - - ConfigWrapper wrapper = configMap.get(key); - Object value = wrapper.value; - //this sucks and i am too stupid to come up with something better - if(value instanceof String) writer.name(key).value((String) value); - if(value instanceof Float) writer.name(key).value((Float) value); - if(value instanceof Double) writer.name(key).value((Double) value); - if(value instanceof Integer) writer.name(key).value((Integer) value); - if(value instanceof Boolean) writer.name(key).value((Boolean) value); - } - - writer.endObject(); - writer.close(); - } catch(IOException e) { - e.printStackTrace(); - } - } - - public static class ConfigWrapper { - public T value; - - public ConfigWrapper(T o) { - this.value = o; - } - - public T get() { return value; } - public void set(T value) { this.value = value; } - - public void update(String param) { - Object stupidBufferObject = null; // wahh wahh can't cast Float to T wahh wahh shut the fuck up - if(value instanceof String) stupidBufferObject = param; - if(value instanceof Float) stupidBufferObject = Float.parseFloat(param); - if(value instanceof Double) stupidBufferObject = Double.parseDouble(param); - if(value instanceof Integer) stupidBufferObject = Integer.parseInt(param); - if(value instanceof Boolean) stupidBufferObject = Boolean.parseBoolean(param); - if(stupidBufferObject != null) this.value = (T) stupidBufferObject; - } + RunningConfig.writeConfig(config, configMap, "This file can be edited ingame using the /ntmclient command."); } } diff --git a/src/main/java/com/hbm/config/RunningConfig.java b/src/main/java/com/hbm/config/RunningConfig.java new file mode 100644 index 000000000..66ebe9193 --- /dev/null +++ b/src/main/java/com/hbm/config/RunningConfig.java @@ -0,0 +1,110 @@ +package com.hbm.config; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; + +public class RunningConfig { + + public static final Gson gson = new Gson(); + + public static void readConfig(File config, HashMap configMap) { + + try { + JsonObject json = gson.fromJson(new FileReader(config), JsonObject.class); + + for(Entry line : configMap.entrySet()) { + + if(json.has(line.getKey())) { + JsonElement value = json.get(line.getKey()); + + try { + + //world's shittiest dynamic type parser + if(configMap.containsKey(line.getKey())) { + if(line.getValue().value instanceof String) configMap.get(line.getKey()).set(value.getAsString()); + if(line.getValue().value instanceof Float) configMap.get(line.getKey()).set(value.getAsFloat()); + if(line.getValue().value instanceof Double) configMap.get(line.getKey()).set(value.getAsDouble()); + if(line.getValue().value instanceof Integer) configMap.get(line.getKey()).set(value.getAsInt()); + if(line.getValue().value instanceof Boolean) configMap.get(line.getKey()).set(value.getAsBoolean()); + } + + //gson doesn't give me the option to read the raw value of a JsonPrimitive so we have to this shit effectively twice + //once to make sure that the parsed data matches with what's determined by the default, + //and a second time in the ConfigWrapper to add ease of reading the data without needing manual casts + + } catch(Exception ex) { + ex.printStackTrace(); + } + } + } + + } catch(Exception ex) { + ex.printStackTrace(); + } + } + + public static void writeConfig(File config, HashMap configMap, String info) { + + try { + JsonWriter writer = new JsonWriter(new FileWriter(config)); + writer.setIndent(" "); + writer.beginObject(); + + writer.name("info").value(info); + + List keys = new ArrayList(); + keys.addAll(configMap.keySet()); + Collections.sort(keys); //readability is cool + + for(String key : keys) { + + ConfigWrapper wrapper = configMap.get(key); + Object value = wrapper.value; + //this sucks and i am too stupid to come up with something better + if(value instanceof String) writer.name(key).value((String) value); + if(value instanceof Float) writer.name(key).value((Float) value); + if(value instanceof Double) writer.name(key).value((Double) value); + if(value instanceof Integer) writer.name(key).value((Integer) value); + if(value instanceof Boolean) writer.name(key).value((Boolean) value); + } + + writer.endObject(); + writer.close(); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public static class ConfigWrapper { + public T value; + + public ConfigWrapper(T o) { + this.value = o; + } + + public T get() { return value; } + public void set(T value) { this.value = value; } + + public void update(String param) { + Object stupidBufferObject = null; // wahh wahh can't cast Float to T wahh wahh shut the fuck up + if(value instanceof String) stupidBufferObject = param; + if(value instanceof Float) stupidBufferObject = Float.parseFloat(param); + if(value instanceof Double) stupidBufferObject = Double.parseDouble(param); + if(value instanceof Integer) stupidBufferObject = Integer.parseInt(param); + if(value instanceof Boolean) stupidBufferObject = Boolean.parseBoolean(param); + if(stupidBufferObject != null) this.value = (T) stupidBufferObject; + } + } +} diff --git a/src/main/java/com/hbm/config/ServerConfig.java b/src/main/java/com/hbm/config/ServerConfig.java new file mode 100644 index 000000000..fd9586113 --- /dev/null +++ b/src/main/java/com/hbm/config/ServerConfig.java @@ -0,0 +1,58 @@ +package com.hbm.config; + +import java.io.File; +import java.util.HashMap; + +import com.google.gson.Gson; +import com.hbm.main.MainRegistry; + +public class ServerConfig extends RunningConfig { + + public static final Gson gson = new Gson(); + public static HashMap configMap = new HashMap(); + + public static ConfigWrapper DAMAGE_COMPATIBILITY_MODE = new ConfigWrapper(false); + public static ConfigWrapper MINE_AP_DAMAGE = new ConfigWrapper(10F); + public static ConfigWrapper MINE_HE_DAMAGE = new ConfigWrapper(35F); + public static ConfigWrapper MINE_SHRAP_DAMAGE = new ConfigWrapper(7.5F); + public static ConfigWrapper MINE_NUKE_DAMAGE = new ConfigWrapper(100F); + + private static void initDefaults() { + configMap.put("DAMAGE_COMPATIBILITY_MODE", DAMAGE_COMPATIBILITY_MODE); + configMap.put("MINE_AP_DAMAGE", MINE_AP_DAMAGE); + configMap.put("MINE_HE_DAMAGE", MINE_HE_DAMAGE); + configMap.put("MINE_SHRAP_DAMAGE", MINE_SHRAP_DAMAGE); + configMap.put("MINE_NUKE_DAMAGE", MINE_NUKE_DAMAGE); + } + + /** Initializes defaults, then reads the config file if it exists, then writes the config file. */ + public static void initConfig() { + initDefaults(); + File folder = MainRegistry.configHbmDir; + File config = new File(folder.getAbsolutePath() + File.separatorChar + "hbmServer.json"); + if(config.exists()) readConfig(config); + refresh(); + } + + /** Writes over the config file using the running config. */ + public static void refresh() { + File folder = MainRegistry.configHbmDir; + File config = new File(folder.getAbsolutePath() + File.separatorChar + "hbmServer.json"); + writeConfig(config); + } + + /** Writes over the running config using the config file. */ + public static void reload() { + File folder = MainRegistry.configHbmDir; + File config = new File(folder.getAbsolutePath() + File.separatorChar + "hbmServer.json"); + if(config.exists()) readConfig(config); + } + + private static void readConfig(File config) { + RunningConfig.readConfig(config, configMap); + } + + private static void writeConfig(File config) { + RunningConfig.writeConfig(config, configMap, "This file can be edited ingame using the /ntmserver command."); + } +} diff --git a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java index cca47893b..47067d8b2 100644 --- a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java +++ b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java @@ -12,7 +12,7 @@ import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class ExplosionNukeSmall { +@Deprecated public class ExplosionNukeSmall { public static void explode(World world, double posX, double posY, double posZ, MukeParams params) { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 598003562..3b2feed15 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -3022,7 +3022,8 @@ public class ModItems { iv_empty = new ItemSimpleConsumable().setUseActionServer((stack, user) -> { if(user.hurtResistantTime <= 0) { ItemSimpleConsumable.giveSoundAndDecrement(stack, user, "hbm:item.syringe", new ItemStack(ModItems.iv_blood)); - user.attackEntityFrom(DamageSource.magic, 5F); + user.setHealth(Math.max(user.getHealth() - 5F, 0F)); + if(user.getHealth() <= 0) user.onDeath(DamageSource.magic); } }).setUnlocalizedName("iv_empty").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":iv_empty"); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java index b17c15d78..f63275b9a 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory762mm.java @@ -191,7 +191,7 @@ public class XFactory762mm { .addBus("LIFT", new BusAnimationSequence().hold(200).addPos(30, 0, 0, 500, IType.SIN_FULL).holdUntil(1200).addPos(0, 0, 0, 500, IType.SIN_FULL)) .addBus("SHOW_CLIP", new BusAnimationSequence().setPos(1, 1, 1)) .addBus("CLIP", new BusAnimationSequence().setPos(2, -3, 0).hold(250).addPos(0.5, 1, 0, 500, IType.SIN_DOWN).addPos(0, 0, 0, 250, IType.SIN_FULL).hold(400).addPos(-0.5, 0.5, 0, 150).addPos(-3, -3, 0, 250, IType.SIN_UP)) - .addBus("BULLETS", new BusAnimationSequence().setPos(2, -4, 0).hold(250).addPos(0.5, 1, 0, 500, IType.SIN_DOWN).addPos(0, 0, 0, 250, IType.SIN_FULL).hold(150).addPos(0, -1.5, 0, 250, IType.SIN_DOWN)); + .addBus("BULLETS", new BusAnimationSequence().setPos(2, -3, 0).hold(250).addPos(0.5, 1, 0, 500, IType.SIN_DOWN).addPos(0, 0, 0, 250, IType.SIN_FULL).hold(150).addPos(0, -1.5, 0, 250, IType.SIN_DOWN)); case JAMMED: return new BusAnimation() .addBus("LIFT", new BusAnimationSequence().hold(250).addPos(-15, 0, 0, 500, IType.SIN_FULL).holdUntil(1650).addPos(0, 0, 0, 500, IType.SIN_FULL)) .addBus("BOLT_TURN", new BusAnimationSequence().hold(250).addPos(0, 0, turn, 150).holdUntil(1250).addPos(0, 0, 0, 150)) diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 94e2e5afa..bb9616014 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -861,7 +861,9 @@ public class MainRegistry { FalloutConfigJSON.initialize(); ItemPoolConfigJSON.initialize(); + ClientConfig.initConfig(); + ServerConfig.initConfig(); TileEntityNukeCustom.registerBombItems(); ArmorUtil.register(); @@ -948,6 +950,7 @@ public class MainRegistry { event.registerServerCommand(new CommandSatellites()); event.registerServerCommand(new CommandRadiation()); event.registerServerCommand(new CommandPacketInfo()); + event.registerServerCommand(new CommandReloadServer()); } @EventHandler diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 292c2a435..bdba621ca 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -114,6 +114,7 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; import net.minecraftforge.event.entity.player.PlayerUseItemEvent; import net.minecraftforge.event.world.BlockEvent.BreakEvent; +import net.minecraftforge.event.world.ChunkEvent; import net.minecraftforge.event.world.WorldEvent; import org.apache.commons.lang3.math.NumberUtils; import org.apache.logging.log4j.Level; @@ -1231,6 +1232,18 @@ public class ModEventHandler { }*/ } + @SubscribeEvent + public void onChunkLoad(ChunkEvent.Load event) { + + //test for automatic in-world block replacement + + /*for(int x = 0; x < 16; x++) for(int y = 0; y < 255; y++) for(int z = 0; z < 16; z++) { + if(event.getChunk().getBlock(x, y, z) instanceof MachineArcFurnace) { + event.getChunk().func_150807_a(x, y, z, Blocks.air, 0); + } + }*/ + } + @SubscribeEvent public void onPlayerClone(net.minecraftforge.event.entity.player.PlayerEvent.Clone event) { diff --git a/src/main/java/com/hbm/render/anim/BusAnimationSequence.java b/src/main/java/com/hbm/render/anim/BusAnimationSequence.java index 640c22318..bd1630630 100644 --- a/src/main/java/com/hbm/render/anim/BusAnimationSequence.java +++ b/src/main/java/com/hbm/render/anim/BusAnimationSequence.java @@ -82,6 +82,7 @@ public class BusAnimationSequence { /** Repeats the previous keyframe for a duration depending on the previous keyframes. Useful for getting different buses to sync up. */ public BusAnimationSequence holdUntil(int end) { int duration = end - getTotalTime(); + //FIXME: holdUntil breaks as soon as the animation speed is not 1 return hold(duration); } diff --git a/src/main/java/com/hbm/util/EntityDamageUtil.java b/src/main/java/com/hbm/util/EntityDamageUtil.java index 03c2363d2..6ba1791ce 100644 --- a/src/main/java/com/hbm/util/EntityDamageUtil.java +++ b/src/main/java/com/hbm/util/EntityDamageUtil.java @@ -3,6 +3,8 @@ package com.hbm.util; import java.lang.reflect.Method; import java.util.List; +import com.hbm.config.ServerConfig; + import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; @@ -21,7 +23,8 @@ import net.minecraftforge.common.ForgeHooks; public class EntityDamageUtil { - public static boolean attackEntityFromIgnoreIFrame(Entity victim, DamageSource src, float damage) { + /** Shitty hack, if the first attack fails, it retries with damage + previous damage, allowing damage to penetrate */ + @Deprecated public static boolean attackEntityFromIgnoreIFrame(Entity victim, DamageSource src, float damage) { if(!victim.attackEntityFrom(src, damage)) { @@ -38,6 +41,7 @@ public class EntityDamageUtil { } } + /** New and improved entity damage calc - only use this one */ public static boolean attackEntityFromNT(EntityLivingBase living, DamageSource source, float amount, boolean ignoreIFrame, boolean allowSpecialCancel, double knockbackMultiplier, float pierceDT, float pierce) { if(living instanceof EntityPlayerMP && source.getEntity() instanceof EntityPlayer) { EntityPlayerMP playerMP = (EntityPlayerMP) living; @@ -45,14 +49,55 @@ public class EntityDamageUtil { if(!playerMP.canAttackPlayer(attacker)) return false; //handles wack-ass no PVP rule as well as scoreboard friendly fire } DamageResistanceHandler.setup(pierceDT, pierce); - living.attackEntityFrom(source, 0F); boolean ret = attackEntityFromNTInternal(living, source, amount, ignoreIFrame, allowSpecialCancel, knockbackMultiplier); - //boolean ret = living.attackEntityFrom(source, amount); DamageResistanceHandler.reset(); return ret; } - + private static boolean attackEntityFromNTInternal(EntityLivingBase living, DamageSource source, float amount, boolean ignoreIFrame, boolean allowSpecialCancel, double knockbackMultiplier) { + boolean superCompatibility = ServerConfig.DAMAGE_COMPATIBILITY_MODE.get(); + return superCompatibility + ? attackEntitySuperCompatibility(living, source, amount, ignoreIFrame, allowSpecialCancel, knockbackMultiplier) + : attackEntitySEDNAPatch(living, source, amount, ignoreIFrame, allowSpecialCancel, knockbackMultiplier); + } + + /** + * MK2 SEDNA damage system, currently untested. An even hackier, yet more compatible solution using the vanilla damage calc directly but tweaking certain apsects. + * Limitation: Does not apply DR piercing to vanilla armor + */ + private static boolean attackEntitySuperCompatibility(EntityLivingBase living, DamageSource source, float amount, boolean ignoreIFrame, boolean allowSpecialCancel, double knockbackMultiplier) { + //disable iframes + if(ignoreIFrame) { living.lastDamage = 0F; living.hurtResistantTime = 0; } + //cache last velocity + double motionX = living.motionX; + double motionY = living.motionX; + double motionZ = living.motionX; + //bam! + boolean ret = living.attackEntityFrom(source, amount); + //restore last velocity + living.motionX = motionX; + living.motionY = motionY; + living.motionZ = motionZ; + //apply own knockback + Entity entity = source.getEntity(); + if(entity != null) { + double deltaX = entity.posX - living.posX; + double deltaZ; + + for(deltaZ = entity.posZ - living.posZ; deltaX * deltaX + deltaZ * deltaZ < 1.0E-4D; deltaZ = (Math.random() - Math.random()) * 0.01D) { + deltaX = (Math.random() - Math.random()) * 0.01D; + } + + living.attackedAtYaw = (float) (Math.atan2(deltaZ, deltaX) * 180.0D / Math.PI) - living.rotationYaw; + if(knockbackMultiplier > 0) knockBack(living, entity, amount, deltaX, deltaZ, knockbackMultiplier); + } + return ret; + } + + /** MK1 SEDNA damage system, basically re-implements the vanilla code (only from Entity, child class code is effectively ignored) with some adjustments */ + private static boolean attackEntitySEDNAPatch(EntityLivingBase living, DamageSource source, float amount, boolean ignoreIFrame, boolean allowSpecialCancel, double knockbackMultiplier) { + living.attackEntityFrom(source, 0F); + if(ignoreIFrame) living.lastDamage = 0F; if(ForgeHooks.onLivingAttack(living, source, amount) && allowSpecialCancel) return false; if(living.isEntityInvulnerable()) return false; if(living.worldObj.isRemote) return false; @@ -183,9 +228,7 @@ public class EntityDamageUtil { return amount; } - public static void damageArmorNT(EntityLivingBase living, float amount) { - - } + public static void damageArmorNT(EntityLivingBase living, float amount) { } /** Currently just a copy of the vanilla damage code */ @Deprecated public static boolean attackEntityFromNT(EntityLivingBase living, DamageSource source, float amount) { diff --git a/src/main/resources/assets/hbm/textures/blocks/glass_polarized.png b/src/main/resources/assets/hbm/textures/blocks/glass_polarized.png new file mode 100644 index 0000000000000000000000000000000000000000..29a0ce9d64fce4fcdfa7454d74e2f6c1ca7d0861 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfh9FE!eBv1c7cgy#~DwY zDf-S7QEIIHtmUfa%*eE`TC;f@>|RW%ciND9+qlW_SU=~tW%lYF97e^R4`#ey)zz^@ z`=qt_M6>gfIEF;D zz75~V<*dkaC8(h2^Z)v@{2#XIq|2K`hsg&`unyr8E46} zUek7Psn$-&V>l3Ho-?~=*TZ1%H;yiP$1H4^8J@i6b6+fGe((9*jK>VCjh;{;OXk;vd$@? F2>@s{YS{n) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/items/ingot_metal_sheet.png b/src/main/resources/assets/hbm/textures/items/ingot_metal_sheet.png index 456950b8bb27993d7715bc2f2541a8fff5eec97e..27e251a795ad303b1740fae6e20eec7677a5ec48 100644 GIT binary patch literal 6157 zcmV+o81me^gXgw&y<=3K0shM1EKxhTjH}#%LQvs77h0V_q+n31W5!E z$^ulRtfIt%qWBGG{wVJCR#7Mg*oo2aTCDq{?%wy@v-jD1pMCbdNa6(q6Oev`#5Ax8 zq0s#Ch1(<#=>w-fhBPgjsW3D&BwQ{RF)=aI=HqZUL`+PK06k(``7>jqDS-Me>--Me?sn7_eb5b^QxQ_^qRv`K8* zv?(C|d-m)Rd-m+PXU{xWa5x+yG&D3I3lJI_Ds^>r-PvTR1^)Qsj{{(}S~+?0ouy$Wqu7=JodOGI`qOLaP40^v^yHf-1+s;jFd zS-}1dCz-Tmz-rimS+-^6oyz+|DzE@s( z1%OvyeU-g)O8z+>^++uJAc zjMnL>z3?f~IvrVQsbr<4PEv$uosRa&w-?pb)x7@t>tffgT>ugwgb=*``s?i4wTlfK zHZa%1moXa)paJOZ?WL@&jMCCl8X6kduwjF8v0CUd{0Z>l#f!*37eKGqV=|e@%*j@e<*Zq=2Jk4`R7xP5e6`SJMUdkGU#JBQ zikbI1cdvvGGoJ;twY7OHKvYx|aNBJA6FPW=DnmB8GGyVmw6rMK8jVKfccam$1d;xD z%TUJ^zDl6J&Q~GI%gf2g$N)SshP>}}S zdlj<}V6)jI@c3Z$_25x}nwpwP7NEDc7k|^WJ3*cu$iCZXGzxWmppF4#!JExy<=AXC z^W~RcvTWHh;PzBdtpMPO0~`(q$?G=)P_XJT0GchWbUU52*L(zU$63H%8ncN3+S=NL zroFvgN=ix+aN82dohh4Ze?s@g%9Sg0cGp zQ_kJHcMEyO;xC%N6H-!A6v6rm-ydFj=_LVQU%`WCGy^lX0ABfMIh}f^l&Tuy1;lLf z+0&&r7z{!l@#_7*)cx-z{Y+_P%w{b>2?Ax@ixlr%Kn@1wfH2UJ|4oL=<(lyqr9(C~Cf{KDmO5g8ddYx+5> z2dJp12xv)ms`c=SiV9&g8il+Kl-?g?7oh%A(;JOO#YN1v{ejT?`rtse4u@k_^y+P( zkm-~d;N_QJRu~zLMln-AYcv`~Lqh{uSy{;2+3*98@QaI!QLi+bOeP+i*x$W-w~(iN z#l^(|FCzJ(Wcx3~^^PlE=MtAZLgm3<`sJ(ksex>po12x9I1~CneZLwqy#yZNo6Tl2 zGBU8)Z1nc_DhU-C`}gmcBwV)oPto&rq`c7eW^P_80$#6ICZzvdEJOy$o!B z@ozZzkH43#f>67I*<|9rYA7*)xg>aq@d8B*`KcP zi;IiBO#I1{CzapSZs=|Sr0fDN18iOI8Tr7O7CR@ZP5^MdqkR(HH_`$G0<{Hz$-duY zGD-5tm+Sr1!t{;y10DH$_wJRRfBt#)?%gZ-o1$*pwr!GI@`XGDxZcsu`U#(Zrp2xZ zfBn|=T<>W2I}^B{EkF>!z`%gl$)uztv|8=7MnB*sVD+C`&?b{fl3l`7{y#c8T5%C_ zWzlrazRhNnrdq`;FE971X7Y#1gTIvIsoueV{5=32H{EpH^gO>j1E?uKG$|n@kLbI# zai-VbOK8B;d0}B;UJa66z;q!OY1GuzP*hYzO-;?Dgv_0ye}BT4+cus1$H&JD-)m2v zJSq7*KNaMefGp^A)=Zpl_eun*;c~f{NfJn|$(t_Cy@Ip}A^fdk`Mw6GRtULL=#Qz# zc=9)5#xFRE7Z6YWM&LGl2RV}$i11~4`TkQ0d#dxk^fIQK3KlOQhX2

P+Btw+@Fx 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 literal 6159 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 Date: Tue, 4 Mar 2025 16:50:33 +0100 Subject: [PATCH 4/8] burned old textures, better sludge --- changelog | 12 +- src/main/java/com/hbm/blocks/ModBlocks.java | 6 +- .../java/com/hbm/blocks/bomb/BlockTaint.java | 241 ++++++------------ .../blocks/generic/BlockGenericStairs.java | 2 +- .../hbm/blocks/generic/BlockMultiSlab.java | 2 +- .../com/hbm/blocks/generic/RedBarrel.java | 5 +- .../blocks/network/BlockCablePaintable.java | 21 +- .../com/hbm/blocks/network/DroneDock.java | 54 ++++ .../blocks/network/FluidDuctPaintable.java | 21 +- .../entity/missile/EntityMissileCustom.java | 5 +- .../entity/missile/EntityMissileTier0.java | 6 +- .../hbm/entity/mob/EntityCreeperTainted.java | 8 +- .../com/hbm/handler/nei/SatelliteHandler.java | 11 - src/main/java/com/hbm/items/ModItems.java | 2 +- .../com/hbm/items/block/ItemTaintBlock.java | 40 --- .../com/hbm/items/weapon/ItemAmmoHIMARS.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 1 - src/main/java/com/hbm/potion/HbmPotion.java | 16 +- .../hbm/render/block/RenderTaintBlock.java | 124 --------- .../assets/hbm/textures/blocks/ams_base.png | Bin 281 -> 0 bytes .../hbm/textures/blocks/ams_emitter.png | Bin 350 -> 0 bytes .../hbm/textures/blocks/ams_limiter.png | Bin 371 -> 0 bytes .../hbm/textures/blocks/block_daffergon.png | Bin 391 -> 0 bytes .../hbm/textures/blocks/block_reiium.png | Bin 370 -> 0 bytes .../hbm/textures/blocks/block_unobtainium.png | Bin 348 -> 0 bytes .../hbm/textures/blocks/block_verticium.png | Bin 339 -> 0 bytes .../hbm/textures/blocks/block_weidanium.png | Bin 348 -> 0 bytes .../assets/hbm/textures/blocks/taint.png | Bin 0 -> 731 bytes .../assets/hbm/textures/blocks/taint_0.png | Bin 476 -> 0 bytes .../assets/hbm/textures/blocks/taint_1.png | Bin 512 -> 0 bytes .../assets/hbm/textures/blocks/taint_10.png | Bin 487 -> 0 bytes .../assets/hbm/textures/blocks/taint_11.png | Bin 489 -> 0 bytes .../assets/hbm/textures/blocks/taint_12.png | Bin 477 -> 0 bytes .../assets/hbm/textures/blocks/taint_13.png | Bin 479 -> 0 bytes .../assets/hbm/textures/blocks/taint_14.png | Bin 463 -> 0 bytes .../assets/hbm/textures/blocks/taint_15.png | Bin 458 -> 0 bytes .../assets/hbm/textures/blocks/taint_2.png | Bin 482 -> 0 bytes .../assets/hbm/textures/blocks/taint_3.png | Bin 499 -> 0 bytes .../assets/hbm/textures/blocks/taint_4.png | Bin 499 -> 0 bytes .../assets/hbm/textures/blocks/taint_5.png | Bin 502 -> 0 bytes .../assets/hbm/textures/blocks/taint_6.png | Bin 497 -> 0 bytes .../assets/hbm/textures/blocks/taint_7.png | Bin 499 -> 0 bytes .../assets/hbm/textures/blocks/taint_8.png | Bin 486 -> 0 bytes .../assets/hbm/textures/blocks/taint_9.png | Bin 483 -> 0 bytes .../assets/hbm/textures/blocks/taint_full.png | Bin 509 -> 0 bytes .../assets/hbm/textures/blocks/taint_low.png | Bin 431 -> 0 bytes .../hbm/textures/blocks/test_bb_bork.png | Bin 427 -> 0 bytes .../hbm/textures/blocks/test_bb_inf.png | Bin 197 -> 0 bytes .../assets/hbm/textures/blocks/test_bomb.png | Bin 254 -> 0 bytes .../hbm/textures/blocks/test_conductor.png | Bin 193 -> 0 bytes .../hbm/textures/blocks/test_container.png | Bin 255 -> 0 bytes .../assets/hbm/textures/blocks/test_nuke.png | Bin 229 -> 0 bytes .../hbm/textures/blocks/test_ticker.png | Bin 216 -> 0 bytes .../hbm/textures/blocks/waste_earth_side.png | Bin 454 -> 0 bytes .../hbm/textures/blocks/waste_earth_top.png | Bin 608 -> 0 bytes .../textures/entity/creeper_armor_taint.png | Bin 1647 -> 2238 bytes .../hbm/textures/entity/creeper_tainted.png | Bin 2274 -> 2922 bytes .../assets/hbm/textures/items/gun_ar15.png | Bin 208 -> 0 bytes .../assets/hbm/textures/items/gun_avenger.png | Bin 320 -> 0 bytes .../assets/hbm/textures/items/gun_b93.png | Bin 297 -> 0 bytes .../assets/hbm/textures/items/gun_bf.png | Bin 328 -> 0 bytes .../hbm/textures/items/gun_bio_revolver.png | Bin 309 -> 0 bytes .../hbm/textures/items/gun_bolt_action.png | Bin 210 -> 0 bytes .../textures/items/gun_bolt_action_green.png | Bin 210 -> 0 bytes .../items/gun_bolt_action_saturnite.png | Bin 210 -> 0 bytes .../hbm/textures/items/gun_calamity.png | Bin 281 -> 0 bytes .../hbm/textures/items/gun_calamity_dual.png | Bin 306 -> 0 bytes .../assets/hbm/textures/items/gun_coilgun.png | Bin 341 -> 0 bytes .../hbm/textures/items/gun_cryolator.png | Bin 405 -> 0 bytes .../assets/hbm/textures/items/gun_deagle.png | Bin 201 -> 0 bytes .../hbm/textures/items/gun_defabricator.png | Bin 194 -> 0 bytes .../textures/items/gun_defabricator_ammo.png | Bin 233 -> 0 bytes .../assets/hbm/textures/items/gun_emp.png | Bin 276 -> 0 bytes .../hbm/textures/items/gun_emp_ammo.png | Bin 360 -> 0 bytes .../hbm/textures/items/gun_euthanasia.png | Bin 318 -> 0 bytes .../textures/items/gun_euthanasia_ammo.png | Bin 156 -> 0 bytes .../assets/hbm/textures/items/gun_fatman.png | Bin 315 -> 0 bytes .../assets/hbm/textures/items/gun_flamer.png | Bin 304 -> 0 bytes .../assets/hbm/textures/items/gun_folly.png | Bin 244 -> 0 bytes .../assets/hbm/textures/items/gun_hk69.png | Bin 278 -> 0 bytes .../assets/hbm/textures/items/gun_hp.png | Bin 318 -> 0 bytes .../assets/hbm/textures/items/gun_hp_ammo.png | Bin 234 -> 0 bytes .../hbm/textures/items/gun_immolator.png | Bin 335 -> 0 bytes .../hbm/textures/items/gun_immolator_ammo.png | Bin 243 -> 0 bytes .../assets/hbm/textures/items/gun_jack.png | Bin 332 -> 0 bytes .../hbm/textures/items/gun_jack_ammo.png | Bin 392 -> 0 bytes .../assets/hbm/textures/items/gun_karl.png | Bin 353 -> 0 bytes .../assets/hbm/textures/items/gun_lacunae.png | Bin 321 -> 0 bytes .../hbm/textures/items/gun_lever_action.png | Bin 257 -> 0 bytes .../textures/items/gun_lever_action_dark.png | Bin 259 -> 0 bytes .../items/gun_lever_action_sonata.png | Bin 245 -> 0 bytes .../assets/hbm/textures/items/gun_minigun.png | Bin 309 -> 0 bytes .../assets/hbm/textures/items/gun_mirv.png | Bin 276 -> 0 bytes .../hbm/textures/items/gun_moist_nugget.png | Bin 479 -> 0 bytes .../assets/hbm/textures/items/gun_mp40.png | Bin 244 -> 0 bytes .../assets/hbm/textures/items/gun_mymy.png | Bin 280 -> 0 bytes .../assets/hbm/textures/items/gun_osipr.png | Bin 335 -> 0 bytes .../hbm/textures/items/gun_osipr_ammo.png | Bin 270 -> 0 bytes .../hbm/textures/items/gun_osipr_ammo2.png | Bin 299 -> 0 bytes .../hbm/textures/items/gun_panzerschreck.png | Bin 327 -> 0 bytes .../assets/hbm/textures/items/gun_pm.png | Bin 271 -> 0 bytes .../assets/hbm/textures/items/gun_pm_ammo.png | Bin 202 -> 0 bytes .../assets/hbm/textures/items/gun_quadro.png | Bin 294 -> 0 bytes .../hbm/textures/items/gun_revolver.png | Bin 291 -> 0 bytes .../hbm/textures/items/gun_revolver_ammo.png | Bin 378 -> 0 bytes .../textures/items/gun_revolver_blackjack.png | Bin 274 -> 0 bytes .../textures/items/gun_revolver_cursed.png | Bin 284 -> 0 bytes .../items/gun_revolver_cursed_ammo.png | Bin 326 -> 0 bytes .../hbm/textures/items/gun_revolver_gold.png | Bin 261 -> 0 bytes .../textures/items/gun_revolver_gold_ammo.png | Bin 316 -> 0 bytes .../textures/items/gun_revolver_inverted.png | Bin 205 -> 0 bytes .../hbm/textures/items/gun_revolver_iron.png | Bin 280 -> 0 bytes .../textures/items/gun_revolver_iron_ammo.png | Bin 364 -> 0 bytes .../hbm/textures/items/gun_revolver_lead.png | Bin 271 -> 0 bytes .../textures/items/gun_revolver_lead_ammo.png | Bin 278 -> 0 bytes .../textures/items/gun_revolver_nightmare.png | Bin 238 -> 0 bytes .../items/gun_revolver_nightmare2.png | Bin 244 -> 0 bytes .../items/gun_revolver_nightmare2_ammo.png | Bin 301 -> 0 bytes .../items/gun_revolver_nightmare_ammo.png | Bin 314 -> 0 bytes .../hbm/textures/items/gun_revolver_nopip.png | Bin 260 -> 0 bytes .../hbm/textures/items/gun_revolver_pip.png | Bin 323 -> 0 bytes .../textures/items/gun_revolver_pip_alt.png | Bin 290 -> 0 bytes .../hbm/textures/items/gun_revolver_red.png | Bin 283 -> 0 bytes .../textures/items/gun_revolver_saturnite.png | Bin 269 -> 0 bytes .../items/gun_revolver_schrabidium.png | Bin 265 -> 0 bytes .../items/gun_revolver_schrabidium_ammo.png | Bin 349 -> 0 bytes .../textures/items/gun_revolver_silver.png | Bin 292 -> 0 bytes .../assets/hbm/textures/items/gun_rpg.png | Bin 365 -> 0 bytes .../assets/hbm/textures/items/gun_rpg_alt.png | Bin 318 -> 0 bytes .../assets/hbm/textures/items/gun_rpg_new.png | Bin 300 -> 0 bytes .../hbm/textures/items/gun_skystinger.png | Bin 324 -> 0 bytes .../assets/hbm/textures/items/gun_spark.png | Bin 374 -> 0 bytes .../hbm/textures/items/gun_spark_ammo.png | Bin 234 -> 0 bytes .../assets/hbm/textures/items/gun_spas12.png | Bin 227 -> 0 bytes .../assets/hbm/textures/items/gun_stinger.png | Bin 315 -> 0 bytes .../hbm/textures/items/gun_super_shotgun.png | Bin 290 -> 0 bytes .../assets/hbm/textures/items/gun_uboinik.png | Bin 376 -> 0 bytes .../assets/hbm/textures/items/gun_uzi.png | Bin 288 -> 0 bytes .../hbm/textures/items/gun_uzi_saturnite.png | Bin 310 -> 0 bytes .../items/gun_uzi_saturnite_silencer.png | Bin 326 -> 0 bytes .../hbm/textures/items/gun_uzi_silencer.png | Bin 301 -> 0 bytes .../assets/hbm/textures/items/gun_xvl1456.png | Bin 336 -> 0 bytes .../hbm/textures/items/gun_xvl1456_ammo.png | Bin 335 -> 0 bytes .../assets/hbm/textures/items/gun_zomg.png | Bin 310 -> 0 bytes 144 files changed, 208 insertions(+), 371 deletions(-) delete mode 100644 src/main/java/com/hbm/items/block/ItemTaintBlock.java delete mode 100644 src/main/java/com/hbm/render/block/RenderTaintBlock.java delete mode 100644 src/main/resources/assets/hbm/textures/blocks/ams_base.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/ams_emitter.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/ams_limiter.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/block_daffergon.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/block_reiium.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/block_unobtainium.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/block_verticium.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/block_weidanium.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/taint.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_0.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_1.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_10.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_11.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_12.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_13.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_14.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_15.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_2.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_3.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_4.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_5.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_6.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_7.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_8.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_9.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_full.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/taint_low.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/test_bb_bork.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/test_bb_inf.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/test_bomb.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/test_conductor.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/test_container.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/test_nuke.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/test_ticker.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/waste_earth_side.png delete mode 100644 src/main/resources/assets/hbm/textures/blocks/waste_earth_top.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_ar15.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_avenger.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_b93.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_bf.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_bio_revolver.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_bolt_action.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_bolt_action_green.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_bolt_action_saturnite.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_calamity.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_calamity_dual.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_coilgun.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_cryolator.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_deagle.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_defabricator.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_defabricator_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_emp.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_emp_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_euthanasia.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_euthanasia_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_fatman.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_flamer.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_folly.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_hk69.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_hp.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_hp_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_immolator.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_immolator_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_jack.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_jack_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_karl.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_lacunae.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_lever_action.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_lever_action_dark.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_lever_action_sonata.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_minigun.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_mirv.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_moist_nugget.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_mp40.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_mymy.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_osipr.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_osipr_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_osipr_ammo2.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_panzerschreck.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_pm.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_pm_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_quadro.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_blackjack.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_cursed.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_cursed_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_gold.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_gold_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_inverted.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_iron.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_iron_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_lead.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_lead_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare2.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare2_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_nopip.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_pip.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_pip_alt.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_red.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_saturnite.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_schrabidium.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_schrabidium_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_revolver_silver.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_rpg.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_rpg_alt.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_rpg_new.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_skystinger.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_spark.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_spark_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_spas12.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_stinger.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_super_shotgun.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_uboinik.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_uzi.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_uzi_saturnite.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_uzi_saturnite_silencer.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_uzi_silencer.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_xvl1456.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_xvl1456_ammo.png delete mode 100644 src/main/resources/assets/hbm/textures/items/gun_zomg.png diff --git a/changelog b/changelog index 96cce6458..3122e1cbf 100644 --- a/changelog +++ b/changelog @@ -9,6 +9,16 @@ * Fat mines now have a base damage of exactly 100, being identical to demolition mini nukes * Fat mines now gib affected entities * IV bags now use `setHealth` operations instead of dealing damage, preventing health duplication by just avoiding the damage +* The settings tool can now copy and paste the "paint" from paintable cables and fluid ducts +* Changed the way taint works + * Instead of neon purple vines, taint is bow a greyish sludge + * Taint now actively replaces blocks instead of growing along them + * Taint is still limited in spread, however taint spread is lower underground, taint decays three times faster in intensity if the block is not exposed to air, making taint spread more along the surface + * Taint has a 25% chance of splashing down when replacing a block with no supports, causing structures to collapse and taint to spread faster + * Similar to soil sand, entities will sink in taint and get slowed down + * The sludge consumeth ## Fixed -* Fixed animation error on the MAS-36 \ No newline at end of file +* Fixed animation error on the MAS-36 +* Fixed drone docks, requester and provider crates not dropping their contents when broken +* Fixed all missing texture errors that appear in the startup log \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 6cf108b50..7dac239ef 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -2177,7 +2177,7 @@ public class ModBlocks { mass_storage = new BlockMassStorage().setBlockName("mass_storage").setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); boxcar = new DecoBlock(Material.iron).setBlockName("boxcar").setStepSound(Block.soundTypeMetal).setHardness(10.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":boxcar"); - boat = new DecoBlock(Material.iron).setBlockName("boat").setStepSound(Block.soundTypeMetal).setHardness(10.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":boat"); + boat = new DecoBlock(Material.iron).setBlockName("boat").setStepSound(Block.soundTypeMetal).setHardness(10.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":asphalt"); machine_well = new MachineOilWell().setBlockName("machine_well").setHardness(5.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_well"); machine_pumpjack = new MachinePumpjack().setBlockName("machine_pumpjack").setHardness(5.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_pumpjack"); @@ -2279,7 +2279,7 @@ public class ModBlocks { crystal_virus = new CrystalVirus(Material.iron).setBlockName("crystal_virus").setHardness(15.0F).setResistance(Float.POSITIVE_INFINITY).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":crystal_virus"); crystal_hardened = new BlockGeneric(Material.iron).setBlockName("crystal_hardened").setHardness(15.0F).setResistance(Float.POSITIVE_INFINITY).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":crystal_hardened"); crystal_pulsar = new CrystalPulsar(Material.iron).setBlockName("crystal_pulsar").setHardness(15.0F).setResistance(Float.POSITIVE_INFINITY).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":crystal_pulsar"); - taint = new BlockTaint(Material.iron).setBlockName("taint").setHardness(15.0F).setResistance(10.0F).setCreativeTab(null); + taint = new BlockTaint(Material.iron).setBlockName("taint").setHardness(15.0F).setResistance(10.0F).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":taint"); vent_chlorine = new BlockVent(Material.iron).setBlockName("vent_chlorine").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":vent_chlorine"); vent_cloud = new BlockVent(Material.iron).setBlockName("vent_cloud").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":vent_cloud"); @@ -3476,7 +3476,7 @@ public class ModBlocks { GameRegistry.registerBlock(crystal_virus, crystal_virus.getUnlocalizedName()); GameRegistry.registerBlock(crystal_hardened, crystal_hardened.getUnlocalizedName()); GameRegistry.registerBlock(crystal_pulsar, crystal_pulsar.getUnlocalizedName()); - GameRegistry.registerBlock(taint, ItemTaintBlock.class, taint.getUnlocalizedName()); + register(taint); GameRegistry.registerBlock(cheater_virus, cheater_virus.getUnlocalizedName()); GameRegistry.registerBlock(cheater_virus_seed, cheater_virus_seed.getUnlocalizedName()); GameRegistry.registerBlock(ntm_dirt, ntm_dirt.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/bomb/BlockTaint.java b/src/main/java/com/hbm/blocks/bomb/BlockTaint.java index 3b92192de..079058a64 100644 --- a/src/main/java/com/hbm/blocks/bomb/BlockTaint.java +++ b/src/main/java/com/hbm/blocks/bomb/BlockTaint.java @@ -4,169 +4,71 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.ITooltipProvider; import com.hbm.entity.mob.EntityTaintCrab; import com.hbm.entity.mob.EntityCreeperTainted; import com.hbm.entity.mob.EntityTeslaCrab; import com.hbm.potion.HbmPotion; -import cpw.mods.fml.client.registry.RenderingRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; +import net.minecraft.block.BlockFalling; import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityFallingBlock; import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class BlockTaint extends Block/*Container*/ { - - @SideOnly(Side.CLIENT) - private IIcon[] icons; +public class BlockTaint extends Block implements ITooltipProvider { - public BlockTaint(Material p_i45386_1_) { - super(p_i45386_1_); - this.setTickRandomly(true); + public BlockTaint(Material mat) { + super(mat); + this.setTickRandomly(true); } - /*@Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityTaint(); - }*/ - - @SideOnly(Side.CLIENT) - public IIcon getIcon(int p_149691_1_, int meta) - { - return this.icons[meta % this.icons.length]; - } - - public int damageDropped(int meta) - { - return 0; - } + @Override public MapColor getMapColor(int meta) { return MapColor.grayColor; } + @Override public Item getItemDropped(int i, Random rand, int j) { return null; } - public static int func_150032_b(int p_150032_0_) - { - return func_150031_c(p_150032_0_); - } - - public static int func_150031_c(int p_150031_0_) - { - return p_150031_0_ & 15; - } - - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item p_149666_1_, CreativeTabs p_149666_2_, List p_149666_3_) - { - for (int i = 0; i < 16; ++i) - { - p_149666_3_.add(new ItemStack(p_149666_1_, 1, i)); - } - } - - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister p_149651_1_) - { - this.icons = new IIcon[16]; - - for (int i = 0; i < this.icons.length; ++i) - { - this.icons[i] = p_149651_1_.registerIcon("hbm:taint_" + i); - } - } - - public MapColor getMapColor(int p_149728_1_) - { - return MapColor.purpleColor; - } - - public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - @Override - public int getRenderType(){ - return renderID; + public void updateTick(World world, int x, int y, int z, Random rand) { + + int meta = world.getBlockMetadata(x, y, z); + if(meta >= 15) return; + + for(int i = -3; i <= 3; i++) for(int j = -3; j <= 3; j++) for(int k = -3; k <= 3; k++) { + if(Math.abs(i) + Math.abs(j) + Math.abs(k) > 4) continue; + if(rand.nextFloat() > 0.25F) continue; + Block b = world.getBlock(x + i, y + j, z + k); + if(!b.isNormalCube() || b.isAir(world, x + i, y + j, z + k)) continue; + int targetMeta = meta + 1; + boolean hasAir = false; + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + if(world.getBlock(x + i + dir.offsetX, y + j + dir.offsetY, z + k + dir.offsetZ).isAir(world, x + i + dir.offsetX, y + j + dir.offsetY, z + k + dir.offsetZ)) { + hasAir = true; + break; + } + } + if(!hasAir) targetMeta = meta + 3; + if(targetMeta > 15) continue; + if(b == this && world.getBlockMetadata(x + i, y + j, z + k) >= targetMeta) continue; + world.setBlock(x + i, y + j, z + k, this, targetMeta, 3); + if(rand.nextFloat() < 0.25F && BlockFalling.func_149831_e(world, x + i, y + j - 1, z + k)) { + EntityFallingBlock falling = new EntityFallingBlock(world, x + i + 0.5, y + j + 0.5, z + k + 0.5, this, targetMeta); + world.spawnEntityInWorld(falling); + } + } } - @Override - public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) - { - return null; - } - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - public void onNeighborBlockChange(World world, int x, int y, int z, Block b) - { - if(!hasPosNeightbour(world, x, y, z) && !world.isRemote) - world.setBlockToAir(x, y, z); - } - - public void updateTick(World world, int x, int y, int z, Random rand) - { - int meta = world.getBlockMetadata(x, y, z); - if(!world.isRemote && meta < 15) { - - for(int i = 0; i < 15; i++) { - int a = rand.nextInt(11) + x - 5; - int b = rand.nextInt(11) + y - 5; - int c = rand.nextInt(11) + z - 5; - if(world.getBlock(a, b, c).isReplaceable(world, a, b, c) && hasPosNeightbour(world, a, b, c)) - world.setBlock(a, b, c, ModBlocks.taint, meta + 1, 2); - } - - for(int i = 0; i < 85; i++) { - int a = rand.nextInt(7) + x - 3; - int b = rand.nextInt(7) + y - 3; - int c = rand.nextInt(7) + z - 3; - if(world.getBlock(a, b, c).isReplaceable(world, a, b, c) && hasPosNeightbour(world, a, b, c)) - world.setBlock(a, b, c, ModBlocks.taint, meta + 1, 2); - } - } - } - - public static boolean hasPosNeightbour(World world, int x, int y, int z) { - Block b0 = world.getBlock(x + 1, y, z); - Block b1 = world.getBlock(x, y + 1, z); - Block b2 = world.getBlock(x, y, z + 1); - Block b3 = world.getBlock(x - 1, y, z); - Block b4 = world.getBlock(x, y - 1, z); - Block b5 = world.getBlock(x, y, z - 1); - boolean b = (b0.renderAsNormalBlock() && b0.getMaterial().isOpaque()) || - (b1.renderAsNormalBlock() && b1.getMaterial().isOpaque()) || - (b2.renderAsNormalBlock() && b2.getMaterial().isOpaque()) || - (b3.renderAsNormalBlock() && b3.getMaterial().isOpaque()) || - (b4.renderAsNormalBlock() && b4.getMaterial().isOpaque()) || - (b5.renderAsNormalBlock() && b5.getMaterial().isOpaque()); - return b; - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - return null; - } - - @Override - public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - return AxisAlignedBB.getBoundingBox(par2, par3, par4, par2, par3, par4); + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 0.75, z + 1); } @Override @@ -174,36 +76,43 @@ public class BlockTaint extends Block/*Container*/ { int meta = world.getBlockMetadata(x, y, z); int level = 15 - meta; - - List list = new ArrayList(); - PotionEffect effect = new PotionEffect(HbmPotion.taint.id, 15 * 20, level); - effect.setCurativeItems(list); - - if(entity instanceof EntityLivingBase) { - if(world.rand.nextInt(50) == 0) { - ((EntityLivingBase)entity).addPotionEffect(effect); - } - } - - if(entity != null && entity.getClass().equals(EntityCreeper.class)) { - EntityCreeperTainted creep = new EntityCreeperTainted(world); - creep.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); - if(!world.isRemote) { - entity.setDead(); - world.spawnEntityInWorld(creep); - } - } - - if(entity instanceof EntityTeslaCrab) { - EntityTaintCrab crab = new EntityTaintCrab(world); - crab.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); + entity.motionX *= 0.6; + entity.motionZ *= 0.6; - if(!world.isRemote) { - entity.setDead(); - world.spawnEntityInWorld(crab); - } - } + List list = new ArrayList(); + PotionEffect effect = new PotionEffect(HbmPotion.taint.id, 15 * 20, level); + effect.setCurativeItems(list); + + if(entity instanceof EntityLivingBase) { + if(world.rand.nextInt(50) == 0) { + ((EntityLivingBase) entity).addPotionEffect(effect); + } + } + + if(entity != null && entity.getClass().equals(EntityCreeper.class)) { + EntityCreeperTainted creep = new EntityCreeperTainted(world); + creep.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); + + if(!world.isRemote) { + entity.setDead(); + world.spawnEntityInWorld(creep); + } + } + + if(entity instanceof EntityTeslaCrab) { + EntityTaintCrab crab = new EntityTaintCrab(world); + crab.setLocationAndAngles(entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch); + + if(!world.isRemote) { + entity.setDead(); + world.spawnEntityInWorld(crab); + } + } } + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add("DO NOT TOUCH, BREATHE OR STARE AT."); + } } diff --git a/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java b/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java index 7bd3ee8f6..61df2ed89 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java +++ b/src/main/java/com/hbm/blocks/generic/BlockGenericStairs.java @@ -18,6 +18,6 @@ public class BlockGenericStairs extends BlockStairs { recipeGen.add(new Object[] {block, meta, this}); - this.setBlockTextureName(RefStrings.MODID + ":concrete_smooth"); + this.setBlockTextureName(RefStrings.MODID + ":concrete"); } } diff --git a/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java b/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java index bcc38242d..8374ba803 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java +++ b/src/main/java/com/hbm/blocks/generic/BlockMultiSlab.java @@ -39,7 +39,7 @@ public class BlockMultiSlab extends BlockSlab implements IStepTickReceiver { } } - this.setBlockTextureName(RefStrings.MODID + ":concrete_smooth"); + this.setBlockTextureName(RefStrings.MODID + ":concrete"); } @Override diff --git a/src/main/java/com/hbm/blocks/generic/RedBarrel.java b/src/main/java/com/hbm/blocks/generic/RedBarrel.java index 857cb7b55..753e47b09 100644 --- a/src/main/java/com/hbm/blocks/generic/RedBarrel.java +++ b/src/main/java/com/hbm/blocks/generic/RedBarrel.java @@ -4,11 +4,11 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.bomb.BlockDetonatable; -import com.hbm.blocks.bomb.BlockTaint; import com.hbm.blocks.machine.BlockFluidBarrel; import com.hbm.entity.item.EntityTNTPrimedBase; import com.hbm.explosion.ExplosionThermo; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; @@ -68,7 +68,8 @@ public class RedBarrel extends BlockDetonatable { int a = rand.nextInt(9) - 4 + ix; int b = rand.nextInt(9) - 4 + iy; int c = rand.nextInt(9) - 4 + iz; - if(world.getBlock(a, b, c).isReplaceable(world, a, b, c) && BlockTaint.hasPosNeightbour(world, a, b, c)) { + Block block = world.getBlock(a, b, c); + if(block.isNormalCube() && !block.isAir(world, a, b, c)) { world.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 4, 2); } } diff --git a/src/main/java/com/hbm/blocks/network/BlockCablePaintable.java b/src/main/java/com/hbm/blocks/network/BlockCablePaintable.java index 68a0232ee..3587df3c5 100644 --- a/src/main/java/com/hbm/blocks/network/BlockCablePaintable.java +++ b/src/main/java/com/hbm/blocks/network/BlockCablePaintable.java @@ -2,6 +2,7 @@ package com.hbm.blocks.network; import api.hbm.block.IToolable; import com.hbm.blocks.IBlockMultiPass; +import com.hbm.interfaces.ICopiable; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.network.TileEntityCableBaseNT; @@ -124,7 +125,7 @@ public class BlockCablePaintable extends BlockContainer implements IToolable, IB return IBlockMultiPass.getRenderType(); } - public static class TileEntityCablePaintable extends TileEntityCableBaseNT { + public static class TileEntityCablePaintable extends TileEntityCableBaseNT implements ICopiable { private Block block; private int meta; @@ -168,5 +169,23 @@ public class BlockCablePaintable extends BlockContainer implements IToolable, IB if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); nbt.setInteger("meta", meta); } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + if(block != null) { + nbt.setInteger("paintblock", Block.getIdFromBlock(block)); + nbt.setInteger("paintmeta", meta); + } + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("paintblock")) { + this.block = Block.getBlockById(nbt.getInteger("paintblock")); + this.meta = nbt.getInteger("paintmeta"); + } + } } } diff --git a/src/main/java/com/hbm/blocks/network/DroneDock.java b/src/main/java/com/hbm/blocks/network/DroneDock.java index 226d3c3f0..83bb9d68f 100644 --- a/src/main/java/com/hbm/blocks/network/DroneDock.java +++ b/src/main/java/com/hbm/blocks/network/DroneDock.java @@ -9,16 +9,21 @@ import com.hbm.tileentity.network.TileEntityDroneRequester; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; import java.util.List; +import java.util.Random; public class DroneDock extends BlockContainer implements ITooltipProvider { @@ -69,4 +74,53 @@ public class DroneDock extends BlockContainer implements ITooltipProvider { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { this.addStandardInfo(stack, player, list, ext); } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + if(this == ModBlocks.drone_dock) this.dropContents(world, x, y, z, block, meta, 0, 9); + if(this == ModBlocks.drone_crate_provider) this.dropContents(world, x, y, z, block, meta, 0, 9); + if(this == ModBlocks.drone_crate_requester) this.dropContents(world, x, y, z, block, meta, 9, 18); + super.breakBlock(world, x, y, z, block, meta); + } + + private final Random rand = new Random(); + public void dropContents(World world, int x, int y, int z, Block block, int meta, int start, int end) { + ISidedInventory sidedInventory = (ISidedInventory) world.getTileEntity(x, y, z); + + if(sidedInventory != null) { + + for(int i1 = start; i1 < end; ++i1) { + ItemStack stack = sidedInventory.getStackInSlot(i1); + + if(stack != null) { + float f = this.rand.nextFloat() * 0.8F + 0.1F; + float f1 = this.rand.nextFloat() * 0.8F + 0.1F; + float f2 = this.rand.nextFloat() * 0.8F + 0.1F; + + while(stack.stackSize > 0) { + int j1 = this.rand.nextInt(21) + 10; + + if(j1 > stack.stackSize) { + j1 = stack.stackSize; + } + + stack.stackSize -= j1; + EntityItem entity = new EntityItem(world, x + f, y + f1, z + f2, new ItemStack(stack.getItem(), j1, stack.getItemDamage())); + + if(stack.hasTagCompound()) { + entity.getEntityItem().setTagCompound((NBTTagCompound) stack.getTagCompound().copy()); + } + + float f3 = 0.05F; + entity.motionX = (float) this.rand.nextGaussian() * f3; + entity.motionY = (float) this.rand.nextGaussian() * f3 + 0.2F; + entity.motionZ = (float) this.rand.nextGaussian() * f3; + world.spawnEntityInWorld(entity); + } + } + } + + world.func_147453_f(x, y, z, block); + } + } } diff --git a/src/main/java/com/hbm/blocks/network/FluidDuctPaintable.java b/src/main/java/com/hbm/blocks/network/FluidDuctPaintable.java index 37599923b..0bca70d6b 100644 --- a/src/main/java/com/hbm/blocks/network/FluidDuctPaintable.java +++ b/src/main/java/com/hbm/blocks/network/FluidDuctPaintable.java @@ -3,6 +3,7 @@ package com.hbm.blocks.network; import api.hbm.block.IToolable; import com.hbm.blocks.IBlockMultiPass; import com.hbm.blocks.ILookOverlay; +import com.hbm.interfaces.ICopiable; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; import com.hbm.tileentity.network.TileEntityPipeBaseNT; @@ -163,7 +164,7 @@ public class FluidDuctPaintable extends FluidDuctBase implements IToolable, IBlo ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); } - public static class TileEntityPipePaintable extends TileEntityPipeBaseNT { + public static class TileEntityPipePaintable extends TileEntityPipeBaseNT implements ICopiable { private Block block; private int meta; @@ -195,5 +196,23 @@ public class FluidDuctPaintable extends FluidDuctBase implements IToolable, IBlo if(block != null) nbt.setInteger("block", Block.getIdFromBlock(block)); nbt.setInteger("meta", meta); } + + @Override + public NBTTagCompound getSettings(World world, int x, int y, int z) { + NBTTagCompound nbt = new NBTTagCompound(); + if(block != null) { + nbt.setInteger("paintblock", Block.getIdFromBlock(block)); + nbt.setInteger("paintmeta", meta); + } + return nbt; + } + + @Override + public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) { + if(nbt.hasKey("paintblock")) { + this.block = Block.getBlockById(nbt.getInteger("paintblock")); + this.meta = nbt.getInteger("paintmeta"); + } + } } } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java b/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java index 0b6a51cf8..e929e2fe2 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileCustom.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.bomb.BlockTaint; import com.hbm.entity.effect.EntityNukeTorex; import com.hbm.entity.logic.EntityBalefire; import com.hbm.entity.logic.EntityNukeExplosionMK5; @@ -22,6 +21,7 @@ import com.hbm.items.weapon.ItemCustomMissilePart.WarheadType; import com.hbm.main.MainRegistry; import api.hbm.entity.IRadarDetectableNT; +import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -211,7 +211,8 @@ public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLo int a = rand.nextInt(r) + (int) posX - (r / 2 - 1); int b = rand.nextInt(r) + (int) posY - (r / 2 - 1); int c = rand.nextInt(r) + (int) posZ - (r / 2 - 1); - if(worldObj.getBlock(a, b, c).isReplaceable(worldObj, a, b, c) && BlockTaint.hasPosNeightbour(worldObj, a, b, c)) { + Block block = worldObj.getBlock(a, b, c); + if(block.isNormalCube() && !block.isAir(worldObj, a, b, c)) { worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 4, 2); } } diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java index ed2a47309..315f7c30b 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier0.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.bomb.BlockTaint; import com.hbm.config.BombConfig; import com.hbm.entity.effect.EntityBlackHole; import com.hbm.entity.effect.EntityCloudFleija; @@ -128,7 +127,10 @@ public abstract class EntityMissileTier0 extends EntityMissileBaseNT { int a = rand.nextInt(11) + (int) this.posX - 5; int b = rand.nextInt(11) + (int) this.posY - 5; int c = rand.nextInt(11) + (int) this.posZ - 5; - if(worldObj.getBlock(a, b, c).isReplaceable(worldObj, a, b, c) && BlockTaint.hasPosNeightbour(worldObj, a, b, c)) worldObj.setBlock(a, b, c, ModBlocks.taint); + Block block = worldObj.getBlock(a, b, c); + if(block.isNormalCube() && !block.isAir(worldObj, a, b, c)) { + worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 4, 2); + } } } @Override public ItemStack getDebrisRareDrop() { return new ItemStack(ModItems.powder_spark_mix, 1); } diff --git a/src/main/java/com/hbm/entity/mob/EntityCreeperTainted.java b/src/main/java/com/hbm/entity/mob/EntityCreeperTainted.java index 807e6c543..1997caa33 100644 --- a/src/main/java/com/hbm/entity/mob/EntityCreeperTainted.java +++ b/src/main/java/com/hbm/entity/mob/EntityCreeperTainted.java @@ -55,8 +55,8 @@ public class EntityCreeperTainted extends EntityCreeper implements IRadiationImm int a = rand.nextInt(15) + (int) posX - 7; int b = rand.nextInt(15) + (int) posY - 7; int c = rand.nextInt(15) + (int) posZ - 7; - - if(worldObj.getBlock(a, b, c).isReplaceable(worldObj, a, b, c) && hasPosNeightbour(worldObj, a, b, c)) { + Block block = worldObj.getBlock(a, b, c); + if(block.isNormalCube() && !block.isAir(worldObj, a, b, c)) { if(!GeneralConfig.enableHardcoreTaint) { worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 5, 2); } else { @@ -71,8 +71,8 @@ public class EntityCreeperTainted extends EntityCreeper implements IRadiationImm int a = rand.nextInt(7) + (int) posX - 3; int b = rand.nextInt(7) + (int) posY - 3; int c = rand.nextInt(7) + (int) posZ - 3; - - if(worldObj.getBlock(a, b, c).isReplaceable(worldObj, a, b, c) && hasPosNeightbour(worldObj, a, b, c)) { + Block block = worldObj.getBlock(a, b, c); + if(block.isNormalCube() && !block.isAir(worldObj, a, b, c)) { if(!GeneralConfig.enableHardcoreTaint) { worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(6) + 10, 2); } else { diff --git a/src/main/java/com/hbm/handler/nei/SatelliteHandler.java b/src/main/java/com/hbm/handler/nei/SatelliteHandler.java index 77e0c3cb4..7206b10b2 100644 --- a/src/main/java/com/hbm/handler/nei/SatelliteHandler.java +++ b/src/main/java/com/hbm/handler/nei/SatelliteHandler.java @@ -14,12 +14,10 @@ import com.hbm.util.ItemStackUtil; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MathHelper; import net.minecraft.util.WeightedRandomChestContent; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; @@ -177,13 +175,4 @@ public class SatelliteHandler extends TemplateRecipeHandler implements ICompatNH return getCycledIngredients(cycleticks / 20, stacks); } } - - private static HashMap getRecipeMap() { - HashMap recipeMap = new HashMap<>(); - ItemStack minerStack = new ItemStack(ModItems.sat_miner); - ItemStack lunarMinerStack = new ItemStack(ModItems.sat_lunar_miner); - Arrays.stream(ItemPool.getPool(ItemPoolsSatellite.POOL_SAT_MINER)).forEach(poolEntry -> recipeMap.put(minerStack, poolEntry.theItemId)); - Arrays.stream(ItemPool.getPool(ItemPoolsSatellite.POOL_SAT_LUNAR)).forEach(poolEntry -> recipeMap.put(lunarMinerStack, poolEntry.theItemId)); - return recipeMap; - } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 3b2feed15..724ddd405 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -3830,7 +3830,7 @@ public class ModItems { gun_b92_ammo = new GunB92Cell().setUnlocalizedName("gun_b92_ammo").setMaxStackSize(1).setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_b92_ammo_alt"); gun_b92 = new GunB92().setUnlocalizedName("gun_b92").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_b92"); gun_cryolator_ammo = new Item().setUnlocalizedName("gun_cryolator_ammo").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_cryolator_ammo"); - gun_cryocannon = new ItemCryoCannon(GunEnergyFactory.getCryoCannonConfig()).setUnlocalizedName("gun_cryocannon").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_cryocannon"); + gun_cryocannon = new ItemCryoCannon(GunEnergyFactory.getCryoCannonConfig()).setUnlocalizedName("gun_cryocannon").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_darter"); gun_fireext = new ItemGunBase(GunEnergyFactory.getExtConfig()).setUnlocalizedName("gun_fireext").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":gun_fireext"); ToolMaterial matCrucible = EnumHelper.addToolMaterial("CRUCIBLE", 10, 3, 50.0F, 100.0F, 0); diff --git a/src/main/java/com/hbm/items/block/ItemTaintBlock.java b/src/main/java/com/hbm/items/block/ItemTaintBlock.java deleted file mode 100644 index 2f048d02a..000000000 --- a/src/main/java/com/hbm/items/block/ItemTaintBlock.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.hbm.items.block; - -import java.util.List; - -import com.hbm.blocks.bomb.BlockTaint; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; - -public class ItemTaintBlock extends ItemBlock -{ - public ItemTaintBlock(Block p_i45358_1_) - { - super(p_i45358_1_); - this.setMaxDamage(0); - this.setHasSubtypes(true); - } - - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int p_77617_1_) - { - return this.field_150939_a.func_149735_b(2, BlockTaint.func_150032_b(p_77617_1_)); - } - - public int getMetadata(int p_77647_1_) - { - return p_77647_1_; - } - - @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) - { - list.add("DO NOT TOUCH, BREATHE OR STARE AT."); - } -} diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java index f50d3ba0f..c372487d2 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoHIMARS.java @@ -54,7 +54,7 @@ public class ItemAmmoHIMARS extends Item { public ItemAmmoHIMARS() { this.setHasSubtypes(true); this.setCreativeTab(MainRegistry.weaponTab); - this.setTextureName(RefStrings.MODID + ":ammo_rocket"); + this.setTextureName(RefStrings.MODID + ":ammo_standard.rocket_he"); this.setMaxStackSize(1); init(); } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 1bc9c8d18..3a4db1cdd 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -771,7 +771,6 @@ public class ClientProxy extends ServerProxy { @Override public void registerBlockRenderer() { - RenderingRegistry.registerBlockHandler(new RenderTaintBlock()); RenderingRegistry.registerBlockHandler(new RenderScaffoldBlock()); RenderingRegistry.registerBlockHandler(new RenderTapeBlock()); RenderingRegistry.registerBlockHandler(new RenderSteelBeam()); diff --git a/src/main/java/com/hbm/potion/HbmPotion.java b/src/main/java/com/hbm/potion/HbmPotion.java index a7688f2da..e27806e1a 100644 --- a/src/main/java/com/hbm/potion/HbmPotion.java +++ b/src/main/java/com/hbm/potion/HbmPotion.java @@ -3,7 +3,6 @@ package com.hbm.potion; import java.lang.reflect.Field; import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.bomb.BlockTaint; import com.hbm.config.GeneralConfig; import com.hbm.config.PotionConfig; import com.hbm.entity.mob.EntityTaintCrab; @@ -19,6 +18,7 @@ import com.hbm.util.ContaminationUtil.HazardType; import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityCow; @@ -109,15 +109,13 @@ public class HbmPotion extends Potion { if(GeneralConfig.enableHardcoreTaint && !entity.worldObj.isRemote) { - int x = (int)(entity.posX - 1); - int y = (int)entity.posY; - int z = (int)(entity.posZ); + int x = (int) Math.floor(entity.posX); + int y = (int) Math.floor(entity.posY); + int z = (int) Math.floor(entity.posZ); - if(entity.worldObj.getBlock(x, y, z) - .isReplaceable(entity.worldObj, x, y, z) && - BlockTaint.hasPosNeightbour(entity.worldObj, x, y, z)) { - - entity.worldObj.setBlock(x, y, z, ModBlocks.taint, 14, 2); + Block b = entity.worldObj.getBlock(x, y - 1, z); + if(y > 1 && b.isNormalCube() && !b.isAir(entity.worldObj, x, y - 1, z)) { + entity.worldObj.setBlock(x, y - 1, z, ModBlocks.taint, 14, 2); } } } diff --git a/src/main/java/com/hbm/render/block/RenderTaintBlock.java b/src/main/java/com/hbm/render/block/RenderTaintBlock.java deleted file mode 100644 index b7f6bc240..000000000 --- a/src/main/java/com/hbm/render/block/RenderTaintBlock.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.hbm.render.block; - -import com.hbm.blocks.bomb.BlockTaint; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; - -public class RenderTaintBlock implements ISimpleBlockRenderingHandler { - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - - Tessellator tessellator = Tessellator.instance; - IIcon iicon = block.getIcon(0, world.getBlockMetadata(x, y, z)); - - if (renderer.hasOverrideBlockTexture()) - { - iicon = renderer.overrideBlockTexture; - } - - boolean ceil = world.getBlock(x, y + 1, z).isNormalCube(); - boolean floor = world.getBlock(x, y - 1, z).isNormalCube(); - boolean side1 = world.getBlock(x, y, z + 1).isNormalCube(); - boolean side2 = world.getBlock(x - 1, y, z).isNormalCube(); - boolean side3 = world.getBlock(x, y, z - 1).isNormalCube(); - boolean side4 = world.getBlock(x + 1, y, z).isNormalCube(); - - tessellator.setBrightness(block.getMixedBrightnessForBlock(renderer.blockAccess, x, y, z)); - int l = block.colorMultiplier(renderer.blockAccess, x, y, z); - float f = (float)(l >> 16 & 255) / 255.0F; - float f1 = (float)(l >> 8 & 255) / 255.0F; - float f2 = (float)(l & 255) / 255.0F; - tessellator.setColorOpaque_F(f, f1, f2); - double d3 = (double)iicon.getMinU(); - double d4 = (double)iicon.getMinV(); - double d0 = (double)iicon.getMaxU(); - double d1 = (double)iicon.getMaxV(); - double d2 = 0.05D; - renderer.blockAccess.getBlockMetadata(x, y, z); - - if (side2) - { - tessellator.addVertexWithUV((double)x + d2, (double)(y + 1), (double)(z + 1), d3, d4); - tessellator.addVertexWithUV((double)x + d2, (double)(y + 0), (double)(z + 1), d3, d1); - tessellator.addVertexWithUV((double)x + d2, (double)(y + 0), (double)(z + 0), d0, d1); - tessellator.addVertexWithUV((double)x + d2, (double)(y + 1), (double)(z + 0), d0, d4); - tessellator.addVertexWithUV((double)x + d2, (double)(y + 1), (double)(z + 0), d0, d4); - tessellator.addVertexWithUV((double)x + d2, (double)(y + 0), (double)(z + 0), d0, d1); - tessellator.addVertexWithUV((double)x + d2, (double)(y + 0), (double)(z + 1), d3, d1); - tessellator.addVertexWithUV((double)x + d2, (double)(y + 1), (double)(z + 1), d3, d4); - } - - if (side4) - { - tessellator.addVertexWithUV((double)(x + 1) - d2, (double)(y + 0), (double)(z + 1), d0, d1); - tessellator.addVertexWithUV((double)(x + 1) - d2, (double)(y + 1), (double)(z + 1), d0, d4); - tessellator.addVertexWithUV((double)(x + 1) - d2, (double)(y + 1), (double)(z + 0), d3, d4); - tessellator.addVertexWithUV((double)(x + 1) - d2, (double)(y + 0), (double)(z + 0), d3, d1); - tessellator.addVertexWithUV((double)(x + 1) - d2, (double)(y + 0), (double)(z + 0), d3, d1); - tessellator.addVertexWithUV((double)(x + 1) - d2, (double)(y + 1), (double)(z + 0), d3, d4); - tessellator.addVertexWithUV((double)(x + 1) - d2, (double)(y + 1), (double)(z + 1), d0, d4); - tessellator.addVertexWithUV((double)(x + 1) - d2, (double)(y + 0), (double)(z + 1), d0, d1); - } - - if (side3) - { - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 0), (double)z + d2, d0, d1); - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 1), (double)z + d2, d0, d4); - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 1), (double)z + d2, d3, d4); - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 0), (double)z + d2, d3, d1); - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 0), (double)z + d2, d3, d1); - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 1), (double)z + d2, d3, d4); - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 1), (double)z + d2, d0, d4); - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 0), (double)z + d2, d0, d1); - } - - if (side1) - { - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 1), (double)(z + 1) - d2, d3, d4); - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 0), (double)(z + 1) - d2, d3, d1); - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 0), (double)(z + 1) - d2, d0, d1); - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 1), (double)(z + 1) - d2, d0, d4); - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 1), (double)(z + 1) - d2, d0, d4); - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 0), (double)(z + 1) - d2, d0, d1); - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 0), (double)(z + 1) - d2, d3, d1); - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 1), (double)(z + 1) - d2, d3, d4); - } - - if (ceil) - { - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 1) - d2, (double)(z + 0), d3, d4); - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 1) - d2, (double)(z + 1), d3, d1); - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 1) - d2, (double)(z + 1), d0, d1); - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 1) - d2, (double)(z + 0), d0, d4); - } - - if (floor) - { - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 0) + d2, (double)(z + 0), d0, d4); - tessellator.addVertexWithUV((double)(x + 0), (double)(y + 0) + d2, (double)(z + 1), d0, d1); - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 0) + d2, (double)(z + 1), d3, d1); - tessellator.addVertexWithUV((double)(x + 1), (double)(y + 0) + d2, (double)(z + 0), d3, d4); - } - return true; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return false; - } - - @Override - public int getRenderId() { - return BlockTaint.renderID; - } - -} diff --git a/src/main/resources/assets/hbm/textures/blocks/ams_base.png b/src/main/resources/assets/hbm/textures/blocks/ams_base.png deleted file mode 100644 index d0d65f51ff9d5c7b03ce8cb5be480db3edda213b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfKT{qZN%(@r_o-b~@|I?j^r!VP# zU@qr{pYi)2aw#)2M>*~KIFt9>zmJdE5BJO4Uy$u!G}yD@ub@ti#lxiE@r8@DrCk^p Y)H$4#*Ka$27w9(zPgg&ebxsLQ0D{VK7XSbN diff --git a/src/main/resources/assets/hbm/textures/blocks/ams_emitter.png b/src/main/resources/assets/hbm/textures/blocks/ams_emitter.png deleted file mode 100644 index 1e8db25665e052fdb82a3ad642375cdc413396ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmV-k0iphhP)ojw8CD+YP;MZ zIl>Yw#1sY=6xPB4i~S(TSj4Oend~BqUp2gW^WNiq0|(BL3ykB~0@QWg!_zb!@CU$R z7TR5ow-3*~H>WO=KRI(ge)*^e*zuTCQYex_ZOH<5rjU3=p%@m zIAtnby7>gYfk>=_)u9TZXvyFqsayw1G5*VTi;KmoM! zn`!htN2f|G-@c&u$Jg)4Z zRaQ*>MaIZf064w9FP%XF;P*N@21LdHOs2EKfGYuhucJfDM$cnJr15eF(Dxi2ll9$Q zk1M|TBf~r(h)j;!AIR*_dEfd1%Rod5*WbTa%N6e46fgr|GEF;Qt207*j-7MuM1Fn!)(`?Bf^!b%9M)Py1XX1=5y5+ph*W#F>pCu%3jj^iV2r7fr)lCl zyWMWsloF*B07@ymUaxNxKA9bcff(abqzYPF`O`F^s>@mLJ+|+A4u=D!lm)$Mno9rk z`2=9I*;EDlzQ+QD5dI0fq8!KZt$?cHoO{Dx$3=u;7_e>Iayp&JIisp?P0Tre#0TiQ z4l5#zHeV}*%F~*Nm*lxF2RsBB+DJ8Dg lYlSE+S)@C*P-dd zI)O2=Eb03#Y(79czyRg6Wb&1p8Nf|@ekK+0emVhA6b05=j4`NQ(}!W;k$p7{G6FG1 znD)!%@-Sh|!v12R#Lz36KdUaV84fP)Wq`=$8jD$Kv^Of15NV*h1)GvA>MqLp63&V7?HII>ox3l z(+!KaKMV=n#0Myf9}3p~55M;a*Xz8DL4|;*>!zG@N~>)VHXAq`H0Zr1q6v(n7SE}$ uS|NDo@EmSfZNUPvRqKu+q!6)zrmhUsDC$5g`!x2 z|9F6@aRp%q=QH%Z6)u<9_v`Qhd!0BWPz4Q3F{9d7c*cJ#X!D0T~8xP6N)t z!v12Qc}O~l`MQ~El5?tcB{dFo@J^2`(4-NGHqB@AOLOqH|&J6X4wFpKMW~u>;n|Vj|6M~hwnYe^*TSsFoi(WbyLncmDRQ&n++Te8uVTh@ebpt#dA|w utw6m0P{J_4`JCd0_i&-&zcZF%415E)zJ--_!5(k`0000GU`Ay`6R@?RwWX76_2Q>N(=; z>nnTj(ONSM165T~89^f_g7^G$O|+*^tXk>q&aqUyRKZrB7?VbZ5Ku}nJ||YcK~zXp z@?(hn8YAubNLX$-Idd)z`xKEeA>xPAXU{4ndR(F*sdVHR>HVo8ild~#D+3pbU|l3ZubGL zHKyoU?i*sU=tDk3mk4nrk+8i+m6CaR;@UIPWb!14&lg6NOq0iCfm|$~?oV`{Vay|2 zu~7FGD`xse(RU^P4o@Dp2{YH!;zZa-ga`-&bz5PgL2q(JYB+W+Rz%(^L9qw?yt4#Q zoSBD6-Zk06`yU_dIJU8BmDVY(8e zC+~n%=qh)-QlcmqX8+ByjLcaOM8$3NNMSf%DvC|AJR)n{2zo|o&85Ad*CA2#g1AQ1 z9x!p^UGCR5UPJwm~Mk8jjs$x(3n?H!>72iK!%HXi8#V!;T-v?RXoGrOudA3EIH zlE%auXS}~*g{2fdW$jqDfZW=EY%KWTA zCV4|jml=cS(DnFvBV|ohSF{eS2?T!fOgEN2U>bpI6Ng^n=R4)m@;^d9XtmcBt2zJx N002ovPDHLkV1o2JOws@V literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/taint_0.png b/src/main/resources/assets/hbm/textures/blocks/taint_0.png deleted file mode 100644 index 0bbd1263467970ed2921f31bfe1376d793b71ac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476 zcmV<20VDp2P)Y4G@1amc}wLMBfq zHS>VyYqlBX;n?59A^gM?M0jh6!GpJk3kI5#$hi_(&J}m*?*YI8z>-B`1WwtbPiDry z=<}8=LUR&19)ag~qA7@sBXGL`uN%?ZlgQT>V94yw_OBa}TWiDfyTatH?OmoI^72V! z$nm9;E=xiU0sE7$`>I~_VdMUO`<3@F7IyxMrhU5uA0 zz1D}<%u3~UQ-Q5fjDVYh$OQu#tiLfQkshUWU-Hk8nOI8}nSzMz4VkUYsX2-C=fk-Y zU2&IEtb^aj`j9+O_0d|}E^c4cO+n<4JeVI=@z!w49`+CHk##=hM-$ic0)TPUWV6dC zS@ChyJ45JV@Gy8w7AZwlW>(*A(B`CKm!b~Epa_3`RRH@ZF^;zGU9oAsV4!b!%Qv>| Sw6|jb00007K4Hw}Y|syx{%Q zV={B7(&n3deEl(+Y^_D#|0Eh}5$jxvHs1sQoJ%o|0JA3mfM(4MQG&@Riz+G zf?Y%j0N`};7X!fMb}&TbZM+`uqPn!x^SlIX<{e!j()T-vl2C{!fo=0mnl&?u^*g#k zB&O8rL;ZSW+N_}#Y4c5Vtz`PGPIZMy{QvDd8FM|}#oNarnVI2S3QYdcJTIZS@ujxS zH*qcn^B!qtR8eQD20000r(IpuRR({mt4CpG5D}Oe^EMb9>goPXj_(!#mUa~) zLRD3};jSL#2$Ih&?JA~kCMnAjj~@@Ft4DFp!F!MM?S)cWjn+60 z3^OBy02^b()BRi0%FKxg0I0@RaNMl zNz^Xwmt~p2&XT67M~TC@tCnD6M1l%_KQX-M+M|ynjCb zz01AA7*nz^T4UDZ_v-__QGFf**RU}h}aWN@g*`)4`67XUDK zt5|E{z26PD^&m%(d~WVmF?};iRaJO;e=u!5h;t4h1e`A?^Yh1x+-^50Gkw$V^W|g; zBEr-Ag8=|$PFvb~kl&xbj1Ct?fe^xu&D^b0lx3M3%Ql%9BbXWI%gJcZT8r!T3TB3L z4$C$fW=4z=1rg!#{yAx7=EMX5RO0`RN<_F*E$TvEZ9NDPCBU*Q5o6rBQ7Bc_3IN`F z^vx)0m-efwN?_;9$yjT@Y*ekPF@yjjO0=07eKSf30oK~IXa}IQj@37##dNgI4{9)uPczt0g@R zE?jsT+&?Jx4+M@3CkO5vrQI`$WXFEb@0su~x_XQv0&6Wq1j{-T4$)S9Jk|{Wyq`a# zwHDs{-RG_z<8jFG9}UeE%d*7l<%PO>jLtc{US0?Qe*QSe=kp0==A6T}Z94|15CT5F z-Ut9hWQX?a_l1d@K#qEA2bs>+g9%Be04J?WR%)E2M-0s)3zqJ+s;JwGtOi{(s zd|8%h*zJBLYb|!P+NzJ<`)^8j^_UR#RbZ1hD^eaqGsT>xqH8@3(Boic-0oLe)|uL> zkGaLlC>Q;t31&_RDrl~})^ee{dW@v|DUvpO@6$!*4jnJjh)8M%0Owp+$@8lb}HVSTeBb49OpS!enKIBY3Z Tt(`Ss00000NkvXXu0mjfd6v|i diff --git a/src/main/resources/assets/hbm/textures/blocks/taint_13.png b/src/main/resources/assets/hbm/textures/blocks/taint_13.png deleted file mode 100644 index 6e0ba09d3948f43c884433a730531316df35fd73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmV<50U-W~P)E_b5Ph~58RrLrjjiD5V1liK*1@Q>_*7haT6hXP8E0X& zI9hBxKVY~T>VkHB&bC7=&Diff&wC1=<;PH%8O9heGqyb{Jk&h+@;KK3@bdIpj4^P| z9WMJZlt+-qd#5lh1pwB|S@|&(Yb}2Nc~$`M^T)5!DznxirG(q<_8%bUjP-I>0Km)# zwtsJbmB`jwBc)VlLZ-W}tIchXiiprk-}b1CF}UCFU}jirvF%YYGl&Q}=Ztyq^#L;< zl!R$1ecyk()SNR;#u&uws^qV2`7xB7a|P_W4n%ZtL&xh{|8I-|066Cmrlp8o((n7e zg2n5qj4?RKng?H;b4V#2y!K*cJZCx8_|D%K42J)UiVoik6d#Ke77YYUiWH4R8!PT3l=WrCHkC}3 zA`JvgWs$-T`vneGrXHEEcU=u_-|x@<&)_eHb`)lYwHC~bd7TXIqN{tkuUA?;UrwfJ znxc7VN4XcV)*|n#@?r=9-h0gJWaf1;RaGGuX_^MijAdDF0*C!EH868A?d#{$Ff)dB zl$WPh2_dA~(2jE0AEhFql$_Ve5K%F8UMFL%#r1jxGbci31`(l(F`}#cf+8n*d)~=* zyM1`n7$Y{;TAVK@qb}qzw4=lrli<8g#yKZl-OIdArmK5Ns%jAcc<(_(h%pwE5BsBp z5FXp8dwK5>LiqPsU9#2|`6Q4NJc_sH-MW~dH<9s=#N#1)b%K{=oSNGzagZ6ZFFY1sI z7FRy(k3vNF_2}002ovPDHLk FV1ma*$Grdm diff --git a/src/main/resources/assets/hbm/textures/blocks/taint_15.png b/src/main/resources/assets/hbm/textures/blocks/taint_15.png deleted file mode 100644 index 9dd944165ae23603e8b4583e31450344e893c226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458 zcmV;*0X6=KP)b>!3`M_;Oqz9p%<^ixgNGUgi~?PHh3r{!vn&OQ07W`@ zsN>a|c>#?9S9U2CDGf)G`h4V( zaxY@7Mc!BC#Sj9#_n6no%-7p|PK3-1B0?2oL|69(MNabe{4U$=_Tf=u zjM!LfalV|4x{$}vjuK-`g7Z2V=bUtPFY`K?uI?qNszm_cy$2B?##l_=?+y||cxJvlgsS3l=KuiH-UcGVo=ghJ@Uyd0gH;o4GH)X%Q*1RTa5YTb3O}REWv})7}P`^}BMXR;zUOb+or3!#bMHNi272-n%xp z^6g3GPOa{r9O&^mSXIHyzz~abKvsU(QMnEDtNAR;(kDhB}l5*!iXe!oLR z5W)`q5}b%2#v6P}DKj6=8z&+ty_-e5w6ao4cr!1SLRmu{wIncwWg6b3npXg5+dal+ zRg25ktLi;BJ6MR%N7xg&8qW!1rcSU+@N2AGg&`tY*sB*8vE4g z%aCE}REIk1*sN-6r|q1-Evd0twOoHQpv7lk5dkv;%kxl538f0d`Js-=%rEmTB52z^ zOrjk!=C<8u5?}fPfDm>7kmE8-);xq=9yVrv&Vk9BI@K6&`9(5w-m{lE^3x6x;c(u# pm#1pcn3|!EIe{`2o7R2_?jK{`QL~hYFK_?=002ovPDHLkV1jii*k1qu diff --git a/src/main/resources/assets/hbm/textures/blocks/taint_4.png b/src/main/resources/assets/hbm/textures/blocks/taint_4.png deleted file mode 100644 index dd66e62453ce37d36b8fc9898e2bd1ee8839123f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmVW!Tbtg>Q9^xviwtXlHh36@H^BdnO_nV?abW4+n)+Ty{5JziR;K>WPgp@ZP_G zo3iJ1ktMFHCsu7Wa#0j`|I(@{dv?wtgn-jyuRh-bPtycZCU0^-J@!hcl<@wg6#x)X zW@*ZvKfaw3u+|zOgcmhkJ+ZddLZn)25n}`q;q=%m05}f^WsJe|`2-QcIfwIbP(*|n zBXmkBGas*8MMU`y0Mg=rLrp1RBfW?V%V^4;mjt44>4p}m(klRX@6lExi(Qg0iXs;~ zJ@(2NGuwFC-B|jPNvD*uY$8HijT}ONF(wn`0_WkNMAkamYUHI#VejgRkJs(rT)KMV zrtG<`#=Jb2-7TNRskRz=Q5%!CDIp^QV*&mMR3No3dwX?aO`>5xn;hiSkL9 zz4w_!FZ%)j=NtfJyQC#4?wrfZX04s~K;(7x#4*MhyprBlBOk9@)!I2{jKT4`RU2Wx p>~4I&-?4P!Wy-^!GqOYg@B>VKNPD!*GbR84002ovPDHLkV1k~O*ZBYd diff --git a/src/main/resources/assets/hbm/textures/blocks/taint_5.png b/src/main/resources/assets/hbm/textures/blocks/taint_5.png deleted file mode 100644 index 90ba3f39cfbfaef30899fa27c4f30f33ceda5b3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmV}IM9imL$~g50)Y1(eKWDd zCHGZTsj7GE;ylv0*WMChA|LkKX&WTM<)f88jN^;&&1aj8<+hj!-e zY4tmop`E#_NA8;`FVA6l%-@n!-%MQIF9ay@37Cjrt<5S@N+?wbPIvXl*4n52CL(z6 zArj>$VfNl<5?%TN0OuS4Izs$UkQTS6sJuwl%7y}|gzqSewb=sf#@m&MJ+-+=( zf%pCnJk%3E4k>YSx3LWQ6m2qEBjIjCPhKKXXLL72&#d>=0drBh0H zd4Ey>Kty@VP*42!`==7H)*2y%J2rE-v9{LcM!&Wy#t0(9@p4eoGsfV0y@H6~oI}61 ziii+ngia~pv_EI9M3k8TfJpqGsVODwM2n6B8YO+*-*g+mB1#^gnLK)<$1Xg${0EL^gb?Q^&B z>&Nq7U*>M(p`LhbmTYKgt{m0aEL`??0+jd!Ohk}~$7bP_QckHHs)u@FYwg{A6A`@k z5Q_4XZ1&#gCA!oF0M0o8$Z?4z8Sb2euSMF;>&LSi?RQTw n*+rozhxJb!MJjTw{o1N8TKh&*cVurs00000NkvXXu0mjfS##lp diff --git a/src/main/resources/assets/hbm/textures/blocks/taint_7.png b/src/main/resources/assets/hbm/textures/blocks/taint_7.png deleted file mode 100644 index 614bee225b0a303d15e35d84ffdbc41a70d99c77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmV zjWO`v-+_mE;>RH+Zs|5wV>5GARd{}XQbRqla}FT{94`m;>&FM*ZZ`-sd6Vzs<)Cy* z3D56O3IK>GZyD-|-+up80@hk1gmA}Z={DBZ+T7^ZR>c@WL^xg!N_xf^T(4IU5u9`A z*H#e`VvNu!C7kx>td)o|695p2|1&kEgq>)S6v`UviBn2>ptTk;#=A7MP!+8J;JwG# z%q($9zpAP{?07jSW6XDqr~R2lmpGkL%Cw0HV>5FI0mhiTC=ck@Rtc@g8k?C*ma={6 zHh%ql`RmKlZ9LQykIkG7EzOmq8k?ER{!V}rpMZ%767kr~oKngul|%JVPi(EdyKf?b z_Z~t~ev-}J`@BS#x&XjA2LL%PktD;Na}c)u+Nzx~210M?HjXi7a7le^W`6yAQKS9t p2`0NJ^yIMqiK9qGuC-rV^#v{OMVjWW!gv4x002ovPDHLkV1hUz-3@P)**YPy!&#aI-@BIs#eY&`6nkF~gIjRr>Qc9SQK}k<*4I%;&!59N~j*5s7LO>N`#Qb<> zttq9<1OP32E5#U5*EM2{Sgt|fR`&6v`+EfdyFE!t31iI5 z@Yt?&2Px-vdy<&Djhd#x$MP=5b|tMfoO76tUN8VN<2U}Ej$TwD1bi&-f(Loa*se4k zz2IR0aL&E3+3iV{QYtr=YY^Uhq?9lnz2Kgd5-~=^7@@Vsat$KJ2=6_r5CZJunYE^r zG7|t`iT^V-gn&2J!YPzBwkw4YkWvBwD5c=Ne@UZas-;$A4CZblj!Q}j0BD*fgH1;- z>bm}o(LSEUy4dLuLZ+Qk!rX1-oP(4yFOpLJ0xZ`cnAW}KZljVVZ{O`nU*Dg9ecA0v zW4qGaZQ0P$T)v69+ogpgAzLB-gvB&7t?;h&8$`M}DA?iX3b z7*T4`S_43iizTt4T5B-d7xaqRXa?|lX=sVk-M_5CTh$AB4tjp4)kCypW&zSiX$ Z#1BeII%rbHFKYk*002ovPDHLkV1jj?*m(c| diff --git a/src/main/resources/assets/hbm/textures/blocks/taint_full.png b/src/main/resources/assets/hbm/textures/blocks/taint_full.png deleted file mode 100644 index fce2c72d0755e6e8367232306d9982e26a7c6828..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509 zcmVg_$)LPB+`IOJ+10~ZleXq5eV~l~6k^ul_-cyK3UayzY z=EviK>$?8XwASSC-h+q)0KE5@b7HN9TB`wo-n((m;r)JtnGr%j@7*vn=A1aj7<+Qg z*{rp|%qXP@0H{P=+P%gY_);zEg4S9KL?mMj=rWb??#7|0suciIN^s6?yPR_Xfb%@} zWwlmgt^Khv#we;wH$BGK*lR76QslZWIOp~t=Nt|qlHR*ftp8O?kvpYMZ>>qr*&K?e z;h1xx)@t-pP2yT>6U7)stv_jHof!j=+a6wQO;hY+B&-g_L@T8uGvH0PYK)?%#%?>#hVr4;GC zn>i=O7_inN=WPD`ssQ#+q8j!2?uw?h_inxc!QEVDUg%pL00000NkvXXu0mjfOrG(I diff --git a/src/main/resources/assets/hbm/textures/blocks/taint_low.png b/src/main/resources/assets/hbm/textures/blocks/taint_low.png deleted file mode 100644 index 48ee862429fbae41851dd346cf09aeee4ce63bd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431 zcmV;g0Z{&lP)UR$yT5Dk+cT?UrK3;2&}ab5fG8V#|t6M&-|guQi_Q&-ilL7^Ap55hrRCDldUy) z??FU{h|GDO*g;~97-OK;x_V5lb;cNtvc?#p-@EMdJn??N0RU>%dyj*e7a9>6X1=i! zk#Wx9^?E@>mO>E$GvnyJBZROT#uyNh1)6i7kH_QZPz15zxA+3s75sWR=ef`33qX&9 znNdnHL}WgPtIT`+j|P}|O<&J?m#Voj#$rz?%_F5WpU)?*>oVFPBDZthZK_%&IYb24 zbuA|E{jw55m^tT}Qd(=%4gLJ#YOOQpy!_>yX9!^`&>qv8+Z_OawHBq6udCZZ^;(I@ Z`~_C`7nQcRm}vk2002ovPDHLkV1kfk!ifL? diff --git a/src/main/resources/assets/hbm/textures/blocks/test_bb_bork.png b/src/main/resources/assets/hbm/textures/blocks/test_bb_bork.png deleted file mode 100644 index 411d7960f53fb93d708a447237710de40df849b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 zcmV;c0aX5pP)y-EW?6otR+?yPI&1Naj~ZF~eth@=rUiXsStq=_J@Y(o%2 zAZXq|Y%EfWMbN?`1Pk*HZWZiJE7@c+8;h8~-AzPqGce4#_d9b>sQY={<)78CZ47|( z)9jzc#axn1zSL{bzwnl@1i~_V=d6irwvmoRI&J2bR{_u_O-L7N2+Jgut@8BxF(#Id z9J~u`kS^5Fbe&YTil%F*b|+8_3@waeYr4+y?m8!j8^~sxv&$D+UoCbv=Y7L8uUJ?n znjS(ojRCf+6iRjitr}i&k3i$`+2*1Aj;j=V(M1xm@YtY$2E*TWmCHeVh26*k(ve)` z-vCI&!h=CR3!|%YRhQ1s#|2poCK%bXs}$u*opPlP!2Z?}N84*-lsOnM0JzIV z0nmlv3zUz*yXU_6{w5xn#=eOmK|n~RMR|;%m`e__J*~tH2+y6-ux&E=(y!u4^$j3E VuApH1>{ome)q7){1E^l43Z{ti`b7e&&ow;SMDO;WHMlp4#S->oppe zr|^XwxwY>%Pn)t!^W2QHD|Q_)OBTNV%B=JQdowd%(X$lI34-B@-<6L{xofJmTqE)O sgpvaSk2;y%&Odl!m@0Glarr-nlBxCv>-V@k0J?+0)78&qol`;+0Dl!lVgLXD diff --git a/src/main/resources/assets/hbm/textures/blocks/test_bomb.png b/src/main/resources/assets/hbm/textures/blocks/test_bomb.png deleted file mode 100644 index f9b425a24c9ed544c78f9760e4d3d91027cd971e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pd`}n05DWjgJvW68C~z?U{XajidEvyve*LutW{fiR7IBmLb~RY8|M<;; z=|x3v&{2=1OpPhiMa*qtX9_J&n5=a`?OSnn?Zf654fnjy$G#9b__EHw*JWSS0!Klk t@K22o*gnWyKgF=&rA?1@-G@d)zrrKaDt7-`Zw<7X!PC{xWt~$(69BX8S%Clm diff --git a/src/main/resources/assets/hbm/textures/blocks/test_conductor.png b/src/main/resources/assets/hbm/textures/blocks/test_conductor.png deleted file mode 100644 index c1b14c7080dfbe4f2edf5642c3c3dc7663028c0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf&fPIq z{^T o=Um^$%yQv%@xPfz&cFY|5T0hKypmC11<(x)p00i_>zopr0NLt8W&i*H diff --git a/src/main/resources/assets/hbm/textures/blocks/test_container.png b/src/main/resources/assets/hbm/textures/blocks/test_container.png deleted file mode 100644 index 3d3f7d32993128432e20088cebfad6fc7d4e4a53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@p0#6sm5DWjM-Ht*H20To^|NDnC3mcg2d?9BQ&GcHoI)C3}5s{ZQUJ2gE zOXcoN;ZJC~Ww=4rE8sQT9}BPJsd5)In>e+O9|&B;GBr=(plZOQ0C~>2N^=&3vDM6< u!m{0#LT=By}Z;C1rt33 zJ=4@yqg0@pFi#i95DWjMrvt?r6gXT0zwOUlU8wVrXG+=rCyLt^*M9q*PL<&nKm<9imgis TH{5Cmw1L6X)z4*}Q$iB}q|{6d diff --git a/src/main/resources/assets/hbm/textures/blocks/test_ticker.png b/src/main/resources/assets/hbm/textures/blocks/test_ticker.png deleted file mode 100644 index 4f3c430f982e6c5c2d6a548f7553d19f8d3b315d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3JUv|;LoEFFc6;(MC~zG4@qhWQm}645l(hcX2zIB;3~P z{`=~t!AzGo=09vVyia-C&OOoKlWY@Pj;0=iCbyizt5@c`LdyP0cL5D$@O1TaS?83{ F1ORLxL?ZwI diff --git a/src/main/resources/assets/hbm/textures/blocks/waste_earth_side.png b/src/main/resources/assets/hbm/textures/blocks/waste_earth_side.png deleted file mode 100644 index eabad09e5ae1360234dcba61afa5b5435e074fa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmV;%0XhDOP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0XIoRK~y+TWsuEk!cY)}@9X#q1$SL_U#QSW z$ihV-bY%=_H9w*un&3tQfsicRxa-^XvnPyc8|F^VIrDq3+wb>fSr$d{`SWeJ+r?s$ zW!dR;LQj%pwOYk-yj(8l^Z918afic!a9!6`RUMDV*>tjAufs5;tnd4_ZRtfeIaH=; z>YAn@>3Y3JQA8*3ZnwiT`FuWiU3a-$puX=1K>%6Y%VSe}8_E2ymtM z#1H@V@ropB85r%9Fcc^Tw@OQeDk^}{)Nzb+Eel9DVC`-bEMRjK8&8&k4R;VXuQimR zsEM};sN;GR>D*R;5DT{RU>eJ);~4>O#|;MVQ(*wqEfUK w9t@B^tfZKLQ7K9gxEELhur6nGjAzryH*`BVSato%umAu607*qoM6N<$g0|AR$^ZZW diff --git a/src/main/resources/assets/hbm/textures/blocks/waste_earth_top.png b/src/main/resources/assets/hbm/textures/blocks/waste_earth_top.png deleted file mode 100644 index 625f45be7b3bd9207e448af97385e4ed5891550a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 608 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 delta 1615 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 Vf~%PmL0bR-002ovPDHLkV1lXnZSDX7 diff --git a/src/main/resources/assets/hbm/textures/items/gun_ar15.png b/src/main/resources/assets/hbm/textures/items/gun_ar15.png deleted file mode 100644 index 032404fcc8e7c99faecb4ec4eec24fc11c71b4e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf1p=5Jlg{LLjtYrBmTj4!GO&Ds+StsSPPyq>_#>M^LIX z27~XA-fn{n)nU)zN+1Y`O(hYGq{4BLsg|92k3a0ftt!uR_h&fEvg;)se3K;qXPsS9 zxYzZ1Ql!QjyP|NP=QF@AnGe<8YvDTZ}P761*`1 z!2M!@wN@ob;({Q+7=zZ@)pbo(RcbPUh`0xThKM+8t!kPEtu>zK5k*lyHz?@fFbH^@ zYedAwaoqQxmdpM;`U;)o>$^on6hNA$?s>Ih9)t&F1<~c3D4QRb1AZ S!|yu)00001u@(!oh^_y>P_g@RilcW}%({v-Tj&*7Lm2;GD( zl^mdpM=+D=6sXn)h4!1i1l}jl3xQA0ttkB7j0ns1bn^d2L6RgiO(SBV=aFFv;Q-qW zFvbYy902FC++62HwXSO)O#be7j+aZcj$B^sHF-gEYVu8nydms zg~RX9?7RkvRxrj0rIgR}8~|%AQc9$h^nEX)005=b?8RXi7{`$;%dpmpw-o@Ys+xt{ vwiVuc(llk7rg(*Axa+#jUwZ~wg1#~jv!`IRUyK(g00000NkvXXu0mjfsj7g9 diff --git a/src/main/resources/assets/hbm/textures/items/gun_bf.png b/src/main/resources/assets/hbm/textures/items/gun_bf.png deleted file mode 100644 index 67bb9a89f4d405feafba37bcf0c513a8641030a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmV-O0k{5%P)1pw7==FtV@U9<$&(>If(gb`(cr=7C_PZ8opGt~Wyf z==)xZqL6B;q?#((nnZnsT%Io69&Z5Tc@Ds`Eb6m0sSwT1IdyzKvaTxt-g|)Ub&N3* z-=Zi)Yc17ONqw&G*4d?>aU2yumSvnyC-yIU0Im<$O#$Ajq={mZwr#&0_U<^tFh~f2 z5CY>kDy_8uG);rGR{aQw5NoY6#>hO+bX`ZR2w<&M-vUy_fuk9~Ikz24#00001UlY06G3VNqH4A*T0v0edHk&_i z%{nnbs^sWV)4y}mgpS=c{$5l3E`{x1_1^t5N0!tF>2ER-3+}io2Bdz!k!W~5yEMIC zB!O$@m(J6>dzW?zHE7(*I)3re;tXvu1&2v*s;jGo8Gghm*lVqSb=5&Am+3w?%Ykj@ zwcjqBnqt6s;PvgztP4W=7{bqOxxAS5isJOmm%Uc^8*?%2u+U@(aJ{*+`(k@hy>-4s zng4v=^Apd>=*>CxC-%>$A0JJt62u=_3GM2;$Zi}}?>f)za!c_%XQ00sJYD@<);T3K F0RRF~esll; diff --git a/src/main/resources/assets/hbm/textures/items/gun_bolt_action.png b/src/main/resources/assets/hbm/textures/items/gun_bolt_action.png deleted file mode 100644 index a5e4409af92df8775bf55d6b2cf9c191f01c4aac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfhgfBHnh!$Yh*l}&6DvN-%alXwqi zTN$*(tGWzWOI$-(i%f0bg-3#OIAM*lW*ZZ_O=|6g0;%}uEipICSmt_sYVbVRD@ zdPx$G;)~-A4GsTeVq$oJAc8khDTP5?T>S9%{QCu`giRV68ygc3xAFEg%~RsJ+5OpI z(ewq32I>E+es|Z1A2_gn`~D5PnldI>DK>xF)5OPcB+734VTKjkfsSJEboFyt=akR{ E0RL7@l>h($ diff --git a/src/main/resources/assets/hbm/textures/items/gun_bolt_action_saturnite.png b/src/main/resources/assets/hbm/textures/items/gun_bolt_action_saturnite.png deleted file mode 100644 index 6c84794619f770fd2f74ef56c2e162ab09fb52b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vflx4Zf#u@^F7k3kx$4ggMXPkW^4qJow?!QSLdPSa=hFpyJBq0~uO%y^7U^a&BLQ zOcXPgg&ebxsLQ0NFi8 A`Tzg` diff --git a/src/main/resources/assets/hbm/textures/items/gun_calamity.png b/src/main/resources/assets/hbm/textures/items/gun_calamity.png deleted file mode 100644 index a5ec308bcfaced78165a74bcccad32ffd049bf33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfMnkR-`#X<`!F(H%i>L4LVy~KC$MB#p86mKTbfCg)G^Zg4mvlkCFr(CGcgl{0p>2rSs@=EZsM_p#4g znJ3O*bjapS_Ax$nA>HtpNFzgrl_b-Z33WZk1slGbf4}Fisru%3Uump;G7qCm&`*m# cwojAemM$xNuFA7>BG7LPp00i_>zopr0D)R<#Q*>R diff --git a/src/main/resources/assets/hbm/textures/items/gun_calamity_dual.png b/src/main/resources/assets/hbm/textures/items/gun_calamity_dual.png deleted file mode 100644 index 3f6d18f4204166156cbb1428a008723ed5e20cee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmV-20nPr2P)dfwq7~p*OoD1+D)wXS_>pB4#V^Y_3>8ZBZLaM4lDTVi*d7c@^vA7Zgyz*iz zR!UKpB~P5}Iv8V;Qi>QOLI`4vOw)Af|=H@DUnAq19Xp=p|*7>@wCa_4njcaT5T7cT987)EJ;Q~&?~07*qoM6N<$ Eg5yAbZ2$lO diff --git a/src/main/resources/assets/hbm/textures/items/gun_coilgun.png b/src/main/resources/assets/hbm/textures/items/gun_coilgun.png deleted file mode 100644 index 5c130d10963b9331ac31134f9c52517161628143..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmV-b0jmCqP)s^l9Igqb{UsPIb`HJH zbp(&=nC_UO;x(8VTJ&rk=MPtPuu3Q#JbHKe1P zLubzV%V50nxn8)mfmDEplUD!)kja$3HE0D9dhvW~sbO~mz}3Q~Zw<&~%G8NCp5&qq z(9w%wcSBN`0EAA|D#;GOp5)>;h~3L;A+@pAo}rS$q&!Cfb}whV3IKSC9z`Rdl>R1n zsYfQ$ZAY<;XJYS!pSpOGA}P#0^VFGFGe=DTfcwuIGWk)}Z|Ad}e&Y!v*H`-HaJ$*o nzO*qxX<&&BK^F&uhPG@d3W9`ex|{D`2;5t4arf_N z6o-a5A;}>jx^%gIECoUoEeBrG@VgdAPIb_xk|!dOa-5n%iUqaNJknfB%FaM>}Wa z^LcFB=Je!ozCw`w?RBZFt)eI~l9?Q-R0>VgNT<`(>vdFB4XOOuLC_?b$&t-wd1_zc z-d@n{b`f9i3!s{`!3row%T7)@p;V-V-}m%7`{al68CbXaCA8EMZY*aY1@IDWo-?iOQ)QjeKW7@ xH_N1Z60WF9p8s-huPoaGQKw5P z*&n!8Zn64g`1}vU2Z_gjts-l;HZ4h?vqU)S?LIFT8|6x2hG|c;7CF6NT^-l3rdtMb92RdK9y8#gZUtSGg5tnJ@L<$!+;_^SpoC|A`$d zIx-^bV_J_FvK)|bzHAczu9D6A`IgsKNj(fTY_U=g=3Jg*%%G{taBJJ&!oAgp#B6vD zud2W77<>KIUi((YxKzcK1q_!>64x$$|2wwgsY1(w&o<27x7=s*`!}e*HQL}UB)E1} e)>i}bYtl2hy_`gAs@4PD%HZkh=d#Wzp$P!Kvst(R diff --git a/src/main/resources/assets/hbm/textures/items/gun_emp.png b/src/main/resources/assets/hbm/textures/items/gun_emp.png deleted file mode 100644 index b4be7d1f73915533a67494e07dbfe1b7d66de9bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf{PSsPG$3GNg;E}J8}DAV z>cV&1E!Py37!DZl7#vG!JX1V9AYtuU7P;esuXiyq^cenNd+%p7BU0#4{igXFre>^V zWcYk%k?O0`tS15!RhFu@C@b+ltK`ehjdJRG65{_xZMn+A7td`O Yd27=IpXBXa4)hj-r>mdKI;Vst07^@2JOBUy diff --git a/src/main/resources/assets/hbm/textures/items/gun_emp_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_emp_ammo.png deleted file mode 100644 index 15ca8e10fb1e0dcd4bca3320085fa06219c8bac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmV-u0hj)XP)1pw6ox-HT`~m%IzSGf+jQ;$N`^owqzyDAC3p&S2swa{ z(HoSG-m3!y1TunvLAZl0*RrEhh$i#&{_p+2%!4aW61$L6R{q;si&E-h@1Q89tgN*- zmjd9N0bn{k0FdW-ph@~-V^*!`>*bB_&yu^3r?y9kEPxCE-tzhU5I7Se!&(av#JTN9 zFlN;Vc6eA_uOp2{&q4o9AJ7G9Jts{aWx2#T(?;u_frH7Uo~-qp{eFir4)}e<#!wuf z^&FrTZ?~@ioKE)ujK{|~!1nRLVzF+3kHego9C)k7IEuoxbs@6?ikk;?HI3K5A^4u0B6PyptatsYbg10000P)NklLJ|^cY@S1ym_z}-KxuG#ja|McD14wS#24rp z0)iGcpiY6oTd;D~Zhn-4?nsvWEYGJm1H41lTHgA17cWXF1^{CWzXI6-fRvKQalD(o z_aGwCG|lEspta_B9^dP_ehs3O;;%oZO`F8bhpOU_{eA*j>f~Oc_a4?-{yd$;_vM1? z?S=?hD^@%X#u(1B3`8UjRmI2i8AVY%8QQiLivZxahdj?gL?RZNB+0D#DMFNUP7K3< zvMkv-CjcOXfDpo51=9`Yq_yV0?*RZ^*R4lbl9ZAGAWhQ=WV0gV|IKUq0WyYg#Vf8J Qwg3PC07*qoM6N<$g7IR6H2?qr diff --git a/src/main/resources/assets/hbm/textures/items/gun_euthanasia_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_euthanasia_ammo.png deleted file mode 100644 index 7a26309eb284a1cc2603954ed9820532da8678c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfv2ipQiH3A>r(#$UcT?NenY)GA!_%!l<-4eEtW< z1dB(NOrd4zdJArTpCw&!diLi!u4ns{+U$a&L@%F^WJ&&J8Ui$)!PC{xWt~$(695vs BGSvV8 diff --git a/src/main/resources/assets/hbm/textures/items/gun_fatman.png b/src/main/resources/assets/hbm/textures/items/gun_fatman.png deleted file mode 100644 index 07bade5d1c75fec500fde209c3ece4d2163c5db1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ$^?EDy zT9$4lw9cqqV9E*2fuG@6mGNY%c^w8|Xn|Y?jUy^9LenIVa@+qx&g5ByiO)?RDvw{lA0>0#3}YHdLT;GDxb7uakv04R#W z1Egs>H#zxx;Ze=ZB3ZO;tHkDEficDdeEnVsik1wfCS_TU`@ZjI+ErDJTu|V_100MY z%d#0LvDQ-8wHgZq1o+8w0M7gUsuBfo&GX=H-?y6rFvj?IC2!yRS&0}#3rvu%>#)`? z!T`Hhung2N48(Cvk|Y8AGV(X3Qz>(?I-h*5&G`c~~M_$0000T;K!TC!sPKzS^fO&f7|O8P4=_i6mIoH{Pwm; z-*v1LQjQmfct$k{FnzBLR?d9%VDI+KSub|=70N_TTY8dJzNtf{TWEpCuN_lTYVR`} z@HmHES|)bAl(Ar5`nKsyA}29UiJSEIzWJo2%c`E6nmsreJ<5Yb*1W#8$NO8Y{?U0B q&wVCUzOUae`FzgV&oQMru5r_uBidYCwjKdGo59o7&t;ucLK6VYhh6Xh diff --git a/src/main/resources/assets/hbm/textures/items/gun_hk69.png b/src/main/resources/assets/hbm/textures/items/gun_hk69.png deleted file mode 100644 index a7dabb154e83de8a5c0e832cd953753b703e7571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4JHQr5IP}Q`y&tayW`hw4bcMF-SyxuixI4(LBrjV9q%zSrO_tgKNl%)TK zn)*(DpCLz1EAaR$Sl?@OlW&9sS=em*_9CtlI@tVHs+ zd(0QU*M7V=`(T`6i~5b+hE=n6t&5z-`o6Z%%C(^*CDc@rqvPn^Sdr2l(nGe=kwW(#eJo*fuY6k{4ame{KaEAKiKQ%t4Xn| Z;_pd#_H9s?{tomQgQu&X%Q~loCIGofb4CCF diff --git a/src/main/resources/assets/hbm/textures/items/gun_hp.png b/src/main/resources/assets/hbm/textures/items/gun_hp.png deleted file mode 100644 index 9c65ba2e28f422a851339ce65e2703d10f9bcffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmV-E0m1%>P)NklfD2@ls@gSB>6)(IY; zpME9xUyAM8wc$C50tjz!oQO~#DwQOO^E{8DC;-^)c0^GGK$d0dq`(Bes}EIIwAMNi zp)AX;F$_br))UFZ*b>LF(^?NC#+ZrZtY9oL#sHA#`5?18nfxKob0s2O`0e9;(laaQ z?^wOo!12QS_1PngF@f*2)&P|I7xkwJ#)!yZlB=bHR?>g=MVP?9?6aNY8x81fJDj~j QwEzGB07*qoM6N<$g0z5*+yDRo diff --git a/src/main/resources/assets/hbm/textures/items/gun_hp_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_hp_ammo.png deleted file mode 100644 index 4c7f3acf5535fd774fc6698f26b59e5ccc071996..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf#%_UtGgSUIn&Mw-qZKF>rFZQ)a;w!mR2s&vgILBAK05b#f`2ehy8ZouID*m z(YLf~&St*3#W6ppOj@~<@y0gZhIOw?PDZWvc7MNDe|J-|Cx@f_`qx#Ta&HScY3yz~ z^=Xc&du7JF`0g~pi#1w1x)~+f7BW=4FP#u{>CX4ROT`5*GaQllx~lx5eogSE#c|>Z gvzC22`JW;Gn~wRSQ-LzxK*ut8y85}Sb4q9e0P;3l5&!@I diff --git a/src/main/resources/assets/hbm/textures/items/gun_immolator.png b/src/main/resources/assets/hbm/textures/items/gun_immolator.png deleted file mode 100644 index 26e05d4d6e5f863711f861b67e01ac15e03be575..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 zcmV-V0kHmwP)1-g^ zt5cLx=(>(lin1)VpUREA-X01-k|Y9P+qRrcj=P!NM+X8B$FYp3BME|_A7nfoiSPRo zhM@#O&yho4Und(mghNDRq^nC2Y~Ck4U=D|e0g&r z^;%&Jbqv#B_3}wk6x&{_!6u7nsTo6^dabCdnxiWV$8okMfBxt1CIItUrgd7BUC1I@ hc3ZMtNUvgBz5ra0Vi6Y=-dz9y002ovPDHLkV1jhwj3od7 diff --git a/src/main/resources/assets/hbm/textures/items/gun_immolator_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_immolator_ammo.png deleted file mode 100644 index 33069873c59c18755d900641668ca74f443918d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf zOMUy*&o=l6NSD?~NUY0g-0?`5FFc{QHLtF2&Bd@^AC(I?eqcRmCYNDSr+Ac=2ME6I l*`u*81wJw%o7yKopKHo$4YEg0o8z2Y-U={TD|^@lUw9 z*~uk~QOM#fI2?@{ha)9d@4WO~ngsH^PrgEws;WE_lZAzd_`dHaL$c6ptyRuBrb3j6 z_@XE%%Mz`%5)uD;{0=~V@6=9%adXo&a0K%wNirE4;^xc#oUZGL&9)kZg|$|NX00`K zU6V4CEZ*b`H$2A}vj%C~b|WMoA6RRZh_EWR` z_S~Hv{&~jE{|s<*vhQd4s%y5VxO#XQ?rk*~XZiKB`i@MJ41xu~*d!ScLjbNH-zME1 ea(jBPHppL>M~cEJ38s$#0000As=6u|L+!UdWo2nHc1*ToDsNSzAB&8e>a8h)dGigv6Y zqC>^O!A*!L2AYC8RCpcISc6K^x7=~Z``x<-4^Cp-LjWeje615sv3Y+$&=3irn~7PHw5Yb~qQs(NOWQev$YV~h+212M+PXfzUIi~!ZcQXr?5 m%;$3!i$$&65&}@XT*MF3VyXP7$zkLG0000Eak- z(VLvGK<&mhyI=Mzt7athv~K?Me{wR1@TOWlA;d}5PZy(mXwr`kWf2Y zb7({Qc{#SA7^d%s8lAUGe!7$@p`xlP8MNv9bvBLAWO%z;K`SsRkp8A8Gqe@B_$} znDKvZ;)RRTn^tS<-96l4DlpMhxm$Z>hhahC<^>(erHpzP?mYM~zp;@q&!h0AoZFnl q2L77gzuFh>DB<^fPXJi!@W59KXF0`I-X2B zg-qKbgrNI}rwj&L09;?q8gDn+1lHlF$J>>wpDtS+0E{P7y}!F5j$@)IBG2=6Mgi06 z0O0s&NKq7~EK91Y!a0ZcUcZVqoe@Mt-*`quv=&K{1Zyp6ny&5|Bh+w`>;ka;aX^-3 z09b2TF3wpjFHL6$waAbWB4Pl%_xk>F!OrFgRpsIJtg}Nzr11w%_U35;{?$qp^Nn?Ap@`D2?otL)d?Gq+k(V;MG7KDD12VLqpiop%Gr zEJxw=!w%2toCS9%&K34KH+?n3j=kF(esA<^Xw+D$ar%<8K1pTcVWndd)*M1tCPS^@Q*F6#+S~^7Lt^B* zOnmp&Ixgrtb4>JlxC!U3)GR~KqnOjB*X+?OfRS=PMqJ@)~l(;+o;pUx0{{q6I9lWUhJN|e5tSGj91 s5@XhgDaShw(1!_50W{x>slu6lks_&>u%QJgNB;Ikz8U*nWzxhYax zNtFL2iXs52s#@&5ST+BG+qMNbPU1HObzLifrfC?*5o_&|gkVhokR%DtIhAFZ*IHw( z#TeuJzNhOtwV6Of{9Sm7hQaXFmhSob{KUC00000NkvXX Hu0mjfRC|Qs diff --git a/src/main/resources/assets/hbm/textures/items/gun_mirv.png b/src/main/resources/assets/hbm/textures/items/gun_mirv.png deleted file mode 100644 index 7c03eff97baaa941164a3f791e0d3a2a7ceea4a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfiBSW_CuWinkO*Fca&K-#;mdKI;Vst00B&JF8}}l diff --git a/src/main/resources/assets/hbm/textures/items/gun_moist_nugget.png b/src/main/resources/assets/hbm/textures/items/gun_moist_nugget.png deleted file mode 100644 index ae84c07f163ec59f10e742ed4e263d91069dc144..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmV<50U-W~P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^5z3JSmg00B=)L_t(IPkoYUPQx$|g>!&5ZPLJz*;|$t zvEPRsBz6Rd{SHxU%!;o25a z)Z7xwvXL`GfUxSlKTj7ww&0-a9~t` zUbp)8Jn7o|PHLZfnFIa;KxII@9A$R8)VG_}o+}>{JF5~vG6F)aCQ`xCeAk~JVUh&W zhIyVhM+k{P=)vP8bH|_xjv~O*xZ?pt4?qA;7JCMSCIZ07uHOf<_O(Cbz+u%*2`-76l4doG)Hk7dtzTKXT%~?s}0Q>YA$g zXG=;21o;&Ol8>B`IKJ_>*qSe;CoIdCik#_@NPex9?{XycYX22Wm6y}`+7lOCyE&n10^mX)U?rtgu+mq2%_)bw*1H{#4Dq=Y8pz*Pazopr0D$sv5C8xG diff --git a/src/main/resources/assets/hbm/textures/items/gun_osipr.png b/src/main/resources/assets/hbm/textures/items/gun_osipr.png deleted file mode 100644 index f45a4069d6f07d3e3b500b4ed496b5d34c00c68b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXK1jNi|YVT(HTz{ z#}Etur4wxVnhkhbcQQG7_;~Or7%EKjnOW4-7rVRcU7^)igT2#dr=OhW%q95t!%zK6 z{`Rhpe@@+ndyYPp<}yt~&4UNI&dthD zWLoofPWR#~75z(AzMi^EZ^HLD-whWhc8d8v=Gd}!dF8&zopr0I`33)&Kwi diff --git a/src/main/resources/assets/hbm/textures/items/gun_osipr_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_osipr_ammo.png deleted file mode 100644 index 24e644f4408c82b20fe7935cc6fd4c1f893a3663..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwt=FTwDi$it0RF978Ppm-cStJ)pqD;;1=sf=0%Q8FsT%X6iir!JYAE;wP`dvk$8$ z&HUTs#i}K`B4j~OqnE++ErxAh@2%bXtm}T@&PUeIZ3D8uF0YVgaj20!-e(x%^%2ae z_;uiyWb!43L!!wX8%-Dl)_>4t3(*Q#>9CY(DpyF|@k`8p;>UX&i`y3hUBck$>gTe~ HDWM4f2Yy}# diff --git a/src/main/resources/assets/hbm/textures/items/gun_osipr_ammo2.png b/src/main/resources/assets/hbm/textures/items/gun_osipr_ammo2.png deleted file mode 100644 index 313abf55653b680ee688dea2ce936499622ee970..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXK1jNi|YVT(F#u& z#}EturTrVZ4jb^eFrS=tRHFHLU+gdLR=>Y%>k{{Sd<{J3u}RZNR&L*9Kle?YC*paU zAMek@|4u%R;7F zhrJ;S>}Ohi;f{FK!2jF!1=EZJufJV=TYGqNSS$5cBQ!T@GNw3CB?;1UTZf5Xw^>bP0l+XkKc&Tws diff --git a/src/main/resources/assets/hbm/textures/items/gun_panzerschreck.png b/src/main/resources/assets/hbm/textures/items/gun_panzerschreck.png deleted file mode 100644 index d9c5fc51d8845c5222c3eac854d2be894adf849b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf{m z5X%m>BopIB(uWQJ!MT&?KfL{%&31pz+MXL*6&Zw$j%z2|Dl;=PAKrd`z2uGx*UlnK z;avyr+wYf{5qU$RuI~SdhBvZ{cy8Dn{k=c`T-Y&o{W_4P0=XP9#vpB5*jx@Ia!1V3 zYhaBCI~?W~QMKda2WiLY4|q~%D9XIi;o%a>;o;$#aHFs&f{9`^d)kSk(&r_+ zZj~D?s%R8waNSt^hslkvOl${tXBi_i^O0zfKKr_Vjk_CC9Q@i2b2B_D&&f)Cpn4t{ O5)7WMelF{r5}E*D0e}Pm diff --git a/src/main/resources/assets/hbm/textures/items/gun_pm.png b/src/main/resources/assets/hbm/textures/items/gun_pm.png deleted file mode 100644 index a32ee6a14d72780b631b3fbf76b91633bcbc6e95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwt=FTwDi$it0UG978Ppm-ZX-9Z=w5o>{?Yto^?}F)Ey^Yc_+Ib*GG zLV25lq`0d0OpalnYNE1(vPC^67*DGFskM-SlSQ&qdy`POLqo8tz#ElBNzX6$XK!Gc zaHBL#C_Lhes#ceZh?3vy3m>}fTIE%=PQ5X&&F_Vk7+2+zm}v$pYR{^z3kN!d!PC{x JWt~$(69CR;R}}yN diff --git a/src/main/resources/assets/hbm/textures/items/gun_pm_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_pm_ammo.png deleted file mode 100644 index 9309fa68f8f869b721cb5a8fc466eea9891310bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfo#q#c3%JA|go&%DR5cYkMrGu7O4U0t z`P@H0pZ~yq)oPC{H^Nh}J zSu@+vHCB9c`VN-KuHF!lR`yKF;gfNz+Qy{C2{TrlQ&@VEk>Qwxi0*FFdtNZ=e5_>C5JfzdHkr5`Z3M@O1TaS?83{1OQZeZ>9hM diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver.png b/src/main/resources/assets/hbm/textures/items/gun_revolver.png deleted file mode 100644 index f7d5507514988eb4f957881e6a3c9ff520fd488d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+nVO$@hV3rg*wIhFJJ7?c2@UV8G*I>{Yg4k-xXQucP}}E)C-g8##7M@^NbZQ&Cw| z(N%NK_NL%P{SblVJ@WIWCNzJa=frVEDbR8C5uRw3G>$CQv>!|dryt>A)T>yp;TbX^ zNI9{&b;=1_>7pe*C}084E0?0o}*o>FVdQ&MBb@0E~TQ8~^|S diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_ammo.png deleted file mode 100644 index 77b64a54eefd8770c0068bd9e329066288ab9eee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBuf-vKbiP>*~8u&e3978Ppmj)Yh9dZzuvm#XL>80$+RxC{E z+P9*f@=l84_`xuLqT1Y4F8K-UEKHRSQt}fLrg~Z2RGt`oUZ6BFBG26X=G?o+EdoD| zyRH3yQ;y~IQ@4m~PK$VXjk6jJ~q=8zJxvWf(h>;ji%STf?_T`3BA$Z zZ8F0})TP}oLTK{07M7*43oV{*ogTMvw%_#X-#>&ygiQZk&0g|yg4x@^Tl3FL?qC*( VRMp^diU)-#NbFJAbu8X@ z)BpWv-kdvRKlS-erjCxf*`3P{SuVd8)nhm%RdQ{s7~_7Yv}FM&7AdlP`u0Kc(cb0j zUc0{6x@);S_IhFuV?;~NHHLfD495yt6nrn={9LzZiHhfyC~k+#CW*2g9ourHc@H~m z+pDDXYgfwZ2G5`G*c?JbH}l!`6@45F44p%YzL-wmrB!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXZEKj`94t1EKe85 z5DWjg69f5L6nI>0**Q7QpUh`2c)RX#+LwtkNDq(IfdWCjvZUn7x&mn{ND0 aI?mqycUgCKU!wugl?*~g10?g978Ppmj<8aZ8qR3wQ|ynk!+L{Fg6Hk zOJtkkXko~BiY;$mYhaLqZ}-yW3CHVxh#x-l#U<|d&+RfSzLz%`x^0;KibeHJ>W1RJ z_QVFI3%i9j3GMlwvUcgZ*DG?PSDjKzZI)`TlyN`lu-UWLZlZQzZ~Zg{RmQ~5Cnj!7 zdcRyRUFzXJUm Ty5qMB(3=dNu6{1-oD!M<;M{#h diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_gold.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_gold.png deleted file mode 100644 index 0e6008a26cbb966af6d790584da0a2a5cfe28f8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXZEKj`94rhv!{z= zh=u>szKgsK3OuYg9j7NL3a1sg9@d&F-V}5zsZ(D3ZKgi2%NK6fc~1?kq|KIyXr%A? zrR=oEEo7%qpy~&=kedzW2 zw@z02=nnCt`!^@Da7S#J)+nG1BDMYo>|mU-_F3t@H5vbb&SCI$^>bP0l+XkKKxkOZ diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_gold_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_gold_ammo.png deleted file mode 100644 index fe6b2515482b05e21b6c62ff353393cede6b6c1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBuf-vKbiP>*~f)_nq978PpmrmZxd&oebb^gr8Hc_QOC9N5a zO_m89Y6%1AV-vj2DNT1eCA!As+R_JH&vqTiHaU{QDH8l(gV}!eCzo#=UEE@m zdaop)+_xUSwk*)eH)O~?Ckx4uV7tDYCL-ODgzKF(O*_yXuT22WQ% Jmvv4FO#m6GdvgE) diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_inverted.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_inverted.png deleted file mode 100644 index 1c99257002bd63e39554bcdc9f1022d1a95e4f54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vfc&TY*q;$SvWq3pA+6(My`G*~+b@yWHtX_t z1|aa}_V)h935q@^W|dxXkw|fMk(7{-=rC*Hj6I;5EcdvXonOM!kmVg~i6JX%>whjT vuK%8#!aNM!qB9&t+&?}rY{@y>%+J6O8s$@xnBd3*bPt24tDnm{r-UW|3+zA< diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_iron.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_iron.png deleted file mode 100644 index 82974cc4cee5f6968a57db4b23b5ea2c8420bad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXZEKj`94t1G*1`D z5DWjMeY<%Z40v2N3yV5m2n@auxS7d0z$K}%=YUA$i2@IgkLrqoM}wafzdPC2QMa&3 z;_=@PYgnZBd>3(AAlAthrJ8m_$nw43cXNXB z)C52M!1=o8YL_KT%Xw-sz1qy;y1~y@H@V!s<~$oGm&UVG4y-~V#i^N&Uh@C| diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_iron_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_iron_ammo.png deleted file mode 100644 index bc25af3a44d0751ca50b5a1b461215d300f6d226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmV-y0h9iTP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ940Rc%wK~y+TrBg8q zgfI{suNT2z*ocibVrgS(XYUL29d`DXTKNIN#?DG?{DqAV$gxXuoLufs?go|(n=qN3 zO$;Ff{=rS=pYc!-1c9(Di`T<27`(WElY+Xgk)|o)I2IJL{1GRDaU5aWHo`E3>$*%N zx8CAGFwe8mG!3?GgX1_@*Ok>!Yx0N|FD4$xfvT#I=Q)TlNs^CBUdBi_Mp1-mnoyP{ z_I>Ai-}hQ`weLWYn5Ky=%djj96X{5_?|}Ru1=LR4w(vZU%~cbU#~4}y!c~&D1Oy!k zwQ-sbdGIZK-xozu2+Cd8aaMbmKhyJcNSQ2OQ=sDcW)**aXW$Oa>Dy=E{SycP0000< KMNUMnLSTYsFqLBf diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_lead.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_lead.png deleted file mode 100644 index 4ecd5014bcd8166869ea3a2cbaa15ec29af5fa43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXK1jNi|YVTQIDsK zV~B``p!9NcfG{odWkqZ3&@|+GIKQspN4KIPOnUGh|G6Rbu1Uz4$*#;-Kn`pQ>p$ zm7n`)E)75AdO#;TfW`3GwqB2a-Hy#nU5kwj8rhBpO73`QB_bywb*Av(eKtj)yBIuO L{an^LB{Ts5n9Nn+ diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_lead_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_lead_ammo.png deleted file mode 100644 index a123c69877f8b4b563e7bd3bd92b17bfc3892524..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfBPVAd^j@!b2ak9Q$vu5p)Q+mCvQMY4NS(;i~mwaK&WZIT4C%~jxrrYOi zz&X#cU{&JHnR8_u>X~g5(>%40Z&i9Dv?uw2XB1-$pD+W%j%hjz-L9DVY%{*lHQ}Zt zt7L|&h0NLo>ta`2zR4lD&|jEkzsylLvDYhIHVQIa_n*G(b%7 diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare.png deleted file mode 100644 index 8b7241860d68c6f554076d354ef2d9ce83ea0ce2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfCpe$-`^(YaBu|#1pIja=+US884{0x)cpeo8f=_JL`41> z8yNhNk7?VnV@HC-ffiSOu8I#27#BA+F&&<3UH%~HgkGZJG0|eJITCXFE6-lAcy45~ z@gRe;;@Qv9HUEKn4PthFZF_iodpytO>vLQ$HeYWzBk=ftOiT_B5JZ>?vl=<~{7-L_ fm^^<52O~pBKrE|aiOCzFgBd(s{an^LB{Ts5^lV&~ diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare2.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare2.png deleted file mode 100644 index 6f440b5b6f8b346af604df16e313daf9f4dc58f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf^%my^%}n=SqwtA z?poI$yIiA7aM7xd))JRYe3g`11di=rc~XyIfsXej6V;Z6jvFG=-b`J+%BW%8>ks$z qt@4)VpR@e6FJAZfF}u(6_b{Gd44mYAEVLi!Yz9wPKbLh*2~7Ys+FZ*3 diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare2_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare2_ammo.png deleted file mode 100644 index eb58a2cd72f804d03dfc646aea00da53363f359f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfpUo{A;>(%Hj~- zsf_SM5I-cMAKD<66a5^rb;9oJ}jx? z>T1AqFq7fTglC>zJZx3lc&4wnPk!(yCCQ?!#=d##Qsw3~Ey5o)!@>@|+`m5hZ+#@^ u^8doKzW-JCG&XbgxYm=yadTE7Bg5@UWh>O{mi+_zm%-E3&t;ucLK6TMp>bpY diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_nightmare_ammo.png deleted file mode 100644 index 75fc19a3bd191d93c90a94a7e169e67252916df0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBuf-vKbiP>*~g6BP5978Ppmrl0kYc>#YX_sl>4%o3|;nIZ< zbz&wn?^yVhDTdLjOXWP%=}tz=M3pTyW%JU+EjM3#)h8GIH(Kt(wzr!zrOI>HPkO@m zde^GgR-vIw;~nIcc@8hIIUg$0x>{3!ze3+w`gq`FlamsQE9ceDTKhEMqR{kI#E{>bsMgAU6WcWa__g6xEIqqC%$Dt9+v``epdeE>@>Xez4p@VrP0}`vEfsK z7(7oXvv(LWZOD~o@VzW^tooKpa!h(R~A3+;12F1Pxb=6!QkoY=d#Wz Gp$Pz>S!8|y diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_pip.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_pip.png deleted file mode 100644 index f524b1d6b6079dc0e27bfeef0f64d36f6cc17f75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmV-J0lfZ+P)Jjy&x~Jejm8PixBuOGqJ=Q+NaV(za;W!Rynp$_JqwIYsio#mg6=Tdh z$x%wF%T)I9@e@QTCCjp0LN23Tt)r9@*LCrIpQ@^?TfiAIjw5Z`GEEa_$nCM>IF@;y zaU2KW8)Vxynx?VrJHR-O02pHc2*Z%3X{_D+YXX2Mip29g0Lrp_{Jp?ep`s{~VHhMy z5;>Rbc7pH1}K(y9U2f^n60IjuXt^a0zq8D7n VhR8hKa2o&s002ovPDHLkV1iamhZX<; diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_pip_alt.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_pip_alt.png deleted file mode 100644 index dd888d23b20e4aa455ce55b55400dd1e09ae93cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf#|)3{t2-#f|q6e|WEmN{|x z^!*6}Or^2zdp&m*`|VzLSb|xgwPp!}A`3%XBEtfm)9vqTcP?3^aV3h|;j+nRH37lg z+h(tS&vUgyU$hYrKk~Qbc9XmgK~)17a+-ScPRBtRZ=^) z=Ev&BzyA$4TXX-vqShy>VCr@|ZI1iImWAJHMnpIw90aZH=S2@Zjk;*!U)El{{1}Hv^2(+JE`taguS}g#DevX{&z6YWvjqM7=K2QY OVFpiEKbLh*2~7Z(Gi8zh diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_schrabidium.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_schrabidium.png deleted file mode 100644 index a1e4a87ed67802030e9555db5bd7fde3b92f81fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXZEKj`94rhyQhm| zh=u>szKgsK3Op{72lCw#IHnaEs3*@lHFLs+Zx@8@=WTR5}x{iiMwmH(Sk%7PxEtM?!3tMx$^?(BnD4cKbLh* G2~7Y*~f}cEH978Ppmrge1YcddN`~QtYu8DcZ2BV#u zEM7lTlU7bID4yPO@~AL_xWdG_&Jzqaeq7?8nPKR#<>dT*-@ew`)O9H+{V{%${;%={ zpNoj#thVG`ajfjwZA=DF3Kp#8+SF5Ex4G@koSyKCXO>UWm@DKS>=JO?kTHQRU=qij zycesuE)_N`V)$0w@wiaT$aG`w#aO)w%Y{V*_SxS)`Na5>aJjXDui{~W*x3ET{m09T zbAu&rNOxJN-Fct0M#nq%-H$nwHcDjc9?{semCZyciJ`Iok=YKwYFvn!c{GHwY shR@p)Jd-;%+Q;df)C>FdxtuNTdH!S%W}b6~K;JWXy85}Sb4q9e01bwU4FCWD diff --git a/src/main/resources/assets/hbm/textures/items/gun_revolver_silver.png b/src/main/resources/assets/hbm/textures/items/gun_revolver_silver.png deleted file mode 100644 index b9900ddffcea786212b6600840aeed5fd5b6d6de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmV+<0o(qGP)v6 z2u1}hD+9|AajYGaB5qEv_@x8)`+l5r@44_#t=DG(P%4sdGse9Lf}NOVol2#OZn2ICI^00006FfMEs|Ff6n>Ne-8YoI{lWY+M~)xyW13h zfvEZBI7$d#)+#|%fMIW>06gEl5(EKNl4L7{Z(r;jY+;%vx2KPlAh@2B6}G!gVcWK_ zEK79yE%6&fDT5iCH30ncCk~Hy0XRFkD%2JLuIGsBiyK8Ik$ybYF}BlENGUbHPCV7o z8WEaaXEvE52S}-_nqAKk!`?{I8W8}q$s8>)7Vfn&L4Fna*Aj!c9+Iv{S>1TxE2T$V zjw$_*^qmbuU+{mt!Ls&`_5_eY#sgoeRRKtSh7tFd50!=&Qb>IRTlI8IbP)Nkl8_KwZ}XzmB`UDu6w^Na1|@(3PEI}XVLa#Gb$RTbWQM1)bPH QCjbBd07*qoM6N<$g5w#4T>t<8 diff --git a/src/main/resources/assets/hbm/textures/items/gun_rpg_new.png b/src/main/resources/assets/hbm/textures/items/gun_rpg_new.png deleted file mode 100644 index f707e524265c4df78e0d0d3f1f65271331cffd5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXK1jNi|YVT(MnGj z#}EtuVHXC`vFX%uZx$FgU?b)3%_%!R*kD zBT`L@42O^GVrgYQykrNhT8iZ{CT(k&ILM}!PC{xWt~$(69Cn)XT1Ob diff --git a/src/main/resources/assets/hbm/textures/items/gun_skystinger.png b/src/main/resources/assets/hbm/textures/items/gun_skystinger.png deleted file mode 100644 index ef3ff8c9d8702480670c92242ac87485e96c6fce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmV-K0lWT*P)Px#{YgYYR5(v#WPk!QGqeAvPMuJW&KsJPxPndy?hac<>f?)tt0CLGX!#akb^GysO zmw*i6$a%-`+N2AoAs7-MLq0F40E=_1iT}^KMH8<}@H(%tvGITV#V=r&;PMVm13;SV z>+2yd2`c@M%R59TU0mKF+5lviAbW=-1JJ#rn00`GWCLKaqt|tv0hIB`G5|U20|4p} WgR-Fo@?ih~002ovPDHLkV1fWQvxi3j diff --git a/src/main/resources/assets/hbm/textures/items/gun_spark.png b/src/main/resources/assets/hbm/textures/items/gun_spark.png deleted file mode 100644 index d308afeef5434915d73e037dd3ba48999887ddc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmV-+0g3*JP)%IG0Yv5p;8?Q@fBvy zZ?V?$y0hXT$?2g_qLlg)<^g&uX8gVDAvgQSK8aGwr3r^6`j_qXRR{3+(jyE*nkO}K zo3mJJS-Na;--G8xA-)9wtSv7%fVbQP?RI<6e0703+QV8)tJM+%6;fT_J%~ay&HU8Z zNOL9?8qQIvI;E7$=kuQ)nTeD>vD4`QptTlKN~g6JnWIQ42d-OV07*qoM6N<$g8d?$-2eap diff --git a/src/main/resources/assets/hbm/textures/items/gun_spark_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_spark_ammo.png deleted file mode 100644 index 150780fcb1caae1901bd94ef1d811d7b03ae59bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfAdmLK(&tTPFn-39wr9hW~gazvbGD g=Rdc7JN}q=$vZ!*q+FmO9Jz~7s z(#0W;_B1I1UCH3->gTe~DWM4f0fAA1 diff --git a/src/main/resources/assets/hbm/textures/items/gun_stinger.png b/src/main/resources/assets/hbm/textures/items/gun_stinger.png deleted file mode 100644 index 4e89b8215beaa4cfe359c738cfd8ca386cd5ed2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmV-B0mS}^P)Px#^+`lQR5(v#WPk!QGqeAvPMu6eG$Ixaqb)&QD ziGPjL5DW>BA&2{pfyLK#^8N3Bse{)gc%9eS*!X|z)6HO);PMVm13;SV>+2!WoM!SL zmv@Lxy12YUv;oL2LG}(w2B3Q-K11RH>WdL&42LLFWfU?6-sI~wA N002ovPDHLkV1mvyhKB$E diff --git a/src/main/resources/assets/hbm/textures/items/gun_super_shotgun.png b/src/main/resources/assets/hbm/textures/items/gun_super_shotgun.png deleted file mode 100644 index c8c8f39cb7c4375bfab7500791eebfdc62da9b71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwt=FTwDi$iY9rwIEGmGFP-4X*Py_|QrXeT>3;6d!P)Nr{|l#ha^o-scFnGH9xvXw&gSC)@{56R<)wc^XJM+!Lf1=%PyJI+G3ICy51`xa zx_-YethE?pXfzrJi-=Kr!-+6?&cftGQG~S?Yb~e;w`;lH`o&;4 z5d<}~)bGTu+7oz{e^|exw(pt{;jl{bq7B!wVHLeEV4JkI*O{xwR7S)76(OGM?wAzcLU$} W(|A!waJtF>0000io(c+Q+!&K zFZ_rk%9QrZ)9k>1sO!4))cf)M!F!)V2#+Dz*`xP9Ip=WBG0!uq%Can{-a`X`zVEXT z0^>LWP}lX(8UVCyn*fTUpsFeWhG97PF9A;>rze=~ZVRvLiio_8dkX-FF%o0MKnAgP zw}7T;QdyR4+jfB1u$LQH7+{*F3|^a9(6%^jAR@cb!tmNeRZ-R5djN;(iSLkh+yp%aT00+ncvg8CEdI&bo zkcr6?gOym`%z*x?U?+;Gc;hdBPwzd$f2e7iu=efU?}OGlc<)!6WT~UpIw+-3O7XUP zVi*QKyEgeYN&wLJedfLAlx+d1>w0|!(RuU0IF1-&0NA%(vQjdZ=<#q207X$yRTTj5 z$HNb1HUV(yEwC{rO0sAGFijKAImAdzB;BIH{qsvG%MxpCWFo`PZXhtgNBf$=_a*|$ z7DXOV;Ccf?e+z*IdGT}XJkgzsY=J@5C$0G~p zJ@;^Vv5T+a`RAW^*%(S=*&9?mHM*D@w&n7F-fsSnt*ENW>wVbgO*$PXZu8$|V%YP& z;(g!*r;^>#4xyon=ZohQvv;sn&upB<_-kMPgQ=ZTrrno$T~cI2jQ1FAyq2^!Hl3eA xkn>*kBa1rYe8uwg^%GXlYx}PL_jJutdF`Vq8r(0gRsj9W;OXk;vd$@?2>|oOc%=XU diff --git a/src/main/resources/assets/hbm/textures/items/gun_xvl1456.png b/src/main/resources/assets/hbm/textures/items/gun_xvl1456.png deleted file mode 100644 index 6507efa708f5058739e9dafcea4294f852e7852c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJca`vY<7dnkbVF3&PyyS{wgm+VZFA0SXS%%Hd+q@f zyB9pPk#veQf1ssk^x%~o4966TC!No4yY_k2`O@1?$mW`54ix{Pk zEthNwwAitssfj6K^Nblc{=ayUu|U9y&sEWm$B3onBJaTf4~}LYPY;g<>84P@k3a00 Z8N^x-mviT{2m?LC;OXk;vd$@?2>^g5b#nj! diff --git a/src/main/resources/assets/hbm/textures/items/gun_xvl1456_ammo.png b/src/main/resources/assets/hbm/textures/items/gun_xvl1456_ammo.png deleted file mode 100644 index 77ed27a29e077bc22eb13841aa872a7a1b372f7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJv8BcI2AUXx;2k2x^dNt18ZL}R_)2OKdC-{ z%7nWidvuKdn4if@`zC(*ndCCxAg_&ciVs)czj#KWA!@ZF%ekF;Z_lr`eK-BurcMT ZE_x&DZI7M&LZDw5JYD@<);T3K0RRpVe6j!l diff --git a/src/main/resources/assets/hbm/textures/items/gun_zomg.png b/src/main/resources/assets/hbm/textures/items/gun_zomg.png deleted file mode 100644 index b0e443d764a6348dae172ae8209ebe3c9f76e2d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C|TkfQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXK1jNi|YVT(PmE< z#}Etur4tOr4lD3DM@nqoxM4$z2DkeA#v&QkprD4;%BHmkFgKi zuvpxn`u$Uz^SAmAiRNBRn-H|>@%9(*QgRngOq1}^EcKSDIuov#+t}g2vF`cDP!D~D zL*j=7nvO_Ra~$|rXxla+E+b8G#%Fb@%M3FT;#zBxq$D`1+CIdlDK29)5w?>%*!iVS zzwCmKg?vl-g*EFfMb|9|j4u{=dm$~stls?&_c#0IIWnzZ^?=T2@O1TaS?83{1OQ<0 Ba325w From 3bf526419ebf56dc13292ece77a79080c146e055 Mon Sep 17 00:00:00 2001 From: KellenHurrey <85083021+KellenHurrey@users.noreply.github.com> Date: Tue, 4 Mar 2025 17:23:43 -0800 Subject: [PATCH 5/8] Make RBMK Rods actually be a SimpleComponent --- .../com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java index adda7c8d5..14bff0eb1 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKRod.java @@ -29,6 +29,7 @@ import io.netty.buffer.ByteBuf; import li.cil.oc.api.machine.Arguments; import li.cil.oc.api.machine.Callback; import li.cil.oc.api.machine.Context; +import li.cil.oc.api.network.SimpleComponent; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; @@ -42,7 +43,7 @@ import java.util.ArrayList; import java.util.List; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBMKFluxReceiver, IRBMKLoadable, IInfoProviderEC, CompatHandler.OCComponent { +public class TileEntityRBMKRod extends TileEntityRBMKSlottedBase implements IRBMKFluxReceiver, IRBMKLoadable, IInfoProviderEC, SimpleComponent, CompatHandler.OCComponent { // New system!! // Used for receiving flux (calculating outbound flux/burning rods) From e21fe3eeccf8c8fc92919ae16ed53a9f8e387c0f Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 5 Mar 2025 16:57:50 +0100 Subject: [PATCH 6/8] config crap --- README.md | 1 + changelog | 5 +- .../java/com/hbm/config/ClientConfig.java | 13 ++--- .../java/com/hbm/config/GeneralConfig.java | 6 --- .../java/com/hbm/config/RunningConfig.java | 6 +++ .../java/com/hbm/config/ServerConfig.java | 12 ++--- .../hbm/entity/mob/EntityCreeperTainted.java | 6 +-- .../recipes/loader/SerializableRecipe.java | 4 +- .../hbm/items/weapon/sedna/ItemGunBaseNT.java | 3 ++ .../java/com/hbm/main/CraftingManager.java | 48 ++++++++++-------- src/main/java/com/hbm/potion/HbmPotion.java | 4 +- .../hbm/textures/items/syringe_taint.png | Bin 294 -> 354 bytes 12 files changed, 56 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 68e85a68e..f86803200 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ * NTM Reloaded: https://github.com/TheOriginalGolem/Hbm-s-Nuclear-Tech-GIT/releases * NTM Extended Edition (Alcater): https://github.com/Alcatergit/Hbm-s-Nuclear-Tech-GIT/releases +* NTM WarFactory: https://github.com/MisterNorwood/Hbm-s-Nuclear-Tech-GIT/releases For 1.18, try Martin's remake: https://codeberg.org/MartinTheDragon/Nuclear-Tech-Mod-Remake/releases diff --git a/changelog b/changelog index 3122e1cbf..087101ec0 100644 --- a/changelog +++ b/changelog @@ -3,6 +3,7 @@ * Functions like `/ntmclient` but for common settings * Can toggle `DAMAGE_COMPATIBILITY_MODE`, off by default, enables a more compatible (but slightly jankier) version of the bullet damage code * `MINE__DAMAGE` can be used to adjust landmine damage + * `TAINT_TRAILS` now replaces the hardcore taint config option, making taint blocks more potent and the potion effect trail taint blocks ## Changed * Fat mines now use the standardized mini nuke code @@ -17,8 +18,10 @@ * Taint has a 25% chance of splashing down when replacing a block with no supports, causing structures to collapse and taint to spread faster * Similar to soil sand, entities will sink in taint and get slowed down * The sludge consumeth +* `enableGuns` config option now applies to SEDNA system guns, simply canceling all gun-related keybinds ## Fixed * Fixed animation error on the MAS-36 * Fixed drone docks, requester and provider crates not dropping their contents when broken -* Fixed all missing texture errors that appear in the startup log \ No newline at end of file +* Fixed all missing texture errors that appear in the startup log +* Potentially fixed a crash with mekanism during the recipe change phase \ No newline at end of file diff --git a/src/main/java/com/hbm/config/ClientConfig.java b/src/main/java/com/hbm/config/ClientConfig.java index 2f5cec902..e5905a135 100644 --- a/src/main/java/com/hbm/config/ClientConfig.java +++ b/src/main/java/com/hbm/config/ClientConfig.java @@ -1,15 +1,13 @@ package com.hbm.config; import com.google.gson.Gson; -import com.hbm.config.RunningConfig.ConfigWrapper; -import com.hbm.main.MainRegistry; import com.hbm.util.Compat; import java.io.File; import java.util.HashMap; // https://youtube.com/shorts/XTHZWqZt_AI -public class ClientConfig { +public class ClientConfig extends RunningConfig { public static final Gson gson = new Gson(); public static HashMap configMap = new HashMap(); @@ -56,23 +54,20 @@ public class ClientConfig { /** Initializes defaults, then reads the config file if it exists, then writes the config file. */ public static void initConfig() { initDefaults(); - File folder = MainRegistry.configHbmDir; - File config = new File(folder.getAbsolutePath() + File.separatorChar + "hbmClient.json"); + File config = getConfig("hbmClient.json"); if(config.exists()) readConfig(config); refresh(); } /** Writes over the config file using the running config. */ public static void refresh() { - File folder = MainRegistry.configHbmDir; - File config = new File(folder.getAbsolutePath() + File.separatorChar + "hbmClient.json"); + File config = getConfig("hbmClient.json"); writeConfig(config); } /** Writes over the running config using the config file. */ public static void reload() { - File folder = MainRegistry.configHbmDir; - File config = new File(folder.getAbsolutePath() + File.separatorChar + "hbmClient.json"); + File config = getConfig("hbmClient.json"); if(config.exists()) readConfig(config); } diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 916bd9e9c..039384940 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -23,13 +23,11 @@ public class GeneralConfig { public static boolean enableVaults = true; public static boolean enableCataclysm = false; public static boolean enableExtendedLogging = false; - public static boolean enableHardcoreTaint = false; public static boolean enableGuns = true; public static boolean enableVirus = true; public static boolean enableCrosshairs = true; public static boolean enableReflectorCompat = false; public static boolean enableRenderDistCheck = true; - public static boolean enableReEval = true; public static boolean enableSilentCompStackErrors = true; public static boolean enableSkyboxes = true; public static boolean enableImpactWorldProvider = true; @@ -42,7 +40,6 @@ public class GeneralConfig { public static boolean enableSoundExtension = true; public static boolean enableMekanismChanges = true; public static int normalSoundChannels = 200; - public static int hintPos = 0; public static boolean enableExpensiveMode = false; @@ -100,15 +97,12 @@ public class GeneralConfig { enableVaults = config.get(CATEGORY_GENERAL, "1.15_enableVaultSpawn", true, "Allows locked safes to spawn").getBoolean(true); enableCataclysm = config.get(CATEGORY_GENERAL, "1.17_enableCataclysm", false, "Causes satellites to fall whenever a mob dies").getBoolean(false); enableExtendedLogging = config.get(CATEGORY_GENERAL, "1.18_enableExtendedLogging", false, "Logs uses of the detonator, nuclear explosions, missile launches, grenades, etc.").getBoolean(false); - enableHardcoreTaint = config.get(CATEGORY_GENERAL, "1.19_enableHardcoreTaint", false, "Allows tainted mobs to spread taint").getBoolean(false); enableGuns = config.get(CATEGORY_GENERAL, "1.20_enableGuns", true, "Prevents new system guns to be fired").getBoolean(true); enableVirus = config.get(CATEGORY_GENERAL, "1.21_enableVirus", false, "Allows virus blocks to spread").getBoolean(false); enableCrosshairs = config.get(CATEGORY_GENERAL, "1.22_enableCrosshairs", true, "Shows custom crosshairs when an NTM gun is being held").getBoolean(true); enableReflectorCompat = config.get(CATEGORY_GENERAL, "1.24_enableReflectorCompat", false, "Enable old reflector oredict name (\"plateDenseLead\") instead of new \"plateTungCar\"").getBoolean(false); enableRenderDistCheck = config.get(CATEGORY_GENERAL, "1.25_enableRenderDistCheck", true, "Check invalid render distances (over 16, without OptiFine) and fix it").getBoolean(true); - enableReEval = config.get(CATEGORY_GENERAL, "1.27_enableReEval", true, "Allows re-evaluating power networks on link remove instead of destroying and recreating").getBoolean(true); enableSilentCompStackErrors = config.get(CATEGORY_GENERAL, "1.28_enableSilentCompStackErrors", false, "Enabling this will disable log spam created by unregistered items in ComparableStack instances.").getBoolean(false); - hintPos = CommonConfig.createConfigInt(config, CATEGORY_GENERAL, "1.29_hudOverlayPosition", "0: Top left\n1: Top right\n2: Center right\n3: Center Left", 0); enableSkyboxes = config.get(CATEGORY_GENERAL, "1.31_enableSkyboxes", true, "If enabled, will try to use NTM's custom skyboxes.").getBoolean(true); enableImpactWorldProvider = config.get(CATEGORY_GENERAL, "1.32_enableImpactWorldProvider", true, "If enabled, registers custom world provider which modifies lighting and sky colors for post impact effects.").getBoolean(true); enableStatReRegistering = config.get(CATEGORY_GENERAL, "1.33_enableStatReRegistering", true, "If enabled, will re-register item crafting/breaking/usage stats in order to fix a forge bug where modded items just won't show up.").getBoolean(true); diff --git a/src/main/java/com/hbm/config/RunningConfig.java b/src/main/java/com/hbm/config/RunningConfig.java index 66ebe9193..453a123b2 100644 --- a/src/main/java/com/hbm/config/RunningConfig.java +++ b/src/main/java/com/hbm/config/RunningConfig.java @@ -14,10 +14,16 @@ import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; +import com.hbm.main.MainRegistry; public class RunningConfig { public static final Gson gson = new Gson(); + + public static File getConfig(String name) { + File folder = MainRegistry.configHbmDir; + return new File(folder.getAbsolutePath() + File.separatorChar + name); + } public static void readConfig(File config, HashMap configMap) { diff --git a/src/main/java/com/hbm/config/ServerConfig.java b/src/main/java/com/hbm/config/ServerConfig.java index fd9586113..0ae3d11a2 100644 --- a/src/main/java/com/hbm/config/ServerConfig.java +++ b/src/main/java/com/hbm/config/ServerConfig.java @@ -4,7 +4,6 @@ import java.io.File; import java.util.HashMap; import com.google.gson.Gson; -import com.hbm.main.MainRegistry; public class ServerConfig extends RunningConfig { @@ -16,6 +15,7 @@ public class ServerConfig extends RunningConfig { public static ConfigWrapper MINE_HE_DAMAGE = new ConfigWrapper(35F); public static ConfigWrapper MINE_SHRAP_DAMAGE = new ConfigWrapper(7.5F); public static ConfigWrapper MINE_NUKE_DAMAGE = new ConfigWrapper(100F); + public static ConfigWrapper TAINT_TRAILS = new ConfigWrapper(false); private static void initDefaults() { configMap.put("DAMAGE_COMPATIBILITY_MODE", DAMAGE_COMPATIBILITY_MODE); @@ -23,28 +23,26 @@ public class ServerConfig extends RunningConfig { configMap.put("MINE_HE_DAMAGE", MINE_HE_DAMAGE); configMap.put("MINE_SHRAP_DAMAGE", MINE_SHRAP_DAMAGE); configMap.put("MINE_NUKE_DAMAGE", MINE_NUKE_DAMAGE); + configMap.put("TAINT_TRAILS", TAINT_TRAILS); } /** Initializes defaults, then reads the config file if it exists, then writes the config file. */ public static void initConfig() { initDefaults(); - File folder = MainRegistry.configHbmDir; - File config = new File(folder.getAbsolutePath() + File.separatorChar + "hbmServer.json"); + File config = getConfig("hbmServer.json"); if(config.exists()) readConfig(config); refresh(); } /** Writes over the config file using the running config. */ public static void refresh() { - File folder = MainRegistry.configHbmDir; - File config = new File(folder.getAbsolutePath() + File.separatorChar + "hbmServer.json"); + File config = getConfig("hbmServer.json"); writeConfig(config); } /** Writes over the running config using the config file. */ public static void reload() { - File folder = MainRegistry.configHbmDir; - File config = new File(folder.getAbsolutePath() + File.separatorChar + "hbmServer.json"); + File config = getConfig("hbmServer.json"); if(config.exists()) readConfig(config); } diff --git a/src/main/java/com/hbm/entity/mob/EntityCreeperTainted.java b/src/main/java/com/hbm/entity/mob/EntityCreeperTainted.java index 1997caa33..cbb20b671 100644 --- a/src/main/java/com/hbm/entity/mob/EntityCreeperTainted.java +++ b/src/main/java/com/hbm/entity/mob/EntityCreeperTainted.java @@ -1,7 +1,7 @@ package com.hbm.entity.mob; import com.hbm.blocks.ModBlocks; -import com.hbm.config.GeneralConfig; +import com.hbm.config.ServerConfig; import api.hbm.entity.IRadiationImmune; import net.minecraft.block.Block; @@ -57,7 +57,7 @@ public class EntityCreeperTainted extends EntityCreeper implements IRadiationImm int c = rand.nextInt(15) + (int) posZ - 7; Block block = worldObj.getBlock(a, b, c); if(block.isNormalCube() && !block.isAir(worldObj, a, b, c)) { - if(!GeneralConfig.enableHardcoreTaint) { + if(!ServerConfig.TAINT_TRAILS.get()) { worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 5, 2); } else { worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3), 2); @@ -73,7 +73,7 @@ public class EntityCreeperTainted extends EntityCreeper implements IRadiationImm int c = rand.nextInt(7) + (int) posZ - 3; Block block = worldObj.getBlock(a, b, c); if(block.isNormalCube() && !block.isAir(worldObj, a, b, c)) { - if(!GeneralConfig.enableHardcoreTaint) { + if(!ServerConfig.TAINT_TRAILS.get()) { worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(6) + 10, 2); } else { worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 4, 2); 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 7b99b1b9f..02db7b389 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -33,7 +33,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; //the anti-spaghetti. this class provides so much functionality and saves so much time, i just love you, SerializableRecipe <3 -public abstract class SerializableRecipe { +public abstract class SerializableRecipe { //TODO: #1969 public static final Gson gson = new Gson(); public static List recipeHandlers = new ArrayList(); @@ -141,7 +141,7 @@ public abstract class SerializableRecipe { public abstract void writeRecipe(Object recipe, JsonWriter writer) throws IOException; /** Registers the default recipes */ public abstract void registerDefaults(); - /** Deletes all existing recipes, currenly unused */ + /** Deletes all existing recipes, currently unused */ public abstract void deleteRecipes(); /** A routine called after registering all recipes, whether it's a template or not. Good for IMC functionality. */ public void registerPost() { } diff --git a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java index ce88b06df..96a9b099f 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java +++ b/src/main/java/com/hbm/items/weapon/sedna/ItemGunBaseNT.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; +import com.hbm.config.GeneralConfig; import com.hbm.handler.HbmKeybinds.EnumKeybind; import com.hbm.interfaces.IItemHUD; import com.hbm.items.IEquipReceiver; @@ -169,6 +170,8 @@ public class ItemGunBaseNT extends Item implements IKeybindReceiver, IEquipRecei } public void handleKeybind(EntityLivingBase entity, IInventory inventory, ItemStack stack, EnumKeybind keybind, boolean newState) { + if(!GeneralConfig.enableGuns) return; + int configs = this.configs_DNA.length; for(int i = 0; i < configs; i++) { diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index dd130b852..240886151 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -1175,30 +1175,34 @@ public class CraftingManager { List toDestroy = new ArrayList(); - for(Object o : net.minecraft.item.crafting.CraftingManager.getInstance().getRecipeList()) { - - if(o instanceof IRecipe) { - IRecipe rec = (IRecipe)o; - ItemStack stack = rec.getRecipeOutput(); - - for(ItemStack target : targets) { - if(stack != null && stack.getItem() == target.getItem() && stack.getItemDamage() == target.getItemDamage()) toDestroy.add(rec); + List recipeList = net.minecraft.item.crafting.CraftingManager.getInstance().getRecipeList(); + + synchronized(recipeList) { //this is how threading works. i think. + for(Object o : recipeList) { + + if(o instanceof IRecipe) { + IRecipe rec = (IRecipe)o; + ItemStack stack = rec.getRecipeOutput(); + + for(ItemStack target : targets) { + if(stack != null && stack.getItem() == target.getItem() && stack.getItemDamage() == target.getItemDamage()) toDestroy.add(rec); + } } } - } - - if(toDestroy.size() > 0) { - net.minecraft.item.crafting.CraftingManager.getInstance().getRecipeList().removeAll(toDestroy); - } - - if(Loader.isModLoaded("Mekanism")) { - Item disassembler = (Item) Item.itemRegistry.getObject("Mekanism:AtomicDisassembler"); - if(disassembler != null) addRecipeAuto(new ItemStack(disassembler, 1), "GAG", "EIE", " I ", 'G', GOLD.plateCast(), 'A', "alloyUltimate", 'E', "battery", 'I', "ingotRefinedObsidian"); - } - - if(Loader.isModLoaded("MekanismGenerators")) { - Block generator = (Block) Block.blockRegistry.getObject("MekanismGenerators:Generator"); - if(generator != null) addRecipeAuto(new ItemStack(generator, 1, 6), " T ", "TAT", "BCB", 'T', TI.plateCast(), 'A', "alloyAdvanced", 'B', "battery", 'C', ANY_PLASTIC.ingot()); + + if(toDestroy.size() > 0) { + recipeList.removeAll(toDestroy); + } + + if(Loader.isModLoaded("Mekanism")) { + Item disassembler = (Item) Item.itemRegistry.getObject("Mekanism:AtomicDisassembler"); + if(disassembler != null) addRecipeAuto(new ItemStack(disassembler, 1), "GAG", "EIE", " I ", 'G', GOLD.plateCast(), 'A', "alloyUltimate", 'E', "battery", 'I', "ingotRefinedObsidian"); + } + + if(Loader.isModLoaded("MekanismGenerators")) { + Block generator = (Block) Block.blockRegistry.getObject("MekanismGenerators:Generator"); + if(generator != null) addRecipeAuto(new ItemStack(generator, 1, 6), " T ", "TAT", "BCB", 'T', TI.plateCast(), 'A', "alloyAdvanced", 'B', "battery", 'C', ANY_PLASTIC.ingot()); + } } } } diff --git a/src/main/java/com/hbm/potion/HbmPotion.java b/src/main/java/com/hbm/potion/HbmPotion.java index e27806e1a..c1189b8b6 100644 --- a/src/main/java/com/hbm/potion/HbmPotion.java +++ b/src/main/java/com/hbm/potion/HbmPotion.java @@ -3,8 +3,8 @@ package com.hbm.potion; import java.lang.reflect.Field; import com.hbm.blocks.ModBlocks; -import com.hbm.config.GeneralConfig; import com.hbm.config.PotionConfig; +import com.hbm.config.ServerConfig; import com.hbm.entity.mob.EntityTaintCrab; import com.hbm.entity.mob.EntityCreeperTainted; import com.hbm.explosion.ExplosionLarge; @@ -107,7 +107,7 @@ public class HbmPotion extends Potion { if(!(entity instanceof EntityCreeperTainted) && !(entity instanceof EntityTaintCrab) && entity.worldObj.rand.nextInt(40) == 0) entity.attackEntityFrom(ModDamageSource.taint, (level + 1)); - if(GeneralConfig.enableHardcoreTaint && !entity.worldObj.isRemote) { + if(ServerConfig.TAINT_TRAILS.get() && !entity.worldObj.isRemote) { int x = (int) Math.floor(entity.posX); int y = (int) Math.floor(entity.posY); diff --git a/src/main/resources/assets/hbm/textures/items/syringe_taint.png b/src/main/resources/assets/hbm/textures/items/syringe_taint.png index 51f837e60fc5d17928427d8c5ea96232e302b7df..bfa6a581a3605c0337e5b27be433f59fb7a48227 100644 GIT binary patch delta 312 zcmV-80muHP0^$OYGk*aYNkl1u24ObLr#q}*c?7_4ICQ(0N~wc~K@f-{ zK{Y!(KfNG;*F>{u%-9~Sh~pSZO3i`R+U<(8)-DJFkqbViZ-0EJ23!Ba&Zjt;GPoX~ z+8wqF!EOHmuj=KZg9&ExojC^K41Q&abSaPbH*9K6n(~-Vy~}C)3}XyRDU31uf|K(u zlgXT>@MtWTuv&wJ&vgZ}GW74RP)g-1WVscFSQKbkhNikk~y&l$DthJ0rBT*>G2*c3%zE2#-WHtNr&-ejYx^>Aq!b~mz0000< KMNUMnLSTX)_LXh` delta 251 zcmV*@h;)qG(UGDESSJ#j4PYu4 z(NqJ0ECZC1BQb4SXw$jj2;AFbiG6T{xe`Bc4d#XBu=tfQ#K;!AIBhe;ag3&E{7lmn zL Date: Wed, 5 Mar 2025 21:58:20 +0100 Subject: [PATCH 7/8] alright i'm tired --- .../api/hbm/energymk2/IEnergyProviderMK2.java | 4 ++-- .../api/hbm/energymk2/IEnergyReceiverMK2.java | 4 ++-- .../java/api/hbm/energymk2/Nodespace.java | 4 ++-- .../java/api/hbm/fluidmk2/FluidNetMK2.java | 11 +++++++++ src/main/java/api/hbm/fluidmk2/FluidNode.java | 19 +++++++++++++++ .../hbm/fluidmk2/IFluidConnectorBlockMK2.java | 12 ++++++++++ .../api/hbm/fluidmk2/IFluidConnectorMK2.java | 17 ++++++++++++++ .../java/api/hbm/fluidmk2/IFluidPipeMK2.java | 23 +++++++++++++++++++ .../api/hbm/fluidmk2/IFluidProviderMK2.java | 11 +++++++++ .../api/hbm/fluidmk2/IFluidReceiverMK2.java | 12 ++++++++++ .../java/api/hbm/fluidmk2/package-info.java | 16 +++++++++++++ .../com/hbm/inventory/fluid/FluidType.java | 6 +++++ src/main/java/com/hbm/uninos/GenNode.java | 1 + .../networkproviders/FluidNetProvider.java | 13 +++++++++++ ...werProvider.java => PowerNetProvider.java} | 2 +- 15 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 src/main/java/api/hbm/fluidmk2/FluidNetMK2.java create mode 100644 src/main/java/api/hbm/fluidmk2/FluidNode.java create mode 100644 src/main/java/api/hbm/fluidmk2/IFluidConnectorBlockMK2.java create mode 100644 src/main/java/api/hbm/fluidmk2/IFluidConnectorMK2.java create mode 100644 src/main/java/api/hbm/fluidmk2/IFluidPipeMK2.java create mode 100644 src/main/java/api/hbm/fluidmk2/IFluidProviderMK2.java create mode 100644 src/main/java/api/hbm/fluidmk2/IFluidReceiverMK2.java create mode 100644 src/main/java/api/hbm/fluidmk2/package-info.java create mode 100644 src/main/java/com/hbm/uninos/networkproviders/FluidNetProvider.java rename src/main/java/com/hbm/uninos/networkproviders/{PowerProvider.java => PowerNetProvider.java} (73%) diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index e933cdf22..291f7954c 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -3,7 +3,7 @@ package api.hbm.energymk2; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.uninos.IGenProvider; -import com.hbm.uninos.networkproviders.PowerProvider; +import com.hbm.uninos.networkproviders.PowerNetProvider; import com.hbm.util.Compat; import api.hbm.energymk2.Nodespace.PowerNode; @@ -14,7 +14,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; /** If it sends energy, use this */ -public interface IEnergyProviderMK2 extends IEnergyHandlerMK2, IGenProvider { +public interface IEnergyProviderMK2 extends IEnergyHandlerMK2, IGenProvider { /** Uses up available power, default implementation has no sanity checking, make sure that the requested power is lequal to the current power */ public default void usePower(long power) { diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index 47fb07a89..ec50abd98 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -4,7 +4,7 @@ import com.hbm.interfaces.NotableComments; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toclient.AuxParticlePacketNT; import com.hbm.uninos.IGenReceiver; -import com.hbm.uninos.networkproviders.PowerProvider; +import com.hbm.uninos.networkproviders.PowerNetProvider; import com.hbm.util.Compat; import api.hbm.energymk2.Nodespace.PowerNode; @@ -16,7 +16,7 @@ import net.minecraftforge.common.util.ForgeDirection; /** If it receives energy, use this */ @NotableComments -public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2, IGenReceiver { +public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2, IGenReceiver { public default long transferPower(long power) { if(power + this.getPower() <= this.getMaxPower()) { diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index 8fadb9745..114c4dd75 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -3,7 +3,7 @@ package api.hbm.energymk2; import com.hbm.interfaces.NotableComments; import com.hbm.uninos.GenNode; import com.hbm.uninos.UniNodespace; -import com.hbm.uninos.networkproviders.PowerProvider; +import com.hbm.uninos.networkproviders.PowerNetProvider; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; @@ -18,7 +18,7 @@ import net.minecraft.world.World; */ public class Nodespace { - public static final PowerProvider THE_POWER_PROVIDER = new PowerProvider(); + public static final PowerNetProvider THE_POWER_PROVIDER = new PowerNetProvider(); @Deprecated public static PowerNode getNode(World world, int x, int y, int z) { return (PowerNode) UniNodespace.getNode(world, x, y, z, THE_POWER_PROVIDER); diff --git a/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java b/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java new file mode 100644 index 000000000..14052452d --- /dev/null +++ b/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java @@ -0,0 +1,11 @@ +package api.hbm.fluidmk2; + +import com.hbm.uninos.NodeNet; + +public class FluidNetMK2 extends NodeNet { + + @Override + public void update() { + + } +} diff --git a/src/main/java/api/hbm/fluidmk2/FluidNode.java b/src/main/java/api/hbm/fluidmk2/FluidNode.java new file mode 100644 index 000000000..a4c0c3141 --- /dev/null +++ b/src/main/java/api/hbm/fluidmk2/FluidNode.java @@ -0,0 +1,19 @@ +package api.hbm.fluidmk2; + +import com.hbm.uninos.GenNode; +import com.hbm.uninos.INetworkProvider; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; + +public class FluidNode extends GenNode { + + public FluidNode(INetworkProvider provider, BlockPos... positions) { + super(provider, positions); + } + + @Override + public FluidNode setConnections(DirPos... connections) { + super.setConnections(connections); + return this; + } +} diff --git a/src/main/java/api/hbm/fluidmk2/IFluidConnectorBlockMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidConnectorBlockMK2.java new file mode 100644 index 000000000..f7a1a47a7 --- /dev/null +++ b/src/main/java/api/hbm/fluidmk2/IFluidConnectorBlockMK2.java @@ -0,0 +1,12 @@ +package api.hbm.fluidmk2; + +import com.hbm.inventory.fluid.FluidType; + +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; + +public interface IFluidConnectorBlockMK2 { + + /** dir is the face that is connected to, the direction going outwards from the block */ + public boolean canConnect(FluidType type, IBlockAccess world, int x, int y, int z, ForgeDirection dir); +} diff --git a/src/main/java/api/hbm/fluidmk2/IFluidConnectorMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidConnectorMK2.java new file mode 100644 index 000000000..dc0a3dbf3 --- /dev/null +++ b/src/main/java/api/hbm/fluidmk2/IFluidConnectorMK2.java @@ -0,0 +1,17 @@ +package api.hbm.fluidmk2; + +import com.hbm.inventory.fluid.FluidType; + +import net.minecraftforge.common.util.ForgeDirection; + +public interface IFluidConnectorMK2 { + + /** + * Whether the given side can be connected to + * @param dir + * @return + */ + public default boolean canConnect(FluidType type, ForgeDirection dir) { + return dir != ForgeDirection.UNKNOWN; + } +} diff --git a/src/main/java/api/hbm/fluidmk2/IFluidPipeMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidPipeMK2.java new file mode 100644 index 000000000..d95fb2998 --- /dev/null +++ b/src/main/java/api/hbm/fluidmk2/IFluidPipeMK2.java @@ -0,0 +1,23 @@ +package api.hbm.fluidmk2; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.lib.Library; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; + +import net.minecraft.tileentity.TileEntity; + +public interface IFluidPipeMK2 { + + public default FluidNode createNode(FluidType type) { + TileEntity tile = (TileEntity) this; + return new FluidNode(type.getNetworkProvider(), new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections( + new DirPos(tile.xCoord + 1, tile.yCoord, tile.zCoord, Library.POS_X), + new DirPos(tile.xCoord - 1, tile.yCoord, tile.zCoord, Library.NEG_X), + new DirPos(tile.xCoord, tile.yCoord + 1, tile.zCoord, Library.POS_Y), + new DirPos(tile.xCoord, tile.yCoord - 1, tile.zCoord, Library.NEG_Y), + new DirPos(tile.xCoord, tile.yCoord, tile.zCoord + 1, Library.POS_Z), + new DirPos(tile.xCoord, tile.yCoord, tile.zCoord - 1, Library.NEG_Z) + ); + } +} diff --git a/src/main/java/api/hbm/fluidmk2/IFluidProviderMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidProviderMK2.java new file mode 100644 index 000000000..c5316a0be --- /dev/null +++ b/src/main/java/api/hbm/fluidmk2/IFluidProviderMK2.java @@ -0,0 +1,11 @@ +package api.hbm.fluidmk2; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.uninos.IGenProvider; +import com.hbm.uninos.networkproviders.FluidNetProvider; + +public interface IFluidProviderMK2 extends IGenProvider { + + public void useUpFluid(FluidType type, int pressure, long amount); + public long getProviderSpeed(FluidType type, int pressure); +} diff --git a/src/main/java/api/hbm/fluidmk2/IFluidReceiverMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidReceiverMK2.java new file mode 100644 index 000000000..f20fba01e --- /dev/null +++ b/src/main/java/api/hbm/fluidmk2/IFluidReceiverMK2.java @@ -0,0 +1,12 @@ +package api.hbm.fluidmk2; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.uninos.IGenReceiver; +import com.hbm.uninos.networkproviders.FluidNetProvider; + +public interface IFluidReceiverMK2 extends IGenReceiver { + + /** Sends fluid of the desired type and pressure to the receiver, returns the remainder */ + public long transferFluid(FluidType type, int pressure, long amount); + public long getReceiverSpeed(FluidType type, int pressure); +} diff --git a/src/main/java/api/hbm/fluidmk2/package-info.java b/src/main/java/api/hbm/fluidmk2/package-info.java new file mode 100644 index 000000000..b948336d8 --- /dev/null +++ b/src/main/java/api/hbm/fluidmk2/package-info.java @@ -0,0 +1,16 @@ +/** + * + */ +/** + * @author hbm + * + */ +package api.hbm.fluidmk2; + +/* + +It's rather shrimple: the shiny new energy system using universal nodespace, but hit with a hammer until it works with fluids. +Has a few extra bits and pieces for handling, but the concept is basically the same. +Sounds good? + +*/ \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/fluid/FluidType.java b/src/main/java/com/hbm/inventory/fluid/FluidType.java index f08ae979a..a0175fbd9 100644 --- a/src/main/java/com/hbm/inventory/fluid/FluidType.java +++ b/src/main/java/com/hbm/inventory/fluid/FluidType.java @@ -13,8 +13,10 @@ import com.hbm.inventory.fluid.trait.*; import com.hbm.inventory.fluid.trait.FluidTraitSimple.*; import com.hbm.lib.RefStrings; import com.hbm.render.util.EnumSymbol; +import com.hbm.uninos.INetworkProvider; import com.hbm.util.I18nUtil; +import api.hbm.fluidmk2.FluidNetMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.tileentity.TileEntity; @@ -252,4 +254,8 @@ public class FluidType { public String name() { return this.stringId; } + + public INetworkProvider getNetworkProvider() { + return null; //TBI + } } diff --git a/src/main/java/com/hbm/uninos/GenNode.java b/src/main/java/com/hbm/uninos/GenNode.java index d65f163c1..3e4b0925b 100644 --- a/src/main/java/com/hbm/uninos/GenNode.java +++ b/src/main/java/com/hbm/uninos/GenNode.java @@ -10,6 +10,7 @@ public class GenNode { public N net; public boolean expired = false; public boolean recentlyChanged = true; + /** Used for distinguishing the node type when saving it to UNINOS' node map */ public INetworkProvider networkProvider; public GenNode(INetworkProvider provider, BlockPos... positions) { diff --git a/src/main/java/com/hbm/uninos/networkproviders/FluidNetProvider.java b/src/main/java/com/hbm/uninos/networkproviders/FluidNetProvider.java new file mode 100644 index 000000000..95fa480a8 --- /dev/null +++ b/src/main/java/com/hbm/uninos/networkproviders/FluidNetProvider.java @@ -0,0 +1,13 @@ +package com.hbm.uninos.networkproviders; + +import com.hbm.uninos.INetworkProvider; + +import api.hbm.fluidmk2.FluidNetMK2; + +public class FluidNetProvider implements INetworkProvider { + + @Override + public FluidNetMK2 provideNetwork() { + return new FluidNetMK2(); + } +} diff --git a/src/main/java/com/hbm/uninos/networkproviders/PowerProvider.java b/src/main/java/com/hbm/uninos/networkproviders/PowerNetProvider.java similarity index 73% rename from src/main/java/com/hbm/uninos/networkproviders/PowerProvider.java rename to src/main/java/com/hbm/uninos/networkproviders/PowerNetProvider.java index 0c1218991..da4502e24 100644 --- a/src/main/java/com/hbm/uninos/networkproviders/PowerProvider.java +++ b/src/main/java/com/hbm/uninos/networkproviders/PowerNetProvider.java @@ -4,7 +4,7 @@ import com.hbm.uninos.INetworkProvider; import api.hbm.energymk2.PowerNetMK2; -public class PowerProvider implements INetworkProvider { +public class PowerNetProvider implements INetworkProvider { @Override public PowerNetMK2 provideNetwork() { From 5d24e76601f2c6da587bca3fdb7defad466ac208 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 6 Mar 2025 14:25:30 +0100 Subject: [PATCH 8/8] compat for (hopefully) robust external recipe registering --- changelog | 2 + gradle.properties | 2 +- .../hbm/recipe/IRecipeRegisterListener.java | 13 + .../java/api/hbm/recipe/package-info.java | 17 ++ .../inventory/recipes/ArcWelderRecipes.java | 2 + .../recipes/BlastFurnaceRecipes.java | 2 +- .../hbm/inventory/recipes/BreederRecipes.java | 2 +- .../inventory/recipes/CentrifugeRecipes.java | 2 +- .../inventory/recipes/ChemplantRecipes.java | 2 +- .../hbm/inventory/recipes/CokerRecipes.java | 4 +- .../inventory/recipes/CombinationRecipes.java | 2 +- .../inventory/recipes/CrackingRecipes.java | 2 +- .../recipes/CrystallizerRecipes.java | 6 + .../inventory/recipes/FractionRecipes.java | 6 +- .../hbm/inventory/recipes/HadronRecipes.java | 2 +- .../recipes/HydrotreatingRecipes.java | 2 +- .../recipes/LiquefactionRecipes.java | 2 +- .../inventory/recipes/PyroOvenRecipes.java | 2 +- .../inventory/recipes/ReformingRecipes.java | 2 +- .../recipes/SolidificationRecipes.java | 2 +- .../inventory/recipes/anvil/AnvilRecipes.java | 4 +- .../recipes/loader/SerializableRecipe.java | 8 +- .../java/com/hbm/util/CompatExternal.java | 12 + .../com/hbm/util/CompatRecipeRegistry.java | 264 ++++++++++++++++++ 24 files changed, 343 insertions(+), 21 deletions(-) create mode 100644 src/main/java/api/hbm/recipe/IRecipeRegisterListener.java create mode 100644 src/main/java/api/hbm/recipe/package-info.java create mode 100644 src/main/java/com/hbm/util/CompatRecipeRegistry.java diff --git a/changelog b/changelog index 087101ec0..8778e076f 100644 --- a/changelog +++ b/changelog @@ -19,6 +19,8 @@ * Similar to soil sand, entities will sink in taint and get slowed down * The sludge consumeth * `enableGuns` config option now applies to SEDNA system guns, simply canceling all gun-related keybinds +* Cinnabar dust, if registered by another mod, can now be acidized into cinnabar using hydrogen peroxide +* Copper wires, like AA and gold, can now be welded into dense wires ## Fixed * Fixed animation error on the MAS-36 diff --git a/gradle.properties b/gradle.properties index 68fe9efe2..57936ce9d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,6 +12,7 @@ credits=HbMinecraft,\ \ MellowArpeggiation (new animation system, turbine sounds, sound fixes, industrial lights, better particle diodes),\ \ Pheo (textures, various machines, models, weapons),\ \ Vær (gas centrifuges, better worldgen, ZIRNOX, CP-1 parts, starter guide, new cyclotron, weapon animations),\ + \ UFFR (RTG pellets, guns, casings, euphemium capacitor, nucleartech.wiki),\ \ LePeep (coilgun model, BDCL QC),\ \ Adam29 (liquid petroleum, ethanol, electric furnace),\ \ Pvndols (thorium fuel recipe, gas turbine),\ @@ -33,7 +34,6 @@ credits=HbMinecraft,\ \ Maksymisio (polish localization)\ \ el3ctro4ndre (italian localization),\ \ Pu-238 (Tom impact effects),\ - \ UFFR (RTG pellets, guns, casings, euphemium capacitor),\ \ Frooz (gun models),\ \ VT-6/24 (models, textures),\ \ Nos (models),\ diff --git a/src/main/java/api/hbm/recipe/IRecipeRegisterListener.java b/src/main/java/api/hbm/recipe/IRecipeRegisterListener.java new file mode 100644 index 000000000..14832ec3a --- /dev/null +++ b/src/main/java/api/hbm/recipe/IRecipeRegisterListener.java @@ -0,0 +1,13 @@ +package api.hbm.recipe; + +public interface IRecipeRegisterListener { + + /** + * Called during SerializableRecipe.initialize(), after the defaults are loaded but before the template is written. + * Due to the way the recipes are handled, calling it once is not enough, it has to be called once for every SerializableRecipe + * instance handled, therefore the load operation passes the type name of the recipe, so that the listeners know what type of recipe + * to register at that point. Note that the actual SerializableRecipe instance is irrelevant, since recipes are static anyway, + * and direct tampering with SerializableRecipes is not recommended. + */ + public void onRecipeLoad(String recipeClassName); +} diff --git a/src/main/java/api/hbm/recipe/package-info.java b/src/main/java/api/hbm/recipe/package-info.java new file mode 100644 index 000000000..53e838a43 --- /dev/null +++ b/src/main/java/api/hbm/recipe/package-info.java @@ -0,0 +1,17 @@ +package api.hbm.recipe; + +/* + +Quick guide on how to make robust and safe recipe integration: +* Implement IRecipeRegisterListener, the resulting class will handle all recipes, and the onRecipeLoad method is called every time the SerializableRecipe system updates +* Register your IRecipeRegisterListener using CompatExternal.registerRecipeRegisterListener, this has to happen before the SerializableRecipe initializes, doing this during PreInit should be safe +* In your IRecipeRegisterListener, check the supplied recipe type string (which will be the class name of the SerializableRecipe currently being registered) and register your custom recipes accordingly using CompatRecipeRegistry + +Explanation: +* Order of operations is important for the recipes to work, if recipes are loaded outside the scope of SerializableRecipe.initialize, they will not work correctly +* If recipes are registered before the init, they are deleted, if they are registered after the init, they will not be part of the config template file, and get deleted when running /ntmreload +* Machines change all the time, so the recipe classes should not be considered API, since the compat would break immediately if a machine is changed or removed +* CompatRecipeRegistry promises to never change its method signatures, and have solid sanity checking when recipes are registered, allowing it to make the bst of whatever data is thrown at it +* Using this dedicated registry class means that even if a machine is changed or removed, the recipes will continue to work to the best of its abilities + +*/ \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/recipes/ArcWelderRecipes.java b/src/main/java/com/hbm/inventory/recipes/ArcWelderRecipes.java index 2dacf92dd..669a4bde2 100644 --- a/src/main/java/com/hbm/inventory/recipes/ArcWelderRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ArcWelderRecipes.java @@ -46,6 +46,8 @@ public class ArcWelderRecipes extends SerializableRecipe { new OreDictStack(ANY_BISMOIDBRONZE.plateCast(), 2), new OreDictStack(CMB.plateWelded(), 1), new ComparableStack(ModItems.ingot_cft))); //Dense Wires + recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.wire_dense, 1, Mats.MAT_COPPER.id), 100, 10_000L, + new OreDictStack(CU.wireFine(), 8))); recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.wire_dense, 1, Mats.MAT_ALLOY.id), 100, 10_000L, new OreDictStack(ALLOY.wireFine(), 8))); recipes.add(new ArcWelderRecipe(new ItemStack(ModItems.wire_dense, 1, Mats.MAT_GOLD.id), 100, 10_000L, diff --git a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java index af7032305..1a7599b5d 100644 --- a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java @@ -77,7 +77,7 @@ public class BlastFurnaceRecipes extends SerializableRecipe { hiddenRecipes.add(new ComparableStack(ModItems.meteorite_sword_alloyed)); } - private static void addRecipe(Object in1, Object in2, ItemStack out) { + public static void addRecipe(Object in1, Object in2, ItemStack out) { if(in1 instanceof Item) in1 = new ComparableStack((Item) in1); if(in1 instanceof Block) in1 = new ComparableStack((Block) in1); diff --git a/src/main/java/com/hbm/inventory/recipes/BreederRecipes.java b/src/main/java/com/hbm/inventory/recipes/BreederRecipes.java index 7503b3dec..1ff4b65fb 100644 --- a/src/main/java/com/hbm/inventory/recipes/BreederRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/BreederRecipes.java @@ -19,7 +19,7 @@ import net.minecraft.item.ItemStack; public class BreederRecipes extends SerializableRecipe { - private static HashMap recipes = new HashMap(); + public static HashMap recipes = new HashMap(); @Override public void registerDefaults() { diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index 641008670..027efb67d 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -43,7 +43,7 @@ import net.minecraftforge.oredict.OreDictionary; public class CentrifugeRecipes extends SerializableRecipe { - private static HashMap recipes = new HashMap(); + public static HashMap recipes = new HashMap(); @Override public void registerDefaults() { diff --git a/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java b/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java index 5331f09d4..7a44817d3 100644 --- a/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java @@ -38,7 +38,7 @@ public class ChemplantRecipes extends SerializableRecipe { @Override public void registerDefaults() { - //6-30, formerly oil cracking, coal liquefaction and solidifciation + //6-30, formerly oil cracking, coal liquefaction and solidification registerOtherOil(); recipes.add(new ChemRecipe(36, "COOLANT", 50) diff --git a/src/main/java/com/hbm/inventory/recipes/CokerRecipes.java b/src/main/java/com/hbm/inventory/recipes/CokerRecipes.java index ce4c4dfb5..32f1bbd6a 100644 --- a/src/main/java/com/hbm/inventory/recipes/CokerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CokerRecipes.java @@ -25,7 +25,7 @@ import net.minecraft.item.ItemStack; public class CokerRecipes extends SerializableRecipe { - private static HashMap> recipes = new HashMap(); + public static HashMap> recipes = new HashMap(); @Override public void registerDefaults() { @@ -68,7 +68,7 @@ public class CokerRecipes extends SerializableRecipe { registerRecipe(VITRIOL, 4000, new ItemStack(ModItems.powder_iron), new FluidStack(SULFURIC_ACID, 500)); } - private static void registerAuto(FluidType fluid, FluidType type) { + public static void registerAuto(FluidType fluid, FluidType type) { registerSFAuto(fluid, 820_000L, DictFrame.fromOne(ModItems.coke, EnumCokeType.PETROLEUM), type); //3200 burntime * 1.25 burntime bonus * 200 TU/t + 20000TU per operation } private static void registerSFAuto(FluidType fluid, long tuPerSF, ItemStack fuel, FluidType type) { diff --git a/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java b/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java index 5698426dc..58cc7784a 100644 --- a/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CombinationRecipes.java @@ -34,7 +34,7 @@ import net.minecraft.item.ItemStack; public class CombinationRecipes extends SerializableRecipe { - private static HashMap> recipes = new HashMap(); + public static HashMap> recipes = new HashMap(); @Override public void registerDefaults() { diff --git a/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java index 7bfe680ec..b66cf903d 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrackingRecipes.java @@ -36,7 +36,7 @@ public class CrackingRecipes extends SerializableRecipe { public static final int xyl_crack_aroma = 80; public static final int xyl_crack_petro = 20; - private static Map> cracking = new HashMap(); + public static Map> cracking = new HashMap(); @Override public void registerDefaults() { diff --git a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java index 6d12d8124..e4b8907ba 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java @@ -235,6 +235,12 @@ public class CrystallizerRecipes extends SerializableRecipe { registerRecipe(P_WHITE.dust(), new CrystallizerRecipe(new ItemStack(ModItems.ingot_phosphorus), utilityTime), new FluidStack(Fluids.AROMATICS, 50)); } + /// COMPAT CINNABAR DUST /// + List dustCinnabar = OreDictionary.getOres(CINNABAR.dust()); + if(dustCinnabar != null && !dustCinnabar.isEmpty()) { + registerRecipe(CINNABAR.dust(), new CrystallizerRecipe(new ItemStack(ModItems.cinnebar), utilityTime), new FluidStack(Fluids.PEROXIDE, 50)); + } + if(!IMCCrystallizer.buffer.isEmpty()) { recipes.putAll(IMCCrystallizer.buffer); MainRegistry.logger.info("Fetched " + IMCCrystallizer.buffer.size() + " IMC crystallizer recipes!"); diff --git a/src/main/java/com/hbm/inventory/recipes/FractionRecipes.java b/src/main/java/com/hbm/inventory/recipes/FractionRecipes.java index 93e932ef3..dda69009f 100644 --- a/src/main/java/com/hbm/inventory/recipes/FractionRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/FractionRecipes.java @@ -19,7 +19,7 @@ import net.minecraft.item.ItemStack; public class FractionRecipes extends SerializableRecipe { - private static Map> fractions = new HashMap(); + public static Map> fractions = new HashMap(); @Override public void registerDefaults() { @@ -40,8 +40,8 @@ public class FractionRecipes extends SerializableRecipe { fractions.put(Fluids.OIL_COKER, new Pair(new FluidStack(Fluids.CRACKOIL, 30), new FluidStack(Fluids.HEATINGOIL, 70))); fractions.put(Fluids.NAPHTHA_COKER, new Pair(new FluidStack(Fluids.NAPHTHA_CRACK, 75), new FluidStack(Fluids.LIGHTOIL_CRACK, 25))); fractions.put(Fluids.GAS_COKER, new Pair(new FluidStack(Fluids.AROMATICS, 25), new FluidStack(Fluids.CARBONDIOXIDE, 75))); - fractions.put(Fluids.CHLOROCALCITE_MIX, new Pair(new FluidStack(Fluids.CHLOROCALCITE_CLEANED, 50), new FluidStack(Fluids.COLLOID, 50))); - fractions.put(Fluids.BAUXITE_SOLUTION, new Pair(new FluidStack(Fluids.REDMUD, 50), new FluidStack(Fluids.SODIUM_ALUMINATE, 50))); + fractions.put(Fluids.CHLOROCALCITE_MIX, new Pair(new FluidStack(Fluids.CHLOROCALCITE_CLEANED, 50), new FluidStack(Fluids.COLLOID, 50))); + fractions.put(Fluids.BAUXITE_SOLUTION, new Pair(new FluidStack(Fluids.REDMUD, 50), new FluidStack(Fluids.SODIUM_ALUMINATE, 50))); } public static Pair getFractions(FluidType oil) { diff --git a/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java b/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java index 0d2c443e1..d2cccc339 100644 --- a/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/HadronRecipes.java @@ -14,7 +14,7 @@ import com.hbm.tileentity.machine.TileEntityHadron.EnumHadronState; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; -public class HadronRecipes extends SerializableRecipe { +@Deprecated public class HadronRecipes extends SerializableRecipe { /* * Since we're dealing with like 10 or so recipes, using a HashMap (or to combine two keys, a HashMap *in* a HashMap) diff --git a/src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java b/src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java index 620d5b490..46f5b2e11 100644 --- a/src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java @@ -18,7 +18,7 @@ import net.minecraft.item.ItemStack; public class HydrotreatingRecipes extends SerializableRecipe { - private static HashMap> recipes = new HashMap(); + public static HashMap> recipes = new HashMap(); @Override public void registerDefaults() { diff --git a/src/main/java/com/hbm/inventory/recipes/LiquefactionRecipes.java b/src/main/java/com/hbm/inventory/recipes/LiquefactionRecipes.java index feb244d49..ed171ee75 100644 --- a/src/main/java/com/hbm/inventory/recipes/LiquefactionRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/LiquefactionRecipes.java @@ -27,7 +27,7 @@ import net.minecraftforge.oredict.OreDictionary; public class LiquefactionRecipes extends SerializableRecipe { - private static HashMap recipes = new HashMap(); + public static HashMap recipes = new HashMap(); @Override public void registerDefaults() { diff --git a/src/main/java/com/hbm/inventory/recipes/PyroOvenRecipes.java b/src/main/java/com/hbm/inventory/recipes/PyroOvenRecipes.java index 616adb05e..1cb68724a 100644 --- a/src/main/java/com/hbm/inventory/recipes/PyroOvenRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PyroOvenRecipes.java @@ -124,7 +124,7 @@ public class PyroOvenRecipes extends SerializableRecipe { .out(new FluidStack(Fluids.HYDROGEN, 8_000)).out(new ItemStack(ModItems.ingot_graphite, 1))); } - private static void registerSFAuto(FluidType fluid) { + public static void registerSFAuto(FluidType fluid) { registerSFAuto(fluid, 1_440_000L, ModItems.solid_fuel); //3200 burntime * 1.5 burntime bonus * 300 TU/t } private static void registerSFAuto(FluidType fluid, long tuPerSF, Item fuel) { diff --git a/src/main/java/com/hbm/inventory/recipes/ReformingRecipes.java b/src/main/java/com/hbm/inventory/recipes/ReformingRecipes.java index ce8b44627..d728bb2de 100644 --- a/src/main/java/com/hbm/inventory/recipes/ReformingRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ReformingRecipes.java @@ -18,7 +18,7 @@ import net.minecraft.item.ItemStack; public class ReformingRecipes extends SerializableRecipe { - private static HashMap> recipes = new HashMap(); + public static HashMap> recipes = new HashMap(); @Override public void registerDefaults() { diff --git a/src/main/java/com/hbm/inventory/recipes/SolidificationRecipes.java b/src/main/java/com/hbm/inventory/recipes/SolidificationRecipes.java index f3fc6a15d..4e7aed3ad 100644 --- a/src/main/java/com/hbm/inventory/recipes/SolidificationRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/SolidificationRecipes.java @@ -56,7 +56,7 @@ public class SolidificationRecipes extends SerializableRecipe { //aromatics can be idfk wax or soap or sth, perhaps artificial lubricant? //on that note, add more leaded variants - private static HashMap> recipes = new HashMap(); + public static HashMap> recipes = new HashMap(); @Override public void registerDefaults() { diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 47b60d9e2..b30c58bee 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -38,8 +38,8 @@ import net.minecraftforge.oredict.OreDictionary; public class AnvilRecipes extends SerializableRecipe { - private static List smithingRecipes = new ArrayList(); - private static List constructionRecipes = new ArrayList(); + public static List smithingRecipes = new ArrayList(); + public static List constructionRecipes = new ArrayList(); public static void register() { registerSmithing(); 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 02db7b389..753fb048f 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -29,14 +29,16 @@ import com.hbm.items.ModItems; import com.hbm.main.MainRegistry; import com.hbm.util.Tuple.Pair; +import api.hbm.recipe.IRecipeRegisterListener; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; //the anti-spaghetti. this class provides so much functionality and saves so much time, i just love you, SerializableRecipe <3 -public abstract class SerializableRecipe { //TODO: #1969 +public abstract class SerializableRecipe { public static final Gson gson = new Gson(); public static List recipeHandlers = new ArrayList(); + public static List additionalListeners = new ArrayList(); public boolean modified = false; @@ -114,6 +116,10 @@ public abstract class SerializableRecipe { //TODO: #1969 MainRegistry.logger.info("No recipe file found, registering defaults for " + recipe.getFileName()); recipe.registerDefaults(); + for(IRecipeRegisterListener listener : additionalListeners) { + listener.onRecipeLoad(recipe.getClass().getSimpleName()); + } + File recTemplate = new File(recDir.getAbsolutePath() + File.separatorChar + "_" + recipe.getFileName()); MainRegistry.logger.info("Writing template file " + recTemplate.getName()); recipe.writeTemplateFile(recTemplate); diff --git a/src/main/java/com/hbm/util/CompatExternal.java b/src/main/java/com/hbm/util/CompatExternal.java index 2a7f1177c..4105a1482 100644 --- a/src/main/java/com/hbm/util/CompatExternal.java +++ b/src/main/java/com/hbm/util/CompatExternal.java @@ -10,11 +10,14 @@ import java.util.function.Consumer; import api.hbm.energymk2.IEnergyHandlerMK2; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidUser; +import api.hbm.recipe.IRecipeRegisterListener; + import com.hbm.blocks.BlockDummyable; import com.hbm.entity.missile.EntityMissileCustom; import com.hbm.explosion.ExplosionNukeSmall; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.weapon.ItemCustomMissilePart.WarheadType; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.turret.TileEntityTurretSentry; @@ -186,6 +189,15 @@ public class CompatExternal { public static void setWarheadLabel(WarheadType type, String label) { type.labelCustom = label; } public static void setWarheadImpact(WarheadType type, Consumer impact) { type.impactCustom = impact; } public static void setWarheadUpdate(WarheadType type, Consumer update) { type.updateCustom = update; } + + /** + * Registers an IRecipeRegisterListener to the recipe system. The listener is called every time a SerializableRecipe instance has its recipes loaded, before the + * config files are written, but after the defaults are initialized. + * @param listener + */ + public static void registerRecipeRegisterListener(IRecipeRegisterListener listener) { + SerializableRecipe.additionalListeners.add(listener); + } public static void compatExamples() { // Makes all cows be targeted by turrets if player mode is active in addition to the existing rules. Applies to all entities that inherit EntityCow. diff --git a/src/main/java/com/hbm/util/CompatRecipeRegistry.java b/src/main/java/com/hbm/util/CompatRecipeRegistry.java new file mode 100644 index 000000000..b4f27c3e4 --- /dev/null +++ b/src/main/java/com/hbm/util/CompatRecipeRegistry.java @@ -0,0 +1,264 @@ +package com.hbm.util; + +import java.util.Arrays; + +import com.hbm.interfaces.Untested; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.RecipesCommon.*; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.*; +import com.hbm.inventory.recipes.AmmoPressRecipes.AmmoPressRecipe; +import com.hbm.inventory.recipes.ArcFurnaceRecipes.ArcFurnaceRecipe; +import com.hbm.inventory.recipes.ArcWelderRecipes.ArcWelderRecipe; +import com.hbm.inventory.recipes.BreederRecipes.BreederRecipe; +import com.hbm.inventory.recipes.CrucibleRecipes.CrucibleRecipe; +import com.hbm.inventory.recipes.CrystallizerRecipes.CrystallizerRecipe; +import com.hbm.inventory.recipes.ElectrolyserFluidRecipes.ElectrolysisRecipe; +import com.hbm.inventory.recipes.ElectrolyserMetalRecipes.ElectrolysisMetalRecipe; +import com.hbm.inventory.recipes.ExposureChamberRecipes.ExposureChamberRecipe; +import com.hbm.inventory.recipes.ParticleAcceleratorRecipes.ParticleAcceleratorRecipe; +import com.hbm.inventory.recipes.PedestalRecipes.PedestalExtraCondition; +import com.hbm.inventory.recipes.PedestalRecipes.PedestalRecipe; +import com.hbm.inventory.recipes.PyroOvenRecipes.PyroOvenRecipe; +import com.hbm.inventory.recipes.RotaryFurnaceRecipes.RotaryFurnaceRecipe; +import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe; +import com.hbm.inventory.recipes.CompressorRecipes.CompressorRecipe; +import com.hbm.inventory.recipes.SolderingRecipes.SolderingRecipe; +import com.hbm.inventory.recipes.anvil.AnvilRecipes; +import com.hbm.inventory.recipes.anvil.AnvilRecipes.AnvilConstructionRecipe; +import com.hbm.inventory.recipes.anvil.AnvilRecipes.AnvilOutput; +import com.hbm.inventory.recipes.anvil.AnvilRecipes.OverlayType; +import com.hbm.items.machine.ItemStamp.StampType; +import com.hbm.util.Tuple.Pair; +import com.hbm.util.Tuple.Triplet; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +/** + * Public methods for registering recipes. Method signature should never change, only the body to reflect any changes to recipes/machines themselves. + * Recipe creation is either 1:1 with the original SerializableRecipe or even simpler (in the case of the compressor, two FluidStacks instead of a ton of loose numbers). + * Call these with a registered IRecipeRegisterListener, otherwise the recipe loading/reloading will break the custom recipes. + * @author hbm + */ +@Untested +public class CompatRecipeRegistry { + + public static void registerPress(StampType stamp, AStack input, ItemStack output) { + PressRecipes.recipes.put(new Pair(input, stamp), output); + } + + /** Same loose rules as BlastFurnaceRecipes, valid inputs are Items, Blocks, ItemStacks, ComparableStacks, Strings (for oredict) and DictFrames */ + public static void registerBlastFurnace(Object[] inputs, ItemStack output) { + if(inputs.length != 2) return; + BlastFurnaceRecipes.addRecipe(inputs[0], inputs[1], output); + } + + public static void registerShredder(AStack input, ItemStack output) { + for(ItemStack allItems : input.extractForNEI()) { + ComparableStack comp = new ComparableStack(allItems); + ShredderRecipes.shredderRecipes.put(comp, output); + } + } + + /** Items should strictly be categorized as pcb, topping or solder. An item that is used as a topping in one recipe should not be a pcb in another. + * This is because the soldering station's item IO will automatically place items based on this category, and having items in more than one category would break it. */ + public static void registerSoldering(ItemStack output, int time, long power, FluidStack fluid, AStack[] toppings, AStack[] pcb, AStack[] solder) { + SolderingRecipes.recipes.add(new SolderingRecipe(output, time, power, fluid, copyFirst(toppings, 3), copyFirst(pcb, 2), copyFirst(solder, 1))); + } + + /** Chemplant recipes need unique IDs, game will crash when an ID collision is detected! */ + public static void registerChemplant(int id, String name, int duration, AStack[] inputItems, FluidStack[] inputFluids, ItemStack[] outputItems, FluidStack[] outputFluids) { + ChemRecipe recipe = new ChemRecipe(id, name, duration); + if(inputItems != null) recipe.inputItems(copyFirst(inputItems, 4)); + if(inputFluids != null) recipe.inputFluids(copyFirst(inputFluids, 2)); + if(outputItems != null) recipe.outputItems(copyFirst(outputItems, 4)); + if(outputFluids != null) recipe.outputFluids(copyFirst(outputFluids, 2)); + ChemplantRecipes.recipes.add(recipe); + } + + /** Either solid or liquid output can be null */ + public static void registerCombination(AStack input, ItemStack output, FluidStack fluid) { + if(output == null && fluid == null) return; + Object o = input instanceof OreDictStack ? ((OreDictStack) input).name : input; + CombinationRecipes.recipes.put(o, new Pair(output, fluid)); + } + + /** Crucible recipes need unique IDs, game will crash when an ID collision is detected! */ + public static void registerCrucible(int index, String name, int frequency, ItemStack icon, MaterialStack[] input, MaterialStack[] output) { + CrucibleRecipe recipe = new CrucibleRecipe(index, name, frequency, icon).inputs(input).outputs(output); + CrucibleRecipes.recipes.add(recipe); + } + + public static void registerCentrifuge(AStack input, ItemStack[] outputs) { + CentrifugeRecipes.recipes.put(input, copyFirst(outputs, 4)); + } + + public static void registerCrystallizer(AStack input, ItemStack output, int time, float productivity, FluidStack fluid) { + CrystallizerRecipe recipe = new CrystallizerRecipe(output, time).prod(productivity); + CrystallizerRecipes.registerRecipe(input instanceof OreDictStack ? ((OreDictStack) input).name : input, recipe, fluid); + } + + /** Fractions always use 100mB of input fluid per operation. None of the outputs can be null. */ + public static void registerFraction(FluidType input, FluidStack[] output) { + if(output.length != 2) return; + FractionRecipes.fractions.put(input, new Pair(output[0], output[1])); + } + + /** Cracking always uses 100mB of input fluid and 200mB of steam per operation. None of the outputs can be null. */ + public static void registerCracking(FluidType input, FluidStack[] output) { + if(output.length != 2) return; + CrackingRecipes.cracking.put(input, new Pair(output[0], output[1])); + } + + /** Reforming always uses 100mB of input fluid per operation. None of the outputs can be null. */ + public static void registerReforming(FluidType input, FluidStack[] output) { + output = copyFirst(output, 3); + if(output.length < 3) return; + ReformingRecipes.recipes.put(input, new Triplet(output[0], output[1], output[2])); + } + + /** Hydrotreating always uses 100mB of input fluid per operation. None of the outputs can be null. */ + public static void registerHydrotreating(FluidType input, FluidStack hydrogen, FluidStack[] output) { + output = copyFirst(output, 2); + if(output.length < 2) return; + HydrotreatingRecipes.recipes.put(input, new Triplet(hydrogen, output[0], output[1])); + } + + public static void registerLiquefaction(AStack input, FluidStack output) { + LiquefactionRecipes.recipes.put(input instanceof OreDictStack ? ((OreDictStack) input).name : input, output); + } + + public static void registerSolidifying(FluidStack input, ItemStack output) { + SolidificationRecipes.recipes.put(input.type, new Pair(input.fill, output)); + } + + public static void registerCoker(FluidStack input, ItemStack output, FluidStack fluid) { + CokerRecipes.recipes.put(input.type, new Triplet(input.fill, output, fluid)); + } + + /** Registers a coker recipe based on the standardized fluid to coke values */ + public static void registerCokerAuto(FluidType input, FluidType output) { + CokerRecipes.registerAuto(input, output); + } + + public static void registerPyro(FluidStack inputFluid, AStack inputItem, FluidStack outputFluid, ItemStack outputItem, int duration) { + PyroOvenRecipes.recipes.add(new PyroOvenRecipe(duration).in(inputFluid).in(inputItem).out(outputFluid).out(outputItem)); + } + + /** Registers a pyro oven recipe based on the standardized fluid to solid fuel values */ + public static void registerPyroAuto(FluidType input) { + PyroOvenRecipes.registerSFAuto(input); + } + + /** Breeding reactor does not handle OreDictStacks */ + public static void registerBreeder(ComparableStack input, ItemStack output, int flux) { + BreederRecipes.recipes.put(input, new BreederRecipe(output, flux)); + } + + public static void registerCyclotron(ComparableStack box, AStack target, ItemStack output, int antimatter) { + CyclotronRecipes.recipes.put(new Pair(box, target), new Pair(output, antimatter)); + } + + /** Fuel pools do not handle OreDictStacks */ + public static void registerFuelPool(ComparableStack input, ItemStack output) { + FuelPoolRecipes.recipes.put(input, output); + } + + //TBI mixer + + public static void registerOutgasser(AStack input, ItemStack output, FluidStack fluid) { + OutgasserRecipes.recipes.put(input, new Pair(output, fluid)); + } + + public static void registerCompressor(FluidStack input, FluidStack output, int time) { + CompressorRecipes.recipes.put(new Pair(input.type, input.pressure), new CompressorRecipe(input.fill, output, time)); + } + + /** Byproduct array can be null, fluid output length must be 2 */ + public static void registerElectrolyzerFluid(FluidStack input, FluidStack[] output, ItemStack[] byproduct, int time) { + output = copyFirst(output, 2); + if(output.length < 2) return; + if(byproduct != null) byproduct = copyFirst(byproduct, 3); + + ElectrolyserFluidRecipes.recipes.put(input.type, new ElectrolysisRecipe(input.fill, output[0], output[1], time, byproduct)); + } + + /** Output array length must be 2, outputs can be null. Byproduct array can be null. */ + public static void registerElectrolyzerMetal(AStack input, MaterialStack[] output, ItemStack[] byproduct, int time) { + output = copyFirst(output, 2); + if(byproduct != null) byproduct = copyFirst(byproduct, 6); + + ElectrolyserMetalRecipes.recipes.put(input, new ElectrolysisMetalRecipe(output[0], output[1], time, byproduct)); + } + + public static void registerArcWelder(ItemStack output, int time, long power, FluidStack fluid, AStack[] inputs) { + ArcWelderRecipes.recipes.add(new ArcWelderRecipe(output, time, power, fluid, copyFirst(inputs, 3))); + } + + public static void registerRotaryFurnace(MaterialStack output, int time, int steam, FluidStack fluid, AStack[] inputs) { + RotaryFurnaceRecipes.recipes.add(new RotaryFurnaceRecipe(output, time, steam, fluid, copyFirst(inputs, 3))); + } + + /** Particles will always perform 8 recipes */ + public static void registerExposureChamber(AStack particle, AStack input, ItemStack output) { + ExposureChamberRecipes.recipes.add(new ExposureChamberRecipe(particle, input, output)); + } + + /** Input needs two AStacks, output can take 1-2 ItemStacks. If the same recipe with different + * momentum should yield different results, register the lower momentum recipes first. */ + public static void registerParticleAccelerator(AStack[] input, int momentum, ItemStack[] output) { + input = copyFirst(input, 2); + if(input.length < 2) return; + output = copyFirst(output, 2); + if(output.length < 1) return; + ParticleAcceleratorRecipes.recipes.add(new ParticleAcceleratorRecipe(input[0], input[1], momentum, output[0], output.length > 1 ? output[1] : null)); + } + + public static void registerAmmoPress(ItemStack output, AStack[] input) { + if(input.length != 9) return; + AmmoPressRecipes.recipes.add(new AmmoPressRecipe(output, input)); + } + + public static void registerAssembler(ItemStack output, AStack[] input, int time) { + AssemblerRecipes.makeRecipe(new ComparableStack(output), copyFirst(input, 12), time); + } + + /** Registers an assembler recipe but with the template only being obtainable via the specified folders */ + public static void registerAssembler(ItemStack output, AStack[] input, int time, Item... folder) { + AssemblerRecipes.makeRecipe(new ComparableStack(output), copyFirst(input, 12), time, folder); + } + + public static void registerAnvilConstruction(AStack[] input, AnvilOutput[] output, int tier, int overlayIndex) { + AnvilRecipes.constructionRecipes.add(new AnvilConstructionRecipe(input, output).setTier(tier).setOverlay(EnumUtil.grabEnumSafely(OverlayType.class, overlayIndex))); + } + + public static void registerAnvilConstruction(AStack[] input, AnvilOutput[] output, int tierLower, int tierUpper, int overlayIndex) { + AnvilRecipes.constructionRecipes.add(new AnvilConstructionRecipe(input, output).setTierRange(tierLower, tierUpper).setOverlay(EnumUtil.grabEnumSafely(OverlayType.class, overlayIndex))); + } + + public static void registerPedestal(ItemStack output, AStack[] input) { + registerPedestal(output, input, 0); + } + + public static void registerPedestal(ItemStack output, AStack[] input, int condition) { + input = copyFirst(input, 9); + if(input.length < 9) return; + PedestalRecipes.recipes.add(new PedestalRecipe(output, input).extra(EnumUtil.grabEnumSafely(PedestalExtraCondition.class, condition))); + } + + /** Either output or fluid can be null */ + public static void registerArcFurnace(AStack input, ItemStack output, MaterialStack fluid) { + if(output == null && fluid == null) return; + ArcFurnaceRecipes.recipeList.add(new Pair(input, new ArcFurnaceRecipe().solid(output).fluid(fluid))); + } + + ///////////////////////////////////////////////////////////////////////////////////////// + + /** If the supplied array exceeds the specified length, creates a copy and trunkates the array. Otherwise, returns the original array */ + private static T[] copyFirst(T[] array, int amount) { + if(array.length <= amount) return array; + return Arrays.copyOf(array, amount); + } +}