From e392d04e3c9f70ed6a4bfeea6bb1ac8202d404f2 Mon Sep 17 00:00:00 2001 From: UFFR Date: Thu, 13 Oct 2022 23:51:44 -0400 Subject: [PATCH] Done for this one Most issues are fixed and the new guns are implemented. A few bugs are still present, but they're minor. There are some code `TODO` notes I added, notably in the `HbmPotions` class. --- .../java/com/hbm/config/PotionConfig.java | 14 +- .../hbm/handler/guncfg/Gun50BMGFactory.java | 8 +- .../com/hbm/handler/guncfg/Gun9mmFactory.java | 9 +- .../hbm/handler/guncfg/GunEnergyFactory.java | 17 +- .../hbm/handler/guncfg/GunOSIPRFactory.java | 3 +- .../recipes/BlastFurnaceRecipes.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 6 +- .../hbm/items/weapon/ItemGunEnergyBase.java | 329 ++++++++++++++++++ .../java/com/hbm/items/weapon/ItemPagoda.java | 12 +- .../weapon/gununified/ItemEnergyGunBase.java | 63 ++-- .../java/com/hbm/lib/ModDamageSource.java | 80 ++--- .../java/com/hbm/main/ModEventHandler.java | 3 + src/main/java/com/hbm/potion/HbmPotion.java | 71 +++- .../hbm/render/item/weapon/ItemRenderM2.java | 11 +- src/main/resources/assets/hbm/lang/en_US.lang | 9 +- .../assets/hbm/textures/gui/potions.png | Bin 3989 -> 15066 bytes .../hbm/textures/items/singularity_micro.png | Bin 0 -> 645 bytes .../hbm/textures/models/weapons/HLR_final.png | Bin 0 -> 12558 bytes 18 files changed, 529 insertions(+), 108 deletions(-) create mode 100644 src/main/java/com/hbm/items/weapon/ItemGunEnergyBase.java create mode 100644 src/main/resources/assets/hbm/textures/items/singularity_micro.png create mode 100644 src/main/resources/assets/hbm/textures/models/weapons/HLR_final.png diff --git a/src/main/java/com/hbm/config/PotionConfig.java b/src/main/java/com/hbm/config/PotionConfig.java index d34c9128c..dc72cac77 100644 --- a/src/main/java/com/hbm/config/PotionConfig.java +++ b/src/main/java/com/hbm/config/PotionConfig.java @@ -15,7 +15,13 @@ public class PotionConfig { public static int phosphorusID = 70; public static int stabilityID = 71; public static int potionsicknessID = 72; - public static int deathID = 72; + public static int deathID = 73; + + public static int paralysisID = 74; + public static int fragileID = 75; + public static int unconsciousID = 76; + public static int perforatedID = 77; + public static int hollowID = 78; public static int potionSickness = 0; @@ -35,6 +41,12 @@ public class PotionConfig { potionsicknessID = CommonConfig.createConfigInt(config, CATEGORY_POTION, "8.10_potionsicknessID", "What potion ID the potion sickness effect will have", 72); deathID = CommonConfig.createConfigInt(config, CATEGORY_POTION, "8.11_deathID", "What potion ID the death effect will have", 73); + paralysisID = CommonConfig.createConfigInt(config, CATEGORY_POTION, "8.11_paralysisPotionID", "What potion ID will the paralysis effect have", 74); + fragileID = CommonConfig.createConfigInt(config, CATEGORY_POTION, "8.12_fragilePotionID", "What potion ID will the fragility effect have", 75); + unconsciousID = CommonConfig.createConfigInt(config, CATEGORY_POTION, "8.13_unconsciousPotionID", "What potion ID will the subconscious effect have", 76); + perforatedID = CommonConfig.createConfigInt(config, CATEGORY_POTION, "8.14_perforatedPotionID", "What potion ID will the perforated effect have", 77); + hollowID = CommonConfig.createConfigInt(config, CATEGORY_POTION, "8.15_hollowPotionID", "What potion ID will the hollow effect have", 78); + String s = CommonConfig.createConfigString(config, CATEGORY_POTION, "8.S0_potionSickness", "Valid configs include \"NORMAL\" and \"TERRARIA\", otherwise potion sickness is turned off", "OFF"); if("normal".equals(s.toLowerCase())) diff --git a/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java index 5aa5a8145..9d0ac4458 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java @@ -162,9 +162,9 @@ public class Gun50BMGFactory { bullet.incendiary = 10; bullet.effects = new ArrayList(); -// bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.fragile.id, 30 * 20, 2)); -// bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.perforated.id, 30 * 20, 2)); -// bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.lead.id, 30 * 20, 1)); + bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.fragile.id, 30 * 20, 2)); + bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.perforated.id, 30 * 20, 2)); + bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.lead.id, 30 * 20, 1)); bullet.blockDamage = true; bullet.bImpact = (projectile, x, y, z) -> projectile.worldObj.newExplosion(projectile, x, y, z, 5.0F, true, false); @@ -178,7 +178,7 @@ public class Gun50BMGFactory { bullet.ammo.meta = 1; bullet.incendiary = 50; -// bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.phosphorus.id, 30 * 30, 2)); + bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.phosphorus.id, 30 * 30, 2)); return bullet; } diff --git a/src/main/java/com/hbm/handler/guncfg/Gun9mmFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun9mmFactory.java index 2d417728b..0d2c60532 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun9mmFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun9mmFactory.java @@ -115,12 +115,11 @@ public class Gun9mmFactory { } static final float inaccuracy = 1.15f; - static byte i = 0; public static BulletConfiguration get9mmConfig() { BulletConfiguration bullet = BulletConfigFactory.standardPistolConfig(); - bullet.ammo = new ComparableStack(ModItems.ammo_9mm, 1, i++); + bullet.ammo = new ComparableStack(ModItems.ammo_9mm, 1, 0); bullet.spread *= inaccuracy; bullet.dmgMin = 10; bullet.dmgMax = 14; @@ -132,7 +131,7 @@ public class Gun9mmFactory { BulletConfiguration bullet = BulletConfigFactory.standardPistolConfig(); - bullet.ammo = new ComparableStack(ModItems.ammo_9mm, 1, i++); + bullet.ammo = new ComparableStack(ModItems.ammo_9mm, 1, 1); bullet.spread *= inaccuracy; bullet.dmgMin = 18; bullet.dmgMax = 20; @@ -147,7 +146,7 @@ public class Gun9mmFactory { BulletConfiguration bullet = BulletConfigFactory.standardPistolConfig(); - bullet.ammo = new ComparableStack(ModItems.ammo_9mm, 1, i++); + bullet.ammo = new ComparableStack(ModItems.ammo_9mm, 1, 2); bullet.spread *= inaccuracy; bullet.dmgMin = 22; bullet.dmgMax = 26; @@ -162,7 +161,7 @@ public class Gun9mmFactory { BulletConfiguration bullet = BulletConfigFactory.standardRocketConfig(); - bullet.ammo = new ComparableStack(ModItems.ammo_9mm, 1, i++); + bullet.ammo = new ComparableStack(ModItems.ammo_9mm, 1, 3); bullet.velocity = 5; bullet.explosive = 7.5F; bullet.trail = 5; diff --git a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java index e792971e6..82f4786d7 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunEnergyFactory.java @@ -844,9 +844,8 @@ public class GunEnergyFactory { bullet.destroysBlocks = true; bullet.effects = new ArrayList(); -// TODO -// bullet.effects.add(new PotionEffect(HbmPotion.fragile.id, 60 * 20, 4)); -// bullet.effects.add(new PotionEffect(HbmPotion.perforated.id, 60 * 20, 4)); + bullet.effects.add(new PotionEffect(HbmPotion.fragile.id, 60 * 20, 4)); + bullet.effects.add(new PotionEffect(HbmPotion.perforated.id, 60 * 20, 4)); //bullet.instakill = true; //bullet.style = BulletConfiguration.STYLE_ORB; @@ -875,9 +874,8 @@ public class GunEnergyFactory { bullet.doesPenetrate = true; bullet.effects = new ArrayList(); -// TODO -// bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.hollow.id, 2 * 20, 0)); -// bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.fragile.id, 5 * 20, 1)); + bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.hollow.id, 2 * 20, 0)); + bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.fragile.id, 5 * 20, 1)); bullet.bHit = (projectile, hit) -> {if (hit instanceof EntityLivingBase) ContaminationUtil.applyDigammaData(hit, 0.005F);}; @@ -915,10 +913,9 @@ public class GunEnergyFactory { bullet.doesPenetrate = true; bullet.effects = new ArrayList(); -// TODO -// bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.hollow.id, 5 * 20, 1)); -// bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.fragile.id, 7 * 20, 2)); -// bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.perforated.id, 3 * 20, 0)); + bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.hollow.id, 5 * 20, 1)); + bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.fragile.id, 7 * 20, 2)); + bullet.effects.add(HbmPotion.getPotionNoCure(HbmPotion.perforated.id, 3 * 20, 0)); bullet.bHurt = (projectile, hit) -> {if (hit instanceof EntityLivingBase) ContaminationUtil.applyDigammaData(hit, 0.01F);}; diff --git a/src/main/java/com/hbm/handler/guncfg/GunOSIPRFactory.java b/src/main/java/com/hbm/handler/guncfg/GunOSIPRFactory.java index 4967ef5b2..6057d267c 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunOSIPRFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunOSIPRFactory.java @@ -91,13 +91,14 @@ public class GunOSIPRFactory { return config; } - static final float inaccuracy = 1.5f; + static final float inaccuracy = 1.25f; public static BulletConfiguration getPulseConfig() { BulletConfiguration bullet = BulletConfigFactory.standardBulletConfig(); bullet.ammo = new ComparableStack(ModItems.gun_osipr_ammo); bullet.ammoCount = 30; + bullet.doesRicochet = false; bullet.spread *= inaccuracy; bullet.dmgMin = 15; bullet.dmgMax = 21; diff --git a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java index 95f00cc4a..b313dce56 100644 --- a/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/BlastFurnaceRecipes.java @@ -122,7 +122,7 @@ public class BlastFurnaceRecipes { final HashMap[], ItemStack> recipes = new HashMap<>(); for(Triplet recipe : blastFurnaceRecipes) { - if(isStackHidden(recipe.getZ())) { + if(!isStackHidden(recipe.getZ())) { final ItemStack nothing = new ItemStack(ModItems.nothing).setStackDisplayName("If you're reading this, an error has occured! Check the console."); final List in1 = new ArrayList(); final List in2 = new ArrayList(); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index ee2c1f5c9..d3bb81875 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -4269,11 +4269,11 @@ public class ModItems { gun_benelli = new ItemGunBase(Gun12GaugeFactory.getBenelliConfig()).setFull3D().setUnlocalizedName("gun_benelli").setCreativeTab(MainRegistry.weaponTab); gun_benelli_mod = new ItemGunBase(Gun12GaugeFactory.getBenelliModConfig()).setFull3D().setUnlocalizedName("gun_benelli_mod").setCreativeTab(MainRegistry.weaponTab); gun_twr = new ItemGunTWR(GunEnergyFactory.getTWRConfig()).setUnlocalizedName("gun_twr").setCreativeTab(MainRegistry.weaponTab); - gun_hlr = new ItemEnergyGunBase(GunEnergyFactory.getHLRPrimaryConfig(), GunEnergyFactory.getHLRSecondaryConfig()).setFull3D().setUnlocalizedName("gun_hlr").setCreativeTab(MainRegistry.weaponTab); + gun_hlr = new ItemGunEnergyBase(GunEnergyFactory.getHLRPrimaryConfig(), GunEnergyFactory.getHLRSecondaryConfig()).setFull3D().setUnlocalizedName("gun_hlr").setCreativeTab(MainRegistry.weaponTab); gun_mlr = new ItemGunBase(Gun556mmFactory.getMLRConfig()).setFull3D().setUnlocalizedName("gun_mlr").setCreativeTab(MainRegistry.weaponTab); gun_llr = new ItemGunBase(Gun9mmFactory.getLLRConfig()).setFull3D().setUnlocalizedName("gun_llr").setCreativeTab(MainRegistry.weaponTab); gun_lunatic_marksman = new ItemGunBase(Gun50BMGFactory.getLunaticMarksman()).setFull3D().setUnlocalizedName("gun_lunatic_marksman").setCreativeTab(MainRegistry.weaponTab); - pagoda = new ItemPagoda(); + pagoda = ItemPagoda.getSingleton(); ToolMaterial matCrucible = EnumHelper.addToolMaterial("CRUCIBLE", 10, 3, 50.0F, 100.0F, 0); crucible = new ItemCrucible(5000, 1F, matCrucible).setUnlocalizedName("crucible").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":crucible"); @@ -7069,7 +7069,7 @@ public class ModItems { GameRegistry.registerItem(gun_lunatic_marksman, gun_lunatic_marksman.getUnlocalizedName()); GameRegistry.registerItem(gun_hlr, gun_hlr.getUnlocalizedName()); GameRegistry.registerItem(gun_twr, gun_twr.getUnlocalizedName()); - GameRegistry.registerItem(pagoda, pagoda.getUnlocalizedName()); +// GameRegistry.registerItem(pagoda, pagoda.getUnlocalizedName()); //Ammo //GameRegistry.registerItem(gun_revolver_pip_ammo, gun_revolver_pip_ammo.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/weapon/ItemGunEnergyBase.java b/src/main/java/com/hbm/items/weapon/ItemGunEnergyBase.java new file mode 100644 index 000000000..c0d2bb585 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/ItemGunEnergyBase.java @@ -0,0 +1,329 @@ +package com.hbm.items.weapon; + +import java.util.List; + +import com.hbm.handler.GunConfiguration; +import com.hbm.interfaces.IHoldableWeapon; +import com.hbm.items.ModItems; +import com.hbm.lib.HbmCollection; +import com.hbm.packet.GunAnimationPacket; +import com.hbm.packet.PacketDispatcher; +import com.hbm.render.anim.HbmAnimations.AnimType; +import com.hbm.render.util.RenderScreenOverlay; +import com.hbm.render.util.RenderScreenOverlay.Crosshair; +import com.hbm.util.BobMathUtil; +import com.hbm.util.I18nUtil; + +import api.hbm.energy.IBatteryItem; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +public class ItemGunEnergyBase extends ItemGunBase implements IBatteryItem +{ + @SuppressWarnings("hiding") + public GunConfiguration mainConfig; + @SuppressWarnings("hiding") + public GunConfiguration altConfig; + public long maxCharge; + public long chargeRate; + + public ItemGunEnergyBase(GunConfiguration main) + { + super(main); + if (main.dischargePerShot > main.maxCharge) + throw new IllegalArgumentException("Energy consumption rate exceeds energy cap!"); + mainConfig = main; + maxCharge = mainConfig.maxCharge; + chargeRate = mainConfig.chargeRate; + } + + public ItemGunEnergyBase(GunConfiguration main, GunConfiguration alt) + { + super(main, alt); + if (main.dischargePerShot > main.maxCharge || alt.dischargePerShot > main.maxCharge) + throw new IllegalArgumentException("Energy consumption rate exceeds energy cap!"); + mainConfig = main; + altConfig = alt; + maxCharge = mainConfig.maxCharge; + chargeRate = mainConfig.chargeRate; + + } + // FIXME not working anymore + @Override + public boolean hasAmmo(ItemStack stack, EntityPlayer player, boolean main) + { + return getCharge(stack) >= (main ? mainConfig.dischargePerShot : altConfig.dischargePerShot); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) + { + final GunConfiguration mainConfigEnergy = mainConfig, altConfigEnergy = altConfig; + final long gunChargeMax = mainConfigEnergy.maxCharge; + final long gunCurrentCharge = getGunCharge(stack); + String gunChargeMaxString = BobMathUtil.getShortNumber(gunChargeMax); + String gunCurrentChargeString = BobMathUtil.getShortNumber(gunCurrentCharge); + list.add(I18nUtil.resolveKey(HbmCollection.charge, gunCurrentChargeString, gunChargeMaxString)); + list.add(I18nUtil.resolveKey(HbmCollection.chargeRate, BobMathUtil.getShortNumber(chargeRate))); +// list.add(String.format("Ammo: %s / %s", Math.floorDiv(gunCurrentCharge, mainConfigEnergy.ammoRate), Math.floorDiv(gunChargeMax, mainConfigEnergy.ammoRate))); + + list.add(I18nUtil.resolveKey(HbmCollection.ammo, I18nUtil.resolveKey(HbmCollection.ammoMag, Math.floorDiv(gunCurrentCharge, mainConfigEnergy.dischargePerShot), Math.floorDiv(gunChargeMax, mainConfigEnergy.dischargePerShot)))); + +// list.add(String.format("Ammo Type: Energy; %sHE per shot%s", Library.getShortNumber(mainConfigEnergy.ammoRate), altConfig != null ? "; " + Library.getShortNumber(altConfigEnergy.ammoRate) + "HE per alt shot" : "")); + + list.add(I18nUtil.resolveKey(HbmCollection.ammoEnergy, BobMathUtil.getShortNumber(mainConfigEnergy.dischargePerShot))); + if (altConfig != null) + list.add(I18nUtil.resolveKey(HbmCollection.altAmmoEnergy, BobMathUtil.getShortNumber(altConfigEnergy.dischargePerShot))); + + addAdditionalInformation(stack, list); + } + + @Override + public void useUpAmmo(EntityPlayer player, ItemStack stack, boolean main) + { + GunConfiguration config = (main ? mainConfig : (altConfig != null ? altConfig : null)); + + if (config == null) + return; + + dischargeBattery(stack, config.dischargePerShot); + } + + @Override + protected void altFire(ItemStack stack, World world, EntityPlayer player) + { + super.altFire(stack, world, player); + useUpAmmo(player, stack, false); + } + // TODO + @Override + protected void reload2(ItemStack stack, World world, EntityPlayer player) + { +// System.out.println("Started reload action"); +// if (getCharge(stack) >= getMaxCharge()) +// { +// System.out.println("Reload not needed"); +// setIsReloading(stack, false); +// return; +// } +// if (getReloadCycle(stack) < 0 && stack == player.getHeldItem()) +// { +// System.out.println("Needs reload!"); +// boolean hasReloaded = false; +// for (ItemStack playerSlot : player.inventory.mainInventory) +// { +//// ItemBatteryFast battery; +// System.out.println("Checking slot..."); +// if (playerSlot == null || !(playerSlot.getItem() instanceof ItemBatteryFast)) +// continue; +// System.out.println("Slot is good!"); +// hasReloaded = fastDischarge(player, stack, playerSlot); +// } +// +// if (getCharge(stack) >= getMaxCharge()) +// setIsReloading(stack, false); +// else +// resetReloadCycle(stack); +// System.out.println("Reload cycle complete"); +// if (hasReloaded && mainConfig.reloadSoundEnd) +// world.playSoundAtEntity(player, mainConfig.reloadSound.isEmpty() ? "hbm.item.battery" : mainConfig.reloadSound, 1.0F, 1.0F); +// } +// else +// setReloadCycle(stack, getReloadCycle(stack) - 1); +// +// if(stack != player.getHeldItem()) +// { +// setReloadCycle(stack, 0); +// setIsReloading(stack, false); +// } + + } + // TODO + @Override + public boolean canReload(ItemStack stack, World world, EntityPlayer player) + { +// if (getCharge(stack) == getMaxCharge()) +// return false; +// for (ItemStack playerStack : player.inventory.mainInventory) +// { +// if (playerStack == null || !(playerStack.getItem() instanceof ItemBatteryFast)) +// continue; +// +// return IBatteryItem.getChargeStatic(playerStack) > 0; +// } + return false; + } + + @Override + public void startReloadAction(ItemStack stack, World world, EntityPlayer player) + { + System.out.println("Trying to start reload cycle"); + if (getCharge(stack) == getMaxCharge() || getIsReloading(stack)) + return; + + if (!mainConfig.reloadSoundEnd) + world.playSoundAtEntity(player, mainConfig.reloadSound.isEmpty() ? "hbm:item.battery" : mainConfig.reloadSound, 1.0F, 1.0F); + + PacketDispatcher.wrapper.sendTo(new GunAnimationPacket(AnimType.RELOAD.ordinal()), (EntityPlayerMP) player); + + setIsReloading(stack, true); + resetReloadCycle(stack); + } + + @Override + public void chargeBattery(ItemStack stack, long i) + { + if(stack.getItem() instanceof ItemGunEnergyBase) + { + if(stack.hasTagCompound()) + { + stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") + i); + } + else + { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", i); + } + } + } + + @Override + public void setCharge(ItemStack stack, long i) + { + if(stack.getItem() instanceof ItemGunEnergyBase) + { + if(stack.hasTagCompound()) + { + stack.stackTagCompound.setLong("charge", i); + } + else + { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", i); + } + } + } + + @Override + public void dischargeBattery(ItemStack stack, long i) + { + if(stack.getItem() instanceof ItemGunEnergyBase) + { + if(stack.hasTagCompound()) + { + stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") - i); + } + else + { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", this.maxCharge - i); + } + } + } + + @Override + public long getCharge(ItemStack stack) + { + if(stack.getItem() instanceof ItemGunEnergyBase) + { + if(stack.hasTagCompound()) + { + return stack.stackTagCompound.getLong("charge"); + } + else + { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", ((ItemGunEnergyBase) stack.getItem()).maxCharge); + return stack.stackTagCompound.getLong("charge"); + } + } + return 0; + } + @Deprecated + public static ItemStack getEmptyGun(Item itemIn) + { + if (itemIn instanceof ItemGunEnergyBase) + { + ItemStack stack = new ItemStack(itemIn); + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", 0); + return stack.copy(); + } + return null; + } + + @Override + @SideOnly(Side.CLIENT) + public void renderHUD(Pre event, ElementType type, EntityPlayer player, ItemStack stack) + { +// ItemGunEnergyBase gun = (ItemGunEnergyBase)stack.getItem(); + if (type == ElementType.HOTBAR) + { + int ammoRemaining = (int)Math.floorDiv(getCharge(stack), mainConfig.dischargePerShot); + int ammoMax = (int)Math.floorDiv(getMaxCharge(), mainConfig.dischargePerShot); + int dura = getItemWear(stack) * 50 / mainConfig.durability; + + RenderScreenOverlay.renderAmmo(event.resolution, Minecraft.getMinecraft().ingameGUI, new ItemStack(ModItems.battery_creative), ammoRemaining, ammoMax, dura, mainConfig.showAmmo); + } + if (type == ElementType.CROSSHAIRS) + { + event.setCanceled(true); + + RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, !(mainConfig.hasSights && player.isSneaking()) ? ((IHoldableWeapon)player.getHeldItem().getItem()).getCrosshair() : Crosshair.NONE); + } + } + + public static void writeNBTLong(ItemStack stack, String key, long value) + { + if (!stack.hasTagCompound()) + stack.stackTagCompound = new NBTTagCompound(); + + stack.stackTagCompound.setLong(key, value); + } + + public static long readNBTLong(ItemStack stack, String key) + { + if (!stack.hasTagCompound()) + stack.stackTagCompound = new NBTTagCompound(); + + return stack.stackTagCompound.getLong(key); + } + + public static void setGunCharge(ItemStack stack, long i) + { + writeNBTLong(stack, "charge", i); + } + + public static long getGunCharge(ItemStack stack) + { + return readNBTLong(stack, "charge"); + } + + + @Override + public long getMaxCharge() + { + return maxCharge; + } + + @Override + public long getChargeRate() + { + return chargeRate; + } + + @Override + public long getDischargeRate() + { + return 0; + } +} diff --git a/src/main/java/com/hbm/items/weapon/ItemPagoda.java b/src/main/java/com/hbm/items/weapon/ItemPagoda.java index 3ec6566ef..40bc1641b 100644 --- a/src/main/java/com/hbm/items/weapon/ItemPagoda.java +++ b/src/main/java/com/hbm/items/weapon/ItemPagoda.java @@ -24,16 +24,26 @@ import net.minecraft.world.World; public class ItemPagoda extends Item implements IClickReceiver { + private static ItemPagoda SELF; + private static final String KEY_CHARGE = "PAGODA_CHARGE", KEY_CHARGING = "PAGODA_CHARGING"; private static final short MAX_CHARGE = 1200; private static final byte MAX_RADIUS = 20; - public ItemPagoda() + private ItemPagoda() { setMaxStackSize(1); setFull3D(); setUnlocalizedName("pagoda"); setCreativeTab(MainRegistry.weaponTab); } + + public static ItemPagoda getSingleton() + { + if (SELF == null) + SELF = new ItemPagoda(); + + return SELF; + } @Override public synchronized boolean handleMouseInput(ItemStack stack, EntityPlayer player, int button, boolean state) diff --git a/src/main/java/com/hbm/items/weapon/gununified/ItemEnergyGunBase.java b/src/main/java/com/hbm/items/weapon/gununified/ItemEnergyGunBase.java index b89869fc9..65554797c 100644 --- a/src/main/java/com/hbm/items/weapon/gununified/ItemEnergyGunBase.java +++ b/src/main/java/com/hbm/items/weapon/gununified/ItemEnergyGunBase.java @@ -9,32 +9,23 @@ import com.hbm.entity.projectile.EntityBulletBase; import com.hbm.handler.BulletConfigSyncingUtil; import com.hbm.handler.BulletConfiguration; import com.hbm.handler.GunConfiguration; -import com.hbm.handler.HbmKeybinds; import com.hbm.interfaces.IHoldableWeapon; -import com.hbm.items.machine.ItemBattery; import com.hbm.items.weapon.ItemGunBase; -import com.hbm.main.MainRegistry; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.GunAnimationPacket; import com.hbm.packet.GunButtonPacket; import com.hbm.packet.PacketDispatcher; -import com.hbm.packet.PlayerInformPacket; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay; import com.hbm.render.util.RenderScreenOverlay.Crosshair; import com.hbm.util.BobMathUtil; import com.hbm.util.ChatBuilder; -import com.hbm.util.I18nUtil; import api.hbm.energy.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.I18n; -import net.minecraft.client.settings.GameSettings; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; @@ -56,28 +47,30 @@ public class ItemEnergyGunBase extends ItemGunBase implements IBatteryItem { } @Override -public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { list.add("Energy Stored: " + BobMathUtil.getShortNumber(getCharge(stack)) + "/" + BobMathUtil.getShortNumber(mainConfig.maxCharge) + "HE"); list.add("Charge rate: " + BobMathUtil.getShortNumber(mainConfig.chargeRate) + "HE/t"); - BulletConfiguration config = getConfig(stack); +// BulletConfiguration config = getConfig(stack); +// +// list.add(""); +// list.add("Mode: " + I18nUtil.resolveKey(config.modeName)); +// list.add("Mode info:"); +// list.add("Average damage: " + ((config.dmgMax + config.dmgMin) / 2F)); +// list.add("Firing Rate: " + BobMathUtil.roundDecimal((1F / ((config.firingRate) / 20F)), 2) + " rounds per second"); +// list.add("Power Consumption per Shot: " + BobMathUtil.getShortNumber(config.dischargePerShot) + "HE"); +// +// list.add(""); +// list.add("Name: " + mainConfig.name); +// list.add("Manufacturer: " + mainConfig.manufacturer); +// +// if(!mainConfig.comment.isEmpty()) { +// list.add(""); +// for(String s : mainConfig.comment) +// list.add(EnumChatFormatting.ITALIC + s); +// } - list.add(""); - list.add("Mode: " + I18nUtil.resolveKey(config.modeName)); - list.add("Mode info:"); - list.add("Average damage: " + ((float)(config.dmgMax + config.dmgMin) / 2F)); - list.add("Firing Rate: " + BobMathUtil.roundDecimal((1F / (((float)config.firingRate) / 20F)), 2) + " rounds per second"); - list.add("Power Consumption per Shot: " + BobMathUtil.getShortNumber(config.dischargePerShot) + "HE"); - - list.add(""); - list.add("Name: " + mainConfig.name); - list.add("Manufacturer: " + mainConfig.manufacturer); - - if(!mainConfig.comment.isEmpty()) { - list.add(""); - for(String s : mainConfig.comment) - list.add(EnumChatFormatting.ITALIC + s); - } + addAdditionalInformation(stack, list); } @Override @@ -114,6 +107,7 @@ public void addInformation(ItemStack stack, EntityPlayer player, List list, bool } } + @Override protected void updateServer(ItemStack stack, World world, EntityPlayer player, int slot, boolean isCurrentItem) { if(getDelay(stack) > 0 && isCurrentItem) @@ -134,6 +128,7 @@ public void addInformation(ItemStack stack, EntityPlayer player, List list, bool } } + @Override protected boolean tryShoot(ItemStack stack, World world, EntityPlayer player, boolean main) { @@ -144,6 +139,7 @@ public void addInformation(ItemStack stack, EntityPlayer player, List list, bool return false; } + @Override protected void fire(ItemStack stack, World world, EntityPlayer player) { BulletConfiguration config = getConfig(stack); @@ -159,7 +155,7 @@ public void addInformation(ItemStack stack, EntityPlayer player, List list, bool spawnProjectile(world, player, stack, BulletConfigSyncingUtil.getKey(config)); } - setCharge(stack, getCharge(stack) - config.dischargePerShot);; + setCharge(stack, getCharge(stack) - config.dischargePerShot); } world.playSoundAtEntity(player, mainConfig.firingSound, 1.0F, mainConfig.firingPitch); @@ -172,6 +168,7 @@ public void addInformation(ItemStack stack, EntityPlayer player, List list, bool } } + @Override protected void spawnProjectile(World world, EntityPlayer player, ItemStack stack, int config) { EntityBulletBase bullet = new EntityBulletBase(world, config, player); @@ -182,9 +179,10 @@ public void addInformation(ItemStack stack, EntityPlayer player, List list, bool } + @Override public void startAction(ItemStack stack, World world, EntityPlayer player, boolean main) { - if(mainConfig.firingMode == mainConfig.FIRE_MANUAL && main && tryShoot(stack, world, player, main)) { + if(mainConfig.firingMode == GunConfiguration.FIRE_MANUAL && main && tryShoot(stack, world, player, main)) { fire(stack, world, player); setDelay(stack, mainConfig.rateOfFire); @@ -218,10 +216,12 @@ public void addInformation(ItemStack stack, EntityPlayer player, List list, bool // yummy boilerplate + @Override public boolean showDurabilityBar(ItemStack stack) { return true; } + @Override public double getDurabilityForDisplay(ItemStack stack) { return 1D - (double) getCharge(stack) / (double) getMaxCharge(); } @@ -321,10 +321,7 @@ public void addInformation(ItemStack stack, EntityPlayer player, List list, bool event.setCanceled(true); - if(!(mainConfig.hasSights && player.isSneaking())) - RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, ((IHoldableWeapon)player.getHeldItem().getItem()).getCrosshair()); - else - RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, Crosshair.NONE); + RenderScreenOverlay.renderCustomCrosshairs(event.resolution, Minecraft.getMinecraft().ingameGUI, (mainConfig.hasSights && player.isSneaking()) ? Crosshair.NONE : ((IHoldableWeapon)player.getHeldItem().getItem()).getCrosshair()); } } diff --git a/src/main/java/com/hbm/lib/ModDamageSource.java b/src/main/java/com/hbm/lib/ModDamageSource.java index a477d929c..3e9065c97 100644 --- a/src/main/java/com/hbm/lib/ModDamageSource.java +++ b/src/main/java/com/hbm/lib/ModDamageSource.java @@ -14,46 +14,48 @@ import net.minecraft.util.EntityDamageSourceIndirect; public class ModDamageSource extends DamageSource { - public static DamageSource nuclearBlast = (new DamageSource("nuclearBlast")).setExplosion(); - public static DamageSource mudPoisoning = (new DamageSource("mudPoisoning")).setDamageBypassesArmor(); - public static DamageSource acid = (new DamageSource("acid")).setDamageBypassesArmor(); - public static DamageSource euthanizedSelf = (new DamageSource("euthanizedSelf")).setDamageBypassesArmor(); - public static DamageSource euthanizedSelf2 = (new DamageSource("euthanizedSelf2")).setDamageBypassesArmor(); - public static DamageSource tauBlast = (new DamageSource("tauBlast")).setDamageBypassesArmor(); - public static DamageSource radiation = (new DamageSource("radiation")).setDamageBypassesArmor(); - public static DamageSource digamma = (new DamageSource("digamma")).setDamageIsAbsolute().setDamageBypassesArmor().setDamageAllowedInCreativeMode(); - public static DamageSource suicide = (new DamageSource("suicide")).setProjectile(); - public static DamageSource teleporter = (new DamageSource("teleporter")).setDamageIsAbsolute(); - public static DamageSource cheater = (new DamageSource("cheater")).setDamageIsAbsolute().setDamageBypassesArmor().setDamageAllowedInCreativeMode(); - public static DamageSource rubble = (new DamageSource("rubble")).setProjectile(); - public static DamageSource shrapnel = (new DamageSource("shrapnel")).setProjectile(); - public static DamageSource blackhole = (new DamageSource("blackhole")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource turbofan = (new DamageSource("blender")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource meteorite = (new DamageSource("meteorite")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource boxcar = (new DamageSource("boxcar")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource boat = (new DamageSource("boat")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource building = (new DamageSource("building")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource taint = (new DamageSource("taint")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource ams = (new DamageSource("ams")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource amsCore = (new DamageSource("amsCore")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource broadcast = (new DamageSource("broadcast")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource bang = (new DamageSource("bang")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource pc = (new DamageSource("pc")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource cloud = (new DamageSource("cloud")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource lead = (new DamageSource("lead")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource enervation = (new DamageSource("enervation")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource electricity = (new DamageSource("electricity")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource exhaust = (new DamageSource("exhaust")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource spikes = (new DamageSource("spikes")).setDamageBypassesArmor(); - public static DamageSource lunar = (new DamageSource("lunar")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource monoxide = (new DamageSource("monoxide")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource asbestos = (new DamageSource("asbestos")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource blacklung = (new DamageSource("blacklung")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource mku = (new DamageSource("mku")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource vacuum = (new DamageSource("vacuum")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource overdose = (new DamageSource("overdose")).setDamageIsAbsolute().setDamageBypassesArmor(); - public static DamageSource microwave = (new DamageSource("microwave")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource nuclearBlast = (new DamageSource("nuclearBlast")).setExplosion(); + public static final DamageSource mudPoisoning = (new DamageSource("mudPoisoning")).setDamageBypassesArmor(); + public static final DamageSource acid = (new DamageSource("acid")).setDamageBypassesArmor(); + public static final DamageSource euthanizedSelf = (new DamageSource("euthanizedSelf")).setDamageBypassesArmor(); + public static final DamageSource euthanizedSelf2 = (new DamageSource("euthanizedSelf2")).setDamageBypassesArmor(); + public static final DamageSource tauBlast = (new DamageSource("tauBlast")).setDamageBypassesArmor(); + public static final DamageSource radiation = (new DamageSource("radiation")).setDamageBypassesArmor(); + public static final DamageSource digamma = (new DamageSource("digamma")).setDamageIsAbsolute().setDamageBypassesArmor().setDamageAllowedInCreativeMode(); + public static final DamageSource suicide = (new DamageSource("suicide")).setProjectile(); + public static final DamageSource teleporter = (new DamageSource("teleporter")).setDamageIsAbsolute(); + public static final DamageSource cheater = (new DamageSource("cheater")).setDamageIsAbsolute().setDamageBypassesArmor().setDamageAllowedInCreativeMode(); + public static final DamageSource rubble = (new DamageSource("rubble")).setProjectile(); + public static final DamageSource shrapnel = (new DamageSource("shrapnel")).setProjectile(); + public static final DamageSource blackhole = (new DamageSource("blackhole")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource turbofan = (new DamageSource("blender")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource meteorite = (new DamageSource("meteorite")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource boxcar = (new DamageSource("boxcar")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource boat = (new DamageSource("boat")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource building = (new DamageSource("building")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource taint = (new DamageSource("taint")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource ams = (new DamageSource("ams")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource amsCore = (new DamageSource("amsCore")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource broadcast = (new DamageSource("broadcast")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource bang = (new DamageSource("bang")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource pc = (new DamageSource("pc")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource cloud = (new DamageSource("cloud")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource lead = (new DamageSource("lead")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource enervation = (new DamageSource("enervation")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource electricity = (new DamageSource("electricity")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource exhaust = (new DamageSource("exhaust")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource spikes = (new DamageSource("spikes")).setDamageBypassesArmor(); + public static final DamageSource lunar = (new DamageSource("lunar")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource monoxide = (new DamageSource("monoxide")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource asbestos = (new DamageSource("asbestos")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource blacklung = (new DamageSource("blacklung")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource mku = (new DamageSource("mku")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource vacuum = (new DamageSource("vacuum")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource overdose = (new DamageSource("overdose")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource microwave = (new DamageSource("microwave")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final DamageSource bleed = (new DamageSource("bleed")).setDamageIsAbsolute().setDamageBypassesArmor(); + public static final String s_bullet = "revolverBullet"; public static final String s_emplacer = "chopperBullet"; public static final String s_tau = "tau"; diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index 177ec8055..2d1b12a2f 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -943,6 +943,9 @@ public class ModEventHandler { props.lastDamage = player.ticksExisted; } + if (e.isPotionActive(HbmPotion.fragile)) + event.ammount *= e.getActivePotionEffect(HbmPotion.fragile).getAmplifier() + 1; + if(HbmLivingProps.getContagion(e) > 0 && event.ammount < 100) event.ammount *= 2F; diff --git a/src/main/java/com/hbm/potion/HbmPotion.java b/src/main/java/com/hbm/potion/HbmPotion.java index 9e36909fc..62c141e55 100644 --- a/src/main/java/com/hbm/potion/HbmPotion.java +++ b/src/main/java/com/hbm/potion/HbmPotion.java @@ -12,6 +12,7 @@ import com.hbm.explosion.ExplosionLarge; import com.hbm.extprop.HbmLivingProps; import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; +import com.hbm.main.MainRegistry; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; import com.hbm.util.ContaminationUtil.HazardType; @@ -21,10 +22,12 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.passive.EntityCow; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; import net.minecraft.util.ResourceLocation; public class HbmPotion extends Potion { @@ -41,6 +44,13 @@ public class HbmPotion extends Potion { public static HbmPotion stability; public static HbmPotion potionsickness; public static HbmPotion death; + + // Someone with better technical knowledge, implement these better + public static HbmPotion paralysis; + public static HbmPotion fragile; + public static HbmPotion unconscious; + public static HbmPotion perforated; + public static HbmPotion hollow; public HbmPotion(int id, boolean isBad, int color) { super(id, isBad, color); @@ -59,6 +69,12 @@ public class HbmPotion extends Potion { stability = registerPotion(PotionConfig.stabilityID, false, 0xD0D0D0, "potion.hbm_stability", 2, 1); potionsickness = registerPotion(PotionConfig.potionsicknessID, false, 0xff8080, "potion.hbm_potionsickness", 3, 1); death = registerPotion(PotionConfig.deathID, false, 1118481, "potion.hbm_death", 4, 1); + + paralysis = registerPotion(PotionConfig.paralysisID, true, 0x808080, "potion.hbm_paralysis", 7, 1); + fragile = registerPotion(PotionConfig.fragileID, true, 0x00FFFF, "potion.hbm_fragile", 6, 1); + unconscious = registerPotion(PotionConfig.unconsciousID, false, 0xFF80ED, "potion.hbm_unconscious", 0, 2); + perforated = registerPotion(PotionConfig.perforatedID, true, 0xFF0000, "potion.hbm_perforated", 1, 2); + hollow = registerPotion(PotionConfig.hollowID, true, 0x000000, "potion.hbm_hollow", 2, 2); } public static HbmPotion registerPotion(int id, boolean isBad, int color, String name, int x, int y) { @@ -79,7 +95,7 @@ public class HbmPotion extends Potion { field.set(null, newArray); } catch (Exception e) { - + MainRegistry.logger.catching(e); } } @@ -98,6 +114,8 @@ public class HbmPotion extends Potion { return super.getStatusIconIndex(); } + // TODO Possibly change to a switch since potions can be represented by integer IDs + @Override public void performEffect(EntityLivingBase entity, int level) { if(this == taint) { @@ -120,7 +138,7 @@ public class HbmPotion extends Potion { } } if(this == radiation) { - ContaminationUtil.contaminate(entity, HazardType.RADIATION, ContaminationType.CREATIVE, (float)(level + 1F) * 0.05F); + ContaminationUtil.contaminate(entity, HazardType.RADIATION, ContaminationType.CREATIVE, (level + 1F) * 0.05F); } if(this == radaway) { @@ -163,15 +181,43 @@ public class HbmPotion extends Potion { entity.setFire(1); } + + // FIXME This effect is supposed to do as it sounds, but this method is super jank and probably doesn't even work right + if (this == paralysis) + { + if (entity.getEntityAttribute(SharedMonsterAttributes.attackDamage) != null) + func_111184_a(SharedMonsterAttributes.attackDamage, "648D7064-6A60-4F59-8ABE-C2C23A6DD7A9", -100, 2); + + func_111184_a(SharedMonsterAttributes.movementSpeed, "7107DE5E-7CE8-4030-940E-514C1F160890", -100, 2); + + if (entity.motionY > 0) + entity.motionY = -2; + } + + // These two should be fine + if (this == perforated) + entity.attackEntityFrom(ModDamageSource.bleed, (level + 3)); + + if (this == hollow) + { +// if (level > 2) +// ContaminationUtil.applyDigammaDirect(entity, (level + 1F) * 0.5F); +// else +// ContaminationUtil.applyDigammaData(entity, (level + 1F) * 0.25F); + + ContaminationUtil.contaminate(entity, HazardType.DIGAMMA, ContaminationType.DIGAMMA, (level + 1F) > 2 ? 0.005F : 0.0025F); + } } + // TODO Ditto + @Override public boolean isReady(int par1, int par2) { if(this == taint) { return par1 % 2 == 0; } - if(this == radiation || this == radaway || this == telekinesis || this == phosphorus) { + if(this == radiation || this == radaway || this == telekinesis || this == phosphorus || this == hollow || this == paralysis || this == fragile) { return true; } @@ -184,6 +230,9 @@ public class HbmPotion extends Potion { return k > 0 ? par1 % k == 0 : true; } + if (this == perforated) + return par1 % 30 == 0; + return false; } @@ -198,4 +247,20 @@ public class HbmPotion extends Potion { return false; } } + + public static PotionEffect getPotionNoCure(int id, int dura, int level) + { + final PotionEffect potion = new PotionEffect(id, dura, level); + potion.getCurativeItems().clear(); + return potion; + } + + public static PotionEffect getPotionWithCures(int id, int dura, int level, ItemStack...stacks) + { + final PotionEffect potion = new PotionEffect(id, dura, level); + for (ItemStack stack : stacks) + potion.addCurativeItem(stack); + return potion; + } + } diff --git a/src/main/java/com/hbm/render/item/weapon/ItemRenderM2.java b/src/main/java/com/hbm/render/item/weapon/ItemRenderM2.java index c6080c459..875e4b40a 100644 --- a/src/main/java/com/hbm/render/item/weapon/ItemRenderM2.java +++ b/src/main/java/com/hbm/render/item/weapon/ItemRenderM2.java @@ -29,17 +29,16 @@ public class ItemRenderM2 extends ItemRenderBase GL11.glScalef(scale1, scale1, -scale1); // GL11.glRotatef(10, 1, 0, 0); GL11.glRotatef(-90, 0, 1, 0); - GL11.glTranslatef(0, -2, -2); - GL11.glRotatef(20, 1, 0, 0); + GL11.glTranslatef(0, 0.5f, -5); + GL11.glRotatef(30, 1, 0, 0); break; case EQUIPPED_FIRST_PERSON: GL11.glRotatef(-90, 0, 1, 0); if (Minecraft.getMinecraft().thePlayer.isSneaking()) { - GL11.glTranslatef(-0.95f, -0.9f, -2); - GL11.glRotatef(-5, 0, 1, 1); - } - else + GL11.glTranslatef(-0.96f, -0.9f, -2); + GL11.glRotatef(-5.6f, 0, 1, 1); + } else GL11.glTranslatef(0, -1, -3); GL11.glRotatef(25, 1, 0, 0); break; diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index edd0887fc..bb7da58a6 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -593,6 +593,7 @@ death.attack.amsCore=%1$s was vaporized in the fire of a singularity. death.attack.asbestos=%1$s is now entitled to financial compensation. death.attack.bang=%1$s was blasted into bite-sized pieces. death.attack.blackhole=%1$s was spaghettified. +death.attack.bleed=%1$s had their organs leak out of their perforations. death.attack.blender=%1$s was chopped in small, bite-sized pieces. death.attack.boat=%1$s was hit by a boat. death.attack.boil=%1$s was boiled alive by %2$s. @@ -648,6 +649,10 @@ death.attack.taint=%1$s died from flux tumors. death.attack.tau=%1$s was riddeled by %2$s using negatively charged tauons. death.attack.tauBlast=%1$s charged the XVL1456 for too long and was blown into pieces. death.attack.teleporter=%1$s was teleported into nothingness. +death.attack.twr0=%1$s was shattered into a million shards of light. +death.attack.twr1=%1$s found out there was no exit. +death.attack.twr2=%2$s shattered %1$s into a million shards of light. +death.attack.twr3=%2$s showed %1$s that there was no exit. desc.item.pileRod=§eUse on drilled graphite to insert$§eUse screwdriver to extract$ desc.item.rtgDecay=Decays to: %s @@ -930,7 +935,7 @@ gun.name.lunaGun=1978 Rāhula type Standard Issue Sidearm (Revision 2) gun.name.lunaHLR=1944 Chang'e type Light Machine Gun gun.name.lunaShotty=1978 Guan Yu type Scattergun (Revision 1) gun.name.lunaSMG=1956 Ānanda type Submachine Gun -gun.name.lunaSniper=1909 Hou Yi type Anti-Material Rifle +gun.name.lunaSniper=1915 Hou Yi type Anti-Material Rifle gun.name.lunaTWR=Time Warp Rifle gun.name.m2=Browning machine gun, cal. .50, M2, HB gun.name.m42=M-42 Tactical Nuclear Catapult @@ -3415,6 +3420,8 @@ item.shimmer_head.name=Heavy Hammer Head item.shimmer_sledge.name=Shimmer Sledge item.singularity.name=Singularity item.singularity_counter_resonant.name=Contained Counter-Resonant Singularity +item.singularity_micro.desc=A wee lad! +item.singularity_micro.name=Micro-Singularity item.singularity_spark.name=Spark Singularity item.singularity_super_heated.name=Superheated Resonating Singularity item.siox.name=SiOX Cancer Medication diff --git a/src/main/resources/assets/hbm/textures/gui/potions.png b/src/main/resources/assets/hbm/textures/gui/potions.png index 09759f2f957ee9e9467fe0fdf6d592a326a6ede7..4296988abb790d5ef8822acc88ced56f010a781e 100644 GIT binary patch literal 15066 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 W4WfVXU2pOJT?3X^m#dO74gEixj-i?W delta 3698 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/weapons/HLR_final.png b/src/main/resources/assets/hbm/textures/models/weapons/HLR_final.png new file mode 100644 index 0000000000000000000000000000000000000000..bbfa8f3022e1c3524cb42d72dc24f75d890bf7a4 GIT binary patch literal 12558 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 literal 0 HcmV?d00001