コード例 #1
0
ファイル: HitPatch.cs プロジェクト: jsza/Terraheim
        static void OnDamagedPrefix(Character __instance, ref HitData hit)
        {
            if (hit.HaveAttacker() && hit.GetAttacker().IsPlayer() && hit.GetAttacker().GetSEMan().HaveStatusEffect("Wyrdarrow"))
            {
                (hit.GetAttacker().GetSEMan().GetStatusEffect("Wyrdarrow") as SE_AoECounter).IncreaseCounter();
            }
            if (hit.HaveAttacker() && hit.GetAttacker().IsPlayer() && hit.GetAttacker().GetSEMan().HaveStatusEffect("Brassflesh Listener"))
            {
                if (hit.GetAttacker().GetSEMan().HaveStatusEffect("Brassflesh"))
                {
                    (hit.GetAttacker().GetSEMan().GetStatusEffect("Brassflesh") as SE_ArmorOnHit).OnHit();
                }
                else
                {
                    SEMan seman    = hit.GetAttacker().GetSEMan();
                    float maxArmor = (seman.GetStatusEffect("Brassflesh Listener") as SE_ArmorOnHitListener).GetMaxArmor();
                    seman.AddStatusEffect("Brassflesh");
                    (seman.GetStatusEffect("Brassflesh") as SE_ArmorOnHit).SetMaxArmor(maxArmor);
                }
            }

            if (__instance.IsPlayer() && __instance.GetSEMan().HaveStatusEffect("Challenge Move Speed"))
            {
                //Log.LogInfo($"starting damage: {hit.GetTotalDamage()}");
                float damageMod = 2f;
                hit.m_damage.m_blunt     *= damageMod;
                hit.m_damage.m_chop      *= damageMod;
                hit.m_damage.m_damage    *= damageMod;
                hit.m_damage.m_fire      *= damageMod;
                hit.m_damage.m_frost     *= damageMod;
                hit.m_damage.m_lightning *= damageMod;
                hit.m_damage.m_pickaxe   *= damageMod;
                hit.m_damage.m_pierce    *= damageMod;
                hit.m_damage.m_poison    *= damageMod;
                hit.m_damage.m_slash     *= damageMod;
                hit.m_damage.m_spirit    *= damageMod;
                //Log.LogInfo($"ending damage: {hit.GetTotalDamage()}");
            }

            if (__instance.IsPlayer() && __instance.GetSEMan().HaveStatusEffect("Brassflesh"))
            {
                //Log.LogInfo($"starting damage: {hit.GetTotalDamage()}");
                float damageMod = (__instance.GetSEMan().GetStatusEffect("Brassflesh") as SE_ArmorOnHit).GetCurrentDamageReduction();
                hit.m_damage.m_blunt     *= 1 - damageMod;
                hit.m_damage.m_chop      *= 1 - damageMod;
                hit.m_damage.m_damage    *= 1 - damageMod;
                hit.m_damage.m_fire      *= 1 - damageMod;
                hit.m_damage.m_frost     *= 1 - damageMod;
                hit.m_damage.m_lightning *= 1 - damageMod;
                hit.m_damage.m_pickaxe   *= 1 - damageMod;
                hit.m_damage.m_pierce    *= 1 - damageMod;
                hit.m_damage.m_poison    *= 1 - damageMod;
                hit.m_damage.m_slash     *= 1 - damageMod;
                hit.m_damage.m_spirit    *= 1 - damageMod;
                //Log.LogInfo($"ending damage: {hit.GetTotalDamage()}");
            }
        }
コード例 #2
0
 public static void Postfix(SEMan __instance, ref float staminaMultiplier)
 {
     if (__instance.HaveStatusEffect("Stamina Regen"))
     {
         SE_StaminaRegen effect = __instance.GetStatusEffect("Stamina Regen") as SE_StaminaRegen;
         staminaMultiplier += effect.GetRegenPercent();
     }
     if (__instance.HaveStatusEffect("Sprinter"))
     {
         SE_ChallengeSprinter effect = __instance.GetStatusEffect("Sprinter") as SE_ChallengeSprinter;
         staminaMultiplier += effect.GetRegen();
     }
 }
