LuxelWorldMap

Просмотры: 54
  • ŔØ₲ŲĒᏃ᙭Ċ 🌌™ 🅳🆅🆁🅺 Разработчик

Ошибки API меток

Если создание или поиск метки вернули NULL, прочитайте GetLastError() у серверного или клиентского API. Если не сработал метод полученной метки, например Apply(), спрашивайте ошибку у этой метки. У FlushMarkerWrites ошибка возвращается через выходной аргумент. Сохраните строку сразу после отказа: следующий вызов может её изменить.

У карты два вида ошибок. Строка с # уже является ключом перевода: для показа игроку передайте её в Widget.TranslateString на клиенте. Строка без # является служебным кодом API, а не ключом из таблицы переводов. Для неё выберите действие или свой перевод. В условиях сравнивайте исходную строку, не переведённый текст. Ниже перечислены ошибки личных, серверных и временных клиентских меток; у интеграций групп свои ответы.

У временной метки SetPositionDynamic() требует первого Apply() и отсутствия подготовленных правок, иначе вернёт LXWM_NOT_PUBLISHED или LXWM_PENDING_CHANGES. При проверке временной записи используются общие ключи #LXWM_ServerMarkerInvalid... и #LXWM_ServerMarkerIDUsed, хотя запись не отправляется на сервер. Ошибки личного хранилища и записи серверных файлов к ней не относятся. После отключения временная метка удалена: получить её по старому ID при новом подключении нельзя.

Служебные коды

Значение Что произошло и как поступить
LXWM_NOT_READY Миссия или клиентские данные ещё не готовы, либо объект остался от законченной миссии. После переподключения получите метку заново по ID.
LXWM_MARKER_NOT_FOUND Объект больше не существует или запись с таким ID недоступна в этом источнике. Отсутствие записи на клиенте не доказывает, что её удалили с сервера.
LXWM_READ_ONLY У объекта нет права прямой записи. Серверная метка на клиенте только для чтения; администратор может использовать штатный редактор.
LXWM_NOT_PUBLISHED Для этой операции нужна опубликованная метка. Например, нельзя перемещать серверный черновик через SetPositionDynamic до первого Apply().
LXWM_PENDING_CHANGES У объекта есть неподтверждённые правки или он ещё черновик. Для опубликованного объекта выберите: принять правки через Apply() или отказаться от них через Refresh().
LXWM_INVALID_ARGUMENT Неверный аргумент метода, например цвет, скорость или позиция копии. Исправьте конкретное поле; повторный Apply() с теми же данными не поможет.
LXWM_STORAGE_UNAVAILABLE Личное хранилище клиента пока недоступно для записи. Проверьте CanWritePersonalMarkers().
LXWM_INVALID_MARKER Личная метка не прошла проверку. Проверьте название, иконку, координаты, цвет и параметры зоны.
LXWM_MARKER_ID_USED ID нового личного черновика уже занят. Создайте новый черновик, не удаляйте существующую запись.
LXWM_ZONE_FORBIDDEN При сохранении личной метки отклонена зона. Проверьте CanUsePersonalZones(); при необходимости предложите игроку обычную точку.
LXWM_SAVE_FAILED Не удалось сохранить изменение личной базы. Проверьте клиентский профиль и права процесса игры на запись.
LXWM_MARKER_UNAVAILABLE Клиентский объект нельзя использовать для действия в меню: например, он недействителен, ещё не опубликован или имеет неподтверждённые правки.
LXWM_ACTION_UNAVAILABLE Объект есть, но действие не сработало. Проверьте, открыта ли карта, доступна ли панель метки и разрешено ли выбранное действие.

Ключи перевода

Это строки, которые можно получить при проверке, изменении или сохранении серверной метки. Временная клиентская метка использует те же ключи проверки для поддерживаемых ею полей. Предварительная проверка самого объекта иногда отклоняет аргумент раньше и возвращает LXWM_INVALID_ARGUMENT, поэтому не рассчитывайте на один и тот же код для любого неправильного значения.

