public override float RecalculateDamage(float baseValue, CharacterBody character)
        {
            float BaseDamage = character.baseDamage + character.levelDamage * (character.level - 1);

            BaseDamage += ModItemManager.GetBonusForStat(character, StatIndex.Damage);

            float DamageBoost      = 0;
            int   DamageBoostCount = character.inventory ? character.inventory.GetItemCount(ItemIndex.BoostDamage) : 0;

            if (DamageBoostCount > 0)
            {
                DamageBoost += DamageBoostCount * DamageBoost;
            }
            DamageBoost -= 0.05f * character.GetBuffCount(BuffIndex.BeetleJuice);

            if (character.HasBuff(BuffIndex.GoldEmpowered))
            {
                DamageBoost += 1;
            }

            float DamageMult = DamageBoost + (character.CalcLunarDaggerPower());

            DamageMult += ModItemManager.GetMultiplierForStat(character, StatIndex.Damage);
            return(BaseDamage * DamageMult);
        }
        public override float RecalculateArmor(float baseValue, CharacterBody character)
        {
            float BaseArmor  = character.baseArmor + character.levelArmor * (character.level - 1);
            float BonusArmor = 0;

            if (character.HasBuff(BuffIndex.ArmorBoost))
            {
                BonusArmor += 200;
            }
            if (character.HasBuff(BuffIndex.Cripple))
            {
                BonusArmor -= 20;
            }
            float TotalArmor = BaseArmor + BonusArmor;

            TotalArmor += ModItemManager.GetBonusForStat(character, StatIndex.Armor);
            if (character.isSprinting)
            {
                TotalArmor += ModItemManager.GetBonusForStat(character, StatIndex.RunningArmor);
            }
            TotalArmor *= 1 + ModItemManager.GetMultiplierForStat(character, StatIndex.Armor);
            if (character.isSprinting)
            {
                TotalArmor *= 1 + ModItemManager.GetMultiplierForStat(character, StatIndex.RunningArmor);
            }
            return(TotalArmor);
        }
        public override float RecalculateJumpCount(float baseValue, CharacterBody character)
        {
            float JumpCount = character.baseJumpCount + ModItemManager.GetBonusForStat(character, StatIndex.JumpCount);

            JumpCount *= 1 + ModItemManager.GetMultiplierForStat(character, StatIndex.JumpCount);
            return(JumpCount);
        }
        public override float RecalculateJumpPower(float baseValue, CharacterBody character)
        {
            float JumpPower = character.baseJumpPower + character.levelJumpPower * (character.level - 1) + ModItemManager.GetBonusForStat(character, StatIndex.JumpPower);

            JumpPower *= 1 + ModItemManager.GetMultiplierForStat(character, StatIndex.JumpPower);
            return(JumpPower);
        }
        public override float RecalculateRegen(float baseValue, CharacterBody character)
        {
            float BaseRegen = (character.baseRegen + character.levelRegen * (character.level - 1)) * 2.5f;

            float RegenBonus = 0;
            float regenmult  = 1;

            //Item Related
            if ((bool)character.inventory)
            {
                RegenBonus += ModItemManager.GetBonusForStat(character, StatIndex.Regen);
                if (character.outOfDanger)
                {
                    RegenBonus += ModItemManager.GetBonusForStat(character, StatIndex.SafeRegen);
                }
                if (character.inventory.GetItemCount(ItemIndex.HealthDecay) > 0)
                {
                    RegenBonus -= character.maxHealth / character.inventory.GetItemCount(ItemIndex.HealthDecay);
                }
                regenmult += ModItemManager.GetMultiplierForStat(character, StatIndex.Regen);
                if (character.outOfDanger)
                {
                    regenmult += ModItemManager.GetMultiplierForStat(character, StatIndex.SafeRegen);
                }
            }

            float totalRegen = (BaseRegen * regenmult + RegenBonus);

            return(totalRegen);
        }
        public override float RecalculateSpecialCount(float baseValue, CharacterBody character)
        {
            float count = 0;

            count += ModItemManager.GetBonusForStat(character, StatIndex.CountUtility);
            count *= 1 + ModItemManager.GetMultiplierForStat(character, StatIndex.CountUtility);
            return(count);
        }
        public override float RecalculateCrit(float baseValue, CharacterBody character)
        {
            float CriticalChance = character.baseCrit + character.levelCrit * (character.level - 1);


            CriticalChance += ModItemManager.GetBonusForStat(character, StatIndex.Crit);
            CriticalChance *= 1 + ModItemManager.GetMultiplierForStat(character, StatIndex.AttackSpeed);

            if (character.HasBuff(BuffIndex.FullCrit))
            {
                CriticalChance += 100;
            }


            return(CriticalChance);
        }
        public override float RecalculateAttackSpeed(float baseValue, CharacterBody character)
        {
            float BaseAttackSpeed = character.baseAttackSpeed + character.levelAttackSpeed * (character.level - 1);

            //Item efect
            float AttackSpeedBonus = 1f;

            if (character.inventory)
            {
                if (character.inventory.currentEquipmentIndex == EquipmentIndex.AffixYellow)
                {
                    AttackSpeedBonus += 0.5f;
                }
            }

            //Buffs
            float AttackSpeedMult = AttackSpeedBonus + character.GetFieldValue <int[]>("buffs")[2] * 0.12f;

            if (character.HasBuff(BuffIndex.Warbanner))
            {
                AttackSpeedMult += 0.3f;
            }
            if (character.HasBuff(BuffIndex.EnrageAncientWisp))
            {
                AttackSpeedMult += 2f;
            }
            if (character.HasBuff(BuffIndex.WarCryBuff))
            {
                AttackSpeedMult += 1f;
            }


            BaseAttackSpeed += ModItemManager.GetBonusForStat(character, StatIndex.AttackSpeed);
            AttackSpeedMult += ModItemManager.GetMultiplierForStat(character, StatIndex.AttackSpeed);
            float AttackSpeed = BaseAttackSpeed * AttackSpeedMult;

            //Debuff
            AttackSpeed *= 1 - (0.05f * character.GetBuffCount(BuffIndex.BeetleJuice));

            return(AttackSpeed);
        }
        public override float RecalculateHealth(float baseValue, CharacterBody character)
        {
            float MaxHealth       = character.baseMaxHealth + (character.level - 1) * character.levelMaxHealth;
            float HealthBonusItem = 0;
            float hpbooster       = 1;
            float healthDivider   = 1;

            if ((bool)character.inventory)
            {
                HealthBonusItem += ModItemManager.GetBonusForStat(character, StatIndex.MaxHealth);

                if (character.inventory.GetItemCount(ItemIndex.Infusion) > 0)
                {
                    HealthBonusItem += character.inventory.infusionBonus;
                }
                hpbooster    += ModItemManager.GetMultiplierForStat(character, StatIndex.MaxHealth);
                healthDivider = character.CalcLunarDaggerPower();
            }
            MaxHealth += HealthBonusItem;
            MaxHealth *= hpbooster / healthDivider;
            return(MaxHealth);
        }
        public override float RecalculateShield(float baseValue, CharacterBody character)
        {
            float MaxShield = character.baseMaxShield + character.levelMaxShield * (character.level - 1);

            if (character.inventory)
            {
                if (character.inventory.GetItemCount(ItemIndex.ShieldOnly) > 0)
                {
                    MaxShield += character.maxHealth * (1.25f + (character.inventory.GetItemCount(ItemIndex.ShieldOnly) - 1) * 0.5f);
                    character.SetPropertyValue("maxHealth", 1);
                }
            }
            //Buff
            if (character.HasBuff(BuffIndex.EngiShield))
            {
                MaxShield += character.maxHealth * 1f;
            }
            if (character.HasBuff(BuffIndex.EngiTeamShield))
            {
                MaxShield += character.maxHealth * 0.5f;
            }


            //NPC Overload Buff
            if (character.GetFieldValue <BuffMask>("buffMask").HasBuff(BuffIndex.AffixBlue))
            {
                character.SetPropertyValue("maxHealth", character.maxHealth * 0.5f);
                MaxShield += character.maxHealth;
            }
            if (character.inventory)
            {
                MaxShield += ModItemManager.GetBonusForStat(character, StatIndex.MaxShield);

                MaxShield *= (1 + ModItemManager.GetMultiplierForStat(character, StatIndex.MaxShield));
            }
            return(MaxShield);
        }
        public override float RecalculateMoveSpeed(float baseValue, CharacterBody character)
        {
            float BaseMoveSpeed = character.baseMoveSpeed + character.levelMoveSpeed * (character.level - 1);

            float SpeedBonus = 1;


            //More weird stuff
            if ((bool)character.inventory)
            {
                if (character.inventory.currentEquipmentIndex == EquipmentIndex.AffixYellow)
                {
                    BaseMoveSpeed += 2;
                }
            }

            if (character.isSprinting)
            {
                BaseMoveSpeed *= character.GetFieldValue <float>("sprintingSpeedMultiplier");
            }


            //SpeedBonus
            if (character.HasBuff(BuffIndex.BugWings))
            {
                SpeedBonus += 0.2f;
            }
            if (character.HasBuff(BuffIndex.Warbanner))
            {
                SpeedBonus += 0.3f;
            }
            if (character.HasBuff(BuffIndex.EnrageAncientWisp))
            {
                SpeedBonus += 0.4f;
            }
            if (character.HasBuff(BuffIndex.CloakSpeed))
            {
                SpeedBonus += 0.4f;
            }
            if (character.HasBuff(BuffIndex.TempestSpeed))
            {
                SpeedBonus += 1;
            }
            if (character.HasBuff(BuffIndex.WarCryBuff))
            {
                SpeedBonus += .5f;
            }
            if (character.HasBuff(BuffIndex.EngiTeamShield))
            {
                SpeedBonus += 0.3f;
            }

            SpeedBonus += ModItemManager.GetMultiplierForStat(character, StatIndex.MoveSpeed);
            if (character.isSprinting)
            {
                SpeedBonus += ModItemManager.GetMultiplierForStat(character, StatIndex.RunningMoveSpeed);
            }
            if (character.outOfCombat && character.outOfDanger)
            {
                SpeedBonus += ModItemManager.GetMultiplierForStat(character, StatIndex.SafeMoveSpeed);
                if (character.isSprinting)
                {
                    SpeedBonus += ModItemManager.GetMultiplierForStat(character, StatIndex.SafeRunningMoveSpeed);
                }
            }

            //Debuff Speed
            float SpeedMalus = 1f;

            if (character.HasBuff(BuffIndex.Slow50))
            {
                SpeedMalus += 0.5f;
            }
            if (character.HasBuff(BuffIndex.Slow60))
            {
                SpeedMalus += 0.6f;
            }
            if (character.HasBuff(BuffIndex.Slow80))
            {
                SpeedMalus += 0.8f;
            }
            if (character.HasBuff(BuffIndex.ClayGoo))
            {
                SpeedMalus += 0.5f;
            }
            if (character.HasBuff(BuffIndex.Slow30))
            {
                SpeedMalus += 0.3f;
            }
            if (character.HasBuff(BuffIndex.Cripple))
            {
                ++SpeedMalus;
            }

            BaseMoveSpeed += ModItemManager.GetBonusForStat(character, StatIndex.MoveSpeed);
            if (character.isSprinting)
            {
                BaseMoveSpeed += ModItemManager.GetBonusForStat(character, StatIndex.RunningMoveSpeed);
            }
            if (character.outOfCombat && character.outOfDanger)
            {
                BaseMoveSpeed += ModItemManager.GetBonusForStat(character, StatIndex.SafeMoveSpeed);
                if (character.isSprinting)
                {
                    BaseMoveSpeed += ModItemManager.GetBonusForStat(character, StatIndex.SafeRunningMoveSpeed);
                }
            }

            float MoveSpeed = BaseMoveSpeed * (SpeedBonus / SpeedMalus);

            if ((bool)character.inventory)
            {
                MoveSpeed *= 1.0f - 0.05f * character.GetBuffCount(BuffIndex.BeetleJuice);
            }

            return(MoveSpeed);
        }