Только присваивание, вызов, увеличение, уменьшение, ожидание и новые выражения объекта

Вчера я отправил вопрос об этом коде, но сделал это... очень плохо. С тех пор я разговаривал со своим другом, который очень хорошо разбирается в программировании, и пробовал кое-что, но я действительно уперся в стену. Я пытался смотреть на другие вопросы того же согласия, но ни одно из их решений не помогло мне...

То, что я пытаюсь сделать, это перезаписать «эффективность». Сервер оценивает эффективность как 4 или 5 (я не уверен, какой именно, но определенно один из двух - в любом случае не имеет значения). Я хочу, чтобы он воспринимал его как 7 или выше. Я понял, как вызывать данные об эффективности с сервера, но, похоже, это все еще не работает. Эффективность 4/5 дает мне текст "Это не очень эффективно...", который продолжает появляться, когда я пытаюсь использовать код.

Это мой код (в нем намного больше, но я удалил то, что не имеет значения):

public partial class Main {
    public static int effectiveness;
    public static void BeforeMoveHits(BattleSetup setup) {
        try {
            if (setup.Defender != null) {
                switch (setup.Move.AdditionalEffectData3) {
                    case 69: { //Freeze Dry
                            if (setup.Defender.Type1 == Enums.PokemonType.Water ||
                                setup.Defender.Type2 == Enums.PokemonType.Water) {  
                                DamageCalculator.Effectiveness[256];
                            }
                        }
                        break;
                     }
                 }
         }
    }
}

Как написано в плитке, при попытке скомпилировать выдает ошибку

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

То

public static int effectiveness

остался после того, как я попытался использовать «эффективность = 8» вместо DamageCalculator.Effectiveness. Его удаление ни на что не влияет, поэтому я оставил его там на случай, если он мне понадобится позже.

В DamageCalculator.cs вот что задает эффективность:

public static int[] Effectiveness = new int[9] {2, 8, 16, 64, 96, 160, 256, 416, 640};

Вы можете просмотреть полный код здесь полезный.

В BattleProcessor.cs также есть лакомый кусочек информации об эффективности, хотя я сомневаюсь в ее актуальности, так как продолжаю над этим работать...

    public static string EffectivenessToPhrase(int effectiveness) {
        if (effectiveness < 4) {
            return "It has little effect...";
        } else if (effectiveness < 6) {
            return "It's not very effective...";
        } else if (effectiveness == 7) {
            return "It's super-effective!";

        } else if (effectiveness > 7) {
            return "It's super-effective!!!";
        } else {
            return null;
        }
    }

Это полный код BattleProcessor.cs, если вам это нужно.

Стоит отметить, что я не могу изменить BeforeMoveHits с void, и я не могу не могу изменить Main ни на что, кроме частичного. Это сломает другие части игры, для которых это сделано. При этом, если изменение эффективности невозможно из-за этих обстоятельств, просто скажите мне. Я... попытаюсь придумать что-нибудь еще, чтобы делать то, что я хочу.


c#
person Scopo    schedule 15.10.2016    source источник


Ответы (3)


Нет смысла утверждать

DamageCalculator.Effectiveness[256];

этот оператор возвращает значение, которое вы вообще не используете. вам нужно как минимум сохранить значение, которое вы возвращаете, в какой-либо переменной, чтобы использовать его позже. Или почему ты действительно это делаешь.

следующий оператор устранит ошибку времени компиляции.

var temp = DamageCalculator.Effectiveness[256];

Кстати

DamageCalculator.Effectiveness[256];

выдаст исключение после того, как вы сделаете так, чтобы код мог быть скомпилирован. Исключением будет IndexOutOfRangeException и в это время решить эту проблему следующим оператором

DamageCalculator.Effectiveness[6]
person Hakan Fıstık    schedule 15.10.2016
comment
К сожалению, это не сработало. Это по-прежнему делает эффективность меньше 6. Спасибо, что рассказали мне о том, что выходит за пределы допустимого диапазона, и о том, что ничего не значит! - person Scopo; 15.10.2016

Ваше утверждение «Расчет урона.эффективность[256]» не имеет смысла. Здесь вы ничего не определяете и не назначаете. Я думаю, поэтому компилятор жалуется. Вы неправильно используете массив. Просто используйте простое целое число, чтобы установить эффективность. Если вы хотите, чтобы эффективность была установлена ​​на этих конкретных числах, вы должны использовать счетчики.