Ключ Что проверить
#LXWM_ServerMarkerInvalidID ID: от 1 до 64 латинских букв, цифр, дефисов и подчёркиваний. Зарезервированные имена Windows не подходят.
#LXWM_ServerMarkerIDUsed ID уже занят, в том числе если отличается только регистр букв. В переводе есть %1: подставьте ID, который пытались назначить.
#LXWM_ServerMarkerNotFound Обработчик не нашёл запись для изменения, удаления или движения. Проверьте актуальный ID.
#LXWM_ServerMarkerInvalidName Название пустое или длиннее 256 символов по LengthUtf8().
#LXWM_ServerMarkerInvalidWorld Не задан игровой мир метки. Не подставляйте вместо него адрес сервера.
#LXWM_ServerMarkerInvalidIcon Проверьте, каким методом задана иконка. Для SetMarkerIconID() нужен ID Lucide, например map-pin. Для SetMarkerIconPath() нужен путь к файлу .paa или .edds внутри аддона (до 255 байт), без буквы диска, URL или перехода ... После отказа исправьте путь или передайте пустую строку и повторите Apply().
#LXWM_ServerMarkerInvalidPosition Одна из трёх координат некорректна: например, не является числом или по модулю больше 10000000.
#LXWM_ServerMarkerInvalidColor В цвете метки не три компонента RGB или значение вне диапазона 0–255.
#LXWM_ServerMarkerInvalidZone Неверные настройки зоны: форма, размеры или цвета. Проверяются и размеры, не используемые текущей формой.
#LXWM_ServerMarkerInvalidVisibilityRadius Радиус показа должен быть больше 0 и не больше 10000000 м. Это не радиус нарисованной зоны.
#LXWM_ServerMarkerInvalidAudience В списке получателей есть некорректный SteamID64. Передавайте каждый ID отдельной строкой массива.
#LXWM_ServerMarkerInvalidAnimations Неверный набор эффектов: проверьте формат ID, число записей (до 16) и скорости (от 0.05 до 10).
#LXWM_ServerMarkerInvalidRequest Обработчик не принял данные запроса. Не путайте этот отказ с потерей соединения.
#LXWM_ServerMarkerWriteFailed Сервер не смог безопасно изменить файлы. Проверьте серверный лог и права на запись, переименование и удаление в профиле.

Ответы штатного редактора: #LXWM_ServerMarkerNotAdmin означает, что сервер не подтвердил права; #LXWM_ServerMarkerCopyLimit ограничивает одну операцию размещения 1–128 копиями; #LXWM_ServerMarkerTimeout означает, что клиент не дождался ответа. При таймауте операция уже могла завершиться. Проверьте актуальное состояние перед повтором. Это ответы интерфейса, не результат GetLastError() сразу после OpenEditor(). Ошибки телепорта и интеграций групп к обычной метке не относятся.

Если API вернул #LXWM_ServerMarkerWriteFailed, а причина неясна, в серверном логе может быть более точная диагностика. Эти ключи описывают состояние файлов; не ожидайте их напрямую от Apply():

Ключ в диагностике хранилища Что означает
#LXWM_ServerMarkerFileOccupied Имя файла уже занято другой записью. Не перезаписывайте её вручную.
#LXWM_ServerMarkerInvalidJSON Не удалось прочитать JSON. Проверьте доступ, синтаксис и типы полей; ошибка чтения сама по себе не означает, что метки нет.
#LXWM_ServerMarkerInvalidStorageKey Некорректный внутренний ключ хранилища. Это не публичный ID, который задаётся через SetMarkerID().
#LXWM_ServerMarkerDuplicateFileID Один публичный ID встретился в нескольких файлах.
#LXWM_ServerMarkerDuplicateStorageKey Обнаружены файлы с одинаковым внутренним ключом и одной ревизией.
#LXWM_ServerMarkerIncompleteBatch Нет подтверждения завершения пакетного копирования. Не удаляйте файлы для восстановления до проверки резервной копии.

Пример: показать причину отказа

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

string DescribeMarkerFailure(string FailureCode, string RequestedMarkerID)
{
	if (FailureCode == "#LXWM_ServerMarkerIDUsed")
	{
		return string.Format(Widget.TranslateString(FailureCode), RequestedMarkerID);
	}
	if (FailureCode == "LXWM_MARKER_NOT_FOUND")
	{
		return Widget.TranslateString("#LXWM_ServerMarkerNotFound");
	}
	if (FailureCode.IndexOf("#") == 0)
	{
		return Widget.TranslateString(FailureCode);
	}
	return FailureCode;
}

Не все действия работают с кодами ошибок. Например, FocusPlayer() и CloseMap() сообщают об отказе через false, но не записывают причину в GetLastError(). После таких вызовов там может оставаться ошибка от предыдущего поиска метки.