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

Дайджесты за январь-февраль

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

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

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

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

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

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

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

Подробнее

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

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

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

ramirez

Разработчик аддонов
  • Постов

    224
  • Зарегистрирован

  • Посещение

Весь контент ramirez

  1. Quote: In mass pvp it ends up in many lags Did you tested it for real, or just guessing? Cause i did synthetic tests on all visible units simultaneously (~50 units in list, one click - all of them got "damaged"), and it worked fine.
  2. Quote: дорастет до альтернативы CT_Total? Не, я не собираюсь показывать, чем били/лечили.
  3. Quote: Какой то из стандартных (а может и не 1 из них) тоже вешает 2D виджеты. Это ContextDamageVisualization. Выключить, и все заработает. Quote: Может есть какой то способ определить висит виджет на обьекте или нет? Нет такого способа. Аддон должен помнить, что куда повесил. Из чего следует, что такой аддон может быть только один, либо аддоны должны активно держать друг друга в курсе.
  4. Quote: PS. По поводу пробелов: Есть какой-нибудь способ табуляции выводимого текста? Пряморукого способа нет. Разрабы игнорируют все спец-символы, а свойства для табуляции не предоставили. Только для выделения абзацев. Можно извращаться с предзаготовленными ValuedText'ами, в которых пробивать необходимое количество пробелов, но это неэффективно.
  5. Quote: хотя, некоторые галки наверно бессмысленны Почти все перечисленные бессмысленны. Что такое и откуда взялся "свой исходящий дамаг/хил"?
  6. Скрин не доставляет. Проще и быстрее поставить и посмотреть самому.
  7. Quote: Имеется WidgetTextView с <Sizing>WIDGET_SIZING_INTERNAL</Sizing> и <maxWidth>256</maxWidth>. Ограничение можно задать только для ширины WidgetTextView. Для высоты разрабы не стали себя утруждать. Так что надо стараться не выводить 100500 текста. Либо всегда выводить 5 строчек без переносов. Да, при WIDGET_SIZING_INTERNAL и WIDGET_SIZING_CHILDREN <size> соответствующей оси игнорируется, можно его в .xdb выставить в 0, или вообще стереть. Можно поизголяться в скрипте, выставить через SetPlacementPlain WIDGET_SIZING_INTERNAL, зарядить текст, потом получить размер виджета через GetRealRect и widgetsSystem:GetPosConverterParams(), ограничить его math.min( widgetSize, maxSize ) и выставить насильно опять через SetPlacementPlain с WIDGET_SIZING_DEFAULT. Но оно может глючить и ругаться, так как я нарывался на некоторые сочетания параметров placement, которые тупо не работают.
  8. Quote: 1. Русифицировал надписи (а зачем а текстовиках перед текстом по пробелу стоит?) Эти тексты могут цепочкой идти, тогда между ними нужны пробелы. Quote: 2. При загрузке выгружается стандартный "ContextDamageVisualization" (неудобно каждый раз его искать и отключать руками) Гм, а AddonManager разве не запоминает выключенных аддонов? Я пользуюсь своим Addon reloader, там выключил галочку один раз и все.
  9. Quote: ты пробовал аттачить виджеты в 2Д? Пробовал. Все нормально работает, но некрасиво. С 2D виджетами надо просто учитывать, что больше одного повесить на объект нельзя. Поэтому надо скриптом помнить, что и на кого повесил, чтоб аккуратно убирать/заменять когда надо. Quote: Хотелось бы тоже узнать каких правильно аттачить А чего, там же проще намного, чем с 3D. object.AttachWidget2D прицепляет, object.DetachWidget2D отцепляет. Второй вызов object.AttachWidget2D скидывает предыдущий прицепленный. Quote: Но в этом аддоне, по моему, все виджеты 3D Да, все 3D.
  10. Quote: Постоял у новоградской арены. Да, бывает. У разных юнитов точка привязки 3D виджета на разной высоте висит. И у 3D виджета есть ближний и дальний предел, за которыми он перестает слушаться законов перспективы и сохраняет свой размер постоянным относительно диагонали экрана монитора. все это регулируется, но я подбирал настройки для средней и близкой дистанции. У всяких там клещей и прочей мелюзги это видно сильнее. Quote: А можно разный урон/хил разным цветом показывать? Да, я и сам хочу настройки сделать с галочками. И добавить всякие штуки, типаа полученной доблести/репы, абсорбов/резистов и прочих барьеров. Но ведь эти настройки надо откуда-то звать, а еще одну кнопку вешать на экран на постоянную прописку что-то не хочется.
  11. Паковка аддонов - есть способ локализации аддонов от разработчиков. Там в документации валяется недвусмысленный пример, что и как делать. Скрипт состоит из ~1400 строчек метатабличных заморочек и вспомогательных библиотек. Готовым тяжелым кодом делиться не хочется. Самое безобидное в нем выглядит примерно так: Code: Class( "expNotifier", UIBasicElement() ) function expNotifier:Init() self.expNotesDispatcher = expNote():Init( self ) self.hash = {} return UIBasicElement.Init( self ) end function expNotifier:Get() local wtNote, fresh = widgetfactory:Get( "Exp" ) if fresh then widgetNote( wtNote ) end self.hash [ wtNote:GetInstanceId() ] = wtNote return wtNote end function expNotifier:Store( wtNote ) local instanceId = wtNote:GetInstanceId() if self.hash [ instanceId ] then wtNote:Assign() widgetfactory:Store( wtNote ) self.hash [ instanceId ] = nil end end function expNotifier:GetActiveEventHandlers() return { [ "EVENT_AVATAR_EXPERIENCE_GAINED" ] = function( event ) self.expNotesDispatcher:Dispatch( event ) end, [ "SCRIPT_EFFECT_SEQUENCE_FINISHED" ] = function( event ) if event.effectType == ET_MOVE then local widget = event.wtOwner if self.hash [ widget:GetInstanceId() ] then self:Store( widgetcore( widget ) ) end end end } end Global( "expDispatcher", expNotifier() ) expDispatcher:Init():Activate( true ) Не думаю, что будет много пользы, если выложу.
  12. Конкретно этот пак именно аддон. Проверено. =)
  13. Привет всем. Некоторое время назад меня реально достал корявый и назойливый отлетающий урон из стандартной поставки (ContextDamageVisualization), и после продолжительных экспериментов с widget3D, эффектами и Lua у меня получился такой странный аддон, который показывает все дамаги и весь хил на любых юнитах в радиусе видимости, включая себя любимого. И при этом не тормозит. Фишки: - Прямо в игровой сцене от юнитов ненавязчиво отлетают циферки. Похоже на Borderlands, если кто играл. - Аналогично показывает криты, промахи, увороты, блоки, парирования и т.п. - Все юниты делятся на два типа: друзья и мишени. В соответствии с разделением циферки и буковки красятся в разные цвета. - Красиво показывает получаемый за что угодно опыт. =) - Также показывает получаемую репутацию и доблесть. Алерты: - Надо отключить самому стандартный аддон ContextDamageVisualization. Например, воспользовавшись аддон-менеджером. - Хил врагов показывается странным желтым цветом, пока не придумал ничего более путного. Буду рад разумным советам. - Не локализован. Все надписи на английском. Вроде бы... - Не протестирован на хай-левелах, в героиках и прочем, так что не знаю, будет он реально полезен или нет. Возможно, ничего не будет видно из-за дыма, эффектов и прочего. Если по отзывам будет полезен, допилю и выложу на главную. - Пока что в рейде тормозит как @#%$! =) Установка: Берем приложенный пак и кладем его в data/Mods/Addons/. Ничего распаковывать не надо, все работает прямо так. Велкам хватать и тестировать. =) P.S.: Да, забыл совсем. Достаточно сильно поднабрался экспертизы в этом деле, но писать учебники обо всем нет ни времени, ни желания. Тем не менее, отвечу на любые вопросы касательно виджетов, API, скриптов и прочего, относящегося непосредственно к разработке аддонов. Про метатаблицы в Lua, тайны использования WidgetLayerAnimatedTexture, координаты юнитов и т.д. Если возникнут, конечно. File: RamWorldDamage.pak
  14. Думается, сейчас код сильно изменился. Документация по TextContainer: PopBack - удаление элемента в конце контейнера PopFront - удаление элемента в начале контейнера PushBackRawText - добавление неформатированной строки в контейнер PushBackValuedText - добавление ValuedText в контейнер PushFrontRawText - добавление неформатированной строки в контейнер PushFrontValuedText - добавление ValuedText в контейнер RemoveItems - удаление всех элементов из контейнера
  15. А. Точно, один раз. Видимо, поразил сам факт смелого поиска виджета по имени "Chat" по всем аддонам сразу. =) Аддоны легко допускают виджеты с одинаковыми именами, даже в пределах одного предка. А тогда вот так не проще? Code: local wtChat = stateMainForm:GetChildUnchecked("Chat", false) wtChat = wtChat and wtChat:GetChildUnchecked("Chat", true) or stateMainForm:GetChildUnchecked("Chat", true) function LogToChat(message, color, fontSize) if not wtChat then LogError( "Blah-blah..." ) end ... end Еще такая мысль появилась: PushFrontValuedText - метод виджета. С его помощью в чат набиваются все сообщения. Если б он так тормозил, игра бы вообще стояла. Скорее всего, нельзя набрасывать в контейнер сообщения со стороны; видимо, скрипт чата зачем-то ведет учет всего, что он напихивает в контейнер, и внешнее вмешательство приводит его, скрипт, в ступор с кучей ошибок.
  16. В вызове stateMainForm:GetChildUnchecked("Chat", true) второй аргумент ( который true ) означает "задействовать рекурсивный поиск по всему дереву виджетов". В случае stateMainForm это рекурсивный поиск по всему дереву всех виджетов во всех аддонах, включая стандартные. На каждый вызов этой функции.
  17. Aloha! You can make yourself a little helper library, which basically will launch given sequence of effects, say Code: local sequence = {} for k = 1, 10 do table.insert( sequence, { 0.5, 1, 1000 + 50 * k, EA_SYMMETRIC_FLASH } ) end fxlib.PlayFadeEffectSequence( widget, sequence ) Each cell in this sequence is a set of arguments for AO Lua API widget method "PlayFadeEffect". It can be used like Code: local cell = sequence [ i ] widget:PlayFadeEffect( unpack( cell ) ) Library itself can register on demand a single handler for API event "EVENT_EFFECT_FINISHED", which will identify current playing sequence and launch effect for next sequence cell from library's internal hash. Something like Code: handlers [ "EVENT_EFFECT_FINISHED" ] = function( event ) local widget = event.wtOwner local instanceID = widget:GetInstanceId() local sequence = hash [ instanceID ] if sequence then local i = sequence.i or 1 local cell = sequence [ i ] sequence.i = i + 1 if cell then widget:PlayFadeEffect( unpack( cell ) ) else widget:FinishFadeEffect() hash [ instanceID ] = nil end end You can expand this approach on all types of widget effects in AO, and as outcome you'll get most effective and powerful AO user-made library ever existed. Cheers! =) P.S. Sorry for rubbish English, can't use Google translator.
  18. Прекомпиляция дает прирост только к скорости загрузки скрипта, скорость работы остается без изменений.
  19. Хинт: Можно избежать кучи вызовов с гарантированно провальными проверками, если подписываться на EVENT_DND_DRAG_TO, EVENT_DND_DROP_ATTEMPT и EVENT_DND_DRAG_CANCELLED только на время перетаскивания, после того, как убедился, что EVENT_DND_PICK_ATTEMPT действительно пришел тебе, и сразу отписываясь от них на EVENT_DND_DROP_ATTEMPT или EVENT_DND_DRAG_CANCELLED.
  20. Чтоб ничего не дестроить: Code: local widgetDesc function GetNextWidget( name ) local widget if not widgetDesc then widget = mainForm:GetChildChecked( name, false ) widgetDesc = widget:GetWidgetDesc() else widget = mainForm:CreateWidgetByDesc( widgetDesc ) end return widget end
  21. Кто-нибудь пробовал XSD или XSLT делать для этих описаний XDB ресурсов? Если сделать, то в любом freeware XML-редакторе можно легко, с подсказками и без ошибок фигачить эти ресурсы.
  22. чОрт, а шпион - это идея! =) Дорогой Мыйл.ру! Я тоже хочу к вам на работу, на full time, с большой белой зарплатой! Обещаю вести себя хорошо, применять свои скромные познания в Lua во благо, дабы изничтожать баги и преумножать пользу. (А то задрало уже, чес-слово!) Фотошопом владею, рисовать умею. Если кто из вас это читает, пишите в личку. Возьмите, ну что вам стоит!.. =) P.S. А я вот Valltron'а подозревал, уж очень много он знал про аллодские тексты, чего в документах нету.
  23. Между прочим: Code: onEvents [ "EVENT_DND_DROP_ATTEMPT" ] = function( params ) mission.DNDConfirmDropAttempt() Вот этим кодом вы запарываете весь драг'н'дроп в игре. Бросать или не бросать, должен решать аддон-инициатор, а не кто попало.
×
×
  • Создать...

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

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