person Frank Stefan    schedule 15.10.2016
comment
Простите, я новичок... Что вы имеете в виду под целым числом? Вы имеете в виду что-то вроде эффективности? Потому что если так, то это не работает. Я уже попробовал и исчерпал его. И что вы подразумеваете под использованием счетчиков? Еще раз извините, я действительно новичок в C#... - person Scopo; 15.10.2016
comment
@Foxwells Да, я имею в виду использование эффективности int. Затем установите эффективность, насколько эффективным был ход: эффективность = 256; Вот документация по перечислителям: ссылка - person Frank Stefan; 15.10.2016
comment
int эффективность не работает. Журнал боя по-прежнему называет ход не очень эффективным. Спасибо за ссылку, кстати. - person Scopo; 15.10.2016

Если код, который вы связали для класса BattleProcessor, на самом деле в основном прокомментирован, как я его вижу, тогда вы можете

  • использовать его EffectivenessToPhrase() метод, передав ему достаточно высокий effectiveness параметр

    string effectivenessToPhrase =  BattleProcessor.EffectivenessToPhrase(7);
    

    это повлияет только на вывод ToPrhase

  • измените значения Effectiveness[], чтобы имитировать более высокие индексы:

    DamageCalculator.Effectiveness[4]=256;
    DamageCalculator.Effectiveness[5]=256;
    

    это повлияет на любой код, который будет использовать DamageCalculator.Effectiveness

    затем вы должны вернуть эти значения к исходным (соответственно, 96 и 160), как только ваша задача будет выполнена

