Перейти к содержанию

Дайджест за январь-март

Обновления гайдов и аддонов

Март Февраль Январь

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Изменения API в 15.1 и новый компилятор


Рекомендуемые сообщения

Обновление 15.0.00.41 от 01.02.2024

Новое API

  1. widget:GetPickChildrenOnly(),  widget:SetPickChildrenOnly( state ) - получение состояния \ изменение свойства PickChildrenOnly
  2. control3D:IsAddedAsWidget3D( widget ) - проверяет что widget добавлен как widget3D в данный control3D
  3. object.GetBuffBySysName( objId, sysName ) - ищет у объекта бафф с указанным sysName и возвращает его objId (int). Если не найден - вернет nil, если несколько - вернет первый найденный (порядок не определен), если объект не найден или не может холдить бафы - упадет в ошибку.
  4. userMods.RegisterEscSequence( state ), userMods.NotifyEscSequence( state, rank ) - обработка ESC последовательностей. Подробности ниже.

Появилась возможность встраивать аддоны в ESC-последовательность. То есть корректно обрабатывать нажатия эскейпа.
Разумеется, есть и некоторые ограничения:

  • Не более 5 эскейпов на аддон
  • Нельзя не реагировать на эскейп
  • Нельзя взять дедлок
  • Нельзя юзать API без проверок корректности

В случае нарушения этих пунктов аддон будет выброшен из EscSequenceManager и "забанен" в нем до релога.

Понять как оно работает можно на примере класса-враппера, который реализует удобную обертку над API.
EscapeSequencePlugInUserMods.lua

 

Ссылка на комментарий
Поделиться на другие сайты

Обновление 15.0.01.XX от 25.04.2024

Переход на LuaJIT версии 2.1

К сожалению, бинарные (скомпилированные) скрипты НЕ совместимы между 2.0 и 2.1
Однако они в любом случае несовместимы между х86 и х64, так что остается лишь принять данность.

LuaCompiller.zip

Отличия данной версии от апстрима luajit 2.1

  1. Недоступны функции: getfenv, setfenv, loadfile, load, dofile, newproxy
  2. Недоступны библиотеки: debug, os, io, package, string.buffer
  3. Добавлен ряд новых функций
    • table.sclone( tab ) - возвращает копию таблицы tab. Нерекурсивно, быстро, метаметоды игнорируются, метатаблица не копируется.
    • table.clone( tab ) - возвращает копию таблицы tab. Рекурсивно, с учетом метатаблиц. Только в составе клиента игры.
    • table.nkeys( tab ) - полный размер таблицы tab (общее число пар key-value где value != nil)
    • table.new \ table.clear включены по умолчанию, отдельно загружать не нужно
    • apitype( any ) - перенос common.GetApiType( any ) в рантайм, реализовано как builtin функция. API функция объявляется deprecated
    • isindexableudata( any ) - проверяет, является ли аргумент индексируемой userdata (см. ниже). Использовать только в отладочных целях.
  4. Вводится понятие индексируемой userdata - теперь большинство юзердат являются индексируемыми и могут использоваться в качестве ключей в таблицах по значению, соответственно сравнение через == и ~= также доступно. Не являются индексируемыми: WString, ValuedText, ValuedObject и ряд других.

ValuedText становится full compareable

Теперь можно использовать ==, ~=, <, >, <=, >= между двумя ValuedText. Сравнение лексикографическое без учета форматирования.

Новые API

  • common.IsWidget( any ) - проверяет что аргумент является виджетом (любого типа)
  • WidgetSafe:CreateChildByDesc( WidgetDesc ) - метод доступен для всех типов виджетов - создает виджет по описателю в качестве ребенка виджета из которого был вызван метод.
    • WidgetSafe:GetWidgetDesc() более не работает для FormSafe и InvalidWidgetSafe (явно падает в ошибку вместо возврата странных значений)
    • FormSafe:CreateWidgetByDesc( WidgetDesc ) остается без изменений, но объявляется deprecated - его функционал полностью замещается WidgetSafe:CreateChildByDesc( WidgetDesc )

Некоторые deprecated функции были удалены (список может расшириться)

  • common.SetTextValues
  • common.ExtractWStringFromValuedText
  • common.GetIntFromWString
  • common.TruncateWString
  • common.GetWStringLength

 

Ссылка на комментарий
Поделиться на другие сайты

Также замечено по сломавшемуся

1) Удален raid.IsPlayerInAvatarsRaidById

2) raid.GetMembers() - индексы теперь начинаются с 1, а не 0

Ссылка на комментарий
Поделиться на другие сайты

Спасибо, а что можно использовать вместо raid.IsPlayerInAvatarsRaidById ?

Ссылка на комментарий
Поделиться на другие сайты

Правки API рейда

Изменения

raid.IsLeader
	Добавлен опциональнй аргумент UniqueId || ObjectId
	Если рейдаа нет - вернет false (как и ранее)
	Если аргумент не передан - вернет статус лидерства MainPlayer (как и ранее)
	Если аргумент передан - вернет статус лидерства для данного id
raid.CanInvite
	Теперь аргумент опционален
	Если рейдаа нет - вернет false
	Если аргумент не прередан - вернет статус возможности приглашать в принципе
	Если аргумент передан - вернет статус возможности пригласить конкретного игрока
