Классы
Статы, идеальное соотношение · Умения и вехи, как получить · Души · Сравнение классов
Воин · Жрец · Некр · Лучник · Шаман · Мист · Бард · Инж · Демон
Игровой процесс
Как одеваться · Драконий облик · Наследие Богов · Фарм золота
Прохождения локаций
Мониторинг серверов и редактор аддонов
Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.
Подсказки из игры на вашем сайте
Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.
-
Постов
1 190 -
Зарегистрирован
-
Посещение
Тип контента
Загрузки
Форумы
Статьи и объявления
Гардероб
Маунты
Сообщения Allods Team
Магазин
Галерея
Весь контент worm
-
Да больше понять хотелось. вопросы то они еще и с запасом на будущие. интересуют виджеты или виджет на проверку о готовности и приглашения в инстанс. на лут нашел. Вот кстати вопрос если виджет гасить так wt.RollGreedNeed:Show( false ) то он потом ведь снова запустится при следующем запуске события или его надо как-то после гашения активизировать?
-
Здравствуйте. А есть ли такой аддон чтобы по щелчку на виджите отображалось его название? В Inspect Widgets вроде все отображается но хоть убей не могу найти пару виджетов
-
Уряя есть много глюков но уже хоть худо бедно работает.. Теперь доработка доработка) Натыкал заплаток. теперь ошибки не выдает)) SelectInstance.rar
-
Так сопли частично откладываются.) Скачал аддон который все в игре показывает.. перепровязал на сумку появление кнопки. но все таки не нашел как обзывается кнопка с выбором инстансов. создадим отдельно тогда кнопочку. Главное механика понятна
-
Все дело в том что я и не знаю как посмотреть. Если бы лежало в папке то тыкаешь файлик смотришь ссылки идешь дальше но как быть когда это в игре? там не потыкаешь файлик( wt.ContextStable = W('ContextStable',stateMainForm):GetChildChecked("MainPanel", false ) я понимаю что он смотрит цепочку включения детей. Находит и выводит. Но я не знаю как узнать это имя ('ContextStable'.. Выходит както можно залезть в игру и почитать имя виджетов. Скачал AoTextureViewer_0.6.1 он не пашет. и выходит что я не могу посмотреть имя нужного мне виджета
-
Спасибо огромное) Теперь понятно) Да пытаюсь понять откуда узнать как называется виджет чтобы именно отловить это действие. Получается если видна конюшня но не видна кнопка показать кнопку. иначе если кнопка видна но не видна конюшня скрыть кнопку. Идея понятно но как например такое реализовать для списка с инстансами? надо wt.ContextStable заменить на что-то(
-
спасибо) понятно но не совсем) надо это потыкать.
-
Добрый вечер. возник ряд вопросов. local res = string.find (val, "\\") local ind = string.sub(val,1,res-1) local state = string.sub(val,res+1) mountList[ind] = state == '1' вверху строковые функции В принципе все понятно главное потыкать а вот последняя строка. Понятно что запихивается в массив ключ и значение но причем тут "==1". Как правильно это читается? и еще появление и скрытие кнопки у кормежки выходит реагирует не на событие а на отображение текстур (виджетов) конюшни if wt.ContextStable:IsVisible() and not wt.stableButton:IsVisible() then где\как поглядеть это? название, свойства?
-
Не знаю есть такое или нет, но вот написал))) совсем простенькое. пока пытаю виджеты) а то этих петов по табу агрится уйма (особенно у импов какие то бесята как вошики бегают). Вроде работает. Хотя может кто и писал такое. Подумал а ведь наверное можно попробовать сделать чтобы не снимало выделение а полностью их игнорировало. Хмм надо проверить будет) UnTargetPet.rar
-
Спасибо. Со стрингами действительно ооочень путаюсь. До конца так и не понял в чем разница. (как понял string то что мы пишем а WString то что в игре пишут) Со звуком жаль( лет 6-7 назад в одной браузерке сидел. там по просьбе на приват и тд сделали звоночки. Очень удобно. ты чего-нить делаешь. бац написали и ты не пропустишь сообщение) Как писал ранее я не большой любитель аддонов. Стоит по минимуму и то в последнее время поставил т.к. игра развивается. Это отступление к тому что не знаю может даже и есть такой аддон уже. Суть такова. Летом еще как то сказал что хорошо бы разрабы сделали чекбоксики на выбор инстансов. А вот сейчас поскольку и время появилось и научится хотел. поплыл я в эту сторону). По логике уже написал и работает выбор Инстансов. Вроде такого аддона тут не нашел. Но в графической части слабоват еще. Вот и получается что оптимальнее перепаять Автокормежку в этом плане.(( да и заодно присобачить автопринятие на инстанс по выбору. Вот что пока получилось -------------------------------------------------------------------------------- -- GLOBAL Объяввляем глобальные переменные и функции -------------------------------------------------------------------------------- Global( "DB", {} ) -- массив с действиями на Инстансы (снять заявку, без действия) Global( "DBTelep", {} ) -- массив с принятием приглашения на Инстанс (принять, самому решать) Global( "elapsed_counter", 0 ) -- переменная счетчик для принятие приглашения (в сек) Global( "MAX_WAITING_TIME", 15 ) -- переменная через сколько секунд принять приглашение Global( "ReventId", nil ) -- переменная с информацией об Инстансе на которое пришло приглашение -------------------------------------------------------------------------------- -- EVENT HANDLERS Тело с функциями (основное рабочее пространство) -------------------------------------------------------------------------------- -- Функция запускает функцию принятия приглашения в Инстантс function DoneTeleportRequest( eventParams ) -- Выставляем начальное значение таймера когда пришло приглашение (вообще можно по другому наверное сделать но это потом) elapsed_counter = 0 -- Регестрируем (вызываем) функцию принятия приглашения в Инстантс по событию таймера common.RegisterEventHandler( OnEventSecondTimer, "EVENT_SECOND_TIMER" ) -- Переменная с id Инстанса на которое пришло приглашение. (Подругому незнаю как передать его в др функцию) ReventId = eventParams.eventId -- LogInfo( "eventId=", eventParams.eventId,"timeoutMs=", eventParams.timeoutMs ) end -- Функция принятия приглашения в Инстантс function OnEventSecondTimer( eventParams ) -- переменная-счетчик прибавляет 1 каждый раз когда вызывается функция. А вызывается раз в секунду по "EVENT_SECOND_TIMER" elapsed_counter = elapsed_counter + 1 -- критерии по которым должно было сработать автоприглашение (не в группе, не в отряде и счетчик больше установл значения, т.е. дотикал). Временно отключил --if (group.GetMembers() == nil) and (not raid.IsExist()) and (elapsed_counter >= MAX_WAITING_TIME) then -- Временный массивчик с данными (включать или не включать автоприглашение) Вообще можно было стелать как MAX_WAITING_TIME = 90 и просто бы не сработало. DBTelep["Арена смерти"] = 1 DBTelep["Гоблинобол"] = 1 -- Получаем информацию об Инстансе по его id local eventInfo = matchMaking.GetEventInfo( ReventId ) -- userMods.FromWString(eventInfo.name) - Переводим из локализуемого такста в нормальный Название Инстанса для сравнения (точнее для подстановки в массив) -- По ключу (название Инстанса) в массиве смотрим значение и сравниваем его (1 - включить автопринятие) if (DBTelep[userMods.FromWString(eventInfo.name)] == 1) then -- Если счетчик больше MAX_WAITING_TIME то прошло время и срабатывает функция вступления if (elapsed_counter >= MAX_WAITING_TIME) then -- Снимаем регистраци (прекращаем вызывать) функцию принятия приглашения в Инстантс по событию таймера common.UnRegisterEventHandler( OnEventSecondTimer, "EVENT_SECOND_TIMER" ) -- Запускаем функцию принятия приглашения (true - принять, false - отказаться) matchMaking.InstancedEventTeleportReply( true ) end -- Выводим другое если чтобы тормознуть функцию вызываемую "EVENT_SECOND_TIMER" в случае если ненадо автопринятие elseif (DBTelep[userMods.FromWString(eventInfo.name)] == 0) or (DBTelep[userMods.FromWString(eventInfo.name)] == nil) then -- Снимаем регистраци (прекращаем вызывать) функцию принятия приглашения в Инстантс по событию таймера common.UnRegisterEventHandler( OnEventSecondTimer, "EVENT_SECOND_TIMER" ) end --LogInfo( "eventId=", ReventId, "timeoutMs=", eventParams.timeoutMs, "elapsed_counter=", elapsed_counter ) end -------------------------------- -- //////////// -------------------------------- -- Функция выделения нужных Инстансов (точнее снятие выделения с ненужных) function UnSelectInstance() -- Сотрим может ли аватар вообще участвовать в инстанс-ивентах (true - может, false - нет) if matchMaking.CanUseMatchMaking() then -- Включаем получение и отслеживание информации о существующих в игре инстанс-ивентах (true - вкл, false - выкл). Без этого ругается когда список с Инстансами не открыт matchMaking.ListenEvents( true ) -- Смотрим может ли аватар в данный момент в принципе встать в очередь на какой-нибудь инстанс-ивент (true - может, false - нет). Лишняя проверка но лучше перебдеть чем отмываться if matchMaking.CanJoinInstancedEvents() then -- Получаем массив (список) с id существующих инстанс-ивентов. (Для нашего персонажа) local Events = matchMaking.GetEvents() -- Так и не понял как работает но механика следющая: перебирается весь массив пока не закончится. Нам это и нужно for _, eventId in Events do -- Если значение в массиве не пустое т.е. id Инстанса есть то работаем дальше if eventId then -- Смотрим существует ли ещё описание инстанс-ивента с указанным id (true - да, false - нет). Очередная проверка которая может и не нужна if matchMaking.IsEventIdExist( eventId ) then -- Создаем массив с информацией об Инстансе по его id local eventInfo = matchMaking.GetEventInfo( eventId ) -- Временный массивчик с данными (1 - снять галку,2 - ставить галку в первую очередь, 3 - во вторую, 0 - игнорить Но поскольку не пашет то работаем только по 1) DB["Арена смерти"] = 1 DB["Гоблинобол"] = 1 DB["Доминион"] = 0 DB["Дикий хутор"] = 2 DB["Ведьмин яр"] = 3 -- По ключу (название Инстанса) в массиве смотрим значение и сравниваем его (1 - снять галочку с данного Инстанса) if (DB[userMods.FromWString(eventInfo.name)] == 1) then -- Проверяем по информации об Инстансе. Стоит ли Юзер на данный Инстанс (true - да, false - нет). Очередная проверка а то ругается( if (eventInfo.isAvatarJoined == true) then -- Включаем функцию по снятию галочки с конкретного Инстанса matchMaking.LeaveInstancedEventQueue( eventId ) end -- По ключу (название Инстанса) в массиве смотрим значение и сравниваем его (2 - поставить галочку на данный Инстанс) elseif (DB[userMods.FromWString(eventInfo.name)] == 2) then --matchMaking.JoinInstancedEvent( eventId ) -- Вот та Хня из примера по логике должна ставить галочку на нужном Инстансе но не пашет -- По ключу (название Инстанса) в массиве смотрим значение и сравниваем его (3 - поставить галочку на данный Инстанс когда по 2 надоело) Но немного не так все (на бущее м.б.) elseif (DB[userMods.FromWString(eventInfo.name)] == 3) and (matchMaking.IsAvatarJoinedAnyEvent() == false) then --matchMaking.JoinInstancedEvent( eventId ) end end end end end -- А хз зачем. В ругом примере научусь тормозить хотя както надо остановить функцию. --common.UnRegisterEventHandler(UnSelectInstance, "EVENT_MATCH_MAKING_EVENT_QUEUE_REMOVED") end end -------------------------------- -- //////////// -------------------------------- -- Функция вывода информации в Лог-файл function LogInfo( ... ) common.LogInfo( common.GetAddonName(), unpack( GetStringListByArguments( arg ) ) ) end -- Функция преобразования символов для функции вывода информации в Лог-файл function GetStringListByArguments( argList ) local newArgList = {} for i = 1, argList.n do local arg = argList[i] if common.IsWString( arg ) then newArgList[i] = arg else newArgList[i] = tostring( arg ) end end return newArgList end --LuaFullDateTime --local date = common.GetDateTimeFromMs( 123456789012345 ) --LogInfo( "date: ", date.d, ".", date.m, ".", date.y ) -- Функция отсылает данные об аддоне в аддон AddonManager function OnAMMemUsageRequest() userMods.SendEvent( "U_EVENT_ADDON_MEM_USAGE_RESPONSE", { sender = common.GetAddonName(), memUsage = gcinfo() } ) end -------------------------------------------------------------------------------- -- INITIALIZATION Создаем Главную функцию запускающую другие в зависимости от определенных событий в игре -------------------------------------------------------------------------------- function Init() -- Вызываем функцию для работы с аддоном AddonManager common.RegisterEventHandler( OnAMMemUsageRequest, "U_EVENT_ADDON_MEM_USAGE_REQUEST" ) -- Запускаем функцию принятия Приглашения в Инстантс когда возникает событие приглашения common.RegisterEventHandler(DoneTeleportRequest, "EVENT_MATCH_MAKING_EVENT_TELEPORT_REQUEST") -- Запускаем функцию выделения нужных Инстансов (точнее снятие выделения с ненужных) по таймеру --common.RegisterEventHandler(DoneTeleportRequestW, "EVENT_SECOND_TIMER") -- Запускаем функцию выделения нужных Инстансов (точнее снятие выделения с ненужных) по действие когда Инстантс был выделен common.RegisterEventHandler(UnSelectInstance, "EVENT_MATCH_MAKING_EVENT_QUEUE_ADDED") end -------------------------------------------------------------------------------- -- Запускаем функцию с запускалками Init() --------------------------------------------------------------------------------
-
Доброго времени суток) Я вам еще не надоел?) вот на такое ругается почему то( -- Отформатируем данные (чтобы приписывался 0 с переди) silver = common.FormatInt( silver, "%02d" ) copper = common.FormatInt( copper, "%02d" ) -- Собераем данные в одну строку local kriPokupView = userMods.ToWString("КриПок:"..gold.."."..silver.."."..copper) -- Задаем свойства графическому элементу. wtMessage:SetVal( "myrmyr2", kriPokupView ) И хотел спросить. А если со звуком работать (вроде функции есть такие) то он не будет играть при отключённом в настройках? И еще вопрос до кучи. Понимаю что не хорошо но на сколько можно имеющиеся аддоны задействовать?
-
for myid = 67060, 67080 do local itemsInfo = itemLib.GetItemInfo( myid ) -- local itemsInfo = avatar.GetItemInfo( myid ) if itemsInfo then -- Выводим кооекакую информацию в логфайл LogInfo("№ слота=", myid, " Имя предмета=", itemsInfo.id, " Класс предмета=", itemsInfo.name) end end Вот так то я на работе и подошел к этому вопросу. а домой пришел запустил и ругается нет такого ид. Посмотрел что в сумке за вещи с ид и эта кака их вывела потом по ид. Т.е. функция local itemsInfo = itemLib.GetItemInfo( myid ) равносильна local itemsInfo = avatar.GetItemInfo( myid ). Вооть( Т.е. Просматриваются только вещи которые лично имеются на аккаунте. но не в бд игры
-
Да те функции видел... Мне бы скажем так бесхозные вещи, т.е. заложенные в БД игры
-
А есть ли какая нибудь функция на вещи которые находятся не у персонажа?
-
Спасибо) Столько всего интересного. Уже читаю.)) Думаю в Выходной времени побольше будет. Сяду потыкаю и чтонибудь уже получится)
-
Спасибо огромное) Уже ковыряю то архивчик. Столько интересного и есть куда приткнуть) А еще не подскажите где про графику почитать? На примере аддонов (да и в том же архивчике) есть *.xdb файлы в них в основном (как я понимаю) написано положение объекта его размер, то над каким объектом отображать и отображать ли вообще. Но четко что это. как это выглядит и какого цвета не расписано. В аддоне на автокормежку на чекбоксы еще и файлы *.bin есть( А чек бокс такая нужная вещь...)) Эту магию надо разгадать)) В принципе только дошло что само название файла может указывать конкретно на то какой объект в игре используется. Если это так то как посмотреть эти объекты списком? или интуитивно глядеть где они могут быть и через скрипты вытаскивать их название? Да и есть еще какие-то интересные файлы *.luac что это за звери?)). Спасибо)
-
Да к сожалению уже написал один - "Прямые руки"))) Лично для тебя. у меня стоит блокировка панелек, автокормежка, показ миры, авто сбор почты, автопродажа серых вещей и показ корон (который кстати смешно на пета на арене корону повесил). и все) Сундучки открываются))) 700+ коробушек были удачно вскрыты))) Спасибо что помогли) теперь еще графическую часть постичь бы) Вот возник еще такой вопрос. Как узнать в каком виде (к какому типу) поступают данные Например код работает local textreadr = "Прочее" if textreadr == "Прочее" then LogInfo( textreadr,":itemName=", itemName,":type=", itemtype.className ,":typesys=", itemtype.sysClassName,":typesys=", itemtype.boxInfo) end или local textreadr = "Прочее" local textread = "Прочее" if textreadr == textread then LogInfo( textreadr,":itemName=", itemName,":type=", itemtype.className ,":typesys=", itemtype.sysClassName,":typesys=", itemtype.boxInfo) end но не работает local textreadr = "Прочее" local textread = itemtype.className -- В логфайл выводит Прочее if textreadr == textread then LogInfo( textreadr,":itemName=", itemName,":type=", itemtype.className ,":typesys=", itemtype.sysClassName,":typesys=", itemtype.boxInfo) end Надо применить какую-то текстовую функцию (с указанием что переменная типа string или обрезкой каких то символов) или кодировку как то сменить? В принципе по первому коду и как в лутменеджере устроено можно уже сварганить файлик с бд где по названию можно указывать что выкинуть что продать но разобраться хочется
-
Суть вопроса научиться писать аддон (естественно начав с чего-то легкого и простого) ) О существование аддонов на сундуки я не знал. Я вообще не очень жалую аддоны. Розочка мы тебя помним... )) И пьесы все в том же стиле...))
-
Спасибо) Попробую с сундуками а то замучали изверги). Уже начинает прояснятся картинка) А печать в логфайл просто выводится или надо еще функцию писать какую. на форуме видел что просто выводится, но у меня руки совсем кривые видимо. Hello world! так и ненапечатал( И БД организуется как массив. если он в отдельном файле то просто в lua объявить как глобал? или надо еще какието функции?
-
Спасибо. Но та хотелось решить проблему с сундуками и монетками. Даже при одновременном л+п кн мыши очень долго и нудно переводится в ценности/открывается
-
Помогите пожалуйста. Хотел написать чтобы потипу отображения мирры отображался и курс кри. Тут проблем не возникло. Нашел функцию считывающие курс кри из аддона для аопанели и подставил в код для мирры. Все замечательно отображается 6ти значное число. Устраивает. А вот теперь захотелось чтобы чтобы автоматом зачислялись монетки в ценности и сундуки открывались в ремеслах. Аналогм выбрал автопродажу серых вещей. Простой красиво написанный аддон. Дальше взял лут менеджер с базой данных. и вот не работает ругается( да и незнаю где взять функцию на автоюз и название сумки с разделом для ремесел( Собственно в черновом варианте думал что-то такое будет -- GLOBAL -- Объявляем глобальные переменные Global( "DB", {} ) -------------------------------------------------------------------------------- -- EVENT HANDLERS -------------------------------------------------------------------------------- -- Событие обновления списка вещей у тогровца, список обновляется в том числе при выкупе серых вещей: function OnVendorListUpdated() local currentBagSize = avatar.InventoryGetBaseBagSlotCount() -- Создаем локальную переменную равную Количеству слотов основного раздела сумки for slotIndex = 0, currentBagSize - 1 do -- Создаем цикл обработки каждого слота в сумке slotIndex = 0 - первый слот, currentBagSize - 1 - последний (т.к. начало с 0 то последний количество -1) local itemId = avatar.GetInventoryItemId( slotIndex ) -- Создаем локальную переменную содержащую ID вещи находящейся в просматриваемом слоте if itemId then -- Если ранее созданная переменная не пуста (содержит ID вещи) тогда начинаем работать с вещью local itemInfo = avatar.GetItemInfo( itemId ) -- Создаем локальную переменную содержащую информацию о вещи по ее ID -- if itemInfo.quality == ITEM_QUALITY_JUNK then -- Если переменная имеет свойство вещи равное свойству серой вещи то начинаем работу с вещью (а не игнорируем ее) -- if avatar.Sell then avatar.Sell( slotIndex, itemInfo.stackCount ) -- for older AO versions -- -- Если торговый лист открыт у продавца то продаем серую вещь по ее ID -- elseif avatar.SellItemToVendor then avatar.SellItemToVendor( itemId ) -- for AO 2.0.09+ ---------------------------- --local _DB = {} --- база знаний-- Объявляем БД --_DB[itemName]-- имя в массиве бд ---choice._R[ "EVENT_INVENTORY_ITEM_ADDED" ] = function( pars )--- собыдие когда вещь попадает в сумку --local n = FromWS(i.name) -- вроде как имя вещи где i.name также itemInfo.quality ---avatar.InventoryDestroyItem( pars.slot ) -- выкидывать вещь по ID --local itemName = FromWS(itemInfo.name) local itemName = itemInfo.name --if itemName == _DB[itemName] then --if DB[itemName] == USE then -- Если в конфиге DB["Юбилейная медная монета"] = USE local itemNameDB = DB[itemName] if itemName == itemNameDB then -- Если в конфиге DB["Юбилейная медная монета"] = Юбилейная медная монета --avatar.InventoryDestroyItem( itemId ) -- Надо что-то вставить на иметацию щелчка по монеткам -- Типа avatar.'чтото'( itemId ) LogInfo("Hello World!") LogInfo(itemName("Work status:")..DB[itemName]..". "..L("Rules:") ) end -- LogInfo(itemName("Work status1:")..DB[itemName]..". "..L("Rules1:") ) ---------------------------- -- end -- end end end -- Повторный вызов не нужен, иначе не получится выкупить нужные серые вещи: common.UnRegisterEventHandler(OnVendorListUpdated, "EVENT_VENDOR_LIST_UPDATED") end -- Событие начала разговора с NPC, который может быть торговцем: function OnTalkStarted() -- Теперь можно начать следить за обновлением списка вещей у торговца: common.RegisterEventHandler(OnVendorListUpdated, "EVENT_VENDOR_LIST_UPDATED") end -- Событие окончания разговора с NPC, который может быть торговцем: function OnTalkStopped() -- Теперь нужно прекратить следить за обновлением списка вещей у торговца, на всякий случай: common.UnRegisterEventHandler(OnVendorListUpdated, "EVENT_VENDOR_LIST_UPDATED") end -------------------------------------------------------------------------------- -- INITIALIZATION -------------------------------------------------------------------------------- function Init() -- События: common.RegisterEventHandler(OnTalkStarted, "EVENT_TALK_STARTED") common.RegisterEventHandler(OnTalkStopped, "EVENT_TALK_STOPPED") --common.RegisterEventHandler(OnVendorListUpdated, "EVENT_SECOND_TIMER") end -------------------------------------------------------------------------------- Init() -------------------------------------------------------------------------------- Понимаю сделано криво да и не очень красиво использовать куски написанные другими, но уж больно тяжко дается изучение Вот. и ребят объясните пожалуйста как вывод об ошибках читать. кроме указания строки где остальное не допонял(. Я более менее оседлал PHP там на синтакс указывает. а тут непонятно
