fallout.ru

Отслеживание неполадок

Основные приёмы

  • Хороший способ искать ошибку – вставлять в ключевые места Вашего скрипта функции вызова соответствующих окон сообщения.
  • Если Вы постоянно получаете сообщение об ошибке, которую не можете найти, удаляйте подозрительные строки одну за одной (помечая их знаком комментария “;”), пока не найдёте то, что Вам нужно.
  • Уделяйте внимание тем сообщениям об ошибке, которые выдаёт Вам Конструктор и игра. Обычно они позволяют определить примерный источник неполадки.

Консоль

Проверка значения переменных с помощью консоли

В игре можно использовать консоль для проверки состояния переменных. Вызовите окно консоли (кнопка «тильда», что левее кнопки, печатающей восклицательный знак или единицу) и напишите “sv”, что выведет список всех глобальных переменных и их значений. Теперь найдите объект, к которому прикреплён работающий скрипт. Откройте консоль, щелкните левой кнопкой мыши по выбранному Вами объекту (при этом изменится заголовок окна консоли) и напишите “sv” – Вы получите всех локальных переменных данного крипта с их значениями.

Использование консоли для быстрой проверки Вашего скрипта

Вы можете использовать консоль для проверки многих граней Вашего мода. Например, выпишете ID Вашего объекта и напишите в консоли следующую строку:

PlaceatPC "My_Object" 1,1,1

Объект появится прямо у Вас под ногами.

Player -> AddItem "My_Object", 1

Объект появится у Вас в инвентаре.

Для того, чтобы мгновенно перенестись в необходимую Вам локацию, в консоли напишите:

coc "имя локации"

для перемещения в интерьер или

coe –1,-7

Для перемещения в определённое место глобальной карты (координаты можно посмотреть в редакторе). “coc” также может подойти для перемещения по глобальной карте. Однако не у всех внешних локаций есть уникальное имя, поэтому перемещение может произойти не совсем туда, куда бы Вам хотелось. Но всё равно, пример “coc balmora” перенесёт игрока куда-то в Балмору.

tcl

Переключает соприкосновения – проходите сквозь стены и достигайте тех мест, до которых обычным путём добраться проблематично.

tgm

Включить/выключить режим Бога – тестируйте Ваш мод без боязни, что Вас убьёт один из Ваших же монстров.

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

  1. Откройте консоль
  2. Напишите “tcs” и нажмите на “Enter”
  3. Щелкните право кнопкой мышки куда-нибудь вне окна консоли, чтобы продолжить игру, несмотря на то, что окно консоли так и останется открытым и активным.

И всё. Существует также альтернатива команде “tcs”. Например, “tks” и “tms”. Все эти аббревиатуры расшифровываются как “Toggle ??? statistics” («Включить статистику по ???»), где ??? может быть «битва» (combat = c), «магия» (magic = m), «убийства» (kill = k) или то, что нужно Вам.

Сообщения об ошибках, огрехах в расчётах и их причины

Сообщение об ошибках, которые можно увидеть в игре

"EXPRESSION in script..."
после чего может идти
"RightEval ..."
Эта ошибка означает, что переменная не была объявлена. Чаще всего такое случается с переменными, которые похожи на функции (например, PCEquip).
"LeftEval"
Эта ошибка появляется, когда Вы случайно объявили функцию, как переменную. Следующие строки кода вызовут эту ошибку:

short ScriptRunning
if (ScriptRunning "MyScript" == 1 )

Обе эти ошибки могут быть вызваны так же отсутствием пробелов там, где это необходимо. Советую всегда оставлять пробелы вокруг скобок.
Конструкция типа “If (OnActivate == 1)”, вместо “if ( OnActivate==1 )” редко выдаёт ошибку, но иногда всё же является её причиной. Поверьте мне.

Ошибка «Инфикс-Постфикс»

Обычно указывает на плохой синтаксис. Чаще всего вызывается неправильным вызовом стрелки ->. Строку

set somevar to actorID->GetHealth

Следует изменить на

set somevar to ( actorID->GetHealth )

Также эта ошибка может быть вызвана тем, что Вы забыли объявить переменную, похожую на функцию. Например, OnPCEquip.

Неправильно работают команды перемещения

Обычной причиной является неправильное задание координат (например, был опущен «-» или число имеет слишком много знаков). Как-то раз у меня была ошибка, когда вместо одного «-» я поставил 2 подряд. В редакторе линия выглядела одной сплошной, хоть и ненамного длиннее.

Дублирование NPC

Дублирование NPC происходит, в основном, случайно, когда старая версия плагина переписывается новой, а информация об NPC из старой версии остаётся в сохранённых играх. Это приводит к клонированию персонажа, даже если Вы просто поменяли в его скрипте один знак. Чтобы избежать этого, загружайте мод в соседней локации или оставляйте название плагина неизменным.

Игра «вылетает» во время выполнения скрипта

К сожалению, существует множество возможных причин. Например, Вы забыли сделать скрипт одноразовым, из-за чего объёмный код выполняется каждый фрейм. Или Вы удаляете объект с помощью скрипта этого самого объекта. Использование функции Equip на чём бы то ни было кроме напитков (исправлено в Трибунале), кастование направленных скриптов с активаторов (исправлено в Трибунале), использование функции AIActivate на дверях, которые ведут в другие локации, попытка использовать функцию PlaceItem вместе с тем объектом, скрипт которого в данный момент выполняется. Использование функции SetDelete на объекте, удалить который нельзя – всё это заставит игру «вылететь».

Игра «вылетает» во время загрузки плагина

Самая распространённая причина – слишком объёмные вычисления. Также возможной причиной может стать использование более чем 20 переменных в одной строке кода. Попытайтесь разбить подобную строку на несколько меньших по размеру.

Сообщения об ошибках в редакторе

В редакторе всегда показывается номер строки, в которой была совершена ошибка, поэтому исправить её довольно легко.

"Mismatched If/else/endif starting on line..."

Не закрыта одна или несколько условных конструкций. Для их наглядного разграничения можно использовать табуляцию. Также Вы можете встретиться с этой ошибкой, если сделали опечатку в имени какой-либо функции или переменной.

"Function reference object "Foobject" not found"

Ошибка сообщает, что объект, к которому относится, допустим, эта строка кода:

Foobject -> GetDistance Player

не существует. Когда Вы пишите скрипт и одновременно создаёте новый объект, Вы также получите эту ошибку. Закройте редактор, чтобы Ваш объект зарегистрировался компилятором.

"Could not find variable or function "Foobject""

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