コード例 #3
0
ファイル: HealPatch.cs プロジェクト: jsza/Terraheim
 static void Postfix(Character __instance, ref SEMan ___m_seman)
 {
     /*if (___m_seman.HaveStatusEffect("Wolftears"))
      * {
      *  SE_Wolftears effect = ___m_seman.GetStatusEffect("Wolftears") as SE_Wolftears;
      *  if (__instance.GetHealthPercentage() > effect.GetActivationHP() && effect.m_icon != null)
      *  {
      *      effect.ClearIcon();
      *  }
      *  else if (__instance.GetHealthPercentage() <= effect.GetActivationHP() && effect.m_icon == null)
      *  {
      *      effect.SetIcon();
      *  }
      * }*/
     if (___m_seman.HaveStatusEffect("Battle Furor"))
     {
         SE_FullHPDamageBonus effect = ___m_seman.GetStatusEffect("Battle Furor") as SE_FullHPDamageBonus;
         if (__instance.GetHealthPercentage() < effect.GetActivationHP() && effect.m_icon != null)
         {
             effect.ClearIcon();
         }
         else if (__instance.GetHealthPercentage() >= effect.GetActivationHP() && effect.m_icon == null)
         {
             effect.SetIcon();
         }
     }
 }
コード例 #4
0
 public static void Postfix(Rigidbody ___m_body, SEMan ___m_seman, float dt)
 {
     if (___m_seman.HaveStatusEffect("SE_Feather"))
     {
         var vel = ___m_body.velocity;
         ((SE_Feather)___m_seman.GetStatusEffect("SE_Feather")).ModifyFall(ref vel, dt);
         ___m_body.velocity = vel;
     }
 }
コード例 #5
0
 public static void Postfix(SEMan __instance, ref float regenMultiplier)
 {
     //Log.LogInfo("Total Val Increasing HP");
     if (__instance.HaveStatusEffect("HP Regen"))
     {
         //Log.LogInfo($"Total Val Has Effect HP${hp}");
         SE_HPRegen effect = __instance.GetStatusEffect("HP Regen") as SE_HPRegen;
         //Player player = __instance.m_character as Player;
         regenMultiplier += effect.getHealPercent();
         //Log.LogInfo($"Total Val Modded HP${hp} from effect ${effect.getHealthBonus()}");
     }
 }
コード例 #6
0
ファイル: DodgePatch.cs プロジェクト: jsza/Terraheim
 static void Prefix(ref float ___m_dodgeStaminaUsage, ref SEMan ___m_seman)
 {
     //Log.LogWarning("Dodging!");
     //Log.LogWarning("Stamina Use: " + ___m_dodgeStaminaUsage);
     if (___m_seman.HaveStatusEffect("Dodge Stamina Use"))
     {
         SE_DodgeStamUse effect = ___m_seman.GetStatusEffect("Dodge Stamina Use") as SE_DodgeStamUse;
         //Log.LogMessage("Has Effect");
         ___m_dodgeStaminaUsage = baseStaminaUse * (1 - effect.getDodgeStaminaUse());
         //Log.LogWarning("Stamina Use: " + ___m_dodgeStaminaUsage);
     }
     else if (___m_seman.HaveStatusEffect("Challenge Dodge Bonus"))
     {
         SE_ChallengeDodgeBonus effect = ___m_seman.GetStatusEffect("Challenge Dodge Bonus") as SE_ChallengeDodgeBonus;
         //Log.LogMessage("Has Effect");
         ___m_dodgeStaminaUsage = baseStaminaUse * (1 - effect.GetDodgeBonus());
         //Log.LogWarning("Stamina Use: " + ___m_dodgeStaminaUsage);
     }
     else if (___m_dodgeStaminaUsage != baseStaminaUse)
     {
         ___m_dodgeStaminaUsage = baseStaminaUse;
     }
 }