raid.GetMembers
	Добавлена проверка корректности в API
	Теперь индексация с 1
raid.GetMemberInfo
	Добавлена проверка корректности в API
	Теперь в качестве аргумента можно передать не только UniqueId но и ObjectId
raid.GetMemberRights
	Добавлена проверка корректности в API
	Теперь возвращает результат в виде hash_map< right, true >
raid.IsPlayerInAvatarsRaid
	Теперь принимает в качестве аргумента wstring || UniqueId || ObjectId
	Если рейда нет - вернет false
raid.IsPlayerInAvatarsRaidGroup
	Теперь принимает в качестве аргумента wstring || UniqueId || ObjectId
	Если рейда нет - вернет false


Новые API

raid.GetInviteInfo - Информация о приглашении в рейд
	Параметры - нет
	Возращаемое значение - таблица с полями
		invited - bool - есть активное приглашение
		inviterName - wstring - имя пригласившего (пустая строка при отсутствии)
		inviterShardName - wstring - название сервера пригласившего (пустая строка при отсутствии)

 

Удаленные API

raid.IsPlayerInAvatarsRaidById
raid.IsPlayerInAvatarsRaidGroupById

 

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

В 15.0.01.36 - при удалении виджета из скроллера теперь он становится видимым у того виджета у которого изначально создан. Теперь нужно его или скрывать или удалять.

Ссылка на комментарий
Поделиться на другие сайты

Обновление 15.0.01.36 от 21.06.2024

  1. Для виджета вводится понятие владельца
    1. Для виджетов созданных из ресурсов владелец - родительский виджет по иерархии ресурсов (как и ранее)
    2. Для динамических виджетов владелец - виджет из которого был вызван CreateChildByDesc для создания данного виджета (ранее всегда mainForm)
    3. Для детей динамических виджетов описанных в ресурсах (созданных автоматически при создании динамического виджета) - владелец определяется по общему правилу 1a (как и ранее)
  2. Теперь при удалении виджета из контейнера / как Widget3D он будет автоматически привязан к владельцу (ранее зависал без родителя)
  3. Теперь при уничтожении виджета будут уничтожены
    1. Виджеты которыми он владеет (независимо от того куда они определены детьми)(как и ранее)
    2. Его дети (независимо от того кто ими владеет)(ранее зависали без родителя)
    3. Пункт 3b не распространяется на элементы контейнера / Widget3D, перед удалением контейнера / Control3D они будут опустошены по правилам п.2
  4. Теперь из скриптов нельзя уничтожать формы

Вводится понятие внутренних (internal) виджетов.

Внутренне-системные запчасти сложный виджетов (Border у контейнера, Slider у скроллбара и тп).

Теперь они станут именованными (имя начинается с префикса "__", определяется в коде и не может быть изменено ресурсно) и, соответственно, доступными в скриптах.
Статус внутреннего является постоянным.

С внутренними виджетами нельзя производить ряд операций (будет выброшена ошибка при попытке):

  1. Уничтожение (DestroyWidget)
  2. Получение описателя (GetWidgetDesc)
  3. Смена имени (SetName)
  4. Смена приоритета (SetPriority)
  5. Смена родителя (как аргумент в AddChild, PushBack, PushFront, Insert, AddWidget3D)
  6. Создание привязанных дочерних виджетов (CreateChildByDesc)

Обычные виджеты помещенные в контейнер или как Widget3D (container member).

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

С такими виджетами можно делать все, кроме:

  1. Менять родителя
  2. Добавлять в контейнер

А и еще из общих рекомендаций. Было обнаружено, что если уничтожить (или выбросить из сцены) виджет, который приаттачен к объекту в Control3D (не просто добавлен в сцену, а именно приаттачен), то клиенту сильно поплохеет. Даже если это уничтожение было при рестарте аддона. Состояние клиента нормализуется когда объект пропадет из числа доступных. (Будет исправлено.)

 

 

Изменено пользователем LEM
Уточнения от UIAddon
Ссылка на комментарий
Поделиться на другие сайты

Новость на сайте не точная, можно создавать от своей формы и других пользовательских аддонов, нельзя от системных форм и виджетов. Нужно создать от своей и затем вызвать AddChild в нужный системный

Ссылка на комментарий
Поделиться на другие сайты

Изменение в логике загрузки скриптов аддонов

  1. Рекомендуется (пока рекомендуется) чтобы в AddonDesc расширение всех файлов скриптов было ".lua"
  2. При загрузке скрипта порядок действий
    1. Если клиент х86 - грузим ИМЯ_ФАЙЛА + "c.x86", если x64 - соответственно ИМЯ_ФАЙЛА + "c.x64". В случае отсутствия файла / ошибки чтения идем далее
    2. Грузим ИМЯ_ФАЙЛА + "c". В случае отсутствия файла / ошибки чтения идем далее
    3. Грузим ИМЯ_ФАЙЛА. В случае отсутствия файла / ошибки чтения генерируем ошибку и записываем в лог.

Рекомендуется поддержать ее заранее, до того момента когда изменение станет актуально.

Для выбора правильной версии чанков динамической подгрузки (loadstring) чуть позже появится API common.GetClientArch() с вариантами CLIENT_ARCH_WIN32, CLIENT_ARCH_WIN64 (название может быть изменено).

Изменено пользователем LEM
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования