thienha1 Ответов: 2

Как можно обойти это исключение?


Вот мой код:
public static class Damage
    {
        public static double RDamage(AIBaseClient target)
        {
            return new double[] { 100, 200, 300 }[SpellManager.R.Level - 1] + (0.75 * Player.Instance.FlatPhysicalDamageMod) + (1.5 * Player.Instance.FlatPhysicalDamageMod) + (0.2 * target.BuffCount("dariushemo"));
        }

        public static double RDamage(AIBaseClient target, int stack)
        {
            if (stack == 5)
            {
                var bonus = 0f;
                if (!Player.HasBuff("DariusNoxonTactictsONH"))
                    bonus = new float[] { 0, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 85, 95, 105, 130, 155, 180, 205, 230 }[Player.Instance.Level];

                return new double[] { 100, 200, 300 }[SpellManager.R.Level - 1] + (0.75 * (Player.Instance.FlatPhysicalDamageMod + bonus)) + (1.5 * Player.Instance.FlatPhysicalDamageMod) + (0.2 * stack);
            }

            return new double[] { 100, 200, 300 }[SpellManager.R.Level - 1] + (0.75 * Player.Instance.FlatPhysicalDamageMod) + (1.5 * Player.Instance.FlatPhysicalDamageMod) + (0.2 * stack);
        }
        public static double PassiveDamage(this AIHeroClient target)
        {
            float damagePerSec = (12 + Player.Instance.Level + 0.3f * Player.Instance.FlatPhysicalDamageMod) / 5;

            return (float)(ObjectManager.Player.CalculateDamage(target, DamageType.Physical, damagePerSec * target.BuffCount("dariushemo") * target.BuffRemainTime("dariushemo")));
        }

        public static float PassiveDamage(this AIHeroClient target, int second)
        {
            float damagePerSec = (12 + Player.Instance.Level + 0.3f * Player.Instance.FlatPhysicalDamageMod) / 5;

            return (float)(ObjectManager.Player.CalculateDamage(target, DamageType.Physical, damagePerSec * target.BuffCount("dariushemo") * target.BuffRemainTime("dariushemo") > second ? second : target.BuffRemainTime("dariushemo")));
        }

        public static float PassiveDamage(this AIHeroClient target, int stack, int second)
        {
            float damage = ((12 + Player.Instance.Level + 0.3f * Player.Instance.FlatPhysicalDamageMod) / 5) * stack * second;

            return (float)(ObjectManager.Player.CalculateDamage(target, DamageType.Physical, damage));
        }
    }

Теперь, когда я использую это
if (QTarget.GetResult().IsKillable)
                    return;

а это
if (Damage.RDamage(unit) > Health + Shield + unit.HPRegenRate)
            {
                result.IsKillable = true;

                if (unit.IsValidTarget(SpellManager.R.Range) && unit.PreviousPosition.Distance(Player.Instance.PreviousPosition) > SpellManager.R.Range)
                    result.Range = UltRange.FlashRRange;

                if (unit.IsValidTarget(SpellManager.R.Range))
                    result.Range = UltRange.RRange;
            }

и результат в Индекс находился за пределами массива. в c#

Дайте мне какое-нибудь решение, как решить эту проблему любым альтернативным способом, а затем дайте мне решение

по thienha1

Что я уже пробовал:

Я пробовал использовать try catch но мне нравится находить решение для того чтобы решить его полностью не иметь дело с ошибкой

MadMyche

Какая линия выбрасывает этот "индекс из диапазона"- обычно это лучшее место для начала

2 Ответов

Рейтинг:
0

OriginalGriff

Мы не можем вам сказать - для этого нужен ваш запущенный код и ваши данные вместе, чтобы узнать.
Так что все будет зависеть от тебя. К счастью, у вас есть инструмент, который поможет вам выяснить и исправить это: отладчик.
Google "Visual Studio debugger" и вы найдете инструкции о том, как его использовать - надуть перерыв пинты на метод, в котором возникает ошибка, и шаг за шагом смотреть, что происходит с любыми индексами вашего массива.
Когда вы узнаете, какой массив и какой индекс является проблемой, вы можете начать просматривать свой код, чтобы выяснить, почему.

Извините, но мы ничего не можем сделать для вас - время сформировать у вас новый и ценный навык: отладка!


Рейтинг:
0

Patrice T

Цитата:
Как можно обойти это исключение?

Единственный способ-исследовать проблему и внести исправления в код.
Цитата:
Дайте мне какое-нибудь решение, как решить эту проблему любым альтернативным способом, а затем дайте мне решение

Эти 3 части кода не связаны друг с другом, мы знаем, как это работает.
Только вы можете исследовать проблему: используйте отладчик, когда вы получаете ошибку, проверяйте переменные, используемые там, где происходит ошибка, переменная не содержит того, что должна.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Отладка кода C# в Visual Studio - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.