コード例 #7
0
ファイル: BlockPatch.cs プロジェクト: jsza/Terraheim
 static void Prefix(ref float ___m_blockStaminaDrain, ref SEMan ___m_seman)
 {
     //Log.LogWarning("Blocking!");
     //Log.LogWarning("Stamina Use: " + ___m_blockStaminaDrain);
     if (___m_seman.HaveStatusEffect("Block Stamina Use") && (___m_seman.m_character as Humanoid).GetCurrentWeapon() != (___m_seman.m_character as Humanoid).m_unarmedWeapon.m_itemData)
     {
         SE_BlockStamUse effect = ___m_seman.GetStatusEffect("Block Stamina Use") as SE_BlockStamUse;
         //Log.LogMessage("Has Effect");
         ___m_blockStaminaDrain = baseStaminaUse * (1 - effect.getBlockStaminaUse());
         //Log.LogWarning("Stamina Use: " + ___m_blockStaminaDrain);
     }
     else if (___m_blockStaminaDrain != baseStaminaUse)
     {
         //Log.LogMessage("1");
         ___m_blockStaminaDrain = baseStaminaUse;
         //Log.LogMessage("2");
     }
     //Log.LogMessage("3");
 }
コード例 #8
0
            static void Postfix(float dt, Player __instance, ItemDrop.ItemData ___m_chestItem, ItemDrop.ItemData ___m_legItem, ItemDrop.ItemData ___m_helmetItem, ItemDrop.ItemData ___m_shoulderItem, SEMan ___m_seman)
            {
                if (!modEnabled.Value)
                {
                    return;
                }

                if (___m_seman.HaveStatusEffect("Wet"))
                {
                    HitData.DamageModifier water = GetNewDamageTypeMod(NewDamageTypes.Water, ___m_chestItem, ___m_legItem, ___m_helmetItem, ___m_shoulderItem);
                    var wet = ___m_seman.GetStatusEffect("Wet");
                    var t   = Traverse.Create(wet);

                    if (water == HitData.DamageModifier.Ignore || water == HitData.DamageModifier.Immune)
                    {
                        ___m_seman.RemoveStatusEffect("Wet", true);
                    }
                    else if (water == HitData.DamageModifier.VeryResistant && !__instance.InLiquidSwimDepth())
                    {
                        ___m_seman.RemoveStatusEffect("Wet", true);
                    }
                    else if (water == HitData.DamageModifier.Resistant)
                    {
                        t.Field("m_time").SetValue(t.Field("m_time").GetValue <float>() + dt);
                        ___m_seman.RemoveStatusEffect("Wet", true);
                        ___m_seman.AddStatusEffect(wet);
                    }
                    else if (water == HitData.DamageModifier.Weak)
                    {
                        t.Field("m_time").SetValue(t.Field("m_time").GetValue <float>() - dt / 3);
                        ___m_seman.RemoveStatusEffect("Wet", true);
                        ___m_seman.AddStatusEffect(wet);
                    }
                    else if (water == HitData.DamageModifier.VeryWeak)
                    {
                        t.Field("m_time").SetValue(t.Field("m_time").GetValue <float>() - dt * 2 / 3);
                        ___m_seman.RemoveStatusEffect("Wet", true);
                        ___m_seman.AddStatusEffect(wet);
                    }
                }
            }
コード例 #9
0
ファイル: BlockPatch.cs プロジェクト: jsza/Terraheim
        static void Postfix(HitData hit, Character attacker, ref SEMan ___m_seman, float ___m_blockTimer)
        {
            if (___m_seman.HaveStatusEffect("Heal On Block"))
            {
                if ((___m_seman.m_character as Humanoid) && (___m_seman.m_character as Humanoid).m_leftItem != (___m_seman.m_character as Humanoid).m_unarmedWeapon.m_itemData &&
                    (___m_seman.m_character as Humanoid).m_leftItem != null)
                {
                    var effect = ___m_seman.GetStatusEffect("Heal On Block") as SE_HealOnBlock;
                    ItemDrop.ItemData blocker = (___m_seman.m_character as Humanoid).m_leftItem;

                    //Log.LogMessage("Defender is staggered: " + ___m_seman.m_character.IsStaggering() + ". Attacker is staggered: " + attacker.IsStaggering());
                    bool parryFlag = ___m_blockTimer != -1f && (float)balance["perfectBlockWindow"] >= ___m_blockTimer;

                    if (blocker.m_shared.m_name.Contains("tower") || blocker.m_shared.m_name.Contains("shield_serpentscale"))
                    {
                        //Log.LogWarning("Has tower shield");
                        //Do Heal on Block
                        if ((___m_seman.m_character as Humanoid).HaveStamina() || parryFlag)
                        {
                            var healAmount = blocker.GetBaseBlockPower() * effect.GetBlockHeal();
                            Log.LogInfo("Terraheim | Heal on Block: Block Power: " + blocker.GetBaseBlockPower() + " Heal Amount: " + healAmount);
                            ___m_seman.m_character.Heal(healAmount);
                        }
                    }
                    else if (blocker.m_shared.m_name.Contains("shield") && parryFlag)
                    {
                        //Log.LogWarning("Has Small Shield");
                        //Do Heal on Parry
                        var healAmount = blocker.GetBaseBlockPower() * effect.GetBlockHeal() +
                                         (blocker.GetBaseBlockPower() * blocker.m_shared.m_timedBlockBonus * effect.GetBlockHeal());
                        Log.LogInfo("Terraheim | Heal on Parry: Block Power: " + blocker.GetBaseBlockPower() + " Parry Bonus: " + blocker.m_shared.m_timedBlockBonus + " Heal Amount: " + healAmount);
                        ___m_seman.m_character.Heal(healAmount);
                    }
                }
            }
        }
