From ccad3d23d058b33193edba709d4dccf1a8ee9847 Mon Sep 17 00:00:00 2001 From: IcyClawz Date: Wed, 23 Oct 2024 00:49:39 +0300 Subject: [PATCH] Add missing ammo attributes --- MunitionsExpert/MunitionsExpert.cs | 91 ++++++++++++++++++++++++-- MunitionsExpert/MunitionsExpert.csproj | 2 +- MunitionsExpert/Plugin.cs | 2 +- 3 files changed, 86 insertions(+), 9 deletions(-) diff --git a/MunitionsExpert/MunitionsExpert.cs b/MunitionsExpert/MunitionsExpert.cs index c5381eb..36e1f74 100644 --- a/MunitionsExpert/MunitionsExpert.cs +++ b/MunitionsExpert/MunitionsExpert.cs @@ -31,7 +31,7 @@ internal static class ColorCache [ColorName.Silver] = new Color32(150, 150, 150, ALPHA), [ColorName.Tan] = new Color32(175, 145, 100, ALPHA), [ColorName.Violet] = new Color32(80, 50, 180, ALPHA), - [ColorName.Yellow] = new Color32(170, 170, 0, ALPHA) + [ColorName.Yellow] = new Color32(170, 170, 0, ALPHA), }; public static Color Get(ColorName name) => Cache.TryGetValue(name, out Color color) ? color : default; @@ -60,7 +60,7 @@ internal static class IconCache { [EAmmoExtraAttributeId.ArmorDamage] = Properties.Resources.ArmorDamage.ToSprite(), [EAmmoExtraAttributeId.FragmentationChance] = Properties.Resources.FragmentationChance.ToSprite(), - [EAmmoExtraAttributeId.RicochetChance] = Properties.Resources.RicochetChance.ToSprite() + [EAmmoExtraAttributeId.RicochetChance] = Properties.Resources.RicochetChance.ToSprite(), }; public static Sprite Get(Enum id) => Cache.TryGetValue(id, out Sprite sprite) ? sprite : default; @@ -68,6 +68,15 @@ internal static class IconCache internal static class AmmoTemplateExtensions { + private static readonly float MaxMalfMisfireChance = (float) + typeof(AmmoTemplate).GetField("MaxMalfMisfireChance", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null); + + private static readonly float MaxMalfFeedChance = (float) + typeof(AmmoTemplate).GetField("MaxMalfFeedChance", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null); + + private static readonly string[] MalfChancesKeys = (string[]) + typeof(AmmoTemplate).GetField("MalfChancesKeys", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null); + private static readonly FieldInfo CachedQualitiesField = typeof(AmmoTemplate).GetField("_cachedQualities", BindingFlags.NonPublic | BindingFlags.Instance); @@ -82,7 +91,27 @@ internal static class AmmoTemplateExtensions DisplayNameFunc = () => "Armor damage", Base = () => instance.ArmorDamage, StringValue = () => $"{instance.ArmorDamage}%", - DisplayType = () => EItemAttributeDisplayType.Compact + DisplayType = () => EItemAttributeDisplayType.Compact, + }); + + instance.SafelyAddQualityToList(new ItemAttributeClass(EItemAttributeId.DurabilityBurn) + { + Name = EItemAttributeId.DurabilityBurn.GetName(), + Base = () => instance.DurabilityBurnModificator - 1f, + StringValue = () => $"{(instance.DurabilityBurnModificator - 1f) * 100f:F1}%", + DisplayType = () => EItemAttributeDisplayType.Compact, + LabelVariations = EItemAttributeLabelVariations.Colored, + LessIsGood = true, + }); + + instance.SafelyAddQualityToList(new ItemAttributeClass(EItemAttributeId.HeatFactor) + { + Name = EItemAttributeId.HeatFactor.GetName(), + Base = () => instance.HeatFactor - 1f, + StringValue = () => $"{(instance.HeatFactor - 1f) * 100f:F1}%", + DisplayType = () => EItemAttributeDisplayType.Compact, + LabelVariations = EItemAttributeLabelVariations.Colored, + LessIsGood = true, }); instance.SafelyAddQualityToList(new ItemAttributeClass(EAmmoExtraAttributeId.FragmentationChance) @@ -90,8 +119,8 @@ internal static class AmmoTemplateExtensions Name = EAmmoExtraAttributeId.FragmentationChance.ToString(), DisplayNameFunc = () => "Fragmentation chance", Base = () => instance.FragmentationChance, - StringValue = () => $"{Math.Round(instance.FragmentationChance * 100, 1)}%", - DisplayType = () => EItemAttributeDisplayType.Compact + StringValue = () => $"{instance.FragmentationChance * 100f:F1}%", + DisplayType = () => EItemAttributeDisplayType.Compact, }); instance.SafelyAddQualityToList(new ItemAttributeClass(EAmmoExtraAttributeId.RicochetChance) @@ -99,8 +128,56 @@ internal static class AmmoTemplateExtensions Name = EAmmoExtraAttributeId.RicochetChance.ToString(), DisplayNameFunc = () => "Ricochet chance", Base = () => instance.RicochetChance, - StringValue = () => $"{Math.Round(instance.RicochetChance * 100, 1)}%", - DisplayType = () => EItemAttributeDisplayType.Compact + StringValue = () => $"{(instance.RicochetChance * 100f):F1}%", + DisplayType = () => EItemAttributeDisplayType.Compact, + }); + + instance.SafelyAddQualityToList(new ItemAttributeClass(EItemAttributeId.MalfMisfireChance) + { + Name = EItemAttributeId.MalfMisfireChance.GetName(), + Base = () => instance.MalfMisfireChance, + StringValue = () => + { + string value; + if (instance.MalfMisfireChance <= 0f) + value = MalfChancesKeys[0]; + else if (instance.MalfMisfireChance < 3f * MaxMalfMisfireChance / 7f) + value = MalfChancesKeys[1]; + else if (instance.MalfMisfireChance < 4f * MaxMalfMisfireChance / 7f) + value = MalfChancesKeys[2]; + else if (instance.MalfMisfireChance < 5f * MaxMalfMisfireChance / 7f) + value = MalfChancesKeys[3]; + else if (instance.MalfMisfireChance < 6f * MaxMalfMisfireChance / 7f) + value = MalfChancesKeys[4]; + else + value = MalfChancesKeys[5]; + return value.Localized(); + }, + DisplayType = () => EItemAttributeDisplayType.Compact, + }); + + instance.SafelyAddQualityToList(new ItemAttributeClass(EItemAttributeId.MalfFeedChance) + { + Name = EItemAttributeId.MalfFeedChance.GetName(), + Base = () => instance.MalfFeedChance, + StringValue = () => + { + string value; + if (instance.MalfFeedChance <= 0f) + value = MalfChancesKeys[0]; + else if (instance.MalfFeedChance < 1f * MaxMalfFeedChance / 7f) + value = MalfChancesKeys[1]; + else if (instance.MalfFeedChance < 3f * MaxMalfFeedChance / 7f) + value = MalfChancesKeys[2]; + else if (instance.MalfFeedChance < 5f * MaxMalfFeedChance / 7f) + value = MalfChancesKeys[3]; + else if (instance.MalfFeedChance < 6f * MaxMalfFeedChance / 7f) + value = MalfChancesKeys[4]; + else + value = MalfChancesKeys[5]; + return value.Localized(); + }, + DisplayType = () => EItemAttributeDisplayType.Compact, }); } diff --git a/MunitionsExpert/MunitionsExpert.csproj b/MunitionsExpert/MunitionsExpert.csproj index 52b96d8..0575948 100644 --- a/MunitionsExpert/MunitionsExpert.csproj +++ b/MunitionsExpert/MunitionsExpert.csproj @@ -3,7 +3,7 @@ net472 IcyClawz.MunitionsExpert - 1.4.0 + 1.4.1 IcyClawz.MunitionsExpert latest diff --git a/MunitionsExpert/Plugin.cs b/MunitionsExpert/Plugin.cs index 38992ae..4b49375 100644 --- a/MunitionsExpert/Plugin.cs +++ b/MunitionsExpert/Plugin.cs @@ -13,7 +13,7 @@ using UnityEngine.UI; namespace IcyClawz.MunitionsExpert; -[BepInPlugin("com.IcyClawz.MunitionsExpert", "IcyClawz.MunitionsExpert", "1.4.0")] +[BepInPlugin("com.IcyClawz.MunitionsExpert", "IcyClawz.MunitionsExpert", "1.4.1")] public class Plugin : BaseUnityPlugin { private static ConfigEntry ColorizeSwitch { get; set; }