person user3598756    schedule 15.10.2016
comment
Дело в том, что я не могу редактировать эти файлы. Это серверные файлы, которые хранятся у основателя игры. У меня есть доступ только к очень небольшой части кода. Тем не менее... Есть ли способ заставить его сказать, что его эффективность равна 7, а затем просто сделать множитель урона, чтобы получить эффект эффективности 7? - person Scopo; 15.10.2016
comment
мои решения для ответов не требуют редактирования этих классов, поскольку и метод EffectivenessToPhrase(), и массив Effectiveness[] объявлены как Public. Таким образом, вы просто вводите эти фрагменты кода в свой метод BeforeMoveHits(). - person user3598756; 15.10.2016
comment
Хм... Изменение калькулятора урона, похоже, сработало, но фраза эффективности ничего не дала. Он по-прежнему говорит, что этот шаг не очень эффективен. - person Scopo; 15.10.2016
comment
поскольку, как вы сейчас указали, вам нужен множитель урона, чтобы получить эффект эффективности 7, тогда change Effectiveness[] values часть моего ответа должна подойти (и предупреждение тоже применимо!). Таким образом, вы повлияете на оператор dmg *= DamageCalculator.Effectiveness[effectiveness]; в классе BattleProcessor , а для последующего оператора dmg *= setup.Multiplier вам также потребуется доступ к свойству setup.Multiplier. - person user3598756; 15.10.2016
comment
Нет-нет, мне /не нужно/ повышать множитель урона. Это прекрасно работает. Моя проблема в том, что в боевом журнале, где он говорит об эффективности, он все равно отображается как не очень эффективный prntscr.com /cu2b50 -- Если я не понял, что вы сказали? Ты немного потерял меня там. - person Scopo; 15.10.2016
comment
Изменение массива DamageCalculator.Effectiveness[] работает, потому что он действительно используется методом расчета реального урона. В то время как мое effectivenessToPhrase предложение было способом искусственно получить нужную фразу из BattleProcessor.EffectivenessToPhrase() общедоступного метода. Но, конечно же, тот, кто все еще говорит, что ход не очень эффективен, использует тот же метод, но передает ему значение effectiveness, рассчитанное таким образом, что не используется массив DamageCalculator.Effectiveness[]. Таким образом, вы либо получаете класс/метод, ответственный за это высказывание, либо остаетесь такими, какие вы есть. - person user3598756; 15.10.2016
comment
Хм... Значит, вы говорите, что мне нужно искать какой-нибудь калькулятор, определяющий эффективность, но не использующий Damagecalculator. Effectiveness? Просто прошу разъяснений. - person Scopo; 15.10.2016
comment
Поскольку вас больше всего беспокоит эта фраза, вам просто нужно найти кто ее произносит. Вероятным виновником mots является класс, вызывающий BattleProcessor.EffectivenessToPhrase(). - person user3598756; 15.10.2016
comment
За исключением того, что я сделал ваше предложение изменить Battleprocessor.efficientnesstophase, и это ничего не дало. - person Scopo; 15.10.2016
comment
Я вас не понимаю: что вы изменили и где? Если вы говорите, что просто поместили string effectivenessToPhrase = BattleProcessor.EffectivenessToPhrase(7); в свой метод BeforeMoveHits(), то он не должен ничего делать, кроме сохранения правильной фразы в строке effectivenessToPhrase для последующего использования. Посмотрите: поставьте точку останова на строку с DamageCalculator.Effectiveness[4]=256; , а затем пройдитесь по коду построчно, чтобы увидеть, какой оператор вызывает высказывание: ход не очень эффективен. - person user3598756; 15.10.2016
comment
Я скопировал/вставил ваши коды и поместил их в дело 69. Предполагается, что все это относится к делу 69. Я не хочу, чтобы что-то еще было затронуто. - person Scopo; 15.10.2016
comment
поставить точку останова на строке с DamageCalculator.Effectiveness[4]=256; а затем пройдитесь по коду строка за строкой, чтобы увидеть, какой оператор вызывает высказывание: ход не очень эффективен. - person user3598756; 15.10.2016
comment
Я не могу этого сделать. Я не владею файлами сервера за очень небольшой частью. Вот и я понятия не имею, как это сделать. - person Scopo; 15.10.2016
comment
когда вы находитесь в Visual Studio, выберите строку с DamageCalculator.Effectiveness[4]=256 и нажмите F9. Затем запустите свою программу, когда она остановится на этой строке, вы продолжаете нажимать F11, чтобы пройти через каждую последующую строку и посмотреть, где вы прыгаете. - person user3598756; 15.10.2016
comment
Я не использую визуальную студию. Я использую внутриигровой редактор скриптов. Мой ноутбук не может работать с VS. У меня может быть друг, который делает, хотя? - person Scopo; 15.10.2016
comment
Надеюсь, что так. Тем временем вы можете пометить мой ответ как принятый, поскольку он исправил ошибку, и вы переписали эффективность в его существенной части. Спасибо - person user3598756; 15.10.2016
comment
За исключением того, что это не удалось, и теперь я использую странный метод обхода, который устанавливает тип покемона на Летающий, а затем сразу же забирает его после удара, потому что я стал нетерпеливым, а ваш ответ был головокружительно запутанным. - person Scopo; 15.10.2016
comment
так что Изменение калькулятора повреждений помогло, не так ли? - person user3598756; 15.10.2016
comment
Это было правдой, но мне не нужна была помощь с калькулятором урона. Я уже знал, как получить урон так, как я хотел. Моя главная проблема заключалась в том, что он продолжал показывать свою не очень эффективность, и ваш ответ не решил эту проблему. - person Scopo; 15.10.2016
comment
Ваш пост был об ошибке (и назван в ее честь). Мой ответ разрешил это, сказав, что вы должны использовать DamageCalculator.Effectiveness[4]=256; там, где вы набрали DamageCalculator.Effectiveness[256];. И это все. Согласно правилам этого сайта, я ответил на ваш вопрос. Если вы хотите остаться в SO, вы должны следовать его правилам, которые я рекомендую вам внимательно прочитать. - person user3598756; 15.10.2016
comment
ни один из тех ответов, которые сказали вам использовать DamageCalculator.Effectiveness[4]=256, как это сделал мой. Я также оказался единственным ответившим, который пытался помочь вам в дальнейших разработках, в то время как другие этого не сделали. Теперь, поскольку вы не могли сделать все эти другие вещи, вы принимаете ответ, который вы сами прокомментировали К сожалению, это не сработало. Это по-прежнему делает эффективность меньше 6, чтобы наказать меня. Что ж, это действительно интересное дело для очень умных психиатров. - person user3598756; 15.10.2016