From aa40b5729767879049ebb1c502902114c1cdcb45 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 27 Jan 2026 15:37:27 +0100 Subject: [PATCH] this is dave from microsoft, your computer has virus --- changelog | 6 +- src/main/java/com/hbm/blocks/ModBlocks.java | 13 +- .../hbm/blocks/generic/BlockDoorGeneric.java | 27 ++- .../handler/nei/ShredderRecipeHandler.java | 13 +- .../hbm/inventory/recipes/MachineRecipes.java | 31 ---- src/main/java/com/hbm/items/ModItems.java | 25 --- .../com/hbm/items/special/ItemDoorSkin.java | 36 ---- .../special/ItemSlidingBlastDoorSkin.java | 28 --- .../weapon/sedna/factory/XFactory50.java | 2 +- .../java/com/hbm/main/CraftingManager.java | 5 - src/main/java/com/hbm/main/MainRegistry.java | 1 + .../java/com/hbm/main/ResourceManager.java | 1 + .../item/weapon/sedna/ItemRenderMinigun.java | 2 +- .../weapon/sedna/ItemRenderMinigunDual.java | 4 +- .../hbm/render/loader/ModelRendererTest.java | 172 ------------------ .../tileentity/door/RenderSecureDoor.java | 5 +- .../java/com/hbm/tileentity/DoorDecl.java | 122 ++++--------- .../hbm/tileentity/TileEntityDoorGeneric.java | 104 +++++------ .../TileEntityMachineArcFurnaceLarge.java | 16 +- .../storage/TileEntityMachineOrbus.java | 4 +- .../assets/hbm/manual/weapon/ap.json | 20 ++ .../assets/hbm/manual/weapon/buckshot.json | 14 ++ .../hbm/manual/weapon/buckshotmagnum.json | 14 ++ .../hbm/manual/weapon/buckshotsharpnel.json | 13 ++ .../assets/hbm/manual/weapon/demo.json | 15 ++ .../assets/hbm/manual/weapon/du.json | 16 ++ .../assets/hbm/manual/weapon/express.json | 14 ++ .../assets/hbm/manual/weapon/flechettes.json | 13 ++ .../assets/hbm/manual/weapon/fmj.json | 20 ++ .../assets/hbm/manual/weapon/grenade.json | 14 ++ .../assets/hbm/manual/weapon/he.json | 17 ++ .../assets/hbm/manual/weapon/heat.json | 14 ++ .../assets/hbm/manual/weapon/incendiary.json | 14 ++ .../assets/hbm/manual/weapon/jhp.json | 20 ++ .../assets/hbm/manual/weapon/muke.json | 13 ++ .../assets/hbm/manual/weapon/powder.json | 15 ++ .../assets/hbm/manual/weapon/slug.json | 15 ++ .../assets/hbm/manual/weapon/softpoint.json | 20 ++ .../assets/hbm/manual/weapon/star.json | 13 ++ .../assets/hbm/manual/weapon/wp.json | 15 ++ .../models/pheodoors/secure_door_grey.png | Bin 0 -> 26741 bytes 41 files changed, 441 insertions(+), 485 deletions(-) delete mode 100644 src/main/java/com/hbm/items/special/ItemDoorSkin.java delete mode 100644 src/main/java/com/hbm/items/special/ItemSlidingBlastDoorSkin.java delete mode 100644 src/main/java/com/hbm/render/loader/ModelRendererTest.java create mode 100644 src/main/resources/assets/hbm/manual/weapon/ap.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/buckshot.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/buckshotmagnum.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/demo.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/du.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/express.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/flechettes.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/fmj.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/grenade.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/he.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/heat.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/incendiary.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/jhp.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/muke.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/powder.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/slug.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/softpoint.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/star.json create mode 100644 src/main/resources/assets/hbm/manual/weapon/wp.json create mode 100644 src/main/resources/assets/hbm/textures/models/pheodoors/secure_door_grey.png diff --git a/changelog b/changelog index de1ce71f4..eb8fac849 100644 --- a/changelog +++ b/changelog @@ -6,7 +6,7 @@ * Simplified the battery socket's client packets, reducing CPU load * Muzzle flashes on guns now work in third person mode, including on other players and on NPCs, making it more apparent when you're being fired at * This includes non-standard special effects like the .44 gap flash and the .35-800 ejector plume -* Removed the old unused satelite deco blocks, freeing up 6 block IDs +* Removed the old unused satellite deco blocks, freeing up 6 block IDs * Crucibles that smelt metal with no template set will no place the metal in the recipe stack instead of the waste stack, this should make it easier to get a recipe to work in the many, many cases where people add the template after smelting the material * Battery sockets and the FENSU now support the copy tool * Removed unused displaylist support from the model loader @@ -14,12 +14,12 @@ * Rebranded canned horse slime * Now with extra bone marrow * Updated the deuterium tower's model -* Increased the energy requirement for welding osmiridium * Updated most blast door visuals * RBMKs now have QMAW pages * Updated the model on the heavy magnetic storage container * Increased the power draw on the osmiridium welding recipe * Bullet casings now make sounds when falling to the ground +* Most ammo types now have QMAW pages, including information on whether or not they are a war crime # Fixed * Potentially fixed yet another issue regarding crates @@ -30,3 +30,5 @@ * Fixed an issue where the charging station would crash when trying to charge certain items * Fixed the DFC's core component not dropping its contents when mined * Fixed audio problems with guns +* Fixed third person muzzleflash on the miniguns clipping the barrel +* Fixed arc furnace IO slots stacking items with incompatible NBT diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 8672336d7..e590dd944 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1192,17 +1192,8 @@ public class ModBlocks { public static Block corium_block; public static Fluid corium_fluid; public static final Material fluidcorium = (new MaterialLiquid(MapColor.brownColor) { - - @Override - public boolean blocksMovement() { - return true; - } - - @Override - public Material setImmovableMobility() { //override access modifier - return super.setImmovableMobility(); - } - + @Override public boolean blocksMovement() { return true; } + @Override public Material setImmovableMobility() { return super.setImmovableMobility(); } //override access modifier }.setImmovableMobility()); public static Block volcanic_lava_block; diff --git a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java index 3dfe4814a..44927cd34 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDoorGeneric.java @@ -4,12 +4,12 @@ import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IBomb; -import com.hbm.items.special.ItemDoorSkin; import com.hbm.tileentity.DoorDecl; import com.hbm.tileentity.TileEntityDoorGeneric; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.Rotation; +import api.hbm.block.IToolable; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; @@ -23,7 +23,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class BlockDoorGeneric extends BlockDummyable implements IBomb { +public class BlockDoorGeneric extends BlockDummyable implements IBomb, IToolable { public DoorDecl type; @@ -69,20 +69,29 @@ public class BlockDoorGeneric extends BlockDummyable implements IBomb { public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer playerIn, int side, float hitX, float hitY, float hitZ){ if(!world.isRemote && !playerIn.isSneaking()) { int[] pos1 = findCore(world, x, y, z); - if(pos1 == null) - return false; + if(pos1 == null) return false; TileEntityDoorGeneric door = (TileEntityDoorGeneric) world.getTileEntity(pos1[0], pos1[1], pos1[2]); if(door != null) { - if(playerIn.getHeldItem() != null && playerIn.getHeldItem().getItem() instanceof ItemDoorSkin) { - return door.setSkinIndex((byte) playerIn.getHeldItem().getItemDamage()); - } else { - return door.tryToggle(playerIn); - } + return door.tryToggle(playerIn); } } return !playerIn.isSneaking(); } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + if(tool != ToolType.SCREWDRIVER || !player.isSneaking()) return false; + + int[] pos1 = findCore(world, x, y, z); + if(pos1 == null) return false; + TileEntityDoorGeneric door = (TileEntityDoorGeneric) world.getTileEntity(pos1[0], pos1[1], pos1[2]); + + if(door == null || !door.getDoorType().hasSkins()) return false; + if(world.isRemote) return true; + door.cycleSkinIndex(); + return true; + } @Override public boolean isLadder(IBlockAccess world, int x, int y, int z, EntityLivingBase entity) { diff --git a/src/main/java/com/hbm/handler/nei/ShredderRecipeHandler.java b/src/main/java/com/hbm/handler/nei/ShredderRecipeHandler.java index 7524f5091..ed998442e 100644 --- a/src/main/java/com/hbm/handler/nei/ShredderRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/ShredderRecipeHandler.java @@ -11,8 +11,8 @@ import com.hbm.blocks.ModBlocks; import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIMachineShredder; -import com.hbm.inventory.recipes.MachineRecipes; import com.hbm.inventory.recipes.ShredderRecipes; +import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import codechicken.nei.NEIServerUtils; @@ -175,9 +175,18 @@ public class ShredderRecipeHandler extends TemplateRecipeHandler implements ICom public TemplateRecipeHandler newInstance() { if(fuels == null || fuels.isEmpty()) fuels = new ArrayList(); - for(ItemStack i : MachineRecipes.instance().getBlades()) { + for(ItemStack i : getBlades()) { fuels.add(new Fuel(i)); } return super.newInstance(); } + + public static ArrayList getBlades() { + ArrayList fuels = new ArrayList(); + fuels.add(new ItemStack(ModItems.blades_advanced_alloy)); + fuels.add(new ItemStack(ModItems.blades_steel)); + fuels.add(new ItemStack(ModItems.blades_titanium)); + fuels.add(new ItemStack(ModItems.blades_desh)); + return fuels; + } } diff --git a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java index fd6668851..e578f6fee 100644 --- a/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/MachineRecipes.java @@ -12,7 +12,6 @@ import com.hbm.util.Tuple.Triplet; import net.minecraft.init.Blocks; import net.minecraft.init.Items; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.oredict.OreDictionary; @@ -50,42 +49,12 @@ public class MachineRecipes { ArrayList fuels = new ArrayList(); fuels.add(new ItemStack(ModItems.battery_potato)); fuels.add(new ItemStack(ModItems.battery_potatos)); - fuels.add(new ItemStack(ModItems.fusion_core)); fuels.add(new ItemStack(ModItems.energy_core)); for(EnumBatteryPack num : EnumBatteryPack.values()) fuels.add(new ItemStack(ModItems.battery_pack, 1, num.ordinal())); for(EnumBatterySC num : EnumBatterySC.values()) fuels.add(new ItemStack(ModItems.battery_sc, 1, num.ordinal())); fuels.add(new ItemStack(ModItems.battery_creative)); return fuels; } - - public ArrayList getBlades() { - ArrayList fuels = new ArrayList(); - fuels.add(new ItemStack(ModItems.blades_advanced_alloy)); - fuels.add(new ItemStack(ModItems.blades_steel)); - fuels.add(new ItemStack(ModItems.blades_titanium)); - fuels.add(new ItemStack(ModItems.blades_desh)); - return fuels; - } - - public static boolean mODE(Item item, String[] names) { - return mODE(new ItemStack(item), names); - } - - public static boolean mODE(ItemStack item, String[] names) { - boolean flag = false; - if(names.length > 0) { - for(int i = 0; i < names.length; i++) { - if(mODE(item, names[i])) - flag = true; - } - } - - return flag; - } - - public static boolean mODE(Item item, String name) { - return mODE(new ItemStack(item), name); - } //Matches Ore Dict Entry public static boolean mODE(ItemStack stack, String name) { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index eb15c54cf..aee8db4f7 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1347,16 +1347,6 @@ public class ModItems { public static Item mp_chip_4; public static Item mp_chip_5; - public static Item missile_skin_camo; - public static Item missile_skin_desert; - public static Item missile_skin_flames; - public static Item missile_skin_manly_pink; - public static Item missile_skin_orange_insulation; - public static Item missile_skin_sleek; - public static Item missile_skin_soviet_glory; - public static Item missile_skin_soviet_stank; - public static Item missile_skin_metal; - public static Item missile_custom; public static Item missile_soyuz; @@ -2135,8 +2125,6 @@ public class ModItems { public static Item door_bunker; public static Item door_red; - public static Item sliding_blast_door_skin; - public static Item record_lc; public static Item record_ss; public static Item record_vc; @@ -3680,16 +3668,6 @@ public class ModItems { mp_chip_4 = new ItemCustomMissilePart().makeChip(0.005F) .setUnlocalizedName("mp_c_4").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_c_4"); mp_chip_5 = new ItemCustomMissilePart().makeChip(0.0F) .setUnlocalizedName("mp_c_5").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":mp_c_5"); - missile_skin_camo = new ItemCustomLore().setUnlocalizedName("missile_skin_camo").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_skin_camo"); - missile_skin_desert = new ItemCustomLore().setUnlocalizedName("missile_skin_desert").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_skin_desert"); - missile_skin_flames = new ItemCustomLore().setUnlocalizedName("missile_skin_flames").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_skin_flames"); - missile_skin_manly_pink = new ItemCustomLore().setUnlocalizedName("missile_skin_manly_pink").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_skin_manly_pink"); - missile_skin_orange_insulation = new ItemCustomLore().setUnlocalizedName("missile_skin_orange_insulation").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_skin_orange_insulation"); - missile_skin_sleek = new ItemCustomLore().setUnlocalizedName("missile_skin_sleek").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_skin_sleek"); - missile_skin_soviet_glory = new ItemCustomLore().setUnlocalizedName("missile_skin_soviet_glory").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_skin_soviet_glory"); - missile_skin_soviet_stank = new ItemCustomLore().setUnlocalizedName("missile_skin_soviet_stank").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_skin_soviet_stank"); - missile_skin_metal = new ItemCustomLore().setUnlocalizedName("missile_skin_metal").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":missile_skin_metal"); - ammo_shell = (ItemEnumMulti) new ItemAmmo(Ammo240Shell.class).setCreativeTab(MainRegistry.weaponTab).setUnlocalizedName("ammo_shell"); ammo_dgk = new ItemCustomLore().setUnlocalizedName("ammo_dgk").setCreativeTab(MainRegistry.weaponTab); ammo_fireext = (ItemEnumMulti) new ItemAmmo(AmmoFireExt.class).setCreativeTab(MainRegistry.weaponTab).setUnlocalizedName("ammo_fireext"); @@ -4850,8 +4828,6 @@ public class ModItems { door_bunker = new ItemModDoor().setUnlocalizedName("door_bunker").setCreativeTab(MainRegistry.blockTab).setTextureName(RefStrings.MODID + ":door_bunker"); door_red = new ItemModDoor().setUnlocalizedName("door_red").setCreativeTab(null).setTextureName(RefStrings.MODID + ":door_red"); - sliding_blast_door_skin = new ItemSlidingBlastDoorSkin().setUnlocalizedName("sliding_blast_door_skin").setCreativeTab(CreativeTabs.tabMisc).setTextureName(RefStrings.MODID + ":sliding_blast_door_default"); - record_lc = new ItemModRecord("lc").setUnlocalizedName("record_lc").setCreativeTab(CreativeTabs.tabMisc).setTextureName(RefStrings.MODID + ":record_lc"); record_ss = new ItemModRecord("ss").setUnlocalizedName("record_ss").setCreativeTab(CreativeTabs.tabMisc).setTextureName(RefStrings.MODID + ":record_ss"); record_vc = new ItemModRecord("vc").setUnlocalizedName("record_vc").setCreativeTab(CreativeTabs.tabMisc).setTextureName(RefStrings.MODID + ":record_vc"); @@ -7032,7 +7008,6 @@ public class ModItems { GameRegistry.registerItem(door_office, door_office.getUnlocalizedName()); GameRegistry.registerItem(door_bunker, door_bunker.getUnlocalizedName()); GameRegistry.registerItem(door_red, door_red.getUnlocalizedName()); - GameRegistry.registerItem(sliding_blast_door_skin, sliding_blast_door_skin.getUnlocalizedName()); //Records GameRegistry.registerItem(record_lc, record_lc.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/special/ItemDoorSkin.java b/src/main/java/com/hbm/items/special/ItemDoorSkin.java deleted file mode 100644 index c7211473f..000000000 --- a/src/main/java/com/hbm/items/special/ItemDoorSkin.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.hbm.items.special; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; - -import java.util.List; - -public class ItemDoorSkin extends Item { - protected final IIcon[] icons; - - public ItemDoorSkin(int skinCount) { - setMaxStackSize(1); - icons = new IIcon[skinCount]; - } - - @Override - public boolean getHasSubtypes() { - return true; - } - - @Override - public void getSubItems(Item item, CreativeTabs creativeTabs, List list) { - for(int i = 0; i < icons.length; i++) { - list.add(new ItemStack(item, 1, i)); - } - } - - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int meta) { - return icons[meta]; - } -} diff --git a/src/main/java/com/hbm/items/special/ItemSlidingBlastDoorSkin.java b/src/main/java/com/hbm/items/special/ItemSlidingBlastDoorSkin.java deleted file mode 100644 index 36008e132..000000000 --- a/src/main/java/com/hbm/items/special/ItemSlidingBlastDoorSkin.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.hbm.items.special; - -import com.hbm.lib.RefStrings; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.item.ItemStack; - -public class ItemSlidingBlastDoorSkin extends ItemDoorSkin { - public ItemSlidingBlastDoorSkin() { - super(3); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - this.itemIcon = reg.registerIcon(this.getIconString()); - - this.icons[0] = reg.registerIcon(RefStrings.MODID + ":sliding_blast_door_default"); - this.icons[1] = reg.registerIcon(RefStrings.MODID + ":sliding_blast_door_variant1"); - this.icons[2] = reg.registerIcon(RefStrings.MODID + ":sliding_blast_door_variant2"); - } - - @Override - public String getUnlocalizedName(ItemStack stack) { - return super.getUnlocalizedName(stack) + "." + stack.getItemDamage(); - } -} diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java index 8e66ffd95..c08e637e3 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory50.java @@ -71,7 +71,7 @@ public class XFactory50 { .setCasing(casing50.clone().setColor(SpentCasing.COLOR_CASE_44).register("bmg50ap")); bmg50_du = new BulletConfig().setItem(EnumAmmo.BMG50_DU).setCasing(EnumCasingType.LARGE_STEEL, 12).setDoesPenetrate(true).setDamageFalloffByPen(false).setDamage(1.5F).setThresholdNegation(21F).setArmorPiercing(0.25F) .setCasing(casing50.clone().setColor(SpentCasing.COLOR_CASE_44).register("bmg50du")); - bmg50_he = new BulletConfig().setItem(EnumAmmo.BMG50_HE).setCasing(EnumCasingType.LARGE_STEEL, 12).setWear(3F).setDoesPenetrate(true).setDamageFalloffByPen(false).setDamage(1.75F).setOnImpact(LAMBDA_STANDARD_EXPLODE) + bmg50_he = new BulletConfig().setItem(EnumAmmo.BMG50_HE).setCasing(EnumCasingType.LARGE_STEEL, 12).setWear(3F).setDamage(1.75F).setOnImpact(LAMBDA_STANDARD_EXPLODE) .setCasing(casing50.clone().setColor(SpentCasing.COLOR_CASE_44).register("bmg50he")); bmg50_sm = new BulletConfig().setItem(EnumAmmo.BMG50_SM).setCasing(EnumCasingType.LARGE_STEEL, 6).setWear(10F).setDoesPenetrate(true).setDamageFalloffByPen(false).setDamage(2.5F).setThresholdNegation(30F).setArmorPiercing(0.35F) .setCasing(casing50.clone().setColor(SpentCasing.COLOR_CASE_44).register("bmg50sm")); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 37e85aa15..48f25d845 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -1072,11 +1072,6 @@ public class CraftingManager { ModItems.circuit_star_piece.stackFromEnum(ScrapType.BOARD_BLANK) }); - addRecipeAuto(new ItemStack(ModItems.sliding_blast_door_skin), "SPS", "DPD", "SPS", 'P', Items.paper, 'D', "dye", 'S', STEEL.plate()); - addShapelessAuto(new ItemStack(ModItems.sliding_blast_door_skin, 1, 1), new ItemStack(ModItems.sliding_blast_door_skin, 1, 0)); - addShapelessAuto(new ItemStack(ModItems.sliding_blast_door_skin, 1, 2), new ItemStack(ModItems.sliding_blast_door_skin, 1, 1)); - addShapelessAuto(new ItemStack(ModItems.sliding_blast_door_skin), new ItemStack(ModItems.sliding_blast_door_skin, 1, 2)); - addRecipeAuto(new ItemStack(ModBlocks.cm_block, 4, 0), " I ", "IPI", " I ", 'I', STEEL.ingot(), 'P', STEEL.plateCast()); addRecipeAuto(new ItemStack(ModBlocks.cm_block, 4, 1), " I ", "IPI", " I ", 'I', ALLOY.ingot(), 'P', ALLOY.plateCast()); addRecipeAuto(new ItemStack(ModBlocks.cm_block, 4, 2), " I ", "IPI", " I ", 'I', DESH.ingot(), 'P', DESH.plateCast()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 943cc4ebf..588deea5a 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1477,6 +1477,7 @@ public class MainRegistry { ignoreMappings.add("hbm:tile.sat_laser"); ignoreMappings.add("hbm:tile.sat_foeq"); ignoreMappings.add("hbm:tile.sat_resonator"); + ignoreMappings.add("hbm:item.sliding_blast_door_skin"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 484de8985..e6805c199 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -342,6 +342,7 @@ public class ResourceManager { public static final ResourceLocation pheo_seal_door_tex = new ResourceLocation(RefStrings.MODID, "textures/models/pheodoors/seal_door.png"); public static IModelCustomNamed pheo_seal_door = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/pheodoors/seal_door.obj")).asVBO(); public static final ResourceLocation pheo_secure_door_tex = new ResourceLocation(RefStrings.MODID, "textures/models/pheodoors/secure_door.png"); + public static final ResourceLocation pheo_secure_door_grey_tex = new ResourceLocation(RefStrings.MODID, "textures/models/pheodoors/secure_door_grey.png"); public static IModelCustomNamed pheo_secure_door = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/pheodoors/secure_door.obj")).asVBO(); public static final ResourceLocation pheo_sliding_door_tex = new ResourceLocation(RefStrings.MODID, "textures/models/pheodoors/sliding_door.png"); public static IModelCustomNamed pheo_sliding_door = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/pheodoors/sliding_door.obj")).asVBO(); diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMinigun.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMinigun.java index 2db8a6d9d..a0ea72cf6 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMinigun.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMinigun.java @@ -145,7 +145,7 @@ public class ItemRenderMinigun extends ItemRenderWeaponBase { } GL11.glPushMatrix(); - GL11.glTranslated(0, 0, 12); + GL11.glTranslated(0, 0, 12.25); GL11.glRotated(90, 0, 1, 0); if(stack.getItem() == ModItems.gun_minigun_lacunae) { diff --git a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMinigunDual.java b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMinigunDual.java index 1df826345..1f6cb7d5b 100644 --- a/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMinigunDual.java +++ b/src/main/java/com/hbm/render/item/weapon/sedna/ItemRenderMinigunDual.java @@ -134,7 +134,7 @@ public class ItemRenderMinigunDual extends ItemRenderWeaponBase { } GL11.glPushMatrix(); - GL11.glTranslated(0, 0, 12); + GL11.glTranslated(0, 0, 12.25); GL11.glRotated(90, 0, 1, 0); GL11.glRotated(shotRand * 90, 1, 0, 0); @@ -164,7 +164,7 @@ public class ItemRenderMinigunDual extends ItemRenderWeaponBase { } GL11.glPushMatrix(); - GL11.glTranslated(0, 0, 12); + GL11.glTranslated(0, 0, 12.25); GL11.glRotated(90, 0, 1, 0); GL11.glRotated(shotRand * 90, 1, 0, 0); diff --git a/src/main/java/com/hbm/render/loader/ModelRendererTest.java b/src/main/java/com/hbm/render/loader/ModelRendererTest.java deleted file mode 100644 index 0a8063a94..000000000 --- a/src/main/java/com/hbm/render/loader/ModelRendererTest.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.hbm.render.loader; - -import org.lwjgl.opengl.GL11; - -import com.hbm.main.ResourceManager; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelBox; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.Tessellator; - -public class ModelRendererTest extends ModelRenderer { - - //TODO: blow up mojank HQ with a JDAM - private boolean compiled; - private int displayList; - - public ModelRendererTest(ModelBase p_i1173_1_) { - super(p_i1173_1_); - } - - public ModelRendererTest(ModelBase p_i1174_1_, int p_i1174_2_, int p_i1174_3_) { - this(p_i1174_1_); - this.setTextureOffset(p_i1174_2_, p_i1174_3_); - } - - @SideOnly(Side.CLIENT) - public void render(float p_78785_1_) { - if(!this.isHidden) { - if(this.showModel) { - if(!this.compiled) { - this.compileDisplayList(p_78785_1_); - } - - GL11.glTranslatef(this.offsetX, this.offsetY, this.offsetZ); - int i; - - if(this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { - if(this.rotationPointX == 0.0F && this.rotationPointY == 0.0F && this.rotationPointZ == 0.0F) { - GL11.glCallList(this.displayList); - - if(this.childModels != null) { - for(i = 0; i < this.childModels.size(); ++i) { - ((ModelRenderer) this.childModels.get(i)).render(p_78785_1_); - } - } - } else { - GL11.glTranslatef(this.rotationPointX * p_78785_1_, this.rotationPointY * p_78785_1_, this.rotationPointZ * p_78785_1_); - GL11.glCallList(this.displayList); - - if(this.childModels != null) { - for(i = 0; i < this.childModels.size(); ++i) { - ((ModelRenderer) this.childModels.get(i)).render(p_78785_1_); - } - } - - GL11.glTranslatef(-this.rotationPointX * p_78785_1_, -this.rotationPointY * p_78785_1_, -this.rotationPointZ * p_78785_1_); - } - } else { - GL11.glPushMatrix(); - GL11.glTranslatef(this.rotationPointX * p_78785_1_, this.rotationPointY * p_78785_1_, this.rotationPointZ * p_78785_1_); - - if(this.rotateAngleZ != 0.0F) { - GL11.glRotatef(this.rotateAngleZ * (180F / (float) Math.PI), 0.0F, 0.0F, 1.0F); - } - - if(this.rotateAngleY != 0.0F) { - GL11.glRotatef(this.rotateAngleY * (180F / (float) Math.PI), 0.0F, 1.0F, 0.0F); - } - - if(this.rotateAngleX != 0.0F) { - GL11.glRotatef(this.rotateAngleX * (180F / (float) Math.PI), 1.0F, 0.0F, 0.0F); - } - - GL11.glPushMatrix(); - GL11.glScaled(0.1, 0.1, 0.1); - ResourceManager.chemplant_body.renderAll(); - GL11.glPopMatrix(); - - //GL11.glCallList(this.displayList); - - if(this.childModels != null) { - for(i = 0; i < this.childModels.size(); ++i) { - ((ModelRenderer) this.childModels.get(i)).render(p_78785_1_); - } - } - - GL11.glPopMatrix(); - } - - GL11.glTranslatef(-this.offsetX, -this.offsetY, -this.offsetZ); - } - } - } - - @SideOnly(Side.CLIENT) - public void renderWithRotation(float p_78791_1_) { - if(!this.isHidden) { - if(this.showModel) { - if(!this.compiled) { - this.compileDisplayList(p_78791_1_); - } - - GL11.glPushMatrix(); - GL11.glTranslatef(this.rotationPointX * p_78791_1_, this.rotationPointY * p_78791_1_, this.rotationPointZ * p_78791_1_); - - if(this.rotateAngleY != 0.0F) { - GL11.glRotatef(this.rotateAngleY * (180F / (float) Math.PI), 0.0F, 1.0F, 0.0F); - } - - if(this.rotateAngleX != 0.0F) { - GL11.glRotatef(this.rotateAngleX * (180F / (float) Math.PI), 1.0F, 0.0F, 0.0F); - } - - if(this.rotateAngleZ != 0.0F) { - GL11.glRotatef(this.rotateAngleZ * (180F / (float) Math.PI), 0.0F, 0.0F, 1.0F); - } - - GL11.glCallList(this.displayList); - GL11.glPopMatrix(); - } - } - } - - @SideOnly(Side.CLIENT) - public void postRender(float p_78794_1_) { - if(!this.isHidden) { - if(this.showModel) { - if(!this.compiled) { - this.compileDisplayList(p_78794_1_); - } - - if(this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { - if(this.rotationPointX != 0.0F || this.rotationPointY != 0.0F || this.rotationPointZ != 0.0F) { - GL11.glTranslatef(this.rotationPointX * p_78794_1_, this.rotationPointY * p_78794_1_, this.rotationPointZ * p_78794_1_); - } - } else { - GL11.glTranslatef(this.rotationPointX * p_78794_1_, this.rotationPointY * p_78794_1_, this.rotationPointZ * p_78794_1_); - - if(this.rotateAngleZ != 0.0F) { - GL11.glRotatef(this.rotateAngleZ * (180F / (float) Math.PI), 0.0F, 0.0F, 1.0F); - } - - if(this.rotateAngleY != 0.0F) { - GL11.glRotatef(this.rotateAngleY * (180F / (float) Math.PI), 0.0F, 1.0F, 0.0F); - } - - if(this.rotateAngleX != 0.0F) { - GL11.glRotatef(this.rotateAngleX * (180F / (float) Math.PI), 1.0F, 0.0F, 0.0F); - } - } - } - } - } - - @SideOnly(Side.CLIENT) - private void compileDisplayList(float p_78788_1_) { - this.displayList = GLAllocation.generateDisplayLists(1); - GL11.glNewList(this.displayList, GL11.GL_COMPILE); - Tessellator tessellator = Tessellator.instance; - - for(int i = 0; i < this.cubeList.size(); ++i) { - ((ModelBox) this.cubeList.get(i)).render(tessellator, p_78788_1_); - } - - GL11.glEndList(); - this.compiled = true; - } -} diff --git a/src/main/java/com/hbm/render/tileentity/door/RenderSecureDoor.java b/src/main/java/com/hbm/render/tileentity/door/RenderSecureDoor.java index 453aa8042..8ce9be891 100644 --- a/src/main/java/com/hbm/render/tileentity/door/RenderSecureDoor.java +++ b/src/main/java/com/hbm/render/tileentity/door/RenderSecureDoor.java @@ -17,7 +17,10 @@ public class RenderSecureDoor implements IRenderDoors { @Override public void render(TileEntityDoorGeneric door, DoubleBuffer buf) { - Minecraft.getMinecraft().getTextureManager().bindTexture(ResourceManager.pheo_secure_door_tex); + Minecraft.getMinecraft().getTextureManager().bindTexture( + door.getSkinIndex() == 1 ? + ResourceManager.pheo_secure_door_grey_tex : + ResourceManager.pheo_secure_door_tex); double maxRaise = 3.5; double raise = 0; diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index e8b55ae12..816688ead 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -113,7 +113,7 @@ public abstract class DoorDecl { } @Override - public BusAnimation getBusAnimation(byte state) { + public BusAnimation getBusAnimation(byte state, byte skinIndex) { if(state == TileEntityDoorGeneric.STATE_OPENING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 1, 0, this.timeToOpen() * 50)); if(state == TileEntityDoorGeneric.STATE_CLOSING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 1, 0).addPos(0, 0, 0, this.timeToOpen() * 50)); return null; @@ -164,7 +164,7 @@ public abstract class DoorDecl { } @Override - public BusAnimation getBusAnimation(byte state) { + public BusAnimation getBusAnimation(byte state, byte skinIndex) { if(state == TileEntityDoorGeneric.STATE_OPENING) return new BusAnimation() .addBus("LOCK", new BusAnimationSequence().setPos(0, 0, 0).addPos(1, 0, 0, 200)) .addBus("DOOR", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 0, 0, 350).addPos(0, 0.05, 0, 200).addPos(0, 1, 0, 650, IType.SIN_UP)); @@ -205,7 +205,7 @@ public abstract class DoorDecl { } @Override - public BusAnimation getBusAnimation(byte state) { + public BusAnimation getBusAnimation(byte state, byte skinIndex) { if(state == TileEntityDoorGeneric.STATE_OPENING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 1, 0, this.timeToOpen() * 50)); if(state == TileEntityDoorGeneric.STATE_CLOSING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 1, 0).addPos(0, 0, 0, this.timeToOpen() * 50)); return null; @@ -240,7 +240,7 @@ public abstract class DoorDecl { } @Override - public BusAnimation getBusAnimation(byte state) { + public BusAnimation getBusAnimation(byte state, byte skinIndex) { if(state == TileEntityDoorGeneric.STATE_OPENING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 1, 0, this.timeToOpen() * 50)); if(state == TileEntityDoorGeneric.STATE_CLOSING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 1, 0).addPos(0, 0, 0, this.timeToOpen() * 50)); return null; @@ -268,6 +268,11 @@ public abstract class DoorDecl { return super.getBlockBound(x, y, z, open, forCollision); } } + + @Override + public int getSkinCount() { + return 2; + } }; public static final DoorDecl ROUND_AIRLOCK_DOOR = new DoorDecl() { @@ -282,7 +287,7 @@ public abstract class DoorDecl { } @Override - public BusAnimation getBusAnimation(byte state) { + public BusAnimation getBusAnimation(byte state, byte skinIndex) { if(state == TileEntityDoorGeneric.STATE_OPENING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 1, 0, this.timeToOpen() * 50)); if(state == TileEntityDoorGeneric.STATE_CLOSING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 1, 0).addPos(0, 0, 0, this.timeToOpen() * 50)); return null; @@ -323,7 +328,7 @@ public abstract class DoorDecl { } @Override - public BusAnimation getBusAnimation(byte state) { + public BusAnimation getBusAnimation(byte state, byte skinIndex) { if(state == TileEntityDoorGeneric.STATE_OPENING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 1, 0, this.timeToOpen() * 50)); if(state == TileEntityDoorGeneric.STATE_CLOSING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 1, 0).addPos(0, 0, 0, this.timeToOpen() * 50)); return null; @@ -359,7 +364,7 @@ public abstract class DoorDecl { } @Override - public BusAnimation getBusAnimation(byte state) { + public BusAnimation getBusAnimation(byte state, byte skinIndex) { if(state == TileEntityDoorGeneric.STATE_OPENING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 1, 0, this.timeToOpen() * 50)); if(state == TileEntityDoorGeneric.STATE_CLOSING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 1, 0).addPos(0, 0, 0, this.timeToOpen() * 50)); return null; @@ -397,7 +402,7 @@ public abstract class DoorDecl { } @Override - public BusAnimation getBusAnimation(byte state) { + public BusAnimation getBusAnimation(byte state, byte skinIndex) { if(state == TileEntityDoorGeneric.STATE_OPENING) return new BusAnimation() .addBus("DOOR", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 0, 0, 1500).addPos(0, 1, 0, 1500, IType.SIN_FULL)) .addBus("BOLT", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 0, 1, 1500, IType.SIN_FULL)); @@ -596,7 +601,7 @@ public abstract class DoorDecl { } @Override - public BusAnimation getBusAnimation(byte state) { + public BusAnimation getBusAnimation(byte state, byte skinIndex) { if(state == TileEntityDoorGeneric.STATE_OPENING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 0, 0).addPos(0, 1, 0, this.timeToOpen() * 50)); if(state == TileEntityDoorGeneric.STATE_CLOSING) return new BusAnimation().addBus("DOOR", new BusAnimationSequence().setPos(0, 1, 0).addPos(0, 0, 0, this.timeToOpen() * 50)); return null; @@ -629,21 +634,14 @@ public abstract class DoorDecl { public abstract int[] getDimensions(); - public int getBlockOffset() { - return 0; - } - - public boolean remoteControllable() { - return false; - } + public int getBlockOffset() { return 0; } + public boolean remoteControllable() { return false; } public float getDoorRangeOpenTime(int ticks, int idx) { return getNormTime(ticks); } - public int timeToOpen() { - return 20; - } + public int timeToOpen() { return 20; } public float getNormTime(float time) { return getNormTime(time, 0, timeToOpen()); @@ -653,13 +651,8 @@ public abstract class DoorDecl { return BobMathUtil.remap01_clamp(time, min, max); } - public boolean hasSkins() { - return getSkinCount() > 0; - } - - public int getSkinCount() { - return 0; - } + public boolean hasSkins() { return getSkinCount() > 0; } + public int getSkinCount() { return 0; } @SideOnly(Side.CLIENT) public ResourceLocation getTextureForPart(String partName) { @@ -672,37 +665,20 @@ public abstract class DoorDecl { @SideOnly(Side.CLIENT) public Animation getAnim() { return null; } @SideOnly(Side.CLIENT) - public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { - set(trans, 0, 0, 0); - } - + public void getTranslation(String partName, float openTicks, boolean child, float[] trans) { set(trans, 0, 0, 0); } @SideOnly(Side.CLIENT) - public void getRotation(String partName, float openTicks, float[] rot) { - set(rot, 0, 0, 0); - } - + public void getRotation(String partName, float openTicks, float[] rot) { set(rot, 0, 0, 0); } @SideOnly(Side.CLIENT) - public void getOrigin(String partName, float[] orig) { - set(orig, 0, 0, 0); - } - + public void getOrigin(String partName, float[] orig) { set(orig, 0, 0, 0); } @SideOnly(Side.CLIENT) - public boolean doesRender(String partName, boolean child) { - return true; - } + public boolean doesRender(String partName, boolean child) { return true; } private static final String[] nothing = new String[] {}; @SideOnly(Side.CLIENT) - public String[] getChildren(String partName) { - return nothing; - } - + public String[] getChildren(String partName) { return nothing; } @SideOnly(Side.CLIENT) - public double[][] getClippingPlanes() { - return new double[][] {}; - } - + public double[][] getClippingPlanes() { return new double[][] {}; } @SideOnly(Side.CLIENT) public void doOffsetTransform() { } @@ -710,42 +686,18 @@ public abstract class DoorDecl { return open ? AxisAlignedBB.getBoundingBox(0, 0, 0, 0, 0, 0) : AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); } - public boolean isLadder(boolean open) { - return false; - } - - public String getOpenSoundLoop() { - return null; - } + public boolean isLadder(boolean open) { return false; } + public String getOpenSoundLoop() { return null; } // Hack - public String getSoundLoop2() { - return null; - } + public String getSoundLoop2() { return null; } + public String getCloseSoundLoop() { return getOpenSoundLoop(); } + public String getOpenSoundStart() { return null; } + public String getCloseSoundStart() { return getOpenSoundStart(); } + public String getOpenSoundEnd() { return null; } + public String getCloseSoundEnd() { return getOpenSoundEnd(); } - public String getCloseSoundLoop() { - return getOpenSoundLoop(); - } - - public String getOpenSoundStart() { - return null; - } - - public String getCloseSoundStart() { - return getOpenSoundStart(); - } - - public String getOpenSoundEnd() { - return null; - } - - public String getCloseSoundEnd() { - return getOpenSoundEnd(); - } - - public float getSoundVolume() { - return 1; - } + public float getSoundVolume() { return 1; } public float[] set(float[] f, float x, float y, float z) { f[0] = x; @@ -756,10 +708,10 @@ public abstract class DoorDecl { // keyframe animation system sneakily stitched into the door decl public IRenderDoors getSEDNARenderer() { return null; } - public BusAnimation getBusAnimation(byte state) { return null; } + public BusAnimation getBusAnimation(byte state, byte skinIndex) { return null; } - public com.hbm.render.anim.HbmAnimations.Animation getSEDNAAnim(byte state) { - BusAnimation anim = this.getBusAnimation(state); + public com.hbm.render.anim.HbmAnimations.Animation getSEDNAAnim(byte state, byte skinIndex) { + BusAnimation anim = this.getBusAnimation(state, skinIndex); if(anim != null) return new com.hbm.render.anim.HbmAnimations.Animation("DOOR_ANIM", System.currentTimeMillis(), anim); return null; } diff --git a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java index 1154e4185..e235a3fb2 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java +++ b/src/main/java/com/hbm/tileentity/TileEntityDoorGeneric.java @@ -24,13 +24,13 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityDoorGeneric extends TileEntityLockableBase { - public static byte STATE_CLOSED = 0; - public static byte STATE_OPEN = 1; - public static byte STATE_CLOSING = 2; - public static byte STATE_OPENING = 3; + public static final byte STATE_CLOSED = 0; + public static final byte STATE_OPEN = 1; + public static final byte STATE_CLOSING = 2; + public static final byte STATE_OPENING = 3; //0: closed, 1: open, 2: closing, 3: opening - public byte state = 0; + public byte state = STATE_CLOSED; protected DoorDecl doorType; public int openTicks = 0; public long animStartTime = 0; @@ -47,16 +47,13 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { @Override public void updateEntity() { - if(state == 3) { + if(state == STATE_OPENING) { openTicks++; - if(openTicks >= getDoorType().timeToOpen()) { - openTicks = getDoorType().timeToOpen(); - } - } else if(state == 2) { + if(openTicks >= getDoorType().timeToOpen()) openTicks = getDoorType().timeToOpen(); + + } else if(state == STATE_CLOSING) { openTicks--; - if(openTicks <= 0) { - openTicks = 0; - } + if(openTicks <= 0) openTicks = 0; } if(!worldObj.isRemote) { @@ -66,7 +63,7 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { int[][] ranges = getDoorType().getDoorOpenRanges(); ForgeDirection dir = ForgeDirection.getOrientation(getBlockMetadata() - BlockDummyable.offset); - if(state == 3) { + if(state == STATE_OPENING) { for(int i = 0; i < ranges.length; i++) { @@ -102,7 +99,7 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { } } - } else if(state == 2) { + } else if(state == STATE_CLOSING) { for(int i = 0; i < ranges.length; i++) { @@ -139,18 +136,18 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { } } } - if(state == 3 && openTicks == getDoorType().timeToOpen()) { - state = 1; + if(state == STATE_OPENING && openTicks == getDoorType().timeToOpen()) { + state = STATE_OPEN; } - if(state == 2 && openTicks == 0) { - state = 0; + if(state == STATE_CLOSING && openTicks == 0) { + state = STATE_CLOSED; } this.networkPackNT(100); - if(redstonePower == -1 && state == 1) { + if(redstonePower == -1 && state == STATE_OPEN) { tryToggle(-1); - } else if(redstonePower > 0 && state == 0) { + } else if(redstonePower > 0 && state == STATE_CLOSED) { tryToggle(-1); } if(redstonePower == -1) { @@ -169,7 +166,7 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { @Override public void deserialize(ByteBuf buf) { handleNewState(buf.readByte()); - setSkinIndex(buf.readByte()); + skinIndex = buf.readByte(); shouldUseBB = buf.readBoolean(); } @@ -197,36 +194,31 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { if(this.isLocked() && player == null) return false; - if(state == 0 && redstonePower > 0) { + if(state == STATE_CLOSED && redstonePower > 0) { //Redstone "power locks" doors, just like minecraft iron doors return false; } - if(this.state == 0) { - if(!worldObj.isRemote && canAccess(player)) { - this.state = 3; - } + + if(this.state == STATE_CLOSED) { + if(!worldObj.isRemote && canAccess(player)) this.state = STATE_OPENING; return true; - } else if(this.state == 1) { - if(!worldObj.isRemote && canAccess(player)) { - this.state = 2; - } + + } else if(this.state == STATE_OPEN) { + if(!worldObj.isRemote && canAccess(player)) this.state = STATE_CLOSING; return true; } return false; } public boolean tryToggle(int passcode) { - if(this.isLocked() && passcode != this.lock) - return false; - if(this.state == 0) { - if(!worldObj.isRemote) { - this.state = 3; - } + if(this.isLocked() && passcode != this.lock) return false; + + if(this.state == STATE_CLOSED) { + if(!worldObj.isRemote) this.state = STATE_OPENING; return true; - } else if(this.state == 1) { - if(!worldObj.isRemote) { - this.state = 2; - } + + } else if(this.state == STATE_OPEN) { + if(!worldObj.isRemote) this.state = STATE_CLOSING; return true; } return false; @@ -238,7 +230,7 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { if(this.state != state) { DoorDecl doorType = getDoorType(); - if(this.state == 0 && state == 3) { // Door transitioning to open + if(this.state == STATE_CLOSED && state == STATE_OPENING) { // Door transitioning to open if(audio != null) { audio.stopSound(); audio.setKeepAlive(0); @@ -261,7 +253,7 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { } } - if(this.state == 1 && state == 2) { // Door transitioning to closed + if(this.state == STATE_OPEN && state == STATE_CLOSING) { // Door transitioning to closed if(audio != null) { audio.stopSound(); } @@ -283,7 +275,7 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { } } - if(state == 1 || state == 0) { // Door finished any transition + if(state == STATE_OPEN || state == STATE_CLOSED) { // Door finished any transition if(audio != null) { audio.stopSound(); audio = null; @@ -294,13 +286,13 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { } } - if(this.state == 3 && state == 1) { // Door finished transitioning to open + if(this.state == STATE_OPENING && state == STATE_OPEN) { // Door finished transitioning to open if(doorType.getOpenSoundEnd() != null) { worldObj.playSound(xCoord, yCoord, zCoord, doorType.getOpenSoundEnd(), doorType.getSoundVolume(), 1F, false); } } - if(this.state == 2 && state == 0) { // Door finished transitioning to closed + if(this.state == STATE_CLOSING && state == STATE_CLOSED) { // Door finished transitioning to closed if(doorType.getCloseSoundEnd() != null) { worldObj.playSound(xCoord, yCoord, zCoord, doorType.getCloseSoundEnd(), doorType.getSoundVolume(), 1F, false); } @@ -308,10 +300,10 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { this.state = state; - if(state > 1) animStartTime = System.currentTimeMillis(); if(state == STATE_OPENING || state == STATE_CLOSING) { - currentAnimation = this.doorType.getSEDNAAnim(state); + animStartTime = System.currentTimeMillis(); + currentAnimation = this.doorType.getSEDNAAnim(state, this.skinIndex); } } } @@ -320,23 +312,21 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase { return skinIndex; } - public boolean setSkinIndex(byte skinIndex) { - if(!getDoorType().hasSkins()) - return false; - if(getDoorType().getSkinCount() < skinIndex) { - return false; - } - this.skinIndex = skinIndex; + public boolean cycleSkinIndex() { + if(!getDoorType().hasSkins()) return false; + this.skinIndex++; + this.skinIndex %= getDoorType().getSkinCount(); + this.markDirty(); return true; } /**Useful for logic block interactions, as a way to close/open doors**/ public void open(){ - if(state == 0) state = 3; + if(state == STATE_CLOSED) state = STATE_OPENING; } public void close() { - if(state == 1) state = 2; + if(state == STATE_OPEN) state = STATE_CLOSING; } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java index 03e79bcba..c88aaeab2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnaceLarge.java @@ -242,20 +242,6 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl } if(this.lid != this.prevLid && this.lid < this.prevLid && this.lid > 0.5F && this.hasMaterial && MainRegistry.proxy.me().getDistance(xCoord + 0.5, yCoord + 4, zCoord + 0.5) < 50) { - /*NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "tower"); - data.setFloat("lift", 0.01F); - data.setFloat("base", 0.5F); - data.setFloat("max", 2F); - data.setInteger("life", 50 + worldObj.rand.nextInt(20)); - data.setDouble("posX", xCoord + 0.5 + worldObj.rand.nextGaussian() * 0.25); - data.setDouble("posZ", zCoord + 0.5 + worldObj.rand.nextGaussian() * 0.25); - data.setDouble("posY", yCoord + 4); - data.setBoolean("noWind", true); - data.setFloat("alphaMod", prevLid / lid); - data.setInteger("color", 0x808080); - data.setFloat("strafe", 0.15F); - MainRegistry.proxy.effectNT(data);*/ if(worldObj.rand.nextInt(5) == 0) { NBTTagCompound flame = new NBTTagCompound(); @@ -286,7 +272,7 @@ public class TileEntityMachineArcFurnaceLarge extends TileEntityMachineBase impl // add to existing stacks for(int i /* ingredient */ = 5; i < 25; i++) { if(slots[i] == null) continue; - if(!slots[q].isItemEqual(slots[i])) continue; + if(!slots[q].isItemEqual(slots[i]) || !ItemStack.areItemStackTagsEqual(slots[q], slots[i])) continue; int toMove = BobMathUtil.min(slots[i].getMaxStackSize() - slots[i].stackSize, slots[q].stackSize, max - slots[i].stackSize); if(toMove > 0) { this.decrStackSize(q, toMove); diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineOrbus.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineOrbus.java index 395b8a9c6..3835238c7 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineOrbus.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineOrbus.java @@ -57,9 +57,9 @@ public class TileEntityMachineOrbus extends TileEntityBarrel { xCoord - 2, yCoord, zCoord - 2, - xCoord + 2, + xCoord + 3, yCoord + 5, - zCoord + 2 + zCoord + 3 ); } diff --git a/src/main/resources/assets/hbm/manual/weapon/ap.json b/src/main/resources/assets/hbm/manual/weapon/ap.json new file mode 100644 index 000000000..d2477cd14 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/ap.json @@ -0,0 +1,20 @@ +{ + "name": "Armor Piercing Bullet", + "icon": ["hbm:item.ammo_standard", 1, 31], + "trigger": [ + ["hbm:item.ammo_standard", 1, 8], + ["hbm:item.ammo_standard", 1, 14], + ["hbm:item.ammo_standard", 1, 19], + ["hbm:item.ammo_standard", 1, 23], + ["hbm:item.ammo_standard", 1, 88], + ["hbm:item.ammo_standard", 1, 27], + ["hbm:item.ammo_standard", 1, 31], + ["hbm:item.ammo_standard", 1, 36] + ], + "title": { + "en_US": "Armor Piercing Bullet" + }, + "content": { + "en_US": "AP rounds are similar to FMJ rounds, but using hardened steel jackets and significantly higher powder load. Not only do APs deal more damage and pierce through armor more effectively, but they can also penetrate their target." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/buckshot.json b/src/main/resources/assets/hbm/manual/weapon/buckshot.json new file mode 100644 index 000000000..fb79e45ea --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/buckshot.json @@ -0,0 +1,14 @@ +{ + "name": "Buckshot", + "icon": ["hbm:item.ammo_standard", 1, 44], + "trigger": [ + ["hbm:item.ammo_standard", 1, 44], + ["hbm:item.ammo_standard", 1, 78] + ], + "title": { + "en_US": "Buckshot" + }, + "content": { + "en_US": "Standard shot, creates many low-damage pellets with considerable spread. Sometimes it's hard to beat the classics." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/buckshotmagnum.json b/src/main/resources/assets/hbm/manual/weapon/buckshotmagnum.json new file mode 100644 index 000000000..07031e33e --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/buckshotmagnum.json @@ -0,0 +1,14 @@ +{ + "name": "Magnum Buckshot", + "icon": ["hbm:item.ammo_standard", 1, 47], + "trigger": [ + ["hbm:item.ammo_standard", 1, 42], + ["hbm:item.ammo_standard", 1, 47] + ], + "title": { + "en_US": "Magnum Buckshot" + }, + "content": { + "en_US": "Buckshot, but with fewer larger pellets which deal more damage. While black powder magnum shells don't perform that much better compared to buckshot, smokeless powder ones are noticably more powerful. Additionally, magnum buckshot shells have roughly half as much spread as standard buckshot." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json b/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json new file mode 100644 index 000000000..308ec85a0 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/buckshotsharpnel.json @@ -0,0 +1,13 @@ +{ + "name": "Shrapnel Buckshot", + "icon": ["hbm:item.ammo_standard", 1, 79], + "trigger": [ + ["hbm:item.ammo_standard", 1, 79] + ], + "title": { + "en_US": "Shrapnel Buckshot" + }, + "content": { + "en_US": "A more devious version of standard buckshot, identical in most ways except that the pellets are incredibly bouncy, ricocheting off of most surfaces multiple times. May be hazardous to the user when used in enclosed spaces." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/demo.json b/src/main/resources/assets/hbm/manual/weapon/demo.json new file mode 100644 index 000000000..25adf2db1 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/demo.json @@ -0,0 +1,15 @@ +{ + "name": "Demolition Explosives", + "icon": ["hbm:item.ammo_standard", 1, 60], + "trigger": [ + ["hbm:item.ammo_standard", 1, 55], + ["hbm:item.ammo_standard", 1, 60], + ["hbm:item.ammo_standard", 1, 74] + ], + "title": { + "en_US": "Demolition Explosives" + }, + "content": { + "en_US": "Demolition explosives are similar to regular high-explosives, however they have a larger splash radius, slightly lower damage, and they break blocks. Not recommended for home defense." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/du.json b/src/main/resources/assets/hbm/manual/weapon/du.json new file mode 100644 index 000000000..d1300b631 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/du.json @@ -0,0 +1,16 @@ +{ + "name": "Depleted Uranium Bullet", + "icon": ["hbm:item.ammo_standard", 1, 32], + "trigger": [ + ["hbm:item.ammo_standard", 1, 89], + ["hbm:item.ammo_standard", 1, 32], + ["hbm:item.ammo_standard", 1, 37], + ["hbm:item.ammo_standard", 1, 80] + ], + "title": { + "en_US": "Depleted Uranium Bullet" + }, + "content": { + "en_US": "Ammunition with depleted uranium in its core. The increased density and higher powder load causes this ammo type to have even better armor-piercing properties than AP ammo. The added punch causes the projectiles to penetrate.

Due to their intended effect being kinetic energy, rather than being poisonous, depleted uranium ammunition is not subject to the Hague Conventions of 1899 regarding use of poisonous projectiles in warfare." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/express.json b/src/main/resources/assets/hbm/manual/weapon/express.json new file mode 100644 index 000000000..cc9cf2f9e --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/express.json @@ -0,0 +1,14 @@ +{ + "name": "FMJ Express Bullet", + "icon": ["hbm:item.ammo_standard", 1, 15], + "trigger": [ + ["hbm:item.ammo_standard", 1, 9], + ["hbm:item.ammo_standard", 1, 15] + ], + "title": { + "en_US": "FMJ Express Bullet" + }, + "content": { + "en_US": "FMJ Express is a special type of full metal jacket ammo for revolver calibers. Express ammo has the same armor-pericing effects in addition to increased damage. Express projectiles can penetrate their targets, but unlike AP rounds, Express projectiles become weaker on every penetration. Due to the higher powder load in combination with the basic gunmetal casing, Express ammo causes the gun to wear faster." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/flechettes.json b/src/main/resources/assets/hbm/manual/weapon/flechettes.json new file mode 100644 index 000000000..6442821f0 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/flechettes.json @@ -0,0 +1,13 @@ +{ + "name": "Flechettes", + "icon": ["hbm:item.ammo_standard", 1, 46], + "trigger": [ + ["hbm:item.ammo_standard", 1, 46] + ], + "title": { + "en_US": "Flechettes" + }, + "content": { + "en_US": "Flechettes are small fin-stabilized projectiles, contrary to buckshot's round pellets. Flechette shells have less spread and better armor-piercing compared to standard buckshot." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/fmj.json b/src/main/resources/assets/hbm/manual/weapon/fmj.json new file mode 100644 index 000000000..044b3f6f9 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/fmj.json @@ -0,0 +1,20 @@ +{ + "name": "Full Metal Jacket Bullet", + "icon": ["hbm:item.ammo_standard", 1, 29], + "trigger": [ + ["hbm:item.ammo_standard", 1, 6], + ["hbm:item.ammo_standard", 1, 12], + ["hbm:item.ammo_standard", 1, 17], + ["hbm:item.ammo_standard", 1, 21], + ["hbm:item.ammo_standard", 1, 86], + ["hbm:item.ammo_standard", 1, 25], + ["hbm:item.ammo_standard", 1, 29], + ["hbm:item.ammo_standard", 1, 34] + ], + "title": { + "en_US": "Full Metal Jacket Bullet" + }, + "content": { + "en_US": "FMJs do not deform when hitting a soft target, meaning they deliver less damage. However, it allows them to pierce armor more effectively. All FMJs have some armor-piercing properties, as well as added damage threshold negation based on the caliber size." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/grenade.json b/src/main/resources/assets/hbm/manual/weapon/grenade.json new file mode 100644 index 000000000..818eb3d03 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/grenade.json @@ -0,0 +1,14 @@ +{ + "name": "High-Explosives", + "icon": ["hbm:item.ammo_standard", 1, 58], + "trigger": [ + ["hbm:item.ammo_standard", 1, 53], + ["hbm:item.ammo_standard", 1, 58] + ], + "title": { + "en_US": "High-Explosives" + }, + "content": { + "en_US": "Standard ammunition for grenade and rocket launchers. Deals splash damage in a moderate area." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/he.json b/src/main/resources/assets/hbm/manual/weapon/he.json new file mode 100644 index 000000000..d8f01f4e1 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/he.json @@ -0,0 +1,17 @@ +{ + "name": "High-Explosive Ammunition", + "icon": ["hbm:item.ammo_standard", 1, 82], + "trigger": [ + ["hbm:item.ammo_standard", 1, 82], + ["hbm:item.ammo_standard", 1, 83], + ["hbm:item.ammo_standard", 1, 84], + ["hbm:item.ammo_standard", 1, 48], + ["hbm:item.ammo_standard", 1, 73] + ], + "title": { + "en_US": "High-Explosive Ammunition" + }, + "content": { + "en_US": "As one would expect, explosive ammunition deals explosive damage to its target, and the surroundings in a small radius. The resulting damage is noticably higher than the gun's base damage, at the cost of causing the gun to wear down significantly faster.

Use of explosive projectiles with a weight of less than 400 grams is prohibited by the Saint Petersburg Declaration of 1868." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/heat.json b/src/main/resources/assets/hbm/manual/weapon/heat.json new file mode 100644 index 000000000..f28b7f5de --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/heat.json @@ -0,0 +1,14 @@ +{ + "name": "Shaped Charges", + "icon": ["hbm:item.ammo_standard", 1, 59], + "trigger": [ + ["hbm:item.ammo_standard", 1, 54], + ["hbm:item.ammo_standard", 1, 59] + ], + "title": { + "en_US": "Shaped Charges" + }, + "content": { + "en_US": "Special type of explosive munition with weaker splash damage compared to high-explosives, which deals massive extra damage on direct hit." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/incendiary.json b/src/main/resources/assets/hbm/manual/weapon/incendiary.json new file mode 100644 index 000000000..25f8b4d04 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/incendiary.json @@ -0,0 +1,14 @@ +{ + "name": "Incendiary Munitions", + "icon": ["hbm:item.ammo_standard", 1, 61], + "trigger": [ + ["hbm:item.ammo_standard", 1, 56], + ["hbm:item.ammo_standard", 1, 61] + ], + "title": { + "en_US": "Incendiary Munitions" + }, + "content": { + "en_US": "Incendiary explosives leave behind lingering fire, which can ignite targets. The afterburn does not last very long, and can be extinguished with water.

Use of incendiary weapons against or near civilians is forbidden by the Geneva Conventions." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/jhp.json b/src/main/resources/assets/hbm/manual/weapon/jhp.json new file mode 100644 index 000000000..c87339669 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/jhp.json @@ -0,0 +1,20 @@ +{ + "name": "Jacketed Hollow Point Bullet", + "icon": ["hbm:item.ammo_standard", 1, 30], + "trigger": [ + ["hbm:item.ammo_standard", 1, 7], + ["hbm:item.ammo_standard", 1, 13], + ["hbm:item.ammo_standard", 1, 18], + ["hbm:item.ammo_standard", 1, 22], + ["hbm:item.ammo_standard", 1, 87], + ["hbm:item.ammo_standard", 1, 26], + ["hbm:item.ammo_standard", 1, 30], + ["hbm:item.ammo_standard", 1, 35] + ], + "title": { + "en_US": "Jacketed Hollow Point Bullet" + }, + "content": { + "en_US": "JHPs are deforming bullets that cause more damage to soft targets compared to soft point bullets, at the cost of faring worse against armored targets. JHPs also have a higher bonus on headshots.

Due to being expanding projectiles, jacketed hollow points are prohibited for use in warfare under the Hague Conventions of 1899." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/muke.json b/src/main/resources/assets/hbm/manual/weapon/muke.json new file mode 100644 index 000000000..357b973fe --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/muke.json @@ -0,0 +1,13 @@ +{ + "name": "High Yield Mini Nuke", + "icon": ["hbm:item.ammo_standard", 1, 75], + "trigger": [ + ["hbm:item.ammo_standard", 1, 75] + ], + "title": { + "en_US": "High Yield Mini Nuke" + }, + "content": { + "en_US": "nuclear bobm
" + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/powder.json b/src/main/resources/assets/hbm/manual/weapon/powder.json new file mode 100644 index 000000000..6727d8258 --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/powder.json @@ -0,0 +1,15 @@ +{ + "name": "Black Powder Ammunition", + "icon": ["hbm:item.ammo_standard", 1, 10], + "trigger": [ + ["hbm:item.ammo_standard", 1, 4], + ["hbm:item.ammo_standard", 1, 10], + ["hbm:item.ammo_standard", 1, 41] + ], + "title": { + "en_US": "Black Powder Ammunition" + }, + "content": { + "en_US": "The earliest available type of cartridge, black powder ammo is available for revolver calibers and 12 gauge shells. For revolver calibers, black powder bullets are a variant of soft point bullets. Black powder shells however are available in buckshot, magnum shot and slug variants. Black powder ammo is very cheap, but deals significantly less damage and causes a large cloud of smoke on every shot." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/slug.json b/src/main/resources/assets/hbm/manual/weapon/slug.json new file mode 100644 index 000000000..b5c848b2f --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/slug.json @@ -0,0 +1,15 @@ +{ + "name": "Slug", + "icon": ["hbm:item.ammo_standard", 1, 45], + "trigger": [ + ["hbm:item.ammo_standard", 1, 43], + ["hbm:item.ammo_standard", 1, 45], + ["hbm:item.ammo_standard", 1, 81] + ], + "title": { + "en_US": "Slug" + }, + "content": { + "en_US": "A shell type that only holds a single large projectile. Unlike shot, slugs do not have inherent spread, deall the gun's full damage on hit, and have some armor-piercing properties." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/softpoint.json b/src/main/resources/assets/hbm/manual/weapon/softpoint.json new file mode 100644 index 000000000..8ee31ec7d --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/softpoint.json @@ -0,0 +1,20 @@ +{ + "name": "Soft Point Bullet", + "icon": ["hbm:item.ammo_standard", 1, 28], + "trigger": [ + ["hbm:item.ammo_standard", 1, 5], + ["hbm:item.ammo_standard", 1, 11], + ["hbm:item.ammo_standard", 1, 16], + ["hbm:item.ammo_standard", 1, 20], + ["hbm:item.ammo_standard", 1, 85], + ["hbm:item.ammo_standard", 1, 24], + ["hbm:item.ammo_standard", 1, 28], + ["hbm:item.ammo_standard", 1, 33] + ], + "title": { + "en_US": "Soft Point Bullet" + }, + "content": { + "en_US": "The \"default\" ammunition type for most guns. Soft point bullets do not change the gun's base damage, and don't have any armor-piercing properties.

Due to being expanding projectiles, soft points are prohibited for use in warfare under the Hague Conventions of 1899." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/star.json b/src/main/resources/assets/hbm/manual/weapon/star.json new file mode 100644 index 000000000..aa690ea7f --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/star.json @@ -0,0 +1,13 @@ +{ + "name": "Starmetal Bullet", + "icon": ["hbm:item.ammo_standard", 1, 94], + "trigger": [ + ["hbm:item.ammo_standard", 1, 94] + ], + "title": { + "en_US": "Starmetal Bullet" + }, + "content": { + "en_US": "Cartridge with extra high powder load using a starmetal projectile. The density and stability of starmetal ensures that this projectile can punch through most armors, at the cost of the gun wearing ten times faster. Can only be used in anti-materiel rifles, as the chamber pressure is so high, it would blow automatic weapons apart." + } +} diff --git a/src/main/resources/assets/hbm/manual/weapon/wp.json b/src/main/resources/assets/hbm/manual/weapon/wp.json new file mode 100644 index 000000000..2340a8b5e --- /dev/null +++ b/src/main/resources/assets/hbm/manual/weapon/wp.json @@ -0,0 +1,15 @@ +{ + "name": "White Phosphorus Munitions", + "icon": ["hbm:item.ammo_standard", 1, 62], + "trigger": [ + ["hbm:item.ammo_standard", 1, 49], + ["hbm:item.ammo_standard", 1, 57], + ["hbm:item.ammo_standard", 1, 62] + ], + "title": { + "en_US": "White Phosphorus Munitions" + }, + "content": { + "en_US": "White phosphorus ignites easily and is very hard to extinguish, causing significant afterburn damage which cannot be permanently extinguished by water. Lingering fire caused by WP explosions lasts longer than by conventinal incendiary explosives.

Use of incendiary weapons against or near civilians is forbidden by the Geneva Conventions." + } +} diff --git a/src/main/resources/assets/hbm/textures/models/pheodoors/secure_door_grey.png b/src/main/resources/assets/hbm/textures/models/pheodoors/secure_door_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..96850da3dfeb2fe12a25e34a2ce0cea9d872e713 GIT binary patch literal 26741 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

BsM53&krZ&o+EG1KJeeW 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 a`QJ{4ahs881^T0c7)%W<4a#r1#QhJmPaL@b literal 0 HcmV?d00001