Оповещение об ошибках

Различные функции могут быть использованы неправильно. Когда это происходит, вы можете добавить вывод сообщений об ошибке в функцию. Но будет ли записано это сообщение в журнал (историю команд) сервера в многопользовательской игре? Не забудете ли вы использовать PrintBold вместо Print, если ошибку вызовет не игрок? Что если вы захотите возможность отключения оповещений об ошибках? И вообще, как библиотека должна уведомлять вас об ошибках?

Для решения всех этих проблем ACSUtils предоставляет стандартизированный обработчик ошибок. Сообщения об ошибках вызываются с помощью набора функций, которые передают их в пользовательский обработчик ошибок вашего проекта (смотрите статью Именованные скрипты).

#define ACSUTILS_ERROR_HANDLER myproject_errorhandler
#include "acsutils.acs"
script myproject_errorhandler (int type, int message)
{
Log(s:"error: ", s:message); // Запись в историю команд сервера
printbold(s:"error: ", s:message); // Вывод ошибки всем игрокам
}

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

Обработчик ошибок также принимает тип ошибки. Существуют следующие типы ошибок:

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

ACSERROR_MAPPING – ошибка маппинга, должно быть вызвано, когда, например, нужный актор не присутствует на карте.

ACSERROR_LIMIT – лимит был достигнут и должен быть увеличен. Например, HudPushState() вызовет эту ошибку, если вы попытаетесь сохранить слишком много состояний рендерера.

Функции сообщения об ошибках

Чтобы сообщить об ошибке, используйте одну из функций ниж, соответствующих вышеописанным типам ошибок:

ProgramError (Программная ошибка)

void ProgramError(str message)

Вызывает ACSERROR_PROGRAM с указанным сообщением.

MappingError (Ошибка маппинга)

void MappingError(str message)

Вызывает ACSERROR_MAPPING с указанным сообщением.

LimitError (Превышение лимитов)

void LimitError(str message)

Вызывает an ACSERROR_LIMIT с указанным сообщением.