DarkMaster Posted November 2, 2009 Share Posted November 2, 2009 Я заметил что народу - который пишет становитсья все больше, но все варяться в собственном соку *))) Это не дело товарищи, давайте делиться опытом - того что нарыли. 1. Данные. В АО - данные часто имеют структурированный вид, в отличии от ВОВ в которой любая функция всегда возврашает просто параметры, что к с лову удобнее нежели структурный вид возврата данных. Данные всегда представленны как обычная структура в любом из языков программирования, но возможны структуры с вшитыми массивами данных. Как поянть что мне нужно для работы ? Как уже приводилось в одном из постов выводить информацию о структурах данных можно выводить в user.cfg ( AllodsOnline\Personal\user.cfg ). И так структура состоит из - имени структуры, переменных, саб-таблиц, таблиц массивов. Срутктура описания данных: table_begin ИмяСтурктуры table_begin data имя_переменой1 = значение имя_переменой2 = значение имя_переменой3 = значение table_begin ИмяСабТаблицы имя_переменой1 = значение имя_переменой2 = значение имя_переменой3 = значение table_end ИмяСабТаблицы int_keys_begin ИмяДатыМассива table_begin 0 имя_переменой1 = значение имя_переменой2 = значение table_end 0 table_begin 1 имя_переменой1 = значение имя_переменой2 = значение table_end 1 int_keys_end ИмяДатыМассива table_end data table_end ИмяСтурктуры Думаю тут все понятно *))). Обратите внимание на int_keys_begin ИмяДатыМассива - это обьявление таблицк в виде массива, где table_begin i ... table_end i описание элемента этого массива. В основном структуры вам возврашают после своей работы различные функции GetЧтоТо(), иногда они передаються в функции обработчики событий - в виде params - параметров. Как считывать данные : local MyData = GetЧтоТо() if MyData.имя_переменой1 == true then GO() end if MyData.ИмяСабТаблицы.имя_переменой2 == true then SuperGO() end; local size = GetTableSize(MyData.ИмяДатыМассива) for i = 0, size - 1 do local MyDataElement = MyData.ИмяДатыМассива if MyDataElement.имя_переменой1 == true then MegaGo() end end Думаю тоже все понятно. Возможно есть что-то еше, я пока не сталкивался. Ну а теперь больше конкретики. 1. Как узнать можно ли всели условия спелла удовлетворительны ( дальность, наличие оружия в руке и т.д. ) function MyAddon_IsSpellRedyForUse( myspellid ) local spellInfo = avatar.GetSpellObjectInfo( myspellid ) - берем инфо о спеле if spellInfo then - если инфо есть то можно работать далее spellInfo.requirements = avatar.GetSpellRequirements( spellInfo.id ) - считываем требования для спелла local AllReqIsSuccess = false -- переменная флаг local ValidReqCount = 0 -- счетчик удов.требования --requirements.targetConditions -- это таблица где храняться требования для цели ( например "не может быть большим" --requirements.casterConditions -- это для игрока ( цель далеко и т.д) local size = GetTableSize( spellInfo.requirements.casterConditions ) local sizeChilds = 0 for i = 0, size - 1 do local req = spellInfo.requirements.casterConditions - берем i-ое требование -- иногда у некоторых спеллов требования расположенны не в основной таблице а в доп. -- таблице childs, что мы тут и обрабатываем if GetTableSize(req.childs) > 0 then sizeChilds = GetTableSize(req.childs) for j = 0, sizeChilds - 1 do local reqChild = req.childs[j] if ( reqChild.success == true ) then -- если требование удовлетворительно , то увеличиваем счетчик удов.требования ValidReqCount = ValidReqCount + 1 end end else -- обработка для спеллов у которых нет childs if ( req.success == true ) then -- если требование удовлетворительно , то увеличиваем счетчик удов.требования ValidReqCount = ValidReqCount + 1 end end end -- Возможно тут не совсем правельно написано, но из наблюдений если есть childs -- то нету норм требований и наоборот, возможно есть случаи когда есть и то и то if sizeChilds > 0 then -- если есть childs - проверяем по ним if ValidReqCount == sizeChilds then - если счетчик удов.требований = размеру требований, значит все требования в норме AllReqIsSuccess = true end elseif ValidReqCount == size then - если счетчик удов.требований = размеру требований, значит все требования в норме AllReqIsSuccess = true end -- Дебаг вывод данных --local section = {} --for i,v in spellInfo do -- section [ i ] = v --end --common.SetGlobalConfigSection( "SPELLINFO", section ) local CurrentMana = unit.GetMana( avatar.GetId() ) -- считываем ману игрока if spellInfo.cooldownRemainingMs == 0 and AllReqIsSuccess == true and CurrentMana.mana>=spellInfo.currentValues.manaCost then -- главное условие проверяем кулдаун, требования, и ману return true end end return false end Спрашивайте, пишите, дополняйте .... P.S. Больщая просьба - не флудить, не оффтопить, не засерать пост. Давайте сделаем удобный мини справочник в котором можно быстро найти полезные наработки. Quote Link to comment Share on other sites More sharing options...
DarkMaster Posted November 2, 2009 Author Share Posted November 2, 2009 Вот пару вопросв сразу на вскидку: 1. Баффв, Дебаффы - я нашел как получить баффы\дебаффы, но не понял как проверить тот ли это бафф\дебафф который мне нужен. Может кто то уже решил это проблему ? Получение баффа\дебаффа local buff buff = unit.GetBuff( avatar.GetTarget(), 0 ) if buff then if buff.isPositive == false then -- это бафф иначе дебафф if buff.name == "Супер бафф" then -- сравнение по имени неработает 8((( end end end 2. Как получить SpellID - я нашел только способ через ActionBar, но это не удобно, что бы взять инфу требуеться ложить спелл в слот. Как получить напрямую без использования ActionBar ? local ActionSlotInfo0 = GetActionInfo( 0 ) -- функци описанна в нутри ScriptContextActionbar.lua ActionSlotInfo0.id -- это id спелла. *))) Quote Link to comment Share on other sites More sharing options...
Guest Valltron Posted November 2, 2009 Share Posted November 2, 2009 SpellID получают разные события, там где оно нужно. например EVENT_ACTION_RESULT_SPECIAL_SPELL. при этом это не какойто глобальный ID спелла, а конкретно именно твоего спелла в какойто таблице на сервере...даже если ты его перенесешь в другой слот на панели экшн бар (как в твоем случае), или перезайдешь в игру - то ID уже присвоется другой... Quote Link to comment Share on other sites More sharing options...
DarkMaster Posted November 3, 2009 Author Share Posted November 3, 2009 Да это я понял - но это как раз и не удобно. Напрмиер в ВОВ АПИ - можно взеять СпеллИнфо - как по имени спелла так и по его ИД, а ИД в свою очередь получить из СпеллБука - спомощью опять же имени спелла. Вообщем буду копать СпеллБук АО - мож че найду. Проблема с Бафами\Дебафами - актуально просто жуть как *)))) Quote Link to comment Share on other sites More sharing options...
Guest lazard Posted November 5, 2009 Share Posted November 5, 2009 я только начал разбираться с аддонами поэтому куча вопросов 1) функция unit.GetHealth( avatar.GetTarget() ) - возвращает пустую строку тогда как unit.GetHealthPercentage( avatar.GetTarget() ) - возвращает правильное число - но охото не в процентах а именно число 2) как получить все НАЗВАНИЯ полей таблицы ? 3) прочитал ваше API - там не описано какие параметры нужно передавать в функции и что именно они возвращают ( эти данные не известны или просто я незнаю как их смотреть? ) 4) как узнать id спела который вешает бафф если info баффа известно ( unit.GetBuff( avatar.GetId(),i) - это информация - а как узнать именно id ) жду ответов Quote Link to comment Share on other sites More sharing options...
FLY Posted November 5, 2009 Share Posted November 5, 2009 1. А вот потому что нельзя напрямую, потому и пустая. Позвращает НР только если айди - айди игрока. 2. какой таблицы? какие названия? Юзай тот же способ для вывода инфы в файл. Quote Link to comment Share on other sites More sharing options...
DarkMaster Posted November 6, 2009 Author Share Posted November 6, 2009 4. А хз как - id спелла я беру из слота акшен бара - поместив абилку в слот - можно взять инфо по этому слоту и от него можно взять ид спелла. Смотри в первом посте там пример есть .... Quote Link to comment Share on other sites More sharing options...
Guest lazard Posted November 6, 2009 Share Posted November 6, 2009 я видимо неправильно выразился как получить id спела из акшен бара я знаю и как скастовать его тоже я пытаюсь сделать автобаффалку - если баффа нет то повесить его. но я незнаю как проверить что нет именно нужного баффа !!! поэтом пока работает тупо - если вообще баффов нет - то скастовать. зато кастует автоматически сам - ниче нажимать не надо Quote Link to comment Share on other sites More sharing options...
DarkMaster Posted November 6, 2009 Author Share Posted November 6, 2009 Читерим *)))) А никак - пока не доступны фукции конвертирования строки сравния типа: if buff.name = "CoolBuff" then .... или local SpellInfo = GetSpellInfo("SuperSpell") сделать нельзя Вывод - ждем релиза норм АПИ от нивала Quote Link to comment Share on other sites More sharing options...
Guest skillcoder Posted November 6, 2009 Share Posted November 6, 2009 Можно попробовать сравнивать с константой, она получается в wide string Quote Link to comment Share on other sites More sharing options...
DarkMaster Posted November 6, 2009 Author Share Posted November 6, 2009 А подробнее? с пример желательно Quote Link to comment Share on other sites More sharing options...
Guest Dominant Posted November 9, 2009 Share Posted November 9, 2009 http://ao.arbah.ru/module Интересный addon. Думаю что-то можно потчерпнуть. Quote Link to comment Share on other sites More sharing options...
Guest gsomgsom Posted November 9, 2009 Share Posted November 9, 2009 Вопрос по ID предметов. Функция avatar.GetItemInfo() выдаёт временный (сеансовый) ID предмета, относительно персонажа. Т.е. Алебарда Воздаяния с аука у меня вышла с ID = 6132 и 6135. В этом ID нет ничего полезного... Нужен ID шаблона вещи, чтобы по этому ID всегда можно было выдать информацию о вещи. Пусть и не полную (без рун, без рандомных характеристик и т.п.) Есть идеи? Quote Link to comment Share on other sites More sharing options...
Guest skillcoder Posted November 21, 2009 Share Posted November 21, 2009 Пока единственным уникальным id вещи можно юзать тока её имя. Других идей нет ( Quote Link to comment Share on other sites More sharing options...
Recommended Posts