コード例 #10
0
        public static void DamagePostfix(Character __instance, ref HitData hit)
        {
            SEMan seman = __instance.GetSEMan();

            Character attacker = hit.GetAttacker();

            if (attacker == null || attacker.IsPlayer() || attacker.m_seman == null)
            {
                return;
            }

            if (seman.HaveStatusEffect("Thorns") && !seman.m_character.IsBlocking())
            {
                SE_Thorns effect = seman.GetStatusEffect("Thorns") as SE_Thorns;
                Log.LogMessage($"Damage dealt: {hit.GetTotalDamage()} thorns %${effect.GetReflectPercent()}");
                HitData reflectedDamage = new HitData();
                reflectedDamage.m_damage.Add(hit.m_damage);
                reflectedDamage.m_damage.m_blunt     *= effect.GetReflectPercent();
                reflectedDamage.m_damage.m_chop      *= effect.GetReflectPercent();
                reflectedDamage.m_damage.m_damage    *= effect.GetReflectPercent();
                reflectedDamage.m_damage.m_fire      *= effect.GetReflectPercent();
                reflectedDamage.m_damage.m_frost     *= effect.GetReflectPercent();
                reflectedDamage.m_damage.m_lightning *= effect.GetReflectPercent();
                reflectedDamage.m_damage.m_pickaxe   *= effect.GetReflectPercent();
                reflectedDamage.m_damage.m_pierce    *= effect.GetReflectPercent();
                reflectedDamage.m_damage.m_poison    *= effect.GetReflectPercent();
                reflectedDamage.m_damage.m_slash     *= effect.GetReflectPercent();
                reflectedDamage.m_damage.m_spirit    *= effect.GetReflectPercent();
                reflectedDamage.m_staggerMultiplier   = 0;

                Log.LogMessage($"Reflected Damage ${reflectedDamage.m_damage.GetTotalDamage()}");
                if (attacker.GetHealth() <= reflectedDamage.GetTotalDamage() && attacker.GetHealthPercentage() >= (float)balance["thornsKillThreshold"])
                {
                    var totalDamage = attacker.GetHealth() - 1;
                    reflectedDamage.m_damage.m_blunt     = totalDamage * (reflectedDamage.m_damage.m_blunt / reflectedDamage.GetTotalDamage());
                    reflectedDamage.m_damage.m_chop      = totalDamage * (reflectedDamage.m_damage.m_chop / reflectedDamage.GetTotalDamage());
                    reflectedDamage.m_damage.m_damage    = totalDamage * (reflectedDamage.m_damage.m_damage / reflectedDamage.GetTotalDamage());
                    reflectedDamage.m_damage.m_fire      = totalDamage * (reflectedDamage.m_damage.m_fire / reflectedDamage.GetTotalDamage());
                    reflectedDamage.m_damage.m_frost     = totalDamage * (reflectedDamage.m_damage.m_frost / reflectedDamage.GetTotalDamage());
                    reflectedDamage.m_damage.m_lightning = totalDamage * (reflectedDamage.m_damage.m_lightning / reflectedDamage.GetTotalDamage());
                    reflectedDamage.m_damage.m_pickaxe   = totalDamage * (reflectedDamage.m_damage.m_pickaxe / reflectedDamage.GetTotalDamage());
                    reflectedDamage.m_damage.m_pierce    = totalDamage * (reflectedDamage.m_damage.m_pierce / reflectedDamage.GetTotalDamage());
                    reflectedDamage.m_damage.m_poison    = totalDamage * (reflectedDamage.m_damage.m_poison / reflectedDamage.GetTotalDamage());
                    reflectedDamage.m_damage.m_slash     = totalDamage * (reflectedDamage.m_damage.m_slash / reflectedDamage.GetTotalDamage());
                    reflectedDamage.m_damage.m_spirit    = totalDamage * (reflectedDamage.m_damage.m_spirit / reflectedDamage.GetTotalDamage());
                    //Log.LogMessage($"Would Kill attacker! New damage: {reflectedDamage.m_damage.GetTotalDamage()}, attacker health: {attacker.GetHealth()}");
                }

                attacker.ApplyDamage(reflectedDamage, true, false);

                var vfx = Object.Instantiate(AssetHelper.FXThorns, attacker.GetCenterPoint(), Quaternion.identity);
                ParticleSystem[] children = vfx.GetComponentsInChildren <ParticleSystem>();
                foreach (ParticleSystem particle in children)
                {
                    particle.Play();
                    //Log.LogMessage("Playing particle");
                }
            }

            if (__instance.GetSEMan().HaveStatusEffect("Wolftears"))
            {
                var effect = __instance.GetSEMan().GetStatusEffect("Wolftears") as SE_Wolftears;
                effect.SetIcon();
                if (seman.m_character.GetHealth() <= hit.m_damage.GetTotalDamage() && !seman.HaveStatusEffect("Tear Protection Exhausted"))
                {
                    Log.LogInfo($"Would Kill defender! Damage: {hit.m_damage.GetTotalDamage()}, attacker health: {__instance.GetHealth()}");

                    hit.m_damage.Modify(0);
                    seman.AddStatusEffect("Tear Protection Exhausted");
                    __instance.SetHealth(1f);
                }
            }
            if (__instance.GetSEMan().HaveStatusEffect("Battle Furor"))
            {
                var effect = __instance.GetSEMan().GetStatusEffect("Battle Furor") as SE_FullHPDamageBonus;
                //Log.LogWarning("HP Percentage " + __instance.m_character.GetHealthPercentage() + " Activation Threshold " + effect.GetActivationHP());
                if (__instance.GetHealthPercentage() < effect.GetActivationHP())
                {
                    effect.ClearIcon();
                }
            }
        }
コード例 #11
0
ファイル: TooltipPatch.cs プロジェクト: jsza/Terraheim
        public static void UpdateDamageTooltip(ref string tooltip, ItemDrop.ItemData item)
        {
            Player localplayer     = Player.m_localPlayer;
            SEMan  seman           = localplayer.GetSEMan();
            float  totalMultiplier = 0f;
            float  frostDamage     = 0f;
            float  spiritDamage    = 0f;

            if (item == null || seman == null || localplayer == null || item.m_shared == null || item.m_shared.m_name == null)
            {
                return;
            }

            if (seman.HaveStatusEffect("One Hand Damage Bonus") && (item.m_shared.m_name.Contains("axe") || item.m_shared.m_name.Contains("battleaxe")))
            {
                var effect = localplayer.GetSEMan().GetStatusEffect("One Hand Damage Bonus") as SE_OneHandDamageBonus;
                totalMultiplier += effect.getDamageBonus();
            }

            if (seman.HaveStatusEffect("Dagger/Spear Damage Bonus") && (item.m_shared.m_name.Contains("spear") || item.m_shared.m_name.Contains("knife")))
            {
                var effect = localplayer.GetSEMan().GetStatusEffect("Dagger/Spear Damage Bonus") as SE_DaggerSpearDmgBonus;
                totalMultiplier += effect.getDamageBonus();
            }

            if (seman.HaveStatusEffect("Melee Damage Bonus") && item.m_shared.m_itemType != ItemDrop.ItemData.ItemType.Bow)
            {
                var effect = localplayer.GetSEMan().GetStatusEffect("Melee Damage Bonus") as SE_MeleeDamageBonus;
                totalMultiplier += effect.getDamageBonus();
            }

            if (seman.HaveStatusEffect("Ranged Damage Bonus") && item.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Bow)
            {
                var effect = localplayer.GetSEMan().GetStatusEffect("Ranged Damage Bonus") as SE_RangedDmgBonus;
                totalMultiplier += effect.getDamageBonus();
            }

            if (seman.HaveStatusEffect("Two Handed Damage Bonus") && item.m_shared.m_itemType == ItemDrop.ItemData.ItemType.TwoHandedWeapon)
            {
                var effect = localplayer.GetSEMan().GetStatusEffect("Two Handed Damage Bonus") as SE_TwoHandedDmgBonus;
                totalMultiplier += effect.getDamageBonus();
            }

            if (seman.HaveStatusEffect("Ranger Weapon Bonus") && (item.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Bow || item.m_shared.m_name.Contains("spear") || item.m_shared.m_name.Contains("knife")))
            {
                var effect = localplayer.GetSEMan().GetStatusEffect("Ranger Weapon Bonus") as SE_RangerWeaponBonus;
                totalMultiplier += effect.GetDamageBonus();
            }

            if (seman.HaveStatusEffect("Throwing Damage Bonus") && item.m_shared.m_name.Contains("_throwingaxe") ||
                item.m_shared.m_name.Contains("_spear") ||
                item.m_shared.m_name.Contains("bomb"))
            {
                var effect = seman.GetStatusEffect("Throwing Damage Bonus") as SE_ThrowingDamageBonus;
                if (effect != null)
                {
                    totalMultiplier += effect.getDamageBonus();
                }
            }
            if (seman.HaveStatusEffect("Wolftears"))
            {
                SE_Wolftears effect = seman.GetStatusEffect("Wolftears") as SE_Wolftears;
                totalMultiplier += effect.GetDamageBonus();
            }
            if (seman.HaveStatusEffect("Battle Furor"))
            {
                SE_FullHPDamageBonus effect = seman.GetStatusEffect("Battle Furor") as SE_FullHPDamageBonus;
                if (localplayer.GetHealthPercentage() >= effect.GetActivationHP())
                {
                    totalMultiplier += effect.GetDamageBonus();
                }
            }
            if (seman.HaveStatusEffect("Silver Damage Bonus") && (item.m_shared.m_itemType == ItemDrop.ItemData.ItemType.Bow || item.m_shared.m_name.Contains("spear") || item.m_shared.m_name.Contains("knife")))
            {
                var effect = localplayer.GetSEMan().GetStatusEffect("Silver Damage Bonus") as SE_SilverDamageBonus;
                spiritDamage += (item.GetDamage().GetTotalDamage() * effect.GetDamageBonus()) / 2;
                frostDamage  += (item.GetDamage().GetTotalDamage() * effect.GetDamageBonus()) / 2;
            }
            if (seman.HaveStatusEffect("Spirit Damage Bonus"))
            {
                var effect = localplayer.GetSEMan().GetStatusEffect("Spirit Damage Bonus") as SE_SpiritDamageBonus;
                spiritDamage += effect.GetDamageBonus();
            }
            if (totalMultiplier > 0f)
            {
                var damages = item.m_shared.m_damages;
                if (damages.m_blunt != 0f)
                {
                    localplayer.GetSkills().GetRandomSkillRange(out var min, out var max, item.m_shared.m_skillType);
                    int    minRange    = Mathf.RoundToInt(item.GetDamage().m_blunt *min);
                    int    maxRange    = Mathf.RoundToInt(item.GetDamage().m_blunt *max);
                    string bluntString = $"$inventory_blunt: <color=orange>{item.GetDamage().m_blunt}</color> <color=yellow>({minRange}-{maxRange}) </color>";
                    var    index       = tooltip.IndexOf(bluntString);
                    if (index > -1)
                    {
                        var dmgBonusMin = (item.GetDamage().m_blunt + item.GetDamage().m_blunt *totalMultiplier) * min;
                        var dmgBonusMax = (item.GetDamage().m_blunt + item.GetDamage().m_blunt *totalMultiplier) * max;
                        tooltip = tooltip.Insert(index + bluntString.Length, $"<color=orange>|</color> <color=cyan>({dmgBonusMin:#.#}-{dmgBonusMax:#.#})</color>");
                    }
                }
                if (damages.m_slash != 0f)
                {
                    localplayer.GetSkills().GetRandomSkillRange(out var min, out var max, item.m_shared.m_skillType);
                    int    minRange   = Mathf.RoundToInt(item.GetDamage().m_slash *min);
                    int    maxRange   = Mathf.RoundToInt(item.GetDamage().m_slash *max);
                    string toolString = $"$inventory_slash: <color=orange>{item.GetDamage().m_slash}</color> <color=yellow>({minRange}-{maxRange}) </color>";
                    var    index      = tooltip.IndexOf(toolString);
                    if (index > -1)
                    {
                        var dmgBonusMin = (item.GetDamage().m_slash + item.GetDamage().m_slash *totalMultiplier) * min;
                        var dmgBonusMax = (item.GetDamage().m_slash + item.GetDamage().m_slash *totalMultiplier) * max;
                        tooltip = tooltip.Insert(index + toolString.Length, $"<color=orange>|</color> <color=cyan>({dmgBonusMin:#.#}-{dmgBonusMax:#.#})</color>");
                    }
                }
                if (damages.m_pierce != 0f)
                {
                    localplayer.GetSkills().GetRandomSkillRange(out var min, out var max, item.m_shared.m_skillType);
                    int    minRange   = Mathf.RoundToInt(item.GetDamage().m_pierce *min);
                    int    maxRange   = Mathf.RoundToInt(item.GetDamage().m_pierce *max);
                    string toolString = $"$inventory_pierce: <color=orange>{item.GetDamage().m_pierce}</color> <color=yellow>({minRange}-{maxRange}) </color>";
                    var    index      = tooltip.IndexOf(toolString);
                    if (index > -1)
                    {
                        var dmgBonusMin = (item.GetDamage().m_pierce + item.GetDamage().m_pierce *totalMultiplier) * min;
                        var dmgBonusMax = (item.GetDamage().m_pierce + item.GetDamage().m_pierce *totalMultiplier) * max;
                        tooltip = tooltip.Insert(index + toolString.Length, $"<color=orange>|</color> <color=cyan>({dmgBonusMin:#.#}-{dmgBonusMax:#.#})</color>");
                    }
                }
                if (damages.m_fire != 0f)
                {
                    localplayer.GetSkills().GetRandomSkillRange(out var min, out var max, item.m_shared.m_skillType);
                    int    minRange   = Mathf.RoundToInt(item.GetDamage().m_fire *min);
                    int    maxRange   = Mathf.RoundToInt(item.GetDamage().m_fire *max);
                    string toolString = $"$inventory_fire: <color=orange>{item.GetDamage().m_fire}</color> <color=yellow>({minRange}-{maxRange}) </color>";
                    var    index      = tooltip.IndexOf(toolString);
                    if (index > -1)
                    {
                        var dmgBonusMin = (item.GetDamage().m_fire + item.GetDamage().m_fire *totalMultiplier) * min;
                        var dmgBonusMax = (item.GetDamage().m_fire + item.GetDamage().m_fire *totalMultiplier) * max;
                        tooltip = tooltip.Insert(index + toolString.Length, $"<color=orange>|</color> <color=cyan>({dmgBonusMin:#.#}-{dmgBonusMax:#.#})</color>");
                    }
                }

                if (damages.m_lightning != 0f)
                {
                    localplayer.GetSkills().GetRandomSkillRange(out var min, out var max, item.m_shared.m_skillType);
                    int    minRange   = Mathf.RoundToInt(item.GetDamage().m_lightning *min);
                    int    maxRange   = Mathf.RoundToInt(item.GetDamage().m_lightning *max);
                    string toolString = $"$inventory_lightning: <color=orange>{item.GetDamage().m_lightning}</color> <color=yellow>({minRange}-{maxRange}) </color>";
                    var    index      = tooltip.IndexOf(toolString);
                    if (index > -1)
                    {
                        var dmgBonusMin = (item.GetDamage().m_lightning + item.GetDamage().m_lightning *totalMultiplier) * min;
                        var dmgBonusMax = (item.GetDamage().m_lightning + item.GetDamage().m_lightning *totalMultiplier) * max;
                        tooltip = tooltip.Insert(index + toolString.Length, $"<color=orange>|</color> <color=cyan>({dmgBonusMin:#.#}-{dmgBonusMax:#.#})</color>");
                    }
                }
                if (damages.m_poison != 0f)
                {
                    localplayer.GetSkills().GetRandomSkillRange(out var min, out var max, item.m_shared.m_skillType);
                    int    minRange   = Mathf.RoundToInt(item.GetDamage().m_poison *min);
                    int    maxRange   = Mathf.RoundToInt(item.GetDamage().m_poison *max);
                    string toolString = $"$inventory_poison: <color=orange>{item.GetDamage().m_poison}</color> <color=yellow>({minRange}-{maxRange}) </color>";
                    var    index      = tooltip.IndexOf(toolString);
                    if (index > -1)
                    {
                        var dmgBonusMin = (item.GetDamage().m_poison + item.GetDamage().m_poison *totalMultiplier) * min;
                        var dmgBonusMax = (item.GetDamage().m_poison + item.GetDamage().m_poison *totalMultiplier) * max;
                        tooltip = tooltip.Insert(index + toolString.Length, $"<color=orange>|</color> <color=cyan>({dmgBonusMin:#.#}-{dmgBonusMax:#.#})</color>");
                    }
                }
            }
            if (spiritDamage > 0f)
            {
                localplayer.GetSkills().GetRandomSkillRange(out var min, out var max, item.m_shared.m_skillType);

                int    minRange   = Mathf.RoundToInt(item.GetDamage().m_spirit *min);
                int    maxRange   = Mathf.RoundToInt(item.GetDamage().m_spirit *max);
                string toolString = $"$inventory_spirit: <color=orange>{item.GetDamage().m_spirit}</color> <color=yellow>({minRange}-{maxRange}) </color>";

                var dmgBonusMin = Mathf.RoundToInt((item.GetDamage().m_spirit + spiritDamage) * min);
                var dmgBonusMax = Mathf.RoundToInt((item.GetDamage().m_spirit + spiritDamage) * max);

                var index = tooltip.IndexOf(toolString);
                if (index > -1)
                {
                    tooltip = tooltip.Insert(index + toolString.Length, $"<color=orange>|</color> <color=cyan>({dmgBonusMin:#.##}-{dmgBonusMax:#.##})</color>");
                }
                else
                {
                    string newString = $"$item_blockpower: <color=orange>{item.m_shared.m_blockPower}</color> <color=yellow>({item.m_shared.m_blockPower})</color>";
                    index = tooltip.IndexOf(newString);
                    if (index > -1)
                    {
                        tooltip = tooltip.Insert(index, $"<color=cyan>$inventory_spirit: {item.GetDamage().m_spirit + spiritDamage} ({dmgBonusMin:#.#}-{dmgBonusMax:#.#})</color>\n");
                    }
                }
            }
            if (frostDamage > 0f)
            {
                localplayer.GetSkills().GetRandomSkillRange(out var min, out var max, item.m_shared.m_skillType);
                int    minRange   = Mathf.RoundToInt(item.GetDamage().m_frost *min);
                int    maxRange   = Mathf.RoundToInt(item.GetDamage().m_frost *max);
                string toolString = $"$inventory_frost: <color=orange>{item.GetDamage().m_frost}</color> <color=yellow>({minRange}-{maxRange}) </color>";

                var dmgBonusMin = ((item.GetDamage().m_frost + frostDamage) * min);
                var dmgBonusMax = ((item.GetDamage().m_frost + frostDamage) * max);

                var index = tooltip.IndexOf(toolString);
                if (index > -1)
                {
                    tooltip = tooltip.Insert(index + toolString.Length, $"<color=orange>|</color> <color=cyan>({dmgBonusMin:#.#}-{dmgBonusMax:#.#})</color>");
                }
                else
                {
                    string newString = $"$item_blockpower: <color=orange>{item.m_shared.m_blockPower}</color> <color=yellow>({item.m_shared.m_blockPower})</color>";
                    index = tooltip.IndexOf(newString);
                    if (index > -1)
                    {
                        tooltip = tooltip.Insert(index, $"<color=cyan>$inventory_frost: {item.GetDamage().m_frost + frostDamage} ({dmgBonusMin:#.#}-{dmgBonusMax:#.#})</color>\n");
                    }
                }
            }
        }